ftpd-lite 1.0.8 → 1.0.15
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 +45 -79
- package/package.json +7 -8
- package/src/cli/banner.d.ts +6 -0
- package/src/cli/banner.js +17 -0
- package/src/cli/context.d.ts +10 -0
- package/src/cli/context.js +13 -0
- package/src/cli/registry.d.ts +7 -0
- package/src/cli/registry.js +131 -0
- package/src/cli/repl.d.ts +2 -0
- package/src/cli/repl.js +92 -0
- package/src/core/FtpServer.d.ts +11 -4
- package/src/core/FtpServer.js +155 -27
- package/src/db/database.d.ts +54 -0
- package/src/db/database.js +252 -0
- package/src/ftpd.d.ts +2 -0
- package/src/ftpd.js +16 -0
- package/src/index.d.ts +2 -1
- package/src/index.js +4 -2
- package/src/types.d.ts +14 -27
- package/src/types.js +1 -1
- package/src/userManager.d.ts +9 -8
- package/src/userManager.js +98 -82
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { UserPermissions } from '../types';
|
|
2
|
+
export declare class DatabaseManager {
|
|
3
|
+
private db;
|
|
4
|
+
private dbPath;
|
|
5
|
+
constructor(dbPath?: string);
|
|
6
|
+
getDbPath(): string;
|
|
7
|
+
init(): void;
|
|
8
|
+
close(): void;
|
|
9
|
+
private getDb;
|
|
10
|
+
getAllUsers(): Array<{
|
|
11
|
+
id: number;
|
|
12
|
+
username: string;
|
|
13
|
+
password: string;
|
|
14
|
+
homeDir: string;
|
|
15
|
+
permissions: UserPermissions;
|
|
16
|
+
isActive: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
getUserByUsername(username: string): Array<{
|
|
19
|
+
id: number;
|
|
20
|
+
username: string;
|
|
21
|
+
password: string;
|
|
22
|
+
homeDir: string;
|
|
23
|
+
permissions: UserPermissions;
|
|
24
|
+
isActive: boolean;
|
|
25
|
+
}> | null;
|
|
26
|
+
addUser({ username, password, homeDir, permissions, isActive, }: {
|
|
27
|
+
username: string;
|
|
28
|
+
password: string;
|
|
29
|
+
homeDir: string;
|
|
30
|
+
permissions: UserPermissions;
|
|
31
|
+
isActive?: boolean;
|
|
32
|
+
}): boolean;
|
|
33
|
+
deleteUser(username: string): boolean;
|
|
34
|
+
toggleUserStatus(username: string, isActive: boolean): boolean;
|
|
35
|
+
updatePermissions(username: string, permissions: UserPermissions): boolean;
|
|
36
|
+
changeUsername(oldUsername: string, newUsername: string): boolean;
|
|
37
|
+
changePassword(username: string, newPassword: string): boolean;
|
|
38
|
+
changeHomeDir(username: string, newHomeDir: string): boolean;
|
|
39
|
+
getActiveUsers(): Array<{
|
|
40
|
+
id: number;
|
|
41
|
+
username: string;
|
|
42
|
+
password: string;
|
|
43
|
+
homeDir: string;
|
|
44
|
+
permissions: UserPermissions;
|
|
45
|
+
isActive: boolean;
|
|
46
|
+
}>;
|
|
47
|
+
getUserCount(): number;
|
|
48
|
+
getSetting(key: string): string | null;
|
|
49
|
+
setSetting(key: string, value: string, description?: string): void;
|
|
50
|
+
deleteSetting(key: string): boolean;
|
|
51
|
+
getAllSettings(): Record<string, string>;
|
|
52
|
+
toLinuxString(permissions: UserPermissions | undefined | null): string;
|
|
53
|
+
fromLinuxString(value: string | null | undefined): UserPermissions;
|
|
54
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DatabaseManager = void 0;
|
|
37
|
+
const node_sqlite_1 = require("node:sqlite");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class DatabaseManager {
|
|
40
|
+
constructor(dbPath) {
|
|
41
|
+
this.db = null;
|
|
42
|
+
this.dbPath = dbPath ?? path.join(__dirname, '../../ftpd.db');
|
|
43
|
+
}
|
|
44
|
+
getDbPath() {
|
|
45
|
+
return this.dbPath;
|
|
46
|
+
}
|
|
47
|
+
init() {
|
|
48
|
+
this.db = new node_sqlite_1.DatabaseSync(this.dbPath);
|
|
49
|
+
this.db.exec(`
|
|
50
|
+
PRAGMA journal_mode = WAL;
|
|
51
|
+
|
|
52
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
53
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
54
|
+
username TEXT UNIQUE NOT NULL,
|
|
55
|
+
password TEXT NOT NULL,
|
|
56
|
+
homeDir TEXT NOT NULL,
|
|
57
|
+
permissions TEXT NOT NULL DEFAULT '{}',
|
|
58
|
+
isActive INTEGER NOT NULL DEFAULT 1,
|
|
59
|
+
createdAt TEXT NOT NULL DEFAULT (datetime(\'now\')),
|
|
60
|
+
updatedAt TEXT NOT NULL DEFAULT (datetime(\'now\'))
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE TABLE IF NOT EXISTS settings (
|
|
64
|
+
key TEXT PRIMARY KEY,
|
|
65
|
+
value TEXT NOT NULL,
|
|
66
|
+
description TEXT,
|
|
67
|
+
updatedAt TEXT NOT NULL DEFAULT (datetime(\'now\'))
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_users_active ON users(isActive);
|
|
72
|
+
`);
|
|
73
|
+
console.log(`[DatabaseManager] SQLite veritabanı hazır: ${this.dbPath}`);
|
|
74
|
+
}
|
|
75
|
+
close() {
|
|
76
|
+
if (this.db) {
|
|
77
|
+
this.db.close();
|
|
78
|
+
this.db = null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
getDb() {
|
|
82
|
+
if (!this.db) {
|
|
83
|
+
throw new Error('Veritabanı başlatılmamış. Önce init() çağırılmalıdır.');
|
|
84
|
+
}
|
|
85
|
+
return this.db;
|
|
86
|
+
}
|
|
87
|
+
getAllUsers() {
|
|
88
|
+
const rows = this.getDb().prepare('SELECT id, username, password, homeDir, permissions, isActive FROM users').all();
|
|
89
|
+
return rows.map((row) => ({
|
|
90
|
+
id: row.id,
|
|
91
|
+
username: row.username,
|
|
92
|
+
password: row.password,
|
|
93
|
+
homeDir: row.homeDir,
|
|
94
|
+
permissions: this.fromLinuxString(String(row.permissions ?? 'rwxr-xr-x')),
|
|
95
|
+
isActive: row.isActive === 1,
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
getUserByUsername(username) {
|
|
99
|
+
const row = this.getDb().prepare('SELECT id, username, password, homeDir, permissions, isActive FROM users WHERE username = ?').get(username);
|
|
100
|
+
if (!row) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
id: row.id,
|
|
106
|
+
username: row.username,
|
|
107
|
+
password: row.password,
|
|
108
|
+
homeDir: row.homeDir,
|
|
109
|
+
permissions: this.fromLinuxString(String(row.permissions ?? 'rwxr-xr-x')),
|
|
110
|
+
isActive: row.isActive === 1,
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
addUser({ username, password, homeDir, permissions, isActive = true, }) {
|
|
115
|
+
try {
|
|
116
|
+
const existing = this.getUserByUsername(username);
|
|
117
|
+
if (existing && existing.length > 0) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
this.getDb()
|
|
121
|
+
.prepare(`INSERT INTO users (username, password, homeDir, permissions, isActive)
|
|
122
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
123
|
+
.run(username, password, homeDir, this.toLinuxString(permissions), isActive ? 1 : 0);
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
console.error('[DatabaseManager] addUser error:', error);
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
deleteUser(username) {
|
|
132
|
+
const result = this.getDb()
|
|
133
|
+
.prepare('DELETE FROM users WHERE username = ?')
|
|
134
|
+
.run(username);
|
|
135
|
+
return result.changes > 0;
|
|
136
|
+
}
|
|
137
|
+
toggleUserStatus(username, isActive) {
|
|
138
|
+
const result = this.getDb()
|
|
139
|
+
.prepare('UPDATE users SET isActive = ?, updatedAt = datetime(\'now\') WHERE username = ?')
|
|
140
|
+
.run(isActive ? 1 : 0, username);
|
|
141
|
+
return result.changes > 0;
|
|
142
|
+
}
|
|
143
|
+
updatePermissions(username, permissions) {
|
|
144
|
+
const result = this.getDb()
|
|
145
|
+
.prepare('UPDATE users SET permissions = ?, updatedAt = datetime(\'now\') WHERE username = ?')
|
|
146
|
+
.run(this.toLinuxString(permissions), username);
|
|
147
|
+
return result.changes > 0;
|
|
148
|
+
}
|
|
149
|
+
changeUsername(oldUsername, newUsername) {
|
|
150
|
+
const existing = this.getUserByUsername(newUsername);
|
|
151
|
+
if (existing && existing.length > 0) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
const result = this.getDb()
|
|
155
|
+
.prepare('UPDATE users SET username = ?, updatedAt = datetime(\'now\') WHERE username = ?')
|
|
156
|
+
.run(newUsername, oldUsername);
|
|
157
|
+
return result.changes > 0;
|
|
158
|
+
}
|
|
159
|
+
changePassword(username, newPassword) {
|
|
160
|
+
const result = this.getDb()
|
|
161
|
+
.prepare('UPDATE users SET password = ?, updatedAt = datetime(\'now\') WHERE username = ?')
|
|
162
|
+
.run(newPassword, username);
|
|
163
|
+
return result.changes > 0;
|
|
164
|
+
}
|
|
165
|
+
changeHomeDir(username, newHomeDir) {
|
|
166
|
+
const result = this.getDb()
|
|
167
|
+
.prepare('UPDATE users SET homeDir = ?, updatedAt = datetime(\'now\') WHERE username = ?')
|
|
168
|
+
.run(newHomeDir, username);
|
|
169
|
+
return result.changes > 0;
|
|
170
|
+
}
|
|
171
|
+
getActiveUsers() {
|
|
172
|
+
const rows = this.getDb()
|
|
173
|
+
.prepare('SELECT id, username, password, homeDir, permissions, isActive FROM users WHERE isActive = 1')
|
|
174
|
+
.all();
|
|
175
|
+
return rows.map((row) => ({
|
|
176
|
+
id: row.id,
|
|
177
|
+
username: row.username,
|
|
178
|
+
password: row.password,
|
|
179
|
+
homeDir: row.homeDir,
|
|
180
|
+
permissions: this.fromLinuxString(String(row.permissions ?? 'rwxr-xr-x')),
|
|
181
|
+
isActive: row.isActive === 1,
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
getUserCount() {
|
|
185
|
+
const row = this.getDb()
|
|
186
|
+
.prepare('SELECT COUNT(*) AS count FROM users WHERE isActive = 1')
|
|
187
|
+
.get();
|
|
188
|
+
return row.count;
|
|
189
|
+
}
|
|
190
|
+
getSetting(key) {
|
|
191
|
+
const row = this.getDb()
|
|
192
|
+
.prepare('SELECT value FROM settings WHERE key = ?')
|
|
193
|
+
.get(key);
|
|
194
|
+
return row ? row.value : null;
|
|
195
|
+
}
|
|
196
|
+
setSetting(key, value, description) {
|
|
197
|
+
const existing = this.getDb()
|
|
198
|
+
.prepare('SELECT key FROM settings WHERE key = ?')
|
|
199
|
+
.get(key);
|
|
200
|
+
if (existing) {
|
|
201
|
+
this.getDb()
|
|
202
|
+
.prepare('UPDATE settings SET value = ?, description = COALESCE(?, description), updatedAt = datetime(\'now\') WHERE key = ?')
|
|
203
|
+
.run(value, description ?? null, key);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
this.getDb()
|
|
207
|
+
.prepare('INSERT INTO settings (key, value, description) VALUES (?, ?, ?)')
|
|
208
|
+
.run(key, value, description ?? null);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
deleteSetting(key) {
|
|
212
|
+
const result = this.getDb()
|
|
213
|
+
.prepare('DELETE FROM settings WHERE key = ?')
|
|
214
|
+
.run(key);
|
|
215
|
+
return result.changes > 0;
|
|
216
|
+
}
|
|
217
|
+
getAllSettings() {
|
|
218
|
+
const rows = this.getDb()
|
|
219
|
+
.prepare('SELECT key, value FROM settings')
|
|
220
|
+
.all();
|
|
221
|
+
const result = {};
|
|
222
|
+
for (const row of rows) {
|
|
223
|
+
result[row.key] = row.value;
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
toLinuxString(permissions) {
|
|
228
|
+
const charFor = (p) => `${p?.read ? 'r' : '-'}${p?.write ? 'w' : '-'}${p?.execute ? 'x' : '-'}`;
|
|
229
|
+
const owner = charFor(permissions?.owner);
|
|
230
|
+
const group = charFor(permissions?.group);
|
|
231
|
+
const others = charFor(permissions?.others);
|
|
232
|
+
return owner + group + others;
|
|
233
|
+
}
|
|
234
|
+
fromLinuxString(value) {
|
|
235
|
+
const str = String(value ?? 'rwxr-xr-x');
|
|
236
|
+
const ownerStr = str.slice(0, 3).padEnd(3, '-');
|
|
237
|
+
const groupStr = str.slice(3, 6).padEnd(3, '-');
|
|
238
|
+
const othersStr = str.slice(6, 9).padEnd(3, '-');
|
|
239
|
+
const parse = (s) => ({
|
|
240
|
+
read: s[0] === 'r',
|
|
241
|
+
write: s[1] === 'w',
|
|
242
|
+
execute: s[2] === 'x',
|
|
243
|
+
});
|
|
244
|
+
return {
|
|
245
|
+
owner: parse(ownerStr),
|
|
246
|
+
group: parse(groupStr),
|
|
247
|
+
others: parse(othersStr),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.DatabaseManager = DatabaseManager;
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJDO0FBQzNDLE1BQVksSUFBSSxpQ0FBYTtBQVU3QjtJQUlFLFlBQVksTUFBZTtRQUhuQixPQUFFLEdBQXdCLElBQUksQ0FBQztRQUlyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBS00sU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBS00sSUFBSTtRQUNULElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSwwQkFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F1QlosQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUtNLEtBQUs7UUFDVixJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFNTSxXQUFXO1FBUWhCLE1B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QUEwRCxFQUFFLENBQUMsQ0FBQztZQUNwRixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7WUFDbEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHO1lBQ25CLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztTQUN0QixDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDdEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDdEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDekIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFiYXNlU3luYyB9IGZyb20gJ25vZGU6c3FsaXRlJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBVc2VyUGVybWlzc2lvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogU1FMaXRlIHZlcml0YWJhbsSxIHnDtm5ldGljaXNpXG4gKlxuICogZnRwZC5kYiBkb3N5YXPEsW5kYSBpa2kgYXlyxLEgdGFibG8gdHV0YXI6XG4gKiAgIC0gdXNlcnMgICA6IGt1bGxhbsSxY8SxIGJpbGdpbGVyaSAoXCJ1c2VyRmlsZVwiIGvEsXNtxLFuxLFuIHRhxZ/EsXnEsWPEsXPEsSlcbiAqICAgLSBzZXR0aW5nczogZnRwIHN1bnVjdSBheWFybGFyxLEgKFwiZnRwIHNldHRpbmdzXCIga8Sxc23EsW7EsW4gdGHFn8SxecSxY8Sxc8SxKVxuICovXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBkYjogRGF0YWJhc2VTeW5jIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGJQYXRoPzogc3RyaW5nKSB7XG4gICAgdGhpcy5kYlBhdGggPSBkYlBhdGggPz8gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z0cGQuZGInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpdGFiYW7EsSBkb3N5YSB5b2x1bnUgZMO2bmTDvHJcbiAgICovXG4gIHB1YmxpYyBnZXREYlBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYlBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVmVyaXRhYmFuxLFuxLEgYmHFn2xhdCB2ZSB0YWJsb2xhcsSxIG9sdcWfdHVyXG4gICAqL1xuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRiID0gbmV3IERhdGFiYXNlU3luYyh0aGlzLmRiUGF0aCk7XG4gICAgdGhpcy5kYi5leGVjKGBcbiAgICAgIFBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7XG5cbiAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHVzZXJzIChcbiAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULFxuICAgICAgICB1c2VybmFtZSBURVhUIFVOSVFVRSBOT1QgTlVMTCxcbiAgICAgICAgcGFzc3dvcmQgVEVYVCBOT1QgTlVMTCxcbiAgICAgICAgaG9tZURpciBURVhUIE5PVCBOVUxMLFxuICAgICAgICBwZXJtaXNzaW9ucyBURVhUIE5PVCBOVUxMIERFRkFVTFQgJ3t9JyxcbiAgICAgICAgaXNBY3RpdmUgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDEsXG4gICAgICAgIGNyZWF0ZWRBdCBURVhUIE5PVCBOVUxMIERFRkFVTFQgKGRhdGV0aW1lKFxcJ25vd1xcJykpLFxuICAgICAgICB1cGRhdGVkQXQgVEVYVCBOT1QgTlVMTCBERUZBVUxUIChkYXRldGltZShcXCdub3dcXCcpKVxuICAgICAgKTtcblxuICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgc2V0dGluZ3MgKFxuICAgICAgICBrZXkgVEVYVCBQUklNQVJZIEtFWSxcbiAgICAgICAgdmFsdWUgVEVYVCBOT1QgTlVMTCxcbiAgICAgICAgZGVzY3JpcHRpb24gVEVYVCxcbiAgICAgICAgdXBkYXRlZEF0IFRFWFQgTk9UIE5VTEwgREVGQVVMVCAoZGF0ZXRpbWUoXFwnbm93XFwnKSlcbiAgICAgICk7XG5cbiAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF91c2Vyc191c2VybmFtZSBPTiB1c2Vycyh1c2VybmFtZSk7XG4gICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfdXNlcnNfYWN0aXZlIE9OIHVzZXJzKGlzQWN0aXZlKTtcbiAgICBgKTtcblxuICAgIGNvbnNvbGUubG9nKGBbRGF0YWJhc2VNYW5hZ2VyXSBTUUxpdGUgdmVyaXRhYmFuxLEgaGF6xLFyOiAke3RoaXMuZGJQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcml0YWJhbsSxIGJhxJ9sYW50xLFzxLFuxLEga2FwYXRcbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYikge1xuICAgICAgdGhpcy5kYi5jbG9zZSgpO1xuICAgICAgdGhpcy5kYiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREYigpOiBEYXRhYmFzZVN5bmMge1xuICAgIGlmICghdGhpcy5kYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWZXJpdGFiYW7EsSBiYcWfbGF0xLFsbWFtxLHFny4gw5ZuY2UgaW5pdCgpIMOnYcSfxLFyxLFsbWFsxLFkxLFyLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYjtcbiAgfVxuXG4gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgVVNFUlMgVEFCTE8gxLDFnkxFTUxFUsSwXG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICBwdWJsaWMgZ2V0QWxsVXNlcnMoKTogQXJyYXk8e1xuICAgIGlkOiBudW1iZXI7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGhvbWVEaXI6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zO1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICB9PiB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0RGIoKS5wcmVwYXJlKFxuICAgICAgJ1NFTEVDVCBpZCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBob21lRGlyLCBwZXJtaXNzaW9ucywgaXNBY3RpdmUgRlJPTSB1c2VycydcbiAgICApLmFsbCgpIGFzIEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICAgIGhvbWVEaXI6IHN0cmluZztcbiAgICAgIHBlcm1pc3Npb25zOiBzdHJpbmc7XG4gICAgICBpc0FjdGl2ZTogbnVtYmVyO1xuICAgIH0+O1xuXG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+ICh7XG4gICAgICBpZDogcm93LmlkLFxuICAgICAgdXNlcm5hbWU6IHJvdy51c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkOiByb3cucGFzc3dvcmQsXG4gICAgICBob21lRGlyOiByb3cuaG9tZURpcixcbiAgICAgIHBlcm1pc3Npb25zOiB0aGlzLmZyb21MaW51eFN0cmluZyhTdHJpbmcocm93LnBlcm1pc3Npb25zID8/ICdyd3hyLXhyLXgnKSksXG4gICAgICBpc0FjdGl2ZTogcm93LmlzQWN0aXZlID09PSAxLFxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVc2VyQnlVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKTogQXJyYXk8e1xuICAgIGlkOiBudW1iZXI7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGhvbWVEaXI6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zO1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICB9PiB8IG51bGwge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0RGIoKS5wcmVwYXJlKFxuICAgICAgJ1NFTEVDVCBpZCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBob21lRGlyLCBwZXJtaXNzaW9ucywgaXNBY3RpdmUgRlJPTSB1c2VycyBXSEVSRSB1c2VybmFtZSA9ID8nXG4gICAgKS5nZXQodXNlcm5hbWUpIGFzXG4gICAgICB8IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICAgICAgICBob21lRGlyOiBzdHJpbmc7XG4gICAgICAgICAgcGVybWlzc2lvbnM6IHN0cmluZztcbiAgICAgICAgICBpc0FjdGl2ZTogbnVtYmVyO1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghcm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICB1c2VybmFtZTogcm93LnVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZDogcm93LnBhc3N3b3JkLFxuICAgICAgICBob21lRGlyOiByb3cuaG9tZURpcixcbiAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMuZnJvbUxpbnV4U3RyaW5nKFN0cmluZyhyb3cucGVybWlzc2lvbnMgPz8gJ3J3eHIteHIteCcpKSxcbiAgICAgICAgaXNBY3RpdmU6IHJvdy5pc0FjdGl2ZSA9PT0gMSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRVc2VyKHtcbiAgICB1c2VybmFtZSxcbiAgICBwYXNzd29yZCxcbiAgICBob21lRGlyLFxuICAgIHBlcm1pc3Npb25zLFxuICAgIGlzQWN0aXZlID0gdHJ1ZSxcbiAgfToge1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICBob21lRGlyOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9ucztcbiAgICBpc0FjdGl2ZT86IGJvb2xlYW47XG4gIH0pOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFVzZXJCeVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gemF0ZW4gdmFyXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShcbiAgICAgICAgICBgSU5TRVJUIElOVE8gdXNlcnMgKHVzZXJuYW1lLCBwYXNzd29yZCwgaG9tZURpciwgcGVybWlzc2lvbnMsIGlzQWN0aXZlKVxuICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8pYFxuICAgICAgICApXG4gICAgICAgIC5ydW4oXG4gICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgaG9tZURpcixcbiAgICAgICAgICB0aGlzLnRvTGludXhTdHJpbmcocGVybWlzc2lvbnMpLFxuICAgICAgICAgIGlzQWN0aXZlID8gMSA6IDBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbRGF0YWJhc2VNYW5hZ2VyXSBhZGRVc2VyIGVycm9yOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlVXNlcih1c2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnREVMRVRFIEZST00gdXNlcnMgV0hFUkUgdXNlcm5hbWUgPSA/JylcbiAgICAgIC5ydW4odXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVVc2VyU3RhdHVzKHVzZXJuYW1lOiBzdHJpbmcsIGlzQWN0aXZlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnVVBEQVRFIHVzZXJzIFNFVCBpc0FjdGl2ZSA9ID8sIHVwZGF0ZWRBdCA9IGRhdGV0aW1lKFxcJ25vd1xcJykgV0hFUkUgdXNlcm5hbWUgPSA/JylcbiAgICAgIC5ydW4oaXNBY3RpdmUgPyAxIDogMCwgdXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQZXJtaXNzaW9ucyhcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnNcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShcbiAgICAgICAgJ1VQREFURSB1c2VycyBTRVQgcGVybWlzc2lvbnMgPSA/LCB1cGRhdGVkQXQgPSBkYXRldGltZShcXCdub3dcXCcpIFdIRVJFIHVzZXJuYW1lID0gPydcbiAgICAgIClcbiAgICAgIC5ydW4odGhpcy50b0xpbnV4U3RyaW5nKHBlcm1pc3Npb25zKSwgdXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VVc2VybmFtZShvbGRVc2VybmFtZTogc3RyaW5nLCBuZXdVc2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFVzZXJCeVVzZXJuYW1lKG5ld1VzZXJuYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgICdVUERBVEUgdXNlcnMgU0VUIHVzZXJuYW1lID0gPywgdXBkYXRlZEF0ID0gZGF0ZXRpbWUoXFwnbm93XFwnKSBXSEVSRSB1c2VybmFtZSA9ID8nXG4gICAgICApXG4gICAgICAucnVuKG5ld1VzZXJuYW1lLCBvbGRVc2VybmFtZSkgYXMgeyBjaGFuZ2VzOiBudW1iZXIgfTtcbiAgICByZXR1cm4gcmVzdWx0LmNoYW5nZXMgPiAwO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhc3N3b3JkKHVzZXJuYW1lOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldERiKClcbiAgICAgIC5wcmVwYXJlKFxuICAgICAgICAnVVBEQVRFIHVzZXJzIFNFVCBwYXNzd29yZCA9ID8sIHVwZGF0ZWRBdCA9IGRhdGV0aW1lKFxcJ25vd1xcJykgV0hFUkUgdXNlcm5hbWUgPSA/J1xuICAgICAgKVxuICAgICAgLnJ1bihuZXdQYXNzd29yZCwgdXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VIb21lRGlyKHVzZXJuYW1lOiBzdHJpbmcsIG5ld0hvbWVEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgICdVUERBVEUgdXNlcnMgU0VUIGhvbWVEaXIgPSA/LCB1cGRhdGVkQXQgPSBkYXRldGltZShcXCdub3dcXCcpIFdIRVJFIHVzZXJuYW1lID0gPydcbiAgICAgIClcbiAgICAgIC5ydW4obmV3SG9tZURpciwgdXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVVc2VycygpOiBBcnJheTx7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgaG9tZURpcjogc3RyaW5nO1xuICAgIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnM7XG4gICAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShcbiAgICAgICAgJ1NFTEVDVCBpZCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBob21lRGlyLCBwZXJtaXNzaW9ucywgaXNBY3RpdmUgRlJPTSB1c2VycyBXSEVSRSBpc0FjdGl2ZSA9IDEnXG4gICAgICApXG4gICAgICAuYWxsKCkgYXMgQXJyYXk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgICAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgICAgICBob21lRGlyOiBzdHJpbmc7XG4gICAgICAgIHBlcm1pc3Npb25zOiBzdHJpbmc7XG4gICAgICAgIGlzQWN0aXZlOiBudW1iZXI7XG4gICAgICB9PjtcblxuICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiAoe1xuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIHVzZXJuYW1lOiByb3cudXNlcm5hbWUsXG4gICAgICBwYXNzd29yZDogcm93LnBhc3N3b3JkLFxuICAgICAgaG9tZURpcjogcm93LmhvbWVEaXIsXG4gICAgICBwZXJtaXNzaW9uczogdGhpcy5mcm9tTGludXhTdHJpbmcoU3RyaW5nKHJvdy5wZXJtaXNzaW9ucyA/PyAncnd4ci14ci14JykpLFxuICAgICAgaXNBY3RpdmU6IHJvdy5pc0FjdGl2ZSA9PT0gMSxcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VXNlckNvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnU0VMRUNUIENPVU5UKCopIEFTIGNvdW50IEZST00gdXNlcnMgV0hFUkUgaXNBY3RpdmUgPSAxJylcbiAgICAgIC5nZXQoKSBhcyB7IGNvdW50OiBudW1iZXIgfTtcbiAgICByZXR1cm4gcm93LmNvdW50O1xuICB9XG5cbiAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICBTRVRUSU5HUyBUQUJMTyDEsMWeTEVNTEVSxLBcbiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gIHB1YmxpYyBnZXRTZXR0aW5nKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnU0VMRUNUIHZhbHVlIEZST00gc2V0dGluZ3MgV0hFUkUga2V5ID0gPycpXG4gICAgICAuZ2V0KGtleSkgYXMgeyB2YWx1ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJvdyA/IHJvdy52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgc2V0U2V0dGluZyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoJ1NFTEVDVCBrZXkgRlJPTSBzZXR0aW5ncyBXSEVSRSBrZXkgPSA/JylcbiAgICAgIC5nZXQoa2V5KSBhcyB7IGtleTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShcbiAgICAgICAgICAnVVBEQVRFIHNldHRpbmdzIFNFVCB2YWx1ZSA9ID8sIGRlc2NyaXB0aW9uID0gQ09BTEVTQ0UoPywgZGVzY3JpcHRpb24pLCB1cGRhdGVkQXQgPSBkYXRldGltZShcXCdub3dcXCcpIFdIRVJFIGtleSA9ID8nXG4gICAgICAgIClcbiAgICAgICAgLnJ1bih2YWx1ZSwgZGVzY3JpcHRpb24gPz8gbnVsbCwga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXREYigpXG4gICAgICAgIC5wcmVwYXJlKFxuICAgICAgICAgICdJTlNFUlQgSU5UTyBzZXR0aW5ncyAoa2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pIFZBTFVFUyAoPywgPywgPyknXG4gICAgICAgIClcbiAgICAgICAgLnJ1bihrZXksIHZhbHVlLCBkZXNjcmlwdGlvbiA/PyBudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlU2V0dGluZyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoJ0RFTEVURSBGUk9NIHNldHRpbmdzIFdIRVJFIGtleSA9ID8nKVxuICAgICAgLnJ1bihrZXkpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxTZXR0aW5ncygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnU0VMRUNUIGtleSwgdmFsdWUgRlJPTSBzZXR0aW5ncycpXG4gICAgICAuYWxsKCkgYXMgQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PjtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICByZXN1bHRbcm93LmtleV0gPSByb3cudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgIFlBUkRJTUNJIEZPTktTSVlPTkxBUiAoTGludXggZmlsZSBwZXJtaXNzaW9uIDwtPiBEQiBzdHJpbmcpXG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogVXNlclBlcm1pc3Npb25zIHlhcMSxc8SxbsSxIExpbnV4IHN5bWJvbGljIHBlcm1pc3Npb24gc3RyaW5n4oCZaW5lIMOnZXZpcmlyLlxuICAgKiDDlnJuZWs6IHsgb3duZXI6IHJ3eCwgZ3JvdXA6IHIteCwgb3RoZXJzOiByLXggfSAtPiBcInJ3eHIteHIteFwiXG4gICAqL1xuICBwdWJsaWMgdG9MaW51eFN0cmluZyhwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2hhckZvciA9IChwPzogeyByZWFkPzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyBleGVjdXRlPzogYm9vbGVhbiB9IHwgbnVsbCk6IHN0cmluZyA9PlxuICAgICAgYCR7cD8ucmVhZCA/ICdyJyA6ICctJ30ke3A/LndyaXRlID8gJ3cnIDogJy0nfSR7cD8uZXhlY3V0ZSA/ICd4JyA6ICctJ31gO1xuICAgIGNvbnN0IG93bmVyID0gY2hhckZvcihwZXJtaXNzaW9ucz8ub3duZXIpO1xuICAgIGNvbnN0IGdyb3VwID0gY2hhckZvcihwZXJtaXNzaW9ucz8uZ3JvdXApO1xuICAgIGNvbnN0IG90aGVycyA9IGNoYXJGb3IocGVybWlzc2lvbnM/Lm90aGVycyk7XG4gICAgcmV0dXJuIG93bmVyICsgZ3JvdXAgKyBvdGhlcnM7XG4gIH1cblxuICAvKipcbiAgICogTGludXggc3ltYm9saWMgcGVybWlzc2lvbiBzdHJpbmfigJlpbmkgVXNlclBlcm1pc3Npb25zIHlhcMSxc8SxbmEgw6dldmlyaXIuXG4gICAqIMOWcm5lazogXCJyd3hyLXhyLXhcIiAtPiB7IG93bmVyOiB7cmVhZCx3cml0ZSxleGVjdXRlfSwgZ3JvdXA6IHsuLi59LCBvdGhlcnM6IHsuLi59IH1cbiAgICovXG4gIHB1YmxpYyBmcm9tTGludXhTdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBVc2VyUGVybWlzc2lvbnMge1xuICAgIGNvbnN0IHN0ciA9IFN0cmluZyh2YWx1ZSA/PyAncnd4ci14ci14Jyk7XG4gICAgY29uc3Qgb3duZXJTdHIgPSBzdHIuc2xpY2UoMCwgMykucGFkRW5kKDMsICctJyk7XG4gICAgY29uc3QgZ3JvdXBTdHIgPSBzdHIuc2xpY2UoMywgNikucGFkRW5kKDMsICctJyk7XG4gICAgY29uc3Qgb3RoZXJzU3RyID0gc3RyLnNsaWNlKDYsIDkpLnBhZEVuZCgzLCAnLScpO1xuICAgIGNvbnN0IHBhcnNlID0gKHM6IHN0cmluZyk6IHsgcmVhZD86IGJvb2xlYW47IHdyaXRlPzogYm9vbGVhbjsgZXhlY3V0ZT86IGJvb2xlYW4gfSA9PiAoe1xuICAgICAgcmVhZDogc1swXSA9PT0gJ3InLFxuICAgICAgd3JpdGU6IHNbMV0gPT09ICd3JyxcbiAgICAgIGV4ZWN1dGU6IHNbMl0gPT09ICd4JyxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXI6IHBhcnNlKG93bmVyU3RyKSxcbiAgICAgIGdyb3VwOiBwYXJzZShncm91cFN0ciksXG4gICAgICBvdGhlcnM6IHBhcnNlKG90aGVyc1N0ciksXG4gICAgfTtcbiAgfVxufVxuIl19
|
package/src/ftpd.d.ts
ADDED
package/src/ftpd.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const FtpServer_1 = require("./core/FtpServer");
|
|
5
|
+
const repl_1 = require("./cli/repl");
|
|
6
|
+
const server = new FtpServer_1.FtpServer({
|
|
7
|
+
dbPath: './ftpd.db',
|
|
8
|
+
logLevel: 'info',
|
|
9
|
+
banner: '',
|
|
10
|
+
});
|
|
11
|
+
server.start();
|
|
12
|
+
(0, repl_1.startFtpRepl)(server, 21).catch((err) => {
|
|
13
|
+
console.error('[ftpd] REPL error:', err);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnRwZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mdHBkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWFBLGdEQUE2QztBQUM3QyxxQ0FBMEM7QUFFMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBUyxDQUFDO0lBQzNCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLE1BQU0sRUFBRSxFQUFFO0NBQ1gsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRWYsSUFBQSxtQkFBWSxFQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtJQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIEZ0cC1EIEZUUCBzdW51Y3UgZGFlbW9uIChpbnRlcmFrdGlmIHRlcm1pbmFsKVxuICpcbiAqIEtvbXV0bGEgYmHFn2xhdG1hOlxuICogICBucHggZnRkXG4gKiAgIG5vZGUgc3JjL2Z0cGQudHNcbiAqXG4gKiDDh2FsxLHFn8SxcjpcbiAqICAgLSBGdHBTZXJ2ZXIgYmHFn2xhdMSxbMSxciAoU1FMaXRlOiBmdHBkLmRiIC0+IHVzZXJzICsgc2V0dGluZ3MpXG4gKiAgIC0gSW50ZXJha3RpZiBGVFAgdGVybWluYWwgKENMSSBSRVBMKSBiYcWfbGF0xLFsxLFyXG4gKi9cblxuaW1wb3J0IHsgRnRwU2VydmVyIH0gZnJvbSAnLi9jb3JlL0Z0cFNlcnZlcic7XG5pbXBvcnQgeyBzdGFydEZ0cFJlcGwgfSBmcm9tICcuL2NsaS9yZXBsJztcblxuY29uc3Qgc2VydmVyID0gbmV3IEZ0cFNlcnZlcih7XG4gIGRiUGF0aDogJy4vZnRwZC5kYicsXG4gIGxvZ0xldmVsOiAnaW5mbycsXG4gIGJhbm5lcjogJycsXG59KTtcblxuc2VydmVyLnN0YXJ0KCk7XG5cbnN0YXJ0RnRwUmVwbChzZXJ2ZXIsIDIxKS5jYXRjaCgoZXJyKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoJ1tmdHBkXSBSRVBMIGVycm9yOicsIGVycik7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuIl19
|
package/src/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { FtpServer } from './core/FtpServer';
|
|
2
|
+
export { DatabaseManager } from './db/database';
|
|
2
3
|
export { UserManager, getUserManager } from './userManager';
|
|
3
4
|
export { Logger, LogLevel } from './utils/logger';
|
|
4
5
|
export { ReplyCode } from './types';
|
|
5
|
-
export type { ServerConfig, FtpConnection, User, UserPermissions, Permission, CommandResult, } from './types';
|
|
6
|
+
export type { ServerConfig, FtpConnection, User, UserPermissions, LinuxPermissionAccess, Permission, CommandResult, } from './types';
|
|
6
7
|
export { buildDirectoryListing } from './commands/ListCommand';
|
package/src/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildDirectoryListing = exports.ReplyCode = exports.LogLevel = exports.Logger = exports.getUserManager = exports.UserManager = exports.FtpServer = void 0;
|
|
3
|
+
exports.buildDirectoryListing = exports.ReplyCode = exports.LogLevel = exports.Logger = exports.getUserManager = exports.UserManager = exports.DatabaseManager = exports.FtpServer = void 0;
|
|
4
4
|
var FtpServer_1 = require("./core/FtpServer");
|
|
5
5
|
Object.defineProperty(exports, "FtpServer", { enumerable: true, get: function () { return FtpServer_1.FtpServer; } });
|
|
6
|
+
var database_1 = require("./db/database");
|
|
7
|
+
Object.defineProperty(exports, "DatabaseManager", { enumerable: true, get: function () { return database_1.DatabaseManager; } });
|
|
6
8
|
var userManager_1 = require("./userManager");
|
|
7
9
|
Object.defineProperty(exports, "UserManager", { enumerable: true, get: function () { return userManager_1.UserManager; } });
|
|
8
10
|
Object.defineProperty(exports, "getUserManager", { enumerable: true, get: function () { return userManager_1.getUserManager; } });
|
|
@@ -13,4 +15,4 @@ var types_1 = require("./types");
|
|
|
13
15
|
Object.defineProperty(exports, "ReplyCode", { enumerable: true, get: function () { return types_1.ReplyCode; } });
|
|
14
16
|
var ListCommand_1 = require("./commands/ListCommand");
|
|
15
17
|
Object.defineProperty(exports, "buildDirectoryListing", { enumerable: true, get: function () { return ListCommand_1.buildDirectoryListing; } });
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUEsOENBQTZDO0FBQXBDLHNHQUFBLFNBQVMsT0FBQTtBQUdsQiwwQ0FBZ0Q7QUFBdkMsMkdBQUEsZUFBZSxPQUFBO0FBR3hCLDZDQUE0RDtBQUFuRCwwR0FBQSxXQUFXLE9BQUE7QUFBRSw2R0FBQSxjQUFjLE9BQUE7QUFHcEMseUNBQWtEO0FBQXpDLGdHQUFBLE1BQU0sT0FBQTtBQUFFLGtHQUFBLFFBQVEsT0FBQTtBQUd6QixpQ0FBb0M7QUFBM0Isa0dBQUEsU0FBUyxPQUFBO0FBY2xCLHNEQUErRDtBQUF0RCxvSEFBQSxxQkFBcUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRnRwLUQgLSBtb2TDvGwgZ2lyacWfaVxuICpcbiAqIEJ1IGRvc3lhIHlhbG7EsXpjYSBkxLHFn2EgYWt0YXLEsW0geWFwYXI7IGltcG9ydCBlZGlsZGnEn2luZGUgc3VudWN1IGJhxZ9sYXTEsWxtYXosXG4gKiBkb3N5YSBvbHXFn3R1cnVsbWF6LCBwb3J0IGRpbmxlbm1lei5cbiAqXG4gKiBLdWxsYW7EsW06XG4gKiAgIGNvbnN0IHsgRnRwU2VydmVyIH0gPSByZXF1aXJlKCdmdHAtZCcpO1xuICogICBjb25zdCBzZXJ2ZXIgPSBuZXcgRnRwU2VydmVyKHsgcG9ydDogMjEsIGRiUGF0aDogJy4vZnRwZC5kYicgfSk7XG4gKiAgIHNlcnZlci5zdGFydCgpO1xuICovXG5cbi8vIEFuYSBzxLFuxLFmXG5leHBvcnQgeyBGdHBTZXJ2ZXIgfSBmcm9tICcuL2NvcmUvRnRwU2VydmVyJztcblxuLy8gVmVyaXRhYmFuxLEgecO2bmV0aW1pIChTUUxpdGU6IHVzZXJzICsgc2V0dGluZ3MgdGFibG9sYXLEsSlcbmV4cG9ydCB7IERhdGFiYXNlTWFuYWdlciB9IGZyb20gJy4vZGIvZGF0YWJhc2UnO1xuXG4vLyBLdWxsYW7EsWPEsSB2ZSBpemluIHnDtm5ldGltaVxuZXhwb3J0IHsgVXNlck1hbmFnZXIsIGdldFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi91c2VyTWFuYWdlcic7XG5cbi8vIExvZ2xhbWFcbmV4cG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbi8vIFJGQyA5NTkgeWFuxLF0IGtvZGxhcsSxXG5leHBvcnQgeyBSZXBseUNvZGUgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gVGlwIGFrdGFyxLFtbGFyxLEgKFRTIGt1bGxhbsSxY8SxbGFyxLEgacOnaW4pXG5leHBvcnQgdHlwZSB7XG4gIFNlcnZlckNvbmZpZyxcbiAgRnRwQ29ubmVjdGlvbixcbiAgVXNlcixcbiAgVXNlclBlcm1pc3Npb25zLFxuICBMaW51eFBlcm1pc3Npb25BY2Nlc3MsXG4gIFBlcm1pc3Npb24sXG4gIENvbW1hbmRSZXN1bHQsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBMSVNUIMOnxLFrdMSxc8SxbsSxIGtlbmRpIGVuZHBvaW50J2luZGUga3VsbGFubWFrIGlzdGV5ZW5sZXIgacOnaW5cbmV4cG9ydCB7IGJ1aWxkRGlyZWN0b3J5TGlzdGluZyB9IGZyb20gJy4vY29tbWFuZHMvTGlzdENvbW1hbmQnO1xuIl19
|
package/src/types.d.ts
CHANGED
|
@@ -50,24 +50,15 @@ export declare enum ReplyCode {
|
|
|
50
50
|
SERVICE_NOT_AVAILABLE = 421
|
|
51
51
|
}
|
|
52
52
|
export type Permission = 'read' | 'write' | 'list' | 'create' | 'append' | 'delete' | 'chmod' | 'mkd' | 'rmdir' | 'rename' | 'deletemyfiles' | 'nopasswd' | 'passive' | 'port' | 'nonlocalbind' | 'private' | 'tls';
|
|
53
|
-
export interface
|
|
53
|
+
export interface LinuxPermissionAccess {
|
|
54
54
|
read?: boolean;
|
|
55
55
|
write?: boolean;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
rmdir?: boolean;
|
|
63
|
-
rename?: boolean;
|
|
64
|
-
deletemyfiles?: boolean;
|
|
65
|
-
nopasswd?: boolean;
|
|
66
|
-
passive?: boolean;
|
|
67
|
-
port?: boolean;
|
|
68
|
-
nonlocalbind?: boolean;
|
|
69
|
-
private?: boolean;
|
|
70
|
-
tls?: boolean;
|
|
56
|
+
execute?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface UserPermissions {
|
|
59
|
+
owner?: LinuxPermissionAccess;
|
|
60
|
+
group?: LinuxPermissionAccess;
|
|
61
|
+
others?: LinuxPermissionAccess;
|
|
71
62
|
}
|
|
72
63
|
export interface FtpConnection {
|
|
73
64
|
socket: net.Socket;
|
|
@@ -111,17 +102,13 @@ export interface CommandResult {
|
|
|
111
102
|
}
|
|
112
103
|
export type CommandHandler = (conn: FtpConnection, args: string) => Promise<CommandResult>;
|
|
113
104
|
export interface ServerConfig {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
min: number;
|
|
122
|
-
max: number;
|
|
123
|
-
};
|
|
124
|
-
passiveIp?: string;
|
|
105
|
+
dbPath?: string;
|
|
106
|
+
banner?: string;
|
|
107
|
+
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
108
|
+
}
|
|
109
|
+
export interface UserManagerData {
|
|
110
|
+
users: User[];
|
|
111
|
+
lastUpdated: string;
|
|
125
112
|
}
|
|
126
113
|
export interface TransferStatus {
|
|
127
114
|
file: string;
|
package/src/types.js
CHANGED
|
@@ -52,4 +52,4 @@ var ReplyCode;
|
|
|
52
52
|
ReplyCode[ReplyCode["TIMEOUT"] = 421] = "TIMEOUT";
|
|
53
53
|
ReplyCode[ReplyCode["SERVICE_NOT_AVAILABLE"] = 421] = "SERVICE_NOT_AVAILABLE";
|
|
54
54
|
})(ReplyCode || (exports.ReplyCode = ReplyCode = {}));
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsSUFBWSxTQTBEWDtBQTFERCxXQUFZLFNBQVM7SUFFbkIsbURBQWMsQ0FBQTtJQUNkLDJEQUFrQixDQUFBO0lBR2xCLHVDQUFRLENBQUE7SUFDUixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxtREFBYyxDQUFBO0lBQ2QsaURBQWEsQ0FBQTtJQUNiLGlEQUFhLENBQUE7SUFDYixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUdiLHFEQUFlLENBQUE7SUFDZixtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLG1EQUFjLENBQUE7SUFHZCxtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLGlEQUFhLENBQUE7SUFDYix1REFBZ0IsQ0FBQTtJQUNoQixxREFBZSxDQUFBO0lBQ2YsaURBQWEsQ0FBQTtJQUNiLDJEQUFrQixDQUFBO0lBQ2xCLHVEQUFnQixDQUFBO0lBQ2hCLDZEQUFtQixDQUFBO0lBQ25CLG1FQUFzQixDQUFBO0lBQ3RCLG1FQUFzQixDQUFBO0lBR3RCLDJEQUFrQixDQUFBO0lBQ2xCLGlEQUFhLENBQUE7SUFDYixtREFBYyxDQUFBO0lBQ2QseURBQWlCLENBQUE7SUFDakIsK0RBQW9CLENBQUE7SUFDcEIseURBQWlCLENBQUE7SUFDakIsNkRBQW1CLENBQUE7SUFDbkIsbUVBQXNCLENBQUE7SUFDdEIseURBQWlCLENBQUE7SUFDakIsaURBQWEsQ0FBQTtJQUNiLHlEQUFpQixDQUFBO0lBQ2pCLGlEQUFhLENBQUE7SUFDYiw2RUFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBMURXLFNBQVMsYUFBVCxTQUFTLEdBQVQsU0FBUyxRQTBEcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcblxuLyoqXG4gKiBSRkMgOTU5IEZUUCBQcm90b2NvbCBUeXBlc1xuICogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvaW5mby9yZmM5NTlcbiAqL1xuXG4vKipcbiAqIEZUUCBZYW7EsXQgS29kbGFyxLEgKFJGQyA5NTkpXG4gKi9cbmV4cG9ydCBlbnVtIFJlcGx5Q29kZSB7XG4gIC8qKiAxMDAtMTk5OiDEsMWfbGVtIHRhbWFtbGFubWFkxLEsIGJpbGdpIG1lc2FqxLEgKi9cbiAgQ09OVElOVUUgPSAxMjUsXG4gIERBVEFfQ09OTkVDVCA9IDE1MCxcbiAgXG4gIC8qKiAyMDAtMjk5OiBCYcWfYXLEsWzEsSAqL1xuICBPSyA9IDIwMCxcbiAgVVNFUl9PSyA9IDIzMCxcbiAgUEFTU19PSyA9IDIzMCxcbiAgU1lTX05BTUUgPSAyMTEsXG4gIFNZU19UWVBFID0gMjE1LFxuICBGRUFUX09LID0gMjExLFxuICBSRVRSX09LID0gMjI2LFxuICBTVE9SX09LID0gMjI2LFxuICBERUxFX09LID0gMjUwLFxuICBSTURfT0sgPSAyNTAsXG4gIE1LRF9PSyA9IDI1NyxcbiAgTElTVF9PSyA9IDE1MCxcbiAgTElTVF9FTkQgPSAyMjYsXG4gIE5PT1BfT0sgPSAyMDAsXG4gIFFVSVRfT0sgPSAyMjEsXG4gIENXRF9PSyA9IDI1MCxcbiAgUFdEX09LID0gMjU3LFxuICBSRVNUX09LID0gMzUwLFxuICBcbiAgLyoqIDMwMC0zOTk6IEJla2xleWVuIGJpbGdpICovXG4gIFVTRVJfUEFTUyA9IDMzMSxcbiAgUEFTU19BQ0MgPSAzMzIsXG4gIFVTRVJfQUNDID0gMzMyLFxuICBSRVNUX05FVyA9IDM1MCxcbiAgXG4gIC8qKiA0MDAtNDk5OiBHZcOnaWNpIGhhdGEgKi9cbiAgVVNFUl9FUlIgPSA1MDMsXG4gIFBBU1NfRVJSID0gNTAzLFxuICBDTURfRVJSID0gNTAwLFxuICBTWU5UQVhfRVJSID0gNTAxLFxuICBQQVJBTV9FUlIgPSA1MDIsXG4gIEJBRF9TRVEgPSA1MDMsXG4gIE5PX1NVQ0hfVVNFUiA9IDUzMCxcbiAgTk9UX0xPR0dFRCA9IDUzMCxcbiAgV1JJVEVfUFJPVEVDVCA9IDQ1MSxcbiAgQ0FOTk9UX09QRU5fREFUQSA9IDQyNSxcbiAgVFJBTlNGRVJfQUJPUlRFRCA9IDQyNixcbiAgXG4gIC8qKiA1MDAtNTk5OiBLYWzEsWPEsSBoYXRhICovXG4gIElOVEVSTkFMX0VSUiA9IDUwMCxcbiAgQkFEX0NNRCA9IDUwMixcbiAgQkFEX1VTRVIgPSA1MzAsXG4gIE5PVF9BTExPV0VEID0gNTUwLFxuICBGSUxFX05PVF9GT1VORCA9IDU1MCxcbiAgUEFUSF9FWElTVFMgPSA1NTAsXG4gIE5PX1BFUk1JU1NJT04gPSA1NTAsXG4gIERJUkVDVE9SWV9FWElTVFMgPSA1NTAsXG4gIEZJTEVfRVhJU1RTID0gNTUwLFxuICBTWVNUX09LID0gMjE1LFxuICBCQURfQUREUkVTUyA9IDQyMSxcbiAgVElNRU9VVCA9IDQyMSxcbiAgU0VSVklDRV9OT1RfQVZBSUxBQkxFID0gNDIxLFxufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIGl6aW4gdMO8cmxlcmlcbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IFxuICB8ICdyZWFkJyAgICAgICAgICAgLy8gRG9zeWEgb2t1bWFcbiAgfCAnd3JpdGUnICAgICAgICAgIC8vIERvc3lhIHlhem1hXG4gIHwgJ2xpc3QnICAgICAgICAgICAvLyBEaXppbiBsaXN0ZWxlbWVcbiAgfCAnY3JlYXRlJyAgICAgICAgIC8vIERvc3lhL2RpemluIG9sdcWfdHVybWFcbiAgfCAnYXBwZW5kJyAgICAgICAgIC8vIERvc3lhIGVrbGVtZVxuICB8ICdkZWxldGUnICAgICAgICAgLy8gRG9zeWEgc2lsbWVcbiAgfCAnY2htb2QnICAgICAgICAgIC8vIERvc3lhIGl6aW5sZXJpIGRlxJ9pxZ90aXJtZVxuICB8ICdta2QnICAgICAgICAgICAgLy8gRGl6aW4gb2x1xZ90dXJtYVxuICB8ICdybWRpcicgICAgICAgICAgLy8gRGl6aW4gc2lsbWVcbiAgfCAncmVuYW1lJyAgICAgICAgIC8vIERvc3lhIHllbmlkZW4gYWRsYW5kxLFybWFcbiAgfCAnZGVsZXRlbXlmaWxlcycgIC8vIEtlbmRpIGRvc3lhbGFyxLFuxLEgc2lsbWVcbiAgfCAnbm9wYXNzd2QnICAgICAgIC8vIMWeaWZyZXNpeiBnaXJpxZ9cbiAgfCAncGFzc2l2ZScgICAgICAgIC8vIFBhc2lmIG1vZCAoUEFTVilcbiAgfCAncG9ydCcgICAgICAgICAgIC8vIEFrdGlmIG1vZCAoUE9SVClcbiAgfCAnbm9ubG9jYWxiaW5kJyAgIC8vIFllcmVsIG9sbWF5YW4gYmHEn2xhbm1hXG4gIHwgJ3ByaXZhdGUnICAgICAgICAvLyDDlnplbCBrb211dGxhclxuICB8ICd0bHMnOyAgICAgICAgICAgIC8vIFRMUy9TU0xcblxuLyoqXG4gKiBMaW51eCBkb3N5YSBpemluIGVyacWfaW1pIChvd25lciAvIGdyb3VwIC8gb3RoZXJzIC0+IHJ3eClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW51eFBlcm1pc3Npb25BY2Nlc3Mge1xuICByZWFkPzogYm9vbGVhbjtcbiAgd3JpdGU/OiBib29sZWFuO1xuICBleGVjdXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBLdWxsYW7EsWPEsSBpemluIG9iamVzaSAoTGludXggZmlsZSBwZXJtaXNzaW9uczogb3duZXIsIGdyb3VwLCBvdGhlcnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25zIHtcbiAgb3duZXI/OiBMaW51eFBlcm1pc3Npb25BY2Nlc3M7XG4gIGdyb3VwPzogTGludXhQZXJtaXNzaW9uQWNjZXNzO1xuICBvdGhlcnM/OiBMaW51eFBlcm1pc3Npb25BY2Nlc3M7XG59XG5cbi8qKlxuICogRlRQIEJhxJ9sYW50xLEgYmlsZ2lsZXJpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnRwQ29ubmVjdGlvbiB7XG4gIHNvY2tldDogbmV0LlNvY2tldDtcbiAgdXNlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGFzczogc3RyaW5nIHwgbnVsbDtcbiAgaG9tZURpcjogc3RyaW5nO1xuICBjdXJyZW50RGlyOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnM7XG4gIHRyYW5zZmVyTW9kZTogJ2FzY2lpJyB8ICdiaW5hcnknIHwgbnVsbDtcbiAgdHJhbnNmZXJTaXplOiBudW1iZXI7XG4gIGxhc3RSZXBseTogbnVtYmVyO1xuICBsYXN0TWVzc2FnZTogc3RyaW5nO1xuICAvKiogUk5GUiBpbGUgYmVsaXJsZW5lbiB5ZW5pZGVuIGFkbGFuZMSxcm1hIGtheW5hxJ/EsSAqL1xuICBybmZyUGF0aD86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBWZXJpIGJhZ2xhbnRpIG1vZHU6IFBBU1YgKHBhc2lmKSB2ZXlhIFBPUlQgKGFrdGlmKSAqL1xuICBkYXRhTW9kZT86ICdwYXNzaXZlJyB8ICdhY3RpdmUnO1xuICAvKiogQWt0aWYgbW9kZGEgKFBPUlQpIGlzdGVtY2luaW4gZGlubGVkaWdpIGFkcmVzICovXG4gIGFjdGl2ZURhdGFUYXJnZXQ/OiB7IGlwOiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9O1xufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIGJpbGdpbGVyaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIge1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBob21lRGlyOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnM7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIHnDtm5ldGltaSB2ZXJpdGFiYW7EsVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNYW5hZ2VyRGF0YSB7XG4gIHVzZXJzOiBVc2VyW107XG4gIGxhc3RVcGRhdGVkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVmVyaSBiYcSfbGFudMSxc8SxIGJpbGdpbGVyaSAoUE9SVC9QQVNWKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFDb25uZWN0aW9uIHtcbiAgc29ja2V0OiBuZXQuU29ja2V0O1xuICBwYXNzaXZlOiBib29sZWFuO1xuICBsb2NhbFBvcnQ6IG51bWJlcjtcbiAgc3RhdGU6ICdsaXN0ZW5pbmcnIHwgJ2Nvbm5lY3RpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnY2xvc2luZycgfCAnY2xvc2VkJztcbn1cblxuLyoqXG4gKiBLb211dCBzb251w6cgb2JqZXNpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJlc3VsdCB7XG4gIGNvZGU6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBLb211dCBpxZ9sZXZpIHRpcCB0YW7EsW1sYW1hc8SxXG4gKi9cbmV4cG9ydCB0eXBlIENvbW1hbmRIYW5kbGVyID0gKGNvbm46IEZ0cENvbm5lY3Rpb24sIGFyZ3M6IHN0cmluZykgPT4gUHJvbWlzZTxDb21tYW5kUmVzdWx0PjtcblxuLyoqXG4gKiBTZXJ2ZXIgYXlhcmxhcsSxIChTUUxpdGUgc2V0dGluZ3MgdGFibG9zdW5kYW4gecO8a2xlbmlyIC8gc2FrbGFuxLFyKVxuICogUHVibGljIGNvbmZpZzogeWFsbsSxemNhIGRiUGF0aCwgYmFubmVyIHZlIGxvZ0xldmVsIGnDp2VyaXIuXG4gKiBEacSfZXIgYXlhcmxhciAocG9ydCwgZGF0YVBvcnQsIG1heENvbm5lY3Rpb25zLCBwYXNzaXZlUG9ydFJhbmdlKSBkYXRhYmFzZSdkZW4gb2t1bnVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlckNvbmZpZyB7XG4gIC8qKiBTUUxpdGUgdmVyaXRhYmFuxLEgZG9zeWEgeW9sdSAodmFyc2F5xLFsYW46IGZ0cGQuZGIpICovXG4gIGRiUGF0aD86IHN0cmluZztcbiAgLyoqIDIyMCBrYXJzaWxhbWEgKGJhbm5lcikgbWVzYWppOyBib3MgYmlyYWtpbGlyc2EgXCI8cG9ydD4gRlRQIFNlcnZlciBSZWFkeVwiIGt1bGxhbmlsaXIgKi9cbiAgYmFubmVyPzogc3RyaW5nO1xuICBsb2dMZXZlbD86ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIHnDtm5ldGltaSB2ZXJpdGFiYW7EsSAoZ2VyaXllIGTDtm7DvGsgdXl1bWx1bHVrIGnDp2luIHR1dHVsbXXFn3R1cilcbiAqIEt1bGxhbsSxY8SxbGFyIGFydMSxayBTUUxpdGUgJ3VzZXJzJyB0YWJsb3N1bmRhIHR1dHVsdXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1hbmFnZXJEYXRhIHtcbiAgdXNlcnM6IFVzZXJbXTtcbiAgbGFzdFVwZGF0ZWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEb3N5YSB0cmFuc2ZlciBkdXJ1bXVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN0YXR1cyB7XG4gIGZpbGU6IHN0cmluZztcbiAgc3RhdGU6ICdwZW5kaW5nJyB8ICd0cmFuc2ZlcnJpbmcnIHwgJ2NvbXBsZXRlJyB8ICdmYWlsZWQnO1xuICBzaXplOiBudW1iZXI7XG4gIHRyYW5zZmVycmVkOiBudW1iZXI7XG4gIG1vZGU6ICdhc2NpaScgfCAnYmluYXJ5JztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG5cbiJdfQ==
|
package/src/userManager.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { User, UserPermissions,
|
|
1
|
+
import { User, UserPermissions, Permission } from './types';
|
|
2
|
+
import { DatabaseManager } from './db/database';
|
|
2
3
|
export declare class UserManager {
|
|
3
|
-
private
|
|
4
|
-
private persist;
|
|
4
|
+
private db;
|
|
5
5
|
private users;
|
|
6
|
-
private
|
|
7
|
-
constructor(
|
|
6
|
+
private persist;
|
|
7
|
+
constructor(dbOrData: DatabaseManager | any, persist?: boolean);
|
|
8
8
|
private normalizeData;
|
|
9
9
|
private load;
|
|
10
|
-
private save;
|
|
11
10
|
findUser(username: string): User | null;
|
|
12
11
|
addUser(username: string, password: string, homeDir: string, permissions: UserPermissions): boolean;
|
|
13
12
|
deleteUser(username: string): boolean;
|
|
@@ -20,7 +19,9 @@ export declare class UserManager {
|
|
|
20
19
|
changeUsername(oldUsername: string, newUsername: string): boolean;
|
|
21
20
|
changePassword(username: string, newPassword: string): boolean;
|
|
22
21
|
changeHomeDir(username: string, newHomeDir: string): boolean;
|
|
23
|
-
|
|
22
|
+
getDb(): DatabaseManager | null;
|
|
23
|
+
static toLinuxAction(permission: Permission): 'read' | 'write' | 'execute';
|
|
24
|
+
static getInstance(db: DatabaseManager): UserManager;
|
|
24
25
|
private static _instance;
|
|
25
26
|
}
|
|
26
|
-
export declare function getUserManager(
|
|
27
|
+
export declare function getUserManager(db?: DatabaseManager): Promise<UserManager>;
|