@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,293 @@
|
|
|
1
|
+
import type { Auth, DeleteObject, KeeperPreDeleteResponse } from '@keeper-security/keeperapi'
|
|
2
|
+
import { preDeleteCommand, recordDeleteCommand } from '@keeper-security/keeperapi'
|
|
3
|
+
import type { DSharedFolder, DSharedFolderFolder, DUserFolder } from '@keeper-security/keeperapi'
|
|
4
|
+
import { InMemoryStorage } from '../storage/InMemoryStorage'
|
|
5
|
+
import { KeeperSdkError, extractErrorMessage, logger } from '../utils'
|
|
6
|
+
import { listFolder } from './listFolder'
|
|
7
|
+
import type { ListFolderFolderSimple } from './listFolder'
|
|
8
|
+
import { tryResolvePath, findParentFolderUid, type VaultFolderSession } from './changeDirectory'
|
|
9
|
+
import {
|
|
10
|
+
DeleteResolution,
|
|
11
|
+
FolderKind,
|
|
12
|
+
globToRegex,
|
|
13
|
+
sharedFolderFolderName,
|
|
14
|
+
sharedFolderName,
|
|
15
|
+
userFolderName,
|
|
16
|
+
} from './folderHelpers'
|
|
17
|
+
import { findFolder } from './getFolder'
|
|
18
|
+
|
|
19
|
+
export type DeleteFolderResult = {
|
|
20
|
+
success: boolean
|
|
21
|
+
message?: string
|
|
22
|
+
cancelled?: boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type RmdirOptions = {
|
|
26
|
+
force?: boolean
|
|
27
|
+
quiet?: boolean
|
|
28
|
+
confirm?: (summary: string) => boolean | Promise<boolean>
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function folderKindOfUid(storage: InMemoryStorage, uid: string): FolderKind {
|
|
32
|
+
if (storage.getByUid<DUserFolder>(FolderKind.UserFolder, uid)) return FolderKind.UserFolder
|
|
33
|
+
if (storage.getByUid<DSharedFolder>(FolderKind.SharedFolder, uid)) return FolderKind.SharedFolder
|
|
34
|
+
if (storage.getByUid<DSharedFolderFolder>(FolderKind.SharedFolderFolder, uid)) return FolderKind.SharedFolderFolder
|
|
35
|
+
return FolderKind.UserFolder
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function listFolderChildrenFolders(
|
|
39
|
+
storage: InMemoryStorage,
|
|
40
|
+
parentUid: string | null
|
|
41
|
+
): Promise<ListFolderFolderSimple[]> {
|
|
42
|
+
const result = await listFolder(storage, {
|
|
43
|
+
folderUid: parentUid === null ? undefined : parentUid,
|
|
44
|
+
showFolders: true,
|
|
45
|
+
showRecords: false,
|
|
46
|
+
})
|
|
47
|
+
return result.folders
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function folderDisplayName(storage: InMemoryStorage, uid: string): string {
|
|
51
|
+
const userFolder = storage.getByUid<DUserFolder>(FolderKind.UserFolder, uid)
|
|
52
|
+
if (userFolder) return userFolderName(userFolder)
|
|
53
|
+
const sharedFolder = storage.getByUid<DSharedFolder>(FolderKind.SharedFolder, uid)
|
|
54
|
+
if (sharedFolder) return sharedFolderName(sharedFolder)
|
|
55
|
+
const sharedFolderFolder = storage.getByUid<DSharedFolderFolder>(FolderKind.SharedFolderFolder, uid)
|
|
56
|
+
if (sharedFolderFolder) return sharedFolderFolderName(sharedFolderFolder)
|
|
57
|
+
return uid
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function buildFolderDeleteObject(
|
|
61
|
+
storage: InMemoryStorage,
|
|
62
|
+
folderUid: string
|
|
63
|
+
): Promise<DeleteObject | null> {
|
|
64
|
+
const userFolder = storage.getByUid<DUserFolder>(FolderKind.UserFolder, folderUid)
|
|
65
|
+
if (userFolder) {
|
|
66
|
+
const parentUid = await findParentFolderUid(storage, folderUid)
|
|
67
|
+
const deleteObject: DeleteObject = {
|
|
68
|
+
delete_resolution: DeleteResolution.Unlink,
|
|
69
|
+
object_uid: folderUid,
|
|
70
|
+
object_type: FolderKind.UserFolder,
|
|
71
|
+
from_type: FolderKind.UserFolder,
|
|
72
|
+
}
|
|
73
|
+
if (parentUid) {
|
|
74
|
+
deleteObject.from_uid = parentUid
|
|
75
|
+
deleteObject.from_type = folderKindOfUid(storage, parentUid)
|
|
76
|
+
} else {
|
|
77
|
+
deleteObject.from_uid = ''
|
|
78
|
+
}
|
|
79
|
+
return deleteObject
|
|
80
|
+
}
|
|
81
|
+
const sharedFolder = storage.getByUid<DSharedFolder>(FolderKind.SharedFolder, folderUid)
|
|
82
|
+
if (sharedFolder) {
|
|
83
|
+
const parentUid = await findParentFolderUid(storage, folderUid)
|
|
84
|
+
const deleteObject: DeleteObject = {
|
|
85
|
+
delete_resolution: DeleteResolution.Unlink,
|
|
86
|
+
object_uid: folderUid,
|
|
87
|
+
object_type: FolderKind.SharedFolder,
|
|
88
|
+
from_type: FolderKind.UserFolder,
|
|
89
|
+
}
|
|
90
|
+
if (parentUid) {
|
|
91
|
+
deleteObject.from_uid = parentUid
|
|
92
|
+
deleteObject.from_type = folderKindOfUid(storage, parentUid)
|
|
93
|
+
} else {
|
|
94
|
+
deleteObject.from_uid = ''
|
|
95
|
+
}
|
|
96
|
+
return deleteObject
|
|
97
|
+
}
|
|
98
|
+
const sharedFolderFolder = storage.getByUid<DSharedFolderFolder>(FolderKind.SharedFolderFolder, folderUid)
|
|
99
|
+
if (sharedFolderFolder) {
|
|
100
|
+
const parentUid = await findParentFolderUid(storage, folderUid)
|
|
101
|
+
const deleteObject: DeleteObject = {
|
|
102
|
+
delete_resolution: DeleteResolution.Unlink,
|
|
103
|
+
object_uid: folderUid,
|
|
104
|
+
object_type: FolderKind.SharedFolderFolder,
|
|
105
|
+
from_type: FolderKind.SharedFolder,
|
|
106
|
+
}
|
|
107
|
+
if (parentUid) {
|
|
108
|
+
deleteObject.from_uid = parentUid
|
|
109
|
+
deleteObject.from_type = folderKindOfUid(storage, parentUid)
|
|
110
|
+
} else {
|
|
111
|
+
deleteObject.from_uid = sharedFolderFolder.sharedFolderUid
|
|
112
|
+
deleteObject.from_type = FolderKind.SharedFolder
|
|
113
|
+
}
|
|
114
|
+
return deleteObject
|
|
115
|
+
}
|
|
116
|
+
return null
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function buildDeleteObjectForFolderRef(
|
|
120
|
+
storage: InMemoryStorage,
|
|
121
|
+
ref: string
|
|
122
|
+
): Promise<DeleteObject | null> {
|
|
123
|
+
const trimmed = ref.trim()
|
|
124
|
+
if (!trimmed) return null
|
|
125
|
+
|
|
126
|
+
const direct = await buildFolderDeleteObject(storage, trimmed)
|
|
127
|
+
if (direct) return direct
|
|
128
|
+
|
|
129
|
+
const found = findFolder(storage, trimmed)
|
|
130
|
+
if (!found) return null
|
|
131
|
+
return buildFolderDeleteObject(storage, found.folder.uid)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export async function deleteFolder(
|
|
135
|
+
auth: Auth,
|
|
136
|
+
storage: InMemoryStorage,
|
|
137
|
+
folderRefs: string[],
|
|
138
|
+
confirm?: (summary: string) => boolean | Promise<boolean>
|
|
139
|
+
): Promise<DeleteFolderResult> {
|
|
140
|
+
const objects: DeleteObject[] = []
|
|
141
|
+
for (const ref of folderRefs) {
|
|
142
|
+
const deleteObject = await buildDeleteObjectForFolderRef(storage, ref)
|
|
143
|
+
if (deleteObject) objects.push(deleteObject)
|
|
144
|
+
}
|
|
145
|
+
if (objects.length === 0) {
|
|
146
|
+
throw new KeeperSdkError(
|
|
147
|
+
'No folders found to delete (not a folder UID or name).',
|
|
148
|
+
'delete_nothing'
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const targetUids = objects.map((deleteObject) => deleteObject.object_uid).join(', ')
|
|
153
|
+
|
|
154
|
+
let preResp: KeeperPreDeleteResponse
|
|
155
|
+
try {
|
|
156
|
+
preResp = await auth.executeRestCommand(preDeleteCommand({ objects }))
|
|
157
|
+
} catch (err) {
|
|
158
|
+
return {
|
|
159
|
+
success: false,
|
|
160
|
+
message: `pre_delete failed for [${targetUids}]: ${extractErrorMessage(err)}`,
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const inner = preResp.pre_delete_response
|
|
165
|
+
const token = inner?.pre_delete_token
|
|
166
|
+
if (!token) {
|
|
167
|
+
const reason =
|
|
168
|
+
preResp.message ||
|
|
169
|
+
preResp.result_code ||
|
|
170
|
+
`pre_delete failed for [${targetUids}]: server did not return a pre_delete_token`
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
message: reason,
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (confirm) {
|
|
178
|
+
const wouldDelete = inner?.would_delete
|
|
179
|
+
const summaryItems = wouldDelete?.deletion_summary
|
|
180
|
+
if (Array.isArray(summaryItems) && summaryItems.length > 0) {
|
|
181
|
+
const summary = summaryItems.join('\n')
|
|
182
|
+
const confirmed = await confirm(summary)
|
|
183
|
+
if (!confirmed) {
|
|
184
|
+
return { success: false, cancelled: true, message: 'Cancelled.' }
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
try {
|
|
190
|
+
await auth.executeRestCommand(recordDeleteCommand({ pre_delete_token: token }))
|
|
191
|
+
} catch (err) {
|
|
192
|
+
return {
|
|
193
|
+
success: false,
|
|
194
|
+
message: `record_delete failed for [${targetUids}]: ${extractErrorMessage(err)}`,
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return { success: true }
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export async function resolveRmdirPatternsToFolderUids(
|
|
202
|
+
storage: InMemoryStorage,
|
|
203
|
+
session: VaultFolderSession,
|
|
204
|
+
pattern: string
|
|
205
|
+
): Promise<Set<string>> {
|
|
206
|
+
const matchedUids = new Set<string>()
|
|
207
|
+
const trimmedPattern = pattern.trim()
|
|
208
|
+
if (!trimmedPattern) return matchedUids
|
|
209
|
+
|
|
210
|
+
const { folderUid: baseUid, remaining } = await tryResolvePath(storage, session, trimmedPattern)
|
|
211
|
+
const remainingPattern = remaining.trim()
|
|
212
|
+
|
|
213
|
+
if (!remainingPattern) {
|
|
214
|
+
if (baseUid !== null) {
|
|
215
|
+
matchedUids.add(baseUid)
|
|
216
|
+
}
|
|
217
|
+
return matchedUids
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const children = await listFolderChildrenFolders(storage, baseUid)
|
|
221
|
+
const exactChild = children.find((child) => child.uid === remainingPattern)
|
|
222
|
+
if (exactChild) {
|
|
223
|
+
matchedUids.add(exactChild.uid)
|
|
224
|
+
return matchedUids
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const matcher = globToRegex(remainingPattern)
|
|
228
|
+
for (const child of children) {
|
|
229
|
+
if (matcher.test(child.name.trim())) {
|
|
230
|
+
matchedUids.add(child.uid)
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return matchedUids
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async function dedupeNestedFolderDeletes(storage: InMemoryStorage, folderUids: Set<string>): Promise<void> {
|
|
237
|
+
for (const folderUid of [...folderUids]) {
|
|
238
|
+
let current = folderUid
|
|
239
|
+
while (true) {
|
|
240
|
+
const parentUid = await findParentFolderUid(storage, current)
|
|
241
|
+
if (!parentUid) break
|
|
242
|
+
if (folderUids.has(parentUid)) {
|
|
243
|
+
folderUids.delete(folderUid)
|
|
244
|
+
break
|
|
245
|
+
}
|
|
246
|
+
current = parentUid
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export async function rmdir(
|
|
252
|
+
auth: Auth,
|
|
253
|
+
storage: InMemoryStorage,
|
|
254
|
+
session: VaultFolderSession,
|
|
255
|
+
patterns: string[],
|
|
256
|
+
options: RmdirOptions = {}
|
|
257
|
+
): Promise<DeleteFolderResult> {
|
|
258
|
+
const { force = false, quiet = false, confirm } = options
|
|
259
|
+
if (!force && !confirm) {
|
|
260
|
+
throw new KeeperSdkError(
|
|
261
|
+
'Confirmation is required: pass `confirm` or set `force: true`.',
|
|
262
|
+
'rmdir_confirm_required'
|
|
263
|
+
)
|
|
264
|
+
}
|
|
265
|
+
const folderUids = new Set<string>()
|
|
266
|
+
|
|
267
|
+
for (const pattern of patterns) {
|
|
268
|
+
const trimmedPattern = pattern.trim()
|
|
269
|
+
if (!trimmedPattern) continue
|
|
270
|
+
const resolved = await resolveRmdirPatternsToFolderUids(storage, session, trimmedPattern)
|
|
271
|
+
for (const matchedUid of resolved) {
|
|
272
|
+
folderUids.add(matchedUid)
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (folderUids.size === 0) {
|
|
277
|
+
throw new KeeperSdkError('Enter name of an existing folder.', 'rmdir_no_match')
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
await dedupeNestedFolderDeletes(storage, folderUids)
|
|
281
|
+
|
|
282
|
+
const sortedNames = [...folderUids]
|
|
283
|
+
.map((uid) => folderDisplayName(storage, uid))
|
|
284
|
+
.sort((nameA, nameB) => nameA.localeCompare(nameB, undefined, { sensitivity: 'base' }))
|
|
285
|
+
|
|
286
|
+
if (!quiet || !force) {
|
|
287
|
+
logger.info(`\nThe following folder(s) will be removed:\n${sortedNames.join(', ')}\n`)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const confirmFn = force ? undefined : confirm
|
|
291
|
+
|
|
292
|
+
return deleteFolder(auth, storage, [...folderUids], confirmFn)
|
|
293
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { DSharedFolder, DSharedFolderFolder, DUserFolder } from '@keeper-security/keeperapi'
|
|
2
|
+
import type { InMemoryStorage } from '../storage/InMemoryStorage'
|
|
3
|
+
import { escapeRegExp } from '../utils'
|
|
4
|
+
|
|
5
|
+
export enum FolderKind {
|
|
6
|
+
UserFolder = 'user_folder',
|
|
7
|
+
SharedFolder = 'shared_folder',
|
|
8
|
+
SharedFolderFolder = 'shared_folder_folder',
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export enum ParentFolderKind {
|
|
12
|
+
VirtualRoot = 'virtual_root',
|
|
13
|
+
UserFolder = 'user_folder',
|
|
14
|
+
SharedFolder = 'shared_folder',
|
|
15
|
+
SharedFolderFolder = 'shared_folder_folder',
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export enum FolderObjectType {
|
|
19
|
+
Folder = 'folder',
|
|
20
|
+
SharedFolder = 'shared_folder',
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export enum DeleteResolution {
|
|
24
|
+
Unlink = 'unlink',
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export enum DeleteObjectType {
|
|
28
|
+
Record = 'record',
|
|
29
|
+
UserFolder = 'user_folder',
|
|
30
|
+
SharedFolder = 'shared_folder',
|
|
31
|
+
SharedFolderFolder = 'shared_folder_folder',
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export enum FolderResultStatus {
|
|
35
|
+
Success = 'success',
|
|
36
|
+
Invited = 'invited',
|
|
37
|
+
Unknown = 'unknown',
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export enum VaultObjectKind {
|
|
41
|
+
Record = 'record',
|
|
42
|
+
Metadata = 'metadata',
|
|
43
|
+
NonSharedData = 'non_shared_data',
|
|
44
|
+
Team = 'team',
|
|
45
|
+
User = 'user',
|
|
46
|
+
SharedFolderUser = 'shared_folder_user',
|
|
47
|
+
SharedFolderTeam = 'shared_folder_team',
|
|
48
|
+
SharedFolderRecord = 'shared_folder_record',
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type FolderKindOrLiteral = FolderKind | `${FolderKind}`
|
|
52
|
+
|
|
53
|
+
export function folderKindFromString(value: string | undefined | null): FolderKind | undefined {
|
|
54
|
+
if (!value) return undefined
|
|
55
|
+
switch (value) {
|
|
56
|
+
case FolderKind.UserFolder:
|
|
57
|
+
return FolderKind.UserFolder
|
|
58
|
+
case FolderKind.SharedFolder:
|
|
59
|
+
return FolderKind.SharedFolder
|
|
60
|
+
case FolderKind.SharedFolderFolder:
|
|
61
|
+
return FolderKind.SharedFolderFolder
|
|
62
|
+
default:
|
|
63
|
+
return undefined
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function userFolderName(folder: DUserFolder): string {
|
|
68
|
+
const data = folder.data as { title?: string; name?: string } | undefined
|
|
69
|
+
return (data?.title || data?.name || folder.uid).trim() || folder.uid
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function sharedFolderFolderName(folder: DSharedFolderFolder): string {
|
|
73
|
+
const data = folder.data as { title?: string; name?: string } | undefined
|
|
74
|
+
return (data?.title || data?.name || folder.uid).trim() || folder.uid
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function sharedFolderName(folder: DSharedFolder): string {
|
|
78
|
+
return (folder.name || folder.uid).trim() || folder.uid
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function globToRegex(pattern: string): RegExp {
|
|
82
|
+
const escapedPattern = escapeRegExp(pattern)
|
|
83
|
+
const regexBody = escapedPattern.replace(/\*/g, '.*').replace(/\?/g, '.')
|
|
84
|
+
return new RegExp(`^${regexBody}$`, 'i')
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export async function getUserFolderParentMap(storage: InMemoryStorage): Promise<Map<string, string>> {
|
|
88
|
+
const userFolders = storage.getAll<DUserFolder>(FolderKind.UserFolder)
|
|
89
|
+
const childToParent = new Map<string, string>()
|
|
90
|
+
for (const userFolder of userFolders) {
|
|
91
|
+
const dependencies = (await storage.getDependencies(userFolder.uid)) || []
|
|
92
|
+
for (const dependency of dependencies) {
|
|
93
|
+
if (dependency.kind === FolderKind.UserFolder) {
|
|
94
|
+
childToParent.set(dependency.uid, userFolder.uid)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return childToParent
|
|
99
|
+
}
|