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); }
// 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); }
// 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)); }