mirror of
https://git.pleroma.social/pleroma/relay.git
synced 2024-11-22 14:38:00 +00:00
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:
parent
e825a01795
commit
058df0ac78
|
@ -24,6 +24,7 @@ dependencies = [
|
||||||
"barkshark-sql == 0.1.4-1",
|
"barkshark-sql == 0.1.4-1",
|
||||||
"click >= 8.1.2",
|
"click >= 8.1.2",
|
||||||
"hiredis == 2.3.2",
|
"hiredis == 2.3.2",
|
||||||
|
"idna == 3.4",
|
||||||
"jinja2-haml == 0.3.5",
|
"jinja2-haml == 0.3.5",
|
||||||
"markdown == 3.6",
|
"markdown == 3.6",
|
||||||
"platformdirs == 4.2.2",
|
"platformdirs == 4.2.2",
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
%tr(id="{{ban.domain}}")
|
%tr(id="{{ban.domain}}")
|
||||||
%td.domain
|
%td.domain
|
||||||
%details
|
%details
|
||||||
%summary -> =ban.domain
|
%summary -> =ban.domain.encode().decode("idna")
|
||||||
|
|
||||||
.grid-2col
|
.grid-2col
|
||||||
%label.reason(for="{{ban.domain}}-reason") << Reason
|
%label.reason(for="{{ban.domain}}-reason") << Reason
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
-for request in requests
|
-for request in requests
|
||||||
%tr(id="{{request.domain}}")
|
%tr(id="{{request.domain}}")
|
||||||
%td.instance
|
%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
|
%td.software
|
||||||
=request.software or "n/a"
|
=request.software or "n/a"
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
-for instance in instances
|
-for instance in instances
|
||||||
%tr(id="{{instance.domain}}")
|
%tr(id="{{instance.domain}}")
|
||||||
%td.instance
|
%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
|
%td.software
|
||||||
=instance.software or "n/a"
|
=instance.software or "n/a"
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
-for item in whitelist
|
-for item in whitelist
|
||||||
%tr(id="{{item.domain}}")
|
%tr(id="{{item.domain}}")
|
||||||
%td.domain
|
%td.domain
|
||||||
=item.domain
|
=item.domain.encode().decode("idna")
|
||||||
|
|
||||||
%td.date
|
%td.date
|
||||||
=item.created.strftime("%Y-%m-%d")
|
=item.created.strftime("%Y-%m-%d")
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
-for instance in instances
|
-for instance in instances
|
||||||
%tr
|
%tr
|
||||||
%td.instance -> %a(href="https://{{instance.domain}}/" target="_new")
|
%td.instance -> %a(href="https://{{instance.domain}}/" target="_new")
|
||||||
=instance.domain
|
=instance.domain.encode().decode("idna")
|
||||||
|
|
||||||
%td.date
|
%td.date
|
||||||
=instance.created.strftime("%Y-%m-%d")
|
=instance.created.strftime("%Y-%m-%d")
|
||||||
|
|
|
@ -203,6 +203,8 @@ class Inbox(View):
|
||||||
if conn.get_inbox(data['domain']):
|
if conn.get_inbox(data['domain']):
|
||||||
return Response.new_error(404, 'Instance already in database', 'json')
|
return Response.new_error(404, 'Instance already in database', 'json')
|
||||||
|
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
if not data.get('inbox'):
|
if not data.get('inbox'):
|
||||||
actor_data: Message | None = await self.client.get(data['actor'], True, Message)
|
actor_data: Message | None = await self.client.get(data['actor'], True, Message)
|
||||||
|
|
||||||
|
@ -229,6 +231,8 @@ class Inbox(View):
|
||||||
if isinstance(data, Response):
|
if isinstance(data, Response):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
if not (instance := conn.get_inbox(data['domain'])):
|
if not (instance := conn.get_inbox(data['domain'])):
|
||||||
return Response.new_error(404, 'Instance with domain not found', 'json')
|
return Response.new_error(404, 'Instance with domain not found', 'json')
|
||||||
|
|
||||||
|
@ -244,6 +248,8 @@ class Inbox(View):
|
||||||
if isinstance(data, Response):
|
if isinstance(data, Response):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
if not conn.get_inbox(data['domain']):
|
if not conn.get_inbox(data['domain']):
|
||||||
return Response.new_error(404, 'Instance with domain not found', 'json')
|
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:
|
async def post(self, request: Request) -> Response:
|
||||||
data: dict[str, Any] | Response = await self.get_api_data(['domain', 'accept'], [])
|
data: dict[str, Any] | Response = await self.get_api_data(['domain', 'accept'], [])
|
||||||
|
|
||||||
|
if isinstance(data, Response):
|
||||||
|
return data
|
||||||
|
|
||||||
data['accept'] = boolean(data['accept'])
|
data['accept'] = boolean(data['accept'])
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with self.database.session(True) as conn:
|
with self.database.session(True) as conn:
|
||||||
|
@ -308,6 +319,8 @@ class DomainBan(View):
|
||||||
if isinstance(data, Response):
|
if isinstance(data, Response):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
with self.database.session() as conn:
|
with self.database.session() as conn:
|
||||||
if conn.get_domain_ban(data['domain']):
|
if conn.get_domain_ban(data['domain']):
|
||||||
return Response.new_error(400, 'Domain already banned', 'json')
|
return Response.new_error(400, 'Domain already banned', 'json')
|
||||||
|
@ -324,6 +337,8 @@ class DomainBan(View):
|
||||||
if isinstance(data, Response):
|
if isinstance(data, Response):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
if not conn.get_domain_ban(data['domain']):
|
if not conn.get_domain_ban(data['domain']):
|
||||||
return Response.new_error(404, 'Domain not banned', 'json')
|
return Response.new_error(404, 'Domain not banned', 'json')
|
||||||
|
|
||||||
|
@ -342,6 +357,8 @@ class DomainBan(View):
|
||||||
if isinstance(data, Response):
|
if isinstance(data, Response):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
if not conn.get_domain_ban(data['domain']):
|
if not conn.get_domain_ban(data['domain']):
|
||||||
return Response.new_error(404, 'Domain not banned', 'json')
|
return Response.new_error(404, 'Domain not banned', 'json')
|
||||||
|
|
||||||
|
@ -479,6 +496,8 @@ class Whitelist(View):
|
||||||
if isinstance(data, Response):
|
if isinstance(data, Response):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
with self.database.session() as conn:
|
with self.database.session() as conn:
|
||||||
if conn.get_domain_whitelist(data['domain']):
|
if conn.get_domain_whitelist(data['domain']):
|
||||||
return Response.new_error(400, 'Domain already added to whitelist', 'json')
|
return Response.new_error(400, 'Domain already added to whitelist', 'json')
|
||||||
|
@ -494,6 +513,8 @@ class Whitelist(View):
|
||||||
if isinstance(data, Response):
|
if isinstance(data, Response):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
data['domain'] = data['domain'].encode('idna').decode()
|
||||||
|
|
||||||
with self.database.session() as conn:
|
with self.database.session() as conn:
|
||||||
if not conn.get_domain_whitelist(data['domain']):
|
if not conn.get_domain_whitelist(data['domain']):
|
||||||
return Response.new_error(404, 'Domain not in whitelist', 'json')
|
return Response.new_error(404, 'Domain not in whitelist', 'json')
|
||||||
|
|
Loading…
Reference in a new issue