def task_finish_post_to_outbox() -> _Response: task = p.parse(flask.request) app.logger.info(f"task={task!r}") iri = task.payload try: activity = ap.fetch_remote_activity(iri) app.logger.info(f"activity={activity!r}") recipients = activity.recipients() process_outbox(activity, {}) app.logger.info(f"recipients={recipients}") activity = ap.clean_activity(activity.to_dict()) payload = json.dumps(activity) for recp in recipients: app.logger.debug(f"posting to {recp}") Tasks.post_to_remote_inbox(payload, recp) except (ActivityGoneError, ActivityNotFoundError): app.logger.exception(f"no retry") except Exception as err: app.logger.exception(f"failed to post to remote inbox for {iri}") raise TaskError() from err return ""
def activity_from_doc(raw_doc: Dict[str, Any], embed: bool = False) -> Dict[str, Any]: raw_doc = add_extra_collection(raw_doc) activity = clean_activity(raw_doc["activity"]) # Handle Questions # TODO(tsileo): what about object embedded by ID/URL? _add_answers_to_question(raw_doc) if embed: return remove_context(activity) return activity
def forward_activity(self, iri: str) -> None: try: activity = ap.fetch_remote_activity(iri) recipients = back.followers_as_recipients() log.debug(f"Forwarding {activity!r} to {recipients}") activity = ap.clean_activity(activity.to_dict()) payload = json.dumps(activity) for recp in recipients: log.debug(f"forwarding {activity!r} to {recp}") post_to_remote_inbox.delay(payload, recp) except Exception as err: log.exception(f"failed to cache attachments for {iri}") self.retry(exc=err, countdown=int(random.uniform(2, 4)**self.request.retries))
def forward_activity(self, iri: str) -> None: if not current_app.config["AP_ENABLED"]: return # not federating if not enabled try: activity = ap.fetch_remote_activity(iri) backend = ap.get_backend() recipients = backend.followers_as_recipients() current_app.logger.debug(f"Forwarding {activity!r} to {recipients}") activity = ap.clean_activity(activity.to_dict()) for recp in recipients: current_app.logger.debug(f"forwarding {activity!r} to {recp}") payload = json.dumps(activity) post_to_remote_inbox.delay(payload, recp) except Exception as err: # noqa: F841 current_app.logger.exception(f"failed to cache attachments for {iri}")
def post_to_outbox(self, activity: ap.BaseActivity) -> None: if activity.has_type(ap.CREATE_TYPES): activity = activity.build_create() self.save(Box.OUTBOX, activity) # Assign create a random ID obj_id = self.random_object_id() activity.set_id(self.activity_url(obj_id), obj_id) recipients = activity.recipients() logger.info(f"recipients={recipients}") activity = ap.clean_activity(activity.to_dict()) payload = json.dumps(activity) for recp in recipients: logger.debug(f"posting to {recp}") self.post_to_remote_inbox(self.get_actor(), payload, recp)
def featured(): if not is_api_request(): abort(404) _log_sig() q = { "box": Box.OUTBOX.value, "type": ActivityType.CREATE.value, "meta.deleted": False, "meta.undo": False, "meta.pinned": True, } data = [ clean_activity(doc["activity"]["object"]) for doc in DB.activities.find(q) ] return activitypubify( **activitypub.simple_build_ordered_collection("featured", data))
def task_forward_activity() -> _Response: task = p.parse(flask.request) app.logger.info(f"task={task!r}") iri = task.payload try: activity = ap.fetch_remote_activity(iri) recipients = back.followers_as_recipients() app.logger.debug(f"Forwarding {activity!r} to {recipients}") activity = ap.clean_activity(activity.to_dict()) payload = json.dumps(activity) for recp in recipients: app.logger.debug(f"forwarding {activity!r} to {recp}") Tasks.post_to_remote_inbox(payload, recp) except Exception as err: app.logger.exception("task failed") raise TaskError() from err return ""
def finish_post_to_outbox(self, iri: str) -> None: try: activity = ap.fetch_remote_activity(iri) backend = ap.get_backend() current_app.logger.info(f"finish_post_to_outbox {activity}") recipients = activity.recipients() actor = activity.get_actor() current_app.logger.debug(f"finish_post_to_outbox actor {actor!r}") if activity.has_type(ap.ActivityType.DELETE): backend.outbox_delete(actor, activity) elif activity.has_type(ap.ActivityType.UPDATE): backend.outbox_update(actor, activity) elif activity.has_type(ap.ActivityType.CREATE): backend.outbox_create(actor, activity) elif activity.has_type(ap.ActivityType.ANNOUNCE): backend.outbox_announce(actor, activity) elif activity.has_type(ap.ActivityType.LIKE): backend.outbox_like(actor, activity) elif activity.has_type(ap.ActivityType.UNDO): obj = activity.get_object() if obj.has_type(ap.ActivityType.LIKE): backend.outbox_undo_like(actor, obj) elif obj.has_type(ap.ActivityType.ANNOUNCE): backend.outbox_undo_announce(actor, obj) elif obj.has_type(ap.ActivityType.FOLLOW): backend.undo_new_following(actor, obj) current_app.logger.info(f"recipients={recipients}") activity = ap.clean_activity(activity.to_dict()) payload = json.dumps(activity) for recp in recipients: current_app.logger.debug(f"posting to {recp}") post_to_remote_inbox.delay(payload, recp) except (ActivityGoneError, ActivityNotFoundError): current_app.logger.exception(f"no retry") except Exception as err: # noqa: F841 current_app.logger.exception(f"failed to post " f"to remote inbox for {iri}")
def finish_post_to_outbox(self, iri: str) -> None: try: activity = ap.fetch_remote_activity(iri) log.info(f"activity={activity!r}") recipients = activity.recipients() if activity.has_type(ap.ActivityType.DELETE): back.outbox_delete(MY_PERSON, activity) elif activity.has_type(ap.ActivityType.UPDATE): back.outbox_update(MY_PERSON, activity) elif activity.has_type(ap.ActivityType.CREATE): back.outbox_create(MY_PERSON, activity) elif activity.has_type(ap.ActivityType.ANNOUNCE): back.outbox_announce(MY_PERSON, activity) elif activity.has_type(ap.ActivityType.LIKE): back.outbox_like(MY_PERSON, activity) elif activity.has_type(ap.ActivityType.UNDO): obj = activity.get_object() if obj.has_type(ap.ActivityType.LIKE): back.outbox_undo_like(MY_PERSON, obj) elif obj.has_type(ap.ActivityType.ANNOUNCE): back.outbox_undo_announce(MY_PERSON, obj) elif obj.has_type(ap.ActivityType.FOLLOW): back.undo_new_following(MY_PERSON, obj) log.info(f"recipients={recipients}") activity = ap.clean_activity(activity.to_dict()) DB.cache2.remove() payload = json.dumps(activity) for recp in recipients: log.debug(f"posting to {recp}") post_to_remote_inbox.delay(payload, recp) except (ActivityGoneError, ActivityNotFoundError): log.exception(f"no retry") except Exception as err: log.exception(f"failed to post to remote inbox for {iri}") self.retry(exc=err, countdown=int(random.uniform(2, 4)**self.request.retries))