@dignetwork/dig-sdk 0.0.1-alpha.7 → 0.0.1-alpha.70
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/dist/DataIntegrityTree/DataIntegrityTree.d.ts +5 -2
- package/dist/DataIntegrityTree/DataIntegrityTree.d.ts.map +1 -1
- package/dist/DataIntegrityTree/DataIntegrityTree.js +94 -34
- package/dist/DigNetwork/ContentServer.d.ts +9 -4
- package/dist/DigNetwork/ContentServer.d.ts.map +1 -1
- package/dist/DigNetwork/ContentServer.js +55 -19
- package/dist/DigNetwork/DigNetwork.d.ts +3 -8
- package/dist/DigNetwork/DigNetwork.d.ts.map +1 -1
- package/dist/DigNetwork/DigNetwork.js +115 -171
- package/dist/DigNetwork/DigPeer.d.ts +9 -3
- package/dist/DigNetwork/DigPeer.d.ts.map +1 -1
- package/dist/DigNetwork/DigPeer.js +68 -114
- package/dist/DigNetwork/PropagationServer.d.ts +91 -33
- package/dist/DigNetwork/PropagationServer.d.ts.map +1 -1
- package/dist/DigNetwork/PropagationServer.js +414 -372
- package/dist/blockchain/DataStore.d.ts +13 -6
- package/dist/blockchain/DataStore.d.ts.map +1 -1
- package/dist/blockchain/DataStore.js +64 -91
- package/dist/blockchain/DataStoreSerializer.d.ts +1 -1
- package/dist/blockchain/DataStoreSerializer.d.ts.map +1 -1
- package/dist/blockchain/FullNodePeer.d.ts +9 -1
- package/dist/blockchain/FullNodePeer.d.ts.map +1 -1
- package/dist/blockchain/FullNodePeer.js +38 -10
- package/dist/blockchain/ServerCoin.d.ts +11 -3
- package/dist/blockchain/ServerCoin.d.ts.map +1 -1
- package/dist/blockchain/ServerCoin.js +45 -17
- package/dist/blockchain/Wallet.d.ts +2 -2
- package/dist/blockchain/Wallet.d.ts.map +1 -1
- package/dist/blockchain/Wallet.js +2 -2
- package/dist/blockchain/coins.d.ts +1 -1
- package/dist/blockchain/coins.d.ts.map +1 -1
- package/dist/blockchain/coins.js +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/ContentScanner.d.ts +63 -0
- package/dist/utils/ContentScanner.d.ts.map +1 -0
- package/dist/utils/ContentScanner.js +175 -0
- package/dist/utils/FileTransfer.d.ts +47 -0
- package/dist/utils/FileTransfer.d.ts.map +1 -0
- package/dist/utils/FileTransfer.js +209 -0
- package/dist/utils/StoreArchiveManager.d.ts +45 -0
- package/dist/utils/StoreArchiveManager.d.ts.map +1 -0
- package/dist/utils/StoreArchiveManager.js +153 -0
- package/dist/utils/config.d.ts +0 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +2 -3
- package/dist/utils/directoryUtils.d.ts +0 -6
- package/dist/utils/directoryUtils.d.ts.map +1 -1
- package/dist/utils/directoryUtils.js +30 -11
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +0 -1
- package/package.json +12 -3
- package/dist/utils/deltaUtils.d.ts +0 -2
- package/dist/utils/deltaUtils.d.ts.map +0 -1
- package/dist/utils/deltaUtils.js +0 -83
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Peer, Coin, CoinSpend } from "datalayer-driver";
|
|
1
|
+
import { Peer, Coin, CoinSpend } from "@dignetwork/datalayer-driver";
|
|
2
2
|
export declare const DEFAULT_FEE_COIN_COST = 64000000;
|
|
3
3
|
export declare const calculateFeeForCoinSpends: (peer: Peer, coinSpends: CoinSpend[] | null) => Promise<bigint>;
|
|
4
4
|
export declare const selectUnspentCoins: (peer: Peer, coinAmount: bigint, feeBigInt: bigint, omitCoins?: Coin[], walletName?: string) => Promise<Coin[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coins.d.ts","sourceRoot":"","sources":["../../src/blockchain/coins.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,IAAI,EACJ,IAAI,EAEJ,SAAS,EAEV,MAAM,
|
|
1
|
+
{"version":3,"file":"coins.d.ts","sourceRoot":"","sources":["../../src/blockchain/coins.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,IAAI,EACJ,IAAI,EAEJ,SAAS,EAEV,MAAM,8BAA8B,CAAC;AAKtC,eAAO,MAAM,qBAAqB,WAAa,CAAC;AAWhD,eAAO,MAAM,yBAAyB,SAC9B,IAAI,cACE,SAAS,EAAE,GAAG,IAAI,KAC7B,OAAO,CAAC,MAAM,CA4BhB,CAAC;AAEF,eAAO,MAAM,kBAAkB,SACvB,IAAI,cACE,MAAM,aACP,MAAM,cACN,IAAI,EAAE,eACL,MAAM,KACjB,OAAO,CAAC,IAAI,EAAE,CAoEhB,CAAC;AAGF,eAAO,MAAM,eAAe,SACpB,IAAI,UACF,MAAM,KACb,OAAO,CAAC,OAAO,CAWjB,CAAC"}
|
package/dist/blockchain/coins.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isCoinSpendable = exports.selectUnspentCoins = exports.calculateFeeForCoinSpends = exports.DEFAULT_FEE_COIN_COST = void 0;
|
|
4
|
-
const datalayer_driver_1 = require("datalayer-driver");
|
|
4
|
+
const datalayer_driver_1 = require("@dignetwork/datalayer-driver");
|
|
5
5
|
const Wallet_1 = require("./Wallet");
|
|
6
6
|
const config_1 = require("../utils/config");
|
|
7
7
|
const FileCache_1 = require("../utils/FileCache");
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE;QACL,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,cAAc,CAAC;CAC9B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @class IllegalContentScanner
|
|
3
|
+
* Scans files for illegal content using ClamAV running in a Docker container and deletes files if flagged.
|
|
4
|
+
*/
|
|
5
|
+
export declare class IllegalContentScanner {
|
|
6
|
+
private clamAVContainerName;
|
|
7
|
+
private virusTotalApiKey?;
|
|
8
|
+
private openAiApiKey?;
|
|
9
|
+
/**
|
|
10
|
+
* @constructor
|
|
11
|
+
* @param clamAVContainerName The name of the Docker container running ClamAV (default: 'clamav').
|
|
12
|
+
*/
|
|
13
|
+
constructor(clamAVContainerName?: string);
|
|
14
|
+
/**
|
|
15
|
+
* Scans a file for illegal content using ClamAV, VirusTotal, and OpenAI Moderation API.
|
|
16
|
+
* If a service is missing its API key, the scan for that service is skipped.
|
|
17
|
+
* @param filePath The path of the file to scan.
|
|
18
|
+
* @returns {Promise<void>} A promise that resolves after the scan and potential deletion.
|
|
19
|
+
*/
|
|
20
|
+
scanFile(filePath: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Scans a file using ClamAV running in Docker.
|
|
23
|
+
* @param filePath The path of the file to scan.
|
|
24
|
+
* @returns {Promise<string>} The result of the ClamAV scan.
|
|
25
|
+
*/
|
|
26
|
+
private scanWithClamAV;
|
|
27
|
+
/**
|
|
28
|
+
* Submits a file to VirusTotal for scanning.
|
|
29
|
+
* @param filePath The path of the file to scan.
|
|
30
|
+
* @returns {Promise<any>} The result from VirusTotal.
|
|
31
|
+
*/
|
|
32
|
+
private scanWithVirusTotal;
|
|
33
|
+
/**
|
|
34
|
+
* Scans file content (text) using OpenAI's Moderation API.
|
|
35
|
+
* @param content The text content to scan.
|
|
36
|
+
* @returns {Promise<any>} The result from OpenAI's Moderation API.
|
|
37
|
+
*/
|
|
38
|
+
private scanWithOpenAI;
|
|
39
|
+
/**
|
|
40
|
+
* Checks if the ClamAV scan result indicates a malicious file.
|
|
41
|
+
* @param result The ClamAV scan output.
|
|
42
|
+
* @returns {boolean} True if the file is flagged, false otherwise.
|
|
43
|
+
*/
|
|
44
|
+
private isClamAVResultMalicious;
|
|
45
|
+
/**
|
|
46
|
+
* Checks if the VirusTotal result indicates a malicious file.
|
|
47
|
+
* @param result The VirusTotal scan result.
|
|
48
|
+
* @returns {boolean} True if the file is flagged, false otherwise.
|
|
49
|
+
*/
|
|
50
|
+
private isVirusTotalResultMalicious;
|
|
51
|
+
/**
|
|
52
|
+
* Checks if the OpenAI Moderation result indicates harmful content.
|
|
53
|
+
* @param result The OpenAI Moderation result.
|
|
54
|
+
* @returns {boolean} True if harmful content is detected, false otherwise.
|
|
55
|
+
*/
|
|
56
|
+
private isOpenAiResultMalicious;
|
|
57
|
+
/**
|
|
58
|
+
* Deletes a file from the filesystem.
|
|
59
|
+
* @param filePath The file to delete.
|
|
60
|
+
*/
|
|
61
|
+
private deleteFile;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=ContentScanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentScanner.d.ts","sourceRoot":"","sources":["../../src/utils/ContentScanner.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,OAAO,CAAC,YAAY,CAAC,CAAS;IAE9B;;;OAGG;gBACS,mBAAmB,GAAE,MAAiB;IAMlD;;;;;OAKG;IACU,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDtD;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAYtB;;;;OAIG;YACW,kBAAkB;IAgBhC;;;;OAIG;YACW,cAAc;IAa5B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAKnC;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;;OAGG;IACH,OAAO,CAAC,UAAU;CASrB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.IllegalContentScanner = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const axios_1 = __importDefault(require("axios"));
|
|
11
|
+
/**
|
|
12
|
+
* @class IllegalContentScanner
|
|
13
|
+
* Scans files for illegal content using ClamAV running in a Docker container and deletes files if flagged.
|
|
14
|
+
*/
|
|
15
|
+
class IllegalContentScanner {
|
|
16
|
+
/**
|
|
17
|
+
* @constructor
|
|
18
|
+
* @param clamAVContainerName The name of the Docker container running ClamAV (default: 'clamav').
|
|
19
|
+
*/
|
|
20
|
+
constructor(clamAVContainerName = "clamav") {
|
|
21
|
+
this.clamAVContainerName = clamAVContainerName;
|
|
22
|
+
this.virusTotalApiKey = process.env.VIRUSTOTAL_API_KEY || undefined;
|
|
23
|
+
this.openAiApiKey = process.env.OPENAI_API_KEY || undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Scans a file for illegal content using ClamAV, VirusTotal, and OpenAI Moderation API.
|
|
27
|
+
* If a service is missing its API key, the scan for that service is skipped.
|
|
28
|
+
* @param filePath The path of the file to scan.
|
|
29
|
+
* @returns {Promise<void>} A promise that resolves after the scan and potential deletion.
|
|
30
|
+
*/
|
|
31
|
+
async scanFile(filePath) {
|
|
32
|
+
try {
|
|
33
|
+
// 1. ClamAV Scan
|
|
34
|
+
console.log(`Starting ClamAV scan for file: ${filePath}`);
|
|
35
|
+
const clamAvResult = await this.scanWithClamAV(filePath);
|
|
36
|
+
if (this.isClamAVResultMalicious(clamAvResult)) {
|
|
37
|
+
console.log(`ClamAV flagged file: ${filePath}. Deleting...`);
|
|
38
|
+
this.deleteFile(filePath);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log(`ClamAV did not flag the file: ${filePath}.`);
|
|
43
|
+
}
|
|
44
|
+
// 2. VirusTotal Scan (if API key is provided)
|
|
45
|
+
if (this.virusTotalApiKey) {
|
|
46
|
+
console.log(`Submitting file to VirusTotal for scanning: ${filePath}`);
|
|
47
|
+
const virusTotalResult = await this.scanWithVirusTotal(filePath);
|
|
48
|
+
if (this.isVirusTotalResultMalicious(virusTotalResult)) {
|
|
49
|
+
console.log(`VirusTotal flagged file: ${filePath}. Deleting...`);
|
|
50
|
+
this.deleteFile(filePath);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log(`VirusTotal did not flag the file: ${filePath}.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log(`VirusTotal API key not provided. Skipping VirusTotal scan.`);
|
|
59
|
+
}
|
|
60
|
+
// 3. OpenAI Moderation API (if API key is provided and file is text-based)
|
|
61
|
+
const fileExtension = path_1.default.extname(filePath).toLowerCase();
|
|
62
|
+
if (this.openAiApiKey && (fileExtension === ".txt" || fileExtension === ".json")) {
|
|
63
|
+
console.log(`Scanning file content with OpenAI Moderation API: ${filePath}`);
|
|
64
|
+
const fileContent = await fs_1.default.promises.readFile(filePath, "utf-8");
|
|
65
|
+
const openAiResult = await this.scanWithOpenAI(fileContent);
|
|
66
|
+
if (this.isOpenAiResultMalicious(openAiResult)) {
|
|
67
|
+
console.log(`OpenAI flagged file: ${filePath}. Deleting...`);
|
|
68
|
+
this.deleteFile(filePath);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if (!this.openAiApiKey) {
|
|
74
|
+
console.log(`OpenAI API key not provided. Skipping OpenAI scan.`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log(`OpenAI scan skipped: File type not supported (${fileExtension}).`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
console.log(`File ${filePath} passed all multilayer scans.`);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error(`Error scanning file: ${filePath}`, error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Scans a file using ClamAV running in Docker.
|
|
88
|
+
* @param filePath The path of the file to scan.
|
|
89
|
+
* @returns {Promise<string>} The result of the ClamAV scan.
|
|
90
|
+
*/
|
|
91
|
+
scanWithClamAV(filePath) {
|
|
92
|
+
return new Promise((resolve, reject) => {
|
|
93
|
+
(0, child_process_1.exec)(`docker exec ${this.clamAVContainerName} clamdscan ${filePath}`, (error, stdout, stderr) => {
|
|
94
|
+
if (error) {
|
|
95
|
+
reject(`ClamAV scan error: ${stderr}`);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
resolve(stdout);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Submits a file to VirusTotal for scanning.
|
|
105
|
+
* @param filePath The path of the file to scan.
|
|
106
|
+
* @returns {Promise<any>} The result from VirusTotal.
|
|
107
|
+
*/
|
|
108
|
+
async scanWithVirusTotal(filePath) {
|
|
109
|
+
const fileContent = await fs_1.default.promises.readFile(filePath);
|
|
110
|
+
const formData = new FormData();
|
|
111
|
+
// @ts-ignore
|
|
112
|
+
formData.append("file", fileContent);
|
|
113
|
+
const response = await axios_1.default.post("https://www.virustotal.com/vtapi/v2/file/scan", formData, {
|
|
114
|
+
headers: {
|
|
115
|
+
"x-apikey": this.virusTotalApiKey,
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
...formData.getHeaders(),
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
return response.data;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Scans file content (text) using OpenAI's Moderation API.
|
|
124
|
+
* @param content The text content to scan.
|
|
125
|
+
* @returns {Promise<any>} The result from OpenAI's Moderation API.
|
|
126
|
+
*/
|
|
127
|
+
async scanWithOpenAI(content) {
|
|
128
|
+
const response = await axios_1.default.post("https://api.openai.com/v1/moderations", { input: content }, {
|
|
129
|
+
headers: {
|
|
130
|
+
Authorization: `Bearer ${this.openAiApiKey}`,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
return response.data;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Checks if the ClamAV scan result indicates a malicious file.
|
|
137
|
+
* @param result The ClamAV scan output.
|
|
138
|
+
* @returns {boolean} True if the file is flagged, false otherwise.
|
|
139
|
+
*/
|
|
140
|
+
isClamAVResultMalicious(result) {
|
|
141
|
+
return result.includes("FOUND");
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Checks if the VirusTotal result indicates a malicious file.
|
|
145
|
+
* @param result The VirusTotal scan result.
|
|
146
|
+
* @returns {boolean} True if the file is flagged, false otherwise.
|
|
147
|
+
*/
|
|
148
|
+
isVirusTotalResultMalicious(result) {
|
|
149
|
+
// Check if VirusTotal flagged the file based on its multiple antivirus results
|
|
150
|
+
return result.positives > 0;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Checks if the OpenAI Moderation result indicates harmful content.
|
|
154
|
+
* @param result The OpenAI Moderation result.
|
|
155
|
+
* @returns {boolean} True if harmful content is detected, false otherwise.
|
|
156
|
+
*/
|
|
157
|
+
isOpenAiResultMalicious(result) {
|
|
158
|
+
return result.flagged === true;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Deletes a file from the filesystem.
|
|
162
|
+
* @param filePath The file to delete.
|
|
163
|
+
*/
|
|
164
|
+
deleteFile(filePath) {
|
|
165
|
+
fs_1.default.unlink(filePath, (err) => {
|
|
166
|
+
if (err) {
|
|
167
|
+
console.error(`Error deleting file: ${filePath}`, err);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
console.log(`File ${filePath} was deleted successfully.`);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.IllegalContentScanner = IllegalContentScanner;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Readable } from "stream";
|
|
2
|
+
export declare class FileTransfer {
|
|
3
|
+
private static certPath;
|
|
4
|
+
private static keyPath;
|
|
5
|
+
constructor();
|
|
6
|
+
/** ------------------------ UPLOAD FUNCTIONALITY ------------------------ **/
|
|
7
|
+
/**
|
|
8
|
+
* Upload a file to the server using a stream.
|
|
9
|
+
* @param filePath - Local path of the file.
|
|
10
|
+
* @param uploadUrl - Server URL to upload the file.
|
|
11
|
+
* @param headers - Additional headers for the request.
|
|
12
|
+
* @returns Promise<void>
|
|
13
|
+
*/
|
|
14
|
+
uploadFile(filePath: string, uploadUrl: string, headers: Record<string, string>): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Perform a POST request.
|
|
17
|
+
* @param url - The URL to POST to.
|
|
18
|
+
* @param data - Data to send.
|
|
19
|
+
* @param headers - Headers for the POST request.
|
|
20
|
+
* @returns Promise<void>
|
|
21
|
+
*/
|
|
22
|
+
postRequest(url: string, data: string, headers: Record<string, string>): Promise<void>;
|
|
23
|
+
/** ------------------------ DOWNLOAD FUNCTIONALITY ------------------------ **/
|
|
24
|
+
/**
|
|
25
|
+
* Download data from a URL.
|
|
26
|
+
* @param url - The URL to download data from.
|
|
27
|
+
* @returns Promise<string>
|
|
28
|
+
*/
|
|
29
|
+
downloadData(url: string): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Stream data from a URL.
|
|
32
|
+
* @param url - The URL to stream data from.
|
|
33
|
+
* @returns Promise<Readable>
|
|
34
|
+
*/
|
|
35
|
+
streamData(url: string): Promise<Readable>;
|
|
36
|
+
/** ------------------------ HEAD REQUEST FUNCTIONALITY ------------------------ **/
|
|
37
|
+
/**
|
|
38
|
+
* Perform a HEAD request to check if a resource exists on the server.
|
|
39
|
+
* @param url - The URL to check.
|
|
40
|
+
* @returns Promise<{ success: boolean; headers?: Record<string, string> }>
|
|
41
|
+
*/
|
|
42
|
+
headRequest(url: string): Promise<{
|
|
43
|
+
success: boolean;
|
|
44
|
+
headers?: Record<string, string>;
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=FileTransfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileTransfer.d.ts","sourceRoot":"","sources":["../../src/utils/FileTransfer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAS;;IAU/B,8EAA8E;IAE9E;;;;;;OAMG;IACU,UAAU,CACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IA0ChB;;;;;;OAMG;IACU,WAAW,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAsChB,gFAAgF;IAEhF;;;;OAIG;IACU,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0CvD;;;;OAIG;IACU,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuCvD,oFAAoF;IAEpF;;;;OAIG;IACU,WAAW,CACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CA8BnE"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FileTransfer = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const https_1 = __importDefault(require("https"));
|
|
9
|
+
const url_1 = require("url");
|
|
10
|
+
const ssl_1 = require("../utils/ssl");
|
|
11
|
+
class FileTransfer {
|
|
12
|
+
constructor() {
|
|
13
|
+
if (!FileTransfer.certPath || !FileTransfer.keyPath) {
|
|
14
|
+
const { certPath, keyPath } = (0, ssl_1.getOrCreateSSLCerts)();
|
|
15
|
+
FileTransfer.certPath = certPath;
|
|
16
|
+
FileTransfer.keyPath = keyPath;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** ------------------------ UPLOAD FUNCTIONALITY ------------------------ **/
|
|
20
|
+
/**
|
|
21
|
+
* Upload a file to the server using a stream.
|
|
22
|
+
* @param filePath - Local path of the file.
|
|
23
|
+
* @param uploadUrl - Server URL to upload the file.
|
|
24
|
+
* @param headers - Additional headers for the request.
|
|
25
|
+
* @returns Promise<void>
|
|
26
|
+
*/
|
|
27
|
+
async uploadFile(filePath, uploadUrl, headers) {
|
|
28
|
+
const fileStream = fs_1.default.createReadStream(filePath);
|
|
29
|
+
const fileSize = fs_1.default.statSync(filePath).size;
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const url = new url_1.URL(uploadUrl);
|
|
32
|
+
const options = {
|
|
33
|
+
hostname: url.hostname,
|
|
34
|
+
port: url.port || 443,
|
|
35
|
+
path: url.pathname,
|
|
36
|
+
method: "PUT",
|
|
37
|
+
headers: {
|
|
38
|
+
...headers,
|
|
39
|
+
"Content-Type": "application/octet-stream",
|
|
40
|
+
"Content-Length": fileSize,
|
|
41
|
+
},
|
|
42
|
+
key: fs_1.default.readFileSync(FileTransfer.keyPath),
|
|
43
|
+
cert: fs_1.default.readFileSync(FileTransfer.certPath),
|
|
44
|
+
rejectUnauthorized: false,
|
|
45
|
+
};
|
|
46
|
+
const req = https_1.default.request(options, (res) => {
|
|
47
|
+
if (res.statusCode === 200) {
|
|
48
|
+
resolve();
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
reject(new Error(`Upload failed with status ${res.statusCode}: ${res.statusMessage}`));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
req.on("error", (err) => reject(err));
|
|
55
|
+
fileStream.pipe(req);
|
|
56
|
+
fileStream.on("error", (err) => reject(err));
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Perform a POST request.
|
|
61
|
+
* @param url - The URL to POST to.
|
|
62
|
+
* @param data - Data to send.
|
|
63
|
+
* @param headers - Headers for the POST request.
|
|
64
|
+
* @returns Promise<void>
|
|
65
|
+
*/
|
|
66
|
+
async postRequest(url, data, headers) {
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const urlObj = new url_1.URL(url);
|
|
69
|
+
const options = {
|
|
70
|
+
hostname: urlObj.hostname,
|
|
71
|
+
port: urlObj.port || 443,
|
|
72
|
+
path: urlObj.pathname,
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: {
|
|
75
|
+
...headers,
|
|
76
|
+
"Content-Type": "application/json",
|
|
77
|
+
"Content-Length": Buffer.byteLength(data),
|
|
78
|
+
},
|
|
79
|
+
key: fs_1.default.readFileSync(FileTransfer.keyPath),
|
|
80
|
+
cert: fs_1.default.readFileSync(FileTransfer.certPath),
|
|
81
|
+
rejectUnauthorized: false,
|
|
82
|
+
};
|
|
83
|
+
const req = https_1.default.request(options, (res) => {
|
|
84
|
+
if (res.statusCode === 200) {
|
|
85
|
+
resolve();
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
reject(new Error(`POST request failed with status ${res.statusCode}: ${res.statusMessage}`));
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
req.on("error", (err) => reject(err));
|
|
92
|
+
req.write(data);
|
|
93
|
+
req.end();
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** ------------------------ DOWNLOAD FUNCTIONALITY ------------------------ **/
|
|
97
|
+
/**
|
|
98
|
+
* Download data from a URL.
|
|
99
|
+
* @param url - The URL to download data from.
|
|
100
|
+
* @returns Promise<string>
|
|
101
|
+
*/
|
|
102
|
+
async downloadData(url) {
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
const urlObj = new url_1.URL(url);
|
|
105
|
+
const options = {
|
|
106
|
+
hostname: urlObj.hostname,
|
|
107
|
+
port: urlObj.port || 443,
|
|
108
|
+
path: urlObj.pathname + urlObj.search,
|
|
109
|
+
method: "GET",
|
|
110
|
+
key: fs_1.default.readFileSync(FileTransfer.keyPath),
|
|
111
|
+
cert: fs_1.default.readFileSync(FileTransfer.certPath),
|
|
112
|
+
rejectUnauthorized: false,
|
|
113
|
+
};
|
|
114
|
+
const req = https_1.default.request(options, (res) => {
|
|
115
|
+
let data = "";
|
|
116
|
+
if (res.statusCode === 200) {
|
|
117
|
+
res.on("data", (chunk) => (data += chunk));
|
|
118
|
+
res.on("end", () => resolve(data));
|
|
119
|
+
}
|
|
120
|
+
else if (res.statusCode === 301 || res.statusCode === 302) {
|
|
121
|
+
const redirectUrl = res.headers.location;
|
|
122
|
+
if (redirectUrl) {
|
|
123
|
+
this.downloadData(redirectUrl).then(resolve).catch(reject);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
reject(new Error("Redirected without a location header"));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
reject(new Error(`Failed to retrieve data from ${url}. Status code: ${res.statusCode}`));
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
req.on("error", (error) => reject(error));
|
|
134
|
+
req.end();
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Stream data from a URL.
|
|
139
|
+
* @param url - The URL to stream data from.
|
|
140
|
+
* @returns Promise<Readable>
|
|
141
|
+
*/
|
|
142
|
+
async streamData(url) {
|
|
143
|
+
return new Promise((resolve, reject) => {
|
|
144
|
+
const urlObj = new url_1.URL(url);
|
|
145
|
+
const options = {
|
|
146
|
+
hostname: urlObj.hostname,
|
|
147
|
+
port: urlObj.port || 443,
|
|
148
|
+
path: urlObj.pathname + urlObj.search,
|
|
149
|
+
method: "GET",
|
|
150
|
+
key: fs_1.default.readFileSync(FileTransfer.keyPath),
|
|
151
|
+
cert: fs_1.default.readFileSync(FileTransfer.certPath),
|
|
152
|
+
rejectUnauthorized: false,
|
|
153
|
+
};
|
|
154
|
+
const req = https_1.default.request(options, (res) => {
|
|
155
|
+
if (res.statusCode === 200) {
|
|
156
|
+
resolve(res); // Return the readable stream
|
|
157
|
+
}
|
|
158
|
+
else if (res.statusCode === 301 || res.statusCode === 302) {
|
|
159
|
+
const redirectUrl = res.headers.location;
|
|
160
|
+
if (redirectUrl) {
|
|
161
|
+
this.streamData(redirectUrl).then(resolve).catch(reject);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
reject(new Error("Redirected without a location header"));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
reject(new Error(`Failed to retrieve stream from ${url}. Status code: ${res.statusCode}`));
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
req.on("error", (error) => reject(error));
|
|
172
|
+
req.end();
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/** ------------------------ HEAD REQUEST FUNCTIONALITY ------------------------ **/
|
|
176
|
+
/**
|
|
177
|
+
* Perform a HEAD request to check if a resource exists on the server.
|
|
178
|
+
* @param url - The URL to check.
|
|
179
|
+
* @returns Promise<{ success: boolean; headers?: Record<string, string> }>
|
|
180
|
+
*/
|
|
181
|
+
async headRequest(url) {
|
|
182
|
+
return new Promise((resolve, reject) => {
|
|
183
|
+
const urlObj = new url_1.URL(url);
|
|
184
|
+
const options = {
|
|
185
|
+
hostname: urlObj.hostname,
|
|
186
|
+
port: urlObj.port || 443,
|
|
187
|
+
path: urlObj.pathname,
|
|
188
|
+
method: "HEAD",
|
|
189
|
+
key: fs_1.default.readFileSync(FileTransfer.keyPath),
|
|
190
|
+
cert: fs_1.default.readFileSync(FileTransfer.certPath),
|
|
191
|
+
rejectUnauthorized: false,
|
|
192
|
+
};
|
|
193
|
+
const req = https_1.default.request(options, (res) => {
|
|
194
|
+
if (res.statusCode === 200) {
|
|
195
|
+
resolve({
|
|
196
|
+
success: true,
|
|
197
|
+
headers: res.headers,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
resolve({ success: false });
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
req.on("error", (err) => reject(err));
|
|
205
|
+
req.end();
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.FileTransfer = FileTransfer;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class for managing file archiving, extraction, and working with the 'data' folder.
|
|
3
|
+
*/
|
|
4
|
+
declare class StoreArchiveManager {
|
|
5
|
+
private archivePath;
|
|
6
|
+
private outputStream;
|
|
7
|
+
/**
|
|
8
|
+
* Constructor that initializes the FileArchiveManager with a given path.
|
|
9
|
+
* @param archivePath - The path where the archive will be created.
|
|
10
|
+
*/
|
|
11
|
+
constructor(archivePath: string);
|
|
12
|
+
/**
|
|
13
|
+
* Creates the archive at the specified path.
|
|
14
|
+
* @returns Promise<void>
|
|
15
|
+
*/
|
|
16
|
+
createArchive(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Streams a file into the archive.
|
|
19
|
+
* @param filePath - The file to add to the archive.
|
|
20
|
+
* @param fileNameInArchive - The name the file should have inside the archive.
|
|
21
|
+
* @returns Promise<void>
|
|
22
|
+
*/
|
|
23
|
+
addFileToArchive(filePath: string, fileNameInArchive: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Extracts a file from the archive to a specified directory.
|
|
26
|
+
* @param extractToPath - The path where the file should be extracted.
|
|
27
|
+
* @returns Promise<void>
|
|
28
|
+
*/
|
|
29
|
+
extractArchive(extractToPath: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Merges another archive into the current one.
|
|
32
|
+
* Extracts files from the given archive and adds them into the current archive.
|
|
33
|
+
* @param archiveToMergePath - The path of the archive to be merged.
|
|
34
|
+
* @returns Promise<void>
|
|
35
|
+
*/
|
|
36
|
+
mergeArchive(archiveToMergePath: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Adds extracted files to the current archive.
|
|
39
|
+
* @param extractedFolderPath - The path of the folder containing extracted files.
|
|
40
|
+
* @returns Promise<void>
|
|
41
|
+
*/
|
|
42
|
+
private addExtractedFilesToArchive;
|
|
43
|
+
}
|
|
44
|
+
export default StoreArchiveManager;
|
|
45
|
+
//# sourceMappingURL=StoreArchiveManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreArchiveManager.d.ts","sourceRoot":"","sources":["../../src/utils/StoreArchiveManager.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,cAAM,mBAAmB;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAwB;IAE5C;;;OAGG;gBACS,WAAW,EAAE,MAAM;IAK/B;;;OAGG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3C;;;;;OAKG;IACU,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzF;;;;OAIG;IACU,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjE;;;;;OAKG;IACU,YAAY,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCpE;;;;OAIG;YACW,0BAA0B;CAkB3C;AAED,eAAe,mBAAmB,CAAC"}
|