Skip to content

Commit 293dfa1

Browse files
authored
Allow deleting non-reserved-system-keys that start with underscore (#6492)
1 parent 8281ff0 commit 293dfa1

File tree

2 files changed

+36
-17
lines changed

2 files changed

+36
-17
lines changed

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

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

250250
private async Task<IActionResult> DeleteFunctionSecretAsync(string keyName, string keyScope, ScriptSecretsType secretsType)
251251
{
252-
if (keyName == null || keyName.StartsWith("_"))
252+
if (keyName == null)
253253
{
254-
// System keys cannot be deleted.
255254
return BadRequest("Invalid key name.");
256255
}
257256

257+
if (IsBuiltInSystemKeyName(keyName))
258+
{
259+
// System keys cannot be deleted.
260+
return BadRequest("Cannot delete System Key.");
261+
}
262+
258263
if ((secretsType == ScriptSecretsType.Function && keyScope != null && !IsFunction(keyScope)) ||
259264
!await _secretManagerProvider.Current.DeleteSecretAsync(keyName, keyScope, secretsType))
260265
{
@@ -269,6 +274,15 @@ private async Task<IActionResult> DeleteFunctionSecretAsync(string keyName, stri
269274
return StatusCode(StatusCodes.Status204NoContent);
270275
}
271276

277+
internal bool IsBuiltInSystemKeyName(string keyName)
278+
{
279+
if (keyName.Equals(MasterKeyName, StringComparison.OrdinalIgnoreCase))
280+
{
281+
return true;
282+
}
283+
return false;
284+
}
285+
272286
private bool IsFunction(string functionName)
273287
{
274288
string json = null;

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

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -137,15 +137,29 @@ public async Task PutKey_Succeeds()
137137
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Once);
138138
}
139139

140-
[Fact]
141-
public async Task DeleteKey_Succeeds()
140+
[Theory]
141+
[InlineData("key1", false)]
142+
[InlineData("_key1", false)]
143+
[InlineData("_master", true)]
144+
[InlineData("_MASter", true)]
145+
public async Task DeleteKey_Tests(string keyName, bool invalidKey)
142146
{
143-
_secretsManagerMock.Setup(p => p.DeleteSecretAsync("key2", "TestFunction1", ScriptSecretsType.Function)).ReturnsAsync(true);
147+
_secretsManagerMock.Setup(p => p.DeleteSecretAsync(keyName, "TestFunction1", ScriptSecretsType.Function)).ReturnsAsync(true);
144148

145-
var result = (StatusCodeResult)(await _testController.Delete("TestFunction1", "key2"));
146-
Assert.Equal(StatusCodes.Status204NoContent, result.StatusCode);
149+
if (invalidKey)
150+
{
151+
var result = (BadRequestObjectResult)(await _testController.Delete("TestFunction1", keyName));
152+
Assert.Equal("Cannot delete System Key.", result.Value);
147153

148-
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Once);
154+
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Never);
155+
}
156+
else
157+
{
158+
var result = (StatusCodeResult)(await _testController.Delete("TestFunction1", keyName));
159+
Assert.Equal(StatusCodes.Status204NoContent, result.StatusCode);
160+
161+
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Once);
162+
}
149163
}
150164

151165
[Fact]
@@ -168,15 +182,6 @@ public async Task DeleteKey_NotAKey_ReturnsNotFound()
168182
_functionsSyncManagerMock.Verify(p => p.TrySyncTriggersAsync(false), Times.Never);
169183
}
170184

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

0 commit comments

Comments
 (0)