mirror of
https://github.com/yuukiwww/taiko-web.git
synced 2024-10-22 17:05:49 +02:00
generate hashes on server
This commit is contained in:
parent
5a68978ec4
commit
fe90a35625
38
app.py
38
app.py
@ -1,9 +1,12 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import base64
|
||||||
import bcrypt
|
import bcrypt
|
||||||
|
import hashlib
|
||||||
import config
|
import config
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
|
import requests
|
||||||
import schema
|
import schema
|
||||||
import os
|
import os
|
||||||
|
|
||||||
@ -28,10 +31,34 @@ db = client[config.MONGO['database']]
|
|||||||
db.users.create_index('username', unique=True)
|
db.users.create_index('username', unique=True)
|
||||||
db.songs.create_index('id', unique=True)
|
db.songs.create_index('id', unique=True)
|
||||||
|
|
||||||
|
|
||||||
|
class HashException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def api_error(message):
|
def api_error(message):
|
||||||
return jsonify({'status': 'error', 'message': message})
|
return jsonify({'status': 'error', 'message': message})
|
||||||
|
|
||||||
|
|
||||||
|
def generate_hash(id, form):
|
||||||
|
md5 = hashlib.md5()
|
||||||
|
if form['type'] == 'tja':
|
||||||
|
urls = ['%s%s/main.tja' % (config.SONGS_BASEURL, id)]
|
||||||
|
else:
|
||||||
|
urls = []
|
||||||
|
for diff in ['easy', 'normal', 'hard', 'oni', 'ura']:
|
||||||
|
if form['course_' + diff]:
|
||||||
|
urls.append('%s%s/%s.osu' % (config.SONGS_BASEURL, id, diff))
|
||||||
|
|
||||||
|
for url in urls:
|
||||||
|
resp = requests.get(url)
|
||||||
|
if resp.status_code != 200:
|
||||||
|
raise Exception('Invalid response from %s (status code %s)' % (resp.url, resp.status_code))
|
||||||
|
md5.update(resp.content)
|
||||||
|
|
||||||
|
return base64.b64encode(md5.digest())[:-2].decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
def login_required(f):
|
def login_required(f):
|
||||||
@wraps(f)
|
@wraps(f)
|
||||||
def decorated_function(*args, **kwargs):
|
def decorated_function(*args, **kwargs):
|
||||||
@ -69,7 +96,8 @@ def get_config():
|
|||||||
'songs_baseurl': config.SONGS_BASEURL,
|
'songs_baseurl': config.SONGS_BASEURL,
|
||||||
'assets_baseurl': config.ASSETS_BASEURL,
|
'assets_baseurl': config.ASSETS_BASEURL,
|
||||||
'email': config.EMAIL,
|
'email': config.EMAIL,
|
||||||
'accounts': config.ACCOUNTS
|
'accounts': config.ACCOUNTS,
|
||||||
|
'custom_js': config.CUSTOM_JS
|
||||||
}
|
}
|
||||||
|
|
||||||
if not config_out.get('songs_baseurl'):
|
if not config_out.get('songs_baseurl'):
|
||||||
@ -218,6 +246,14 @@ def route_admin_songs_id_post(id):
|
|||||||
output['preview'] = float(request.form.get('preview')) or None
|
output['preview'] = float(request.form.get('preview')) or None
|
||||||
output['volume'] = float(request.form.get('volume')) or None
|
output['volume'] = float(request.form.get('volume')) or None
|
||||||
output['maker_id'] = int(request.form.get('maker_id')) or None
|
output['maker_id'] = int(request.form.get('maker_id')) or None
|
||||||
|
output['hash'] = request.form.get('hash')
|
||||||
|
|
||||||
|
if request.form.get('gen_hash'):
|
||||||
|
try:
|
||||||
|
output['hash'] = generate_hash(id, request.form)
|
||||||
|
except HashException as e:
|
||||||
|
flash('An error occurred: %s' % str(e), 'error')
|
||||||
|
return redirect('/admin/songs/%s' % id)
|
||||||
|
|
||||||
db.songs.update_one({'id': id}, {'$set': output})
|
db.songs.update_one({'id': id}, {'$set': output})
|
||||||
flash('Changes saved.')
|
flash('Changes saved.')
|
||||||
|
@ -10,9 +10,12 @@ EMAIL = 'taiko@example.com'
|
|||||||
# Whether to use the user account system.
|
# Whether to use the user account system.
|
||||||
ACCOUNTS = True
|
ACCOUNTS = True
|
||||||
|
|
||||||
|
# Custom JavaScript file to load with the simulator.
|
||||||
|
CUSTOM_JS = ''
|
||||||
|
|
||||||
# MongoDB server settings.
|
# MongoDB server settings.
|
||||||
MONGO = {
|
MONGO = {
|
||||||
'host': ['localhost:27017'],
|
'host': ['127.0.0.1:27017'],
|
||||||
'database': 'taiko'
|
'database': 'taiko'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,6 +131,10 @@ h1 small {
|
|||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.message-error {
|
||||||
|
background: #b92222;
|
||||||
|
}
|
||||||
|
|
||||||
.save-song {
|
.save-song {
|
||||||
font-size: 22pt;
|
font-size: 22pt;
|
||||||
width: 120px;
|
width: 120px;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{% extends 'admin.html' %}
|
{% extends 'admin.html' %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>{{ song.title }} <small>(ID: {{ song.id }})</small></h1>
|
<h1>{{ song.title }} <small>(ID: {{ song.id }})</small></h1>
|
||||||
{% for message in get_flashed_messages() %}
|
{% for cat, message in get_flashed_messages(with_categories=true) %}
|
||||||
<div class="message">{{ message }}</div>
|
<div class="message{% if cat %} message-{{cat}}{% endif %}">{{ message }}</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<div class="song-form">
|
<div class="song-form">
|
||||||
<form method="post">
|
<form method="post">
|
||||||
@ -115,6 +115,11 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field">
|
||||||
|
<p><label for="hash">Hash</label></p>
|
||||||
|
<input type="text" id="hash" value="{{song.hash}}" name="hash"> <span class="checkbox"><input type="checkbox" name="gen_hash" id="gen_hash"{><label for="gen_hash"> Generate</label></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button type="submit" class="save-song">Save</button>
|
<button type="submit" class="save-song">Save</button>
|
||||||
</form>
|
</form>
|
||||||
{% if admin.user_level >= 100 %}
|
{% if admin.user_level >= 100 %}
|
||||||
@ -124,3 +129,4 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user