private async Task <HttpResponseMessage> RejectMessageFromUnexpectedTenant(Activity activity, ConnectorClient connectorClient)
        {
            //Set the OFFICE_365_TENANT_FILTER key in web.config file with Tenant Information
            //Validate bot for specific teams tenant if any
            string currentTenant = "#ANY#";

            try
            {
                currentTenant = activity.GetTenantId();
            }
            catch (Exception e)
            {
                Trace.TraceError($"Exception from activity.GetTenantId(): {e}");
            }

            if (Middleware.RejectMessageBasedOnTenant(activity, currentTenant))
            {
                Bot.Connector.Activity replyActivity = activity.CreateReply();
                replyActivity.Text = Strings.TenantLevelDeniedAccess;

                await BotConnectorUtility.BuildRetryPolicy().ExecuteAsync(async() =>
                                                                          await connectorClient.Conversations.ReplyToActivityAsync(replyActivity));

                {
                    return(Request.CreateResponse(HttpStatusCode.OK));
                }
            }

            return(null);
        }
Exemplo n.º 2
0
        // Log telemetry about the incoming activity.
        private void LogActivityTelemetry(Activity activity)
        {
            var fromObjectId     = activity.From?.Properties["aadObjectId"]?.ToString();
            var clientInfoEntity = activity.Entities?.Where(e => e.Type == "clientInfo")?.FirstOrDefault();
            var channelData      = (JObject)activity.ChannelData;

            var properties = new Dictionary <string, string>
            {
                { "ActivityId", activity.Id },
                { "ActivityType", activity.Type },
                { "ActivityName", activity.Name },
                { "UserAadObjectId", fromObjectId },
                { "TenantId", activity.GetTenantId() },
                {
                    "ConversationType",
                    string.IsNullOrWhiteSpace(activity.Conversation?.ConversationType) ? "personal" : activity.Conversation.ConversationType
                },
                { "TeamId", channelData?["team"]?["id"]?.ToString() },
                { "SourceName", channelData?["source"]?["name"]?.ToString() },
                { "Locale", clientInfoEntity?.Properties["locale"]?.ToString() },
                { "Platform", clientInfoEntity?.Properties["platform"]?.ToString() },
            };

            this.logProvider.LogEvent("UserActivity", properties);
        }
Exemplo n.º 3
0
        // Handle incoming invoke activities
        private HttpResponseMessage HandleInvokeActivity(Activity activity)
        {
            if (activity.Name == "composeExtension/fetchTask")
            {
                string user      = activity.From.Id;
                string tenant    = activity.GetTenantId();
                string jwt       = this.jwtHelper.GenerateToken(activity.From.Id, activity.From.Properties["aadObjectId"].ToString(), activity.GetTenantId(), this.jwtLifetimeInMinutes);
                string sessionId = Guid.NewGuid().ToString();

                TaskInfo taskInfo = new TaskInfo()
                {
                    Url    = $"https://{this.appBaseDomain}/search?token={jwt}&sessionId={sessionId}&theme={{theme}}",
                    Title  = Strings.MessagingExtensionTitle,
                    Width  = WidthInPixels,
                    Height = HeightInPixels,
                };
                TaskSubmitResponse taskEnvelope = new TaskSubmitResponse()
                {
                    Task = new TaskContinueResult(taskInfo),
                };

                // Log invocation of messaging extension
                this.logProvider.LogEvent("SearchSessionStarted", new Dictionary <string, string>
                {
                    { "SessionId", sessionId },
                });

                return(this.Request.CreateResponse(HttpStatusCode.OK, taskEnvelope));
            }
            else if (activity.Name == "composeExtension/submitAction")
            {
                var jsonSerializerSettings = new JsonSerializerSettings()
                {
                    ContractResolver = new CamelCaseExceptDictionaryKeysResolver(),
                    Formatting       = Formatting.None,
                };
                var reply = ((JObject)activity.Value)["data"].ToString();
                SelectedSearchResult selectedSearchResult = JsonConvert.DeserializeObject <SelectedSearchResult>(reply, jsonSerializerSettings);

                List <AdaptiveFact> facts = new List <AdaptiveFact>();
                foreach (DeserializedAnswer child in selectedSearchResult.Answers)
                {
                    facts.Add(new AdaptiveFact()
                    {
                        Title = Convert.ToString(child.Question + ":"),
                        Value = Convert.ToString(child.Answer),
                    });
                }

                AdaptiveCard card = new AdaptiveCard(AdaptiveCardVersion)
                {
                    Body = new List <AdaptiveElement>()
                    {
                        new AdaptiveContainer()
                        {
                            Items = new List <AdaptiveElement>()
                            {
                                new AdaptiveTextBlock()
                                {
                                    Text   = selectedSearchResult.Question,
                                    Weight = AdaptiveTextWeight.Bolder,
                                    Wrap   = true,
                                    Size   = AdaptiveTextSize.Large,
                                },
                            },
                        },
                        new AdaptiveContainer()
                        {
                            Items = new List <AdaptiveElement>()
                            {
                                new AdaptiveFactSet()
                                {
                                    Facts = facts ?? new List <AdaptiveFact>(),
                                },
                            },
                        },
                    },
                    Actions = new List <AdaptiveAction>()
                    {
                        new AdaptiveOpenUrlAction()
                        {
                            Url   = new Uri(this.CreateListItemUrl(selectedSearchResult.SharePointListUrl, selectedSearchResult.ListItemId)),
                            Title = Strings.ResultCardButtonTitle,
                        },
                    },
                };

                var result = new Attachment()
                {
                    Content     = card,
                    ContentType = AdaptiveCard.ContentType,
                };
                var preview = new ThumbnailCard
                {
                    Title = selectedSearchResult.Question,
                };

                ComposeExtensionResponse composeExtensionResponse = new ComposeExtensionResponse()
                {
                    ComposeExtension = new ComposeExtensionResult()
                    {
                        Attachments = new List <ComposeExtensionAttachment>()
                        {
                            result.ToComposeExtensionAttachment(preview.ToAttachment())
                        },
                        Type             = ComposeExtensionResultType.Result,
                        AttachmentLayout = AttachmentLayoutTypes.List,
                    },
                };

                // Log that the search result was selected and turned into a card
                this.logProvider.LogEvent("SearchResultShared", new Dictionary <string, string>
                {
                    { "KnowledgeBaseId", selectedSearchResult.KBId },
                    { "ListItemId", selectedSearchResult.ListItemId },
                    { "SessionId", selectedSearchResult.SessionId },
                });

                return(this.Request.CreateResponse(HttpStatusCode.OK, composeExtensionResponse));
            }

            return(new HttpResponseMessage(HttpStatusCode.Accepted));
        }