Skip to content

Commit 71efe71

Browse files
author
Artem
committed
#RI-3775 add dummy auth middleware + Session object + ClientMetadata object
1 parent 3915d04 commit 71efe71

File tree

124 files changed

+2319
-2649
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

124 files changed

+2319
-2649
lines changed

redisinsight/api/config/default.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export default {
5757
appVersion: process.env.APP_VERSION || '2.0.0',
5858
requestTimeout: parseInt(process.env.REQUEST_TIMEOUT, 10) || 10000,
5959
excludeRoutes: [],
60+
excludeAuthRoutes: [],
6061
},
6162
sockets: {
6263
cors: process.env.SOCKETS_CORS ? process.env.SOCKETS_CORS === 'true' : false,

redisinsight/api/src/__mocks__/common.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import { ClientContext, ClientMetadata, Session } from 'src/common/models';
2+
import { mockDatabase } from 'src/__mocks__/databases';
3+
import { v4 as uuidv4 } from 'uuid';
4+
15
export type MockType<T> = {
26
[P in keyof T]: jest.Mock<any>;
37
};
@@ -57,3 +61,33 @@ export const mockRepository = jest.fn(() => ({
5761
remove: jest.fn(),
5862
createQueryBuilder: mockCreateQueryBuilder,
5963
}));
64+
65+
export const mockSession: Session = {
66+
userId: uuidv4(),
67+
sessionId: uuidv4(),
68+
};
69+
70+
export const mockCliClientMetadata: ClientMetadata = {
71+
session: mockSession,
72+
databaseId: mockDatabase.id,
73+
context: ClientContext.CLI,
74+
uniqueId: uuidv4(),
75+
};
76+
77+
export const mockWorkbenchClientMetadata: ClientMetadata = {
78+
session: mockSession,
79+
databaseId: mockDatabase.id,
80+
context: ClientContext.Workbench,
81+
};
82+
83+
export const mockBrowserClientMetadata: ClientMetadata = {
84+
session: mockSession,
85+
databaseId: mockDatabase.id,
86+
context: ClientContext.Browser,
87+
};
88+
89+
export const mockCommonClientMetadata: ClientMetadata = {
90+
session: mockSession,
91+
databaseId: mockDatabase.id,
92+
context: ClientContext.Common,
93+
};

redisinsight/api/src/app.module.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { ServerModule } from 'src/modules/server/server.module';
1919
import { LocalDatabaseModule } from 'src/local-database.module';
2020
import { CoreModule } from 'src/core.module';
2121
import { AutodiscoveryModule } from 'src/modules/autodiscovery/autodiscovery.module';
22+
import { DummyAuthMiddleware } from 'src/common/middlewares/dummy-auth.middleware';
2223
import { BrowserModule } from './modules/browser/browser.module';
2324
import { RedisEnterpriseModule } from './modules/redis-enterprise/redis-enterprise.module';
2425
import { RedisSentinelModule } from './modules/redis-sentinel/redis-sentinel.module';
@@ -97,6 +98,11 @@ export class AppModule implements OnModuleInit, NestModule {
9798
}
9899

99100
configure(consumer: MiddlewareConsumer) {
101+
consumer
102+
.apply(DummyAuthMiddleware)
103+
.exclude(...SERVER_CONFIG.excludeAuthRoutes)
104+
.forRoutes('*');
105+
100106
consumer
101107
.apply(ExcludeRouteMiddleware)
102108
.forRoutes(
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const API_PARAM_DATABASE_ID = 'dbInstance';
2+
export const API_PARAM_CLI_CLIENT_ID = 'uuid';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './redis-string';
2+
export * from './api';
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
2+
import { plainToClass } from 'class-transformer';
3+
import { ClientContext, ClientMetadata } from 'src/common/models';
4+
import { sessionFromRequestFactory } from 'src/common/decorators';
5+
import { API_PARAM_CLI_CLIENT_ID, API_PARAM_DATABASE_ID } from 'src/common/constants';
6+
7+
export interface IClientMetadataDecoratorOptions {
8+
paramPath?: string,
9+
queryPath?: string,
10+
bodyPath?: string,
11+
context?: ClientContext,
12+
uniqueId?: string,
13+
}
14+
15+
export const clientMetadataFromRequestFactory = (options: IClientMetadataDecoratorOptions, ctx: ExecutionContext) => {
16+
const opts: IClientMetadataDecoratorOptions = {
17+
context: ClientContext.Common,
18+
...options,
19+
};
20+
21+
const request = ctx.switchToHttp().getRequest();
22+
23+
let databaseId;
24+
if (opts.paramPath) {
25+
databaseId = request.params?.[opts.paramPath];
26+
} else if (opts.queryPath) {
27+
// TBD
28+
} else if (opts.bodyPath) {
29+
// TBD
30+
}
31+
32+
// todo: add validation
33+
if (!databaseId) {
34+
// todo: define proper error
35+
throw new Error('No databaseId found');
36+
}
37+
38+
return plainToClass(ClientMetadata, {
39+
session: sessionFromRequestFactory(undefined, ctx),
40+
databaseId,
41+
context: opts.context,
42+
uniqueId: opts.uniqueId,
43+
});
44+
};
45+
46+
export const ClientMetadataFromRequest = createParamDecorator(clientMetadataFromRequestFactory);
47+
48+
export const browserClientMetadataFactory = (
49+
param = API_PARAM_DATABASE_ID,
50+
ctx: ExecutionContext,
51+
): ClientMetadata => clientMetadataFromRequestFactory({
52+
paramPath: param,
53+
context: ClientContext.Browser,
54+
}, ctx);
55+
56+
export const BrowserClientMetadata = createParamDecorator(browserClientMetadataFactory);
57+
58+
export const cliClientMetadataFactory = (
59+
options = { databaseParam: API_PARAM_DATABASE_ID, uuidParam: API_PARAM_CLI_CLIENT_ID },
60+
ctx: ExecutionContext,
61+
): ClientMetadata => {
62+
const request = ctx.switchToHttp().getRequest();
63+
64+
// todo: add validation
65+
return clientMetadataFromRequestFactory({
66+
paramPath: options.databaseParam,
67+
context: ClientContext.CLI,
68+
uniqueId: request.params?.[options.uuidParam],
69+
}, ctx);
70+
};
71+
72+
export const CliClientMetadata = createParamDecorator(cliClientMetadataFactory);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './client-metadata.decorator';

redisinsight/api/src/common/decorators/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ export * from './redis-string';
22
export * from './zset-score';
33
export * from './default';
44
export * from './data-as-json-string.decorator';
5+
export * from './session';
6+
export * from './client-metadata';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './session.decorator';
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
2+
import { plainToClass } from 'class-transformer';
3+
import { Session } from 'src/common/models';
4+
5+
export const sessionFromRequestFactory = (data: unknown, ctx: ExecutionContext): Session => {
6+
const request = ctx.switchToHttp().getRequest();
7+
8+
return plainToClass(Session, request.session);
9+
};
10+
11+
export const SessionFromRequest = createParamDecorator(sessionFromRequestFactory);

0 commit comments

Comments
 (0)