From cd70689b0642d41dcbdb826df4fc9f79b1ef899e Mon Sep 17 00:00:00 2001 From: "M. Vefa Bicakci" <m.v.b@runbox.com> Date: Fri, 19 Oct 2018 08:02:12 +0200 Subject: [PATCH] anaconda: Modify user configuration spoke for QubesOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Frédéric Pierret <frederic.epitre@orange.fr> --- pyanaconda/ui/gui/spokes/user.glade | 96 +++++++------------------------------ pyanaconda/ui/gui/spokes/user.py | 57 +++------------------- pyanaconda/ui/tui/spokes/user.py | 21 ++------ 3 files changed, 28 insertions(+), 146 deletions(-) diff --git a/pyanaconda/ui/gui/spokes/user.glade b/pyanaconda/ui/gui/spokes/user.glade index 2873ff2d9..e6700657d 100644 --- a/pyanaconda/ui/gui/spokes/user.glade +++ b/pyanaconda/ui/gui/spokes/user.glade @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.18.3 --> +<!-- Generated with glade 3.20.0 --> <interface> <requires lib="gtk+" version="3.6"/> <requires lib="AnacondaWidgets" version="1.0"/> @@ -53,33 +53,15 @@ <property name="can_focus">False</property> <property name="row_spacing">8</property> <property name="column_spacing">9</property> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="xpad">10</property> - <property name="label" translatable="yes" context="GUI|User">_Full name</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">t_fullname</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> - </packing> - </child> <child> <object class="GtkLabel" id="label2"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">1</property> <property name="xpad">10</property> <property name="label" translatable="yes" context="GUI|User">_User name</property> <property name="use_underline">True</property> <property name="mnemonic_widget">t_username</property> + <property name="xalign">1</property> <attributes> <attribute name="weight" value="bold"/> </attributes> @@ -89,29 +71,12 @@ <property name="top_attach">1</property> </packing> </child> - <child> - <object class="GtkEntry" id="t_fullname"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="caps_lock_warning">False</property> - <signal name="changed" handler="full_name_changed" swapped="no"/> - <child internal-child="accessible"> - <object class="AtkObject" id="t_fullname-atkobject"> - <property name="AtkObject::accessible-name" translatable="yes">Full Name</property> - </object> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> - </packing> - </child> <child> <object class="GtkEntry" id="t_username"> <property name="visible">True</property> <property name="can_focus">True</property> - <signal name="changed" handler="username_changed" swapped="no"/> <signal name="changed" handler="on_username_set_by_user" swapped="no"/> + <signal name="changed" handler="username_changed" swapped="no"/> <child internal-child="accessible"> <object class="AtkObject" id="t_username-atkobject"> <property name="AtkObject::accessible-name" translatable="yes">User Name</property> @@ -127,11 +92,11 @@ <object class="GtkLabel" id="label3"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">1</property> <property name="xpad">10</property> <property name="label" translatable="yes" context="GUI|User">_Password</property> <property name="use_underline">True</property> <property name="mnemonic_widget">t_password</property> + <property name="xalign">1</property> <attributes> <attribute name="weight" value="bold"/> </attributes> @@ -145,11 +110,11 @@ <object class="GtkLabel" id="label4"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">1</property> <property name="xpad">10</property> <property name="label" translatable="yes" context="GUI|User">_Confirm password</property> <property name="use_underline">True</property> <property name="mnemonic_widget">t_verifypassword</property> + <property name="xalign">1</property> <attributes> <attribute name="weight" value="bold"/> </attributes> @@ -166,7 +131,7 @@ <property name="visibility">False</property> <property name="invisible_char">●</property> <signal name="changed" handler="password_changed" swapped="no"/> - <signal name="icon_release" handler="on_password_icon_clicked" swapped="no"/> + <signal name="icon-release" handler="on_password_icon_clicked" swapped="no"/> <child internal-child="accessible"> <object class="AtkObject" id="t_password-atkobject"> <property name="AtkObject::accessible-name" translatable="yes">Password</property> @@ -184,7 +149,7 @@ <property name="can_focus">True</property> <property name="visibility">False</property> <property name="invisible_char">●</property> - <signal name="icon_release" handler="on_password_icon_clicked" swapped="no"/> + <signal name="icon-release" handler="on_password_icon_clicked" swapped="no"/> <child internal-child="accessible"> <object class="AtkObject" id="t_verifypassword-atkobject"> <property name="AtkObject::accessible-name" translatable="yes">Confirm Password</property> @@ -200,9 +165,9 @@ <object class="GtkLabel" id="label6"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">0</property> <property name="label" translatable="yes"><b>Tip:</b> Keep your user name shorter than 32 characters and do not use spaces.</property> <property name="use_markup">True</property> + <property name="xalign">0</property> </object> <packing> <property name="left_attach">1</property> @@ -268,45 +233,16 @@ </packing> </child> <child> - <object class="GtkCheckButton" id="c_admin"> - <property name="label" translatable="yes" context="GUI|User">_Make this user administrator</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="xalign">0</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_admin_toggled" swapped="no"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">3</property> - </packing> + <placeholder/> </child> <child> - <object class="GtkGrid" id="grid2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkButton" id="b_advanced"> - <property name="label" translatable="yes" context="GUI|User">_Advanced...</property> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_advanced_clicked" swapped="no"/> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">8</property> - </packing> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> </child> <child> <placeholder/> diff --git a/pyanaconda/ui/gui/spokes/user.py b/pyanaconda/ui/gui/spokes/user.py index e954292c7..dac6ba3e5 100644 --- a/pyanaconda/ui/gui/spokes/user.py +++ b/pyanaconda/ui/gui/spokes/user.py @@ -38,7 +38,7 @@ from pyanaconda.constants import ANACONDA_ENVIRON, FIRSTBOOT_ENVIRON,\ PW_ASCII_CHARS, PASSWORD_ASCII from pyanaconda.regexes import GECOS_VALID, GROUPNAME_VALID, GROUPLIST_FANCY_PARSE -__all__ = ["UserSpoke", "AdvancedUserDialog"] +__all__ = ["UserSpoke"] class AdvancedUserDialog(GUIObject, GUIDialogInputCheckHandler): """ @@ -214,7 +214,7 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler): builderObjects = ["userCreationWindow"] mainWidgetName = "userCreationWindow" - focusWidgetName = "t_fullname" + focusWidgetName = "t_username" uiFile = "spokes/user.glade" helpFile = "UserSpoke.xml" @@ -252,14 +252,16 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler): else: self._user = self.data.UserData() + self._wheel = self.data.GroupData(name="wheel") + self._qubes = self.data.GroupData(name="qubes") + + self._groupDict = {"wheel": self._wheel, "qubes": self._qubes} + # placeholders for the text boxes - self.fullname = self.builder.get_object("t_fullname") self.username = self.builder.get_object("t_username") self.pw = self.builder.get_object("t_password") self.confirm = self.builder.get_object("t_verifypassword") - self.admin = self.builder.get_object("c_admin") self.usepassword = self.builder.get_object("c_usepassword") - self.b_advanced = self.builder.get_object("b_advanced") # Counters for checks that ask the user to click Done to confirm self._waiveStrengthClicks = 0 @@ -306,8 +308,6 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler): self.add_check(self.username, self._checkUsername) - self.add_re_check(self.fullname, GECOS_VALID, _("Full name cannot contain colon characters")) - # Modify the GUI based on the kickstart and policy information # This needs to happen after the input checks have been created, since # the Gtk signal handlers use the input check variables. @@ -323,9 +323,6 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler): # User isn't allowed to change whether password is required or not self.usepassword.set_sensitive(False) - self._advanced = AdvancedUserDialog(self._user, self.data) - self._advanced.initialize() - # set the visibility of the password entries set_password_visibility(self.pw, False) set_password_visibility(self.confirm, False) @@ -336,8 +333,6 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler): check.enabled = True self.username.set_text(self._user.name) - self.fullname.set_text(self._user.gecos) - self.admin.set_active("wheel" in self._user.groups) self.pw.emit("changed") self.confirm.emit("changed") @@ -378,7 +373,6 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler): self._password_kickstarted = False self._user.name = self.username.get_text() - self._user.gecos = self.fullname.get_text() if "wheel" not in self._user.groups: self._user.groups.append("wheel") @@ -469,34 +463,10 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler): def username_changed(self, editable, data=None): """Called by Gtk on all username changes.""" - # Disable the advanced user dialog button when no username is set - if editable.get_text(): - self.b_advanced.set_sensitive(True) - else: - self.b_advanced.set_sensitive(False) - # Re-run the password checks against the new username self.pw.emit("changed") self.confirm.emit("changed") - def full_name_changed(self, editable, data=None): - """Called by Gtk callback when the full name field changes.""" - - if self.guesser: - fullname = editable.get_text() - username = guess_username(fullname) - - with blockedHandler(self.username, self.on_username_set_by_user): - self.username.set_text(username) - - def on_admin_toggled(self, togglebutton, data=None): - # Add or remove "wheel" from the grouplist on changes to the admin checkbox - if togglebutton.get_active(): - if "wheel" not in self._user.groups: - self._user.groups.append("wheel") - elif "wheel" in self._user.groups: - self._user.groups.remove("wheel") - def _checkPasswordEmpty(self, inputcheck): """Check whether a password has been specified at all. @@ -612,19 +582,6 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler): else: return msg or _("Invalid user name") - def on_advanced_clicked(self, _button, data=None): - """Handler for the Advanced.. button. It starts the Advanced dialog - for setting homedit, uid, gid and groups. - """ - - self._user.name = self.username.get_text() - - self._advanced.refresh() - with self.main_window.enlightbox(self._advanced.window): - self._advanced.run() - - self.admin.set_active("wheel" in self._user.groups) - def on_back_clicked(self, button): # If the failed check is for non-ASCII characters, # add a click to the counter and check again diff --git a/pyanaconda/ui/tui/spokes/user.py b/pyanaconda/ui/tui/spokes/user.py index 1005852db..834b82cbf 100644 --- a/pyanaconda/ui/tui/spokes/user.py +++ b/pyanaconda/ui/tui/spokes/user.py @@ -40,11 +40,9 @@ class UserSpoke(FirstbootSpokeMixIn, EditTUISpoke): edit_fields = [ Entry("Create user", "_create", EditTUISpoke.CHECK, True), - Entry("Fullname", "gecos", GECOS_VALID, lambda self, args: args._create), Entry("Username", "name", check_username, lambda self, args: args._create), Entry("Use password", "_use_password", EditTUISpoke.CHECK, lambda self, args: args._create), Entry("Password", "_password", EditTUISpoke.PASSWORD, lambda self, args: args._use_password and args._create), - Entry("Administrator", "_admin", EditTUISpoke.CHECK, lambda self, args: args._create), Entry("Groups", "_groups", GROUPLIST_SIMPLE_VALID, lambda self, args: args._create) ] @@ -84,7 +82,6 @@ class UserSpoke(FirstbootSpokeMixIn, EditTUISpoke): self.errors = [] def refresh(self, args=None): - self.args._admin = "wheel" in self.args.groups self.args._groups = ", ".join(self.args.groups) # if we have any errors, display them @@ -146,22 +143,14 @@ class UserSpoke(FirstbootSpokeMixIn, EditTUISpoke): return EditTUISpoke.input(self, args, key) def apply(self): - if self.args.gecos and not self.args.name: - username = guess_username(self.args.gecos) - valid, msg = check_username(username) - if not valid: - self.errors.append(_("Invalid user name: %(name)s.\n%(error_message)s") - % {"name": username, "error_message": msg}) - else: - self.args.name = guess_username(self.args.gecos) - self.args.groups = [g.strip() for g in self.args._groups.split(",") if g] - # Add or remove the user from wheel group - if self.args._admin and "wheel" not in self.args.groups: + # Add the user to the wheel and qubes groups + if "wheel" not in self.args.groups: self.args.groups.append("wheel") - elif not self.args._admin and "wheel" in self.args.groups: - self.args.groups.remove("wheel") + + if "qubes" not in self.args.groups: + self.args.groups.append("qubes") # Add or remove the user from userlist as needed if self.args._create and (self.args not in self.data.user.userList and self.args.name): -- 2.14.4