mirror of
https://github.com/zoffline/zwift-offline.git
synced 2026-04-28 11:53:14 -07:00
Use token to remember login
This commit is contained in:
@@ -22,16 +22,14 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12 top-buffer">
|
<div class="col-md-12 top-buffer">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="checkbox" id="rememberlogin" name="rememberlogin">
|
<input class="form-check-input" type="checkbox" id="remember" name="remember">
|
||||||
<label class="form-check-label text-shadow" for="rememberlogin">
|
<label class="form-check-label text-shadow" for="remember">Remember me</label>
|
||||||
Remember login
|
|
||||||
</label>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12 top-buffer">
|
<div class="col-md-12 top-buffer">
|
||||||
<input type="submit" value="Login" class="btn btn-sm btn-light" onclick="rememberLogin()">
|
<input type="submit" value="Login" class="btn btn-sm btn-light">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@@ -49,52 +47,3 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block scripts %}
|
|
||||||
<script>
|
|
||||||
function getCookie(cname) {
|
|
||||||
var name = cname + "=";
|
|
||||||
var decodedCookie = decodeURIComponent(document.cookie);
|
|
||||||
var ca = decodedCookie.split(';');
|
|
||||||
for(var i = 0; i < ca.length; i++) {
|
|
||||||
var c = ca[i];
|
|
||||||
while (c.charAt(0) == ' ') {
|
|
||||||
c = c.substring(1);
|
|
||||||
}
|
|
||||||
if (c.indexOf(name) == 0) {
|
|
||||||
return c.substring(name.length, c.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function setCookie(cname, cvalue, exdays) {
|
|
||||||
var d = new Date();
|
|
||||||
d.setTime(d.getTime() + (exdays*24*60*60*1000));
|
|
||||||
var expires = "expires=" + d.toUTCString();
|
|
||||||
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
|
|
||||||
}
|
|
||||||
|
|
||||||
var checkbox = document.getElementById('rememberlogin');
|
|
||||||
var username = document.getElementById('username');
|
|
||||||
var password = document.getElementById('password');
|
|
||||||
function rememberLogin() {
|
|
||||||
if(checkbox.checked && username.value !== '' && password.value !== '') {
|
|
||||||
setCookie('username', username.value, 365);
|
|
||||||
setCookie('password', password.value, 365);
|
|
||||||
}
|
|
||||||
else if(!checkbox.checked) {
|
|
||||||
setCookie('username', '', 0);
|
|
||||||
setCookie('password', '', 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var usernameVal = getCookie('username');
|
|
||||||
var passwordVal = getCookie('password');
|
|
||||||
if(usernameVal !== undefined && usernameVal !== null && usernameVal !== '' &&
|
|
||||||
passwordVal !== undefined && passwordVal !== null && passwordVal !== '') {
|
|
||||||
checkbox.checked = true;
|
|
||||||
username.value = usernameVal;
|
|
||||||
password.value = passwordVal;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ from logging.handlers import RotatingFileHandler
|
|||||||
|
|
||||||
import jwt
|
import jwt
|
||||||
from flask import Flask, request, jsonify, redirect, render_template, url_for, flash, session, abort, make_response, send_file, send_from_directory
|
from flask import Flask, request, jsonify, redirect, render_template, url_for, flash, session, abort, make_response, send_file, send_from_directory
|
||||||
from flask_login import UserMixin, AnonymousUserMixin, LoginManager, login_user, current_user, login_required
|
from flask_login import UserMixin, AnonymousUserMixin, LoginManager, login_user, current_user, login_required, logout_user
|
||||||
from gevent.pywsgi import WSGIServer
|
from gevent.pywsgi import WSGIServer
|
||||||
from google.protobuf.descriptor import FieldDescriptor
|
from google.protobuf.descriptor import FieldDescriptor
|
||||||
from protobuf_to_dict import protobuf_to_dict, TYPE_CALLABLE_MAP
|
from protobuf_to_dict import protobuf_to_dict, TYPE_CALLABLE_MAP
|
||||||
@@ -359,6 +359,7 @@ def login():
|
|||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
username = request.form['username']
|
username = request.form['username']
|
||||||
password = request.form['password']
|
password = request.form['password']
|
||||||
|
remember = bool(request.form.get('remember'))
|
||||||
|
|
||||||
if not (username and password):
|
if not (username and password):
|
||||||
flash("Username and password cannot be empty.")
|
flash("Username and password cannot be empty.")
|
||||||
@@ -367,14 +368,17 @@ def login():
|
|||||||
user = User.query.filter_by(username=username).first()
|
user = User.query.filter_by(username=username).first()
|
||||||
|
|
||||||
if user and check_password_hash(user.pass_hash, password):
|
if user and check_password_hash(user.pass_hash, password):
|
||||||
login_user(user, remember=True)
|
login_user(user, remember=remember)
|
||||||
return redirect(url_for("user_home", username=username, enable_ghosts=bool(user.enable_ghosts), online=get_online()))
|
return redirect(url_for("user_home", username=username, enable_ghosts=bool(user.enable_ghosts), online=get_online()))
|
||||||
else:
|
else:
|
||||||
flash("Invalid username or password.")
|
flash("Invalid username or password.")
|
||||||
|
|
||||||
|
if current_user.is_authenticated:
|
||||||
|
return redirect(url_for("user_home", username=current_user.username, enable_ghosts=bool(current_user.enable_ghosts), online=get_online()))
|
||||||
|
|
||||||
user = User.verify_token(request.args.get('token'))
|
user = User.verify_token(request.args.get('token'))
|
||||||
if user:
|
if user:
|
||||||
login_user(user, remember=True)
|
login_user(user, remember=False)
|
||||||
return redirect(url_for("reset", username=user.username))
|
return redirect(url_for("reset", username=user.username))
|
||||||
|
|
||||||
return render_template("login_form.html")
|
return render_template("login_form.html")
|
||||||
@@ -575,7 +579,9 @@ def download():
|
|||||||
|
|
||||||
|
|
||||||
@app.route("/logout/<username>")
|
@app.route("/logout/<username>")
|
||||||
|
@login_required
|
||||||
def logout(username):
|
def logout(username):
|
||||||
|
logout_user()
|
||||||
flash("Successfully logged out.")
|
flash("Successfully logged out.")
|
||||||
return redirect(url_for('login'))
|
return redirect(url_for('login'))
|
||||||
|
|
||||||
@@ -1556,7 +1562,7 @@ def launch_zwift():
|
|||||||
# Zwift client has switched to calling https://launcher.zwift.com/launcher/ride
|
# Zwift client has switched to calling https://launcher.zwift.com/launcher/ride
|
||||||
if request.path != "/ride" and not os.path.exists(AUTOLAUNCH_FILE):
|
if request.path != "/ride" and not os.path.exists(AUTOLAUNCH_FILE):
|
||||||
if MULTIPLAYER:
|
if MULTIPLAYER:
|
||||||
return render_template("login_form.html")
|
return redirect(url_for('login'))
|
||||||
else:
|
else:
|
||||||
return render_template("user_home.html", username="", enable_ghosts=os.path.exists(ENABLEGHOSTS_FILE), online=get_online(),
|
return render_template("user_home.html", username="", enable_ghosts=os.path.exists(ENABLEGHOSTS_FILE), online=get_online(),
|
||||||
is_admin=False, restarting=restarting, restarting_in_minutes=restarting_in_minutes)
|
is_admin=False, restarting=restarting, restarting_in_minutes=restarting_in_minutes)
|
||||||
|
|||||||
Reference in New Issue
Block a user