diff --git a/app/main.py b/app/main.py index df9aac9..207fea3 100644 --- a/app/main.py +++ b/app/main.py @@ -7,11 +7,7 @@ app = Flask(__name__) - - - # Setup redirect and hosting of frontend - @app.route('/') def base(): return render_template('index.html', projecturl=os.environ["DOC_PROJECT_URL"], projectname=os.environ["DOC_PROJECT_NAME"]) @@ -87,8 +83,6 @@ def swaggerjson(): swagger_json["paths"]["/{}/{}".format(plugin,feature)] = paths return swagger_json - - if __name__ == '__main__': app.debug = True app.run(port=8080, host="0.0.0.0") diff --git a/app/plugins/mode/visitor_mode.py b/app/plugins/mode/visitor_mode.py index c838ff5..d074980 100644 --- a/app/plugins/mode/visitor_mode.py +++ b/app/plugins/mode/visitor_mode.py @@ -1,3 +1,4 @@ +import base64 import json import os #todo input sanitization @@ -9,8 +10,17 @@ def create(id): # POST return {"error":'Visitormode already exists'} else: + # Get the directory where the script is located + script_dir = os.path.dirname(os.path.realpath(__file__)) + + # Construct the full path to the image file + sample_image_path = os.path.join(script_dir, "visitor_mode_sample.png") + + with open(sample_image_path, "rb") as image_file: + encoded_sample_image = base64.b64encode(image_file.read()).decode('utf-8') + f = open(configpath, "w+") - content = {"id":"visitormode", "enabled":False} + content = {"id":"visitormode", "is_enabled":False, "base64_placeholder_image": encoded_sample_image} f.write(json.dumps(content)) f.close() return {'ok':'Visitor Mode Created'} @@ -27,6 +37,9 @@ def read(id=False): # GET content += [json.loads(mode_content)] return {'table':content} + elif id == "visitor_mode_image": + return '' + else: #return specific mode configpath = "/data/modes/visitormode" if os.path.isfile(configpath) == False: @@ -38,14 +51,14 @@ def read(id=False): # GET f.close() return {'form':json.loads(content)} -def update(id, enabled): # POST +def update(id, is_enabled, base64_placeholder_image): # POST configpath = "/data/modes/visitormode" if os.path.isfile(configpath) == False: return {"error":'Mode does not exist'} else: f = open(configpath, "w+") - content = {"id":"visitormode", "enabled":enabled} + content = {"id":"visitormode", "is_enabled":is_enabled, "base64_placeholder_image": base64_placeholder_image} f.write(json.dumps(content)) f.close() return {'ok':'Mode config updated'} diff --git a/app/plugins/mode/visitor_mode_sample.png b/app/plugins/mode/visitor_mode_sample.png new file mode 100644 index 0000000..ec206c8 Binary files /dev/null and b/app/plugins/mode/visitor_mode_sample.png differ diff --git a/app/plugins/traefik/api_provider.py b/app/plugins/traefik/api_provider.py index 53fc11c..63130ac 100644 --- a/app/plugins/traefik/api_provider.py +++ b/app/plugins/traefik/api_provider.py @@ -12,9 +12,6 @@ def read(id=False): # GET else: provider = {"http":{"routers": {},"services": {}, "middlewares": {}}} - r = requests.get('http://localhost:8080/plugins/screens/manage_screen') - data = json.loads(r.text) - # add ssp admin panel provider['http']['routers']['admin'] = {'entryPoints': ['web', 'websecure'], 'service': 'admin', 'rule': 'HOST(`'+os.environ['SSP_DOMAIN']+'`)', 'tls': {'certResolver': 'myresolver'}, 'middlewares': ['ssp-auth']} provider['http']['services']['admin'] = {'loadBalancer': {"servers": [ {'url': 'http://ssp:8080'} ] } } @@ -33,12 +30,18 @@ def read(id=False): # GET # provider['http']['middlewares']['redirect']={"redirectregex":{"regex":"^(https?://[^/]+/[a-z0-9_]+)$", "replacement":"${1}/"} } provider['http']['middlewares']['strip'] = {"stripprefixregex":{"regex":"/[a-z0-9_]+"} } -#^(https?://[^/]+/?)$ + mode_data = json.loads((requests.get('http://localhost:8080/plugins/mode/visitor_mode')).text) + screen_data = json.loads((requests.get('http://localhost:8080/plugins/screens/manage_screen')).text) + # add configured screens - for screen in data['table']: + for screen in screen_data['table']: try: - screen_host = re.match("^(https?://[^/]+)/(.*)$", screen['url']).groups()[0] - screen_path = re.match("^(https?://[^/]+)/(.*)$", screen['url']).groups()[1] + if len(mode_data['table']) > 0 and mode_data['table'][0]['is_enabled'] == 'true': + screen_host = 'http://ssp:8080' + screen_path = '/plugins/mode/visitor_mode?id=visitor_mode_image' + else: + screen_host = re.match("^(https?://[^/]+)/(.*)$", screen['url']).groups()[0] + screen_path = re.match("^(https?://[^/]+)/(.*)$", screen['url']).groups()[1] provider['http']['routers']['router_'+screen['id']] = {'entryPoints':['web', 'websecure'], 'service':'service_'+screen['id'], 'rule':'HOST(`'+screen['id']+'.'+os.environ["SSP_DOMAIN"]+'`)', 'middlewares':['service_'+screen['id']], 'tls':{'certResolver':'myresolver'}} provider['http']['services']['service_'+screen['id']] = {"loadBalancer":{"servers":[{'url':screen_host}], "passHostHeader": False } } diff --git a/app/static/main.js b/app/static/main.js index f42efe2..b2945d3 100644 --- a/app/static/main.js +++ b/app/static/main.js @@ -1,6 +1,6 @@ // Helper Functions String.prototype.niceify = function() { - return this.replace('_', ' ').replace(/\b[a-z]/g, function(letter) { + return this.replaceAll('_', ' ').replace(/\b[a-z]/g, function(letter) { return letter.toUpperCase(); }); } @@ -44,11 +44,19 @@ function start_feature_read(plugin, feature, id) { tablecode = '
' document.getElementById("results").innerHTML = tablecode } - else { + else + dev_visiter_mode tablecode = '' - Object.keys(data['table'][0]).forEach((element) => tablecode+=''); + Object.keys(data['table'][0]).forEach((element) => tablecode+=''); tablecode += '' - data['table'].forEach((element) => tablecode+=''); + data['table'].forEach((element) => { + for(let key in element) { + if (key.startsWith('base64_')) { + element[key] = ''; + } + } + tablecode += '' + }); // tablecode+=''; // Object.keys(data['table'][0]).forEach((element) => tablecode+=''); // tablecode += '' @@ -60,19 +68,30 @@ function start_feature_read(plugin, feature, id) { if ("form" in data){ formcode = '' - Object.keys(data['form']).forEach((element) => formcode+='
'); + Object.keys(data['form']).forEach((element) => { + let input_elem = ''; + if (element.startsWith('is_')) { + input_elem = ''; + } + else { + input_elem = ''; + } + + formcode += '
'+input_elem+'
' + }); formcode += '
' formcode += '' document.getElementById("results").innerHTML = formcode - Object.values(data['form']).forEach(function callback(value, index) { - $('#form_'+Object.keys(data['form'])[index]).val(value); + Object.entries(data['form']).forEach(function([key, value], index) { + if (key.startsWith('is_')) { + $('#form_' + key).val(value.toString()); // Ensure value is a string + } else { + $('#form_' + key).val(value); // Apply to the key, not the index + } }); - - - } diff --git a/docker-compose.yml b/docker-compose.yml index e90f071..b3e01c7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,7 +23,7 @@ services: - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--providers.http.endpoint=http://ssp:8080/plugins/traefik/api_provider?id=api" - - "--providers.http.pollInterval=60s" + - "--providers.http.pollInterval=30s" - "--certificatesresolvers.myresolver.acme.email=your-email@example.com" - "--certificatesresolvers.myresolver.acme.storage=/data/acme.json" - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
'+element+''+element.niceify()+'
EditDelete'+Object.values(element).join('')+'
EditDelete'+Object.values(element).join('')+'
NEW