@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,453 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decryptFromStorage,
|
|
3
|
+
decryptObjectFromStorage,
|
|
4
|
+
Enterprise,
|
|
5
|
+
getEnterpriseDataForUserMessage,
|
|
6
|
+
normal64Bytes,
|
|
7
|
+
platform,
|
|
8
|
+
webSafe64FromBytes,
|
|
9
|
+
type Auth,
|
|
10
|
+
type RestCommand,
|
|
11
|
+
} from '@keeper-security/keeperapi'
|
|
12
|
+
import { isNumber } from '../utils'
|
|
13
|
+
|
|
14
|
+
const DEFAULT_NODE_PATH_SEPARATOR = '\\'
|
|
15
|
+
const MAX_CONTINUATIONS = 50
|
|
16
|
+
const LEGACY_ENTERPRISE_DATA_COMMAND = 'get_enterprise_data'
|
|
17
|
+
|
|
18
|
+
export enum EnterpriseDataInclude {
|
|
19
|
+
Nodes = 'nodes',
|
|
20
|
+
Users = 'users',
|
|
21
|
+
Roles = 'roles',
|
|
22
|
+
RoleUsers = 'role_users',
|
|
23
|
+
RoleTeams = 'role_teams',
|
|
24
|
+
Teams = 'teams',
|
|
25
|
+
TeamUsers = 'team_users',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
enum LegacyEnterpriseKeyType {
|
|
29
|
+
EncryptedByDataKey = 1,
|
|
30
|
+
EncryptedByPublicKey = 2,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const INCLUDE_TO_ENTITY: Record<EnterpriseDataInclude, Enterprise.EnterpriseDataEntity> = {
|
|
34
|
+
[EnterpriseDataInclude.Nodes]: Enterprise.EnterpriseDataEntity.NODES,
|
|
35
|
+
[EnterpriseDataInclude.Users]: Enterprise.EnterpriseDataEntity.USERS,
|
|
36
|
+
[EnterpriseDataInclude.Roles]: Enterprise.EnterpriseDataEntity.ROLES,
|
|
37
|
+
[EnterpriseDataInclude.RoleUsers]: Enterprise.EnterpriseDataEntity.ROLE_USERS,
|
|
38
|
+
[EnterpriseDataInclude.RoleTeams]: Enterprise.EnterpriseDataEntity.ROLE_TEAMS,
|
|
39
|
+
[EnterpriseDataInclude.Teams]: Enterprise.EnterpriseDataEntity.TEAMS,
|
|
40
|
+
[EnterpriseDataInclude.TeamUsers]: Enterprise.EnterpriseDataEntity.TEAM_USERS,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type EnterpriseNode = {
|
|
44
|
+
node_id: number
|
|
45
|
+
parent_id?: number
|
|
46
|
+
encrypted_data?: string
|
|
47
|
+
displayName?: string
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type EnterpriseUser = {
|
|
51
|
+
enterprise_user_id: number
|
|
52
|
+
username: string
|
|
53
|
+
status?: string
|
|
54
|
+
node_id?: number
|
|
55
|
+
encrypted_data?: string
|
|
56
|
+
full_name?: string
|
|
57
|
+
job_title?: string
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type EnterpriseRole = {
|
|
61
|
+
role_id: number
|
|
62
|
+
node_id?: number
|
|
63
|
+
encrypted_data?: string
|
|
64
|
+
displayName?: string
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export type EnterpriseTeamRecord = {
|
|
68
|
+
team_uid: string
|
|
69
|
+
name: string
|
|
70
|
+
node_id: number
|
|
71
|
+
restrict_view?: boolean
|
|
72
|
+
restrict_edit?: boolean
|
|
73
|
+
restrict_share?: boolean
|
|
74
|
+
restrict_sharing?: boolean
|
|
75
|
+
encrypted_data?: string
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export type EnterpriseTeamUserLink = {
|
|
79
|
+
team_uid: string
|
|
80
|
+
enterprise_user_id: number
|
|
81
|
+
user_type?: string
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type EnterpriseRoleUserLink = {
|
|
85
|
+
role_id: number
|
|
86
|
+
enterprise_user_id: number
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export type EnterpriseRoleTeamLink = {
|
|
90
|
+
role_id: number
|
|
91
|
+
team_uid: string
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type GetEnterpriseDataResponse = {
|
|
95
|
+
enterprise_name?: string
|
|
96
|
+
nodes?: EnterpriseNode[]
|
|
97
|
+
users?: EnterpriseUser[]
|
|
98
|
+
roles?: EnterpriseRole[]
|
|
99
|
+
teams?: EnterpriseTeamRecord[]
|
|
100
|
+
team_users?: EnterpriseTeamUserLink[]
|
|
101
|
+
role_users?: EnterpriseRoleUserLink[]
|
|
102
|
+
role_teams?: EnterpriseRoleTeamLink[]
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export type NodePathOptions = {
|
|
106
|
+
omitRoot?: boolean
|
|
107
|
+
separator?: string
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type DecryptedNodeNames = Map<number, string>
|
|
111
|
+
export type DecryptedRoleNames = Map<number, string>
|
|
112
|
+
export type EnterpriseDisplayNames = {
|
|
113
|
+
nodes: DecryptedNodeNames
|
|
114
|
+
roles: DecryptedRoleNames
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
type LongLike = number | { toNumber: () => number; toString: () => string } | undefined | null
|
|
118
|
+
|
|
119
|
+
type LegacyEnterpriseDataNode = {
|
|
120
|
+
node_id: number
|
|
121
|
+
parent_id?: number
|
|
122
|
+
encrypted_data?: string
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
type LegacyEnterpriseDataRole = {
|
|
126
|
+
role_id: number
|
|
127
|
+
encrypted_data?: string
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
type LegacyEnterpriseDataResponse = {
|
|
131
|
+
tree_key?: string
|
|
132
|
+
key_type_id?: LegacyEnterpriseKeyType
|
|
133
|
+
nodes?: LegacyEnterpriseDataNode[]
|
|
134
|
+
roles?: LegacyEnterpriseDataRole[]
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export interface EnterpriseDataManagerApi {
|
|
138
|
+
getData(includes: EnterpriseDataInclude[]): Promise<GetEnterpriseDataResponse>
|
|
139
|
+
getDisplayNames(): Promise<EnterpriseDisplayNames>
|
|
140
|
+
clearCache(): void
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export class EnterpriseDataManager implements EnterpriseDataManagerApi {
|
|
144
|
+
private readonly auth: Auth
|
|
145
|
+
private displayNamesPromise: Promise<EnterpriseDisplayNames> | null = null
|
|
146
|
+
private readonly dataCache = new Map<string, Promise<GetEnterpriseDataResponse>>()
|
|
147
|
+
|
|
148
|
+
constructor(auth: Auth) {
|
|
149
|
+
this.auth = auth
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
public async getData(includes: EnterpriseDataInclude[]): Promise<GetEnterpriseDataResponse> {
|
|
153
|
+
const key = EnterpriseDataManager.cacheKeyForIncludes(includes)
|
|
154
|
+
let promise = this.dataCache.get(key)
|
|
155
|
+
if (!promise) {
|
|
156
|
+
promise = this.fetchEnterpriseData(includes)
|
|
157
|
+
this.dataCache.set(key, promise)
|
|
158
|
+
}
|
|
159
|
+
return promise
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public async getDisplayNames(): Promise<EnterpriseDisplayNames> {
|
|
163
|
+
if (!this.displayNamesPromise) {
|
|
164
|
+
this.displayNamesPromise = this.fetchDisplayNames()
|
|
165
|
+
}
|
|
166
|
+
return this.displayNamesPromise
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
public clearCache(): void {
|
|
170
|
+
this.dataCache.clear()
|
|
171
|
+
this.displayNamesPromise = null
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public static getNodePath(
|
|
175
|
+
nodes: EnterpriseNode[],
|
|
176
|
+
nodeId: number,
|
|
177
|
+
options: NodePathOptions = {}
|
|
178
|
+
): string {
|
|
179
|
+
const { omitRoot = true, separator = DEFAULT_NODE_PATH_SEPARATOR } = options
|
|
180
|
+
const byId = new Map<number, EnterpriseNode>()
|
|
181
|
+
for (const node of nodes) byId.set(node.node_id, node)
|
|
182
|
+
|
|
183
|
+
const visited = new Set<number>()
|
|
184
|
+
const segments: string[] = []
|
|
185
|
+
let currentId: number | undefined = nodeId
|
|
186
|
+
while (isNumber(currentId) && currentId > 0 && !visited.has(currentId)) {
|
|
187
|
+
visited.add(currentId)
|
|
188
|
+
const node = byId.get(currentId)
|
|
189
|
+
if (!node) break
|
|
190
|
+
const parentId = node.parent_id || 0
|
|
191
|
+
const isRoot = parentId === 0
|
|
192
|
+
if (!isRoot || !omitRoot) {
|
|
193
|
+
const segmentName = (node.displayName || '').trim()
|
|
194
|
+
if (segmentName) segments.push(segmentName)
|
|
195
|
+
}
|
|
196
|
+
currentId = parentId
|
|
197
|
+
}
|
|
198
|
+
segments.reverse()
|
|
199
|
+
return segments.join(separator)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private static cacheKeyForIncludes(includes: EnterpriseDataInclude[]): string {
|
|
203
|
+
return [...includes].sort().join(',')
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private async fetchEnterpriseData(
|
|
207
|
+
includes: EnterpriseDataInclude[]
|
|
208
|
+
): Promise<GetEnterpriseDataResponse> {
|
|
209
|
+
const interesting = new Set<Enterprise.EnterpriseDataEntity>(
|
|
210
|
+
includes.map((key) => INCLUDE_TO_ENTITY[key])
|
|
211
|
+
)
|
|
212
|
+
const aggregate: GetEnterpriseDataResponse = {}
|
|
213
|
+
let continuationToken: Uint8Array | undefined
|
|
214
|
+
|
|
215
|
+
for (let iteration = 0; iteration < MAX_CONTINUATIONS; iteration += 1) {
|
|
216
|
+
const request: Enterprise.IEnterpriseDataRequest = {}
|
|
217
|
+
if (continuationToken) request.continuationToken = continuationToken
|
|
218
|
+
|
|
219
|
+
const response = await this.auth.executeRest(getEnterpriseDataForUserMessage(request))
|
|
220
|
+
|
|
221
|
+
if (response.generalData?.enterpriseName) {
|
|
222
|
+
aggregate.enterprise_name = response.generalData.enterpriseName
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
for (const chunk of response.data || []) {
|
|
226
|
+
const entity = chunk.entity ?? Enterprise.EnterpriseDataEntity.UNKNOWN
|
|
227
|
+
if (!interesting.has(entity)) continue
|
|
228
|
+
EnterpriseDataManager.applyChunk(chunk, aggregate)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (!response.hasMore) break
|
|
232
|
+
if (!response.continuationToken || response.continuationToken.length === 0) break
|
|
233
|
+
continuationToken = response.continuationToken
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return aggregate
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
private async fetchDisplayNames(): Promise<EnterpriseDisplayNames> {
|
|
240
|
+
const empty: EnterpriseDisplayNames = { nodes: new Map(), roles: new Map() }
|
|
241
|
+
const response = await this.fetchLegacyEnterpriseData()
|
|
242
|
+
if (!response) return empty
|
|
243
|
+
|
|
244
|
+
const treeKey = await this.decryptTreeKey(response)
|
|
245
|
+
if (!treeKey) return empty
|
|
246
|
+
|
|
247
|
+
const nodes: DecryptedNodeNames = new Map()
|
|
248
|
+
for (const node of response.nodes || []) {
|
|
249
|
+
if (!isNumber(node.node_id)) continue
|
|
250
|
+
if (!node.encrypted_data) continue
|
|
251
|
+
const display = await EnterpriseDataManager.decryptDisplayName(node.encrypted_data, treeKey)
|
|
252
|
+
if (display) nodes.set(node.node_id, display)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const roles: DecryptedRoleNames = new Map()
|
|
256
|
+
for (const role of response.roles || []) {
|
|
257
|
+
if (!isNumber(role.role_id)) continue
|
|
258
|
+
if (!role.encrypted_data) continue
|
|
259
|
+
const display = await EnterpriseDataManager.decryptDisplayName(role.encrypted_data, treeKey)
|
|
260
|
+
if (display) roles.set(role.role_id, display)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return { nodes, roles }
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
private async fetchLegacyEnterpriseData(): Promise<LegacyEnterpriseDataResponse | null> {
|
|
267
|
+
const command: RestCommand<{ include: string[] }, LegacyEnterpriseDataResponse> = {
|
|
268
|
+
baseRequest: { command: LEGACY_ENTERPRISE_DATA_COMMAND },
|
|
269
|
+
request: { include: [EnterpriseDataInclude.Nodes, EnterpriseDataInclude.Roles] },
|
|
270
|
+
authorization: {},
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
const response = await this.auth.executeRestCommand(command)
|
|
275
|
+
if (response && (response.tree_key || response.nodes || response.roles)) return response
|
|
276
|
+
} catch {
|
|
277
|
+
}
|
|
278
|
+
return null
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
private async decryptTreeKey(response: LegacyEnterpriseDataResponse): Promise<Uint8Array | null> {
|
|
282
|
+
const treeKey = response.tree_key
|
|
283
|
+
if (!treeKey) return null
|
|
284
|
+
|
|
285
|
+
try {
|
|
286
|
+
if (response.key_type_id === LegacyEnterpriseKeyType.EncryptedByDataKey) {
|
|
287
|
+
const dataKey = (this.auth as unknown as { dataKey?: Uint8Array }).dataKey
|
|
288
|
+
if (!dataKey) return null
|
|
289
|
+
return await decryptFromStorage(treeKey, dataKey)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const privateKey = (this.auth as unknown as { privateKey?: Uint8Array }).privateKey
|
|
293
|
+
if (!privateKey) return null
|
|
294
|
+
return platform.privateDecrypt(normal64Bytes(treeKey), privateKey)
|
|
295
|
+
} catch {
|
|
296
|
+
return null
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
private static async decryptDisplayName(encrypted: string, treeKey: Uint8Array): Promise<string> {
|
|
301
|
+
try {
|
|
302
|
+
const decrypted = await decryptObjectFromStorage<{ displayname?: string }>(encrypted, treeKey)
|
|
303
|
+
return (decrypted?.displayname || '').trim()
|
|
304
|
+
} catch {
|
|
305
|
+
return ''
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
private static toNumber(value: LongLike): number {
|
|
310
|
+
if (value == null) return 0
|
|
311
|
+
if (isNumber(value)) return value
|
|
312
|
+
if (typeof value.toNumber === 'function') return value.toNumber()
|
|
313
|
+
const parsed = Number(value.toString())
|
|
314
|
+
return Number.isFinite(parsed) ? parsed : 0
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
private static toUid(bytes: Uint8Array | null | undefined): string {
|
|
318
|
+
return bytes && bytes.length > 0 ? webSafe64FromBytes(bytes) : ''
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
private static decodeChunk<T>(
|
|
322
|
+
chunkData: Uint8Array[] | null | undefined,
|
|
323
|
+
decoder: (bytes: Uint8Array) => T
|
|
324
|
+
): T[] {
|
|
325
|
+
if (!chunkData || chunkData.length === 0) return []
|
|
326
|
+
const results: T[] = []
|
|
327
|
+
for (const bytes of chunkData) {
|
|
328
|
+
try {
|
|
329
|
+
results.push(decoder(bytes))
|
|
330
|
+
} catch {
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return results
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
private static decodeNodeChunk(bytes: Uint8Array): EnterpriseNode {
|
|
337
|
+
const message = Enterprise.Node.decode(bytes)
|
|
338
|
+
const out: EnterpriseNode = { node_id: EnterpriseDataManager.toNumber(message.nodeId) }
|
|
339
|
+
if (message.parentId != null) out.parent_id = EnterpriseDataManager.toNumber(message.parentId)
|
|
340
|
+
if (message.encryptedData) out.encrypted_data = message.encryptedData
|
|
341
|
+
return out
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
private static decodeUserChunk(bytes: Uint8Array): EnterpriseUser {
|
|
345
|
+
const message = Enterprise.User.decode(bytes)
|
|
346
|
+
const out: EnterpriseUser = {
|
|
347
|
+
enterprise_user_id: EnterpriseDataManager.toNumber(message.enterpriseUserId),
|
|
348
|
+
username: message.username || '',
|
|
349
|
+
}
|
|
350
|
+
if (message.status) out.status = message.status
|
|
351
|
+
if (message.nodeId != null) out.node_id = EnterpriseDataManager.toNumber(message.nodeId)
|
|
352
|
+
if (message.encryptedData) out.encrypted_data = message.encryptedData
|
|
353
|
+
if (message.fullName) out.full_name = message.fullName
|
|
354
|
+
if (message.jobTitle) out.job_title = message.jobTitle
|
|
355
|
+
return out
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
private static decodeRoleChunk(bytes: Uint8Array): EnterpriseRole {
|
|
359
|
+
const message = Enterprise.Role.decode(bytes)
|
|
360
|
+
const out: EnterpriseRole = { role_id: EnterpriseDataManager.toNumber(message.roleId) }
|
|
361
|
+
if (message.nodeId != null) out.node_id = EnterpriseDataManager.toNumber(message.nodeId)
|
|
362
|
+
if (message.encryptedData) out.encrypted_data = message.encryptedData
|
|
363
|
+
return out
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
private static decodeTeamChunk(bytes: Uint8Array): EnterpriseTeamRecord {
|
|
367
|
+
const message = Enterprise.Team.decode(bytes)
|
|
368
|
+
const out: EnterpriseTeamRecord = {
|
|
369
|
+
team_uid: EnterpriseDataManager.toUid(message.teamUid),
|
|
370
|
+
name: message.name || '',
|
|
371
|
+
node_id: EnterpriseDataManager.toNumber(message.nodeId),
|
|
372
|
+
restrict_view: message.restrictView === true,
|
|
373
|
+
restrict_edit: message.restrictEdit === true,
|
|
374
|
+
restrict_share: message.restrictShare === true,
|
|
375
|
+
}
|
|
376
|
+
if (message.encryptedData) out.encrypted_data = message.encryptedData
|
|
377
|
+
return out
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
private static decodeTeamUserChunk(bytes: Uint8Array): EnterpriseTeamUserLink {
|
|
381
|
+
const message = Enterprise.TeamUser.decode(bytes)
|
|
382
|
+
const out: EnterpriseTeamUserLink = {
|
|
383
|
+
team_uid: EnterpriseDataManager.toUid(message.teamUid),
|
|
384
|
+
enterprise_user_id: EnterpriseDataManager.toNumber(message.enterpriseUserId),
|
|
385
|
+
}
|
|
386
|
+
if (message.userType) out.user_type = message.userType
|
|
387
|
+
return out
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
private static decodeRoleUserChunk(bytes: Uint8Array): EnterpriseRoleUserLink {
|
|
391
|
+
const message = Enterprise.RoleUser.decode(bytes)
|
|
392
|
+
return {
|
|
393
|
+
role_id: EnterpriseDataManager.toNumber(message.roleId),
|
|
394
|
+
enterprise_user_id: EnterpriseDataManager.toNumber(message.enterpriseUserId),
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
private static decodeRoleTeamChunk(bytes: Uint8Array): EnterpriseRoleTeamLink {
|
|
399
|
+
const message = Enterprise.RoleTeam.decode(bytes)
|
|
400
|
+
return {
|
|
401
|
+
role_id: EnterpriseDataManager.toNumber(message.roleId),
|
|
402
|
+
team_uid: EnterpriseDataManager.toUid(message.teamUid),
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
private static applyChunk(
|
|
407
|
+
chunk: Enterprise.IEnterpriseData,
|
|
408
|
+
target: GetEnterpriseDataResponse
|
|
409
|
+
): void {
|
|
410
|
+
const entity = chunk.entity ?? Enterprise.EnterpriseDataEntity.UNKNOWN
|
|
411
|
+
const data = chunk.data || []
|
|
412
|
+
|
|
413
|
+
switch (entity) {
|
|
414
|
+
case Enterprise.EnterpriseDataEntity.NODES:
|
|
415
|
+
target.nodes = (target.nodes || []).concat(
|
|
416
|
+
EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeNodeChunk)
|
|
417
|
+
)
|
|
418
|
+
break
|
|
419
|
+
case Enterprise.EnterpriseDataEntity.USERS:
|
|
420
|
+
target.users = (target.users || []).concat(
|
|
421
|
+
EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeUserChunk)
|
|
422
|
+
)
|
|
423
|
+
break
|
|
424
|
+
case Enterprise.EnterpriseDataEntity.ROLES:
|
|
425
|
+
target.roles = (target.roles || []).concat(
|
|
426
|
+
EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeRoleChunk)
|
|
427
|
+
)
|
|
428
|
+
break
|
|
429
|
+
case Enterprise.EnterpriseDataEntity.TEAMS:
|
|
430
|
+
target.teams = (target.teams || []).concat(
|
|
431
|
+
EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeTeamChunk)
|
|
432
|
+
)
|
|
433
|
+
break
|
|
434
|
+
case Enterprise.EnterpriseDataEntity.TEAM_USERS:
|
|
435
|
+
target.team_users = (target.team_users || []).concat(
|
|
436
|
+
EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeTeamUserChunk)
|
|
437
|
+
)
|
|
438
|
+
break
|
|
439
|
+
case Enterprise.EnterpriseDataEntity.ROLE_USERS:
|
|
440
|
+
target.role_users = (target.role_users || []).concat(
|
|
441
|
+
EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeRoleUserChunk)
|
|
442
|
+
)
|
|
443
|
+
break
|
|
444
|
+
case Enterprise.EnterpriseDataEntity.ROLE_TEAMS:
|
|
445
|
+
target.role_teams = (target.role_teams || []).concat(
|
|
446
|
+
EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeRoleTeamChunk)
|
|
447
|
+
)
|
|
448
|
+
break
|
|
449
|
+
default:
|
|
450
|
+
break
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|