mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-16 02:02:58 -07:00
Add self-hosted newsletter authentication metnods
This commit is contained in:
parent
11e9bd2d54
commit
fa99f6e684
5 changed files with 139 additions and 17 deletions
|
@ -3525,8 +3525,7 @@ a.no-highlight:hover {
|
||||||
}
|
}
|
||||||
.login-logo {
|
.login-logo {
|
||||||
margin: 0 auto 50px auto;
|
margin: 0 auto 50px auto;
|
||||||
width: 340px;
|
text-align: center;
|
||||||
height: 100px;
|
|
||||||
}
|
}
|
||||||
.login-container .form-group {
|
.login-container .form-group {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
|
@ -4098,4 +4097,8 @@ a[data-tab-destination] {
|
||||||
margin-top: 10px !important;
|
margin-top: 10px !important;
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
border-top: 1px solid #444;
|
border-top: 1px solid #444;
|
||||||
}
|
}
|
||||||
|
.newsletter-logo {
|
||||||
|
margin: 0 auto 50px auto;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
43
data/interfaces/default/newsletter_auth.html
Normal file
43
data/interfaces/default/newsletter_auth.html
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<%
|
||||||
|
import urllib
|
||||||
|
%>
|
||||||
|
<!doctype html>
|
||||||
|
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Tautulli - ${title}</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link href="${http_root}css/bootstrap3/bootstrap.css" rel="stylesheet">
|
||||||
|
<link href="${http_root}css/tautulli.css${cache_param}" rel="stylesheet">
|
||||||
|
<link href="${http_root}css/opensans.min.css" rel="stylesheet">
|
||||||
|
<link href="${http_root}css/font-awesome.min.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="body-container">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="login-container">
|
||||||
|
<div class="newsletter-logo">
|
||||||
|
<img src="${http_root}images/newsletter/newsletter-header.png" height="100" alt="PlexPy">
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-6 col-sm-offset-3">
|
||||||
|
<form action="${uri}" method="post" id="newsletter-form">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="password" class="control-label">
|
||||||
|
Password
|
||||||
|
</label>
|
||||||
|
<input type="password" id="key" name="key" class="form-control" autofocus>
|
||||||
|
</div>
|
||||||
|
<button id="enter" type="submit" class="btn btn-bright login-button"><i class="fa fa-sign-in"></i> Enter</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -965,10 +965,35 @@
|
||||||
<p class="help-block">Enable to host newsletters on your own domain. This will generate a link to an HTML page where you can view the newsletter.</p>
|
<p class="help-block">Enable to host newsletters on your own domain. This will generate a link to an HTML page where you can view the newsletter.</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="self_host_newsletter_options" style="overlfow: hidden; display: ${'block' if config['newsletter_self_hosted'] == 'checked' else 'none'}">
|
<div id="self_host_newsletter_options" style="overlfow: hidden; display: ${'block' if config['newsletter_self_hosted'] == 'checked' else 'none'}">
|
||||||
<p class="help-block" id="self_host_newsletter_message">
|
<div class="form-group">
|
||||||
Note: The <span class="inline-pre">${http_root}newsletter</span> endpoint on your domain must be publicly accessible from the internet.
|
<p class="help-block" id="self_host_newsletter_message">
|
||||||
</p>
|
Note: The <span class="inline-pre">${http_root}newsletter</span> endpoint on your domain must be publicly accessible from the internet.
|
||||||
<p class="help-block settings-warning base-url-warning">Warning: Public Tautulli domain not set under <a data-tab-destination="tabs-web_interface" data-target="#http_base_url">Web Interface</a>.</p>
|
</p>
|
||||||
|
<p class="help-block settings-warning base-url-warning">Warning: Public Tautulli domain not set under <a data-tab-destination="tabs-web_interface" data-target="#http_base_url">Web Interface</a>.</p>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="newsletter_auth">Newsletter Authentication</label>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<select class="form-control" id="newsletter_auth" name="newsletter_auth">
|
||||||
|
<option value="0" ${'selected' if config['newsletter_auth'] == 0 else ''}>Disabled</option>
|
||||||
|
<option value="1" ${'selected' if config['newsletter_auth'] == 1 else ''}>Password</option>
|
||||||
|
<option value="2" ${'selected' if config['newsletter_auth'] == 2 else ''}>Tautulli Guest Access</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help-block">Select the authentication method to use for self-hosted newsletters.</p>
|
||||||
|
<p class="help-block settings-warning newsletter-guest-access-warning">Warning: Guest Access is not enabled under <a data-tab-destination="tabs-web_interface" data-target="#allow_guest_access">Web Interface</a>.</p>
|
||||||
|
</div>
|
||||||
|
<div class="form-group" id="newsletter_password_option">
|
||||||
|
<label for="newsletter_password">Newsletter Password</label>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<input type="text" class="form-control" id="newsletter_password" name="newsletter_password" value="${config['newsletter_password']}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help-block">Enter the password that will be required to view self-hosted newsletters.</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="checkbox advanced-setting">
|
<div class="checkbox advanced-setting">
|
||||||
|
@ -1025,10 +1050,12 @@
|
||||||
<p class="help-block">Select where to host Plex images for notifications and newsletters.</p>
|
<p class="help-block">Select where to host Plex images for notifications and newsletters.</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="imgur_upload_options" style="overlfow: hidden; display: ${'none' if config['notify_upload_posters'] != 1 else 'block'}">
|
<div id="imgur_upload_options" style="overlfow: hidden; display: ${'none' if config['notify_upload_posters'] != 1 else 'block'}">
|
||||||
<p class="help-block" id="imgur_upload_message">
|
<div class="form-group">
|
||||||
You can register a new Imgur application <a href="${anon_url('https://api.imgur.com/oauth2/addclient')}" target="_blank">here</a>.<br>
|
<p class="help-block" id="imgur_upload_message">
|
||||||
Warning: Imgur uploads are rate-limited and newsletters may exceed the limit. Please use Cloudinary for newsletters instead.
|
You can register a new Imgur application <a href="${anon_url('https://api.imgur.com/oauth2/addclient')}" target="_blank">here</a>.<br>
|
||||||
</p>
|
Warning: Imgur uploads are rate-limited and newsletters may exceed the limit. Please use Cloudinary for newsletters instead.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="imgur_client_id">Imgur Client ID</label>
|
<label for="imgur_client_id">Imgur Client ID</label>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -1040,13 +1067,17 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="self_host_image_options" style="overlfow: hidden; display: ${'none' if config['notify_upload_posters'] != 2 else 'block'}">
|
<div id="self_host_image_options" style="overlfow: hidden; display: ${'none' if config['notify_upload_posters'] != 2 else 'block'}">
|
||||||
<p class="help-block" id="self_host_image_message">Note: The <span class="inline-pre">${http_root}image</span> endpoint on your domain must be publicly accessible from the internet.</p>
|
<div class="form-group">
|
||||||
<p class="help-block settings-warning base-url-warning">Warning: Public Tautulli domain not set under <a data-tab-destination="tabs-web_interface" data-target="#http_base_url">Web Interface</a>.</p>
|
<p class="help-block" id="self_host_image_message">Note: The <span class="inline-pre">${http_root}image</span> endpoint on your domain must be publicly accessible from the internet.</p>
|
||||||
|
<p class="help-block settings-warning base-url-warning">Warning: Public Tautulli domain not set under <a data-tab-destination="tabs-web_interface" data-target="#http_base_url">Web Interface</a>.</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="cloudinary_upload_options" style="overlfow: hidden; display: ${'none' if config['notify_upload_posters'] != 3 else 'block'}">
|
<div id="cloudinary_upload_options" style="overlfow: hidden; display: ${'none' if config['notify_upload_posters'] != 3 else 'block'}">
|
||||||
<p class="help-block" id="imgur_upload_message">
|
<div class="form-group">
|
||||||
You can sign up for Cloudinary <a href="${anon_url('https://cloudinary.com')}" target="_blank">here</a>.<br>
|
<p class="help-block" id="imgur_upload_message">
|
||||||
</p>
|
You can sign up for Cloudinary <a href="${anon_url('https://cloudinary.com')}" target="_blank">here</a>.<br>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="cloudinary_cloud_name">Cloudinary Cloud Name</label>
|
<label for="cloudinary_cloud_name">Cloudinary Cloud Name</label>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -2680,6 +2711,28 @@ $(document).ready(function() {
|
||||||
newsletterUploadEnabled();
|
newsletterUploadEnabled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function newsletterPasswordEnabled() {
|
||||||
|
if ($('#newsletter_auth').val() === '1') {
|
||||||
|
$('#newsletter_password_option').slideDown();
|
||||||
|
} else {
|
||||||
|
$('#newsletter_password_option').slideUp();
|
||||||
|
}
|
||||||
|
if ($('#newsletter_auth').val() === '2' && !($('#allow_guest_access').is(':checked'))) {
|
||||||
|
$('.newsletter-guest-access-warning').show();
|
||||||
|
} else {
|
||||||
|
$('.newsletter-guest-access-warning').hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
newsletterPasswordEnabled();
|
||||||
|
|
||||||
|
$('#newsletter_auth').change(function () {
|
||||||
|
newsletterPasswordEnabled();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#allow_guest_access').click(function () {
|
||||||
|
newsletterPasswordEnabled();
|
||||||
|
})
|
||||||
|
|
||||||
$('body').on('click', 'a[data-tab-destination]', function () {
|
$('body').on('click', 'a[data-tab-destination]', function () {
|
||||||
var tab = $(this).data('tab-destination');
|
var tab = $(this).data('tab-destination');
|
||||||
$("a[href=#" + tab + "]").click();
|
$("a[href=#" + tab + "]").click();
|
||||||
|
|
|
@ -312,6 +312,8 @@ _CONFIG_DEFINITIONS = {
|
||||||
'MONITOR_REMOTE_ACCESS': (int, 'Monitoring', 0),
|
'MONITOR_REMOTE_ACCESS': (int, 'Monitoring', 0),
|
||||||
'MONITORING_INTERVAL': (int, 'Monitoring', 60),
|
'MONITORING_INTERVAL': (int, 'Monitoring', 60),
|
||||||
'MONITORING_USE_WEBSOCKET': (int, 'Monitoring', 0),
|
'MONITORING_USE_WEBSOCKET': (int, 'Monitoring', 0),
|
||||||
|
'NEWSLETTER_AUTH': (int, 'Newsletter', 0),
|
||||||
|
'NEWSLETTER_PASSWORD': (str, 'Newsletter', ''),
|
||||||
'NEWSLETTER_CUSTOM_DIR': (str, 'Newsletter', ''),
|
'NEWSLETTER_CUSTOM_DIR': (str, 'Newsletter', ''),
|
||||||
'NEWSLETTER_INLINE_STYLES': (int, 'Newsletter', 1),
|
'NEWSLETTER_INLINE_STYLES': (int, 'Newsletter', 1),
|
||||||
'NEWSLETTER_TEMPLATES': (str, 'Newsletter', 'newsletters'),
|
'NEWSLETTER_TEMPLATES': (str, 'Newsletter', 'newsletters'),
|
||||||
|
|
|
@ -56,7 +56,7 @@ import web_socket
|
||||||
from plexpy.api2 import API2
|
from plexpy.api2 import API2
|
||||||
from plexpy.helpers import checked, addtoapi, get_ip, create_https_certificates, build_datatables_json
|
from plexpy.helpers import checked, addtoapi, get_ip, create_https_certificates, build_datatables_json
|
||||||
from plexpy.session import get_session_info, get_session_user_id, allow_session_user, allow_session_library
|
from plexpy.session import get_session_info, get_session_user_id, allow_session_user, allow_session_library
|
||||||
from plexpy.webauth import AuthController, requireAuth, member_of, name_is
|
from plexpy.webauth import AuthController, requireAuth, member_of
|
||||||
|
|
||||||
|
|
||||||
def serve_template(templatename, **kwargs):
|
def serve_template(templatename, **kwargs):
|
||||||
|
@ -2826,6 +2826,8 @@ class WebInterface(object):
|
||||||
"show_advanced_settings": plexpy.CONFIG.SHOW_ADVANCED_SETTINGS,
|
"show_advanced_settings": plexpy.CONFIG.SHOW_ADVANCED_SETTINGS,
|
||||||
"newsletter_dir": plexpy.CONFIG.NEWSLETTER_DIR,
|
"newsletter_dir": plexpy.CONFIG.NEWSLETTER_DIR,
|
||||||
"newsletter_self_hosted": checked(plexpy.CONFIG.NEWSLETTER_SELF_HOSTED),
|
"newsletter_self_hosted": checked(plexpy.CONFIG.NEWSLETTER_SELF_HOSTED),
|
||||||
|
"newsletter_auth": plexpy.CONFIG.NEWSLETTER_AUTH,
|
||||||
|
"newsletter_password": plexpy.CONFIG.NEWSLETTER_PASSWORD,
|
||||||
"newsletter_inline_styles": checked(plexpy.CONFIG.NEWSLETTER_INLINE_STYLES),
|
"newsletter_inline_styles": checked(plexpy.CONFIG.NEWSLETTER_INLINE_STYLES),
|
||||||
"newsletter_custom_dir": plexpy.CONFIG.NEWSLETTER_CUSTOM_DIR
|
"newsletter_custom_dir": plexpy.CONFIG.NEWSLETTER_CUSTOM_DIR
|
||||||
}
|
}
|
||||||
|
@ -5741,6 +5743,25 @@ class WebInterface(object):
|
||||||
|
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
def newsletter(self, *args, **kwargs):
|
def newsletter(self, *args, **kwargs):
|
||||||
|
request_uri = cherrypy.request.wsgi_environ['REQUEST_URI']
|
||||||
|
if plexpy.CONFIG.NEWSLETTER_AUTH == 2:
|
||||||
|
redirect_uri = request_uri.replace('/newsletter', '/newsletter_auth')
|
||||||
|
raise cherrypy.HTTPRedirect(redirect_uri)
|
||||||
|
|
||||||
|
elif plexpy.CONFIG.NEWSLETTER_AUTH == 1 and plexpy.CONFIG.NEWSLETTER_PASSWORD:
|
||||||
|
if kwargs.pop('key', None) == plexpy.CONFIG.NEWSLETTER_PASSWORD:
|
||||||
|
return self.newsletter_auth(*args, **kwargs)
|
||||||
|
else:
|
||||||
|
return serve_template(templatename="newsletter_auth.html",
|
||||||
|
title="Newsletter Login",
|
||||||
|
uri=request_uri)
|
||||||
|
|
||||||
|
else:
|
||||||
|
return self.newsletter_auth(*args, **kwargs)
|
||||||
|
|
||||||
|
@cherrypy.expose
|
||||||
|
@requireAuth()
|
||||||
|
def newsletter_auth(self, *args, **kwargs):
|
||||||
if args:
|
if args:
|
||||||
# Keep this for backwards compatibility for images through /newsletter/image
|
# Keep this for backwards compatibility for images through /newsletter/image
|
||||||
if len(args) >= 2 and args[0] == 'image':
|
if len(args) >= 2 and args[0] == 'image':
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue