[f22-branch 3/7] Add pwpolicy for the user spoke.

bcl installerbot-noreply at redhat.com
Tue Mar 17 23:09:17 UTC 2015


From: "Brian C. Lane" <bcl at redhat.com>

Use the new kickstart pwpolicy settings for the root password spoke.

Use the 'user' keyword like so:

pwpolicy user --strict --minlen=16 --emptyok
---
 pyanaconda/ui/gui/spokes/user.py | 62 +++++++++++++++++++++++++++++++++-------
 1 file changed, 52 insertions(+), 10 deletions(-)

diff --git a/pyanaconda/ui/gui/spokes/user.py b/pyanaconda/ui/gui/spokes/user.py
index 08f1e60..70efcac 100644
--- a/pyanaconda/ui/gui/spokes/user.py
+++ b/pyanaconda/ui/gui/spokes/user.py
@@ -36,7 +36,8 @@
 from pykickstart.constants import FIRSTBOOT_RECONFIG
 from pyanaconda.constants import ANACONDA_ENVIRON, FIRSTBOOT_ENVIRON,\
         PASSWORD_EMPTY_ERROR, PASSWORD_CONFIRM_ERROR_GUI, PASSWORD_STRENGTH_DESC,\
-        PASSWORD_WEAK, PASSWORD_WEAK_WITH_ERROR,\
+        PASSWORD_WEAK, PASSWORD_WEAK_WITH_ERROR, PASSWORD_WEAK_CONFIRM,\
+        PASSWORD_WEAK_CONFIRM_WITH_ERROR, PASSWORD_DONE_TWICE,\
         PW_ASCII_CHARS, PASSWORD_ASCII
 from pyanaconda.regexes import GECOS_VALID, USERNAME_VALID, GROUPNAME_VALID, GROUPLIST_FANCY_PARSE
 
@@ -255,6 +256,7 @@ def initialize(self):
         self.b_advanced = self.builder.get_object("b_advanced")
 
         # Counters for checks that ask the user to click Done to confirm
+        self._waiveStrengthClicks = 0
         self._waiveASCIIClicks = 0
 
         self.guesser = {
@@ -274,6 +276,11 @@ def initialize(self):
         self.pw_bar.add_offset_value("medium", 3)
         self.pw_bar.add_offset_value("high", 4)
 
+        # Configure the password policy, if available. Otherwise use defaults.
+        self.policy = self.data.pwpolicy.get_policy("user")
+        if not self.policy:
+            self.policy = self.data.pwpolicy.handler.PwPolicyData()
+
         # indicate when the password was set by kickstart
         self._user.password_kickstarted = self.data.user.seen
         if self._user.password_kickstarted:
@@ -285,6 +292,13 @@ def initialize(self):
                 self.usepassword.set_active(True)
                 self.pw.set_placeholder_text(_("The password was set by kickstart."))
                 self.confirm.set_placeholder_text(_("The password was set by kickstart."))
+        elif not self.policy.emptyok:
+            # Policy is that a non-empty password is required
+            self.usepassword.set_active(True)
+
+        if not self.policy.emptyok:
+            # User isn't allowed to change whether password is required or not
+            self.usepassword.set_sensitive(False)
 
         # Password checks, in order of importance:
         # - if a password is required, is one specified?
@@ -410,8 +424,10 @@ def apply(self):
 
     @property
     def sensitive(self):
+        # Spoke cannot be entered if a user was set in the kickstart and the user
+        # policy doesn't allow changes.
         return not (self.completed and flags.automatedInstall
-                    and self.data.user.seen)
+                    and self.data.user.seen and not self.policy.changesok)
 
     @property
     def completed(self):
@@ -425,6 +441,7 @@ def _updatePwQuality(self):
         username = self.username.get_text()
 
         # Reset the counters used for the "press Done twice" logic
+        self._waiveStrengthClicks = 0
         self._waiveASCIIClicks = 0
 
         self._pwq_valid, strength, self._pwq_error = validatePassword(pwtext, username)
@@ -496,7 +513,7 @@ def _checkPasswordEmpty(self, inputcheck):
         """
 
         # If the password was set by kickstart, skip the strength check
-        if self._user.password_kickstarted:
+        if self._user.password_kickstarted and not self.policy.changesok:
             return InputCheck.CHECK_OK
 
         # Skip the check if no password is required
@@ -539,6 +556,10 @@ def _checkPasswordStrength(self, inputcheck):
            The password strength has already been checked in _updatePwQuality, called
            previously in the signal chain. This method converts the data set from there
            into an error message.
+
+           The password strength check can be waived by pressing "Done" twice. This
+           is controlled through the self._waiveStrengthClicks counter. The counter
+           is set in on_back_clicked, which also re-runs this check manually.
          """
 
         # Skip the check if no password is required
@@ -550,13 +571,31 @@ def _checkPasswordStrength(self, inputcheck):
         if (not self._pwq_valid) and (self._pwq_error):
             return self._pwq_error
 
-        pwstrength = self.pw_bar.get_value()
-
-        if pwstrength < 2:
-            if self._pwq_error:
-                return _(PASSWORD_WEAK_WITH_ERROR) % self._pwq_error
+        # use strength from policy, not bars
+        pw = self.pw.get_text()
+        username = self.username.get_text()
+        _valid, pwstrength, _error = validatePassword(pw, username, minlen=self.policy.minlen)
+
+        if pwstrength < self.policy.minquality:
+            # If Done has been clicked twice, waive the check
+            if self._waiveStrengthClicks > 1:
+                return InputCheck.CHECK_OK
+            elif self._waiveStrengthClicks == 1:
+                if self._pwq_error:
+                    return _(PASSWORD_WEAK_CONFIRM_WITH_ERROR) % self._pwq_error
+                else:
+                    return _(PASSWORD_WEAK_CONFIRM)
             else:
-                return _(PASSWORD_WEAK)
+                # non-strict allows done to be clicked twice
+                if self.policy.strict:
+                    done_msg = ""
+                else:
+                    done_msg = _(PASSWORD_DONE_TWICE)
+
+                if self._pwq_error:
+                    return _(PASSWORD_WEAK_WITH_ERROR) % (self._pwq_error, done_msg)
+                else:
+                    return _(PASSWORD_WEAK) % done_msg
         else:
             return InputCheck.CHECK_OK
 
@@ -601,7 +640,10 @@ def on_back_clicked(self, button):
         # If the failed check is for non-ASCII characters,
         # add a click to the counter and check again
         failed_check = next(self.failed_checks_with_message, None)
-        if failed_check == self._pwASCIICheck:
+        if not self.policy.strict and failed_check == self._pwStrengthCheck:
+            self._waiveStrengthClicks += 1
+            self._pwStrengthCheck.update_check_status()
+        elif failed_check == self._pwASCIICheck:
             self._waiveASCIIClicks += 1
             self._pwASCIICheck.update_check_status()
 


-- 
To view this commit on github, visit https://github.com/rhinstaller/anaconda/commit/684e87326da4ec7cee814596a417a4a4183e058a


More information about the anaconda-patches mailing list