Coverage Report

Created: 2025-07-23 07:04

/src/samba/source3/smbd/password.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
   Unix SMB/CIFS implementation.
3
   Password and authentication handling
4
   Copyright (C) Andrew Tridgell 1992-1998
5
   Copyright (C) Jeremy Allison 2007.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
*/
20
21
#include "includes.h"
22
#include "system/passwd.h"
23
#include "smbd/smbd.h"
24
#include "smbd/globals.h"
25
#include "source3/smbd/smbXsrv_session.h"
26
#include "../librpc/gen_ndr/netlogon.h"
27
#include "auth.h"
28
#include "../libcli/security/security.h"
29
30
/****************************************************************************
31
 Invalidate a uid.
32
****************************************************************************/
33
34
void invalidate_vuid(struct smbd_server_connection *sconn, uint64_t vuid)
35
0
{
36
0
  struct smbXsrv_session *session = NULL;
37
0
  NTSTATUS status;
38
39
0
  status = get_valid_smbXsrv_session(sconn->client, vuid, &session);
40
0
  if (!NT_STATUS_IS_OK(status)) {
41
0
    return;
42
0
  }
43
44
0
  session_yield(session);
45
46
0
  SMB_ASSERT(sconn->num_users > 0);
47
0
  sconn->num_users--;
48
49
  /* clear the vuid from the 'cache' on each connection, and
50
     from the vuid 'owner' of connections */
51
0
  conn_clear_vuid_caches(sconn, vuid);
52
0
}
53
54
int register_homes_share(const char *username)
55
0
{
56
0
  const struct loadparm_substitution *lp_sub =
57
0
    loadparm_s3_global_substitution();
58
0
  int result;
59
0
  struct passwd *pwd;
60
61
0
  result = lp_servicenumber(username);
62
0
  if (result != -1) {
63
0
    DEBUG(3, ("Using static (or previously created) service for "
64
0
        "user '%s'; path = '%s'\n", username,
65
0
        lp_path(talloc_tos(), lp_sub, result)));
66
0
    return result;
67
0
  }
68
69
0
  pwd = Get_Pwnam_alloc(talloc_tos(), username);
70
71
0
  if ((pwd == NULL) || (pwd->pw_dir[0] == '\0')) {
72
0
    DEBUG(3, ("No home directory defined for user '%s'\n",
73
0
        username));
74
0
    TALLOC_FREE(pwd);
75
0
    return -1;
76
0
  }
77
78
0
  if (strequal(pwd->pw_dir, "/")) {
79
0
    DBG_NOTICE("Invalid home directory defined for user '%s'\n",
80
0
         username);
81
0
    TALLOC_FREE(pwd);
82
0
    return -1;
83
0
  }
84
85
0
  DEBUG(3, ("Adding homes service for user '%s' using home directory: "
86
0
      "'%s'\n", username, pwd->pw_dir));
87
88
0
  result = add_home_service(username, username, pwd->pw_dir);
89
90
0
  TALLOC_FREE(pwd);
91
0
  return result;
92
0
}