import os
|
|
import copy
|
|
import json
|
|
import base64
|
|
|
|
import pyDes
|
|
import qrcode
|
|
|
|
from api.modules import utils
|
|
|
|
from flask import Flask, request
|
|
from flask_restful import Resource, Api, abort
|
|
|
|
enc = pyDes.triple_des(b'Kz\n\x1a\xc1~\x05#\xf9\xad\xc8\xa2\x15\xd5J\x89\xe4RT\x8d\xb3?\x93\x1c')
|
|
app = Flask(__name__)
|
|
api = Api(app)
|
|
db_path = os.path.join(app.root_path, 'databases', 'users.json')
|
|
|
|
with open(db_path, 'r') as f:
|
|
users = json.load(f)
|
|
|
|
class Users(Resource):
|
|
def post(self):
|
|
"""
|
|
Example POST Data:
|
|
username=<username>&
|
|
password=<password>&
|
|
realname=<realname>& # OPTIONAL
|
|
avatar=<avatar_url>& # OPTIONAL
|
|
"""
|
|
args = request.form
|
|
user_id = utils.generate_id()
|
|
user = {
|
|
'id': user_id,
|
|
'username': args['username'],
|
|
'realname': args.get('realname'),
|
|
'avatar' : args.get('avatar'),
|
|
'password': utils.md5( args[ 'password' ] ),
|
|
'stats': {
|
|
'bus_usage_week': 0,
|
|
'bus_usage_month': 0,
|
|
'bus_usage_year': 0
|
|
},
|
|
'daily_electricity_usage': [],
|
|
'points': 0
|
|
}
|
|
|
|
users.append(user)
|
|
|
|
with open(db_path, 'w') as f:
|
|
json.dump(users, f, indent=4)
|
|
|
|
return user
|
|
|
|
class User(Resource):
|
|
def get(self, user_id):
|
|
try:
|
|
user = utils.find_by_id( users.values(), user_id )
|
|
if not user:
|
|
raise Exception('User not found!')
|
|
del user['password']
|
|
return user
|
|
except:
|
|
abort(404, error="User {} doesn't exist".format(user_id))
|
|
|
|
class Login(Resource):
|
|
def post(self):
|
|
"""
|
|
Example POST Data:
|
|
username=<username>&
|
|
password=<password>
|
|
"""
|
|
#Password for efe is 12345
|
|
args = request.form
|
|
username = args['username']
|
|
password = utils.md5( args[ 'password' ] )
|
|
|
|
if not username in users:
|
|
return [False, {}]
|
|
|
|
user = copy.deepcopy(users[username])
|
|
if user['password'] == password:
|
|
del user["password"]
|
|
return [True, json.dumps(user)]
|
|
else:
|
|
return [False, {}]
|
|
|
|
class QRCode(Resource):
|
|
def post(self):
|
|
"""
|
|
POST Data:
|
|
id=<user_id>
|
|
"""
|
|
user_id = request.form['id']
|
|
if utils.find_by_id(users.values(), user_id):
|
|
image_path = os.path.join(app.root_path, '..', 'images', user_id + '_qr' + '.png')
|
|
if not os.path.exists(image_path):
|
|
encrypted_id = enc.encrypt(user_id, padmode=2)
|
|
img = qrcode.make(base64.b64encode(encrypted_id).decode('utf-8'))
|
|
img.save(image_path)
|
|
|
|
return '/img/' + user_id + '_qr' + '.png'
|
|
else:
|
|
abort(404, error="User {} doesn't exist".format(user_id))
|
|
|
|
class QRRead(Resource):
|
|
def post(self):
|
|
"""
|
|
POST Data:
|
|
qr_data=<qr_data>
|
|
"""
|
|
|
|
qr_data = base64.b64decode(request.form['qr_data'])
|
|
user_id = enc.decrypt(qr_data, padmode=2)
|
|
return utils.find_by_id(users.values(), user_id.decode())
|
|
|
|
if __name__ == '__main__':
|
|
api.add_resource(Users, '/users', '/users/')
|
|
api.add_resource(User, '/users/<path:user_id>', '/users/<path:user_id>/')
|
|
api.add_resource(Login, '/login', '/login/')
|
|
|
|
app.run(host='0.0.0.0', port=5000)
|