From 905f5c0e299849844f0ac8a2d046594fdf5f469e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 11 Oct 2024 18:15:24 +0100 Subject: [PATCH] json endpoint for person options notes --- daemon_get.py | 27 +++++++++++++++++++++++++++ person.py | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/daemon_get.py b/daemon_get.py index ec78ad90e..4b86c349f 100644 --- a/daemon_get.py +++ b/daemon_get.py @@ -112,6 +112,7 @@ from utils import get_json_content_from_accept from utils import check_bad_path from utils import corp_servers from utils import decoded_host +from person import get_person_notes_endpoint from person import get_account_pub_key from shares import actor_attached_shares from shares import get_share_category @@ -657,6 +658,32 @@ def daemon_http_get(self) -> None: '_GET', 'isAuthorized', self.server.debug) + # json endpoint for person options notes + if (authorized and + ('/private_account_notes/' in self.path or + self.path.endswith('/private_account_notes'))): + nickname = get_nickname_from_actor(self.path) + handle = '' + if '/private_account_notes/' in self.path: + handle = self.path.split('/private_account_notes/', 1)[1] + if nickname: + notes_json = \ + get_person_notes_endpoint(self.server.base_dir, + nickname, + self.server.domain, + handle, + self.server.http_prefix, + self.server.domain_full) + msg_str = json.dumps(notes_json) + msg = msg_str.encode('utf-8') + msglen = len(msg) + set_headers(self, 'application/json', msglen, + None, calling_domain, True) + write2(self, msg) + return + http_404(self, 212) + return + if authorized and self.path.endswith('/bots.txt'): known_bots_str = '' for bot_name in self.server.known_bots: diff --git a/person.py b/person.py index 25a77bbd1..9227216fa 100644 --- a/person.py +++ b/person.py @@ -1703,6 +1703,45 @@ def get_person_notes(base_dir: str, nickname: str, domain: str, return person_notes +def get_person_notes_endpoint(base_dir: str, nickname: str, domain: str, + handle: str, + http_prefix: str, domain_full: str) -> {}: + """Returns a json endpoint for account notes, for use by c2s + """ + actor = local_actor_url(http_prefix, nickname, domain_full) + notes_json = { + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": actor + "/private_account_notes", + "type": "AnnotationCollection", + "items": [] + } + dir_str = acct_dir(base_dir, nickname, domain) + '/notes' + if not os.path.isdir(dir_str): + return notes_json + handle_txt = '' + if handle: + handle_txt = handle + '.txt' + for _, _, files in os.walk(dir_str): + for filename in files: + if not filename.endswith('.txt'): + continue + if handle: + if filename != handle_txt: + continue + handle2 = filename.replace('.txt', '') + notes_text = get_person_notes(base_dir, nickname, domain, handle2) + if not notes_text: + continue + notes_json['items'] += { + "id": actor + "/private_account_notes/" + handle2, + "type": "Annotation", + "bodyValue": notes_text, + "target": handle2 + } + break + return notes_json + + def _detect_users_path(url: str) -> str: """Tries to detect the /users/ path """