Skip to content

Commit 0bf49cf

Browse files
committed
fix token parsing errors
1 parent b5dc66a commit 0bf49cf

10 files changed

Lines changed: 67 additions & 25 deletions

OpenFlow/src/Config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ export class Config {
4646
Config.tls_passphrase = Config.getEnv("tls_passphrase", "");
4747

4848
Config.api_credential_cache_seconds = parseInt(Config.getEnv("api_credential_cache_seconds", "60000"));
49+
Config.api_credential_cache_seconds = parseInt(Config.getEnv("api_credential_cache_seconds", "60000"));
50+
Config.oauth_token_cache_seconds = parseInt(Config.getEnv("oauth_token_cache_seconds", "60000"));
51+
Config.oauth_access_token_lifetime = parseInt(Config.getEnv("oauth_access_token_lifetime", "604800"));
52+
Config.oauth_refresh_token_lifetime = parseInt(Config.getEnv("oauth_refresh_token_lifetime", "604800"));
4953
Config.api_rate_limit = Config.parseBoolean(Config.getEnv("api_rate_limit", "true"));
5054
Config.api_rate_limit_points = parseInt(Config.getEnv("api_rate_limit_points", "60"));
5155
Config.api_rate_limit_duration = parseInt(Config.getEnv("api_rate_limit_duration", "1"));
@@ -132,6 +136,8 @@ export class Config {
132136

133137
public static api_credential_cache_seconds: number = parseInt(Config.getEnv("api_credential_cache_seconds", "60000"));
134138
public static oauth_token_cache_seconds: number = parseInt(Config.getEnv("oauth_token_cache_seconds", "60000"));
139+
public static oauth_access_token_lifetime: number = parseInt(Config.getEnv("oauth_access_token_lifetime", "604800"));
140+
public static oauth_refresh_token_lifetime: number = parseInt(Config.getEnv("oauth_refresh_token_lifetime", "604800"));
135141
public static api_rate_limit: boolean = Config.parseBoolean(Config.getEnv("api_rate_limit", "true"));
136142
public static api_rate_limit_points: number = parseInt(Config.getEnv("api_rate_limit_points", "60"));
137143
public static api_rate_limit_duration: number = parseInt(Config.getEnv("api_rate_limit_duration", "1"));

OpenFlow/src/OAuthProvider.ts

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ export class OAuthProvider {
2424
instance.oauthServer = new OAuthServer({
2525
model: instance,
2626
grants: ['authorization_code', 'refresh_token'],
27-
accessTokenLifetime: 60 * 60 * 24, // 24 hours, or 1 day
27+
accessTokenLifetime: (60 * 60 * 24) * 7, // 7 days * 24 hours, or 1 day
28+
refreshTokenLifetime: (60 * 60 * 24) * 7, // 7 days * 24 hours, or 1 day
2829
allowEmptyState: true,
2930
allowExtendedTokenAttributes: true
3031
});
@@ -160,7 +161,7 @@ export class OAuthProvider {
160161
}
161162

162163
public async saveToken(token, client, user) {
163-
this._logger.info("[OAuth] saveToken " + token);
164+
this._logger.info("[OAuth] saveToken for " + user.name + " in " + client.clientId);
164165
const result: any = {
165166
name: "Token for " + user.name,
166167
accessToken: token.accessToken,
@@ -185,8 +186,14 @@ export class OAuthProvider {
185186
delete codeobject._id;
186187
codeobject._type = 'code';
187188
codeobject.code = code;
189+
codeobject.id = user._id;
190+
codeobject.username = user.username;
191+
codeobject.email = user.email;
192+
if (NoderedUtil.IsNullEmpty(codeobject.email)) codeobject.email = user.username;
193+
codeobject.fullname = user.name;
188194
codeobject.redirect_uri = redirect_uri;
189195
codeobject.client_id = client.clientId
196+
codeobject.name = "Code " + code + " for " + user.name
190197
this.codes[code] = codeobject;
191198
await Config.db.InsertOne(codeobject, "oauthtokens", 1, false, Crypt.rootToken());
192199
this._logger.info("[OAuth] saveAuthorizationCode " + code + " saved");
@@ -220,7 +227,7 @@ export class OAuthProvider {
220227

221228
public async getAuthorizationCode(code) {
222229
this._logger.info("[OAuth] getAuthorizationCode " + code);
223-
let user: TokenUser = this.codes[code];
230+
let user: any = this.codes[code];
224231
if (user == null) {
225232
let users = await Config.db.query<Base>({ _type: "code", "code": code }, null, 10, 0, null, "oauthtokens", Crypt.rootToken());
226233
user = users.length ? users[0] as any : null;
@@ -246,22 +253,22 @@ export class OAuthProvider {
246253
const redirect_uri = (user as any).redirect_uri;
247254
const expiresAt = new Date();
248255
expiresAt.setMonth(expiresAt.getMonth() + 1);
249-
user = TokenUser.From(user);
256+
var tuser = TokenUser.From(user);
250257
let client = this.getClientById(client_id);
251258
if (NoderedUtil.IsNullUndefinded(client)) return null;
252259

253260
let role = client.defaultrole;
254261
const keys: string[] = Object.keys(client.rolemappings);
255262
for (let i = 0; i < keys.length; i++) {
256-
if (user.HasRoleName(keys[i])) role = client.rolemappings[keys[i]];
263+
if (tuser.HasRoleName(keys[i])) role = client.rolemappings[keys[i]];
257264
}
258265
const result = {
259266
code: code,
260267
client: this.clients[0],
261268
user: {
262-
id: user._id,
263-
_id: user._id,
264-
name: user.name,
269+
id: user.id,
270+
_id: user.id,
271+
name: user.fullname,
265272
username: user.username,
266273
email: user.username,
267274
role: role
@@ -271,16 +278,25 @@ export class OAuthProvider {
271278
}
272279
return result;
273280
}
274-
revokeAuthorizationCode(code) {
281+
public async revokeAuthorizationCode(code) {
282+
if (typeof code !== "string") { code = code.code; }
275283
this._logger.info("[OAuth] revokeAuthorizationCode " + code);
276284
delete this.codes[code];
277-
Config.db.DeleteMany({ _type: "code", "code": code }, null, "oauthtokens", Crypt.rootToken());
285+
const refreshTokenExpiresAt = new Date((new Date).getTime() + (1000 * Config.oauth_refresh_token_lifetime)).toISOString();
286+
const accessTokenExpiresAt = new Date((new Date).getTime() + (1000 * Config.oauth_access_token_lifetime)).toISOString();
287+
await Config.db.DeleteMany({
288+
"$or":
289+
[
290+
{ _type: "code", "code": code },
291+
{ _type: "token", "refreshTokenExpiresAt": refreshTokenExpiresAt },
292+
{ _type: "token", "accessTokenExpiresAt": accessTokenExpiresAt }
293+
]
294+
}, null, "oauthtokens", Crypt.rootToken());
278295
return true;
279296
// const user: TokenUser = this.codes[code];
280297
// if (user != null) delete this.codes[code];
281298
// return code;
282299
}
283-
284300
public static tokenCache: CachedToken[] = [];
285301
private static async getCachedAccessToken(accessToken: string): Promise<any> {
286302
await semaphore.down();
@@ -292,7 +308,7 @@ export class OAuthProvider {
292308
if (seconds > Config.oauth_token_cache_seconds) {
293309
this.tokenCache.splice(i, 1);
294310
} else if (res.token.accessToken == accessToken) {
295-
console.log("Return token from cache, using accessToken " + accessToken);
311+
// console.log("Return token from cache, using accessToken " + accessToken);
296312
semaphore.up();
297313
return res.token;
298314
}
@@ -310,7 +326,7 @@ export class OAuthProvider {
310326
if (seconds > Config.oauth_token_cache_seconds) {
311327
this.tokenCache.splice(i, 1);
312328
} else if (res.token.refreshToken == refreshToken) {
313-
console.log("Return token from cache, using refreshToken " + refreshToken);
329+
// console.log("Return token from cache, using refreshToken " + refreshToken);
314330
semaphore.up();
315331
return res.token;
316332
}
@@ -320,7 +336,7 @@ export class OAuthProvider {
320336
}
321337
private static async addToken(token: any) {
322338
await semaphore.down();
323-
console.log("Adding token to cache");
339+
// console.log("Adding token to cache");
324340
var cuser: CachedToken = new CachedToken(token);
325341
this.tokenCache.push(cuser);
326342
semaphore.up();

OpenFlow/src/index.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,26 @@ try {
246246

247247
}
248248

249+
250+
251+
const originalStdoutWrite = process.stdout.write.bind(process.stdout);
252+
const originalStderrWrite = process.stderr.write.bind(process.stderr);
253+
(process.stdout.write as any) = (chunk: string, encoding?: string, callback?: (err?: Error | null) => void): boolean => {
254+
if (chunk.indexOf("Failed locating user with") > -1) {
255+
console.log("bump");
256+
}
257+
return originalStdoutWrite(chunk, encoding, callback);
258+
};
259+
(process.stderr.write as any) = (chunk: string, encoding?: string, callback?: (err?: Error | null) => void): boolean => {
260+
if (chunk.indexOf("Failed locating user with") > -1) {
261+
console.log("bump");
262+
}
263+
return originalStderrWrite(chunk, encoding, callback);
264+
};
265+
266+
// write(buffer: Buffer | Uint8Array | string, cb?: (err?: Error | null) => void): boolean;
267+
// write(str: string, encoding?: string, cb?: (err?: Error | null) => void): boolean;
268+
249269
// https://medium.com/kubernetes-tutorials/monitoring-your-kubernetes-deployments-with-prometheus-5665eda54045
250270
(async function (): Promise<void> {
251271
try {

OpenFlowNodeRED/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openflow-nodered",
3-
"version": "1.1.103",
3+
"version": "1.1.105",
44
"description": "Simple wrapper around NodeRed, RabbitMQ and MongoDB to support a more scaleable NodeRed implementation.\r Also the \"backend\" for [OpenRPA](https://github.com/skadefro/OpenRPA)",
55
"main": "index.js",
66
"scripts": {

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.1.103
1+
1.1.105

docker-compose-toolbox.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ services:
4545
- "traefik.http.routers.web.rule=Host(`toolbox.openrpa.dk`)"
4646
- "traefik.http.routers.web.entrypoints=web"
4747
- "traefik.frontend.passHostHeader=true"
48-
image: "cloudhack/openflow:1.1.103"
48+
image: "cloudhack/openflow:1.1.105"
4949
container_name: "web"
5050
environment:
5151
- update_acl_based_on_groups=true
@@ -82,7 +82,7 @@ services:
8282
- "traefik.http.routers.nodered.rule=Host(`nodered1.toolbox.openrpa.dk`)"
8383
- "traefik.http.routers.nodered.entrypoints=web"
8484
- "traefik.http.services.nodered.loadbalancer.server.port=1880"
85-
image: "cloudhack/openflownodered:1.1.103"
85+
image: "cloudhack/openflownodered:1.1.105"
8686
container_name: "nodered"
8787
environment:
8888
# - nodered_id=1

docker-compose-traefik-letsencrypt.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ services:
6969
- "traefik.http.routers.web.entrypoints=web,websecure"
7070
- "traefik.frontend.passHostHeader=true"
7171
- "traefik.http.routers.web.tls.certresolver=myresolver"
72-
image: "cloudhack/openflow:1.1.103"
72+
image: "cloudhack/openflow:1.1.105"
7373
container_name: "web"
7474
environment:
7575
- update_acl_based_on_groups=true
@@ -107,7 +107,7 @@ services:
107107
- "traefik.http.routers.nodered.entrypoints=web,websecure"
108108
- "traefik.http.services.nodered.loadbalancer.server.port=1880"
109109
- "traefik.http.routers.nodered.tls.certresolver=myresolver"
110-
image: "cloudhack/openflownodered:1.1.103"
110+
image: "cloudhack/openflownodered:1.1.105"
111111
container_name: "nodered"
112112
environment:
113113
# - nodered_id=1

docker-compose-traefik.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ services:
4545
- "traefik.http.routers.web.rule=Host(`localhost.openrpa.dk`)"
4646
- "traefik.http.routers.web.entrypoints=web"
4747
- "traefik.frontend.passHostHeader=true"
48-
image: "cloudhack/openflow:1.1.103"
48+
image: "cloudhack/openflow:1.1.105"
4949
container_name: "web"
5050
environment:
5151
- update_acl_based_on_groups=true
@@ -82,7 +82,7 @@ services:
8282
- "traefik.http.routers.nodered.rule=Host(`nodered1.localhost.openrpa.dk`)"
8383
- "traefik.http.routers.nodered.entrypoints=web"
8484
- "traefik.http.services.nodered.loadbalancer.server.port=1880"
85-
image: "cloudhack/openflownodered:1.1.103"
85+
image: "cloudhack/openflownodered:1.1.105"
8686
container_name: "nodered"
8787
environment:
8888
# - nodered_id=1

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ services:
1818
- "5672:5672"
1919
- "15672:15672"
2020
web:
21-
image: "cloudhack/openflow:1.1.103"
21+
image: "cloudhack/openflow:1.1.105"
2222
environment:
2323
- update_acl_based_on_groups=true
2424
- multi_tenant=false
@@ -52,7 +52,7 @@ services:
5252
- "80:80"
5353
- "5858:5858"
5454
nodered:
55-
image: "cloudhack/openflownodered:1.1.103"
55+
image: "cloudhack/openflownodered:1.1.105"
5656
environment:
5757
# - nodered_id=1
5858
- nodered_sa=nodered1

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openiap",
3-
"version": "1.1.103",
3+
"version": "1.1.105",
44
"description": "Simple wrapper around NodeRed, RabbitMQ and MongoDB to support a more scaleable NodeRed implementation.\r Also the \"backend\" for [OpenRPA](https://github.com/skadefro/OpenRPA)",
55
"main": "index.js",
66
"scripts": {

0 commit comments

Comments
 (0)