X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=netbank;h=a1520cade2a52890a6b4dd47dede87d8b404ce14;hb=be69f65b9fdbb7944b3724cf0ba1e55b9ba66a3e;hp=3740528c0e37419e69b4a14a85d70671c885fdd9;hpb=d6d73d98edfeec867c2215815466e23a4682381f;p=fulbank.git diff --git a/netbank b/netbank index 3740528..a1520ca 100755 --- a/netbank +++ b/netbank @@ -1,26 +1,46 @@ #!/usr/bin/python3 -import sys, os, getopt, pwd -from fulbank import auth +import sys, os, getopt, pwd, operator +from fulbank import auth, data -sesstype = None +sessname = data.defaultsess() sess = None -def find(seq, *, item=None, match=None, key=None, default=LookupError): +def pfxmatch(pfx, item): + return str(item)[:len(pfx)] == pfx + +class ambiguous(LookupError): + def __init__(self, a, b): + super().__init__("ambigous match: %s and %s" % (a, b)) + self.a = a + self.b = b + +def find(seq, *, item=None, test=None, match=None, key=None, default=LookupError): if key is None: key = lambda o: o if match is None and item is not None: - match = lambda o: o == item + match = lambda o: test(item, o) + if test is None: + test = operator.eq + found = None for thing in seq: if match(key(thing)): - return thing + if found is None: + found = thing + else: + if default is LookupError: + raise ambiguous(key(found), key(thing)) + else: + return default + if found is not None: + return found if default is LookupError: raise LookupError() else: return default def usage(out): - out.write("usage: netbank [-h] BANK-ID COMMAND [ARGS...]") + out.write("usage: netbank [-h] [-s SESSION-ID] COMMAND [ARGS...]\n") def requiresess(fn): def wrap(cmd, args): @@ -34,19 +54,31 @@ commands = {} def cmd_login(cmd, args): global sess + opts, args = getopt.getopt(args, "t:") + typename = sessname + for o, a in opts: + if o == "-t": + typename = a if len(args) < 1: - sys.stderr.write("usage: login TYPE\n") + sys.stderr.write("usage: login [-t BANK-ID] TYPE\n") sys.exit(1) - sess = sesstype.create() + sess = data.getsessnam(typename).create() if args[0] == "bankid": - if len(args) < 2: - sys.stderr.write("usage: login bankid USER-ID\n") - sys.exit(1) - with auth.ttyconv() as conv: - sess.auth_bankid(args[1], conv) + authfun = sess.auth_bankid + elif args[0] == "token": + authfun = sess.auth_token else: sys.stderr.write("netbank: %s: unknown authentication type\n" % (args[0])) sys.exit(1) + if len(args) < 2: + sys.stderr.write("usage: login bankid USER-ID\n") + sys.exit(1) + with auth.ttyconv() as conv: + try: + authfun(args[1], conv) + except auth.autherror as err: + sys.stderr.write("netbank: authentication failed: %s\n" % err) + sys.exit(1) commands["login"] = cmd_login @requiresess @@ -79,7 +111,10 @@ def cmd_lstxn(cmd, args): sys.stderr.write("usage: lstxn [-n NUM] ACCOUNT\n") sys.exit(1) try: - acct = find(sess.accounts, item=args[0], key=lambda acct: acct.number) + acct = find(sess.accounts, item=args[0], key=lambda acct: acct.number, test=pfxmatch) + except ambiguous as exc: + sys.stderr.write("netbank: %s: ambiguous match between %s and %s\n" % (args[0], exc.a, exc.b)) + sys.exit(1) except LookupError: sys.stderr.write("netbank: %s: no such account\n" % (args[0])) sys.exit(1) @@ -88,44 +123,29 @@ def cmd_lstxn(cmd, args): commands["lstxn"] = cmd_lstxn def main(): - global sess, sesstype + global sess, sessname - opts, args = getopt.getopt(sys.argv[1:], "h") + opts, args = getopt.getopt(sys.argv[1:], "hs:") for o, a in opts: if o == "-h": usage(sys.stdout) sys.exit(0) - if len(args) < 2: + if o == "-s": + sessname = a + if len(args) < 1: usage(sys.stderr) sys.exit(1) - if args[0] == "fsb": - import fulbank.fsb - sesstype = fulbank.fsb.session - else: - sys.stderr.write("netbank: %s: unknown bank id\n" % (args[0])) - sys.exit(1) - sesspath = os.path.join(pwd.getpwuid(os.getuid()).pw_dir, ".cache/fulbank", args[0]) - cmd = args[1] - args = args[2:] + cmd = args[0] + args = args[1:] - if os.path.exists(sesspath): - sess = sesstype.load(sesspath) - else: - sess = None + sess = data.loadsess(sessname, None) if cmd in commands: commands[cmd](cmd, args) else: sys.stderr.write("netbank: %s: unknown command\n" % (cmd)) sys.exit(1) - if sess is not None: - sessdir = os.path.dirname(sesspath) - if not os.path.isdir(sessdir): - os.makedirs(sessdir) - sess.save(sesspath) - else: - if os.path.exists(sesspath): - os.unlink(sesspath) + data.savesess(sess, sessname) try: if __name__ == "__main__":