properly handle non-ascii domain names

* ensure domains are stored as ascii in the database
* convert domains to unicode on the frontend
This commit is contained in:
Izalia Mae 2024-06-16 08:45:14 -04:00
parent e825a01795
commit 058df0ac78
6 changed files with 27 additions and 5 deletions

View file

@ -24,6 +24,7 @@ dependencies = [
"barkshark-sql == 0.1.4-1",
"click >= 8.1.2",
"hiredis == 2.3.2",
"idna == 3.4",
"jinja2-haml == 0.3.5",
"markdown == 3.6",
"platformdirs == 4.2.2",

View file

@ -35,7 +35,7 @@
%tr(id="{{ban.domain}}")
%td.domain
%details
%summary -> =ban.domain
%summary -> =ban.domain.encode().decode("idna")
.grid-2col
%label.reason(for="{{ban.domain}}-reason") << Reason

View file

@ -39,7 +39,7 @@
-for request in requests
%tr(id="{{request.domain}}")
%td.instance
%a(href="https://{{request.domain}}" target="_new") -> =request.domain
%a(href="https://{{request.domain}}" target="_new") -> =request.domain.encode().decode("idna")
%td.software
=request.software or "n/a"
@ -69,7 +69,7 @@
-for instance in instances
%tr(id="{{instance.domain}}")
%td.instance
%a(href="https://{{instance.domain}}/" target="_new") -> =instance.domain
%a(href="https://{{instance.domain}}/" target="_new") -> =instance.domain.encode().decode("idna")
%td.software
=instance.software or "n/a"

View file

@ -27,7 +27,7 @@
-for item in whitelist
%tr(id="{{item.domain}}")
%td.domain
=item.domain
=item.domain.encode().decode("idna")
%td.date
=item.created.strftime("%Y-%m-%d")

View file

@ -41,7 +41,7 @@
-for instance in instances
%tr
%td.instance -> %a(href="https://{{instance.domain}}/" target="_new")
=instance.domain
=instance.domain.encode().decode("idna")
%td.date
=instance.created.strftime("%Y-%m-%d")

View file

@ -203,6 +203,8 @@ class Inbox(View):
if conn.get_inbox(data['domain']):
return Response.new_error(404, 'Instance already in database', 'json')
data['domain'] = data['domain'].encode('idna').decode()
if not data.get('inbox'):
actor_data: Message | None = await self.client.get(data['actor'], True, Message)
@ -229,6 +231,8 @@ class Inbox(View):
if isinstance(data, Response):
return data
data['domain'] = data['domain'].encode('idna').decode()
if not (instance := conn.get_inbox(data['domain'])):
return Response.new_error(404, 'Instance with domain not found', 'json')
@ -244,6 +248,8 @@ class Inbox(View):
if isinstance(data, Response):
return data
data['domain'] = data['domain'].encode('idna').decode()
if not conn.get_inbox(data['domain']):
return Response.new_error(404, 'Instance with domain not found', 'json')
@ -263,7 +269,12 @@ class RequestView(View):
async def post(self, request: Request) -> Response:
data: dict[str, Any] | Response = await self.get_api_data(['domain', 'accept'], [])
if isinstance(data, Response):
return data
data['accept'] = boolean(data['accept'])
data['domain'] = data['domain'].encode('idna').decode()
try:
with self.database.session(True) as conn:
@ -308,6 +319,8 @@ class DomainBan(View):
if isinstance(data, Response):
return data
data['domain'] = data['domain'].encode('idna').decode()
with self.database.session() as conn:
if conn.get_domain_ban(data['domain']):
return Response.new_error(400, 'Domain already banned', 'json')
@ -324,6 +337,8 @@ class DomainBan(View):
if isinstance(data, Response):
return data
data['domain'] = data['domain'].encode('idna').decode()
if not conn.get_domain_ban(data['domain']):
return Response.new_error(404, 'Domain not banned', 'json')
@ -342,6 +357,8 @@ class DomainBan(View):
if isinstance(data, Response):
return data
data['domain'] = data['domain'].encode('idna').decode()
if not conn.get_domain_ban(data['domain']):
return Response.new_error(404, 'Domain not banned', 'json')
@ -479,6 +496,8 @@ class Whitelist(View):
if isinstance(data, Response):
return data
data['domain'] = data['domain'].encode('idna').decode()
with self.database.session() as conn:
if conn.get_domain_whitelist(data['domain']):
return Response.new_error(400, 'Domain already added to whitelist', 'json')
@ -494,6 +513,8 @@ class Whitelist(View):
if isinstance(data, Response):
return data
data['domain'] = data['domain'].encode('idna').decode()
with self.database.session() as conn:
if not conn.get_domain_whitelist(data['domain']):
return Response.new_error(404, 'Domain not in whitelist', 'json')