user_struct *get_valid_user_struct(uint16 vuid);
void invalidate_vuid(uint16 vuid);
char *validated_username(uint16 vuid);
-uint16 register_vuid(int uid,int gid, char *name,BOOL guest);
+uint16 register_vuid(int uid,int gid, char *unix_name, char *requested_name, BOOL guest);
void add_session_user(char *user);
BOOL update_smbpassword_file( struct passwd *pass, fstring password);
void dfs_unlogin(void);
int reply_lanman2(char *outbuf);
int reply_nt1(char *outbuf);
void close_cnum(int cnum, uint16 vuid);
-BOOL yield_connection(int cnum,char *name,int max_connections);
-BOOL claim_connection(int cnum,char *name,int max_connections,BOOL Clear);
+BOOL yield_connection(int cnum,char *name,int max_connections, uint16 vuid);
+BOOL claim_connection(int cnum,char *name,int max_connections,BOOL Clear, uint16 vuid);
void exit_server(char *reason);
-void standard_sub(int cnum,char *str);
+void standard_sub(int cnum,char *str,uint16 vuid);
char *smb_fn_name(int type);
int chain_reply(char *inbuf,char *outbuf,int size,int bufsize);
int construct_reply(char *inbuf,char *outbuf,int size,int bufsize);
int uid; /* uid of a validated user */
int gid; /* gid of a validated user */
- fstring name; /* name of a validated user */
+ fstring requested_name; /* user name from the client */
+ fstring name; /* unix user name of a validated user */
fstring real_name; /* to store real name from password file - simeon */
BOOL guest;
string_sub(syscmd, "%p", tstr);
- standard_sub(cnum,syscmd);
+ standard_sub(cnum,syscmd,UID_FIELD_INVALID);
return (syscmd);
}
pstrcpy(syscmd,lpq_command);
string_sub(syscmd,"%p",printername);
- standard_sub(cnum,syscmd);
+ standard_sub(cnum,syscmd,UID_FIELD_INVALID);
sprintf(outfile,"%s/lpq.%08x",tmpdir(),str_checksum(syscmd));
pstrcpy(syscmd,lprm_command);
string_sub(syscmd,"%p",printername);
string_sub(syscmd,"%j",jobstr);
- standard_sub(cnum,syscmd);
+ standard_sub(cnum,syscmd,UID_FIELD_INVALID);
ret = smbrun(syscmd,NULL,False);
DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
pstrcpy(syscmd,lpstatus_command);
string_sub(syscmd,"%p",printername);
string_sub(syscmd,"%j",jobstr);
- standard_sub(cnum,syscmd);
+ standard_sub(cnum,syscmd,UID_FIELD_INVALID);
ret = smbrun(syscmd,NULL,False);
DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
StrnCpy(buf,src,sizeof(buf)/2);
string_sub(buf,"%S",lp_servicename(snum));
- standard_sub(cnum,buf);
+ standard_sub(cnum,buf,UID_FIELD_INVALID);
StrnCpy(*dst,buf,*n);
l = strlen(*dst) + 1;
(*dst) += l;
if (!s) return(0);
StrnCpy(buf,s,sizeof(buf)/2);
string_sub(buf,"%S",lp_servicename(snum));
- standard_sub(cnum,buf);
+ standard_sub(cnum,buf,UID_FIELD_INVALID);
return strlen(buf) + 1;
}
if (!s) return(NULL);
StrnCpy(buf,s,sizeof(buf)/2);
string_sub(buf,"%S",lp_servicename(snum));
- standard_sub(cnum,buf);
+ standard_sub(cnum,buf,UID_FIELD_INVALID);
return &buf[0];
}
SIVAL(p,6,0);
} else {
SIVAL(p,6,PTR_DIFF(p2,*rdata));
- standard_sub(cnum,comment);
+ standard_sub(cnum,comment,vuid);
StrnCpy(p2,comment,MAX(mdrcnt - struct_len,0));
p2 = skip_string(p2,1);
}
/* JHT - By calling lp_logon_script() and standard_sub() we have */
/* made sure all macros are fully substituted and available */
logon_script = lp_logon_script();
- standard_sub( cnum, logon_script );
+ standard_sub( cnum, logon_script, vuid );
PACKS(&desc,"z", logon_script); /* script path */
/* End of JHT mods */
string_sub(s,"%s",name);
string_sub(s,"%f",msgfrom);
string_sub(s,"%t",msgto);
- standard_sub(-1,s);
+ standard_sub(-1,s,UID_FIELD_INVALID);
smbrun(s,NULL,False);
}
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(int uid,int gid, char *name,BOOL guest)
+uint16 register_vuid(int uid,int gid, char *unix_name, char *requested_name, BOOL guest)
{
user_struct *vuser;
struct passwd *pwfile; /* for getting real name from passwd file */
vuser->uid = uid;
vuser->gid = gid;
vuser->guest = guest;
- strcpy(vuser->name,name);
+ fstrcpy(vuser->name,unix_name);
+ fstrcpy(vuser->requested_name,requested_name);
vuser->n_sids = 0;
vuser->sids = NULL;
/* Find all the groups this uid is in and store them.
Used by become_user() */
- setup_groups(name,uid,gid,
+ setup_groups(unix_name,uid,gid,
&vuser->n_groups,
&vuser->igroups,
&vuser->groups,
&vuser->attrs);
- DEBUG(3,("uid %d registered to name %s\n",uid,name));
+ DEBUG(3,("uid %d registered to name %s\n",uid,unix_name));
DEBUG(3, ("Clearing default real name\n"));
fstrcpy(vuser->real_name, "<Full Name>\0");
/* register the name and uid as being validated, so further connections
to a uid can get through without a password, on the same VC */
- sess_vuid = register_vuid(uid,gid,user,guest);
+ sess_vuid = register_vuid(uid,gid,user,sesssetup_user,guest);
SSVAL(outbuf,smb_uid,sess_vuid);
SSVAL(inbuf,smb_uid,sess_vuid);
{
pstring s;
pstrcpy(s,lp_pathname(snum));
- standard_sub(cnum,s);
+ standard_sub(cnum,s,vuid);
string_set(&pcon->connectpath,s);
DEBUG(3,("Connect path is %s\n",s));
}
/* check number of connections */
if (!claim_connection(cnum,
lp_servicename(SNUM(cnum)),
- lp_max_connections(SNUM(cnum)),False))
+ lp_max_connections(SNUM(cnum)),False,vuid))
{
DEBUG(1,("too many connections - rejected\n"));
return(-8);
}
if (lp_status(SNUM(cnum)))
- claim_connection(cnum,"STATUS.",MAXSTATUS,first_connection);
+ claim_connection(cnum,"STATUS.",MAXSTATUS,first_connection,vuid);
first_connection = False;
} /* IS_IPC */
{
pstring cmd;
pstrcpy(cmd,lp_rootpreexec(SNUM(cnum)));
- standard_sub(cnum,cmd);
+ standard_sub(cnum,cmd,vuid);
DEBUG(5,("cmd=%s\n",cmd));
smbrun(cmd,NULL,False);
}
if (!IS_IPC(cnum)) {
yield_connection(cnum,
lp_servicename(SNUM(cnum)),
- lp_max_connections(SNUM(cnum)));
- if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
+ lp_max_connections(SNUM(cnum)), vuid);
+ if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS, vuid);
}
return(-1);
}
if (!IS_IPC(cnum)) {
yield_connection(cnum,
lp_servicename(SNUM(cnum)),
- lp_max_connections(SNUM(cnum)));
- if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
+ lp_max_connections(SNUM(cnum)), vuid);
+ if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS, vuid);
}
return(-5);
}
{
pstring cmd;
pstrcpy(cmd,lp_preexec(SNUM(cnum)));
- standard_sub(cnum,cmd);
+ standard_sub(cnum,cmd,vuid);
smbrun(cmd,NULL,False);
}
yield_connection(cnum,
lp_servicename(SNUM(cnum)),
- lp_max_connections(SNUM(cnum)));
+ lp_max_connections(SNUM(cnum)), vuid);
if (lp_status(SNUM(cnum)))
- yield_connection(cnum,"STATUS.",MAXSTATUS);
+ yield_connection(cnum,"STATUS.",MAXSTATUS, vuid);
close_open_files(cnum);
dptr_closecnum(cnum);
{
pstring cmd;
strcpy(cmd,lp_postexec(SNUM(cnum)));
- standard_sub(cnum,cmd);
+ standard_sub(cnum,cmd,vuid);
smbrun(cmd,NULL,False);
unbecome_user();
}
{
pstring cmd;
strcpy(cmd,lp_rootpostexec(SNUM(cnum)));
- standard_sub(cnum,cmd);
+ standard_sub(cnum,cmd,vuid);
smbrun(cmd,NULL,False);
}
/****************************************************************************
simple routines to do connection counting
****************************************************************************/
-BOOL yield_connection(int cnum,char *name,int max_connections)
+BOOL yield_connection(int cnum,char *name,int max_connections, uint16 vuid)
{
struct connect_record crec;
pstring fname;
bzero(&crec,sizeof(crec));
pstrcpy(fname,lp_lockdir());
- standard_sub(cnum,fname);
+ standard_sub(cnum,fname,vuid);
trim_string(fname,"","/");
strcat(fname,"/");
/****************************************************************************
simple routines to do connection counting
****************************************************************************/
-BOOL claim_connection(int cnum,char *name,int max_connections,BOOL Clear)
+BOOL claim_connection(int cnum,char *name,int max_connections,BOOL Clear, uint16 vuid)
{
struct connect_record crec;
pstring fname;
DEBUG(5,("trying claim %s %s %d\n",lp_lockdir(),name,max_connections));
pstrcpy(fname,lp_lockdir());
- standard_sub(cnum,fname);
+ standard_sub(cnum,fname,vuid);
trim_string(fname,"","/");
if (!directory_exist(fname,NULL))
/****************************************************************************
do some standard substitutions in a string
****************************************************************************/
-void standard_sub(int cnum,char *str)
+void standard_sub(int cnum,char *str,uint16 vuid)
{
+ user_struct *vuser = get_valid_user_struct(vuid);
+
if (VALID_CNUM(cnum)) {
char *p, *s, *home;
}
}
}
+ if(vuser != NULL)
+ pstrcpy( sesssetup_user, vuser->requested_name);
+
standard_sub_basic(str);
}
/* what user is current? */
struct current_user current_user;
+extern pstring sesssetup_user;
pstring OriginalDir;
current_user.cnum = cnum;
current_user.vuid = vuid;
+ /* Ensure sesssetup_user is set correctly if we are using
+ user security. */
+ if(vuser != NULL)
+ pstrcpy( sesssetup_user, vuser->requested_name);
+
DEBUG(5,("become_user uid=(%d,%d) gid=(%d,%d)\n",
getuid(),geteuid(),getgid(),getegid()));