@w3-commons/js-build-resources 0.0.1-security → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @w3-commons/js-build-resources might be problematic. Click here for more details.
- package/package.json +9 -3
- package/settings-service/.eslintrc.js +4 -0
- package/settings-service/.node-version +1 -0
- package/settings-service/.prettierrc +6 -0
- package/settings-service/.whitesource +15 -0
- package/settings-service/LICENSE +4 -0
- package/settings-service/README.md +50 -0
- package/settings-service/build.yml +56 -0
- package/settings-service/collectCodeCoverage.js +9 -0
- package/settings-service/db/cassandra/Dockerfile +3 -0
- package/settings-service/db/cassandra/createkeyspace.dev.cql +4 -0
- package/settings-service/db/cassandra/createkeyspace.dev.sh +3 -0
- package/settings-service/db/cassandra/schema_001.cql +15 -0
- package/settings-service/db/cassandra/schema_002.cql +8 -0
- package/settings-service/db/cassandra/schema_003.cql +10 -0
- package/settings-service/db/cassandra/schema_004.cql +1 -0
- package/settings-service/db/cassandra/schema_005.cql +39 -0
- package/settings-service/db/cassandra/schema_006.cql +255 -0
- package/settings-service/db/cassandra/schema_007.cql +40 -0
- package/settings-service/db/cassandra/schema_008.cql +2 -0
- package/settings-service/db/cassandra/schema_009.cql +143 -0
- package/settings-service/db/cassandra/schema_010.cql +143 -0
- package/settings-service/db/cassandra/schema_011.cql +2 -0
- package/settings-service/db/cassandra/schema_012.cql +8 -0
- package/settings-service/jest.config.fn.js +3 -0
- package/settings-service/jest.config.it.js +3 -0
- package/settings-service/jest.config.js +14 -0
- package/settings-service/jest.config.unit.js +19 -0
- package/settings-service/jest.setup.js +11 -0
- package/settings-service/package-lock.json +11772 -0
- package/settings-service/package.json +101 -0
- package/settings-service/scripts/run-fn-tests.sh +3 -0
- package/settings-service/sonar-project.properties +3 -0
- package/settings-service/src/__tests__/functional/controller/ApiKeyController.fn.ts +132 -0
- package/settings-service/src/__tests__/functional/middleware/AuthMiddlewareNextGenSSO.fn.ts +82 -0
- package/settings-service/src/__tests__/functional/repo/settingsRepo.fn.ts +302 -0
- package/settings-service/src/__tests__/functional/unified-profile/unified-profile.fn.ts +66 -0
- package/settings-service/src/__tests__/integration/repo/ApiKeyRepo.it.ts +43 -0
- package/settings-service/src/__tests__/integration/repo/settingsRepo.it.ts +142 -0
- package/settings-service/src/__tests__/integration/unified-profile/unified-profile.it.ts +31 -0
- package/settings-service/src/__tests__/unit/ErrResponse.ts +4 -0
- package/settings-service/src/__tests__/unit/JWTResponse.ts +18 -0
- package/settings-service/src/__tests__/unit/bluepagesResponse.ts +25 -0
- package/settings-service/src/__tests__/unit/controller/ApiKeyController.spec.ts +217 -0
- package/settings-service/src/__tests__/unit/controller/AppSettingsController.spec.ts +133 -0
- package/settings-service/src/__tests__/unit/controller/UserSettingsController.spec.ts +328 -0
- package/settings-service/src/__tests__/unit/controller/getAllSettings.spec.ts +83 -0
- package/settings-service/src/__tests__/unit/middleware/AuthMiddlewareNextGenSSO.spec.ts +282 -0
- package/settings-service/src/__tests__/unit/middleware/AuthenticationMiddleware.spec.ts +494 -0
- package/settings-service/src/__tests__/unit/repo/ApiKeyRepo.spec.ts +194 -0
- package/settings-service/src/__tests__/unit/repo/getAllSettings.spec.ts +100 -0
- package/settings-service/src/__tests__/unit/repo/getUserSettingsRepo.spec.ts +249 -0
- package/settings-service/src/__tests__/unit/repo/settingsRepo.spec.ts +614 -0
- package/settings-service/src/__tests__/unit/unified-profile/UnifiedProfileClient.spec.ts +31 -0
- package/settings-service/src/__tests__/unit/unified-profile/unifiedProfileUtils.spec.ts +36 -0
- package/settings-service/src/__tests__/utils/test-utils.ts +41 -0
- package/settings-service/src/config/config.ts +190 -0
- package/settings-service/src/controller/ApiKeyController.ts +114 -0
- package/settings-service/src/controller/AppSettingsController.ts +137 -0
- package/settings-service/src/controller/UserSettingsController.ts +202 -0
- package/settings-service/src/helpers/commons.ts +69 -0
- package/settings-service/src/logger/logger.ts +17 -0
- package/settings-service/src/middleware/AuthenticationMiddleware.ts +486 -0
- package/settings-service/src/middleware/AuthenticationMiddlewareFactory.ts +10 -0
- package/settings-service/src/repo/ApiKeyRepo.ts +135 -0
- package/settings-service/src/repo/ApiKeyRepoFactory.ts +10 -0
- package/settings-service/src/repo/CassandraClient.ts +33 -0
- package/settings-service/src/repo/CassandraClientFactory.ts +11 -0
- package/settings-service/src/repo/apiKeyQueries.ts +64 -0
- package/settings-service/src/repo/cassandraDBHelpers.ts +119 -0
- package/settings-service/src/repo/settingsRepo.ts +388 -0
- package/settings-service/src/repo/settingsRepoFactory.ts +10 -0
- package/settings-service/src/repo/settingsRepoQueries.ts +62 -0
- package/settings-service/src/routes/apiKeyRoutes.ts +27 -0
- package/settings-service/src/routes/appSettingsRoutes.ts +30 -0
- package/settings-service/src/routes/healthCheck.ts +10 -0
- package/settings-service/src/routes/swagger.ts +8 -0
- package/settings-service/src/routes/userSettingsRoutes.ts +30 -0
- package/settings-service/src/server.ts +77 -0
- package/settings-service/src/swagger.json +732 -0
- package/settings-service/src/types/ApiKey.ts +19 -0
- package/settings-service/src/types/IRequest.ts +9 -0
- package/settings-service/src/types/IRequestAuthorization.ts +5 -0
- package/settings-service/src/types/IRouteOptions.ts +5 -0
- package/settings-service/src/types/QueryResultsTypes.ts +6 -0
- package/settings-service/src/types/UserSettingsControllerTypes.ts +5 -0
- package/settings-service/src/types/W3IdUser.ts +36 -0
- package/settings-service/src/types/settingsRepoTypes.ts +61 -0
- package/settings-service/src/types/unifiedProfileTypes.ts +10 -0
- package/settings-service/src/unified-profile/UnifiedProfileClient.ts +29 -0
- package/settings-service/src/unified-profile/UnifiedProfileClientFactory.ts +10 -0
- package/settings-service/src/unified-profile/unifiedProfileUtils.ts +22 -0
- package/settings-service/src/util/downloadCassandra.ts +34 -0
- package/settings-service/src/util/isocodeMapper.ts +22 -0
- package/settings-service/src/util/languages.ts +1457 -0
- package/settings-service/test_resources/mockApiKeyDBResult.json +8 -0
- package/settings-service/tsconfig.json +40 -0
- package/README.md +0 -5
@@ -0,0 +1,19 @@
|
|
1
|
+
export class ApiKey {
|
2
|
+
public readonly appId: string;
|
3
|
+
|
4
|
+
public readonly key: string;
|
5
|
+
|
6
|
+
public readonly createdBy: string;
|
7
|
+
|
8
|
+
public readonly createdDate: Date;
|
9
|
+
|
10
|
+
public readonly updatedDate: Date;
|
11
|
+
|
12
|
+
constructor(appId: string, key: string, createdBy: string, createdDate: Date, updatedDate: Date) {
|
13
|
+
this.appId = appId;
|
14
|
+
this.key = key;
|
15
|
+
this.createdBy = createdBy;
|
16
|
+
this.createdDate = createdDate;
|
17
|
+
this.updatedDate = updatedDate;
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
export interface W3IdTenantId {
|
2
|
+
tenantId?: string;
|
3
|
+
}
|
4
|
+
|
5
|
+
interface W3IdUser {
|
6
|
+
at_hash?: string;
|
7
|
+
lastName?: string;
|
8
|
+
sub?: string;
|
9
|
+
realmName?: string;
|
10
|
+
uniqueSecurityName?: string;
|
11
|
+
iss?: string;
|
12
|
+
dn?: string;
|
13
|
+
preferred_username?: string;
|
14
|
+
token_type?: string;
|
15
|
+
client_id?: string;
|
16
|
+
uid?: string;
|
17
|
+
acr?: string;
|
18
|
+
emailAddress?: string;
|
19
|
+
blueGroups?: string[];
|
20
|
+
grant_type?: string;
|
21
|
+
restrictEntitlements?: boolean;
|
22
|
+
scope?: string;
|
23
|
+
exp?: number;
|
24
|
+
app_id?: string;
|
25
|
+
iat?: number;
|
26
|
+
ext?: W3IdTenantId;
|
27
|
+
active?: boolean;
|
28
|
+
cn?: string;
|
29
|
+
aud?: string | string[];
|
30
|
+
firstName?: string;
|
31
|
+
grant_id?: string;
|
32
|
+
userType?: string;
|
33
|
+
category?: string;
|
34
|
+
}
|
35
|
+
|
36
|
+
export default W3IdUser;
|
@@ -0,0 +1,61 @@
|
|
1
|
+
export type UserSettings = {
|
2
|
+
[key: string]: string | null | Array<string | null>;
|
3
|
+
};
|
4
|
+
|
5
|
+
export interface UserSettingsDBRow {
|
6
|
+
user_id: string;
|
7
|
+
app_id: string;
|
8
|
+
setting_name: string;
|
9
|
+
setting_value: string;
|
10
|
+
}
|
11
|
+
|
12
|
+
export type DeprecatedValues = {
|
13
|
+
[key: string]: string;
|
14
|
+
};
|
15
|
+
export interface AppSettings {
|
16
|
+
default?: string | null;
|
17
|
+
options: string[];
|
18
|
+
setting_type: string | null;
|
19
|
+
deprecated_values: DeprecatedValues | null;
|
20
|
+
}
|
21
|
+
|
22
|
+
export interface AppSettingsConfigDBRow {
|
23
|
+
app_id: string;
|
24
|
+
setting_name: string;
|
25
|
+
setting_options: string[];
|
26
|
+
setting_type: string;
|
27
|
+
setting_default: string | null;
|
28
|
+
deprecated_values: string | null;
|
29
|
+
}
|
30
|
+
|
31
|
+
export type AppSettingsResponse = {
|
32
|
+
[key: string]: AppSettings;
|
33
|
+
};
|
34
|
+
|
35
|
+
export interface FetchAndMapLanguagesArgs {
|
36
|
+
userId: string;
|
37
|
+
appId: string;
|
38
|
+
result: UserSettings;
|
39
|
+
filter: AppSettingsResponse;
|
40
|
+
settingsDBRows: UserSettingsDBRow[];
|
41
|
+
}
|
42
|
+
export interface UpdateAppSettingsArgs {
|
43
|
+
appId: string;
|
44
|
+
settingName: string;
|
45
|
+
settingDefault?: string | null;
|
46
|
+
settingOptions: string[];
|
47
|
+
settingType?: string | null;
|
48
|
+
deprecatedValues?: string | null;
|
49
|
+
}
|
50
|
+
|
51
|
+
export interface BatchQuery {
|
52
|
+
query: string;
|
53
|
+
params: string[];
|
54
|
+
}
|
55
|
+
|
56
|
+
export interface GetAllSettingsOptions {
|
57
|
+
pageState?: string;
|
58
|
+
appId?: string;
|
59
|
+
settingName?: string;
|
60
|
+
fetchSize: number;
|
61
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import axios, { AxiosInstance } from 'axios';
|
2
|
+
import { logger } from '../logger/logger';
|
3
|
+
import { ProfileResponse, ResponseFormat } from '../types/unifiedProfileTypes';
|
4
|
+
|
5
|
+
export default class UnifiedProfileClient {
|
6
|
+
public readonly client: AxiosInstance;
|
7
|
+
|
8
|
+
constructor() {
|
9
|
+
this.client = axios.create({
|
10
|
+
baseURL: 'https://unified-profile-api.us-south-k8s.intranet.ibm.com/v3',
|
11
|
+
});
|
12
|
+
}
|
13
|
+
|
14
|
+
public async getProfile(userId: string): Promise<ProfileResponse | undefined> {
|
15
|
+
try {
|
16
|
+
const response = await this.client.get(`/profiles/${userId}/profile`, {
|
17
|
+
params: {
|
18
|
+
format: ResponseFormat.MASTER,
|
19
|
+
},
|
20
|
+
});
|
21
|
+
return response.data;
|
22
|
+
} catch (error) {
|
23
|
+
logger.debug(
|
24
|
+
`${UnifiedProfileClient.name} | ${this.getProfile.name}() | Error fetching information from Unified Profile: ${error} `,
|
25
|
+
);
|
26
|
+
return undefined;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import UnifiedProfileClient from './UnifiedProfileClient';
|
2
|
+
|
3
|
+
export class UnifiedProfileClientFactory {
|
4
|
+
private static singleton: UnifiedProfileClient;
|
5
|
+
|
6
|
+
static accessOrCreateSingleton(): UnifiedProfileClient {
|
7
|
+
this.singleton = this.singleton || new UnifiedProfileClient();
|
8
|
+
return this.singleton;
|
9
|
+
}
|
10
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { logger } from '../logger/logger';
|
2
|
+
import { UnifiedProfileClientFactory } from './UnifiedProfileClientFactory';
|
3
|
+
import { ProfileResponse } from '../types/unifiedProfileTypes';
|
4
|
+
|
5
|
+
const CLASS_NAME = 'unifiedProfileUtils';
|
6
|
+
|
7
|
+
/**
|
8
|
+
* This method fetches user profile from Unified Profile
|
9
|
+
*
|
10
|
+
* @param userId
|
11
|
+
*
|
12
|
+
*/
|
13
|
+
export async function getUnifiedProfile(userId: string): Promise<ProfileResponse | undefined> {
|
14
|
+
const client = UnifiedProfileClientFactory.accessOrCreateSingleton();
|
15
|
+
const profile = await client.getProfile(userId);
|
16
|
+
if (profile) {
|
17
|
+
logger.debug(
|
18
|
+
`${CLASS_NAME} | ${getUnifiedProfile.name}() | pulled profile from Unified Profile service for user: ${userId}`,
|
19
|
+
);
|
20
|
+
}
|
21
|
+
return profile;
|
22
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import axios from 'axios';
|
2
|
+
import fs from 'fs';
|
3
|
+
import http from 'axios/lib/adapters/http';
|
4
|
+
import { settings } from '../config/config';
|
5
|
+
import { CassandraClientFactory } from '../repo/CassandraClientFactory';
|
6
|
+
import { logger } from '../logger/logger';
|
7
|
+
|
8
|
+
axios.defaults.adapter = http;
|
9
|
+
|
10
|
+
export async function downloadCassandra(): Promise<void> {
|
11
|
+
if (process.env.NODE_ENV === 'dev') return;
|
12
|
+
if (fs.existsSync(settings.cassandraCertsFilePath)) return;
|
13
|
+
await new Promise<void>((resolve, reject) => {
|
14
|
+
axios.get(settings.cassandraCertsURL, { responseType: 'stream' }).then(
|
15
|
+
(response) => {
|
16
|
+
const stream = response.data.pipe(fs.createWriteStream(settings.cassandraCertsFilePath));
|
17
|
+
stream.on('finish', async () => {
|
18
|
+
stream.close();
|
19
|
+
try {
|
20
|
+
const cassandraClient = CassandraClientFactory.accessOrCreateSingleton();
|
21
|
+
await cassandraClient.connect();
|
22
|
+
} catch (err) {
|
23
|
+
logger.error('Error connecting to Cassandra client', err);
|
24
|
+
}
|
25
|
+
resolve();
|
26
|
+
});
|
27
|
+
},
|
28
|
+
(err) => {
|
29
|
+
logger.error('Error fetching Datastax connection file', err);
|
30
|
+
reject(err);
|
31
|
+
},
|
32
|
+
);
|
33
|
+
});
|
34
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { logger } from '../logger/logger';
|
2
|
+
|
3
|
+
export function reverseMapFullNameToIsoCode(
|
4
|
+
fullName: string,
|
5
|
+
map: { [isoCode: string]: { people: string | string[] } },
|
6
|
+
): string | null {
|
7
|
+
for (const [k, v] of Object.entries(map)) {
|
8
|
+
if (typeof v.people === 'string') {
|
9
|
+
if (v.people === fullName) {
|
10
|
+
return k;
|
11
|
+
}
|
12
|
+
} else {
|
13
|
+
for (const language of v.people) {
|
14
|
+
if (language === fullName) {
|
15
|
+
return k;
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
logger.error(`isocode not found for key ${fullName}, returning null | ${reverseMapFullNameToIsoCode.name}`);
|
21
|
+
return null;
|
22
|
+
}
|