@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.
Files changed (173) hide show
  1. package/dist/auth/ConsoleAuthUI.d.ts +10 -0
  2. package/dist/auth/ConsoleAuthUI.js +152 -0
  3. package/dist/auth/ConsoleAuthUI.js.map +1 -0
  4. package/dist/auth/ConsoleLogin.d.ts +8 -0
  5. package/dist/auth/ConsoleLogin.js +266 -0
  6. package/dist/auth/ConsoleLogin.js.map +1 -0
  7. package/dist/auth/SessionManager.d.ts +66 -0
  8. package/dist/auth/SessionManager.js +211 -0
  9. package/dist/auth/SessionManager.js.map +1 -0
  10. package/dist/index.d.ts +17 -0
  11. package/dist/index.js +61 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/records/RecordOperations.d.ts +79 -0
  14. package/dist/records/RecordOperations.js +346 -0
  15. package/dist/records/RecordOperations.js.map +1 -0
  16. package/dist/records/RecordUtils.d.ts +36 -0
  17. package/dist/records/RecordUtils.js +224 -0
  18. package/dist/records/RecordUtils.js.map +1 -0
  19. package/dist/sharing/Sharing.d.ts +27 -0
  20. package/dist/sharing/Sharing.js +125 -0
  21. package/dist/sharing/Sharing.js.map +1 -0
  22. package/dist/src/auth/ConsoleAuthUI.d.ts +10 -0
  23. package/dist/src/auth/ConsoleAuthUI.js +161 -0
  24. package/dist/src/auth/ConsoleAuthUI.js.map +1 -0
  25. package/dist/src/auth/ConsoleLogin.d.ts +8 -0
  26. package/dist/src/auth/ConsoleLogin.js +311 -0
  27. package/dist/src/auth/ConsoleLogin.js.map +1 -0
  28. package/dist/src/auth/SessionManager.d.ts +67 -0
  29. package/dist/src/auth/SessionManager.js +212 -0
  30. package/dist/src/auth/SessionManager.js.map +1 -0
  31. package/dist/src/folders/FolderManager.d.ts +57 -0
  32. package/dist/src/folders/FolderManager.js +108 -0
  33. package/dist/src/folders/FolderManager.js.map +1 -0
  34. package/dist/src/folders/addFolder.d.ts +32 -0
  35. package/dist/src/folders/addFolder.js +207 -0
  36. package/dist/src/folders/addFolder.js.map +1 -0
  37. package/dist/src/folders/changeDirectory.d.ts +19 -0
  38. package/dist/src/folders/changeDirectory.js +171 -0
  39. package/dist/src/folders/changeDirectory.js.map +1 -0
  40. package/dist/src/folders/deleteFolder.d.ts +17 -0
  41. package/dist/src/folders/deleteFolder.js +237 -0
  42. package/dist/src/folders/deleteFolder.js.map +1 -0
  43. package/dist/src/folders/folderHelpers.d.ts +48 -0
  44. package/dist/src/folders/folderHelpers.js +100 -0
  45. package/dist/src/folders/folderHelpers.js.map +1 -0
  46. package/dist/src/folders/folderTree.d.ts +29 -0
  47. package/dist/src/folders/folderTree.js +250 -0
  48. package/dist/src/folders/folderTree.js.map +1 -0
  49. package/dist/src/folders/getFolder.d.ts +56 -0
  50. package/dist/src/folders/getFolder.js +143 -0
  51. package/dist/src/folders/getFolder.js.map +1 -0
  52. package/dist/src/folders/listFolder.d.ts +48 -0
  53. package/dist/src/folders/listFolder.js +276 -0
  54. package/dist/src/folders/listFolder.js.map +1 -0
  55. package/dist/src/folders/updateFolder.d.ts +31 -0
  56. package/dist/src/folders/updateFolder.js +137 -0
  57. package/dist/src/folders/updateFolder.js.map +1 -0
  58. package/dist/src/index.d.ts +49 -0
  59. package/dist/src/index.js +151 -0
  60. package/dist/src/index.js.map +1 -0
  61. package/dist/src/records/RecordOperations.d.ts +80 -0
  62. package/dist/src/records/RecordOperations.js +356 -0
  63. package/dist/src/records/RecordOperations.js.map +1 -0
  64. package/dist/src/records/RecordUtils.d.ts +37 -0
  65. package/dist/src/records/RecordUtils.js +263 -0
  66. package/dist/src/records/RecordUtils.js.map +1 -0
  67. package/dist/src/records/Totp.d.ts +14 -0
  68. package/dist/src/records/Totp.js +111 -0
  69. package/dist/src/records/Totp.js.map +1 -0
  70. package/dist/src/sharedFolders/SharedFolderManager.d.ts +20 -0
  71. package/dist/src/sharedFolders/SharedFolderManager.js +33 -0
  72. package/dist/src/sharedFolders/SharedFolderManager.js.map +1 -0
  73. package/dist/src/sharedFolders/listSharedFolders.d.ts +29 -0
  74. package/dist/src/sharedFolders/listSharedFolders.js +127 -0
  75. package/dist/src/sharedFolders/listSharedFolders.js.map +1 -0
  76. package/dist/src/sharedFolders/shareFolder.d.ts +36 -0
  77. package/dist/src/sharedFolders/shareFolder.js +352 -0
  78. package/dist/src/sharedFolders/shareFolder.js.map +1 -0
  79. package/dist/src/sharing/Sharing.d.ts +50 -0
  80. package/dist/src/sharing/Sharing.js +195 -0
  81. package/dist/src/sharing/Sharing.js.map +1 -0
  82. package/dist/src/storage/InMemoryStorage.d.ts +24 -0
  83. package/dist/src/storage/InMemoryStorage.js +139 -0
  84. package/dist/src/storage/InMemoryStorage.js.map +1 -0
  85. package/dist/src/teams/TeamManager.d.ts +17 -0
  86. package/dist/src/teams/TeamManager.js +38 -0
  87. package/dist/src/teams/TeamManager.js.map +1 -0
  88. package/dist/src/teams/enterpriseData.d.ts +106 -0
  89. package/dist/src/teams/enterpriseData.js +319 -0
  90. package/dist/src/teams/enterpriseData.js.map +1 -0
  91. package/dist/src/teams/listTeams.d.ts +42 -0
  92. package/dist/src/teams/listTeams.js +308 -0
  93. package/dist/src/teams/listTeams.js.map +1 -0
  94. package/dist/src/teams/viewTeam.d.ts +35 -0
  95. package/dist/src/teams/viewTeam.js +177 -0
  96. package/dist/src/teams/viewTeam.js.map +1 -0
  97. package/dist/src/utils/Logger.d.ts +28 -0
  98. package/dist/src/utils/Logger.js +62 -0
  99. package/dist/src/utils/Logger.js.map +1 -0
  100. package/dist/src/utils/constants.d.ts +50 -0
  101. package/dist/src/utils/constants.js +64 -0
  102. package/dist/src/utils/constants.js.map +1 -0
  103. package/dist/src/utils/errors.d.ts +10 -0
  104. package/dist/src/utils/errors.js +117 -0
  105. package/dist/src/utils/errors.js.map +1 -0
  106. package/dist/src/utils/guards.d.ts +7 -0
  107. package/dist/src/utils/guards.js +29 -0
  108. package/dist/src/utils/guards.js.map +1 -0
  109. package/dist/src/utils/index.d.ts +7 -0
  110. package/dist/src/utils/index.js +39 -0
  111. package/dist/src/utils/index.js.map +1 -0
  112. package/dist/src/utils/patterns.d.ts +9 -0
  113. package/dist/src/utils/patterns.js +20 -0
  114. package/dist/src/utils/patterns.js.map +1 -0
  115. package/dist/src/utils/types.d.ts +12 -0
  116. package/dist/src/utils/types.js +3 -0
  117. package/dist/src/utils/types.js.map +1 -0
  118. package/dist/src/vault/KeeperVault.d.ts +116 -0
  119. package/dist/src/vault/KeeperVault.js +443 -0
  120. package/dist/src/vault/KeeperVault.js.map +1 -0
  121. package/dist/storage/InMemoryStorage.d.ts +24 -0
  122. package/dist/storage/InMemoryStorage.js +132 -0
  123. package/dist/storage/InMemoryStorage.js.map +1 -0
  124. package/dist/utils/Logger.d.ts +28 -0
  125. package/dist/utils/Logger.js +62 -0
  126. package/dist/utils/Logger.js.map +1 -0
  127. package/dist/utils/constants.d.ts +26 -0
  128. package/dist/utils/constants.js +37 -0
  129. package/dist/utils/constants.js.map +1 -0
  130. package/dist/utils/errors.d.ts +10 -0
  131. package/dist/utils/errors.js +117 -0
  132. package/dist/utils/errors.js.map +1 -0
  133. package/dist/utils/index.d.ts +4 -0
  134. package/dist/utils/index.js +22 -0
  135. package/dist/utils/index.js.map +1 -0
  136. package/dist/vault/KeeperVault.d.ts +72 -0
  137. package/dist/vault/KeeperVault.js +338 -0
  138. package/dist/vault/KeeperVault.js.map +1 -0
  139. package/package.json +32 -0
  140. package/src/auth/ConsoleAuthUI.ts +169 -0
  141. package/src/auth/ConsoleLogin.ts +351 -0
  142. package/src/auth/SessionManager.ts +293 -0
  143. package/src/folders/FolderManager.ts +174 -0
  144. package/src/folders/addFolder.ts +294 -0
  145. package/src/folders/changeDirectory.ts +217 -0
  146. package/src/folders/deleteFolder.ts +293 -0
  147. package/src/folders/folderHelpers.ts +99 -0
  148. package/src/folders/folderTree.ts +321 -0
  149. package/src/folders/getFolder.ts +234 -0
  150. package/src/folders/listFolder.ts +358 -0
  151. package/src/folders/updateFolder.ts +210 -0
  152. package/src/index.ts +242 -0
  153. package/src/records/RecordOperations.ts +549 -0
  154. package/src/records/RecordUtils.ts +282 -0
  155. package/src/records/Totp.ts +119 -0
  156. package/src/sharedFolders/SharedFolderManager.ts +57 -0
  157. package/src/sharedFolders/listSharedFolders.ts +173 -0
  158. package/src/sharedFolders/shareFolder.ts +457 -0
  159. package/src/sharing/Sharing.ts +282 -0
  160. package/src/storage/InMemoryStorage.ts +163 -0
  161. package/src/teams/TeamManager.ts +61 -0
  162. package/src/teams/enterpriseData.ts +453 -0
  163. package/src/teams/listTeams.ts +373 -0
  164. package/src/teams/viewTeam.ts +248 -0
  165. package/src/utils/Logger.ts +71 -0
  166. package/src/utils/constants.ts +63 -0
  167. package/src/utils/errors.ts +108 -0
  168. package/src/utils/guards.ts +24 -0
  169. package/src/utils/index.ts +22 -0
  170. package/src/utils/patterns.ts +20 -0
  171. package/src/utils/types.ts +11 -0
  172. package/src/vault/KeeperVault.ts +612 -0
  173. package/tsconfig.json +16 -0
@@ -0,0 +1,37 @@
1
+ import type { DRecord } from '@keeper-security/keeperapi';
2
+ export declare enum RecordVersion {
3
+ Legacy = 2,
4
+ Typed = 3
5
+ }
6
+ type RecordField = {
7
+ type: string;
8
+ value: any[];
9
+ label?: string;
10
+ required?: boolean;
11
+ privacyScreen?: boolean;
12
+ enforceGeneration?: boolean;
13
+ complexity?: {
14
+ length?: number;
15
+ caps?: number;
16
+ lowercase?: number;
17
+ digits?: number;
18
+ special?: number;
19
+ };
20
+ };
21
+ export declare function getRecordTitle(record: DRecord): string;
22
+ export declare function getRecordType(record: DRecord): string;
23
+ export declare function getRecordFields(record: DRecord): RecordField[];
24
+ export type RecordSummary = {
25
+ login?: string;
26
+ password?: string;
27
+ url?: string;
28
+ fields: RecordField[];
29
+ };
30
+ export declare function getRecordSummary(record: DRecord): RecordSummary;
31
+ export declare function getRecordTotpUrl(record: DRecord): string | undefined;
32
+ export declare function getRecordPassword(record: DRecord): string | undefined;
33
+ export declare function getRecordLogin(record: DRecord): string | undefined;
34
+ export declare function getRecordUrl(record: DRecord): string | undefined;
35
+ export declare function searchRecords(records: DRecord[], criteria: string): DRecord[];
36
+ export declare function formatRecord(record: DRecord, showDetails?: boolean): string;
37
+ export {};
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatRecord = exports.searchRecords = exports.getRecordUrl = exports.getRecordLogin = exports.getRecordPassword = exports.getRecordTotpUrl = exports.getRecordSummary = exports.getRecordFields = exports.getRecordType = exports.getRecordTitle = exports.RecordVersion = void 0;
4
+ const Totp_1 = require("./Totp");
5
+ var FieldType;
6
+ (function (FieldType) {
7
+ FieldType["Login"] = "login";
8
+ FieldType["Password"] = "password";
9
+ FieldType["Url"] = "url";
10
+ FieldType["Note"] = "note";
11
+ FieldType["Text"] = "text";
12
+ })(FieldType || (FieldType = {}));
13
+ var RecordVersion;
14
+ (function (RecordVersion) {
15
+ RecordVersion[RecordVersion["Legacy"] = 2] = "Legacy";
16
+ RecordVersion[RecordVersion["Typed"] = 3] = "Typed";
17
+ })(RecordVersion = exports.RecordVersion || (exports.RecordVersion = {}));
18
+ const TOTP_FIELD_TYPES = new Set(['totp', 'oneTimeCode', 'otp']);
19
+ const MASKED_VALUE = '********';
20
+ const RECORD_SEPARATOR = '-'.repeat(50);
21
+ function toFieldValueArray(v) {
22
+ if (v == null)
23
+ return [];
24
+ return Array.isArray(v) ? v : [v];
25
+ }
26
+ function getLegacyExtraFields(record) {
27
+ const raw = record.extra;
28
+ if (raw == null)
29
+ return [];
30
+ let extra;
31
+ if (typeof raw === 'string') {
32
+ try {
33
+ extra = JSON.parse(raw);
34
+ }
35
+ catch (_a) {
36
+ return [];
37
+ }
38
+ }
39
+ else if (typeof raw === 'object') {
40
+ extra = raw;
41
+ }
42
+ else {
43
+ return [];
44
+ }
45
+ if (!Array.isArray(extra.fields))
46
+ return [];
47
+ const out = [];
48
+ for (const f of extra.fields) {
49
+ const typeName = f.type || f.field_type || FieldType.Text;
50
+ const rawVal = f.value !== undefined && f.value !== null ? f.value : f.data;
51
+ out.push({
52
+ type: typeName,
53
+ value: toFieldValueArray(rawVal),
54
+ label: f.label || f.field_title,
55
+ });
56
+ }
57
+ return out;
58
+ }
59
+ function getRecordTitle(record) {
60
+ if (!record.data)
61
+ return '(no data)';
62
+ if (typeof record.data === 'string') {
63
+ try {
64
+ const parsed = JSON.parse(record.data);
65
+ return parsed.title || '(untitled)';
66
+ }
67
+ catch (_a) {
68
+ return '(parse error)';
69
+ }
70
+ }
71
+ return record.data.title || '(untitled)';
72
+ }
73
+ exports.getRecordTitle = getRecordTitle;
74
+ function getRecordType(record) {
75
+ if (record.version <= RecordVersion.Legacy)
76
+ return 'legacy';
77
+ if (!record.data)
78
+ return 'unknown';
79
+ return record.data.type || 'unknown';
80
+ }
81
+ exports.getRecordType = getRecordType;
82
+ function getRecordFields(record) {
83
+ if (!record.data)
84
+ return [];
85
+ if (record.version <= RecordVersion.Legacy) {
86
+ const fields = [];
87
+ const d = record.data;
88
+ if (d.secret1)
89
+ fields.push({ type: FieldType.Login, value: [d.secret1] });
90
+ if (d.secret2)
91
+ fields.push({ type: FieldType.Password, value: [d.secret2] });
92
+ if (d.link)
93
+ fields.push({ type: FieldType.Url, value: [d.link] });
94
+ if (d.notes)
95
+ fields.push({ type: FieldType.Note, value: [d.notes] });
96
+ if (Array.isArray(d.custom)) {
97
+ for (const c of d.custom) {
98
+ if (!c)
99
+ continue;
100
+ fields.push({
101
+ type: c.type || FieldType.Text,
102
+ value: c.value != null && c.value !== '' ? [c.value] : [],
103
+ label: c.name,
104
+ });
105
+ }
106
+ }
107
+ const extraFields = getLegacyExtraFields(record);
108
+ fields.push(...extraFields);
109
+ return fields;
110
+ }
111
+ const fields = [];
112
+ if (Array.isArray(record.data.fields)) {
113
+ for (const f of record.data.fields) {
114
+ fields.push({
115
+ type: f.type || FieldType.Text,
116
+ value: Array.isArray(f.value) ? f.value : [f.value],
117
+ label: f.label,
118
+ required: f.required,
119
+ privacyScreen: f.privacyScreen,
120
+ enforceGeneration: f.enforceGeneration,
121
+ complexity: f.complexity,
122
+ });
123
+ }
124
+ }
125
+ if (Array.isArray(record.data.custom)) {
126
+ for (const f of record.data.custom) {
127
+ fields.push({
128
+ type: f.type || FieldType.Text,
129
+ value: Array.isArray(f.value) ? f.value : [f.value],
130
+ label: f.label,
131
+ required: f.required,
132
+ privacyScreen: f.privacyScreen,
133
+ enforceGeneration: f.enforceGeneration,
134
+ complexity: f.complexity,
135
+ });
136
+ }
137
+ }
138
+ return fields;
139
+ }
140
+ exports.getRecordFields = getRecordFields;
141
+ function getRecordSummary(record) {
142
+ var _a, _b, _c;
143
+ const fields = getRecordFields(record);
144
+ if (record.version <= RecordVersion.Legacy) {
145
+ return {
146
+ login: (_a = record.data) === null || _a === void 0 ? void 0 : _a.secret1,
147
+ password: (_b = record.data) === null || _b === void 0 ? void 0 : _b.secret2,
148
+ url: (_c = record.data) === null || _c === void 0 ? void 0 : _c.link,
149
+ fields,
150
+ };
151
+ }
152
+ let login;
153
+ let password;
154
+ let url;
155
+ for (const f of fields) {
156
+ if (!login && f.type === FieldType.Login && f.value.length > 0) {
157
+ login = String(f.value[0]);
158
+ }
159
+ else if (!password && f.type === FieldType.Password && f.value.length > 0) {
160
+ password = String(f.value[0]);
161
+ }
162
+ else if (!url && f.type === FieldType.Url && f.value.length > 0) {
163
+ const val = f.value[0];
164
+ url = typeof val === 'string' ? val : (val === null || val === void 0 ? void 0 : val.value) || (val === null || val === void 0 ? void 0 : val.url);
165
+ }
166
+ }
167
+ return { login, password, url, fields };
168
+ }
169
+ exports.getRecordSummary = getRecordSummary;
170
+ function getRecordTotpUrl(record) {
171
+ for (const field of getRecordFields(record)) {
172
+ if (!TOTP_FIELD_TYPES.has(field.type))
173
+ continue;
174
+ for (const v of field.value) {
175
+ if (typeof v === 'string' && v.trim())
176
+ return v.trim();
177
+ }
178
+ }
179
+ return undefined;
180
+ }
181
+ exports.getRecordTotpUrl = getRecordTotpUrl;
182
+ function getRecordPassword(record) {
183
+ return getRecordSummary(record).password;
184
+ }
185
+ exports.getRecordPassword = getRecordPassword;
186
+ function getRecordLogin(record) {
187
+ return getRecordSummary(record).login;
188
+ }
189
+ exports.getRecordLogin = getRecordLogin;
190
+ function getRecordUrl(record) {
191
+ return getRecordSummary(record).url;
192
+ }
193
+ exports.getRecordUrl = getRecordUrl;
194
+ const wordCache = new WeakMap();
195
+ function searchRecords(records, criteria) {
196
+ if (!criteria.trim())
197
+ return records;
198
+ const searchWords = criteria.toLowerCase().split(/\s+/);
199
+ return records.filter((record) => {
200
+ let words = wordCache.get(record);
201
+ if (!words) {
202
+ words = collectRecordWords(record);
203
+ wordCache.set(record, words);
204
+ }
205
+ return searchWords.every((sw) => words.some((w) => w.includes(sw)));
206
+ });
207
+ }
208
+ exports.searchRecords = searchRecords;
209
+ function collectRecordWords(record) {
210
+ const words = [];
211
+ const title = getRecordTitle(record);
212
+ if (title)
213
+ words.push(...title.toLowerCase().split(/\s+/));
214
+ for (const field of getRecordFields(record)) {
215
+ if (field.label)
216
+ words.push(field.label.toLowerCase());
217
+ for (const v of field.value) {
218
+ if (typeof v === 'string') {
219
+ words.push(...v.toLowerCase().split(/\s+/));
220
+ }
221
+ else if (v && typeof v === 'object') {
222
+ for (const val of Object.values(v)) {
223
+ if (typeof val === 'string') {
224
+ words.push(...val.toLowerCase().split(/\s+/));
225
+ }
226
+ }
227
+ }
228
+ }
229
+ }
230
+ words.push(record.uid);
231
+ return words;
232
+ }
233
+ function formatRecord(record, showDetails = false) {
234
+ const summary = getRecordSummary(record);
235
+ const lines = [
236
+ RECORD_SEPARATOR,
237
+ `Title: ${getRecordTitle(record)}`,
238
+ `Record UID: ${record.uid}`,
239
+ `Record Type: ${getRecordType(record)}`,
240
+ ];
241
+ if (summary.login)
242
+ lines.push(`Username: ${summary.login}`);
243
+ if (summary.url)
244
+ lines.push(`URL: ${summary.url}`);
245
+ if (showDetails) {
246
+ for (const field of summary.fields) {
247
+ if (field.type === FieldType.Login || field.type === FieldType.Url)
248
+ continue;
249
+ const isTotp = TOTP_FIELD_TYPES.has(field.type);
250
+ const isSensitive = field.type === FieldType.Password || isTotp;
251
+ const label = isTotp ? 'TOTP URL' : field.label || field.type;
252
+ lines.push(`${label}: ${isSensitive ? MASKED_VALUE : field.value.join(', ')}`);
253
+ }
254
+ const totpUrl = getRecordTotpUrl(record);
255
+ const code = totpUrl ? (0, Totp_1.getTotpCode)(totpUrl) : null;
256
+ if (code) {
257
+ lines.push(`Two Factor Code: ${code.code} valid for ${code.secondsRemaining} sec`);
258
+ }
259
+ }
260
+ return lines.join('\n');
261
+ }
262
+ exports.formatRecord = formatRecord;
263
+ //# sourceMappingURL=RecordUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordUtils.js","sourceRoot":"","sources":["../../../src/records/RecordUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type TotpAlgorithm = 'SHA1' | 'SHA256' | 'SHA512';
2
+ export type TotpParams = {
3
+ secret: string;
4
+ algorithm: TotpAlgorithm;
5
+ digits: number;
6
+ period: number;
7
+ };
8
+ export type TotpCode = {
9
+ code: string;
10
+ secondsRemaining: number;
11
+ period: number;
12
+ };
13
+ export declare function parseTotpUrl(url: string): TotpParams | null;
14
+ export declare function getTotpCode(urlOrParams: string | TotpParams, now?: number): TotpCode | null;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTotpCode = exports.parseTotpUrl = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
6
+ const DEFAULT_DIGITS = 6;
7
+ const DEFAULT_PERIOD = 30;
8
+ const DEFAULT_ALGORITHM = 'SHA1';
9
+ const UINT32_MAX = 0x100000000;
10
+ function decodeBase32(input) {
11
+ const noWhitespace = input.replace(/\s+/g, '');
12
+ let endIndex = noWhitespace.length;
13
+ while (endIndex > 0 && noWhitespace.charCodeAt(endIndex - 1) === 0x3d)
14
+ endIndex--;
15
+ const cleaned = noWhitespace.slice(0, endIndex).toUpperCase();
16
+ const out = [];
17
+ let buffer = 0;
18
+ let bits = 0;
19
+ for (const ch of cleaned) {
20
+ const idx = BASE32_ALPHABET.indexOf(ch);
21
+ if (idx < 0)
22
+ throw new Error(`Invalid base32 character "${ch}" in TOTP secret`);
23
+ buffer = (buffer << 5) | idx;
24
+ bits += 5;
25
+ if (bits >= 8) {
26
+ bits -= 8;
27
+ out.push((buffer >> bits) & 0xff);
28
+ }
29
+ }
30
+ return Uint8Array.from(out);
31
+ }
32
+ function normalizeAlgorithm(value) {
33
+ const upper = (value || DEFAULT_ALGORITHM).toUpperCase();
34
+ return upper === 'SHA256' || upper === 'SHA512' ? upper : DEFAULT_ALGORITHM;
35
+ }
36
+ function parsePositiveInt(value, fallback) {
37
+ const parsed = parseInt(value || '', 10);
38
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
39
+ }
40
+ function parseTotpUrl(url) {
41
+ if (!(url === null || url === void 0 ? void 0 : url.trim()))
42
+ return null;
43
+ let params;
44
+ try {
45
+ if (url.startsWith('otpauth://')) {
46
+ const u = new URL(url);
47
+ if (u.hostname.toLowerCase() !== 'totp')
48
+ return null;
49
+ params = u.searchParams;
50
+ }
51
+ else {
52
+ params = new URLSearchParams(url);
53
+ }
54
+ }
55
+ catch (_a) {
56
+ return null;
57
+ }
58
+ const secret = (params.get('secret') || '').trim();
59
+ if (!secret)
60
+ return null;
61
+ return {
62
+ secret,
63
+ algorithm: normalizeAlgorithm(params.get('algorithm')),
64
+ digits: parsePositiveInt(params.get('digits'), DEFAULT_DIGITS),
65
+ period: parsePositiveInt(params.get('period'), DEFAULT_PERIOD),
66
+ };
67
+ }
68
+ exports.parseTotpUrl = parseTotpUrl;
69
+ function counterToBuffer(counter) {
70
+ const buf = Buffer.alloc(8);
71
+ buf.writeUInt32BE(Math.floor(counter / UINT32_MAX), 0);
72
+ buf.writeUInt32BE(counter % UINT32_MAX, 4);
73
+ return buf;
74
+ }
75
+ function getTotpCode(urlOrParams, now = Date.now()) {
76
+ const params = typeof urlOrParams === 'string' ? parseTotpUrl(urlOrParams) : urlOrParams;
77
+ if (!params)
78
+ return null;
79
+ if (!Number.isFinite(params.period) || params.period <= 0)
80
+ return null;
81
+ if (!Number.isFinite(params.digits) || params.digits <= 0)
82
+ return null;
83
+ let key;
84
+ try {
85
+ key = decodeBase32(params.secret);
86
+ }
87
+ catch (_a) {
88
+ return null;
89
+ }
90
+ if (key.length === 0)
91
+ return null;
92
+ const seconds = Math.floor(now / 1000);
93
+ const counter = Math.floor(seconds / params.period);
94
+ const secondsRemaining = params.period - (seconds % params.period);
95
+ const digest = (0, crypto_1.createHmac)(params.algorithm.toLowerCase(), Buffer.from(key))
96
+ .update(counterToBuffer(counter))
97
+ .digest();
98
+ if (digest.length === 0)
99
+ return null;
100
+ const offset = digest[digest.length - 1] & 0x0f;
101
+ if (offset + 3 >= digest.length)
102
+ return null;
103
+ const binary = ((digest[offset] & 0x7f) << 24) |
104
+ ((digest[offset + 1] & 0xff) << 16) |
105
+ ((digest[offset + 2] & 0xff) << 8) |
106
+ (digest[offset + 3] & 0xff);
107
+ const code = (binary % 10 ** params.digits).toString().padStart(params.digits, '0');
108
+ return { code, secondsRemaining, period: params.period };
109
+ }
110
+ exports.getTotpCode = getTotpCode;
111
+ //# sourceMappingURL=Totp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Totp.js","sourceRoot":"","sources":["../../../src/records/Totp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Auth } from '@keeper-security/keeperapi';
2
+ import { InMemoryStorage } from '../storage/InMemoryStorage';
3
+ import type { FormattedSharedFoldersTable, ListSharedFolderRow, ListSharedFoldersOptions } from './listSharedFolders';
4
+ import type { ShareFolderInput, ShareFolderResult } from './shareFolder';
5
+ export type AuthProvider = () => Auth;
6
+ export declare class SharedFolderManager {
7
+ private readonly storage;
8
+ private readonly authProvider;
9
+ constructor(storage: InMemoryStorage, authProvider: AuthProvider);
10
+ private requireAuth;
11
+ listSharedFolders(options?: ListSharedFoldersOptions): ListSharedFolderRow[];
12
+ formatSharedFoldersTable(rows: ListSharedFolderRow[], options?: {
13
+ verbose?: boolean;
14
+ columnWidth?: number;
15
+ }): FormattedSharedFoldersTable;
16
+ renderSharedFoldersAsciiTable(table: FormattedSharedFoldersTable, options?: {
17
+ minColWidth?: number;
18
+ }): string;
19
+ shareFolder(input: ShareFolderInput): Promise<ShareFolderResult>;
20
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharedFolderManager = void 0;
4
+ const utils_1 = require("../utils");
5
+ const listSharedFolders_1 = require("./listSharedFolders");
6
+ const shareFolder_1 = require("./shareFolder");
7
+ class SharedFolderManager {
8
+ constructor(storage, authProvider) {
9
+ this.storage = storage;
10
+ this.authProvider = authProvider;
11
+ }
12
+ requireAuth() {
13
+ const auth = this.authProvider();
14
+ if (!auth) {
15
+ throw new utils_1.KeeperSdkError('Not logged in. Call login() first.', utils_1.ResultCodes.NOT_LOGGED_IN);
16
+ }
17
+ return auth;
18
+ }
19
+ listSharedFolders(options = {}) {
20
+ return (0, listSharedFolders_1.listSharedFolders)(this.storage, options);
21
+ }
22
+ formatSharedFoldersTable(rows, options = {}) {
23
+ return (0, listSharedFolders_1.formatSharedFoldersTable)(rows, options);
24
+ }
25
+ renderSharedFoldersAsciiTable(table, options = {}) {
26
+ return (0, listSharedFolders_1.renderSharedFoldersAsciiTable)(table, options);
27
+ }
28
+ async shareFolder(input) {
29
+ return (0, shareFolder_1.shareFolder)(this.requireAuth(), this.storage, input);
30
+ }
31
+ }
32
+ exports.SharedFolderManager = SharedFolderManager;
33
+ //# sourceMappingURL=SharedFolderManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedFolderManager.js","sourceRoot":"","sources":["../../../src/sharedFolders/SharedFolderManager.ts"],"names":[],"mappings":";;;AAEA,oCAAsD;AACtD,2DAI4B;AAM5B,+CAA2C;AAK3C,MAAa,mBAAmB;IAI5B,YAAY,OAAwB,EAAE,YAA0B;QAC5D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IACpC,CAAC;IAEO,WAAW;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;QAChC,IAAI,CAAC,IAAI,EAAE;YACP,MAAM,IAAI,sBAAc,CAAC,oCAAoC,EAAE,mBAAW,CAAC,aAAa,CAAC,CAAA;SAC5F;QACD,OAAO,IAAI,CAAA;IACf,CAAC;IAEM,iBAAiB,CAAC,UAAoC,EAAE;QAC3D,OAAO,IAAA,qCAAiB,EAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IAEM,wBAAwB,CAC3B,IAA2B,EAC3B,UAAuD,EAAE;QAEzD,OAAO,IAAA,4CAAwB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;IAEM,6BAA6B,CAChC,KAAkC,EAClC,UAAoC,EAAE;QAEtC,OAAO,IAAA,iDAA6B,EAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAuB;QAC5C,OAAO,IAAA,yBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC/D,CAAC;CACJ;AAtCD,kDAsCC"}
@@ -0,0 +1,29 @@
1
+ import { InMemoryStorage } from '../storage/InMemoryStorage';
2
+ export type ListSharedFoldersOptions = {
3
+ pattern?: string | null;
4
+ verbose?: boolean;
5
+ includeDetails?: boolean;
6
+ };
7
+ export type ListSharedFolderRow = {
8
+ shared_folder_uid: string;
9
+ name: string;
10
+ team_count?: number;
11
+ user_count?: number;
12
+ record_count?: number;
13
+ default_manage_records?: boolean;
14
+ default_manage_users?: boolean;
15
+ default_can_edit?: boolean;
16
+ default_can_share?: boolean;
17
+ };
18
+ export declare function listSharedFolders(storage: InMemoryStorage, options?: ListSharedFoldersOptions): ListSharedFolderRow[];
19
+ export type FormattedSharedFoldersTable = {
20
+ headers: string[];
21
+ rows: string[][];
22
+ };
23
+ export declare function formatSharedFoldersTable(rows: ListSharedFolderRow[], options?: {
24
+ verbose?: boolean;
25
+ columnWidth?: number;
26
+ }): FormattedSharedFoldersTable;
27
+ export declare function renderSharedFoldersAsciiTable(table: FormattedSharedFoldersTable, options?: {
28
+ minColWidth?: number;
29
+ }): string;
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderSharedFoldersAsciiTable = exports.formatSharedFoldersTable = exports.listSharedFolders = void 0;
4
+ const utils_1 = require("../utils");
5
+ const folderHelpers_1 = require("../folders/folderHelpers");
6
+ const DEFAULT_COLUMN_WIDTH = 40;
7
+ const MIN_TRUNCATE_PREFIX = 3;
8
+ function sharedFolderDisplayName(folder) {
9
+ return (folder.name || folder.uid).trim() || folder.uid;
10
+ }
11
+ function findSharedFolders(storage, pattern) {
12
+ const searchWords = tokenize(pattern.toLowerCase());
13
+ const matches = [];
14
+ for (const sharedFolder of storage.getAll(folderHelpers_1.FolderKind.SharedFolder)) {
15
+ const uid = sharedFolder.uid;
16
+ const name = sharedFolderDisplayName(sharedFolder).toLowerCase();
17
+ const entityWords = tokenize(`${uid} ${name}`);
18
+ if (matchEntity(entityWords, searchWords)) {
19
+ matches.push(sharedFolder);
20
+ }
21
+ }
22
+ return matches;
23
+ }
24
+ function matchEntity(entityWords, searchWords) {
25
+ if (!searchWords || searchWords.length === 0)
26
+ return true;
27
+ if (!entityWords || entityWords.length === 0)
28
+ return false;
29
+ for (const entityWord of entityWords) {
30
+ for (const searchWord of searchWords) {
31
+ if (searchWord.length <= entityWord.length && entityWord.includes(searchWord)) {
32
+ return true;
33
+ }
34
+ }
35
+ }
36
+ return false;
37
+ }
38
+ function tokenize(text) {
39
+ return text.split(utils_1.TOKEN_SEPARATOR_PATTERN).filter((token) => token.length > 0);
40
+ }
41
+ function countBySharedFolderUid(items, sharedFolderUid) {
42
+ let count = 0;
43
+ for (const item of items) {
44
+ if (item.sharedFolderUid === sharedFolderUid)
45
+ count += 1;
46
+ }
47
+ return count;
48
+ }
49
+ function countTeamsForFolder(storage, sharedFolderUid) {
50
+ return countBySharedFolderUid(storage.getAll(folderHelpers_1.VaultObjectKind.SharedFolderTeam), sharedFolderUid);
51
+ }
52
+ function countUsersForFolder(storage, sharedFolderUid) {
53
+ return countBySharedFolderUid(storage.getAll(folderHelpers_1.VaultObjectKind.SharedFolderUser), sharedFolderUid);
54
+ }
55
+ function countRecordsForFolder(storage, sharedFolderUid) {
56
+ return countBySharedFolderUid(storage.getAll(folderHelpers_1.VaultObjectKind.SharedFolderRecord), sharedFolderUid);
57
+ }
58
+ function listSharedFolders(storage, options = {}) {
59
+ const { pattern, includeDetails = false } = options;
60
+ const sharedFolders = pattern
61
+ ? findSharedFolders(storage, pattern)
62
+ : storage.getAll(folderHelpers_1.FolderKind.SharedFolder);
63
+ return sharedFolders.map((sharedFolder) => {
64
+ const shared_folder_uid = sharedFolder.uid;
65
+ const name = sharedFolderDisplayName(sharedFolder);
66
+ const row = { shared_folder_uid, name };
67
+ if (includeDetails) {
68
+ row.record_count = countRecordsForFolder(storage, shared_folder_uid);
69
+ row.user_count = countUsersForFolder(storage, shared_folder_uid);
70
+ row.team_count = countTeamsForFolder(storage, shared_folder_uid);
71
+ row.default_manage_records = sharedFolder.defaultManageRecords;
72
+ row.default_manage_users = sharedFolder.defaultManageUsers;
73
+ row.default_can_edit = sharedFolder.defaultCanEdit;
74
+ row.default_can_share = sharedFolder.defaultCanShare;
75
+ }
76
+ return row;
77
+ });
78
+ }
79
+ exports.listSharedFolders = listSharedFolders;
80
+ function truncateText(text, maxLength) {
81
+ if (!text)
82
+ return '';
83
+ if (text.length <= maxLength)
84
+ return text;
85
+ if (maxLength <= MIN_TRUNCATE_PREFIX)
86
+ return text.slice(0, maxLength);
87
+ return `${text.slice(0, maxLength - MIN_TRUNCATE_PREFIX)}...`;
88
+ }
89
+ function formatSharedFoldersTable(rows, options = {}) {
90
+ const { verbose = false, columnWidth = DEFAULT_COLUMN_WIDTH } = options;
91
+ const maxWidth = verbose ? null : columnWidth;
92
+ const headers = ['#', 'Shared Folder UID', 'Name'];
93
+ const outRows = rows.map((row, rowIndex) => {
94
+ const uid = maxWidth == null ? row.shared_folder_uid : truncateText(row.shared_folder_uid, maxWidth);
95
+ const name = maxWidth == null ? row.name : truncateText(row.name, maxWidth);
96
+ return [String(rowIndex + 1), uid, name];
97
+ });
98
+ return { headers, rows: outRows };
99
+ }
100
+ exports.formatSharedFoldersTable = formatSharedFoldersTable;
101
+ function renderSharedFoldersAsciiTable(table, options = {}) {
102
+ const { minColWidth = 2 } = options;
103
+ const { headers, rows } = table;
104
+ const columnCount = headers.length;
105
+ const columnWidths = new Array(columnCount).fill(0);
106
+ for (let columnIndex = 0; columnIndex < columnCount; columnIndex += 1) {
107
+ columnWidths[columnIndex] = Math.max(headers[columnIndex].length, minColWidth);
108
+ }
109
+ for (const row of rows) {
110
+ for (let columnIndex = 0; columnIndex < columnCount; columnIndex += 1) {
111
+ const cell = row[columnIndex] || '';
112
+ columnWidths[columnIndex] = Math.max(columnWidths[columnIndex], cell.length, minColWidth);
113
+ }
114
+ }
115
+ const padCell = (cell, columnIndex) => cell + ' '.repeat(columnWidths[columnIndex] - cell.length);
116
+ const formatRow = (cells) => cells.map((cell, columnIndex) => padCell(cell, columnIndex)).join(' ');
117
+ const ruleRow = Array.from({ length: columnCount }, (_unused, columnIndex) => '-'.repeat(columnWidths[columnIndex]))
118
+ .map((dashes, columnIndex) => padCell(dashes, columnIndex))
119
+ .join(' ');
120
+ const lines = [formatRow(headers), ruleRow];
121
+ for (const row of rows) {
122
+ lines.push(formatRow(row));
123
+ }
124
+ return lines.join('\n');
125
+ }
126
+ exports.renderSharedFoldersAsciiTable = renderSharedFoldersAsciiTable;
127
+ //# sourceMappingURL=listSharedFolders.js.map