scanoss 0.21.1 → 0.22.0
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.
- package/CHANGELOG.md +16 -4
- package/build/main/cli/bin/cli-bin.js +37 -1
- package/build/main/cli/commands/components.d.ts +1 -0
- package/build/main/cli/commands/components.js +98 -0
- package/build/main/cli/commands/scan.js +8 -3
- package/build/main/index.d.ts +6 -0
- package/build/main/index.js +9 -1
- package/build/main/sdk/BaseConfig.d.ts +5 -1
- package/build/main/sdk/BaseConfig.js +6 -2
- package/build/main/sdk/Clients/Components/ComponentsGRPCClient.d.ts +13 -0
- package/build/main/sdk/Clients/Components/ComponentsGRPCClient.js +33 -0
- package/build/main/sdk/Clients/Components/ComponentsHttpClient.d.ts +37 -0
- package/build/main/sdk/Clients/Components/ComponentsHttpClient.js +122 -0
- package/build/main/sdk/Clients/Components/IComponentsClient.d.ts +71 -0
- package/build/main/sdk/Clients/Components/IComponentsClient.js +3 -0
- package/build/main/sdk/Clients/Cryptography/CryptographyGRPCClient.d.ts +3 -0
- package/build/main/sdk/Clients/Cryptography/CryptographyGRPCClient.js +4 -1
- package/build/main/sdk/Clients/Cryptography/CryptographyHttpClient.d.ts +22 -3
- package/build/main/sdk/Clients/Cryptography/CryptographyHttpClient.js +28 -12
- package/build/main/sdk/Clients/Dependency/DependencyGRPCClient.d.ts +3 -0
- package/build/main/sdk/Clients/Dependency/DependencyGRPCClient.js +4 -1
- package/build/main/sdk/Clients/Dependency/DependencyHttpClient.d.ts +22 -3
- package/build/main/sdk/Clients/Dependency/DependencyHttpClient.js +27 -13
- package/build/main/sdk/Clients/Grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.d.ts +81 -0
- package/build/main/sdk/Clients/Grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.js +160 -0
- package/build/main/sdk/Clients/Grpc/scanoss/api/components/v2/scanoss-components_pb.d.ts +1 -0
- package/build/main/sdk/Clients/Grpc/scanoss/api/components/v2/scanoss-components_pb.js +2313 -0
- package/build/main/sdk/Clients/Transport/Transport.d.ts +4 -4
- package/build/main/sdk/Clients/Vulnerability/VulnerabilityHttpClient.d.ts +2 -3
- package/build/main/sdk/Clients/Vulnerability/VulnerabilityHttpClient.js +7 -13
- package/build/main/sdk/Clients/http/HttpClient.d.ts +8 -16
- package/build/main/sdk/Clients/http/HttpClient.js +4 -1
- package/build/main/sdk/Clients/interfaces/ClientConfig.d.ts +8 -9
- package/build/main/sdk/Clients/interfaces/ClientConfig.js +1 -7
- package/build/main/sdk/Components/ComponentsScanner.d.ts +34 -0
- package/build/main/sdk/Components/ComponentsScanner.js +123 -0
- package/build/main/sdk/Components/ComponentsScannerCfg.d.ts +21 -0
- package/build/main/sdk/Components/ComponentsScannerCfg.js +54 -0
- package/build/main/sdk/Cryptography/Algorithm/Components/ComponentAlgorithmScanner.js +12 -6
- package/build/main/sdk/Cryptography/CryptoCfg.js +8 -11
- package/build/main/sdk/Cryptography/Hint/Components/ComponentHintScanner.js +12 -6
- package/build/main/sdk/Dependencies/DependencyScanner.js +13 -4
- package/build/main/sdk/Dependencies/DependencyScannerCfg.js +8 -11
- package/build/main/sdk/Vulnerability/VulnerabilityCfg.js +8 -11
- package/build/main/sdk/Vulnerability/VulnerabilityScanner.js +11 -2
- package/build/main/sdk/scanner/ScannerCfg.js +10 -11
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/module/cli/bin/cli-bin.js +37 -1
- package/build/module/cli/commands/components.d.ts +1 -0
- package/build/module/cli/commands/components.js +92 -0
- package/build/module/cli/commands/scan.js +8 -3
- package/build/module/index.d.ts +6 -0
- package/build/module/index.js +9 -1
- package/build/module/sdk/BaseConfig.d.ts +5 -1
- package/build/module/sdk/BaseConfig.js +6 -2
- package/build/module/sdk/Clients/Components/ComponentsGRPCClient.d.ts +13 -0
- package/build/module/sdk/Clients/Components/ComponentsGRPCClient.js +29 -0
- package/build/module/sdk/Clients/Components/ComponentsHttpClient.d.ts +37 -0
- package/build/module/sdk/Clients/Components/ComponentsHttpClient.js +118 -0
- package/build/module/sdk/Clients/Components/IComponentsClient.d.ts +71 -0
- package/build/module/sdk/Clients/Components/IComponentsClient.js +2 -0
- package/build/module/sdk/Clients/Cryptography/CryptographyGRPCClient.d.ts +3 -0
- package/build/module/sdk/Clients/Cryptography/CryptographyGRPCClient.js +4 -1
- package/build/module/sdk/Clients/Cryptography/CryptographyHttpClient.d.ts +22 -3
- package/build/module/sdk/Clients/Cryptography/CryptographyHttpClient.js +28 -14
- package/build/module/sdk/Clients/Dependency/DependencyGRPCClient.d.ts +3 -0
- package/build/module/sdk/Clients/Dependency/DependencyGRPCClient.js +4 -1
- package/build/module/sdk/Clients/Dependency/DependencyHttpClient.d.ts +22 -3
- package/build/module/sdk/Clients/Dependency/DependencyHttpClient.js +27 -15
- package/build/module/sdk/Clients/Grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.d.ts +81 -0
- package/build/module/sdk/Clients/Grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.js +160 -0
- package/build/module/sdk/Clients/Grpc/scanoss/api/components/v2/scanoss-components_pb.d.ts +1 -0
- package/build/module/sdk/Clients/Grpc/scanoss/api/components/v2/scanoss-components_pb.js +2313 -0
- package/build/module/sdk/Clients/Transport/Transport.d.ts +4 -4
- package/build/module/sdk/Clients/Vulnerability/VulnerabilityHttpClient.d.ts +2 -3
- package/build/module/sdk/Clients/Vulnerability/VulnerabilityHttpClient.js +7 -15
- package/build/module/sdk/Clients/http/HttpClient.d.ts +8 -16
- package/build/module/sdk/Clients/http/HttpClient.js +4 -1
- package/build/module/sdk/Clients/interfaces/ClientConfig.d.ts +8 -9
- package/build/module/sdk/Clients/interfaces/ClientConfig.js +2 -6
- package/build/module/sdk/Components/ComponentsScanner.d.ts +34 -0
- package/build/module/sdk/Components/ComponentsScanner.js +119 -0
- package/build/module/sdk/Components/ComponentsScannerCfg.d.ts +21 -0
- package/build/module/sdk/Components/ComponentsScannerCfg.js +50 -0
- package/build/module/sdk/Cryptography/Algorithm/Components/ComponentAlgorithmScanner.js +12 -6
- package/build/module/sdk/Cryptography/CryptoCfg.js +8 -11
- package/build/module/sdk/Cryptography/Hint/Components/ComponentHintScanner.js +12 -6
- package/build/module/sdk/Dependencies/DependencyScanner.js +13 -4
- package/build/module/sdk/Dependencies/DependencyScannerCfg.js +8 -11
- package/build/module/sdk/Vulnerability/VulnerabilityCfg.js +8 -11
- package/build/module/sdk/Vulnerability/VulnerabilityScanner.js +11 -2
- package/build/module/sdk/scanner/ScannerCfg.js +10 -11
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import FormData from 'form-data';
|
|
2
2
|
export declare abstract class Transport<T1> {
|
|
3
|
-
abstract get(url: string): Promise<T1>;
|
|
4
|
-
abstract post(url: string, body: FormData): Promise<T1>;
|
|
5
|
-
abstract put(url: string, body: FormData): Promise<T1>;
|
|
6
|
-
abstract delete(url: string): Promise<T1>;
|
|
3
|
+
protected abstract get(url: string): Promise<T1>;
|
|
4
|
+
protected abstract post(url: string, body: FormData): Promise<T1>;
|
|
5
|
+
protected abstract put(url: string, body: FormData): Promise<T1>;
|
|
6
|
+
protected abstract delete(url: string): Promise<T1>;
|
|
7
7
|
}
|
|
@@ -2,10 +2,9 @@ import { HttpClient } from "../http/HttpClient";
|
|
|
2
2
|
import { IVulnerabilityClient } from "./IVulnerabilityClient";
|
|
3
3
|
import { Component } from "../../types/common/types";
|
|
4
4
|
import { ComponentsVulnerabilitiesResponse, ComponentVulnerabilityResponse } from "../../types/vulnerability/types";
|
|
5
|
+
import { ClientConfig } from "../interfaces/ClientConfig";
|
|
5
6
|
export declare class VulnerabilityHttpClient extends HttpClient implements IVulnerabilityClient {
|
|
6
|
-
|
|
7
|
-
private readonly baseUrl;
|
|
8
|
-
constructor(token: string, hostName: string, ignoreCertErrors?: boolean, proxyHost?: string, caCertPath?: string);
|
|
7
|
+
constructor(clientConfig: ClientConfig);
|
|
9
8
|
getVulnerabilitiesComponents(components: Array<Component>): Promise<ComponentsVulnerabilitiesResponse>;
|
|
10
9
|
getVulnerabilitiesComponent(component: Component): Promise<ComponentVulnerabilityResponse>;
|
|
11
10
|
}
|
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
import { HttpClient } from "../http/HttpClient";
|
|
2
2
|
import { logger } from "../../Logger";
|
|
3
3
|
export class VulnerabilityHttpClient extends HttpClient {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
constructor(token, hostName, ignoreCertErrors = false, proxyHost, caCertPath) {
|
|
7
|
-
super();
|
|
8
|
-
this.client = new HttpClient({
|
|
9
|
-
HOST_URL: hostName,
|
|
10
|
-
API_KEY: token,
|
|
11
|
-
HTTPS_PROXY: proxyHost,
|
|
12
|
-
CA_CERT: caCertPath,
|
|
13
|
-
IGNORE_CERT_ERRORS: ignoreCertErrors
|
|
14
|
-
});
|
|
15
|
-
this.baseUrl = hostName;
|
|
4
|
+
constructor(clientConfig) {
|
|
5
|
+
super(clientConfig);
|
|
16
6
|
}
|
|
17
7
|
async getVulnerabilitiesComponents(components) {
|
|
18
8
|
try {
|
|
9
|
+
const baseURL = this.hostURL();
|
|
19
10
|
logger.debug(`Getting vulnerabilities for ${components.map((c) => JSON.stringify(c, null, 2))} components`);
|
|
20
|
-
const response = await this.
|
|
11
|
+
const response = await this.post(`${baseURL}/v2/vulnerabilities/components`, { components: components });
|
|
21
12
|
if (response.ok) {
|
|
22
13
|
return await response.json();
|
|
23
14
|
}
|
|
@@ -31,12 +22,13 @@ export class VulnerabilityHttpClient extends HttpClient {
|
|
|
31
22
|
}
|
|
32
23
|
async getVulnerabilitiesComponent(component) {
|
|
33
24
|
try {
|
|
25
|
+
const baseURL = this.hostURL();
|
|
34
26
|
const queryParams = new URLSearchParams();
|
|
35
27
|
queryParams.append('purl', component.purl);
|
|
36
28
|
if (component.requirement) {
|
|
37
29
|
queryParams.append('requirement', component.requirement);
|
|
38
30
|
}
|
|
39
|
-
const response = await this.
|
|
31
|
+
const response = await this.get(`${baseURL}/api/v2/vulnerabilities/component?${queryParams.toString()}`);
|
|
40
32
|
if (response.ok) {
|
|
41
33
|
return await response.json();
|
|
42
34
|
}
|
|
@@ -49,4 +41,4 @@ export class VulnerabilityHttpClient extends HttpClient {
|
|
|
49
41
|
}
|
|
50
42
|
}
|
|
51
43
|
}
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVnVsbmVyYWJpbGl0eUh0dHBDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2RrL0NsaWVudHMvVnVsbmVyYWJpbGl0eS9WdWxuZXJhYmlsaXR5SHR0cENsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUt0QyxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsVUFBVTtJQUVyRCxZQUFZLFlBQTBCO1FBQ3BDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLFVBQTRCO1FBQ3BFLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekcsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxnQ0FBZ0MsRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3pHLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNoQixPQUFPLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBdUMsQ0FBQztZQUNwRSxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxZQUFZLEdBQUcsa0NBQWtDLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsTUFBTSxTQUFTLEVBQUUsQ0FBQztZQUMvRyxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLDJCQUEyQixDQUFDLFNBQW9CO1FBQzNELElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixNQUFNLFdBQVcsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLHFDQUFxQyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFHLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNoQixPQUFPLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBb0MsQ0FBQztZQUNqRSxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxZQUFZLEdBQUcsa0NBQWtDLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsTUFBTSxTQUFTLEVBQUUsQ0FBQztZQUMvRyxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
import { Response } from 'node-fetch';
|
|
2
2
|
import { Transport } from '../Transport/Transport';
|
|
3
3
|
import FormData from 'form-data';
|
|
4
|
-
|
|
5
|
-
PAC_PROXY?: string;
|
|
6
|
-
API_KEY?: string;
|
|
7
|
-
NO_PROXY?: string;
|
|
8
|
-
HTTP_PROXY?: string;
|
|
9
|
-
HTTPS_PROXY?: string;
|
|
10
|
-
IGNORE_CERT_ERRORS?: boolean;
|
|
11
|
-
CA_CERT?: string;
|
|
12
|
-
HOST_URL: string;
|
|
13
|
-
}
|
|
4
|
+
import { ClientConfig } from "../interfaces/ClientConfig";
|
|
14
5
|
export declare class HttpClient extends Transport<Response> {
|
|
15
6
|
private readonly proxyAgent;
|
|
16
|
-
protected cfg:
|
|
17
|
-
constructor(cfg?:
|
|
7
|
+
protected cfg: ClientConfig;
|
|
8
|
+
constructor(cfg?: ClientConfig);
|
|
18
9
|
private init;
|
|
19
|
-
get(url: string): Promise<Response>;
|
|
20
|
-
post(url: string, body: any): Promise<Response>;
|
|
21
|
-
delete(url: string): Promise<Response>;
|
|
22
|
-
put(url: string, body: FormData): Promise<Response>;
|
|
10
|
+
protected get(url: string): Promise<Response>;
|
|
11
|
+
protected post(url: string, body: any): Promise<Response>;
|
|
12
|
+
protected delete(url: string): Promise<Response>;
|
|
13
|
+
protected put(url: string, body: FormData): Promise<Response>;
|
|
23
14
|
protected handleError(error: unknown, context: string): Error;
|
|
15
|
+
protected hostURL(): string;
|
|
24
16
|
}
|
|
@@ -78,5 +78,8 @@ export class HttpClient extends Transport {
|
|
|
78
78
|
}
|
|
79
79
|
return new Error(`${context}: Unknown error occurred`);
|
|
80
80
|
}
|
|
81
|
+
hostURL() {
|
|
82
|
+
return this.cfg.HOST_URL;
|
|
83
|
+
}
|
|
81
84
|
}
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cENsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvQ2xpZW50cy9odHRwL0h0dHBDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFtQixNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFLMUMsTUFBTSxPQUFPLFVBQVcsU0FBUSxTQUFtQjtJQUU5QixVQUFVLENBQWE7SUFDOUIsR0FBRyxDQUFlO0lBRTVCLFlBQVksR0FBa0I7UUFDNUIsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8sSUFBSTtRQUNWLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRztZQUNwQixVQUFVLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsVUFBVSxJQUFJLEVBQUU7WUFDakQsV0FBVyxFQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLFdBQVcsSUFBSSxFQUFFO1lBQ3BELFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxD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
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
export declare enum Protocol {
|
|
2
|
-
REST = "REST",
|
|
3
|
-
GRPC = "GRPC"
|
|
4
|
-
}
|
|
5
1
|
export interface ClientConfig {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
PAC_PROXY?: string;
|
|
3
|
+
API_KEY?: string;
|
|
4
|
+
NO_PROXY?: string;
|
|
5
|
+
HTTP_PROXY?: string;
|
|
6
|
+
HTTPS_PROXY?: string;
|
|
7
|
+
IGNORE_CERT_ERRORS?: boolean;
|
|
8
|
+
CA_CERT?: string;
|
|
9
|
+
HOST_URL: string;
|
|
11
10
|
}
|
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
Protocol["REST"] = "REST";
|
|
4
|
-
Protocol["GRPC"] = "GRPC";
|
|
5
|
-
})(Protocol || (Protocol = {}));
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpZW50Q29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9DbGllbnRzL2ludGVyZmFjZXMvQ2xpZW50Q29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLFFBR1g7QUFIRCxXQUFZLFFBQVE7SUFDbEIseUJBQWEsQ0FBQTtJQUNiLHlCQUFhLENBQUE7QUFDZixDQUFDLEVBSFcsUUFBUSxLQUFSLFFBQVEsUUFHbkIifQ==
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpZW50Q29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9DbGllbnRzL2ludGVyZmFjZXMvQ2xpZW50Q29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ComponentsScannerCfg } from './ComponentsScannerCfg';
|
|
2
|
+
import { ComponentSearchRequest, ComponentSearchResponse, ComponentVersionRequest, ComponentVersionResponse, ComponentStatisticResponse } from "../Clients/Components/IComponentsClient";
|
|
3
|
+
import { Component } from "../types/common/types";
|
|
4
|
+
export declare class ComponentsScanner {
|
|
5
|
+
private componentsClient;
|
|
6
|
+
private config;
|
|
7
|
+
constructor(cfg?: ComponentsScannerCfg);
|
|
8
|
+
/**
|
|
9
|
+
* Search for components based on search criteria
|
|
10
|
+
* @param searchRequest - Component search parameters
|
|
11
|
+
* @returns Promise<ComponentSearchResponse>
|
|
12
|
+
*/
|
|
13
|
+
searchComponents(searchRequest: ComponentSearchRequest): Promise<ComponentSearchResponse>;
|
|
14
|
+
/**
|
|
15
|
+
* Get version information for a specific component
|
|
16
|
+
* @param versionRequest - Component version request parameters
|
|
17
|
+
* @returns Promise<ComponentVersionResponse>
|
|
18
|
+
*/
|
|
19
|
+
getComponentVersions(versionRequest: ComponentVersionRequest): Promise<ComponentVersionResponse>;
|
|
20
|
+
/**
|
|
21
|
+
* Get statistics for multiple components
|
|
22
|
+
* @param components - Array of components to get statistics for
|
|
23
|
+
* @returns Promise<ComponentStatisticResponse>
|
|
24
|
+
*/
|
|
25
|
+
getComponentStatistics(components: Component[]): Promise<ComponentStatisticResponse>;
|
|
26
|
+
/**
|
|
27
|
+
* Search for a component by name and optionally get its versions and statistics
|
|
28
|
+
* @param componentName - Name of the component to search for
|
|
29
|
+
* @param includeVersions - Whether to include version information
|
|
30
|
+
* @param includeStatistics - Whether to include statistics
|
|
31
|
+
* @returns Combined component information
|
|
32
|
+
*/
|
|
33
|
+
getComponentInfo(componentName: string, includeVersions?: boolean, includeStatistics?: boolean): Promise<any>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { ComponentsScannerCfg } from './ComponentsScannerCfg';
|
|
2
|
+
import { logger } from "../Logger";
|
|
3
|
+
import { ComponentsHttpClient } from "../Clients/Components/ComponentsHttpClient";
|
|
4
|
+
import { ComponentsGRPCClient } from "../Clients/Components/ComponentsGRPCClient";
|
|
5
|
+
export class ComponentsScanner {
|
|
6
|
+
componentsClient;
|
|
7
|
+
config = new ComponentsScannerCfg();
|
|
8
|
+
constructor(cfg) {
|
|
9
|
+
if (cfg)
|
|
10
|
+
this.config = cfg;
|
|
11
|
+
else
|
|
12
|
+
this.config = new ComponentsScannerCfg();
|
|
13
|
+
// Initialize the appropriate client based on configuration
|
|
14
|
+
if (this.config.USE_GRPC) {
|
|
15
|
+
this.componentsClient = new ComponentsGRPCClient(this.config.API_KEY, this.config.API_URL, this.config.GRPC_PROXY, this.config.CA_CERT);
|
|
16
|
+
logger.log('Using gRPC client for components service');
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const clientCfg = {
|
|
20
|
+
API_KEY: this.config.API_KEY,
|
|
21
|
+
HTTP_PROXY: this.config.HTTP_PROXY,
|
|
22
|
+
HTTPS_PROXY: this.config.HTTPS_PROXY,
|
|
23
|
+
NO_PROXY: this.config.NO_PROXY,
|
|
24
|
+
CA_CERT: this.config.CA_CERT,
|
|
25
|
+
IGNORE_CERT_ERRORS: this.config.IGNORE_CERT_ERRORS,
|
|
26
|
+
HOST_URL: this.config.API_URL, // Only map the one that differs. TODO: Migrate to HOST URL on v1 version
|
|
27
|
+
};
|
|
28
|
+
this.componentsClient = new ComponentsHttpClient(clientCfg);
|
|
29
|
+
logger.log('Using HTTP client for components service');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Search for components based on search criteria
|
|
34
|
+
* @param searchRequest - Component search parameters
|
|
35
|
+
* @returns Promise<ComponentSearchResponse>
|
|
36
|
+
*/
|
|
37
|
+
async searchComponents(searchRequest) {
|
|
38
|
+
try {
|
|
39
|
+
logger.log(`Searching for components with criteria: ${JSON.stringify(searchRequest)}`);
|
|
40
|
+
const response = await this.componentsClient.searchComponents(searchRequest);
|
|
41
|
+
logger.log(`Found ${response.components.length} components`);
|
|
42
|
+
return response;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger.log('Error searching components:', error);
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get version information for a specific component
|
|
51
|
+
* @param versionRequest - Component version request parameters
|
|
52
|
+
* @returns Promise<ComponentVersionResponse>
|
|
53
|
+
*/
|
|
54
|
+
async getComponentVersions(versionRequest) {
|
|
55
|
+
try {
|
|
56
|
+
logger.log(`Getting component versions for purl: ${versionRequest.purl}`);
|
|
57
|
+
const response = await this.componentsClient.getComponentVersions(versionRequest);
|
|
58
|
+
logger.log(`Found ${response.component.versions.length} versions for component`);
|
|
59
|
+
return response;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.log('Error getting component versions:', error);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get statistics for multiple components
|
|
68
|
+
* @param components - Array of components to get statistics for
|
|
69
|
+
* @returns Promise<ComponentStatisticResponse>
|
|
70
|
+
*/
|
|
71
|
+
async getComponentStatistics(components) {
|
|
72
|
+
try {
|
|
73
|
+
logger.log(`Getting statistics for ${components.length} components`);
|
|
74
|
+
const response = await this.componentsClient.getComponentStatistics(components);
|
|
75
|
+
logger.log(`Retrieved statistics for ${response.purls.length} components`);
|
|
76
|
+
return response;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
logger.log('Error getting component statistics:', error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Search for a component by name and optionally get its versions and statistics
|
|
85
|
+
* @param componentName - Name of the component to search for
|
|
86
|
+
* @param includeVersions - Whether to include version information
|
|
87
|
+
* @param includeStatistics - Whether to include statistics
|
|
88
|
+
* @returns Combined component information
|
|
89
|
+
*/
|
|
90
|
+
async getComponentInfo(componentName, includeVersions = false, includeStatistics = false) {
|
|
91
|
+
try {
|
|
92
|
+
// First search for the component
|
|
93
|
+
const searchResponse = await this.searchComponents({ search: componentName, limit: 1 });
|
|
94
|
+
if (searchResponse.components.length === 0) {
|
|
95
|
+
throw new Error(`No component found with name: ${componentName}`);
|
|
96
|
+
}
|
|
97
|
+
const component = searchResponse.components[0];
|
|
98
|
+
const result = {
|
|
99
|
+
component: component,
|
|
100
|
+
versions: null,
|
|
101
|
+
statistics: null
|
|
102
|
+
};
|
|
103
|
+
if (includeVersions) {
|
|
104
|
+
const versionsResponse = await this.getComponentVersions({ purl: component.purl });
|
|
105
|
+
result.versions = versionsResponse.component.versions;
|
|
106
|
+
}
|
|
107
|
+
if (includeStatistics) {
|
|
108
|
+
const statsResponse = await this.getComponentStatistics([{ purl: component.purl }]);
|
|
109
|
+
result.statistics = statsResponse.purls[0]?.statistics || null;
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
logger.log('Error getting component info:', error);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50c1NjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2RrL0NvbXBvbmVudHMvQ29tcG9uZW50c1NjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQVlsRixNQUFNLE9BQU8saUJBQWlCO0lBRXBCLGdCQUFnQixDQUFvQjtJQUNwQyxNQUFNLEdBQXlCLElBQUksb0JBQW9CLEVBQUUsQ0FBQztJQUVsRSxZQUFZLEdBQTBCO1FBQ3BDLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDOztZQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUU5QywyREFBMkQ7UUFDM0QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLG9CQUFvQixDQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDcEIsQ0FBQztZQUNGLE1BQU0sQ0FBQyxHQUFHLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sU0FBUyxHQUFpQjtnQkFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDNUIsVUFBVSxFQUFFLElB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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BaseConfig } from "../BaseConfig";
|
|
2
|
+
export declare class ComponentsScannerCfg extends BaseConfig {
|
|
3
|
+
_API_KEY: string;
|
|
4
|
+
_USE_GRPC: boolean;
|
|
5
|
+
constructor(config?: ComponentsScannerCfg);
|
|
6
|
+
get API_KEY(): string;
|
|
7
|
+
set API_KEY(value: string);
|
|
8
|
+
get USE_GRPC(): boolean;
|
|
9
|
+
set USE_GRPC(value: boolean);
|
|
10
|
+
/**
|
|
11
|
+
* Resolves the appropriate scanner URL based on API key presence and current URL.
|
|
12
|
+
* If an API key is provided and the current URL is the default, returns the premium
|
|
13
|
+
* scanner URL, otherwise removes '/scan/direct' suffix from the URL.
|
|
14
|
+
* @param apiKey - The API key (if any)
|
|
15
|
+
* @param currentUrl - The current API URL
|
|
16
|
+
* @returns The resolved scanner URL
|
|
17
|
+
*/
|
|
18
|
+
protected resolveApiUrl(apiKey: string, currentUrl: string): string;
|
|
19
|
+
get API_URL(): string;
|
|
20
|
+
set API_URL(url: string);
|
|
21
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { BaseConfig } from "../BaseConfig";
|
|
2
|
+
export class ComponentsScannerCfg extends BaseConfig {
|
|
3
|
+
_API_KEY = '';
|
|
4
|
+
_USE_GRPC = false;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
super(config);
|
|
7
|
+
if (config) {
|
|
8
|
+
this.API_KEY = config.API_KEY ? config.API_KEY : '';
|
|
9
|
+
this.USE_GRPC = config.USE_GRPC !== undefined ? config.USE_GRPC : false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
get API_KEY() {
|
|
13
|
+
return this._API_KEY;
|
|
14
|
+
}
|
|
15
|
+
set API_KEY(value) {
|
|
16
|
+
this._API_KEY = value;
|
|
17
|
+
}
|
|
18
|
+
get USE_GRPC() {
|
|
19
|
+
return this._USE_GRPC;
|
|
20
|
+
}
|
|
21
|
+
set USE_GRPC(value) {
|
|
22
|
+
this._USE_GRPC = value;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolves the appropriate scanner URL based on API key presence and current URL.
|
|
26
|
+
* If an API key is provided and the current URL is the default, returns the premium
|
|
27
|
+
* scanner URL, otherwise removes '/scan/direct' suffix from the URL.
|
|
28
|
+
* @param apiKey - The API key (if any)
|
|
29
|
+
* @param currentUrl - The current API URL
|
|
30
|
+
* @returns The resolved scanner URL
|
|
31
|
+
*/
|
|
32
|
+
resolveApiUrl(apiKey, currentUrl) {
|
|
33
|
+
// Case 1: Has API key and using default URL -> upgrade to premium URL
|
|
34
|
+
if (apiKey && currentUrl === BaseConfig.getDefaultURL())
|
|
35
|
+
return BaseConfig.getPremiumURL();
|
|
36
|
+
// Case 2: Has API key and using custom URL -> keep custom URL but remove /scan/direct
|
|
37
|
+
if (apiKey && (currentUrl.startsWith(BaseConfig.getPremiumURL()) || currentUrl.startsWith(BaseConfig.getDefaultURL()))) {
|
|
38
|
+
return currentUrl.replace(/\/scan\/direct$/, '');
|
|
39
|
+
}
|
|
40
|
+
// Case 3: No API key -> use default URL
|
|
41
|
+
return BaseConfig.getDefaultURL();
|
|
42
|
+
}
|
|
43
|
+
get API_URL() {
|
|
44
|
+
return this.resolveApiUrl(this.API_KEY, super.API_URL);
|
|
45
|
+
}
|
|
46
|
+
set API_URL(url) {
|
|
47
|
+
super.API_URL = url;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50c1NjYW5uZXJDZmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2RrL0NvbXBvbmVudHMvQ29tcG9uZW50c1NjYW5uZXJDZmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsVUFBVTtJQUVsRCxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBQ3RCLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFFM0IsWUFBWSxNQUE2QjtRQUN2QyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDZCxJQUFHLE1BQU0sRUFBQyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzFFLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFhO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQWM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxhQUFhLENBQUMsTUFBYyxFQUFFLFVBQWtCO1FBQ3hELHNFQUFzRTtRQUN0RSxJQUFJLE1BQU0sSUFBSSxVQUFVLEtBQUssVUFBVSxDQUFDLGFBQWEsRUFBRTtZQUNyRCxPQUFPLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVwQyxzRkFBc0Y7UUFDdEYsSUFBSSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ3RILE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLE9BQU8sVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQVc7UUFDckIsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDdEIsQ0FBQztDQUNGIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseCryptographyScanner } from "../../BaseCryptographyScanner";
|
|
2
|
-
import {
|
|
2
|
+
import { CryptographyHttpClient } from "../../../Clients/Cryptography/CryptographyHttpClient";
|
|
3
3
|
/**
|
|
4
4
|
* Scanner for detecting cryptographic algorithms in software components.
|
|
5
5
|
* This class extends the base cryptography scanner to specifically handle
|
|
@@ -14,13 +14,19 @@ export class ComponentAlgorithmScanner extends BaseCryptographyScanner {
|
|
|
14
14
|
* @returns {AlgorithmResponse} A promise that resolves to an AlgorithmResponse containing detected cryptographic algorithms.
|
|
15
15
|
*/
|
|
16
16
|
async scan(components) {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const clientCfg = {
|
|
18
|
+
API_KEY: this.config.API_KEY,
|
|
19
|
+
HTTP_PROXY: this.config.HTTP_PROXY,
|
|
20
|
+
HTTPS_PROXY: this.config.HTTPS_PROXY,
|
|
21
|
+
NO_PROXY: this.config.NO_PROXY,
|
|
22
|
+
CA_CERT: this.config.CA_CERT,
|
|
23
|
+
IGNORE_CERT_ERRORS: this.config.IGNORE_CERT_ERRORS,
|
|
24
|
+
HOST_URL: this.config.API_URL, // Only map the one that differs. TODO: Migrate to HOST URL on v1 version
|
|
25
|
+
};
|
|
26
|
+
const cryptographyClient = new CryptographyHttpClient(clientCfg);
|
|
21
27
|
const results = await cryptographyClient.getAlgorithms(components);
|
|
22
28
|
this.resultCollector.collectAlgorithmResults(results);
|
|
23
29
|
return results;
|
|
24
30
|
}
|
|
25
31
|
}
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50QWxnb3JpdGhtU2Nhbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvQ3J5cHRvZ3JhcGh5L0FsZ29yaXRobS9Db21wb25lbnRzL0NvbXBvbmVudEFsZ29yaXRobVNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHeEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFJOUY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyx5QkFDWCxTQUFRLHVCQUdZO0lBRXBCOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBdUI7UUFDdkMsTUFBTSxTQUFTLEdBQWlCO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO1lBQ3BDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUM1QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUNsRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUseUVBQXlFO1NBQ3pHLENBQUM7UUFDRixNQUFNLGtCQUFrQixHQUFHLElBQUksc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsTUFBTSxPQUFPLEdBQXFCLE1BQU0sa0JBQWtCLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIn0=
|
|
@@ -23,19 +23,16 @@ export class CryptoCfg extends BaseConfig {
|
|
|
23
23
|
* @returns The resolved API URL
|
|
24
24
|
*/
|
|
25
25
|
resolveApiUrl(apiKey, currentUrl) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// Case 2: Has API key and using custom URL -> keep custom URL
|
|
30
|
-
if (apiKey && currentUrl.startsWith(BaseConfig.getPremiumURL()) || currentUrl.startsWith(BaseConfig.getDefaultURL())) {
|
|
31
|
-
// Check if custom URL is not the same as the default one.
|
|
32
|
-
if (currentUrl.startsWith(BaseConfig.getPremiumURL()) || currentUrl.startsWith(BaseConfig.getDefaultURL())) {
|
|
33
|
-
return currentUrl.replace(/\/scan\/direct$/, '');
|
|
26
|
+
if (!apiKey) {
|
|
27
|
+
if (currentUrl !== BaseConfig.getDefaultURL()) {
|
|
28
|
+
return currentUrl;
|
|
34
29
|
}
|
|
35
30
|
return currentUrl;
|
|
36
31
|
}
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
if (currentUrl !== BaseConfig.getDefaultURL() && currentUrl !== BaseConfig.getPremiumURL()) {
|
|
33
|
+
return currentUrl;
|
|
34
|
+
}
|
|
35
|
+
return BaseConfig.getPremiumURL();
|
|
39
36
|
}
|
|
40
37
|
get API_URL() {
|
|
41
38
|
return this.resolveApiUrl(this.API_KEY, super.API_URL);
|
|
@@ -44,4 +41,4 @@ export class CryptoCfg extends BaseConfig {
|
|
|
44
41
|
super.API_URL = value;
|
|
45
42
|
}
|
|
46
43
|
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3J5cHRvQ2ZnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Nkay9DcnlwdG9ncmFwaHkvQ3J5cHRvQ2ZnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBVSxTQUFRLFVBQVU7SUFFckIsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUVyQyxvQkFBb0IsQ0FBUztJQUU3QixrQkFBa0IsQ0FBUztJQUUzQixPQUFPLEdBQVcsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUV2QyxPQUFPLEdBQVcsRUFBRSxDQUFDO0lBRXJCLFlBQVksR0FBZTtRQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFFRjs7Ozs7OztPQU9HO0lBQ1EsYUFBYSxDQUFDLE1BQWMsRUFBRSxVQUFrQjtRQUN6RCxJQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLFVBQVUsS0FBSyxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDOUMsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLFVBQVUsS0FBSyxVQUFVLENBQUMsYUFBYSxFQUFFLElBQUksVUFBVSxLQUFLLFVBQVUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQzNGLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBVyxPQUFPLENBQUMsS0FBYTtRQUM5QixLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0NBRUgifQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseCryptographyScanner } from "../../BaseCryptographyScanner";
|
|
2
|
-
import {
|
|
2
|
+
import { CryptographyHttpClient } from "../../../Clients/Cryptography/CryptographyHttpClient";
|
|
3
3
|
/**
|
|
4
4
|
* Scanner for detecting cryptographic hints in software components.
|
|
5
5
|
* This class extends the base cryptography scanner to specifically handle
|
|
@@ -14,13 +14,19 @@ export class ComponentHintScanner extends BaseCryptographyScanner {
|
|
|
14
14
|
* @returns {HintsResponse} A promise that resolves to a HintsResponse containing detected cryptographic hints.
|
|
15
15
|
*/
|
|
16
16
|
async scan(req) {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const clientCfg = {
|
|
18
|
+
API_KEY: this.config.API_KEY,
|
|
19
|
+
HTTP_PROXY: this.config.HTTP_PROXY,
|
|
20
|
+
HTTPS_PROXY: this.config.HTTPS_PROXY,
|
|
21
|
+
NO_PROXY: this.config.NO_PROXY,
|
|
22
|
+
CA_CERT: this.config.CA_CERT,
|
|
23
|
+
IGNORE_CERT_ERRORS: this.config.IGNORE_CERT_ERRORS,
|
|
24
|
+
HOST_URL: this.config.API_URL, // Only map the one that differs. TODO: Migrate to HOST URL on v1 version
|
|
25
|
+
};
|
|
26
|
+
const cryptographyClient = new CryptographyHttpClient(clientCfg);
|
|
21
27
|
const results = await cryptographyClient.getEncryptionHints(req);
|
|
22
28
|
this.resultCollector.collectHintResults(results);
|
|
23
29
|
return results;
|
|
24
30
|
}
|
|
25
31
|
}
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50SGludFNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvc2RrL0NyeXB0b2dyYXBoeS9IaW50L0NvbXBvbmVudHMvQ29tcG9uZW50SGludFNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHeEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFJOUY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxvQkFDWCxTQUFRLHVCQUdlO0lBRXZCOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBZ0I7UUFDaEMsTUFBTSxTQUFTLEdBQWlCO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO1lBQ3BDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUM1QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUNsRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUseUVBQXlFO1NBQ3pHLENBQUM7UUFDRixNQUFNLGtCQUFrQixHQUFHLElBQUksc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiJ9
|
|
@@ -14,7 +14,16 @@ export class DependencyScanner {
|
|
|
14
14
|
this.config = cfg;
|
|
15
15
|
else
|
|
16
16
|
this.config = new DependencyScannerCfg();
|
|
17
|
-
|
|
17
|
+
const clientCfg = {
|
|
18
|
+
API_KEY: this.config.API_KEY,
|
|
19
|
+
HTTP_PROXY: this.config.HTTP_PROXY,
|
|
20
|
+
HTTPS_PROXY: this.config.HTTPS_PROXY,
|
|
21
|
+
NO_PROXY: this.config.NO_PROXY,
|
|
22
|
+
CA_CERT: this.config.CA_CERT,
|
|
23
|
+
IGNORE_CERT_ERRORS: this.config.IGNORE_CERT_ERRORS,
|
|
24
|
+
HOST_URL: this.config.API_URL, // Only map the one that differs. TODO: Migrate to HOST URL on v1 version
|
|
25
|
+
};
|
|
26
|
+
this.dependencyClient = new DependencyHttpClient(clientCfg);
|
|
18
27
|
this.localDependency = new LocalDependencies();
|
|
19
28
|
}
|
|
20
29
|
async scanFolder(path) {
|
|
@@ -67,12 +76,12 @@ export class DependencyScanner {
|
|
|
67
76
|
}
|
|
68
77
|
catch (e) {
|
|
69
78
|
logger.debug(`Error while scanning dependencies: ${JSON.stringify(request, null, 2)}`);
|
|
70
|
-
err = e
|
|
79
|
+
err = e;
|
|
71
80
|
failedRequests.push(request);
|
|
72
81
|
}
|
|
73
82
|
}
|
|
74
83
|
if (err) {
|
|
75
|
-
logger.error(
|
|
84
|
+
logger.error(err);
|
|
76
85
|
}
|
|
77
86
|
if (failedRequests.length > 0) {
|
|
78
87
|
overallStatus = { status: 'SUCCEEDED WITH WARNINGS', message: 'Warning: some dependencies were not scanned' };
|
|
@@ -164,4 +173,4 @@ export class DependencyScanner {
|
|
|
164
173
|
}
|
|
165
174
|
}
|
|
166
175
|
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwZW5kZW5jeVNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2RrL0RlcGVuZGVuY2llcy9EZXBlbmRlbmN5U2Nhbm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFVbEYsTUFBTSxPQUFPLGlCQUFpQjtJQUNwQixlQUFlLENBQW9CO0lBRW5DLGdCQUFnQixDQUFvQjtJQUVwQyxNQUFNLEdBQXlCLElBQUksb0JBQW9CLEVBQUUsQ0FBQztJQUVsRSxZQUFZLEdBQTBCO1FBQ3BDLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDOztZQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUU5QyxNQUFNLFNBQVMsR0FBaUI7WUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUM1QixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO1lBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7WUFDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQzVCLGtCQUFrQixFQUFFLElB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
|