Add WebAdmin

This commit is contained in:
SuperSonic 2019-12-29 01:11:48 +08:00
parent f310b8928f
commit 62cc4e7a57
4 changed files with 230 additions and 0 deletions

73
libs/webadmin/server.py Normal file
View file

@ -0,0 +1,73 @@
import hashlib
import json
import random
import time
from flask import Flask, render_template, Response, request, redirect
from flask_bootstrap import Bootstrap
wa_app = Flask(__name__)
passports = []
password = str(hash(random.random()))
class Yuuki_WebAdmin:
def __init__(self):
self.app = wa_app
Bootstrap(self.app)
@staticmethod
@wa_app.route("/")
def index():
if "yuuki_admin" in request.cookies:
if request.cookies["yuuki_admin"] in passports:
return render_template('manage.html')
else:
response = redirect("/")
response.set_cookie(
key='yuuki_admin',
value='',
expires=0
)
return response
else:
return render_template('index.html')
@staticmethod
@wa_app.route("/verify", methods=['GET', 'POST'])
def verify():
result = {"status": 403}
if request.method == "POST" and "code" in request.values:
if request.values["code"] == password:
seed = hash(random.random() + time.time())
seed = str(seed).encode('utf-8')
session_key = hashlib.sha256(seed).hexdigest()
passports.append(session_key)
result = {"status": 200, "session": session_key}
else:
result = {"status": 401}
return Response(json.dumps(result), mimetype='application/json')
@staticmethod
@wa_app.route("/logout")
def logout():
response = redirect("/")
if "yuuki_admin" in request.cookies:
if request.cookies.get("yuuki_admin") in passports:
passports.remove(request.cookies.get("yuuki_admin"))
response.set_cookie(
key='yuuki_admin',
value='',
expires=0
)
return response
@staticmethod
def set_password(code):
global password
password = code
def start(self, admin_password):
self.set_password(admin_password)
self.app.run(port=2020, debug=True)

View file

@ -0,0 +1,102 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
{{ bootstrap.load_css() }}
<style>
body {
padding-top: 5rem;
}
.starter-template {
padding: 3rem 1.5rem;
text-align: center;
}
.damage {
color: #ff0000;
}
.password_box {
margin: 0;
position: absolute;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
}
</style>
<title>Star Yuuki BOT - WebAdmin</title>
</head>
<body>
{% from 'bootstrap/nav.html' import render_nav_item %}
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<a class="navbar-brand" href="#">Yuuki - WebAdmin</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse"
aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav mr-auto">
{{ render_nav_item('index') }}
</ul>
</div>
</nav>
<main role="main" class="container">
<div class="starter-template">
<h1>Star Yuuki BOT - WebAdmin</h1>
<p class="lead">Version {{ version }}</p>
<p>
The administrator control center of LINE BOT
</p>
<div class="status damage"></div>
</div>
<div class="password_box">
<form class="form-inline mt-2 mt-md-0 login-box" method="post">
<input class="form-control mr-sm-2" type="password" placeholder="Type your admin password"
aria-label="Login" name="code">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Login</button>
</form>
<div class="datahere"></div>
</div>
</main>
<!-- Optional JavaScript -->
{{ bootstrap.load_js() }}
<script src="https://cdn.jsdelivr.net/npm/js-cookie@beta/dist/js.cookie.min.js"></script>
<script>
$(function () {
$('form.login-box').on('submit', function (e) {
$.ajax({
type: "POST",
url: "/verify",
data: $(this).serialize(),
success: function (data) {
if (data.status == 200) {
$(".status").text("Welcome");
Cookies.set('yuuki_admin', data.session);
location.reload();
} else {
$(".status").text("Wrong password")
}
}
});
e.preventDefault();
});
});
</script>
</body>
</html>

View file

@ -0,0 +1,53 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
{{ bootstrap.load_css() }}
<style>
body {
padding-top: 5rem;
}
.starter-template {
padding: 3rem 1.5rem;
text-align: center;
}
.damage {
color: #ff0000;
}
</style>
<title>Star Yuuki BOT - WebAdmin</title>
</head>
<body>
{% from 'bootstrap/nav.html' import render_nav_item %}
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<a class="navbar-brand" href="#">Yuuki - WebAdmin</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse"
aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav mr-auto">
{{ render_nav_item('index') }}
</ul>
<a href="/logout"><button class="btn btn-outline-success my-2 my-sm-0">Logout</button></a>
</div>
</nav>
{% block body %}{% endblock%}
<!-- Optional JavaScript -->
{{ bootstrap.load_js() }}
</body>
</html>

View file

@ -1,3 +1,5 @@
flask==1.1.1
bootstrap-flask==1.2.0
certifi==2019.11.28
chardet==3.0.4
gitdb2==2.0.6