diff options
-rw-r--r-- | source3/include/proto.h | 3 | ||||
-rw-r--r-- | source3/include/smb.h | 7 | ||||
-rw-r--r-- | source3/include/smb_macros.h | 8 | ||||
-rw-r--r-- | source3/passdb/passdb.c | 43 | ||||
-rw-r--r-- | source3/rpc_parse/parse_net.c | 4 | ||||
-rw-r--r-- | source3/smbd/password.c | 66 | ||||
-rw-r--r-- | source3/smbd/reply.c | 4 |
7 files changed, 65 insertions, 70 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 3887d96589..a5da95cd7d 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -3304,8 +3304,7 @@ char *validated_domain(uint16 vuid); int setup_groups(char *user, char *domain, uid_t uid, gid_t gid, int *p_ngroups, gid_t **p_groups); uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, - char *domain,BOOL guest, - NET_USER_INFO_3 *usr); + char *domain,BOOL guest); void add_session_user(char *user); BOOL smb_password_check(char *password, unsigned char *part_passwd, unsigned char *c8); BOOL smb_password_ok(struct smb_passwd *smb_pass, uchar chal[8], diff --git a/source3/include/smb.h b/source3/include/smb.h index 0efced2e38..91f0e04b48 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1696,7 +1696,12 @@ typedef struct int n_groups; gid_t *groups; - NET_USER_INFO_3 usr; +#if 0 + NET_USER_INFO_3 usr; /* This should not be here. */ +#else + DOM_SID user_sid; + DOM_SID *group_sids; +#endif /* per-user authentication information on NT RPCs */ /* lkclXXXX - THIS SHOULD NOT BE HERE! */ diff --git a/source3/include/smb_macros.h b/source3/include/smb_macros.h index 267b061f65..51c7c1c638 100644 --- a/source3/include/smb_macros.h +++ b/source3/include/smb_macros.h @@ -42,14 +42,6 @@ #define IS_DOS_SYSTEM(test_mode) (((test_mode) & aSYSTEM) != 0) #define IS_DOS_HIDDEN(test_mode) (((test_mode) & aHIDDEN) != 0) -/* memory-allocation-helpers (idea and names from glib) */ -#define g_new(type, count) \ - ((type *) malloc(sizeof(type) * (count))) -#define g_new0(type, count) \ - ((type *) calloc((count), sizeof(type))) -#define g_renew(type, mem, count) \ - ((type *) Realloc(mem, sizeof(type) * (count))) - /* zero a structure */ #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x)) diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c index 957ba06874..6556503dca 100644 --- a/source3/passdb/passdb.c +++ b/source3/passdb/passdb.c @@ -1214,7 +1214,6 @@ BOOL lookup_local_name(char *domain, char *user, DOM_SID *psid, uint8 *psid_name return True; } -#if 0 /**************************************************************************** Create a list of SIDS for a user - primary and group. This is really the wrong way to do this and needs to go via winbind. JRA. @@ -1242,5 +1241,45 @@ BOOL setup_user_sids(user_struct *vuser) } return True; -} +#if 0 + /* Luke's code. */ + if (usr == NULL) + { + int i; + extern DOM_SID global_sam_sid; + + DEBUG(0,("vuser struct usr being filled in with trash, today\n")); + DEBUG(0,("this needs to be replaced with a proper surs impl.\n")); + DEBUG(0,("e.g. the one used in winbindd. in fact, all\n")); + DEBUG(0,("occurrences of pdb_xxx_to_xxx should be replaced\n")); + DEBUG(0,("as soon as possible.\n")); + vuser->usr.user_id = pdb_uid_to_user_rid(uid); + vuser->usr.group_id = pdb_gid_to_group_rid(gid); + vuser->usr.num_groups = vuser->n_groups; + if (vuser->n_groups != 0) + { + vuser->usr.gids = g_new(DOM_GID, vuser->usr.num_groups); + if (vuser->usr.gids == NULL) + return UID_FIELD_INVALID; + } + + for (i = 0; i < vuser->usr.num_groups; i++) + { + DOM_GID *ntgid = &vuser->usr.gids[i]; + ntgid->attr = 0x7; + ntgid->g_rid = pdb_gid_to_group_rid(vuser->groups[i]); + } + + /* this is possibly the worst thing to do, ever. it assumes */ + /* that all users of this system are in the local SAM database */ + /* however, because there is no code to do anything otherwise, */ + /* we have no choice */ + + init_dom_sid2(&vuser->usr.dom_sid, &global_sam_sid); + } + else + { + vuser->usr = *usr; + } #endif +} diff --git a/source3/rpc_parse/parse_net.c b/source3/rpc_parse/parse_net.c index c1b16b8864..bcc8e876b5 100644 --- a/source3/rpc_parse/parse_net.c +++ b/source3/rpc_parse/parse_net.c @@ -1072,7 +1072,7 @@ void init_net_user_info3(NET_USER_INFO_3 *usr, if (num_groups > 0) { - usr->gids = g_new(DOM_GID, num_groups); + usr->gids = (DOM_GID *)malloc(sizeof(DOM_GID) * num_groups); if (usr->gids == NULL) return; for (i = 0; i < num_groups; i++) @@ -1190,7 +1190,7 @@ static BOOL net_io_user_info3(char *desc, NET_USER_INFO_3 *usr, prs_struct *ps, if (UNMARSHALLING(ps) && usr->num_groups2 > 0) { - usr->gids = g_new(DOM_GID, usr->num_groups2); + usr->gids = (DOM_GID *)malloc(sizeof(DOM_GID)*usr->num_groups2); if (usr->gids == NULL) return False; } diff --git a/source3/smbd/password.c b/source3/smbd/password.c index 4110530c0b..c38a6a0f2b 100644 --- a/source3/smbd/password.c +++ b/source3/smbd/password.c @@ -117,24 +117,24 @@ invalidate a uid ****************************************************************************/ void invalidate_vuid(uint16 vuid) { - user_struct *vuser = get_valid_user_struct(vuid); + user_struct *vuser = get_valid_user_struct(vuid); - if (vuser == NULL) return; + if (vuser == NULL) + return; - vuser->uid = (uid_t)-1; - vuser->gid = (gid_t)-1; + vuser->uid = (uid_t)-1; + vuser->gid = (gid_t)-1; - /* same number of igroups as groups */ - vuser->n_groups = 0; + /* same number of igroups as groups */ + vuser->n_groups = 0; - if (vuser->groups) - free((char *)vuser->groups); + if (vuser->groups) + free((char *)vuser->groups); - vuser->groups = NULL; + vuser->groups = NULL; - if (vuser->usr.gids != NULL) - free (vuser->usr.gids); - vuser->usr.gids = NULL; + if (vuser->group_sids != NULL) + free (vuser->group_sids); } @@ -218,8 +218,7 @@ has been given. vuid is biased by an offset. This allows us to tell random client vuid's (normally zero) from valid vuids. ****************************************************************************/ uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, - char *domain,BOOL guest, - NET_USER_INFO_3 *usr) + char *domain,BOOL guest) { user_struct *vuser; struct passwd *pwfile; /* for getting real name from passwd file */ @@ -279,44 +278,7 @@ uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, &vuser->n_groups, &vuser->groups); - if (usr == NULL) - { - int i; - extern DOM_SID global_sam_sid; - - DEBUG(0,("vuser struct usr being filled in with trash, today\n")); - DEBUG(0,("this needs to be replaced with a proper surs impl.\n")); - DEBUG(0,("e.g. the one used in winbindd. in fact, all\n")); - DEBUG(0,("occurrences of pdb_xxx_to_xxx should be replaced\n")); - DEBUG(0,("as soon as possible.\n")); - vuser->usr.user_id = pdb_uid_to_user_rid(uid); - vuser->usr.group_id = pdb_gid_to_group_rid(gid); - vuser->usr.num_groups = vuser->n_groups; - if (vuser->n_groups != 0) - { - vuser->usr.gids = g_new(DOM_GID, vuser->usr.num_groups); - if (vuser->usr.gids == NULL) - return UID_FIELD_INVALID; - } - - for (i = 0; i < vuser->usr.num_groups; i++) - { - DOM_GID *ntgid = &vuser->usr.gids[i]; - ntgid->attr = 0x7; - ntgid->g_rid = pdb_gid_to_group_rid(vuser->groups[i]); - } - - /* this is possibly the worst thing to do, ever. it assumes */ - /* that all users of this system are in the local SAM database */ - /* however, because there is no code to do anything otherwise, */ - /* we have no choice */ - - init_dom_sid2(&vuser->usr.dom_sid, &global_sam_sid); - } - else - { - vuser->usr = *usr; - } + setup_user_sids(vuser); DEBUG(3,("uid %d registered to name %s\n",(int)uid,unix_name)); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index f9c0695a39..00a0ce3c4a 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1001,9 +1001,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int /* register the name and uid as being validated, so further connections to a uid can get through without a password, on the same VC */ - DEBUG(0,("must call domain_client_validate() which returns a ")); - DEBUG(0,("NET_USER_INFO_3 structure to pass to register_vuid()")); - sess_vuid = register_vuid(uid,gid,user,sesssetup_user,domain,guest, NULL); + sess_vuid = register_vuid(uid,gid,user,sesssetup_user,domain,guest); SSVAL(outbuf,smb_uid,sess_vuid); SSVAL(inbuf,smb_uid,sess_vuid); |