From fa751a207ecef660821b2b8999802748acc6be1a Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Thu, 7 Oct 2021 22:27:55 -0500 Subject: [PATCH] Add password quality --- conf.py | 8 ++--- files/ZAZPass_v0.1.0.oxt | Bin 64993 -> 65175 bytes source/description.xml | 4 +-- source/description/desc_en.txt | 2 +- source/description/desc_es.txt | 2 +- source/pythonpath/zpass.py | 53 +++++++++++++++++++++++++++++---- 6 files changed, 55 insertions(+), 14 deletions(-) diff --git a/conf.py b/conf.py index 1e03e95..34f1758 100644 --- a/conf.py +++ b/conf.py @@ -79,13 +79,13 @@ LICENSE_ES = LICENSE_EN INFO = { 'en': { - 'display_name': 'My first extension', - 'description': 'My great extension', + 'display_name': 'ZAZ Pass', + 'description': 'Generate passwords', 'license': LICENSE_EN, }, 'es': { - 'display_name': 'Mi primer extensión', - 'description': 'Mi gran extensión', + 'display_name': 'ZAZ Pass', + 'description': 'Generar contraseñas', 'license': LICENSE_ES, }, } diff --git a/files/ZAZPass_v0.1.0.oxt b/files/ZAZPass_v0.1.0.oxt index 615ce34aa60b6ec1a8b4ccf0d4b0421ac94bf198..120611bf6c33d3168caec43424307be2dfef42ff 100644 GIT binary patch delta 3012 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 XiNb;yH0xmoVyXy%Acs}^7PI>gy3I3` diff --git a/source/description.xml b/source/description.xml index a79f4d3..bd624cf 100644 --- a/source/description.xml +++ b/source/description.xml @@ -3,8 +3,8 @@ - My first extension - Mi primer extensión + ZAZ Pass + ZAZ Pass diff --git a/source/description/desc_en.txt b/source/description/desc_en.txt index b667a4b..8df5af8 100644 --- a/source/description/desc_en.txt +++ b/source/description/desc_en.txt @@ -1 +1 @@ -My great extension \ No newline at end of file +Generate passwords \ No newline at end of file diff --git a/source/description/desc_es.txt b/source/description/desc_es.txt index d8d8fdc..362f8b2 100644 --- a/source/description/desc_es.txt +++ b/source/description/desc_es.txt @@ -1 +1 @@ -Mi gran extensión \ No newline at end of file +Generar contraseñas \ No newline at end of file diff --git a/source/pythonpath/zpass.py b/source/pythonpath/zpass.py index 49fc150..a0e0659 100644 --- a/source/pythonpath/zpass.py +++ b/source/pythonpath/zpass.py @@ -100,6 +100,16 @@ def _password_copy(): return +def _get_quality(strength): + if strength <= 0.33: + quality = _('Week') + elif strength <= 0.66: + quality = _('Medium') + else: + quality = _('Excellent') + return quality + + def _password_generate(id_extension): config = app.get_config('setting', prefix=PREFIX) dialog = _create_dialog(id_extension) @@ -121,7 +131,9 @@ def _password_generate(id_extension): dialog.chk_punctuation.value = punctuation dialog.txt_length.value = length - dialog.txt_password.value = _generate(dialog) + stats = PasswordStats(_generate(dialog)) + dialog.txt_password.value = stats.password + dialog.lbl_quality.value = _get_quality(stats.strength()) dialog.open() return @@ -171,6 +183,7 @@ class Controllers(object): def _new_password(self, save=True): stats = PasswordStats(_generate(self.d)) self.d.txt_password.value = stats.password + self.d.lbl_quality.value = _get_quality(stats.strength()) if save: self._save_config() return @@ -203,13 +216,14 @@ class Controllers(object): @app.catch_exception def _create_dialog(id_extension): BUTTON_WH = 16 + CHK_HEIGHT = 10 CHK_WIDTH = 25 attr = dict( Name = 'Dialog', Title = _('Generate Password'), Width = 200, - Height = 100, + Height = 120, ) dialog = app.create_dialog(attr) dialog.id = id_extension @@ -266,7 +280,7 @@ def _create_dialog(id_extension): Spin = True, Value = 25, ValueStep = 1, - ValueMin = 10, + ValueMin = 5, ValueMax = 100, ) dialog.add_control(attr) @@ -276,7 +290,7 @@ def _create_dialog(id_extension): Name = 'chk_letters', Label = 'A-Z', Width = CHK_WIDTH, - Height = BUTTON_WH, + Height = CHK_HEIGHT, ) dialog.add_control(attr) @@ -285,7 +299,7 @@ def _create_dialog(id_extension): Name = 'chk_letters2', Label = 'a-z', Width = CHK_WIDTH, - Height = BUTTON_WH, + Height = CHK_HEIGHT, ) dialog.add_control(attr) @@ -294,7 +308,7 @@ def _create_dialog(id_extension): Name = 'chk_digits', Label = '0-9', Width = CHK_WIDTH, - Height = BUTTON_WH, + Height = CHK_HEIGHT, ) dialog.add_control(attr) @@ -303,7 +317,31 @@ def _create_dialog(id_extension): Name = 'chk_punctuation', Label = string.punctuation, Width = CHK_WIDTH * 4, + Height = CHK_HEIGHT, + ) + dialog.add_control(attr) + + attr = dict( + Type = 'Label', + Name = 'lbl_title_quality', + Label = _('Password Quality:'), + Width = 75, Height = BUTTON_WH, + Border = app.Border.BORDER, + Align = app.RIGHT, + VerticalAlign = app.MIDDLE, + ) + dialog.add_control(attr) + + attr = dict( + Type = 'Label', + Name = 'lbl_quality', + Label = _('Poor'), + Width = 35, + Height = BUTTON_WH, + Border = app.Border.BORDER, + Align = app.CENTER, + VerticalAlign = app.MIDDLE, ) dialog.add_control(attr) @@ -338,6 +376,9 @@ def _create_dialog(id_extension): dialog.chk_digits.move(dialog.chk_letters2, x=3, y=0) dialog.chk_punctuation.move(dialog.chk_digits, x=3, y=0) + dialog.lbl_title_quality.move(dialog.chk_letters) + dialog.lbl_quality.move(dialog.lbl_title_quality, x=3, y=0) + dialog.center(dialog.cmd_insert, y=-5) dialog.center(dialog.cmd_close, y=-5) dialog.center((dialog.cmd_close, dialog.cmd_insert))