summaryrefslogtreecommitdiff
path: root/source3/lib/vuser.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib/vuser.c')
-rw-r--r--source3/lib/vuser.c88
1 files changed, 57 insertions, 31 deletions
diff --git a/source3/lib/vuser.c b/source3/lib/vuser.c
index dfad258152..09a553e4e6 100644
--- a/source3/lib/vuser.c
+++ b/source3/lib/vuser.c
@@ -55,18 +55,12 @@ void invalidate_vuid(uint16 vuid)
vuser->uid = (uid_t)-1;
vuser->gid = (gid_t)-1;
- vuser->n_sids = 0;
-
/* same number of igroups as groups */
vuser->n_groups = 0;
if (vuser->groups)
free((char *)vuser->groups);
- if (vuser->sids)
- free((char *)vuser->sids);
-
- vuser->sids = NULL;
vuser->groups = NULL;
}
@@ -89,9 +83,53 @@ register a uid/name pair as being valid and that a valid password
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, BOOL guest, uchar user_sess_key[16])
+uint16 create_vuid(uid_t uid, gid_t gid, int n_groups, gid_t *groups,
+ char *unix_name, char *requested_name,
+ char *real_name,
+ BOOL guest, uchar user_sess_key[16])
{
user_struct *vuser;
+
+ validated_users = (user_struct *)Realloc(validated_users,
+ sizeof(user_struct)*
+ (num_validated_users+1));
+
+ if (!validated_users)
+ {
+ DEBUG(0,("Failed to realloc users struct!\n"));
+ num_validated_users = 0;
+ return UID_FIELD_INVALID;
+ }
+
+ vuser = &validated_users[num_validated_users];
+ num_validated_users++;
+
+ vuser->uid = uid;
+ vuser->gid = gid;
+ vuser->guest = guest;
+ fstrcpy(vuser->name,unix_name);
+ fstrcpy(vuser->requested_name,requested_name);
+ fstrcpy(vuser->real_name,real_name);
+ memcpy(vuser->user_sess_key, user_sess_key, sizeof(vuser->user_sess_key));
+
+ vuser->n_groups = n_groups;
+ vuser->groups = groups;
+
+ DEBUG(3,("uid %d registered to name %s\n",(int)uid,unix_name));
+
+ return (uint16)((num_validated_users - 1) + VUID_OFFSET);
+}
+
+/****************************************************************************
+register a uid/name pair as being valid and that a valid password
+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, BOOL guest, uchar user_sess_key[16])
+{
+ int n_groups;
+ gid_t *groups;
+ fstring real_name;
struct passwd *pwfile; /* for getting real name from passwd file */
/* Ensure no vuid gets registered in share level security. */
@@ -130,40 +168,28 @@ uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name,
return UID_FIELD_INVALID;
}
- vuser = &validated_users[num_validated_users];
- num_validated_users++;
-
- vuser->uid = uid;
- vuser->gid = gid;
- vuser->guest = guest;
- fstrcpy(vuser->name,unix_name);
- fstrcpy(vuser->requested_name,requested_name);
- memcpy(vuser->dc.user_sess_key, user_sess_key, sizeof(vuser->dc.user_sess_key));
-
- vuser->n_sids = 0;
- vuser->sids = NULL;
-
- vuser->n_groups = 0;
- vuser->groups = NULL;
-
/* Find all the groups this uid is in and store them.
Used by become_user() */
get_unixgroups(unix_name,uid,gid,
- &vuser->n_groups,
- &vuser->groups);
+ &n_groups,
+ &groups);
DEBUG(3,("uid %d registered to name %s\n",(int)uid,unix_name));
DEBUG(3, ("Clearing default real name\n"));
- fstrcpy(vuser->real_name, "<Full Name>\0");
- if (lp_unix_realname()) {
- if ((pwfile=hashed_getpwnam(vuser->name))!= NULL)
+ fstrcpy(real_name, "<Full Name>\0");
+ if (lp_unix_realname())
+ {
+ if ((pwfile=hashed_getpwnam(unix_name))!= NULL)
{
- DEBUG(3, ("User name: %s\tReal name: %s\n",vuser->name,pwfile->pw_gecos));
- fstrcpy(vuser->real_name, pwfile->pw_gecos);
+ DEBUG(3, ("User name: %s\tReal name: %s\n",unix_name,pwfile->pw_gecos));
+ fstrcpy(real_name, pwfile->pw_gecos);
}
}
- return (uint16)((num_validated_users - 1) + VUID_OFFSET);
+ return create_vuid(uid, gid, n_groups, groups,
+ unix_name, requested_name,
+ real_name,
+ guest, user_sess_key);
}