Added patch from Bruce Tenison <btenison@dibbs.net> to allow encrypted
authorJeremy Allison <jra@samba.org>
Thu, 30 Apr 1998 01:39:22 +0000 (01:39 +0000)
committerJeremy Allison <jra@samba.org>
Thu, 30 Apr 1998 01:39:22 +0000 (01:39 +0000)
passwords to be stored over time, allowing a smbpasswd file migration.
Adds new parameter "update encrypted".
Will also add to 1.9.18 branch.
Docs update to follow.
Jeremy.

source/include/proto.h
source/param/loadparm.c
source/passdb/smbpass.c
source/rpc_server/srv_netlog.c
source/smbd/chgpasswd.c
source/smbd/ipc.c
source/smbd/password.c
source/utils/smbpasswd.c
source/web/swat.c

index 76fb11c12e9a73b87fbb9c0eb93eacfad32231b0..096552720536c4101b90b7a509d4cb1e23ba497c 100644 (file)
@@ -41,7 +41,7 @@ BOOL change_lanman_password(struct smb_passwd *smbpw, unsigned char *pass1, unsi
 BOOL check_oem_password(char *user, unsigned char *data,
                         struct smb_passwd **psmbpw, char *new_passwd,
                         int new_passwd_size);
-BOOL change_oem_password(struct smb_passwd *smbpw, char *new_passwd);
+BOOL change_oem_password(struct smb_passwd *smbpw, char *new_passwd, BOOL flag);
 
 /*The following definitions come from  client.c  */
 
@@ -971,6 +971,7 @@ BOOL lp_writeraw(void);
 BOOL lp_null_passwords(void);
 BOOL lp_strip_dot(void);
 BOOL lp_encrypted_passwords(void);
+BOOL lp_update_encrypted(void);
 BOOL lp_syslog_only(void);
 BOOL lp_browse_list(void);
 BOOL lp_unix_realname(void);
@@ -1555,6 +1556,7 @@ int setup_groups(char *user, int uid, int gid, int *p_ngroups,
          int **p_attrs);
 uint16 register_vuid(int uid,int gid, char *name,BOOL guest);
 void add_session_user(char *user);
+BOOL update_smbpassword_file( char *user, fstring password);
 void dfs_unlogin(void);
 BOOL password_check(char *password);
 BOOL smb_password_check(char *password, unsigned char *part_passwd, unsigned char *c8);
@@ -1770,7 +1772,7 @@ struct smb_passwd *getsmbpwnam(char *name);
 struct smb_passwd *getsmbpwuid(unsigned int uid);
 char *encode_acct_ctrl(uint16 acct_ctrl);
 BOOL add_smbpwd_entry(struct smb_passwd *newpwd);
-BOOL mod_smbpwd_entry(struct smb_passwd* pwd);
+BOOL mod_smbpwd_entry(struct smb_passwd* pwd, BOOL override);
 void *machine_password_lock( char *domain, char *name, BOOL update);
 BOOL machine_password_unlock( void *token );
 BOOL machine_password_delete( char *domain, char *name );
index dda31f3efe11ce76a51f76e66196d5ba16eeb576..e4d27f1f6428f88f2efa554c78a089627836849e 100644 (file)
@@ -176,6 +176,7 @@ typedef struct
   BOOL bDomainMaster;
   BOOL bDomainLogons;
   BOOL bEncryptPasswords;
+  BOOL bUpdateEncrypt;
   BOOL bStripDot;
   BOOL bNullPasswords;
   BOOL bLoadPrinters;
@@ -436,6 +437,7 @@ static struct parm_struct parm_table[] =
   {"Security Options", P_SEP, P_SEPARATOR},
   {"security",         P_ENUM,    P_GLOBAL, &Globals.security,          NULL,   enum_security, FLAG_BASIC},
   {"encrypt passwords",P_BOOL,    P_GLOBAL, &Globals.bEncryptPasswords, NULL,   NULL,  FLAG_BASIC},
+  {"update encrypted", P_BOOL,    P_GLOBAL, &Globals.bUpdateEncrypt,    NULL,   NULL,  FLAG_BASIC},
   {"use rhosts",       P_BOOL,    P_GLOBAL, &Globals.bUseRhosts,        NULL,   NULL,  0},
   {"null passwords",   P_BOOL,    P_GLOBAL, &Globals.bNullPasswords,    NULL,   NULL,  0},
   {"password server",  P_STRING,  P_GLOBAL, &Globals.szPasswordServer,  NULL,   NULL,  0},
@@ -723,6 +725,7 @@ static void init_globals(void)
   Globals.maxprotocol = PROTOCOL_NT1;
   Globals.security = SEC_SHARE;
   Globals.bEncryptPasswords = False;
+  Globals.bUpdateEncrypt = False;
   Globals.bReadRaw = True;
   Globals.bWriteRaw = True;
   Globals.bReadPrediction = False;
@@ -977,6 +980,7 @@ FN_GLOBAL_BOOL(lp_writeraw,&Globals.bWriteRaw)
 FN_GLOBAL_BOOL(lp_null_passwords,&Globals.bNullPasswords)
 FN_GLOBAL_BOOL(lp_strip_dot,&Globals.bStripDot)
 FN_GLOBAL_BOOL(lp_encrypted_passwords,&Globals.bEncryptPasswords)
+FN_GLOBAL_BOOL(lp_update_encrypted,&Globals.bUpdateEncrypt)
 FN_GLOBAL_BOOL(lp_syslog_only,&Globals.bSyslogOnly)
 FN_GLOBAL_BOOL(lp_browse_list,&Globals.bBrowseList)
 FN_GLOBAL_BOOL(lp_unix_realname,&Globals.bUnixRealname)
index 2ab21f78ef7238d3384b070a6059f1f5c7bc714e..cd3cc76909a210be506863a25bf68f992af0227b 100644 (file)
@@ -731,9 +731,11 @@ Error was %s. Password file may be corrupt ! Please examine by hand !\n",
  and then modify its password entry. We can't use the startsmbpwent()/
  getsmbpwent()/endsmbpwent() interfaces here as we depend on looking
  in the actual file to decide how much room we have to write data.
+ override = False, normal
+ override = True, override XXXXXXXX'd out password or NO PASS
 ************************************************************************/
 
-BOOL mod_smbpwd_entry(struct smb_passwd* pwd)
+BOOL mod_smbpwd_entry(struct smb_passwd* pwd, BOOL override)
 {
   /* Static buffers we will return. */
   static pstring  user_name;
@@ -895,9 +897,9 @@ BOOL mod_smbpwd_entry(struct smb_passwd* pwd)
   /* Record exact password position */
   pwd_seekpos += PTR_DIFF(p, linebuf);
 
-  if (*p == '*' || *p == 'X') {
+  if (!override && (*p == '*' || *p == 'X')) {
     /* Password deliberately invalid - end here. */
-    DEBUG(10, ("get_smbpwd_entry: entry invalidated for user %s\n", user_name));
+    DEBUG(10, ("mod_smbpwd_entry: entry invalidated for user %s\n", user_name));
     pw_file_unlock(lockfd, &pw_file_lock_depth);
     fclose(fp);
     return False;
@@ -917,7 +919,7 @@ BOOL mod_smbpwd_entry(struct smb_passwd* pwd)
     return False;
   }
 
-  if (*p == '*' || *p == 'X') {
+  if (!override && (*p == '*' || *p == 'X')) {
     pw_file_unlock(lockfd,&pw_file_lock_depth);
     fclose(fp);
     return False;
index 743e4477a6f78500729b015f40ae48b69aa8c619..6229d5ea0b137fe818783a96fdc31f50c3eb6edb 100644 (file)
@@ -410,7 +410,7 @@ static void api_net_srv_pwset( int uid,
                   smb_pass->acct_ctrl     = ACB_WSTRUST;
 
                   become_root(True);
-                  ret = mod_smbpwd_entry(smb_pass);
+                  ret = mod_smbpwd_entry(smb_pass,False);
                   unbecome_root(True);
 
                   if (ret)
index 92bdb1adf0f138e55c0cbb7486e9dcc8ae459d0e..4bdfaec453fdd5eb45f6aa845837a1d51a2a0641 100644 (file)
@@ -536,7 +536,7 @@ BOOL change_lanman_password(struct smb_passwd *smbpw, unsigned char *pass1, unsi
 
   /* Now write it into the file. */
   become_root(0);
-  ret = mod_smbpwd_entry(smbpw);
+  ret = mod_smbpwd_entry(smbpw,False);
   unbecome_root(0);
     
   return ret;
@@ -632,9 +632,11 @@ BOOL check_oem_password(char *user, unsigned char *data,
 /***********************************************************
  Code to change the oem password. Changes both the lanman
  and NT hashes.
+ override = False, normal
+ override = True, override XXXXXXXXXX'd password
 ************************************************************/
 
-BOOL change_oem_password(struct smb_passwd *smbpw, char *new_passwd)
+BOOL change_oem_password(struct smb_passwd *smbpw, char *new_passwd, BOOL override)
 {
   int ret;
   fstring upper_case_new_passwd;
@@ -654,7 +656,7 @@ BOOL change_oem_password(struct smb_passwd *smbpw, char *new_passwd)
   
   /* Now write it into the file. */
   become_root(0);
-  ret = mod_smbpwd_entry(smbpw);
+  ret = mod_smbpwd_entry(smbpw,override);
   unbecome_root(0);
 
   memset(upper_case_new_passwd, '\0', strlen(upper_case_new_passwd));
index e3dcda90043df37a25e2cd7d78ed96c41d293fb8..2f9cc00dc9db3b4b190dca6cb86f70ef287f8f22 100644 (file)
@@ -1719,7 +1719,7 @@ static BOOL api_SamOEMChangePassword(int cnum,uint16 vuid, char *param,char *dat
   if(lp_unix_password_sync())
     chgpasswd(user,"", new_passwd, True);
  
-  if(change_oem_password( smbpw, new_passwd)) {
+  if(change_oem_password( smbpw, new_passwd, False)) {
     SSVAL(*rparam,0,NERR_Success);
   }
 
index 180c51f4ea0d424dd0bebc109e7f6c05185eb450..57e7775b7177ed86e9021c8603747d0aa63077f5 100644 (file)
@@ -423,6 +423,31 @@ static char *osf1_bigcrypt(char *password,char *salt1)
 }
 #endif
 
+/****************************************************************************
+update the encrypted smbpasswd file from the plaintext username and password
+*****************************************************************************/
+BOOL update_smbpassword_file( char *user, fstring password)
+{
+  struct smb_passwd *smbpw;
+  BOOL ret;
+
+  become_root(0);
+  smbpw = getsmbpwnam(user);
+  unbecome_root(0);
+
+  if(smbpw == NULL)
+  {
+    DEBUG(0,("update_smbpassword_file: getsmbpwnam returned NULL\n"));
+    return False;
+  }
+  /* Here, the flag is one, because we want to ignore the XXXXXXX'd out password */
+  ret = change_oem_password( smbpw, password, True);
+  if (ret == False)
+    DEBUG(3,("update_smbpasswd_file: change_oem_password returned False\n"));
+
+  return ret;
+}
 
 /****************************************************************************
 update the enhanced security database. Only relevant for OSF1 at the moment.
@@ -1051,6 +1076,7 @@ BOOL password_ok(char *user,char *password, int pwlen, struct passwd *pwd)
   struct passwd *pass;
   char challenge[8];
   struct smb_passwd *smb_pass;
+  BOOL update_encrypted = lp_update_encrypted();
   BOOL challenge_done = False;
 
   if (password) password[pwlen] = 0;
@@ -1231,6 +1257,8 @@ BOOL password_ok(char *user,char *password, int pwlen, struct passwd *pwd)
   if (password_check(password))
     {
       update_protected_database(user,True);
+      if (update_encrypted)
+        update_smbpassword_file(user,password);
       return(True);
     }
 
@@ -1248,6 +1276,8 @@ BOOL password_ok(char *user,char *password, int pwlen, struct passwd *pwd)
   if (password_check(password))
     {
       update_protected_database(user,True);
+      if (update_encrypted)
+        update_smbpassword_file(user,password);
       return(True);
     }
 
@@ -1268,6 +1298,8 @@ BOOL password_ok(char *user,char *password, int pwlen, struct passwd *pwd)
   if (string_combinations(password,password_check,level))
     {
       update_protected_database(user,True);
+      if (update_encrypted)
+        update_smbpassword_file(user,password);
       return(True);
     }
 
index 338c0d56506625045914395d52b1476e3d2ffde7..050be7e9b84f9d17e9057a3906d07c2c044c9caa 100644 (file)
@@ -727,7 +727,7 @@ int main(int argc, char **argv)
     smb_pwent->smb_nt_passwd = new_nt_p16;
   }
 
-  if(mod_smbpwd_entry(smb_pwent) == False) {
+  if(mod_smbpwd_entry(smb_pwent,True) == False) {
     fprintf(stderr, "%s: Failed to modify entry for user %s.\n",
             prog_name, pwd->pw_name);
     endsmbpwent(vp);
index 6d155d88042b3755b42c9bc1492bcd7c3ae01991..53131461c9cf9ca9d8e0254da4d2ca5ec14cc359 100644 (file)
@@ -34,6 +34,8 @@ static pstring servicesf = CONFIGFILE;
 /* we need these because we link to locking*.o */
  void become_root(BOOL save_dir) {}
  void unbecome_root(BOOL restore_dir) {}
+/* We need this because we link to password.o */
+BOOL change_oem_password(struct smb_passwd *smbpw, char *new_passwd, BOOL override) {return False;}
 connection_struct Connections[MAX_CONNECTIONS];
 files_struct Files[MAX_OPEN_FILES];
 struct current_user current_user;