Skip to content

Commit 2e96648

Browse files
authored
Allow deleting non-reserved-system-keys that start with underscore (#6496)
1 parent 7125c0f commit 2e96648

File tree

2 files changed

+44
-18
lines changed

2 files changed

+44
-18
lines changed

src/WebJobs.Script.WebHost/Controllers/KeysController.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,12 +240,17 @@ private async Task<Dictionary<string, string>> GetHostSecretsByScope(string secr
240240

241241
private async Task<IHttpActionResult> DeleteFunctionSecretAsync(string keyName, string keyScope, ScriptSecretsType secretsType)
242242
{
243-
if (keyName == null || keyName.StartsWith("_"))
243+
if (keyName == null)
244244
{
245-
// System keys cannot be deleted.
246245
return BadRequest("Invalid key name.");
247246
}
248247

248+
if (IsBuiltInSystemKeyName(keyName))
249+
{
250+
// System keys cannot be deleted.
251+
return BadRequest("Cannot delete System Key.");
252+
}
253+
249254
if ((secretsType == ScriptSecretsType.Function && keyScope != null && !IsFunction(keyScope)) ||
250255
!await _secretManager.DeleteSecretAsync(keyName, keyScope, secretsType))
251256
{
@@ -262,6 +267,15 @@ private async Task<IHttpActionResult> DeleteFunctionSecretAsync(string keyName,
262267
return StatusCode(HttpStatusCode.NoContent);
263268
}
264269

270+
private static bool IsBuiltInSystemKeyName(string keyName)
271+
{
272+
if (keyName.Equals(MasterKeyName, StringComparison.OrdinalIgnoreCase))
273+
{
274+
return true;
275+
}
276+
return false;
277+
}
278+
265279
private bool IsFunction(string functionName)
266280
{
267281
string json = null;

test/WebJobs.Script.Tests/Controllers/Admin/KeysControllerTests.cs

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -134,17 +134,38 @@ public async Task PutKey_Succeeds()
134134
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Once);
135135
}
136136

137-
[Fact]
138-
public async Task DeleteKey_Succeeds()
137+
[Theory]
138+
[InlineData("key1", false)]
139+
[InlineData("_key1", false)]
140+
[InlineData("_master", true)]
141+
[InlineData("_MASter", true)]
142+
[InlineData(null, true)]
143+
public async Task DeleteKey_Tests(string keyName, bool invalidKey)
139144
{
140145
_testController.Request = new HttpRequestMessage(HttpMethod.Get, "https://local/admin/functions/keys/key2");
141146

142-
_secretsManagerMock.Setup(p => p.DeleteSecretAsync("key2", "TestFunction1", ScriptSecretsType.Function)).ReturnsAsync(true);
143-
144-
var result = (StatusCodeResult)(await _testController.Delete("TestFunction1", "key2"));
145-
Assert.Equal(HttpStatusCode.NoContent, result.StatusCode);
147+
_secretsManagerMock.Setup(p => p.DeleteSecretAsync(keyName, "TestFunction1", ScriptSecretsType.Function)).ReturnsAsync(true);
146148

147-
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Once);
149+
if (invalidKey)
150+
{
151+
if (string.IsNullOrEmpty(keyName))
152+
{
153+
var result = (BadRequestErrorMessageResult)(await _testController.Delete("TestFunction1", keyName));
154+
Assert.Equal("Invalid key name.", result.Message);
155+
}
156+
else
157+
{
158+
var result = (BadRequestErrorMessageResult)(await _testController.Delete("TestFunction1", keyName));
159+
Assert.Equal("Cannot delete System Key.", result.Message);
160+
}
161+
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Never);
162+
}
163+
else
164+
{
165+
var result = (StatusCodeResult)(await _testController.Delete("TestFunction1", keyName));
166+
Assert.Equal(HttpStatusCode.NoContent, result.StatusCode);
167+
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Once);
168+
}
148169
}
149170

150171
[Fact]
@@ -167,15 +188,6 @@ public async Task DeleteKey_NotAKey_ReturnsNotFound()
167188
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Never);
168189
}
169190

170-
[Fact]
171-
public async Task DeleteKey_InvalidKeyName_ReturnsBadRequest()
172-
{
173-
var result = (BadRequestErrorMessageResult)(await _testController.Delete("TestFunction1", "_test"));
174-
Assert.Equal("Invalid key name.", result.Message);
175-
176-
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Never);
177-
}
178-
179191
protected virtual void Dispose(bool disposing)
180192
{
181193
if (disposing)

0 commit comments

Comments
 (0)