Skip to content

Commit 5b73665

Browse files
authored
Updates to Facebook Adapter (#4123)
* - Updated Facebook Adapter to accept Facebook Adapter Options, with an optional param to override the client. - Update code docs and removed error supression for code doc warnings * Updates following review
1 parent 5ce95ae commit 5b73665

23 files changed

+117
-40
lines changed

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookAdapter.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424

2525
namespace Microsoft.Bot.Builder.Adapters.Facebook
2626
{
27+
/// <summary>
28+
/// BotAdapter to allow for handling Facebook App payloads and responses via the Facebook API.
29+
/// </summary>
2730
public class FacebookAdapter : BotAdapter, IBotFrameworkHttpAdapter
2831
{
2932
private const string HubModeSubscribe = "subscribe";
@@ -33,6 +36,7 @@ public class FacebookAdapter : BotAdapter, IBotFrameworkHttpAdapter
3336
/// </summary>
3437
private readonly FacebookClientWrapper _facebookClient;
3538
private readonly ILogger _logger;
39+
private readonly FacebookAdapterOptions _options;
3640

3741
/// <summary>
3842
/// Initializes a new instance of the <see cref="FacebookAdapter"/> class using configuration settings.
@@ -46,19 +50,21 @@ public class FacebookAdapter : BotAdapter, IBotFrameworkHttpAdapter
4650
/// </remarks>
4751
/// <param name="logger">The logger this adapter should use.</param>
4852
public FacebookAdapter(IConfiguration configuration, ILogger logger = null)
49-
: this(new FacebookClientWrapper(new FacebookAdapterOptions(configuration["FacebookVerifyToken"], configuration["FacebookAppSecret"], configuration["FacebookAccessToken"])), logger)
53+
: this(new FacebookAdapterOptions(configuration["FacebookVerifyToken"], configuration["FacebookAppSecret"], configuration["FacebookAccessToken"]), logger)
5054
{
5155
}
5256

5357
/// <summary>
5458
/// Initializes a new instance of the <see cref="FacebookAdapter"/> class using an existing Facebook client.
5559
/// </summary>
56-
/// <param name="facebookClient">A Facebook API interface.</param>
60+
/// <param name="options">Options for the Facebook Adapter.</param>
5761
/// <param name="logger">The logger this adapter should use.</param>
58-
/// <exception cref="ArgumentNullException"><paramref name="facebookClient"/> is null.</exception>
59-
public FacebookAdapter(FacebookClientWrapper facebookClient, ILogger logger = null)
62+
/// <param name="facebookClient">Client used to interact with the Facebook API.</param>
63+
/// <exception cref="ArgumentNullException"><paramref name="options"/> is null.</exception>
64+
public FacebookAdapter(FacebookAdapterOptions options, ILogger logger = null, FacebookClientWrapper facebookClient = null)
6065
{
61-
_facebookClient = facebookClient ?? throw new ArgumentNullException(nameof(facebookClient));
66+
_options = options ?? throw new ArgumentNullException(nameof(options));
67+
_facebookClient = facebookClient ?? new FacebookClientWrapper(options);
6268
_logger = logger ?? NullLogger.Instance;
6369
}
6470

@@ -219,7 +225,7 @@ public override async Task ContinueConversationAsync(ClaimsIdentity claimsIdenti
219225
/// <exception cref="AuthenticationException">The webhook receives message with invalid signature.</exception>
220226
public async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpResponse, IBot bot, CancellationToken cancellationToken = default)
221227
{
222-
if (httpRequest.Query["hub.mode"] == HubModeSubscribe)
228+
if (httpRequest.Query["hub.mode"] == HubModeSubscribe && _options.VerifyIncomingRequests)
223229
{
224230
await _facebookClient.VerifyWebhookAsync(httpRequest, httpResponse, cancellationToken).ConfigureAwait(false);
225231
return;
@@ -232,7 +238,7 @@ public async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpRespons
232238
stringifiedBody = await sr.ReadToEndAsync().ConfigureAwait(false);
233239
}
234240

235-
if (!_facebookClient.VerifySignature(httpRequest, stringifiedBody))
241+
if (!_facebookClient.VerifySignature(httpRequest, stringifiedBody) && _options.VerifyIncomingRequests)
236242
{
237243
await FacebookHelper.WriteAsync(httpResponse, HttpStatusCode.Unauthorized, string.Empty, Encoding.UTF8, cancellationToken).ConfigureAwait(false);
238244
throw new AuthenticationException("WARNING: Webhook received message with invalid signature. Potential malicious behavior!");

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookAdapterOptions.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
namespace Microsoft.Bot.Builder.Adapters.Facebook
88
{
9+
/// <summary>
10+
/// Options class for Facebook Adapter.
11+
/// </summary>
912
public class FacebookAdapterOptions
1013
{
1114
/// <summary>
@@ -56,6 +59,13 @@ public FacebookAdapterOptions(string verifyToken, string appSecret, string acces
5659
/// <value>The access token.</value>
5760
public string FacebookAccessToken { get; set; }
5861

62+
/// <summary>
63+
/// Gets or sets a value indicating whether incoming requests should be verified.
64+
/// Should be set to true in Production but can be set to false for testing or development purposes.
65+
/// </summary>
66+
/// <value>The flag to indicate if incoming requests should be verified.</value>
67+
public bool VerifyIncomingRequests { get; set; } = true;
68+
5969
/// <summary>
6070
/// Throws a <see cref="NotImplementedException"/> exception in all cases.
6171
/// </summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookClientWrapper.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515

1616
namespace Microsoft.Bot.Builder.Adapters.Facebook
1717
{
18+
/// <summary>
19+
/// Client for interacting with the Facebook API.
20+
/// </summary>
1821
public class FacebookClientWrapper
1922
{
2023
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/AttachmentPayload.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
1010
{
11+
/// <summary>
12+
/// Inner Facebook Attachment payload that can be sent as part of a Facebook Attachment on a Facebook message.
13+
/// </summary>
1114
public class AttachmentPayload
1215
{
1316
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/FacebookAttachment.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
77
{
8+
/// <summary>
9+
/// Facebook Attachment object that can be sent as part of a Facebook message.
10+
/// </summary>
811
public class FacebookAttachment
912
{
1013
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/FacebookBotUser.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
77
{
8+
/// <summary>
9+
/// Represents a Facebook Bot User object.
10+
/// </summary>
811
public class FacebookBotUser
912
{
1013
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/FacebookEntry.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
77
{
8+
/// <summary>
9+
/// Represents a Facebook Message Entry.
10+
/// </summary>
811
public class FacebookEntry
912
{
1013
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/FacebookPostback.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
77
{
8+
/// <summary>
9+
/// Represents a Facebook Post Back.
10+
/// </summary>
811
public class FacebookPostBack
912
{
1013
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/FacebookQuickReply.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
88
{
9+
/// <summary>
10+
/// Facebook Quick Reply object that can be sent as part of a Facebook message.
11+
/// </summary>
912
public class FacebookQuickReply
1013
{
1114
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/FacebookRecipient.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
77
{
8+
/// <summary>
9+
/// Facebook Recipient object used as part of a Facebook message.
10+
/// </summary>
811
public class FacebookRecipient
912
{
1013
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/FacebookResponseEvent.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
88
{
9+
/// <summary>
10+
/// Represents the incoming object received from Facebook and processed by the adapter.
11+
/// </summary>
912
public class FacebookResponseEvent
1013
{
1114
/// <summary>
@@ -21,6 +24,10 @@ public class FacebookResponseEvent
2124
/// <value>Array containing event data.</value>
2225
public List<FacebookEntry> Entry { get; } = new List<FacebookEntry>();
2326

27+
/// <summary>
28+
/// Gets the flag to determine if the Entry property should be serialized.
29+
/// </summary>
30+
/// <returns>True if Entry count is greater than zero.</returns>
2431
public bool ShouldSerializeEntry()
2532
{
2633
return Entry.Count > 0;

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/FacebookResponseOk.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents
77
{
8+
/// <summary>
9+
/// Represents the response object received from Facebook API when a message is sent.
10+
/// </summary>
811
public class FacebookResponseOk
912
{
1013
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/Handover/FacebookPassThreadControl.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents.Handover
77
{
8+
/// <summary>
9+
/// Event object sent to Facebook when requesting to pass thread control to another app.
10+
/// </summary>
811
public class FacebookPassThreadControl : FacebookThreadControl
912
{
1013
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/Handover/FacebookTakeThreadControl.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents.Handover
77
{
8+
/// <summary>
9+
/// Event object sent to Facebook when requesting to take thread control from another app.
10+
/// </summary>
811
public class FacebookTakeThreadControl : FacebookThreadControl
912
{
1013
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/Handover/FacebookThreadControl.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents.Handover
66
{
7+
/// <summary>
8+
/// Base event object for thread control request payloads.
9+
/// </summary>
710
public class FacebookThreadControl
811
{
912
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/Handover/HandoverConstants.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33

44
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents.Handover
55
{
6+
/// <summary>
7+
/// Constants used as part of the Facebook handover protocol.
8+
/// </summary>
69
public static class HandoverConstants
710
{
811
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/Templates/Button.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents.Templates
88
{
9+
/// <summary>
10+
/// Facebook button object.
11+
/// </summary>
912
public class Button
1013
{
1114
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookEvents/Templates/DefaultAction.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
namespace Microsoft.Bot.Builder.Adapters.Facebook.FacebookEvents.Templates
88
{
9+
/// <summary>
10+
/// Default action template.
11+
/// </summary>
912
public class DefaultAction
1013
{
1114
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/FacebookHelper.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515

1616
namespace Microsoft.Bot.Builder.Adapters.Facebook
1717
{
18+
/// <summary>
19+
/// Helper class for converting between Bot Framework objects and Facebook API objects.
20+
/// </summary>
1821
public static class FacebookHelper
1922
{
2023
/// <summary>
@@ -58,7 +61,7 @@ public static FacebookMessage ActivityToFacebook(Activity activity)
5861
}
5962
}
6063

61-
if (activity.Attachments != null && activity.Attachments.Count > 0)
64+
if (activity.Attachments != null && activity.Attachments.Count > 0 && facebookMessage.Message != null)
6265
{
6366
var payload = JsonConvert.DeserializeObject<AttachmentPayload>(JsonConvert.SerializeObject(
6467
activity.Attachments[0].Content,

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/Message.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
namespace Microsoft.Bot.Builder.Adapters.Facebook
99
{
10+
/// <summary>
11+
/// Facebook message object used when sending messages via the Facebook API.
12+
/// </summary>
1013
public class Message
1114
{
1215
/// <summary>

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Facebook/Microsoft.Bot.Builder.Adapters.Facebook.csproj

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@
2222
<DebugSymbols>true</DebugSymbols>
2323
</PropertyGroup>
2424

25-
<PropertyGroup>
26-
<!-- These documentation warnings excludes should be removed as part of https://github.com/microsoft/botbuilder-dotnet/issues/4052 -->
27-
<NoWarn>$(NoWarn);CS1591</NoWarn>
28-
</PropertyGroup>
29-
3025
<ItemGroup>
3126
<PackageReference Include="Microsoft.Bot.Builder.Integration.AspNet.Core" Condition=" '$(IsBuildServer)' == '' " Version="$(LocalPackageVersion)" />
3227
<PackageReference Include="Microsoft.Bot.Builder.Integration.AspNet.Core" Condition=" '$(IsBuildServer)' != '' " Version="$(ReleasePackageVersion)" />

libraries/Adapters/Microsoft.Bot.Builder.Adapters.Slack/Microsoft.Bot.Builder.Adapters.Slack.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
<PackageId>Microsoft.Bot.Builder.Adapters.Slack</PackageId>
1616
<Description>Library for connecting bots with Slack.</Description>
1717
<Summary>This library implements C# classes for the Slack adapter.</Summary>
18-
<!-- The SlackAPI package isn't signed, so supress the warning. There seems to not be a way to supress this for ONLY SlackAPI. -->
19-
<NoWarn>$(NoWarn),CS8002</NoWarn>
2018
</PropertyGroup>
2119

2220
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

0 commit comments

Comments
 (0)