From ed49e3346a961274b49fe68f32a0ea588f0053b9 Mon Sep 17 00:00:00 2001
From: Bob Mottram <bob@libreserver.org>
Date: Sun, 6 Apr 2025 13:06:37 +0100
Subject: [PATCH] Receiving quote requests

---
 acceptreject.py | 27 +++++++++++++++++++++++++++
 inbox.py        | 20 +++++++++++++++++++-
 2 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/acceptreject.py b/acceptreject.py
index 92057d3c5..75cf625af 100644
--- a/acceptreject.py
+++ b/acceptreject.py
@@ -12,6 +12,7 @@ __module_group__ = "ActivityPub"
 import os
 from flags import has_group_type
 from flags import url_permitted
+from utils import get_attributed_to
 from utils import get_user_paths
 from utils import text_in_file
 from utils import has_object_string_object
@@ -86,6 +87,23 @@ def create_reject(federation_list: [],
                                  http_prefix, object_json, 'Reject')
 
 
+def _reject_quote_request(message_json: {}) -> None:
+    """ Rejects a QuoteRequest
+    """
+    actor = None
+    if message_json.get('actor'):
+        actor = message_json['actor']
+    elif message_json.get('instrument'):
+        if isinstance(message_json['instrument'], dict):
+            if message_json['instrument'].get('attributedTo'):
+                instrument_dict = message_json['instrument']
+                actor = get_attributed_to(instrument_dict['attributedTo'])
+    if not actor:
+        return
+    # TODO send back a Reject
+    print('REJECT: QuoteRequest from ' + actor)
+
+
 def _accept_follow(base_dir: str, message_json: {},
                    federation_list: [], debug: bool,
                    curr_domain: str,
@@ -248,3 +266,12 @@ def receive_accept_reject(base_dir: str, domain: str, message_json: {},
     if debug:
         print('DEBUG: Uh, ' + message_json['type'] + ', I guess')
     return True
+
+
+def receive_quote_request(message_json: {}) -> bool:
+    """Receives a QuoteRequest within the POST section of HTTPServer
+    """
+    if message_json['type'] != 'QuoteRequest':
+        return False
+    _reject_quote_request(message_json)
+    return True
diff --git a/inbox.py b/inbox.py
index 2b5fcb34f..f51de9274 100644
--- a/inbox.py
+++ b/inbox.py
@@ -78,6 +78,7 @@ from pprint import pprint
 from cache import cache_svg_images
 from cache import get_person_pub_key
 from acceptreject import receive_accept_reject
+from acceptreject import receive_quote_request
 from blocking import is_blocked
 from blocking import is_blocked_nickname
 from blocking import is_blocked_domain
@@ -341,7 +342,8 @@ def inbox_permitted_message(domain: str, message_json: {},
         return False
 
     always_allowed_types = (
-        'Follow', 'Join', 'Like', 'EmojiReact', 'Delete', 'Announce', 'Move'
+        'Follow', 'Join', 'Like', 'EmojiReact', 'Delete', 'Announce', 'Move',
+        'QuoteRequest'
     )
     if message_json['type'] not in always_allowed_types:
         if not has_object_dict(message_json):
@@ -3638,6 +3640,22 @@ def run_inbox_queue(server,
             inbox_start_time = time.time()
             continue
 
+        if receive_quote_request(queue_json['post']):
+            print('Queue: QuoteRequest received from ' + key_id)
+            if os.path.isfile(queue_filename):
+                try:
+                    os.remove(queue_filename)
+                except OSError:
+                    print('EX: run_inbox_queue 7 unable to delete ' +
+                          str(queue_filename))
+            if len(queue) > 0:
+                queue.pop(0)
+            fitness_performance(inbox_start_time, server.fitness,
+                                'INBOX', 'receive_quote_request',
+                                debug)
+            inbox_start_time = time.time()
+            continue
+
         if receive_move_activity(curr_session, base_dir,
                                  http_prefix, domain, port,
                                  cached_webfingers,