Handle multiple POST messages

main
Bob Mottram 2025-09-26 23:07:46 +01:00
parent 6c4a05123e
commit ad8c3353cc
1 changed files with 90 additions and 86 deletions

View File

@ -1204,13 +1204,12 @@ def daemon_http_post(self) -> None:
self.end_headers() self.end_headers()
self.server.postreq_busy = False self.server.postreq_busy = False
return return
else: if self.server.debug:
if self.server.debug: print('Failed to post to outbox')
print('Failed to post to outbox') self.send_response(403)
self.send_response(403) self.end_headers()
self.end_headers() self.server.postreq_busy = False
self.server.postreq_busy = False return
return
fitness_performance(postreq_start_time, self.server.fitness, fitness_performance(postreq_start_time, self.server.fitness,
'_POST', 'post_to_outbox', '_POST', 'post_to_outbox',
@ -1226,89 +1225,94 @@ def daemon_http_post(self) -> None:
self.server.postreq_busy = False self.server.postreq_busy = False
return return
if self.path.endswith('/inbox') or \ # handle POST containing multiple messages
self.path == '/sharedInbox': if isinstance(message_json, list):
if not inbox_message_has_params(message_json): message_list = message_json
if self.server.debug: else:
print("DEBUG: inbox message doesn't have the " + message_list = [message_json]
"required parameters")
self.send_response(403)
self.end_headers()
self.server.postreq_busy = False
return
fitness_performance(postreq_start_time, self.server.fitness, for message_json in message_list:
'_POST', 'inbox_message_has_params', if not isinstance(message_json, dict):
self.server.debug) continue
header_signature = getheader_signature_input(self.headers) if self.path.endswith('/inbox') or \
self.path == '/sharedInbox':
if header_signature: if not inbox_message_has_params(message_json):
if 'keyId=' not in header_signature:
if self.server.debug:
print('DEBUG: POST to inbox has no keyId in ' +
'header signature parameter')
self.send_response(403)
self.end_headers()
self.server.postreq_busy = False
return
fitness_performance(postreq_start_time, self.server.fitness,
'_POST', 'keyId check',
self.server.debug)
if not self.server.unit_test:
if not inbox_permitted_message(self.server.domain,
message_json,
self.server.federation_list):
if self.server.debug:
# https://www.youtube.com/watch?v=K3PrSj9XEu4
print('DEBUG: Ah Ah Ah')
self.send_response(403)
self.end_headers()
self.server.postreq_busy = False
return
fitness_performance(postreq_start_time, self.server.fitness,
'_POST', 'inbox_permitted_message',
self.server.debug)
if self.server.debug:
print('INBOX: POST saving to inbox queue')
if users_in_path:
path_users_section = self.path.split('/users/')[1]
if '/' not in path_users_section:
if self.server.debug:
print('INBOX: This is not a users endpoint')
else:
self.post_to_nickname = path_users_section.split('/')[0]
if self.post_to_nickname:
queue_status = \
update_inbox_queue(self, self.post_to_nickname,
message_json, message_bytes,
self.server.debug)
if queue_status in range(0, 4):
self.server.postreq_busy = False
return
if self.server.debug: if self.server.debug:
print('INBOX: update_inbox_queue exited ' + print("DEBUG: inbox message doesn't have the " +
'without doing anything') "required parameters")
else: self.send_response(403)
self.end_headers()
continue
fitness_performance(postreq_start_time, self.server.fitness,
'_POST', 'inbox_message_has_params',
self.server.debug)
header_signature = getheader_signature_input(self.headers)
if header_signature:
if 'keyId=' not in header_signature:
if self.server.debug: if self.server.debug:
print('INBOX: self.post_to_nickname is None') print('DEBUG: POST to inbox has no keyId in ' +
self.send_response(403) 'header signature parameter')
self.end_headers() self.send_response(403)
self.server.postreq_busy = False self.end_headers()
return continue
if self.path in ('/sharedInbox', '/inbox'):
fitness_performance(postreq_start_time, self.server.fitness,
'_POST', 'keyId check',
self.server.debug)
if not self.server.unit_test:
if not inbox_permitted_message(self.server.domain,
message_json,
self.server.federation_list):
if self.server.debug:
# https://www.youtube.com/watch?v=K3PrSj9XEu4
print('DEBUG: Ah Ah Ah')
self.send_response(403)
self.end_headers()
continue
fitness_performance(postreq_start_time, self.server.fitness,
'_POST', 'inbox_permitted_message',
self.server.debug)
if self.server.debug: if self.server.debug:
print('INBOX: POST to shared inbox') print('INBOX: POST saving to inbox queue')
queue_status = \ if users_in_path:
update_inbox_queue(self, 'inbox', message_json, path_users_section = self.path.split('/users/')[1]
message_bytes, if '/' not in path_users_section:
self.server.debug) if self.server.debug:
if queue_status in range(0, 4): print('INBOX: This is not a users endpoint')
self.server.postreq_busy = False else:
return self.post_to_nickname = path_users_section.split('/')[0]
if self.post_to_nickname:
queue_status = \
update_inbox_queue(self, self.post_to_nickname,
message_json, message_bytes,
self.server.debug)
if queue_status in range(0, 4):
continue
if self.server.debug:
print('INBOX: update_inbox_queue exited ' +
'without doing anything')
else:
if self.server.debug:
print('INBOX: self.post_to_nickname is None')
self.send_response(403)
self.end_headers()
continue
if self.path in ('/sharedInbox', '/inbox'):
if self.server.debug:
print('INBOX: POST to shared inbox')
queue_status = \
update_inbox_queue(self, 'inbox', message_json,
message_bytes,
self.server.debug)
if queue_status in range(0, 4):
continue
http_200(self) http_200(self)
self.server.postreq_busy = False self.server.postreq_busy = False