Skip to content

Commit 8d008ac

Browse files
ukumar-kssaldoukhov
authored andcommitted
Enforce strict schema validation for PAM config creation/edit
1 parent 33bff74 commit 8d008ac

6 files changed

Lines changed: 41 additions & 9 deletions

File tree

KeeperSdk/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,7 @@ export {
936936
mergeRecordFields,
937937
adjustPamConfigurationFields,
938938
seedPamConfigurationFieldsFromRecordTypeSoft,
939+
seedPamConfigurationFieldsFromRecordTypeStrict,
939940
readTypedRecordPayload,
940941
upsertPamResourcesField,
941942
resolveGatewayUidSoft,

KeeperSdk/src/pam/config/configMutationHelpers.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,39 @@ async function seedPamConfigurationFieldsFromRecordType(
7676
return getFallbackSchemaFields(configType)
7777
}
7878

79+
export async function seedPamConfigurationFieldsFromRecordTypeStrict(
80+
auth: Auth,
81+
configType: string
82+
): Promise<PamConfigurationRecordFieldInput[]> {
83+
const schemaFields = await getNsfRecordTypeFields(auth, configType)
84+
if (!schemaFields?.length) {
85+
throw new KeeperSdkError(
86+
`Record type "${configType}" not found on the server. Ensure the record type is properly configured. Cannot create or edit PAM Configuration without server-defined schema.`,
87+
ResultCodes.PAM_CONFIG_TYPE_INVALID
88+
)
89+
}
90+
91+
const seeded: PamConfigurationRecordFieldInput[] = []
92+
for (const entry of schemaFields) {
93+
if (!entry || typeof entry !== 'object') continue
94+
const field = entry as { $ref?: unknown; label?: unknown; required?: unknown }
95+
const type = typeof field.$ref === 'string' ? field.$ref.trim() : ''
96+
if (!type) continue
97+
const label = typeof field.label === 'string' && field.label.trim() ? field.label.trim() : undefined
98+
const required = field.required === true ? true : undefined
99+
seeded.push({ type, label, required, value: [] })
100+
}
101+
102+
if (!seeded.length) {
103+
throw new KeeperSdkError(
104+
`Record type "${configType}" exists but has no valid fields in its schema. Check server configuration.`,
105+
ResultCodes.PAM_CONFIG_TYPE_INVALID
106+
)
107+
}
108+
109+
return seeded
110+
}
111+
79112
export async function seedPamConfigurationFieldsFromRecordTypeSoft(
80113
auth: Auth,
81114
configType: string,

KeeperSdk/src/pam/config/createConfig.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
linkConfigurationController,
1919
normalizeFields,
2020
resolveGatewayUidSoft,
21-
seedPamConfigurationFieldsFromRecordTypeSoft,
21+
seedPamConfigurationFieldsFromRecordTypeStrict,
2222
upsertPamResourcesField,
2323
} from './configMutationHelpers'
2424
import {
@@ -67,9 +67,7 @@ export async function createPamConfiguration(
6767
`Failed to resolve gateway "${gateway}": ${error}. Configuration will be created without a gateway controller link.`,
6868
})
6969

70-
const seededFields = await seedPamConfigurationFieldsFromRecordTypeSoft(auth, configType, (warning) =>
71-
warnings.push(warning)
72-
)
70+
const seededFields = await seedPamConfigurationFieldsFromRecordTypeStrict(auth, configType)
7371
const adjusted = adjustPamConfigurationFields(
7472
seededFields,
7573
normalizeFields(input.fields),

KeeperSdk/src/pam/config/editConfig.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
readTypedRecordPayload,
1212
resolveGatewayUidSoft,
1313
resolveResourceRecordUidsToRemove,
14-
seedPamConfigurationFieldsFromRecordTypeSoft,
14+
seedPamConfigurationFieldsFromRecordTypeStrict,
1515
upsertPamResourcesField,
1616
} from './configMutationHelpers'
1717
import {
@@ -148,12 +148,10 @@ export async function editPamConfiguration(
148148
adminCredentialUid = trimmed || undefined
149149
}
150150

151-
const seededFields = await seedPamConfigurationFieldsFromRecordTypeSoft(auth, configType, (warning) =>
152-
warnings.push(warning)
153-
)
151+
const seededFields = await seedPamConfigurationFieldsFromRecordTypeStrict(auth, configType)
154152
const valueUpdates = mergeRecordFields(existing.fields, input.fields)
155153
const adjusted = adjustPamConfigurationFields(
156-
seededFields.length ? seededFields : valueUpdates,
154+
seededFields,
157155
valueUpdates,
158156
mergeRecordFields(existing.custom, input.custom)
159157
)

KeeperSdk/src/pam/config/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ export {
9797
mergeRecordFields,
9898
adjustPamConfigurationFields,
9999
seedPamConfigurationFieldsFromRecordTypeSoft,
100+
seedPamConfigurationFieldsFromRecordTypeStrict,
100101
readTypedRecordPayload,
101102
upsertPamResourcesField,
102103
resolveGatewayUidSoft,

KeeperSdk/src/pam/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ export {
116116
mergeRecordFields,
117117
adjustPamConfigurationFields,
118118
seedPamConfigurationFieldsFromRecordTypeSoft,
119+
seedPamConfigurationFieldsFromRecordTypeStrict,
119120
readTypedRecordPayload,
120121
upsertPamResourcesField,
121122
resolveGatewayUidSoft,

0 commit comments

Comments
 (0)