diff --git a/core/ld.py b/core/ld.py index 1cb9365..544c67c 100644 --- a/core/ld.py +++ b/core/ld.py @@ -647,7 +647,9 @@ def builtin_document_loader(url: str, options={}): return schemas["unknown"] -def canonicalise(json_data: dict, include_security: bool = False) -> dict: +def canonicalise( + json_data: dict, include_security: bool = False, outbound: bool = True +) -> dict: """ Given an ActivityPub JSON-LD document, round-trips it through the LD systems to end up in a canonicalised, compacted format. @@ -686,7 +688,26 @@ def canonicalise(json_data: dict, include_security: bool = False) -> dict: json_data["@context"] = context - return jsonld.compact(jsonld.expand(json_data), context) + j = jsonld.compact(jsonld.expand(json_data), context) + if not outbound: + return j + # patch outbound json to make it compatible with various implementations + for k in ["to", "cc"]: + v = j.get(k) + if v: + j[k] = ( + [ + x + if x != "as:Public" + else "https://www.w3.org/ns/activitystreams#Public" + for x in v + ] + if isinstance(v, list) + else v + if v != "as:Public" + else "https://www.w3.org/ns/activitystreams#Public" + ) + return j def get_list(container, key) -> list: diff --git a/users/views/activitypub.py b/users/views/activitypub.py index 2371556..dd2b61f 100644 --- a/users/views/activitypub.py +++ b/users/views/activitypub.py @@ -139,7 +139,9 @@ class Inbox(View): if len(request.body) > settings.JSONLD_MAX_SIZE: return HttpResponseBadRequest("Payload size too large") # Load the LD - document = canonicalise(json.loads(request.body), include_security=True) + document = canonicalise( + json.loads(request.body), include_security=True, outbound=False + ) document_type = document["type"] document_subtype = None if isinstance(document.get("object"), dict):