scanoss 0.21.0 → 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 +21 -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/crypto.js +1 -1
- package/build/main/cli/commands/scan.js +9 -4
- package/build/main/index.d.ts +6 -0
- package/build/main/index.js +9 -1
- package/build/main/sdk/BaseConfig.d.ts +8 -4
- package/build/main/sdk/BaseConfig.js +12 -8
- 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 -12
- 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.d.ts +0 -3
- package/build/main/sdk/Dependencies/DependencyScannerCfg.js +8 -19
- package/build/main/sdk/Vulnerability/VulnerabilityCfg.js +8 -11
- package/build/main/sdk/Vulnerability/VulnerabilityScanner.js +11 -2
- package/build/main/sdk/scanner/ScannerCfg.d.ts +0 -1
- package/build/main/sdk/scanner/ScannerCfg.js +10 -13
- 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/crypto.js +1 -1
- package/build/module/cli/commands/scan.js +9 -4
- package/build/module/index.d.ts +6 -0
- package/build/module/index.js +9 -1
- package/build/module/sdk/BaseConfig.d.ts +8 -4
- package/build/module/sdk/BaseConfig.js +12 -8
- 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 -14
- 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.d.ts +0 -3
- package/build/module/sdk/Dependencies/DependencyScannerCfg.js +8 -19
- package/build/module/sdk/Vulnerability/VulnerabilityCfg.js +8 -11
- package/build/module/sdk/Vulnerability/VulnerabilityScanner.js +11 -2
- package/build/module/sdk/scanner/ScannerCfg.d.ts +0 -1
- package/build/module/sdk/scanner/ScannerCfg.js +10 -13
- 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, 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
|
}
|
|
@@ -4,20 +4,14 @@ exports.VulnerabilityHttpClient = void 0;
|
|
|
4
4
|
const HttpClient_1 = require("../http/HttpClient");
|
|
5
5
|
const Logger_1 = require("../../Logger");
|
|
6
6
|
class VulnerabilityHttpClient extends HttpClient_1.HttpClient {
|
|
7
|
-
constructor(
|
|
8
|
-
super();
|
|
9
|
-
this.client = new HttpClient_1.HttpClient({
|
|
10
|
-
HOST_URL: hostName,
|
|
11
|
-
API_KEY: token,
|
|
12
|
-
HTTPS_PROXY: proxyHost,
|
|
13
|
-
CA_CERT: caCertPath,
|
|
14
|
-
});
|
|
15
|
-
this.baseUrl = hostName;
|
|
7
|
+
constructor(clientConfig) {
|
|
8
|
+
super(clientConfig);
|
|
16
9
|
}
|
|
17
10
|
async getVulnerabilitiesComponents(components) {
|
|
18
11
|
try {
|
|
12
|
+
const baseURL = this.hostURL();
|
|
19
13
|
Logger_1.logger.debug(`Getting vulnerabilities for ${components.map((c) => JSON.stringify(c, null, 2))} components`);
|
|
20
|
-
const response = await this.
|
|
14
|
+
const response = await this.post(`${baseURL}/v2/vulnerabilities/components`, { components: components });
|
|
21
15
|
if (response.ok) {
|
|
22
16
|
return await response.json();
|
|
23
17
|
}
|
|
@@ -31,12 +25,13 @@ class VulnerabilityHttpClient extends HttpClient_1.HttpClient {
|
|
|
31
25
|
}
|
|
32
26
|
async getVulnerabilitiesComponent(component) {
|
|
33
27
|
try {
|
|
28
|
+
const baseURL = this.hostURL();
|
|
34
29
|
const queryParams = new URLSearchParams();
|
|
35
30
|
queryParams.append('purl', component.purl);
|
|
36
31
|
if (component.requirement) {
|
|
37
32
|
queryParams.append('requirement', component.requirement);
|
|
38
33
|
}
|
|
39
|
-
const response = await this.
|
|
34
|
+
const response = await this.get(`${baseURL}/api/v2/vulnerabilities/component?${queryParams.toString()}`);
|
|
40
35
|
if (response.ok) {
|
|
41
36
|
return await response.json();
|
|
42
37
|
}
|
|
@@ -50,4 +45,4 @@ class VulnerabilityHttpClient extends HttpClient_1.HttpClient {
|
|
|
50
45
|
}
|
|
51
46
|
}
|
|
52
47
|
exports.VulnerabilityHttpClient = VulnerabilityHttpClient;
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVnVsbmVyYWJpbGl0eUh0dHBDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2RrL0NsaWVudHMvVnVsbmVyYWJpbGl0eS9WdWxuZXJhYmlsaXR5SHR0cENsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBZ0Q7QUFFaEQseUNBQXNDO0FBS3RDLE1BQWEsdUJBQXdCLFNBQVEsdUJBQVU7SUFFckQsWUFBWSxZQUEwQjtRQUNwQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxVQUE0QjtRQUNwRSxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsZUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pHLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sZ0NBQWdDLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN6RyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQXVDLENBQUM7WUFDcEUsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLGtDQUFrQyxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLE1BQU0sU0FBUyxFQUFFLENBQUM7WUFDL0csTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsK0JBQStCLENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxTQUFvQjtRQUMzRCxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUMxQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzFCLFdBQVcsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxxQ0FBcUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQW9DLENBQUM7WUFDakUsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLGtDQUFrQyxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLE1BQU0sU0FBUyxFQUFFLENBQUM7WUFDL0csTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsK0JBQStCLENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBekNELDBEQXlDQyJ9
|
|
@@ -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
|
}
|
|
@@ -83,6 +83,9 @@ class HttpClient extends Transport_1.Transport {
|
|
|
83
83
|
}
|
|
84
84
|
return new Error(`${context}: Unknown error occurred`);
|
|
85
85
|
}
|
|
86
|
+
hostURL() {
|
|
87
|
+
return this.cfg.HOST_URL;
|
|
88
|
+
}
|
|
86
89
|
}
|
|
87
90
|
exports.HttpClient = HttpClient;
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cENsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvQ2xpZW50cy9odHRwL0h0dHBDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNERBQTZDO0FBQzdDLDZDQUF5QztBQUN6QyxzREFBbUQ7QUFDbkQsNkNBQTBDO0FBSzFDLE1BQWEsVUFBVyxTQUFRLHFCQUFtQjtJQUsvQyxZQUFZLEdBQWtCO1FBQzVCLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksd0JBQVUsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxJQUFJOztRQUNWLE1BQU0sT0FBTyxHQUFHLENBQUEsTUFBQSxJQUFJLENBQUMsR0FBRywwQ0FBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlFLE1BQU0sV0FBVyxHQUFHO1lBQ3BCLFVBQVUsRUFBRSxPQUFPLEtBQUksTUFBQSxJQUFJLENBQUMsR0FBRywwQ0FBRSxVQUFVLENBQUEsSUFBSSxFQUFFO1lBQ2pELFdBQVcsRUFBRyxPQUFPLEtBQUksTUFBQSxJQUFJLENBQUMsR0FBRywwQ0FBRSxXQUFXLENBQUEsSUFBSSxFQUFFO1lBQ3BELFFBQVEsRUFBRSxDQUFBLE1BQUEsSUFBSSxDQUFDLEdBQUcsMENBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxNQUFBLElBQUksQ0FBQyxHQUFHLDBDQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN4RCxPQUFPLEVBQUUsQ0FBQSxNQUFBLElBQUksQ0FBQyxHQUFHLDBDQUFFLE9BQU8sS0FBSSxJQUFJO1lBQ2xDLGtCQUFrQixF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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,9 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
var Protocol;
|
|
5
|
-
(function (Protocol) {
|
|
6
|
-
Protocol["REST"] = "REST";
|
|
7
|
-
Protocol["GRPC"] = "GRPC";
|
|
8
|
-
})(Protocol || (exports.Protocol = Protocol = {}));
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpZW50Q29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9DbGllbnRzL2ludGVyZmFjZXMvQ2xpZW50Q29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNsQix5QkFBYSxDQUFBO0lBQ2IseUJBQWEsQ0FBQTtBQUNmLENBQUMsRUFIVyxRQUFRLHdCQUFSLFFBQVEsUUFHbkIifQ==
|
|
3
|
+
//# 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,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ComponentsScanner = void 0;
|
|
4
|
+
const ComponentsScannerCfg_1 = require("./ComponentsScannerCfg");
|
|
5
|
+
const Logger_1 = require("../Logger");
|
|
6
|
+
const ComponentsHttpClient_1 = require("../Clients/Components/ComponentsHttpClient");
|
|
7
|
+
const ComponentsGRPCClient_1 = require("../Clients/Components/ComponentsGRPCClient");
|
|
8
|
+
class ComponentsScanner {
|
|
9
|
+
constructor(cfg) {
|
|
10
|
+
this.config = new ComponentsScannerCfg_1.ComponentsScannerCfg();
|
|
11
|
+
if (cfg)
|
|
12
|
+
this.config = cfg;
|
|
13
|
+
else
|
|
14
|
+
this.config = new ComponentsScannerCfg_1.ComponentsScannerCfg();
|
|
15
|
+
// Initialize the appropriate client based on configuration
|
|
16
|
+
if (this.config.USE_GRPC) {
|
|
17
|
+
this.componentsClient = new ComponentsGRPCClient_1.ComponentsGRPCClient(this.config.API_KEY, this.config.API_URL, this.config.GRPC_PROXY, this.config.CA_CERT);
|
|
18
|
+
Logger_1.logger.log('Using gRPC client for components service');
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const clientCfg = {
|
|
22
|
+
API_KEY: this.config.API_KEY,
|
|
23
|
+
HTTP_PROXY: this.config.HTTP_PROXY,
|
|
24
|
+
HTTPS_PROXY: this.config.HTTPS_PROXY,
|
|
25
|
+
NO_PROXY: this.config.NO_PROXY,
|
|
26
|
+
CA_CERT: this.config.CA_CERT,
|
|
27
|
+
IGNORE_CERT_ERRORS: this.config.IGNORE_CERT_ERRORS,
|
|
28
|
+
HOST_URL: this.config.API_URL, // Only map the one that differs. TODO: Migrate to HOST URL on v1 version
|
|
29
|
+
};
|
|
30
|
+
this.componentsClient = new ComponentsHttpClient_1.ComponentsHttpClient(clientCfg);
|
|
31
|
+
Logger_1.logger.log('Using HTTP client for components service');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Search for components based on search criteria
|
|
36
|
+
* @param searchRequest - Component search parameters
|
|
37
|
+
* @returns Promise<ComponentSearchResponse>
|
|
38
|
+
*/
|
|
39
|
+
async searchComponents(searchRequest) {
|
|
40
|
+
try {
|
|
41
|
+
Logger_1.logger.log(`Searching for components with criteria: ${JSON.stringify(searchRequest)}`);
|
|
42
|
+
const response = await this.componentsClient.searchComponents(searchRequest);
|
|
43
|
+
Logger_1.logger.log(`Found ${response.components.length} components`);
|
|
44
|
+
return response;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
Logger_1.logger.log('Error searching components:', error);
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get version information for a specific component
|
|
53
|
+
* @param versionRequest - Component version request parameters
|
|
54
|
+
* @returns Promise<ComponentVersionResponse>
|
|
55
|
+
*/
|
|
56
|
+
async getComponentVersions(versionRequest) {
|
|
57
|
+
try {
|
|
58
|
+
Logger_1.logger.log(`Getting component versions for purl: ${versionRequest.purl}`);
|
|
59
|
+
const response = await this.componentsClient.getComponentVersions(versionRequest);
|
|
60
|
+
Logger_1.logger.log(`Found ${response.component.versions.length} versions for component`);
|
|
61
|
+
return response;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
Logger_1.logger.log('Error getting component versions:', error);
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get statistics for multiple components
|
|
70
|
+
* @param components - Array of components to get statistics for
|
|
71
|
+
* @returns Promise<ComponentStatisticResponse>
|
|
72
|
+
*/
|
|
73
|
+
async getComponentStatistics(components) {
|
|
74
|
+
try {
|
|
75
|
+
Logger_1.logger.log(`Getting statistics for ${components.length} components`);
|
|
76
|
+
const response = await this.componentsClient.getComponentStatistics(components);
|
|
77
|
+
Logger_1.logger.log(`Retrieved statistics for ${response.purls.length} components`);
|
|
78
|
+
return response;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
Logger_1.logger.log('Error getting component statistics:', error);
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Search for a component by name and optionally get its versions and statistics
|
|
87
|
+
* @param componentName - Name of the component to search for
|
|
88
|
+
* @param includeVersions - Whether to include version information
|
|
89
|
+
* @param includeStatistics - Whether to include statistics
|
|
90
|
+
* @returns Combined component information
|
|
91
|
+
*/
|
|
92
|
+
async getComponentInfo(componentName, includeVersions = false, includeStatistics = false) {
|
|
93
|
+
var _a;
|
|
94
|
+
try {
|
|
95
|
+
// First search for the component
|
|
96
|
+
const searchResponse = await this.searchComponents({ search: componentName, limit: 1 });
|
|
97
|
+
if (searchResponse.components.length === 0) {
|
|
98
|
+
throw new Error(`No component found with name: ${componentName}`);
|
|
99
|
+
}
|
|
100
|
+
const component = searchResponse.components[0];
|
|
101
|
+
const result = {
|
|
102
|
+
component: component,
|
|
103
|
+
versions: null,
|
|
104
|
+
statistics: null
|
|
105
|
+
};
|
|
106
|
+
if (includeVersions) {
|
|
107
|
+
const versionsResponse = await this.getComponentVersions({ purl: component.purl });
|
|
108
|
+
result.versions = versionsResponse.component.versions;
|
|
109
|
+
}
|
|
110
|
+
if (includeStatistics) {
|
|
111
|
+
const statsResponse = await this.getComponentStatistics([{ purl: component.purl }]);
|
|
112
|
+
result.statistics = ((_a = statsResponse.purls[0]) === null || _a === void 0 ? void 0 : _a.statistics) || null;
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
Logger_1.logger.log('Error getting component info:', error);
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.ComponentsScanner = ComponentsScanner;
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50c1NjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2RrL0NvbXBvbmVudHMvQ29tcG9uZW50c1NjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUVBQThEO0FBQzlELHNDQUFtQztBQUNuQyxxRkFBa0Y7QUFDbEYscUZBQWtGO0FBWWxGLE1BQWEsaUJBQWlCO0lBSzVCLFlBQVksR0FBMEI7UUFGOUIsV0FBTSxHQUF5QixJQUFJLDJDQUFvQixFQUFFLENBQUM7UUFHaEUsSUFBSSxHQUFHO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7O1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSwyQ0FBb0IsRUFBRSxDQUFDO1FBRTlDLDJEQUEyRDtRQUMzRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksMkNBQW9CLENBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNwQixDQUFDO1lBQ0YsZUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxTQUFTLEdBQWlCO2dCQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUM1QixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2dCQUNwQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2dCQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxP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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,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ComponentsScannerCfg = void 0;
|
|
4
|
+
const BaseConfig_1 = require("../BaseConfig");
|
|
5
|
+
class ComponentsScannerCfg extends BaseConfig_1.BaseConfig {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
super(config);
|
|
8
|
+
this._API_KEY = '';
|
|
9
|
+
this._USE_GRPC = false;
|
|
10
|
+
if (config) {
|
|
11
|
+
this.API_KEY = config.API_KEY ? config.API_KEY : '';
|
|
12
|
+
this.USE_GRPC = config.USE_GRPC !== undefined ? config.USE_GRPC : false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
get API_KEY() {
|
|
16
|
+
return this._API_KEY;
|
|
17
|
+
}
|
|
18
|
+
set API_KEY(value) {
|
|
19
|
+
this._API_KEY = value;
|
|
20
|
+
}
|
|
21
|
+
get USE_GRPC() {
|
|
22
|
+
return this._USE_GRPC;
|
|
23
|
+
}
|
|
24
|
+
set USE_GRPC(value) {
|
|
25
|
+
this._USE_GRPC = value;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolves the appropriate scanner URL based on API key presence and current URL.
|
|
29
|
+
* If an API key is provided and the current URL is the default, returns the premium
|
|
30
|
+
* scanner URL, otherwise removes '/scan/direct' suffix from the URL.
|
|
31
|
+
* @param apiKey - The API key (if any)
|
|
32
|
+
* @param currentUrl - The current API URL
|
|
33
|
+
* @returns The resolved scanner URL
|
|
34
|
+
*/
|
|
35
|
+
resolveApiUrl(apiKey, currentUrl) {
|
|
36
|
+
// Case 1: Has API key and using default URL -> upgrade to premium URL
|
|
37
|
+
if (apiKey && currentUrl === BaseConfig_1.BaseConfig.getDefaultURL())
|
|
38
|
+
return BaseConfig_1.BaseConfig.getPremiumURL();
|
|
39
|
+
// Case 2: Has API key and using custom URL -> keep custom URL but remove /scan/direct
|
|
40
|
+
if (apiKey && (currentUrl.startsWith(BaseConfig_1.BaseConfig.getPremiumURL()) || currentUrl.startsWith(BaseConfig_1.BaseConfig.getDefaultURL()))) {
|
|
41
|
+
return currentUrl.replace(/\/scan\/direct$/, '');
|
|
42
|
+
}
|
|
43
|
+
// Case 3: No API key -> use default URL
|
|
44
|
+
return BaseConfig_1.BaseConfig.getDefaultURL();
|
|
45
|
+
}
|
|
46
|
+
get API_URL() {
|
|
47
|
+
return this.resolveApiUrl(this.API_KEY, super.API_URL);
|
|
48
|
+
}
|
|
49
|
+
set API_URL(url) {
|
|
50
|
+
super.API_URL = url;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.ComponentsScannerCfg = ComponentsScannerCfg;
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50c1NjYW5uZXJDZmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2RrL0NvbXBvbmVudHMvQ29tcG9uZW50c1NjYW5uZXJDZmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQTJDO0FBRTNDLE1BQWEsb0JBQXFCLFNBQVEsdUJBQVU7SUFLbEQsWUFBWSxNQUE2QjtRQUN2QyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFKaEIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBSXpCLElBQUcsTUFBTSxFQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBYztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLGFBQWEsQ0FBQyxNQUFjLEVBQUUsVUFBa0I7UUFDeEQsc0VBQXNFO1FBQ3RFLElBQUksTUFBTSxJQUFJLFVBQVUsS0FBSyx1QkFBVSxDQUFDLGFBQWEsRUFBRTtZQUNyRCxPQUFPLHVCQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFcEMsc0ZBQXNGO1FBQ3RGLElBQUksTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx1QkFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyx1QkFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ3RILE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLE9BQU8sdUJBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLENBQUM7Q0FDRjtBQTFERCxvREEwREMifQ==
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ComponentAlgorithmScanner = void 0;
|
|
4
4
|
const BaseCryptographyScanner_1 = require("../../BaseCryptographyScanner");
|
|
5
|
-
const
|
|
5
|
+
const CryptographyHttpClient_1 = require("../../../Clients/Cryptography/CryptographyHttpClient");
|
|
6
6
|
/**
|
|
7
7
|
* Scanner for detecting cryptographic algorithms in software components.
|
|
8
8
|
* This class extends the base cryptography scanner to specifically handle
|
|
@@ -17,14 +17,20 @@ class ComponentAlgorithmScanner extends BaseCryptographyScanner_1.BaseCryptograp
|
|
|
17
17
|
* @returns {AlgorithmResponse} A promise that resolves to an AlgorithmResponse containing detected cryptographic algorithms.
|
|
18
18
|
*/
|
|
19
19
|
async scan(components) {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
const clientCfg = {
|
|
21
|
+
API_KEY: this.config.API_KEY,
|
|
22
|
+
HTTP_PROXY: this.config.HTTP_PROXY,
|
|
23
|
+
HTTPS_PROXY: this.config.HTTPS_PROXY,
|
|
24
|
+
NO_PROXY: this.config.NO_PROXY,
|
|
25
|
+
CA_CERT: this.config.CA_CERT,
|
|
26
|
+
IGNORE_CERT_ERRORS: this.config.IGNORE_CERT_ERRORS,
|
|
27
|
+
HOST_URL: this.config.API_URL, // Only map the one that differs. TODO: Migrate to HOST URL on v1 version
|
|
28
|
+
};
|
|
29
|
+
const cryptographyClient = new CryptographyHttpClient_1.CryptographyHttpClient(clientCfg);
|
|
24
30
|
const results = await cryptographyClient.getAlgorithms(components);
|
|
25
31
|
this.resultCollector.collectAlgorithmResults(results);
|
|
26
32
|
return results;
|
|
27
33
|
}
|
|
28
34
|
}
|
|
29
35
|
exports.ComponentAlgorithmScanner = ComponentAlgorithmScanner;
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50QWxnb3JpdGhtU2Nhbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvQ3J5cHRvZ3JhcGh5L0FsZ29yaXRobS9Db21wb25lbnRzL0NvbXBvbmVudEFsZ29yaXRobVNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsMkVBQXdFO0FBR3hFLGlHQUE4RjtBQUk5Rjs7OztHQUlHO0FBQ0gsTUFBYSx5QkFDWCxTQUFRLGlEQUdZO0lBRXBCOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBdUI7UUFDdkMsTUFBTSxTQUFTLEdBQWlCO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO1lBQ3BDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUM1QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUNsRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUseUVBQXlFO1NBQ3pHLENBQUM7UUFDRixNQUFNLGtCQUFrQixHQUFHLElBQUksK0NBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsTUFBTSxPQUFPLEdBQXFCLE1BQU0sa0JBQWtCLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBNUJELDhEQTRCQyJ9
|
|
@@ -24,19 +24,16 @@ class CryptoCfg extends BaseConfig_1.BaseConfig {
|
|
|
24
24
|
* @returns The resolved API URL
|
|
25
25
|
*/
|
|
26
26
|
resolveApiUrl(apiKey, currentUrl) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
// Case 2: Has API key and using custom URL -> keep custom URL
|
|
31
|
-
if (apiKey && currentUrl.startsWith(BaseConfig_1.BaseConfig.getPremiumURL()) || currentUrl.startsWith(BaseConfig_1.BaseConfig.getDefaultURL())) {
|
|
32
|
-
// Check if custom URL is not the same as the default one.
|
|
33
|
-
if (currentUrl.startsWith(BaseConfig_1.BaseConfig.getPremiumURL()) || currentUrl.startsWith(BaseConfig_1.BaseConfig.getDefaultURL())) {
|
|
34
|
-
return currentUrl.replace(/\/scan\/direct$/, '');
|
|
27
|
+
if (!apiKey) {
|
|
28
|
+
if (currentUrl !== BaseConfig_1.BaseConfig.getDefaultURL()) {
|
|
29
|
+
return currentUrl;
|
|
35
30
|
}
|
|
36
31
|
return currentUrl;
|
|
37
32
|
}
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
if (currentUrl !== BaseConfig_1.BaseConfig.getDefaultURL() && currentUrl !== BaseConfig_1.BaseConfig.getPremiumURL()) {
|
|
34
|
+
return currentUrl;
|
|
35
|
+
}
|
|
36
|
+
return BaseConfig_1.BaseConfig.getPremiumURL();
|
|
40
37
|
}
|
|
41
38
|
get API_URL() {
|
|
42
39
|
return this.resolveApiUrl(this.API_KEY, super.API_URL);
|
|
@@ -46,4 +43,4 @@ class CryptoCfg extends BaseConfig_1.BaseConfig {
|
|
|
46
43
|
}
|
|
47
44
|
}
|
|
48
45
|
exports.CryptoCfg = CryptoCfg;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3J5cHRvQ2ZnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Nkay9DcnlwdG9ncmFwaHkvQ3J5cHRvQ2ZnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhDQUEyQztBQUUzQzs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLHVCQUFVO0lBWXRDLFlBQVksR0FBZTtRQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFYSSxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQU1yQyxZQUFPLEdBQVcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUV2QyxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBSW5CLElBQUcsR0FBRyxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVGOzs7Ozs7O09BT0c7SUFDUSxhQUFhLENBQUMsTUFBYyxFQUFFLFVBQWtCO1FBQ3pELElBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksVUFBVSxLQUFLLHVCQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDOUMsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLFVBQVUsS0FBSyx1QkFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLFVBQVUsS0FBSyx1QkFBVSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDM0YsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUNELE9BQU8sdUJBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBVyxPQUFPLENBQUMsS0FBYTtRQUM5QixLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0NBRUg7QUFoREQsOEJBZ0RDIn0=
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ComponentHintScanner = void 0;
|
|
4
4
|
const BaseCryptographyScanner_1 = require("../../BaseCryptographyScanner");
|
|
5
|
-
const
|
|
5
|
+
const CryptographyHttpClient_1 = require("../../../Clients/Cryptography/CryptographyHttpClient");
|
|
6
6
|
/**
|
|
7
7
|
* Scanner for detecting cryptographic hints in software components.
|
|
8
8
|
* This class extends the base cryptography scanner to specifically handle
|
|
@@ -17,14 +17,20 @@ class ComponentHintScanner extends BaseCryptographyScanner_1.BaseCryptographySca
|
|
|
17
17
|
* @returns {HintsResponse} A promise that resolves to a HintsResponse containing detected cryptographic hints.
|
|
18
18
|
*/
|
|
19
19
|
async scan(req) {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
const clientCfg = {
|
|
21
|
+
API_KEY: this.config.API_KEY,
|
|
22
|
+
HTTP_PROXY: this.config.HTTP_PROXY,
|
|
23
|
+
HTTPS_PROXY: this.config.HTTPS_PROXY,
|
|
24
|
+
NO_PROXY: this.config.NO_PROXY,
|
|
25
|
+
CA_CERT: this.config.CA_CERT,
|
|
26
|
+
IGNORE_CERT_ERRORS: this.config.IGNORE_CERT_ERRORS,
|
|
27
|
+
HOST_URL: this.config.API_URL, // Only map the one that differs. TODO: Migrate to HOST URL on v1 version
|
|
28
|
+
};
|
|
29
|
+
const cryptographyClient = new CryptographyHttpClient_1.CryptographyHttpClient(clientCfg);
|
|
24
30
|
const results = await cryptographyClient.getEncryptionHints(req);
|
|
25
31
|
this.resultCollector.collectHintResults(results);
|
|
26
32
|
return results;
|
|
27
33
|
}
|
|
28
34
|
}
|
|
29
35
|
exports.ComponentHintScanner = ComponentHintScanner;
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50SGludFNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvc2RrL0NyeXB0b2dyYXBoeS9IaW50L0NvbXBvbmVudHMvQ29tcG9uZW50SGludFNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsMkVBQXdFO0FBR3hFLGlHQUE4RjtBQUk5Rjs7OztHQUlHO0FBQ0gsTUFBYSxvQkFDWCxTQUFRLGlEQUdlO0lBRXZCOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBZ0I7UUFDaEMsTUFBTSxTQUFTLEdBQWlCO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO1lBQ3BDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUM1QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUNsRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUseUVBQXlFO1NBQ3pHLENBQUM7UUFDRixNQUFNLGtCQUFrQixHQUFHLElBQUksK0NBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQTVCRCxvREE0QkMifQ==
|
|
@@ -18,7 +18,16 @@ class DependencyScanner {
|
|
|
18
18
|
this.config = cfg;
|
|
19
19
|
else
|
|
20
20
|
this.config = new DependencyScannerCfg_1.DependencyScannerCfg();
|
|
21
|
-
|
|
21
|
+
const clientCfg = {
|
|
22
|
+
API_KEY: this.config.API_KEY,
|
|
23
|
+
HTTP_PROXY: this.config.HTTP_PROXY,
|
|
24
|
+
HTTPS_PROXY: this.config.HTTPS_PROXY,
|
|
25
|
+
NO_PROXY: this.config.NO_PROXY,
|
|
26
|
+
CA_CERT: this.config.CA_CERT,
|
|
27
|
+
IGNORE_CERT_ERRORS: this.config.IGNORE_CERT_ERRORS,
|
|
28
|
+
HOST_URL: this.config.API_URL, // Only map the one that differs. TODO: Migrate to HOST URL on v1 version
|
|
29
|
+
};
|
|
30
|
+
this.dependencyClient = new DependencyHttpClient_1.DependencyHttpClient(clientCfg);
|
|
22
31
|
this.localDependency = new LocalDependency_1.LocalDependencies();
|
|
23
32
|
}
|
|
24
33
|
async scanFolder(path) {
|
|
@@ -71,12 +80,12 @@ class DependencyScanner {
|
|
|
71
80
|
}
|
|
72
81
|
catch (e) {
|
|
73
82
|
Logger_1.logger.debug(`Error while scanning dependencies: ${JSON.stringify(request, null, 2)}`);
|
|
74
|
-
err = e
|
|
83
|
+
err = e;
|
|
75
84
|
failedRequests.push(request);
|
|
76
85
|
}
|
|
77
86
|
}
|
|
78
87
|
if (err) {
|
|
79
|
-
Logger_1.logger.error(
|
|
88
|
+
Logger_1.logger.error(err);
|
|
80
89
|
}
|
|
81
90
|
if (failedRequests.length > 0) {
|
|
82
91
|
overallStatus = { status: 'SUCCEEDED WITH WARNINGS', message: 'Warning: some dependencies were not scanned' };
|
|
@@ -169,4 +178,4 @@ class DependencyScanner {
|
|
|
169
178
|
}
|
|
170
179
|
}
|
|
171
180
|
exports.DependencyScanner = DependencyScanner;
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwZW5kZW5jeVNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2RrL0RlcGVuZGVuY2llcy9EZXBlbmRlbmN5U2Nhbm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSx1RUFBc0U7QUFDdEUsaUVBQThEO0FBQzlELGlEQUEyQztBQUMzQyw0Q0FBb0I7QUFDcEIsdUNBQW9DO0FBQ3BDLHNDQUFtQztBQUNuQyxxRkFBa0Y7QUFVbEYsTUFBYSxpQkFBaUI7SUFPNUIsWUFBWSxHQUEwQjtRQUY5QixXQUFNLEdBQXlCLElBQUksMkNBQW9CLEVBQUUsQ0FBQztRQUdoRSxJQUFJLEdBQUc7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQzs7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDJDQUFvQixFQUFFLENBQUM7UUFFOUMsTUFBTSxTQUFTLEdBQWlCO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO1lBQ3BDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUM1QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUNsRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUseUVBQXlFO1NBQ3pHLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksbUNBQWlCLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxJ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
|