diff -ur samba-3.0.10/source/pam_smbpass/pam_smb_passwd.c samba-3.0.10-jn/source/pam_smbpass/pam_smb_passwd.c --- samba-3.0.10/source/pam_smbpass/pam_smb_passwd.c 2004-10-26 07:04:58.000000000 +1000 +++ samba-3.0.10-jn/source/pam_smbpass/pam_smb_passwd.c 2007-07-25 14:09:19.000000000 +1000 @@ -38,6 +38,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, const char *pass_new ) { int retval; @@ -143,9 +146,21 @@ } if (!pdb_getsampwnam(sampass,user)) { - _log_err( LOG_ALERT, "Failed to find entry for user %s.", user ); - CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); - return PAM_USER_UNKNOWN; + /* should we migrate it? */ + if(on(SMB_MIGRATE, ctrl)) { + _log_err( LOG_DEBUG, "Attempting migration for user %s", user ); + retval = _smb_add_user(pamh, ctrl, user, sampass, 0); + if (!pdb_getsampwnam(sampass,user)) { + _log_err( LOG_ALERT, "Failed to find entry for user %s even after migration.", user ); + CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); + return PAM_USER_UNKNOWN; + } + } + else { + _log_err( LOG_ALERT, "Failed to find entry for user %s.", user ); + CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); + return PAM_USER_UNKNOWN; + } } if (flags & PAM_PRELIM_CHECK) { @@ -334,6 +349,39 @@ 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; + const char *pass = NULL; + int retval; + + err_str[0] = '\0'; + msg_str[0] = '\0'; + + /* Add the user to the db if they aren't already there. */ + 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 if (*msg_str) + { + 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 = {