From e82232ecd45a2e7e7ecc84fd1e3092f6f381d689 Mon Sep 17 00:00:00 2001 From: Robin van Genderen Date: Mon, 4 Feb 2019 11:46:02 +0100 Subject: [PATCH] add option to overwrite files settings --- Inject Files/inject-files.py | 87 +++++++++++++++--------------------- 1 file changed, 37 insertions(+), 50 deletions(-) diff --git a/Inject Files/inject-files.py b/Inject Files/inject-files.py index 04aab9e..517a0e8 100644 --- a/Inject Files/inject-files.py +++ b/Inject Files/inject-files.py @@ -5,18 +5,12 @@ import uuid from MAPI.Util import * import kopano - - - # Try simplejson if json is not available try: import json except ImportError: import simplejson as json -# Define where to read and write our WebApp config from / to -PR_EC_WEBACCESS_SETTINGS_JSON = PROP_TAG(PT_STRING8, PR_EC_BASE + 0x72) - def encode(value): proc = subprocess.Popen(["php", "deencode.php", "encode", value], stdout=subprocess.PIPE) @@ -24,9 +18,10 @@ def encode(value): def opt_args(): - parser = kopano.parser('skpcfm') + parser = kopano.parser('skpcfmUP') parser.add_option("--user", dest="user", action="store", help="username") parser.add_option("--file", dest="file", default=[], action="store", help="config file(s) separate by ',' ") + parser.add_option("--overwrite", dest="overwrite", action="store_true", help="overwrite files settings") parser.add_option("--default", dest="default", action="store_true", help="use default user and password in the configfile") @@ -34,51 +29,35 @@ def opt_args(): def read_settings(options): - data = None try: user = kopano.Server(options).user(options.user) - - st = user.store.mapiobj - - except MAPIErrorNotFound as e: - print 'User \'%s\' has no user store (%s)' % (options.user, e) - return - except MAPIErrorLogonFailed as e: - print 'User \'%s\' not found (%s)' % (options.user, e) - return + print('User \'{}\' not found ({})'.format(options.user, e)) + sys.exit(1) + + if not user.store: + print('User \'{}\' has no user store ({})'.format(options.user, e)) + sys.exit(1) try: - settings = st.OpenProperty(PR_EC_WEBACCESS_SETTINGS_JSON, IID_IStream, 0, 0) - data = settings.Read(33554432) - except Exception as e: - print 'No WebApp settings found.' - data = '{"settings": {"zarafa": {"v1": {"contexts": {"mail": {}}}}}}' - - return data + mapisettings = user.store.prop(PR_EC_WEBACCESS_SETTINGS_JSON).value + return mapisettings + except Exception: + print('{}: Has no or no valid WebApp settings creating empty config tree'.format(user.name)) + return '{"settings": {"zarafa": {"v1": {"contexts": {"mail": {}}}}}}' def write_settings(data, options): user = kopano.Server(options).user(options.user) - st = user.store.mapiobj - - settings = st.OpenProperty(PR_EC_WEBACCESS_SETTINGS_JSON, IID_IStream, 0, MAPI_MODIFY | MAPI_CREATE) - settings.SetSize(0) - settings.Seek(0, STREAM_SEEK_END) - - writesettings = settings.Write(data) - - if writesettings: - print 'Writing settings for user \'%s\'' % user.fullname - settings.Commit(0) - else: - print 'Writing settings for user \'%s\' failed.' % user.fullname + user.store.create_prop(PR_EC_WEBACCESS_SETTINGS_JSON, data.encode('utf-8')) + print('Writing settings for user \'{}\''.format(user.fullname)) def files(options): - filesjson = '''{ - "accounts": {''' + filesjson = '{' + if options.overwrite: + filesjson = '{"accounts": {' num = 0 files = options.file.split(',') for file in files: @@ -120,11 +99,10 @@ def files(options): encode(username), encode(configfile['setting']['default_password']), encode(configfile['setting']['server_port']), configfile['setting']['name'], id, configfile['setting']['type']) num += 1 - - filesjson += ''' - } - } - ''' + if options.overwrite: + filesjson += '}}' + else: + filesjson += '}' return filesjson @@ -134,15 +112,24 @@ def main(): data = read_settings(options) webappsettings = json.loads(data) - try: - if webappsettings['settings']['zarafa']['v1']['plugins']: - pass - except: - webappsettings['settings']['zarafa']['v1']['plugins'] = dict({}) + if not webappsettings['settings']['zarafa']['v1'].get('plugins'): + webappsettings['settings']['zarafa']['v1']['plugins'] = {} + + if options.overwrite: + webappsettings['settings']['zarafa']['v1']['plugins']['files'] = json.loads(files(options)) + else: + if not webappsettings['settings']['zarafa']['v1']['plugins'].get('files'): + webappsettings['settings']['zarafa']['v1']['plugins']['files'] = {} + if not webappsettings['settings']['zarafa']['v1']['plugins']['files'].get('accounts'): + webappsettings['settings']['zarafa']['v1']['plugins']['files']['accounts'] = {} + bla = files(options) + print(bla) + webappsettings['settings']['zarafa']['v1']['plugins']['files']['accounts'].update(json.loads(bla)) - webappsettings['settings']['zarafa']['v1']['plugins']['files'] = json.loads(files(options)) write_settings(json.dumps(webappsettings), options) if __name__ == '__main__': main() + +