1 | var 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 |
|
8 | var COMMAND = 'ldapsearch';
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | var ldapRequestTask = module.exports = function (config) {
|
17 | this.init (config);
|
18 |
|
19 | };
|
20 |
|
21 | util.inherits (ldapRequestTask, task);
|
22 |
|
23 | util.extend (ldapRequestTask.prototype, {
|
24 |
|
25 | run: function () {
|
26 |
|
27 | var self = this;
|
28 |
|
29 |
|
30 |
|
31 | self.emit ('log', 'requested ' + self.pager.filter);
|
32 |
|
33 |
|
34 | var connector = project.config.db[this.connector];
|
35 |
|
36 | var connectorTpl = "-LLL -x -H {$host} -b {$base} -D {$user} -w {$pass}";
|
37 |
|
38 | var connectorString = connectorTpl.interpolate(connector);
|
39 |
|
40 |
|
41 | var searchString = self.pager.filter;
|
42 |
|
43 |
|
44 | var args = [
|
45 | connectorString,
|
46 | this.searchPattern.replace (/\{\}/g, searchString),
|
47 | this.fields
|
48 | ].join (' ').split (' ');
|
49 |
|
50 |
|
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 |
|
60 | });
|
61 |
|
62 | fork.stderr.on('data', function (data) {
|
63 | stderr += data;
|
64 |
|
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 | });
|