diff --git a/activitypub.py b/activitypub.py index 80becfb..dbe7601 100644 --- a/activitypub.py +++ b/activitypub.py @@ -30,6 +30,15 @@ ObjectType = Dict[str, Any] ObjectOrIDType = Union[str, ObjectType] +COLLECTION_CTX = [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "Hashtag": "as:Hashtag", + "sensitive": "as:sensitive", + } +] + class ActivityType(Enum): """Supported activity `type`.""" ANNOUNCE = 'Announce' @@ -1196,11 +1205,11 @@ def build_ordered_collection(col, q=None, cursor=None, map_func=None, limit=50, data = [_remove_id(doc) for doc in data] if map_func: data = [map_func(doc) for doc in data] - + # No cursor, this is the first page and we return an OrderedCollection if not cursor: resp = { - '@context': CTX_AS, + '@context': COLLECTION_CTX, 'id': f'{BASE_URL}/{col_name}', 'totalItems': total_items, 'type': ActivityType.ORDERED_COLLECTION.value, @@ -1223,7 +1232,7 @@ def build_ordered_collection(col, q=None, cursor=None, map_func=None, limit=50, # If there's a cursor, then we return an OrderedCollectionPage resp = { - '@context': CTX_AS, + '@context': COLLECTION_CTX, 'type': ActivityType.ORDERED_COLLECTION_PAGE.value, 'id': BASE_URL + '/' + col_name + '?cursor=' + start_cursor, 'totalItems': total_items, diff --git a/app.py b/app.py index be06f0e..227f318 100644 --- a/app.py +++ b/app.py @@ -601,9 +601,19 @@ def add_extra_collection(raw_doc: Dict[str, Any]) -> Dict[str, Any]: return raw_doc -def activity_from_doc(raw_doc: Dict[str, Any]) -> Dict[str, Any]: +def remove_context(activity: Dict[str, Any]) -> Dict[str, Any]: + if '@context' in activity: + del activity['@context'] + return activity + + +def activity_from_doc(raw_doc: Dict[str, Any], embed: bool = False) -> Dict[str, Any]: raw_doc = add_extra_collection(raw_doc) - return clean_activity(raw_doc['activity']) + activity = clean_activity(raw_doc['activity']) + if embed: + return remove_context(activity) + return activity + @app.route('/outbox', methods=['GET', 'POST']) @@ -621,7 +631,7 @@ def outbox(): DB.outbox, q=q, cursor=request.args.get('cursor'), - map_func=lambda doc: activity_from_doc(doc), + map_func=lambda doc: activity_from_doc(doc, embed=True), )) # Handle POST request @@ -719,7 +729,7 @@ def outbox_activity_likes(item_id): DB.inbox, q=q, cursor=request.args.get('cursor'), - map_func=lambda doc: doc['activity'], + map_func=lambda doc: remove_context(doc['activity']), col_name=f'outbox/{item_id}/likes', first_page=request.args.get('page') == 'first', )) @@ -748,7 +758,7 @@ def outbox_activity_shares(item_id): DB.inbox, q=q, cursor=request.args.get('cursor'), - map_func=lambda doc: doc['activity'], + map_func=lambda doc: remove_context(doc['activity']), col_name=f'outbox/{item_id}/shares', first_page=request.args.get('page') == 'first', )) @@ -1008,7 +1018,7 @@ def inbox(): DB.inbox, q={'meta.deleted': False}, cursor=request.args.get('cursor'), - map_func=lambda doc: doc['activity'], + map_func=lambda doc: remove_context(doc['activity']), )) data = request.get_json(force=True)