diff --git a/app.py b/app.py index a3fa187..fe8d0ef 100755 --- a/app.py +++ b/app.py @@ -24,6 +24,7 @@ import auth import analytics as a import folder_secret_config_editor as fsce import helperfunctions as hf +import fnmatch app_config = auth.return_app_config() BASE_DIR = os.path.realpath(app_config['BASE_DIR']) @@ -136,7 +137,7 @@ def list_directory_contents(directory, subpath): music_exts = ('.mp3',) image_exts = ('.jpg', '.jpeg', '.png', '.gif', '.bmp') - blocked_filenames = ['Thumbs.db'] + blocked_filenames = ['Thumbs.db', '*.mrk'] try: with os.scandir(directory) as it: @@ -146,12 +147,12 @@ def list_directory_contents(directory, subpath): if entry.name.startswith('.'): continue - # Skip blocked_filenames - if entry.name in blocked_filenames: + # Skip blocked_filenames using fnmatch for wildcards + if any(fnmatch.fnmatch(entry.name, pattern) for pattern in blocked_filenames): continue if entry.is_dir(follow_symlinks=False): - if entry.name in ["Transkription", "@eaDir"]: + if entry.name in ["Transkription", "@eaDir", ".ai"]: continue rel_path = os.path.join(subpath, entry.name) if subpath else entry.name @@ -238,6 +239,7 @@ def custom_logo(filename): response.headers['Cache-Control'] = 'public, max-age=86400' return response + @app.route('/sw.js') def serve_sw(): return send_from_directory(os.path.join(app.root_path, 'static'), 'sw.js', mimetype='application/javascript') @@ -471,17 +473,30 @@ def serve_file(subpath): # 6) Build response for non-image filesize = os.path.getsize(file_path) filename = os.path.basename(full_path) + + if as_attachment: + download_name = filename + mimetype = 'application/octet-stream' + else: + download_name = None + mimetype = mime + # Single send_file call with proper attachment handling response = send_file( file_path, - mimetype=mime, + mimetype=mimetype, conditional=True, as_attachment=as_attachment, download_name=filename if as_attachment else None ) - if not as_attachment: + + if as_attachment: + response.headers['X-Content-Type-Options'] = 'nosniff' + response.headers['Content-Disposition'] = 'attachment' + else: response.headers['Content-Disposition'] = 'inline' + response.headers['Cache-Control'] = 'public, max-age=86400' # 7) Logging diff --git a/static/sw.js b/static/sw.js index baf4cee..afb2215 100644 --- a/static/sw.js +++ b/static/sw.js @@ -1,30 +1,56 @@ -const cacheName = 'gottesdienste-v1.11'; +const VERSION = '1.19'; +const CACHE_NAME = `gottesdienste-v${VERSION}`; const assets = [ - '/', - '/static/app.css', - '/static/app.js', - '/static/gallery.css', - '/static/gallery.js', - '/static/audioplayer.css', - '/static/audioplayer.js', + '/', + `/static/app.css?v=${VERSION}`, + `/static/app.js?v=${VERSION}`, + `/static/gallery.css?v=${VERSION}`, + `/static/gallery.js?v=${VERSION}`, + `/static/audioplayer.css?v=${VERSION}`, + `/static/audioplayer.js?v=${VERSION}`, '/icon/logo-192x192.png', + '/icon/logo-300x300.png', '/icon/logo-512x512.png', '/custom_logo/logoB.png', '/custom_logo/logoW.png' ]; -self.addEventListener('install', e => { - e.waitUntil( - caches.open(cacheName).then(cache => { - return cache.addAll(assets); +self.addEventListener('install', evt => { + self.skipWaiting(); + evt.waitUntil( + caches.open(CACHE_NAME) + .then(cache => cache.addAll(assets)) + ); +}); + +self.addEventListener('activate', evt => { + self.clients.claim(); + evt.waitUntil( + caches.keys().then(keys => + Promise.all( + keys + .filter(k => k !== CACHE_NAME) + .map(k => caches.delete(k)) + ) + ) + .then(() => { + // Reload to use new files + return self.clients.matchAll({ type: 'window' }) + .then(clients => + clients.forEach(client => client.navigate(client.url)) + ); }) ); }); -self.addEventListener('fetch', e => { - e.respondWith( - caches.match(e.request).then(response => { - return response || fetch(e.request); - }) +self.addEventListener('fetch', evt => { + if (evt.request.mode === 'navigate') { + evt.respondWith( + fetch(evt.request).catch(() => caches.match('/app.html')) + ); + return; + } + evt.respondWith( + caches.match(evt.request).then(cached => cached || fetch(evt.request)) ); -}); \ No newline at end of file +}); diff --git a/templates/app.html b/templates/app.html index 5a582a6..a98e78d 100644 --- a/templates/app.html +++ b/templates/app.html @@ -8,7 +8,7 @@ - + @@ -23,7 +23,7 @@ - + @@ -253,8 +253,6 @@ if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('{{ url_for("static", filename="sw.js") }}') - .then(reg => console.log('Service worker registered.', reg)) - .catch(err => console.error('Service worker not registered.', err)); }); }