private ImmutableArray <FunctionMetadata> AddProxyClient(ImmutableArray <FunctionMetadata> functionMetadataArray)
        {
            var proxyMetadata = new List <FunctionMetadata>();

            foreach (var metadata in functionMetadataArray)
            {
                if (!metadata.IsProxy())
                {
                    continue;
                }
                var proxydata = new ProxyFunctionMetadata(_proxyClient);
                metadata.Bindings.ToList().ForEach(b => proxydata.Bindings.Add(b));
                proxydata.EntryPoint        = metadata.EntryPoint;
                proxydata.FunctionDirectory = metadata.FunctionDirectory;
                proxydata.SetIsDirect(metadata.IsDirect());
                proxydata.SetIsDisabled(metadata.IsDisabled());
                proxydata.Language   = metadata.Language;
                proxydata.Name       = metadata.Name;
                proxydata.ScriptFile = metadata.ScriptFile;

                proxyMetadata.Add(proxydata);
            }

            return(proxyMetadata.ToImmutableArray());
        }
Example #2
0
        public void FunctionLoadRequest_IsExpected()
        {
            FunctionMetadata metadata = new FunctionMetadata()
            {
                Language = "node",
                Name     = "js1"
            };

            metadata.SetFunctionId("TestFunctionId1");

            var functionLoadRequest = _workerChannel.GetFunctionLoadRequest(metadata, null);

            Assert.False(functionLoadRequest.Metadata.IsProxy);
            ProxyFunctionMetadata proxyMetadata = new ProxyFunctionMetadata(null)
            {
                Language = "node",
                Name     = "js1"
            };

            metadata.SetFunctionId("TestFunctionId1");

            var proxyFunctionLoadRequest = _workerChannel.GetFunctionLoadRequest(proxyMetadata, null);

            Assert.True(proxyFunctionLoadRequest.Metadata.IsProxy);
        }
        public void RequiresAuthz_ReturnsExpectedResult()
        {
            var uri            = new Uri("http://localhost/test");
            var request        = new DefaultHttpContext().Request;
            var requestFeature = request.HttpContext.Features.Get <IHttpRequestFeature>();

            requestFeature.Method      = "GET";
            requestFeature.Scheme      = uri.Scheme;
            requestFeature.Path        = uri.GetComponents(UriComponents.KeepDelimiter | UriComponents.Path, UriFormat.Unescaped);
            requestFeature.PathBase    = string.Empty;
            requestFeature.QueryString = uri.GetComponents(UriComponents.KeepDelimiter | UriComponents.Query, UriFormat.Unescaped);

            requestFeature.Headers = new HeaderDictionary
            {
                { "Host", uri.Host }
            };

            // Function level auth requires authz
            FunctionMetadata metadata = new FunctionMetadata();
            var function  = new Mock <FunctionDescriptor>(MockBehavior.Strict, "test", null, metadata, null, null, null, null);
            var attribute = new HttpTriggerAttribute(AuthorizationLevel.Function, "get")
            {
                Route = "test"
            };

            function.SetupGet(p => p.HttpTriggerAttribute).Returns(() => attribute);
            bool result = FunctionInvocationMiddleware.RequiresAuthz(request, function.Object);

            Assert.True(result);

            // Proxies don't require authz
            metadata  = new ProxyFunctionMetadata(null);
            function  = new Mock <FunctionDescriptor>(MockBehavior.Strict, "test", null, metadata, null, null, null, null);
            attribute = new HttpTriggerAttribute(AuthorizationLevel.Function, "get")
            {
                Route = "test"
            };
            function.SetupGet(p => p.HttpTriggerAttribute).Returns(() => attribute);
            result = FunctionInvocationMiddleware.RequiresAuthz(request, function.Object);
            Assert.False(result);

            // Anonymous functions don't require authz
            metadata  = new FunctionMetadata();
            function  = new Mock <FunctionDescriptor>(MockBehavior.Strict, "test", null, metadata, null, null, null, null);
            attribute = new HttpTriggerAttribute(AuthorizationLevel.Anonymous, "get")
            {
                Route = "test"
            };
            function.SetupGet(p => p.HttpTriggerAttribute).Returns(() => attribute);
            result = FunctionInvocationMiddleware.RequiresAuthz(request, function.Object);
            Assert.False(result);

            // Anonymous functions with EasyAuth header require authz
            requestFeature.Headers = new HeaderDictionary
            {
                { ScriptConstants.EasyAuthIdentityHeader, "abc123" }
            };
            result = FunctionInvocationMiddleware.RequiresAuthz(request, function.Object);
            Assert.True(result);

            // Anonymous functions with key header require authz
            requestFeature.Headers = new HeaderDictionary
            {
                { AuthenticationLevelHandler.FunctionsKeyHeaderName, "abc123" }
            };
            result = FunctionInvocationMiddleware.RequiresAuthz(request, function.Object);
            Assert.True(result);

            // Anonymous functions with key query param require authz
            uri                        = new Uri("http://localhost/test?code=abc123");
            request                    = new DefaultHttpContext().Request;
            requestFeature             = request.HttpContext.Features.Get <IHttpRequestFeature>();
            requestFeature.Method      = "GET";
            requestFeature.Scheme      = uri.Scheme;
            requestFeature.Path        = uri.GetComponents(UriComponents.KeepDelimiter | UriComponents.Path, UriFormat.Unescaped);
            requestFeature.PathBase    = string.Empty;
            requestFeature.QueryString = uri.GetComponents(UriComponents.KeepDelimiter | UriComponents.Query, UriFormat.Unescaped);
            requestFeature.Headers     = new HeaderDictionary
            {
                { "Host", uri.Host }
            };
            result = FunctionInvocationMiddleware.RequiresAuthz(request, function.Object);
            Assert.True(result);
        }
Example #4
0
 public ProxyFunctionInvoker(ScriptHost host, ProxyFunctionMetadata proxyfunctionMetadata, ILoggerFactory loggerFactory)
     : base(host, proxyfunctionMetadata, loggerFactory)
 {
     _proxyClient = proxyfunctionMetadata.ProxyClient;
 }