Skip to content
This repository has been archived by the owner on Jul 26, 2022. It is now read-only.

Commit

Permalink
fix(azure)!: Unwraps the value returned from Azure Key vault (migrati…
Browse files Browse the repository at this point in the history
…on: "property: value" -> remove property selector) (#460)

Previously secret value was wrapped in an object { "value": <secret> } while now <secret> will be returned so KES features can be properly used
  • Loading branch information
Flydiverny authored Sep 29, 2020
1 parent da09d37 commit 36d5bbb
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 8 deletions.
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,6 @@ spec:
data:
- key: hello-service/credentials
name: password
property: value
```

Due to the way Azure handles binary files, you need to explicitly let the ExternalSecret know that the secret is binary.
Expand Down
2 changes: 1 addition & 1 deletion lib/backends/azure-keyvault-backend.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class AzureKeyVaultBackend extends KVBackend {
if (keyOptions && keyOptions.isBinary) {
return Buffer.from(secret.value, 'base64')
}
return JSON.stringify(secret)
return secret.value
}
}

Expand Down
39 changes: 33 additions & 6 deletions lib/backends/azure-keyvault-backend.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,20 @@ describe('AzureKeyVaultBackend', () => {
const secret = 'fakeSecretPropertyValue'
const key = 'password'
const keyVaultName = 'vault_name'
const quotedSecretValue = '"' + secret + '"'
const quotedSecretValueAsBase64 = Buffer.from(secret).toString('base64')

const azureSecret = {
properties: {},
value: secret,
name: key
}

beforeEach(() => {
credentialMock = sinon.mock()
loggerMock = sinon.mock()
credentialFactoryMock = sinon.fake.returns(credentialMock)
clientMock = sinon.mock()
clientMock.getSecret = sinon.stub().returns(azureSecret)
loggerMock.info = sinon.stub()

azureKeyVaultBackend = new AzureKeyVaultBackend({
Expand All @@ -32,18 +39,38 @@ describe('AzureKeyVaultBackend', () => {
})

describe('_get', () => {
beforeEach(() => {
clientMock.getSecret = sinon.stub().returns(secret)
})

it('returns secret property value', async () => {
const secretPropertyValue = await azureKeyVaultBackend._get({
key: key,
specOptions: {
keyVaultName: keyVaultName
}
})
expect(secretPropertyValue).equals(quotedSecretValue)
expect(secretPropertyValue).equals(secret)
})
})

describe('getSecretManifestData', () => {
it('returns secret property value', async () => {
const returnedData = await azureKeyVaultBackend.getSecretManifestData({
spec: {
backendType: 'vault',
keyVaultName: keyVaultName,
data: [{
key: key,
name: 'name-in-k8s'
}]
}
})

// First, we get the client...
sinon.assert.calledWith(azureKeyVaultBackend._keyvaultClient, { keyVaultName })

// ... then we fetch the secret ...
sinon.assert.calledWith(clientMock.getSecret, key)

// ... and expect to get the full proper value
expect(returnedData['name-in-k8s']).equals(quotedSecretValueAsBase64)
})
})
})

0 comments on commit 36d5bbb

Please sign in to comment.