Skip to content

Commit

Permalink
rc2
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexRoehm committed Sep 27, 2022
1 parent 2f6f607 commit b4257a1
Show file tree
Hide file tree
Showing 4 changed files with 164 additions and 64 deletions.
10 changes: 7 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ async function sanpshot() {
}

var restart = () => {};

var initialized = false;

startedServer = (ip,port) => {
Expand Down Expand Up @@ -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)
}
};

Expand Down
22 changes: 12 additions & 10 deletions src/ldapserver.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
133 changes: 91 additions & 42 deletions src/main.js
Original file line number Diff line number Diff line change
@@ -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,
};
};
63 changes: 54 additions & 9 deletions test/main.integration.js
Original file line number Diff line number Diff line change
@@ -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
});
});

0 comments on commit b4257a1

Please sign in to comment.