Mailinglist Archive: yast-commit (535 mails)

< Previous Next >
[yast-commit] r41293 - in /branches/SuSE-SLE-10-SP1-Branch/users: VERSION package/yast2-users.changes src/Users.pm src/dialogs.ycp
  • From: jsuchome@xxxxxxxxxxxxxxxx
  • Date: Tue, 09 Oct 2007 14:18:15 -0000
  • Message-id: <20071009141816.2C5D91743C@xxxxxxxxxxxxxxxx>
Author: jsuchome
Date: Tue Oct  9 16:18:15 2007
New Revision: 41293

URL: http://svn.opensuse.org/viewcvs/yast?rev=41293&view=rev
Log:
- backport following features for SLE10SP for F302865 and F302658:
- during firstboot, show the same behaviour as in 2nd stage
- Write function from plugin API is now called also on deleted
  users (currently only local)
- added universal "plugin_modified" key to check whether user
  data were modified by plugin
- check for crypted directories modifications before offering
  'cryptconfig' installation (#274861)
- enabled plugins for local users and groups
- 2.13.56 


Modified:
    branches/SuSE-SLE-10-SP1-Branch/users/VERSION
    branches/SuSE-SLE-10-SP1-Branch/users/package/yast2-users.changes
    branches/SuSE-SLE-10-SP1-Branch/users/src/Users.pm
    branches/SuSE-SLE-10-SP1-Branch/users/src/dialogs.ycp

Modified: branches/SuSE-SLE-10-SP1-Branch/users/VERSION
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-SLE-10-SP1-Branch/users/VERSION?rev=41293&r1=41292&r2=41293&view=diff
==============================================================================
--- branches/SuSE-SLE-10-SP1-Branch/users/VERSION (original)
+++ branches/SuSE-SLE-10-SP1-Branch/users/VERSION Tue Oct  9 16:18:15 2007
@@ -1 +1 @@
-2.13.55
+2.13.56

Modified: branches/SuSE-SLE-10-SP1-Branch/users/package/yast2-users.changes
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-SLE-10-SP1-Branch/users/package/yast2-users.changes?rev=41293&r1=41292&r2=41293&view=diff
==============================================================================
--- branches/SuSE-SLE-10-SP1-Branch/users/package/yast2-users.changes (original)
+++ branches/SuSE-SLE-10-SP1-Branch/users/package/yast2-users.changes Tue Oct  9 16:18:15 2007
@@ -1,4 +1,18 @@
 -------------------------------------------------------------------
+Thu Oct  4 14:33:20 CEST 2007 - jsuchome@xxxxxxx
+
+- backport following features for SLE10SP for F302865 and F302658:
+- during firstboot, show the same behaviour as in 2nd stage
+- Write function from plugin API is now called also on deleted
+  users (currently only local)
+- added universal "plugin_modified" key to check whether user
+  data were modified by plugin
+- check for crypted directories modifications before offering
+  'cryptconfig' installation (#274861)
+- enabled plugins for local users and groups
+- 2.13.56 
+
+-------------------------------------------------------------------
 Fri May 11 12:08:13 CEST 2007 - jsuchome@xxxxxxx
 
 - during autoinstallation, do not touch already created directories

Modified: branches/SuSE-SLE-10-SP1-Branch/users/src/Users.pm
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-SLE-10-SP1-Branch/users/src/Users.pm?rev=41293&r1=41292&r2=41293&view=diff
==============================================================================
--- branches/SuSE-SLE-10-SP1-Branch/users/src/Users.pm (original)
+++ branches/SuSE-SLE-10-SP1-Branch/users/src/Users.pm Tue Oct  9 16:18:15 2007
@@ -1302,8 +1302,10 @@
     $use_cracklib      = ($security{"PASSWD_USE_CRACKLIB"} eq "yes");
     $obscure_checks    = ($security{"OBSCURE_CHECKS_ENAB"} eq "yes");
 
-    $min_pass_length{"local"}        = $security{"PASS_MIN_LEN"} || $min_pass_length{"local"};
-    $min_pass_length{"system"}       = $security{"PASS_MIN_LEN"} || $min_pass_length{"system"};
+    if (defined $security{"PASS_MIN_LEN"}) {
+       $min_pass_length{"local"}     = $security{"PASS_MIN_LEN"};
+       $min_pass_length{"system"}    = $security{"PASS_MIN_LEN"};
+    }
 
     my $login_defs     = SCR->Dir (".etc.login_defs");
     if (contains ($login_defs, "CHARACTER_CLASS")) {
@@ -1825,6 +1827,26 @@
        if (Autologin->user () eq ($user_in_work{"uid"} || "")) {
            Autologin->Disable ();
        }
+
+       my $type                = $user_in_work{"type"};
+       my $plugins             = $user_in_work{"plugins"};
+
+       # --------- PluginPresent: check which plugins are in use for this user
+       # so they can be called in "Write"
+       my $result = UsersPlugins->Apply ("PluginPresent", {
+           "what"    => "user",
+           "type"    => $type,
+       }, \%user_in_work);
+       if (defined ($result) && ref ($result) eq "HASH") {
+           $plugins = [];
+           foreach my $plugin (keys %{$result}) {
+               if (bool ($result->{$plugin}) && !contains ($plugins, $plugin))
+               {
+                   push @{$plugins}, $plugin;
+               }
+           }
+           $user_in_work{"plugins"}  = $plugins;
+       }
        return 1;
     }
     y2warning ("no such user");
@@ -2686,7 +2708,7 @@
        if ($plugin_error) { return $plugin_error; }
 
        $result = UsersPlugins->Apply ("Edit", $args, \%user);
-       # check if plugin has done the 'EditBefore' action
+       # check if plugin has done the 'Edit' action
        if (defined $result->{$plugin} && ref ($result->{$plugin}) eq "HASH") {
            $result     = ShowPluginWarning ($result);
            %user       = %{$result->{$plugin}};
@@ -3299,9 +3321,12 @@
        %org_user       = %{$user{"org_user"}};
     }
     if ($user{"type"} ne "ldap") {
+       if (($user{"plugin_modified"} || 0) == 1) {
+           return 1; #TODO save special plugin_modified global value?
+       }
        # grouplist can be ignored, it is a modification of groups
        while ( my ($key, $value) = each %org_user) {
-
+           last if $ret;
            if ($key eq "grouplist") {
                next;
            }
@@ -3322,23 +3347,25 @@
            if (!defined $user{$key} || $user{$key} ne $value)
            {
                $ret = 1;
-               y2debug ("old value: $value, changed to: ",
-                   $user{$key} || "-" );
+               y2debug ("old value: ", $value || "(not defined)");
+               y2debug ("... changed to: ", $user{$key} || "(not defined)" );
            }
        }
        return $ret;
-#FIXME what if there is a new key? it's not in org_user map...
     }
     # search result, because some attributes were not filled yet
     my @internal_keys  = @{UsersLDAP->GetUserInternal ()};
     foreach my $key (keys %user) {
-
+       last if $ret;
        my $value = $user{$key};
        if (!defined $user{$key} || contains (\@internal_keys, $key) ||
            ref ($value) eq "HASH" ) {
            next;
        }
-       if (!defined ($org_user{$key})) {
+       if ($key eq "plugin_modified") {
+           $ret        = 1;
+       }
+       elsif (!defined ($org_user{$key})) {
            if ($value ne "") {
                $ret = 1;
            }
@@ -3356,15 +3383,43 @@
                 ref ($org_user{$key}) eq "YaST::YCP::Integer")) {
                if ($user{$key}->value() == $value->value()) { next;}
            }
+           y2debug (sformat ("$key modified: old %1 new %2", $org_user{$key}, $value));
            $ret = 1;
        }
     }
-    if (!$ret && defined $org_user{"crypted_home_size"} && defined $user{"crypted_home_size"}) {
+    # TODO should be caught in the previous tests?
+    if (!$ret &&
+       defined $org_user{"crypted_home_size"} &&
+       defined $user{"crypted_home_size"})
+    {
        $ret    = ($org_user{"crypted_home_size"} ne $user{"crypted_home_size"});
     }
     return $ret;
 }
 
+# take the map of user and check if his crypted directory settings were modified
+# return boolean
+sub CryptedHomeModified {
+
+    my $self           = shift;
+    my $user           = shift;
+
+    my $username       = $user->{"uid"} || "";
+    my $org_username   = $user->{"org_user"}{"uid"} || $username;
+    my $home           = $user->{"homedirectory"} || "";
+    my $org_home       = $user->{"org_user"}{"homedirectory"} || $home;
+    my $home_size      = $user->{"crypted_home_size"} || 0;
+    my $org_size       = $user->{"org_user"}{"crypted_home_size"} || 0;
+    my $pw             = $user->{"current_text_userpassword"};
+    my $new_pw         = $user->{"text_userpassword"};
+
+    return 0 if ($home_size == 0 && $org_size == 0); # nothing to do
+    return 0 if (!defined $pw && !defined $new_pw); # no change without password provided :-(
+    return 0 if ($home eq $org_home && $username eq $org_username && $home_size == $org_size && $pw eq $new_pw);
+    return 1;
+}
+
+
 # Substitute the values of LDAP atributes, predefined in LDAP user configuration
 BEGIN { $TYPEINFO{SubstituteUserValues} = ["function", "void"] }
 sub SubstituteUserValues {
@@ -3967,8 +4022,9 @@
 }
 
 ##------------------------------------
-# remove home directories and
-# execute USERDEL_POSTCMD scripts for local/system users which should be deleted
+# 1. remove home directories,
+# 2. execute USERDEL_POSTCMD scripts for deleted local/system users
+# 3. call Write function of plugins to do the delete action
 sub PostDeleteUsers {
 
     my $ret    = 1;
@@ -3985,11 +4041,20 @@
        if (!defined $removed_users{$type}) {
            next;
        }
+       my $plugin_error;
        foreach my $username (keys %{$removed_users{$type}}) {
            my %user = %{$removed_users{$type}{$username}};
            my $cmd = sprintf ("$userdel_postcmd $username %i %i %s",
                $user{"uidnumber"}, $user{"gidnumber"}, $user{"homedirectory"});
            SCR->Execute (".target.bash", $cmd);
+           # call the "Write" function from plugins...
+           my $args    = {
+               "what"                => "user",
+               "type"                => $type,
+               "modified"    => "deleted",
+           };
+           my $result          = UsersPlugins->Apply ("Write", $args, \%user);
+           $plugin_error       = GetPluginError ($args, $result);
        };
     };
     return $ret;
@@ -4179,7 +4244,7 @@
            # only remember for which users we need to call cryptconfig
            foreach my $username (keys %{$modified_users{"ldap"}}) {
                my %user        = %{$modified_users{"ldap"}{$username}};
-               if (defined $user{"crypted_home_size"}) {
+               if (defined $user{"crypted_home_size"} && $self->CryptedHomeModified (\%user)) {
                    $users_with_crypted_dir{$username}  = \%user;
                }
            }
@@ -4233,7 +4298,7 @@
     if ($groups_modified) {
        if ($group_not_read) {
            # error popup (%s is a file name)
-            $ret = sprintf (__("File %s was not read correctly, so it will not be written."), "$base_directory/group");
+            $ret = sprintf (__("File %s was not read correctly, so it will not be written."), $base_directory."/group");
            Report->Error ($ret);
            return $ret;
        }
@@ -4258,40 +4323,6 @@
            Report->Error ($ret);
            return $ret;
         }
-       # -------------------------------------- call Write on plugins
-        foreach my $type (keys %modified_groups)  {
-           if ($type eq "ldap") { next; }
-           foreach my $groupname (keys %{$modified_groups{$type}}) {
-               if ($plugin_error) { last;}
-               my $args        = {
-                   "what"    => "group",
-                   "type"    => $type,
-                   "modified"        => $modified_groups{$type}{$groupname}{"modified"}
-               };
-               my $result = UsersPlugins->Apply ("Write", $args,
-                   $modified_groups{$type}{$groupname});
-               $plugin_error   = GetPluginError ($args, $result);
-
-               # store commands for calling groupadd_cmd script
-               if ($groupadd_cmd ne "" && FileUtils->Exists ($groupadd_cmd)) {
-                   my $group   = $modified_groups{$type}{$groupname};
-                   my $mod     = $group->{"modified"} || "no";
-                   if ($mod eq "imported" || $mod eq "added") {
-                       my $cmd = sprintf ("%s %s", $groupadd_cmd, $groupname);
-                       push @groupadd_postcommands, $cmd;
-                   }
-               }
-           }
-           # unset the 'modified' flags after write
-           $self->UpdateGroupsAfterWrite ("local");
-           $self->UpdateGroupsAfterWrite ("system");
-           delete $modified_groups{"local"};
-           delete $modified_groups{"system"};
-       }
-       if ($plugin_error) {
-           Report->Error ($plugin_error);
-           return $plugin_error;
-       }
        if (!$write_only) {
            $nscd_group         = 1;
        }
@@ -4315,7 +4346,7 @@
     if ($users_modified) {
        if ($passwd_not_read) {
            # error popup (%s is a file name)
-            $ret = sprintf (__("File %s was not correctly read, so it will not be written."), "$base_directory/passwd");
+            $ret = sprintf (__("File %s was not correctly read, so it will not be written."), $base_directory."/passwd");
            Report->Error ($ret);
            return $ret;
        }
@@ -4340,25 +4371,6 @@
            Report->Error ($ret);
            return $ret;
        }
-       # -------------------------------------- call Write on plugins
-        foreach my $type (keys %modified_users)  {
-           if ($type eq "ldap") { next; }
-           foreach my $username (keys %{$modified_users{$type}}) {
-               if ($plugin_error) { last;}
-               my $args        = {
-                   "what"    => "user",
-                   "type"    => $type,
-                   "modified"        => $modified_users{$type}{$username}{"modified"}
-               };
-               my $result = UsersPlugins->Apply ("Write", $args,
-                   $modified_users{$type}{$username});
-               $plugin_error   = GetPluginError ($args, $result);
-           }
-       }
-       if ($plugin_error) {
-           Report->Error ($plugin_error);
-           return $plugin_error;
-       }
        if (!$write_only) {
            $nscd_passwd        = 1;
        }
@@ -4378,7 +4390,7 @@
                my $gid         = $user{"gidnumber"};
                my $create_home = $user{"create_home"};
                my $skel        = $useradd_defaults{"skel"};
-               if (defined $user{"crypted_home_size"}) {
+               if (defined $user{"crypted_home_size"} && $self->CryptedHomeModified (\%user)) {
                    $users_with_crypted_dir{$username}  = \%user;
                }
                if ($user_mod eq "imported" || $user_mod eq "added") {
@@ -4431,12 +4443,6 @@
                }
            }
        }
-       # unset the 'modified' flags after write
-       $self->UpdateUsersAfterWrite ("local");
-       $self->UpdateUsersAfterWrite ("system");
-       # not modified after successful write
-       delete $modified_users{"local"};
-       delete $modified_users{"system"};
     }
     if (%users_with_crypted_dir) {
        Package->Install ("cryptconfig");
@@ -4458,7 +4464,7 @@
     if ($users_modified) {
        if ($shadow_not_read) {
            # error popup (%s is a file name)
-            $ret = sprintf (__("File %s was not correctly read, so it will not be written."), "$base_directory/shadow");
+            $ret = sprintf (__("File %s was not correctly read, so it will not be written."), $base_directory."/shadow");
            Report->Error ($ret);
            return $ret;
        }
@@ -4479,6 +4485,72 @@
        }
     }
 
+    # last operation on plugins must be done after nscd restart
+    # (at least quota seems to need it)
+    if ($users_modified) {
+       # -------------------------------------- call Write on plugins
+        foreach my $type (keys %modified_users)  {
+           if ($type eq "ldap") { next; }
+           foreach my $username (keys %{$modified_users{$type}}) {
+               if ($plugin_error) { last;}
+               my $args        = {
+                   "what"    => "user",
+                   "type"    => $type,
+                   "modified"        => $modified_users{$type}{$username}{"modified"}
+               };
+               my $result = UsersPlugins->Apply ("Write", $args,
+                   $modified_users{$type}{$username});
+               $plugin_error   = GetPluginError ($args, $result);
+           }
+       }
+       if ($plugin_error) {
+           Report->Error ($plugin_error);
+           return $plugin_error;
+       }
+       # unset the 'modified' flags after write
+       $self->UpdateUsersAfterWrite ("local");
+       $self->UpdateUsersAfterWrite ("system");
+       # not modified after successful write
+       delete $modified_users{"local"};
+       delete $modified_users{"system"};
+    }
+    if ($groups_modified) {
+       # -------------------------------------- call Write on plugins
+        foreach my $type (keys %modified_groups)  {
+           if ($type eq "ldap") { next; }
+           foreach my $groupname (keys %{$modified_groups{$type}}) {
+               if ($plugin_error) { last;}
+               my $args        = {
+                   "what"    => "group",
+                   "type"    => $type,
+                   "modified"        => $modified_groups{$type}{$groupname}{"modified"}
+               };
+               my $result = UsersPlugins->Apply ("Write", $args,
+                   $modified_groups{$type}{$groupname});
+               $plugin_error   = GetPluginError ($args, $result);
+
+               # store commands for calling groupadd_cmd script
+               if ($groupadd_cmd ne "" && FileUtils->Exists ($groupadd_cmd)) {
+                   my $group   = $modified_groups{$type}{$groupname};
+                   my $mod     = $group->{"modified"} || "no";
+                   if ($mod eq "imported" || $mod eq "added") {
+                       my $cmd = sprintf ("%s %s", $groupadd_cmd, $groupname);
+                       push @groupadd_postcommands, $cmd;
+                   }
+               }
+           }
+           # unset the 'modified' flags after write
+           $self->UpdateGroupsAfterWrite ("local");
+           $self->UpdateGroupsAfterWrite ("system");
+           delete $modified_groups{"local"};
+           delete $modified_groups{"system"};
+       }
+       if ($plugin_error) {
+           Report->Error ($plugin_error);
+           return $plugin_error;
+       }
+    }
+
     # call make on NIS server
     if (($users_modified || $groups_modified) && $nis_master) {
         my %out        = %{SCR->Execute (".target.bash_output",
@@ -4774,9 +4846,9 @@
     }
 
     my $filtered = $username;
-
+    my $type            = $user_in_work{"type"} || "";
     # Samba users may need to have '$' at the end of username (#40433)
-    if (($user_in_work{"type"} || "") eq "ldap") {
+    if ($type eq "ldap") {
        $filtered =~ s/\$$//g;
     }
     my $grep = SCR->Execute (".target.bash_output", "echo '$filtered' | grep '\^$character_class\$'", { "LANG" => "C" });

Modified: branches/SuSE-SLE-10-SP1-Branch/users/src/dialogs.ycp
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-SLE-10-SP1-Branch/users/src/dialogs.ycp?rev=41293&r1=41292&r2=41293&view=diff
==============================================================================
--- branches/SuSE-SLE-10-SP1-Branch/users/src/dialogs.ycp (original)
+++ branches/SuSE-SLE-10-SP1-Branch/users/src/dialogs.ycp Tue Oct  9 16:18:15 2007
@@ -37,6 +37,14 @@
 
 string default_pw      = "******";
 
+// check if this is installation stage -
+// adding user during firstboot should be same as during 2nd stage
+define boolean installation () {
+    return Stage::cont () || Stage::firstboot ();
+}
+
+
+
 /**
  * Upperase letters were used in username! (see bug #26409)
  * In these popup, ask user what to do.
@@ -138,8 +146,7 @@
 define symbol EditUserDialog (string what) {
 
     // user has returned to the "add user dialog" during installation workflow:
-    if (Users::StartDialog ("user_add") &&
-       Stage::cont () && Users::UseNextTime ())
+    if (Users::StartDialog ("user_add") && installation () && Users::UseNextTime ())
     {
        Users::RestoreCurrentUser ();
        Users::SetUseNextTime (false);
@@ -222,7 +229,7 @@
        ((user_type == "ldap" && Ldap::file_server) ||
        (user_type == "local" || user_type == "system"));
 
-    boolean complex_layout = Stage::cont () && Users::StartDialog ("user_add");
+    boolean complex_layout = installation () && Users::StartDialog ("user_add");
     map<string,integer> groups   = user["grouplist"]:$[];
 
     list available_shells      = Users::AllShells ();
@@ -247,6 +254,8 @@
     string plugin_client       = "";
     string plugin              = "";
     map client2plugin          = $[];
+    // names of plugin GUI clients
+    list<string> clients = [];
 
     /**
      * initialize local variables with current state of user
@@ -360,7 +369,7 @@
                `HStretch()
            );
        }
-       else if (!do_not_edit && !Stage::cont ())
+       else if (!do_not_edit && !installation ())
        {
            optionbox = `VBox (
                `VSpacing (1),
@@ -533,7 +542,7 @@
                    )
                ),
                // IntField label
-               `IntField (`id (`dirsize), _("&Directory Size in MB"), 10, 2147483647, crypted_home_size)
+               `IntField (`id (`dirsize), _("&Directory Size in MB"), 10, 2147483647, crypted_home_size) // for max value, see bug 244631 :-)
        ) : `HBox ();
 
        return `HBox (
@@ -656,22 +665,6 @@
      */
     define term get_plugins_term () {
 
-       // UsersPlugins will filter out plugins we cannot use for given type
-       map plugin_clients      = UsersPlugins::Apply ("GUIClient",
-           $[ "what" : "user", "type" : user_type ], $[]
-       );
-       // remove empty clients
-       plugin_clients = filter (string plugin, string client,
-           (map<string,string>) plugin_clients, ``(client != ""));
-
-       client2plugin   = $[];
-       list<string> clients      = maplist (string plugin, string client,
-           (map<string,string>) plugin_clients, {
-
-               client2plugin [client]  = plugin;
-               return client;
-       });
-
        plugin_client   = clients[0]:"";
        plugin          = client2plugin[plugin_client]:plugin_client;
 
@@ -737,7 +730,19 @@
        tabs = add (tabs,`item(`id(`passwordsettings),_("Pass&word Settings")));
     }
 
-    if (user_type == "ldap")
+    // Now initialize the list of plugins: we must know now if there is some available.
+    // UsersPlugins will filter out plugins we cannot use for given type
+    map plugin_clients = UsersPlugins::Apply ("GUIClient",
+       $[ "what" : "user", "type" : user_type ], $[]
+    );
+    // remove empty clients
+    plugin_clients = filter (string plugin, string client,
+       (map<string,string>) plugin_clients, ``(client != ""));
+    clients    = maplist (string plugin, string client, (map<string,string>) plugin_clients, {
+       client2plugin [client]  = plugin;
+       return client;
+    });
+    if (clients != [])
     {
        // tab label
        tabs = add (tabs, `item(`id(`plugins), _("Plu&g-Ins") ));
@@ -1084,7 +1089,7 @@
                }
            }
            // --------------------------------- autologin (during installation)
-           if (Users::StartDialog ("user_add") && Stage::cont ())
+           if (Users::StartDialog ("user_add") && installation ())
            {
                Users::SetRootMail ((boolean)
                    UI::QueryWidget(`id (`root_mail), `Value) ? username : "");
@@ -1448,6 +1453,7 @@
            }
            if (ret == `run)
            {
+               boolean plugin_added    = false;
                // first, add the plugin if necessary
                if (!contains (user["plugins"]:[], plugin))
                {
@@ -1458,10 +1464,9 @@
                        ret = `notnext;
                        continue;
                    }
+                   plugin_added        = true;
                    user        = Users::GetCurrentUser ();
                    reinit_userdata ();
-                   UI::ChangeWidget (`id(`table), `Item (plugin_client,0),
-                       UI::Glyph (`CheckMark));
                }
                any plugin_ret = WFM::CallFunction (
                    plugin_client, ["Dialog", $[ "what"     : "user" ], user ]);
@@ -1470,6 +1475,20 @@
                    // update the map of changed user
                    user        = Users::GetCurrentUser ();
                    reinit_userdata ();
+                   UI::ChangeWidget (`id(`table), `Item (plugin_client,0), UI::Glyph (`CheckMark));
+               }
+               // for `cancel we must remove the plugin if it was added because of `run
+               else if (plugin_added)
+               {
+                   error       = Users::RemoveUserPlugin (plugin);
+                   if (error != "")
+                   {
+                       Popup::Error (error);
+                       ret = `notnext;
+                       continue;
+                   }
+                   user        = Users::GetCurrentUser ();
+                   reinit_userdata ();
                }
            }
        }
@@ -1478,7 +1497,7 @@
        if (ret == `edit)
        {
            Wizard::SetHelpText (
-               EditUserDialogHelp (Stage::cont (), user_type, what));
+               EditUserDialogHelp (installation (), user_type, what));
            UI::ReplaceWidget(`tabContents, get_edit_term ());
 
            // update the contets of User Data Dialog
@@ -1695,6 +1714,7 @@
     string plugin_client       = "";
     string plugin              = "";
     map client2plugin          = $[];
+    list<string> clients = [];
 
     /**
      * initialize local variables with current state of group
@@ -1762,22 +1782,6 @@
      */
     define term get_plugins_term () {
 
-       // UsersPlugins will filter out plugins we cannot use for given type
-       map plugin_clients      = UsersPlugins::Apply ("GUIClient",
-           $[ "what" : "group", "type" : group_type ], $[]
-       );
-       // remove empty clients
-       plugin_clients = filter (string plugin, string client,
-           (map<string,string>) plugin_clients, ``(client != ""));
-
-       client2plugin   = $[];
-       list<string> clients      = maplist (string plugin, string client,
-           (map<string,string>) plugin_clients, {
-
-               client2plugin [client]  = plugin;
-               return client;
-       });
-
        plugin_client   = clients[0]:"";
        plugin          = client2plugin[plugin_client]:plugin_client;
 
@@ -1810,7 +1814,21 @@
 
     list<term> tabs              = [];
     term dialog_contents       = `Empty ();
-    boolean use_tabs           = group_type == "ldap";
+
+    // Now initialize the list of plugins: we must know now if there is some available.
+    // UsersPlugins will filter out plugins we cannot use for given type
+    map plugin_clients = UsersPlugins::Apply ("GUIClient",
+           $[ "what" : "group", "type" : group_type ], $[]
+    );
+    // remove empty clients
+    plugin_clients = filter (string plugin, string client,
+       (map<string,string>) plugin_clients, ``(client != ""));
+    clients    = maplist (string plugin, string client, (map<string,string>) plugin_clients, {
+       client2plugin [client]  = plugin;
+       return client;
+    });
+    boolean use_tabs   = (size (clients) > 0);
+    boolean has_tabs   = true;
 
     if (use_tabs)
     {
@@ -1827,6 +1845,7 @@
        );
        if (!UI::HasSpecialWidget (`DumbTab))
        {
+           has_tabs    = false;
            term tabbar = `HBox ();
            foreach (term it, tabs, {
                string label = it[1]:"";
@@ -1853,6 +1872,14 @@
     symbol current     = nil;
     list tabids                = [`edit, `plugins ];
 
+    // switch focus to specified tab (after error message) and widget inside
+    define void focus_tab (symbol tab, any widget) {
+       if (use_tabs && has_tabs)
+           UI::ChangeWidget (`id (`tabs), `CurrentItem, tab);
+       UI::SetFocus (`id (widget));
+       ret = `notnext;
+    }
+
     repeat
     {
        // map returned from Check*UI functions
@@ -1896,8 +1923,7 @@
            if (error != "")
            {
                Report::Error (error);
-                UI::SetFocus (`id(`groupname));
-               ret = `notnext;
+               focus_tab (current, `groupname);
                continue;
            }
            // --------------------------------- password checks
@@ -1908,8 +1934,7 @@
                 Report::Error(_("The passwords do not match.
 Try again.")) ;
 
-               ret     = `notnext;
-               UI::SetFocus(`id(`pw1));
+               focus_tab (current, `pw1);
                 continue;
             }
             if ( pw1 != "" && pw1 != default_pw )
@@ -1918,8 +1943,7 @@
                if (error != "")
                {
                    Report::Error (error);
-                   ret = `notnext;
-                   UI::SetFocus(`id(`pw1));
+                   focus_tab (current, `pw1);
                    continue;
                }
                boolean failed                  = false;
@@ -1938,8 +1962,7 @@
                } while (error_map != $[] && !failed);
                if (failed)
                {
-                   ret = `notnext;
-                   UI::SetFocus(`id(`pw1));
+                   focus_tab (current, `pw1);
                    continue;
                }
                password = pw1;
@@ -1954,8 +1977,7 @@
                if (error != "")
                {
                    Report::Error (error);
-                   UI::SetFocus (`id(`gid));
-                   ret = `notnext;
+                   focus_tab (current, `gid);
                    continue;
                }
                error_map = Users::CheckGIDUI (new_i_gid, ui_map);
@@ -1963,8 +1985,7 @@
                {
                    if (!Popup::YesNo (error_map ["question"]:""))
                    {
-                       ret = `notnext;
-                       UI::SetFocus(`id(`gid));
+                       focus_tab (current, `gid);
                        continue;
                    }
                    if(contains(["local","system"],error_map["question_id"]:""))
@@ -2067,6 +2088,7 @@
            }
            if (ret == `run)
            {
+               boolean plugin_added    = false;
                // first, add the plugin if necessary
                if (!contains (group["plugins"]:[], plugin))
                {
@@ -2077,10 +2099,9 @@
                        ret = `notnext;
                        continue;
                    }
+                   plugin_added        = true;
                    group       = Users::GetCurrentGroup ();
                    reinit_groupdata ();
-                   UI::ChangeWidget (`id(`table), `Item (plugin_client,0),
-                       UI::Glyph (`CheckMark));
                }
                any plugin_ret = WFM::CallFunction (
                    plugin_client, ["Dialog", $[ "what"     : "group" ], group ]);
@@ -2089,6 +2110,19 @@
                    // update the map of changed group
                    group       = Users::GetCurrentGroup ();
                    reinit_groupdata ();
+                   UI::ChangeWidget (`id(`table), `Item (plugin_client,0), UI::Glyph (`CheckMark));
+               }
+               else if (plugin_added)
+               {
+                   error       = Users::RemoveGroupPlugin (plugin);
+                   if (error != "")
+                   {
+                       Popup::Error (error);
+                       ret = `notnext;
+                       continue;
+                   }
+                   group       = Users::GetCurrentGroup ();
+                   reinit_groupdata ();
                }
            }
        }
@@ -2613,7 +2647,7 @@
     boolean changed    = false;
     list param         = [];
 
-    if (Stage::cont ())
+    if (installation ())
     {
        param           = [ "from_users" ];
     }
@@ -2680,7 +2714,7 @@
 
     Users::CommitUser ();
     // adding only one user during install
-    if (Stage::cont () && Users::StartDialog ("user_add") )
+    if (installation () && Users::StartDialog ("user_add") )
         return `save;
     else
        return `next;

--
To unsubscribe, e-mail: yast-commit+unsubscribe@xxxxxxxxxxxx
For additional commands, e-mail: yast-commit+help@xxxxxxxxxxxx

< Previous Next >
This Thread
  • No further messages