Update.
This commit is contained in:
parent
d022cff499
commit
a07f2680d6
@ -38,6 +38,7 @@ dependencies = [
|
|||||||
"humanize",
|
"humanize",
|
||||||
"Pillow",
|
"Pillow",
|
||||||
"pillow-heif",
|
"pillow-heif",
|
||||||
|
"IP2Location",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.setuptools.packages.find]
|
[tool.setuptools.packages.find]
|
||||||
|
BIN
src/snek/IP2LOCATION-LITE-DB11.BIN
Executable file
BIN
src/snek/IP2LOCATION-LITE-DB11.BIN
Executable file
Binary file not shown.
@ -8,7 +8,7 @@ from snek import snode
|
|||||||
from snek.view.threads import ThreadsView
|
from snek.view.threads import ThreadsView
|
||||||
import json
|
import json
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
from ipaddress import ip_address
|
||||||
from concurrent.futures import ThreadPoolExecutor
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
|
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
@ -20,7 +20,7 @@ from aiohttp_session import (
|
|||||||
from aiohttp_session.cookie_storage import EncryptedCookieStorage
|
from aiohttp_session.cookie_storage import EncryptedCookieStorage
|
||||||
from app.app import Application as BaseApplication
|
from app.app import Application as BaseApplication
|
||||||
from jinja2 import FileSystemLoader
|
from jinja2 import FileSystemLoader
|
||||||
|
import IP2Location
|
||||||
from snek.sssh import start_ssh_server
|
from snek.sssh import start_ssh_server
|
||||||
from snek.docs.app import Application as DocsApplication
|
from snek.docs.app import Application as DocsApplication
|
||||||
from snek.mapper import get_mappers
|
from snek.mapper import get_mappers
|
||||||
@ -69,6 +69,29 @@ async def session_middleware(request, handler):
|
|||||||
response = await handler(request)
|
response = await handler(request)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
@web.middleware
|
||||||
|
async def ip2location_middleware(request, handler):
|
||||||
|
response = await handler(request)
|
||||||
|
ip = request.headers.get("X-Forwarded-For", request.remote)
|
||||||
|
ipaddress = ip_address(ip)
|
||||||
|
if ipaddress.is_private:
|
||||||
|
return response
|
||||||
|
if not request.app.session.get("uid"):
|
||||||
|
return response
|
||||||
|
user = await request.app.services.user.get(uid=request.app.session.get("uid"))
|
||||||
|
if not user:
|
||||||
|
return response
|
||||||
|
location = request.app.ip2location.get(ip)
|
||||||
|
original_city = user['city']
|
||||||
|
if user['city'] != location.city:
|
||||||
|
user['country_long'] = location.country
|
||||||
|
user['country_short'] = locaion.country_short
|
||||||
|
user['city'] = location.city
|
||||||
|
user['region'] = location.region
|
||||||
|
user['latitude'] = location.latitude
|
||||||
|
user['longitude'] = location.longitude
|
||||||
|
await request.app.services.user.update(user)
|
||||||
|
return response
|
||||||
|
|
||||||
@web.middleware
|
@web.middleware
|
||||||
async def trailing_slash_middleware(request, handler):
|
async def trailing_slash_middleware(request, handler):
|
||||||
@ -84,6 +107,7 @@ class Application(BaseApplication):
|
|||||||
middlewares = [
|
middlewares = [
|
||||||
cors_middleware,
|
cors_middleware,
|
||||||
web.normalize_path_middleware(merge_slashes=True),
|
web.normalize_path_middleware(merge_slashes=True),
|
||||||
|
ip2location_middleware
|
||||||
]
|
]
|
||||||
self.template_path = pathlib.Path(__file__).parent.joinpath("templates")
|
self.template_path = pathlib.Path(__file__).parent.joinpath("templates")
|
||||||
self.static_path = pathlib.Path(__file__).parent.joinpath("static")
|
self.static_path = pathlib.Path(__file__).parent.joinpath("static")
|
||||||
@ -111,11 +135,15 @@ class Application(BaseApplication):
|
|||||||
self.broadcast_service = None
|
self.broadcast_service = None
|
||||||
self.user_availability_service_task = None
|
self.user_availability_service_task = None
|
||||||
|
|
||||||
|
base_path = pathlib.Path(__file__).parent
|
||||||
|
self.ip2location = IP2Location.IP2Location(base_path.joinpath("IP2LOCATION-LITE-DB11.BIN"))
|
||||||
|
|
||||||
self.on_startup.append(self.prepare_asyncio)
|
self.on_startup.append(self.prepare_asyncio)
|
||||||
self.on_startup.append(self.start_user_availability_service)
|
self.on_startup.append(self.start_user_availability_service)
|
||||||
self.on_startup.append(self.start_ssh_server)
|
self.on_startup.append(self.start_ssh_server)
|
||||||
self.on_startup.append(self.prepare_database)
|
self.on_startup.append(self.prepare_database)
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def uptime_seconds(self):
|
def uptime_seconds(self):
|
||||||
return (datetime.now() - self.time_start).total_seconds()
|
return (datetime.now() - self.time_start).total_seconds()
|
||||||
|
@ -30,6 +30,13 @@ class UserModel(BaseModel):
|
|||||||
last_ping = ModelField(name="last_ping", required=False, kind=str)
|
last_ping = ModelField(name="last_ping", required=False, kind=str)
|
||||||
|
|
||||||
is_admin = ModelField(name="is_admin", required=False, kind=bool)
|
is_admin = ModelField(name="is_admin", required=False, kind=bool)
|
||||||
|
|
||||||
|
country_short = ModelField(name="country_short", required=False, kind=str)
|
||||||
|
country_long = ModelField(name="country_long", required=False, kind=str)
|
||||||
|
city = ModelField(name="city", required=False, kind=str)
|
||||||
|
latitude = ModelField(name="latitude", required=False, kind=float)
|
||||||
|
longitude = ModelField(name="longitude", required=False, kind=float)
|
||||||
|
region = ModelField(name="region", required=False, kind=str)
|
||||||
|
|
||||||
async def get_property(self, name):
|
async def get_property(self, name):
|
||||||
prop = await self.app.services.user_property.find_one(
|
prop = await self.app.services.user_property.find_one(
|
||||||
|
Loading…
Reference in New Issue
Block a user