### along with Catacomb/Python; if not, write to the Free Software Foundation,
### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-###---------------------------------------------------------------------------
+###--------------------------------------------------------------------------
### Imported modules.
from __future__ import with_statement
from os import environ
-from sys import argv, exit, stdin, stdout, stderr
+import sys as SYS; from sys import argv, exit, stdin, stdout, stderr
from getopt import getopt, GetoptError
from fnmatch import fnmatch
import re
###--------------------------------------------------------------------------
### Python version portability.
+if SYS.version_info >= (3,):
+ import io as IO
+ def hack_stream(stream):
+ _enc = stream.encoding
+ _lbuf = stream.line_buffering
+ _nl = stream.newlines
+ return IO.TextIOWrapper(stream.detach(),
+ encoding = _enc,
+ line_buffering = _lbuf,
+ newline = _nl,
+ errors = "surrogateescape")
+ SYS.stdout = stdout = hack_stream(stdout)
+ def _text(bin): return bin.decode(errors = "surrogateescape")
+ def _bin(text): return text.encode(errors = "surrogateescape")
+else:
+ def _text(bin): return bin
+ def _bin(text): return text
+
def _excval(): return SYS.exc_info()[1]
###--------------------------------------------------------------------------
def cmd_find(av):
if len(av) != 1: return 1
with PW(file) as pw:
- try: print(pw[av[0]])
+ try: print(_text(pw[_bin(av[0])]))
except KeyError: die("Password `%s' not found" % _excval().args[0])
def cmd_store(av):
vpp = C.getpass("Confirm passphrase `%s': " % tag)
if pp != vpp: die("passphrases don't match")
elif av[1] == '-':
- pp = stdin.readline().rstrip('\n')
+ pp = _bin(stdin.readline().rstrip('\n'))
else:
- pp = av[1]
- pw[av[0]] = pp
+ pp = _bin(av[1])
+ pw[_bin(av[0])] = pp
def cmd_copy(av):
if len(av) < 1 or len(av) > 2: return 1
if len(av) >= 3: pat = av[1]
else: pat = None
for k in pw_in:
- if pat is None or fnmatch(k, pat): pw_out[k] = pw_in[k]
+ ktext = _text(k)
+ if pat is None or fnmatch(ktext, pat): pw_out[k] = pw_in[k]
def cmd_list(av):
if len(av) > 1: return 1
if len(av) >= 1: pat = av[0]
else: pat = None
for k in pw:
- if pat is None or fnmatch(k, pat): print(k)
+ ktext = _text(k)
+ if pat is None or fnmatch(ktext, pat): print(ktext)
def cmd_topixie(av):
if len(av) > 2: return 1
with PW(file) as pw:
pix = C.Pixie()
if len(av) == 0:
- for tag in pw: pix.set(tag, pw[tag])
+ for tag in pw: pix.set(tag, pw[_bin(tag)])
else:
- tag = av[0]
+ tag = _bin(av[0])
if len(av) >= 2: pptag = av[1]
else: pptag = av[0]
pix.set(pptag, pw[tag])
def cmd_del(av):
if len(av) != 1: return 1
with PW(file, writep = True) as pw:
- tag = av[0]
+ tag = _bin(av[0])
try: del pw[tag]
except KeyError: die("Password `%s' not found" % _excval().args[0])