Skip to content

Commit 16d0f22

Browse files
committed
Adding more tests
1 parent 0fc45ab commit 16d0f22

File tree

3 files changed

+100
-12
lines changed

3 files changed

+100
-12
lines changed

src/WebJobs.Script.WebHost/Filters/AuthorizationLevelAttribute.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace WebJobs.Script.WebHost.Filters
1212
{
1313
public class AuthorizationLevelAttribute : AuthorizationFilterAttribute
1414
{
15-
public const string MasterKeyHeaderName = "x-functions-key";
15+
public const string FunctionsKeyHeaderName = "x-functions-key";
1616

1717
public AuthorizationLevelAttribute(AuthorizationLevel level)
1818
{
@@ -42,14 +42,14 @@ public static bool IsAuthorized(HttpRequestMessage request, AuthorizationLevel l
4242
return requestLevel >= level;
4343
}
4444

45-
private static AuthorizationLevel GetAuthorizationLevel(HttpRequestMessage request, SecretManager secretManager, string functionName = null)
45+
internal static AuthorizationLevel GetAuthorizationLevel(HttpRequestMessage request, SecretManager secretManager, string functionName = null)
4646
{
4747
// TODO: Add support for validating "EasyAuth" headers
4848

49-
// first see if a key value is specified via headers or query string
49+
// first see if a key value is specified via headers or query string (header takes precidence)
5050
IEnumerable<string> values;
5151
string keyValue = null;
52-
if (request.Headers.TryGetValues(MasterKeyHeaderName, out values))
52+
if (request.Headers.TryGetValues(FunctionsKeyHeaderName, out values))
5353
{
5454
keyValue = values.FirstOrDefault();
5555
}

src/WebJobs.Script.WebHost/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,5 @@
3333
// by using the '*' as shown below:
3434
[assembly: AssemblyVersion("1.0.0.0")]
3535
[assembly: AssemblyFileVersion("1.0.0.0")]
36+
37+
[assembly: InternalsVisibleTo("WebJobs.Script.Tests")]

test/WebJobs.Script.Tests/AuthorizationLevelAttributeTests.cs

Lines changed: 94 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Net;
1+
using System;
2+
using System.Net;
23
using System.Net.Http;
34
using System.Web.Http;
45
using System.Web.Http.Controllers;
@@ -14,8 +15,12 @@ namespace WebJobs.Script.Tests
1415
public class AuthorizationLevelAttributeTests
1516
{
1617
private readonly string TestMasterKeyValue = "abc123";
18+
private readonly string TestFunctionKeyValue = "def456";
19+
private readonly string TestHostFunctionKeyValue = "xyz789";
1720
private HttpActionContext _actionContext;
1821
private HostSecrets _hostSecrets;
22+
private FunctionSecrets _functionSecrets;
23+
private Mock<SecretManager> _mockSecretManager;
1924

2025
public AuthorizationLevelAttributeTests()
2126
{
@@ -26,13 +31,19 @@ public AuthorizationLevelAttributeTests()
2631
controllerContext.Configuration = httpConfig;
2732
Mock<IDependencyResolver> mockDependencyResolver = new Mock<IDependencyResolver>(MockBehavior.Strict);
2833
httpConfig.DependencyResolver = mockDependencyResolver.Object;
29-
Mock<SecretManager> mockSecretManager = new Mock<SecretManager>(MockBehavior.Strict);
34+
_mockSecretManager = new Mock<SecretManager>(MockBehavior.Strict);
3035
_hostSecrets = new HostSecrets
3136
{
32-
MasterKey = TestMasterKeyValue
37+
MasterKey = TestMasterKeyValue,
38+
FunctionKey = TestHostFunctionKeyValue
3339
};
34-
mockSecretManager.Setup(p => p.GetHostSecrets()).Returns(_hostSecrets);
35-
mockDependencyResolver.Setup(p => p.GetService(typeof(SecretManager))).Returns(mockSecretManager.Object);
40+
_mockSecretManager.Setup(p => p.GetHostSecrets()).Returns(_hostSecrets);
41+
_functionSecrets = new FunctionSecrets
42+
{
43+
Key = TestFunctionKeyValue
44+
};
45+
_mockSecretManager.Setup(p => p.GetFunctionSecrets(It.IsAny<string>())).Returns(_functionSecrets);
46+
mockDependencyResolver.Setup(p => p.GetService(typeof(SecretManager))).Returns(_mockSecretManager.Object);
3647
}
3748

3849
[Fact]
@@ -41,7 +52,7 @@ public void OnAuthorization_AdminLevel_ValidHeader_Succeeds()
4152
AuthorizationLevelAttribute attribute = new AuthorizationLevelAttribute(AuthorizationLevel.Admin);
4253

4354
HttpRequestMessage request = new HttpRequestMessage();
44-
request.Headers.Add(AuthorizationLevelAttribute.MasterKeyHeaderName, "abc123");
55+
request.Headers.Add(AuthorizationLevelAttribute.FunctionsKeyHeaderName, "abc123");
4556
_actionContext.ControllerContext.Request = request;
4657

4758
attribute.OnAuthorization(_actionContext);
@@ -60,7 +71,7 @@ public void OnAuthorization_AdminLevel_InvalidHeader_ReturnsUnauthorized(string
6071
HttpRequestMessage request = new HttpRequestMessage();
6172
if (headerValue != null)
6273
{
63-
request.Headers.Add(AuthorizationLevelAttribute.MasterKeyHeaderName, headerValue);
74+
request.Headers.Add(AuthorizationLevelAttribute.FunctionsKeyHeaderName, headerValue);
6475
}
6576
_actionContext.ControllerContext.Request = request;
6677

@@ -77,7 +88,7 @@ public void OnAuthorization_AdminLevel_NoMasterKeySet_ReturnsUnauthorized()
7788
_hostSecrets.MasterKey = null;
7889

7990
HttpRequestMessage request = new HttpRequestMessage();
80-
request.Headers.Add(AuthorizationLevelAttribute.MasterKeyHeaderName, TestMasterKeyValue);
91+
request.Headers.Add(AuthorizationLevelAttribute.FunctionsKeyHeaderName, TestMasterKeyValue);
8192
_actionContext.ControllerContext.Request = request;
8293

8394
attribute.OnAuthorization(_actionContext);
@@ -97,5 +108,80 @@ public void OnAuthorization_AnonymousLevel_Succeeds()
97108

98109
Assert.Null(_actionContext.Response);
99110
}
111+
112+
[Fact]
113+
public void GetAuthorizationLevel_ValidKeyHeader_MasterKey_ReturnsAdmin()
114+
{
115+
HttpRequestMessage request = new HttpRequestMessage();
116+
request.Headers.Add(AuthorizationLevelAttribute.FunctionsKeyHeaderName, TestMasterKeyValue);
117+
118+
AuthorizationLevel level = AuthorizationLevelAttribute.GetAuthorizationLevel(request, _mockSecretManager.Object);
119+
120+
Assert.Equal(AuthorizationLevel.Admin, level);
121+
}
122+
123+
[Fact]
124+
public void GetAuthorizationLevel_ValidKeyHeader_FunctionKey_ReturnsFunction()
125+
{
126+
// first verify the host level function key works
127+
HttpRequestMessage request = new HttpRequestMessage();
128+
request.Headers.Add(AuthorizationLevelAttribute.FunctionsKeyHeaderName, TestHostFunctionKeyValue);
129+
AuthorizationLevel level = AuthorizationLevelAttribute.GetAuthorizationLevel(request, _mockSecretManager.Object);
130+
Assert.Equal(AuthorizationLevel.Function, level);
131+
132+
// test function specific key
133+
request = new HttpRequestMessage();
134+
request.Headers.Add(AuthorizationLevelAttribute.FunctionsKeyHeaderName, TestFunctionKeyValue);
135+
level = AuthorizationLevelAttribute.GetAuthorizationLevel(request, _mockSecretManager.Object, functionName: "TestFunction");
136+
Assert.Equal(AuthorizationLevel.Function, level);
137+
}
138+
139+
[Fact]
140+
public void GetAuthorizationLevel_InvalidKeyHeader_ReturnsAnonymous()
141+
{
142+
HttpRequestMessage request = new HttpRequestMessage();
143+
request.Headers.Add(AuthorizationLevelAttribute.FunctionsKeyHeaderName, "invalid");
144+
145+
AuthorizationLevel level = AuthorizationLevelAttribute.GetAuthorizationLevel(request, _mockSecretManager.Object);
146+
147+
Assert.Equal(AuthorizationLevel.Anonymous, level);
148+
}
149+
150+
[Fact]
151+
public void GetAuthorizationLevel_ValidKeyQueryParam_MasterKey_ReturnsAdmin()
152+
{
153+
Uri uri = new Uri(string.Format("http://functions/api/foo?key={0}", TestMasterKeyValue));
154+
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri);
155+
156+
AuthorizationLevel level = AuthorizationLevelAttribute.GetAuthorizationLevel(request, _mockSecretManager.Object);
157+
158+
Assert.Equal(AuthorizationLevel.Admin, level);
159+
}
160+
161+
[Fact]
162+
public void GetAuthorizationLevel_ValidKeyQueryParam_FunctionKey_ReturnsFunction()
163+
{
164+
// first try host level function key
165+
Uri uri = new Uri(string.Format("http://functions/api/foo?key={0}", TestHostFunctionKeyValue));
166+
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri);
167+
AuthorizationLevel level = AuthorizationLevelAttribute.GetAuthorizationLevel(request, _mockSecretManager.Object, functionName: "TestFunction");
168+
Assert.Equal(AuthorizationLevel.Function, level);
169+
170+
uri = new Uri(string.Format("http://functions/api/foo?key={0}", TestFunctionKeyValue));
171+
request = new HttpRequestMessage(HttpMethod.Get, uri);
172+
level = AuthorizationLevelAttribute.GetAuthorizationLevel(request, _mockSecretManager.Object, functionName: "TestFunction");
173+
Assert.Equal(AuthorizationLevel.Function, level);
174+
}
175+
176+
[Fact]
177+
public void GetAuthorizationLevel_InvalidKeyQueryParam_ReturnsAnonymous()
178+
{
179+
Uri uri = new Uri(string.Format("http://functions/api/foo?key={0}", "invalid"));
180+
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri);
181+
182+
AuthorizationLevel level = AuthorizationLevelAttribute.GetAuthorizationLevel(request, _mockSecretManager.Object);
183+
184+
Assert.Equal(AuthorizationLevel.Anonymous, level);
185+
}
100186
}
101187
}

0 commit comments

Comments
 (0)