add type hints

This commit is contained in:
Robert Resch 2022-08-17 10:29:25 +02:00
parent 42c8378833
commit b3fbf79290
14 changed files with 453 additions and 191 deletions

View file

@ -3,6 +3,7 @@ import logging
import os
import socket
import sys
from typing import Any
from bumper.db import revoke_expired_oauths, revoke_expired_tokens
from bumper.mqtt.helper_bot import HelperBot
@ -12,7 +13,7 @@ from bumper.web.server import WebServer, WebserverBinding
from bumper.xmppserver import XMPPServer
def strtobool(strbool):
def strtobool(strbool: str | bool | None) -> bool:
if str(strbool).lower() in ["true", "1", "t", "y", "on", "yes"]:
return True
else:
@ -64,12 +65,12 @@ web_server_https_port = os.environ.get("WEB_SERVER_HTTPS_PORT") or 443
mqtt_listen_port = 8883
xmpp_listen_port = 5223
web_server_bindings = [
WebserverBinding(bumper_listen, web_server_https_port, True),
WebserverBinding(bumper_listen, int(web_server_https_port), True),
WebserverBinding(bumper_listen, 8007, False),
]
async def start():
async def start() -> None:
try:
loop = asyncio.get_event_loop()
except:
@ -132,12 +133,12 @@ async def start():
await asyncio.sleep(5)
async def maintenance():
async def maintenance() -> None:
revoke_expired_tokens()
revoke_expired_oauths()
async def shutdown():
async def shutdown() -> None:
try:
bumperlog.info("Shutting down")
global shutting_down
@ -159,7 +160,7 @@ async def shutdown():
bumperlog.info("Coroutine canceled")
def main(argv=None):
def main(argv: None | list[str] = None) -> None:
import argparse
global bumper_debug

View file

@ -1,7 +1,9 @@
import os
from datetime import datetime, timedelta
from typing import Any
from tinydb import Query, TinyDB
from tinydb.table import Document
import bumper
from bumper.models import BumperUser, OAuth, VacBotClient, VacBotDevice
@ -11,11 +13,11 @@ from .util import get_logger
bumperlog = get_logger("bumper")
def db_file():
def db_file() -> str:
return os.environ.get("DB_FILE") or os_db_path()
def os_db_path(): # createdir=True):
def os_db_path() -> str: # createdir=True):
return os.path.join(bumper.data_dir, "bumper.db")
@ -33,7 +35,7 @@ def db_get() -> TinyDB:
return db
def user_add(userid):
def user_add(userid: str) -> None:
newuser = BumperUser()
newuser.userid = userid
@ -43,19 +45,19 @@ def user_add(userid):
user_full_upsert(newuser.asdict())
def user_get(userid):
def user_get(userid: str) -> None | Document:
users = db_get().table("users")
User = Query()
return users.get(User.userid == userid)
def user_by_deviceid(deviceid: str):
def user_by_deviceid(deviceid: str) -> None | Document:
users = db_get().table("users")
User = Query()
return users.get(User.devices.any([deviceid]))
def user_full_upsert(user):
def user_full_upsert(user: dict[str, Any]) -> None:
opendb = db_get()
with opendb:
users = opendb.table("users")
@ -63,12 +65,13 @@ def user_full_upsert(user):
users.upsert(user, User.did == user["userid"])
def user_add_device(userid, devid):
def user_add_device(userid: str, devid: str) -> None:
opendb = db_get()
with opendb:
users = opendb.table("users")
User = Query()
user = users.get(User.userid == userid)
if user:
userdevices = list(user["devices"])
if not devid in userdevices:
userdevices.append(devid)
@ -76,12 +79,13 @@ def user_add_device(userid, devid):
users.upsert({"devices": userdevices}, User.userid == userid)
def user_remove_device(userid, devid):
def user_remove_device(userid: str, devid: str) -> None:
opendb = db_get()
with opendb:
users = opendb.table("users")
User = Query()
user = users.get(User.userid == userid)
if user:
userdevices = list(user["devices"])
if devid in userdevices:
userdevices.remove(devid)
@ -89,12 +93,13 @@ def user_remove_device(userid, devid):
users.upsert({"devices": userdevices}, User.userid == userid)
def user_add_bot(userid, did):
def user_add_bot(userid: str, did: str) -> None:
opendb = db_get()
with opendb:
users = opendb.table("users")
User = Query()
user = users.get(User.userid == userid)
if user:
userbots = list(user["bots"])
if not did in userbots:
userbots.append(did)
@ -102,12 +107,13 @@ def user_add_bot(userid, did):
users.upsert({"bots": userbots}, User.userid == userid)
def user_remove_bot(userid, did):
def user_remove_bot(userid: str, did: str) -> None:
opendb = db_get()
with opendb:
users = opendb.table("users")
User = Query()
user = users.get(User.userid == userid)
if user:
userbots = list(user["bots"])
if did in userbots:
userbots.remove(did)
@ -115,17 +121,17 @@ def user_remove_bot(userid, did):
users.upsert({"bots": userbots}, User.userid == userid)
def user_get_tokens(userid):
def user_get_tokens(userid: str) -> list[Document]:
tokens = db_get().table("tokens")
return tokens.search(Query().userid == userid)
def user_get_token(userid, token):
def user_get_token(userid: str, token: str) -> Document | None:
tokens = db_get().table("tokens")
return tokens.get((Query().userid == userid) & (Query().token == token))
def user_add_token(userid, token):
def user_add_token(userid: str, token: str) -> None:
opendb = db_get()
with opendb:
tokens = opendb.table("tokens")
@ -144,7 +150,7 @@ def user_add_token(userid, token):
)
def user_revoke_all_tokens(userid):
def user_revoke_all_tokens(userid: str) -> None:
opendb = db_get()
with opendb:
tokens = opendb.table("tokens")
@ -153,7 +159,7 @@ def user_revoke_all_tokens(userid):
tokens.remove(doc_ids=[i.doc_id])
def user_revoke_expired_tokens(userid):
def user_revoke_expired_tokens(userid: str) -> None:
opendb = db_get()
with opendb:
tokens = opendb.table("tokens")
@ -166,7 +172,7 @@ def user_revoke_expired_tokens(userid):
tokens.remove(doc_ids=[i.doc_id])
def user_revoke_token(userid: str, token: str):
def user_revoke_token(userid: str, token: str) -> None:
opendb = db_get()
with opendb:
tokens = opendb.table("tokens")
@ -175,7 +181,7 @@ def user_revoke_token(userid: str, token: str):
tokens.remove(doc_ids=[tmptoken.doc_id])
def user_add_authcode(userid, token, authcode):
def user_add_authcode(userid: str, token: str, authcode: str) -> None:
opendb = db_get()
with opendb:
tokens = opendb.table("tokens")
@ -187,7 +193,7 @@ def user_add_authcode(userid, token, authcode):
)
def user_revoke_authcode(userid, token, authcode):
def user_revoke_authcode(userid: str, token: str) -> None:
opendb = db_get()
with opendb:
tokens = opendb.table("tokens")
@ -199,7 +205,7 @@ def user_revoke_authcode(userid, token, authcode):
)
def revoke_expired_oauths():
def revoke_expired_oauths() -> None:
opendb = db_get()
with opendb:
table = opendb.table("oauth")
@ -214,7 +220,7 @@ def revoke_expired_oauths():
table.remove(doc_ids=[i.doc_id])
def user_revoke_expired_oauths(userid):
def user_revoke_expired_oauths(userid: str) -> None:
opendb = db_get()
with opendb:
table = opendb.table("oauth")
@ -228,7 +234,7 @@ def user_revoke_expired_oauths(userid):
table.remove(doc_ids=[i.doc_id])
def user_add_oauth(userid) -> OAuth:
def user_add_oauth(userid: str) -> OAuth:
user_revoke_expired_oauths(userid)
opendb = db_get()
with opendb:
@ -243,12 +249,12 @@ def user_add_oauth(userid) -> OAuth:
return oauth
def token_by_authcode(authcode: str):
def token_by_authcode(authcode: str) -> Document | None:
tokens = db_get().table("tokens")
return tokens.get(Query().authcode == authcode)
def get_disconnected_xmpp_clients():
def get_disconnected_xmpp_clients() -> list[Document]:
clients = db_get().table("clients")
Client = Query()
return clients.search(Client.xmpp_connection == False)
@ -270,7 +276,7 @@ def check_authcode(uid: str, authcode: str) -> bool:
return False
def loginByItToken(authcode):
def loginByItToken(authcode: str) -> dict[str, str]:
bumperlog.debug(f"Checking for authcode: {authcode}")
tokens = db_get().table("tokens")
tmpauth = tokens.get(
@ -303,7 +309,7 @@ def check_token(uid: str, token: str) -> bool:
return False
def revoke_expired_tokens():
def revoke_expired_tokens() -> None:
tokens = db_get().table("tokens").all()
for i in tokens:
if datetime.now() >= datetime.fromisoformat(i["expiration"]):
@ -328,20 +334,20 @@ def bot_add(sn: str, did: str, devclass: str, resource: str, company: str) -> No
bot_full_upsert(newbot.asdict())
def bot_remove(did: str):
def bot_remove(did: str) -> None:
bots = db_get().table("bots")
bot = bot_get(did)
if bot:
bots.remove(doc_ids=[bot.doc_id])
def bot_get(did: str):
def bot_get(did: str) -> Document | None:
bots = db_get().table("bots")
Bot = Query()
return bots.get(Bot.did == did)
def bot_full_upsert(vacbot):
def bot_full_upsert(vacbot: dict[str, Any]) -> None:
bots = db_get().table("bots")
Bot = Query()
if "did" in vacbot:
@ -350,7 +356,7 @@ def bot_full_upsert(vacbot):
bumperlog.error(f"No DID in vacbot: {vacbot}")
def bot_set_nick(did, nick):
def bot_set_nick(did: str, nick: str) -> None:
bots = db_get().table("bots")
Bot = Query()
bots.upsert({"nick": nick}, Bot.did == did)
@ -362,7 +368,7 @@ def bot_set_mqtt(did: str, mqtt: bool) -> None:
bots.upsert({"mqtt_connection": mqtt}, Bot.did == did)
def bot_set_xmpp(did, xmpp):
def bot_set_xmpp(did: str, xmpp: bool) -> None:
bots = db_get().table("bots")
Bot = Query()
bots.upsert({"xmpp_connection": xmpp}, Bot.did == did)
@ -380,20 +386,20 @@ def client_add(userid: str, realm: str, resource: str) -> None:
client_full_upsert(newclient.asdict())
def client_remove(resource: str):
def client_remove(resource: str) -> None:
clients = db_get().table("clients")
client = client_get(resource)
if client:
clients.remove(doc_ids=[client.doc_id])
def client_get(resource: str):
def client_get(resource: str) -> Document | None:
clients = db_get().table("clients")
Client = Query()
return clients.get(Client.resource == resource)
def client_full_upsert(client):
def client_full_upsert(client: dict[str, Any]) -> None:
clients = db_get().table("clients")
Client = Query()
clients.upsert(client, Client.resource == client["resource"])
@ -405,7 +411,7 @@ def client_set_mqtt(resource: str, mqtt: bool) -> None:
clients.upsert({"mqtt_connection": mqtt}, Client.resource == resource)
def client_set_xmpp(resource, xmpp):
def client_set_xmpp(resource: str, xmpp: bool) -> None:
clients = db_get().table("clients")
Client = Query()
clients.upsert({"xmpp_connection": xmpp}, Client.resource == resource)

View file

@ -88,7 +88,7 @@ class EcoVacs_Login:
class EcoVacsHome_Login(EcoVacs_Login):
loginName = ""
mobile = ""
mobile: str | None = ""
ucUid = ""

View file

@ -41,6 +41,7 @@ def get_logger(name: str, rotate: RotatingFileHandler | None = None) -> logging.
) # Ignore this logger
get_logger("amqtt.broker", rotate)
get_logger("amqtt.mqtt.protocol", rotate)
elif name == "helperbot":
get_logger("gmqtt", rotate)
return logger

View file

@ -2,6 +2,7 @@
import json
import logging
import uuid
from typing import Any
from aiohttp import web
from aiohttp.web_exceptions import HTTPInternalServerError
@ -35,29 +36,21 @@ from bumper.web.plugins import get_success_response
_logger = get_logger("confserver")
def generate_token(user):
def _generate_token(user: dict[str, Any]) -> str:
"""Generate token."""
try:
tmpaccesstoken = uuid.uuid4().hex
user_add_token(user["userid"], tmpaccesstoken)
return tmpaccesstoken
except Exception as e:
_logger.exception(f"{e}")
token = uuid.uuid4().hex
user_add_token(user["userid"], token)
return token
def generate_authcode(user, countrycode, token):
def _generate_authcode(user: dict[str, Any], countrycode: str, token: str) -> str:
"""Generate auth token."""
try:
tmpauthcode = f"{countrycode}_{uuid.uuid4().hex}"
user_add_authcode(user["userid"], token, tmpauthcode)
return tmpauthcode
except Exception as e:
_logger.exception(f"{e}")
async def login(request):
async def login(request: Request) -> Response:
"""Perform login."""
try:
user_devid = request.match_info.get("devid", "")
@ -69,15 +62,19 @@ async def login(request):
not user_devid == ""
): # Performing basic "auth" using devid, super insecure
user = user_by_deviceid(user_devid)
if user:
if "checkLogin" in request.path:
_check_token(
apptype, countrycode, user, request.query["accessToken"]
)
else:
login_details: EcoVacsHome_Login | EcoVacs_Login
if "global_" in apptype: # EcoVacs Home
login_details = EcoVacsHome_Login()
login_details.ucUid = "fuid_{}".format(user["userid"])
login_details.loginName = "fusername_{}".format(user["userid"])
login_details.loginName = "fusername_{}".format(
user["userid"]
)
login_details.mobile = None
else:
@ -86,7 +83,7 @@ async def login(request):
# Deactivate old tokens and authcodes
user_revoke_expired_tokens(user["userid"])
login_details.accessToken = generate_token(user)
login_details.accessToken = _generate_token(user)
login_details.uid = "fuid_{}".format(user["userid"])
login_details.username = "fusername_{}".format(user["userid"])
login_details.country = countrycode
@ -125,6 +122,8 @@ async def login(request):
except Exception as e:
_logger.exception(f"{e}")
raise HTTPInternalServerError
async def get_authcode(request: Request) -> Response:
"""Get auth code."""
@ -142,7 +141,7 @@ async def get_authcode(request: Request) -> Response:
if "authcode" in token:
authcode = token["authcode"]
else:
authcode = generate_authcode(
authcode = _generate_authcode(
user,
request.match_info.get("country", "us"),
request.query["accessToken"],
@ -170,10 +169,12 @@ async def get_authcode(request: Request) -> Response:
raise HTTPInternalServerError
def _check_token(apptype, countrycode, user, token):
def _check_token(
apptype: str, countrycode: str, user: dict[str, Any], token: str
) -> Response:
try:
if db.check_token(user["userid"], token):
login_details: EcoVacsHome_Login | EcoVacs_Login
if "global_" in apptype: # EcoVacs Home
login_details = EcoVacsHome_Login()
login_details.ucUid = "fuid_{}".format(user["userid"])
@ -215,13 +216,18 @@ def _check_token(apptype, countrycode, user, token):
except Exception as e:
_logger.exception(f"{e}")
raise HTTPInternalServerError
def _auth_any(devid, apptype, country, request):
def _auth_any(
devid: str, apptype: str, country: str, request: Request
) -> dict[str, Any]:
try:
user_devid = devid
countrycode = country
user = user_by_deviceid(user_devid)
bots = db_get().table("bots").all()
login_details: EcoVacs_Login | EcoVacsHome_Login
if user: # Default to user 0
tmpuser = user
@ -233,7 +239,7 @@ def _auth_any(devid, apptype, country, request):
else:
login_details = EcoVacs_Login()
login_details.accessToken = generate_token(tmpuser)
login_details.accessToken = _generate_token(tmpuser)
login_details.uid = "fuid_{}".format(tmpuser["userid"])
login_details.username = "fusername_{}".format(tmpuser["userid"])
login_details.country = countrycode
@ -241,7 +247,9 @@ def _auth_any(devid, apptype, country, request):
user_add_device(tmpuser["userid"], user_devid)
else:
user_add("tmpuser") # Add a new user
tmpuser = user_get("tmpuser")
tmp = user_get("tmpuser")
assert tmp
tmpuser = tmp
if "global_" in apptype: # EcoVacs Home
login_details = EcoVacsHome_Login()
login_details.ucUid = "fuid_{}".format(tmpuser["userid"])
@ -250,7 +258,7 @@ def _auth_any(devid, apptype, country, request):
else:
login_details = EcoVacs_Login()
login_details.accessToken = generate_token(tmpuser)
login_details.accessToken = _generate_token(tmpuser)
login_details.uid = "fuid_{}".format(tmpuser["userid"])
login_details.username = "fusername_{}".format(tmpuser["userid"])
login_details.country = countrycode
@ -267,7 +275,7 @@ def _auth_any(devid, apptype, country, request):
checkToken = _check_token(
apptype, countrycode, tmpuser, request.query["accessToken"]
)
isGood = json.loads(checkToken.text)
isGood: dict[str, Any] = json.loads(checkToken.text)
if isGood["code"] == "0000":
return isGood
@ -292,3 +300,4 @@ def _auth_any(devid, apptype, country, request):
except Exception as e:
_logger.exception(f"{e}")
return {}

View file

@ -181,7 +181,9 @@ async def _handle_appsvr_service_list(_: Request) -> Response:
async def _handle_appsvr_oauth_callback(request: Request) -> Response:
try:
token = token_by_authcode(request.query["code"])
if token:
oauth = user_add_oauth(token["userid"])
if oauth:
body = {
"code": 0,
"data": oauth.toResponse(),

View file

@ -30,7 +30,7 @@ async def _handle_dim_devmanager(request: Request) -> Response:
if did != "":
bot = bot_get(did)
if bot["company"] == "eco-ng" and bot["mqtt_connection"]:
if bot and bot["company"] == "eco-ng" and bot["mqtt_connection"]:
retcmd = await bumper.mqtt_helperbot.send_command(json_body, randomid)
body = retcmd
logging.debug("Send Bot - %s", json_body)

View file

@ -28,7 +28,7 @@ async def _handle_devmanager_bot_command(request: Request) -> Response:
if did != "":
bot = bot_get(did)
if bot["company"] == "eco-ng":
if bot and bot["company"] == "eco-ng":
retcmd = await bumper.mqtt_helperbot.send_command(json_body, randomid)
body = retcmd
logging.debug("Send Bot - %s", json_body)

View file

@ -53,7 +53,7 @@ async def _handle_lg_log(request: Request) -> Response:
if did != "":
bot = bot_get(did)
if bot["company"] == "eco-ng":
if bot and bot["company"] == "eco-ng":
retcmd = await bumper.mqtt_helperbot.send_command(json_body, randomid)
body = retcmd
logging.debug("Send Bot - %s", json_body)

View file

@ -1,14 +1,23 @@
{
"currentVersion": 231,
"areaList": [
{ "areaKey": "JP", "chsName": "日本", "enName": "Japan", "pyFirst": "R" },
{
"areaKey": "JP",
"chsName": "日本",
"enName": "Japan",
"pyFirst": "R"
},
{
"areaKey": "MY",
"chsName": "马来西亚",
"enName": "Malaysia",
"pyFirst": "M"
},
{ "areaKey": "DE", "chsName": "德国", "enName": "Germany", "pyFirst": "D" },
{
"areaKey": "DE",
"chsName": "德国",
"enName": "Germany",
"pyFirst": "D"
},
{
"areaKey": "LI",
"chsName": "列支敦斯登",
@ -21,8 +30,18 @@
"enName": "Austria",
"pyFirst": "A"
},
{ "areaKey": "TW", "chsName": "台湾", "enName": "Taiwan", "pyFirst": "T" },
{ "areaKey": "FR", "chsName": "法国", "enName": "France", "pyFirst": "F" },
{
"areaKey": "TW",
"chsName": "台湾",
"enName": "Taiwan",
"pyFirst": "T"
},
{
"areaKey": "FR",
"chsName": "法国",
"enName": "France",
"pyFirst": "F"
},
{
"areaKey": "CN",
"chsName": "中国大陆",
@ -101,7 +120,12 @@
"enName": "Vanuatu",
"pyFirst": "W"
},
{ "areaKey": "IN", "chsName": "印度", "enName": "India", "pyFirst": "Y" },
{
"areaKey": "IN",
"chsName": "印度",
"enName": "India",
"pyFirst": "Y"
},
{
"areaKey": "CM",
"chsName": "喀麦隆",
@ -126,7 +150,12 @@
"enName": "Cayman Islands",
"pyFirst": "K"
},
{ "areaKey": "QA", "chsName": "卡塔尔", "enName": "Qatar", "pyFirst": "K" },
{
"areaKey": "QA",
"chsName": "卡塔尔",
"enName": "Qatar",
"pyFirst": "K"
},
{
"areaKey": "AZ",
"chsName": "阿塞拜疆",
@ -157,7 +186,12 @@
"enName": "Colombia",
"pyFirst": "G"
},
{ "areaKey": "IR", "chsName": "伊朗", "enName": "Iran", "pyFirst": "Y" },
{
"areaKey": "IR",
"chsName": "伊朗",
"enName": "Iran",
"pyFirst": "Y"
},
{
"areaKey": "ZA",
"chsName": "南非",
@ -170,8 +204,18 @@
"enName": "Uruguay",
"pyFirst": "W"
},
{ "areaKey": "GU", "chsName": "关岛", "enName": "Guam", "pyFirst": "G" },
{ "areaKey": "GH", "chsName": "加纳", "enName": "Ghana", "pyFirst": "J" },
{
"areaKey": "GU",
"chsName": "关岛",
"enName": "Guam",
"pyFirst": "G"
},
{
"areaKey": "GH",
"chsName": "加纳",
"enName": "Ghana",
"pyFirst": "J"
},
{
"areaKey": "GN",
"chsName": "几内亚",
@ -184,16 +228,36 @@
"enName": "Marshall Islands",
"pyFirst": "M"
},
{ "areaKey": "SE", "chsName": "瑞典", "enName": "Sweden", "pyFirst": "R" },
{
"areaKey": "SE",
"chsName": "瑞典",
"enName": "Sweden",
"pyFirst": "R"
},
{
"areaKey": "SB",
"chsName": "所罗门群岛",
"enName": "Solomon Islands",
"pyFirst": "S"
},
{ "areaKey": "NE", "chsName": "尼日尔", "enName": "Niger", "pyFirst": "N" },
{ "areaKey": "HT", "chsName": "海地", "enName": "Haiti", "pyFirst": "H" },
{ "areaKey": "PL", "chsName": "波兰", "enName": "Poland", "pyFirst": "B" },
{
"areaKey": "NE",
"chsName": "尼日尔",
"enName": "Niger",
"pyFirst": "N"
},
{
"areaKey": "HT",
"chsName": "海地",
"enName": "Haiti",
"pyFirst": "H"
},
{
"areaKey": "PL",
"chsName": "波兰",
"enName": "Poland",
"pyFirst": "B"
},
{
"areaKey": "DO",
"chsName": "多米尼加共和国",
@ -230,7 +294,12 @@
"enName": "Kyrgyzstan",
"pyFirst": "J"
},
{ "areaKey": "JO", "chsName": "约旦", "enName": "Jordan", "pyFirst": "Y" },
{
"areaKey": "JO",
"chsName": "约旦",
"enName": "Jordan",
"pyFirst": "Y"
},
{
"areaKey": "IL",
"chsName": "以色列",
@ -291,7 +360,12 @@
"enName": "Ethiopia",
"pyFirst": "A"
},
{ "areaKey": "CL", "chsName": "智利", "enName": "Chile", "pyFirst": "Z" },
{
"areaKey": "CL",
"chsName": "智利",
"enName": "Chile",
"pyFirst": "Z"
},
{
"areaKey": "GP",
"chsName": "瓜德罗普岛",
@ -328,7 +402,12 @@
"enName": "Maldives",
"pyFirst": "M"
},
{ "areaKey": "CU", "chsName": "古巴", "enName": "Cuba", "pyFirst": "G" },
{
"areaKey": "CU",
"chsName": "古巴",
"enName": "Cuba",
"pyFirst": "G"
},
{
"areaKey": "LS",
"chsName": "莱索托",
@ -383,7 +462,12 @@
"enName": "Latvia",
"pyFirst": "L"
},
{ "areaKey": "NO", "chsName": "挪威", "enName": "Norway", "pyFirst": "N" },
{
"areaKey": "NO",
"chsName": "挪威",
"enName": "Norway",
"pyFirst": "N"
},
{
"areaKey": "BE",
"chsName": "比利时",
@ -456,7 +540,12 @@
"enName": "Bangladesh",
"pyFirst": "M"
},
{ "areaKey": "TD", "chsName": "乍得", "enName": "Chad", "pyFirst": "Z" },
{
"areaKey": "TD",
"chsName": "乍得",
"enName": "Chad",
"pyFirst": "Z"
},
{
"areaKey": "LT",
"chsName": "立陶宛",
@ -481,7 +570,12 @@
"enName": "Bahamas",
"pyFirst": "B"
},
{ "areaKey": "MM", "chsName": "缅甸", "enName": "Myanmar", "pyFirst": "M" },
{
"areaKey": "MM",
"chsName": "缅甸",
"enName": "Myanmar",
"pyFirst": "M"
},
{
"areaKey": "BI",
"chsName": "布隆迪",
@ -500,8 +594,18 @@
"enName": "Slovakia",
"pyFirst": "S"
},
{ "areaKey": "FI", "chsName": "芬兰", "enName": "Finland", "pyFirst": "F" },
{ "areaKey": "GA", "chsName": "加蓬", "enName": "Gabon", "pyFirst": "J" },
{
"areaKey": "FI",
"chsName": "芬兰",
"enName": "Finland",
"pyFirst": "F"
},
{
"areaKey": "GA",
"chsName": "加蓬",
"enName": "Gabon",
"pyFirst": "J"
},
{
"areaKey": "DZ",
"chsName": "阿尔及利亚",
@ -520,7 +624,12 @@
"enName": "Zambia",
"pyFirst": "Z"
},
{ "areaKey": "NU", "chsName": "纽埃", "enName": "Niue", "pyFirst": "N" },
{
"areaKey": "NU",
"chsName": "纽埃",
"enName": "Niue",
"pyFirst": "N"
},
{
"areaKey": "ER",
"chsName": "厄立特里亚国",
@ -533,7 +642,12 @@
"enName": "Hong Kong",
"pyFirst": "X"
},
{ "areaKey": "IT", "chsName": "意大利", "enName": "Italy", "pyFirst": "Y" },
{
"areaKey": "IT",
"chsName": "意大利",
"enName": "Italy",
"pyFirst": "Y"
},
{
"areaKey": "MS",
"chsName": "蒙特色拉特岛",
@ -546,9 +660,24 @@
"enName": "Estonia",
"pyFirst": "A"
},
{ "areaKey": "WS", "chsName": "萨摩亚", "enName": "Samoa", "pyFirst": "S" },
{ "areaKey": "TG", "chsName": "多哥", "enName": "Togo", "pyFirst": "D" },
{ "areaKey": "ML", "chsName": "马里", "enName": "Mali", "pyFirst": "M" },
{
"areaKey": "WS",
"chsName": "萨摩亚",
"enName": "Samoa",
"pyFirst": "S"
},
{
"areaKey": "TG",
"chsName": "多哥",
"enName": "Togo",
"pyFirst": "D"
},
{
"areaKey": "ML",
"chsName": "马里",
"enName": "Mali",
"pyFirst": "M"
},
{
"areaKey": "GF",
"chsName": "法属圭亚那",
@ -567,8 +696,18 @@
"enName": "Indonesia",
"pyFirst": "Y"
},
{ "areaKey": "KE", "chsName": "肯尼亚", "enName": "Kenya", "pyFirst": "K" },
{ "areaKey": "EG", "chsName": "埃及", "enName": "Egypt", "pyFirst": "A" },
{
"areaKey": "KE",
"chsName": "肯尼亚",
"enName": "Kenya",
"pyFirst": "K"
},
{
"areaKey": "EG",
"chsName": "埃及",
"enName": "Egypt",
"pyFirst": "A"
},
{
"areaKey": "NF",
"chsName": "诺福克岛",
@ -587,7 +726,12 @@
"enName": "Turkey",
"pyFirst": "T"
},
{ "areaKey": "DK", "chsName": "丹麦", "enName": "Denmark", "pyFirst": "D" },
{
"areaKey": "DK",
"chsName": "丹麦",
"enName": "Denmark",
"pyFirst": "D"
},
{
"areaKey": "AD",
"chsName": "安道尔",
@ -624,7 +768,12 @@
"enName": "East Timor",
"pyFirst": "D"
},
{ "areaKey": "LY", "chsName": "利比亚", "enName": "Libya", "pyFirst": "L" },
{
"areaKey": "LY",
"chsName": "利比亚",
"enName": "Libya",
"pyFirst": "L"
},
{
"areaKey": "RW",
"chsName": "卢旺达",
@ -697,14 +846,24 @@
"enName": "Guatemala",
"pyFirst": "W"
},
{ "areaKey": "BT", "chsName": "不丹", "enName": "Bhutan", "pyFirst": "B" },
{
"areaKey": "BT",
"chsName": "不丹",
"enName": "Bhutan",
"pyFirst": "B"
},
{
"areaKey": "AI",
"chsName": "安圭拉岛",
"enName": "Anguilla",
"pyFirst": "A"
},
{ "areaKey": "OM", "chsName": "阿曼", "enName": "Oman", "pyFirst": "A" },
{
"areaKey": "OM",
"chsName": "阿曼",
"enName": "Oman",
"pyFirst": "A"
},
{
"areaKey": "KI",
"chsName": "基里巴斯",
@ -717,7 +876,12 @@
"enName": "Ukraine",
"pyFirst": "W"
},
{ "areaKey": "YE", "chsName": "也门", "enName": "Yemen", "pyFirst": "Y" },
{
"areaKey": "YE",
"chsName": "也门",
"enName": "Yemen",
"pyFirst": "Y"
},
{
"areaKey": "DR",
"chsName": "刚果民主共和国",
@ -754,14 +918,24 @@
"enName": "Bosnia Hercegovina",
"pyFirst": "B"
},
{ "areaKey": "MO", "chsName": "澳门", "enName": "Macao", "pyFirst": "A" },
{
"areaKey": "MO",
"chsName": "澳门",
"enName": "Macao",
"pyFirst": "A"
},
{
"areaKey": "KN",
"chsName": "圣基茨和尼维斯",
"enName": "Saint Kitts and Nevis",
"pyFirst": "S"
},
{ "areaKey": "TO", "chsName": "汤加", "enName": "Tonga", "pyFirst": "T" },
{
"areaKey": "TO",
"chsName": "汤加",
"enName": "Tonga",
"pyFirst": "T"
},
{
"areaKey": "NG",
"chsName": "尼日利亚",
@ -780,7 +954,12 @@
"enName": "Central African Republic",
"pyFirst": "Z"
},
{ "areaKey": "PE", "chsName": "秘鲁", "enName": "Peru", "pyFirst": "M" },
{
"areaKey": "PE",
"chsName": "秘鲁",
"enName": "Peru",
"pyFirst": "M"
},
{
"areaKey": "PG",
"chsName": "巴布亚新几内亚",
@ -805,10 +984,30 @@
"enName": "Bolivia",
"pyFirst": "B"
},
{ "areaKey": "IQ", "chsName": "伊拉克", "enName": "Iraq", "pyFirst": "Y" },
{ "areaKey": "NP", "chsName": "尼泊尔", "enName": "Nepal", "pyFirst": "N" },
{ "areaKey": "BJ", "chsName": "贝宁", "enName": "Benin", "pyFirst": "B" },
{ "areaKey": "VN", "chsName": "越南", "enName": "Vietnam", "pyFirst": "Y" },
{
"areaKey": "IQ",
"chsName": "伊拉克",
"enName": "Iraq",
"pyFirst": "Y"
},
{
"areaKey": "NP",
"chsName": "尼泊尔",
"enName": "Nepal",
"pyFirst": "N"
},
{
"areaKey": "BJ",
"chsName": "贝宁",
"enName": "Benin",
"pyFirst": "B"
},
{
"areaKey": "VN",
"chsName": "越南",
"enName": "Vietnam",
"pyFirst": "Y"
},
{
"areaKey": "NI",
"chsName": "尼加拉瓜",
@ -833,7 +1032,12 @@
"enName": "San Marino",
"pyFirst": "S"
},
{ "areaKey": "NR", "chsName": "瑙鲁", "enName": "Nauru", "pyFirst": "N" },
{
"areaKey": "NR",
"chsName": "瑙鲁",
"enName": "Nauru",
"pyFirst": "N"
},
{
"areaKey": "BN",
"chsName": "文莱",
@ -846,7 +1050,12 @@
"enName": "Mozambique",
"pyFirst": "M"
},
{ "areaKey": "GR", "chsName": "希腊", "enName": "Greece", "pyFirst": "X" },
{
"areaKey": "GR",
"chsName": "希腊",
"enName": "Greece",
"pyFirst": "X"
},
{
"areaKey": "TN",
"chsName": "突尼斯",
@ -889,7 +1098,12 @@
"enName": "Mauritius",
"pyFirst": "M"
},
{ "areaKey": "LA", "chsName": "老挝", "enName": "Laos", "pyFirst": "L" },
{
"areaKey": "LA",
"chsName": "老挝",
"enName": "Laos",
"pyFirst": "L"
},
{
"areaKey": "US",
"chsName": "美国",
@ -1022,14 +1236,24 @@
"enName": "Cyprus",
"pyFirst": "S"
},
{ "areaKey": "BR", "chsName": "巴西", "enName": "Brazil", "pyFirst": "B" },
{
"areaKey": "BR",
"chsName": "巴西",
"enName": "Brazil",
"pyFirst": "B"
},
{
"areaKey": "LB",
"chsName": "黎巴嫩",
"enName": "Lebanon",
"pyFirst": "L"
},
{ "areaKey": "IS", "chsName": "冰岛", "enName": "Iceland", "pyFirst": "B" },
{
"areaKey": "IS",
"chsName": "冰岛",
"enName": "Iceland",
"pyFirst": "B"
},
{
"areaKey": "PA",
"chsName": "巴拿马",
@ -1054,14 +1278,24 @@
"enName": "New Caledonia",
"pyFirst": "X"
},
{ "areaKey": "MT", "chsName": "马尔他", "enName": "Malta", "pyFirst": "M" },
{
"areaKey": "MT",
"chsName": "马尔他",
"enName": "Malta",
"pyFirst": "M"
},
{
"areaKey": "BG",
"chsName": "保加利亚",
"enName": "Bulgaria",
"pyFirst": "B"
},
{ "areaKey": "ES", "chsName": "西班牙", "enName": "Spain", "pyFirst": "X" },
{
"areaKey": "ES",
"chsName": "西班牙",
"enName": "Spain",
"pyFirst": "X"
},
{
"areaKey": "CI",
"chsName": "象牙海岸",
@ -1098,14 +1332,24 @@
"enName": "Georgia",
"pyFirst": "G"
},
{ "areaKey": "SD", "chsName": "苏丹", "enName": "Sudan", "pyFirst": "S" },
{
"areaKey": "SD",
"chsName": "苏丹",
"enName": "Sudan",
"pyFirst": "S"
},
{
"areaKey": "PR",
"chsName": "波多黎各",
"enName": "Puerto Rico",
"pyFirst": "B"
},
{ "areaKey": "FJ", "chsName": "斐济", "enName": "Fiji", "pyFirst": "F" },
{
"areaKey": "FJ",
"chsName": "斐济",
"enName": "Fiji",
"pyFirst": "F"
},
{
"areaKey": "NL",
"chsName": "荷兰",
@ -1130,5 +1374,6 @@
"enName": "Turks and Caicos Islands",
"pyFirst": "T"
}
]
],
"currentVersion": 231
}

View file

@ -102,6 +102,7 @@ async def _get_user_account_info(request: Request) -> Response:
try:
user_devid = request.match_info.get("devid", "")
user = user_by_deviceid(user_devid)
if user:
username = f"fusername_{user['userid']}"
return get_success_response(
{

View file

@ -177,7 +177,7 @@ class WebServer:
async def _log_all_requests(
self, request: Request, handler: Handler
) -> StreamResponse:
if request._match_info.route.name not in self._EXCLUDE_FROM_LOGGING:
if request.match_info.route.name not in self._EXCLUDE_FROM_LOGGING:
to_log = {
"request": {
"route_name": f"{request.match_info.route.name}",

View file

@ -42,7 +42,6 @@ good-names=i,j,k,ex,_,T,x,y,id
# wrong-import-order - isort guards this
disable=
format,
abstract-class-little-used,
abstract-method,
cyclic-import,
duplicate-code,

View file

@ -56,9 +56,7 @@ def test_user_db():
assert db.check_authcode("testuser", "auth_1234")
# Test that authcode was found for testuser
db.user_revoke_authcode(
"testuser", "token_1234", "auth_1234"
) # Remove authcode from testuser
db.user_revoke_authcode("testuser", "token_1234") # Remove authcode from testuser
assert db.check_authcode("testuser", "auth_1234") == False
# Test that authcode was not found for testuser
db.user_revoke_token("testuser", "token_1234") # Remove token from testuser