uui/source/masterpasscrtdlg.cxx         |   25 ++++++++++++++++++
 uui/source/masterpasscrtdlg.hxx         |    2 +
 uui/uiconfig/ui/setmasterpassworddlg.ui |   44 ++++++++++++++++++++++++++------
 3 files changed, 64 insertions(+), 7 deletions(-)

New commits:
commit fed7b3068dcea2ebf65314c4f212350720631706
Author:     Sarper Akdemir <sarper.akdemir.ext...@allotropia.de>
AuthorDate: Mon Nov 13 17:19:01 2023 +0300
Commit:     Sarper Akdemir <sarper.akdemir.ext...@allotropia.de>
CommitDate: Wed Nov 15 22:02:16 2023 +0100

    tdf#157518: enforce password policy on setmasterpassworddlg
    
    Change-Id: I7e7adde8f0d55808d16dc9247954a7645a1d3601
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159384
    Tested-by: Jenkins
    Reviewed-by: Sarper Akdemir <sarper.akdemir.ext...@allotropia.de>

diff --git a/uui/source/masterpasscrtdlg.cxx b/uui/source/masterpasscrtdlg.cxx
index 2216ea5a1d48..f0c456365646 100644
--- a/uui/source/masterpasscrtdlg.cxx
+++ b/uui/source/masterpasscrtdlg.cxx
@@ -17,6 +17,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <officecfg/Office/Common.hxx>
 #include <unotools/resmgr.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/weld.hxx>
@@ -33,10 +34,27 @@ IMPL_LINK_NOARG(MasterPasswordCreateDialog, EditHdl_Impl, 
weld::Entry&, void)
     m_xOKBtn->set_sensitive(aPasswordText.getLength() >= 1);
     m_xPasswdStrengthBar->set_percentage(
         SvPasswordHelper::GetPasswordStrengthPercentage(aPasswordText));
+
+    if(m_oPasswordPolicy)
+    {
+        bool bPasswordMeetsPolicy
+            = SvPasswordHelper::PasswordMeetsPolicy(aPasswordText, 
m_oPasswordPolicy);
+        m_xEDMasterPasswordCrt->set_message_type(bPasswordMeetsPolicy ? 
weld::EntryMessageType::Normal
+                                                 : 
weld::EntryMessageType::Error);
+        m_xPasswordPolicyLabel->set_visible(!bPasswordMeetsPolicy);
+    }
 }
 
 IMPL_LINK_NOARG(MasterPasswordCreateDialog, OKHdl_Impl, weld::Button&, void)
 {
+    if (m_oPasswordPolicy
+        && 
!SvPasswordHelper::PasswordMeetsPolicy(m_xEDMasterPasswordCrt->get_text(),
+                                                  m_oPasswordPolicy))
+    {
+        m_xEDMasterPasswordCrt->grab_focus();
+        return;
+    }
+
     // compare both passwords and show message box if there are not equal!!
     if (m_xEDMasterPasswordCrt->get_text() == 
m_xEDMasterPasswordRepeat->get_text())
         m_xDialog->response(RET_OK);
@@ -57,13 +75,20 @@ 
MasterPasswordCreateDialog::MasterPasswordCreateDialog(weld::Window* pParent, co
     : GenericDialogController(pParent, "uui/ui/setmasterpassworddlg.ui", 
"SetMasterPasswordDialog")
     , rResLocale(rLocale)
     , m_xEDMasterPasswordCrt(m_xBuilder->weld_entry("password1"))
+    , m_xPasswordPolicyLabel(m_xBuilder->weld_label("passpolicylabel"))
     , m_xEDMasterPasswordRepeat(m_xBuilder->weld_entry("password2"))
     , m_xOKBtn(m_xBuilder->weld_button("ok"))
     , m_xPasswdStrengthBar(m_xBuilder->weld_level_bar("password1levelbar"))
+    , 
m_oPasswordPolicy(officecfg::Office::Common::Security::Scripting::PasswordPolicy::get())
 {
     m_xOKBtn->set_sensitive(false);
     m_xOKBtn->connect_clicked( LINK( this, MasterPasswordCreateDialog, 
OKHdl_Impl ) );
     m_xEDMasterPasswordCrt->connect_changed( LINK( this, 
MasterPasswordCreateDialog, EditHdl_Impl ) );
+    if (m_oPasswordPolicy)
+    {
+        m_xPasswordPolicyLabel->set_label(
+            
officecfg::Office::Common::Security::Scripting::PasswordPolicyErrorMessage::get());
+    }
 }
 
 MasterPasswordCreateDialog::~MasterPasswordCreateDialog()
diff --git a/uui/source/masterpasscrtdlg.hxx b/uui/source/masterpasscrtdlg.hxx
index f7f01cda79cc..83f981190bb1 100644
--- a/uui/source/masterpasscrtdlg.hxx
+++ b/uui/source/masterpasscrtdlg.hxx
@@ -27,9 +27,11 @@ private:
     const std::locale& rResLocale;
 
     std::unique_ptr<weld::Entry> m_xEDMasterPasswordCrt;
+    std::unique_ptr<weld::Label> m_xPasswordPolicyLabel;
     std::unique_ptr<weld::Entry> m_xEDMasterPasswordRepeat;
     std::unique_ptr<weld::Button> m_xOKBtn;
     std::unique_ptr<weld::LevelBar> m_xPasswdStrengthBar;
+    std::optional<OUString> m_oPasswordPolicy;
 
     DECL_LINK(OKHdl_Impl, weld::Button&, void);
     DECL_LINK(EditHdl_Impl, weld::Entry&, void);
diff --git a/uui/uiconfig/ui/setmasterpassworddlg.ui 
b/uui/uiconfig/ui/setmasterpassworddlg.ui
index 52cec48eb30a..1fd06e0e5c57 100644
--- a/uui/uiconfig/ui/setmasterpassworddlg.ui
+++ b/uui/uiconfig/ui/setmasterpassworddlg.ui
@@ -95,14 +95,43 @@
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label2">
+              <!-- n-columns=2 n-rows=1 -->
+              <object class="GtkGrid">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="margin_top">6</property>
-                <property name="label" translatable="yes" 
context="setmasterpassworddlg|label2">_Enter password:</property>
-                <property name="use_underline">True</property>
-                <property name="mnemonic_widget">password1</property>
-                <property name="xalign">0</property>
+                <property name="can-focus">False</property>
+                <property name="column-spacing">12</property>
+                <property name="baseline-row">1</property>
+                <child>
+                  <object class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="can-focus">False</property>
+                    <property name="valign">end</property>
+                    <property name="margin-top">6</property>
+                    <property name="vexpand">True</property>
+                    <property name="label" translatable="yes" 
context="setmasterpassworddlg|label2">_Enter password:</property>
+                    <property name="use-underline">True</property>
+                    <property name="mnemonic-widget">password1</property>
+                    <property name="xalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="left-attach">0</property>
+                    <property name="top-attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="passpolicylabel">
+                    <property name="can-focus">False</property>
+                    <property name="no-show-all">True</property>
+                    <property name="halign">end</property>
+                    <property name="margin-top">6</property>
+                    <property name="hexpand">True</property>
+                    <property name="wrap">True</property>
+                  </object>
+                  <packing>
+                    <property name="left-attach">1</property>
+                    <property name="top-attach">0</property>
+                  </packing>
+                </child>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -133,6 +162,7 @@
               <object class="GtkLevelBar" id="password1levelbar">
                 <property name="visible">True</property>
                 <property name="can-focus">False</property>
+                <property name="tooltip-text" translatable="yes" 
context="setmasterpassworddlg|password1levelbar">Bar that displays password 
strength visually.</property>
               </object>
               <packing>
                 <property name="expand">False</property>

Reply via email to