Skip to content

Commit 84d4dbb

Browse files
Th more sync data (#91)
* fixed issue with sharing removals with usernames * fixed issues with share info for direct shares * upgraded version * added recommended fix around removeDependencies * adding tyler as a code owner
1 parent e220a90 commit 84d4dbb

4 files changed

Lines changed: 42 additions & 53 deletions

File tree

.github/CODEOWNERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
# the repo. Unless a later match takes precedence, these
66
# users will be requested for review when someone opens
77
# a pull request.
8-
* @saldoukhov @THeflinKeeper
8+
* @saldoukhov @THeflinKeeper @tylerccarson

keeperapi/package-lock.json

Lines changed: 11 additions & 40 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

keeperapi/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@keeper-security/keeperapi",
33
"description": "Keeper API Javascript SDK",
4-
"version": "16.0.88",
4+
"version": "16.0.89",
55
"browser": "dist/index.es.js",
66
"main": "dist/index.cjs.js",
77
"types": "dist/node/index.d.ts",

keeperapi/src/vault.ts

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ export type DRecordMetadata = {
8787
canShare: boolean
8888
canEdit: boolean
8989
recordKeyType: Records.RecordKeyType
90+
ownerAccountUid?: string
91+
ownerUsername?: string
9092
}
9193

9294
export type DTeam = {
@@ -109,6 +111,8 @@ export type DSharedFolder = {
109111
uid: string
110112
data: any
111113
name?: string
114+
ownerAccountUid?: string
115+
ownerUsername?: string
112116
revision: number
113117
defaultCanEdit: boolean
114118
defaultCanShare: boolean
@@ -119,7 +123,8 @@ export type DSharedFolder = {
119123
export type DSharedFolderUser = {
120124
kind: 'shared_folder_user'
121125
sharedFolderUid: string
122-
accountUid: string
126+
accountUid?: string
127+
accountUsername?: string
123128
manageRecords: boolean
124129
manageUsers: boolean
125130
}
@@ -137,10 +142,12 @@ export type DSharedFolderRecord = {
137142
kind: 'shared_folder_record'
138143
sharedFolderUid: string
139144
recordUid: string
145+
// ownerAccountUid?: Uint8Array
140146
ownerUid: string
141147
owner: boolean
142148
canShare: boolean
143149
canEdit: boolean
150+
ownerUsername?: string
144151
}
145152

146153
export type DSharedFolderFolder = {
@@ -216,8 +223,10 @@ export type DContinuationToken = {
216223

217224
export type Dependency = {
218225
kind: VaultStorageKind
226+
parentUid: string
219227
uid: string
220228
}
229+
export type DependencyMap = Record<string, Dependency>
221230
export type Dependencies = Record<string, Set<Dependency>>
222231
export type RemovedDependencies = Record<string, Set<string> | '*'>
223232

@@ -229,7 +238,8 @@ const addDependencies = (dependencies: Dependencies, parentUid: string, childUid
229238
}
230239
children.add({
231240
kind: kind,
232-
uid: childUid
241+
uid: childUid,
242+
parentUid: parentUid
233243
})
234244
}
235245

@@ -245,15 +255,15 @@ const addRemovedDependencies = (dependencies: RemovedDependencies, parentUid: st
245255
children.add(childUid)
246256
}
247257

248-
const getDependencies = async (folderUid: string, storage: VaultStorage, results: Dependency[]) => {
258+
const getDependencies = async (folderUid: string, storage: VaultStorage, results: DependencyMap) => {
249259
const storageGetDependencies = await storage.getDependencies(folderUid)
250260
for await (const dependency of storageGetDependencies || []) {
251261
switch (dependency.kind) {
252262
case "record":
253-
results.push(dependency)
263+
results[dependency.parentUid] = dependency
254264
break;
255265
case "user_folder":
256-
results.push(dependency)
266+
results[dependency.parentUid] = dependency
257267
await getDependencies(dependency.uid, storage, results)
258268
break;
259269
default:
@@ -508,6 +518,7 @@ const processSharedFolders = async (folders: ISharedFolder[], storage: VaultStor
508518
if (!folderName && !folderData) {
509519
continue
510520
}
521+
const ownerUid = folder.ownerAccountUid ? webSafe64FromBytes(folder.ownerAccountUid) : undefined
511522
await storage.put({
512523
kind: 'shared_folder',
513524
uid: folderUid,
@@ -518,6 +529,8 @@ const processSharedFolders = async (folders: ISharedFolder[], storage: VaultStor
518529
defaultCanShare: folder.defaultCanReshare,
519530
defaultManageUsers: folder.defaultManageUsers,
520531
defaultManageRecords: folder.defaultManageRecords,
532+
ownerAccountUid: ownerUid,
533+
ownerUsername: folder.owner,
521534
})
522535
}
523536
}
@@ -528,6 +541,7 @@ const processSharedFolderUsers = async (users: ISharedFolderUser[], storage: Vau
528541
kind: 'shared_folder_user',
529542
sharedFolderUid: webSafe64FromBytes(user.sharedFolderUid),
530543
accountUid: webSafe64FromBytes(user.accountUid),
544+
accountUsername: user.username,
531545
manageRecords: user.manageRecords,
532546
manageUsers: user.manageUsers,
533547
})
@@ -581,6 +595,7 @@ const processSharedFolderRecords = async (records: ISharedFolderRecord[], storag
581595
ownerUid,
582596
canEdit: rec.owner ? true : rec.canEdit,
583597
canShare: rec.owner ? true : rec.canShare,
598+
ownerUsername: rec.ownerUsername,
584599
})
585600
} catch (e: any) {
586601
console.error(`The shared folder record ${recUid} cannot be decrypted (${e.message})`)
@@ -853,13 +868,16 @@ const processMetadata = async (recordMetaData: IRecordMetaData[], storage: Vault
853868
}
854869
}
855870

871+
const ownerUid = mData.ownerAccountUid ? webSafe64FromBytes(mData.ownerAccountUid) : undefined
856872
await storage.put({
857873
kind: 'metadata',
858874
uid: recUid,
859875
canEdit: mData.canEdit,
860876
canShare: mData.canShare,
861877
owner: mData.owner,
862-
recordKeyType: mData.recordKeyType
878+
recordKeyType: mData.recordKeyType,
879+
ownerAccountUid: ownerUid,
880+
ownerUsername: mData.ownerUsername,
863881
})
864882
} catch (e: any) {
865883
console.error(`The record metadata ${recUid} cannot be decrypted (${e.message})`)
@@ -1141,19 +1159,19 @@ export const syncDown = async (options: SyncDownOptions): Promise<SyncResult> =>
11411159
await processRemovedSharedFolderRecords(resp.removedSharedFolderRecords, storage, removedDependencies)
11421160
await processRemovedSharedFolderFolderRecords(resp.removedSharedFolderFolderRecords, storage, removedDependencies)
11431161

1144-
const removedSFDependencies: Dependency[] = []
1162+
const removedSFDependencies: DependencyMap = {}
11451163
for await (const folder of resp.removedSharedFolders) {
11461164
const folderUid = webSafe64FromBytes(folder)
11471165
await getDependencies(folderUid, storage, removedSFDependencies)
1148-
if(!removedDependencies[folderUid]){
1166+
if(!removedDependencies[folderUid] && !removedSFDependencies[folderUid]){
11491167
removedDependencies[folderUid] = '*'
11501168
}
11511169
await storage.delete('shared_folder', folderUid)
11521170
}
1153-
for await (const removedSFDependency of removedSFDependencies) {
1171+
for await (const removedSFDependency of Object.values(removedSFDependencies)) {
11541172
switch (removedSFDependency.kind) {
1155-
case "record":
1156-
await storage.delete('record', removedSFDependency.uid)
1173+
case "record":
1174+
addRemovedDependencies(removedDependencies, removedSFDependency.parentUid, removedSFDependency.uid)
11571175
break;
11581176
case "user_folder":
11591177
removedDependencies[removedSFDependency.uid] = '*'

0 commit comments

Comments
 (0)