Răsfoiți Sursa

Fix bug in editing password

oz123 10 ani în urmă
părinte
comite
c34c3813ce
3 a modificat fișierele cu 59 adăugiri și 42 ștergeri
  1. 13 1
      pwman/tests/test_base_ui.py
  2. 33 34
      pwman/ui/baseui.py
  3. 13 7
      pwman/ui/tools.py

+ 13 - 1
pwman/tests/test_base_ui.py

@@ -143,7 +143,7 @@ class TestBaseUI(unittest.TestCase):
         self.assertListEqual([], self.tester.cli._get_ids('5x'))
         self.assertListEqual([], self.tester.cli._get_ids('5\\'))
 
-    def test_8_do_edit(self):
+    def test_8_do_edit_1(self):
         node = self.tester.cli._db.getnodes([1])[0]
         node = node[1:5] + [node[5:]]
         node = Node.from_encrypted_entries(*node)
@@ -155,6 +155,18 @@ class TestBaseUI(unittest.TestCase):
         self.tester.cli.do_print('1')
         self.assertIn('\x1b[31mUsername:\x1b[0m foo', v.getvalue())
 
+    def test_8_do_edit_2(self):
+        node = self.tester.cli._db.getnodes([1])[0]
+        node = node[1:5] + [node[5:]]
+        node = Node.from_encrypted_entries(*node)
+        sys.stdin = StringIO(("2\ns3kr3t\nx\n"))
+        self.tester.cli.do_edit('1')
+        v = StringIO()
+        sys.stdin = sys.__stdin__
+        sys.stdout = v
+        self.tester.cli.do_print('1')
+        self.assertIn('\x1b[31mPassword:\x1b[0m s3kr3t', v.getvalue())
+
     def test_9_do_delete(self):
         self.assertIsNone(self.tester.cli._do_rm('x'))
         sys.stdin = StringIO("y\n")

+ 33 - 34
pwman/ui/baseui.py

@@ -158,6 +158,9 @@ class AliasesMixin(object):  # pragma: no cover
     def do_o(self, args):
         self.do_open(args)
 
+    def do_e(self, args):
+        self.do_edit(args)
+
     def do_h(self, arg):
         self.do_help(arg)
 
@@ -361,40 +364,36 @@ class BaseCommands(HelpUIMixin, AliasesMixin):
     def do_edit(self, args, menu=None):
         ids = self._get_ids(args)
         for i in ids:
-            try:
-                i = int(i)
-                node = self._db.getnodes([i])[0]
-                node = node[1:5] + [node[5:]]
-                node = Node.from_encrypted_entries(*node)
-
-                if not menu:
-                    menu = CMDLoop()
-                    print ("Editing node %d." % (i))
-
-                    menu.add(CliMenuItem("Username",
-                                         self._get_input,
-                                         node.username,
-                                         node.username))
-                    menu.add(CliMenuItem("Password", self._get_secret,
-                                         node.password,
-                                         node.password))
-                    menu.add(CliMenuItem("Url", self._get_input,
-                                         node.url,
-                                         node.url))
-                    menunotes = CliMenuItem("Notes", self._get_input,
-                                            node.notes,
-                                            node.notes)
-                    menu.add(menunotes)
-                    tgetter = lambda: ', '.join(t for t in node.tags)
-                    menu.add(CliMenuItem("Tags", self._get_input,
-                                         tgetter(),
-                                         node.tags))
-                menu.run(node)
-                self._db.editnode(i, **node.to_encdict())
-                # when done with node erase it
-                zerome(node._password)
-            except Exception as e:  # pragma: no cover
-                self.error(e)
+            i = int(i)
+            node = self._db.getnodes([i])[0]
+            node = node[1:5] + [node[5:]]
+            node = Node.from_encrypted_entries(*node)
+            if not menu:
+                menu = CMDLoop(self.config)
+                print ("Editing node %d." % (i))
+
+                menu.add(CliMenuItem("Username",
+                                     self._get_input,
+                                     node.username,
+                                     node.username))
+                menu.add(CliMenuItem("Password", self._get_secret,
+                                     node.password,
+                                     node.password))
+                menu.add(CliMenuItem("Url", self._get_input,
+                                     node.url,
+                                     node.url))
+                menunotes = CliMenuItem("Notes", self._get_input,
+                                        node.notes,
+                                        node.notes)
+                menu.add(menunotes)
+                tgetter = lambda: ', '.join(t for t in node.tags)
+                menu.add(CliMenuItem("Tags", self._get_input,
+                                     tgetter(),
+                                     node.tags))
+            menu.run(node)
+            self._db.editnode(i, **node.to_encdict())
+            # when done with node erase it
+            zerome(node._password)
 
     def do_list(self, args):
         """

+ 13 - 7
pwman/ui/tools.py

@@ -24,9 +24,8 @@ import subprocess as sp
 import getpass
 import sys
 import struct
-import os
 import colorama
-from pwman.util.config import get_pass_conf
+#from pwman.util.config import get_pass_conf
 from pwman.util.callback import Callback
 
 if sys.version_info.major > 2:  # pragma: no cover
@@ -138,6 +137,15 @@ def open_url(link, macosx=False):  # pragma: no cover
         print("Executing open_url failed with:\n", e)
 
 
+def get_password(question, config):
+    # TODO: enable old functionallity, with password generator.
+    if sys.stdin.isatty():  # pragma: no cover
+        p = getpass.getpass()
+    else:
+        p = sys.stdin.readline().rstrip()
+    return p
+
+
 def getpassword(question, argsgiven=None,
                 width=_defaultwidth, echo=False,
                 reader=getpass.getpass, numerics=False, leetify=False,
@@ -227,8 +235,9 @@ class CMDLoop(object):  # pragma: no cover
     The menu that drives editing of a node
     """
 
-    def __init__(self):
+    def __init__(self, config):
         self.items = []
+        self.config = config
 
     def add(self, item):
         if (isinstance(item, CliMenuItem)):
@@ -257,10 +266,7 @@ class CMDLoop(object):  # pragma: no cover
                     self.items[0].getter = new_node.username
                     self.items[0].setter = new_node.username
                 elif selection == 1:  # for password
-                    numerics, leet, s_chars = get_pass_conf()
-                    new_node.password = getpassword(
-                        'New Password:', numerics=numerics, leetify=leet,
-                        special_signs=s_chars)
+                    new_node.password = get_password("Password:", self.config)
                     self.items[1].getter = new_node.password
                     self.items[1].setter = new_node.password
                 elif selection == 2: