This is another rather major change to the samba authenticaion
[kai/samba.git] / source3 / smbd / auth_unix.c
index 4740f7fb0dc4622c5b92f62d6a6bec6a5c49c320..d134ce6909cd45c6eccbbe24a4523563ae72d7f2 100644 (file)
@@ -21,8 +21,6 @@
 
 #include "includes.h"
 
-extern int DEBUGLEVEL;
-
 /****************************************************************************
 update the encrypted smbpasswd file from the plaintext username and password
 
@@ -31,7 +29,7 @@ this ugly hack needs to die, but not quite yet...
 static BOOL update_smbpassword_file(char *user, char *password)
 {
        SAM_ACCOUNT     *sampass = NULL;
-       BOOL            ret;
+       BOOL            ret;
        
        pdb_init_sam(&sampass);
        
@@ -41,7 +39,7 @@ static BOOL update_smbpassword_file(char *user, char *password)
 
        if(ret == False) {
                DEBUG(0,("pdb_getsampwnam returned NULL\n"));
-               pdb_free_sam(sampass);
+               pdb_free_sam(&sampass);
                return False;
        }
 
@@ -49,16 +47,32 @@ static BOOL update_smbpassword_file(char *user, char *password)
         * Remove the account disabled flag - we are updating the
         * users password from a login.
         */
-       pdb_set_acct_ctrl(sampass, pdb_get_acct_ctrl(sampass) & ~ACB_DISABLED);
+       if (!pdb_set_acct_ctrl(sampass, pdb_get_acct_ctrl(sampass) & ~ACB_DISABLED)) {
+               pdb_free_sam(&sampass);
+               return False;
+       }
+
+       if (!pdb_set_plaintext_passwd (sampass, password)) {
+               pdb_free_sam(&sampass);
+               return False;
+       }
 
-       /* Here, the flag is one, because we want to ignore the
+       /* Now write it into the file. */
+       become_root();
+
+       /* Here, the override flag is True, because we want to ignore the
            XXXXXXX'd out password */
-       ret = change_oem_password( sampass, password, True);
-       if (ret == False) {
-               DEBUG(3,("change_oem_password returned False\n"));
+       ret = pdb_update_sam_account (sampass, True);
+
+       unbecome_root();
+
+       if (ret) {
+               DEBUG(3,("pdb_update_sam_account returned %d\n",ret));
        }
 
-       pdb_free_sam(sampass);
+       memset(password, '\0', strlen(password));
+
+       pdb_free_sam(&sampass);
        return ret;
 }
 
@@ -68,26 +82,44 @@ check if a username/password is OK assuming the password
 in PLAIN TEXT
 ****************************************************************************/
 
-NTSTATUS check_unix_security(const auth_usersupplied_info *user_info, auth_serversupplied_info *server_info)
+NTSTATUS check_unix_security(void *my_private_data,
+                            const auth_usersupplied_info *user_info, 
+                            const auth_authsupplied_info *auth_info,
+                            auth_serversupplied_info **server_info)
 {
        NTSTATUS nt_status;
        struct passwd *pass = NULL;
 
        become_root();
-       
-       pass = Get_Pwnam(user_info->unix_username.str, False);
+       pass = Get_Pwnam(user_info->internal_username.str);
 
-       nt_status = (pass_check(pass,
-                               pass ? pass->pw_name : user_info->unix_username.str, 
-                               user_info->plaintext_password.str,
-                               user_info->plaintext_password.len,
+       nt_status = pass_check(pass,
+                               pass ? pass->pw_name : user_info->internal_username.str, 
+                               (char *)user_info->plaintext_password.data,
+                               user_info->plaintext_password.length-1,
                                lp_update_encrypted() ? 
                                update_smbpassword_file : NULL,
-                               True) 
-                    ? NT_STATUS_OK : NT_STATUS_LOGON_FAILURE);
+                               True);
+       
        unbecome_root();
 
+       if NT_STATUS_IS_OK(nt_status) {
+               if (pass) {
+                       make_server_info_pw(server_info, pass);
+               } else {
+                       /* we need to do somthing more useful here */
+                       nt_status = NT_STATUS_NO_SUCH_USER;
+               }
+       }
+
        return nt_status;
 }
 
-
+BOOL auth_init_unix(auth_methods **auth_method) 
+{
+       if (!make_auth_methods(auth_method)) {
+               return False;
+       }
+       (*auth_method)->auth = check_unix_security;
+       return True;
+}