diff --git a/dyndns.py b/dyndns.py index 321cd7f407b4dedee91db2fd70c049591c22e353..a085d4cb60a90dba779a3d59f7b8c7efee74d57a 100644 --- a/dyndns.py +++ b/dyndns.py @@ -4,6 +4,7 @@ import os import requests import datetime import config +from werkzeug.security import check_password_hash plugin_dir = os.path.dirname(__file__) # parent folder name of the absolute path of this file @@ -13,6 +14,7 @@ def register(add_endpoint): add_endpoint(endpoint_id='dyndns', handler=dyndns, permission_name='dyndns', menutext='DynDNS') add_endpoint(endpoint_id='dyndns-register', handler=dyndnsRegister, permission_name='dyndns', method='POST') add_endpoint(endpoint_id='dyndns-update', handler=dyndnsUpdate, permission_name=None) # Auth is handled by DynDNS server using a token + add_endpoint(endpoint_id='dyndns-list', handler=dyndnsList, permission_name=None) # Auth is handled internally, not by framework def dyndns(**kwargs): session = kwargs['session'] @@ -63,7 +65,7 @@ def dyndnsUpdate(**kwargs): rqtools = kwargs['rqtools'] ip = request.remote_addr if not 'token' in request.args.keys(): - return rqtools.get_400("You need to provide your token.") + return rqtools.get_400(None, errormsg="You need to provide your token.") x = db.db['dyndns-records'].find_one({'token': request.args['token']}) if x['ip'] == ip: return {'message': 'Already set.'}, 200 @@ -73,3 +75,32 @@ def dyndnsUpdate(**kwargs): print("Updated " + x['domain'] + " from " + x['ip'] + " to " + ip) db.db['dyndns-records'].update_one(filter={'token': request.args['token']}, update={'$set': {'ip': ip, 'lastupdate': datetime.datetime.now()}}) return reply, r.status_code + +def dyndnsList(**kwargs): + + # Authorization + request = kwargs['request'] + rqtools = kwargs['rqtools'] + if not 'id' in request.args.keys(): + return rqtools.get_403(None, errormsg="Provide an id.") + if not 'key' in request.args.keys(): + return rqtools.get_403(None, errormsg="Provide a key for this.") + id = request.args['id'] + key = request.args['key'] + x = db.db['dyndns-servers'].find_one({'id': id}) + if x is None: + return rqtools.get_403(None) + if not check_password_hash(x['keyhash'], key): + return rqtools.get_403(None, errormsg="Wrong key.") + + # Dump all dyndns records + records = [] + for record in db.db['dyndns-records'].find(): + records.append({ + 'domain': record['domain'], + 'token': record['token'], + 'ip': record['ip'] + }) + return records # this automatically returns JSON + +