You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.4 KiB
81 lines
2.4 KiB
import pyotp |
|
import json |
|
import urllib.request |
|
import urllib.error |
|
|
|
class UngleichOTPClient(object): |
|
token_name = 'token' |
|
name_name = 'name' |
|
realm_name = 'realm' |
|
|
|
def __init__(self, name, realm, seed, serverurl): |
|
self.name = name |
|
self.realm = realm |
|
self.seed = seed |
|
self.serverurl = serverurl |
|
|
|
def verify(self, name, realm, token): |
|
to_send = {} |
|
|
|
# Client credentials to be verified |
|
to_send['verifyname'] = name |
|
to_send['verifyrealm'] = realm |
|
to_send['verifytoken'] = token |
|
|
|
# Our credentials |
|
to_send['token'] = pyotp.TOTP(self.seed).now() |
|
to_send['name'] = self.name |
|
to_send['realm'] = self.realm |
|
|
|
data = json.dumps(to_send).encode("utf-8") |
|
|
|
req = urllib.request.Request(url=self.serverurl, |
|
data=data, |
|
headers={'Content-Type': 'application/json'}, |
|
method='POST') |
|
|
|
f = urllib.request.urlopen(req) |
|
|
|
if f.status == 200: |
|
return True |
|
|
|
return False |
|
|
|
|
|
if __name__ == '__main__': |
|
import argparse |
|
import os |
|
import sys |
|
|
|
parser = argparse.ArgumentParser(description='ungleichotp-client') |
|
parser.add_argument('-n', '--name', help="Name (for verification)", required=True) |
|
parser.add_argument('-r', '--realm', help="Realm (for verification)", required=True) |
|
|
|
g = parser.add_mutually_exclusive_group(required=True) |
|
g.add_argument('--token', help="Token (for verification)") |
|
g.add_argument('--seed', help="Seed (for verification)") |
|
|
|
args = parser.parse_args(sys.argv[1:]) |
|
|
|
|
|
UNGLEICHOTP={} |
|
for env in ['UNGLEICHOTPREALM', 'UNGLEICHOTPNAME', 'UNGLEICHOTPSEED', 'UNGLEICHOTPSERVER' ]: |
|
if not env in os.environ: |
|
raise Exception("Required environment variable missing: {}".format(env)) |
|
|
|
client = UngleichOTPClient(os.environ['UNGLEICHOTPNAME'], |
|
os.environ['UNGLEICHOTPREALM'], |
|
os.environ['UNGLEICHOTPSEED'], |
|
os.environ['UNGLEICHOTPSERVER']) |
|
|
|
|
|
if args.seed: |
|
token = pyotp.TOTP(args.seed).now() |
|
else: |
|
token = args.token |
|
|
|
try: |
|
if client.verify(args.name, args.realm, token) == True: |
|
print("Verify ok") |
|
except urllib.error.HTTPError as e: |
|
print("Failed to verify: {}".format(e))
|
|
|