a better for for using %U in smb.conf
authorAndrew Tridgell <tridge@samba.org>
Tue, 19 Nov 2002 23:44:24 +0000 (23:44 +0000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 19 Nov 2002 23:44:24 +0000 (23:44 +0000)
this follows the method used for remote_machine and also fixes the
problem of anonymous connections clobbering the string

source/lib/substitute.c
source/smbd/service.c
source/smbd/sesssetup.c

index 23cfce6c6922a2e2da6af5b363ef16af1fdc3342..48d8e35dae53e60d67745d24ab2abc733950b9b2 100644 (file)
@@ -26,7 +26,8 @@ fstring remote_arch="UNKNOWN";
 userdom_struct current_user_info;
 fstring remote_proto="UNKNOWN";
 
-static fstring remote_machine="";
+static fstring remote_machine;
+static fstring smb_user_name;
 
 
 void set_local_machine_name(const char* local_name)
@@ -59,6 +60,21 @@ const char* get_local_machine_name(void)
        return local_machine;
 }
 
+
+/*
+  setup the string used by %U substitution 
+*/
+void sub_set_smb_name(const char *name)
+{
+       fstring tmp;
+
+       fstrcpy(tmp,name);
+       trim_string(tmp," "," ");
+       strlower(tmp);
+       alpha_strcpy(smb_user_name,tmp,SAFE_NETBIOS_CHARS,sizeof(smb_user_name)-1);
+}
+
+
 /*******************************************************************
  Given a pointer to a %$(NAME) expand it as an environment variable.
  Return the number of characters by which the pointer should be advanced.
@@ -676,20 +692,20 @@ char *alloc_sub_advanced(int snum, const char *user,
 void standard_sub_conn(connection_struct *conn, char *str, size_t len)
 {
        standard_sub_advanced(SNUM(conn), conn->user, conn->connectpath,
-                       conn->gid, current_user_info.smb_name, str, len);
+                       conn->gid, smb_user_name, str, len);
 }
 
 char *talloc_sub_conn(TALLOC_CTX *mem_ctx, connection_struct *conn, char *str)
 {
        return talloc_sub_advanced(mem_ctx, SNUM(conn), conn->user,
                        conn->connectpath, conn->gid,
-                       current_user_info.smb_name, str);
+                       smb_user_name, str);
 }
 
 char *alloc_sub_conn(connection_struct *conn, char *str)
 {
        return alloc_sub_advanced(SNUM(conn), conn->user, conn->connectpath,
-                       conn->gid, current_user_info.smb_name, str);
+                       conn->gid, smb_user_name, str);
 }
 
 /****************************************************************************
@@ -710,5 +726,5 @@ void standard_sub_snum(int snum, char *str, size_t len)
        }
 
        standard_sub_advanced(snum, cached_user, "", -1,
-               current_user_info.smb_name, str, len);
+                             smb_user_name, str, len);
 }
index fe55345938672ea942c7806c14b180d9a221f038..1f168dd3ffff5b62c677be2d1bab9785c904992a 100644 (file)
@@ -612,9 +612,6 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                return NULL;
        }
 
-       /* the %U substitution may have changed */
-       reload_services(True);
-       
        /* Remember that a different vuid can connect later without these checks... */
        
        /* Preexecs are done here as they might make the dir we are to ChDir to below */
index 4ab1063217ea8bac61463d1731cc50bb9ec76961..9d708bd5a0be8bb003ee48eb30e2f30451d4b552 100644 (file)
@@ -159,6 +159,11 @@ static int reply_spnego_kerberos(connection_struct *conn,
        }
        ads_destroy(&ads);
 
+       /* setup the string used by %U */
+       sub_set_smb_name(user);
+
+       reload_services(True);
+
        /* the password is good - let them in */
        pw = Get_Pwnam(user);
        if (!pw && !strstr(user, lp_winbind_separator())) {
@@ -423,6 +428,9 @@ static int reply_spnego_auth(connection_struct *conn, char *inbuf, char *outbuf,
 
        set_remote_machine_name(machine);
 
+       /* setup the string used by %U */
+       sub_set_smb_name(user);
+
        reload_services(True);
 
 #if 0
@@ -749,6 +757,9 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,
                        return ERROR_NT(NT_STATUS_UNSUCCESSFUL);
                }
                pstrcpy(sub_user, user);
+
+               /* setup the string used by %U */
+               sub_set_smb_name(user);
        } else {
                pstrcpy(sub_user, lp_guestaccount());
        }