@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,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeRecordShare = exports.shareRecord = void 0;
|
|
4
|
+
const keeperapi_1 = require("@keeper-security/keeperapi");
|
|
5
|
+
const errors_1 = require("../utils/errors");
|
|
6
|
+
var ShareStatus;
|
|
7
|
+
(function (ShareStatus) {
|
|
8
|
+
ShareStatus["Success"] = "success";
|
|
9
|
+
ShareStatus["PendingAccept"] = "pending_accept";
|
|
10
|
+
ShareStatus["MissingPublicKey"] = "missing_public_key";
|
|
11
|
+
ShareStatus["Error"] = "error";
|
|
12
|
+
ShareStatus["Unknown"] = "unknown";
|
|
13
|
+
})(ShareStatus || (ShareStatus = {}));
|
|
14
|
+
async function loadUserPublicKey(auth, email) {
|
|
15
|
+
const msg = (0, keeperapi_1.getPublicKeysMessage)({ usernames: [email] });
|
|
16
|
+
let response;
|
|
17
|
+
try {
|
|
18
|
+
response = await auth.executeRest(msg);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
throw new errors_1.KeeperSdkError(`Failed to fetch public key for ${email}: ${(0, errors_1.extractErrorMessage)(err)}`);
|
|
22
|
+
}
|
|
23
|
+
const keyResponses = response.keyResponses || [];
|
|
24
|
+
if (keyResponses.length === 0) {
|
|
25
|
+
throw new errors_1.KeeperSdkError(`No public key returned for ${email}`, 'missing_public_key');
|
|
26
|
+
}
|
|
27
|
+
const entry = keyResponses[0];
|
|
28
|
+
if (entry.errorCode) {
|
|
29
|
+
throw new errors_1.KeeperSdkError(`Public key lookup failed for ${email}: ${entry.errorCode} - ${entry.message || ''}`, entry.errorCode);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
username: entry.username || email,
|
|
33
|
+
rsaPublicKey: entry.publicKey && entry.publicKey.length > 0
|
|
34
|
+
? entry.publicKey
|
|
35
|
+
: null,
|
|
36
|
+
eccPublicKey: entry.publicEccKey && entry.publicEccKey.length > 0
|
|
37
|
+
? entry.publicEccKey
|
|
38
|
+
: null,
|
|
39
|
+
errorCode: entry.errorCode || null,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async function shareRecord(auth, recordKey, input) {
|
|
43
|
+
const { recordUid, email, canEdit = false, canShare = false } = input;
|
|
44
|
+
const userKeys = await loadUserPublicKey(auth, email);
|
|
45
|
+
let encryptedRecordKey;
|
|
46
|
+
let useEccKey = false;
|
|
47
|
+
if (userKeys.eccPublicKey) {
|
|
48
|
+
encryptedRecordKey = await keeperapi_1.platform.publicEncryptEC(recordKey, userKeys.eccPublicKey);
|
|
49
|
+
useEccKey = true;
|
|
50
|
+
}
|
|
51
|
+
else if (userKeys.rsaPublicKey) {
|
|
52
|
+
const rsaKeyBase64 = keeperapi_1.platform.bytesToBase64(userKeys.rsaPublicKey);
|
|
53
|
+
encryptedRecordKey = keeperapi_1.platform.publicEncrypt(recordKey, rsaKeyBase64);
|
|
54
|
+
useEccKey = false;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return {
|
|
58
|
+
recordUid,
|
|
59
|
+
email,
|
|
60
|
+
success: false,
|
|
61
|
+
status: ShareStatus.MissingPublicKey,
|
|
62
|
+
message: `No usable public key available for ${email}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const sharedRecord = {
|
|
66
|
+
toUsername: email,
|
|
67
|
+
recordUid: (0, keeperapi_1.normal64Bytes)(recordUid),
|
|
68
|
+
recordKey: encryptedRecordKey,
|
|
69
|
+
editable: canEdit,
|
|
70
|
+
shareable: canShare,
|
|
71
|
+
useEccKey,
|
|
72
|
+
};
|
|
73
|
+
const msg = (0, keeperapi_1.recordsShareUpdateMessage)({ addSharedRecord: [sharedRecord] });
|
|
74
|
+
let response;
|
|
75
|
+
try {
|
|
76
|
+
response = await auth.executeRest(msg);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
return { recordUid, email, success: false, status: ShareStatus.Error, message: (0, errors_1.extractErrorMessage)(err) };
|
|
80
|
+
}
|
|
81
|
+
const addStatuses = response.addSharedRecordStatus || [];
|
|
82
|
+
if (addStatuses.length > 0) {
|
|
83
|
+
const st = addStatuses[0];
|
|
84
|
+
const isSuccess = st.status === ShareStatus.Success || st.status === ShareStatus.PendingAccept;
|
|
85
|
+
return {
|
|
86
|
+
recordUid,
|
|
87
|
+
email: st.username || email,
|
|
88
|
+
success: isSuccess,
|
|
89
|
+
status: st.status || ShareStatus.Unknown,
|
|
90
|
+
message: st.message || st.status || '',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return { recordUid, email, success: true, status: ShareStatus.Success, message: 'Record shared successfully' };
|
|
94
|
+
}
|
|
95
|
+
exports.shareRecord = shareRecord;
|
|
96
|
+
async function removeRecordShare(auth, input) {
|
|
97
|
+
const { recordUid, email } = input;
|
|
98
|
+
const msg = (0, keeperapi_1.recordsShareUpdateMessage)({
|
|
99
|
+
removeSharedRecord: [{
|
|
100
|
+
toUsername: email,
|
|
101
|
+
recordUid: (0, keeperapi_1.normal64Bytes)(recordUid),
|
|
102
|
+
}],
|
|
103
|
+
});
|
|
104
|
+
let response;
|
|
105
|
+
try {
|
|
106
|
+
response = await auth.executeRest(msg);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
return { recordUid, email, success: false, status: ShareStatus.Error, message: (0, errors_1.extractErrorMessage)(err) };
|
|
110
|
+
}
|
|
111
|
+
const removeStatuses = response.removeSharedRecordStatus || [];
|
|
112
|
+
if (removeStatuses.length > 0) {
|
|
113
|
+
const st = removeStatuses[0];
|
|
114
|
+
return {
|
|
115
|
+
recordUid,
|
|
116
|
+
email: st.username || email,
|
|
117
|
+
success: st.status === ShareStatus.Success,
|
|
118
|
+
status: st.status || ShareStatus.Unknown,
|
|
119
|
+
message: st.message || st.status || '',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return { recordUid, email, success: true, status: ShareStatus.Success, message: 'Share removed successfully' };
|
|
123
|
+
}
|
|
124
|
+
exports.removeRecordShare = removeRecordShare;
|
|
125
|
+
//# sourceMappingURL=Sharing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sharing.js","sourceRoot":"","sources":["../../src/sharing/Sharing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AuthUI3, DeviceApprovalChannel, TwoFactorChannelData } from '@keeper-security/keeperapi';
|
|
2
|
+
export declare class ConsoleAuthUI implements AuthUI3 {
|
|
3
|
+
private static readonly DEVICE_VERIFICATION;
|
|
4
|
+
private static channelName;
|
|
5
|
+
private static twoFactorChannelName;
|
|
6
|
+
private static waitWithCancel;
|
|
7
|
+
waitForDeviceApproval(channels: DeviceApprovalChannel[], isCloud: boolean): Promise<boolean>;
|
|
8
|
+
waitForTwoFactorCode(channels: TwoFactorChannelData[], cancel: Promise<void>): Promise<boolean>;
|
|
9
|
+
getPassword(isAlternate: boolean): Promise<string>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConsoleAuthUI = void 0;
|
|
7
|
+
const promises_1 = __importDefault(require("readline/promises"));
|
|
8
|
+
const promises_2 = require("timers/promises");
|
|
9
|
+
const keeperapi_1 = require("@keeper-security/keeperapi");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
11
|
+
class ConsoleAuthUI {
|
|
12
|
+
static channelName(channel) {
|
|
13
|
+
switch (channel) {
|
|
14
|
+
case ConsoleAuthUI.DEVICE_VERIFICATION.Email:
|
|
15
|
+
return 'Email Verification';
|
|
16
|
+
case ConsoleAuthUI.DEVICE_VERIFICATION.KeeperPush:
|
|
17
|
+
return 'Keeper Push';
|
|
18
|
+
case ConsoleAuthUI.DEVICE_VERIFICATION.TFA:
|
|
19
|
+
return 'Two-Factor Authentication';
|
|
20
|
+
case ConsoleAuthUI.DEVICE_VERIFICATION.AdminApproval:
|
|
21
|
+
return 'Admin Approval';
|
|
22
|
+
default:
|
|
23
|
+
return `Channel ${channel}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
static twoFactorChannelName(channelType) {
|
|
27
|
+
switch (channelType) {
|
|
28
|
+
case keeperapi_1.Authentication.TwoFactorChannelType.TWO_FA_CT_TOTP:
|
|
29
|
+
return 'Authenticator App (TOTP)';
|
|
30
|
+
case keeperapi_1.Authentication.TwoFactorChannelType.TWO_FA_CT_SMS:
|
|
31
|
+
return 'SMS';
|
|
32
|
+
case keeperapi_1.Authentication.TwoFactorChannelType.TWO_FA_CT_DUO:
|
|
33
|
+
return 'Duo Security';
|
|
34
|
+
case keeperapi_1.Authentication.TwoFactorChannelType.TWO_FA_CT_RSA:
|
|
35
|
+
return 'RSA SecurID';
|
|
36
|
+
case keeperapi_1.Authentication.TwoFactorChannelType.TWO_FA_CT_DNA:
|
|
37
|
+
return 'Keeper DNA';
|
|
38
|
+
case keeperapi_1.Authentication.TwoFactorChannelType.TWO_FA_CT_U2F:
|
|
39
|
+
return 'U2F Security Key';
|
|
40
|
+
case keeperapi_1.Authentication.TwoFactorChannelType.TWO_FA_CT_WEBAUTHN:
|
|
41
|
+
return 'WebAuthn Security Key';
|
|
42
|
+
case keeperapi_1.Authentication.TwoFactorChannelType.TWO_FA_CT_KEEPER:
|
|
43
|
+
return 'Keeper';
|
|
44
|
+
default:
|
|
45
|
+
throw new utils_1.KeeperSdkError(`Unsupported 2FA channel type: ${channelType}`, utils_1.ResultCodes.UNSUPPORTED_2FA_CHANNEL);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
static async waitWithCancel(timeoutMs, cancel) {
|
|
49
|
+
if (!cancel) {
|
|
50
|
+
await (0, promises_2.setTimeout)(timeoutMs);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
await Promise.race([(0, promises_2.setTimeout)(timeoutMs), cancel]);
|
|
54
|
+
}
|
|
55
|
+
async waitForDeviceApproval(channels, isCloud) {
|
|
56
|
+
const rl = promises_1.default.createInterface({
|
|
57
|
+
input: process.stdin,
|
|
58
|
+
output: process.stdout,
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
utils_1.logger.info('\n--- Device Approval Required ---');
|
|
62
|
+
utils_1.logger.info('This device needs to be approved before you can log in.');
|
|
63
|
+
utils_1.logger.info('Available verification methods:');
|
|
64
|
+
channels.forEach((ch, i) => {
|
|
65
|
+
utils_1.logger.info(` ${i + 1}. ${ConsoleAuthUI.channelName(ch.channel)}`);
|
|
66
|
+
});
|
|
67
|
+
const choice = (await rl.question('\nSelect method (number): ')).trim();
|
|
68
|
+
const idx = parseInt(choice, 10) - 1;
|
|
69
|
+
if (isNaN(idx) || idx < 0 || idx >= channels.length) {
|
|
70
|
+
utils_1.logger.warn('Invalid selection, cancelling.');
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
const selected = channels[idx];
|
|
74
|
+
utils_1.logger.info(`\nSending ${ConsoleAuthUI.channelName(selected.channel)} request...`);
|
|
75
|
+
await selected.sendApprovalRequest();
|
|
76
|
+
if (selected.validateCode) {
|
|
77
|
+
const code = (await rl.question('Enter verification code: ')).trim();
|
|
78
|
+
if (!code)
|
|
79
|
+
return false;
|
|
80
|
+
await selected.validateCode(code);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
utils_1.logger.info('Approval request sent. Waiting for approval on your other device...');
|
|
84
|
+
await ConsoleAuthUI.waitWithCancel(utils_1.AuthDefaults.APPROVAL_TIMEOUT_MS);
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
utils_1.logger.error('Device approval error:', (0, utils_1.extractErrorMessage)(e));
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
rl.close();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async waitForTwoFactorCode(channels, cancel) {
|
|
97
|
+
const rl = promises_1.default.createInterface({
|
|
98
|
+
input: process.stdin,
|
|
99
|
+
output: process.stdout,
|
|
100
|
+
});
|
|
101
|
+
try {
|
|
102
|
+
utils_1.logger.info('\n--- Two-Factor Authentication Required ---');
|
|
103
|
+
utils_1.logger.info('Available 2FA methods:');
|
|
104
|
+
channels.forEach((ch, i) => {
|
|
105
|
+
const name = ConsoleAuthUI.twoFactorChannelName(ch.channel.channelType);
|
|
106
|
+
utils_1.logger.info(` ${i + 1}. ${name}`);
|
|
107
|
+
});
|
|
108
|
+
const choice = (await rl.question('\nSelect method (number): ')).trim();
|
|
109
|
+
const idx = parseInt(choice, 10) - 1;
|
|
110
|
+
if (isNaN(idx) || idx < 0 || idx >= channels.length) {
|
|
111
|
+
utils_1.logger.warn('Invalid selection, cancelling.');
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const selected = channels[idx];
|
|
115
|
+
const name = ConsoleAuthUI.twoFactorChannelName(selected.channel.channelType);
|
|
116
|
+
if (selected.availablePushes && selected.availablePushes.length > 0) {
|
|
117
|
+
const pushChoice = (await rl.question(`Send push notification for ${name}? (y/n): `)).trim();
|
|
118
|
+
if (pushChoice.toLowerCase() === 'y' && selected.sendPush) {
|
|
119
|
+
selected.sendPush(selected.availablePushes[0]);
|
|
120
|
+
utils_1.logger.info('Push sent. Waiting for approval...');
|
|
121
|
+
await ConsoleAuthUI.waitWithCancel(utils_1.AuthDefaults.APPROVAL_TIMEOUT_MS, cancel);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const code = (await rl.question(`Enter ${name} code: `)).trim();
|
|
126
|
+
if (!code)
|
|
127
|
+
return false;
|
|
128
|
+
selected.sendCode(code);
|
|
129
|
+
await ConsoleAuthUI.waitWithCancel(utils_1.AuthDefaults.CODE_VALIDATION_DELAY_MS, cancel);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
utils_1.logger.error('2FA error:', (0, utils_1.extractErrorMessage)(e));
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
rl.close();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async getPassword(isAlternate) {
|
|
141
|
+
const rl = promises_1.default.createInterface({
|
|
142
|
+
input: process.stdin,
|
|
143
|
+
output: process.stdout,
|
|
144
|
+
});
|
|
145
|
+
try {
|
|
146
|
+
const label = isAlternate ? 'alternate master password' : 'master password';
|
|
147
|
+
return (await rl.question(`Enter your ${label}: `)).trim();
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
rl.close();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.ConsoleAuthUI = ConsoleAuthUI;
|
|
155
|
+
ConsoleAuthUI.DEVICE_VERIFICATION = {
|
|
156
|
+
Email: 0,
|
|
157
|
+
KeeperPush: 1,
|
|
158
|
+
TFA: 2,
|
|
159
|
+
AdminApproval: 3,
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=ConsoleAuthUI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleAuthUI.js","sourceRoot":"","sources":["../../../src/auth/ConsoleAuthUI.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { KeeperVault } from '../vault/KeeperVault';
|
|
2
|
+
import type { KeeperJsonConfig } from './SessionManager';
|
|
3
|
+
export declare function prompt(question: string, masked?: boolean): Promise<string>;
|
|
4
|
+
export declare function loadKeeperConfig(preloaded?: KeeperJsonConfig): Promise<KeeperJsonConfig>;
|
|
5
|
+
export declare function resolveServer(username?: string, preloadedConfig?: KeeperJsonConfig): Promise<string>;
|
|
6
|
+
export declare function suppressLogs(): () => void;
|
|
7
|
+
export declare function login(): Promise<KeeperVault>;
|
|
8
|
+
export declare function cleanup(vault: KeeperVault): void;
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cleanup = exports.login = exports.suppressLogs = exports.resolveServer = exports.loadKeeperConfig = exports.prompt = void 0;
|
|
7
|
+
const promises_1 = __importDefault(require("readline/promises"));
|
|
8
|
+
const KeeperVault_1 = require("../vault/KeeperVault");
|
|
9
|
+
const utils_1 = require("../utils");
|
|
10
|
+
const ConsoleAuthUI_1 = require("./ConsoleAuthUI");
|
|
11
|
+
const SessionManager_1 = require("./SessionManager");
|
|
12
|
+
const DEFAULT_REGION = 'US';
|
|
13
|
+
const MASK_CHAR = '*';
|
|
14
|
+
const NOOP_WRITE = (() => true);
|
|
15
|
+
var CliCharAction;
|
|
16
|
+
(function (CliCharAction) {
|
|
17
|
+
CliCharAction[CliCharAction["Submit"] = 0] = "Submit";
|
|
18
|
+
CliCharAction[CliCharAction["Cancel"] = 1] = "Cancel";
|
|
19
|
+
CliCharAction[CliCharAction["Backspace"] = 2] = "Backspace";
|
|
20
|
+
CliCharAction[CliCharAction["Append"] = 3] = "Append";
|
|
21
|
+
})(CliCharAction || (CliCharAction = {}));
|
|
22
|
+
const defaultConfigLoader = new SessionManager_1.FileConfigLoader();
|
|
23
|
+
let rlManager = null;
|
|
24
|
+
let suppressionDepth = 0;
|
|
25
|
+
let originals = null;
|
|
26
|
+
function captureConsoleHandlers() {
|
|
27
|
+
return {
|
|
28
|
+
log: console.log,
|
|
29
|
+
warn: console.warn,
|
|
30
|
+
debug: console.debug,
|
|
31
|
+
error: console.error,
|
|
32
|
+
stdoutWrite: process.stdout.write.bind(process.stdout),
|
|
33
|
+
stderrWrite: process.stderr.write.bind(process.stderr),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function applyConsoleHandlers(h) {
|
|
37
|
+
console.log = h.log;
|
|
38
|
+
console.warn = h.warn;
|
|
39
|
+
console.debug = h.debug;
|
|
40
|
+
console.error = h.error;
|
|
41
|
+
process.stdout.write = h.stdoutWrite;
|
|
42
|
+
process.stderr.write = h.stderrWrite;
|
|
43
|
+
}
|
|
44
|
+
function classifyInputChar(ch) {
|
|
45
|
+
if (ch === '\n' || ch === '\r')
|
|
46
|
+
return CliCharAction.Submit;
|
|
47
|
+
if (ch === '\u0003')
|
|
48
|
+
return CliCharAction.Cancel;
|
|
49
|
+
if (ch === '\u007F' || ch === '\b')
|
|
50
|
+
return CliCharAction.Backspace;
|
|
51
|
+
return CliCharAction.Append;
|
|
52
|
+
}
|
|
53
|
+
class ReadlineManager {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.rl = null;
|
|
56
|
+
}
|
|
57
|
+
getOrCreate() {
|
|
58
|
+
if (!this.rl) {
|
|
59
|
+
this.rl = promises_1.default.createInterface({
|
|
60
|
+
input: process.stdin,
|
|
61
|
+
output: process.stdout,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return this.rl;
|
|
65
|
+
}
|
|
66
|
+
async question(query) {
|
|
67
|
+
const rl = this.getOrCreate();
|
|
68
|
+
const answer = await rl.question(query);
|
|
69
|
+
return answer.trim();
|
|
70
|
+
}
|
|
71
|
+
close() {
|
|
72
|
+
if (this.rl) {
|
|
73
|
+
this.rl.close();
|
|
74
|
+
this.rl = null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function getReadlineManager() {
|
|
79
|
+
if (!rlManager) {
|
|
80
|
+
rlManager = new ReadlineManager();
|
|
81
|
+
}
|
|
82
|
+
return rlManager;
|
|
83
|
+
}
|
|
84
|
+
function prompt(question, masked = false) {
|
|
85
|
+
const mgr = getReadlineManager();
|
|
86
|
+
if (!masked) {
|
|
87
|
+
return mgr.question(question);
|
|
88
|
+
}
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
mgr.close();
|
|
91
|
+
process.stdout.write(question);
|
|
92
|
+
let buf = '';
|
|
93
|
+
process.stdin.setRawMode(true);
|
|
94
|
+
process.stdin.resume();
|
|
95
|
+
process.stdin.setEncoding('utf8');
|
|
96
|
+
function exitRawMode() {
|
|
97
|
+
process.stdout.write('\n');
|
|
98
|
+
process.stdin.setRawMode(false);
|
|
99
|
+
process.stdin.pause();
|
|
100
|
+
process.stdin.removeListener('data', onData);
|
|
101
|
+
}
|
|
102
|
+
const onData = (str) => {
|
|
103
|
+
for (const ch of str) {
|
|
104
|
+
switch (classifyInputChar(ch)) {
|
|
105
|
+
case CliCharAction.Submit:
|
|
106
|
+
exitRawMode();
|
|
107
|
+
resolve(buf.trim());
|
|
108
|
+
return;
|
|
109
|
+
case CliCharAction.Cancel:
|
|
110
|
+
exitRawMode();
|
|
111
|
+
reject(new utils_1.KeeperSdkError('Operation cancelled by user.', utils_1.ResultCodes.USER_CANCELLED));
|
|
112
|
+
return;
|
|
113
|
+
case CliCharAction.Backspace:
|
|
114
|
+
if (buf.length > 0) {
|
|
115
|
+
buf = buf.slice(0, -1);
|
|
116
|
+
process.stdout.write('\b \b');
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
case CliCharAction.Append:
|
|
120
|
+
buf += ch;
|
|
121
|
+
process.stdout.write(MASK_CHAR);
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
process.stdin.on('data', onData);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
exports.prompt = prompt;
|
|
130
|
+
async function loadKeeperConfig(preloaded) {
|
|
131
|
+
if (preloaded)
|
|
132
|
+
return preloaded;
|
|
133
|
+
return defaultConfigLoader.load();
|
|
134
|
+
}
|
|
135
|
+
exports.loadKeeperConfig = loadKeeperConfig;
|
|
136
|
+
async function resolveServer(username, preloadedConfig) {
|
|
137
|
+
const config = await loadKeeperConfig(preloadedConfig);
|
|
138
|
+
const configServer = config.last_server || config.server;
|
|
139
|
+
if (username) {
|
|
140
|
+
const users = config.users || [];
|
|
141
|
+
const userEntry = users.find((u) => { var _a; return ((_a = u.user) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === username.toLowerCase(); });
|
|
142
|
+
if (userEntry === null || userEntry === void 0 ? void 0 : userEntry.server)
|
|
143
|
+
return userEntry.server;
|
|
144
|
+
}
|
|
145
|
+
if (configServer)
|
|
146
|
+
return configServer;
|
|
147
|
+
utils_1.logger.info('Select server region:');
|
|
148
|
+
const entries = Object.entries(utils_1.KEEPER_PUBLIC_HOSTS);
|
|
149
|
+
entries.forEach(([region, host], i) => {
|
|
150
|
+
utils_1.logger.info(` ${i + 1}. ${region} (${host})`);
|
|
151
|
+
});
|
|
152
|
+
utils_1.logger.info(` Or enter a hostname directly (e.g. dev.keepersecurity.com)`);
|
|
153
|
+
const choice = await prompt(`Region [1 = ${DEFAULT_REGION}]: `);
|
|
154
|
+
if (!choice)
|
|
155
|
+
return utils_1.KEEPER_PUBLIC_HOSTS[DEFAULT_REGION];
|
|
156
|
+
const idx = parseInt(choice, 10) - 1;
|
|
157
|
+
if (idx >= 0 && idx < entries.length)
|
|
158
|
+
return entries[idx][1];
|
|
159
|
+
return utils_1.KEEPER_PUBLIC_HOSTS[choice.toUpperCase()] || choice;
|
|
160
|
+
}
|
|
161
|
+
exports.resolveServer = resolveServer;
|
|
162
|
+
function suppressLogs() {
|
|
163
|
+
if (suppressionDepth === 0) {
|
|
164
|
+
originals = captureConsoleHandlers();
|
|
165
|
+
applyConsoleHandlers({
|
|
166
|
+
log: () => { },
|
|
167
|
+
warn: () => { },
|
|
168
|
+
debug: () => { },
|
|
169
|
+
error: () => { },
|
|
170
|
+
stdoutWrite: NOOP_WRITE,
|
|
171
|
+
stderrWrite: NOOP_WRITE,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
suppressionDepth++;
|
|
175
|
+
let restored = false;
|
|
176
|
+
return () => {
|
|
177
|
+
if (restored)
|
|
178
|
+
return;
|
|
179
|
+
restored = true;
|
|
180
|
+
suppressionDepth--;
|
|
181
|
+
if (suppressionDepth === 0 && originals) {
|
|
182
|
+
applyConsoleHandlers(originals);
|
|
183
|
+
originals = null;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
exports.suppressLogs = suppressLogs;
|
|
188
|
+
async function withSuppressedOutput(fn) {
|
|
189
|
+
const restore = suppressLogs();
|
|
190
|
+
try {
|
|
191
|
+
return await fn();
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
restore();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function unsuppressLogs() {
|
|
198
|
+
if (suppressionDepth === 0 || !originals)
|
|
199
|
+
return () => { };
|
|
200
|
+
const overrides = captureConsoleHandlers();
|
|
201
|
+
applyConsoleHandlers(originals);
|
|
202
|
+
let restored = false;
|
|
203
|
+
return () => {
|
|
204
|
+
if (restored)
|
|
205
|
+
return;
|
|
206
|
+
restored = true;
|
|
207
|
+
applyConsoleHandlers(overrides);
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function unsuppressedAuthUI() {
|
|
211
|
+
const ui = new ConsoleAuthUI_1.ConsoleAuthUI();
|
|
212
|
+
const wrap = (fn) => async (...args) => {
|
|
213
|
+
const restore = unsuppressLogs();
|
|
214
|
+
try {
|
|
215
|
+
return await fn(...args);
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
restore();
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
return {
|
|
222
|
+
waitForDeviceApproval: wrap(ui.waitForDeviceApproval.bind(ui)),
|
|
223
|
+
waitForTwoFactorCode: wrap(ui.waitForTwoFactorCode.bind(ui)),
|
|
224
|
+
getPassword: wrap(ui.getPassword.bind(ui)),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
async function login() {
|
|
228
|
+
const config = await loadKeeperConfig();
|
|
229
|
+
const defaultUsername = config.last_login || config.user || '';
|
|
230
|
+
const host = defaultUsername ? await resolveServer(defaultUsername, config) : undefined;
|
|
231
|
+
if (defaultUsername && host) {
|
|
232
|
+
const vault = await tryPersistentLogin(host, defaultUsername);
|
|
233
|
+
if (vault)
|
|
234
|
+
return vault;
|
|
235
|
+
}
|
|
236
|
+
let username;
|
|
237
|
+
if (defaultUsername) {
|
|
238
|
+
utils_1.logger.info(`Enter master password for ${defaultUsername}`);
|
|
239
|
+
username = defaultUsername;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
username = await prompt('Username (email): ');
|
|
243
|
+
}
|
|
244
|
+
if (!username) {
|
|
245
|
+
throw new utils_1.KeeperSdkError('Username is required.', utils_1.ResultCodes.MISSING_USERNAME);
|
|
246
|
+
}
|
|
247
|
+
const resolvedHost = host || (await resolveServer(username, config));
|
|
248
|
+
return await interactiveLogin(resolvedHost, username);
|
|
249
|
+
}
|
|
250
|
+
exports.login = login;
|
|
251
|
+
async function tryPersistentLogin(host, username) {
|
|
252
|
+
const vault = new KeeperVault_1.KeeperVault({
|
|
253
|
+
host,
|
|
254
|
+
clientVersion: utils_1.SdkDefaults.CLIENT_VERSION,
|
|
255
|
+
authUI: unsuppressedAuthUI(),
|
|
256
|
+
});
|
|
257
|
+
try {
|
|
258
|
+
await withSuppressedOutput(() => vault.resumeSession());
|
|
259
|
+
utils_1.logger.info(`Logging in to Keeper as ${username}`);
|
|
260
|
+
utils_1.logger.info('Successfully authenticated with Persistent Login');
|
|
261
|
+
return await syncVault(vault);
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
utils_1.logger.debug('Persistent login failed:', (0, utils_1.extractErrorMessage)(err));
|
|
265
|
+
vault.disconnect();
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async function interactiveLogin(host, username) {
|
|
270
|
+
const vault = new KeeperVault_1.KeeperVault({
|
|
271
|
+
host,
|
|
272
|
+
clientVersion: utils_1.SdkDefaults.CLIENT_VERSION,
|
|
273
|
+
authUI: unsuppressedAuthUI(),
|
|
274
|
+
});
|
|
275
|
+
for (let attempt = 1; attempt <= utils_1.AuthDefaults.MAX_LOGIN_ATTEMPTS; attempt++) {
|
|
276
|
+
const password = await prompt('Password: ', true);
|
|
277
|
+
if (!password) {
|
|
278
|
+
throw new utils_1.KeeperSdkError('Password is required.', utils_1.ResultCodes.MISSING_PASSWORD);
|
|
279
|
+
}
|
|
280
|
+
try {
|
|
281
|
+
await withSuppressedOutput(() => vault.login(username, password));
|
|
282
|
+
utils_1.logger.info('Successfully authenticated with Master Password\n');
|
|
283
|
+
return await syncVault(vault);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
const resultCode = (0, utils_1.extractResultCode)(err);
|
|
287
|
+
if (resultCode === utils_1.ResultCodes.INVALID_CREDENTIALS) {
|
|
288
|
+
const remaining = utils_1.AuthDefaults.MAX_LOGIN_ATTEMPTS - attempt;
|
|
289
|
+
if (remaining > 0) {
|
|
290
|
+
utils_1.logger.warn(`Invalid credentials (${remaining} attempt${remaining === 1 ? '' : 's'} remaining)`);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
throw new utils_1.KeeperSdkError(`Maximum login attempts (${utils_1.AuthDefaults.MAX_LOGIN_ATTEMPTS}) exceeded.`, utils_1.ResultCodes.MAX_ATTEMPTS_EXCEEDED);
|
|
294
|
+
}
|
|
295
|
+
throw utils_1.KeeperSdkError.from(err);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
throw new utils_1.KeeperSdkError(`Maximum login attempts (${utils_1.AuthDefaults.MAX_LOGIN_ATTEMPTS}) exceeded.`, utils_1.ResultCodes.MAX_ATTEMPTS_EXCEEDED);
|
|
299
|
+
}
|
|
300
|
+
async function syncVault(vault) {
|
|
301
|
+
utils_1.logger.info('Syncing vault...');
|
|
302
|
+
await withSuppressedOutput(() => vault.sync());
|
|
303
|
+
utils_1.logger.info(`Vault synced. ${vault.getSummary().recordCount} records loaded.\n`);
|
|
304
|
+
return vault;
|
|
305
|
+
}
|
|
306
|
+
function cleanup(vault) {
|
|
307
|
+
vault.disconnect();
|
|
308
|
+
getReadlineManager().close();
|
|
309
|
+
}
|
|
310
|
+
exports.cleanup = cleanup;
|
|
311
|
+
//# sourceMappingURL=ConsoleLogin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleLogin.js","sourceRoot":"","sources":["../../../src/auth/ConsoleLogin.ts"],"names":[],"mappings":"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"}
|