From abd4b648849683144628de9a722ec11f5f3aba96 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 22 May 2022 14:47:49 +0100 Subject: [PATCH 1/4] Include geocoords within Place tags if relevant --- posts.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/posts.py b/posts.py index 5ee5649f1..c9be4ccc9 100644 --- a/posts.py +++ b/posts.py @@ -93,6 +93,7 @@ from linked_data_sig import generate_json_signature from petnames import resolve_petnames from video import convert_video_to_note from context import get_individual_post_context +from maps import geocoords_from_map_link def is_moderator(base_dir: str, nickname: str) -> bool: @@ -1280,11 +1281,25 @@ def _create_post_place_and_time(event_date: str, end_date: str, "endTime": end_date_str }) if location and not event_uuid: - tags.append({ - "@context": "https://www.w3.org/ns/activitystreams", - "type": "Place", - "name": location - }) + latitude = longitude = None + if '://' in location: + osm_domain = 'openstreetmap.org' + _, latitude, longitude = \ + geocoords_from_map_link(location, osm_domain) + if latitude and longitude: + tags.append({ + "@context": "https://www.w3.org/ns/activitystreams", + "type": "Place", + "name": location, + "latitude": latitude, + "longitude": longitude + }) + else: + tags.append({ + "@context": "https://www.w3.org/ns/activitystreams", + "type": "Place", + "name": location + }) return event_date_str From 6bf0798a8dfb1ec8754189701b635db637f69414 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 22 May 2022 15:15:04 +0100 Subject: [PATCH 2/4] Tidying --- maps.py | 5 ++++- posts.py | 3 +-- webapp_post.py | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/maps.py b/maps.py index 8c4a52223..27d9e4586 100644 --- a/maps.py +++ b/maps.py @@ -194,7 +194,10 @@ def _geocoords_from_wego_link(url: str) -> (int, float, float): return zoom, latitude, longitude -def geocoords_from_map_link(url: str, osm_domain: str) -> (int, float, float): +def geocoords_from_map_link(url: str, + osm_domain: str = 'openstreetmap.org') -> (int, + float, + float): """Returns geocoordinates from a map link url """ if osm_domain in url: diff --git a/posts.py b/posts.py index c9be4ccc9..2a270f709 100644 --- a/posts.py +++ b/posts.py @@ -1283,9 +1283,8 @@ def _create_post_place_and_time(event_date: str, end_date: str, if location and not event_uuid: latitude = longitude = None if '://' in location: - osm_domain = 'openstreetmap.org' _, latitude, longitude = \ - geocoords_from_map_link(location, osm_domain) + geocoords_from_map_link(location) if latitude and longitude: tags.append({ "@context": "https://www.w3.org/ns/activitystreams", diff --git a/webapp_post.py b/webapp_post.py index 12fd9451f..e70c87796 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -2187,9 +2187,8 @@ def individual_post_as_html(signing_priv_key_pem: str, set_map_preferences_url(base_dir, nickname, domain, location_domain) # remember the coordinates - osm_domain = 'openstreetmap.org' map_zoom, map_latitude, map_longitude = \ - geocoords_from_map_link(location_str, osm_domain) + geocoords_from_map_link(location_str) if map_zoom and map_latitude and map_longitude: set_map_preferences_coords(base_dir, nickname, domain, map_latitude, map_longitude, From 225f9d92705af2b649782e3204b1b433a15d7114 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 22 May 2022 20:55:11 +0100 Subject: [PATCH 3/4] Handle avatars and banners within HEAD --- daemon.py | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/daemon.py b/daemon.py index b534f1de0..439a9ae87 100644 --- a/daemon.py +++ b/daemon.py @@ -18598,13 +18598,47 @@ class PubServer(BaseHTTPRequestHandler): etag = None file_length = -1 - if '/media/' in self.path: + if '/media/' in self.path or \ + '/accounts/avatars/' in self.path or \ + '/accounts/headers/' in self.path: if is_image_file(self.path) or \ path_is_video(self.path) or \ path_is_audio(self.path): - media_str = self.path.split('/media/')[1] - media_filename = \ - self.server.base_dir + '/media/' + media_str + if '/media/' in self.path: + media_str = self.path.split('/media/')[1] + media_filename = \ + self.server.base_dir + '/media/' + media_str + elif '/accounts/avatars/' in self.path: + avatar_file = self.path.split('/accounts/avatars/')[1] + if '/' not in avatar_file: + self._404() + return + nickname = avatar_file.split('/')[0] + avatar_file = avatar_file.split('/')[1] + avatar_file_ext = avatar_file.split('.')[-1] + # remove any numbers, eg. avatar123.png becomes avatar.png + if avatar_file.startswith('avatar'): + avatar_file = 'avatar.' + avatar_file_ext + media_filename = \ + self.server.base_dir + '/accounts/' + \ + nickname + '@' + self.server.domain + '/' + \ + avatar_file + else: + banner_file = self.path.split('/accounts/headers/')[1] + if '/' not in banner_file: + self._404() + return + nickname = banner_file.split('/')[0] + banner_file = banner_file.split('/')[1] + banner_file_ext = banner_file.split('.')[-1] + # remove any numbers, eg. banner123.png becomes banner.png + if banner_file.startswith('banner'): + banner_file = 'banner.' + banner_file_ext + media_filename = \ + self.server.base_dir + '/accounts/' + \ + nickname + '@' + self.server.domain + '/' + \ + banner_file + if os.path.isfile(media_filename): check_path = media_filename file_length = os.path.getsize(media_filename) @@ -18632,6 +18666,9 @@ class PubServer(BaseHTTPRequestHandler): except OSError: print('EX: do_HEAD unable to write ' + media_tag_filename) + else: + self._404() + return media_file_type = media_file_mime_type(check_path) self._set_headers_head(media_file_type, file_length, From 5dd2910e1177bac7477bf38b4c3e70168992da23 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 22 May 2022 21:08:56 +0100 Subject: [PATCH 4/4] Include last modified time in HEAD --- daemon.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/daemon.py b/daemon.py index 439a9ae87..ca2254298 100644 --- a/daemon.py +++ b/daemon.py @@ -871,11 +871,15 @@ class PubServer(BaseHTTPRequestHandler): self.end_headers() def _set_headers_head(self, file_format: str, length: int, etag: str, - calling_domain: str, permissive: bool) -> None: + calling_domain: str, permissive: bool, + last_modified_time_str: str) -> None: self._set_headers_base(file_format, length, None, calling_domain, permissive) if etag: self.send_header('ETag', '"' + etag + '"') + if last_modified_time_str: + self.send_header('last-modified', + last_modified_time_str) self.end_headers() def _set_headers_etag(self, media_filename: str, file_format: str, @@ -18597,6 +18601,7 @@ class PubServer(BaseHTTPRequestHandler): check_path = self.path etag = None file_length = -1 + last_modified_time_str = None if '/media/' in self.path or \ '/accounts/avatars/' in self.path or \ @@ -18642,6 +18647,12 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isfile(media_filename): check_path = media_filename file_length = os.path.getsize(media_filename) + media_tm = os.path.getmtime(media_filename) + last_modified_time = \ + datetime.datetime.fromtimestamp(media_tm) + time_format_str = '%a, %d %b %Y %H:%M:%S GMT' + last_modified_time_str = \ + last_modified_time.strftime(time_format_str) media_tag_filename = media_filename + '.etag' if os.path.isfile(media_tag_filename): try: @@ -18672,7 +18683,8 @@ class PubServer(BaseHTTPRequestHandler): media_file_type = media_file_mime_type(check_path) self._set_headers_head(media_file_type, file_length, - etag, calling_domain, False) + etag, calling_domain, False, + last_modified_time_str) def _receive_new_post_process(self, post_type: str, path: str, headers: {}, length: int, post_bytes, boundary: str,