Skip to content

Commit 0acc905

Browse files
committed
secrets sanitization correctness
1 parent 8b6f795 commit 0acc905

148 files changed

Lines changed: 11461 additions & 2210 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/sim/app/api/function/execute/route.test.ts

Lines changed: 104 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -796,16 +796,115 @@ describe('Function Execute API Route', () => {
796796

797797
describe('Template Variable Resolution', () => {
798798
it.concurrent('should resolve environment variables with {{var_name}} syntax', async () => {
799-
const req = createMockRequest('POST', {
800-
code: 'return {{API_KEY}}',
801-
envVars: {
802-
API_KEY: 'secret-key-123',
799+
const req = createMockRequest(
800+
'POST',
801+
{
802+
code: 'return {{API_KEY}}',
803+
envVars: {
804+
API_KEY: 'secret-key-123',
805+
},
803806
},
804-
})
807+
{
808+
'x-sim-request-private-tool-metadata': 'resolved-secret-names-v1',
809+
}
810+
)
805811

806812
const response = await POST(req)
813+
const data = await response.json()
807814

808815
expect(response.status).toBe(200)
816+
expect(data.__resolvedSecretNames).toEqual(['API_KEY'])
817+
})
818+
819+
it('reports only successful references sourced from scoped environment variables', async () => {
820+
const envResponse = await POST(
821+
createMockRequest(
822+
'POST',
823+
{
824+
code: 'return {{SHARED}} + {{ENV_ONLY}} + {{MISSING}}',
825+
params: { SHARED: 'param-value', MISSING: 'ordinary-param' },
826+
envVars: { SHARED: 'secret-value', ENV_ONLY: 'other-secret' },
827+
},
828+
{
829+
'x-sim-request-private-tool-metadata': 'resolved-secret-names-v1',
830+
}
831+
)
832+
)
833+
const envData = await envResponse.json()
834+
835+
const directResponse = await POST(
836+
createMockRequest(
837+
'POST',
838+
{
839+
code: 'return environmentVariables.API_KEY + params.API_KEY',
840+
params: { API_KEY: 'ordinary-param' },
841+
envVars: { API_KEY: 'secret-value' },
842+
},
843+
{
844+
'x-sim-request-private-tool-metadata': 'resolved-secret-names-v1',
845+
}
846+
)
847+
)
848+
const directData = await directResponse.json()
849+
850+
expect(envData.__resolvedSecretNames).toEqual(['ENV_ONLY', 'SHARED'])
851+
expect(directData.__resolvedSecretNames).toEqual([])
852+
})
853+
854+
it('reports shell {{NAME}} substitutions but not direct shell environment access', async () => {
855+
envFlagsMock.isRemoteSandboxEnabled = true
856+
857+
const referencedResponse = await POST(
858+
createMockRequest(
859+
'POST',
860+
{
861+
code: 'printf "%s" "{{API_KEY}}"',
862+
language: 'shell',
863+
envVars: { API_KEY: 'secret-value' },
864+
},
865+
{
866+
'x-sim-request-private-tool-metadata': 'resolved-secret-names-v1',
867+
}
868+
)
869+
)
870+
const referencedData = await referencedResponse.json()
871+
872+
const directResponse = await POST(
873+
createMockRequest(
874+
'POST',
875+
{
876+
code: 'printf "%s" "$API_KEY"',
877+
language: 'shell',
878+
envVars: { API_KEY: 'secret-value' },
879+
},
880+
{
881+
'x-sim-request-private-tool-metadata': 'resolved-secret-names-v1',
882+
}
883+
)
884+
)
885+
const directData = await directResponse.json()
886+
887+
expect(referencedData.__resolvedSecretNames).toEqual(['API_KEY'])
888+
expect(directData.__resolvedSecretNames).toEqual([])
889+
})
890+
891+
it('reports only substitutions allowed by the Function secret scope', async () => {
892+
const response = await POST(
893+
createMockRequest(
894+
'POST',
895+
{
896+
code: 'return {{ALLOWED}} + {{BLOCKED}}',
897+
envVars: { ALLOWED: 'allowed-secret', BLOCKED: 'blocked-secret' },
898+
secretScope: 'selected',
899+
mountedSecrets: ['ALLOWED'],
900+
},
901+
{
902+
'x-sim-request-private-tool-metadata': 'resolved-secret-names-v1',
903+
}
904+
)
905+
)
906+
907+
expect((await response.json()).__resolvedSecretNames).toEqual(['ALLOWED'])
809908
})
810909

811910
it.concurrent('should resolve tag variables with <tag_name> syntax', async () => {

0 commit comments

Comments
 (0)