From 91eae9a4ce22cd39753f139372dd0e7cc51ece89 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Sun, 17 May 2020 15:22:50 +0100 Subject: [PATCH] Added custom bootstrap CSS option --- data/config-default.ini | 4 +- data/templates/404.html | 4 +- data/templates/admin.html | 2 +- data/templates/form.html | 2 +- data/templates/invalidCode.html | 4 +- images/jellyfin-accounts-social.png | Bin 0 -> 50448 bytes images/jellyfin-accounts-social.svg | 197 ++++++++++++++++++++++++++++ jellyfin_accounts/web.py | 17 ++- jf-accounts | 30 ++++- 9 files changed, 249 insertions(+), 11 deletions(-) create mode 100644 images/jellyfin-accounts-social.png create mode 100644 images/jellyfin-accounts-social.svg diff --git a/data/config-default.ini b/data/config-default.ini index 453d511..2650138 100644 --- a/data/config-default.ini +++ b/data/config-default.ini @@ -103,5 +103,7 @@ invites = ; Path to store emails addresses in JSON emails = ; Path to the user policy template. Can be acquired with get-template. -user_template = +user_template = +; Path to custom bootstrap.css +custom_css = diff --git a/data/templates/404.html b/data/templates/404.html index 1bbd935..7a83bd5 100644 --- a/data/templates/404.html +++ b/data/templates/404.html @@ -12,8 +12,8 @@ -Create Jellyfin Account - +404 + diff --git a/data/templates/admin.html b/data/templates/admin.html index 5e42ea9..aa7e642 100644 --- a/data/templates/admin.html +++ b/data/templates/admin.html @@ -14,7 +14,7 @@ - + diff --git a/data/templates/form.html b/data/templates/form.html index d90d3c7..ce6e1ca 100644 --- a/data/templates/form.html +++ b/data/templates/form.html @@ -12,7 +12,7 @@ - + diff --git a/data/templates/invalidCode.html b/data/templates/invalidCode.html index 118a60b..f5cc409 100644 --- a/data/templates/invalidCode.html +++ b/data/templates/invalidCode.html @@ -3,8 +3,8 @@ -Create Jellyfin Account - +Invalid Code + diff --git a/images/jellyfin-accounts-social.png b/images/jellyfin-accounts-social.png new file mode 100644 index 0000000000000000000000000000000000000000..e653ace87b262a15aa5399408ffb8cc583443e62 GIT binary patch literal 50448 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 literal 0 HcmV?d00001 diff --git a/images/jellyfin-accounts-social.svg b/images/jellyfin-accounts-social.svg new file mode 100644 index 0000000..201db6f --- /dev/null +++ b/images/jellyfin-accounts-social.svg @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jellyfin_accounts/web.py b/jellyfin_accounts/web.py index 7fc82f1..44dced6 100644 --- a/jellyfin_accounts/web.py +++ b/jellyfin_accounts/web.py @@ -1,7 +1,7 @@ import json from pathlib import Path from flask import Flask, send_from_directory, render_template -from __main__ import config, app, g +from __main__ import config, app, g, css from __main__ import web_log as log from jellyfin_accounts.web_api import checkInvite, validator @@ -9,6 +9,9 @@ from jellyfin_accounts.web_api import checkInvite, validator @app.errorhandler(404) def page_not_found(e): return render_template('404.html', + css_href=css['href'], + css_integrity=css['integrity'], + css_crossorigin=css['crossorigin'], contactMessage=config['ui']['contact_message']), 404 @@ -16,6 +19,9 @@ def page_not_found(e): def admin(): # return app.send_static_file('admin.html') return render_template('admin.html', + css_href=css['href'], + css_integrity=css['integrity'], + css_crossorigin=css['crossorigin'], contactMessage='', email_enabled=config.getboolean( 'invite_emails', 'enabled')) @@ -26,6 +32,9 @@ def static_proxy(path): if 'html' not in path: return app.send_static_file(path) return render_template('404.html', + css_href=css['href'], + css_integrity=css['integrity'], + css_crossorigin=css['crossorigin'], contactMessage=config['ui']['contact_message']), 404 @@ -45,6 +54,9 @@ def inviteProxy(path): except KeyError: email = "" return render_template('form.html', + css_href=css['href'], + css_integrity=css['integrity'], + css_crossorigin=css['crossorigin'], contactMessage=config['ui']['contact_message'], helpMessage=config['ui']['help_message'], successMessage=config['ui']['success_message'], @@ -59,4 +71,7 @@ def inviteProxy(path): else: log.debug('Attempted use of invalid invite') return render_template('invalidCode.html', + css_href=css['href'], + css_integrity=css['integrity'], + css_crossorigin=css['crossorigin'], contactMessage=config['ui']['contact_message']) diff --git a/jf-accounts b/jf-accounts index cfc0e61..c0657af 100755 --- a/jf-accounts +++ b/jf-accounts @@ -87,9 +87,34 @@ if args.port is not None: for key in config['files']: if config['files'][key] == '': - log.debug(f'Using default {key}') - config['files'][key] = str(data_dir / (key + '.json')) + if key != 'custom_css': + log.debug(f'Using default {key}') + config['files'][key] = str(data_dir / (key + '.json')) + +def default_css(): + css = {} + css['href'] = "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" + css['integrity'] = "sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" + css['crossorigin'] = "anonymous" + return css + + +css = {} +css = default_css() +if 'custom_css' in config['files']: + if config['files']['custom_css'] != '': + try: + shutil.copy(config['files']['custom_css'], + (local_dir / 'static' / 'bootstrap.css')) + log.debug('Loaded custom CSS') + css['href'] = '/bootstrap.css' + css['integrity'] = '' + css['crossorigin'] = '' + except FileNotFoundError: + log.error(f'Custom CSS {config["files"]["custom_css"]} not found, using default.') + + if ('email_html' not in config['password_resets'] or config['password_resets']['email_html'] == ''): log.debug('Using default password reset email HTML template') @@ -110,7 +135,6 @@ if ('email_text' not in config['invite_emails'] or config['invite_emails']['email_text'] = str(local_dir / 'invite-email.txt') - if args.get_policy: import json from jellyfin_accounts.jf_api import Jellyfin