Skip to content

Commit 708e477

Browse files
committed
Folder reshare logic update
1 parent d1ad1a4 commit 708e477

2 files changed

Lines changed: 72 additions & 2 deletions

File tree

KeeperSdk/src/nestedShareFolders/nsfHelpers.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {
1010
import {
1111
Folder,
1212
Records,
13+
getFolderAccessMessage,
1314
getRecordAccessMessage,
1415
getShareObjectsMessage,
1516
normal64Bytes,
@@ -1002,6 +1003,69 @@ export function findFolderAccessEntry(
10021003
)
10031004
}
10041005

1006+
function toFolderAccessEntry(folderUid: string, accessor: Folder.IFolderAccessData): DKdFolderAccess {
1007+
return {
1008+
kind: 'keeper_drive_folder_access',
1009+
accessUid: `${folderUid}:${webSafe64FromBytes(accessor.accessTypeUid!)}`,
1010+
folderUid,
1011+
accessTypeUid: webSafe64FromBytes(accessor.accessTypeUid!),
1012+
accessType: accessor.accessType!,
1013+
accessRoleType: accessor.accessRoleType!,
1014+
permission: accessor.permissions ?? {},
1015+
inherited: accessor.inherited ?? undefined,
1016+
hidden: accessor.hidden ?? undefined,
1017+
}
1018+
}
1019+
1020+
/** Live folder accessors — sync-down often only includes the current user's own access. */
1021+
export async function fetchLiveFolderAccessEntries(
1022+
auth: Auth,
1023+
folderUid: string
1024+
): Promise<DKdFolderAccess[]> {
1025+
try {
1026+
const response = await auth.executeRest(
1027+
getFolderAccessMessage({ folderUid: [normal64Bytes(folderUid)] })
1028+
)
1029+
const result = response.folderAccessResults?.find(
1030+
(entry) => entry.folderUid?.length && webSafe64FromBytes(entry.folderUid) === folderUid
1031+
)
1032+
return (result?.accessors ?? [])
1033+
.filter(
1034+
(accessor) =>
1035+
accessor.accessTypeUid?.length &&
1036+
accessor.accessType != null &&
1037+
accessor.accessRoleType != null
1038+
)
1039+
.map((accessor) => toFolderAccessEntry(folderUid, accessor))
1040+
} catch (err) {
1041+
throw new KeeperSdkError(
1042+
`Failed to fetch folder permissions for ${folderUid}: ${extractErrorMessage(err)}`,
1043+
ResultCodes.NSF_DETAILS_FAILED
1044+
)
1045+
}
1046+
}
1047+
1048+
export async function findFolderAccessEntryOrLive(
1049+
storage: InMemoryStorage,
1050+
auth: Auth,
1051+
folderUid: string,
1052+
accessTypeUid: string,
1053+
accessType: Folder.AccessType
1054+
): Promise<DKdFolderAccess | undefined> {
1055+
const fromStorage = findFolderAccessEntry(storage, folderUid, accessTypeUid, accessType)
1056+
if (fromStorage) return fromStorage
1057+
1058+
try {
1059+
const liveEntries = await fetchLiveFolderAccessEntries(auth, folderUid)
1060+
return liveEntries.find(
1061+
(entry) => entry.accessTypeUid === accessTypeUid && entry.accessType === accessType
1062+
)
1063+
} catch {
1064+
// If live lookup fails, fall through to add-path (previous behavior).
1065+
return undefined
1066+
}
1067+
}
1068+
10051069
export function collectExistingFolderShareTargets(
10061070
storage: InMemoryStorage,
10071071
folderUid: string,

KeeperSdk/src/nestedShareFolders/nsfShare.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {
3131
fetchLiveRecordAccessesV3,
3232
findDirectUserRecordShare,
3333
findUserRecordShareEntry,
34-
findFolderAccessEntry,
34+
findFolderAccessEntryOrLive,
3535
loadShareUserMap,
3636
getKeeperDriveRecord,
3737
getNsfRecordPermissionRoleLabel,
@@ -278,7 +278,13 @@ async function grantFolderAccess(
278278
const accessType = target.isTeam ? Folder.AccessType.AT_TEAM : Folder.AccessType.AT_USER
279279
const accessTypeUid = target.accountUid ? webSafe64FromBytes(target.accountUid) : target.recipient
280280

281-
const existing = findFolderAccessEntry(storage, folderUid, accessTypeUid, accessType)
281+
const existing = await findFolderAccessEntryOrLive(
282+
storage,
283+
auth,
284+
folderUid,
285+
accessTypeUid,
286+
accessType
287+
)
282288
if (existing && existing.accessRoleType === accessRoleType && expirationTimestamp == null) {
283289
return {
284290
folderUid,

0 commit comments

Comments
 (0)