Exemplo n.º 1
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
            ILogger logger,
            ExecutionContext context)
        {
            logger.LogInformation("Messages function received a request.");

            ISettings            settings            = new Settings(logger, context);
            IClippySetRepository clippySetRepository = new ClippySetRepository(logger, settings);
            IClippySetIndexer    clippySetIndexer    = new ClippySetIndexer(logger);
            ICredentialProvider  credentialProvider  = new SimpleCredentialProvider(settings.MicrosoftAppId, null);
            IChannelProvider     channelProvider     = new SimpleChannelProvider();

            Activity activity;

            try
            {
                var authorizationHeader = GetAuthorizationHeader(req);
                activity = await ParseRequestBody(req);

                await JwtTokenValidation.AuthenticateRequest(activity, authorizationHeader, credentialProvider, channelProvider);
            }
            catch (JsonReaderException e)
            {
                logger.LogDebug(e, "JSON parser failed to parse request payload.");
                return(new BadRequestResult());
            }
            catch (UnauthorizedAccessException e)
            {
                logger.LogDebug(e, "Request was not propertly authorized.");
                return(new UnauthorizedResult());
            }

            if (!activity.IsComposeExtensionQuery())
            {
                logger.LogDebug("Request payload was not a compose extension query.");
                return(new BadRequestObjectResult($"Clippy only supports compose extension query activity types."));
            }

            var queryValue = JObject.FromObject(activity.Value).ToObject <ComposeExtensionValue>();
            var query      = queryValue.GetParameterValue();

            var clippySet = await clippySetRepository.FetchClippySetAsync();

            await clippySetIndexer.IndexClippySetAsync(clippySet);

            var clippies = await clippySetIndexer.FindClippiesByQuery(query);

            var result = new ComposeExtensionResponse
            {
                ComposeExtensionResult = new ComposeExtensionResult
                {
                    Type             = "result",
                    AttachmentLayout = "grid",
                    Attachments      = clippies.Select(clippy => new ClippyComposeExtensionCard(clippy).ToAttachment()).ToArray()
                }
            };

            return(new OkObjectResult(result));
        }
        private async Task JwtTokenValidation_ValidateAuthHeader_WithChannelService_Succeeds(string header, string appId, string pwd, string channelService)
        {
            var credentials = new SimpleCredentialProvider(appId, pwd);
            var channel     = new SimpleChannelProvider(channelService);
            var result      = await JwtTokenValidation.ValidateAuthHeader(header, credentials, channel, string.Empty, "https://webchat.botframework.com/", client);

            Assert.True(result.IsAuthenticated);
        }
        private async Task JwtTokenValidation_ValidateAuthHeader_WithChannelService_Throws(string header, string appId, string pwd, string channelService)
        {
            var credentials = new SimpleCredentialProvider(appId, pwd);
            var channel     = new SimpleChannelProvider(channelService);

            await Assert.ThrowsAsync <UnauthorizedAccessException>(
                async() => await JwtTokenValidation.ValidateAuthHeader(
                    header,
                    credentials,
                    channel,
                    string.Empty,
                    "https://webchat.botframework.com/",
                    client));
        }