From 8806e804f0674ca0879bbbe0caadd38320428b09 Mon Sep 17 00:00:00 2001 From: Brian Martin Date: Sun, 3 Mar 2019 10:28:52 -0500 Subject: [PATCH] Updated confserver Updated confserver to use tinydb and set users, tokens, authcodes --- bumper.py | 6 --- bumper/__init__.py | 125 ++++++++++++++++++++++++++++++++++--------- bumper/confserver.py | 86 +++++++++++++---------------- bumper/mqttserver.py | 2 +- 4 files changed, 139 insertions(+), 80 deletions(-) diff --git a/bumper.py b/bumper.py index c47426e..32b628b 100644 --- a/bumper.py +++ b/bumper.py @@ -54,17 +54,11 @@ def main(): conf_server = bumper.ConfServer( conf_address_443, usessl=True, - bumper_users=bumper.bumper_users_var, - bumper_bots=bumper.bumper_bots_var, - bumper_clients=bumper.bumper_clients_var, helperbot=mqtt_helperbot, ) conf_server_2 = bumper.ConfServer( conf_address_8007, usessl=False, - bumper_users=bumper.bumper_users_var, - bumper_bots=bumper.bumper_bots_var, - bumper_clients=bumper.bumper_clients_var, helperbot=mqtt_helperbot, ) diff --git a/bumper/__init__.py b/bumper/__init__.py index 9d07871..79c2063 100644 --- a/bumper/__init__.py +++ b/bumper/__init__.py @@ -67,37 +67,114 @@ class BumperUser(object): self.authcodes = [] self.bots = [] - def add_device(self, devid): - if not devid in self.devices: - self.devices.append(devid) + def asdict(self): + return { + "userid": self.userid, + "devices": self.devices, + "tokens": self.tokens, + "authcodes": self.authcodes, + "bots": self.bots, + } - def remove_device(self, devid): - if devid in self.devices: - self.devices.remove(devid) +def user_add(userid): + newuser = BumperUser() + newuser.userid = userid + + user = user_get(userid) + if not user: + bumperlog.info("Adding new user with userid: {}".format(newuser.userid)) + user_full_upsert(newuser.asdict()) - def add_token(self, token): - if not token in self.tokens: - self.tokens.append(token) +def user_get(userid): + users = db_get().table('users') + User = Query() + return users.get(User.userid == userid) - def revoke_token(self, token): - if token in self.tokens: - self.tokens.remove(token) +def user_full_upsert(user): + users = db_get().table('users') + User = Query() + users.upsert(user, User.did == user['userid']) - def add_authcode(self, authcode): - if not authcode in self.authcodes: - self.authcodes.append(authcode) +def user_add_device(userid, devid): + users = db_get().table('users') + User = Query() + user = users.get(User.userid == userid) + userdevices = list(user['devices']) + if not devid in userdevices: + userdevices.append(devid) + + users.upsert({'devices': userdevices}, User.userid == userid) - def revoke_authcode(self, authcode): - if authcode in self.authcodes: - self.authcodes.remove(authcode) +def user_remove_device(userid, devid): + users = db_get().table('users') + User = Query() + user = users.get(User.userid == userid) + userdevices = list(user['devices']) + if devid in userdevices: + userdevices.remove(devid) + + users.upsert({'devices': userdevices}, User.userid == userid) - def add_bot(self, botdid): - if not botdid in self.bots: - self.bots.append(botdid) +def user_add_bot(userid, did): + users = db_get().table('users') + User = Query() + user = users.get(User.userid == userid) + userbots = list(user['bots']) + if not did in userbots: + userbots.append(did) + + users.upsert({'bots': userbots}, User.userid == userid) - def remove_bot(self, botdid): - if botdid in self.bots: - self.bots.remove(botdid) +def user_remove_bot(userid, did): + users = db_get().table('users') + User = Query() + user = users.get(User.userid == userid) + userbots = list(user['bots']) + if did in userbots: + userbots.remove(did) + + users.upsert({'bots': userbots}, User.userid == userid) + + +def user_add_token(userid, token): + users = db_get().table('users') + User = Query() + user = users.get(User.userid == userid) + usertokens = list(user['tokens']) + if not token in usertokens: + usertokens.append(token) + + users.upsert({'tokens': usertokens}, User.userid == userid) + +def user_revoke_token(userid, token): + users = db_get().table('users') + User = Query() + user = users.get(User.userid == userid) + usertokens = list(user['tokens']) + if token in usertokens: + usertokens.remove(token) + + users.upsert({'tokens': usertokens}, User.userid == userid) + +def user_add_authcode(userid, authcode): + users = db_get().table('users') + User = Query() + user = users.get(User.userid == userid) + userauthcodes = list(user['authcodes']) + if not authcode in userauthcodes: + userauthcodes.append(authcode) + + users.upsert({'authcodes': userauthcodes}, User.userid == userid) + +def user_revoke_authcode(userid, authcode): + users = db_get().table('users') + User = Query() + user = users.get(User.userid == userid) + userauthcodes = list(user['authcodes']) + if authcode in userauthcodes: + userauthcodes.remove(authcode) + + users.upsert({'authcodes': userauthcodes}, User.userid == userid) class VacBotDevice(object): diff --git a/bumper/confserver.py b/bumper/confserver.py index 042f101..1d12c4a 100644 --- a/bumper/confserver.py +++ b/bumper/confserver.py @@ -37,21 +37,13 @@ logging.getLogger("aiohttp.access").addFilter(aiohttp_filter()) class ConfServer: - bumper_clients = contextvars.ContextVar - bumper_bots = contextvars.ContextVar def __init__( self, address, usessl=False, - bumper_users=contextvars.ContextVar, - bumper_bots=contextvars.ContextVar, - bumper_clients=contextvars.ContextVar, helperbot=None, ): - self.bumper_users = bumper_users - self.bumper_bots = bumper_bots - self.bumper_clients = bumper_clients self.helperbot = helperbot self.usessl = usessl self.address = address @@ -193,17 +185,17 @@ class ConfServer: if ( not user_devid == "" ): # Performing basic "auth" using devid, super insecure - users = self.bumper_users.get() + users = bumper.db_get().table('users').all() for user in users: - if user_devid in user.devices: + if user_devid in user['devices']: tmpaccesstoken = "" if "checkLogin" in request.path: if request.query[ "accessToken" - ] in user.tokens and request.query[ + ] in user['tokens'] and request.query[ "uid" ] == "fuid_{}".format( - user.userid + user['userid'] ): tmpaccesstoken = request.query["accessToken"] body = { @@ -212,9 +204,9 @@ class ConfServer: "accessToken": tmpaccesstoken, # Random chars 32 length "country": countrycode, "email": "null@null.com", - "uid": "fuid_{}".format(user.userid), + "uid": "fuid_{}".format(user['userid']), "username": "fusername_{}".format( - user.userid + user['userid'] ), }, "msg": "操作成功", @@ -230,7 +222,7 @@ class ConfServer: else: if tmpaccesstoken == "": tmpaccesstoken = uuid.uuid4().hex - user.add_token(tmpaccesstoken) + bumper.user_add_token(user['userid'],tmpaccesstoken) body = { "code": bumper.RETURN_API_SUCCESS, @@ -238,13 +230,12 @@ class ConfServer: "accessToken": tmpaccesstoken, # Random chars 32 length "country": countrycode, "email": "null@null.com", - "uid": "fuid_{}".format(user.userid), - "username": "fusername_{}".format(user.userid), + "uid": "fuid_{}".format(user['userid']), + "username": "fusername_{}".format(user['userid']), }, "msg": "操作成功", "time": bumper.get_milli_time(time.time()), } - self.bumper_users.set(users) return web.json_response(body) @@ -270,31 +261,31 @@ class ConfServer: countrycode = country tmpaccesstoken = "" - users = self.bumper_users.get() - bots = self.bumper_bots.get() - + users = bumper.db_get().table('users').all() + bots = bumper.db_get().table('bots').all() + if len(users) > 0: tmpuser = users[0] - tmpuser.add_device(user_devid) + bumper.user_add_device(tmpuser['userid'], user_devid) else: - tmpuser = bumper.BumperUser("tmpuser") - users.append(tmpuser) - tmpuser.add_device(user_devid) + bumper.user_add("tmpuser") + tmpuser = bumper.user_get("tmpuser") + bumper.user_add_device(tmpuser['userid'], user_devid) for bot in bots: - tmpuser.add_bot(bot.did) + bumper.user_add_bot(tmpuser['userid'], bot['did']) if "checkLogin" in request.path: tmpaccesstoken = request.query["accessToken"] - tmpuser.add_token(tmpaccesstoken) + bumper.user_add_token(tmpuser['userid'], tmpaccesstoken) body = { "code": bumper.RETURN_API_SUCCESS, "data": { "accessToken": tmpaccesstoken, # Random chars 32 length "country": countrycode, "email": "null@null.com", - "uid": "fuid_{}".format(tmpuser.userid), - "username": "fusername_{}".format(tmpuser.userid), + "uid": "fuid_{}".format(tmpuser['userid']), + "username": "fusername_{}".format(tmpuser['userid']), }, "msg": "操作成功", "time": bumper.get_milli_time(time.time()), @@ -302,7 +293,7 @@ class ConfServer: else: if tmpaccesstoken == "": tmpaccesstoken = uuid.uuid4().hex - tmpuser.add_token(tmpaccesstoken) + bumper.user_add_token(tmpuser['userid'], tmpaccesstoken) body = { "code": bumper.RETURN_API_SUCCESS, @@ -310,13 +301,12 @@ class ConfServer: "accessToken": tmpaccesstoken, # Random chars 32 length "country": countrycode, "email": "null@null.com", - "uid": "fuid_{}".format(tmpuser.userid), - "username": "fusername_{}".format(tmpuser.userid), + "uid": "fuid_{}".format(tmpuser['userid']), + "username": "fusername_{}".format(tmpuser['userid']), }, "msg": "操作成功", "time": bumper.get_milli_time(time.time()), } - self.bumper_users.set(users) return body @@ -327,15 +317,15 @@ class ConfServer: try: user_devid = request.match_info.get("devid", "") if not user_devid == "": - users = self.bumper_users.get() + + users = bumper.db_get().table('users').all() for user in users: - if user_devid in user.devices: + if user_devid in user['devices']: if ( - request.query["uid"] == "fuid_{}".format(user.userid) - and request.query["accessToken"] in user.tokens + request.query["uid"] == "fuid_{}".format(user['userid']) + and request.query["accessToken"] in user['tokens'] ): - user.revoke_token(request.query["accessToken"]) - self.bumper_users.set(users) + bumper.user_revoke_token(user['userid'],request.query["accessToken"]) body = { "code": bumper.RETURN_API_SUCCESS, @@ -354,16 +344,16 @@ class ConfServer: user_devid = request.match_info.get("devid", "") if not user_devid == "": - users = self.bumper_users.get() + users = bumper.db_get().table('users').all() if len(users) > 0: for user in users: if ( - user_devid in user.devices - and request.query["accessToken"] in user.tokens + user_devid in user['devices'] + and request.query["accessToken"] in user['tokens'] ): countrycode = request.match_info.get("country", "us") tmpauthcode = "{}_{}".format(countrycode, uuid.uuid4().hex) - user.add_authcode(tmpauthcode) + bumper.user_add_authcode(user['userid'], tmpauthcode) body = { "code": bumper.RETURN_API_SUCCESS, @@ -374,7 +364,6 @@ class ConfServer: "msg": "操作成功", "time": bumper.get_milli_time(time.time()), } - self.bumper_users.set(users) return web.json_response(body) body = { @@ -552,11 +541,11 @@ class ConfServer: body = {"result": "ok", "ip": "47.88.66.164", "port": 8005} elif todo == "loginByItToken": - users = self.bumper_users.get() + users = bumper.db_get().table('users').all() for user in users: if ( - postbody["userId"] == "fuid_{}".format(user.userid) - and postbody["token"] in user.authcodes + postbody["userId"] == "fuid_{}".format(user['userid']) + and postbody["token"] in user['authcodes'] ): body = { "resource": postbody["resource"], @@ -585,8 +574,7 @@ class ConfServer: confserverlog.debug( "\r\n POST: {} \r\n Response: {}".format(postbody, body) ) - - + return web.json_response(body) except Exception as e: diff --git a/bumper/mqttserver.py b/bumper/mqttserver.py index 2c4f344..7ee850c 100644 --- a/bumper/mqttserver.py +++ b/bumper/mqttserver.py @@ -404,7 +404,7 @@ class BumperMQTTServer_Plugin: clientresource = didsplit[1].split("/")[1] client = bumper.client_get(clientresource) if client: - bumper.client_set_mqtt(client['userid'], False) + bumper.client_set_mqtt(client['resource'], False) except Exception as e: mqttserverlog.exception("{}".format(e))