@keeper-security/keeper-sdk-javascript 0.1.0
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/dist/auth/ConsoleAuthUI.d.ts +10 -0
- package/dist/auth/ConsoleAuthUI.js +152 -0
- package/dist/auth/ConsoleAuthUI.js.map +1 -0
- package/dist/auth/ConsoleLogin.d.ts +8 -0
- package/dist/auth/ConsoleLogin.js +266 -0
- package/dist/auth/ConsoleLogin.js.map +1 -0
- package/dist/auth/SessionManager.d.ts +66 -0
- package/dist/auth/SessionManager.js +211 -0
- package/dist/auth/SessionManager.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/records/RecordOperations.d.ts +79 -0
- package/dist/records/RecordOperations.js +346 -0
- package/dist/records/RecordOperations.js.map +1 -0
- package/dist/records/RecordUtils.d.ts +36 -0
- package/dist/records/RecordUtils.js +224 -0
- package/dist/records/RecordUtils.js.map +1 -0
- package/dist/sharing/Sharing.d.ts +27 -0
- package/dist/sharing/Sharing.js +125 -0
- package/dist/sharing/Sharing.js.map +1 -0
- package/dist/src/auth/ConsoleAuthUI.d.ts +10 -0
- package/dist/src/auth/ConsoleAuthUI.js +161 -0
- package/dist/src/auth/ConsoleAuthUI.js.map +1 -0
- package/dist/src/auth/ConsoleLogin.d.ts +8 -0
- package/dist/src/auth/ConsoleLogin.js +311 -0
- package/dist/src/auth/ConsoleLogin.js.map +1 -0
- package/dist/src/auth/SessionManager.d.ts +67 -0
- package/dist/src/auth/SessionManager.js +212 -0
- package/dist/src/auth/SessionManager.js.map +1 -0
- package/dist/src/folders/FolderManager.d.ts +57 -0
- package/dist/src/folders/FolderManager.js +108 -0
- package/dist/src/folders/FolderManager.js.map +1 -0
- package/dist/src/folders/addFolder.d.ts +32 -0
- package/dist/src/folders/addFolder.js +207 -0
- package/dist/src/folders/addFolder.js.map +1 -0
- package/dist/src/folders/changeDirectory.d.ts +19 -0
- package/dist/src/folders/changeDirectory.js +171 -0
- package/dist/src/folders/changeDirectory.js.map +1 -0
- package/dist/src/folders/deleteFolder.d.ts +17 -0
- package/dist/src/folders/deleteFolder.js +237 -0
- package/dist/src/folders/deleteFolder.js.map +1 -0
- package/dist/src/folders/folderHelpers.d.ts +48 -0
- package/dist/src/folders/folderHelpers.js +100 -0
- package/dist/src/folders/folderHelpers.js.map +1 -0
- package/dist/src/folders/folderTree.d.ts +29 -0
- package/dist/src/folders/folderTree.js +250 -0
- package/dist/src/folders/folderTree.js.map +1 -0
- package/dist/src/folders/getFolder.d.ts +56 -0
- package/dist/src/folders/getFolder.js +143 -0
- package/dist/src/folders/getFolder.js.map +1 -0
- package/dist/src/folders/listFolder.d.ts +48 -0
- package/dist/src/folders/listFolder.js +276 -0
- package/dist/src/folders/listFolder.js.map +1 -0
- package/dist/src/folders/updateFolder.d.ts +31 -0
- package/dist/src/folders/updateFolder.js +137 -0
- package/dist/src/folders/updateFolder.js.map +1 -0
- package/dist/src/index.d.ts +49 -0
- package/dist/src/index.js +151 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/records/RecordOperations.d.ts +80 -0
- package/dist/src/records/RecordOperations.js +356 -0
- package/dist/src/records/RecordOperations.js.map +1 -0
- package/dist/src/records/RecordUtils.d.ts +37 -0
- package/dist/src/records/RecordUtils.js +263 -0
- package/dist/src/records/RecordUtils.js.map +1 -0
- package/dist/src/records/Totp.d.ts +14 -0
- package/dist/src/records/Totp.js +111 -0
- package/dist/src/records/Totp.js.map +1 -0
- package/dist/src/sharedFolders/SharedFolderManager.d.ts +20 -0
- package/dist/src/sharedFolders/SharedFolderManager.js +33 -0
- package/dist/src/sharedFolders/SharedFolderManager.js.map +1 -0
- package/dist/src/sharedFolders/listSharedFolders.d.ts +29 -0
- package/dist/src/sharedFolders/listSharedFolders.js +127 -0
- package/dist/src/sharedFolders/listSharedFolders.js.map +1 -0
- package/dist/src/sharedFolders/shareFolder.d.ts +36 -0
- package/dist/src/sharedFolders/shareFolder.js +352 -0
- package/dist/src/sharedFolders/shareFolder.js.map +1 -0
- package/dist/src/sharing/Sharing.d.ts +50 -0
- package/dist/src/sharing/Sharing.js +195 -0
- package/dist/src/sharing/Sharing.js.map +1 -0
- package/dist/src/storage/InMemoryStorage.d.ts +24 -0
- package/dist/src/storage/InMemoryStorage.js +139 -0
- package/dist/src/storage/InMemoryStorage.js.map +1 -0
- package/dist/src/teams/TeamManager.d.ts +17 -0
- package/dist/src/teams/TeamManager.js +38 -0
- package/dist/src/teams/TeamManager.js.map +1 -0
- package/dist/src/teams/enterpriseData.d.ts +106 -0
- package/dist/src/teams/enterpriseData.js +319 -0
- package/dist/src/teams/enterpriseData.js.map +1 -0
- package/dist/src/teams/listTeams.d.ts +42 -0
- package/dist/src/teams/listTeams.js +308 -0
- package/dist/src/teams/listTeams.js.map +1 -0
- package/dist/src/teams/viewTeam.d.ts +35 -0
- package/dist/src/teams/viewTeam.js +177 -0
- package/dist/src/teams/viewTeam.js.map +1 -0
- package/dist/src/utils/Logger.d.ts +28 -0
- package/dist/src/utils/Logger.js +62 -0
- package/dist/src/utils/Logger.js.map +1 -0
- package/dist/src/utils/constants.d.ts +50 -0
- package/dist/src/utils/constants.js +64 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/errors.d.ts +10 -0
- package/dist/src/utils/errors.js +117 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/guards.d.ts +7 -0
- package/dist/src/utils/guards.js +29 -0
- package/dist/src/utils/guards.js.map +1 -0
- package/dist/src/utils/index.d.ts +7 -0
- package/dist/src/utils/index.js +39 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/patterns.d.ts +9 -0
- package/dist/src/utils/patterns.js +20 -0
- package/dist/src/utils/patterns.js.map +1 -0
- package/dist/src/utils/types.d.ts +12 -0
- package/dist/src/utils/types.js +3 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/src/vault/KeeperVault.d.ts +116 -0
- package/dist/src/vault/KeeperVault.js +443 -0
- package/dist/src/vault/KeeperVault.js.map +1 -0
- package/dist/storage/InMemoryStorage.d.ts +24 -0
- package/dist/storage/InMemoryStorage.js +132 -0
- package/dist/storage/InMemoryStorage.js.map +1 -0
- package/dist/utils/Logger.d.ts +28 -0
- package/dist/utils/Logger.js +62 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/constants.d.ts +26 -0
- package/dist/utils/constants.js +37 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errors.d.ts +10 -0
- package/dist/utils/errors.js +117 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/vault/KeeperVault.d.ts +72 -0
- package/dist/vault/KeeperVault.js +338 -0
- package/dist/vault/KeeperVault.js.map +1 -0
- package/package.json +32 -0
- package/src/auth/ConsoleAuthUI.ts +169 -0
- package/src/auth/ConsoleLogin.ts +351 -0
- package/src/auth/SessionManager.ts +293 -0
- package/src/folders/FolderManager.ts +174 -0
- package/src/folders/addFolder.ts +294 -0
- package/src/folders/changeDirectory.ts +217 -0
- package/src/folders/deleteFolder.ts +293 -0
- package/src/folders/folderHelpers.ts +99 -0
- package/src/folders/folderTree.ts +321 -0
- package/src/folders/getFolder.ts +234 -0
- package/src/folders/listFolder.ts +358 -0
- package/src/folders/updateFolder.ts +210 -0
- package/src/index.ts +242 -0
- package/src/records/RecordOperations.ts +549 -0
- package/src/records/RecordUtils.ts +282 -0
- package/src/records/Totp.ts +119 -0
- package/src/sharedFolders/SharedFolderManager.ts +57 -0
- package/src/sharedFolders/listSharedFolders.ts +173 -0
- package/src/sharedFolders/shareFolder.ts +457 -0
- package/src/sharing/Sharing.ts +282 -0
- package/src/storage/InMemoryStorage.ts +163 -0
- package/src/teams/TeamManager.ts +61 -0
- package/src/teams/enterpriseData.ts +453 -0
- package/src/teams/listTeams.ts +373 -0
- package/src/teams/viewTeam.ts +248 -0
- package/src/utils/Logger.ts +71 -0
- package/src/utils/constants.ts +63 -0
- package/src/utils/errors.ts +108 -0
- package/src/utils/guards.ts +24 -0
- package/src/utils/index.ts +22 -0
- package/src/utils/patterns.ts +20 -0
- package/src/utils/types.ts +11 -0
- package/src/vault/KeeperVault.ts +612 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KeeperVault = void 0;
|
|
4
|
+
const keeperapi_1 = require("@keeper-security/keeperapi");
|
|
5
|
+
const InMemoryStorage_1 = require("../storage/InMemoryStorage");
|
|
6
|
+
const SessionManager_1 = require("../auth/SessionManager");
|
|
7
|
+
const ConsoleAuthUI_1 = require("../auth/ConsoleAuthUI");
|
|
8
|
+
const RecordUtils_1 = require("../records/RecordUtils");
|
|
9
|
+
const RecordOperations_1 = require("../records/RecordOperations");
|
|
10
|
+
const Sharing_1 = require("../sharing/Sharing");
|
|
11
|
+
const utils_1 = require("../utils");
|
|
12
|
+
var VaultStatus;
|
|
13
|
+
(function (VaultStatus) {
|
|
14
|
+
VaultStatus["RecordNotFound"] = "RECORD_NOT_FOUND";
|
|
15
|
+
VaultStatus["RecordKeyNotFound"] = "RECORD_KEY_NOT_FOUND";
|
|
16
|
+
})(VaultStatus || (VaultStatus = {}));
|
|
17
|
+
class KeeperVault {
|
|
18
|
+
constructor(config) {
|
|
19
|
+
var _a, _b;
|
|
20
|
+
this.auth = null;
|
|
21
|
+
this.synced = false;
|
|
22
|
+
this.batchDepth = 0;
|
|
23
|
+
this.config = {
|
|
24
|
+
host: (config === null || config === void 0 ? void 0 : config.host) || keeperapi_1.KeeperEnvironment.Prod,
|
|
25
|
+
clientVersion: (config === null || config === void 0 ? void 0 : config.clientVersion) || utils_1.SdkDefaults.CLIENT_VERSION,
|
|
26
|
+
configDir: (_a = config === null || config === void 0 ? void 0 : config.configDir) !== null && _a !== void 0 ? _a : '',
|
|
27
|
+
useConsoleAuth: (config === null || config === void 0 ? void 0 : config.useConsoleAuth) !== false,
|
|
28
|
+
logFormat: (config === null || config === void 0 ? void 0 : config.logFormat) || utils_1.SdkDefaults.LOG_FORMAT,
|
|
29
|
+
logLevel: (_b = config === null || config === void 0 ? void 0 : config.logLevel) !== null && _b !== void 0 ? _b : utils_1.LogLevel.INFO,
|
|
30
|
+
autoSync: (config === null || config === void 0 ? void 0 : config.autoSync) !== false,
|
|
31
|
+
};
|
|
32
|
+
this.log = new utils_1.ConsoleLogger(this.config.logLevel);
|
|
33
|
+
this.storage = (config === null || config === void 0 ? void 0 : config.storage) || new InMemoryStorage_1.InMemoryStorage();
|
|
34
|
+
this.sessionManager = (config === null || config === void 0 ? void 0 : config.sessionStorage) || new SessionManager_1.SessionManager(this.config.configDir || undefined);
|
|
35
|
+
this.authUI = (config === null || config === void 0 ? void 0 : config.authUI) || new ConsoleAuthUI_1.ConsoleAuthUI();
|
|
36
|
+
}
|
|
37
|
+
async createAuth(options) {
|
|
38
|
+
const host = this.config.host;
|
|
39
|
+
const baseDeviceConfig = await this.sessionManager.getDeviceConfig(host);
|
|
40
|
+
const deviceConfig = {
|
|
41
|
+
...baseDeviceConfig,
|
|
42
|
+
deviceName: baseDeviceConfig.deviceName || utils_1.SdkDefaults.DEVICE_NAME,
|
|
43
|
+
};
|
|
44
|
+
const sessionStorage = (options === null || options === void 0 ? void 0 : options.useSessionResumption) === false
|
|
45
|
+
? {
|
|
46
|
+
getCloneCode: async () => null,
|
|
47
|
+
saveCloneCode: (h, u, c) => this.sessionManager.saveCloneCode(h, u, c),
|
|
48
|
+
getSessionParameters: () => this.sessionManager.getSessionParameters(),
|
|
49
|
+
saveSessionParameters: (p) => this.sessionManager.saveSessionParameters(p),
|
|
50
|
+
}
|
|
51
|
+
: this.sessionManager;
|
|
52
|
+
return new keeperapi_1.Auth({
|
|
53
|
+
host,
|
|
54
|
+
clientVersion: this.config.clientVersion,
|
|
55
|
+
deviceConfig,
|
|
56
|
+
authUI3: this.config.useConsoleAuth ? this.authUI : undefined,
|
|
57
|
+
sessionStorage,
|
|
58
|
+
onDeviceConfig: this.sessionManager.createOnDeviceConfig(host),
|
|
59
|
+
useSessionResumption: options === null || options === void 0 ? void 0 : options.useSessionResumption,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
getAuthOrThrow() {
|
|
63
|
+
if (!this.auth || !this.auth.sessionToken) {
|
|
64
|
+
throw new utils_1.KeeperSdkError('Not logged in. Call login() first.', utils_1.ResultCodes.NOT_LOGGED_IN);
|
|
65
|
+
}
|
|
66
|
+
return this.auth;
|
|
67
|
+
}
|
|
68
|
+
async login(username, password) {
|
|
69
|
+
this.auth = await this.createAuth({ useSessionResumption: false });
|
|
70
|
+
this.sessionManager.setLastUsername(username);
|
|
71
|
+
await this.auth.loginV3({
|
|
72
|
+
username,
|
|
73
|
+
password,
|
|
74
|
+
loginType: keeperapi_1.Authentication.LoginType.NORMAL,
|
|
75
|
+
loginMethod: keeperapi_1.Authentication.LoginMethod.EXISTING_ACCOUNT,
|
|
76
|
+
});
|
|
77
|
+
this.synced = false;
|
|
78
|
+
this.log.info(`Logged in as ${username}`);
|
|
79
|
+
}
|
|
80
|
+
async loginWithSessionToken(username, sessionToken) {
|
|
81
|
+
const deviceConfig = await this.sessionManager.getDeviceConfig(this.config.host);
|
|
82
|
+
if (!deviceConfig.deviceToken || !deviceConfig.privateKey) {
|
|
83
|
+
throw new utils_1.KeeperSdkError('Device is not registered for this host. Perform a normal login first to register the device before using session token login.', utils_1.ResultCodes.DEVICE_NOT_REGISTERED);
|
|
84
|
+
}
|
|
85
|
+
this.auth = await this.createAuth();
|
|
86
|
+
this.sessionManager.setLastUsername(username);
|
|
87
|
+
await this.auth.loginV3({
|
|
88
|
+
username,
|
|
89
|
+
givenSessionToken: sessionToken,
|
|
90
|
+
loginType: keeperapi_1.Authentication.LoginType.NORMAL,
|
|
91
|
+
loginMethod: keeperapi_1.Authentication.LoginMethod.EXISTING_ACCOUNT,
|
|
92
|
+
});
|
|
93
|
+
if (!this.auth.sessionToken) {
|
|
94
|
+
throw new utils_1.KeeperSdkError('Session token login failed — token may be expired or invalid.', utils_1.ResultCodes.SESSION_TOKEN_EXPIRED);
|
|
95
|
+
}
|
|
96
|
+
this.synced = false;
|
|
97
|
+
this.log.info(`Logged in as ${username} (via session token)`);
|
|
98
|
+
}
|
|
99
|
+
getSessionToken() {
|
|
100
|
+
var _a;
|
|
101
|
+
return ((_a = this.auth) === null || _a === void 0 ? void 0 : _a.sessionToken) || undefined;
|
|
102
|
+
}
|
|
103
|
+
async resumeSession() {
|
|
104
|
+
const username = await this.sessionManager.getLastUsername();
|
|
105
|
+
if (!username) {
|
|
106
|
+
throw new utils_1.KeeperSdkError('No previous login found. Perform a normal login first.', utils_1.ResultCodes.NO_PREVIOUS_LOGIN);
|
|
107
|
+
}
|
|
108
|
+
this.sessionManager.setLastUsername(username);
|
|
109
|
+
const deviceConfig = await this.sessionManager.getDeviceConfig(this.config.host);
|
|
110
|
+
if (!deviceConfig.deviceToken || !deviceConfig.privateKey) {
|
|
111
|
+
throw new utils_1.KeeperSdkError('Device is not registered for this host. Perform a normal login first.', utils_1.ResultCodes.DEVICE_NOT_REGISTERED);
|
|
112
|
+
}
|
|
113
|
+
const cloneCode = await this.sessionManager.getCloneCode(this.config.host, username);
|
|
114
|
+
if (!cloneCode) {
|
|
115
|
+
throw new utils_1.KeeperSdkError('No clone code found. Persistent login not enabled or clone code expired. Perform a normal login.', utils_1.ResultCodes.NO_CLONE_CODE);
|
|
116
|
+
}
|
|
117
|
+
this.auth = await this.createAuth({ useSessionResumption: true });
|
|
118
|
+
await this.auth.loginV3({
|
|
119
|
+
loginType: keeperapi_1.Authentication.LoginType.NORMAL,
|
|
120
|
+
resumeSessionOnly: true,
|
|
121
|
+
});
|
|
122
|
+
if (!this.auth.sessionToken) {
|
|
123
|
+
throw new utils_1.KeeperSdkError('Persistent login failed — clone code may be expired or persistent login not enabled. Perform a normal login.', utils_1.ResultCodes.PERSISTENT_LOGIN_FAILED);
|
|
124
|
+
}
|
|
125
|
+
this.synced = false;
|
|
126
|
+
this.log.info(`Session resumed for ${username} (persistent login)`);
|
|
127
|
+
}
|
|
128
|
+
async sync() {
|
|
129
|
+
const auth = this.getAuthOrThrow();
|
|
130
|
+
const result = await (0, keeperapi_1.syncDown)({
|
|
131
|
+
auth,
|
|
132
|
+
storage: this.storage,
|
|
133
|
+
logFormat: this.config.logFormat,
|
|
134
|
+
});
|
|
135
|
+
this.synced = true;
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
async batch(fn) {
|
|
139
|
+
this.batchDepth++;
|
|
140
|
+
try {
|
|
141
|
+
await fn();
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
this.batchDepth--;
|
|
145
|
+
if (this.batchDepth === 0 && this.config.autoSync) {
|
|
146
|
+
await this.sync();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async syncIfNeeded() {
|
|
151
|
+
if (this.batchDepth > 0) {
|
|
152
|
+
this.synced = false;
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (this.config.autoSync) {
|
|
156
|
+
await this.sync();
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
this.synced = false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
getRecords() {
|
|
163
|
+
return this.storage.getRecords();
|
|
164
|
+
}
|
|
165
|
+
getRecordByUid(uid) {
|
|
166
|
+
return this.storage.getByUid('record', uid);
|
|
167
|
+
}
|
|
168
|
+
findRecord(uidOrTitle) {
|
|
169
|
+
const byUid = this.getRecordByUid(uidOrTitle);
|
|
170
|
+
if (byUid)
|
|
171
|
+
return byUid;
|
|
172
|
+
const needle = uidOrTitle.toLowerCase();
|
|
173
|
+
return this.getRecords().find((r) => (0, RecordUtils_1.getRecordTitle)(r).toLowerCase() === needle);
|
|
174
|
+
}
|
|
175
|
+
findRecords(criteria) {
|
|
176
|
+
return (0, RecordUtils_1.searchRecords)(this.getRecords(), criteria);
|
|
177
|
+
}
|
|
178
|
+
getRecordsByVersion(version) {
|
|
179
|
+
return this.getRecords().filter((r) => r.version === version);
|
|
180
|
+
}
|
|
181
|
+
getRecordsByType(recordType) {
|
|
182
|
+
return this.getRecords().filter((r) => (0, RecordUtils_1.getRecordType)(r) === recordType);
|
|
183
|
+
}
|
|
184
|
+
getRecordMetadata() {
|
|
185
|
+
return this.storage.getAll('metadata');
|
|
186
|
+
}
|
|
187
|
+
getRecordMetadataByUid(uid) {
|
|
188
|
+
return this.storage.getByUid('metadata', uid);
|
|
189
|
+
}
|
|
190
|
+
getSharedFolders() {
|
|
191
|
+
return this.storage.getAll('shared_folder');
|
|
192
|
+
}
|
|
193
|
+
getTeams() {
|
|
194
|
+
return this.storage.getAll('team');
|
|
195
|
+
}
|
|
196
|
+
getUserFolders() {
|
|
197
|
+
return this.storage.getAll('user_folder');
|
|
198
|
+
}
|
|
199
|
+
getSummary() {
|
|
200
|
+
return {
|
|
201
|
+
recordCount: this.storage.getCount('record'),
|
|
202
|
+
sharedFolderCount: this.storage.getCount('shared_folder'),
|
|
203
|
+
teamCount: this.storage.getCount('team'),
|
|
204
|
+
folderCount: this.storage.getCount('user_folder'),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
printRecords(showDetails = false) {
|
|
208
|
+
const records = this.getRecords();
|
|
209
|
+
if (records.length === 0) {
|
|
210
|
+
this.log.info('No records found in vault.');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.log.info(`\n=== Vault Records (${records.length}) ===\n`);
|
|
214
|
+
for (const record of records) {
|
|
215
|
+
this.log.info((0, RecordUtils_1.formatRecord)(record, showDetails));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async addRecord(input) {
|
|
219
|
+
const auth = this.getAuthOrThrow();
|
|
220
|
+
const result = await (0, RecordOperations_1.addRecord)(auth, input);
|
|
221
|
+
if (result.success)
|
|
222
|
+
await this.syncIfNeeded();
|
|
223
|
+
return result;
|
|
224
|
+
}
|
|
225
|
+
async updateRecord(recordUid, data) {
|
|
226
|
+
const auth = this.getAuthOrThrow();
|
|
227
|
+
const record = this.getRecordByUid(recordUid);
|
|
228
|
+
if (!record) {
|
|
229
|
+
return { recordUid, success: false, status: VaultStatus.RecordNotFound };
|
|
230
|
+
}
|
|
231
|
+
const keyBytes = await this.storage.getKeyBytes(recordUid);
|
|
232
|
+
if (!keyBytes) {
|
|
233
|
+
return { recordUid, success: false, status: VaultStatus.RecordKeyNotFound };
|
|
234
|
+
}
|
|
235
|
+
const result = await (0, RecordOperations_1.updateRecord)(auth, recordUid, data, record.revision, keyBytes);
|
|
236
|
+
if (result.success)
|
|
237
|
+
await this.syncIfNeeded();
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
240
|
+
async deleteRecord(recordUid) {
|
|
241
|
+
const auth = this.getAuthOrThrow();
|
|
242
|
+
const result = await (0, RecordOperations_1.deleteRecord)(auth, recordUid);
|
|
243
|
+
if (result.success)
|
|
244
|
+
await this.syncIfNeeded();
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
247
|
+
async moveRecord(input) {
|
|
248
|
+
const auth = this.getAuthOrThrow();
|
|
249
|
+
const result = await (0, RecordOperations_1.moveRecord)(auth, this.storage, input);
|
|
250
|
+
if (result.success)
|
|
251
|
+
await this.syncIfNeeded();
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
async shareRecord(input) {
|
|
255
|
+
const auth = this.getAuthOrThrow();
|
|
256
|
+
const record = this.getRecordByUid(input.recordUid)
|
|
257
|
+
|| this.findRecord(input.recordUid);
|
|
258
|
+
if (!record) {
|
|
259
|
+
return {
|
|
260
|
+
recordUid: input.recordUid,
|
|
261
|
+
email: input.email,
|
|
262
|
+
success: false,
|
|
263
|
+
status: VaultStatus.RecordNotFound,
|
|
264
|
+
message: `Record "${input.recordUid}" not found`,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
const keyBytes = await this.storage.getKeyBytes(record.uid);
|
|
268
|
+
if (!keyBytes) {
|
|
269
|
+
return {
|
|
270
|
+
recordUid: record.uid,
|
|
271
|
+
email: input.email,
|
|
272
|
+
success: false,
|
|
273
|
+
status: VaultStatus.RecordKeyNotFound,
|
|
274
|
+
message: 'Record key not available',
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
const result = await (0, Sharing_1.shareRecord)(auth, keyBytes, { ...input, recordUid: record.uid });
|
|
278
|
+
if (result.success)
|
|
279
|
+
await this.syncIfNeeded();
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
async removeRecordShare(input) {
|
|
283
|
+
const auth = this.getAuthOrThrow();
|
|
284
|
+
const result = await (0, Sharing_1.removeRecordShare)(auth, input);
|
|
285
|
+
if (result.success)
|
|
286
|
+
await this.syncIfNeeded();
|
|
287
|
+
return result;
|
|
288
|
+
}
|
|
289
|
+
async getRecordHistory(recordUid) {
|
|
290
|
+
const auth = this.getAuthOrThrow();
|
|
291
|
+
const keyBytes = await this.storage.getKeyBytes(recordUid);
|
|
292
|
+
if (!keyBytes) {
|
|
293
|
+
return { recordUid, history: [] };
|
|
294
|
+
}
|
|
295
|
+
return (0, RecordOperations_1.getRecordHistory)(auth, recordUid, keyBytes);
|
|
296
|
+
}
|
|
297
|
+
getStorage() {
|
|
298
|
+
return this.storage;
|
|
299
|
+
}
|
|
300
|
+
getAuth() {
|
|
301
|
+
return this.getAuthOrThrow();
|
|
302
|
+
}
|
|
303
|
+
disconnect() {
|
|
304
|
+
if (this.auth) {
|
|
305
|
+
try {
|
|
306
|
+
this.auth.disconnect();
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
this.log.debug('disconnect error:', (0, utils_1.extractErrorMessage)(err));
|
|
310
|
+
}
|
|
311
|
+
this.auth = null;
|
|
312
|
+
}
|
|
313
|
+
this.synced = false;
|
|
314
|
+
}
|
|
315
|
+
async logout() {
|
|
316
|
+
if (this.auth) {
|
|
317
|
+
try {
|
|
318
|
+
await this.auth.logout();
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
this.log.debug('logout error:', (0, utils_1.extractErrorMessage)(err));
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
this.disconnect();
|
|
325
|
+
this.log.info('Logged out.');
|
|
326
|
+
}
|
|
327
|
+
get host() {
|
|
328
|
+
return this.config.host;
|
|
329
|
+
}
|
|
330
|
+
get isLoggedIn() {
|
|
331
|
+
return this.auth !== null && !!this.auth.sessionToken;
|
|
332
|
+
}
|
|
333
|
+
get isSynced() {
|
|
334
|
+
return this.synced;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
exports.KeeperVault = KeeperVault;
|
|
338
|
+
//# sourceMappingURL=KeeperVault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeeperVault.js","sourceRoot":"","sources":["../../src/vault/KeeperVault.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@keeper-security/keeper-sdk-javascript",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "High-level wrapper for Keeper Security JavaScript SDK",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/Keeper-Security/keeper-sdk-javascript.git",
|
|
8
|
+
"directory": "KeeperSdk"
|
|
9
|
+
},
|
|
10
|
+
"license": "ISC",
|
|
11
|
+
"main": "src/index.ts",
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"clean": "rm -rf dist",
|
|
15
|
+
"link-local": "npm link ../keeperapi",
|
|
16
|
+
"format": "prettier --write .",
|
|
17
|
+
"format:check": "prettier --check .",
|
|
18
|
+
"test": "jest",
|
|
19
|
+
"types": "tsc --watch",
|
|
20
|
+
"types:ci": "tsc",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@keeper-security/keeperapi": "17.1.3",
|
|
25
|
+
"ts-node": "^10.7.0",
|
|
26
|
+
"typescript": "^4.6.3"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^25.6.0",
|
|
30
|
+
"prettier": "^3.8.1"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import readline from 'readline/promises'
|
|
2
|
+
import { setTimeout as delay } from 'timers/promises'
|
|
3
|
+
import type { AuthUI3, DeviceApprovalChannel, TwoFactorChannelData } from '@keeper-security/keeperapi'
|
|
4
|
+
import { Authentication } from '@keeper-security/keeperapi'
|
|
5
|
+
import { logger, extractErrorMessage, KeeperSdkError, AuthDefaults, ResultCodes } from '../utils'
|
|
6
|
+
|
|
7
|
+
export class ConsoleAuthUI implements AuthUI3 {
|
|
8
|
+
private static readonly DEVICE_VERIFICATION = {
|
|
9
|
+
Email: 0,
|
|
10
|
+
KeeperPush: 1,
|
|
11
|
+
TFA: 2,
|
|
12
|
+
AdminApproval: 3,
|
|
13
|
+
} as const
|
|
14
|
+
|
|
15
|
+
private static channelName(channel: number): string {
|
|
16
|
+
switch (channel) {
|
|
17
|
+
case ConsoleAuthUI.DEVICE_VERIFICATION.Email:
|
|
18
|
+
return 'Email Verification'
|
|
19
|
+
case ConsoleAuthUI.DEVICE_VERIFICATION.KeeperPush:
|
|
20
|
+
return 'Keeper Push'
|
|
21
|
+
case ConsoleAuthUI.DEVICE_VERIFICATION.TFA:
|
|
22
|
+
return 'Two-Factor Authentication'
|
|
23
|
+
case ConsoleAuthUI.DEVICE_VERIFICATION.AdminApproval:
|
|
24
|
+
return 'Admin Approval'
|
|
25
|
+
default:
|
|
26
|
+
return `Channel ${channel}`
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private static twoFactorChannelName(channelType: Authentication.TwoFactorChannelType): string {
|
|
31
|
+
switch (channelType) {
|
|
32
|
+
case Authentication.TwoFactorChannelType.TWO_FA_CT_TOTP:
|
|
33
|
+
return 'Authenticator App (TOTP)'
|
|
34
|
+
case Authentication.TwoFactorChannelType.TWO_FA_CT_SMS:
|
|
35
|
+
return 'SMS'
|
|
36
|
+
case Authentication.TwoFactorChannelType.TWO_FA_CT_DUO:
|
|
37
|
+
return 'Duo Security'
|
|
38
|
+
case Authentication.TwoFactorChannelType.TWO_FA_CT_RSA:
|
|
39
|
+
return 'RSA SecurID'
|
|
40
|
+
case Authentication.TwoFactorChannelType.TWO_FA_CT_DNA:
|
|
41
|
+
return 'Keeper DNA'
|
|
42
|
+
case Authentication.TwoFactorChannelType.TWO_FA_CT_U2F:
|
|
43
|
+
return 'U2F Security Key'
|
|
44
|
+
case Authentication.TwoFactorChannelType.TWO_FA_CT_WEBAUTHN:
|
|
45
|
+
return 'WebAuthn Security Key'
|
|
46
|
+
case Authentication.TwoFactorChannelType.TWO_FA_CT_KEEPER:
|
|
47
|
+
return 'Keeper'
|
|
48
|
+
default:
|
|
49
|
+
throw new KeeperSdkError(
|
|
50
|
+
`Unsupported 2FA channel type: ${channelType}`,
|
|
51
|
+
ResultCodes.UNSUPPORTED_2FA_CHANNEL
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private static async waitWithCancel(timeoutMs: number, cancel?: Promise<void>): Promise<void> {
|
|
57
|
+
if (!cancel) {
|
|
58
|
+
await delay(timeoutMs)
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
await Promise.race([delay(timeoutMs), cancel])
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public async waitForDeviceApproval(channels: DeviceApprovalChannel[], isCloud: boolean): Promise<boolean> {
|
|
65
|
+
const rl = readline.createInterface({
|
|
66
|
+
input: process.stdin,
|
|
67
|
+
output: process.stdout,
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
logger.info('\n--- Device Approval Required ---')
|
|
72
|
+
logger.info('This device needs to be approved before you can log in.')
|
|
73
|
+
logger.info('Available verification methods:')
|
|
74
|
+
channels.forEach((ch, i) => {
|
|
75
|
+
logger.info(` ${i + 1}. ${ConsoleAuthUI.channelName(ch.channel)}`)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
const choice = (await rl.question('\nSelect method (number): ')).trim()
|
|
79
|
+
const idx = parseInt(choice, 10) - 1
|
|
80
|
+
|
|
81
|
+
if (isNaN(idx) || idx < 0 || idx >= channels.length) {
|
|
82
|
+
logger.warn('Invalid selection, cancelling.')
|
|
83
|
+
return false
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const selected = channels[idx]
|
|
87
|
+
logger.info(`\nSending ${ConsoleAuthUI.channelName(selected.channel)} request...`)
|
|
88
|
+
await selected.sendApprovalRequest()
|
|
89
|
+
|
|
90
|
+
if (selected.validateCode) {
|
|
91
|
+
const code = (await rl.question('Enter verification code: ')).trim()
|
|
92
|
+
if (!code) return false
|
|
93
|
+
await selected.validateCode(code)
|
|
94
|
+
} else {
|
|
95
|
+
logger.info('Approval request sent. Waiting for approval on your other device...')
|
|
96
|
+
await ConsoleAuthUI.waitWithCancel(AuthDefaults.APPROVAL_TIMEOUT_MS)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return true
|
|
100
|
+
} catch (e) {
|
|
101
|
+
logger.error('Device approval error:', extractErrorMessage(e))
|
|
102
|
+
return false
|
|
103
|
+
} finally {
|
|
104
|
+
rl.close()
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public async waitForTwoFactorCode(channels: TwoFactorChannelData[], cancel: Promise<void>): Promise<boolean> {
|
|
109
|
+
const rl = readline.createInterface({
|
|
110
|
+
input: process.stdin,
|
|
111
|
+
output: process.stdout,
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
logger.info('\n--- Two-Factor Authentication Required ---')
|
|
116
|
+
logger.info('Available 2FA methods:')
|
|
117
|
+
channels.forEach((ch, i) => {
|
|
118
|
+
const name = ConsoleAuthUI.twoFactorChannelName(ch.channel.channelType!)
|
|
119
|
+
logger.info(` ${i + 1}. ${name}`)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
const choice = (await rl.question('\nSelect method (number): ')).trim()
|
|
123
|
+
const idx = parseInt(choice, 10) - 1
|
|
124
|
+
|
|
125
|
+
if (isNaN(idx) || idx < 0 || idx >= channels.length) {
|
|
126
|
+
logger.warn('Invalid selection, cancelling.')
|
|
127
|
+
return false
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const selected = channels[idx]
|
|
131
|
+
const name = ConsoleAuthUI.twoFactorChannelName(selected.channel.channelType!)
|
|
132
|
+
|
|
133
|
+
if (selected.availablePushes && selected.availablePushes.length > 0) {
|
|
134
|
+
const pushChoice = (await rl.question(`Send push notification for ${name}? (y/n): `)).trim()
|
|
135
|
+
if (pushChoice.toLowerCase() === 'y' && selected.sendPush) {
|
|
136
|
+
selected.sendPush(selected.availablePushes[0])
|
|
137
|
+
logger.info('Push sent. Waiting for approval...')
|
|
138
|
+
await ConsoleAuthUI.waitWithCancel(AuthDefaults.APPROVAL_TIMEOUT_MS, cancel)
|
|
139
|
+
return true
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const code = (await rl.question(`Enter ${name} code: `)).trim()
|
|
144
|
+
if (!code) return false
|
|
145
|
+
|
|
146
|
+
selected.sendCode(code)
|
|
147
|
+
await ConsoleAuthUI.waitWithCancel(AuthDefaults.CODE_VALIDATION_DELAY_MS, cancel)
|
|
148
|
+
return true
|
|
149
|
+
} catch (e) {
|
|
150
|
+
logger.error('2FA error:', extractErrorMessage(e))
|
|
151
|
+
return false
|
|
152
|
+
} finally {
|
|
153
|
+
rl.close()
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public async getPassword(isAlternate: boolean): Promise<string> {
|
|
158
|
+
const rl = readline.createInterface({
|
|
159
|
+
input: process.stdin,
|
|
160
|
+
output: process.stdout,
|
|
161
|
+
})
|
|
162
|
+
try {
|
|
163
|
+
const label = isAlternate ? 'alternate master password' : 'master password'
|
|
164
|
+
return (await rl.question(`Enter your ${label}: `)).trim()
|
|
165
|
+
} finally {
|
|
166
|
+
rl.close()
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|