@@ -3,7 +3,7 @@ import bcrypt = require('bcrypt');
3
3
4
4
var mongoskin = require ( 'mongoskin' ) ;
5
5
import { IRegistration , IRegistrationResponse , IRegisteredUser , ILoginResult } from '../../common/interfaces/RegistrationInterfaces' ;
6
- import { IRole , IUser } from '../../common/interfaces/SecurityInterfaces' ;
6
+ import { IRole , IUser , IAuditRecord , AuditDetails } from '../../common/interfaces/SecurityInterfaces' ;
7
7
8
8
var config = {
9
9
mongo_url : process . env . SECURITYDATA_URL || 'mongodb://@localhost:27017/security'
@@ -16,11 +16,13 @@ export class SecurityService {
16
16
db : any ;
17
17
usersCollection : any ;
18
18
rolesCollection : any ;
19
+ auditCollection : any ;
19
20
20
21
constructor ( ) {
21
22
this . db = mongoskin . db ( config . mongo_url , { safe : true } ) ;
22
23
this . usersCollection = this . db . collection ( 'users' ) ;
23
24
this . rolesCollection = this . db . collection ( 'roles' ) ;
25
+ this . auditCollection = this . db . collection ( 'audit' ) ;
24
26
}
25
27
26
28
public getUsers ( ) : Q . Promise < IUser [ ] > {
@@ -113,7 +115,7 @@ export class SecurityService {
113
115
return defer . promise ;
114
116
}
115
117
116
- public login ( username :string , password :string ) : Q . Promise < ILoginResult > {
118
+ public login ( username :string , password :string , req : any ) : Q . Promise < ILoginResult > {
117
119
118
120
var defer = Q . defer < ILoginResult > ( ) ;
119
121
@@ -124,7 +126,10 @@ export class SecurityService {
124
126
if ( ! registeredUser ) {
125
127
defer . resolve ( { succeeded : false } ) ;
126
128
} else if ( bcrypt . compareSync ( password , registeredUser . hashedPassword ) ) {
127
- defer . resolve ( { succeeded : true , userInfo : this . mapUser ( registeredUser ) } ) ;
129
+ this . saveAuditRecord ( username , 'login' , { ip : req . ip } )
130
+ . then ( auditRec => {
131
+ defer . resolve ( { succeeded : true , userInfo : this . mapUser ( registeredUser ) } ) ;
132
+ } ) ;
128
133
} else {
129
134
defer . resolve ( { succeeded : false } ) ;
130
135
}
@@ -161,7 +166,7 @@ export class SecurityService {
161
166
defer . resolve ( { succeeded : false , failureReason : 'Username is not available.' } ) ;
162
167
} else {
163
168
var coll = this . usersCollection ;
164
- coll . find ( { } , { _id : 0 , userId : 1 } ) . sort ( { userId : - 1 } ) . toArray ( function ( e , users : any [ ] ) {
169
+ coll . find ( { } , { _id : 0 , userId : 1 } ) . sort ( { userId : - 1 } ) . toArray ( ( e , users : any [ ] ) => {
165
170
if ( e ) {
166
171
defer . reject ( e ) ;
167
172
} else {
@@ -177,15 +182,19 @@ export class SecurityService {
177
182
hashedPassword : bcrypt . hashSync ( registration . password , 10 )
178
183
} ;
179
184
180
- coll . insert ( newUser , { } , function ( e , results ) {
185
+ coll . insert ( newUser , { } , ( e , results ) => {
181
186
if ( e ) {
182
187
defer . reject ( e ) ;
183
188
} else {
184
189
newUser . hashedPassword = null ;
185
- defer . resolve ( {
186
- succeeded : true ,
187
- failureReason : ''
188
- } ) ;
190
+ this . saveAuditRecord ( newUser . username , 'register' , newUser )
191
+ . then ( auditRec => {
192
+ defer . resolve ( {
193
+ succeeded : true ,
194
+ failureReason : ''
195
+ } ) ;
196
+ } ) ;
197
+
189
198
}
190
199
} ) ;
191
200
}
@@ -210,6 +219,26 @@ export class SecurityService {
210
219
} ;
211
220
}
212
221
222
+ private saveAuditRecord ( username :string , recType :string , details :AuditDetails ) : Q . Promise < IAuditRecord > {
223
+ let defer = Q . defer < IAuditRecord > ( ) ;
224
+ let auditRecord :IAuditRecord = {
225
+ username : username ,
226
+ recType : recType ,
227
+ time : new Date ( ) ,
228
+ details : details
229
+ } ;
230
+
231
+ this . auditCollection . insert ( auditRecord , { } , function ( e , inserted :IAuditRecord [ ] ) {
232
+ if ( e ) {
233
+ defer . reject ( e ) ;
234
+ } else {
235
+ defer . resolve ( inserted [ 0 ] ) ;
236
+ }
237
+ } ) ;
238
+
239
+ return defer . promise ;
240
+ }
241
+
213
242
private getUserByUsernameInternal ( username : string ) : Q . Promise < IRegisteredUser > {
214
243
let defer = Q . defer < IRegisteredUser > ( ) ;
215
244
var coll = this . usersCollection ;
0 commit comments