Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions KeeperSdk/src/nestedShareFolders/nsfHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -876,10 +876,16 @@ export async function fetchLiveRecordAccessEntries(
}[]
> {
try {
const [response, shareUsers] = await Promise.all([
auth.executeRest(getRecordAccessMessage({ recordUids: [normal64Bytes(recordUid)] })),
loadShareUserMap(auth, storage),
])
let response: record.v3.details.IRecordAccessResponse
try {
response = await auth.executeRest(getRecordAccessMessage({ recordUids: [normal64Bytes(recordUid)] }))
} catch (restErr) {
if (restErr instanceof Error && restErr.message.includes('decrypt')) {
return []
}
throw restErr
}
const shareUsers = await loadShareUserMap(auth, storage)

return (response.recordAccesses ?? [])
.filter((entry) => {
Expand Down
8 changes: 8 additions & 0 deletions examples/sdk_example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@
"pam:config:new": "ts-node src/pam/config/create_config.ts",
"pam:config:edit": "ts-node src/pam/config/edit_config.ts",
"pam:config:remove": "ts-node src/pam/config/remove_config.ts",
"pam:rotation:list": "ts-node src/pam/rotation/list_rotations.ts",
"pam:rotation:info": "ts-node src/pam/rotation/rotation_info.ts",
"pam:rotation:edit": "ts-node src/pam/rotation/edit_rotation.ts",
"pam:rotation:delete": "ts-node src/pam/rotation/delete_rotation.ts",
"pam:rotation:list-script": "ts-node src/pam/rotation/list_scripts.ts",
"pam:rotation:add-script": "ts-node src/pam/rotation/add_script.ts",
"pam:rotation:edit-script": "ts-node src/pam/rotation/edit_script.ts",
"pam:rotation:delete-script": "ts-node src/pam/rotation/delete_script.ts",
"link-local": "cd ../../KeeperSdk && npm link ../keeperapi && cd ../examples/sdk_example && npm link ../../keeperapi",
"types": "tsc --watch",
"types:ci": "tsc"
Expand Down
65 changes: 65 additions & 0 deletions examples/sdk_example/src/pam/rotation/add_script.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import {
cleanup,
extractErrorMessage,
login,
logger,
prompt,
} from '@keeper-security/keeper-sdk-javascript'
import { runExample } from '../../utils/runner'

async function addRotationScriptExample() {
const vault = await login()

try {
const record = (await prompt('Target PAM record UID or name: ')).trim()
if (!record) {
logger.error('Record is required.')
return
}

const scriptPath = (await prompt('Script file path: ')).trim()
if (!scriptPath) {
logger.error('Script path is required.')
return
}

const scriptCommand = (await prompt('Script command (optional): ')).trim() || undefined

const credentialStr = (await prompt('Credential UIDs (comma-separated, optional): ')).trim()
const credentialUids = credentialStr
? credentialStr.split(',').map((s) => s.trim())
: undefined

logger.info('\nAdding rotation script...\n')

const result = await vault.addRotationScript({
record,
scriptPath,
scriptCommand,
credentialUids,
})

if (!result.success) {
logger.error(`Error: ${result.message}`)
process.exitCode = 1
return
}

logger.info(`✓ ${result.message}`)
logger.info(`Script File UID: ${result.scriptFileUid}`)

if (result.warnings.length > 0) {
logger.warn('\nWarnings:')
result.warnings.forEach((w) => logger.warn(` - ${w}`))
}

logger.info('')
} catch (err) {
logger.error(`Operation failed: ${extractErrorMessage(err)}`)
process.exitCode = 1
} finally {
cleanup(vault)
}
}

runExample(addRotationScriptExample)
58 changes: 58 additions & 0 deletions examples/sdk_example/src/pam/rotation/delete_script.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import {
cleanup,
extractErrorMessage,
login,
logger,
prompt,
} from '@keeper-security/keeper-sdk-javascript'
import { isYes } from '../../utils/promptCommands'
import { runExample } from '../../utils/runner'

async function deleteRotationScriptExample() {
const vault = await login()

try {
const record = (await prompt('Target PAM record UID or name: ')).trim()
if (!record) {
logger.error('Record is required.')
return
}

const script = (await prompt('Script UID or name (optional - leaves empty to delete first script): ')).trim()

const confirm = await prompt('Are you sure you want to delete this script? (yes/no): ')
if (!isYes(confirm)) {
logger.info('Operation cancelled.')
return
}

logger.info('\nDeleting rotation script...\n')

const result = await vault.deleteRotationScript({
record,
script,
})

if (!result.success) {
logger.error(`Error: ${result.message}`)
process.exitCode = 1
return
}

logger.info(`✓ ${result.message}`)

if (result.warnings.length > 0) {
logger.warn('\nWarnings:')
result.warnings.forEach((w) => logger.warn(` - ${w}`))
}

logger.info('')
} catch (err) {
logger.error(`Operation failed: ${extractErrorMessage(err)}`)
process.exitCode = 1
} finally {
cleanup(vault)
}
}

runExample(deleteRotationScriptExample)
Loading
Loading