Fix the Update handling

This commit is contained in:
Thomas Sileo 2018-06-01 20:59:32 +02:00
parent f8ee19b4d1
commit 8af33d866d
3 changed files with 14 additions and 6 deletions

View file

@ -719,12 +719,13 @@ class Update(BaseActivity):
# TODO(tsileo): implements _should_purge_cache if it's a reply of a published activity (i.e. in the outbox) # TODO(tsileo): implements _should_purge_cache if it's a reply of a published activity (i.e. in the outbox)
def _post_to_outbox(self, obj_id: str, activity: ObjectType, recipients: List[str]) -> None: def _post_to_outbox(self, obj_id: str, activity: ObjectType, recipients: List[str]) -> None:
obj = self.get_object() print('UPDATE')
obj = self._data['object']
update_prefix = 'activity.object.' update_prefix = 'activity.object.'
update: Dict[str, Any] = {'$set': dict(), '$unset': dict()} update: Dict[str, Any] = {'$set': dict(), '$unset': dict()}
update['$set'][f'{update_prefix}updated'] = datetime.utcnow().replace(microsecond=0).isoformat() + 'Z' update['$set'][f'{update_prefix}updated'] = datetime.utcnow().replace(microsecond=0).isoformat() + 'Z'
for k, v in obj._data.items(): for k, v in obj.items():
if k in ['id', 'type']: if k in ['id', 'type']:
continue continue
if v is None: if v is None:
@ -735,7 +736,9 @@ class Update(BaseActivity):
if len(update['$unset']) == 0: if len(update['$unset']) == 0:
del(update['$unset']) del(update['$unset'])
DB.outbox.update_one({'remote_id': obj.id.replace('/activity', '')}, update) print(f'updating note from outbox {obj!r} {update}')
logger.info(f'updating note from outbox {obj!r} {update}')
DB.outbox.update_one({'activity.object.id': obj['id']}, update)
# FIXME(tsileo): should send an Update (but not a partial one, to all the note's recipients # FIXME(tsileo): should send an Update (but not a partial one, to all the note's recipients
# (create a new Update with the result of the update, and send it without saving it?) # (create a new Update with the result of the update, and send it without saving it?)

View file

@ -1,7 +1,7 @@
version: '2' version: '2'
services: services:
celery: celery:
build: . image: microblogpub:latest
links: links:
- mongo - mongo
- rabbitmq - rabbitmq

View file

@ -5,7 +5,7 @@ Mastodon instances won't accept requests that are not signed using this scheme.
""" """
from datetime import datetime from datetime import datetime
from urllib.parse import urlparse from urllib.parse import urlparse
from typing import Any, Dict from typing import Any, Dict, Optional
import base64 import base64
import hashlib import hashlib
import logging import logging
@ -31,7 +31,9 @@ def _build_signed_string(signed_headers: str, method: str, path: str, headers: A
return '\n'.join(out) return '\n'.join(out)
def _parse_sig_header(val: str) -> Dict[str, str]: def _parse_sig_header(val: Optional[str]) -> Optional[Dict[str, str]]:
if not val:
return None
out = {} out = {}
for data in val.split(','): for data in val.split(','):
k, v = data.split('=', 1) k, v = data.split('=', 1)
@ -54,6 +56,9 @@ def _body_digest() -> str:
def verify_request(actor_service) -> bool: def verify_request(actor_service) -> bool:
hsig = _parse_sig_header(request.headers.get('Signature')) hsig = _parse_sig_header(request.headers.get('Signature'))
if not hsig:
logger.debug('no signature in header')
return False
logger.debug(f'hsig={hsig}') logger.debug(f'hsig={hsig}')
signed_string = _build_signed_string(hsig['headers'], request.method, request.path, request.headers, _body_digest()) signed_string = _build_signed_string(hsig['headers'], request.method, request.path, request.headers, _body_digest())
_, rk = actor_service.get_public_key(hsig['keyId']) _, rk = actor_service.get_public_key(hsig['keyId'])