Skip to content

Commit 19c90e4

Browse files
committed
send clientagent and clientversion
1 parent 86f432e commit 19c90e4

20 files changed

Lines changed: 79 additions & 25 deletions

OpenFlow/src/Audit.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
1-
import { Base } from "./base";
1+
import { Base, Rights } from "./base";
22
import { Config } from "./Config";
33
import { TokenUser } from "./TokenUser";
44

55
export class Audit {
6-
public static LoginSuccess(user: TokenUser, type: string, provider: string, remoteip: string) {
6+
public static LoginSuccess(user: TokenUser, type: string, provider: string, remoteip: string, clientagent: string, clientversion: string) {
77
var log: Singin = new Singin();
8+
log.addRight(user._id, user.name, [Rights.read]);
89
log.remoteip = remoteip;
910
log.success = true;
1011
log.type = type;
1112
log.provider = provider;
1213
log.userid = user._id;
1314
log.name = user.name;
1415
log.username = user.username;
16+
log.clientagent = clientagent;
17+
log.clientversion = clientversion;
1518
Config.db.InsertOne(log, "audit", 0, false, TokenUser.rootToken())
1619
.catch((error) => console.error("failed InsertOne in LoginSuccess: " + error));
1720
}
18-
public static ImpersonateSuccess(user: TokenUser, impostor: TokenUser) {
21+
public static ImpersonateSuccess(user: TokenUser, impostor: TokenUser, clientagent: string, clientversion: string) {
1922
var log: Singin = new Singin();
23+
log.addRight(user._id, user.name, [Rights.read]);
24+
log.addRight(impostor._id, impostor.name, [Rights.read]);
2025
log.success = true;
2126
log.type = "impersonate";
2227
log.userid = user._id;
@@ -25,27 +30,35 @@ export class Audit {
2530
log.impostoruserid = impostor._id;
2631
log.impostorname = impostor.name;
2732
log.impostorusername = impostor.username;
33+
log.clientagent = clientagent;
34+
log.clientversion = clientversion;
2835
Config.db.InsertOne(log, "audit", 0, false, TokenUser.rootToken())
2936
.catch((error) => console.error("failed InsertOne in ImpersonateSuccess: " + error));
3037
}
31-
public static ImpersonateFailed(user: TokenUser, impostor_id: string) {
38+
public static ImpersonateFailed(user: TokenUser, impostor_id: string, clientagent: string, clientversion: string) {
3239
var log: Singin = new Singin();
40+
log.addRight(user._id, user.name, [Rights.read]);
3341
log.success = false;
3442
log.type = "impersonate";
3543
log.userid = user._id;
3644
log.name = user.name;
3745
log.username = user.username;
3846
log.impostoruserid = impostor_id;
47+
log.clientagent = clientagent;
48+
log.clientversion = clientversion;
3949
Config.db.InsertOne(log, "audit", 0, false, TokenUser.rootToken())
4050
.catch((error) => console.error("failed InsertOne in ImpersonateFailed: " + error));
4151
}
42-
public static LoginFailed(username: string, type: string, provider: string, remoteip: string) {
52+
public static LoginFailed(username: string, type: string, provider: string, remoteip: string, clientagent: string, clientversion: string) {
4353
var log: Singin = new Singin();
54+
log._acl
4455
log.remoteip = remoteip;
4556
log.success = false;
4657
log.type = type;
4758
log.provider = provider;
4859
log.username = username;
60+
log.clientagent = clientagent;
61+
log.clientversion = clientversion;
4962
Config.db.InsertOne(log, "audit", 0, false, TokenUser.rootToken())
5063
.catch((error) => console.error("failed InsertOne in LoginFailed: " + error));
5164
}
@@ -60,6 +73,8 @@ export class Singin extends Base {
6073
public impostoruserid: string;
6174
public impostorname: string;
6275
public impostorusername: string;
76+
public clientagent: string;
77+
public clientversion: string;
6378
constructor() {
6479
super();
6580
this._type = "signin";

OpenFlow/src/LoginProvider.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -557,11 +557,11 @@ export class LoginProvider {
557557
await admins.Save(TokenUser.rootToken())
558558
} else {
559559
if (!(await user.ValidatePassword(password))) {
560-
Audit.LoginFailed(username, "weblogin", "local", "");
560+
Audit.LoginFailed(username, "weblogin", "local", "", "browser", "unknown");
561561
return done(null, false);
562562
}
563563
}
564-
Audit.LoginSuccess(new TokenUser(user), "weblogin", "local", "");
564+
Audit.LoginSuccess(new TokenUser(user), "weblogin", "local", "", "browser", "unknown");
565565
var provider: Provider = new Provider(); provider.provider = "local"; provider.name = "Local";
566566
provider = await Config.db.InsertOne(provider, "config", 0, false, TokenUser.rootToken());
567567
LoginProvider.login_providers.push(provider);
@@ -576,12 +576,12 @@ export class LoginProvider {
576576
user = await User.ensureUser(TokenUser.rootToken(), username, username, null, password);
577577
} else {
578578
if (!(await user.ValidatePassword(password))) {
579-
Audit.LoginFailed(username, "weblogin", "local", "");
579+
Audit.LoginFailed(username, "weblogin", "local", "", "browser", "unknown");
580580
return done(null, false);
581581
}
582582
}
583583
tuser = new TokenUser(user);
584-
Audit.LoginSuccess(tuser, "weblogin", "local", "");
584+
Audit.LoginSuccess(tuser, "weblogin", "local", "", "browser", "unknown");
585585
return done(null, tuser);
586586
} catch (error) {
587587
done(error);
@@ -704,12 +704,12 @@ export class LoginProvider {
704704
}
705705

706706
if (Util.IsNullUndefinded(_user)) {
707-
Audit.LoginFailed(username, "weblogin", "saml", "");
707+
Audit.LoginFailed(username, "weblogin", "saml", "", "samlverify", "unknown");
708708
done("unknown user " + username, null); return;
709709
}
710710

711711
var tuser: TokenUser = new TokenUser(_user);
712-
Audit.LoginSuccess(tuser, "weblogin", "saml", "");
712+
Audit.LoginSuccess(tuser, "weblogin", "saml", "", "samlverify", "unknown");
713713
done(null, tuser);
714714
}
715715
static async googleverify(token: string, tokenSecret: string, profile: any, done: IVerifyFunction): Promise<void> {
@@ -738,11 +738,11 @@ export class LoginProvider {
738738
}
739739
}
740740
if (Util.IsNullUndefinded(_user)) {
741-
Audit.LoginFailed(username, "weblogin", "google", "");
741+
Audit.LoginFailed(username, "weblogin", "google", "", "googleverify", "unknown");
742742
done("unknown user " + username, null); return;
743743
}
744744
var tuser: TokenUser = new TokenUser(_user);
745-
Audit.LoginSuccess(tuser, "weblogin", "google", "");
745+
Audit.LoginSuccess(tuser, "weblogin", "google", "", "googleverify", "unknown");
746746
done(null, tuser);
747747
}
748748

OpenFlow/src/Messages/Message.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -562,19 +562,21 @@ export class Message {
562562
user = await Auth.ValidateByPassword(msg.username, msg.password);
563563
tuser = new TokenUser(user);
564564
}
565+
cli.clientagent = msg.clientagent;
566+
cli.clientversion = msg.clientversion;
565567
if (user === null || user === undefined || tuser === null || tuser === undefined) {
566568
msg.error = "Unknown username or password";
567-
Audit.LoginFailed(tuser.username, type, "websocket", cli.remoteip);
569+
Audit.LoginFailed(tuser.username, type, "websocket", cli.remoteip, cli.clientagent, cli.clientversion);
568570
cli._logger.debug(tuser.username + " failed logging in using " + type);
569571
} else {
570-
Audit.LoginSuccess(tuser, type, "websocket", cli.remoteip);
572+
Audit.LoginSuccess(tuser, type, "websocket", cli.remoteip, cli.clientagent, cli.clientversion);
571573
var userid: string = user._id;
572574
msg.jwt = Crypt.createToken(tuser, "5m");
573575
msg.user = tuser;
574576
if (msg.impersonate !== undefined && msg.impersonate !== null && msg.impersonate !== "") {
575577
var items = await Config.db.query({ _id: msg.impersonate }, null, 1, 0, null, "users", msg.jwt);
576578
if (items.length == 0) {
577-
Audit.ImpersonateFailed(tuser, msg.impersonate);
579+
Audit.ImpersonateFailed(tuser, msg.impersonate, cli.clientagent, cli.clientversion);
578580
throw new Error("Permission denied, impersonating " + msg.impersonate);
579581
}
580582
var tuserimpostor = tuser;
@@ -586,7 +588,7 @@ export class Message {
586588
tuser.impostor = userid;
587589
msg.jwt = Crypt.createToken(tuser, "5m");
588590
msg.user = tuser;
589-
Audit.ImpersonateSuccess(tuser, tuserimpostor);
591+
Audit.ImpersonateSuccess(tuser, tuserimpostor, cli.clientagent, cli.clientversion);
590592
}
591593
if (msg.firebasetoken != null && msg.firebasetoken != undefined && msg.firebasetoken != "") {
592594
user.firebasetoken = msg.firebasetoken;
@@ -614,6 +616,8 @@ export class Message {
614616
if (msg.impersonate === undefined || msg.impersonate === null || msg.impersonate === "") {
615617
user.lastseen = new Date(new Date().toISOString());
616618
}
619+
user._lastclientagent = cli.clientagent;
620+
user._lastclientversion = cli.clientversion;
617621
await user.Save(TokenUser.rootToken());
618622
}
619623
} catch (error) {

OpenFlow/src/Messages/SigninMessage.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ export class SigninMessage implements IReplyMessage {
1111
public gpslocation: any;
1212
public device: any;
1313
public websocket_package_size: number;
14+
public clientagent: string;
15+
public clientversion: string;
1416

1517
public validate_only: boolean = false;
1618
public username: string;

OpenFlow/src/SamlProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export class SamlProvider {
8282
var tuser: TokenUser = new TokenUser(req.user);
8383
var remoteip = "";
8484
if (req.connection) { remoteip = req.connection.remoteAddress; }
85-
Audit.LoginSuccess(tuser, "tokenissued", "saml", remoteip);
85+
Audit.LoginSuccess(tuser, "tokenissued", "saml", remoteip, "getUserFromRequest", "unknown");
8686
return req.user;
8787
},
8888
profileMapper: SamlProvider.profileMapper,

OpenFlow/src/User.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ export class User extends Base {
2323
}
2424
noderedname: string;
2525
lastseen: Date;
26+
_heartbeat: Date;
27+
_rpaheartbeat: Date;
28+
_noderedheartbeat: Date;
29+
_lastclientagent: string;
30+
_lastclientversion: string;
2631
username: string;
2732
passwordhash: string;
2833
sid: string;

OpenFlow/src/WebSocketClient.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ export class WebSocketClient {
3939
private _sendQueue: SocketMessage[];
4040
public messageQueue: IHashTable<QueuedMessage> = {};
4141
public remoteip: string;
42+
public clientagent: string;
43+
public clientversion: string;
4244

4345
user: User;
4446
public consumers: amqp_consumer[] = [];

OpenFlow/src/WebSocketServer.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,11 @@ export class WebSocketServer {
6969
var cli = WebSocketServer._clients[i];
7070
if (cli.user != null) {
7171
// Lets assume only robots register queues ( not true )
72-
if (cli.consumers != null && cli.consumers.length > 0) {
72+
if (cli.clientagent == "openrpa") {
73+
Config.db.db.collection("users").updateOne({ _id: cli.user._id },
74+
{ $set: { _rpaheartbeat: new Date(new Date().toISOString()), _heartbeat: new Date(new Date().toISOString()) } });
75+
}
76+
else if (cli.consumers != null && cli.consumers.length > 0) {
7377
// Should proberly turn this a little down, so we dont update all online users every 10th second
7478
Config.db.db.collection("users").updateOne({ _id: cli.user._id }, { $set: { _heartbeat: new Date(new Date().toISOString()) } });
7579
}

OpenFlow/src/public/CommonControllers.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,11 @@ module openflow {
119119
q.jwt = jwt;
120120
q.rawAssertion = rawAssertion;
121121
q.realm = "browser";
122+
q.clientagent = "webapp";
123+
q.clientversion = this.WebSocketClient.version;
122124
if (this.WebSocketClient.usingCordova) {
123125
q.realm = "mobile";
126+
q.clientagent = "mobileapp";
124127
}
125128
q.impersonate = impersonate;
126129
q.onesignalid = this.WebSocketClient.oneSignalId;
@@ -138,8 +141,11 @@ module openflow {
138141
q.username = username;
139142
q.password = password;
140143
q.realm = "browser";
144+
q.clientagent = "webapp";
145+
q.clientversion = this.WebSocketClient.version;
141146
if (this.WebSocketClient.usingCordova) {
142147
q.realm = "mobile";
148+
q.clientagent = "mobileapp";
143149
}
144150
q.impersonate = impersonate;
145151
q.onesignalid = this.WebSocketClient.oneSignalId;

OpenFlow/src/public/Message.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ module openflow {
4242
export class SigninMessage {
4343
public error: string;
4444

45+
public clientagent: string;
46+
public clientversion: string;
4547
public impersonate: string;
4648
public realm: string;
4749
public firebasetoken: string;

0 commit comments

Comments
 (0)