s3-debug Remove 'AllowDebugChange' and use lp_set_cmdline() instead
[metze/samba/wip.git] / source3 / utils / smbpasswd.c
index 8cca93f5defd0a2a8be3ed18f21f0e1e64b7f705..c530c78f41fffd76b8152109fa06359808a0af7d 100644 (file)
@@ -17,8 +17,8 @@
  * this program; if not, see <http://www.gnu.org/licenses/>.  */
 
 #include "includes.h"
-
-extern bool AllowDebugChange;
+#include "secrets.h"
+#include "../librpc/gen_ndr/samr.h"
 
 /*
  * Next two lines needed for SunOS and don't
@@ -242,26 +242,29 @@ static NTSTATUS password_change(const char *remote_mach, char *username,
        char *msg_str = NULL;
 
        if (remote_mach != NULL) {
-               if (local_flags & (LOCAL_ADD_USER|LOCAL_DELETE_USER|LOCAL_DISABLE_USER|LOCAL_ENABLE_USER|
-                                                       LOCAL_TRUST_ACCOUNT|LOCAL_SET_NO_PASSWORD)) {
+               if (local_flags & (LOCAL_ADD_USER|LOCAL_DELETE_USER|
+                                  LOCAL_DISABLE_USER|LOCAL_ENABLE_USER|
+                                  LOCAL_TRUST_ACCOUNT|LOCAL_SET_NO_PASSWORD)) {
                        /* these things can't be done remotely yet */
+                       fprintf(stderr, "Invalid remote operation!\n");
                        return NT_STATUS_UNSUCCESSFUL;
                }
-               ret = remote_password_change(remote_mach, username, 
+               ret = remote_password_change(remote_mach, username,
                                             old_passwd, new_pw, &err_str);
-               if (err_str != NULL)
-                       fprintf(stderr, "%s", err_str);
-               SAFE_FREE(err_str);
-               return ret;
+       } else {
+               ret = local_password_change(username, local_flags, new_pw,
+                                           &err_str, &msg_str);
        }
 
-       ret = local_password_change(username, local_flags, new_pw, 
-                                    &err_str, &msg_str);
-
-       if(msg_str)
+       if (msg_str) {
                printf("%s", msg_str);
-       if(err_str)
+       }
+       if (err_str) {
                fprintf(stderr, "%s", err_str);
+       }
+       if (!NT_STATUS_IS_OK(ret) && !err_str) {
+               fprintf(stderr, "Failed to change password!\n");
+       }
 
        SAFE_FREE(msg_str);
        SAFE_FREE(err_str);
@@ -337,7 +340,7 @@ static int process_root(int local_flags)
                load_interfaces();
        }
 
-       if (!user_name[0] && (pwd = getpwuid_alloc(talloc_autofree_context(), geteuid()))) {
+       if (!user_name[0] && (pwd = getpwuid_alloc(talloc_tos(), geteuid()))) {
                fstrcpy(user_name, pwd->pw_name);
                TALLOC_FREE(pwd);
        } 
@@ -395,6 +398,10 @@ static int process_root(int local_flags)
 
                if (remote_machine != NULL) {
                        old_passwd = get_pass("Old SMB password:",stdin_passwd_get);
+                       if(!old_passwd) {
+                               fprintf(stderr, "Unable to get old password.\n");
+                               exit(1);
+                       }
                }
 
                if (!(local_flags & LOCAL_SET_PASSWORD)) {
@@ -430,21 +437,8 @@ static int process_root(int local_flags)
                }
 
                if((local_flags & LOCAL_SET_PASSWORD) && (new_passwd == NULL)) {
-                       struct passwd *passwd;
-
-                       if (remote_machine == NULL) {
-                               passwd = getpwnam_alloc(NULL, user_name);
-
-                               if (!passwd) {
-                                       fprintf(stderr, "Cannot locate Unix account for "
-                                               "'%s'!\n", user_name);
-                                       exit(1);
-                               }
-                               TALLOC_FREE(passwd);
-                       }
 
                        new_passwd = prompt_for_new_password(stdin_passwd_get);
-
                        if(!new_passwd) {
                                fprintf(stderr, "Unable to get new password.\n");
                                exit(1);
@@ -455,7 +449,6 @@ static int process_root(int local_flags)
        if (!NT_STATUS_IS_OK(password_change(remote_machine, user_name,
                                             old_passwd, new_passwd,
                                             local_flags))) {
-               fprintf(stderr,"Failed to modify password entry for user %s\n", user_name);
                result = 1;
                goto done;
        } 
@@ -489,6 +482,7 @@ static int process_root(int local_flags)
        }
 
  done:
+       SAFE_FREE(old_passwd);
        SAFE_FREE(new_passwd);
        return result;
 }
@@ -511,7 +505,7 @@ static int process_nonroot(int local_flags)
        }
 
        if (!user_name[0]) {
-               pwd = getpwuid_alloc(talloc_autofree_context(), getuid());
+               pwd = getpwuid_alloc(talloc_tos(), getuid());
                if (pwd) {
                        fstrcpy(user_name,pwd->pw_name);
                        TALLOC_FREE(pwd);
@@ -550,7 +544,6 @@ static int process_nonroot(int local_flags)
 
        if (!NT_STATUS_IS_OK(password_change(remote_machine, user_name, old_pw,
                                             new_pw, 0))) {
-               fprintf(stderr,"Failed to change password for %s\n", user_name);
                result = 1;
                goto done;
        }
@@ -575,8 +568,6 @@ int main(int argc, char **argv)
        int local_flags = 0;
        int ret;
 
-       AllowDebugChange = False;
-
 #if defined(HAVE_SET_AUTH_PARAMETERS)
        set_auth_parameters(argc, argv);
 #endif /* HAVE_SET_AUTH_PARAMETERS */
@@ -589,7 +580,7 @@ int main(int argc, char **argv)
 
        local_flags = process_options(argc, argv, local_flags);
 
-       setup_logging("smbpasswd", True);
+       setup_logging("smbpasswd", DEBUG_STDERR);
 
        /*
         * Set the machine NETBIOS name if not already