From bcb3b1bbac88acc845563705723d8959c90f6d56 Mon Sep 17 00:00:00 2001 From: raphael Date: Tue, 7 Apr 2020 16:29:51 +0000 Subject: [PATCH] restructured website into folders --- .gitignore | 2 + login/app.py => app.py | 80 ++------------ {login => database}/db.py | 6 +- {login => database}/schema.sql | 0 {login => database}/sqlite_db | Bin 16384 -> 16384 bytes {login => database}/user.py | 6 +- login/.app.py.swp | Bin 24576 -> 0 bytes login/client_secret.json | 1 - test1/client_secret.json | 1 - test1/index.html | 51 --------- test1/index.js | 8 -- test1/server.py | 193 --------------------------------- test1/website.py | 105 ------------------ 13 files changed, 21 insertions(+), 432 deletions(-) rename login/app.py => app.py (73%) rename {login => database}/db.py (81%) rename {login => database}/schema.sql (100%) rename {login => database}/sqlite_db (95%) rename {login => database}/user.py (87%) delete mode 100644 login/.app.py.swp delete mode 100644 login/client_secret.json delete mode 100644 test1/client_secret.json delete mode 100644 test1/index.html delete mode 100644 test1/index.js delete mode 100644 test1/server.py delete mode 100644 test1/website.py diff --git a/.gitignore b/.gitignore index 548259c..51279e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ # General stuff .swp .cache +certificate/ calendarevents.json + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/login/app.py b/app.py similarity index 73% rename from login/app.py rename to app.py index bbb622b..1e7bb89 100644 --- a/login/app.py +++ b/app.py @@ -17,8 +17,8 @@ from oauthlib.oauth2 import WebApplicationClient import requests # Internal imports -from db import init_db_command -from user import User +from database.db import init_db_command +from database.user import User import caltojson @@ -28,7 +28,7 @@ import googleapiclient.discovery # Configuration -CLIENT_SECRETS_FILE = "client_secret.json" +CLIENT_SECRETS_FILE = "certificate/client_secret.json" # This OAuth 2.0 access scope allows for full read/write access to the # authenticated user's account and requires requests to use an SSL connection. @@ -186,71 +186,6 @@ def callback(): login_user(user) return flask.redirect(flask.url_for('index')) - ''' - # Get authorization code Google sent back to you - code = request.args.get("code") - # Find out what URL to hit to get tokens that allow you to ask for - # things on behalf of a user - google_provider_cfg = get_google_provider_cfg() - token_endpoint = google_provider_cfg["token_endpoint"] - - # Prepare and send a request to get tokens! Yay tokens! - token_url, headers, body = client.prepare_token_request( - token_endpoint, - authorization_response=request.url, - redirect_url=request.base_url, - code=code - ) - - print("asking for tokens") - - token_response = requests.post( - token_url, - headers=headers, - data=body, - auth=(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET), - ) - - # Parse the tokens! - client.parse_request_body_response(json.dumps(token_response.json())) - - # Now that you have tokens (yay) let's find and hit the URL - # from Google that gives you the user's profile information, - # including their Google profile image and email - userinfo_endpoint = google_provider_cfg["userinfo_endpoint"] - uri, headers, body = client.add_token(userinfo_endpoint) - userinfo_response = requests.get(uri, headers=headers, data=body) - print(userinfo_response.json()) - - # You want to make sure their email is verified. - # The user authenticated with Google, authorized your - # app, and now you've verified their email through Google! - if userinfo_response.json().get("email_verified"): - unique_id = userinfo_response.json()["sub"] - users_email = userinfo_response.json()["email"] - picture = userinfo_response.json()["picture"] - users_name = userinfo_response.json()["given_name"] - else: - return "User email not available or not verified by Google.", 400 - - # Create a user in your db with the information provided - # by Google - user = User( - id_=unique_id, name=users_name, email=users_email, profile_pic=picture - ) - - # Doesn't exist? Add it to the database. - if not User.get(unique_id): - User.create(unique_id, users_name, users_email, picture) - - # Begin user session by logging the user in - login_user(user) - - # Send user back to homepage - return redirect(url_for("index")) - - ''' - @app.route("/logout") @login_required def logout(): @@ -265,8 +200,15 @@ def credentials_to_dict(credentials): 'client_secret': credentials.client_secret, 'scopes': credentials.scopes} + +@app.route("/userinfo/107971745944668140075/calendarevents.json") +def downloader(): + path = "/home/raphael/dev/website_ws/website/login/userinfo/107971745944668140075" + return flask.send_from_directory(path, "calendarevents.json") + if __name__ == "__main__": - app.run('192.168.68.103.xip.io', 1234, ssl_context="adhoc", debug=True) + context = ('certificate/xip.io.crt', 'certificate/xip.io.key')#certificate and key files + app.run('192.168.68.103.xip.io', 1234, ssl_context=context, debug=True) diff --git a/login/db.py b/database/db.py similarity index 81% rename from login/db.py rename to database/db.py index 60e4af5..d92ed8e 100644 --- a/login/db.py +++ b/database/db.py @@ -8,14 +8,14 @@ from flask.cli import with_appcontext def get_db(): if "db" not in g: g.db = sqlite3.connect( - "sqlite_db", detect_types=sqlite3.PARSE_DECLTYPES + "database/sqlite_db", detect_types=sqlite3.PARSE_DECLTYPES ) g.db.row_factory = sqlite3.Row return g.db def close_db(e=None): - db = g.pop("db", None) + db = g.pop("db/db", None) if db is not None: db.close() @@ -23,7 +23,7 @@ def close_db(e=None): def init_db(): db = get_db() - with current_app.open_resource("schema.sql") as f: + with current_app.open_resource("database/schema.sql") as f: db.executescript(f.read().decode("utf8")) @click.command("init-db") diff --git a/login/schema.sql b/database/schema.sql similarity index 100% rename from login/schema.sql rename to database/schema.sql diff --git a/login/sqlite_db b/database/sqlite_db similarity index 95% rename from login/sqlite_db rename to database/sqlite_db index 42d1c9401ef2711a33ba22fe94b97319ab7f996c..01e423b46e6125e06cc1e8f2d00ce3825c7a5551 100644 GIT binary patch delta 134 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 diff --git a/login/client_secret.json b/login/client_secret.json deleted file mode 100644 index 2104b71..0000000 --- a/login/client_secret.json +++ /dev/null @@ -1 +0,0 @@ -{"web":{"client_id":"377787187748-shuvi4iq5bi4gdet6q3ioataimobs4lh.apps.googleusercontent.com","project_id":"calendarwatch-1584185874753","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"Hu_YWmKsVKUcLwyeINYzdKfZ","redirect_uris":["http://localhost:1234"],"javascript_origins":["http://raphael.maenle.net","https://raphael.maenle.net"]}} diff --git a/test1/client_secret.json b/test1/client_secret.json deleted file mode 100644 index 2104b71..0000000 --- a/test1/client_secret.json +++ /dev/null @@ -1 +0,0 @@ -{"web":{"client_id":"377787187748-shuvi4iq5bi4gdet6q3ioataimobs4lh.apps.googleusercontent.com","project_id":"calendarwatch-1584185874753","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"Hu_YWmKsVKUcLwyeINYzdKfZ","redirect_uris":["http://localhost:1234"],"javascript_origins":["http://raphael.maenle.net","https://raphael.maenle.net"]}} diff --git a/test1/index.html b/test1/index.html deleted file mode 100644 index 0aab441..0000000 --- a/test1/index.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/test1/index.js b/test1/index.js deleted file mode 100644 index f2e88d7..0000000 --- a/test1/index.js +++ /dev/null @@ -1,8 +0,0 @@ -const express = require('express') -const path = require('path') -const PORT = process.env.PORT || 1234 - -express() - .use(express.static(path.join(__dirname,'public'))) - .get('/', (req, res) => res.render('index')) - .listen(PORT, () => console.log(`Listening on ${ PORT }`)) diff --git a/test1/server.py b/test1/server.py deleted file mode 100644 index e43f9ed..0000000 --- a/test1/server.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import flask -import requests - -import google.oauth2.credentials -import google_auth_oauthlib.flow -import googleapiclient.discovery - -# This variable specifies the name of a file that contains the OAuth 2.0 -# information for this application, including its client_id and client_secret. -CLIENT_SECRETS_FILE = "client_secret.json" - -# This OAuth 2.0 access scope allows for full read/write access to the -# authenticated user's account and requires requests to use an SSL connection. -SCOPES = ["https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/calendar.readonly", "openid"] -API_SERVICE_NAME = 'calendar' -API_VERSION = 'v3' - -app = flask.Flask(__name__) -# Note: A secret key is included in the sample so that it works. -# If you use this code in your application, replace this with a truly secret -# key. See https://flask.palletsprojects.com/quickstart/#sessions. -app.secret_key = 'N\x0cOZO\xca\x96b\xf0\\\xc7\x11\xbd(\x95\xe3' - - -class Calendar: - def __init__(self, summary_, calendarId_, color_): - self.summary = summary_ - self.calendarId = calendarId_ - self.color = color_ - -@app.route('/') -def index(): - return print_index_table() - - -@app.route('/test') -def test_api_request(): - if 'credentials' not in flask.session: - return flask.redirect('authorize') - - # Load credentials from the session. - credentials = google.oauth2.credentials.Credentials( - **flask.session['credentials']) - - service = googleapiclient.discovery.build( - API_SERVICE_NAME, API_VERSION, credentials=credentials) - - getCalendars(service) - - # Save credentials back to session in case access token was refreshed. - # ACTION ITEM: In a production app, you likely want to save these - # credentials in a persistent database instead. - flask.session['credentials'] = credentials_to_dict(credentials) - - return flask.jsonify("{}") - - -@app.route('/authorize') -def authorize(): - # Create flow instance to manage the OAuth 2.0 Authorization Grant Flow steps. - flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( - CLIENT_SECRETS_FILE, scopes=SCOPES) - - # The URI created here must exactly match one of the authorized redirect URIs - # for the OAuth 2.0 client, which you configured in the API Console. If this - # value doesn't match an authorized URI, you will get a 'redirect_uri_mismatch' - # error. - flow.redirect_uri = flask.url_for('oauth2callback', _external=True) - - authorization_url, state = flow.authorization_url( - # Enable offline access so that you can refresh an access token without - # re-prompting the user for permission. Recommended for web server apps. - access_type='offline', - # Enable incremental authorization. Recommended as a best practice. - include_granted_scopes='true') - - # Store the state so the callback can verify the auth server response. - flask.session['state'] = state - - print("auth_url: " + authorization_url) - print("state: " + state) - - return flask.redirect(authorization_url) - - -@app.route('/oauth2callback') -def oauth2callback(): - # Specify the state when creating the flow in the callback so that it can - # verified in the authorization server response. - state = flask.session['state'] - - flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( - CLIENT_SECRETS_FILE, scopes=SCOPES, state=state) - flow.redirect_uri = flask.url_for('oauth2callback', _external=True) - - # Use the authorization server's response to fetch the OAuth 2.0 tokens. - authorization_response = flask.request.url - flow.fetch_token(authorization_response=authorization_response) - - # Store credentials in the session. - # ACTION ITEM: In a production app, you likely want to save these - # credentials in a persistent database instead. - credentials = flow.credentials - flask.session['credentials'] = credentials_to_dict(credentials) - print("credentials: ") - print(credentials_to_dict(credentials)) - - return flask.redirect(flask.url_for('test_api_request')) - - -@app.route('/revoke') -def revoke(): - if 'credentials' not in flask.session: - return ('You need to authorize before ' + - 'testing the code to revoke credentials.') - - credentials = google.oauth2.credentials.Credentials( - **flask.session['credentials']) - - revoke = requests.post('https://oauth2.googleapis.com/revoke', - params={'token': credentials.token}, - headers = {'content-type': 'application/x-www-form-urlencoded'}) - - status_code = getattr(revoke, 'status_code') - if status_code == 200: - return('Credentials successfully revoked.' + print_index_table()) - else: - return('An error occurred.' + print_index_table()) - - -@app.route('/clear') -def clear_credentials(): - if 'credentials' in flask.session: - del flask.session['credentials'] - return ('Credentials have been cleared.

' + - print_index_table()) - - -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} - -def print_index_table(): - return ('' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
Test an API requestSubmit an API request and see a formatted JSON response. ' + - ' Go through the authorization flow if there are no stored ' + - ' credentials for the user.
Test the auth flow directlyGo directly to the authorization flow. If there are stored ' + - ' credentials, you still might not be prompted to reauthorize ' + - ' the application.
Revoke current credentialsRevoke the access token associated with the current user ' + - ' session. After revoking credentials, if you go to the test ' + - ' page, you should see an invalid_grant error.' + - '
Clear Flask session credentialsClear the access token currently stored in the user session. ' + - ' After clearing the token, if you test the ' + - ' API request again, you should go back to the auth flow.' + - '
') - -def getCalendars(service): - page_token = None - calendars = [] - while True: - calendar_list = service.calendarList().list(pageToken=page_token).execute() - for calendar in calendar_list['items']: - calendars.append(Calendar(calendar['summary'], calendar['id'], calendar['colorId'])) - page_token = calendar_list.get('nextPageToken') - if not page_token: - break - - print(calendars) - - -if __name__ == '__main__': - # When running locally, disable OAuthlib's HTTPs verification. - # ACTION ITEM for developers: - # When running in production *do not* leave this option enabled. - os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' - - # Specify a hostname and port that are set as a valid redirect URI - # for your API project in the Google API Console. - app.run('192.168.68.103.xip.io', 1234 , debug=True) \ No newline at end of file diff --git a/test1/website.py b/test1/website.py deleted file mode 100644 index 5cbf26c..0000000 --- a/test1/website.py +++ /dev/null @@ -1,105 +0,0 @@ -from google.oauth2 import id_token -from google.auth.transport import requests - -import pickle -import os.path -from googleapiclient.discovery import build - -from http.server import HTTPServer, SimpleHTTPRequestHandler, BaseHTTPRequestHandler -import socketserver -import logging -import json - -# some_file.py -import sys -# insert at 1, 0 is the script path (or '' in REPL) -sys.path.insert(1, '../calenderwatch_server/') - - -Handler = SimpleHTTPRequestHandler - -class S(BaseHTTPRequestHandler): - def _set_headers(self): - self.send_response(200) - self.send_header('Content-type', 'text/html') - self.end_headers() - - def do_GET(self): - self._set_headers() - f = open("index.html", "r") - self.wfile.write(f.read().encode('utf-8')) - - def do_HEAD(self): - self._set_headers() - - def do_POST(self): - self._set_headers() - print("in post method") - self.data_string = self.rfile.read(int(self.headers['Content-Length'])) - print('checking client id') - if checkClientId(self.data_string): - getApiAuth(self.data_string) - self.send_response(200) - self.end_headers() - self.wfile.write("Hello".encode('utf-8')) - return - -def run(server_class=HTTPServer, handler_class=S, port=1234): - logging.basicConfig(level=logging.INFO) - server_address = ('', port) - with socketserver.TCPServer(("", port), handler_class) as httpd: - print("serving at port", port) - httpd.serve_forever() - - -# (Receive token by HTTPS POST) -def checkClientId(token): - try: - - with open('client_secret.json', 'r') as json_file: - clientSecret = json.load(json_file) - CLIENT_ID = clientSecret["web"]["client_id"] - # Specify the CLIENT_ID of the app that accesses the backend: - idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID) - - # Or, if multiple clients access the backend server: - # idinfo = id_token.verify_oauth2_token(token, requests.Request()) - # if idinfo['aud'] not in [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]: - # raise ValueError('Could not verify audience.') - - if idinfo['iss'] not in ['accounts.google.com', 'https://accounts.google.com']: - raise ValueError('Wrong issuer.') - - # If auth request is from a G Suite domain: - # if idinfo['hd'] != GSUITE_DOMAIN_NAME: - # raise ValueError('Wrong hosted domain.') - - # ID token is valid. Get the user's Google Account ID from the decoded token. - userid = idinfo['sub'] - print(f"valid user id: {userid}") - return True - except ValueError: - # ID token is invalid - print('invalid token') - return False - - -def getApiAuth(token): - - with open('client_secret.json', 'r') as json_file: - clientSecret = json.load(json_file) - CLIENT_ID = clientSecret["web"]["client_id"] - # Specify the CLIENT_ID of the app that accesses the backend: - idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID) - - # creds = pickle.load(idinfo) - - service = build('calendar', 'v3', credentials=idinfo) - -if __name__ == '__main__': - from sys import argv - - if len(argv) == 2: - run(port=int(argv[1])) - else: - run()