Skip to content

Commit 629956c

Browse files
authored
Merge pull request #2332 from RedisInsight/feature/RI-4617-sign-in-users
#RI-4617 - Sign users in
2 parents 8c6dd1a + a4bce89 commit 629956c

File tree

537 files changed

+19531
-2285
lines changed

Some content is hidden

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

537 files changed

+19531
-2285
lines changed

.circleci/config.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,16 @@ jobs:
565565
exit 0;
566566
fi
567567
568+
export RI_CLOUD_IDP_AUTHORIZE_URL=$RI_CLOUD_IDP_AUTHORIZE_URL_STAGE
569+
export RI_CLOUD_IDP_TOKEN_URL=$RI_CLOUD_IDP_TOKEN_URL_STAGE
570+
export RI_CLOUD_IDP_ISSUER=$RI_CLOUD_IDP_ISSUER_STAGE
571+
export RI_CLOUD_IDP_CLIENT_ID=$RI_CLOUD_IDP_CLIENT_ID_STAGE
572+
export RI_CLOUD_IDP_REDIRECT_URI=$RI_CLOUD_IDP_REDIRECT_URI_STAGE
573+
export RI_CLOUD_IDP_GOOGLE_ID=$RI_CLOUD_IDP_GOOGLE_ID_STAGE
574+
export RI_CLOUD_IDP_GH_ID=$RI_CLOUD_IDP_GH_ID_STAGE
575+
export RI_CLOUD_API_URL=$RI_CLOUD_API_URL_STAGE
576+
export RI_CLOUD_CAPI_URL=$RI_CLOUD_CAPI_URL_STAGE
577+
568578
if [ << parameters.env >> == 'stage' ]; then
569579
UPGRADES_LINK=$UPGRADES_LINK_STAGE SEGMENT_WRITE_KEY=$SEGMENT_WRITE_KEY_STAGE yarn package:stage
570580
exit 0;
@@ -641,6 +651,15 @@ jobs:
641651
exit 0;
642652
fi
643653
654+
export RI_CLOUD_IDP_AUTHORIZE_URL=$RI_CLOUD_IDP_AUTHORIZE_URL_STAGE
655+
export RI_CLOUD_IDP_TOKEN_URL=$RI_CLOUD_IDP_TOKEN_URL_STAGE
656+
export RI_CLOUD_IDP_ISSUER=$RI_CLOUD_IDP_ISSUER_STAGE
657+
export RI_CLOUD_IDP_CLIENT_ID=$RI_CLOUD_IDP_CLIENT_ID_STAGE
658+
export RI_CLOUD_IDP_REDIRECT_URI=$RI_CLOUD_IDP_REDIRECT_URI_STAGE
659+
export RI_CLOUD_IDP_GOOGLE_ID=$RI_CLOUD_IDP_GOOGLE_ID_STAGE
660+
export RI_CLOUD_IDP_GH_ID=$RI_CLOUD_IDP_GH_ID_STAGE
661+
export RI_CLOUD_API_URL=$RI_CLOUD_API_URL_STAGE
662+
644663
if [ << parameters.env >> == 'stage' ]; then
645664
UPGRADES_LINK=$UPGRADES_LINK_STAGE SEGMENT_WRITE_KEY=$SEGMENT_WRITE_KEY_STAGE yarn package:stage && yarn package:mas
646665
rm -rf release/mac
@@ -697,6 +716,15 @@ jobs:
697716
exit 0;
698717
fi
699718
719+
export RI_CLOUD_IDP_AUTHORIZE_URL=$RI_CLOUD_IDP_AUTHORIZE_URL_STAGE
720+
export RI_CLOUD_IDP_TOKEN_URL=$RI_CLOUD_IDP_TOKEN_URL_STAGE
721+
export RI_CLOUD_IDP_ISSUER=$RI_CLOUD_IDP_ISSUER_STAGE
722+
export RI_CLOUD_IDP_CLIENT_ID=$RI_CLOUD_IDP_CLIENT_ID_STAGE
723+
export RI_CLOUD_IDP_REDIRECT_URI=$RI_CLOUD_IDP_REDIRECT_URI_STAGE
724+
export RI_CLOUD_IDP_GOOGLE_ID=$RI_CLOUD_IDP_GOOGLE_ID_STAGE
725+
export RI_CLOUD_IDP_GH_ID=$RI_CLOUD_IDP_GH_ID_STAGE
726+
export RI_CLOUD_API_URL=$RI_CLOUD_API_URL_STAGE
727+
700728
if [ << parameters.env >> == 'stage' ]; then
701729
UPGRADES_LINK=$UPGRADES_LINK_STAGE SEGMENT_WRITE_KEY=$SEGMENT_WRITE_KEY_STAGE yarn package:stage
702730
rm -rf release/win-unpacked

configs/webpack.config.main.prod.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ export default merge(baseConfig, {
6969
CONNECTIONS_TIMEOUT_DEFAULT: 'CONNECTIONS_TIMEOUT_DEFAULT' in process.env
7070
? process.env.CONNECTIONS_TIMEOUT_DEFAULT
7171
: toString(30 * 1000), // 30 sec
72+
// cloud auth
73+
RI_CLOUD_IDP_AUTHORIZE_URL: 'RI_CLOUD_IDP_AUTHORIZE_URL' in process.env ? process.env.RI_CLOUD_IDP_AUTHORIZE_URL: '',
74+
RI_CLOUD_IDP_TOKEN_URL: 'RI_CLOUD_IDP_TOKEN_URL' in process.env ? process.env.RI_CLOUD_IDP_TOKEN_URL: '',
75+
RI_CLOUD_IDP_ISSUER: 'RI_CLOUD_IDP_ISSUER' in process.env ? process.env.RI_CLOUD_IDP_ISSUER: '',
76+
RI_CLOUD_IDP_CLIENT_ID: 'RI_CLOUD_IDP_CLIENT_ID' in process.env ? process.env.RI_CLOUD_IDP_CLIENT_ID: '',
77+
RI_CLOUD_IDP_REDIRECT_URI: 'RI_CLOUD_IDP_REDIRECT_URI' in process.env ? process.env.RI_CLOUD_IDP_REDIRECT_URI: '',
78+
RI_CLOUD_IDP_GOOGLE_ID: 'RI_CLOUD_IDP_GOOGLE_ID' in process.env ? process.env.RI_CLOUD_IDP_GOOGLE_ID: '',
79+
RI_CLOUD_IDP_GH_ID: 'RI_CLOUD_IDP_GH_ID' in process.env ? process.env.RI_CLOUD_IDP_GH_ID: '',
80+
RI_CLOUD_API_URL: 'RI_CLOUD_API_URL' in process.env ? process.env.RI_CLOUD_API_URL: '',
81+
RI_CLOUD_CAPI_URL: 'RI_CLOUD_CAPI_URL' in process.env ? process.env.RI_CLOUD_CAPI_URL: '',
7282
}),
7383

7484
new webpack.DefinePlugin({

electron-builder.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
"node_modules/sqlite3",
1616
"node_modules/cpu-features"
1717
],
18+
"protocols": [{
19+
"name": "RedisInsight",
20+
"role": "Viewer",
21+
"schemes": ["redisinsight"]
22+
}
23+
],
1824
"mac": {
1925
"target": [
2026
{

jest.config.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { TextDecoder, TextEncoder } = require('util');
1+
const { TextDecoder, TextEncoder } = require('util')
22

33
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
44
module.exports = {
@@ -54,10 +54,10 @@ module.exports = {
5454
],
5555
coverageThreshold: {
5656
global: {
57-
statements: 78,
58-
branches: 61,
59-
functions: 70,
60-
lines: 79,
57+
statements: 80,
58+
branches: 63,
59+
functions: 72,
60+
lines: 80,
6161
},
6262
// './redisinsight/ui/src/slices/**/*.ts': {
6363
// statements: 90,
@@ -67,4 +67,4 @@ module.exports = {
6767
TextDecoder,
6868
TextEncoder,
6969
},
70-
};
70+
}

redisinsight/api/.eslintrc.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,12 @@ module.exports = {
1818
parserOptions: {
1919
project: './tsconfig.json',
2020
},
21+
overrides: [
22+
{
23+
files: [ '**/*.spec.ts' ],
24+
rules: {
25+
'no-duplicate-string': 'off',
26+
}
27+
}
28+
]
2129
};

redisinsight/api/config/default.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { join } from 'path';
22
import * as os from 'os';
3+
import { RequestMethod } from '@nestjs/common';
4+
import { version } from '../package.json';
35

46
const homedir = join(__dirname, '..');
57

@@ -38,6 +40,7 @@ export default {
3840
clientCertificates: join(homedir, 'client_certificates'),
3941
},
4042
server: {
43+
version,
4144
env: 'development',
4245
listenInterface: process.env.RI_HOSTNAME ?? '0.0.0.0',
4346
port: 5000,
@@ -72,11 +75,6 @@ export default {
7275
synchronize: process.env.DB_SYNC ? process.env.DB_SYNC === 'true' : false,
7376
migrationsRun: process.env.DB_MIGRATIONS ? process.env.DB_MIGRATIONS === 'true' : true,
7477
},
75-
redis_cloud: {
76-
url: process.env.REDIS_CLOUD_URL || 'https://api-cloudapi.qa.redislabs.com/v1',
77-
cloudDiscoveryTimeout: parseInt(process.env.RI_CLOUD_DISCOVERY_TIMEOUT, 10) || 60 * 1000, // 1 min
78-
cloudDatabaseConnectionTimeout: parseInt(process.env.RI_CLOUD_DATABASE_CONNECTION_TIMEOUT, 10) || 30 * 1000,
79-
},
8078
redis_clients: {
8179
idleSyncInterval: parseInt(process.env.CLIENTS_IDLE_SYNC_INTERVAL, 10) || 1000 * 60 * 60, // 1hr
8280
maxIdleThreshold: parseInt(process.env.CLIENTS_MAX_IDLE_THRESHOLD, 10) || 1000 * 60 * 60, // 1hr
@@ -216,4 +214,33 @@ export default {
216214
|| 'https://raw.githubusercontent.com/RedisInsight/RedisInsight/main/redisinsight/api/config/features-config.json',
217215
syncInterval: parseInt(process.env.RI_FEATURES_CONFIG_SYNC_INTERVAL, 10) || 1_000 * 60 * 60 * 4, // 4h
218216
},
217+
cloud: {
218+
apiUrl: process.env.RI_CLOUD_API_URL || 'https://app-sm.k8s-cloudapi.sm-qa.qa.redislabs.com/api/v1',
219+
capiUrl: process.env.RI_CLOUD_CAPI_URL || 'https://api-k8s-cloudapi.qa.redislabs.com/v1',
220+
capiKeyName: process.env.RI_CLOUD_CAPI_KEY_NAME || 'RedisInsight',
221+
freeSubscriptionName: process.env.RI_CLOUD_FREE_SUBSCRIPTION_NAME || 'My free subscription',
222+
freeDatabaseName: process.env.RI_CLOUD_FREE_DATABASE_NAME || 'Redis-Stack-in-Redis-Enterprise-Cloud',
223+
defaultPlanRegion: process.env.RI_CLOUD_DEFAULT_PLAN_REGION || 'eu-west-1',
224+
jobIterationInterval: parseInt(process.env.RI_CLOUD_JOB_ITERATION_INTERVAL, 10) || 10_000, // 10 sec
225+
discoveryTimeout: parseInt(process.env.RI_CLOUD_DISCOVERY_TIMEOUT, 10) || 60 * 1000, // 1 min
226+
databaseConnectionTimeout: parseInt(process.env.RI_CLOUD_DATABASE_CONNECTION_TIMEOUT, 10) || 30 * 1000,
227+
idp: {
228+
google: {
229+
authorizeUrl: process.env.RI_CLOUD_IDP_GOOGLE_AUTHORIZE_URL || process.env.RI_CLOUD_IDP_AUTHORIZE_URL,
230+
tokenUrl: process.env.RI_CLOUD_IDP_GOOGLE_TOKEN_URL || process.env.RI_CLOUD_IDP_TOKEN_URL,
231+
issuer: process.env.RI_CLOUD_IDP_GOOGLE_ISSUER || process.env.RI_CLOUD_IDP_ISSUER,
232+
clientId: process.env.RI_CLOUD_IDP_GOOGLE_CLIENT_ID || process.env.RI_CLOUD_IDP_CLIENT_ID,
233+
redirectUri: process.env.RI_CLOUD_IDP_GOOGLE_REDIRECT_URI || process.env.RI_CLOUD_IDP_REDIRECT_URI,
234+
idp: process.env.RI_CLOUD_IDP_GOOGLE_ID,
235+
},
236+
github: {
237+
authorizeUrl: process.env.RI_CLOUD_IDP_GH_AUTHORIZE_URL || process.env.RI_CLOUD_IDP_AUTHORIZE_URL,
238+
tokenUrl: process.env.RI_CLOUD_IDP_GH_TOKEN_URL || process.env.RI_CLOUD_IDP_TOKEN_URL,
239+
issuer: process.env.RI_CLOUD_IDP_GH_ISSUER || process.env.RI_CLOUD_IDP_ISSUER,
240+
clientId: process.env.RI_CLOUD_IDP_GH_CLIENT_ID || process.env.RI_CLOUD_IDP_CLIENT_ID,
241+
redirectUri: process.env.RI_CLOUD_IDP_GH_REDIRECT_URI || process.env.RI_CLOUD_IDP_REDIRECT_URI,
242+
idp: process.env.RI_CLOUD_IDP_GH_ID,
243+
},
244+
},
245+
},
219246
};

redisinsight/api/config/features-config.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,33 @@
1616
"cond": "eq"
1717
}
1818
]
19+
},
20+
"cloudSso": {
21+
"flag": true,
22+
"perc": [[0,100]],
23+
"filters": [
24+
{
25+
"name": "config.server.buildType",
26+
"value": "ELECTRON",
27+
"cond": "eq"
28+
}
29+
],
30+
"data": {
31+
"selectPlan": {
32+
"components": {
33+
"triggersAndFunctions": [
34+
{
35+
"provider": "AWS",
36+
"regions": ["ap-southeast-1"]
37+
},
38+
{
39+
"provider": "GCP",
40+
"regions": ["asia-northeast1"]
41+
}
42+
]
43+
}
44+
}
45+
}
1946
}
2047
}
2148
}

redisinsight/api/config/ormconfig.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ import { BrowserHistoryEntity } from 'src/modules/browser/entities/browser-histo
1717
import { CustomTutorialEntity } from 'src/modules/custom-tutorial/entities/custom-tutorial.entity';
1818
import { FeatureEntity } from 'src/modules/feature/entities/feature.entity';
1919
import { FeaturesConfigEntity } from 'src/modules/feature/entities/features-config.entity';
20-
import { CloudDatabaseDetailsEntity } from 'src/modules/cloud/autodiscovery/entities/cloud-database-details.entity';
20+
import { CloudDatabaseDetailsEntity } from 'src/modules/cloud/database/entities/cloud-database-details.entity';
2121
import migrations from '../migration';
2222
import * as config from '../src/utils/config';
23+
import { CloudCapiKeyEntity } from 'src/modules/cloud/capi-key/entity/cloud-capi-key.entity';
2324

2425
const dbConfig = config.get('db');
2526

@@ -46,6 +47,7 @@ const ormConfig = {
4647
FeatureEntity,
4748
FeaturesConfigEntity,
4849
CloudDatabaseDetailsEntity,
50+
CloudCapiKeyEntity,
4951
],
5052
migrations,
5153
};

redisinsight/api/config/production.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export default {
3030
db: {
3131
database: join(homedir, 'redisinsight.db'),
3232
},
33-
redis_cloud: {
34-
url: process.env.REDIS_CLOUD_URL || 'https://api.redislabs.com/v1',
33+
cloud: {
34+
cApiUrl: process.env.RI_CLOUD_CAPI_URL || 'https://api.redislabs.com/v1',
3535
},
3636
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { MigrationInterface, QueryRunner } from "typeorm";
2+
3+
export class FreeCloudDatabase1688989337247 implements MigrationInterface {
4+
name = 'FreeCloudDatabase1688989337247'
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`CREATE TABLE "temporary_database_cloud_details" ("id" varchar PRIMARY KEY NOT NULL, "cloudId" integer NOT NULL, "subscriptionType" varchar NOT NULL, "planMemoryLimit" integer, "memoryLimitMeasurementUnit" integer, "databaseId" varchar, "free" boolean DEFAULT (0), CONSTRAINT "REL_f41ee5027391b3be8ad95e3d15" UNIQUE ("databaseId"), CONSTRAINT "FK_f41ee5027391b3be8ad95e3d158" FOREIGN KEY ("databaseId") REFERENCES "database_instance" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)`);
8+
await queryRunner.query(`INSERT INTO "temporary_database_cloud_details"("id", "cloudId", "subscriptionType", "planMemoryLimit", "memoryLimitMeasurementUnit", "databaseId") SELECT "id", "cloudId", "subscriptionType", "planMemoryLimit", "memoryLimitMeasurementUnit", "databaseId" FROM "database_cloud_details"`);
9+
await queryRunner.query(`DROP TABLE "database_cloud_details"`);
10+
await queryRunner.query(`ALTER TABLE "temporary_database_cloud_details" RENAME TO "database_cloud_details"`);
11+
}
12+
13+
public async down(queryRunner: QueryRunner): Promise<void> {
14+
await queryRunner.query(`ALTER TABLE "database_cloud_details" RENAME TO "temporary_database_cloud_details"`);
15+
await queryRunner.query(`CREATE TABLE "database_cloud_details" ("id" varchar PRIMARY KEY NOT NULL, "cloudId" integer NOT NULL, "subscriptionType" varchar NOT NULL, "planMemoryLimit" integer, "memoryLimitMeasurementUnit" integer, "databaseId" varchar, CONSTRAINT "REL_f41ee5027391b3be8ad95e3d15" UNIQUE ("databaseId"), CONSTRAINT "FK_f41ee5027391b3be8ad95e3d158" FOREIGN KEY ("databaseId") REFERENCES "database_instance" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)`);
16+
await queryRunner.query(`INSERT INTO "database_cloud_details"("id", "cloudId", "subscriptionType", "planMemoryLimit", "memoryLimitMeasurementUnit", "databaseId") SELECT "id", "cloudId", "subscriptionType", "planMemoryLimit", "memoryLimitMeasurementUnit", "databaseId" FROM "temporary_database_cloud_details"`);
17+
await queryRunner.query(`DROP TABLE "temporary_database_cloud_details"`);
18+
}
19+
20+
}

0 commit comments

Comments
 (0)