1
1
const ldap = require ( 'ldapjs' ) ;
2
+ const uuidParse = require ( '../tools/uuid-parse' ) ;
3
+
2
4
module . exports = {
3
5
client : undefined ,
6
+ defaultAttributes : {
7
+ user : [
8
+ 'dn' , 'userPrincipalName' , 'sAMAccountName' , 'objectSID' , 'mail' ,
9
+ 'lockoutTime' , 'whenCreated' , 'pwdLastSet' , 'userAccountControl' ,
10
+ 'employeeID' , 'sn' , 'givenName' , 'initials' , 'cn' , 'displayName' ,
11
+ 'comment' , 'description' , 'title' , 'department' , 'company'
12
+ ] ,
13
+ group : [
14
+ 'dn' , 'cn' , 'description'
15
+ ]
16
+ } ,
17
+ baseDn : '' ,
4
18
/**
19
+ * @public
5
20
* Connect to LDAP server
6
21
* @param {string } url URL of LDAP server
7
22
* @param {string } username UPN or dn of user to bind to instance with
@@ -13,16 +28,29 @@ module.exports = {
13
28
let that = this ;
14
29
this . client = ldap . createClient ( {
15
30
url,
31
+ reconnect : true ,
16
32
...options
17
33
} ) ;
34
+ this . client . on ( 'error' , function ( err ) {
35
+ console . warn ( 'LDAP connection failed, but fear not, it will reconnect OK' , err ) ;
36
+ } ) ;
18
37
return new Promise ( function ( resolve , reject ) {
38
+ if ( that . client . connected ) return resolve ( ) ;
19
39
that . client . bind ( username , password , function ( err , conn ) {
20
- if ( err ) return reject ( err ) ;
40
+ if ( err ) {
41
+ return reject ( err ) ;
42
+ }
21
43
return resolve ( conn ) ;
22
44
} ) ;
23
45
} ) ;
24
46
} ,
47
+ disconnect : function ( ) {
48
+ if ( this . client ) {
49
+ this . client . unbind ( ) ;
50
+ }
51
+ } ,
25
52
/**
53
+ * @public
26
54
* Perform an update action on a specific LDAP object
27
55
* @param {string } dn DN of the object
28
56
* @param {string } operation Operation type to perform
@@ -41,12 +69,63 @@ module.exports = {
41
69
42
70
return new Promise ( function ( resolve , reject ) {
43
71
that . client . modify ( dn , change , function ( err , res ) {
44
- console . log ( '' ) ;
45
72
if ( err ) {
73
+
46
74
return reject ( { success : false , error : err } ) ;
47
75
}
48
76
return resolve ( { success : true } ) ;
49
77
} ) ;
50
78
} ) ;
79
+ } ,
80
+ /**
81
+ * @public
82
+ * @param {string } dn base dn for the search
83
+ * @param {object } userOpts additional user options for search query
84
+ * @returns {Promise<array(object)> }
85
+ */
86
+ search : async function ( dn , userOpts ) {
87
+ let opts = {
88
+ // filter: '&(dn=CN=Jordan Vohwinkel,OU=Test,OU=Users,OU=NTech,OU=BOE Companies,DC=Corp,DC=BOETeams,DC=com)',
89
+ filter : 'cn=Jordan Vohwinkel' ,
90
+ scope : 'sub' ,
91
+ attributes : this . defaultAttributes . user
92
+ } ;
93
+ // Overwrite default attributes with user defined
94
+ Object . assign ( opts , userOpts ) ;
95
+ return new Promise ( function ( resolve , reject ) {
96
+ this . results = [ ] ;
97
+ let that = this ;
98
+
99
+ this . client . search ( dn , opts , function ( err , res ) {
100
+ if ( err ) {
101
+ console . log ( err ) ;
102
+ }
103
+ res . on ( 'searchEntry' , function ( entry ) {
104
+ let res = entry . object ;
105
+ delete res . controls
106
+
107
+ this . onSearchEntry ( res , entry . raw , function ( item ) {
108
+ that . results . push ( item ) ;
109
+ } )
110
+
111
+ } ) ;
112
+ res . on ( 'searchReference' , function ( ) { reject ( 'Referral chasing not implemented.' ) } ) ;
113
+ res . on ( 'error' , function ( err ) { return reject ( err ) ; } ) ;
114
+ res . on ( 'end' , function ( result ) { return resolve ( that . results ) ; } ) ;
115
+ } )
116
+ } ) ;
117
+ } ,
118
+ /**
119
+ * @private
120
+ * Default search entry parser.
121
+ * @param {object } item Item returned from AD
122
+ * @param {object } raw Raw return object
123
+ * @param {function } callback Callback when parsing is complete
124
+ */
125
+ onSearchEntry : function ( item , raw , callback ) {
126
+ if ( raw . hasOwnProperty ( 'objectSid' ) ) item . objectSid = uuidParse . unparse ( raw . objectSid ) ;
127
+ if ( raw . hasOwnProperty ( "objectGUID" ) ) entry . objectGUID = uuidParse . unparse ( raw . objectGUID ) ;
128
+ if ( raw . hasOwnProperty ( "mS-DS-ConsistencyGuid" ) ) entry [ 'mS-DS-ConsistencyGuid' ] = uuidParse . unparse ( raw [ 'mS-DS-ConsistencyGuid' ] ) ;
129
+ callback ( item ) ;
51
130
}
52
- }
131
+ } ;
0 commit comments