|
@@ -38,20 +38,16 @@ import pwman.util.config as config
|
|
|
import re
|
|
|
import sys
|
|
|
import os
|
|
|
-import struct
|
|
|
import getpass
|
|
|
import cmd
|
|
|
# import traceback
|
|
|
import time
|
|
|
import select as uselect
|
|
|
-import subprocess as sp
|
|
|
import ast
|
|
|
from pwman.ui import tools
|
|
|
|
|
|
if sys.platform != 'win32':
|
|
|
import tty
|
|
|
- import termios
|
|
|
- import fcntl
|
|
|
|
|
|
try:
|
|
|
import readline
|
|
@@ -111,10 +107,10 @@ class PwmanCli(cmd.Cmd):
|
|
|
return ids
|
|
|
|
|
|
def get_filesystem_path(self, default=""):
|
|
|
- return getinput("Enter filename: ", default)
|
|
|
+ return tools.getinput("Enter filename: ", default)
|
|
|
|
|
|
def get_username(self, default=""):
|
|
|
- return getinput("Username: ", default)
|
|
|
+ return tools.getinput("Username: ", default)
|
|
|
|
|
|
def get_password(self, argsgiven, numerics=False, leetify=False,
|
|
|
symbols=False, special_signs=False):
|
|
@@ -125,7 +121,7 @@ class PwmanCli(cmd.Cmd):
|
|
|
special_chars -> special_signs
|
|
|
"""
|
|
|
if argsgiven == 1:
|
|
|
- length = getinput("Password length (default 7): ", "7")
|
|
|
+ length = tools.getinput("Password length (default 7): ", "7")
|
|
|
length = int(length)
|
|
|
password, dumpme = generator.generate_password(length, length,
|
|
|
True, leetify,
|
|
@@ -134,10 +130,10 @@ class PwmanCli(cmd.Cmd):
|
|
|
print "New password: %s" % (password)
|
|
|
return password
|
|
|
# no args given
|
|
|
- password = getpassword("Password (Blank to generate): ",
|
|
|
- _defaultwidth, False)
|
|
|
+ password = tools.getpassword("Password (Blank to generate): ",
|
|
|
+ tools._defaultwidth, False)
|
|
|
if len(password) == 0:
|
|
|
- length = getinput("Password length (default 7): ", "7")
|
|
|
+ length = tools.getinput("Password length (default 7): ", "7")
|
|
|
length = int(length)
|
|
|
|
|
|
(password, dumpme) = generator.generate_password(length, length,
|
|
@@ -149,10 +145,10 @@ class PwmanCli(cmd.Cmd):
|
|
|
return password
|
|
|
|
|
|
def get_url(self, default=""):
|
|
|
- return getinput("Url: ", default)
|
|
|
+ return tools.getinput("Url: ", default)
|
|
|
|
|
|
def get_notes(self, default=""):
|
|
|
- return getinput("Notes: ", default)
|
|
|
+ return tools.getinput("Notes: ", default)
|
|
|
|
|
|
def get_tags(self, default=None):
|
|
|
defaultstr = ''
|
|
@@ -179,7 +175,7 @@ class PwmanCli(cmd.Cmd):
|
|
|
else:
|
|
|
count += 1
|
|
|
|
|
|
- taglist = getinput("Tags: ", defaultstr, complete)
|
|
|
+ taglist = tools.getinput("Tags: ", defaultstr, complete)
|
|
|
tagstrings = taglist.split()
|
|
|
tags = []
|
|
|
for tn in tagstrings:
|
|
@@ -187,17 +183,17 @@ class PwmanCli(cmd.Cmd):
|
|
|
return tags
|
|
|
|
|
|
def print_node(self, node):
|
|
|
- width = str(_defaultwidth)
|
|
|
+ width = str(tools._defaultwidth)
|
|
|
print "Node %d." % (node.get_id())
|
|
|
- print ("%"+width+"s %s") % (typeset("Username:", tools.ANSI.Red),
|
|
|
+ print ("%"+width+"s %s") % (tools.typeset("Username:", tools.ANSI.Red),
|
|
|
node.get_username())
|
|
|
- print ("%"+width+"s %s") % (typeset("Password:", tools.ANSI.Red),
|
|
|
+ print ("%"+width+"s %s") % (tools.typeset("Password:", tools.ANSI.Red),
|
|
|
node.get_password())
|
|
|
- print ("%"+width+"s %s") % (typeset("Url:", tools.ANSI.Red),
|
|
|
+ print ("%"+width+"s %s") % (tools.typeset("Url:", tools.ANSI.Red),
|
|
|
node.get_url())
|
|
|
- print ("%"+width+"s %s") % (typeset("Notes:", tools.ANSI.Red),
|
|
|
+ print ("%"+width+"s %s") % (tools.typeset("Notes:", tools.ANSI.Red),
|
|
|
node.get_notes())
|
|
|
- print typeset("Tags: ", tools.ANSI.Red),
|
|
|
+ print tools.typeset("Tags: ", tools.ANSI.Red),
|
|
|
for t in node.get_tags():
|
|
|
print " %s " % t.get_name(),
|
|
|
print
|
|
@@ -326,14 +322,14 @@ class PwmanCli(cmd.Cmd):
|
|
|
args = arg.split()
|
|
|
if len(args) == 0:
|
|
|
types = importer.Importer.types()
|
|
|
- intype = select("Select filetype:", types)
|
|
|
+ intype = tools.select("Select filetype:", types)
|
|
|
imp = importer.Importer.get(intype)
|
|
|
- infile = getinput("Select file:")
|
|
|
+ infile = tools.getinput("Select file:")
|
|
|
imp.import_data(self._db, infile)
|
|
|
else:
|
|
|
for i in args:
|
|
|
types = importer.Importer.types()
|
|
|
- intype = select("Select filetype:", types)
|
|
|
+ intype = tools.select("Select filetype:", types)
|
|
|
imp = importer.Importer.get(intype)
|
|
|
imp.import_data(self._db, i)
|
|
|
except Exception, e:
|
|
@@ -344,11 +340,11 @@ class PwmanCli(cmd.Cmd):
|
|
|
nodes = self.get_ids(arg)
|
|
|
|
|
|
types = exporter.Exporter.types()
|
|
|
- ftype = select("Select filetype:", types)
|
|
|
+ ftype = tools.select("Select filetype:", types)
|
|
|
exp = exporter.Exporter.get(ftype)
|
|
|
- out_file = getinput("Select output file:")
|
|
|
+ out_file = tools.getinput("Select output file:")
|
|
|
if len(nodes) > 0:
|
|
|
- b = getyesno("Export nodes %s?" % (nodes), True)
|
|
|
+ b = tools.getyesno("Export nodes %s?" % (nodes), True)
|
|
|
if not b:
|
|
|
return
|
|
|
exp.export_data(self._db, out_file, nodes)
|
|
@@ -361,7 +357,7 @@ class PwmanCli(cmd.Cmd):
|
|
|
for t in tags:
|
|
|
tagstr += "'%s' " % (t.get_name())
|
|
|
|
|
|
- b = getyesno("Export all nodes%s?" % (tagstr), True)
|
|
|
+ b = tools.getyesno("Export all nodes%s?" % (tagstr), True)
|
|
|
if not b:
|
|
|
return
|
|
|
exp.export_data(self._db, out_file, nodes)
|
|
@@ -437,7 +433,7 @@ class PwmanCli(cmd.Cmd):
|
|
|
try:
|
|
|
nodes = self._db.getnodes(ids)
|
|
|
for n in nodes:
|
|
|
- b = getyesno("Are you sure you want to delete '%s@%s'?"
|
|
|
+ b = tools.getyesno("Are you sure you want to delete '%s@%s'?"
|
|
|
% (n.get_username(), n.get_url()), False)
|
|
|
if b is True:
|
|
|
self._db.removenodes([n])
|
|
@@ -458,7 +454,7 @@ class PwmanCli(cmd.Cmd):
|
|
|
self.do_filter(args)
|
|
|
try:
|
|
|
if sys.platform != 'win32':
|
|
|
- rows, cols = gettermsize()
|
|
|
+ rows, cols = tools.gettermsize()
|
|
|
else:
|
|
|
rows, cols = 18, 80
|
|
|
nodeids = self._db.listnodes()
|
|
@@ -485,8 +481,8 @@ class PwmanCli(cmd.Cmd):
|
|
|
tagstring = tagstring[:tagstring_len-3] + "..."
|
|
|
|
|
|
fmt = "%%5d. %%-%ds %%-%ds" % (name_len, tagstring_len)
|
|
|
- print typeset(fmt % (n.get_id(), name, tagstring),
|
|
|
- ANSI.Yellow, False)
|
|
|
+ print tools.typeset(fmt % (n.get_id(), name, tagstring),
|
|
|
+ tools.ANSI.Yellow, False)
|
|
|
i += 1
|
|
|
if i > rows-2:
|
|
|
i = 0
|
|
@@ -799,17 +795,17 @@ class PwmanCliNew(PwmanCli):
|
|
|
self.prompt = "pwman> "
|
|
|
|
|
|
def print_node(self, node):
|
|
|
- width = str(_defaultwidth)
|
|
|
+ width = str(tools._defaultwidth)
|
|
|
print "Node %d." % (node.get_id())
|
|
|
- print ("%"+width+"s %s") % (typeset("Username:", ANSI.Red),
|
|
|
+ print ("%"+width+"s %s") % (tools.typeset("Username:", tools.ANSI.Red),
|
|
|
node.get_username())
|
|
|
- print ("%"+width+"s %s") % (typeset("Password:", ANSI.Red),
|
|
|
+ print ("%"+width+"s %s") % (tools.typeset("Password:", tools.ANSI.Red),
|
|
|
node.get_password())
|
|
|
- print ("%"+width+"s %s") % (typeset("Url:", tools.ANSI.Red),
|
|
|
+ print ("%"+width+"s %s") % (tools.typeset("Url:", tools.ANSI.Red),
|
|
|
node.get_url())
|
|
|
- print ("%"+width+"s %s") % (typeset("Notes:", tools.ANSI.Red),
|
|
|
+ print ("%"+width+"s %s") % (tools.typeset("Notes:", tools.ANSI.Red),
|
|
|
node.get_notes())
|
|
|
- print typeset("Tags: ", tools.ANSI.Red),
|
|
|
+ print tools.typeset("Tags: ", tools.ANSI.Red),
|
|
|
for t in node.get_tags():
|
|
|
print " %s " % t
|
|
|
print
|
|
@@ -888,7 +884,7 @@ class PwmanCliNew(PwmanCli):
|
|
|
else:
|
|
|
count += 1
|
|
|
|
|
|
- taglist = getinput("Tags: ", defaultstr, complete)
|
|
|
+ taglist = tools.getinput("Tags: ", defaultstr, complete)
|
|
|
tagstrings = taglist.split()
|
|
|
tags = []
|
|
|
for tn in tagstrings:
|
|
@@ -902,7 +898,7 @@ class PwmanCliNew(PwmanCli):
|
|
|
self.do_filter(args)
|
|
|
try:
|
|
|
if sys.platform != 'win32':
|
|
|
- rows, cols = gettermsize()
|
|
|
+ rows, cols = tools.gettermsize()
|
|
|
else:
|
|
|
rows, cols = 18, 80 # fix this !
|
|
|
nodeids = self._db.listnodes()
|
|
@@ -930,7 +926,7 @@ class PwmanCliNew(PwmanCli):
|
|
|
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),
|
|
|
+ formatted_entry = tools.typeset(fmt % (n.get_id(), name, tagstring),
|
|
|
tools.ANSI.Yellow, False)
|
|
|
print formatted_entry
|
|
|
i += 1
|
|
@@ -1016,7 +1012,7 @@ class PwmanCliNew(PwmanCli):
|
|
|
except Exception, e:
|
|
|
self.error(e)
|
|
|
|
|
|
-
|
|
|
+# pylint: disable=R0904
|
|
|
class PwmanCliMac(PwmanCli):
|
|
|
"""
|
|
|
inherit from PwmanCli, override the right functions...
|
|
@@ -1080,10 +1076,8 @@ class PwmanCliMac(PwmanCli):
|
|
|
class PwmanCliMacNew(PwmanCliMac):
|
|
|
pass
|
|
|
|
|
|
-_defaultwidth = 10
|
|
|
-
|
|
|
|
|
|
-def getonechar(question, width=_defaultwidth):
|
|
|
+def getonechar(question, width=tools._defaultwidth):
|
|
|
question = "%s " % (question)
|
|
|
print question.ljust(width),
|
|
|
sys.stdout.flush()
|
|
@@ -1099,68 +1093,6 @@ def getonechar(question, width=_defaultwidth):
|
|
|
return ch
|
|
|
|
|
|
|
|
|
-def getyesno(question, defaultyes=False, width=_defaultwidth):
|
|
|
- if (defaultyes):
|
|
|
- default = "[Y/n]"
|
|
|
- else:
|
|
|
- default = "[y/N]"
|
|
|
- ch = getonechar("%s %s" % (question, default), width)
|
|
|
- if (ch == '\n'):
|
|
|
- if (defaultyes):
|
|
|
- return True
|
|
|
- else:
|
|
|
- return False
|
|
|
- elif (ch == 'y' or ch == 'Y'):
|
|
|
- return True
|
|
|
- elif (ch == 'n' or ch == 'N'):
|
|
|
- return False
|
|
|
- else:
|
|
|
- return getyesno(question, defaultyes, width)
|
|
|
-
|
|
|
-
|
|
|
-def gettermsize():
|
|
|
- s = struct.pack("HHHH", 0, 0, 0, 0)
|
|
|
- f = sys.stdout.fileno()
|
|
|
- x = fcntl.ioctl(f, termios.TIOCGWINSZ, s)
|
|
|
- rows, cols, width, height = struct.unpack("HHHH", x)
|
|
|
- return rows, cols
|
|
|
-
|
|
|
-
|
|
|
-def getinput(question, default="", completer=None, width=_defaultwidth):
|
|
|
- if (not _readline_available):
|
|
|
- return raw_input(question.ljust(width))
|
|
|
- else:
|
|
|
- def defaulter():
|
|
|
- """define default behavior startup"""
|
|
|
- readline.insert_text(default)
|
|
|
-
|
|
|
- readline.set_startup_hook(defaulter)
|
|
|
- oldcompleter = readline.get_completer()
|
|
|
- readline.set_completer(completer)
|
|
|
-
|
|
|
- x = raw_input(question.ljust(width))
|
|
|
-
|
|
|
- readline.set_completer(oldcompleter)
|
|
|
- readline.set_startup_hook()
|
|
|
- return x
|
|
|
-
|
|
|
-
|
|
|
-def getpassword(question, width=_defaultwidth, echo=False):
|
|
|
- if echo:
|
|
|
- print question.ljust(width),
|
|
|
- return sys.stdin.readline().rstrip()
|
|
|
- else:
|
|
|
- while 1:
|
|
|
- a1 = getpass.getpass(question.ljust(width))
|
|
|
- if len(a1) == 0:
|
|
|
- return a1
|
|
|
- a2 = getpass.getpass("[Repeat] %s" % (question.ljust(width)))
|
|
|
- if a1 == a2:
|
|
|
- return a1
|
|
|
- else:
|
|
|
- print "Passwords don't match. Try again."
|
|
|
-
|
|
|
-
|
|
|
class CliMenu(object):
|
|
|
def __init__(self):
|
|
|
self.items = []
|
|
@@ -1184,8 +1116,9 @@ class CliMenu(object):
|
|
|
else:
|
|
|
currentstr = current
|
|
|
|
|
|
- print ("%d - %-"+str(_defaultwidth)+"s %s") % (i, x.name+":",
|
|
|
- currentstr)
|
|
|
+ print ("%d - %-"+str(tools._defaultwidth)+\
|
|
|
+ "s %s") % (i, x.name+":",
|
|
|
+ currentstr)
|
|
|
print "%c - Finish editing" % ('X')
|
|
|
option = getonechar("Enter your choice:")
|
|
|
try:
|
|
@@ -1201,7 +1134,6 @@ class CliMenu(object):
|
|
|
else:
|
|
|
edit = self.items[selection].getter()
|
|
|
value = self.items[selection].editor(edit)
|
|
|
-
|
|
|
self.items[selection].setter(value)
|
|
|
except (ValueError, IndexError):
|
|
|
if (option.upper() == 'X'):
|