diff --git a/daemon.py b/daemon.py index 6c4b31b3e..60fc2a744 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 @@ -4135,6 +4136,18 @@ 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' + print('submitExportTheme path=' + themeDownloadPath) + self._redirect_headers(themeDownloadPath, + cookie, callingDomain) + self.server.POSTbusy = False + return # extract all of the text fields into a dict fields = \ @@ -5483,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, + domainFull) + self._write(exportBinary) + self._404() + def _getFonts(self, callingDomain: str, path: str, baseDir: str, debug: bool, GETstartTime, GETtimings: {}) -> None: @@ -10815,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, diff --git a/theme.py b/theme.py index 4aec87b13..894ee0cc0 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.isfile(themeDir + '/theme.json'): + 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(baseDir + '/exports/' + theme, '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'