From b4257a1adfdf7d07de120c8d0c7a56a4e1a47ca2 Mon Sep 17 00:00:00 2001 From: Alex Roehm Date: Tue, 27 Sep 2022 20:29:30 +0200 Subject: [PATCH] rc2 --- index.js | 10 ++- src/ldapserver.js | 22 ++++--- src/main.js | 133 ++++++++++++++++++++++++++------------- test/main.integration.js | 63 ++++++++++++++++--- 4 files changed, 164 insertions(+), 64 deletions(-) diff --git a/index.js b/index.js index 22dc574..852aedc 100644 --- a/index.js +++ b/index.js @@ -23,6 +23,7 @@ async function sanpshot() { } var restart = () => {}; + var initialized = false; startedServer = (ip,port) => { @@ -60,23 +61,26 @@ run = async () => { nc.getNextcloudMappingTables(data, testconfig.sites[sitename].ldap.dc); } else if (process.argv.includes('--testdata')) { const testconfig = this.getTestConfig() - restart = await main.start( + const start = await main.start( testconfig, async () => require('./production/ctdata.json'), (site) => async (user, password) => password === 'alex', startedServer ); + restart = start.restart } else if (process.argv.includes('--testsnapshot')) { sanpshot(); } else { - log.logger.level = 'debug' + log.logger.level = 'info' const config = main.getConfig(c.CONFIG_FILE) - restart = await main.start( + start = await main.start( config, ctservice.getChurchToolsData, ctservice.authWithChurchTools, startedServer ); + restart = start.restart + setInterval(() => main.update(start.updaters), config.server.updateinterval*1000) } }; diff --git a/src/ldapserver.js b/src/ldapserver.js index 8fed99f..765a13c 100644 --- a/src/ldapserver.js +++ b/src/ldapserver.js @@ -130,19 +130,21 @@ initSite = (site, cacheFunctions, ldapjs) => { req.dn.toString(), req.credentials ); - if (!valid) { - log.errorSite(sitename, 'Authentication error'); - return next(new ldap.InvalidCredentialsError()); + if (valid) { + log.infoSite( + sitename, + 'Authentication successful for ' + req.dn.toString() + ); + return next(); } - log.debugSite( - sitename, - 'Authentication successful for ' + req.dn.toString() - ); } catch (err) { - log.debug(err); - return next(new ldap.InvalidCredentialsError()); + log.debug(err) } - return next(); + log.infoSite( + sitename, + 'Authentication error ' + req.dn.toString() + ); +return next(new ldap.InvalidCredentialsError()); } log.debugSite(sitename, 'Resgistering routes'); diff --git a/src/main.js b/src/main.js index 89fe3c5..35f808d 100644 --- a/src/main.js +++ b/src/main.js @@ -1,65 +1,114 @@ -const log = require('./logging') +const log = require('./logging'); const YAML = require('yamljs'); -const ctservice = require('./ctservice') -const transform = require('./transform') -const ldapcache = require('./ldapcache') -const ldapserver = require('./ldapserver') +const ctservice = require('./ctservice'); +const transform = require('./transform'); +const ldapcache = require('./ldapcache'); +const ldapserver = require('./ldapserver'); -log.loglevel = log.loglevels.debug +log.loglevel = log.loglevels.debug; const initCache = async (site, getChurchToolsDataFunc, authChurchToolsFunc) => { - - const adminuser = transform.getAdmin(site.ldap.admincn, site.ldap.dc) + const adminuser = transform.getAdmin(site.ldap.admincn, site.ldap.dc); const siteCacheFunctions = ldapcache.init( - site.site.name, - transform.getRootObj(site.ldap.dc, site.ldap.admin, site.ldap.o), - adminuser, + site.site.name, + transform.getRootObj(site.ldap.dc, site.ldap.admin, site.ldap.o), + adminuser, site.ldap.password, authChurchToolsFunc - ) - const churchtoolsdata = await getChurchToolsDataFunc(site.selectionGroupIds, site.tranformedGroups, site.site) - const {users,groups} = transform.getLdapData(site, churchtoolsdata, adminuser) - - siteCacheFunctions.setData(users,groups) - return siteCacheFunctions -} + ); + const churchtoolsdata = await getChurchToolsDataFunc( + site.selectionGroupIds, + site.tranformedGroups, + site.site + ); + const { users, groups } = transform.getLdapData( + site, + churchtoolsdata, + adminuser + ); -const updateLdapServerData = (siteldap) => { - // Todo implement an update strategy -} + siteCacheFunctions.setData(users, groups); + return siteCacheFunctions; +}; + +const updateSiteData = ( + site, + getChurchToolsDataFunc, + siteCacheFunctionsSetData +) => { + return new Promise(async (resolve) => { + log.infoSite(site.site, 'Updating data from Church Tools'); + const data = await getChurchToolsDataFunc( + site.selectionGroupIds, + site.tranformedGroups, + site.site + ); + const adminuser = transform.getAdmin(site.ldap.admincn, site.ldap.dc); + const ldap = transform.getLdapData(site, data, adminuser); + siteCacheFunctionsSetData(ldap.users, ldap.groups); + resolve(); + }); +}; exports.getConfig = (file) => { - return YAML.load(file) -} + return YAML.load(file); +}; -exports.ldapjs = {} +exports.ldapjs = {}; -exports.start = async (config, getChurchToolsDataFunc, authWithChurchToolsFunc, callback) => { - log.info("Starting up CCF Ldap wrapper for ChurchTools ....") - this.ldapjs = ldapserver.getLdapServer(config.server) +exports.start = async ( + config, + getChurchToolsDataFunc, + authWithChurchToolsFunc, + callback +) => { + log.info('Starting up CCF Ldap wrapper for ChurchTools ....'); + const updaters = new Map(); + this.ldapjs = ldapserver.getLdapServer(config.server); for (const [key, value] of Object.entries(config.sites)) { const site = value; - log.debugSite(site.site, "Get and transform data from ChurchTools") - const cacheFunctions = await initCache(site, getChurchToolsDataFunc, authWithChurchToolsFunc(site)) - await this.ldapjs.initSite(site, cacheFunctions) + log.debugSite(site.site, 'Get and transform data from ChurchTools'); + const cacheFunctions = await initCache( + site, + getChurchToolsDataFunc, + authWithChurchToolsFunc(site) + ); + await this.ldapjs.initSite(site, cacheFunctions); + updaters.set( + site.site.name, + () => updateSiteData(site, getChurchToolsDataFunc, cacheFunctions.setData) + ); } + log.debug('Done initializing data'); + this.ldapjs.startUp(callback); + return { + updaters, + stop: () => this.ldapjs.stopServer(), + restart: (cb) => { + this.ldapjs.stopServer(); + this.ldapjs.startUp(cb); + }, + }; +}; - log.debug("Done initializing data") - this.ldapjs.startUp(callback) - return (cb) => { - this.ldapjs.stopServer(); - this.ldapjs.startUp(cb) +exports.update = async (updaters) => { + for await (const value of updaters.values()) { + await value(); } -} +}; exports.snapshot = async (site) => { - const data = await ctservice.getChurchToolsData(site.selectionGroupIds, site.tranformedGroups, site.site) - const adminuser = transform.getAdmin(site.ldap.admincn, site.ldap.dc) - const ldap = transform.getLdapData(site, data, adminuser) + const data = await ctservice.getChurchToolsData( + site.selectionGroupIds, + site.tranformedGroups, + site.site + ); + const adminuser = transform.getAdmin(site.ldap.admincn, site.ldap.dc); + const ldap = transform.getLdapData(site, data, adminuser); return { data, - ldap - } -} + ldap, + }; +}; diff --git a/test/main.integration.js b/test/main.integration.js index a6dcf62..ee344b4 100644 --- a/test/main.integration.js +++ b/test/main.integration.js @@ -1,14 +1,59 @@ -const chai = require("chai"); +const chai = require('chai'); const deepEqualInAnyOrder = require('deep-equal-in-any-order'); chai.use(deepEqualInAnyOrder); -const expect = chai.expect -const main = require('../src/main') +const expect = chai.expect; +const main = require('../src/main'); +const log = require('../src/logging'); +const ldapcache = require('../src/ldapcache'); -describe("Transorm Production data to Ldap", () => { - it("Equals Snapshot", () => { - const expected = require('../production/config.json') - const actual = main.getConfig('./production/config.yml') +describe('Main: Production data to Ldap', () => { + before(() => { + log.logger.level = 'debug'; + }); + it('Equals Snapshot', () => { + const expected = require('../production/config.json'); + const actual = main.getConfig('./production/config.yml'); expect(actual).to.deep.equalInAnyOrder(expected); - }) - it("updates every - interval", () => {} ) + }); + xit('updates - on event (usualy triggerd by timer)', async () => { + const config = require('../production/config.json'); + const data = { + groups: [{ id: 1, guid: '1', name: 'group' }], + persons: [ + { + id: 2, + guid: '2', + firstName: 'Peter', + lastName: 'Pan', + nickname: '', + street: '', + mobile: '', + phonePrivate: '', + zip: '', + city: '', + cmsuserid: '', + email: '', + ncuid: '', + }, + ], + memberships: [{ personId: 2, groupId: 1 }], + }; + const {updaters, stop} = await main.start( + config, + async () => data, // data func mock + () => {}, // pasword check mock + () => { log.debug("Started") } // server started cb + ); + + data.persons[0].lastName = 'Lustig'; + data.groups[0].name = 'updated'; + + // simulate timer + await main.update(updaters) + + expect(ldapcache.getUserById('ccf', 2).attributes.sn).to.equal('Lustig'); + expect(ldapcache.getGroupById('ccf', 1).attributes.cn).to.equal('updated'); + + // test works but doesnot finsch - is in some async wait thing + }); });