From 8f591b5f9bece2fd8935ec59f95b3746272e1de6 Mon Sep 17 00:00:00 2001 From: Quentin CHEVALIER <quentin.chevalier@polytechnique.edu> Date: Tue, 27 Feb 2018 15:16:24 +0100 Subject: [PATCH] =?UTF-8?q?Premi=C3=A8re=20tentative=20ldap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 183 +++++++++++++++++++++++++++++++++++++++--- package.json | 1 + src/ldap_data.js | 44 ++++++++++ src/talk_ldap_data.js | 161 ------------------------------------- 4 files changed, 219 insertions(+), 170 deletions(-) create mode 100644 src/ldap_data.js delete mode 100644 src/talk_ldap_data.js diff --git a/package-lock.json b/package-lock.json index 0592d98..8cc8460 100644 --- a/package-lock.json +++ b/package-lock.json @@ -342,6 +342,11 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -360,6 +365,11 @@ "util": "0.10.3" } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -451,6 +461,14 @@ "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", "dev": true }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "requires": { + "precond": "0.2.3" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -690,6 +708,17 @@ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, + "bunyan": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", + "requires": { + "dtrace-provider": "0.8.6", + "moment": "2.20.1", + "mv": "2.1.1", + "safe-json-stringify": "1.1.0" + } + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -1140,6 +1169,14 @@ "es5-ext": "0.10.39" } }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1269,6 +1306,15 @@ "is-obj": "1.0.1" } }, + "dtrace-provider": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.6.tgz", + "integrity": "sha1-QooiOv4DQl0s1tY0f99AxmkDVj0=", + "optional": true, + "requires": { + "nan": "2.9.2" + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -1930,6 +1976,11 @@ } } }, + "extsprintf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", + "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=" + }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -2126,7 +2177,7 @@ "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", "optional": true, "requires": { - "nan": "2.9.1", + "nan": "2.9.2", "node-pre-gyp": "0.6.39" }, "dependencies": { @@ -2660,7 +2711,6 @@ "os-tmpdir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "osenv": { @@ -3311,7 +3361,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -3821,6 +3870,38 @@ "invert-kv": "1.0.0" } }, + "ldap-filter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", + "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", + "requires": { + "assert-plus": "0.1.5" + }, + "dependencies": { + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" + } + } + }, + "ldapjs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", + "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "backoff": "2.5.0", + "bunyan": "1.8.12", + "dashdash": "1.14.1", + "dtrace-provider": "0.8.6", + "ldap-filter": "0.2.2", + "once": "1.4.0", + "vasync": "1.6.4", + "verror": "1.10.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4157,6 +4238,12 @@ } } }, + "moment": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==", + "optional": true + }, "morgan": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", @@ -4180,10 +4267,45 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "ncp": "2.0.0", + "rimraf": "2.4.5" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "6.0.4" + } + } + } + }, "nan": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.1.tgz", - "integrity": "sha512-c609vVPyCEuuzqOjx3hwsSZMXLg5QTzbTfgBmEx6N444ymBt1+Yg/rTGr2+4S3VJ3btXI8m1TZ7nLcYcRTZYuQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", + "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", "optional": true }, "nanomatch": { @@ -4211,6 +4333,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -4463,7 +4591,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -4856,6 +4983,11 @@ "xtend": "4.0.1" } }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -5275,6 +5407,12 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "safe-json-stringify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.1.0.tgz", + "integrity": "sha512-EzBtUaFH9bHYPc69wqjp0efJI/DPNHdFbGE3uIMn4sVbO0zx8vZ8cG4WKxQfOpUOKsQyGBiT2mTqnCw+6nLswA==", + "optional": true + }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -6373,6 +6511,34 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "vasync": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", + "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", + "requires": { + "verror": "1.6.0" + }, + "dependencies": { + "verror": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", + "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", + "requires": { + "extsprintf": "1.2.0" + } + } + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.2.0" + } + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -6664,8 +6830,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", diff --git a/package.json b/package.json index 37aa584..e4e0dde 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "graphql-server-express": "^1.3.2", "graphql-tools": "^2.21.0", "knex": "^0.14.4", + "ldapjs": "^1.0.2", "morgan": "^1.9.0", "pg": "^7.4.1", "serve-favicon": "^2.4.5", diff --git a/src/ldap_data.js b/src/ldap_data.js new file mode 100644 index 0000000..f0c194e --- /dev/null +++ b/src/ldap_data.js @@ -0,0 +1,44 @@ +var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn; +var ldapescape = require("ldap-escape"); +//var Fuse = require("fuse.js"); + +var ldap = require('ldapjs'); + +var client = ldap.createClient({ url: "ldap://frankiz", timeout: 10000, idleTimeout: 10000}); + +/** + * @summary Key function ; interrogates LDAP to get list of groups the person's in + * @arg {int} person_id + * @return {string} List of groups where the specified user is member + */ +function groupsUserIsMember(person_id) { + return client.search("ou=groups,dc=frankiz,dc=net", { + scope: "one", + filter: ldapescape.filter("(|(memberUid=${id})(restrictedMemberUid={$id}))",{id: person_id}), + attributes: "uid", + }, + /** + * @summary Fonction gestion erreur ; sûrement un truc malin à faire + * @arg {Object} err - Code d'erreur + * @arg {Object} res - Résultat de la fonction + */ + function(err, res) { return err; + /** + if (err) { + reject("LDAP "); + } + assert.ifError(err); + + res.on('searchEntry', function(entry) { + console.log('entry: ' + JSON.stringify(entry.object)); + }); + res.on('searchReference', function(referral) { + console.log('referral: ' + referral.uris.join()); + }); + res.on('error', function(err) { + console.error('error: ' + err.message); + }); + res.on('end', function(result) { + console.log('status: ' + result.status);}); */ + }); +} \ No newline at end of file diff --git a/src/talk_ldap_data.js b/src/talk_ldap_data.js deleted file mode 100644 index be10c96..0000000 --- a/src/talk_ldap_data.js +++ /dev/null @@ -1,161 +0,0 @@ -var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn; -var ldapescape = require("ldap-escape"); -var Fuse = require("fuse.js"); - -/** - * @summary Fonction de Toussaint - * @arg {int} uid - L'id à tester - * @arg {int} from - Le groupe à tester - * @arg {string} client - Le serveur à tester - */ -function checkGroupAdmin(uid, from, client){ - return new Promise(function(resolve, reject) { - client.search("dc=frankiz,dc=net", {scope: "sub", attributes: ["cn", "uid", "mail", "memberUid", "objectClass"], filter: ldapescape.filter("(uid=${uid})", {uid: from})}, function(err, resldap){ - if (err) { - reject("LDAP search error"); - } else { - resldap.on('searchEntry', function(entry) { - if (entry.object.objectClass.indexOf("inetOrgPerson") > -1) { - if (entry.object.uid == uid) { - resolve(entry.object.cn + " <" + entry.object.mail + ">"); - } else { - reject("Cannot send as user which is not you"); - } - } else { - if (entry.object.memberUid.indexOf(uid) > -1) { - resolve(entry.object.cn + " <" + from + "@eleves.polytechnique.fr>"); - } else { - reject("You are not admin of this group"); - } - } - }); - } - }); - }); -} - -module.exports = function(server, passport, ldap, mailqueue, config) { - // Create Express API's here - - server.post('/api/auth', passport.authenticate('ldapauth', {failureRedirect: '/'}), function (req, res) { - req.session.dn = req.user.dn; - req.session.password = req.body.password; - - if (req.session.returnTo !== undefined) { - res.redirect(req.session.returnTo); - } else { - res.redirect("/send"); - } - }); - - server.get('/api/logout', function(req, res){ - req.logout(); - res.redirect('/'); - }); - - server.get('/api/listfrom', ensureLoggedin(), function(req, res){ - var client = ldap.createClient({ - url: config.ldap.server, - }); - client.bind(req.session.dn, req.session.password, function(err){ - if (err) { - console.error("Error binding", err); - res.status(500).end("Unable to bind"); - } else { - var out = [{name: req.user.cn, mail: req.user.mail, id: req.user.uid}]; - client.search("ou=groups,dc=frankiz,dc=net", {scope: "sub", attributes: ["cn", "uid"], filter: ldapescape.filter("(memberUid=${uid})", {uid: req.user.uid})}, function(err, resldap){ - if (err) { - console.error(err); - } else { - resldap.on('error', function(err) { - console.error('error: ' + err.message); - }); - - resldap.on('searchEntry', function(entry) { - out.push({name: entry.object.cn, id: entry.object.uid, mail: entry.object.uid + "@eleves.polytechnique.fr"}); - }); - - resldap.on('end', function(result) { - res.json(out); - }); - } - }); - } - }); - - }); - - server.get('/api/autocomplete/:query', ensureLoggedin(), function(req, res){ - var client = ldap.createClient({ - url: config.ldap.server - }); - client.bind(req.session.dn, req.session.password, function(err){ - if (err) { - console.error("Error binding", err); - res.status(500).end("Unable to bind"); - } else { - var out = []; - client.search("ou=eleves,dc=frankiz,dc=net", {scope: "sub", attributes: ["cn", "uid", "mail"], filter: ldapescape.filter("(|(uid=*${uid}*)(cn=*${uid}*))", {uid: req.params.query})}, function(err, resldap){ - if (err) { - console.error(err); - } else { - resldap.on('error', function(err) { - console.error('error: ' + err.message); - }); - - resldap.on('searchEntry', function(entry) { - out.push({label: entry.object.cn, id: entry.object.uid, value: entry.object.mail}); - }); - - resldap.on('end', function(result) { - var options = { - shouldSort: true, - threshold: 0.6, - location: 0, - distance: 100, - maxPatternLength: 32, - minMatchCharLength: 1, - keys: ["label", "value"] - }; - - var fuse = new Fuse(out, options); - - res.json(fuse.search(req.params.query)); - }); - } - }); - } - }); - }); - - server.post('/api/send', ensureLoggedin(), function(req, res){ - var client = ldap.createClient({ - url: config.ldap.server - }); - client.bind(req.session.dn, req.session.password, function(err){ - if (err) { - console.error("Error binding", err); - res.status(500).end("Unable to bind"); - } else { - checkGroupAdmin(req.user.uid, req.body.from, client).then(function(sender){ - var to = JSON.parse(req.body.to); - console.log(to); - for (var i = 0; i < to.length; i++) { - message = { - from: sender, - to: to[i].value, - subject: req.body.subject, - html: req.body.content - }; - mailqueue.push(message); - } - - }, function(error){console.error(error);}); - res.redirect("/send"); - } - }); - - }); - - -}; -- GitLab