mirror of
https://git.pleroma.social/pleroma/relay.git
synced 2024-11-23 15:08:00 +00:00
Compare commits
2 commits
a6f1738b73
...
6112734b2f
Author | SHA1 | Date | |
---|---|---|---|
6112734b2f | |||
491f19a9cb |
|
@ -98,6 +98,8 @@ class Connection(SqlConnection):
|
|||
with self.run('put-config', params):
|
||||
pass
|
||||
|
||||
return data.get(key)
|
||||
|
||||
|
||||
def get_inbox(self, value: str) -> Row:
|
||||
with self.run('get-inbox', {'value': value}) as cur:
|
||||
|
@ -192,7 +194,7 @@ class Connection(SqlConnection):
|
|||
|
||||
def put_user(self, username: str, password: str | None, handle: str | None = None) -> Row:
|
||||
if self.get_user(username):
|
||||
data: dict[str, str] = {}
|
||||
data: dict[str, str | datetime | None] = {}
|
||||
|
||||
if password:
|
||||
data['hash'] = self.hasher.hash(password)
|
||||
|
@ -204,7 +206,7 @@ class Connection(SqlConnection):
|
|||
stmt.set_where("username", username)
|
||||
|
||||
with self.query(stmt) as cur:
|
||||
return cur.one()
|
||||
return cur.one() # type: ignore
|
||||
|
||||
if password is None:
|
||||
raise ValueError('Password cannot be empty')
|
||||
|
|
|
@ -149,7 +149,12 @@ class HttpClient:
|
|||
return None
|
||||
|
||||
|
||||
async def get(self, url: str, sign_headers: bool, cls: type[T], force: bool = False) -> T | None:
|
||||
async def get(self,
|
||||
url: str,
|
||||
sign_headers: bool,
|
||||
cls: type[T],
|
||||
force: bool = False) -> T | None:
|
||||
|
||||
if not issubclass(cls, JsonBase):
|
||||
raise TypeError('cls must be a sub-class of "aputils.JsonBase"')
|
||||
|
||||
|
@ -174,12 +179,12 @@ class HttpClient:
|
|||
headers.update(get_app().signer.sign_headers('POST', url, message, algorithm=algorithm))
|
||||
|
||||
try:
|
||||
logging.verbose('Sending "%s" to %s', message.type, url)
|
||||
logging.verbose('Sending "%s" to %s', message.type.value, url)
|
||||
|
||||
async with self._session.post(url, headers = headers, data = message.to_json()) as resp:
|
||||
# Not expecting a response, so just return
|
||||
if resp.status in {200, 202}:
|
||||
logging.verbose('Successfully sent "%s" to %s', message.type, url)
|
||||
logging.verbose('Successfully sent "%s" to %s', message.type.value, url)
|
||||
return
|
||||
|
||||
logging.verbose('Received error when pushing to %s: %i', url, resp.status)
|
||||
|
|
|
@ -63,10 +63,10 @@ def set_level(level: LogLevel | str) -> None:
|
|||
|
||||
|
||||
def verbose(message: str, *args: Any, **kwargs: Any) -> None:
|
||||
if not logging.root.isEnabledFor(LogLevel['VERBOSE']):
|
||||
if not logging.root.isEnabledFor(LogLevel.VERBOSE):
|
||||
return
|
||||
|
||||
logging.log(LogLevel['VERBOSE'], message, *args, **kwargs)
|
||||
logging.log(LogLevel.VERBOSE, message, *args, **kwargs)
|
||||
|
||||
|
||||
debug: Callable = logging.debug
|
||||
|
@ -76,8 +76,6 @@ error: Callable = logging.error
|
|||
critical: Callable = logging.critical
|
||||
|
||||
|
||||
env_log_level: Path | str | None = os.environ.get('LOG_LEVEL', 'INFO').upper()
|
||||
|
||||
try:
|
||||
env_log_file: Path | None = Path(os.environ['LOG_FILE']).expanduser().resolve()
|
||||
|
||||
|
@ -89,10 +87,16 @@ handlers: list[Any] = [logging.StreamHandler()]
|
|||
if env_log_file:
|
||||
handlers.append(logging.FileHandler(env_log_file))
|
||||
|
||||
logging.addLevelName(LogLevel['VERBOSE'], 'VERBOSE')
|
||||
if os.environ.get('INVOCATION_ID'):
|
||||
logging_format = '%(levelname)s: %(message)s'
|
||||
|
||||
else:
|
||||
logging_format = '[%(asctime)s] %(levelname)s: %(message)s'
|
||||
|
||||
logging.addLevelName(LogLevel.VERBOSE, 'VERBOSE')
|
||||
logging.basicConfig(
|
||||
level = LogLevel.INFO,
|
||||
format = '[%(asctime)s] %(levelname)s: %(message)s',
|
||||
format = logging_format,
|
||||
datefmt = '%Y-%m-%d %H:%M:%S',
|
||||
handlers = handlers
|
||||
)
|
||||
|
|
|
@ -130,10 +130,8 @@ class Message(aputils.Message):
|
|||
description: str | None = None,
|
||||
approves: bool = False) -> Self:
|
||||
|
||||
return cls({
|
||||
'@context': 'https://www.w3.org/ns/activitystreams',
|
||||
return cls.new(aputils.ObjectType.APPLICATION, {
|
||||
'id': f'https://{host}/actor',
|
||||
'type': 'Application',
|
||||
'preferredUsername': 'relay',
|
||||
'name': 'ActivityRelay',
|
||||
'summary': description or 'ActivityRelay bot',
|
||||
|
@ -155,10 +153,8 @@ class Message(aputils.Message):
|
|||
|
||||
@classmethod
|
||||
def new_announce(cls: type[Self], host: str, obj: str | dict[str, Any]) -> Self:
|
||||
return cls({
|
||||
'@context': 'https://www.w3.org/ns/activitystreams',
|
||||
return cls.new(aputils.ObjectType.ANNOUNCE, {
|
||||
'id': f'https://{host}/activities/{uuid4()}',
|
||||
'type': 'Announce',
|
||||
'to': [f'https://{host}/followers'],
|
||||
'actor': f'https://{host}/actor',
|
||||
'object': obj
|
||||
|
@ -167,22 +163,18 @@ class Message(aputils.Message):
|
|||
|
||||
@classmethod
|
||||
def new_follow(cls: type[Self], host: str, actor: str) -> Self:
|
||||
return cls({
|
||||
'@context': 'https://www.w3.org/ns/activitystreams',
|
||||
'type': 'Follow',
|
||||
return cls.new(aputils.ObjectType.FOLLOW, {
|
||||
'id': f'https://{host}/activities/{uuid4()}',
|
||||
'to': [actor],
|
||||
'object': actor,
|
||||
'id': f'https://{host}/activities/{uuid4()}',
|
||||
'actor': f'https://{host}/actor'
|
||||
})
|
||||
|
||||
|
||||
@classmethod
|
||||
def new_unfollow(cls: type[Self], host: str, actor: str, follow: dict[str, str]) -> Self:
|
||||
return cls({
|
||||
'@context': 'https://www.w3.org/ns/activitystreams',
|
||||
return cls.new(aputils.ObjectType.UNDO, {
|
||||
'id': f'https://{host}/activities/{uuid4()}',
|
||||
'type': 'Undo',
|
||||
'to': [actor],
|
||||
'actor': f'https://{host}/actor',
|
||||
'object': follow
|
||||
|
@ -191,10 +183,8 @@ class Message(aputils.Message):
|
|||
|
||||
@classmethod
|
||||
def new_response(cls: type[Self], host: str, actor: str, followid: str, accept: bool) -> Self:
|
||||
return cls({
|
||||
'@context': 'https://www.w3.org/ns/activitystreams',
|
||||
return cls.new(aputils.ObjectType.ACCEPT if accept else aputils.ObjectType.REJECT, {
|
||||
'id': f'https://{host}/activities/{uuid4()}',
|
||||
'type': 'Accept' if accept else 'Reject',
|
||||
'to': [actor],
|
||||
'actor': f'https://{host}/actor',
|
||||
'object': {
|
||||
|
|
|
@ -136,20 +136,20 @@ class ActorView(View):
|
|||
if not digest.validate(body):
|
||||
raise aputils.SignatureFailureError("Body digest does not match")
|
||||
|
||||
if self.signature.algorithm_type == "hs2019":
|
||||
if "(created)" not in self.signature.headers:
|
||||
raise aputils.SignatureFailureError("'(created)' header not used")
|
||||
if self.signature.algorithm_type == aputils.AlgorithmType.HS2019:
|
||||
if self.signature.created is None or self.signature.expires is None:
|
||||
raise aputils.SignatureFailureError("Missing 'created' or 'expireds' parameter")
|
||||
|
||||
current_timestamp = aputils.HttpDate.new_utc().timestamp()
|
||||
|
||||
if self.signature.created > current_timestamp:
|
||||
raise aputils.SignatureFailureError("Creation date after current date")
|
||||
|
||||
if current_timestamp > self.signature.expires:
|
||||
raise aputils.SignatureFailureError("Expiration date before current date")
|
||||
if self.signature.expires < current_timestamp:
|
||||
raise aputils.SignatureFailureError("Signature has expired")
|
||||
|
||||
headers["(created)"] = self.signature.created
|
||||
headers["(expires)"] = self.signature.expires
|
||||
headers["(created)"] = str(self.signature.created)
|
||||
headers["(expires)"] = str(self.signature.expires)
|
||||
|
||||
if not self.signer._validate_signature(headers, self.signature):
|
||||
raise aputils.SignatureFailureError("Signature does not match")
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
activitypub-utils == 0.1.9
|
||||
aiohttp >= 3.9.1
|
||||
aiohttp-swagger[performance] == 1.0.16
|
||||
aputils @ https://git.barkshark.xyz/barkshark/aputils/archive/0.1.7.tar.gz
|
||||
argon2-cffi == 23.1.0
|
||||
barkshark-sql @ https://git.barkshark.xyz/barkshark/bsql/archive/0.1.2.tar.gz
|
||||
click >= 8.1.2
|
||||
|
|
Loading…
Reference in a new issue