|
@@ -27,6 +27,7 @@ import pwman.exchange.importer as importer
|
|
|
import pwman.exchange.exporter as exporter
|
|
|
import pwman.util.generator as generator
|
|
|
from pwman.data.nodes import Node
|
|
|
+from pwman.data.nodes import NewNode
|
|
|
from pwman.data.tags import Tag
|
|
|
from pwman.util.crypto import CryptoEngine
|
|
|
#, CryptoBadKeyException, \
|
|
@@ -738,8 +739,142 @@ pwman> n {'leetify':False, 'numerics':True}"""
|
|
|
|
|
|
|
|
|
class PwmanCliNew(PwmanCli):
|
|
|
- pass
|
|
|
-
|
|
|
+ """
|
|
|
+ inherit from the old class, override
|
|
|
+ all the methods related to tags, and
|
|
|
+ newer Node format, so backward compatability is kept...
|
|
|
+ """
|
|
|
+ def do_tags(self, arg):
|
|
|
+ tags = self._db.listtags()
|
|
|
+ if len(tags) > 0:
|
|
|
+ tags[0].get_name() # hack to get password request before output
|
|
|
+ print "Tags: ",
|
|
|
+ if len(tags) == 0:
|
|
|
+ print "None",
|
|
|
+ for t in tags:
|
|
|
+ print "%s " % (t.get_name()),
|
|
|
+ print
|
|
|
+
|
|
|
+ def get_tags(self, default=None):
|
|
|
+ defaultstr = ''
|
|
|
+
|
|
|
+ if default:
|
|
|
+ for t in default:
|
|
|
+ defaultstr += "%s " % (t.get_name())
|
|
|
+ else:
|
|
|
+ tags = self._db.currenttags()
|
|
|
+ for t in tags:
|
|
|
+ defaultstr += "%s " % (t.get_name())
|
|
|
+
|
|
|
+ strings = []
|
|
|
+ tags = self._db.listtags(True)
|
|
|
+ for t in tags:
|
|
|
+ strings.append(t.get_name())
|
|
|
+
|
|
|
+ def complete(text, state):
|
|
|
+ count = 0
|
|
|
+ for s in strings:
|
|
|
+ if s.startswith(text):
|
|
|
+ if count == state:
|
|
|
+ return s
|
|
|
+ else:
|
|
|
+ count += 1
|
|
|
+
|
|
|
+ taglist = getinput("Tags: ", defaultstr, complete)
|
|
|
+ tagstrings = taglist.split()
|
|
|
+ tags = []
|
|
|
+ for tn in tagstrings:
|
|
|
+ _Tag = Tag(tn)
|
|
|
+ tags.append(_Tag)
|
|
|
+ return tags
|
|
|
+
|
|
|
+ def do_list(self, args):
|
|
|
+ import ipdb
|
|
|
+ ipdb.set_trace()
|
|
|
+ if len(args.split()) > 0:
|
|
|
+ self.do_clear('')
|
|
|
+ self.do_filter(args)
|
|
|
+ try:
|
|
|
+ if sys.platform != 'win32':
|
|
|
+ rows, cols = gettermsize()
|
|
|
+ else:
|
|
|
+ rows, cols = 18, 80 # fix this !
|
|
|
+ nodeids = self._db.listnodes()
|
|
|
+ nodes = self._db.getnodes(nodeids)
|
|
|
+ cols -= 8
|
|
|
+ i = 0
|
|
|
+ for n in nodes:
|
|
|
+ tags = n.get_tags()
|
|
|
+ tagstring = ''
|
|
|
+ first = True
|
|
|
+ for t in tags:
|
|
|
+ if not first:
|
|
|
+ tagstring += ", "
|
|
|
+ else:
|
|
|
+ first = False
|
|
|
+ tagstring += t
|
|
|
+
|
|
|
+ name = "%s@%s" % (n.get_username(), n.get_url())
|
|
|
+
|
|
|
+ name_len = cols * 2 / 3
|
|
|
+ tagstring_len = cols / 3
|
|
|
+ if len(name) > name_len:
|
|
|
+ name = name[:name_len-3] + "..."
|
|
|
+ if len(tagstring) > tagstring_len:
|
|
|
+ tagstring = tagstring[:tagstring_len-3] + "..."
|
|
|
+ fmt = "%%5d. %%-%ds %%-%ds" % (name_len, tagstring_len)
|
|
|
+ formatted_entry = typeset(fmt % (n.get_id(), name, tagstring),
|
|
|
+ ANSI.Yellow, False)
|
|
|
+ print formatted_entry
|
|
|
+ i += 1
|
|
|
+ if i > rows-2:
|
|
|
+ i = 0
|
|
|
+ c = getonechar("Press <Space> for more, or 'Q' to cancel")
|
|
|
+ if c == 'q':
|
|
|
+ break
|
|
|
+
|
|
|
+ except Exception, e:
|
|
|
+ self.error(e)
|
|
|
+
|
|
|
+ def do_new(self, args):
|
|
|
+ """
|
|
|
+ can override default config settings the following way:
|
|
|
+ Pwman3 0.2.1 (c) visit: http://github.com/pwman3/pwman3
|
|
|
+ pwman> n {'leetify':False, 'numerics':True, 'special_chars':True}
|
|
|
+ Password (Blank to generate):
|
|
|
+ """
|
|
|
+ errmsg = """could not parse config override, please input some"""\
|
|
|
+ +""" kind of dictionary, e.g.: n {'leetify':False, """\
|
|
|
+ +"""'numerics':True, 'special_chars':True}"""
|
|
|
+ try:
|
|
|
+ username = self.get_username()
|
|
|
+ if args:
|
|
|
+ try:
|
|
|
+ args = ast.literal_eval(args)
|
|
|
+ except Exception:
|
|
|
+ raise Exception(errmsg)
|
|
|
+ if not isinstance(args, dict):
|
|
|
+ raise Exception(errmsg)
|
|
|
+ password = self.get_password(1, **args)
|
|
|
+ else:
|
|
|
+ numerics = config.get_value("Generator", "numerics").lower() == 'true'
|
|
|
+ # TODO: allow custom leetifying through the config
|
|
|
+ leetify = config.get_value("Generator", "leetify").lower() == 'true'
|
|
|
+ special_chars = config.get_value("Generator", "special_chars").lower() == 'true'
|
|
|
+ password = self.get_password(0,
|
|
|
+ numerics=numerics,
|
|
|
+ symbols=leetify,
|
|
|
+ special_signs=special_chars)
|
|
|
+ url = self.get_url()
|
|
|
+ notes = self.get_notes()
|
|
|
+ node = NewNode(username, password, url, notes)
|
|
|
+ tags = self.get_tags()
|
|
|
+ node.set_tags(tags)
|
|
|
+ self._db.addnodes([node])
|
|
|
+ print "Password ID: %d" % (node.get_id())
|
|
|
+ except Exception, e:
|
|
|
+ self.error(e)
|
|
|
+
|
|
|
class PwmanCliMac(PwmanCli):
|
|
|
"""
|
|
|
inherit from PwmanCli, override the right functions...
|