public static async Task <InvocationMessage> InvocationMessageAsync(this IHttpRequest request,
                                                                            int executionLimit = 1)
        {
            var invocationMessageRef = Ref <InvocationMessage> .SecureRef();

            var referrer = request.TryGetReferer(out Uri refererTmp) ?
                           refererTmp
                    :
                           new Uri(System.Web.HttpUtility.UrlDecode(refererTmp.OriginalString));

            var content = await request.ReadContentAsync();

            var invocationMessage = new InvocationMessage
            {
                invocationRef = invocationMessageRef,
                headers       = request.Headers
                                .Select(hdr => hdr.Key.PairWithValue(hdr.Value.First()))
                                .ToDictionary(),
                requestUri = new Uri(System.Web.HttpUtility.UrlDecode(request.RequestUri.OriginalString)),
                referrer   = referrer,
                content    = content,
                invocationMessageSource = GetInvocationMessageSource(),
                method           = request.Method.Method,
                executionHistory = new KeyValuePair <DateTime, int>[] { },
                executionLimit   = executionLimit,
            };

            return(invocationMessage);

            IRefOptional <InvocationMessage> GetInvocationMessageSource()
            {
                if (!request.TryGetHeader(InvocationMessage.InvocationMessageSourceHeaderKey,
                                          out string invocationMessageSourceStr))
                {
                    return(RefOptional <InvocationMessage> .Empty());
                }

                if (!Guid.TryParse(invocationMessageSourceStr, out Guid invocationMessageSource))
                {
                    return(RefOptional <InvocationMessage> .Empty());
                }

                return(invocationMessageSource.AsRefOptional <InvocationMessage>());
            }
        }
Exemple #2
0
        internal static async Task <TResult> CreateByMethodAndKeyAsync <TResult>(Authorization authorization,
                                                                                 string externalAccountKey, Guid internalAccountId,
                                                                                 Func <TResult> onCreated,
                                                                                 Func <TResult> onAlreadyMapped,
                                                                                 bool shouldRemap = false)
        {
            var accountMapping = new AccountMapping()
            {
                accountId = internalAccountId,
            };

            accountMapping.Method        = authorization.Method; // method is used in the .mappingId
            accountMapping.authorization = authorization.authorizationRef;
            var authorizationLookup = new AuthorizationLookup
            {
                accountMappingRef      = accountMapping.mappingId,
                authorizationLookupRef = authorization.authorizationRef,
            };
            bool created = await authorizationLookup.StorageCreateAsync(
                (idDiscard) =>
            {
                return(true);
            },
                () =>
            {
                // I guess this is cool...
                return(false);
            });

            var lookup = new AccountMappingLookup()
            {
                accountkey       = externalAccountKey,
                accountMappingId = accountMapping.mappingId,
                Method           = authorization.Method,
            };

            accountMapping.accountMappingLookup = await await lookup.StorageCreateAsync(
                (discard) => lookup.accountMappingLookupId.Optional().AsTask(),
                async() =>
            {
                if (!shouldRemap)
                {
                    return(RefOptional <AccountMappingLookup> .Empty());
                }
                return(await lookup.accountMappingLookupId.StorageCreateOrUpdateAsync(
                           async(created, lookupToUpdate, saveAsync) =>
                {
                    lookupToUpdate.accountMappingId = accountMapping.mappingId;
                    await saveAsync(lookupToUpdate);
                    return lookupToUpdate.accountMappingLookupId.Optional();
                }));
            });

            return(await await accountMapping.StorageCreateAsync(
                       createdId =>
            {
                return onCreated().AsTask();
            },
                       async() =>
            {
                if (!shouldRemap)
                {
                    return onAlreadyMapped();
                }
                return await accountMapping.mappingId.StorageCreateOrUpdateAsync(
                    async(created, mapping, saveAsync) =>
                {
                    mapping.accountMappingLookup = accountMapping.accountMappingLookup;
                    mapping.authorization = accountMapping.authorization;
                    await saveAsync(mapping);
                    return onCreated();
                });
            }));
        }
        public static async Task <IHttpResponse> ProcessRequestAsync(
            EastFive.Azure.Auth.Method method,
            IDictionary <string, string> values,
            IAzureApplication application,
            IHttpRequest request,
            IInvokeApplication endpoints,
            IProvideUrl urlHelper,
            Func <Uri, Guid?, IHttpResponse> onRedirect,
            Func <string, IHttpResponse> onAuthorizationnotFound,
            Func <string, IHttpResponse> onCouldNotConnect,
            Func <string, IHttpResponse> onFailure)
        {
            //var authorizationRequestManager = application.AuthorizationRequestManager;

            var telemetry = application.Telemetry;

            telemetry.TrackEvent($"ResponseController.ProcessRequestAsync - Requesting credential manager.");

            var requestId = Guid.NewGuid();

            request.TryGetReferer(out Uri referer);
            var redirection = new Redirection
            {
                webDataRef     = requestId.AsRef <Redirection>(),
                method         = method.authenticationId,
                values         = values,
                redirectedFrom = referer,
            };

            return(await await redirection.StorageCreateAsync(
                       discard =>
            {
                return EastFive.Azure.AppSettings.Auth.PauseRedirections.ConfigurationBoolean(
                    async pauseRedirections =>
                {
                    if (pauseRedirections)
                    {
                        return request.CreateResponse(System.Net.HttpStatusCode.OK, $"All logins have been paused for this system.  Request ID `{requestId}`");
                    }
                    return await ContinueAsync();
                },
                    why => ContinueAsync(),
                    ContinueAsync);

                Task <IHttpResponse> ContinueAsync()
                {
                    var baseUri = request.RequestUri;
                    return AuthenticationAsync(
                        method, values, application, request, endpoints,
                        request.RequestUri,
                        RefOptional <Authorization> .Empty(),
                        (uri, accountIdMaybe, modifier) =>
                    {
                        var response = onRedirect(uri, accountIdMaybe);
                        return modifier(response);
                    },
                        () => onAuthorizationnotFound("Authorization not found"),
                        onCouldNotConnect,
                        onFailure);
                }
            },
                       () => onFailure("GUID NOT UNIQUE").AsTask()));
        }