From 8455fef5934f6400a82b7692de26041d5204ccaf Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Sun, 18 Oct 2015 12:35:57 +0000 Subject: [PATCH] (Captiveportal, new) overlay user template content in fetch_template --- .../OPNsense/CaptivePortal/fetch_template.py | 30 +++++++++++++++++-- .../conf/actions.d/actions_captiveportal.conf | 4 +-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/opnsense/scripts/OPNsense/CaptivePortal/fetch_template.py b/src/opnsense/scripts/OPNsense/CaptivePortal/fetch_template.py index d5912ba52..b0ca59286 100755 --- a/src/opnsense/scripts/OPNsense/CaptivePortal/fetch_template.py +++ b/src/opnsense/scripts/OPNsense/CaptivePortal/fetch_template.py @@ -29,21 +29,47 @@ fetch template files as base64 encoded zipfile """ import os +import sys import ujson +import binascii import zipfile import StringIO +from lib import OPNSenseConfig +response = dict() source_directory = '/usr/local/opnsense/scripts/OPNsense/CaptivePortal/htdocs_default' output_data = StringIO.StringIO() with zipfile.ZipFile(output_data, mode='w', compression=zipfile.ZIP_DEFLATED) as zf: + # overlay user template data + user_filenames = list() + if len(sys.argv) > 1: + # search for user template, using fileid + cnf = OPNSenseConfig() + template_content = cnf.get_template(sys.argv[1]) + if template_content is not None: + try: + input_data = StringIO.StringIO(template_content.decode('base64')) + with zipfile.ZipFile(input_data, mode='r', compression=zipfile.ZIP_DEFLATED) as zf_in: + for zf_info in zf_in.infolist(): + user_filenames.append(zf_info.filename) + zf.writestr(zf_info.filename, zf_in.read(zf_info.filename)) + except zipfile.BadZipfile: + # not in zip format + response['error'] = 'internal xml data not in zip format, user data discarded' + except binascii.Error: + # not base64 encoded + response['error'] = 'internal xml data not in base64 format, user data discarded' + + # read standard template from disk for root, dirs, files in os.walk(source_directory): for filename in files: filename = '%s/%s' % (root,filename) output_filename = filename[len(source_directory)+1:] - zf.writestr(output_filename, open(filename,'rb').read()) + if output_filename not in user_filenames: + zf.writestr(output_filename, open(filename,'rb').read()) -response = {'payload': output_data.getvalue().encode('base64')} +response['payload'] = output_data.getvalue().encode('base64') response['size'] = len(response['payload']) print(ujson.dumps(response)) diff --git a/src/opnsense/service/conf/actions.d/actions_captiveportal.conf b/src/opnsense/service/conf/actions.d/actions_captiveportal.conf index 72681ffe7..9ccb5fe6c 100644 --- a/src/opnsense/service/conf/actions.d/actions_captiveportal.conf +++ b/src/opnsense/service/conf/actions.d/actions_captiveportal.conf @@ -36,9 +36,9 @@ message:restarting captiveportal services [fetch_template] command:/usr/local/opnsense/scripts/OPNsense/CaptivePortal/fetch_template.py -parameters: +parameters:%s type:script_output -message:fetch captiveportal web template package +message:fetch captiveportal web template package %s [strip_template] command:/usr/local/opnsense/scripts/OPNsense/CaptivePortal/strip_template.py