-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathweb.py
executable file
·112 lines (96 loc) · 3.21 KB
/
web.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/python2 -u
import logging
import random
import sys
from datetime import datetime, timedelta
from flask import Flask, Response, render_template, session, request, redirect, url_for
import acme
import config
import door_lib
import ldap_user.config as ldap_config
from ldap_user.flipdotuser import FlipdotUser
from ldap_user.webapp import FrontendError
logging.basicConfig(
level=logging.DEBUG if config.DEBUG else logging.INFO,
format="[%(levelname)s][%(name)s] %(message)s")
log = logging.getLogger("web")
app = Flask(__name__, )
@app.route('/')
def index():
if 'uid' not in session:
return render_template('login.html')
else:
open, open_raw = is_door_open()
dn, user = FlipdotUser().getuser(session['uid'])
return render_template('door.html',
state="Open" if open else "Closed",
state_raw=open_raw, user=user)
@app.route('/manifest.json')
def manifest():
with open('templates/manifest.json') as f:
data = f.read()
return Response(data, mimetype='application/json')
@app.route('/login', methods=['POST'])
def login():
if request.method == 'POST':
uid = request.form.get('uid', '')
pwd = request.form.get('password', '')
if not uid or not pwd:
return redirect("/", 302)
try:
ldap = FlipdotUser()
valid, dn = ldap.login(uid, pwd)
except FrontendError as e:
return render_template("error.html", message=e.message)
if valid:
session['uid'] = dn
session['user'] = uid
session['pass'] = pwd
else:
session.pop('uid', None)
return redirect('/')
else:
return redirect('/')
@app.route('/logout')
def logout():
session.clear()
return redirect(url_for('index'))
@app.route('/door', methods=['POST'])
def door():
if request.form.get('action', 'closedoor') == 'opendoor':
if 'uid' not in session:
return render_template('login.html')
dn, user = FlipdotUser().getuser(session['uid'])
if 'is_member' not in user['meta'] or not user['meta']['is_member']:
return render_template("error.html",
message="You are not allowed to open the door.")
log.info("Opening door.")
door_lib.open()
else:
log.info("Closing door.")
door_lib.close()
global door_time
door_time = None
return redirect(url_for('index'))
cache_time = timedelta(seconds=10)
door_time = None
door_open = None
def is_door_open():
if hasattr(config, 'fake_door') and config.fake_door:
return (random.random() > 0.5, random.randint(1,999))
global door_open, door_time
if door_open and door_time and door_time + cache_time > datetime.utcnow():
return door_open
with door_lib.get_serial() as s:
door_open = door_lib.get_state(s)
door_time = datetime.utcnow()
return door_open
if __name__ == '__main__':
log.info("argv: %s", sys.argv)
#tls = acme.ACME(app, staging=config.STAGING)
app.secret_key = ldap_config.SECRET
app.run(host="0.0.0.0", port=config.PORT, debug=True,
threaded=True, processes=0,
use_reloader=False)
#tls.stop()
#tls.thread.join()