From 62c5efe591c73777963989f01c10f0438b4afef0 Mon Sep 17 00:00:00 2001
From: Prabhat Singh <59395410+TestPrab@users.noreply.github.com>
Date: Fri, 6 Aug 2021 11:20:05 +0530
Subject: [PATCH] Updated Server (#1630)
---
src/bcfserver/README.md | 37 +++++------
src/bcfserver/app.py | 4 --
src/bcfserver/bcf/routes.py | 51 +++++++++++++++
.../app.py => bcf/templates/base.html} | 0
src/bcfserver/requirements.txt | 33 +++-------
src/bcfserver/{website/__init__.py => run.py} | 12 +++-
src/bcfserver/website/forms.py | 2 +-
src/bcfserver/website/models.py | 2 +-
src/bcfserver/website/routes.py | 65 +++++++++++--------
src/bcfserver/website/templates/base.html | 18 +++--
src/bcfserver/website/templates/index.html | 17 ++++-
src/bcfserver/website/templates/login.html | 2 +-
src/bcfserver/website/templates/ologin.html | 2 +-
src/bcfserver/website/templates/register.html | 4 +-
14 files changed, 157 insertions(+), 92 deletions(-)
delete mode 100644 src/bcfserver/app.py
create mode 100644 src/bcfserver/bcf/routes.py
rename src/bcfserver/{website/app.py => bcf/templates/base.html} (100%)
rename src/bcfserver/{website/__init__.py => run.py} (60%)
diff --git a/src/bcfserver/README.md b/src/bcfserver/README.md
index 52919237cb..b34b68c9a3 100644
--- a/src/bcfserver/README.md
+++ b/src/bcfserver/README.md
@@ -1,35 +1,30 @@
# Server-Test
-## Set up the server by installing the dependencies
+1. Cd to the server directory i.e cd `IfcOpenShell\src\bcfserver`
-### run `pip install -r requirements.txt` to install the dependencies
+2. Set up the server by installing the dependencies
-#### setup the database by running `db.create_all()` in python shell by importing db from website
+3. Run `pip install -r requirements.txt` to install the dependencies
-### run `set FLASK_APP=app.py` to set the environment variable
+4. In Python Shell, do the following
-### run `flask run` to start the server
+ - from run import db
+ - db.create_all() to setup the database table
-### Go to [http://localhost:5000](http://localhost:5000) to see the server
+5. Run `set FLASK_APP=run.py`
+6. Run `flask run` to start the server
+7. Go to [http://localhost:5000](http://localhost:5000) to see the server
# Register the user
-#### Go to [http://localhost:5000/register](http://localhost:5000/register) to register the user
-
-# Create the client
-
-#### For `grant type` enter `authorization_code`
-
-#### For `response_type` enter `code secret`
-
-### Enter the scope and create the client
+1. Go to http://localhost:5000/register to register the user
+2. Create the client
+3. For grant type enter authorization_code
+4. For response_type enter code secret
+5. Enter the scope and create the client
### You will be redirected to the page with the details of your client id and secret
-### Use the bcf/v3/api.py to get the access token
+# Foundation API
-#### For authentication endpoint use `http://localhost:5000/oauth/authorize`
-
-### For token endpoint use `http://localhost:5000/oauth/token`
-
-### Base URL will be `http://localhost:5000/`
+- Set the Base URL will be `http://127.0.0.1:5000/`
diff --git a/src/bcfserver/app.py b/src/bcfserver/app.py
deleted file mode 100644
index 1af101b3ae..0000000000
--- a/src/bcfserver/app.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from website import app
-
-if __name__ == "__main__":
- app.run(debug=True)
diff --git a/src/bcfserver/bcf/routes.py b/src/bcfserver/bcf/routes.py
new file mode 100644
index 0000000000..9e3230d8af
--- /dev/null
+++ b/src/bcfserver/bcf/routes.py
@@ -0,0 +1,51 @@
+from flask import jsonify, url_for, redirect, render_template, request, session, flash
+from flask_login import login_user, logout_user, login_required, current_user
+from flask.blueprints import Blueprint
+from website.models import User, OAuth2AuthorizationCode, OAuth2Token, OAuth2Client
+from run import app, db
+import json
+
+bcf = Blueprint("bcf", __name__, template_folder="templates", url_prefix="/bcf/3.0")
+
+
+@bcf.route("/projects")
+def projects():
+ Headers = str.split(request.headers["Authorization"])
+ token = Headers[1]
+ access_token = OAuth2Token.query.filter_by(access_token=token).first()
+ print(access_token)
+ if access_token:
+ Body = {
+ "project_id": "F445F4F2-4D02-4B2A-B612-5E456BEF9137",
+ "name": "Example project 1",
+ "authorization": {"project_actions": ["createTopic", "createDocument"]},
+ }, {
+ "project_id": "A233FBB2-3A3B-EFF4-C123-DE22ABC8414",
+ "name": "Example project 2",
+ "authorization": {"project_actions": []},
+ }
+ response = app.response_class(
+ response=json.dumps(Body),
+ status=200,
+ mimetype="application/json",
+ )
+ return response
+ else:
+ message = {"error": "User not recognized"}
+ response = app.response_class(
+ response=jsonify(message),
+ status=200,
+ mimetype="application/json",
+ )
+ return response
+
+
+@bcf.route("/")
+@login_required
+def bcf_3():
+ return "
BCF HOMPAGE
"
+
+
+@bcf.route("/projects/")
+def project_details(project_id):
+ return "Project details"
diff --git a/src/bcfserver/website/app.py b/src/bcfserver/bcf/templates/base.html
similarity index 100%
rename from src/bcfserver/website/app.py
rename to src/bcfserver/bcf/templates/base.html
diff --git a/src/bcfserver/requirements.txt b/src/bcfserver/requirements.txt
index bc8e9910e0..c40a961538 100644
--- a/src/bcfserver/requirements.txt
+++ b/src/bcfserver/requirements.txt
@@ -1,25 +1,8 @@
-appdirs
-bcrypt
-black
-cffi
-click
-colorama
-dnspython
-email-validator
-Flask
-Flask-Login
-Flask-WTF1
-greenlet
-idnatsdangerous
-Jinja
-MarkupSafe
-mypy-extensions
-pathspec
-pycparserregex
-six
-SQLAlchemy
-tomli
-Werkzeug
-WTForms
-authlib
-Flask-RESTful
\ No newline at end of file
+Authlib==0.15.4
+email-validator==1.1.3
+Flask==2.0.1
+Flask-Login==0.5.0
+Flask-SQLAlchemy==2.5.1
+Flask-WTF==0.15.1
+Flask-Bcrypt==0.7.1
+bcrypt==3.2.0
diff --git a/src/bcfserver/website/__init__.py b/src/bcfserver/run.py
similarity index 60%
rename from src/bcfserver/website/__init__.py
rename to src/bcfserver/run.py
index 22e14092e7..3e13150778 100644
--- a/src/bcfserver/website/__init__.py
+++ b/src/bcfserver/run.py
@@ -3,15 +3,23 @@ from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_bcrypt import Bcrypt
+
app = Flask(__name__)
db = SQLAlchemy(app)
login_manager = LoginManager(app)
bcrypt = Bcrypt(app)
app.config["SECRET_KEY"] = "f613729206685405cde0e388"
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///sqlite.db"
-login_manager.login_view = "login_page"
+login_manager.login_view = "website_obj.login_page"
login_manager.login_message_category = "info"
+from website.routes import website_obj
+from bcf.routes import bcf
-from website import models, oauth2, routes
+app.register_blueprint(website_obj)
+app.register_blueprint(bcf)
+
+
+if __name__ == "__main__":
+ app.run(host="0.0.0.0", port=5000, debug=True)
diff --git a/src/bcfserver/website/forms.py b/src/bcfserver/website/forms.py
index a7e94e0dfa..d326108a6e 100644
--- a/src/bcfserver/website/forms.py
+++ b/src/bcfserver/website/forms.py
@@ -2,7 +2,7 @@ from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, Length, Email, Regexp, EqualTo
from wtforms import ValidationError
-from website.models import User
+from .models import User
class RegisterForm(FlaskForm):
diff --git a/src/bcfserver/website/models.py b/src/bcfserver/website/models.py
index f2845c4d14..4eef828f05 100644
--- a/src/bcfserver/website/models.py
+++ b/src/bcfserver/website/models.py
@@ -1,4 +1,4 @@
-from website import db, bcrypt, login_manager
+from run import db, bcrypt, login_manager
import time
from authlib.integrations.sqla_oauth2 import (
OAuth2ClientMixin,
diff --git a/src/bcfserver/website/routes.py b/src/bcfserver/website/routes.py
index 1ebe79ca56..0264b3a894 100644
--- a/src/bcfserver/website/routes.py
+++ b/src/bcfserver/website/routes.py
@@ -1,28 +1,34 @@
-from os import supports_bytes_environ
-from website import app
-from flask import render_template, redirect, url_for, flash, request, jsonify
-from website.models import User
-from website.forms import RegisterForm, LoginForm, OauthForm
-from website import db
+from flask.blueprints import Blueprint
+from flask import render_template, redirect, url_for, flash, request
+from werkzeug import datastructures
+from .forms import RegisterForm, LoginForm, OauthForm
from flask_login import login_user, logout_user, login_required, current_user
-from .models import db, User, OAuth2Client, OAuth2AuthorizationCode, OAuth2Token
+from .models import User, OAuth2Client, OAuth2AuthorizationCode, OAuth2Token
import base64
from werkzeug.security import gen_salt
import time
import urllib
import json
+from run import db, app
+
+website_obj = Blueprint(
+ "website_obj",
+ __name__,
+ template_folder="templates",
+)
def split_by_crlf(s):
return [v for v in s.splitlines() if v]
-@app.route("/")
+@website_obj.route("/")
def homepage():
return render_template("index.html")
+ # return "homepage"
-@app.route("/register", methods=["GET", "POST"])
+@website_obj.route("/register", methods=["GET", "POST"])
def register_page():
form = RegisterForm()
if form.validate_on_submit():
@@ -39,7 +45,7 @@ def register_page():
f"Account created successfully! {user_to_create.username}",
category="success",
)
- return redirect(url_for("homepage"))
+ return redirect(url_for("website_obj.homepage"))
if form.errors != {}:
for err_msg in form.errors.values():
flash(
@@ -49,7 +55,7 @@ def register_page():
return render_template("register.html", form=form)
-@app.route("/createclient", methods=["GET", "POST"])
+@website_obj.route("/createclient", methods=["GET", "POST"])
@login_required
def create_client():
grants = [
@@ -93,7 +99,7 @@ def create_client():
return render_template("createclient.html", form=form, grants=grants)
-@app.route("/login", methods=["GET", "POST"])
+@website_obj.route("/login", methods=["GET", "POST"])
def login_page():
form = LoginForm()
if form.validate_on_submit():
@@ -102,7 +108,7 @@ def login_page():
attempted_password=form.password.data
):
login_user(attempted_user)
- return redirect(url_for("homepage"))
+ return redirect(url_for("website_obj.homepage"))
else:
flash(
"Invalid Credentials",
@@ -112,27 +118,27 @@ def login_page():
return render_template("login.html", form=form)
-@app.route("/logout")
+@website_obj.route("/logout")
def logoutpage():
logout_user()
flash("You have been logged out!", category="info")
- return redirect(url_for("homepage"))
+ return redirect(url_for("website_obj.homepage"))
-@app.route("/foundation/1.0/auth")
+@website_obj.route("/foundation/1.0/auth")
def foundation_auth():
data = {
"oauth2_auth_url": "http://127.0.0.1:5000/oauth/authorize",
"oauth2_token_url": "http://127.0.0.1:5000/oauth/token",
"supported_oauth2_flows": ["authorization_code"],
}
- response = app.response_class(
- response=json.dumps(data), status=200, mimetype="application/json"
+ response = website_obj.response_class(
+ data=json.dumps(data), status=200, mimetype="application/json"
)
return response
-@app.route("/foundation/versions")
+@website_obj.route("/foundation/versions")
def foundation_versions():
Body = {
"versions": [
@@ -155,13 +161,13 @@ def foundation_versions():
},
]
}
- response = app.response_class(
- response=json.dumps(Body), status=200, mimetype="application/json"
+ response = website_obj.response_class(
+ data=json.dumps(Body), status=200, mimetype="application/json"
)
return response
-@app.route("/outh/login", methods=["GET", "POST"])
+@website_obj.route("/outh/login", methods=["GET", "POST"])
def oauth_login():
form = LoginForm()
if form.validate_on_submit():
@@ -179,7 +185,7 @@ def oauth_login():
state = request.args.get("state")
return redirect(
url_for(
- "authorize",
+ "website_obj.authorize",
client_id=client_id,
redirect_uri=redirect_uri,
state=state,
@@ -193,7 +199,7 @@ def oauth_login():
return render_template("ologin.html", form=form)
-@app.route("/oauth/authorize", methods=["GET", "POST"])
+@website_obj.route("/oauth/authorize", methods=["GET", "POST"])
def authorize():
client_id = request.args.get("client_id")
redirect_uri = request.args.get("redirect_uri")
@@ -203,7 +209,7 @@ def authorize():
query = request.query_string
return redirect(
url_for(
- "oauth_login",
+ "website_obj.oauth_login",
client_id=client_id,
redirect_uri=redirect_uri,
state=state,
@@ -246,7 +252,7 @@ def authorize():
return render_template("oauth.html")
-@app.route("/oauth/token", methods=["POST"])
+@website_obj.route("/oauth/token", methods=["POST"])
def issue_token():
try:
code = request.form["code"]
@@ -254,6 +260,7 @@ def issue_token():
decode_header = base64.b64decode(Headers[1]).decode("utf-8")
creds = decode_header.split(":")
client_id = creds[0]
+ # print(code, Headers, decode_header, creds, client_id)
auth_code = OAuth2AuthorizationCode.query.filter_by(code=code).first()
if auth_code:
if auth_code.client_id == client_id:
@@ -275,11 +282,13 @@ def issue_token():
"access_token": access_token,
"refresh_token": refresh_token,
"expires_in": expires_in,
- "auth_code": auth_code.scope,
}
response = app.response_class(
- response=json.dumps(query), status=200, mimetype="application/json"
+ response=json.dumps(query),
+ status=200,
+ mimetype="application/json",
)
+ print(query)
return response
else:
flash(
diff --git a/src/bcfserver/website/templates/base.html b/src/bcfserver/website/templates/base.html
index b55f4839e9..f6a2a2df7c 100644
--- a/src/bcfserver/website/templates/base.html
+++ b/src/bcfserver/website/templates/base.html
@@ -30,7 +30,7 @@
-
- Home (current)
@@ -47,10 +47,14 @@
Welcome, {{ current_user.username }}
-
- Logout
+ Logout
-
- Create Client
@@ -58,10 +62,14 @@
{% else %}
-
- Login
+ Login
-
- Register
diff --git a/src/bcfserver/website/templates/index.html b/src/bcfserver/website/templates/index.html
index b1e30edb58..15d8c3b0ba 100644
--- a/src/bcfserver/website/templates/index.html
+++ b/src/bcfserver/website/templates/index.html
@@ -1,3 +1,16 @@
-{%extends 'base.html'%} {%block title%} Homepage {%endblock%} {%block content%}
+
+
+
+
+
+
+
+
+ Document
+
+
+ Home Page
+
+
diff --git a/src/bcfserver/website/templates/login.html b/src/bcfserver/website/templates/login.html
index 4ba908b285..010509d5be 100644
--- a/src/bcfserver/website/templates/login.html
+++ b/src/bcfserver/website/templates/login.html
@@ -15,7 +15,7 @@
Do not have an account?
Register
diff --git a/src/bcfserver/website/templates/ologin.html b/src/bcfserver/website/templates/ologin.html
index 672c447b21..708f5498e7 100644
--- a/src/bcfserver/website/templates/ologin.html
+++ b/src/bcfserver/website/templates/ologin.html
@@ -16,7 +16,7 @@
Do not have an account?
Register
diff --git a/src/bcfserver/website/templates/register.html b/src/bcfserver/website/templates/register.html
index faf87694c9..f45b0c45f5 100644
--- a/src/bcfserver/website/templates/register.html
+++ b/src/bcfserver/website/templates/register.html
@@ -16,7 +16,9 @@
Already have an account?
-
Login