r13460: by popular demand....
[kai/samba.git] / source / utils / pdbedit.c
index c88c0d75797011290791b18280a512bbcd45d897..7e29c797cb099ede817f03c6b2b0f96d1756cd91 100644 (file)
 #define BIT_SPSTYLE    0x00000010
 #define BIT_CAN_CHANGE 0x00000020
 #define BIT_MUST_CHANGE        0x00000040
-#define BIT_RESERV_3   0x00000080
+#define BIT_USERSIDS   0x00000080
 #define BIT_FULLNAME   0x00000100
 #define BIT_HOMEDIR    0x00000200
 #define BIT_HDIRDRIVE  0x00000400
 #define BIT_LOGSCRIPT  0x00000800
 #define BIT_PROFILE    0x00001000
 #define BIT_MACHINE    0x00002000
-#define BIT_RESERV_4   0x00004000
+#define BIT_USERDOMAIN 0x00004000
 #define BIT_USER       0x00008000
 #define BIT_LIST       0x00010000
 #define BIT_MODIFY     0x00020000
 #define BIT_LOGONHOURS 0x10000000
 
 #define MASK_ALWAYS_GOOD       0x0000001F
-#define MASK_USER_GOOD         0x00401F60
+#define MASK_USER_GOOD         0x00405FE0
 
 /*********************************************************
- Add all currently available users to another db
+ Reset account policies to their default values and remove marker
  ********************************************************/
 
-static int export_database (struct pdb_context *in, struct pdb_context
-                           *out, const char *username) {
-       SAM_ACCOUNT *user = NULL;
-
-       DEBUG(3, ("called with username=\"%s\"\n", username));
-
-       if (NT_STATUS_IS_ERR(in->pdb_setsampwent(in, 0, 0))) {
-               fprintf(stderr, "Can't sampwent!\n");
-               return 1;
-       }
-
-       if (!NT_STATUS_IS_OK(pdb_init_sam(&user))) {
-               fprintf(stderr, "Can't initialize new SAM_ACCOUNT!\n");
-               return 1;
-       }
+static int reinit_account_policies (void) 
+{
+       int i;
 
-       while (NT_STATUS_IS_OK(in->pdb_getsampwent(in, user))) {
-               DEBUG(4, ("Processing account %s\n",
-                         user->private_u.username));
-               if (!username || 
-                   (strcmp(username, user->private_u.username)
-                    == 0)) {
-                       out->pdb_add_sam_account(out, user);
-                       if (!NT_STATUS_IS_OK(pdb_reset_sam(user))) {
-                               fprintf(stderr,
-                                       "Can't reset SAM_ACCOUNT!\n");
-                               return 1;
-                       }
+       for (i=1; decode_account_policy_name(i) != NULL; i++) {
+               uint32 policy_value;
+               if (!account_policy_get_default(i, &policy_value)) {
+                       fprintf(stderr, "Can't get default account policy\n");
+                       return -1;
+               }
+               if (!account_policy_set(i, policy_value)) {
+                       fprintf(stderr, "Can't set account policy in tdb\n");
+                       return -1;
                }
        }
 
-       in->pdb_endsampwent(in);
-
-       return 0;
-}
-
-/*********************************************************
- Add all currently available group mappings to another db
- ********************************************************/
-
-static int export_groups (struct pdb_context *in, struct pdb_context *out) {
-       GROUP_MAP *maps = NULL;
-       int i, entries = 0;
-
-       if (NT_STATUS_IS_ERR(in->pdb_enum_group_mapping(in, SID_NAME_UNKNOWN,
-                                                       &maps, &entries,
-                                                       False))) {
-               fprintf(stderr, "Can't get group mappings!\n");
-               return 1;
-       }
-
-       for (i=0; i<entries; i++) {
-               out->pdb_add_group_mapping_entry(out, &(maps[i]));
+       if (!remove_account_policy_migrated()) {
+               fprintf(stderr, "Can't remove marker from tdb\n");
+               return -1;
        }
 
-       SAFE_FREE(maps);
-
        return 0;
 }
 
@@ -206,7 +170,7 @@ static int print_sam_info (SAM_ACCOUNT *sam_pwent, BOOL verbosity, BOOL smbpwdst
  Get an Print User Info
 **********************************************************/
 
-static int print_user_info (struct pdb_context *in, const char *username, BOOL verbosity, BOOL smbpwdstyle)
+static int print_user_info (struct pdb_methods *in, const char *username, BOOL verbosity, BOOL smbpwdstyle)
 {
        SAM_ACCOUNT *sam_pwent=NULL;
        BOOL ret;
@@ -215,7 +179,7 @@ static int print_user_info (struct pdb_context *in, const char *username, BOOL v
                return -1;
        }
 
-       ret = NT_STATUS_IS_OK(in->pdb_getsampwnam (in, sam_pwent, username));
+       ret = NT_STATUS_IS_OK(in->getsampwnam (in, sam_pwent, username));
 
        if (ret==False) {
                fprintf (stderr, "Username not found!\n");
@@ -232,12 +196,12 @@ static int print_user_info (struct pdb_context *in, const char *username, BOOL v
 /*********************************************************
  List Users
 **********************************************************/
-static int print_users_list (struct pdb_context *in, BOOL verbosity, BOOL smbpwdstyle)
+static int print_users_list (struct pdb_methods *in, BOOL verbosity, BOOL smbpwdstyle)
 {
        SAM_ACCOUNT *sam_pwent=NULL;
        BOOL check;
        
-       check = NT_STATUS_IS_OK(in->pdb_setsampwent(in, False, 0));
+       check = NT_STATUS_IS_OK(in->setsampwent(in, False, 0));
        if (!check) {
                return 1;
        }
@@ -245,7 +209,7 @@ static int print_users_list (struct pdb_context *in, BOOL verbosity, BOOL smbpwd
        check = True;
        if (!(NT_STATUS_IS_OK(pdb_init_sam(&sam_pwent)))) return 1;
 
-       while (check && NT_STATUS_IS_OK(in->pdb_getsampwent (in, sam_pwent))) {
+       while (check && NT_STATUS_IS_OK(in->getsampwent (in, sam_pwent))) {
                if (verbosity)
                        printf ("---------------\n");
                print_sam_info (sam_pwent, verbosity, smbpwdstyle);
@@ -254,19 +218,19 @@ static int print_users_list (struct pdb_context *in, BOOL verbosity, BOOL smbpwd
        }
        if (check) pdb_free_sam(&sam_pwent);
        
-       in->pdb_endsampwent(in);
+       in->endsampwent(in);
        return 0;
 }
 
 /*********************************************************
  Fix a list of Users for uninitialised passwords
 **********************************************************/
-static int fix_users_list (struct pdb_context *in)
+static int fix_users_list (struct pdb_methods *in)
 {
        SAM_ACCOUNT *sam_pwent=NULL;
        BOOL check;
        
-       check = NT_STATUS_IS_OK(in->pdb_setsampwent(in, False, 0));
+       check = NT_STATUS_IS_OK(in->setsampwent(in, False, 0));
        if (!check) {
                return 1;
        }
@@ -274,10 +238,10 @@ static int fix_users_list (struct pdb_context *in)
        check = True;
        if (!(NT_STATUS_IS_OK(pdb_init_sam(&sam_pwent)))) return 1;
 
-       while (check && NT_STATUS_IS_OK(in->pdb_getsampwent (in, sam_pwent))) {
+       while (check && NT_STATUS_IS_OK(in->getsampwent (in, sam_pwent))) {
                printf("Updating record for user %s\n", pdb_get_username(sam_pwent));
        
-               if (!pdb_update_sam_account(sam_pwent)) {
+               if (!NT_STATUS_IS_OK(pdb_update_sam_account(sam_pwent))) {
                        printf("Update of user %s failed!\n", pdb_get_username(sam_pwent));
                }
                pdb_free_sam(&sam_pwent);
@@ -289,7 +253,7 @@ static int fix_users_list (struct pdb_context *in)
        }
        if (check) pdb_free_sam(&sam_pwent);
        
-       in->pdb_endsampwent(in);
+       in->endsampwent(in);
        return 0;
 }
 
@@ -297,12 +261,13 @@ static int fix_users_list (struct pdb_context *in)
  Set User Info
 **********************************************************/
 
-static int set_user_info (struct pdb_context *in, const char *username, 
+static int set_user_info (struct pdb_methods *in, const char *username, 
                          const char *fullname, const char *homedir, 
                          const char *acct_desc, 
                          const char *drive, const char *script, 
                          const char *profile, const char *account_control,
                          const char *user_sid, const char *group_sid,
+                         const char *user_domain,
                          const BOOL badpw, const BOOL hours,
                          time_t pwd_can_change, time_t pwd_must_change)
 {
@@ -312,7 +277,7 @@ static int set_user_info (struct pdb_context *in, const char *username,
        
        pdb_init_sam(&sam_pwent);
        
-       ret = NT_STATUS_IS_OK(in->pdb_getsampwnam (in, sam_pwent, username));
+       ret = NT_STATUS_IS_OK(in->getsampwnam (in, sam_pwent, username));
        if (ret==False) {
                fprintf (stderr, "Username not found!\n");
                pdb_free_sam(&sam_pwent);
@@ -357,6 +322,8 @@ static int set_user_info (struct pdb_context *in, const char *username,
                pdb_set_logon_script(sam_pwent, script, PDB_CHANGED);
        if (profile)
                pdb_set_profile_path (sam_pwent, profile, PDB_CHANGED);
+       if (user_domain)
+               pdb_set_domain(sam_pwent, user_domain, PDB_CHANGED);
 
        if (account_control) {
                uint16 not_settable = ~(ACB_DISABLED|ACB_HOMDIRREQ|ACB_PWNOTREQ|
@@ -410,7 +377,7 @@ static int set_user_info (struct pdb_context *in, const char *username,
                pdb_set_bad_password_time(sam_pwent, 0, PDB_CHANGED);
        }
 
-       if (NT_STATUS_IS_OK(in->pdb_update_sam_account (in, sam_pwent)))
+       if (NT_STATUS_IS_OK(in->update_sam_account (in, sam_pwent)))
                print_user_info (in, username, True, False);
        else {
                fprintf (stderr, "Unable to modify entry!\n");
@@ -424,7 +391,7 @@ static int set_user_info (struct pdb_context *in, const char *username,
 /*********************************************************
  Add New User
 **********************************************************/
-static int new_user (struct pdb_context *in, const char *username,
+static int new_user (struct pdb_methods *in, const char *username,
                        const char *fullname, const char *homedir,
                        const char *drive, const char *script,
                        const char *profile, char *user_sid, char *group_sid)
@@ -435,7 +402,7 @@ static int new_user (struct pdb_context *in, const char *username,
        
        get_global_sam_sid();
 
-       if (!NT_STATUS_IS_OK(pdb_init_sam_new(&sam_pwent, username, 0))) {
+       if (!NT_STATUS_IS_OK(pdb_init_sam_new(&sam_pwent, username))) {
                DEBUG(0, ("could not create account to add new user %s\n", username));
                return -1;
        }
@@ -505,7 +472,7 @@ static int new_user (struct pdb_context *in, const char *username,
        
        pdb_set_acct_ctrl (sam_pwent, ACB_NORMAL, PDB_CHANGED);
        
-       if (NT_STATUS_IS_OK(in->pdb_add_sam_account (in, sam_pwent))) { 
+       if (NT_STATUS_IS_OK(in->add_sam_account (in, sam_pwent))) { 
                print_user_info (in, username, True, False);
        } else {
                fprintf (stderr, "Unable to add user! (does it already exist?)\n");
@@ -520,7 +487,7 @@ static int new_user (struct pdb_context *in, const char *username,
  Add New Machine
 **********************************************************/
 
-static int new_machine (struct pdb_context *in, const char *machine_in)
+static int new_machine (struct pdb_methods *in, const char *machine_in)
 {
        SAM_ACCOUNT *sam_pwent=NULL;
        fstring machinename;
@@ -540,13 +507,13 @@ static int new_machine (struct pdb_context *in, const char *machine_in)
        fstrcpy(machineaccount, machinename);
        fstrcat(machineaccount, "$");
 
-       if ((pwd = getpwnam_alloc(machineaccount))) {
+       if ((pwd = getpwnam_alloc(NULL, machineaccount))) {
                if (!NT_STATUS_IS_OK(pdb_init_sam_pw( &sam_pwent, pwd))) {
                        fprintf(stderr, "Could not init sam from pw\n");
-                       passwd_free(&pwd);
+                       talloc_free(pwd);
                        return -1;
                }
-               passwd_free(&pwd);
+               talloc_free(&pwd);
        } else {
                if (!NT_STATUS_IS_OK(pdb_init_sam (&sam_pwent))) {
                        fprintf(stderr, "Could not init sam from pw\n");
@@ -562,7 +529,7 @@ static int new_machine (struct pdb_context *in, const char *machine_in)
        
        pdb_set_group_sid_from_rid(sam_pwent, DOMAIN_GROUP_RID_COMPUTERS, PDB_CHANGED);
        
-       if (NT_STATUS_IS_OK(in->pdb_add_sam_account (in, sam_pwent))) {
+       if (NT_STATUS_IS_OK(in->add_sam_account (in, sam_pwent))) {
                print_user_info (in, machineaccount, True, False);
        } else {
                fprintf (stderr, "Unable to add machine! (does it already exist?)\n");
@@ -577,7 +544,7 @@ static int new_machine (struct pdb_context *in, const char *machine_in)
  Delete user entry
 **********************************************************/
 
-static int delete_user_entry (struct pdb_context *in, const char *username)
+static int delete_user_entry (struct pdb_methods *in, const char *username)
 {
        SAM_ACCOUNT *samaccount = NULL;
 
@@ -585,12 +552,12 @@ static int delete_user_entry (struct pdb_context *in, const char *username)
                return -1;
        }
 
-       if (!NT_STATUS_IS_OK(in->pdb_getsampwnam(in, samaccount, username))) {
+       if (!NT_STATUS_IS_OK(in->getsampwnam(in, samaccount, username))) {
                fprintf (stderr, "user %s does not exist in the passdb\n", username);
                return -1;
        }
 
-       if (!NT_STATUS_IS_OK(in->pdb_delete_sam_account (in, samaccount))) {
+       if (!NT_STATUS_IS_OK(in->delete_sam_account (in, samaccount))) {
                fprintf (stderr, "Unable to delete user %s\n", username);
                return -1;
        }
@@ -601,7 +568,7 @@ static int delete_user_entry (struct pdb_context *in, const char *username)
  Delete machine entry
 **********************************************************/
 
-static int delete_machine_entry (struct pdb_context *in, const char *machinename)
+static int delete_machine_entry (struct pdb_methods *in, const char *machinename)
 {
        fstring name;
        SAM_ACCOUNT *samaccount = NULL;
@@ -615,12 +582,12 @@ static int delete_machine_entry (struct pdb_context *in, const char *machinename
                return -1;
        }
 
-       if (!NT_STATUS_IS_OK(in->pdb_getsampwnam(in, samaccount, name))) {
+       if (!NT_STATUS_IS_OK(in->getsampwnam(in, samaccount, name))) {
                fprintf (stderr, "machine %s does not exist in the passdb\n", name);
                return -1;
        }
 
-       if (!NT_STATUS_IS_OK(in->pdb_delete_sam_account (in, samaccount))) {
+       if (!NT_STATUS_IS_OK(in->delete_sam_account (in, samaccount))) {
                fprintf (stderr, "Unable to delete machine %s\n", name);
                return -1;
        }
@@ -652,9 +619,12 @@ int main (int argc, char **argv)
        static char *backend_in = NULL;
        static char *backend_out = NULL;
        static BOOL transfer_groups = False;
+       static BOOL transfer_account_policies = False;
+       static BOOL reset_account_policies = False;
        static BOOL  force_initialised_password = False;
        static char *logon_script = NULL;
        static char *profile_path = NULL;
+       static char *user_domain = NULL;
        static char *account_control = NULL;
        static char *account_policy = NULL;
        static char *user_sid = NULL;
@@ -667,9 +637,7 @@ int main (int argc, char **argv)
        static char *pwd_must_change_time = NULL;
        static char *pwd_time_format = NULL;
 
-       struct pdb_context *bin;
-       struct pdb_context *bout;
-       struct pdb_context *bdef;
+       struct pdb_methods *bdef = NULL;
        poptContext pc;
        struct poptOption long_options[] = {
                POPT_AUTOHELP
@@ -683,8 +651,9 @@ int main (int argc, char **argv)
                {"drive",       'D', POPT_ARG_STRING, &home_drive, 0, "set home drive", NULL},
                {"script",      'S', POPT_ARG_STRING, &logon_script, 0, "set logon script", NULL},
                {"profile",     'p', POPT_ARG_STRING, &profile_path, 0, "set profile path", NULL},
-               {"user-SID",    'U', POPT_ARG_STRING, &user_sid, 0, "set user SID or RID", NULL},
-               {"group-SID",   'G', POPT_ARG_STRING, &group_sid, 0, "set group SID or RID", NULL},
+               {"domain",      'I', POPT_ARG_STRING, &user_domain, 0, "set a users' domain", NULL},
+               {"user SID",    'U', POPT_ARG_STRING, &user_sid, 0, "set user SID or RID", NULL},
+               {"group SID",   'G', POPT_ARG_STRING, &group_sid, 0, "set group SID or RID", NULL},
                {"create",      'a', POPT_ARG_NONE, &add_user, 0, "create user", NULL},
                {"modify",      'r', POPT_ARG_NONE, &modify_user, 0, "modify user", NULL},
                {"machine",     'm', POPT_ARG_NONE, &machine, 0, "account is a machine account", NULL},
@@ -693,6 +662,8 @@ int main (int argc, char **argv)
                {"import",      'i', POPT_ARG_STRING, &backend_in, 0, "import user accounts from this backend", NULL},
                {"export",      'e', POPT_ARG_STRING, &backend_out, 0, "export user accounts to this backend", NULL},
                {"group",       'g', POPT_ARG_NONE, &transfer_groups, 0, "use -i and -e for groups", NULL},
+               {"policies",    'y', POPT_ARG_NONE, &transfer_account_policies, 0, "use -i and -e to move account policies between backends", NULL},
+               {"policies-reset",      0, POPT_ARG_NONE, &reset_account_policies, 0, "restore default policies", NULL},
                {"account-policy",      'P', POPT_ARG_STRING, &account_policy, 0,"value of an account policy (like maximum password age)",NULL},
                {"value",       'C', POPT_ARG_LONG, &account_policy_value, 'C',"set the account policy to this value", NULL},
                {"account-control",     'c', POPT_ARG_STRING, &account_control, 0, "Values of account control", NULL},
@@ -706,6 +677,8 @@ int main (int argc, char **argv)
                POPT_TABLEEND
        };
        
+       load_case_tables();
+
        setup_logging("pdbedit", True);
        
        pc = poptGetContext(NULL, argc, (const char **) argv, long_options,
@@ -724,7 +697,7 @@ int main (int argc, char **argv)
        if (user_name == NULL)
                user_name = poptGetArg(pc);
 
-       if (!lp_load(dyn_CONFIGFILE,True,False,False)) {
+       if (!lp_load(dyn_CONFIGFILE,True,False,False,True)) {
                fprintf(stderr, "Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE);
                exit(1);
        }
@@ -743,10 +716,13 @@ int main (int argc, char **argv)
                        (home_drive ? BIT_HDIRDRIVE : 0) +
                        (logon_script ? BIT_LOGSCRIPT : 0) +
                        (profile_path ? BIT_PROFILE : 0) +
+                       (user_domain ? BIT_USERDOMAIN : 0) +
                        (machine ? BIT_MACHINE : 0) +
                        (user_name ? BIT_USER : 0) +
                        (list_users ? BIT_LIST : 0) +
                        (force_initialised_password ? BIT_FIX_INIT : 0) +
+                       (user_sid ? BIT_USERSIDS : 0) +
+                       (group_sid ? BIT_USERSIDS : 0) +
                        (modify_user ? BIT_MODIFY : 0) +
                        (add_user ? BIT_CREATE : 0) +
                        (delete_user ? BIT_DELETE : 0) +
@@ -761,12 +737,12 @@ int main (int argc, char **argv)
                        (pwd_must_change_time ? BIT_MUST_CHANGE: 0);
 
        if (setparms & BIT_BACKEND) {
-               if (!NT_STATUS_IS_OK(make_pdb_context_string(&bdef, backend))) {
+               if (!NT_STATUS_IS_OK(make_pdb_method_name( &bdef, backend ))) {
                        fprintf(stderr, "Can't initialize passdb backend.\n");
                        return 1;
                }
        } else {
-               if (!NT_STATUS_IS_OK(make_pdb_context_list(&bdef, lp_passdb_backend()))) {
+               if (!NT_STATUS_IS_OK(make_pdb_method_name(&bdef, lp_passdb_backend()))) {
                        fprintf(stderr, "Can't initialize passdb backend.\n");
                        return 1;
                }
@@ -792,54 +768,32 @@ int main (int argc, char **argv)
                        SAFE_FREE(apn);
                        exit(1);
                }
-               if (!account_policy_get(field, &value)) {
+               if (!pdb_get_account_policy(field, &value)) {
                        fprintf(stderr, "valid account policy, but unable to fetch value!\n");
-                       exit(1);
+                       if (!account_policy_value_set)
+                               exit(1);
                }
+               printf("account policy \"%s\" description: %s\n", account_policy, account_policy_get_desc(field));
                if (account_policy_value_set) {
-                       printf("account policy value for %s was %u\n", account_policy, value);
-                       if (!account_policy_set(field, account_policy_value)) {
+                       printf("account policy \"%s\" value was: %u\n", account_policy, value);
+                       if (!pdb_set_account_policy(field, account_policy_value)) {
                                fprintf(stderr, "valid account policy, but unable to set value!\n");
                                exit(1);
                        }
-                       printf("account policy value for %s is now %lu\n", account_policy, account_policy_value);
+                       printf("account policy \"%s\" value is now: %lu\n", account_policy, account_policy_value);
                        exit(0);
                } else {
-                       printf("account policy value for %s is %u\n", account_policy, value);
+                       printf("account policy \"%s\" value is: %u\n", account_policy, value);
                        exit(0);
                }
        }
 
-       /* import and export operations */
-       if (((checkparms & BIT_IMPORT) || (checkparms & BIT_EXPORT))
-           && !(checkparms & ~(BIT_IMPORT +BIT_EXPORT +BIT_USER))) {
-               if (backend_in) {
-                       if (!NT_STATUS_IS_OK(make_pdb_context_string(&bin, backend_in))) {
-                               fprintf(stderr, "Can't initialize passdb backend.\n");
-                               return 1;
-                       }
-               } else {
-                       bin = bdef;
-               }
-               if (backend_out) {
-                       if (!NT_STATUS_IS_OK(make_pdb_context_string(&bout, backend_out))) {
-                               fprintf(stderr, "Can't initialize %s.\n", backend_out);
-                               return 1;
-                       }
-               } else {
-                       bout = bdef;
-               }
-               if (transfer_groups) {
-                       if (!(checkparms & BIT_USER))
-                               return export_groups(bin, bout);
-               } else {
-                       if (checkparms & BIT_USER)
-                               return export_database(bin, bout,
-                                                      user_name);
-                       else
-                               return export_database(bin, bout,
-                                                      NULL);
+       if (reset_account_policies) {
+               if (!reinit_account_policies()) {
+                       exit(1);
                }
+
+               exit(0);
        }
 
        /* if BIT_USER is defined but nothing else then threat it as -l -u for compatibility */
@@ -970,6 +924,7 @@ int main (int argc, char **argv)
                                              logon_script,
                                              profile_path, account_control,
                                              user_sid, group_sid,
+                                             user_domain,
                                              badpw_reset, hours_reset,
                                              pwd_can_change, pwd_must_change);
 error: