228 lines
7.0 KiB
Python
228 lines
7.0 KiB
Python
# Python standard libraries
|
|
import json
|
|
import os
|
|
import sqlite3
|
|
|
|
# Third-party libraries
|
|
import flask
|
|
from flask import render_template, flash
|
|
from flask import Flask, redirect, request, url_for, jsonify
|
|
from flask_login import (
|
|
LoginManager,
|
|
current_user,
|
|
login_required,
|
|
login_user,
|
|
logout_user,
|
|
)
|
|
import requests
|
|
|
|
import server.googleHandler as google
|
|
|
|
from backend.Routine import Routine
|
|
from server import login_manager, app, db
|
|
from server.forms import LoginForm, RegistrationForm, DeviceForm
|
|
from database.models import User, Calendar, Device, GoogleToken
|
|
|
|
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
|
|
|
|
@app.route("/")
|
|
def account():
|
|
return flask.redirect('account')
|
|
|
|
@app.route("/account")
|
|
def index():
|
|
if current_user.is_authenticated:
|
|
google.updateCalendars()
|
|
return (flask.render_template('account.html',
|
|
username = current_user.username, email = current_user.email, profile_img=current_user.profile_pic
|
|
)
|
|
)
|
|
else:
|
|
return flask.render_template('login.html')
|
|
|
|
@app.route("/view")
|
|
def view():
|
|
if not current_user.is_authenticated:
|
|
return flask.render_template('login.html')
|
|
else:
|
|
return (flask.render_template('view.html'))
|
|
|
|
@app.route("/devices", methods=['GET', 'POST'])
|
|
def devices():
|
|
if not current_user.is_authenticated:
|
|
return flask.render_template('login.html')
|
|
|
|
device = Device()
|
|
device.deviceId="Anthon-Mouse-Car"
|
|
devices = [device]
|
|
form = DeviceForm()
|
|
if form.validate_on_submit():
|
|
print(form.deviceId.data, flush=True)
|
|
# TODO add device to database here
|
|
|
|
return flask.render_template('devices.html', devices=devices, form=form)
|
|
|
|
|
|
@app.route("/calendar")
|
|
@login_required
|
|
def calendar():
|
|
calendars = google.calendarsFromDb()
|
|
return flask.render_template('calendar.html', calendars=calendars)
|
|
|
|
@app.route('/login/email', methods=['GET', 'POST'])
|
|
def emaillogin():
|
|
if current_user.is_authenticated:
|
|
return redirect(url_for('account') )
|
|
form = LoginForm()
|
|
|
|
if form.validate_on_submit():
|
|
user = User.query.filter_by(username=form.username.data).first()
|
|
if user is None or not user.checkPassword(form.password.data):
|
|
flash('invalid username or password')
|
|
return redirect(url_for('emaillogin'))
|
|
login_user(user, remember=form.remember_me.data)
|
|
return redirect(url_for('account'))
|
|
return render_template('emaillogin.html', title='Sign In', form=form)
|
|
|
|
|
|
@app.route('/register', methods=['GET', 'POST'])
|
|
def register():
|
|
if current_user.is_authenticated:
|
|
return redirect(url_for('account'))
|
|
form = RegistrationForm()
|
|
if form.validate_on_submit():
|
|
user = User(id=form.username.data,
|
|
username=form.username.data,
|
|
email=form.email.data)
|
|
user.setPassword(form.password.data)
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
flash('Congratulations, you are now a registered user!')
|
|
return redirect(url_for('emaillogin'))
|
|
return flask.render_template('register.html', title='Register', form=form)
|
|
|
|
@app.route("/delete_account")
|
|
def deleteAccount():
|
|
if not current_user.is_authenticated:
|
|
return redirect(url_for('account'))
|
|
# TODO fix google delete account
|
|
google.deleteAccount(current_user)
|
|
'''
|
|
for cal in current_user.calendars:
|
|
db.session.delete(cal)
|
|
for dev in current_user.devices:
|
|
db.session.delete(dev)
|
|
db.session.delete(current_user.google_token)
|
|
'''
|
|
db.session.delete(current_user)
|
|
db.session.commit()
|
|
logout_user()
|
|
|
|
return redirect(url_for('account'))
|
|
|
|
@app.route("/login/google")
|
|
def googlelogin():
|
|
if current_user.is_authenticated and current_user.google_credentials.refresh_token != None:
|
|
return redirect(url_for('account'))
|
|
|
|
authorization_url = google.login()
|
|
|
|
return flask.redirect(authorization_url)
|
|
|
|
@app.route("/login/google/callback")
|
|
def callback():
|
|
session, credentials = google.verifyResponse()
|
|
userinfo = session.get('https://www.googleapis.com/userinfo/v2/me').json()
|
|
|
|
# Create a user in your db with the information provided
|
|
# by Google
|
|
|
|
# Doesn't exist? Add it to the database.
|
|
if not db.session.query(User).filter(User.userid==userinfo['id']).first():
|
|
gc = GoogleToken(token=credentials.get("token"),
|
|
refresh_token=credentials.get("refresh_token"))
|
|
db.session.add(gc)
|
|
newser = User(
|
|
|
|
userid=userinfo['id'],
|
|
username=userinfo['name'],
|
|
email=userinfo['email'],
|
|
profile_pic=userinfo['picture'],
|
|
password_hash="",
|
|
google_token = gc
|
|
)
|
|
db.session.add(newser)
|
|
db.session.commit()
|
|
|
|
user = db.session.query(User).filter(User.userid==userinfo['id']).first()
|
|
|
|
# Begin user session by logging the user in
|
|
login_user(user)
|
|
|
|
return flask.redirect(flask.url_for('index'))
|
|
|
|
@app.route("/logout")
|
|
@login_required
|
|
def logout():
|
|
logout_user()
|
|
return redirect(url_for("index"))
|
|
|
|
def credentials_to_dict(credentials):
|
|
return {'token': credentials.token,
|
|
'refresh_token': credentials.refresh_token,
|
|
'token_uri': credentials.token_uri,
|
|
'client_id': credentials.client_id,
|
|
'client_secret': credentials.client_secret,
|
|
'scopes': credentials.scopes}
|
|
|
|
|
|
@app.route("/userinfo/<path:device>/calendarevents.json")
|
|
def downloader(device):
|
|
path = "/home/calendarwatch/userinfo/" + device + "/"
|
|
# return flask.send_from_directory(path, "calendarevents.json")
|
|
request_user = db.session.query(User).filter(User.userid==device).first()
|
|
print(device, flush=True)
|
|
if request_user == None:
|
|
return jsonify(kind="unregistered")
|
|
|
|
routine = Routine()
|
|
|
|
client_token = google.GC.build_credentials(request_user.google_token.token,
|
|
request_user.google_token.refresh_token)
|
|
calendarjson = routine.updateCalendar(request_user, client_token)
|
|
return jsonify(calendarjson)
|
|
|
|
@app.route("/devicefingerprint.json")
|
|
def generateDeviceFingerprint():
|
|
# Create Three Random Words
|
|
# check not in Device Database
|
|
# Save as new Device
|
|
# Send to User
|
|
return jsonify(deviceId="Carrot-Enamel-Storm")
|
|
|
|
# POST
|
|
|
|
@app.route('/calendar', methods = ['POST', 'DELETE'])
|
|
@login_required
|
|
def user():
|
|
if request.method == 'POST':
|
|
calId = request.json.get('calendar_id')
|
|
color = request.json.get('color', None)
|
|
toggle = request.json.get('toggle', None)
|
|
|
|
print(request.json, flush=True)
|
|
if color != None:
|
|
current_user.updateCalendar(calId, color=color)
|
|
if toggle != None:
|
|
current_user.updateCalendar(calId, toggle=toggle)
|
|
# toggle specific calendar of user
|
|
|
|
elif request.method == 'DELETE':
|
|
# do nothing
|
|
return 'NONE'
|
|
else:
|
|
# POST Error 405
|
|
print("405")
|
|
|
|
return 'OK'
|