Merge branch 'black-api-code' into 'master'
refactor(api): black See merge request isard/isard-sso!63
commit
2d678e24d1
|
@ -1,65 +1,53 @@
|
|||
#!flask/bin/python
|
||||
# coding=utf-8
|
||||
|
||||
import os
|
||||
import logging as log
|
||||
import os
|
||||
|
||||
from flask import Flask, send_from_directory, render_template
|
||||
app = Flask(__name__, static_url_path='')
|
||||
app = Flask(__name__, template_folder='static/templates')
|
||||
from flask import Flask, render_template, send_from_directory
|
||||
|
||||
app = Flask(__name__, static_url_path="")
|
||||
app = Flask(__name__, template_folder="static/templates")
|
||||
app.url_map.strict_slashes = False
|
||||
|
||||
'''
|
||||
"""
|
||||
App secret key for encrypting cookies
|
||||
You can generate one with:
|
||||
import os
|
||||
os.urandom(24)
|
||||
And paste it here.
|
||||
'''
|
||||
"""
|
||||
app.secret_key = "Change this key!//\xf7\x83\xbe\x17\xfa\xa3zT\n\\]m\xa6\x8bF\xdd\r\xf7\x9e\x1d\x1f\x14'"
|
||||
|
||||
print('Starting isard-sso api...')
|
||||
print("Starting isard-sso api...")
|
||||
|
||||
from api.lib.load_config import loadConfig
|
||||
|
||||
try:
|
||||
loadConfig(app)
|
||||
except:
|
||||
print('Could not get environment variables...')
|
||||
print("Could not get environment variables...")
|
||||
|
||||
|
||||
|
||||
'''
|
||||
"""
|
||||
Debug should be removed on production!
|
||||
'''
|
||||
"""
|
||||
if app.debug:
|
||||
log.warning('Debug mode: {}'.format(app.debug))
|
||||
log.warning("Debug mode: {}".format(app.debug))
|
||||
else:
|
||||
log.info('Debug mode: {}'.format(app.debug))
|
||||
log.info("Debug mode: {}".format(app.debug))
|
||||
|
||||
'''
|
||||
"""
|
||||
Serve static files
|
||||
'''
|
||||
@app.route('/templates/<path:path>')
|
||||
"""
|
||||
|
||||
|
||||
@app.route("/templates/<path:path>")
|
||||
def send_templates(path):
|
||||
return send_from_directory(os.path.join(app.root_path, 'static/templates'), path)
|
||||
return send_from_directory(os.path.join(app.root_path, "static/templates"), path)
|
||||
|
||||
# @app.route('/static/<path:path>')
|
||||
# def send_static_js(path):
|
||||
# return send_from_directory(os.path.join(app.root_path, 'static'), path)
|
||||
|
||||
# @app.errorhandler(404)
|
||||
# def not_found_error(error):
|
||||
# return render_template('page_404.html'), 404
|
||||
|
||||
# @app.errorhandler(500)
|
||||
# def internal_error(error):
|
||||
# return render_template('page_500.html'), 500
|
||||
|
||||
'''
|
||||
"""
|
||||
Import all views
|
||||
'''
|
||||
from .views import MenuViews
|
||||
from .views import AvatarsViews
|
||||
|
||||
|
||||
|
||||
"""
|
||||
from .views import AvatarsViews, MenuViews
|
||||
|
|
|
@ -1,51 +1,52 @@
|
|||
#!/usr/bin/env python
|
||||
# coding=utf-8
|
||||
import time
|
||||
from api import app as application
|
||||
from datetime import datetime, timedelta
|
||||
import pprint
|
||||
|
||||
import json
|
||||
import logging
|
||||
import traceback
|
||||
import yaml, json
|
||||
|
||||
import os
|
||||
import pprint
|
||||
import time
|
||||
import traceback
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import yaml
|
||||
from keycloak import KeycloakAdmin
|
||||
|
||||
from api import app as application
|
||||
|
||||
|
||||
class Avatars():
|
||||
def __init__(self,
|
||||
url="http://isard-sso-keycloak:8080/auth/",
|
||||
username=os.environ['KEYCLOAK_USER'],
|
||||
password=os.environ['KEYCLOAK_PASSWORD'],
|
||||
realm='master',
|
||||
verify=True):
|
||||
self.url=url
|
||||
self.username=username
|
||||
self.password=password
|
||||
self.realm=realm
|
||||
self.verify=verify
|
||||
class Avatars:
|
||||
def __init__(
|
||||
self,
|
||||
url="http://isard-sso-keycloak:8080/auth/",
|
||||
username=os.environ["KEYCLOAK_USER"],
|
||||
password=os.environ["KEYCLOAK_PASSWORD"],
|
||||
realm="master",
|
||||
verify=True,
|
||||
):
|
||||
self.url = url
|
||||
self.username = username
|
||||
self.password = password
|
||||
self.realm = realm
|
||||
self.verify = verify
|
||||
|
||||
def connect(self):
|
||||
self.keycloak_admin = KeycloakAdmin(server_url=self.url,
|
||||
username=self.username,
|
||||
password=self.password,
|
||||
realm_name=self.realm,
|
||||
verify=self.verify)
|
||||
self.keycloak_admin = KeycloakAdmin(
|
||||
server_url=self.url,
|
||||
username=self.username,
|
||||
password=self.password,
|
||||
realm_name=self.realm,
|
||||
verify=self.verify,
|
||||
)
|
||||
|
||||
def get_user_avatar(self,username):
|
||||
def get_user_avatar(self, username):
|
||||
self.connect()
|
||||
return self.keycloak_admin.get_user_id(username)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# # Add user
|
||||
# new_user = keycloak_admin.create_user({"email": "example@example.com",
|
||||
# "username": "example@example.com",
|
||||
# "enabled": True,
|
||||
# "firstName": "Example",
|
||||
# "lastName": "Example"})
|
||||
# print(new_user)
|
||||
# print(new_user)
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
#!/usr/bin/env python
|
||||
# coding=utf-8
|
||||
|
||||
from api import app
|
||||
|
||||
import os, sys
|
||||
import logging as log
|
||||
import os
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
class loadConfig():
|
||||
from api import app
|
||||
|
||||
def __init__(self, app=None):
|
||||
|
||||
class loadConfig:
|
||||
def __init__(self, app=None):
|
||||
try:
|
||||
app.config.setdefault('DOMAIN', os.environ['DOMAIN'])
|
||||
app.config.setdefault("DOMAIN", os.environ["DOMAIN"])
|
||||
|
||||
except Exception as e:
|
||||
log.error(traceback.format_exc())
|
||||
|
|
|
@ -4,22 +4,23 @@
|
|||
# Josep Maria Viñolas Auquer
|
||||
# Alberto Larraz Dalmases
|
||||
# License: AGPLv3
|
||||
import time
|
||||
from api import app as application
|
||||
from datetime import datetime, timedelta
|
||||
import pprint
|
||||
|
||||
import json
|
||||
import logging
|
||||
import pprint
|
||||
import time
|
||||
import traceback
|
||||
import yaml, json
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import yaml
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
from api import app as application
|
||||
|
||||
|
||||
def write_css():
|
||||
env = Environment(loader=FileSystemLoader('api/static/_templates'))
|
||||
css_template = env.get_template('dd.css')
|
||||
with open('menu/custom.yaml', 'r') as menu_custom_file:
|
||||
env = Environment(loader=FileSystemLoader("api/static/_templates"))
|
||||
css_template = env.get_template("dd.css")
|
||||
with open("menu/custom.yaml", "r") as menu_custom_file:
|
||||
menu_custom_yaml = menu_custom_file.read()
|
||||
menu_custom = yaml.full_load(menu_custom_yaml)
|
||||
css = css_template.render(data=menu_custom)
|
||||
|
@ -27,51 +28,74 @@ def write_css():
|
|||
css_file.write(css)
|
||||
|
||||
|
||||
class Menu():
|
||||
class Menu:
|
||||
def __init__(self):
|
||||
# self.user_menudict=self.gen_user_menu()
|
||||
# pprint.pprint(self.user_menudict)
|
||||
# self.write_user_menu()
|
||||
|
||||
self.menudict=self.gen_header()
|
||||
self.menudict = self.gen_header()
|
||||
pprint.pprint(self.menudict)
|
||||
self.write_headers()
|
||||
write_css()
|
||||
|
||||
''' HEADER & APP MENU '''
|
||||
""" HEADER & APP MENU """
|
||||
|
||||
def gen_header(self):
|
||||
with open(r'menu/system.yaml') as yml:
|
||||
system=yaml.load(yml, Loader=yaml.FullLoader)
|
||||
with open(r"menu/system.yaml") as yml:
|
||||
system = yaml.load(yml, Loader=yaml.FullLoader)
|
||||
|
||||
user_menu = []
|
||||
for item in system['user_menu']:
|
||||
item['href']='https://'+item['subdomain']+'.'+application.config['DOMAIN']+item['href']
|
||||
del item['subdomain']
|
||||
for item in system["user_menu"]:
|
||||
item["href"] = (
|
||||
"https://"
|
||||
+ item["subdomain"]
|
||||
+ "."
|
||||
+ application.config["DOMAIN"]
|
||||
+ item["href"]
|
||||
)
|
||||
del item["subdomain"]
|
||||
user_menu.append(item)
|
||||
user_menu_dict={'user_menu':user_menu,
|
||||
'user_avatar':'https://sso.'+application.config['DOMAIN']+'/auth/realms/master/avatar-provider'}
|
||||
user_menu_dict = {
|
||||
"user_menu": user_menu,
|
||||
"user_avatar": "https://sso."
|
||||
+ application.config["DOMAIN"]
|
||||
+ "/auth/realms/master/avatar-provider",
|
||||
}
|
||||
|
||||
apps_internal = []
|
||||
for app in system['apps_internal']:
|
||||
app['href']='https://'+app['subdomain']+'.'+application.config['DOMAIN']+app['href']
|
||||
del app['subdomain']
|
||||
for app in system["apps_internal"]:
|
||||
app["href"] = (
|
||||
"https://"
|
||||
+ app["subdomain"]
|
||||
+ "."
|
||||
+ application.config["DOMAIN"]
|
||||
+ app["href"]
|
||||
)
|
||||
del app["subdomain"]
|
||||
apps_internal.append(app)
|
||||
|
||||
with open(r'menu/custom.yaml') as yml:
|
||||
custom=yaml.load(yml, Loader=yaml.FullLoader)
|
||||
custom['background_login']='https://api.'+application.config['DOMAIN']+custom['background_login']
|
||||
custom['logo']='https://api.'+application.config['DOMAIN']+custom['logo']
|
||||
with open(r"menu/custom.yaml") as yml:
|
||||
custom = yaml.load(yml, Loader=yaml.FullLoader)
|
||||
custom["background_login"] = (
|
||||
"https://api." + application.config["DOMAIN"] + custom["background_login"]
|
||||
)
|
||||
custom["logo"] = "https://api." + application.config["DOMAIN"] + custom["logo"]
|
||||
|
||||
menudict={**custom,**{'apps_internal':apps_internal,**user_menu_dict}}
|
||||
menudict['user']={}
|
||||
menudict['user']['account']='https://sso.'+application.config['DOMAIN']+system['user']['account']
|
||||
menudict['user']['avatar']='https://sso.'+application.config['DOMAIN']+system['user']['avatar']
|
||||
menudict = {**custom, **{"apps_internal": apps_internal, **user_menu_dict}}
|
||||
menudict["user"] = {}
|
||||
menudict["user"]["account"] = (
|
||||
"https://sso." + application.config["DOMAIN"] + system["user"]["account"]
|
||||
)
|
||||
menudict["user"]["avatar"] = (
|
||||
"https://sso." + application.config["DOMAIN"] + system["user"]["avatar"]
|
||||
)
|
||||
return menudict
|
||||
|
||||
def write_headers(self):
|
||||
env = Environment(loader=FileSystemLoader('api/static/_templates'))
|
||||
env = Environment(loader=FileSystemLoader("api/static/_templates"))
|
||||
|
||||
template = env.get_template('user_menu.html')
|
||||
template = env.get_template("user_menu.html")
|
||||
output_from_parsed_template = template.render(data=self.menudict)
|
||||
print(output_from_parsed_template)
|
||||
with open("api/static/templates/user_menu_header.html", "w") as fh:
|
||||
|
@ -80,7 +104,7 @@ class Menu():
|
|||
# with open("api/static/templates/user_menu_header.json", "w") as fh:
|
||||
# fh.write(json.dumps(self.menudict))
|
||||
|
||||
template = env.get_template('apps_menu.html')
|
||||
template = env.get_template("apps_menu.html")
|
||||
output_from_parsed_template = template.render(data=self.menudict)
|
||||
print(output_from_parsed_template)
|
||||
with open("api/static/templates/header.html", "w") as fh:
|
||||
|
|
|
@ -1,19 +1,34 @@
|
|||
#!flask/bin/python
|
||||
# coding=utf-8
|
||||
from api import app
|
||||
import json
|
||||
import logging as log
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import traceback
|
||||
|
||||
from uuid import uuid4
|
||||
import time,json
|
||||
import sys,os
|
||||
from flask import render_template, Response, request, redirect, url_for, jsonify, send_from_directory
|
||||
|
||||
from flask import (
|
||||
Response,
|
||||
jsonify,
|
||||
redirect,
|
||||
render_template,
|
||||
request,
|
||||
send_from_directory,
|
||||
url_for,
|
||||
)
|
||||
|
||||
from api import app
|
||||
|
||||
from ..lib.avatars import Avatars
|
||||
|
||||
avatars = Avatars()
|
||||
|
||||
|
||||
@app.route("/avatar/<username>", methods=["GET"])
|
||||
def avatar(username):
|
||||
print(app.root_path)
|
||||
log.error(app.root_path)
|
||||
return send_from_directory(os.path.join(app.root_path, '../avatars/master-avatars/'), avatars.get_user_avatar(username), mimetype='image/jpg')
|
||||
return send_from_directory(
|
||||
os.path.join(app.root_path, "../avatars/master-avatars/"),
|
||||
avatars.get_user_avatar(username),
|
||||
mimetype="image/jpg",
|
||||
)
|
||||
|
|
|
@ -1,31 +1,41 @@
|
|||
#!flask/bin/python
|
||||
# coding=utf-8
|
||||
from api import app
|
||||
import json
|
||||
import logging as log
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import traceback
|
||||
|
||||
from uuid import uuid4
|
||||
import time,json
|
||||
import sys,os
|
||||
from flask import render_template, Response, request, redirect, url_for, jsonify
|
||||
|
||||
from flask import Response, jsonify, redirect, render_template, request, url_for
|
||||
|
||||
from api import app
|
||||
|
||||
from ..lib.menu import Menu
|
||||
|
||||
menu = Menu()
|
||||
|
||||
@app.route('/header/<format>', methods=['GET'])
|
||||
@app.route('/header/<format>/<application>', methods=['GET'])
|
||||
def api_v2_header(format,application=False):
|
||||
|
||||
@app.route("/header/<format>", methods=["GET"])
|
||||
@app.route("/header/<format>/<application>", methods=["GET"])
|
||||
def api_v2_header(format, application=False):
|
||||
if application == False:
|
||||
if format == 'json':
|
||||
if format == "json":
|
||||
if application == False:
|
||||
return json.dumps(menu.get_header()), 200, {'Content-Type': 'application/json'}
|
||||
if format == 'html':
|
||||
return (
|
||||
json.dumps(menu.get_header()),
|
||||
200,
|
||||
{"Content-Type": "application/json"},
|
||||
)
|
||||
if format == "html":
|
||||
if application == False:
|
||||
return render_template('header.html')
|
||||
if application == 'nextcloud':
|
||||
return render_template('header_nextcloud.html')
|
||||
if application == 'wordpress':
|
||||
return render_template('header_wordpress.html')
|
||||
return render_template("header.html")
|
||||
if application == "nextcloud":
|
||||
return render_template("header_nextcloud.html")
|
||||
if application == "wordpress":
|
||||
return render_template("header_wordpress.html")
|
||||
|
||||
|
||||
# @app.route('/user_menu/<format>', methods=['GET'])
|
||||
# @app.route('/user_menu/<format>/<application>', methods=['GET'])
|
||||
|
@ -33,4 +43,4 @@ def api_v2_header(format,application=False):
|
|||
# if application == False:
|
||||
# if format == 'json':
|
||||
# if application == False:
|
||||
# return json.dumps(menu.get_user_nenu()), 200, {'Content-Type': 'application/json'}
|
||||
# return json.dumps(menu.get_user_nenu()), 200, {'Content-Type': 'application/json'}
|
||||
|
|
|
@ -18,6 +18,4 @@ if __name__ == "__main__":
|
|||
engineio_logger = logging.getLogger("engineio")
|
||||
engineio_logger.setLevel("ERROR")
|
||||
|
||||
socketio.run(
|
||||
app, host="0.0.0.0", port=7039, debug=False
|
||||
)
|
||||
socketio.run(app, host="0.0.0.0", port=7039, debug=False)
|
||||
|
|
|
@ -3,23 +3,29 @@ from pprint import pprint
|
|||
|
||||
from keycloak import KeycloakAdmin
|
||||
|
||||
|
||||
def keycloak_connect():
|
||||
keycloak_admin = KeycloakAdmin(server_url="http://isard-sso-keycloak:8080/auth/",
|
||||
username='admin',
|
||||
password='keycloakkeycloak',
|
||||
realm_name="master",
|
||||
user_realm_name="only_if_other_realm_than_master",
|
||||
client_secret_key="client-secret",
|
||||
verify=True)
|
||||
keycloak_admin = KeycloakAdmin(
|
||||
server_url="http://isard-sso-keycloak:8080/auth/",
|
||||
username="admin",
|
||||
password="keycloakkeycloak",
|
||||
realm_name="master",
|
||||
user_realm_name="only_if_other_realm_than_master",
|
||||
client_secret_key="client-secret",
|
||||
verify=True,
|
||||
)
|
||||
|
||||
|
||||
def keycloak_dumps():
|
||||
print('Dumping keycloak config...')
|
||||
print("Dumping keycloak config...")
|
||||
|
||||
|
||||
def Keycloak_imports():
|
||||
with open('saml_client.json') as json_file:
|
||||
with open("saml_client.json") as json_file:
|
||||
data = json.load(json_file)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
keycloak_connect()
|
||||
if sys.argv[1]=='dump':
|
||||
if sys.argv[1] == "dump":
|
||||
keycloak_dumps()
|
||||
|
|
Loading…
Reference in New Issue