typescript-virtual-container 1.1.5 → 1.1.7

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.
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Honeypot tracking and auditing module for virtual shell events.
3
+ *
4
+ * Attaches listeners to VirtualShell, VirtualFileSystem, VirtualUserManager,
5
+ * SshMimic, and SftpMimic instances to log all activity for security auditing,
6
+ * anomaly detection, and forensic analysis.
7
+ *
8
+ * @module honeypot
9
+ */
10
+ import type { SshMimic } from "../SSHMimic";
11
+ import type { SftpMimic } from "../SSHMimic/sftp";
12
+ import type VirtualFileSystem from "../VirtualFileSystem";
13
+ import type { VirtualShell } from "../VirtualShell";
14
+ import type { VirtualUserManager } from "../VirtualUserManager";
15
+ /**
16
+ * Audit log entry recorded for each event.
17
+ */
18
+ export interface AuditLogEntry {
19
+ timestamp: string;
20
+ type: string;
21
+ source: string;
22
+ details: Record<string, unknown>;
23
+ }
24
+ /**
25
+ * Statistics tracker for honeypot activity.
26
+ */
27
+ export interface HoneyPotStats {
28
+ authAttempts: number;
29
+ authSuccesses: number;
30
+ authFailures: number;
31
+ commands: number;
32
+ fileWrites: number;
33
+ fileReads: number;
34
+ sessionStarts: number;
35
+ sessionEnds: number;
36
+ userCreated: number;
37
+ userDeleted: number;
38
+ clientConnects: number;
39
+ clientDisconnects: number;
40
+ }
41
+ /**
42
+ * HoneyPot audit and event tracking utility.
43
+ *
44
+ * Singleton-like helper that attaches listeners to virtual shell components
45
+ * and maintains an audit log of all activity.
46
+ */
47
+ export declare class HoneyPot {
48
+ private auditLog;
49
+ private stats;
50
+ private maxLogSize;
51
+ /**
52
+ * Creates a new HoneyPot instance.
53
+ *
54
+ * @param maxLogSize Maximum audit log entries to retain (default: 10000).
55
+ */
56
+ constructor(maxLogSize?: number);
57
+ /**
58
+ * Attaches honeypot listeners to all provided event emitters.
59
+ *
60
+ * @param shell VirtualShell instance.
61
+ * @param vfs VirtualFileSystem instance.
62
+ * @param users VirtualUserManager instance.
63
+ * @param ssh SshMimic instance (optional).
64
+ * @param sftp SftpMimic instance (optional).
65
+ */
66
+ attach(shell: VirtualShell, vfs: VirtualFileSystem, users: VirtualUserManager, ssh?: SshMimic, sftp?: SftpMimic): void;
67
+ /**
68
+ * Attaches to VirtualShell events.
69
+ */
70
+ private attachVirtualShell;
71
+ /**
72
+ * Attaches to VirtualFileSystem events.
73
+ */
74
+ private attachVirtualFileSystem;
75
+ /**
76
+ * Attaches to VirtualUserManager events.
77
+ */
78
+ private attachVirtualUserManager;
79
+ /**
80
+ * Attaches to SshMimic events.
81
+ */
82
+ private attachSshMimic;
83
+ /**
84
+ * Attaches to SftpMimic events.
85
+ */
86
+ private attachSftpMimic;
87
+ /**
88
+ * Records an audit log entry.
89
+ *
90
+ * @param source Event source (e.g., "SshMimic", "VirtualFileSystem").
91
+ * @param type Event type.
92
+ * @param details Event-specific data.
93
+ */
94
+ private log;
95
+ /**
96
+ * Returns audit log entries matching optional filters.
97
+ *
98
+ * @param type Optional event type filter.
99
+ * @param source Optional source filter.
100
+ * @returns Filtered audit log entries.
101
+ */
102
+ getAuditLog(type?: string, source?: string): AuditLogEntry[];
103
+ /**
104
+ * Returns current activity statistics.
105
+ *
106
+ * @returns Snapshot of honeypot stats.
107
+ */
108
+ getStats(): Readonly<HoneyPotStats>;
109
+ /**
110
+ * Clears audit log and resets statistics.
111
+ */
112
+ reset(): void;
113
+ /**
114
+ * Returns recent log entries in reverse chronological order.
115
+ *
116
+ * @param limit Number of recent entries to return (default: 100).
117
+ * @returns Recent audit log entries.
118
+ */
119
+ getRecent(limit?: number): AuditLogEntry[];
120
+ /**
121
+ * Detects potential security issues based on activity patterns.
122
+ *
123
+ * @returns Array of anomalies detected.
124
+ */
125
+ detectAnomalies(): Array<{
126
+ type: string;
127
+ severity: "low" | "medium" | "high";
128
+ message: string;
129
+ }>;
130
+ }
131
+ export default HoneyPot;
132
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Honeypot/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,iBAAiB,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,KAAK,CAaX;IAEF,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;OAIG;gBACS,UAAU,GAAE,MAAc;IAItC;;;;;;;;OAQG;IACI,MAAM,CACZ,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,kBAAkB,EACzB,GAAG,CAAC,EAAE,QAAQ,EACd,IAAI,CAAC,EAAE,SAAS,GACd,IAAI;IAYP;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkChC;;OAEG;IACH,OAAO,CAAC,cAAc;IAyCtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyCvB;;;;;;OAMG;IACH,OAAO,CAAC,GAAG;IAuBX;;;;;;OAMG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAOnE;;;;OAIG;IACI,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC;IAI1C;;OAEG;IACI,KAAK,IAAI,IAAI;IAkBpB;;;;;OAKG;IACI,SAAS,CAAC,KAAK,GAAE,MAAY,GAAG,aAAa,EAAE;IAItD;;;;OAIG;IACI,eAAe,IAAI,KAAK,CAAC;QAC/B,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QACpC,OAAO,EAAE,MAAM,CAAC;KAChB,CAAC;CAkDF;AAED,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Honeypot tracking and auditing module for virtual shell events.
3
+ *
4
+ * Attaches listeners to VirtualShell, VirtualFileSystem, VirtualUserManager,
5
+ * SshMimic, and SftpMimic instances to log all activity for security auditing,
6
+ * anomaly detection, and forensic analysis.
7
+ *
8
+ * @module honeypot
9
+ */
10
+ /**
11
+ * HoneyPot audit and event tracking utility.
12
+ *
13
+ * Singleton-like helper that attaches listeners to virtual shell components
14
+ * and maintains an audit log of all activity.
15
+ */
16
+ export class HoneyPot {
17
+ auditLog = [];
18
+ stats = {
19
+ authAttempts: 0,
20
+ authSuccesses: 0,
21
+ authFailures: 0,
22
+ commands: 0,
23
+ fileWrites: 0,
24
+ fileReads: 0,
25
+ sessionStarts: 0,
26
+ sessionEnds: 0,
27
+ userCreated: 0,
28
+ userDeleted: 0,
29
+ clientConnects: 0,
30
+ clientDisconnects: 0,
31
+ };
32
+ maxLogSize;
33
+ /**
34
+ * Creates a new HoneyPot instance.
35
+ *
36
+ * @param maxLogSize Maximum audit log entries to retain (default: 10000).
37
+ */
38
+ constructor(maxLogSize = 10000) {
39
+ this.maxLogSize = maxLogSize;
40
+ }
41
+ /**
42
+ * Attaches honeypot listeners to all provided event emitters.
43
+ *
44
+ * @param shell VirtualShell instance.
45
+ * @param vfs VirtualFileSystem instance.
46
+ * @param users VirtualUserManager instance.
47
+ * @param ssh SshMimic instance (optional).
48
+ * @param sftp SftpMimic instance (optional).
49
+ */
50
+ attach(shell, vfs, users, ssh, sftp) {
51
+ this.attachVirtualShell(shell);
52
+ this.attachVirtualFileSystem(vfs);
53
+ this.attachVirtualUserManager(users);
54
+ if (ssh) {
55
+ this.attachSshMimic(ssh);
56
+ }
57
+ if (sftp) {
58
+ this.attachSftpMimic(sftp);
59
+ }
60
+ }
61
+ /**
62
+ * Attaches to VirtualShell events.
63
+ */
64
+ attachVirtualShell(shell) {
65
+ shell.on("initialized", () => {
66
+ this.log("VirtualShell", "initialized", {});
67
+ });
68
+ shell.on("command", (data) => {
69
+ this.stats.commands++;
70
+ this.log("VirtualShell", "command", data);
71
+ });
72
+ shell.on("session:start", (data) => {
73
+ this.stats.sessionStarts++;
74
+ this.log("VirtualShell", "session:start", data);
75
+ });
76
+ }
77
+ /**
78
+ * Attaches to VirtualFileSystem events.
79
+ */
80
+ attachVirtualFileSystem(vfs) {
81
+ vfs.on("file:read", (data) => {
82
+ this.stats.fileReads++;
83
+ this.log("VirtualFileSystem", "file:read", data);
84
+ });
85
+ vfs.on("file:write", (data) => {
86
+ this.stats.fileWrites++;
87
+ this.log("VirtualFileSystem", "file:write", data);
88
+ });
89
+ vfs.on("dir:create", (data) => {
90
+ this.log("VirtualFileSystem", "dir:create", data);
91
+ });
92
+ vfs.on("mirror:flush", () => {
93
+ this.log("VirtualFileSystem", "mirror:flush", {});
94
+ });
95
+ }
96
+ /**
97
+ * Attaches to VirtualUserManager events.
98
+ */
99
+ attachVirtualUserManager(users) {
100
+ users.on("initialized", () => {
101
+ this.log("VirtualUserManager", "initialized", {});
102
+ });
103
+ users.on("user:add", (data) => {
104
+ this.stats.userCreated++;
105
+ this.log("VirtualUserManager", "user:add", data);
106
+ });
107
+ users.on("user:delete", (data) => {
108
+ this.stats.userDeleted++;
109
+ this.log("VirtualUserManager", "user:delete", data);
110
+ });
111
+ users.on("session:register", (data) => {
112
+ this.log("VirtualUserManager", "session:register", data);
113
+ });
114
+ users.on("session:unregister", (data) => {
115
+ this.stats.sessionEnds++;
116
+ this.log("VirtualUserManager", "session:unregister", data);
117
+ });
118
+ }
119
+ /**
120
+ * Attaches to SshMimic events.
121
+ */
122
+ attachSshMimic(ssh) {
123
+ ssh.on("start", (data) => {
124
+ this.log("SshMimic", "start", data);
125
+ });
126
+ ssh.on("stop", () => {
127
+ this.log("SshMimic", "stop", {});
128
+ });
129
+ ssh.on("auth:success", (data) => {
130
+ this.stats.authAttempts++;
131
+ this.stats.authSuccesses++;
132
+ this.log("SshMimic", "auth:success", data);
133
+ });
134
+ ssh.on("auth:failure", (data) => {
135
+ this.stats.authAttempts++;
136
+ this.stats.authFailures++;
137
+ this.log("SshMimic", "auth:failure", data);
138
+ });
139
+ ssh.on("client:connect", () => {
140
+ this.stats.clientConnects++;
141
+ this.log("SshMimic", "client:connect", {});
142
+ });
143
+ ssh.on("client:disconnect", (data) => {
144
+ this.stats.clientDisconnects++;
145
+ this.log("SshMimic", "client:disconnect", data);
146
+ });
147
+ }
148
+ /**
149
+ * Attaches to SftpMimic events.
150
+ */
151
+ attachSftpMimic(sftp) {
152
+ sftp.on("start", (data) => {
153
+ this.log("SftpMimic", "start", data);
154
+ });
155
+ sftp.on("stop", () => {
156
+ this.log("SftpMimic", "stop", {});
157
+ });
158
+ sftp.on("auth:success", (data) => {
159
+ this.stats.authAttempts++;
160
+ this.stats.authSuccesses++;
161
+ this.log("SftpMimic", "auth:success", data);
162
+ });
163
+ sftp.on("auth:failure", (data) => {
164
+ this.stats.authAttempts++;
165
+ this.stats.authFailures++;
166
+ this.log("SftpMimic", "auth:failure", data);
167
+ });
168
+ sftp.on("client:connect", () => {
169
+ this.stats.clientConnects++;
170
+ this.log("SftpMimic", "client:connect", {});
171
+ });
172
+ sftp.on("client:disconnect", (data) => {
173
+ this.stats.clientDisconnects++;
174
+ this.log("SftpMimic", "client:disconnect", data);
175
+ });
176
+ }
177
+ /**
178
+ * Records an audit log entry.
179
+ *
180
+ * @param source Event source (e.g., "SshMimic", "VirtualFileSystem").
181
+ * @param type Event type.
182
+ * @param details Event-specific data.
183
+ */
184
+ log(source, type, details) {
185
+ const entry = {
186
+ timestamp: new Date().toISOString(),
187
+ type,
188
+ source,
189
+ details,
190
+ };
191
+ this.auditLog.push(entry);
192
+ // Trim log if exceeds max size
193
+ if (this.auditLog.length > this.maxLogSize) {
194
+ this.auditLog = this.auditLog.slice(-this.maxLogSize);
195
+ }
196
+ // Console output for real-time monitoring
197
+ console.log(`[AUDIT] ${entry.timestamp} | ${source} | ${type}`, details);
198
+ }
199
+ /**
200
+ * Returns audit log entries matching optional filters.
201
+ *
202
+ * @param type Optional event type filter.
203
+ * @param source Optional source filter.
204
+ * @returns Filtered audit log entries.
205
+ */
206
+ getAuditLog(type, source) {
207
+ return this.auditLog.filter((entry) => (!type || entry.type === type) && (!source || entry.source === source));
208
+ }
209
+ /**
210
+ * Returns current activity statistics.
211
+ *
212
+ * @returns Snapshot of honeypot stats.
213
+ */
214
+ getStats() {
215
+ return Object.freeze({ ...this.stats });
216
+ }
217
+ /**
218
+ * Clears audit log and resets statistics.
219
+ */
220
+ reset() {
221
+ this.auditLog = [];
222
+ this.stats = {
223
+ authAttempts: 0,
224
+ authSuccesses: 0,
225
+ authFailures: 0,
226
+ commands: 0,
227
+ fileWrites: 0,
228
+ fileReads: 0,
229
+ sessionStarts: 0,
230
+ sessionEnds: 0,
231
+ userCreated: 0,
232
+ userDeleted: 0,
233
+ clientConnects: 0,
234
+ clientDisconnects: 0,
235
+ };
236
+ }
237
+ /**
238
+ * Returns recent log entries in reverse chronological order.
239
+ *
240
+ * @param limit Number of recent entries to return (default: 100).
241
+ * @returns Recent audit log entries.
242
+ */
243
+ getRecent(limit = 100) {
244
+ return this.auditLog.slice(Math.max(0, this.auditLog.length - limit));
245
+ }
246
+ /**
247
+ * Detects potential security issues based on activity patterns.
248
+ *
249
+ * @returns Array of anomalies detected.
250
+ */
251
+ detectAnomalies() {
252
+ const anomalies = [];
253
+ // High auth failure rate
254
+ if (this.stats.authAttempts > 0 &&
255
+ this.stats.authFailures / this.stats.authAttempts > 0.5) {
256
+ anomalies.push({
257
+ type: "high_auth_failure_rate",
258
+ severity: "medium",
259
+ message: `Auth failure rate: ${((this.stats.authFailures / this.stats.authAttempts) * 100).toFixed(1)}%`,
260
+ });
261
+ }
262
+ // Excessive auth failures in short time
263
+ if (this.stats.authFailures > 10) {
264
+ anomalies.push({
265
+ type: "excessive_auth_failures",
266
+ severity: "high",
267
+ message: `${this.stats.authFailures} authentication failures detected`,
268
+ });
269
+ }
270
+ // Unusual command execution volume
271
+ if (this.stats.commands > 1000) {
272
+ anomalies.push({
273
+ type: "high_command_volume",
274
+ severity: "low",
275
+ message: `${this.stats.commands} commands executed`,
276
+ });
277
+ }
278
+ // Unusual file write volume
279
+ if (this.stats.fileWrites > 500) {
280
+ anomalies.push({
281
+ type: "high_write_volume",
282
+ severity: "medium",
283
+ message: `${this.stats.fileWrites} file write operations`,
284
+ });
285
+ }
286
+ return anomalies;
287
+ }
288
+ }
289
+ export default HoneyPot;
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
+ import { HoneyPot } from "./Honeypot";
1
2
  import { SshClient } from "./SSHClient";
2
3
  import { SftpMimic, SshMimic } from "./SSHMimic/index";
3
4
  import VirtualFileSystem from "./VirtualFileSystem";
4
5
  import { VirtualShell } from "./VirtualShell";
5
6
  import { VirtualUserManager } from "./VirtualUserManager";
6
- import { HoneyPot } from "./honeypot";
7
+ export type { AuditLogEntry, HoneyPotStats, } from "./Honeypot";
7
8
  export type { CommandContext, CommandMode, CommandOutcome, CommandResult, NanoEditorSession, ShellModule, SudoChallenge, } from "./types/commands";
8
9
  export type { ExecStream, ShellStream } from "./types/streams";
9
10
  export type { RemoveOptions, VfsBaseNode, VfsDirectoryNode, VfsFileNode, VfsNodeStats, VfsNodeType, VfsSnapshot, VfsSnapshotBaseNode, VfsSnapshotDirectoryNode, VfsSnapshotFileNode, VfsSnapshotNode, WriteFileOptions, } from "./types/vfs";
10
- export type { AuditLogEntry, HoneyPotStats, } from "./honeypot";
11
- export { SshClient, VirtualFileSystem, SftpMimic as VirtualSftpServer, VirtualShell, SshMimic as VirtualSshServer, VirtualUserManager, HoneyPot, };
11
+ export { HoneyPot, SshClient, VirtualFileSystem, SftpMimic as VirtualSftpServer, VirtualShell, SshMimic as VirtualSshServer, VirtualUserManager, };
12
12
  export { getArg, getFlag, ifFlag, } from "./commands/command-helpers";
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,YAAY,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,aAAa,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EACX,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,SAAS,EACT,iBAAiB,EACjB,SAAS,IAAI,iBAAiB,EAC9B,YAAY,EACZ,QAAQ,IAAI,gBAAgB,EAC5B,kBAAkB,EAClB,QAAQ,GACR,CAAC;AAEF,OAAO,EACN,MAAM,EACN,OAAO,EACP,MAAM,GACN,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,YAAY,EACX,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,aAAa,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EACX,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,SAAS,IAAI,iBAAiB,EAC9B,YAAY,EACZ,QAAQ,IAAI,gBAAgB,EAC5B,kBAAkB,GAClB,CAAC;AAEF,OAAO,EACN,MAAM,EACN,OAAO,EACP,MAAM,GACN,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
+ import { HoneyPot } from "./Honeypot";
1
2
  import { SshClient } from "./SSHClient";
2
3
  import { SftpMimic, SshMimic } from "./SSHMimic/index";
3
4
  import VirtualFileSystem from "./VirtualFileSystem";
4
5
  import { VirtualShell } from "./VirtualShell";
5
6
  import { VirtualUserManager } from "./VirtualUserManager";
6
- import { HoneyPot } from "./honeypot";
7
- export { SshClient, VirtualFileSystem, SftpMimic as VirtualSftpServer, VirtualShell, SshMimic as VirtualSshServer, VirtualUserManager, HoneyPot, };
7
+ export { HoneyPot, SshClient, VirtualFileSystem, SftpMimic as VirtualSftpServer, VirtualShell, SshMimic as VirtualSshServer, VirtualUserManager, };
8
8
  export { getArg, getFlag, ifFlag, } from "./commands/command-helpers";
@@ -8,10 +8,10 @@
8
8
  */
9
9
 
10
10
  import {
11
- HoneyPot,
12
- SshClient,
13
- VirtualShell,
14
- VirtualSshServer,
11
+ HoneyPot,
12
+ SshClient,
13
+ VirtualShell,
14
+ VirtualSshServer,
15
15
  } from "../src/index";
16
16
 
17
17
  async function quickStart() {
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
7
- "version": "1.1.5",
7
+ "version": "1.1.7",
8
8
  "license": "MIT",
9
9
  "keywords": [
10
10
  "ssh",
@@ -228,7 +228,8 @@ export class VirtualUserManager extends EventEmitter {
228
228
  this.validatePassword(password);
229
229
 
230
230
  if (this.users.has(username)) {
231
- throw new Error(`adduser: user '${username}' already exists`);
231
+ return;
232
+ // throw new Error(`adduser: user '${username}' already exists`);
232
233
  }
233
234
 
234
235
  this.users.set(username, this.createRecord(username, password));