diff --git a/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPrompt.cs b/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPrompt.cs index cb4c4d8e93..15241622a8 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPrompt.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPrompt.cs @@ -153,7 +153,8 @@ public static async Task SendOAuthCardAsync(OAuthPromptSettings settings, ITurnC cardActionType = ActionTypes.OpenUrl; } } - else if (!ChannelRequiresSignInLink(turnContext.Activity.ChannelId)) + else if ((settings.ShowSignInLink != null && settings.ShowSignInLink == false) || + (settings.ShowSignInLink == null && !ChannelRequiresSignInLink(turnContext.Activity.ChannelId))) { value = null; } diff --git a/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPromptSettings.cs b/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPromptSettings.cs index da55821a1d..0c434f8949 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPromptSettings.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPromptSettings.cs @@ -52,5 +52,12 @@ public class OAuthPromptSettings /// True if the should automatically end upon receiving /// an invalid message. public bool EndOnInvalidMessage { get; set; } + + /// + /// Gets or sets an optional boolean value to force the display of a Sign In link overriding + /// the default behavior. + /// + /// True to display the SignInLink. + public bool? ShowSignInLink { get; set; } } } diff --git a/libraries/Microsoft.Bot.Builder/Adapters/TestAdapter.cs b/libraries/Microsoft.Bot.Builder/Adapters/TestAdapter.cs index 20f1f412ff..aefc517a18 100644 --- a/libraries/Microsoft.Bot.Builder/Adapters/TestAdapter.cs +++ b/libraries/Microsoft.Bot.Builder/Adapters/TestAdapter.cs @@ -164,7 +164,10 @@ public async Task ProcessActivityAsync(Activity activity, BotCallbackHandler cal activity.Type = ActivityTypes.Message; } - activity.ChannelId = Conversation.ChannelId; + if (activity.ChannelId == null) + { + activity.ChannelId = Conversation.ChannelId; + } if (activity.From == null || activity.From.Id == "unknown" || activity.From.Role == RoleTypes.Bot) { diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Tests/OAuthPromptTests.cs b/tests/Microsoft.Bot.Builder.Dialogs.Tests/OAuthPromptTests.cs index 08e342c13b..ae49ff91c1 100644 --- a/tests/Microsoft.Bot.Builder.Dialogs.Tests/OAuthPromptTests.cs +++ b/tests/Microsoft.Bot.Builder.Dialogs.Tests/OAuthPromptTests.cs @@ -589,6 +589,57 @@ public async Task OAuthPromptRecognizeTokenAsync_WithNullTextMessageActivity_Doe .StartTestAsync(); } + [Theory] + [InlineData(null, Channels.Test, false)] //Do not override; ChannelRequiresSingInLink() returns false; Result: no link + [InlineData(null, Channels.Msteams, true)] //Do not override; ChannelRequiresSingInLink() returns true; Result: show link + [InlineData(false, Channels.Test, false)] //Override: no link; ChannelRequiresSingInLink() returns false; Result: no link + [InlineData(true, Channels.Test, true)] //Override: show link; ChannelRequiresSingInLink() returns false; Result: show link + [InlineData(false, Channels.Msteams, false)] //Override: no link; ChannelRequiresSingInLink() returns true; Result: no link + [InlineData(true, Channels.Msteams, true)] //Override: show link; ChannelRequiresSingInLink() returns true; Result: show link + public async Task OAuthPromptSignInLinkSettingsCases(bool? showSignInLinkValue, string channelId, bool shouldHaveSignInLink) + { + var oAuthPromptSettings = new OAuthPromptSettings(); + oAuthPromptSettings.ShowSignInLink = showSignInLinkValue; + + var convoState = new ConversationState(new MemoryStorage()); + var dialogState = convoState.CreateProperty("dialogState"); + + var adapter = new TestAdapter() + .Use(new AutoSaveStateMiddleware(convoState)); + + // Create new DialogSet + var dialogs = new DialogSet(dialogState); + dialogs.Add(new OAuthPrompt("OAuthPrompt", oAuthPromptSettings)); + + BotCallbackHandler botCallbackHandler = async (turnContext, cancellationToken) => + { + var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); + + var results = await dc.ContinueDialogAsync(cancellationToken); + if (results.Status == DialogTurnStatus.Empty) + { + await dc.PromptAsync("OAuthPrompt", new PromptOptions(), cancellationToken: cancellationToken); + } + }; + + var initialActivity = new Activity() + { + ChannelId = channelId, + Text = "hello" + }; + await new TestFlow(adapter, botCallbackHandler) + .Send(initialActivity) + .AssertReply(activity => + { + Assert.Single(((Activity)activity).Attachments); + Assert.Equal(OAuthCard.ContentType, ((Activity)activity).Attachments[0].ContentType); + var oAuthCard = (OAuthCard)((Activity)activity).Attachments[0].Content; + var cardAction = oAuthCard.Buttons[0]; + Assert.Equal(shouldHaveSignInLink, cardAction.Value != null); + }) + .StartTestAsync(); + } + private async Task OAuthPrompt(IStorage storage) { var convoState = new ConversationState(storage);