Beispiel #1
0
    public void GetValueProvider_ReturnsValue_IfKeyIsPresent()
    {
        // Arrange
        var values = new RouteValueDictionary(new Dictionary <string, object>
        {
            { "test-key", "test-value" }
        });
        var provider = new RouteValueProvider(BindingSource.Query, values);

        // Act
        var result = provider.GetValue("test-key");

        // Assert
        Assert.Equal("test-value", (string)result);
    }
Beispiel #2
0
    public void ContainsPrefix_ReturnsNullValue_IfKeyIsPresent()
    {
        // Arrange
        var values = new RouteValueDictionary(new Dictionary <string, object>
        {
            { "test-key", null }
        });
        var provider = new RouteValueProvider(BindingSource.Query, values);

        // Act
        var result = provider.GetValue("test-key");

        // Assert
        Assert.Equal(string.Empty, (string)result);
    }
Beispiel #3
0
    public void GetValueProvider_ReturnsValue_UsesInvariantCulture()
    {
        // Arrange
        var values = new RouteValueDictionary(new Dictionary <string, object>
        {
            { "test-key", new DateTimeOffset(2018, 10, 31, 7, 37, 38, TimeSpan.FromHours(-7)) },
        });
        var provider = new RouteValueProvider(BindingSource.Query, values);

        // Act
        var result = provider.GetValue("test-key");

        // Assert
        Assert.Equal("10/31/2018 07:37:38 -07:00", (string)result);
    }
Beispiel #4
0
    public void GetValueProvider_ReturnsNull_WhenKeyIsNotFound()
    {
        // Arrange
        var values = new RouteValueDictionary(new Dictionary <string, object>
        {
            { "test-key", "value" }
        });
        var provider = new RouteValueProvider(BindingSource.Query, values);

        // Act
        var result = provider.GetValue("not-test-key");

        // Assert
        Assert.Equal(ValueProviderResult.None, result);
    }
Beispiel #5
0
    public void GetValue_ReturnsValue_WithDefaultCulture()
    {
        // Arrange
        var values = new RouteValueDictionary(new Dictionary <string, object>
        {
            { "test-key", "test-value" }
        });
        var provider = new RouteValueProvider(BindingSource.Query, values);

        // Act
        var result = provider.GetValue("test-key");

        // Assert
        Assert.Equal(CultureInfo.InvariantCulture, result.Culture);
    }
Beispiel #6
0
    public void GetValue_DoesNotReturnAValue_ForAKeyPrefix()
    {
        // Arrange
        var values = new RouteValueDictionary(new Dictionary <string, object>
        {
            { "bar.baz", 2 },
        });

        var valueProvider = new RouteValueProvider(BindingSource.Query, values);

        // Act
        var result = valueProvider.GetValue("bar");

        // Assert
        Assert.Equal(ValueProviderResult.None, result);
    }
Beispiel #7
0
    public void GetValueProvider_ReturnsValue_UsesSpecifiedCulture()
    {
        // Arrange
        var values = new RouteValueDictionary(new Dictionary <string, object>
        {
            { "test-key", new DateTimeOffset(2018, 10, 31, 7, 37, 38, TimeSpan.FromHours(-7)) },
        });
        var provider = new RouteValueProvider(BindingSource.Query, values, new CultureInfo("de-CH"));
        // The formatting was changed in netcoreapp3.0 to be consistent across platforms.
        var expected = "31.10.2018 07:37:38 -07:00";

        // Act
        var result = provider.GetValue("test-key");

        // Assert
        Assert.Equal(expected, (string)result);
    }
Beispiel #8
0
    public void GetValue_ReturnsCorrectValue_ForKnownKeys(string prefix, string expectedValue)
    {
        // Arrange
        var values = new RouteValueDictionary(new Dictionary <string, object>
        {
            { "bar", 1 },
            { "bar.baz", 2 },
        });

        var valueProvider = new RouteValueProvider(BindingSource.Query, values);

        // Act
        var result = valueProvider.GetValue(prefix);

        // Assert
        Assert.Equal(expectedValue, (string)result);
    }
        public async Task InvokeAsync(HttpContext context)
        {
            var providerInfoCache       = context.RequestServices.GetRequiredService <IProviderInfoCache>();
            var currentUserProvider     = context.RequestServices.GetRequiredService <ICurrentUserProvider>();
            var providerContextProvider = context.RequestServices.GetRequiredService <IProviderContextProvider>();

            bool runNext = true;

            await TryAssignFeature();

            if (runNext)
            {
                await _next(context);
            }

            async Task TryAssignFeature()
            {
                // For Provider {Super}Users the provider comes from their identity token.
                // For Admin or Helpdesk users there should be a route value indicating the provider.
                // If Provider {Super}Users specify the route value it's ignored.

                var user = currentUserProvider.GetCurrentUser();

                if (user == null)
                {
                    return;
                }

                Guid providerId;

                // A 'strict' provider context means it cannot be changed for a given request
                bool strict = true;

                var requestProviderId = TryGetProviderIdFromRequest();

                if (!requestProviderId.HasValue)
                {
                    requestProviderId = await TryGetProviderIdFromLegacyContext();

                    if (requestProviderId.HasValue)
                    {
                        strict = false;
                    }
                }

                if (user.IsDeveloper || user.IsHelpdesk)
                {
                    if (!requestProviderId.HasValue)
                    {
                        return;
                    }
                    else
                    {
                        providerId = requestProviderId.Value;
                    }
                }
                else // user.IsProvider == true
                {
                    var usersOwnProviderId = user.CurrentProviderId.Value;

                    // Route param or session value, if specified, must match user's own org
                    if (requestProviderId.HasValue && requestProviderId.Value != usersOwnProviderId)
                    {
                        context.Response.StatusCode = StatusCodes.Status403Forbidden;
                        runNext = false;
                        return;
                    }

                    providerId = usersOwnProviderId;
                }

                var providerInfo = await providerInfoCache.GetProviderInfo(providerId);

                if (providerInfo != null)
                {
                    var providerContext = new ProviderContext(providerInfo, strict);
                    providerContextProvider.SetProviderContext(providerContext);
                }
            }

            Guid?TryGetProviderIdFromRequest()
            {
                var routeValueProvider = new RouteValueProvider(
                    BindingSource.Path,
                    context.GetRouteData().Values);

                var queryStringValueProvider = new QueryStringValueProvider(
                    BindingSource.Query,
                    context.Request.Query,
                    CultureInfo.InvariantCulture);

                var matches = routeValueProvider.GetValue(RouteValueKey).Values
                              .Concat(queryStringValueProvider.GetValue(RouteValueKey).Values)
                              .Distinct()
                              .ToList();

                if (matches.Count == 1 && Guid.TryParse(matches.Single(), out var providerId))
                {
                    return(providerId);
                }

                return(null);
            }

            async Task <Guid?> TryGetProviderIdFromLegacyContext()
            {
                var ukprn = context.Session.GetInt32("UKPRN");

                return(ukprn.HasValue ? await providerInfoCache.GetProviderIdForUkprn(ukprn.Value) : null);
            }
        }