UNPKG

2.81 kBJavaScriptView Raw
1var EventEmitter = require ('events').EventEmitter,
2 crypto = require ('crypto'),
3 util = require ('util'),
4 urlUtil = require ('url'),
5 spawn = require('child_process').spawn,
6 task = require ('./base');
7
8var COMMAND = 'ldapsearch';
9
10// TODO: docs
11
12// ldap connector
13// need connector property and configuration:
14// host, base, user, pass
15
16var ldapRequestTask = module.exports = function (config) {
17 this.init (config);
18
19};
20
21util.inherits (ldapRequestTask, task);
22
23util.extend (ldapRequestTask.prototype, {
24
25 run: function () {
26
27 var self = this;
28
29 //console.log ('run', self.pager);
30
31 self.emit ('log', 'requested ' + self.pager.filter);
32
33 // TODO: error handling
34 var connector = project.config.db[this.connector];
35
36 var connectorTpl = "-LLL -x -H {$host} -b {$base} -D {$user} -w {$pass}";
37 //var windowTpl = "-E vlv=0/0/{$start}/{$limit}";
38 var connectorString = connectorTpl.interpolate(connector);
39 //var windowString = windowTpl.interpolate(self.pager);
40
41 var searchString = self.pager.filter;
42
43 // params preparation
44 var args = [
45 connectorString,
46 this.searchPattern.replace (/\{\}/g, searchString),
47 this.fields
48 ].join (' ').split (' ');
49
50 //console.log (args.join(' '));
51
52 var fork = spawn(COMMAND, args);
53
54 var stderr = '';
55 var stdout = '';
56
57 fork.stdout.on('data', function (data) {
58 stdout += data;
59// console.log (1);
60 });
61
62 fork.stderr.on('data', function (data) {
63 stderr += data;
64// console.log (2);
65 });
66
67 fork.on('exit', function (code) {
68
69 var docs = [];
70 var records = stdout.split ("\n\n");
71
72 records.map (function (item) {
73
74 var account;
75
76 item.split (/\n\s+/).join ('').split ("\n").map (function (item) {
77 if (!item || item.charAt (0) == '#')
78 return
79
80 var parts = item.split (': ');
81 if (parts[0].charAt(parts[0].length - 1) == ':') {
82 parts[0] = parts[0].substr (0, parts[0].length - 1)
83 if (parts[0].indexOf('Photo') == -1) {
84 parts[1] = new Buffer(parts[1], 'base64').toString('utf-8');
85 }
86 }
87
88 if (!account)
89 account = {};
90
91 if (self.toLowerCase)
92 parts[0] = parts[0].toLowerCase();
93
94 if (account[parts[0]] && account[parts[0]].constructor == Array) {
95 account[parts[0]].push (parts[1]);
96 } else if (account[parts[0]]) {
97 account[parts[0]] = [account[parts[0]], parts[1]];
98 } else {
99 account[parts[0]] = parts[1];
100 }
101
102 });
103
104 if (account) {
105 if (self.mapping) {
106 self.mapFields (account);
107 }
108
109 docs.push (account);
110 }
111
112 });
113
114 var start = parseInt(self.pager.start, 10),
115 limit = parseInt(self.pager.limit, 10);
116
117 self.completed ({
118 success: (docs.length > 0),
119 total: docs.length || 0,
120 err: null,
121 data: docs.slice(start, start + limit)
122 });
123
124 });
125
126 }
127});