port to python3, revert to serial connection

master
vuko 2021-11-11 21:22:19 +01:00
parent 7555b62a1e
commit 877ab90cde
17 changed files with 115 additions and 128 deletions

View File

@ -1,14 +1,14 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
import argparse
from sys import stderr, argv
from lib.proto import Proto
from lib.actions import *
from lib.storage import add_user
from lib.password import get_token, get_pin
from doorman.proto import Proto
from doorman.actions import *
from doorman.storage import add_user
from doorman.password import get_token, get_pin
import options
import doorman.options as options
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Add a card')
@ -27,25 +27,25 @@ if __name__ == '__main__':
card = args.card
uname = args.name
if args.local and not (args.card and args.uid):
print 'Local update requires a card and uid to be specified!'
print('Local update requires a card and uid to be specified!')
exit(2)
if not args.local:
token = get_token()
proto = Proto(args.url)
if not args.card:
print 'Please swipe token'
print('Please swipe token')
frame = scan(token=token, proto=proto)
assert(frame.command.upper() == 'S')
card = frame.hash
uid = frame.uid
if frame.uid:
print >> stderr, 'E: Token already in use (user %d)' % frame.uid
print('E: Token already in use (user %d)' % frame.uid, file=stderr)
exit(1)
else:
card = args.card
status = add(token, card, proto=proto)
if status.command.upper() != 'C':
print >> stderr, 'Unknown error:', str(status)
print('Unknown error:', str(status), file=stderr)
exit(1)
add_user(uname, card, uid)
print 'User %s added successfully (uid=%d)' % (uname, uid)
print('User %s added successfully (uid=%d)' % (uname, uid))

View File

@ -1,13 +1,13 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
from sys import argv
from lib.actions import scan
from lib.proto import Proto
from lib.storage import get_card
from lib.password import get_token
from lib.command import signed_command
import options
from doorman.actions import scan
from doorman.proto import Proto
from doorman.storage import get_card
from doorman.password import get_token
from doorman.command import signed_command
import doorman.options as options
if __name__ == '__main__':
url = argv[1] if len(argv) > 1 else options.url
@ -15,4 +15,4 @@ if __name__ == '__main__':
proto = Proto(url)
proto.send(signed_command(command='P', hash=options.empty_hash, uid=0, token=token))
while True:
print proto.fd.readline(),
print(proto.fd.readline(), end=' ')

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
import ldap
import getpass
@ -7,12 +7,12 @@ import requests
from sys import argv
import options
from lib.actions import revoke_hash, add
from lib.proto import Proto
from lib.storage import get_card
from lib.password import get_token
from lib.command import signed_command
import doorman.options as options
from doorman.actions import revoke_hash, add
from doorman.proto import Proto
from doorman.storage import get_card
from doorman.password import get_token
from doorman.command import signed_command
MEMBER_FILTER = ('(|'
'(memberOf=cn=starving,ou=Group,dc=hackerspace,dc=pl)'
@ -40,7 +40,7 @@ def get_current_cards(token, proto):
proto.send(signed_command(command='P', hash=options.empty_hash, uid=0, token=token))
while True:
l = proto.fd.readline().strip()
l = proto.fd.readline().strip().decode()
if not l.startswith('REC,'):
continue
@ -58,7 +58,7 @@ def get_target_cards(c):
cards = set()
for user, attrs in c.search_s('ou=People,dc=hackerspace,dc=pl',ldap.SCOPE_SUBTREE,'(&(mifareIDHash=*)%s)' % MEMBER_FILTER, ['mifareIDHash', 'uid']):
for h in attrs['mifareIDHash']:
cards.add(shorthash((h, user)))
cards.add(shorthash((h.decode('ascii'), user)))
return cards
if __name__ == "__main__":
@ -74,28 +74,28 @@ if __name__ == "__main__":
to_remove = cur - target
to_add = target - cur
print 'current:', len(cur)
print 'target:', len(target)
print('current:', len(cur))
print('target:', len(target))
pprint.pprint(target)
print 'to add:', len(to_add)
print('to add:', len(to_add))
pprint.pprint(to_add)
print 'to remove:', len(to_remove)
print('to remove:', len(to_remove))
pprint.pprint(to_remove)
max_cards = 140
print 'Memory utilization: %d / %d (%.2f%%)' % (
print('Memory utilization: %d / %d (%.2f%%)' % (
len(cur), max_cards, 100.0 * len(cur) / max_cards
)
))
print('Press y to confirm removal')
if raw_input().lower().strip() == 'y':
if input().lower().strip() == 'y':
for h, u in to_remove:
print('Removing %s' % h)
print(('Removing %s' % h))
revoke_hash(token, h, proto=proto)
for h, u in to_add:
print('Adding %s' % u)
print(('Adding %s' % u))
add(token, h, proto=proto)

View File

@ -3,9 +3,9 @@
import argparse
from sys import stderr, argv
from lib.actions import *
from lib.storage import del_uid
from lib.password import get_token
from doorman.actions import *
from doorman.storage import del_uid
from doorman.password import get_token
if __name__ == '__main__':
url = argv[2] if len(argv) > 2 else None
@ -14,7 +14,7 @@ if __name__ == '__main__':
status = revoke_uid(token, uid)
if status.command == 'K':
del_uid(uid)
print 'User %d revoked' % uid
print('User %d revoked' % uid)
else:
print >> stderr, 'Unknown error:', status
print('Unknown error:', status, file=stderr)
exit(1)

View File

@ -1,13 +1,13 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
import argparse
import options
import doorman.options as options
from sys import stderr, argv
from lib.actions import *
from lib.proto import Proto
from lib.storage import del_card
from lib.password import get_token
from doorman.actions import *
from doorman.proto import Proto
from doorman.storage import del_card
from doorman.password import get_token
if __name__ == '__main__':
parser = argparse.ArgumentParser(
@ -21,20 +21,20 @@ if __name__ == '__main__':
parser.add_argument('-c', '--card', help='Card+PIN hash (will not scan), only required with -l')
args = parser.parse_args()
if args.local and not args.card:
print 'Local update requires a card to be specified!'
print('Local update requires a card to be specified!')
exit(2)
card = args.card
if not args.local:
token = get_token()
proto = Proto(args.url)
if not args.card:
print 'Please swipe token'
print('Please swipe token')
frame = scan(token, proto=proto)
assert(frame.command == 'S')
card = frame.hash
status = revoke_hash(token, card, proto=proto)
if status.command != 'K':
print >> stderr, 'Unknown error:', str(status)
print('Unknown error:', str(status), file=stderr)
exit(1)
(uid, name) = del_card(card)
print 'Card %s (user %s, uid %d) revoked' % (card, name, uid)
print('Card %s (user %s, uid %d) revoked' % (card, name, uid))

View File

@ -1,13 +1,13 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
import argparse
import options
import doorman.options as options
from sys import stderr, argv
from lib.actions import *
from lib.proto import Proto
from lib.storage import cards_for_user, del_card
from lib.password import get_token
from doorman.actions import *
from doorman.proto import Proto
from doorman.storage import cards_for_user, del_card
from doorman.password import get_token
if __name__ == '__main__':
parser = argparse.ArgumentParser(
@ -26,18 +26,18 @@ if __name__ == '__main__':
if args.local:
for h in cards:
del_card(h)
print 'Card %s revoked' % h
print('Card %s revoked' % h)
else:
token = get_token()
proto = Proto(url)
user = argv[1]
for h in cards:
print 'Revoking card %s' % h
print('Revoking card %s' % h)
status = revoke_hash(token, h, proto=proto)
if status.command == 'K':
del_card(h)
print 'Card %s revoked' % h
print('Card %s revoked' % h)
else:
print >> stderr, 'Unknown error:', status
print('Unknown error:', status, file=stderr)
exit(1)
print 'User %s\'s cards revoked' % user
print('User %s\'s cards revoked' % user)

View File

@ -1,19 +1,19 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
from sys import argv
from lib.actions import scan
from lib.proto import Proto
from lib.storage import get_card
from lib.password import get_token
import options
from doorman.actions import scan
from doorman.proto import Proto
from doorman.storage import get_card
from doorman.password import get_token
import doorman.options as options
if __name__ == '__main__':
url = argv[1] if len(argv) > 1 else options.url
token = get_token()
proto = Proto(url)
print 'Please swipe token'
print('Please swipe token')
c = scan(token, proto=proto)
assert(c.command.upper() == 'S')
print 'Hash: %s, UID: %x, Username: %s' % \
(c.hash, c.uid, get_card(c.hash)[1])
print('Hash: %s, UID: %x, Username: %s' % \
(c.hash, c.uid, get_card(c.hash)[1]))

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
from lib.storage import storage
from doorman.storage import storage
if __name__ == '__main__':
for h, (u, n) in storage.iteritems():
print 'hash=%s, uid=%s, nick=%s' % (h, u, n)
for h, (u, n) in storage.items():
print('hash=%s, uid=%s, nick=%s' % (h, u, n))

View File

@ -1,6 +1,6 @@
from proto import Proto
from options import *
from command import signed_command
from .proto import Proto
from .options import *
from .command import signed_command
def scan(token, url=None, proto=None):
proto = proto or Proto(url)

View File

@ -2,7 +2,7 @@ from collections import namedtuple
import hmac
import hashlib
from options import *
from .options import *
Property = namedtuple('Property', ['name', 'to_str', 'from_str', 'length', 'default'])
@ -48,7 +48,7 @@ def frame(name, fields):
kw[f.name] = fv
return cls(**kw)
def __init__(self, **kw):
for n, v in kw.iteritems():
for n, v in kw.items():
setattr(self, n, v)
def __str__(self):
s = ''
@ -76,7 +76,7 @@ def signed_command(command='P', hash='00'*32, uid=0, token=''):
"""Returns a MACd Command instance."""
data = str(Command(command=command, hash=hash, uid=uid, mac="aa"*32))
data = ','.join(data.split(',')[:3])
print data
mac = hmac.HMAC(token, digestmod=hashlib.sha256)
mac.update(data)
print(data)
mac = hmac.HMAC(token.encode('ascii'), digestmod=hashlib.sha256)
mac.update(data.encode('ascii'))
return Command(command=command, hash=hash, uid=uid, mac=mac.hexdigest())

View File

@ -7,7 +7,7 @@ shelf = './base'
json = './cards.json'
csv = './cards.csv'
storage = 'csv'
storage = "none"
#whether the storage method should be encrypted
storage_encrypt = False

View File

@ -1,7 +1,7 @@
import hashlib
import getpass
import options
from . import options
def get_des_storage_key(filename):
password = getpass.getpass("DES Storage key (%s):" % filename)

View File

@ -2,11 +2,9 @@ from time import sleep
from sys import stderr
import serial
import socket
import ssl
from command import Command
import options
from .command import Command
from . import options
class RemoteException(Exception):
pass
@ -16,30 +14,20 @@ class Proto(object):
kwa.update(options.serial)
kwa.update(kwargs)
url = url or options.url
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(20)
print ('wrapping..')
ctx = ssl.create_default_context()
self.sock = ssl.wrap_socket(sock)
print ('connecting')
self.sock.connect((url, 443))
self.sock.settimeout(60)
print ('done')
self.fd = self.sock.makefile()
#self.fd = serial.serial_for_url(url, **kwa)
self.fd = serial.serial_for_url(url, **kwa)
sleep(options.init_sleep)
##self.fd.flushInput()
#self.fd.flushOutput()
print >> stderr, 'Serial port ready'
self.fd.flushInput()
self.fd.flushOutput()
print('Serial port ready', file=stderr)
def send(self, command):
cmd = str(command) + '\n'
print cmd
print(cmd)
for i in cmd:
self.sock.send(i)
sleep(0.02)
self.fd.write(i.encode('ascii'))
def recv(self):
line = self.fd.readline()
print (line)
line = self.fd.readline().decode('ascii')
print(line)
if line[0] != '$':
return self.recv()
cmd = Command.from_str(line)

View File

@ -1,2 +1,2 @@
from classes import CsvStorage, JsonStorage
from ops import *
from .classes import CsvStorage, JsonStorage
from .ops import *

View File

@ -1,6 +1,6 @@
from sys import stderr
from collections import MutableMapping
from StringIO import StringIO
from io import StringIO
import csv, json
@ -33,13 +33,13 @@ class CsvStorage(Storage):
stored = {x[0]: [x[1], x[2]]
for x in csv.reader(StringIO(text))}
except IOError as e:
print >>stderr, e
print(e, file=stderr)
stored = {}
return stored
def encode(self, data):
f = StringIO()
csv.writer(f).writerows(
[c, u, name] for c, (u, name) in data.iteritems())
[c, u, name] for c, (u, name) in data.items())
return f.getvalue()
class JsonStorage(Storage):
@ -47,7 +47,7 @@ class JsonStorage(Storage):
try:
stored = json.loads(self.encapsulation.data)
except IOError as e:
print >>stderr, e
print(e, file=stderr)
stored = {}
return stored
def encode(self, data):

View File

@ -1,5 +1,5 @@
import options
import storage_encapsulation
import doorman.options as options
from . import storage_encapsulation
from .classes import CsvStorage, JsonStorage
if options.storage_encrypt == True:
@ -17,8 +17,7 @@ if options.storage == 'csv':
nobody = (None, '-unknown-')
get_card = lambda h: storage.get(h, nobody)
cards_for_user = lambda name: map(lambda (k,v): k,
filter(lambda (k,(u,n)): n == name, storage.iteritems()))
cards_for_user = lambda name: [k_v1[0] for k_v1 in [k_u_n for k_u_n in iter(storage.items()) if k_u_n[1][1] == name]]
def add_user(username, hash, uid):
storage[hash] = (uid, username)
@ -27,11 +26,11 @@ def del_card(hash):
return storage.pop(hash, nobody)
def del_filter(f):
cards = map(lambda (k,v): k, filter(f, storage.iteritems()))
cards = [k_v[0] for k_v in list(filter(f, iter(storage.items())))]
r = []
for c in cards:
r.append(storage.pop(c, nobody))
return r
del_uid = lambda uid: del_filter(lambda (k, (u,n)): u == uid)
del_username = lambda name: del_filter(lambda (k, (u,n)): n == name)
del_uid = lambda uid: del_filter(lambda k_u_n2: k_u_n2[1][0] == uid)
del_username = lambda name: del_filter(lambda k_u_n3: k_u_n3[1][1] == name)

View File

@ -1,4 +1,4 @@
# because admin.lib.password uses admin.options -_-
# because admin.doorman.password uses admin.options -_-
if __name__ == "__main__":
import sys
sys.path.append("d:\\Development\\Projects\\doorman\\admin")
@ -7,7 +7,7 @@ import hashlib
import os
import tempfile
import lib.password as password
import doorman.password as password
class RawFileEncapsulation(object):
"""
@ -92,7 +92,7 @@ class DESFileEncapsulation(RawFileEncapsulation):
def _decode_data(self, data):
if data == "":
print "Input file empty. Assuming actually empty file."
print("Input file empty. Assuming actually empty file.")
return ""
from Crypto.Cipher import DES
@ -127,10 +127,10 @@ if __name__ == "__main__":
except:
n = 0
print "ass! %i" % n
print("ass! %i" % n)
r.data = str(n + 1)
print "try to modify the assfile, see it fail!"
raw_input()
print("try to modify the assfile, see it fail!")
input()
r.end_transaction()