|  | @@ -21,20 +21,16 @@
 | 
	
		
			
				|  |  |  Define the base CLI interface for pwman3
 | 
	
		
			
				|  |  |  """
 | 
	
		
			
				|  |  |  from __future__ import print_function
 | 
	
		
			
				|  |  | -from pwman.util.crypto_engine import CryptoEngine, zerome
 | 
	
		
			
				|  |  | +from pwman.util.crypto_engine import zerome
 | 
	
		
			
				|  |  |  import re
 | 
	
		
			
				|  |  |  import sys
 | 
	
		
			
				|  |  | -import os
 | 
	
		
			
				|  |  |  import time
 | 
	
		
			
				|  |  |  import select as uselect
 | 
	
		
			
				|  |  | -import ast
 | 
	
		
			
				|  |  |  from pwman.ui import tools
 | 
	
		
			
				|  |  |  from pwman.ui.tools import CliMenuItem
 | 
	
		
			
				|  |  |  from colorama import Fore
 | 
	
		
			
				|  |  |  from pwman.ui.tools import CMDLoop
 | 
	
		
			
				|  |  |  import getpass
 | 
	
		
			
				|  |  | -from pwman.data.tags import TagNew
 | 
	
		
			
				|  |  | -import csv
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  if sys.version_info.major > 2:
 | 
	
		
			
				|  |  |      raw_input = input
 | 
	
	
		
			
				|  | @@ -170,11 +166,6 @@ class BaseCommands(HelpUI):
 | 
	
		
			
				|  |  |      You can define the aliases here too, but it makes
 | 
	
		
			
				|  |  |      the class code really long and unclear.
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  | -    def error(self, exception):
 | 
	
		
			
				|  |  | -        if (isinstance(exception, KeyboardInterrupt)):
 | 
	
		
			
				|  |  | -            print('')
 | 
	
		
			
				|  |  | -        else:
 | 
	
		
			
				|  |  | -            print("Error: {0} ".format(exception))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def do_copy(self, args):
 | 
	
		
			
				|  |  |          if self.hasxsel:
 | 
	
	
		
			
				|  | @@ -196,51 +187,6 @@ class BaseCommands(HelpUI):
 | 
	
		
			
				|  |  |          else:
 | 
	
		
			
				|  |  |              print ("Can't copy to clipboard, no xsel found in the system!")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def do_exit(self, args):
 | 
	
		
			
				|  |  | -        """exit the ui"""
 | 
	
		
			
				|  |  | -        self._db.close()
 | 
	
		
			
				|  |  | -        return True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def do_export(self, args):
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            args = ast.literal_eval(args)
 | 
	
		
			
				|  |  | -        except Exception:
 | 
	
		
			
				|  |  | -            args = {}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        filename = args.get('filename', 'pwman-export.csv')
 | 
	
		
			
				|  |  | -        delim = args.get('delimiter', ';')
 | 
	
		
			
				|  |  | -        nodeids = self._db.listnodes()
 | 
	
		
			
				|  |  | -        nodes = self._db.getnodes(nodeids)
 | 
	
		
			
				|  |  | -        with open(filename, 'w') as csvfile:
 | 
	
		
			
				|  |  | -            writer = csv.writer(csvfile, delimiter=delim)
 | 
	
		
			
				|  |  | -            writer.writerow(['Username', 'URL', 'Password', 'Notes',
 | 
	
		
			
				|  |  | -                             'Tags'])
 | 
	
		
			
				|  |  | -            for n in nodes:
 | 
	
		
			
				|  |  | -                tags = n.tags
 | 
	
		
			
				|  |  | -                tags = filter(None, tags)
 | 
	
		
			
				|  |  | -                tags = ','.join(t.strip() for t in tags)
 | 
	
		
			
				|  |  | -                writer.writerow([n.username, n.url, n.password, n.notes,
 | 
	
		
			
				|  |  | -                                 tags])
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        print("Successfuly exported database to {}".format(
 | 
	
		
			
				|  |  | -            os.path.join(os.getcwd(), filename)))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def do_forget(self, args):
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            enc = CryptoEngine.get()
 | 
	
		
			
				|  |  | -            enc.forget()
 | 
	
		
			
				|  |  | -        except Exception as e:
 | 
	
		
			
				|  |  | -            self.error(e)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def get_username(self, default="", reader=raw_input):
 | 
	
		
			
				|  |  | -        return tools.getinput("Username: ", default, reader)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def get_url(self, default="", reader=raw_input):
 | 
	
		
			
				|  |  | -        return tools.getinput("Url: ", default, reader)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def get_notes(self, default="", reader=raw_input):
 | 
	
		
			
				|  |  | -        return tools.getinput("Notes: ", default, reader)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      def do_open(self, args):
 | 
	
		
			
				|  |  |          ids = self.get_ids(args)
 | 
	
		
			
				|  |  |          if not args:
 | 
	
	
		
			
				|  | @@ -256,15 +202,6 @@ class BaseCommands(HelpUI):
 | 
	
		
			
				|  |  |          except Exception as e:
 | 
	
		
			
				|  |  |              self.error(e)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def do_clear(self, args):
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            self._db.clearfilter()
 | 
	
		
			
				|  |  | -        except Exception as e:
 | 
	
		
			
				|  |  | -            self.error(e)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def do_cls(self, args):
 | 
	
		
			
				|  |  | -        os.system('clear')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      def do_edit(self, arg, menu=None):
 | 
	
		
			
				|  |  |          ids = self.get_ids(arg)
 | 
	
		
			
				|  |  |          for i in ids:
 | 
	
	
		
			
				|  | @@ -349,55 +286,6 @@ class BaseCommands(HelpUI):
 | 
	
		
			
				|  |  |          #except Exception as e:
 | 
	
		
			
				|  |  |          #    self.error(e)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def get_tags(self, default=None, reader=raw_input):
 | 
	
		
			
				|  |  | -        """read tags from user"""
 | 
	
		
			
				|  |  | -        defaultstr = ''
 | 
	
		
			
				|  |  | -        if default:
 | 
	
		
			
				|  |  | -            for t in default:
 | 
	
		
			
				|  |  | -                defaultstr += "%s " % (t)
 | 
	
		
			
				|  |  | -        else:
 | 
	
		
			
				|  |  | -            # tags = self._db.currenttags()
 | 
	
		
			
				|  |  | -            tags = self._db._filtertags
 | 
	
		
			
				|  |  | -            for t in tags:
 | 
	
		
			
				|  |  | -                defaultstr += "%s " % (t)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        # strings = []
 | 
	
		
			
				|  |  | -        tags = self._db.listtags(True)
 | 
	
		
			
				|  |  | -        # for t in tags:
 | 
	
		
			
				|  |  | -        #    strings.append(t.get_name())
 | 
	
		
			
				|  |  | -        #    strings.append(t)
 | 
	
		
			
				|  |  | -        strings = [t for t in tags]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        def complete(text, state):
 | 
	
		
			
				|  |  | -            count = 0
 | 
	
		
			
				|  |  | -            for s in strings:
 | 
	
		
			
				|  |  | -                if s.startswith(text):
 | 
	
		
			
				|  |  | -                    if count == state:
 | 
	
		
			
				|  |  | -                        return s
 | 
	
		
			
				|  |  | -                    else:
 | 
	
		
			
				|  |  | -                        count += 1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        taglist = tools.getinput("Tags: ", defaultstr, completer=complete,
 | 
	
		
			
				|  |  | -                                 reader=reader)
 | 
	
		
			
				|  |  | -        tagstrings = taglist.split()
 | 
	
		
			
				|  |  | -        tags = [TagNew(tn) for tn in tagstrings]
 | 
	
		
			
				|  |  | -        return tags
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def do_filter(self, args):
 | 
	
		
			
				|  |  | -        tagstrings = args.split()
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            tags = [TagNew(ts) for ts in tagstrings]
 | 
	
		
			
				|  |  | -            self._db.filter(tags)
 | 
	
		
			
				|  |  | -            tags = self._db.currenttags()
 | 
	
		
			
				|  |  | -            print ("Current tags: ",)
 | 
	
		
			
				|  |  | -            if len(tags) == 0:
 | 
	
		
			
				|  |  | -                print ("None",)
 | 
	
		
			
				|  |  | -            for t in tags:
 | 
	
		
			
				|  |  | -                print ("%s " % t.name.decode())
 | 
	
		
			
				|  |  | -            print
 | 
	
		
			
				|  |  | -        except Exception as e:
 | 
	
		
			
				|  |  | -            self.error(e)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      def do_print(self, arg):
 | 
	
		
			
				|  |  |          for i in self.get_ids(arg):
 | 
	
		
			
				|  |  |              try:
 |