31,16 → 31,20 |
def usage(channel): |
def p(s): |
channel.write(s) |
p('%s {-f passwordfile} {-p password | -0} search [search2] [search3]\n') |
p('%s {-f passwordfile} {-p password | -0} search [search2] [...]\n' % sys.argv[0]) |
p('\nOptions:\n') |
p(' -f <FILE>, --file=<FILE> Revelation password file\n') |
p(' -p <PASS>, --password=<PASS> Master password\n') |
p(' -s <SEARCH>, --search=<SEARCH> Search for string\n') |
p(' -i, --case-insensitive Case insensitive search [default]\n') |
p(' -c, --case-sensitive Case sensitive search\n') |
p(' -a, --ask Interactively ask for password.\n') |
p(' Note it will be displayed in clear as you\n') |
p(' type it.\n') |
p(' -0, --stdin Read password from standard input\n') |
p(' -h, --help Print help (this message).\n') |
p(' --version Print the program\'s version information.\n') |
p('\n') |
p(' -f <FILE>, --file=<FILE> Revelation password file\n') |
p(' -p <PASS>, --password=<PASS> Master password\n') |
p(' -s <STRING>, --search=<STRING> Search for string\n') |
p(' -i, --case-insensitive Case insensitive search [default]\n') |
p(' -c, --case-sensitive Case sensitive search\n') |
p(' -0, --stdin Read password from standard input\n') |
# p(' -a, --ask Ask password interactively\n') |
p('\n') |
|
def search(xmldata, search, caseInsensitive=True): |
doc = libxml2.parseDoc(xmldata) |
55,8 → 59,8 |
res = ctxt.xpathEval(xpath) |
print '-> Search "%s": ' % search, |
if not len(res): |
print 'No matches' |
sys.exit(2) |
print 'No results' |
sys.exit(80) |
print '%d matches' % len(res) |
tagnames ={ 'generic-url': 'Url:', |
'generic-username': 'Username:', |
85,12 → 89,15 |
idv = tagnames[idv] |
print idv,chld.content |
print '' |
# for chld in x.children |
sys.stderr.write('<- (end of %d results for "%s")\n\n' % ( len(res), search )) |
# / for chld in x.children |
nr = len(res) |
plural = '' |
if nr > 1: |
plural = 's' |
sys.stderr.write('<- (end of %d result%s for "%s")\n\n' % ( nr, plural, search )) |
doc.freeDoc() |
ctxt.xpathFreeContext() |
|
|
def main(): |
datafile = None |
password = None |
99,9 → 106,10 |
|
sys.stderr.write('Relevation v%s, (c) 2011 Toni Corvera\n\n' % __version__) |
try: |
ops, args = getopt.getopt(sys.argv[1:], 'f:p:s:0ci', |
ops, args = getopt.getopt(sys.argv[1:], 'f:p:s:0ciah', |
[ 'file=', 'password=', 'search=', 'stdin', |
'case-sensitive', 'case-insensitive' ]) |
'case-sensitive', 'case-insensitive', 'ask', |
'help', 'version' ]) |
except getopt.GetoptError, err: |
print str(err) |
usage(sys.stderr) |
109,15 → 117,27 |
if args: |
searches = args |
|
if ( '-h', '' ) in ops or ( '--help', '' ) in ops: |
usage(sys.stdout) |
sys.exit(os.EX_OK) |
if ( '--version', '' ) in ops: |
release='' |
if not RELEASE: |
release=' [DEBUG]' |
print 'Relevation version %s%s' % ( __version__, release ) |
print 'Python version %s' % sys.version |
sys.exit(os.EX_OK) |
|
for opt, arg in ops: |
if opt in ( '-f', '--file' ): |
datafile = arg |
elif opt in ( '-p', '--password' ): |
password = arg |
elif opt in ( '-0', '--stdin' ): |
sys.stderr.write('Getting password from stdin\n') |
p = sys.stdin.readline() |
p = p[:-1] |
elif opt in ( '-a', '--ask', '-0', '--stdin' ): |
if opt in ( '-a', '--ask' ): |
sys.stderr.write('File password: ') |
password = sys.stdin.readline() |
password = password[:-1] |
elif opt in ( '-s', '--search' ): |
searches.append(arg) |
elif opt in ( '-i', '--case-insensitive' ): |
125,9 → 145,14 |
elif opt in ( '-c', '--case-sensitive' ): |
caseInsensitive = False |
else: |
sys.stderr.write('Unhandled option: %s\n' % opt) |
assert False, "internal error parsing options" |
if not datafile or not password: |
usage(sys.stderr) |
if not datafile: |
sys.stderr.write('Input password filename is required\n') |
if not password: |
sys.stderr.write('Password is required\n') |
sys.exit(os.EX_USAGE) |
# Encrypted data |
try: |