@@ -427,6 +427,7 @@ export class Message {
427427 private async Signin ( cli : WebSocketClient ) : Promise < void > {
428428 this . Reply ( ) ;
429429 var msg : SigninMessage
430+ var impostor : string = "" ;
430431 try {
431432 msg = SigninMessage . assign ( this . data ) ;
432433 var tuser : TokenUser = null ;
@@ -435,6 +436,9 @@ export class Message {
435436 if ( msg . jwt !== null && msg . jwt !== undefined ) {
436437 type = "jwtsignin" ;
437438 tuser = Crypt . verityToken ( msg . jwt ) ;
439+ if ( tuser . impostor !== null && tuser . impostor !== undefined && tuser . impostor !== "" ) {
440+ impostor = tuser . impostor ;
441+ }
438442 user = await User . FindByUsername ( tuser . username ) ;
439443 if ( user !== null && user !== undefined ) {
440444 // refresh, for roles and stuff
@@ -448,6 +452,9 @@ export class Message {
448452 msg . error = "Unknown username or password" ;
449453 }
450454 }
455+ if ( impostor !== "" ) {
456+ tuser . impostor = msg . impersonate ;
457+ }
451458 // } else if (tuser.username.startsWith("nodered")) {
452459 // user = new User(); user.name = tuser.name; user.username = tuser.username;
453460 // await user.Save(TokenUser.rootToken());
@@ -485,8 +492,20 @@ export class Message {
485492 user . device = msg . device ;
486493 }
487494 Audit . LoginSuccess ( tuser , type , "websocket" , cli . remoteip ) ;
488- msg . jwt = Crypt . createToken ( user , "1h" ) ;
495+ var userid : string = user . _id ;
496+ msg . jwt = Crypt . createToken ( tuser , "5m" ) ;
489497 msg . user = tuser ;
498+ if ( msg . impersonate !== undefined && msg . impersonate !== null && msg . impersonate !== "" ) {
499+ var items = await Config . db . query ( { _id : msg . impersonate } , null , 1 , 0 , null , "users" , msg . jwt ) ;
500+ if ( items . length == 0 ) throw new Error ( "Permission denied, impersonating " + msg . impersonate ) ;
501+ user = User . assign ( items [ 0 ] as User ) ;
502+ // Check we have update rights
503+ await user . Save ( msg . jwt ) ;
504+ tuser = new TokenUser ( user ) ;
505+ tuser . impostor = userid ;
506+ msg . jwt = Crypt . createToken ( tuser , "5m" ) ;
507+ msg . user = tuser ;
508+ }
490509 if ( msg . validate_only !== true ) {
491510 cli . _logger . debug ( tuser . username + " signed in using " + type ) ;
492511 cli . jwt = msg . jwt ;
@@ -525,7 +544,7 @@ export class Message {
525544 user = await User . ensureUser ( jwt , msg . name , msg . username , null , msg . password ) ;
526545 msg . user = new TokenUser ( user ) ;
527546
528- jwt = Crypt . createToken ( msg . user , "1h " ) ;
547+ jwt = Crypt . createToken ( msg . user , "5m " ) ;
529548 var name = user . username ;
530549 name = name . split ( "@" ) . join ( "" ) . split ( "." ) . join ( "" ) ;
531550 name = name . toLowerCase ( ) ;
0 commit comments