Line data Source code
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 "../librpc/gen_ndr/netlogon.h"
26 : #include "auth.h"
27 : #include "../libcli/security/security.h"
28 :
29 : /****************************************************************************
30 : Invalidate a uid.
31 : ****************************************************************************/
32 :
33 4958 : void invalidate_vuid(struct smbd_server_connection *sconn, uint64_t vuid)
34 : {
35 4958 : struct smbXsrv_session *session = NULL;
36 : NTSTATUS status;
37 :
38 4958 : status = get_valid_smbXsrv_session(sconn->client, vuid, &session);
39 4958 : if (!NT_STATUS_IS_OK(status)) {
40 144 : return;
41 : }
42 :
43 4814 : session_yield(session);
44 :
45 4814 : SMB_ASSERT(sconn->num_users > 0);
46 4814 : sconn->num_users--;
47 :
48 : /* clear the vuid from the 'cache' on each connection, and
49 : from the vuid 'owner' of connections */
50 4814 : conn_clear_vuid_caches(sconn, vuid);
51 : }
52 :
53 4516 : int register_homes_share(const char *username)
54 : {
55 3153 : const struct loadparm_substitution *lp_sub =
56 1363 : loadparm_s3_global_substitution();
57 : int result;
58 : struct passwd *pwd;
59 :
60 4516 : result = lp_servicenumber(username);
61 4516 : if (result != -1) {
62 0 : DEBUG(3, ("Using static (or previously created) service for "
63 : "user '%s'; path = '%s'\n", username,
64 : lp_path(talloc_tos(), lp_sub, result)));
65 0 : return result;
66 : }
67 :
68 4516 : pwd = Get_Pwnam_alloc(talloc_tos(), username);
69 :
70 4516 : if ((pwd == NULL) || (pwd->pw_dir[0] == '\0')) {
71 1 : DEBUG(3, ("No home directory defined for user '%s'\n",
72 : username));
73 1 : TALLOC_FREE(pwd);
74 1 : return -1;
75 : }
76 :
77 4515 : if (strequal(pwd->pw_dir, "/")) {
78 12 : DBG_NOTICE("Invalid home directory defined for user '%s'\n",
79 : username);
80 12 : TALLOC_FREE(pwd);
81 12 : return -1;
82 : }
83 :
84 4503 : DEBUG(3, ("Adding homes service for user '%s' using home directory: "
85 : "'%s'\n", username, pwd->pw_dir));
86 :
87 4503 : result = add_home_service(username, username, pwd->pw_dir);
88 :
89 4503 : TALLOC_FREE(pwd);
90 4503 : return result;
91 : }
|