From c8b39b044931caf79d4b61ac5a9f1310fe647aa8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:00:02 +0100 Subject: [PATCH 1/6] Check string types --- daemon.py | 8 -------- desktop_client.py | 51 ++++++++++++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/daemon.py b/daemon.py index 4b8f7354f..c6c8ef2f1 100644 --- a/daemon.py +++ b/daemon.py @@ -733,10 +733,6 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') - # self.send_header('X-Robots-Tag', - # 'noindex, nofollow, noarchive, nosnippet') - # self.send_header('Cache-Control', 'public') - # self.send_header('Referrer-Policy', 'origin') self.end_headers() def _httpReturnCode(self, httpCode: int, httpDescription: str, @@ -756,10 +752,6 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Content-Type', 'text/html; charset=utf-8') msgLenStr = str(len(msg)) self.send_header('Content-Length', msgLenStr) - # self.send_header('X-Robots-Tag', - # 'noindex, nofollow, noarchive, nosnippet') - # self.send_header('Cache-Control', 'public') - # self.send_header('Referrer-Policy', 'origin') self.end_headers() if not self._write(msg): print('Error when showing ' + str(httpCode)) diff --git a/desktop_client.py b/desktop_client.py index 6382c4d1b..9cf3d799f 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -692,29 +692,40 @@ def _readLocalBoxPost(session, nickname: str, domain: str, if hasObjectDict(postJsonObject2): if postJsonObject2['object'].get('attributedTo') and \ postJsonObject2['object'].get('content'): - actor = postJsonObject2['object']['attributedTo'] - nameStr += ' ' + translate['announces'] + ' ' + \ - getNicknameFromActor(actor) - sayStr = nameStr - _sayCommand(sayStr, sayStr, screenreader, - systemLanguage, espeak) - print('') - if screenreader: - time.sleep(2) - content = \ - _textOnlyContent(postJsonObject2['object']['content']) - content += _getImageDescription(postJsonObject2) - messageStr, detectedLinks = \ - speakableText(baseDir, content, translate) - sayStr = content - _sayCommand(sayStr, messageStr, screenreader, - systemLanguage, espeak) - return postJsonObject2 + attributedTo = postJsonObject2['object']['attributedTo'] + content = postJsonObject2['object']['content'] + if isinstance(attributedTo, str) and \ + isinstance(content, str): + actor = attributedTo + nameStr += ' ' + translate['announces'] + ' ' + \ + getNicknameFromActor(actor) + sayStr = nameStr + _sayCommand(sayStr, sayStr, screenreader, + systemLanguage, espeak) + print('') + if screenreader: + time.sleep(2) + content = \ + _textOnlyContent(content) + content += _getImageDescription(postJsonObject2) + messageStr, detectedLinks = \ + speakableText(baseDir, content, translate) + sayStr = content + _sayCommand(sayStr, messageStr, screenreader, + systemLanguage, espeak) + return postJsonObject2 return {} - actor = postJsonObject['object']['attributedTo'] + attributedTo = postJsonObject['object']['attributedTo'] + if not attributedTo: + return {} + content = postJsonObject['object']['content'] + if not isinstance(attributedTo, str) or \ + not isinstance(content, str): + return {} + actor = attributedTo nameStr = getNicknameFromActor(actor) - content = _textOnlyContent(postJsonObject['object']['content']) + content = _textOnlyContent(content) content += _getImageDescription(postJsonObject) if isPGPEncrypted(content): From dddf2bb57f3c11161955c362a21169b9a2ca2a32 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:12:46 +0100 Subject: [PATCH 2/6] Checking for images --- daemon.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/daemon.py b/daemon.py index c6c8ef2f1..1a9b6c125 100644 --- a/daemon.py +++ b/daemon.py @@ -6082,11 +6082,7 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings: {}) -> None: """Shows a help screen image """ - if not path.endswith('.jpg') and \ - not path.endswith('.png') and \ - not path.endswith('.webp') and \ - not path.endswith('.avif') and \ - not path.endswith('.gif'): + if not isImageFile(path): return mediaStr = path.split('/helpimages/')[1] if '/' not in mediaStr: @@ -11389,14 +11385,9 @@ class PubServer(BaseHTTPRequestHandler): 'show screenshot done') # image on login screen or qrcode - if self.path == '/login.png' or \ - self.path == '/login.gif' or \ - self.path == '/login.svg' or \ - self.path == '/login.webp' or \ - self.path == '/login.avif' or \ - self.path == '/login.jpeg' or \ - self.path == '/login.jpg' or \ - self.path == '/qrcode.png': + if (isImageFile(self.path) and + (self.path.startswith('/login.') or + self.path.startswith('/qrcode.png'))): iconFilename = \ self.server.baseDir + '/accounts' + self.path if os.path.isfile(iconFilename): From 8a1e196b150d23beec4eb6c70c8b77759cbd6499 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:19:18 +0100 Subject: [PATCH 3/6] Tidying --- daemon.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/daemon.py b/daemon.py index 1a9b6c125..a3ac57ee1 100644 --- a/daemon.py +++ b/daemon.py @@ -3235,16 +3235,16 @@ class PubServer(BaseHTTPRequestHandler): mediaFilenameBase = accountsDir + '/upload' mediaFilename = mediaFilenameBase + '.png' - if self.headers['Content-type'].endswith('jpeg'): - mediaFilename = mediaFilenameBase + '.jpg' - if self.headers['Content-type'].endswith('gif'): - mediaFilename = mediaFilenameBase + '.gif' - if self.headers['Content-type'].endswith('svg+xml'): - mediaFilename = mediaFilenameBase + '.svg' - if self.headers['Content-type'].endswith('webp'): - mediaFilename = mediaFilenameBase + '.webp' - if self.headers['Content-type'].endswith('avif'): - mediaFilename = mediaFilenameBase + '.avif' + imageMedia = { + 'jpeg': 'jpg', + 'gif': 'gif', + 'svg+xml': 'svg', + 'webp': 'webp', + 'avif': 'avif' + } + for mimeExt, ext in imageMedia: + if self.headers['Content-type'].endswith(mimeExt): + mediaFilename = mediaFilenameBase + '.' + ext with open(mediaFilename, 'wb') as avFile: avFile.write(mediaBytes) if debug: From 266eb1af474b3d3747c90dbca2fbbc2f77c9a339 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:24:56 +0100 Subject: [PATCH 4/6] Tidying --- daemon.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/daemon.py b/daemon.py index a3ac57ee1..d41322630 100644 --- a/daemon.py +++ b/daemon.py @@ -3242,9 +3242,10 @@ class PubServer(BaseHTTPRequestHandler): 'webp': 'webp', 'avif': 'avif' } - for mimeExt, ext in imageMedia: + for mimeExt, ext in imageMedia.items(): if self.headers['Content-type'].endswith(mimeExt): mediaFilename = mediaFilenameBase + '.' + ext + break with open(mediaFilename, 'wb') as avFile: avFile.write(mediaBytes) if debug: @@ -10128,18 +10129,17 @@ class PubServer(BaseHTTPRequestHandler): self._304() return True mediaImageType = 'png' - if avatarFile.endswith('.png'): - mediaImageType = 'png' - elif avatarFile.endswith('.jpg'): - mediaImageType = 'jpeg' - elif avatarFile.endswith('.gif'): - mediaImageType = 'gif' - elif avatarFile.endswith('.avif'): - mediaImageType = 'avif' - elif avatarFile.endswith('.svg'): - mediaImageType = 'svg+xml' - else: - mediaImageType = 'webp' + extensionsToMime = { + 'jpg': 'jpeg', + 'gif': 'gif', + 'avif': 'avif', + 'svg': 'svg+xml', + 'webp': 'webp' + } + for ext, mimeExt in extensionsToMime.items(): + if avatarFile.endswith('.' + ext): + mediaImageType = mimeExt + break with open(avatarFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(avatarFilename, From d1b1e18af409bc7ccc2bbde8e43ae3b25235a163 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:26:33 +0100 Subject: [PATCH 5/6] Prepend image --- daemon.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daemon.py b/daemon.py index d41322630..9209bc4e0 100644 --- a/daemon.py +++ b/daemon.py @@ -10128,7 +10128,7 @@ class PubServer(BaseHTTPRequestHandler): # The file has not changed self._304() return True - mediaImageType = 'png' + mediaImageType = 'image/png' extensionsToMime = { 'jpg': 'jpeg', 'gif': 'gif', @@ -10138,12 +10138,12 @@ class PubServer(BaseHTTPRequestHandler): } for ext, mimeExt in extensionsToMime.items(): if avatarFile.endswith('.' + ext): - mediaImageType = mimeExt + mediaImageType = 'image/' + mimeExt break with open(avatarFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(avatarFilename, - 'image/' + mediaImageType, + mediaImageType, mediaBinary, None, self.server.domainFull) self._write(mediaBinary) From e8553eb192738e46052b281385e299535165fd4b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:53:49 +0100 Subject: [PATCH 6/6] Tidying --- daemon.py | 62 +++++++++---------------------------------------------- utils.py | 34 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 52 deletions(-) diff --git a/daemon.py b/daemon.py index 9209bc4e0..d0713e567 100644 --- a/daemon.py +++ b/daemon.py @@ -208,6 +208,8 @@ from shares import addShare from shares import removeShare from shares import expireShares from categories import setHashtagCategory +from utils import getImageExtensionFromMimeType +from utils import getImageMimeType from utils import hasObjectDict from utils import userAgentDomain from utils import isLocalNetworkAddress @@ -3234,18 +3236,9 @@ class PubServer(BaseHTTPRequestHandler): return mediaFilenameBase = accountsDir + '/upload' - mediaFilename = mediaFilenameBase + '.png' - imageMedia = { - 'jpeg': 'jpg', - 'gif': 'gif', - 'svg+xml': 'svg', - 'webp': 'webp', - 'avif': 'avif' - } - for mimeExt, ext in imageMedia.items(): - if self.headers['Content-type'].endswith(mimeExt): - mediaFilename = mediaFilenameBase + '.' + ext - break + mediaFilename = \ + mediaFilenameBase + '.' + \ + getImageExtensionFromMimeType(self.headers['Content-type']) with open(mediaFilename, 'wb') as avFile: avFile.write(mediaBytes) if debug: @@ -6004,23 +5997,11 @@ class PubServer(BaseHTTPRequestHandler): self._304() return - mediaImageType = 'png' - if emojiFilename.endswith('.png'): - mediaImageType = 'png' - elif emojiFilename.endswith('.jpg'): - mediaImageType = 'jpeg' - elif emojiFilename.endswith('.webp'): - mediaImageType = 'webp' - elif emojiFilename.endswith('.avif'): - mediaImageType = 'avif' - elif emojiFilename.endswith('.svg'): - mediaImageType = 'svg+xml' - else: - mediaImageType = 'gif' + mediaImageType = getImageMimeType(emojiFilename) with open(emojiFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(emojiFilename, - 'image/' + mediaImageType, + mediaImageType, mediaBinary, None, self.server.domainFull) self._write(mediaBinary) @@ -10059,23 +10040,11 @@ class PubServer(BaseHTTPRequestHandler): self._304() return True - mediaFileType = 'png' - if mediaFilename.endswith('.png'): - mediaFileType = 'png' - elif mediaFilename.endswith('.jpg'): - mediaFileType = 'jpeg' - elif mediaFilename.endswith('.webp'): - mediaFileType = 'webp' - elif mediaFilename.endswith('.avif'): - mediaFileType = 'avif' - elif mediaFilename.endswith('.svg'): - mediaFileType = 'svg+xml' - else: - mediaFileType = 'gif' + mediaFileType = getImageMimeType(mediaFilename) with open(mediaFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(mediaFilename, - 'image/' + mediaFileType, + mediaFileType, mediaBinary, None, self.server.domainFull) self._write(mediaBinary) @@ -10128,18 +10097,7 @@ class PubServer(BaseHTTPRequestHandler): # The file has not changed self._304() return True - mediaImageType = 'image/png' - extensionsToMime = { - 'jpg': 'jpeg', - 'gif': 'gif', - 'avif': 'avif', - 'svg': 'svg+xml', - 'webp': 'webp' - } - for ext, mimeExt in extensionsToMime.items(): - if avatarFile.endswith('.' + ext): - mediaImageType = 'image/' + mimeExt - break + mediaImageType = getImageMimeType(avatarFile) with open(avatarFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(avatarFilename, diff --git a/utils.py b/utils.py index 9d21085f2..a20fcd180 100644 --- a/utils.py +++ b/utils.py @@ -238,6 +238,40 @@ def getImageExtensions() -> []: return ('png', 'jpg', 'jpeg', 'gif', 'webp', 'avif', 'svg') +def getImageMimeType(imageFilename: str) -> str: + """Returns the mime type for the given image + """ + extensionsToMime = { + 'png': 'png', + 'jpg': 'jpeg', + 'gif': 'gif', + 'avif': 'avif', + 'svg': 'svg+xml', + 'webp': 'webp' + } + for ext, mimeExt in extensionsToMime.items(): + if imageFilename.endswith('.' + ext): + return 'image/' + mimeExt + return 'image/png' + + +def getImageExtensionFromMimeType(contentType: str) -> str: + """Returns the image extension from a mime type, such as image/jpeg + """ + imageMedia = { + 'png': 'png', + 'jpeg': 'jpg', + 'gif': 'gif', + 'svg+xml': 'svg', + 'webp': 'webp', + 'avif': 'avif' + } + for mimeExt, ext in imageMedia.items(): + if contentType.endswith(mimeExt): + return ext + return 'png' + + def getVideoExtensions() -> []: """Returns a list of the possible video file extensions """