Updated confserver

Updated confserver to use tinydb and set users, tokens, authcodes
This commit is contained in:
Brian Martin 2019-03-03 10:28:52 -05:00
parent a4fec85717
commit 8806e804f0
4 changed files with 139 additions and 80 deletions

View file

@ -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,
)

View file

@ -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
def add_token(self, token):
if not token in self.tokens:
self.tokens.append(token)
user = user_get(userid)
if not user:
bumperlog.info("Adding new user with userid: {}".format(newuser.userid))
user_full_upsert(newuser.asdict())
def revoke_token(self, token):
if token in self.tokens:
self.tokens.remove(token)
def user_get(userid):
users = db_get().table('users')
User = Query()
return users.get(User.userid == userid)
def add_authcode(self, authcode):
if not authcode in self.authcodes:
self.authcodes.append(authcode)
def user_full_upsert(user):
users = db_get().table('users')
User = Query()
users.upsert(user, User.did == user['userid'])
def revoke_authcode(self, authcode):
if authcode in self.authcodes:
self.authcodes.remove(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)
def add_bot(self, botdid):
if not botdid in self.bots:
self.bots.append(botdid)
users.upsert({'devices': userdevices}, User.userid == userid)
def remove_bot(self, botdid):
if botdid in self.bots:
self.bots.remove(botdid)
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 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 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):

View file

@ -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"],
@ -586,7 +575,6 @@ class ConfServer:
"\r\n POST: {} \r\n Response: {}".format(postbody, body)
)
return web.json_response(body)
except Exception as e:

View file

@ -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))