mirror of
https://github.com/jointakahe/takahe.git
synced 2024-11-29 02:31:00 +00:00
Identity.by_username_and_domain has more awareness of Domain (#303)
This commit is contained in:
parent
5780068213
commit
f17f9df27e
3 changed files with 31 additions and 6 deletions
|
@ -44,7 +44,7 @@ class SearchService:
|
||||||
if self.identity is not None:
|
if self.identity is not None:
|
||||||
# Allow authenticated users to fetch remote
|
# Allow authenticated users to fetch remote
|
||||||
identity = Identity.by_username_and_domain(
|
identity = Identity.by_username_and_domain(
|
||||||
username, domain, fetch=True
|
username, domain_instance or domain, fetch=True
|
||||||
)
|
)
|
||||||
if identity and identity.state == IdentityStates.outdated:
|
if identity and identity.state == IdentityStates.outdated:
|
||||||
async_to_sync(identity.fetch_actor)()
|
async_to_sync(identity.fetch_actor)()
|
||||||
|
|
|
@ -303,10 +303,34 @@ class Identity(StatorModel):
|
||||||
### Alternate constructors/fetchers ###
|
### Alternate constructors/fetchers ###
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def by_username_and_domain(cls, username, domain, fetch=False, local=False):
|
def by_username_and_domain(
|
||||||
|
cls,
|
||||||
|
username: str,
|
||||||
|
domain: str | Domain,
|
||||||
|
fetch: bool = False,
|
||||||
|
local: bool = False,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Get an Identity by username and domain.
|
||||||
|
|
||||||
|
When fetch is True, a failed lookup will do a webfinger lookup to attempt to do
|
||||||
|
a lookup by actor_uri, creating an Identity record if one does not exist. When
|
||||||
|
local is True, lookups will be restricted to local domains.
|
||||||
|
|
||||||
|
If domain is a Domain, domain.local is used instead of passsed local.
|
||||||
|
|
||||||
|
"""
|
||||||
if username.startswith("@"):
|
if username.startswith("@"):
|
||||||
raise ValueError("Username must not start with @")
|
raise ValueError("Username must not start with @")
|
||||||
domain = domain.lower()
|
|
||||||
|
domain_instance = None
|
||||||
|
|
||||||
|
if isinstance(domain, Domain):
|
||||||
|
domain_instance = domain
|
||||||
|
local = domain.local
|
||||||
|
domain = domain.domain
|
||||||
|
else:
|
||||||
|
domain = domain.lower()
|
||||||
try:
|
try:
|
||||||
if local:
|
if local:
|
||||||
return cls.objects.get(
|
return cls.objects.get(
|
||||||
|
@ -333,11 +357,12 @@ class Identity(StatorModel):
|
||||||
pass
|
pass
|
||||||
# OK, make one
|
# OK, make one
|
||||||
username, domain = handle.split("@")
|
username, domain = handle.split("@")
|
||||||
domain = Domain.get_remote_domain(domain)
|
if not domain_instance:
|
||||||
|
domain_instance = Domain.get_remote_domain(domain)
|
||||||
return cls.objects.create(
|
return cls.objects.create(
|
||||||
actor_uri=actor_uri,
|
actor_uri=actor_uri,
|
||||||
username=username,
|
username=username,
|
||||||
domain_id=domain,
|
domain_id=domain_instance,
|
||||||
local=False,
|
local=False,
|
||||||
)
|
)
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -25,7 +25,7 @@ def by_handle_or_404(request, handle, local=True, fetch=False) -> Identity:
|
||||||
domain = domain_instance.domain
|
domain = domain_instance.domain
|
||||||
identity = Identity.by_username_and_domain(
|
identity = Identity.by_username_and_domain(
|
||||||
username,
|
username,
|
||||||
domain,
|
domain_instance,
|
||||||
local=local,
|
local=local,
|
||||||
fetch=fetch,
|
fetch=fetch,
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue