@wocker/ws 1.0.20 → 1.0.22
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 +8 -0
- package/lib/AppModule.js +17 -39
- package/lib/controllers/DebugController.d.ts +2 -1
- package/lib/controllers/DebugController.js +13 -5
- package/lib/controllers/KeystoreController.d.ts +11 -0
- package/lib/controllers/KeystoreController.js +106 -0
- package/lib/controllers/PluginController.d.ts +3 -5
- package/lib/controllers/PluginController.js +11 -57
- package/lib/controllers/PresetController.d.ts +5 -3
- package/lib/controllers/PresetController.js +73 -55
- package/lib/controllers/ProjectController.d.ts +5 -3
- package/lib/controllers/ProjectController.js +71 -46
- package/lib/controllers/ProxyController.d.ts +1 -1
- package/lib/controllers/ProxyController.js +56 -14
- package/lib/controllers/index.d.ts +1 -1
- package/lib/controllers/index.js +1 -1
- package/lib/env.d.ts +2 -1
- package/lib/env.js +20 -9
- package/lib/keystore/KeystoreService.d.ts +12 -0
- package/lib/keystore/KeystoreService.js +70 -0
- package/lib/keystore/index.d.ts +1 -0
- package/lib/keystore/index.js +17 -0
- package/lib/keystore/providers/FileKeystoreProvider.d.ts +16 -0
- package/lib/keystore/providers/FileKeystoreProvider.js +97 -0
- package/lib/keystore/providers/KeytarKeystoreProvider.d.ts +9 -0
- package/lib/keystore/providers/KeytarKeystoreProvider.js +74 -0
- package/lib/keystore/types/Encryption.d.ts +9 -0
- package/lib/keystore/types/Encryption.js +81 -0
- package/lib/keystore/types/Encryptor.d.ts +10 -0
- package/lib/keystore/types/Encryptor.js +59 -0
- package/lib/keystore/types/FileKeystore.d.ts +17 -0
- package/lib/keystore/types/FileKeystore.js +33 -0
- package/lib/keystore/types/Keytar.d.ts +8 -0
- package/lib/keystore/types/Keytar.js +2 -0
- package/lib/keystore/utils/createEncryptionKey.d.ts +1 -0
- package/lib/keystore/utils/createEncryptionKey.js +46 -0
- package/lib/keystore/utils/createPasswordHash.d.ts +1 -0
- package/lib/keystore/utils/createPasswordHash.js +20 -0
- package/lib/keystore/utils/decrypt.d.ts +1 -0
- package/lib/keystore/utils/decrypt.js +15 -0
- package/lib/keystore/utils/encrypt.d.ts +1 -0
- package/lib/keystore/utils/encrypt.js +19 -0
- package/lib/keystore/utils/index.d.ts +5 -0
- package/lib/keystore/utils/index.js +21 -0
- package/lib/keystore/utils/verifyPasswordHash.d.ts +1 -0
- package/lib/keystore/utils/verifyPasswordHash.js +9 -0
- package/lib/main.js +10 -5
- package/lib/makes/FS.d.ts +2 -2
- package/lib/makes/FS.js +19 -9
- package/lib/makes/GithubClient.d.ts +14 -0
- package/lib/makes/GithubClient.js +65 -0
- package/lib/makes/Http.js +17 -7
- package/lib/makes/Plugin.d.ts +6 -0
- package/lib/makes/Plugin.js +16 -0
- package/lib/makes/index.d.ts +1 -0
- package/lib/makes/index.js +1 -0
- package/lib/plugins/MongodbPlugin.js +17 -7
- package/lib/plugins/index.d.ts +0 -2
- package/lib/plugins/index.js +0 -2
- package/lib/repositories/PresetRepository.d.ts +23 -0
- package/lib/repositories/PresetRepository.js +115 -0
- package/lib/repositories/index.d.ts +1 -0
- package/lib/repositories/index.js +17 -0
- package/lib/services/AppConfigService.d.ts +16 -1
- package/lib/services/AppConfigService.js +88 -62
- package/lib/services/AppEventsService.d.ts +4 -4
- package/lib/services/AppEventsService.js +14 -10
- package/lib/services/CertService.js +18 -8
- package/lib/services/DockerService.d.ts +2 -2
- package/lib/services/DockerService.js +14 -8
- package/lib/services/LogService.d.ts +4 -1
- package/lib/services/LogService.js +14 -8
- package/lib/services/PluginService.d.ts +8 -2
- package/lib/services/PluginService.js +88 -23
- package/lib/services/PresetService.d.ts +9 -8
- package/lib/services/PresetService.js +144 -248
- package/lib/services/ProjectService.d.ts +5 -2
- package/lib/services/ProjectService.js +37 -10
- package/lib/services/ProxyService.d.ts +3 -2
- package/lib/services/ProxyService.js +43 -25
- package/lib/utils/index.d.ts +0 -2
- package/lib/utils/index.js +0 -2
- package/package.json +30 -15
- package/plugins/proxy/Dockerfile +17 -1
- package/plugins/proxy/Procfile +2 -0
- package/lib/controllers/ImageController.d.ts +0 -7
- package/lib/controllers/ImageController.js +0 -46
- package/lib/makes/Model.d.ts +0 -5
- package/lib/makes/Model.js +0 -12
- package/lib/plugins/ElasticSearchPlugin.d.ts +0 -15
- package/lib/plugins/ElasticSearchPlugin.js +0 -72
- package/lib/plugins/ProxmoxPlugin.d.ts +0 -12
- package/lib/plugins/ProxmoxPlugin.js +0 -83
- package/lib/utils/volumeFormat.d.ts +0 -6
- package/lib/utils/volumeFormat.js +0 -8
- package/lib/utils/volumeParse.d.ts +0 -2
- package/lib/utils/volumeParse.js +0 -13
- package/plugins/proxy/config.json +0 -3
- package/presets/bun/Dockerfile +0 -11
- package/presets/bun/config.json +0 -4
|
@@ -18,7 +18,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
exports.ProxyController = void 0;
|
|
19
19
|
const core_1 = require("@wocker/core");
|
|
20
20
|
const utils_1 = require("@wocker/utils");
|
|
21
|
-
const
|
|
21
|
+
const yoctocolors_cjs_1 = __importDefault(require("yoctocolors-cjs"));
|
|
22
22
|
const services_1 = require("../services");
|
|
23
23
|
let ProxyController = class ProxyController {
|
|
24
24
|
constructor(appConfigService, appEventsService, projectService, proxyService) {
|
|
@@ -35,9 +35,9 @@ let ProxyController = class ProxyController {
|
|
|
35
35
|
if (project.domains.length === 0) {
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
|
-
console.info(
|
|
38
|
+
console.info(yoctocolors_cjs_1.default.green("Don't forget to add these lines into hosts file:"));
|
|
39
39
|
for (const domain of project.domains) {
|
|
40
|
-
console.info(
|
|
40
|
+
console.info(yoctocolors_cjs_1.default.gray(`127.0.0.1 ${domain}`));
|
|
41
41
|
}
|
|
42
42
|
await this.start();
|
|
43
43
|
}
|
|
@@ -47,26 +47,55 @@ let ProxyController = class ProxyController {
|
|
|
47
47
|
const projects = this.projectService.search();
|
|
48
48
|
return projects.map((project) => project.name);
|
|
49
49
|
}
|
|
50
|
-
async init(httpPort, httpsPort) {
|
|
51
|
-
const config = this.appConfigService.
|
|
50
|
+
async init(httpPort, httpsPort, sshPort, sshPassword) {
|
|
51
|
+
const config = this.appConfigService.config;
|
|
52
52
|
if (httpPort === null || typeof httpPort === "undefined" || isNaN(httpPort)) {
|
|
53
|
-
httpPort = await (0, utils_1.
|
|
53
|
+
httpPort = await (0, utils_1.promptInput)({
|
|
54
54
|
required: true,
|
|
55
|
-
message: "Http port
|
|
55
|
+
message: "Http port",
|
|
56
56
|
type: "number",
|
|
57
|
-
default: config.getMeta("PROXY_HTTP_PORT", "80")
|
|
57
|
+
default: parseInt(config.getMeta("PROXY_HTTP_PORT", "80"))
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
config.setMeta("PROXY_HTTP_PORT", httpPort.toString());
|
|
61
61
|
if (httpsPort === null || typeof httpsPort === "undefined" || isNaN(httpsPort)) {
|
|
62
|
-
httpsPort = await (0, utils_1.
|
|
62
|
+
httpsPort = await (0, utils_1.promptInput)({
|
|
63
63
|
required: true,
|
|
64
|
-
message: "Https port
|
|
64
|
+
message: "Https port",
|
|
65
65
|
type: "number",
|
|
66
|
-
default: config.getMeta("PROXY_HTTPS_PORT", "443")
|
|
66
|
+
default: parseInt(config.getMeta("PROXY_HTTPS_PORT", "443"))
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
69
|
config.setMeta("PROXY_HTTPS_PORT", httpsPort.toString());
|
|
70
|
+
let enableSsh = !sshPassword && !sshPort
|
|
71
|
+
? await (0, utils_1.promptConfirm)({
|
|
72
|
+
message: "Enable ssh proxy?",
|
|
73
|
+
default: false
|
|
74
|
+
})
|
|
75
|
+
: true;
|
|
76
|
+
if (enableSsh) {
|
|
77
|
+
if (!sshPassword) {
|
|
78
|
+
sshPassword = await (0, utils_1.promptInput)({
|
|
79
|
+
message: "SSH Password",
|
|
80
|
+
type: "password",
|
|
81
|
+
required: true,
|
|
82
|
+
default: config.getMeta("PROXY_SSH_PASSWORD")
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (!sshPort) {
|
|
86
|
+
sshPort = await (0, utils_1.promptInput)({
|
|
87
|
+
message: "SSH port",
|
|
88
|
+
type: "number",
|
|
89
|
+
default: parseInt(config.getMeta("PROXY_SSH_PORT", "22"))
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
config.setMeta("PROXY_SSH_PASSWORD", sshPassword);
|
|
93
|
+
config.setMeta("PROXY_SSH_PORT", sshPort.toString());
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
config.unsetMeta("PROXY_SSH_PASSWORD");
|
|
97
|
+
config.unsetMeta("PROXY_SSH_PORT");
|
|
98
|
+
}
|
|
70
99
|
await config.save();
|
|
71
100
|
}
|
|
72
101
|
async start(restart, rebuild) {
|
|
@@ -89,6 +118,7 @@ __decorate([
|
|
|
89
118
|
], ProxyController.prototype, "getProjectNames", null);
|
|
90
119
|
__decorate([
|
|
91
120
|
(0, core_1.Command)("proxy:init"),
|
|
121
|
+
(0, core_1.Description)("Initializes proxy configurations"),
|
|
92
122
|
__param(0, (0, core_1.Option)("http-port", {
|
|
93
123
|
type: "number",
|
|
94
124
|
description: "Http port"
|
|
@@ -97,21 +127,30 @@ __decorate([
|
|
|
97
127
|
type: "number",
|
|
98
128
|
description: "Https port"
|
|
99
129
|
})),
|
|
130
|
+
__param(2, (0, core_1.Option)("ssh-port", {
|
|
131
|
+
type: "number",
|
|
132
|
+
description: "SSH port"
|
|
133
|
+
})),
|
|
134
|
+
__param(3, (0, core_1.Option)("ssh-password", {
|
|
135
|
+
type: "string",
|
|
136
|
+
description: "SSH password"
|
|
137
|
+
})),
|
|
100
138
|
__metadata("design:type", Function),
|
|
101
|
-
__metadata("design:paramtypes", [Number, Number]),
|
|
139
|
+
__metadata("design:paramtypes", [Number, Number, Number, String]),
|
|
102
140
|
__metadata("design:returntype", Promise)
|
|
103
141
|
], ProxyController.prototype, "init", null);
|
|
104
142
|
__decorate([
|
|
105
143
|
(0, core_1.Command)("proxy:start"),
|
|
144
|
+
(0, core_1.Description)("This command starts the proxy for the project. Options are available to restart or rebuild the proxy if needed."),
|
|
106
145
|
__param(0, (0, core_1.Option)("restart", {
|
|
107
146
|
type: "boolean",
|
|
108
147
|
alias: "r",
|
|
109
|
-
description: "
|
|
148
|
+
description: "Restarts the proxy before starting it"
|
|
110
149
|
})),
|
|
111
150
|
__param(1, (0, core_1.Option)("rebuild", {
|
|
112
151
|
type: "boolean",
|
|
113
152
|
alias: "b",
|
|
114
|
-
description: "
|
|
153
|
+
description: "Rebuilds the proxy before starting it"
|
|
115
154
|
})),
|
|
116
155
|
__metadata("design:type", Function),
|
|
117
156
|
__metadata("design:paramtypes", [Boolean, Boolean]),
|
|
@@ -119,18 +158,21 @@ __decorate([
|
|
|
119
158
|
], ProxyController.prototype, "start", null);
|
|
120
159
|
__decorate([
|
|
121
160
|
(0, core_1.Command)("proxy:stop"),
|
|
161
|
+
(0, core_1.Description)("This command stops the currently running proxy for the project. It ensures that all proxy-related services are properly halted."),
|
|
122
162
|
__metadata("design:type", Function),
|
|
123
163
|
__metadata("design:paramtypes", []),
|
|
124
164
|
__metadata("design:returntype", Promise)
|
|
125
165
|
], ProxyController.prototype, "stop", null);
|
|
126
166
|
__decorate([
|
|
127
167
|
(0, core_1.Command)("proxy:logs"),
|
|
168
|
+
(0, core_1.Description)("Displays the proxy logs"),
|
|
128
169
|
__metadata("design:type", Function),
|
|
129
170
|
__metadata("design:paramtypes", []),
|
|
130
171
|
__metadata("design:returntype", Promise)
|
|
131
172
|
], ProxyController.prototype, "logs", null);
|
|
132
173
|
exports.ProxyController = ProxyController = __decorate([
|
|
133
174
|
(0, core_1.Controller)(),
|
|
175
|
+
(0, core_1.Description)("Proxy commands"),
|
|
134
176
|
__metadata("design:paramtypes", [services_1.AppConfigService,
|
|
135
177
|
services_1.AppEventsService,
|
|
136
178
|
services_1.ProjectService,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from "./CertController";
|
|
2
2
|
export * from "./CompletionController";
|
|
3
3
|
export * from "./DebugController";
|
|
4
|
-
export * from "./
|
|
4
|
+
export * from "./KeystoreController";
|
|
5
5
|
export * from "./PluginController";
|
|
6
6
|
export * from "./PresetController";
|
|
7
7
|
export * from "./ProjectController";
|
package/lib/controllers/index.js
CHANGED
|
@@ -17,7 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./CertController"), exports);
|
|
18
18
|
__exportStar(require("./CompletionController"), exports);
|
|
19
19
|
__exportStar(require("./DebugController"), exports);
|
|
20
|
-
__exportStar(require("./
|
|
20
|
+
__exportStar(require("./KeystoreController"), exports);
|
|
21
21
|
__exportStar(require("./PluginController"), exports);
|
|
22
22
|
__exportStar(require("./PresetController"), exports);
|
|
23
23
|
__exportStar(require("./ProjectController"), exports);
|
package/lib/env.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const WOCKER_VERSION = "1.0.
|
|
1
|
+
export declare const WOCKER_VERSION = "1.0.22";
|
|
2
2
|
export declare const NODE_ENV: string;
|
|
3
3
|
export declare const ROOT_DIR: string;
|
|
4
4
|
export declare const PRESETS_DIR: string;
|
|
@@ -6,3 +6,4 @@ export declare const SERVICES_DIR: string;
|
|
|
6
6
|
export declare const PLUGINS_DIR: string;
|
|
7
7
|
export declare const DATA_DIR: string;
|
|
8
8
|
export declare const VIRTUAL_HOST_KEY = "VIRTUAL_HOST";
|
|
9
|
+
export declare const KEYTAR_SERVICE: string;
|
package/lib/env.js
CHANGED
|
@@ -15,18 +15,28 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
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
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.VIRTUAL_HOST_KEY = exports.DATA_DIR = exports.PLUGINS_DIR = exports.SERVICES_DIR = exports.PRESETS_DIR = exports.ROOT_DIR = exports.NODE_ENV = exports.WOCKER_VERSION = void 0;
|
|
36
|
+
exports.KEYTAR_SERVICE = exports.VIRTUAL_HOST_KEY = exports.DATA_DIR = exports.PLUGINS_DIR = exports.SERVICES_DIR = exports.PRESETS_DIR = exports.ROOT_DIR = exports.NODE_ENV = exports.WOCKER_VERSION = void 0;
|
|
27
37
|
const OS = __importStar(require("os"));
|
|
28
38
|
const Path = __importStar(require("path"));
|
|
29
|
-
exports.WOCKER_VERSION = "1.0.
|
|
39
|
+
exports.WOCKER_VERSION = "1.0.22";
|
|
30
40
|
exports.NODE_ENV = process.env.NODE_ENV;
|
|
31
41
|
exports.ROOT_DIR = Path.join(__dirname, "..");
|
|
32
42
|
exports.PRESETS_DIR = Path.join(exports.ROOT_DIR, "presets");
|
|
@@ -34,3 +44,4 @@ exports.SERVICES_DIR = Path.join(exports.ROOT_DIR, "services");
|
|
|
34
44
|
exports.PLUGINS_DIR = Path.join(exports.ROOT_DIR, "plugins");
|
|
35
45
|
exports.DATA_DIR = process.env.WS_DIR || Path.join(OS.homedir(), ".workspace");
|
|
36
46
|
exports.VIRTUAL_HOST_KEY = "VIRTUAL_HOST";
|
|
47
|
+
exports.KEYTAR_SERVICE = process.env.WOCKER_KEYTAR_SERVICE || "wocker";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { KeystoreService as CoreKeystoreService, KeystoreProvider } from "@wocker/core";
|
|
2
|
+
import { AppConfigService } from "../services/AppConfigService";
|
|
3
|
+
export declare class KeystoreService extends CoreKeystoreService {
|
|
4
|
+
protected readonly appConfigService: AppConfigService;
|
|
5
|
+
protected providers: Map<string, KeystoreProvider>;
|
|
6
|
+
constructor(appConfigService: AppConfigService);
|
|
7
|
+
hasProvider(name: string): boolean;
|
|
8
|
+
provider(name?: string): KeystoreProvider;
|
|
9
|
+
get(keys: string | string[], byDefault?: string): Promise<string | undefined>;
|
|
10
|
+
set(key: string, value: string): Promise<void>;
|
|
11
|
+
registerProvider(name: string, provider: KeystoreProvider): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.KeystoreService = void 0;
|
|
13
|
+
const core_1 = require("@wocker/core");
|
|
14
|
+
const AppConfigService_1 = require("../services/AppConfigService");
|
|
15
|
+
const KeytarKeystoreProvider_1 = require("./providers/KeytarKeystoreProvider");
|
|
16
|
+
const FileKeystoreProvider_1 = require("./providers/FileKeystoreProvider");
|
|
17
|
+
let KeystoreService = class KeystoreService extends core_1.KeystoreService {
|
|
18
|
+
constructor(appConfigService) {
|
|
19
|
+
super();
|
|
20
|
+
this.appConfigService = appConfigService;
|
|
21
|
+
this.providers = new Map();
|
|
22
|
+
}
|
|
23
|
+
hasProvider(name) {
|
|
24
|
+
return ["file", "keytar"].includes(name);
|
|
25
|
+
}
|
|
26
|
+
provider(name) {
|
|
27
|
+
if (!name) {
|
|
28
|
+
name = this.appConfigService.config.keystore;
|
|
29
|
+
}
|
|
30
|
+
if (!name) {
|
|
31
|
+
name = "file";
|
|
32
|
+
}
|
|
33
|
+
switch (name) {
|
|
34
|
+
case "file":
|
|
35
|
+
return new FileKeystoreProvider_1.FileKeystoreProvider(this.appConfigService);
|
|
36
|
+
case "keytar":
|
|
37
|
+
return new KeytarKeystoreProvider_1.KeytarKeystoreProvider();
|
|
38
|
+
default:
|
|
39
|
+
throw new Error(`Unknown keystore provider "${name}"`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async get(keys, byDefault) {
|
|
43
|
+
const provider = this.provider();
|
|
44
|
+
if (Array.isArray(keys)) {
|
|
45
|
+
for (const key of keys) {
|
|
46
|
+
const value = await provider.get(key);
|
|
47
|
+
if (value) {
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return byDefault;
|
|
52
|
+
}
|
|
53
|
+
return provider.get(keys, byDefault);
|
|
54
|
+
}
|
|
55
|
+
async set(key, value) {
|
|
56
|
+
const provider = this.provider();
|
|
57
|
+
await provider.set(key, value);
|
|
58
|
+
}
|
|
59
|
+
registerProvider(name, provider) {
|
|
60
|
+
if (this.providers.has(name)) {
|
|
61
|
+
throw new Error(`Provider ${name} already registered`);
|
|
62
|
+
}
|
|
63
|
+
this.providers.set(name, provider);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
exports.KeystoreService = KeystoreService;
|
|
67
|
+
exports.KeystoreService = KeystoreService = __decorate([
|
|
68
|
+
(0, core_1.Injectable)("KEYSTORE_SERVICE"),
|
|
69
|
+
__metadata("design:paramtypes", [AppConfigService_1.AppConfigService])
|
|
70
|
+
], KeystoreService);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./KeystoreService";
|
|
@@ -0,0 +1,17 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./KeystoreService"), exports);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { KeystoreProvider } from "@wocker/core";
|
|
2
|
+
import { AppConfigService } from "../../services/AppConfigService";
|
|
3
|
+
import { FileKeystore } from "../types/FileKeystore";
|
|
4
|
+
export declare class FileKeystoreProvider extends KeystoreProvider {
|
|
5
|
+
protected readonly appConfigService: AppConfigService;
|
|
6
|
+
protected password?: string;
|
|
7
|
+
protected encryptionKey?: Buffer;
|
|
8
|
+
protected _keystore?: FileKeystore;
|
|
9
|
+
constructor(appConfigService: AppConfigService);
|
|
10
|
+
protected get keystore(): FileKeystore;
|
|
11
|
+
protected get passwordHash(): string | undefined;
|
|
12
|
+
protected getEncryptionKey(): Promise<Buffer>;
|
|
13
|
+
get(key: string, defaultValue?: string): Promise<string | undefined>;
|
|
14
|
+
set(key: string, value: string): Promise<void>;
|
|
15
|
+
delete(key: string): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.FileKeystoreProvider = void 0;
|
|
13
|
+
const core_1 = require("@wocker/core");
|
|
14
|
+
const utils_1 = require("@wocker/utils");
|
|
15
|
+
const AppConfigService_1 = require("../../services/AppConfigService");
|
|
16
|
+
const FileKeystore_1 = require("../types/FileKeystore");
|
|
17
|
+
const utils_2 = require("../utils");
|
|
18
|
+
let FileKeystoreProvider = class FileKeystoreProvider extends core_1.KeystoreProvider {
|
|
19
|
+
constructor(appConfigService) {
|
|
20
|
+
super();
|
|
21
|
+
this.appConfigService = appConfigService;
|
|
22
|
+
}
|
|
23
|
+
get keystore() {
|
|
24
|
+
if (!this._keystore) {
|
|
25
|
+
const fs = this.appConfigService.fs;
|
|
26
|
+
let data = {
|
|
27
|
+
secrets: {}
|
|
28
|
+
};
|
|
29
|
+
if (fs.exists("wocker.keystore.js")) {
|
|
30
|
+
try {
|
|
31
|
+
data = {
|
|
32
|
+
...require(fs.path("wocker.keystore.js"))
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
this._keystore = new class extends FileKeystore_1.FileKeystore {
|
|
39
|
+
save() {
|
|
40
|
+
if (!fs.exists()) {
|
|
41
|
+
fs.mkdir("");
|
|
42
|
+
}
|
|
43
|
+
fs.writeFile("wocker.keystore.js", this.toString());
|
|
44
|
+
}
|
|
45
|
+
}(data);
|
|
46
|
+
}
|
|
47
|
+
return this._keystore;
|
|
48
|
+
}
|
|
49
|
+
get passwordHash() {
|
|
50
|
+
return this.keystore.passwordHash;
|
|
51
|
+
}
|
|
52
|
+
async getEncryptionKey() {
|
|
53
|
+
if (!this.encryptionKey) {
|
|
54
|
+
const password = await (0, utils_1.promptInput)({
|
|
55
|
+
required: true,
|
|
56
|
+
min: 6,
|
|
57
|
+
max: 32,
|
|
58
|
+
message: "Keystore password",
|
|
59
|
+
type: "password",
|
|
60
|
+
validate: async (value) => {
|
|
61
|
+
if (typeof value !== "string" || !this.passwordHash || (0, utils_2.verifyPasswordHash)(value, this.passwordHash)) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return "Invalid password";
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
if (!this.keystore.passwordHash) {
|
|
68
|
+
this.keystore.passwordHash = (0, utils_2.createPasswordHash)(password);
|
|
69
|
+
this.keystore.save();
|
|
70
|
+
}
|
|
71
|
+
this.encryptionKey = (0, utils_2.createEncryptionKey)(password, this.keystore.passwordHash);
|
|
72
|
+
}
|
|
73
|
+
return this.encryptionKey;
|
|
74
|
+
}
|
|
75
|
+
async get(key, defaultValue) {
|
|
76
|
+
const value = this.keystore.get(key);
|
|
77
|
+
if (!value) {
|
|
78
|
+
return defaultValue;
|
|
79
|
+
}
|
|
80
|
+
const encryptionKey = await this.getEncryptionKey();
|
|
81
|
+
return (0, utils_2.decrypt)(encryptionKey, value);
|
|
82
|
+
}
|
|
83
|
+
async set(key, value) {
|
|
84
|
+
const encryptionKey = await this.getEncryptionKey();
|
|
85
|
+
this.keystore.set(key, (0, utils_2.encrypt)(encryptionKey, value));
|
|
86
|
+
this.keystore.save();
|
|
87
|
+
}
|
|
88
|
+
async delete(key) {
|
|
89
|
+
this.keystore.delete(key);
|
|
90
|
+
this.keystore.save();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
exports.FileKeystoreProvider = FileKeystoreProvider;
|
|
94
|
+
exports.FileKeystoreProvider = FileKeystoreProvider = __decorate([
|
|
95
|
+
(0, core_1.Injectable)(),
|
|
96
|
+
__metadata("design:paramtypes", [AppConfigService_1.AppConfigService])
|
|
97
|
+
], FileKeystoreProvider);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { KeystoreProvider } from "@wocker/core";
|
|
2
|
+
import { Keytar } from "../types/Keytar";
|
|
3
|
+
export declare class KeytarKeystoreProvider extends KeystoreProvider {
|
|
4
|
+
protected _keytar?: any;
|
|
5
|
+
get(key: string, defaultValue?: string): Promise<string | undefined>;
|
|
6
|
+
set(key: string, value: string): Promise<void>;
|
|
7
|
+
delete(key: string): Promise<void>;
|
|
8
|
+
protected getKeytar(): Promise<Keytar>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.KeytarKeystoreProvider = void 0;
|
|
43
|
+
const core_1 = require("@wocker/core");
|
|
44
|
+
const env_1 = require("../../env");
|
|
45
|
+
let KeytarKeystoreProvider = class KeytarKeystoreProvider extends core_1.KeystoreProvider {
|
|
46
|
+
async get(key, defaultValue) {
|
|
47
|
+
const keytar = await this.getKeytar();
|
|
48
|
+
const value = await keytar.getPassword(env_1.KEYTAR_SERVICE, key);
|
|
49
|
+
return value || defaultValue;
|
|
50
|
+
}
|
|
51
|
+
async set(key, value) {
|
|
52
|
+
const keytar = await this.getKeytar();
|
|
53
|
+
try {
|
|
54
|
+
await keytar.setPassword(env_1.KEYTAR_SERVICE, key, value);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.log(err.message);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async delete(key) {
|
|
61
|
+
const keytar = await this.getKeytar();
|
|
62
|
+
await keytar.deletePassword(env_1.KEYTAR_SERVICE, key);
|
|
63
|
+
}
|
|
64
|
+
async getKeytar() {
|
|
65
|
+
if (!this._keytar) {
|
|
66
|
+
this._keytar = await Promise.resolve().then(() => __importStar(require("keytar")));
|
|
67
|
+
}
|
|
68
|
+
return this._keytar;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.KeytarKeystoreProvider = KeytarKeystoreProvider;
|
|
72
|
+
exports.KeytarKeystoreProvider = KeytarKeystoreProvider = __decorate([
|
|
73
|
+
(0, core_1.Injectable)()
|
|
74
|
+
], KeytarKeystoreProvider);
|
|
@@ -0,0 +1,81 @@
|
|
|
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.Encryption = void 0;
|
|
37
|
+
const crypto = __importStar(require("crypto"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const util_1 = require("util");
|
|
41
|
+
const fsReadFile = (0, util_1.promisify)(fs.readFile);
|
|
42
|
+
const fsWriteFile = (0, util_1.promisify)(fs.writeFile);
|
|
43
|
+
const fsMkdir = (0, util_1.promisify)(fs.mkdir);
|
|
44
|
+
const fsAccess = (0, util_1.promisify)(fs.access);
|
|
45
|
+
class Encryption {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.algorithm = 'aes-256-gcm';
|
|
48
|
+
this.keyLength = 32;
|
|
49
|
+
this.ivLength = 16;
|
|
50
|
+
this.saltLength = 64;
|
|
51
|
+
this.tagLength = 16;
|
|
52
|
+
}
|
|
53
|
+
async getEncryptionKey(keyPath, masterPassword) {
|
|
54
|
+
try {
|
|
55
|
+
await fsAccess(path.dirname(keyPath));
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
await fsMkdir(path.dirname(keyPath), { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
let salt;
|
|
61
|
+
try {
|
|
62
|
+
salt = await fsReadFile(keyPath);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
salt = crypto.randomBytes(this.saltLength);
|
|
66
|
+
await fsWriteFile(keyPath, salt);
|
|
67
|
+
}
|
|
68
|
+
return this.deriveKey(masterPassword, salt);
|
|
69
|
+
}
|
|
70
|
+
async deriveKey(password, salt) {
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
crypto.scrypt(password, salt, this.keyLength, (err, derivedKey) => {
|
|
73
|
+
if (err)
|
|
74
|
+
reject(err);
|
|
75
|
+
else
|
|
76
|
+
resolve(derivedKey);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.Encryption = Encryption;
|