|  | @@ -0,0 +1,187 @@
 | 
	
		
			
				|  |  | +#============================================================================
 | 
	
		
			
				|  |  | +# This file is part of Pwman3.
 | 
	
		
			
				|  |  | +#
 | 
	
		
			
				|  |  | +# Pwman3 is free software; you can redistribute it and/or modify
 | 
	
		
			
				|  |  | +# it under the terms of the GNU General Public License, version 2
 | 
	
		
			
				|  |  | +# as published by the Free Software Foundation;
 | 
	
		
			
				|  |  | +#
 | 
	
		
			
				|  |  | +# Pwman3 is distributed in the hope that it will be useful,
 | 
	
		
			
				|  |  | +# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
	
		
			
				|  |  | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
	
		
			
				|  |  | +# GNU General Public License for more details.
 | 
	
		
			
				|  |  | +#
 | 
	
		
			
				|  |  | +# You should have received a copy of the GNU General Public License
 | 
	
		
			
				|  |  | +# along with Pwman3; if not, write to the Free Software
 | 
	
		
			
				|  |  | +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | 
	
		
			
				|  |  | +#============================================================================
 | 
	
		
			
				|  |  | +# Copyright (C) 2013 Oz Nahum <nahumoz@gmail.com>
 | 
	
		
			
				|  |  | +#============================================================================
 | 
	
		
			
				|  |  | +# pylint: disable=I0011
 | 
	
		
			
				|  |  | +"""
 | 
	
		
			
				|  |  | +Define the base CLI interface for pwman3
 | 
	
		
			
				|  |  | +"""
 | 
	
		
			
				|  |  | +from pwman.util.crypto import CryptoUnsupportedException
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class HelpUI(object):
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +    this class holds all the UI help functionality.
 | 
	
		
			
				|  |  | +    in PwmanCliNew. The later inherits from this class
 | 
	
		
			
				|  |  | +    and allows it to print help messages to the console.
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +    def usage(self, string):
 | 
	
		
			
				|  |  | +        print "Usage: %s" % (string)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_open(self):
 | 
	
		
			
				|  |  | +        self.usage("open <ID>")
 | 
	
		
			
				|  |  | +        print "Launch default browser with 'xdg-open url',\n" \
 | 
	
		
			
				|  |  | +              + "the url must contain http:// or https://."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_o(self):
 | 
	
		
			
				|  |  | +        self.help_open()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_copy(self):
 | 
	
		
			
				|  |  | +        self.usage("copy <ID>")
 | 
	
		
			
				|  |  | +        print "Copy password to X clipboard (xsel required)"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_cp(self):
 | 
	
		
			
				|  |  | +        self.help_copy()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_cls(self):
 | 
	
		
			
				|  |  | +        self.usage("cls")
 | 
	
		
			
				|  |  | +        print "Clear the Screen from information."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_list(self):
 | 
	
		
			
				|  |  | +        self.usage("list <tag> ...")
 | 
	
		
			
				|  |  | +        print "List nodes that match current or specified filter." \
 | 
	
		
			
				|  |  | +              + " l is an alias."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_EOF(self):
 | 
	
		
			
				|  |  | +        self.help_exit()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_delete(self):
 | 
	
		
			
				|  |  | +        self.usage("delete <ID|tag> ...")
 | 
	
		
			
				|  |  | +        print "Deletes nodes. rm is an alias."
 | 
	
		
			
				|  |  | +        self._mult_id_help()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_h(self):
 | 
	
		
			
				|  |  | +        self.help_help()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_help(self):
 | 
	
		
			
				|  |  | +        self.usage("help [topic]")
 | 
	
		
			
				|  |  | +        print "Prints a help message for a command."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_e(self):
 | 
	
		
			
				|  |  | +        self.help_edit()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_n(self):
 | 
	
		
			
				|  |  | +        self.help_new()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_p(self):
 | 
	
		
			
				|  |  | +        self.help_print()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_l(self):
 | 
	
		
			
				|  |  | +        self.help_list()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_edit(self):
 | 
	
		
			
				|  |  | +        self.usage("edit <ID|tag> ... ")
 | 
	
		
			
				|  |  | +        print "Edits a nodes."
 | 
	
		
			
				|  |  | +        self._mult_id_help()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_import(self):
 | 
	
		
			
				|  |  | +        self.usage("import [filename] ...")
 | 
	
		
			
				|  |  | +        print "Imports a nodes from a file."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_export(self):
 | 
	
		
			
				|  |  | +        self.usage("export <ID|tag> ... ")
 | 
	
		
			
				|  |  | +        print "Exports a list of ids to an external format. If no IDs or" \
 | 
	
		
			
				|  |  | +              + " tags are specified, then all nodes under the current" \
 | 
	
		
			
				|  |  | +              + " filter are exported."
 | 
	
		
			
				|  |  | +        self._mult_id_help()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_new(self):
 | 
	
		
			
				|  |  | +        self.usage("new")
 | 
	
		
			
				|  |  | +        print """Creates a new node.,
 | 
	
		
			
				|  |  | +You can override default config settings the following way:
 | 
	
		
			
				|  |  | +pwman> n {'leetify':False, 'numerics':True}"""
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_rm(self):
 | 
	
		
			
				|  |  | +        self.help_delete()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_print(self):
 | 
	
		
			
				|  |  | +        self.usage("print <ID|tag> ...")
 | 
	
		
			
				|  |  | +        print "Displays a node. ",
 | 
	
		
			
				|  |  | +        self._mult_id_help()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _mult_id_help(self):
 | 
	
		
			
				|  |  | +        print "Multiple ids and nodes can be specified, separated by a space."\
 | 
	
		
			
				|  |  | +              + "A range of ids can be specified in the format n-N. e.g. " \
 | 
	
		
			
				|  |  | +              + "'10-20' would specify all nodes having ids from 10 to 20 " \
 | 
	
		
			
				|  |  | +              + "inclusive. Tags are considered one-by-one. e.g. 'foo 2 bar'" \
 | 
	
		
			
				|  |  | +              + " would yield to all nodes with tag 'foo', node 2 and all "\
 | 
	
		
			
				|  |  | +              + "nodes with tag 'bar'."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_exit(self):
 | 
	
		
			
				|  |  | +        self.usage("exit")
 | 
	
		
			
				|  |  | +        print "Exits the application."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_save(self):
 | 
	
		
			
				|  |  | +        self.usage("save [filename]")
 | 
	
		
			
				|  |  | +        print "Saves the current configuration to [filename]. If no filename "\
 | 
	
		
			
				|  |  | +              + "is given, the configuration is saved to the file from which "\
 | 
	
		
			
				|  |  | +              + "the initial configuration was loaded."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_set(self):
 | 
	
		
			
				|  |  | +        self.usage("set [configoption] [value]")
 | 
	
		
			
				|  |  | +        print "Sets a configuration option. If no value is specified, the "\
 | 
	
		
			
				|  |  | +              + "current value for [configoption] is output. If neither "\
 | 
	
		
			
				|  |  | +              + "[configoption] nor [value] are specified, the whole current "\
 | 
	
		
			
				|  |  | +              + "configuration is output. [configoption] must be of the "\
 | 
	
		
			
				|  |  | +              + "format <section>.<option>"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_passwd(self):
 | 
	
		
			
				|  |  | +        self.usage("passwd")
 | 
	
		
			
				|  |  | +        print "Changes the password on the database. "
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_forget(self):
 | 
	
		
			
				|  |  | +        self.usage("forget")
 | 
	
		
			
				|  |  | +        print "Forgets the database password. Your password will need to " \
 | 
	
		
			
				|  |  | +              + "be reentered before accessing the database again."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_clear(self):
 | 
	
		
			
				|  |  | +        self.usage("clear")
 | 
	
		
			
				|  |  | +        print "Clears the filter criteria. "
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_filter(self):
 | 
	
		
			
				|  |  | +        self.usage("filter <tag> ...")
 | 
	
		
			
				|  |  | +        print "Filters nodes on tag. Arguments can be zero or more tags. " \
 | 
	
		
			
				|  |  | +              + "Displays current tags if called without arguments."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def help_tags(self):
 | 
	
		
			
				|  |  | +        self.usage("tags")
 | 
	
		
			
				|  |  | +        print "Displays all tags in used in the database."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class BaseUI(object):
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +    this class holds all the UI functionality
 | 
	
		
			
				|  |  | +    in PwmanCliNew. The later inherits from this class
 | 
	
		
			
				|  |  | +    and allows it to print messages to the console.
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _do_filter(self, args):
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _tags(self, enc):
 | 
	
		
			
				|  |  | +        # TODO: unittest for this method ...
 | 
	
		
			
				|  |  | +        tags = self._db.listtags()
 | 
	
		
			
				|  |  | +        if tags:
 | 
	
		
			
				|  |  | +            _tags = [''] * len(tags)
 | 
	
		
			
				|  |  | +            for t in tags:
 | 
	
		
			
				|  |  | +                try:
 | 
	
		
			
				|  |  | +                    _tags.append(enc.decrypt(t))
 | 
	
		
			
				|  |  | +                except (ValueError, Exception), e:
 | 
	
		
			
				|  |  | +                    _tags.append(t)
 | 
	
		
			
				|  |  | +                    del(e)
 | 
	
		
			
				|  |  | +            _tags = filter(None, _tags)
 | 
	
		
			
				|  |  | +            return _tags
 |