diff -ur samba-2.2.8a/source/pam_smbpass/pam_smb_passwd.c samba-2.2.8a-jn/source/pam_smbpass/pam_smb_passwd.c --- samba-2.2.8a/source/pam_smbpass/pam_smb_passwd.c Tue Apr 30 23:27:31 2002 +++ samba-2.2.8a-jn/source/pam_smbpass/pam_smb_passwd.c Wed Jul 16 15:18:34 2003 @@ -33,6 +33,9 @@ #include "support.h" +static int _smb_add_user(pam_handle_t *pamh, unsigned int ctrl, + const char *name, SAM_ACCOUNT *sampass, BOOL exist); + int smb_update_db( pam_handle_t *pamh, int ctrl, const char *user, char *pass_new ) { int retval; @@ -126,7 +129,15 @@ /* obtain user record */ pdb_init_sam(&sampass); - pdb_getsampwnam(sampass,user); + if(!pdb_getsampwnam(sampass,user)) + { + /* migrate... */ + if (on( SMB_MIGRATE, ctrl )) { + _log_err( LOG_DEBUG, "Attempting migration for user %s.", user ); + retval = _smb_add_user(pamh, ctrl, user, sampass, 0); + pdb_getsampwnam(sampass,user); + } + } if (sampass == NULL) { _log_err( LOG_ALERT, "Failed to find entry for user %s.", user ); @@ -313,6 +324,33 @@ return retval; } +/* Helper function for adding a user to the db. */ +static int _smb_add_user(pam_handle_t *pamh, unsigned int ctrl, + const char *name, SAM_ACCOUNT *sampass, BOOL exist) +{ + pstring err_str; + pstring msg_str; + char *pass = NULL; + int retval; + + err_str[0] = '\0'; + msg_str[0] = '\0'; + + retval = local_password_change( name, LOCAL_ADD_USER | LOCAL_SET_NO_PASSWORD, + pass, err_str, sizeof(err_str), + msg_str, sizeof(msg_str) ); + if (!retval && *err_str) { + err_str[PSTRING_LEN-1] = '\0'; + make_remark( pamh, ctrl, PAM_ERROR_MSG, err_str ); + } else { + msg_str[PSTRING_LEN-1] = '\0'; + make_remark( pamh, ctrl, PAM_TEXT_INFO, msg_str ); + } + pass = NULL; + + return PAM_IGNORE; +} + /* static module data */ #ifdef PAM_STATIC struct pam_module _pam_smbpass_passwd_modstruct = {