def post_to_remote_inbox(self, payload: str, to: str) -> None: if not current_app.config["AP_ENABLED"]: return # not federating if not enabled current_app.logger.debug(f"post_to_remote_inbox {payload}") ap_actor = json.loads(payload)["actor"] actor = Actor.query.filter(Actor.url == ap_actor).first() if not actor: current_app.logger.exception("no actor found") return key = Key(owner=actor.url) key.load(actor.private_key) signature_auth = HTTPSigAuth(key) # current_app.logger.debug(f"key=={key.__dict__}") try: current_app.logger.info("payload=%s", payload) current_app.logger.info("generating sig") signed_payload = json.loads(payload) backend = ap.get_backend() # Don't overwrite the signature if we're forwarding an activity if "signature" not in signed_payload: generate_signature(signed_payload, key) current_app.logger.info("to=%s", to) resp = requests.post( to, data=json.dumps(signed_payload), auth=signature_auth, headers={ "Content-Type": HEADERS[1], "Accept": HEADERS[1], "User-Agent": backend.user_agent() }, ) current_app.logger.info("resp=%s", resp) current_app.logger.info("resp_body=%s", resp.text) resp.raise_for_status() except HTTPError as err: current_app.logger.exception("request failed") if 400 >= err.response.status_code >= 499: current_app.logger.info("client error, no retry") return
from config import DB from config import HEADERS from config import ME from config import ID from config import KEY from config import MEDIA_CACHE from config import USER_AGENT from config import BASE_URL from utils import opengraph from utils.media import Kind log = logging.getLogger(__name__) app = Celery("tasks", broker=os.getenv("MICROBLOGPUB_AMQP_BROKER", "pyamqp://guest@localhost//")) SigAuth = HTTPSigAuth(KEY) back = activitypub.MicroblogPubBackend() ap.use_backend(back) MY_PERSON = ap.Person(**ME) MAX_RETRIES = 9 @app.task(bind=True, max_retries=MAX_RETRIES) # noqa: C901 def process_new_activity(self, iri: str) -> None: """Process an activity received in the inbox""" try: activity = ap.fetch_remote_activity(iri) log.info(f"activity={activity!r}")
from config import ID from config import KEY from config import ME from config import USER_AGENT from core.db import update_many_activities from core.meta import Box from core.meta import MetaKey from core.meta import flag from core.meta import upsert from core.tasks import Tasks logger = logging.getLogger(__name__) _NewMeta = Dict[str, Any] SIG_AUTH = HTTPSigAuth(KEY) _ACTIVITY_CACHE_ENABLED = True ACTORS_CACHE = LRUCache(maxsize=256) MY_PERSON = ap.Person(**ME) @contextmanager def no_cache() -> Iterator[None]: """Context manager for disabling the "DB cache" when fetching AP activities.""" global _ACTIVITY_CACHE_ENABLED _ACTIVITY_CACHE_ENABLED = False try: yield finally: _ACTIVITY_CACHE_ENABLED = True
from core.inbox import process_inbox from core.meta import MetaKey from core.meta import _meta from core.notifications import set_inbox_flags from core.outbox import process_outbox from core.remote import track_failed_send from core.remote import track_successful_send from core.shared import MY_PERSON from core.shared import _Response from core.shared import back from core.shared import p from core.tasks import Tasks from utils import now from utils import opengraph SIG_AUTH = HTTPSigAuth(config.KEY) blueprint = flask.Blueprint("tasks", __name__) class TaskError(Exception): """Raised to log the error for poussetaches.""" def __init__(self): self.message = traceback.format_exc() @blueprint.route("/task/update_question", methods=["POST"]) def task_update_question() -> _Response: """Sends an Update.""" task = p.parse(flask.request)