@push.rocks/smartmta 5.1.3 → 5.2.1

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.
Files changed (98) hide show
  1. package/changelog.md +15 -0
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/index.d.ts +3 -0
  5. package/dist_ts/index.js +4 -0
  6. package/dist_ts/logger.d.ts +17 -0
  7. package/dist_ts/logger.js +76 -0
  8. package/dist_ts/mail/core/classes.bouncemanager.d.ts +185 -0
  9. package/dist_ts/mail/core/classes.bouncemanager.js +569 -0
  10. package/dist_ts/mail/core/classes.email.d.ts +291 -0
  11. package/dist_ts/mail/core/classes.email.js +802 -0
  12. package/dist_ts/mail/core/classes.emailvalidator.d.ts +61 -0
  13. package/dist_ts/mail/core/classes.emailvalidator.js +184 -0
  14. package/dist_ts/mail/core/classes.templatemanager.d.ts +95 -0
  15. package/dist_ts/mail/core/classes.templatemanager.js +240 -0
  16. package/dist_ts/mail/core/index.d.ts +4 -0
  17. package/dist_ts/mail/core/index.js +6 -0
  18. package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +163 -0
  19. package/dist_ts/mail/delivery/classes.delivery.queue.js +488 -0
  20. package/dist_ts/mail/delivery/classes.delivery.system.d.ts +160 -0
  21. package/dist_ts/mail/delivery/classes.delivery.system.js +630 -0
  22. package/dist_ts/mail/delivery/classes.unified.rate.limiter.d.ts +200 -0
  23. package/dist_ts/mail/delivery/classes.unified.rate.limiter.js +820 -0
  24. package/dist_ts/mail/delivery/index.d.ts +4 -0
  25. package/dist_ts/mail/delivery/index.js +6 -0
  26. package/dist_ts/mail/delivery/interfaces.d.ts +140 -0
  27. package/dist_ts/mail/delivery/interfaces.js +17 -0
  28. package/dist_ts/mail/index.d.ts +7 -0
  29. package/dist_ts/mail/index.js +12 -0
  30. package/dist_ts/mail/routing/classes.dkim.manager.d.ts +25 -0
  31. package/dist_ts/mail/routing/classes.dkim.manager.js +127 -0
  32. package/dist_ts/mail/routing/classes.dns.manager.d.ts +79 -0
  33. package/dist_ts/mail/routing/classes.dns.manager.js +415 -0
  34. package/dist_ts/mail/routing/classes.domain.registry.d.ts +54 -0
  35. package/dist_ts/mail/routing/classes.domain.registry.js +119 -0
  36. package/dist_ts/mail/routing/classes.email.action.executor.d.ts +33 -0
  37. package/dist_ts/mail/routing/classes.email.action.executor.js +137 -0
  38. package/dist_ts/mail/routing/classes.email.router.d.ts +171 -0
  39. package/dist_ts/mail/routing/classes.email.router.js +494 -0
  40. package/dist_ts/mail/routing/classes.unified.email.server.d.ts +241 -0
  41. package/dist_ts/mail/routing/classes.unified.email.server.js +935 -0
  42. package/dist_ts/mail/routing/index.d.ts +7 -0
  43. package/dist_ts/mail/routing/index.js +9 -0
  44. package/dist_ts/mail/routing/interfaces.d.ts +187 -0
  45. package/dist_ts/mail/routing/interfaces.js +2 -0
  46. package/dist_ts/mail/security/classes.dkimcreator.d.ts +72 -0
  47. package/dist_ts/mail/security/classes.dkimcreator.js +360 -0
  48. package/dist_ts/mail/security/classes.spfverifier.d.ts +62 -0
  49. package/dist_ts/mail/security/classes.spfverifier.js +87 -0
  50. package/dist_ts/mail/security/index.d.ts +2 -0
  51. package/dist_ts/mail/security/index.js +4 -0
  52. package/dist_ts/paths.d.ts +14 -0
  53. package/dist_ts/paths.js +39 -0
  54. package/dist_ts/plugins.d.ts +24 -0
  55. package/dist_ts/plugins.js +28 -0
  56. package/dist_ts/security/classes.contentscanner.d.ts +130 -0
  57. package/dist_ts/security/classes.contentscanner.js +338 -0
  58. package/dist_ts/security/classes.ipreputationchecker.d.ts +73 -0
  59. package/dist_ts/security/classes.ipreputationchecker.js +263 -0
  60. package/dist_ts/security/classes.rustsecuritybridge.d.ts +403 -0
  61. package/dist_ts/security/classes.rustsecuritybridge.js +502 -0
  62. package/dist_ts/security/classes.securitylogger.d.ts +140 -0
  63. package/dist_ts/security/classes.securitylogger.js +235 -0
  64. package/dist_ts/security/index.d.ts +4 -0
  65. package/dist_ts/security/index.js +5 -0
  66. package/package.json +6 -1
  67. package/ts/00_commitinfo_data.ts +8 -0
  68. package/ts/index.ts +3 -0
  69. package/ts/logger.ts +91 -0
  70. package/ts/mail/core/classes.bouncemanager.ts +731 -0
  71. package/ts/mail/core/classes.email.ts +942 -0
  72. package/ts/mail/core/classes.emailvalidator.ts +239 -0
  73. package/ts/mail/core/classes.templatemanager.ts +320 -0
  74. package/ts/mail/core/index.ts +5 -0
  75. package/ts/mail/delivery/classes.delivery.queue.ts +645 -0
  76. package/ts/mail/delivery/classes.delivery.system.ts +816 -0
  77. package/ts/mail/delivery/classes.unified.rate.limiter.ts +1053 -0
  78. package/ts/mail/delivery/index.ts +5 -0
  79. package/ts/mail/delivery/interfaces.ts +167 -0
  80. package/ts/mail/index.ts +17 -0
  81. package/ts/mail/routing/classes.dkim.manager.ts +157 -0
  82. package/ts/mail/routing/classes.dns.manager.ts +573 -0
  83. package/ts/mail/routing/classes.domain.registry.ts +139 -0
  84. package/ts/mail/routing/classes.email.action.executor.ts +175 -0
  85. package/ts/mail/routing/classes.email.router.ts +575 -0
  86. package/ts/mail/routing/classes.unified.email.server.ts +1207 -0
  87. package/ts/mail/routing/index.ts +9 -0
  88. package/ts/mail/routing/interfaces.ts +202 -0
  89. package/ts/mail/security/classes.dkimcreator.ts +447 -0
  90. package/ts/mail/security/classes.spfverifier.ts +126 -0
  91. package/ts/mail/security/index.ts +3 -0
  92. package/ts/paths.ts +48 -0
  93. package/ts/plugins.ts +53 -0
  94. package/ts/security/classes.contentscanner.ts +400 -0
  95. package/ts/security/classes.ipreputationchecker.ts +315 -0
  96. package/ts/security/classes.rustsecuritybridge.ts +964 -0
  97. package/ts/security/classes.securitylogger.ts +299 -0
  98. package/ts/security/index.ts +40 -0
@@ -0,0 +1,62 @@
1
+ /**
2
+ * SPF result qualifiers
3
+ */
4
+ export declare enum SpfQualifier {
5
+ PASS = "+",
6
+ NEUTRAL = "?",
7
+ SOFTFAIL = "~",
8
+ FAIL = "-"
9
+ }
10
+ /**
11
+ * SPF mechanism types
12
+ */
13
+ export declare enum SpfMechanismType {
14
+ ALL = "all",
15
+ INCLUDE = "include",
16
+ A = "a",
17
+ MX = "mx",
18
+ IP4 = "ip4",
19
+ IP6 = "ip6",
20
+ EXISTS = "exists",
21
+ REDIRECT = "redirect",
22
+ EXP = "exp"
23
+ }
24
+ /**
25
+ * SPF mechanism definition
26
+ */
27
+ export interface SpfMechanism {
28
+ qualifier: SpfQualifier;
29
+ type: SpfMechanismType;
30
+ value?: string;
31
+ }
32
+ /**
33
+ * SPF record parsed data
34
+ */
35
+ export interface SpfRecord {
36
+ version: string;
37
+ mechanisms: SpfMechanism[];
38
+ modifiers: Record<string, string>;
39
+ }
40
+ /**
41
+ * SPF verification result
42
+ */
43
+ export interface SpfResult {
44
+ result: 'pass' | 'neutral' | 'softfail' | 'fail' | 'temperror' | 'permerror' | 'none';
45
+ explanation?: string;
46
+ domain: string;
47
+ ip: string;
48
+ record?: string;
49
+ error?: string;
50
+ }
51
+ /**
52
+ * Class for verifying SPF records.
53
+ * Delegates actual SPF evaluation to the Rust security bridge.
54
+ * Retains parseSpfRecord() for lightweight local parsing.
55
+ */
56
+ export declare class SpfVerifier {
57
+ constructor(_dnsManager?: any);
58
+ /**
59
+ * Parse SPF record from TXT record (pure string parsing, no DNS)
60
+ */
61
+ parseSpfRecord(record: string): SpfRecord | null;
62
+ }
@@ -0,0 +1,87 @@
1
+ import { logger } from '../../logger.js';
2
+ /**
3
+ * SPF result qualifiers
4
+ */
5
+ export var SpfQualifier;
6
+ (function (SpfQualifier) {
7
+ SpfQualifier["PASS"] = "+";
8
+ SpfQualifier["NEUTRAL"] = "?";
9
+ SpfQualifier["SOFTFAIL"] = "~";
10
+ SpfQualifier["FAIL"] = "-";
11
+ })(SpfQualifier || (SpfQualifier = {}));
12
+ /**
13
+ * SPF mechanism types
14
+ */
15
+ export var SpfMechanismType;
16
+ (function (SpfMechanismType) {
17
+ SpfMechanismType["ALL"] = "all";
18
+ SpfMechanismType["INCLUDE"] = "include";
19
+ SpfMechanismType["A"] = "a";
20
+ SpfMechanismType["MX"] = "mx";
21
+ SpfMechanismType["IP4"] = "ip4";
22
+ SpfMechanismType["IP6"] = "ip6";
23
+ SpfMechanismType["EXISTS"] = "exists";
24
+ SpfMechanismType["REDIRECT"] = "redirect";
25
+ SpfMechanismType["EXP"] = "exp";
26
+ })(SpfMechanismType || (SpfMechanismType = {}));
27
+ /**
28
+ * Class for verifying SPF records.
29
+ * Delegates actual SPF evaluation to the Rust security bridge.
30
+ * Retains parseSpfRecord() for lightweight local parsing.
31
+ */
32
+ export class SpfVerifier {
33
+ constructor(_dnsManager) {
34
+ // dnsManager is no longer needed — Rust handles DNS lookups
35
+ }
36
+ /**
37
+ * Parse SPF record from TXT record (pure string parsing, no DNS)
38
+ */
39
+ parseSpfRecord(record) {
40
+ if (!record.startsWith('v=spf1')) {
41
+ return null;
42
+ }
43
+ try {
44
+ const spfRecord = {
45
+ version: 'spf1',
46
+ mechanisms: [],
47
+ modifiers: {}
48
+ };
49
+ const terms = record.split(' ').filter(term => term.length > 0);
50
+ for (let i = 1; i < terms.length; i++) {
51
+ const term = terms[i];
52
+ if (term.includes('=')) {
53
+ const [name, value] = term.split('=');
54
+ spfRecord.modifiers[name] = value;
55
+ continue;
56
+ }
57
+ let qualifier = SpfQualifier.PASS;
58
+ let mechanismText = term;
59
+ if (term.startsWith('+') || term.startsWith('-') ||
60
+ term.startsWith('~') || term.startsWith('?')) {
61
+ qualifier = term[0];
62
+ mechanismText = term.substring(1);
63
+ }
64
+ const colonIndex = mechanismText.indexOf(':');
65
+ let type;
66
+ let value;
67
+ if (colonIndex !== -1) {
68
+ type = mechanismText.substring(0, colonIndex);
69
+ value = mechanismText.substring(colonIndex + 1);
70
+ }
71
+ else {
72
+ type = mechanismText;
73
+ }
74
+ spfRecord.mechanisms.push({ qualifier, type, value });
75
+ }
76
+ return spfRecord;
77
+ }
78
+ catch (error) {
79
+ logger.log('error', `Error parsing SPF record: ${error.message}`, {
80
+ record,
81
+ error: error.message
82
+ });
83
+ return null;
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zcGZ2ZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL21haWwvc2VjdXJpdHkvY2xhc3Nlcy5zcGZ2ZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekM7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxZQUtYO0FBTEQsV0FBWSxZQUFZO0lBQ3RCLDBCQUFVLENBQUE7SUFDViw2QkFBYSxDQUFBO0lBQ2IsOEJBQWMsQ0FBQTtJQUNkLDBCQUFVLENBQUE7QUFDWixDQUFDLEVBTFcsWUFBWSxLQUFaLFlBQVksUUFLdkI7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGdCQVVYO0FBVkQsV0FBWSxnQkFBZ0I7SUFDMUIsK0JBQVcsQ0FBQTtJQUNYLHVDQUFtQixDQUFBO0lBQ25CLDJCQUFPLENBQUE7SUFDUCw2QkFBUyxDQUFBO0lBQ1QsK0JBQVcsQ0FBQTtJQUNYLCtCQUFXLENBQUE7SUFDWCxxQ0FBaUIsQ0FBQTtJQUNqQix5Q0FBcUIsQ0FBQTtJQUNyQiwrQkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVZXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFVM0I7QUFnQ0Q7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBQ3RCLFlBQVksV0FBaUI7UUFDM0IsNERBQTREO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxNQUFjO1FBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQWM7Z0JBQzNCLE9BQU8sRUFBRSxNQUFNO2dCQUNmLFVBQVUsRUFBRSxFQUFFO2dCQUNkLFNBQVMsRUFBRSxFQUFFO2FBQ2QsQ0FBQztZQUVGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVoRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXRCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN2QixNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3RDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUNsQyxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsSUFBSSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztnQkFDbEMsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUV6QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7b0JBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNqRCxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBaUIsQ0FBQztvQkFDcEMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7Z0JBRUQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxJQUFzQixDQUFDO2dCQUMzQixJQUFJLEtBQXlCLENBQUM7Z0JBRTlCLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLElBQUksR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQXFCLENBQUM7b0JBQ2xFLEtBQUssR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksR0FBRyxhQUFpQyxDQUFDO2dCQUMzQyxDQUFDO2dCQUVELFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFFRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDZCQUE2QixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ2hFLE1BQU07Z0JBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPO2FBQ3JCLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRiJ9
@@ -0,0 +1,2 @@
1
+ export * from './classes.dkimcreator.js';
2
+ export * from './classes.spfverifier.js';
@@ -0,0 +1,4 @@
1
+ // Email security components
2
+ export * from './classes.dkimcreator.js';
3
+ export * from './classes.spfverifier.js';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tYWlsL3NlY3VyaXR5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMEJBQTBCLENBQUMifQ==
@@ -0,0 +1,14 @@
1
+ export declare const baseDir: string;
2
+ export declare const packageDir: string;
3
+ export declare const distServe: string;
4
+ export declare const dataDir: string;
5
+ export declare const keysDir: string;
6
+ export declare const dnsRecordsDir: string;
7
+ export declare const sentEmailsDir: string;
8
+ export declare const receivedEmailsDir: string;
9
+ export declare const failedEmailsDir: string;
10
+ export declare const logsDir: string;
11
+ export declare const emailTemplatesDir: string;
12
+ export declare const MtaAttachmentsDir: string;
13
+ export declare const configPath: string;
14
+ export declare function ensureDirectories(): Promise<void>;
@@ -0,0 +1,39 @@
1
+ import * as plugins from './plugins.js';
2
+ // Base directories
3
+ export const baseDir = process.cwd();
4
+ export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
5
+ export const distServe = plugins.path.join(packageDir, './dist_serve');
6
+ // Configure data directory with environment variable or default to .nogit/data
7
+ const DEFAULT_DATA_PATH = '.nogit/data';
8
+ export const dataDir = process.env.DATA_DIR
9
+ ? process.env.DATA_DIR
10
+ : plugins.path.join(baseDir, DEFAULT_DATA_PATH);
11
+ // MTA directories
12
+ export const keysDir = plugins.path.join(dataDir, 'keys');
13
+ export const dnsRecordsDir = plugins.path.join(dataDir, 'dns');
14
+ export const sentEmailsDir = plugins.path.join(dataDir, 'emails', 'sent');
15
+ export const receivedEmailsDir = plugins.path.join(dataDir, 'emails', 'received');
16
+ export const failedEmailsDir = plugins.path.join(dataDir, 'emails', 'failed'); // For failed emails
17
+ export const logsDir = plugins.path.join(dataDir, 'logs'); // For logs
18
+ // Email template directories
19
+ export const emailTemplatesDir = plugins.path.join(dataDir, 'templates', 'email');
20
+ export const MtaAttachmentsDir = plugins.path.join(dataDir, 'attachments'); // For email attachments
21
+ // Configuration path
22
+ export const configPath = process.env.CONFIG_PATH
23
+ ? process.env.CONFIG_PATH
24
+ : plugins.path.join(baseDir, 'config.json');
25
+ // Create directories if they don't exist
26
+ export async function ensureDirectories() {
27
+ // Ensure data directories
28
+ await plugins.smartfs.directory(dataDir).recursive().create();
29
+ await plugins.smartfs.directory(keysDir).recursive().create();
30
+ await plugins.smartfs.directory(dnsRecordsDir).recursive().create();
31
+ await plugins.smartfs.directory(sentEmailsDir).recursive().create();
32
+ await plugins.smartfs.directory(receivedEmailsDir).recursive().create();
33
+ await plugins.smartfs.directory(failedEmailsDir).recursive().create();
34
+ await plugins.smartfs.directory(logsDir).recursive().create();
35
+ // Ensure email template directories
36
+ await plugins.smartfs.directory(emailTemplatesDir).recursive().create();
37
+ await plugins.smartfs.directory(MtaAttachmentsDir).recursive().create();
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxtQkFBbUI7QUFDbkIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyQyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQy9ELEtBQUssQ0FDTixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUV2RSwrRUFBK0U7QUFDL0UsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtJQUN6QyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO0lBQ3RCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUVsRCxtQkFBbUI7QUFDbkIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUks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
@@ -0,0 +1,24 @@
1
+ import * as dns from 'dns';
2
+ import * as fs from 'fs';
3
+ import * as crypto from 'crypto';
4
+ import * as http from 'http';
5
+ import * as net from 'net';
6
+ import * as os from 'os';
7
+ import * as path from 'path';
8
+ import * as tls from 'tls';
9
+ import * as util from 'util';
10
+ export { dns, fs, crypto, http, net, os, path, tls, util, };
11
+ import * as smartfile from '@push.rocks/smartfile';
12
+ import { SmartFs } from '@push.rocks/smartfs';
13
+ import * as smartlog from '@push.rocks/smartlog';
14
+ import * as smartmail from '@push.rocks/smartmail';
15
+ import * as smartpath from '@push.rocks/smartpath';
16
+ import * as smartrust from '@push.rocks/smartrust';
17
+ export declare const smartfs: SmartFs;
18
+ export { smartfile, SmartFs, smartlog, smartmail, smartpath, smartrust };
19
+ export type TLogLevel = 'error' | 'warn' | 'info' | 'success' | 'debug';
20
+ import * as tsclass from '@tsclass/tsclass';
21
+ export { tsclass, };
22
+ import mailparser from 'mailparser';
23
+ import * as uuid from 'uuid';
24
+ export { mailparser, uuid, };
@@ -0,0 +1,28 @@
1
+ // node native
2
+ import * as dns from 'dns';
3
+ import * as fs from 'fs';
4
+ import * as crypto from 'crypto';
5
+ import * as http from 'http';
6
+ import * as net from 'net';
7
+ import * as os from 'os';
8
+ import * as path from 'path';
9
+ import * as tls from 'tls';
10
+ import * as util from 'util';
11
+ export { dns, fs, crypto, http, net, os, path, tls, util, };
12
+ // @push.rocks scope
13
+ import * as smartfile from '@push.rocks/smartfile';
14
+ import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs';
15
+ import * as smartlog from '@push.rocks/smartlog';
16
+ import * as smartmail from '@push.rocks/smartmail';
17
+ import * as smartpath from '@push.rocks/smartpath';
18
+ import * as smartrust from '@push.rocks/smartrust';
19
+ export const smartfs = new SmartFs(new SmartFsProviderNode());
20
+ export { smartfile, SmartFs, smartlog, smartmail, smartpath, smartrust };
21
+ // tsclass scope
22
+ import * as tsclass from '@tsclass/tsclass';
23
+ export { tsclass, };
24
+ // third party
25
+ import mailparser from 'mailparser';
26
+ import * as uuid from 'uuid';
27
+ export { mailparser, uuid, };
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsRUFBRSxFQUNGLE1BQU0sRUFDTixJQUFJLEVBQ0osR0FBRyxFQUNILEVBQUUsRUFDRixJQUFJLEVBQ0osR0FBRyxFQUNILElBQUksR0FDTCxDQUFBO0FBRUQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25FLE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0FBRTlELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBS3pFLGdCQUFnQjtBQUNoQixPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFDTCxPQUFPLEdBQ1IsQ0FBQTtBQUVELGNBQWM7QUFDZCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUNMLFVBQVUsRUFDVixJQUFJLEdBQ0wsQ0FBQSJ9
@@ -0,0 +1,130 @@
1
+ import { Email } from '../mail/core/classes.email.js';
2
+ /**
3
+ * Scan result information
4
+ */
5
+ export interface IScanResult {
6
+ isClean: boolean;
7
+ threatType?: string;
8
+ threatDetails?: string;
9
+ threatScore: number;
10
+ scannedElements: string[];
11
+ timestamp: number;
12
+ }
13
+ /**
14
+ * Options for content scanner configuration
15
+ */
16
+ export interface IContentScannerOptions {
17
+ maxCacheSize?: number;
18
+ cacheTTL?: number;
19
+ scanSubject?: boolean;
20
+ scanBody?: boolean;
21
+ scanAttachments?: boolean;
22
+ maxAttachmentSizeToScan?: number;
23
+ scanAttachmentNames?: boolean;
24
+ blockExecutables?: boolean;
25
+ blockMacros?: boolean;
26
+ customRules?: Array<{
27
+ pattern: string | RegExp;
28
+ type: string;
29
+ score: number;
30
+ description: string;
31
+ }>;
32
+ minThreatScore?: number;
33
+ highThreatScore?: number;
34
+ }
35
+ /**
36
+ * Threat categories
37
+ */
38
+ export declare enum ThreatCategory {
39
+ SPAM = "spam",
40
+ PHISHING = "phishing",
41
+ MALWARE = "malware",
42
+ EXECUTABLE = "executable",
43
+ SUSPICIOUS_LINK = "suspicious_link",
44
+ MALICIOUS_MACRO = "malicious_macro",
45
+ XSS = "xss",
46
+ SENSITIVE_DATA = "sensitive_data",
47
+ BLACKLISTED_CONTENT = "blacklisted_content",
48
+ CUSTOM_RULE = "custom_rule"
49
+ }
50
+ /**
51
+ * Content Scanner for detecting malicious email content
52
+ */
53
+ export declare class ContentScanner {
54
+ private static instance;
55
+ private scanCache;
56
+ private options;
57
+ /**
58
+ * Default options for the content scanner
59
+ */
60
+ private static readonly DEFAULT_OPTIONS;
61
+ /**
62
+ * Constructor for the ContentScanner
63
+ * @param options Configuration options
64
+ */
65
+ constructor(options?: IContentScannerOptions);
66
+ /**
67
+ * Get the singleton instance of the scanner
68
+ * @param options Configuration options
69
+ * @returns Singleton scanner instance
70
+ */
71
+ static getInstance(options?: IContentScannerOptions): ContentScanner;
72
+ /**
73
+ * Scan an email for malicious content.
74
+ * Delegates text/subject/html/filename pattern scanning to Rust.
75
+ * Binary attachment scanning (PE headers, VBA macros) stays in TS.
76
+ * @param email The email to scan
77
+ * @returns Scan result
78
+ */
79
+ scanEmail(email: Email): Promise<IScanResult>;
80
+ /**
81
+ * Generate a cache key from an email
82
+ * @param email The email to generate a key for
83
+ * @returns Cache key
84
+ */
85
+ private generateCacheKey;
86
+ /**
87
+ * Scan attachment binary content for PE headers and VBA macros.
88
+ * This stays in TS because it accesses raw Buffer data (too large for IPC).
89
+ * @param attachment The attachment to scan
90
+ * @param result The scan result to update
91
+ */
92
+ private scanAttachmentBinary;
93
+ /**
94
+ * Apply custom rules (runtime-configured patterns) to the email.
95
+ * These stay in TS because they are configured at runtime.
96
+ * @param email The email to check
97
+ * @param result The scan result to update
98
+ */
99
+ private applyCustomRules;
100
+ /**
101
+ * Extract text from a binary buffer for scanning
102
+ * @param buffer Binary content
103
+ * @returns Extracted text (may be partial)
104
+ */
105
+ private extractTextFromBuffer;
106
+ /**
107
+ * Check if an Office document likely contains macros
108
+ * @param attachment The attachment to check
109
+ * @returns Whether the file likely contains macros
110
+ */
111
+ private likelyContainsMacros;
112
+ /**
113
+ * Log a high threat finding to the security logger
114
+ * @param email The email containing the threat
115
+ * @param result The scan result
116
+ */
117
+ private logHighThreatFound;
118
+ /**
119
+ * Log a threat finding to the security logger
120
+ * @param email The email containing the threat
121
+ * @param result The scan result
122
+ */
123
+ private logThreatFound;
124
+ /**
125
+ * Get threat level description based on score
126
+ * @param score Threat score
127
+ * @returns Threat level description
128
+ */
129
+ static getThreatLevel(score: number): 'none' | 'low' | 'medium' | 'high';
130
+ }