marcattacks 2.2.5 → 2.2.6
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/README.md +17 -2
- package/dist/attacker.d.ts +24 -1
- package/dist/attacker.d.ts.map +1 -1
- package/dist/attacker.js +139 -125
- package/dist/attacker.js.map +1 -1
- package/dist/command.d.ts +3 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/{index.js → command.js} +12 -2
- package/dist/command.js.map +1 -0
- package/dist/demo.d.ts +2 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +8 -0
- package/dist/demo.js.map +1 -0
- package/dist/globber.d.ts +3 -0
- package/dist/globber.d.ts.map +1 -0
- package/dist/globber.js +131 -0
- package/dist/globber.js.map +1 -0
- package/dist/output/json.d.ts.map +1 -1
- package/dist/output/json.js +3 -5
- package/dist/output/json.js.map +1 -1
- package/dist/output/rdf.js +2 -2
- package/dist/output/xml.d.ts.map +1 -1
- package/dist/output/xml.js +3 -5
- package/dist/output/xml.js.map +1 -1
- package/dist/{filestream.d.ts → stream/filestream.d.ts} +1 -0
- package/dist/stream/filestream.d.ts.map +1 -0
- package/dist/stream/filestream.js +65 -0
- package/dist/stream/filestream.js.map +1 -0
- package/dist/stream/httpstream.d.ts.map +1 -0
- package/dist/{httpstream.js → stream/httpstream.js} +7 -3
- package/dist/stream/httpstream.js.map +1 -0
- package/dist/{s3stream.d.ts → stream/s3stream.d.ts} +1 -0
- package/dist/stream/s3stream.d.ts.map +1 -0
- package/dist/{s3stream.js → stream/s3stream.js} +64 -1
- package/dist/stream/s3stream.js.map +1 -0
- package/dist/{sftpstream.d.ts → stream/sftpstream.d.ts} +1 -0
- package/dist/stream/sftpstream.d.ts.map +1 -0
- package/dist/{sftpstream.js → stream/sftpstream.js} +66 -2
- package/dist/stream/sftpstream.js.map +1 -0
- package/dist/stream/slow-writable.d.ts.map +1 -0
- package/dist/stream/slow-writable.js.map +1 -0
- package/dist/util/stream_helpers.d.ts.map +1 -1
- package/dist/util/stream_helpers.js +9 -13
- package/dist/util/stream_helpers.js.map +1 -1
- package/package.json +3 -2
- package/dist/filestream.d.ts.map +0 -1
- package/dist/filestream.js +0 -32
- package/dist/filestream.js.map +0 -1
- package/dist/httpstream.d.ts.map +0 -1
- package/dist/httpstream.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/s3stream.d.ts.map +0 -1
- package/dist/s3stream.js.map +0 -1
- package/dist/sftpstream.d.ts.map +0 -1
- package/dist/sftpstream.js.map +0 -1
- package/dist/slow-writable.d.ts.map +0 -1
- package/dist/slow-writable.js.map +0 -1
- /package/dist/{httpstream.d.ts → stream/httpstream.d.ts} +0 -0
- /package/dist/{slow-writable.d.ts → stream/slow-writable.d.ts} +0 -0
- /package/dist/{slow-writable.js → stream/slow-writable.js} +0 -0
package/README.md
CHANGED
|
@@ -80,7 +80,7 @@ marcattacks http://somewhere.org/data.xml
|
|
|
80
80
|
An S3 path
|
|
81
81
|
|
|
82
82
|
```
|
|
83
|
-
marcattacks s3://accessKey:secretKey@
|
|
83
|
+
marcattacks s3://accessKey:secretKey@hostname:port/bucket/key
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
use `s3s://...` for using an SSL layer.
|
|
@@ -159,4 +159,19 @@ Available variables:
|
|
|
159
159
|
- S3_ACCESS_KEY
|
|
160
160
|
- S3_SECRET_KEY
|
|
161
161
|
|
|
162
|
-
A SFTP private key can be provided using the `--key-env` command line option. E.g. `--key-env PRIVATE_KEY`, which results reading a `PRIVATE_KEY` environment variable.
|
|
162
|
+
A SFTP private key can be provided using the `--key-env` command line option. E.g. `--key-env PRIVATE_KEY`, which results reading a `PRIVATE_KEY` environment variable.
|
|
163
|
+
|
|
164
|
+
## Discover files at a (remote) endpoint
|
|
165
|
+
|
|
166
|
+
Find all files that end with xml on an sftp site:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
npx globtrotr --key ~/.ssh/mykey sftp://username@hostname:port/remote/path/@glob:xml
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Or, for an S3 site:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
npx globtrotr s3s://accessKey:privateKey@hostname:port/bucket/@glob:xml
|
|
176
|
+
```
|
|
177
|
+
|
package/dist/attacker.d.ts
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
|
+
import { Readable } from 'stream';
|
|
2
|
+
import { type Transform, type Writable } from 'node:stream';
|
|
1
3
|
export declare class PipelineError extends Error {
|
|
2
4
|
readonly statusCode: number;
|
|
3
5
|
constructor(message: string, statusCode: number);
|
|
4
6
|
}
|
|
5
|
-
export declare function
|
|
7
|
+
export declare function createInputReadStream(url: URL, opts: any): Promise<{
|
|
8
|
+
stream: Readable;
|
|
9
|
+
resolvedUrl: URL;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function createDecompressionStage(url: URL, opts: {
|
|
12
|
+
z?: boolean;
|
|
13
|
+
}): Promise<Transform | null>;
|
|
14
|
+
export declare function createUntarStage(url: URL, opts: {
|
|
15
|
+
tar?: boolean;
|
|
16
|
+
}): Promise<Transform | null>;
|
|
17
|
+
export declare function createInputTransformStage(url: URL, opts: {
|
|
18
|
+
from: string;
|
|
19
|
+
param?: any;
|
|
20
|
+
}): Promise<Transform>;
|
|
21
|
+
export declare function createCountSkipStage(opts: {
|
|
22
|
+
count?: number;
|
|
23
|
+
skip?: number;
|
|
24
|
+
}): Promise<Transform | null>;
|
|
25
|
+
export declare function createMapTransformStage(opts: any): Promise<Transform | null>;
|
|
26
|
+
export declare function createOutputWriteStream(opts: any): Promise<Writable>;
|
|
27
|
+
export declare function createOutputTransformStage(opts: any): Promise<Transform | null>;
|
|
28
|
+
export declare function attack(url: URL, opts: any): Promise<number>;
|
|
6
29
|
//# sourceMappingURL=attacker.d.ts.map
|
package/dist/attacker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attacker.d.ts","sourceRoot":"","sources":["../src/attacker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attacker.d.ts","sourceRoot":"","sources":["../src/attacker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5D,qBAAa,aAAc,SAAQ,KAAK;IACpC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAUlD;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,GAAG,CAAA;CAAE,CAAC,CA2ChH;AAED,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;IAAE,CAAC,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAKzG;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAKnG;AAED,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAA;CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAQ/G;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAK3G;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAMlF;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgD1E;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAMrF;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DjE"}
|
package/dist/attacker.js
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import log4js from 'log4js';
|
|
2
2
|
import { loadPlugin } from './plugin-loader.js';
|
|
3
|
-
import { sftpLatestFile, sftpReadStream, sftpWriteStream } from './sftpstream.js';
|
|
4
|
-
import { httpReadStream } from './httpstream.js';
|
|
3
|
+
import { sftpLatestFile, sftpReadStream, sftpWriteStream } from './stream/sftpstream.js';
|
|
4
|
+
import { httpReadStream } from './stream/httpstream.js';
|
|
5
5
|
import { Readable } from 'stream';
|
|
6
|
-
import { pathToFileURL } from "node:url";
|
|
7
6
|
import {} from 'node:stream';
|
|
8
|
-
import { SlowWritable } from './slow-writable.js';
|
|
9
|
-
import path from "node:path";
|
|
7
|
+
import { SlowWritable } from './stream/slow-writable.js';
|
|
10
8
|
import fs from 'fs';
|
|
11
|
-
import { s3LatestObject, s3ReadStream, s3WriteStream } from './s3stream.js';
|
|
9
|
+
import { s3LatestObject, s3ReadStream, s3WriteStream } from './stream/s3stream.js';
|
|
12
10
|
import { pipeline } from 'node:stream/promises';
|
|
13
11
|
import { createCountableSkippedStream, createUntarredStream, createUncompressedStream, createVerboseStream } from './util/stream_helpers.js';
|
|
14
|
-
import { fileLatestFile, fileReadStream } from './filestream.js';
|
|
12
|
+
import { fileLatestFile, fileReadStream } from './stream/filestream.js';
|
|
15
13
|
const logger = log4js.getLogger();
|
|
16
14
|
export class PipelineError extends Error {
|
|
17
15
|
statusCode;
|
|
@@ -24,135 +22,152 @@ export class PipelineError extends Error {
|
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
24
|
}
|
|
27
|
-
export async function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
export async function createInputReadStream(url, opts) {
|
|
26
|
+
logger.info(`using: ${getCleanURL(url)}`);
|
|
27
|
+
let readableStream;
|
|
28
|
+
let resolvedUrl = url;
|
|
29
|
+
if (url.protocol.startsWith("http")) {
|
|
30
|
+
readableStream = await httpReadStream(url.toString());
|
|
31
|
+
}
|
|
32
|
+
else if (url.protocol.startsWith("s3")) {
|
|
33
|
+
if (process.env.S3_ACCESS_KEY) {
|
|
34
|
+
url.username = process.env.S3_ACCESS_KEY;
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
if (process.env.S3_SECRET_KEY) {
|
|
37
|
+
url.password = process.env.S3_SECRET_KEY;
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
resolvedUrl = await s3LatestObject(url, opts);
|
|
40
|
+
readableStream = await s3ReadStream(resolvedUrl, opts);
|
|
41
|
+
}
|
|
42
|
+
else if (url.protocol === 'sftp:') {
|
|
43
|
+
if (process.env.SFTP_USERNAME) {
|
|
44
|
+
url.username = process.env.SFTP_USERNAME;
|
|
42
45
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (process.env.S3_ACCESS_KEY) {
|
|
46
|
-
url.username = process.env.S3_ACCESS_KEY;
|
|
47
|
-
}
|
|
48
|
-
if (process.env.S3_SECRET_KEY) {
|
|
49
|
-
url.password = process.env.S3_SECRET_KEY;
|
|
50
|
-
}
|
|
51
|
-
// optional resolve @latest
|
|
52
|
-
inputFile = await s3LatestObject(url, opts);
|
|
53
|
-
readableStream = await s3ReadStream(inputFile, opts);
|
|
46
|
+
if (process.env.SFTP_PASSWORD) {
|
|
47
|
+
url.password = process.env.SFTP_PASSWORD;
|
|
54
48
|
}
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
resolvedUrl = await sftpLatestFile(url, opts);
|
|
50
|
+
readableStream = await sftpReadStream(resolvedUrl, opts);
|
|
51
|
+
}
|
|
52
|
+
else if (url.protocol === 'stdin:') {
|
|
53
|
+
readableStream = process.stdin;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
resolvedUrl = await fileLatestFile(url);
|
|
57
|
+
readableStream = await fileReadStream(resolvedUrl);
|
|
58
|
+
}
|
|
59
|
+
return { stream: readableStream, resolvedUrl: resolvedUrl };
|
|
60
|
+
}
|
|
61
|
+
export async function createDecompressionStage(url, opts) {
|
|
62
|
+
if (opts.z || url.pathname.endsWith(".gz")) {
|
|
63
|
+
return createUncompressedStream();
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
export async function createUntarStage(url, opts) {
|
|
68
|
+
if (opts.tar || url.pathname.match(/.tar(.\w+$)?$/) || url.pathname.endsWith(".tgz")) {
|
|
69
|
+
return await createUntarredStream();
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
export async function createInputTransformStage(url, opts) {
|
|
74
|
+
if (!opts.from) {
|
|
75
|
+
console.error(`Need --from`);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const mod = await loadPlugin(opts.from, 'input');
|
|
79
|
+
return await mod.transform(Object.assign({ path: url }, opts.param));
|
|
80
|
+
}
|
|
81
|
+
export async function createCountSkipStage(opts) {
|
|
82
|
+
if (opts.count || opts.skip) {
|
|
83
|
+
return createCountableSkippedStream(opts.count, opts.skip);
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
export async function createMapTransformStage(opts) {
|
|
88
|
+
if (opts.map) {
|
|
89
|
+
const mod = await loadPlugin(opts.map, 'transform');
|
|
90
|
+
return await mod.transform(opts.param);
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
export async function createOutputWriteStream(opts) {
|
|
95
|
+
if (isWritableStream(opts.out)) {
|
|
96
|
+
return opts.out;
|
|
97
|
+
}
|
|
98
|
+
if (opts.out === '@slow') {
|
|
99
|
+
return new SlowWritable({ delayMs: 100 });
|
|
100
|
+
}
|
|
101
|
+
if (opts.out === '@errors') {
|
|
102
|
+
return new SlowWritable({ simulateErrorEveryN: 2 });
|
|
103
|
+
}
|
|
104
|
+
if (opts.out) {
|
|
105
|
+
if (opts.out.startsWith("sftp")) {
|
|
106
|
+
const url = new URL(opts.out);
|
|
57
107
|
if (process.env.SFTP_USERNAME) {
|
|
58
108
|
url.username = process.env.SFTP_USERNAME;
|
|
59
109
|
}
|
|
60
110
|
if (process.env.SFTP_PASSWORD) {
|
|
61
111
|
url.password = process.env.SFTP_PASSWORD;
|
|
62
112
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
readableStream = await sftpReadStream(inputFile, opts);
|
|
66
|
-
}
|
|
67
|
-
else if (inputFile.protocol === 'stdin:') {
|
|
68
|
-
readableStream = process.stdin;
|
|
113
|
+
logger.info(`put ${getCleanURL(url)}`);
|
|
114
|
+
return await sftpWriteStream(url, opts);
|
|
69
115
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
116
|
+
if (opts.out.startsWith("s3")) {
|
|
117
|
+
const url = new URL(opts.out);
|
|
118
|
+
if (process.env.S3_ACCESS_KEY) {
|
|
119
|
+
url.username = process.env.S3_ACCESS_KEY;
|
|
120
|
+
}
|
|
121
|
+
if (process.env.S3_SECRET_KEY) {
|
|
122
|
+
url.password = process.env.S3_SECRET_KEY;
|
|
123
|
+
}
|
|
124
|
+
logger.info(`put ${getCleanURL(url)}`);
|
|
125
|
+
return await s3WriteStream(url, {});
|
|
73
126
|
}
|
|
127
|
+
return fs.createWriteStream(opts.out, { encoding: 'utf-8' });
|
|
128
|
+
}
|
|
129
|
+
return process.stdout;
|
|
130
|
+
}
|
|
131
|
+
export async function createOutputTransformStage(opts) {
|
|
132
|
+
if (opts.to) {
|
|
133
|
+
const mod = await loadPlugin(opts.to, 'output');
|
|
134
|
+
return await mod.transform(opts.param);
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
export async function attack(url, opts) {
|
|
139
|
+
let result = 0;
|
|
140
|
+
try {
|
|
141
|
+
const { stream: readableStream, resolvedUrl: inputFile } = await createInputReadStream(url, opts);
|
|
74
142
|
const stages = [readableStream];
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
process.exitCode = 2;
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
transformer.on('finish', () => logger.debug('writeable finished'));
|
|
95
|
-
transformer.on('end', () => logger.debug('readable ended'));
|
|
96
|
-
transformer.on('close', () => logger.debug('stream closed'));
|
|
97
|
-
stages.push(transformer);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
console.error(`Need --from`);
|
|
101
|
-
process.exit(1);
|
|
102
|
-
}
|
|
103
|
-
if (opts.count || opts.skip) {
|
|
104
|
-
stages.push(createCountableSkippedStream(opts.count, opts.skip));
|
|
105
|
-
}
|
|
143
|
+
// Add decompression stage if needed
|
|
144
|
+
const decompressionStage = await createDecompressionStage(inputFile, opts);
|
|
145
|
+
if (decompressionStage)
|
|
146
|
+
stages.push(decompressionStage);
|
|
147
|
+
// Add untar stage if needed
|
|
148
|
+
const untarStage = await createUntarStage(inputFile, opts);
|
|
149
|
+
if (untarStage)
|
|
150
|
+
stages.push(untarStage);
|
|
151
|
+
// Add input transform stage (required)
|
|
152
|
+
const inputTransform = await createInputTransformStage(inputFile, opts);
|
|
153
|
+
stages.push(inputTransform);
|
|
154
|
+
// Add count/skip stage if needed
|
|
155
|
+
const countSkipStage = await createCountSkipStage(opts);
|
|
156
|
+
if (countSkipStage)
|
|
157
|
+
stages.push(countSkipStage);
|
|
158
|
+
// Add verbose stream (always included)
|
|
106
159
|
const verboseStream = createVerboseStream();
|
|
107
160
|
stages.push(verboseStream);
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
stages.push(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if (
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
outStream = new SlowWritable({ delayMs: 100 });
|
|
119
|
-
}
|
|
120
|
-
else if (opts.out === '@errors') {
|
|
121
|
-
outStream = new SlowWritable({ simulateErrorEveryN: 2 });
|
|
122
|
-
}
|
|
123
|
-
else if (opts.out) {
|
|
124
|
-
if (opts.out.startsWith("sftp")) {
|
|
125
|
-
const url = new URL(opts.out);
|
|
126
|
-
if (process.env.SFTP_USERNAME) {
|
|
127
|
-
url.username = process.env.SFTP_USERNAME;
|
|
128
|
-
}
|
|
129
|
-
if (process.env.SFTP_PASSWORD) {
|
|
130
|
-
url.password = process.env.SFTP_PASSWORD;
|
|
131
|
-
}
|
|
132
|
-
logger.info(`put ${getCleanURL(url)}`);
|
|
133
|
-
outStream = await sftpWriteStream(url, opts);
|
|
134
|
-
}
|
|
135
|
-
else if (opts.out.startsWith("s3")) {
|
|
136
|
-
const url = new URL(opts.out);
|
|
137
|
-
if (process.env.S3_ACCESS_KEY) {
|
|
138
|
-
url.username = process.env.S3_ACCESS_KEY;
|
|
139
|
-
}
|
|
140
|
-
if (process.env.S3_SECRET_KEY) {
|
|
141
|
-
url.password = process.env.S3_SECRET_KEY;
|
|
142
|
-
}
|
|
143
|
-
logger.info(`put ${getCleanURL(url)}`);
|
|
144
|
-
outStream = await s3WriteStream(url, {});
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
outStream = fs.createWriteStream(opts.out, { encoding: 'utf-8' });
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
outStream = process.stdout;
|
|
152
|
-
}
|
|
153
|
-
if (opts.to) {
|
|
154
|
-
const mod = await loadPlugin(opts.to, 'output');
|
|
155
|
-
stages.push(await mod.transform(opts.param));
|
|
161
|
+
// Add map transform stage if needed
|
|
162
|
+
const mapStage = await createMapTransformStage(opts);
|
|
163
|
+
if (mapStage)
|
|
164
|
+
stages.push(mapStage);
|
|
165
|
+
// Add output transform stage if needed
|
|
166
|
+
const outputTransform = await createOutputTransformStage(opts);
|
|
167
|
+
if (outputTransform) {
|
|
168
|
+
stages.push(outputTransform);
|
|
169
|
+
// Add output write stream
|
|
170
|
+
const outStream = await createOutputWriteStream(opts);
|
|
156
171
|
stages.push(outStream);
|
|
157
172
|
try {
|
|
158
173
|
await pipeline(stages);
|
|
@@ -173,17 +188,17 @@ export async function attack(url, opts) {
|
|
|
173
188
|
}
|
|
174
189
|
catch (e) {
|
|
175
190
|
if (e instanceof PipelineError) {
|
|
176
|
-
throw
|
|
191
|
+
throw e;
|
|
177
192
|
}
|
|
178
193
|
else {
|
|
179
194
|
logger.error(`process crashed with: ${e}`);
|
|
180
|
-
throw
|
|
195
|
+
throw e;
|
|
181
196
|
}
|
|
182
197
|
}
|
|
183
198
|
return result;
|
|
184
199
|
}
|
|
185
200
|
function getCleanURL(url) {
|
|
186
|
-
const tempUrl = new URL(url.href);
|
|
201
|
+
const tempUrl = new URL(url.href);
|
|
187
202
|
tempUrl.username = '***';
|
|
188
203
|
tempUrl.password = '***';
|
|
189
204
|
return tempUrl;
|
|
@@ -193,7 +208,6 @@ function isWritableStream(obj) {
|
|
|
193
208
|
typeof obj === 'object' &&
|
|
194
209
|
typeof obj.write === 'function' &&
|
|
195
210
|
typeof obj.end === 'function' &&
|
|
196
|
-
// internal state check
|
|
197
211
|
obj.writable !== false);
|
|
198
212
|
}
|
|
199
213
|
//# sourceMappingURL=attacker.js.map
|
package/dist/attacker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attacker.js","sourceRoot":"","sources":["../src/attacker.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAG,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"attacker.js","sourceRoot":"","sources":["../src/attacker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":""}
|
|
@@ -5,6 +5,8 @@ import path from "node:path";
|
|
|
5
5
|
import dotenv from 'dotenv';
|
|
6
6
|
import { attack, PipelineError } from './attacker.js';
|
|
7
7
|
import { createRequire } from 'node:module';
|
|
8
|
+
import { pathToFileURL } from "node:url";
|
|
9
|
+
import fs from 'fs';
|
|
8
10
|
const require = createRequire(import.meta.url);
|
|
9
11
|
const pkg = require('../package.json');
|
|
10
12
|
program.version(pkg.version)
|
|
@@ -111,7 +113,15 @@ async function main() {
|
|
|
111
113
|
console.error(`need an input file`);
|
|
112
114
|
process.exit(2);
|
|
113
115
|
}
|
|
114
|
-
|
|
116
|
+
let inputFile;
|
|
117
|
+
if (fs.existsSync(url)) {
|
|
118
|
+
const filePath = path.resolve(process.cwd(), url);
|
|
119
|
+
inputFile = pathToFileURL(filePath);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
inputFile = new URL(url);
|
|
123
|
+
}
|
|
124
|
+
const result = await attack(inputFile, opts);
|
|
115
125
|
logger.info(`total: ${result}`);
|
|
116
126
|
}
|
|
117
127
|
catch (e) {
|
|
@@ -135,4 +145,4 @@ function collect(value, previous) {
|
|
|
135
145
|
return previous;
|
|
136
146
|
}
|
|
137
147
|
}
|
|
138
|
-
//# sourceMappingURL=
|
|
148
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"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"}
|
package/dist/demo.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":""}
|
package/dist/demo.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createInputReadStream, createInputTransformStage } from "./attacker.js";
|
|
2
|
+
main();
|
|
3
|
+
async function main() {
|
|
4
|
+
const reader1 = await createInputReadStream("./data/sample.xml");
|
|
5
|
+
const reader2 = await createInputReadStream("./data/sample.xml");
|
|
6
|
+
const parser = await createInputTransformStage({ from: 'xml' }, "./data/sample.xml", reader1);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=demo.js.map
|
package/dist/demo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAEjF,IAAI,EAAE,CAAC;AAEP,KAAK,UAAU,IAAI;IACf,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IACjE,MAAM,MAAM,GAAI,MAAM,yBAAyB,CAAC,EAAC,IAAI,EAAE,KAAK,EAAC,EAAC,mBAAmB,EAAC,OAAO,CAAC,CAAC;AAE/F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globber.d.ts","sourceRoot":"","sources":["../src/globber.ts"],"names":[],"mappings":""}
|
package/dist/globber.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import log4js from 'log4js';
|
|
3
|
+
import { program } from 'commander';
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import dotenv from 'dotenv';
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
import { sftpGlobFiles } from './stream/sftpstream.js';
|
|
8
|
+
import { s3GlobFiles } from './stream/s3stream.js';
|
|
9
|
+
import { fileGlobFiles } from './stream/filestream.js';
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const pkg = require('../package.json');
|
|
12
|
+
program.version(pkg.version)
|
|
13
|
+
.argument('<file>')
|
|
14
|
+
.option('-c,--config <config>', 'config .env', path.join(process.cwd(), '.env'))
|
|
15
|
+
.option('--key <keyfile>', 'private key file')
|
|
16
|
+
.option('--key-env <env>', 'private key environment variable')
|
|
17
|
+
.option('--log <format>', 'logging format')
|
|
18
|
+
.option('--info', 'output debugging messages')
|
|
19
|
+
.option('--debug', 'output more debugging messages')
|
|
20
|
+
.option('--trace', 'output much more debugging messages');
|
|
21
|
+
program.parse(process.argv);
|
|
22
|
+
const opts = program.opts();
|
|
23
|
+
if (opts.log) {
|
|
24
|
+
let output = 'stderr';
|
|
25
|
+
let type = 0;
|
|
26
|
+
if (opts.log.indexOf('stdout') >= 0) {
|
|
27
|
+
output = 'stdout';
|
|
28
|
+
}
|
|
29
|
+
if (opts.log.indexOf('json') >= 0) {
|
|
30
|
+
type = 1;
|
|
31
|
+
}
|
|
32
|
+
if (type) {
|
|
33
|
+
configureJSONLogger(output);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
configureDefaultLogger(output);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
configureDefaultLogger('stderr');
|
|
41
|
+
}
|
|
42
|
+
const logger = log4js.getLogger();
|
|
43
|
+
if (opts.info) {
|
|
44
|
+
logger.level = "info";
|
|
45
|
+
}
|
|
46
|
+
if (opts.debug) {
|
|
47
|
+
logger.level = "debug";
|
|
48
|
+
}
|
|
49
|
+
if (opts.trace) {
|
|
50
|
+
logger.level = "trace";
|
|
51
|
+
}
|
|
52
|
+
if (opts.config) {
|
|
53
|
+
dotenv.config({ path: opts.config, quiet: true });
|
|
54
|
+
}
|
|
55
|
+
main();
|
|
56
|
+
function configureDefaultLogger(output) {
|
|
57
|
+
log4js.configure({
|
|
58
|
+
appenders: {
|
|
59
|
+
err: {
|
|
60
|
+
type: output,
|
|
61
|
+
layout: {
|
|
62
|
+
type: "pattern",
|
|
63
|
+
pattern: "%[%d %p %f{2} %m%]"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
categories: {
|
|
68
|
+
default: { appenders: ["err"], level: "off", enableCallStack: true }
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function configureJSONLogger(output) {
|
|
73
|
+
log4js.addLayout('json-pattern', (config) => {
|
|
74
|
+
return (logEvent) => {
|
|
75
|
+
return JSON.stringify({
|
|
76
|
+
timestamp: logEvent.startTime, // Similar to %d
|
|
77
|
+
level: logEvent.level.levelStr, // Similar to %p
|
|
78
|
+
category: logEvent.categoryName, // Similar to %c
|
|
79
|
+
message: logEvent.data.join(' '), // Similar to %m
|
|
80
|
+
context: logEvent.context, // Similar to %X (tokens)
|
|
81
|
+
pid: logEvent.pid // Similar to %z
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
log4js.configure({
|
|
86
|
+
appenders: {
|
|
87
|
+
err: {
|
|
88
|
+
type: output,
|
|
89
|
+
layout: {
|
|
90
|
+
type: "json-pattern"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
categories: {
|
|
95
|
+
default: { appenders: ["err"], level: "off", enableCallStack: true }
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async function main() {
|
|
100
|
+
try {
|
|
101
|
+
const url = program.args[0];
|
|
102
|
+
let globs = [];
|
|
103
|
+
if (url?.startsWith("sftp")) {
|
|
104
|
+
globs = await sftpGlobFiles(new URL(url), program.opts());
|
|
105
|
+
}
|
|
106
|
+
else if (url?.startsWith("s3")) {
|
|
107
|
+
const s3url = new URL(url);
|
|
108
|
+
if (process.env.S3_ACCESS_KEY) {
|
|
109
|
+
s3url.username = process.env.S3_ACCESS_KEY;
|
|
110
|
+
}
|
|
111
|
+
if (process.env.S3_SECRET_KEY) {
|
|
112
|
+
s3url.password = process.env.S3_SECRET_KEY;
|
|
113
|
+
}
|
|
114
|
+
globs = await s3GlobFiles(s3url, program.opts());
|
|
115
|
+
}
|
|
116
|
+
else if (url?.startsWith("file")) {
|
|
117
|
+
globs = await fileGlobFiles(new URL(url));
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
console.error(`${url} not supported`);
|
|
121
|
+
}
|
|
122
|
+
globs.forEach(g => {
|
|
123
|
+
console.log(g.href);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
logger.error("process crashed:", e);
|
|
128
|
+
process.exitCode = 4;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=globber.js.map
|