From b168fde295d37114fdc68de85aa5b0da06cb8e94 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 28 May 2021 22:39:34 +0100 Subject: [PATCH 1/6] Link to exported theme --- daemon.py | 13 +++++++++++++ theme.py | 19 +++++++++++++++++++ webapp_profile.py | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 6c4b31b3e..cb3b20435 100644 --- a/daemon.py +++ b/daemon.py @@ -256,6 +256,7 @@ from cache import checkForChangedActor from cache import storePersonInCache from cache import getPersonFromCache from httpsig import verifyPostHeaders +from theme import exportTheme from theme import isNewsThemeName from theme import getTextModeBanner from theme import setNewsAvatar @@ -4147,6 +4148,18 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: profile update, no text ' + 'fields could be extracted from POST') + if fields.get('submitExportTheme'): + print('submitExportTheme') + themeDownloadPath = actorStr + if exportTheme(self.server.baseDir, + self.server.themeName): + themeDownloadPath += \ + '/exports/' + self.server.themeName + '.zip' + self._redirect_headers(themeDownloadPath, + cookie, callingDomain) + self.server.POSTbusy = False + return + # load the json for the actor for this user actorFilename = \ baseDir + '/accounts/' + \ diff --git a/theme.py b/theme.py index 4aec87b13..00e1b33a4 100644 --- a/theme.py +++ b/theme.py @@ -11,9 +11,28 @@ from utils import loadJson from utils import saveJson from utils import getImageExtensions from shutil import copyfile +from shutil import make_archive from content import dangerousCSS +def exportTheme(baseDir: str, theme: str) -> bool: + """Exports a theme as a zip file + """ + themeDir = baseDir + '/theme/' + theme + if not os.path.isdir(themeDir): + return False + if not os.path.isdir(baseDir + '/exports'): + os.mkdir(baseDir + '/exports') + exportFilename = baseDir + '/exports/' + theme + '.zip' + if os.path.isfile(exportFilename): + os.remove(exportFilename) + try: + make_archive(exportFilename, 'zip', themeDir) + except BaseException: + pass + return os.path.isfile(exportFilename) + + def _getThemeFiles() -> []: """Gets the list of theme style sheets """ diff --git a/webapp_profile.py b/webapp_profile.py index 4f4dac110..19d8ce03e 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1347,7 +1347,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, translate['Export Theme'] + '
\n' graphicsStr += \ ' \n' + 'name="submitExportTheme">➤\n' graphicsStr += ' \n' From 74116db6285387e4fe65b3dd92d22bb3adcbcfc0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 28 May 2021 22:46:42 +0100 Subject: [PATCH 2/6] Test for exported theme --- daemon.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/daemon.py b/daemon.py index cb3b20435..4e8841505 100644 --- a/daemon.py +++ b/daemon.py @@ -4136,6 +4136,17 @@ class PubServer(BaseHTTPRequestHandler): welcomeScreenIsComplete(self.server.baseDir, nickname, self.server.domain) onFinalWelcomeScreen = True + elif 'name="submitExportTheme"' in postBytesStr: + print('submitExportTheme') + themeDownloadPath = actorStr + if exportTheme(self.server.baseDir, + self.server.themeName): + themeDownloadPath += \ + '/exports/' + self.server.themeName + '.zip' + self._redirect_headers(themeDownloadPath, + cookie, callingDomain) + self.server.POSTbusy = False + return # extract all of the text fields into a dict fields = \ @@ -4148,18 +4159,6 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: profile update, no text ' + 'fields could be extracted from POST') - if fields.get('submitExportTheme'): - print('submitExportTheme') - themeDownloadPath = actorStr - if exportTheme(self.server.baseDir, - self.server.themeName): - themeDownloadPath += \ - '/exports/' + self.server.themeName + '.zip' - self._redirect_headers(themeDownloadPath, - cookie, callingDomain) - self.server.POSTbusy = False - return - # load the json for the actor for this user actorFilename = \ baseDir + '/accounts/' + \ From 451fbd7f4298a221835e6925e8a21f4307205e38 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 28 May 2021 22:52:32 +0100 Subject: [PATCH 3/6] Saving theme --- daemon.py | 1 + theme.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 4e8841505..eb80d09ac 100644 --- a/daemon.py +++ b/daemon.py @@ -4143,6 +4143,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName): themeDownloadPath += \ '/exports/' + self.server.themeName + '.zip' + print('submitExportTheme path=' + themeDownloadPath) self._redirect_headers(themeDownloadPath, cookie, callingDomain) self.server.POSTbusy = False diff --git a/theme.py b/theme.py index 00e1b33a4..ea67c2081 100644 --- a/theme.py +++ b/theme.py @@ -27,7 +27,7 @@ def exportTheme(baseDir: str, theme: str) -> bool: if os.path.isfile(exportFilename): os.remove(exportFilename) try: - make_archive(exportFilename, 'zip', themeDir) + make_archive(baseDir + '/exports/' + theme, 'zip', themeDir) except BaseException: pass return os.path.isfile(exportFilename) From 8ff292dc8d54f4e827fd783f60c6ee7b6dc47f3d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 28 May 2021 23:00:46 +0100 Subject: [PATCH 4/6] Check that file exists --- theme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme.py b/theme.py index ea67c2081..894ee0cc0 100644 --- a/theme.py +++ b/theme.py @@ -19,7 +19,7 @@ def exportTheme(baseDir: str, theme: str) -> bool: """Exports a theme as a zip file """ themeDir = baseDir + '/theme/' + theme - if not os.path.isdir(themeDir): + if not os.path.isfile(themeDir + '/theme.json'): return False if not os.path.isdir(baseDir + '/exports'): os.mkdir(baseDir + '/exports') From 55c3c85cf459f2ed7fda05655a449fc5fe53ce59 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 28 May 2021 23:14:44 +0100 Subject: [PATCH 5/6] Getting exported theme --- daemon.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index eb80d09ac..f360b93d3 100644 --- a/daemon.py +++ b/daemon.py @@ -4147,7 +4147,7 @@ class PubServer(BaseHTTPRequestHandler): self._redirect_headers(themeDownloadPath, cookie, callingDomain) self.server.POSTbusy = False - return + return # extract all of the text fields into a dict fields = \ @@ -5496,6 +5496,23 @@ class PubServer(BaseHTTPRequestHandler): None, callingDomain) self._write(msg) + def _getExportedTheme(self, callingDomain: str, path: str, + baseDir: str, domainFull: str, + debug: bool) -> None: + """Returns an exported theme zip file + """ + filename = path.split('/exports/', 1)[1] + filename = baseDir + '/exports/' + filename + if os.path.isfile(filename): + with open(filename, 'rb') as fp: + exportBinary = fp.read() + exportType = 'application/zip' + self._set_headers_etag(filename, exportType, + exportBinary, None, + server.domainFull) + self._write(exportBinary) + self._404() + def _getFonts(self, callingDomain: str, path: str, baseDir: str, debug: bool, GETstartTime, GETtimings: {}) -> None: @@ -10828,6 +10845,13 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings): return + if authorized and '/exports/' in self.path: + self._getExportedTheme(callingDomain, self.path, + self.server.baseDir, + self.server.domainFull, + self.server.debug) + return + # get fonts if '/fonts/' in self.path: self._getFonts(callingDomain, self.path, From a8351756d27188d51f2e449dc273b72283668c52 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 28 May 2021 23:16:34 +0100 Subject: [PATCH 6/6] Domain variable --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index f360b93d3..60fc2a744 100644 --- a/daemon.py +++ b/daemon.py @@ -5509,7 +5509,7 @@ class PubServer(BaseHTTPRequestHandler): exportType = 'application/zip' self._set_headers_etag(filename, exportType, exportBinary, None, - server.domainFull) + domainFull) self._write(exportBinary) self._404()