diff --git a/libraries/Bot.Builder.Community.Adapters.Google.Core/ConversationRequestMapper.cs b/libraries/Bot.Builder.Community.Adapters.Google.Core/ConversationRequestMapper.cs index 158e47de..9de68e41 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google.Core/ConversationRequestMapper.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google.Core/ConversationRequestMapper.cs @@ -57,7 +57,7 @@ public Activity RequestToActivity(ConversationRequest request) { activity.Type = ActivityTypes.ConversationUpdate; activity = SetGeneralActivityProperties(activity, request); - activity.MembersAdded = new List() { new ChannelAccount() { Id = activity.From.Id } }; + activity.MembersAdded = new List() { new ChannelAccount() { Id = activity.From?.Id ?? "anonymous" } }; return activity; } diff --git a/libraries/Bot.Builder.Community.Adapters.Google.Core/DialogFlowRequestMapper.cs b/libraries/Bot.Builder.Community.Adapters.Google.Core/DialogFlowRequestMapper.cs index b307dffa..44cc6c0f 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google.Core/DialogFlowRequestMapper.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google.Core/DialogFlowRequestMapper.cs @@ -33,7 +33,7 @@ public Activity RequestToActivity(DialogFlowRequest request) if (string.IsNullOrEmpty(queryText) || request.QueryResult.Intent.DisplayName.ToLowerInvariant() == "launch") { activity.Type = ActivityTypes.ConversationUpdate; - activity.MembersAdded = new List() { new ChannelAccount() { Id = activity.From.Id } }; + activity.MembersAdded = new List() { new ChannelAccount() { Id = activity.From?.Id ?? "anonymous" } }; return activity; } activity.Type = ActivityTypes.Message; diff --git a/libraries/Bot.Builder.Community.Adapters.Google.Core/GoogleAuthorizationHandler.cs b/libraries/Bot.Builder.Community.Adapters.Google.Core/GoogleAuthorizationHandler.cs index 8e4d7d4b..ca057690 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google.Core/GoogleAuthorizationHandler.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google.Core/GoogleAuthorizationHandler.cs @@ -18,12 +18,17 @@ public GoogleAuthorizationHandler(ILogger logger) _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } - public static bool ValidateActionProjectId(string authorizationHeader, string actionProjectId) + public static bool ValidateActionProjectId(string authorizationHeader, string authorizationValue) { + if (authorizationHeader == authorizationValue) + { + return true; + } + var payload = new JwtBuilder().Decode(authorizationHeader); var payloadJObj = JObject.Parse(payload); var aud = (string)payloadJObj["aud"]; - return aud.ToLowerInvariant() == actionProjectId.ToLowerInvariant(); + return aud.ToLowerInvariant() == authorizationValue.ToLowerInvariant(); } } } diff --git a/libraries/Bot.Builder.Community.Adapters.Google.Core/GoogleRequestMapperBase.cs b/libraries/Bot.Builder.Community.Adapters.Google.Core/GoogleRequestMapperBase.cs index 8705a4d9..1bceeed0 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google.Core/GoogleRequestMapperBase.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google.Core/GoogleRequestMapperBase.cs @@ -34,7 +34,7 @@ public Activity SetGeneralActivityProperties(Activity activity, ConversationRequ activity.ServiceUrl = Options.ServiceUrl; activity.Recipient = new ChannelAccount("", "action"); activity.Conversation = new ConversationAccount(false, id: $"{request.Conversation.ConversationId}"); - activity.From = new ChannelAccount(request.GetUserIdFromUserStorage()); + activity.From = null;//new ChannelAccount(request.GetUserIdFromUserStorage()); activity.Id = Guid.NewGuid().ToString(); activity.Timestamp = DateTime.UtcNow; activity.Locale = request.User.Locale; diff --git a/libraries/Bot.Builder.Community.Adapters.Google.Core/Helpers/Extensions.cs b/libraries/Bot.Builder.Community.Adapters.Google.Core/Helpers/Extensions.cs deleted file mode 100644 index 514dff82..00000000 --- a/libraries/Bot.Builder.Community.Adapters.Google.Core/Helpers/Extensions.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using Bot.Builder.Community.Adapters.Google.Core.Model; -using Bot.Builder.Community.Adapters.Google.Core.Model.Request; -using Newtonsoft.Json.Linq; - -namespace Bot.Builder.Community.Adapters.Google.Core.Helpers -{ - public static class Extensions - { - public static void EnsureUniqueUserIdInUserStorage(this ConversationRequest conversationRequest) - { - if (conversationRequest.User.UserStorage == null || !conversationRequest.User.UserStorage.ContainsKey("UserId")) - { - if (conversationRequest.User.UserStorage == null) - { - conversationRequest.User.UserStorage = new JObject(); - } - - conversationRequest.User.UserStorage.Add("UserId", Guid.NewGuid().ToString()); - } - } - - public static string GetUserIdFromUserStorage(this ConversationRequest payload) - { - if (payload.User.UserStorage != null && payload.User.UserStorage.ContainsKey("UserId")) - { - return payload.User.UserStorage["UserId"].ToString(); - } - - return null; - } - } -} diff --git a/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Request/ConversationWebhookRequestSchema.cs b/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Request/ConversationWebhookRequestSchema.cs index 9bd1d98c..d39f59dd 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Request/ConversationWebhookRequestSchema.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Request/ConversationWebhookRequestSchema.cs @@ -95,7 +95,7 @@ public class User public DateTime LastSeen { get; set; } - public JObject UserStorage { get; set; } + public object UserStorage { get; set; } public PackageEntitlement[] PackageEntitlements { get; set; } diff --git a/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Response/ConversationWebhookResponse.cs b/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Response/ConversationWebhookResponse.cs index 8dff7d42..009d2b49 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Response/ConversationWebhookResponse.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Response/ConversationWebhookResponse.cs @@ -6,7 +6,7 @@ namespace Bot.Builder.Community.Adapters.Google.Core.Model.Response public class ConversationWebhookResponse { public string ConversationToken { get; set; } - public JObject UserStorage { get; set; } + public object UserStorage { get; set; } public bool? ResetUserStorage { get; set; } public bool ExpectUserResponse { get; set; } public ExpectedInput[] ExpectedInputs { get; set; } diff --git a/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Response/ResponsePayload.cs b/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Response/ResponsePayload.cs index c54b5d06..fed1ea60 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Response/ResponsePayload.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google.Core/Model/Response/ResponsePayload.cs @@ -13,6 +13,6 @@ public class PayloadContent public bool ExpectUserResponse { get; set; } public RichResponse RichResponse { get; set; } public DialogFlowSystemIntent SystemIntent { get; set; } - public JObject UserStorage { get; set; } + public object UserStorage { get; set; } } } \ No newline at end of file diff --git a/libraries/Bot.Builder.Community.Adapters.Google/GoogleAdapter.cs b/libraries/Bot.Builder.Community.Adapters.Google/GoogleAdapter.cs index 6629a620..b3bfc8c4 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google/GoogleAdapter.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google/GoogleAdapter.cs @@ -65,11 +65,11 @@ public async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpRespons { if (!GoogleAuthorizationHandler.ValidateActionProjectId( httpRequest.Headers["Authorization"], - _options.ActionProjectId)) + _options.WebhookType == GoogleWebhookType.Conversation ? _options.ActionProjectId : _options.DialogFlowAuthorizationHeader)) { _logger.LogError("Failed to validate incoming request. Project ID in authentication header did not match project ID in GoogleAdapterOptions."); throw new AuthenticationException( - "Failed to validate incoming request. Project ID in authentication header did not match project ID in AlexaAdapterOptions"); + "Failed to validate incoming request. Project ID in authentication header did not match project ID in GoogleAdapterOptions"); } } @@ -86,7 +86,7 @@ public async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpRespons { var dialogFlowRequest = JsonConvert.DeserializeObject(body); var requestMapper = new DialogFlowRequestMapper(_requestMapperOptions, _logger); - dialogFlowRequest.OriginalDetectIntentRequest.Payload.EnsureUniqueUserIdInUserStorage(); + //dialogFlowRequest.OriginalDetectIntentRequest.Payload.EnsureUniqueUserIdInUserStorage(); activity = requestMapper.RequestToActivity(dialogFlowRequest); var context = await CreateContextAndRunPipelineAsync(bot, cancellationToken, activity); var response = requestMapper.ActivityToResponse(ProcessOutgoingActivities(context.SentActivities), dialogFlowRequest); @@ -94,13 +94,21 @@ public async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpRespons } else { - var conversationRequest = JsonConvert.DeserializeObject(body); - var requestMapper = new ConversationRequestMapper(_requestMapperOptions, _logger); - conversationRequest.EnsureUniqueUserIdInUserStorage(); - activity = requestMapper.RequestToActivity(conversationRequest); - var context = await CreateContextAndRunPipelineAsync(bot, cancellationToken, activity); - var response = requestMapper.ActivityToResponse(ProcessOutgoingActivities(context.SentActivities), conversationRequest); - responseJson = JsonConvert.SerializeObject(response, JsonSerializerSettings); + try + { + var conversationRequest = JsonConvert.DeserializeObject(body); + var requestMapper = new ConversationRequestMapper(_requestMapperOptions, _logger); + //conversationRequest.EnsureUniqueUserIdInUserStorage(); + activity = requestMapper.RequestToActivity(conversationRequest); + var context = await CreateContextAndRunPipelineAsync(bot, cancellationToken, activity); + var response = requestMapper.ActivityToResponse(ProcessOutgoingActivities(context.SentActivities), conversationRequest); + responseJson = JsonConvert.SerializeObject(response, JsonSerializerSettings); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } } httpResponse.ContentType = "application/json;charset=utf-8"; diff --git a/libraries/Bot.Builder.Community.Adapters.Google/GoogleAdapterOptions.cs b/libraries/Bot.Builder.Community.Adapters.Google/GoogleAdapterOptions.cs index 00c16f3e..f81ca517 100644 --- a/libraries/Bot.Builder.Community.Adapters.Google/GoogleAdapterOptions.cs +++ b/libraries/Bot.Builder.Community.Adapters.Google/GoogleAdapterOptions.cs @@ -13,5 +13,6 @@ public class GoogleAdapterOptions public string ActionProjectId { get; set; } public bool ValidateIncomingRequests { get; set; } = true; + public string DialogFlowAuthorizationHeader { get; set; } } }