wscript: Add check for --wrap linker flag
[vlendec/samba-autobuild/.git] / source3 / auth / server_info_sam.c
1 /*
2    Unix SMB/CIFS implementation.
3    Authentication utility functions
4    Copyright (C) Andrew Tridgell 1992-1998
5    Copyright (C) Andrew Bartlett 2001
6    Copyright (C) Jeremy Allison 2000-2001
7    Copyright (C) Rafal Szczesniak 2002
8    Copyright (C) Volker Lendecke 2006
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 */
23
24 #include "includes.h"
25 #include "auth.h"
26 #include "nsswitch/winbind_client.h"
27 #include "passdb.h"
28
29 #undef DBGC_CLASS
30 #define DBGC_CLASS DBGC_AUTH
31
32
33 /***************************************************************************
34  Is the incoming username our own machine account ?
35  If so, the connection is almost certainly from winbindd.
36 ***************************************************************************/
37
38 static bool is_our_machine_account(const char *username)
39 {
40         bool ret;
41         char *truncname = NULL;
42         size_t ulen = strlen(username);
43
44         if (ulen == 0 || username[ulen-1] != '$') {
45                 return false;
46         }
47         truncname = SMB_STRDUP(username);
48         if (!truncname) {
49                 return false;
50         }
51         truncname[ulen-1] = '\0';
52         ret = strequal(truncname, lp_netbios_name());
53         SAFE_FREE(truncname);
54         return ret;
55 }
56
57 /***************************************************************************
58  Make (and fill) a user_info struct from a struct samu
59 ***************************************************************************/
60
61 NTSTATUS make_server_info_sam(TALLOC_CTX *mem_ctx,
62                               struct samu *sampass,
63                               struct auth_serversupplied_info **pserver_info)
64 {
65         struct passwd *pwd;
66         struct auth_serversupplied_info *server_info;
67         const char *username = pdb_get_username(sampass);
68         TALLOC_CTX *tmp_ctx;
69         NTSTATUS status;
70
71         tmp_ctx = talloc_stackframe();
72         if (tmp_ctx == NULL) {
73                 return NT_STATUS_NO_MEMORY;
74         }
75
76         server_info = make_server_info(tmp_ctx);
77         if (server_info == NULL) {
78                 status = NT_STATUS_NO_MEMORY;
79                 goto out;
80         }
81
82         pwd = Get_Pwnam_alloc(tmp_ctx, username);
83         if (pwd == NULL) {
84                 DEBUG(1, ("User %s in passdb, but getpwnam() fails!\n",
85                           pdb_get_username(sampass)));
86                 status = NT_STATUS_NO_SUCH_USER;
87                 goto out;
88         }
89
90         status = samu_to_SamInfo3(server_info,
91                                   sampass,
92                                   lp_netbios_name(),
93                                   &server_info->info3,
94                                   &server_info->extra);
95         if (!NT_STATUS_IS_OK(status)) {
96                 goto out;
97         }
98
99         server_info->unix_name = talloc_steal(server_info, pwd->pw_name);
100
101         server_info->utok.gid = pwd->pw_gid;
102         server_info->utok.uid = pwd->pw_uid;
103
104         if (IS_DC && is_our_machine_account(username)) {
105                 /*
106                  * This is a hack of monstrous proportions.
107                  * If we know it's winbindd talking to us,
108                  * we know we must never recurse into it,
109                  * so turn off contacting winbindd for this
110                  * entire process. This will get fixed when
111                  * winbindd doesn't need to talk to smbd on
112                  * a PDC. JRA.
113                  */
114
115                 (void)winbind_off();
116
117                 DEBUG(10, ("make_server_info_sam: our machine account %s "
118                            "turning off winbindd requests.\n", username));
119         }
120
121         DEBUG(5,("make_server_info_sam: made server info for user %s -> %s\n",
122                  pdb_get_username(sampass), server_info->unix_name));
123
124         *pserver_info = talloc_steal(mem_ctx, server_info);
125
126         status = NT_STATUS_OK;
127 out:
128         talloc_free(tmp_ctx);
129
130         return status;
131 }