From 229c711109d00955b38828f7e96e341530a361d3 Mon Sep 17 00:00:00 2001 From: v-royavinash <94480537+v-royavinash@users.noreply.github.com> Date: Wed, 10 May 2023 10:29:34 -0700 Subject: [PATCH] CC v5.4 changes (#1028) * CC v5.4 changes --- Deployment/GCCH/azuredeploy.json | 1419 +++++++++++++++++ Deployment/azuredeploy.json | 3 +- Deployment/azuredeploywithcert.json | 1 + Manifest/manifest_authors.json | 2 +- Manifest/manifest_users.json | 2 +- .../Adapter/CCBotAdapter.cs | 54 + .../Adapter/CCBotAdapterBase.cs | 56 + .../Adapter/CCBotFrameworkHttpAdapter.cs | 80 - .../Configuration/CommericalConfiguration.cs | 40 + .../Configuration/ConfigurationFactory.cs | 38 + .../Configuration/GCCHConfiguration.cs | 40 + .../Configuration/IAppConfiguration.cs | 27 + .../Configuration/TeamsEnvironment.cs | 23 + .../CompanyCommunicator.Common/Constants.cs | 5 - .../Extensions/ServiceCollectionExtension.cs | 68 +- ...ams.Apps.CompanyCommunicator.Common.csproj | 4 +- .../ConfigurationCredentialProvider.cs | 68 +- .../MsalAuthenticationProvider.cs | 10 +- .../Factory/GraphServiceFactory.cs | 11 +- .../Services/MicrosoftGraph/GraphConstants.cs | 10 - .../TeamWork/AppManagerService.cs | 11 +- .../MicrosoftGraph/Users/UsersService.cs | 14 +- .../Conversations/ConversationService.cs | 4 +- .../Services/Teams/Messages/MessageService.cs | 6 +- .../Teams/TeamMembers/TeamMembersService.cs | 4 +- .../FileCardServices/FileCardService.cs | 6 +- .../CompanyCommunicator.Data.Func/Startup.cs | 6 +- .../Activities/HandleExportFailureActivity.cs | 6 +- .../Export/Activities/SendFileCardActivity.cs | 6 +- ....Apps.CompanyCommunicator.Prep.Func.csproj | 2 +- .../Activities/StoreMessageActivity.cs | 2 - .../CompanyCommunicator.Prep.Func/Startup.cs | 16 +- ....Apps.CompanyCommunicator.Send.Func.csproj | 2 +- .../SendFunction.cs | 1 - .../CompanyCommunicator.Send.Func/Startup.cs | 6 +- ...thenticationServiceCollectionExtensions.cs | 4 + .../Authentication/GraphTokenProvider.cs | 12 +- .../Bot/CompanyCommunicatorBotAdapter.cs | 37 +- .../ClientApp/package-lock.json | 2 +- .../ClientApp/package.json | 2 +- .../AuthenticationMetadataController.cs | 12 +- ...soft.Teams.Apps.CompanyCommunicator.csproj | 6 +- Source/CompanyCommunicator/Startup.cs | 17 +- Source/CompanyCommunicator/appsettings.json | 1 + .../MicrosoftGraph/UsersServiceTests.cs | 9 +- .../HandleExportFailureActivityTest.cs | 7 +- .../Activities/SendFileCardActivityTest.cs | 4 +- .../AuthenticationMetadataControllerTest.cs | 9 +- Wiki/Deployment-guide-gcch.md | 323 ++++ Wiki/Deployment-guide.md | 10 +- Wiki/FAQ.md | 6 +- Wiki/Release-notes.md | 7 +- Wiki/images/botchannelgovernment_1.png | Bin 0 -> 104217 bytes Wiki/images/botchannelgovernment_2.png | Bin 0 -> 114439 bytes Wiki/images/botchannelgovernment_3.png | Bin 0 -> 64247 bytes azure-pipelines.yml | 20 + 56 files changed, 2309 insertions(+), 232 deletions(-) create mode 100644 Deployment/GCCH/azuredeploy.json create mode 100644 Source/CompanyCommunicator.Common/Adapter/CCBotAdapter.cs create mode 100644 Source/CompanyCommunicator.Common/Adapter/CCBotAdapterBase.cs delete mode 100644 Source/CompanyCommunicator.Common/Adapter/CCBotFrameworkHttpAdapter.cs create mode 100644 Source/CompanyCommunicator.Common/Configuration/CommericalConfiguration.cs create mode 100644 Source/CompanyCommunicator.Common/Configuration/ConfigurationFactory.cs create mode 100644 Source/CompanyCommunicator.Common/Configuration/GCCHConfiguration.cs create mode 100644 Source/CompanyCommunicator.Common/Configuration/IAppConfiguration.cs create mode 100644 Source/CompanyCommunicator.Common/Configuration/TeamsEnvironment.cs create mode 100644 Wiki/Deployment-guide-gcch.md create mode 100644 Wiki/images/botchannelgovernment_1.png create mode 100644 Wiki/images/botchannelgovernment_2.png create mode 100644 Wiki/images/botchannelgovernment_3.png diff --git a/Deployment/GCCH/azuredeploy.json b/Deployment/GCCH/azuredeploy.json new file mode 100644 index 000000000..868c6b685 --- /dev/null +++ b/Deployment/GCCH/azuredeploy.json @@ -0,0 +1,1419 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "baseResourceName": { + "type": "string", + "minLength": 1, + "metadata": { + "description": "The base name to use for the resources that will be provisioned." + } + }, + "userClientId": { + "type": "string", + "minLength": 36, + "maxLength": 36, + "metadata": { + "description": "The client ID of the user bot Azure AD app, e.g., 123e4567-e89b-12d3-a456-426655440000." + } + }, + "userClientSecret": { + "type": "securestring", + "minLength": 1, + "metadata": { + "description": "The client secret of the user bot Azure AD app." + } + }, + "authorClientId": { + "type": "string", + "minLength": 36, + "maxLength": 36, + "metadata": { + "description": "The client ID of the author bot Azure AD app, e.g., 123e4567-e89b-12d3-a456-426655440000." + } + }, + "authorClientSecret": { + "type": "securestring", + "minLength": 1, + "metadata": { + "description": "The client secret of the author bot Azure AD app." + } + }, + "graphAppId": { + "type": "string", + "minLength": 36, + "maxLength": 36, + "metadata": { + "description": "The client ID of the Microsoft Graph Azure AD app, e.g., 123e4567-e89b-12d3-a456-426655440000." + } + }, + "graphAppSecret": { + "type": "securestring", + "minLength": 1, + "metadata": { + "description": "The client secret of the Microsoft Graph Azure AD app." + } + }, + "senderUPNList": { + "type": "string", + "minLength": 1, + "metadata": { + "description": "Semicolon-delimited list of the user principal names (UPNs) allowed to send messages." + } + }, + "ProactivelyInstallUserApp": { + "defaultValue": true, + "type": "Bool", + "metadata": { + "description": "If proactive app installation should be enabled." + } + }, + "UserAppExternalId": { + "defaultValue": "148a66bb-e83d-425a-927d-09f4299a9274", + "minLength": 1, + "type": "String", + "metadata": { + "description": "User app external ID." + } + }, + "DefaultCulture": { + "defaultValue": "en-US", + "allowedValues": [ + "ar-SA", + "de-DE", + "en-US", + "es-ES", + "fr-FR", + "he-IL", + "ja-JP", + "ko-KR", + "pt-BR", + "ru-RU", + "zh-CN", + "zh-TW" + ], + "minLength": 1, + "type": "String", + "metadata": { + "description": "Default culture." + } + }, + "SupportedCultures": { + "defaultValue": "ar-SA,de-DE,en-US,es-ES,fr-FR,he-IL,ja-JP,ko-KR,pt-BR,ru-RU,zh-CN,zh-TW", + "minLength": 1, + "type": "String", + "metadata": { + "description": "Comma-delimited list of the supported cultures." + } + }, + "customDomainOption": { + "type": "string", + "allowedValues": [ + "Custom domain name (recommended)", + "Azure Front Door" + ], + "defaultValue": "Azure Front Door", + "metadata": { + "description": "How the app will be hosted on a domain that is not *.azurewebsites.net. Azure Front Door is an easy option that the template can set up automatically, but it comes with ongoing monthly costs. " + } + }, + "appDisplayName": { + "type": "string", + "defaultValue": "Company Communicator", + "minLength": 1, + "metadata": { + "description": "The app (and bot) display name." + } + }, + "appDescription": { + "type": "string", + "defaultValue": "Broadcast messages to multiple teams and people in one go", + "minLength": 1, + "metadata": { + "description": "The app (and bot) description." + } + }, + "appIconUrl": { + "type": "string", + "minLength": 1, + "defaultValue": "https://raw.githubusercontent.com/OfficeDev/microsoft-teams-company-communicator-app/main/Manifest/color.png", + "metadata": { + "description": "The link to the icon for the app. It must resolve to a PNG file." + } + }, + "headerText": { + "type": "string", + "defaultValue": "Company Communicator", + "minLength": 1, + "metadata": { + "description": "The header banner text." + } + }, + "headerLogoUrl": { + "type": "string", + "minLength": 1, + "defaultValue": "https://raw.githubusercontent.com/OfficeDev/microsoft-teams-company-communicator-app/main/Source/CompanyCommunicator/ClientApp/src/assets/Images/mslogo.png", + "metadata": { + "description": "The link to the logo for the app. It must resolve to a PNG file." + } + }, + "tenantId": { + "type": "string", + "defaultValue": "[subscription().tenantId]", + "minLength": 1, + "maxLength": 36, + "metadata": { + "description": "The ID of the tenant to which the app will be deployed." + } + }, + "hostingPlanSku": { + "type": "string", + "allowedValues": [ + "Basic", + "Standard", + "Premium" + ], + "defaultValue": "Standard", + "metadata": { + "description": "The pricing tier for the hosting plan." + } + }, + "hostingPlanSize": { + "type": "string", + "allowedValues": [ + "1", + "2", + "3" + ], + "defaultValue": "2", + "metadata": { + "description": "The size of the hosting plan (small, medium, or large)." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Location for all resources." + } + }, + "gitRepoUrl": { + "type": "string", + "metadata": { + "description": "The URL to the GitHub repository to deploy." + }, + "defaultValue": "https://github.com/OfficeDev/microsoft-teams-company-communicator-app.git" + }, + "gitBranch": { + "type": "string", + "metadata": { + "description": "The branch of the GitHub repository to deploy." + }, + "defaultValue": "main" + }, + "serviceBusWebAppRoleNameGuid": { + "defaultValue": "958380b3-630d-4823-b933-f59d92cdcada", + "minLength": 1, + "type": "String", + "metadata": { + "description": "A GUID used to identify the role assignment. This is Default value." + } + }, + "serviceBusPrepFuncRoleNameGuid": { + "defaultValue": "ce6ca916-08e9-4639-bfbe-9d098baf42ca", + "minLength": 1, + "type": "String", + "metadata": { + "description": "A GUID used to identify the role assignment. This is Default value." + } + }, + "serviceBusSendFuncRoleNameGuid": { + "defaultValue": "960365a2-c7bf-4ff3-8887-efa86fe4a163", + "minLength": 1, + "type": "String", + "metadata": { + "description": "A GUID used to identify the role assignment. This is Default value." + } + }, + "serviceBusDataFuncRoleNameGuid": { + "defaultValue": "d42703bc-421d-4d98-bc4d-cd2bb16e5b0a", + "minLength": 1, + "type": "String", + "metadata": { + "description": "A GUID used to identify the role assignment. This is Default value." + } + }, + "storageAccountWebAppRoleNameGuid": { + "defaultValue": "edd0cc48-2cf7-490e-99e8-131311e42030", + "minLength": 1, + "type": "String", + "metadata": { + "description": "A GUID used to identify the role assignment. This is Default value." + } + }, + "storageAccountPrepFuncRoleNameGuid": { + "defaultValue": "9332a9e9-93f4-48d9-8121-d279f30a732e", + "minLength": 1, + "type": "String", + "metadata": { + "description": "A GUID used to identify the role assignment. This is Default value." + } + }, + "storageAccountDataFuncRoleNameGuid": { + "defaultValue": "5b67af51-4a98-47e1-9d22-745069f51a13", + "minLength": 1, + "type": "String", + "metadata": { + "description": "A GUID used to identify the role assignment. This is Default value." + } + } + }, + "variables": { + "botName": "[parameters('baseResourceName')]", + "authorBotName": "[concat(parameters('baseResourceName'), '-author')]", + "botAppName": "[parameters('baseResourceName')]", + "botAppDomain": "[toLower(concat(variables('botAppName'), '.azurewebsites.us'))]", + "botAppUrl": "[concat('https://', variables('botAppDomain'))]", + "hostingPlanName": "[parameters('baseResourceName')]", + "storageAccountName": "[uniquestring(concat(resourceGroup().id, parameters('baseResourceName')))]", + "appInsightsName": "[parameters('baseResourceName')]", + "prepFunctionAppName": "[concat(parameters('baseResourceName'), '-prep-function')]", + "sendFunctionAppName": "[concat(parameters('baseResourceName'), '-function')]", + "dataFunctionAppName": "[concat(parameters('baseResourceName'), '-data-function')]", + "serviceBusNamespaceName": "[parameters('baseResourceName')]", + "serviceBusSendQueueName": "company-communicator-send", + "serviceBusDataQueueName": "company-communicator-data", + "serviceBusPrepareToSendQueueName": "company-communicator-prep", + "serviceBusExportQueueName": "company-communicator-export", + "defaultSASKeyName": "RootManageSharedAccessKey", + "authRuleResourceId": "[resourceId('Microsoft.ServiceBus/namespaces/authorizationRules', variables('serviceBusNamespaceName'), variables('defaultSASKeyName'))]", + "sharedSkus": [ + "Free", + "Shared" + ], + "isSharedPlan": "[contains(variables('sharedSkus'), parameters('hostingPlanSku'))]", + "skuFamily": "[if(equals(parameters('hostingPlanSku'), 'Shared'), 'D', take(parameters('hostingPlanSku'), 1))]", + "useFrontDoor": "[equals(parameters('customDomainOption'), 'Azure Front Door')]", + "frontDoorName": "[parameters('baseResourceName')]", + "frontDoorDomain": "[toLower(concat(variables('frontDoorName'), '.azurefd.us'))]", + "ProactivelyInstallUserApp": "[parameters('ProactivelyInstallUserApp')]", + "UserAppExternalId": "[parameters('UserAppExternalId')]", + "i18n:DefaultCulture": "[parameters('DefaultCulture')]", + "i18n:SupportedCultures": "[parameters('SupportedCultures')]", + "AzureserviceBusDataOwner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '090c5cfd-751d-490a-894a-3ce6f1109419')]", + "StorageBlobDataContributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]", + "keyvaultName": "[concat(variables('botAppName'), 'vault')]", + "keyVaultUrl": "[concat('https://',variables('keyvaultName'), '.vault.usgovcloudapi.net/')]", + "subscriptionTenantId": "[subscription().tenantId]", + "StorageAccountSecretName": "[concat(variables('keyVaultName'), 'StorageAccountConnectionString')]", + "ServiceBusSecretName": "[concat(variables('keyVaultName'), 'ServiceBusConnectionString')]", + "AppInsightsSecretName": "[concat(variables('keyVaultName'),'AppInsightsKey')]", + "UserAppSecretName": "[concat(variables('keyVaultName'),'UserAppPassword')]", + "AuthorAppSecretName": "[concat(variables('keyVaultName'),'AuthorAppPassword')]", + "GraphAppSecretName": "[concat(variables('keyVaultName'),'GraphAppPassword')]", + "StorageAccountSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('StorageAccountSecretName'))]", + "ServiceBusSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('ServiceBusSecretName'))]", + "AppInsightsSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('AppInsightsSecretName'))]", + "UserAppSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('UserAppSecretName'))]", + "AuthorAppSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('AuthorAppSecretName'))]", + "GraphAppSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('GraphAppSecretName'))]", + "netFrameworkVersion": "v6.0", + "ChannelService": "https:botframework.azure.us", + "ForceCompleteMessageDelayInSeconds": "86400", + "GraphBaseUrl": "https://graph.microsoft.us/v1.0", + "GroupsGraphScope": "GroupMember.Read.All", + "OAuthUrl": "https://tokengcch.botframework.azure.us/", + "ToBotFromChannelOpenIdMetadataUrl": "https://login.botframework.azure.us/v1/.well-known/openidconfiguration", + "ToBotFromChannelTokenIssuer": "https://api.botframework.us", + "ToBotFromEmulatorOpenIdMetadataUrl": "https://login.microsoftonline.us/cab8a31a-1906-4287-a0d8-4eef66b95f6e/v2.0/.well-known/openid-configuration", + "ToChannelFromBotLoginUrl": "https://login.microsoftonline.us/MicrosoftServices.onmicrosoft.us", + "ToChannelFromBotOAuthScope": "https://api.botframework.us", + "Instance": "https://login.microsoftonline.us/", + "ValidIssuers": "https://login.microsoftonline.us/TENANT_ID/v2.0,https://sts.windows.net/TENANT_ID/" + + }, + "resources": [ + { + "type": "Microsoft.Storage/storageAccounts", + "name": "[variables('storageAccountName')]", + "apiVersion": "2019-06-01", + "location": "[parameters('location')]", + "kind": "Storage", + "properties": { + "supportsHttpsTrafficOnly": true, + "allowBlobPublicAccess": false, + "minimumTlsVersion": "TLS1_2" + }, + "sku": { + "name": "Standard_LRS" + } + }, + { + "type": "Microsoft.ServiceBus/namespaces", + "apiVersion": "2017-04-01", + "name": "[variables('serviceBusNamespaceName')]", + "location": "[parameters('location')]", + "sku": { + "name": "Basic", + "tier": "Basic" + }, + "resources": [ + { + "type": "Queues", + "apiVersion": "2017-04-01", + "name": "[variables('serviceBusSendQueueName')]", + "dependsOn": [ + "[concat('Microsoft.ServiceBus/namespaces/', variables('serviceBusNamespaceName'))]" + ], + "properties": { + "lockDuration": "PT5M", + "maxSizeInMegabytes": 1024, + "requiresDuplicateDetection": false, + "requiresSession": false, + "defaultMessageTimeToLive": "P14D", + "deadLetteringOnMessageExpiration": false, + "enableBatchedOperations": true, + "duplicateDetectionHistoryTimeWindow": "PT10M", + "maxDeliveryCount": 10, + "status": "Active", + "enablePartitioning": false, + "enableExpress": false + } + }, + { + "type": "Queues", + "apiVersion": "2017-04-01", + "name": "[variables('serviceBusDataQueueName')]", + "dependsOn": [ + "[concat('Microsoft.ServiceBus/namespaces/', variables('serviceBusNamespaceName'))]" + ], + "properties": { + "lockDuration": "PT5M", + "maxSizeInMegabytes": 1024, + "requiresDuplicateDetection": false, + "requiresSession": false, + "defaultMessageTimeToLive": "P14D", + "deadLetteringOnMessageExpiration": false, + "enableBatchedOperations": true, + "duplicateDetectionHistoryTimeWindow": "PT10M", + "maxDeliveryCount": 10, + "status": "Active", + "enablePartitioning": false, + "enableExpress": false + } + }, + { + "type": "Queues", + "apiVersion": "2017-04-01", + "name": "[variables('serviceBusPrepareToSendQueueName')]", + "dependsOn": [ + "[concat('Microsoft.ServiceBus/namespaces/', variables('serviceBusNamespaceName'))]" + ], + "properties": { + "lockDuration": "PT5M", + "maxSizeInMegabytes": 1024, + "requiresDuplicateDetection": false, + "requiresSession": false, + "defaultMessageTimeToLive": "P14D", + "deadLetteringOnMessageExpiration": false, + "enableBatchedOperations": true, + "duplicateDetectionHistoryTimeWindow": "PT10M", + "maxDeliveryCount": 10, + "status": "Active", + "enablePartitioning": false, + "enableExpress": false + } + }, + { + "type": "Queues", + "apiVersion": "2017-04-01", + "name": "[variables('serviceBusExportQueueName')]", + "dependsOn": [ + "[concat('Microsoft.ServiceBus/namespaces/', variables('serviceBusNamespaceName'))]" + ], + "properties": { + "lockDuration": "PT5M", + "maxSizeInMegabytes": 1024, + "requiresDuplicateDetection": false, + "requiresSession": false, + "defaultMessageTimeToLive": "P14D", + "deadLetteringOnMessageExpiration": false, + "enableBatchedOperations": true, + "duplicateDetectionHistoryTimeWindow": "PT10M", + "maxDeliveryCount": 10, + "status": "Active", + "enablePartitioning": false, + "enableExpress": false + } + } + ] + }, + { + "type": "Microsoft.Web/serverfarms", + "apiVersion": "2016-09-01", + "name": "[variables('hostingPlanName')]", + "location": "[parameters('location')]", + "properties": { + "name": "[variables('hostingPlanName')]", + "hostingEnvironment": "", + "numberOfWorkers": 1 + }, + "sku": { + "name": "[if(variables('isSharedPlan'), concat(variables('skuFamily'), '1'), concat(variables('skuFamily'), parameters('hostingPlanSize')))]", + "tier": "[parameters('hostingPlanSku')]", + "size": "[concat(variables('skuFamily'), parameters('hostingPlanSize'))]", + "family": "[variables('skuFamily')]", + "capacity": 0 + } + }, + { + "apiVersion": "2015-05-01", + "name": "[variables('appInsightsName')]", + "type": "Microsoft.Insights/components", + "location": "[parameters('location')]", + "tags": { + "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('botAppName'))]": "Resource" + }, + "properties": { + "Application_Type": "web", + "Request_Source": "rest" + } + }, + { + "apiVersion": "2021-03-01", + "name": "[variables('authorBotName')]", + "type": "Microsoft.BotService/botServices", + "location": "global", + "sku": { + "name": "F0" + }, + "kind": "azurebot", + "properties": { + "displayName": "[concat(parameters('appDisplayName'),'-author')]", + "description": "[parameters('appDescription')]", + "iconUrl": "[parameters('appIconUrl')]", + "msaAppId": "[parameters('authorClientId')]", + "endpoint": "[concat(variables('botAppUrl'), '/api/messages/author')]", + "developerAppInsightKey": "[reference(resourceId('Microsoft.Insights/components', variables('appInsightsName')), '2015-05-01').InstrumentationKey]" + }, + "resources": [ + { + "name": "[concat(variables('authorBotName'), '/MsTeamsChannel')]", + "type": "Microsoft.BotService/botServices/channels", + "apiVersion": "2021-03-01", + "location": "global", + "sku": { + "name": "F0" + }, + "properties": { + "channelName": "MsTeamsChannel", + "location": "global", + "properties": { + "isEnabled": true + } + }, + "dependsOn": [ + "[concat('Microsoft.BotService/botServices/', variables('authorBotName'))]" + ] + } + ] + }, + { + "apiVersion": "2021-03-01", + "name": "[variables('botName')]", + "type": "Microsoft.BotService/botServices", + "location": "global", + "sku": { + "name": "F0" + }, + "kind": "azurebot", + "properties": { + "displayName": "[parameters('appDisplayName')]", + "description": "[parameters('appDescription')]", + "iconUrl": "[parameters('appIconUrl')]", + "msaAppId": "[parameters('userClientId')]", + "endpoint": "[concat(variables('botAppUrl'), '/api/messages/user')]", + "developerAppInsightKey": "[reference(resourceId('Microsoft.Insights/components', variables('appInsightsName')), '2015-05-01').InstrumentationKey]" + }, + "resources": [ + { + "name": "[concat(variables('botName'), '/MsTeamsChannel')]", + "type": "Microsoft.BotService/botServices/channels", + "apiVersion": "2021-03-01", + "location": "global", + "sku": { + "name": "F0" + }, + "properties": { + "channelName": "MsTeamsChannel", + "location": "global", + "properties": { + "isEnabled": true + } + }, + "dependsOn": [ + "[concat('Microsoft.BotService/botServices/', variables('botName'))]" + ] + } + ] + }, + { + "apiVersion": "2016-08-01", + "type": "Microsoft.Web/sites", + "name": "[variables('botAppName')]", + "location": "[parameters('location')]", + "kind": "app", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "name": "[variables('botAppName')]", + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", + "enabled": true, + "reserved": false, + "clientAffinityEnabled": true, + "clientCertEnabled": false, + "hostNamesDisabled": false, + "containerSize": 0, + "dailyMemoryTimeQuota": 0, + "httpsOnly": true, + "siteConfig": { + "ftpsState": "Disabled", + "alwaysOn": "[not(variables('isSharedPlan'))]", + "cors": { + "supportCredentials": true, + "allowedOrigins": [ + "[concat('https://', variables('frontDoorDomain'))]" + ] + }, + "metadata": [ + { + "name": "CURRENT_STACK", + "value": "dotnet" + } + ], + "netFrameworkVersion": "v6.0.100" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", + "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]", + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]", + "[resourceId('Microsoft.Web/sites', variables('prepFunctionAppName'))]", + "[resourceId('Microsoft.Web/sites', variables('sendFunctionAppName'))]", + "[resourceId('Microsoft.Web/sites', variables('dataFunctionAppName'))]" + ], + "resources": [ + { + "apiVersion": "2015-08-01", + "name": "appsettings", + "type": "config", + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('botAppName'))]", + "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]", + "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('StorageAccountSecretName'))]", + "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('ServiceBusSecretName'))]" + ], + "properties": { + "PROJECT": "Source/CompanyCommunicator/Microsoft.Teams.Apps.CompanyCommunicator.csproj", + "SITE_ROLE": "app", + "i18n:DefaultCulture": "[variables('i18n:DefaultCulture')]", + "i18n:SupportedCultures": "[variables('i18n:SupportedCultures')]", + "ProactivelyInstallUserApp": "[variables('ProactivelyInstallUserApp')]", + "UserAppExternalId": "[variables('UserAppExternalId')]", + "AzureAd:TenantId": "[parameters('tenantId')]", + "AzureAd:ClientId": "[parameters('graphAppId')]", + "AzureAd:ClientSecret": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('GraphAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "AzureAd:ApplicationIdURI": "[if(variables('useFrontDoor'), concat('api://', variables('frontDoorDomain')), '')]", + "AzureAd:Instance": "[variables('Instance')]", + "AzureAd:ValidIssuers": "[variables('ValidIssuers')]", + "UserAppId": "[parameters('userClientId')]", + "UserAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('UserAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "AuthorAppId": "[parameters('authorClientId')]", + "AuthorAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AuthorAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "GraphAppId": "[parameters('graphAppId')]", + "GraphAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('GraphAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "StorageAccountConnectionString": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('StorageAccountSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "ServiceBusConnection": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('ServiceBusSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "ServiceBusNamespace": "[concat(variables('serviceBusNamespaceName'),'.servicebus.usgovcloudapi.net')]", + "StorageAccountName": "[variables('storageAccountName')]", + "UseManagedIdentity": "true", + "AllowedTenants": "[parameters('tenantId')]", + "DisableTenantFilter": "false", + "AuthorizedCreatorUpns": "[parameters('senderUPNList')]", + "UseCertificate": "false", + "DisableAuthentication": "false", + "DisableCreatorUpnCheck": "false", + "WEBSITE_LOAD_CERTIFICATES": "*", + "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AppInsightsSecretResourceId'), '2015-06-01').secretUriWithVersion, ')')]", + "WEBSITE_NODE_DEFAULT_VERSION": "16.13.0", + "WEBSITE_NPM_DEFAULT_VERSION": "8.19.2", + "KeyVault:Url": "[variables('keyVaultUrl')]", + "DOTNET_ADD_GLOBAL_TOOLS_TO_PATH": "false", + "REACT_APP_HEADERTEXT": "[parameters('headerText')]", + "REACT_APP_HEADERIMAGE": "[parameters('headerLogoUrl')]", + "APPLICATIONINSIGHTS_CONNECTION_STRING": "[concat('InstrumentationKey=',reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey,';EndpointSuffix=applicationinsights.us;IngestionEndpoint=https://usgovvirginia-0.in.applicationinsights.azure.us/;AADAudience=https://monitor.azure.us/')]", + "ForceCompleteMessageDelayInSeconds": "[variables('ForceCompleteMessageDelayInSeconds')]", + "ChannelService": "[variables('ChannelService')]", + "GraphBaseUrl": "[variables('GraphBaseUrl')]", + "GroupsGraphScope": "[variables('GroupsGraphScope')]", + "OAuthUrl": "[variables('OAuthUrl')]", + "TeamsEnvironment": "GCCH", + "ToBotFromChannelOpenIdMetadataUrl": "[variables('ToBotFromChannelOpenIdMetadataUrl')]", + "ToBotFromChannelTokenIssuer": "[variables('ToBotFromChannelTokenIssuer')]", + "ToBotFromEmulatorOpenIdMetadataUrl": "[variables('ToBotFromEmulatorOpenIdMetadataUrl')]", + "ToChannelFromBotLoginUrl": "[variables('ToChannelFromBotLoginUrl')]", + "ToChannelFromBotOAuthScope": "[variables('ToChannelFromBotOAuthScope')]", + "ValidateAuthority": "true" + } + }, + { + "apiVersion": "2016-08-01", + "name": "web", + "type": "sourcecontrols", + "condition": "[not(empty(parameters('gitRepoUrl')))]", + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('botAppName'))]", + "[resourceId('Microsoft.Web/sites/config', variables('botAppName'), 'appsettings')]" + ], + "properties": { + "RepoUrl": "[parameters('gitRepoUrl')]", + "branch": "[parameters('gitBranch')]", + "IsManualIntegration": true + } + } + ] + }, + { + "apiVersion": "2016-08-01", + "type": "Microsoft.Web/sites", + "name": "[variables('prepFunctionAppName')]", + "location": "[parameters('location')]", + "kind": "functionapp", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "name": "[variables('prepFunctionAppName')]", + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", + "hostingEnvironment": "", + "clientAffinityEnabled": false, + "httpsOnly": true, + "siteConfig": { + "ftpsState": "Disabled", + "alwaysOn": "[not(variables('isSharedPlan'))]", + "netFrameworkVersion": "[variables('netFrameworkVersion')]" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]" + ], + "resources": [ + { + "apiVersion": "2015-08-01", + "name": "appsettings", + "type": "config", + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('prepFunctionAppName'))]", + "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]", + "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('StorageAccountSecretName'))]", + "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('ServiceBusSecretName'))]" + ], + "properties": { + "PROJECT": "Source\\CompanyCommunicator.Prep.Func\\Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.csproj", + "SITE_ROLE": "function", + "i18n:DefaultCulture": "[variables('i18n:DefaultCulture')]", + "i18n:SupportedCultures": "[variables('i18n:SupportedCultures')]", + "ProactivelyInstallUserApp": "[variables('ProactivelyInstallUserApp')]", + "UserAppExternalId": "[variables('UserAppExternalId')]", + "AzureAd:TenantId": "[parameters('tenantId')]", + "TenantId": "[parameters('tenantId')]", + "UserAppId": "[parameters('userClientId')]", + "UserAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('UserAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "AuthorAppId": "[parameters('authorClientId')]", + "AuthorAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AuthorAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "GraphAppId": "[parameters('graphAppId')]", + "GraphAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('GraphAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "StorageAccountConnectionString": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('StorageAccountSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "ServiceBusConnection": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('ServiceBusSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "ServiceBusNamespace": "[concat(variables('serviceBusNamespaceName'),'.servicebus.usgovcloudapi.net')]", + "StorageAccountName": "[variables('storageAccountName')]", + "UseManagedIdentity": "true", + "UseCertificate": "false", + "WEBSITE_LOAD_CERTIFICATES": "*", + "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AppInsightsSecretResourceId'), '2015-06-01').secretUriWithVersion, ')')]", + "KeyVault:Url": "[variables('keyVaultUrl')]", + "AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1, ';EndpointSuffix=','core.usgovcloudapi.net')]", + "AzureWebJobsDashboard": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('StorageAccountSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "FUNCTIONS_EXTENSION_VERSION": "~4", + "FUNCTIONS_WORKER_RUNTIME": "dotnet", + "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1, ';EndpointSuffix=','core.usgovcloudapi.net')]", + "WEBSITE_CONTENTSHARE": "[toLower(variables('prepFunctionAppName'))]", + "AzureFunctionsJobHost__extensions__durableTask__maxConcurrentOrchestratorFunctions": "3", + "AzureFunctionsJobHost__extensions__durableTask__maxConcurrentActivityFunctions": "10", + "DOTNET_ADD_GLOBAL_TOOLS_TO_PATH": "false", + "WEBSITE_NODE_DEFAULT_VERSION": "16.13.0", + "APPLICATIONINSIGHTS_CONNECTION_STRING": "[concat('InstrumentationKey=',reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey,';EndpointSuffix=applicationinsights.us;IngestionEndpoint=https://usgovvirginia-0.in.applicationinsights.azure.us/;AADAudience=https://monitor.azure.us/')]", + "ChannelService": "[variables('ChannelService')]", + "GraphBaseUrl": "[variables('GraphBaseUrl')]", + "GroupsGraphScope": "[variables('GroupsGraphScope')]", + "OAuthUrl": "[variables('OAuthUrl')]", + "ToBotFromChannelOpenIdMetadataUrl": "[variables('ToBotFromChannelOpenIdMetadataUrl')]", + "ToBotFromChannelTokenIssuer": "[variables('ToBotFromChannelTokenIssuer')]", + "ToBotFromEmulatorOpenIdMetadataUrl": "[variables('ToBotFromEmulatorOpenIdMetadataUrl')]", + "ToChannelFromBotLoginUrl": "[variables('ToChannelFromBotLoginUrl')]", + "ToChannelFromBotOAuthScope": "[variables('ToChannelFromBotOAuthScope')]", + "TeamsEnvironment": "GCCH", + "ValidateAuthority": "true" + } + }, + { + "apiVersion": "2015-08-01", + "name": "web", + "type": "sourcecontrols", + "condition": "[not(empty(parameters('gitRepoUrl')))]", + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('prepFunctionAppName'))]", + "[resourceId('Microsoft.Web/sites/config', variables('prepFunctionAppName'), 'appsettings')]" + ], + "properties": { + "RepoUrl": "[parameters('gitRepoUrl')]", + "branch": "[parameters('gitBranch')]", + "IsManualIntegration": true + } + } + ] + }, + { + "apiVersion": "2016-08-01", + "type": "Microsoft.Web/sites", + "name": "[variables('sendFunctionAppName')]", + "location": "[parameters('location')]", + "kind": "functionapp", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "name": "[variables('sendFunctionAppName')]", + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", + "hostingEnvironment": "", + "clientAffinityEnabled": false, + "httpsOnly": true, + "siteConfig": { + "ftpsState": "Disabled", + "alwaysOn": "[not(variables('isSharedPlan'))]", + "netFrameworkVersion": "[variables('netFrameworkVersion')]" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]" + ], + "resources": [ + { + "apiVersion": "2015-08-01", + "name": "appsettings", + "type": "config", + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('sendFunctionAppName'))]", + "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]", + "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('StorageAccountSecretName'))]", + "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('ServiceBusSecretName'))]" + ], + "properties": { + "PROJECT": "Source\\CompanyCommunicator.Send.Func\\Microsoft.Teams.Apps.CompanyCommunicator.Send.Func.csproj", + "SITE_ROLE": "function", + "i18n:DefaultCulture": "[variables('i18n:DefaultCulture')]", + "i18n:SupportedCultures": "[variables('i18n:SupportedCultures')]", + "ProactivelyInstallUserApp": "[variables('ProactivelyInstallUserApp')]", + "UserAppId": "[parameters('userClientId')]", + "UserAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('UserAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "StorageAccountConnectionString": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('StorageAccountSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "ServiceBusConnection": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('ServiceBusSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "ServiceBusNamespace": "[concat(variables('serviceBusNamespaceName'),'.servicebus.usgovcloudapi.net')]", + "StorageAccountName": "[variables('storageAccountName')]", + "UseManagedIdentity": "true", + "UseCertificate": "false", + "MaxNumberOfAttempts": "5", + "WEBSITE_LOAD_CERTIFICATES": "*", + "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AppInsightsSecretResourceId'), '2015-06-01').secretUriWithVersion, ')')]", + "KeyVault:Url": "[variables('keyVaultUrl')]", + "AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1, ';EndpointSuffix=','core.usgovcloudapi.net')]", + "AzureWebJobsDashboard": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('StorageAccountSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "FUNCTIONS_EXTENSION_VERSION": "~4", + "FUNCTIONS_WORKER_RUNTIME": "dotnet", + "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1, ';EndpointSuffix=','core.usgovcloudapi.net')]", + "WEBSITE_CONTENTSHARE": "[toLower(variables('sendFunctionAppName'))]", + "DOTNET_ADD_GLOBAL_TOOLS_TO_PATH": "false", + "WEBSITE_NODE_DEFAULT_VERSION": "16.13.0", + "APPLICATIONINSIGHTS_CONNECTION_STRING": "[concat('InstrumentationKey=',reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey,';EndpointSuffix=applicationinsights.us;IngestionEndpoint=https://usgovvirginia-0.in.applicationinsights.azure.us/;AADAudience=https://monitor.azure.us/')]", + "ChannelService": "[variables('ChannelService')]", + "GraphBaseUrl": "[variables('GraphBaseUrl')]", + "GroupsGraphScope": "[variables('GroupsGraphScope')]", + "OAuthUrl": "[variables('OAuthUrl')]", + "ToBotFromChannelOpenIdMetadataUrl": "[variables('ToBotFromChannelOpenIdMetadataUrl')]", + "ToBotFromChannelTokenIssuer": "[variables('ToBotFromChannelTokenIssuer')]", + "ToBotFromEmulatorOpenIdMetadataUrl": "[variables('ToBotFromEmulatorOpenIdMetadataUrl')]", + "ToChannelFromBotLoginUrl": "[variables('ToChannelFromBotLoginUrl')]", + "ToChannelFromBotOAuthScope": "[variables('ToChannelFromBotOAuthScope')]", + "TeamsEnvironment": "GCCH", + "ValidateAuthority": "true" + } + }, + { + "apiVersion": "2015-08-01", + "name": "web", + "type": "sourcecontrols", + "condition": "[not(empty(parameters('gitRepoUrl')))]", + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('sendFunctionAppName'))]", + "[resourceId('Microsoft.Web/sites/config', variables('sendFunctionAppName'), 'appsettings')]" + ], + "properties": { + "RepoUrl": "[parameters('gitRepoUrl')]", + "branch": "[parameters('gitBranch')]", + "IsManualIntegration": true + } + } + ] + }, + { + "apiVersion": "2016-08-01", + "type": "Microsoft.Web/sites", + "name": "[variables('dataFunctionAppName')]", + "location": "[parameters('location')]", + "kind": "functionapp", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "name": "[variables('dataFunctionAppName')]", + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", + "hostingEnvironment": "", + "clientAffinityEnabled": false, + "httpsOnly": true, + "siteConfig": { + "ftpsState": "Disabled", + "alwaysOn": "[not(variables('isSharedPlan'))]", + "netFrameworkVersion": "[variables('netFrameworkVersion')]" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]" + ], + "resources": [ + { + "apiVersion": "2015-08-01", + "name": "appsettings", + "type": "config", + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('dataFunctionAppName'))]", + "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]", + "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('StorageAccountSecretName'))]", + "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('ServiceBusSecretName'))]" + ], + "properties": { + "PROJECT": "Source\\CompanyCommunicator.Data.Func\\Microsoft.Teams.Apps.CompanyCommunicator.Data.Func.csproj", + "SITE_ROLE": "function", + "i18n:DefaultCulture": "[variables('i18n:DefaultCulture')]", + "i18n:SupportedCultures": "[variables('i18n:SupportedCultures')]", + "ProactivelyInstallUserApp": "[variables('ProactivelyInstallUserApp')]", + "UserAppId": "[parameters('userClientId')]", + "UserAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('UserAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "AuthorAppId": "[parameters('authorClientId')]", + "AuthorAppPassword": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AuthorAppSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "StorageAccountConnectionString": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('StorageAccountSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "ServiceBusConnection": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('ServiceBusSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "ServiceBusNamespace": "[concat(variables('serviceBusNamespaceName'),'.servicebus.usgovcloudapi.net')]", + "StorageAccountName": "[variables('storageAccountName')]", + "UseManagedIdentity": "true", + "UseCertificate": "false", + "WEBSITE_LOAD_CERTIFICATES": "*", + "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AppInsightsSecretResourceId'), '2015-06-01').secretUriWithVersion, ')')]", + "KeyVault:Url": "[variables('keyVaultUrl')]", + "AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1, ';EndpointSuffix=','core.usgovcloudapi.net')]", + "AzureWebJobsDashboard": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('StorageAccountSecretResourceId'),'2015-06-01').secretUriWithVersion, ')')]", + "FUNCTIONS_EXTENSION_VERSION": "~4", + "FUNCTIONS_WORKER_RUNTIME": "dotnet", + "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1, ';EndpointSuffix=','core.usgovcloudapi.net')]", + "WEBSITE_CONTENTSHARE": "[toLower(variables('dataFunctionAppName'))]", + "CleanUpScheduleTriggerTime": "30 23 * * *", + "CleanUpFile": "1", + "DOTNET_ADD_GLOBAL_TOOLS_TO_PATH": "false", + "WEBSITE_NODE_DEFAULT_VERSION": "16.13.0", + "APPLICATIONINSIGHTS_CONNECTION_STRING": "[concat('InstrumentationKey=',reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey,';EndpointSuffix=applicationinsights.us;IngestionEndpoint=https://usgovvirginia-0.in.applicationinsights.azure.us/;AADAudience=https://monitor.azure.us/')]", + "ChannelService": "[variables('ChannelService')]", + "GraphBaseUrl": "[variables('GraphBaseUrl')]", + "GroupsGraphScope": "[variables('GroupsGraphScope')]", + "OAuthUrl": "[variables('OAuthUrl')]", + "ToBotFromChannelOpenIdMetadataUrl": "[variables('ToBotFromChannelOpenIdMetadataUrl')]", + "ToBotFromChannelTokenIssuer": "[variables('ToBotFromChannelTokenIssuer')]", + "ToBotFromEmulatorOpenIdMetadataUrl": "[variables('ToBotFromEmulatorOpenIdMetadataUrl')]", + "ToChannelFromBotLoginUrl": "[variables('ToChannelFromBotLoginUrl')]", + "ToChannelFromBotOAuthScope": "[variables('ToChannelFromBotOAuthScope')]", + "TeamsEnvironment": "GCCH", + "ValidateAuthority": "true" + } + }, + { + "apiVersion": "2015-08-01", + "name": "web", + "type": "sourcecontrols", + "condition": "[not(empty(parameters('gitRepoUrl')))]", + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('dataFunctionAppName'))]", + "[resourceId('Microsoft.Web/sites/config', variables('dataFunctionAppName'), 'appsettings')]" + ], + "properties": { + "RepoUrl": "[parameters('gitRepoUrl')]", + "branch": "[parameters('gitBranch')]", + "IsManualIntegration": true + } + } + ] + }, + { + "type": "Microsoft.KeyVault/vaults", + "name": "[variables('keyvaultName')]", + "apiVersion": "2016-10-01", + "location": "[parameters('location')]", + + "tags": { + "displayName": "KeyVault" + }, + "properties": { + "tenantId": "[variables('subscriptionTenantId')]", + "enableSoftDelete": true, + "enabledForDeployment": false, + "enabledForDiskEncryption": false, + "enabledForTemplateDeployment": true, + "accessPolicies": [ + { + "tenantId": "[reference(concat('Microsoft.Web/sites/', variables('botAppName')), '2018-02-01', 'Full').identity.tenantId]", + "objectId": "[reference(concat('Microsoft.Web/sites/', variables('botAppName')), '2018-02-01', 'Full').identity.principalId]", + "permissions": { + "keys": [], + "secrets": [ + "Get", + "Set", + "Restore" + ], + "certificates": [] + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('botAppName'))]" + ] + }, + { + "tenantId": "[reference(concat('Microsoft.Web/sites/', variables('prepFunctionAppName')), '2018-02-01', 'Full').identity.tenantId]", + "objectId": "[reference(concat('Microsoft.Web/sites/', variables('prepFunctionAppName')), '2018-02-01', 'Full').identity.principalId]", + "permissions": { + "keys": [], + "secrets": [ + "Get" + ], + "certificates": [ + "Get" + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('prepFunctionAppName'))]" + ] + }, + { + "tenantId": "[reference(concat('Microsoft.Web/sites/', variables('sendFunctionAppName')), '2018-02-01', 'Full').identity.tenantId]", + "objectId": "[reference(concat('Microsoft.Web/sites/', variables('sendFunctionAppName')), '2018-02-01', 'Full').identity.principalId]", + "permissions": { + "keys": [], + "secrets": [ + "Get" + ], + "certificates": [ + "Get" + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('sendFunctionAppName'))]" + ] + }, + { + "tenantId": "[reference(concat('Microsoft.Web/sites/', variables('dataFunctionAppName')), '2018-02-01', 'Full').identity.tenantId]", + "objectId": "[reference(concat('Microsoft.Web/sites/', variables('dataFunctionAppName')), '2018-02-01', 'Full').identity.principalId]", + "permissions": { + "keys": [], + "secrets": [ + "Get" + ], + "certificates": [ + "Get" + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites', variables('dataFunctionAppName'))]" + ] + } + ], + "sku": { + "name": "Standard", + "family": "A" + }, + "networkAcls": { + "bypass": "AzureServices", + "defaultAction": "Allow" + } + }, + "resources": [ + { + "type": "secrets", + "apiVersion": "2016-10-01", + "name": "[variables('StorageAccountSecretName')]", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName'))]", + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" + ], + "properties": { + "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')),'2015-05-01-preview').key1, ';EndpointSuffix=','core.usgovcloudapi.net')]", + "attributes": { + "enabled": true + } + } + }, + { + "type": "secrets", + "apiVersion": "2016-10-01", + "name": "[variables('ServiceBusSecretName')]", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName'))]", + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]" + ], + "properties": { + "value": "[listkeys(variables('authRuleResourceId'), '2017-04-01').primaryConnectionString]", + "attributes": { + "enabled": true + } + } + }, + { + "type": "secrets", + "apiVersion": "2016-10-01", + "name": "[variables('UserAppSecretName')]", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.KeyVault/vaults', variables('keyvaultName'))]" + ], + "properties": { + "value": "[parameters('userClientSecret')]", + "attributes": { + "enabled": true + } + } + }, + { + "type": "secrets", + "apiVersion": "2016-10-01", + "name": "[variables('AuthorAppSecretName')]", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.KeyVault/vaults', variables('keyvaultName'))]" + ], + "properties": { + "value": "[parameters('authorClientSecret')]", + "attributes": { + "enabled": true + } + } + }, + { + "type": "secrets", + "apiVersion": "2016-10-01", + "name": "[variables('GraphAppSecretName')]", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.KeyVault/vaults', variables('keyvaultName'))]" + ], + "properties": { + "value": "[parameters('graphAppSecret')]", + "attributes": { + "enabled": true + } + } + }, + { + "type": "secrets", + "name": "[variables('AppInsightsSecretName')]", + "location": "[parameters('location')]", + "apiVersion": "2018-02-14", + "dependsOn": [ + "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]", + "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]" + ], + "properties": { + "value": "[reference(resourceId('Microsoft.Insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey]", + "attributes": { + "enabled": true + } + } + } + ] + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-04-01-preview", + "name": "[parameters('ServiceBusWebAppRoleNameGuid')]", + "scope": "[concat('Microsoft.ServiceBus/namespaces', '/', variables('serviceBusNamespaceName'))]", + "dependsOn": [ + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]", + "[resourceId('Microsoft.Web/sites', variables('botAppName'))]" + ], + "properties": { + "roleDefinitionId": "[variables('AzureserviceBusDataOwner')]", + "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('botAppName')), '2019-08-01', 'Full').identity.principalId]", + "principalType": "ServicePrincipal" + } + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-04-01-preview", + "name": "[parameters('ServiceBusPrepFuncRoleNameGuid')]", + "scope": "[concat('Microsoft.ServiceBus/namespaces', '/', variables('serviceBusNamespaceName'))]", + "dependsOn": [ + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]", + "[resourceId('Microsoft.Web/sites', variables('prepFunctionAppName'))]" + ], + "properties": { + "roleDefinitionId": "[variables('AzureserviceBusDataOwner')]", + "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('prepFunctionAppName')), '2019-08-01', 'Full').identity.principalId]", + "principalType": "ServicePrincipal" + } + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-04-01-preview", + "name": "[parameters('ServiceBusSendFuncRoleNameGuid')]", + "scope": "[concat('Microsoft.ServiceBus/namespaces', '/', variables('serviceBusNamespaceName'))]", + "dependsOn": [ + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]", + "[resourceId('Microsoft.Web/sites', variables('sendFunctionAppName'))]" + ], + "properties": { + "roleDefinitionId": "[variables('AzureserviceBusDataOwner')]", + "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('sendFunctionAppName')), '2019-08-01', 'Full').identity.principalId]", + "principalType": "ServicePrincipal" + } + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-04-01-preview", + "name": "[parameters('ServiceBusDataFuncRoleNameGuid')]", + "scope": "[concat('Microsoft.ServiceBus/namespaces', '/', variables('serviceBusNamespaceName'))]", + "dependsOn": [ + "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]", + "[resourceId('Microsoft.Web/sites', variables('dataFunctionAppName'))]" + ], + "properties": { + "roleDefinitionId": "[variables('AzureserviceBusDataOwner')]", + "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('dataFunctionAppName')), '2019-08-01', 'Full').identity.principalId]", + "principalType": "ServicePrincipal" + } + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-04-01-preview", + "name": "[parameters('StorageAccountWebAppRoleNameGuid')]", + "scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageAccountName'))]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", + "[resourceId('Microsoft.Web/sites', variables('botAppName'))]" + ], + "properties": { + "roleDefinitionId": "[variables('StorageBlobDataContributor')]", + "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('botAppName')), '2019-08-01', 'Full').identity.principalId]", + "principalType": "ServicePrincipal" + } + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-04-01-preview", + "name": "[parameters('StorageAccountPrepFuncRoleNameGuid')]", + "scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageAccountName'))]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", + "[resourceId('Microsoft.Web/sites', variables('prepFunctionAppName'))]" + ], + "properties": { + "roleDefinitionId": "[variables('StorageBlobDataContributor')]", + "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('prepFunctionAppName')), '2019-08-01', 'Full').identity.principalId]", + "principalType": "ServicePrincipal" + } + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-04-01-preview", + "name": "[parameters('StorageAccountDataFuncRoleNameGuid')]", + "scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageAccountName'))]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", + "[resourceId('Microsoft.Web/sites', variables('dataFunctionAppName'))]" + ], + "properties": { + "roleDefinitionId": "[variables('StorageBlobDataContributor')]", + "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('dataFunctionAppName')), '2019-08-01', 'Full').identity.principalId]", + "principalType": "ServicePrincipal" + } + }, + { + "type": "Microsoft.Network/frontDoors", + "apiVersion": "2021-06-01", + "name": "[variables('frontDoorName')]", + "location": "Global", + "properties": { + "backendPools": [ + { + "id": "[concat(resourceId('Microsoft.Network/frontdoors',variables('frontDoorName')), '/BackendPools/backendPool1')]", + "name": "backendPool1", + "properties": { + "backends": [ + { + "address": "[variables('botAppDomain')]", + "backendHostHeader": "[variables('botAppDomain')]", + "httpPort": 80, + "httpsPort": 443, + "priority": 1, + "weight": 50, + "enabledState": "Enabled" + } + ], + "healthProbeSettings": { + "id": "[concat(resourceId('Microsoft.Network/frontdoors', variables('frontDoorName')), '/healthProbeSettings/healthProbeSettings1')]" + }, + "loadBalancingSettings": { + "id": "[concat(resourceId('Microsoft.Network/frontdoors', variables('frontDoorName')), '/loadBalancingSettings/loadBalancingSettings1')]" + }, + "resourceState": "Enabled" + } + } + ], + "healthProbeSettings": [ + { + "id": "[concat(resourceId('Microsoft.Network/frontdoors', variables('frontDoorName')), '/HealthProbeSettings/healthProbeSettings1')]", + "name": "healthProbeSettings1", + "properties": { + "intervalInSeconds": 255, + "path": "/health", + "protocol": "Https", + "resourceState": "Enabled" + } + } + ], + "frontendEndpoints": [ + { + "id": "[concat(resourceId('Microsoft.Network/frontdoors', variables('frontDoorName')), concat('/frontendEndpoints/', variables('frontDoorName'), '-azurefd-us'))]", + "name": "[concat(variables('frontDoorName'), '-azurefd-us')]", + "properties": { + "hostName": "[concat(variables('frontDoorName'), '.azurefd.us')]", + "sessionAffinityEnabledState": "Disabled", + "sessionAffinityTtlSeconds": 0 + } + } + ], + "loadBalancingSettings": [ + { + "name": "loadBalancingSettings1", + "properties": { + "additionalLatencyMilliseconds": 0, + "sampleSize": 4, + "successfulSamplesRequired": 2 + } + } + ], + "routingRules": [ + { + "name": "routingRule1", + "properties": { + "frontendEndpoints": [ + { + "id": "[concat(resourceId('Microsoft.Network/frontdoors', variables('frontDoorName')), concat('/frontendEndpoints/', variables('frontDoorName'), '-azurefd-us'))]" + } + ], + "acceptedProtocols": [ + "Https" + ], + "patternsToMatch": [ + "/*" + ], + "routeConfiguration": { + "@odata.type": "#Microsoft.Azure.FrontDoor.Models.FrontdoorForwardingConfiguration", + "forwardingProtocol": "HttpsOnly", + "backendPool": { + "id": "[resourceId('Microsoft.Network/frontDoors/backendPools', variables('frontDoorName'), 'backendPool1')]" + } + }, + "enabledState": "Enabled" + } + }, + { + "name": "routingRule2", + "properties": { + "frontendEndpoints": [ + { + "id": "[concat(resourceId('Microsoft.Network/frontdoors', variables('frontDoorName')), concat('/frontendEndpoints/', variables('frontDoorName'), '-azurefd-us'))]" + } + ], + "acceptedProtocols": [ + "Https" + ], + "patternsToMatch": [ + "/api/*" + ], + "routeConfiguration": { + "@odata.type": "#Microsoft.Azure.FrontDoor.Models.FrontdoorRedirectConfiguration", + "customFragment": null, + "customHost": "[variables('botAppDomain')]", + "customPath": "", + "redirectProtocol": "HttpsOnly", + "customQueryString": null, + "redirectType": "PermanentRedirect" + }, + "enabledState": "Enabled" + } + } + ], + "backendPoolsSettings": { + "enforceCertificateNameCheck": "Enabled", + "sendRecvTimeoutSeconds": 30 + }, + "enabledState": "Enabled", + "friendlyName": "[variables('frontDoorName')]", + "resourceState": "Enabled" + + }, + "condition": "[variables('useFrontDoor')]" + } + ], + "outputs": { + "keyVaultName": { + "type": "string", + "value": "[variables('keyvaultName')]" + }, + "authorBotId": { + "type": "string", + "value": "[parameters('authorClientId')]" + }, + "userBotId": { + "type": "string", + "value": "[parameters('userClientId')]" + }, + "appDomain": { + "type": "string", + "value": "[if(variables('useFrontDoor'), variables('frontDoorDomain'), concat('Please create a custom domain name for ', variables('botAppDomain'), ' and use that in the manifest'))]" + } + } +} \ No newline at end of file diff --git a/Deployment/azuredeploy.json b/Deployment/azuredeploy.json index aef89b9e9..18375a26e 100644 --- a/Deployment/azuredeploy.json +++ b/Deployment/azuredeploy.json @@ -317,7 +317,7 @@ "UserAppSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('UserAppSecretName'))]", "AuthorAppSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('AuthorAppSecretName'))]", "GraphAppSecretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('GraphAppSecretName'))]", - "netFrameworkVersion":"v6.0" + "netFrameworkVersion": "v6.0" }, "resources": [ { @@ -633,6 +633,7 @@ "WEBSITE_LOAD_CERTIFICATES": "*", "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AppInsightsSecretResourceId'), '2015-06-01').secretUriWithVersion, ')')]", "WEBSITE_NODE_DEFAULT_VERSION": "16.13.0", + "WEBSITE_NPM_DEFAULT_VERSION": "8.19.2", "KeyVault:Url": "[variables('keyVaultUrl')]", "DOTNET_ADD_GLOBAL_TOOLS_TO_PATH": "false", "REACT_APP_HEADERTEXT": "[parameters('headerText')]", diff --git a/Deployment/azuredeploywithcert.json b/Deployment/azuredeploywithcert.json index 578dea8b2..551a8f084 100644 --- a/Deployment/azuredeploywithcert.json +++ b/Deployment/azuredeploywithcert.json @@ -633,6 +633,7 @@ "WEBSITE_LOAD_CERTIFICATES": "*", "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('AppInsightsSecretResourceId'), '2015-06-01').secretUriWithVersion, ')')]", "WEBSITE_NODE_DEFAULT_VERSION": "16.13.0", + "WEBSITE_NPM_DEFAULT_VERSION": "8.19.2", "KeyVault:Url": "[variables('keyVaultUrl')]", "DOTNET_ADD_GLOBAL_TOOLS_TO_PATH": "false", "REACT_APP_HEADERTEXT": "[parameters('headerText')]", diff --git a/Manifest/manifest_authors.json b/Manifest/manifest_authors.json index f67ba56dd..94d3b1139 100644 --- a/Manifest/manifest_authors.json +++ b/Manifest/manifest_authors.json @@ -1,7 +1,7 @@ { "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", "manifestVersion": "1.5", - "version": "5.3.0", + "version": "5.4.0", "id": "1c07cd26-a088-4db8-8928-ace382fa219f", "packageName": "com.microsoft.teams.companycommunicator.authors", "developer": { diff --git a/Manifest/manifest_users.json b/Manifest/manifest_users.json index 311e3b198..74d76e7fc 100644 --- a/Manifest/manifest_users.json +++ b/Manifest/manifest_users.json @@ -1,7 +1,7 @@ { "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", "manifestVersion": "1.5", - "version": "5.3.0", + "version": "5.4.0", "id": "148a66bb-e83d-425a-927d-09f4299a9274", "packageName": "com.microsoft.teams.companycommunicator", "developer": { diff --git a/Source/CompanyCommunicator.Common/Adapter/CCBotAdapter.cs b/Source/CompanyCommunicator.Common/Adapter/CCBotAdapter.cs new file mode 100644 index 000000000..916e929f4 --- /dev/null +++ b/Source/CompanyCommunicator.Common/Adapter/CCBotAdapter.cs @@ -0,0 +1,54 @@ +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// + +namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Adapter +{ + using System; + using System.Threading; + using System.Threading.Tasks; + using Microsoft.Bot.Builder; + using Microsoft.Bot.Connector.Authentication; + using Microsoft.Bot.Schema; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Secrets; + + /// + /// Bot framework http adapter instance. + /// + public class CCBotAdapter : CCBotAdapterBase + { + private readonly ICertificateProvider certificateProvider; + + /// + /// Initializes a new instance of the class. + /// + /// credential provider. + public CCBotAdapter( + ICertificateProvider certificateProvider, + BotFrameworkAuthentication botFrameworkAuthentication) + : base(botFrameworkAuthentication) + { + this.certificateProvider = certificateProvider; + } + + /// + public override async Task CreateConversationUsingCertificateAsync(string channelId, string serviceUrl, AppCredentials appCredentials, ConversationParameters conversationParameters, BotCallbackHandler callback, CancellationToken cancellationToken) + { + var cert = await this.certificateProvider.GetCertificateAsync(appCredentials.MicrosoftAppId); + var options = new CertificateAppCredentialsOptions() + { + AppId = appCredentials.MicrosoftAppId, + ClientCertificate = cert, + }; + + await this.CreateConversationAsync(appCredentials.MicrosoftAppId, channelId, serviceUrl, null/*audience*/, conversationParameters, callback, cancellationToken); + } + + /// + public override async Task CreateConversationUsingSecretAsync(string channelId, string serviceUrl, MicrosoftAppCredentials credentials, ConversationParameters conversationParameters, BotCallbackHandler callback, CancellationToken cancellationToken) + { + await this.CreateConversationAsync(credentials.MicrosoftAppId, channelId, serviceUrl, null/*audience*/, conversationParameters, callback, cancellationToken); + } + } +} diff --git a/Source/CompanyCommunicator.Common/Adapter/CCBotAdapterBase.cs b/Source/CompanyCommunicator.Common/Adapter/CCBotAdapterBase.cs new file mode 100644 index 000000000..42a32cbf2 --- /dev/null +++ b/Source/CompanyCommunicator.Common/Adapter/CCBotAdapterBase.cs @@ -0,0 +1,56 @@ +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// + +namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Adapter +{ + using System.Threading; + using System.Threading.Tasks; + using Microsoft.Bot.Builder; + using Microsoft.Bot.Builder.Integration.AspNet.Core; + using Microsoft.Bot.Connector.Authentication; + using Microsoft.Bot.Schema; + using Microsoft.Extensions.Logging; + + /// + /// Bot Framework Http Adapter interface. + /// + public abstract class CCBotAdapterBase : CloudAdapter + { + /// + /// Initializes a new instance of the class. + /// + /// Bot Framework Authentication. + /// Logger + protected CCBotAdapterBase(BotFrameworkAuthentication botFrameworkAuthentication, ILogger logger = null) + : base(botFrameworkAuthentication, logger) + { + } + + /// + /// Creates a conversation using app secret on the specified channel. + /// + /// The ID for the channel. + /// The channel's service URL endpoint. + /// The application credentials for the bot. + /// The conversation information to use to create the conversation. + /// The method to call for the resulting bot turn. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A task that represents the work queued to execute. + public abstract Task CreateConversationUsingSecretAsync(string channelId, string serviceUrl, MicrosoftAppCredentials credentials, ConversationParameters conversationParameters, BotCallbackHandler callback, CancellationToken cancellationToken); + + /// + /// Creates a conversation using app certificate on the specified channel. + /// This method can be used to use certificates for authentication. + /// + /// The ID for the channel. + /// The channel's service URL endpoint. + /// The application credentials for the bot. + /// The conversation information to use to create the conversation. + /// The method to call for the resulting bot turn. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// A task that represents the work queued to execute. + public abstract Task CreateConversationUsingCertificateAsync(string channelId, string serviceUrl, AppCredentials appCredentials, ConversationParameters conversationParameters, BotCallbackHandler callback, CancellationToken cancellationToken); + } +} diff --git a/Source/CompanyCommunicator.Common/Adapter/CCBotFrameworkHttpAdapter.cs b/Source/CompanyCommunicator.Common/Adapter/CCBotFrameworkHttpAdapter.cs deleted file mode 100644 index dbd5a955c..000000000 --- a/Source/CompanyCommunicator.Common/Adapter/CCBotFrameworkHttpAdapter.cs +++ /dev/null @@ -1,80 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// - -namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Adapter -{ - using System; - using System.Threading; - using System.Threading.Tasks; - using Microsoft.Bot.Builder; - using Microsoft.Bot.Builder.Integration.AspNet.Core; - using Microsoft.Bot.Connector.Authentication; - using Microsoft.Bot.Schema; - using Microsoft.Teams.Apps.CompanyCommunicator.Common.Secrets; - - /// - /// Bot framework http adapter instance. - /// - public class CCBotFrameworkHttpAdapter : BotFrameworkHttpAdapter, ICCBotFrameworkHttpAdapter - { - private readonly ICertificateProvider certificateProvider; - - /// - /// Initializes a new instance of the class. - /// - /// credential provider. - /// certificate provider. - public CCBotFrameworkHttpAdapter( - ICredentialProvider credentialProvider, - ICertificateProvider certificateProvider) - : base(credentialProvider) - { - this.certificateProvider = certificateProvider; - } - - /// - public async Task CreateConversationUsingCertificateAsync(string channelId, string serviceUrl, AppCredentials appCredentials, ConversationParameters conversationParameters, BotCallbackHandler callback, CancellationToken cancellationToken) - { - var cert = await this.certificateProvider.GetCertificateAsync(appCredentials.MicrosoftAppId); - var options = new CertificateAppCredentialsOptions() - { - AppId = appCredentials.MicrosoftAppId, - ClientCertificate = cert, - }; - - await this.CreateConversationAsync(channelId, serviceUrl, new CertificateAppCredentials(options) as AppCredentials, conversationParameters, callback, cancellationToken); - } - - /// - public async Task CreateConversationUsingSecretAsync(string channelId, string serviceUrl, MicrosoftAppCredentials credentials, ConversationParameters conversationParameters, BotCallbackHandler callback, CancellationToken cancellationToken) - { - await this.CreateConversationAsync(channelId, serviceUrl, credentials, conversationParameters, callback, cancellationToken); - } - - /// - protected override async Task BuildCredentialsAsync(string appId, string oAuthScope = null) - { - appId = appId ?? throw new ArgumentNullException(nameof(appId)); - - if (this.certificateProvider.IsCertificateAuthenticationEnabled()) - { - var cert = await this.certificateProvider.GetCertificateAsync(appId); - var options = new CertificateAppCredentialsOptions() - { - AppId = appId, - ClientCertificate = cert, - OauthScope = oAuthScope, - }; - - var certificateAppCredentials = new CertificateAppCredentials(options) as AppCredentials; - return certificateAppCredentials; - } - else - { - return await base.BuildCredentialsAsync(appId, oAuthScope); - } - } - } -} diff --git a/Source/CompanyCommunicator.Common/Configuration/CommericalConfiguration.cs b/Source/CompanyCommunicator.Common/Configuration/CommericalConfiguration.cs new file mode 100644 index 000000000..4310e1f1b --- /dev/null +++ b/Source/CompanyCommunicator.Common/Configuration/CommericalConfiguration.cs @@ -0,0 +1,40 @@ +namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration +{ + /// + /// App configuration for commercial environment. + /// + public class CommericalConfiguration : IAppConfiguration + { + private readonly string tenantId; + + /// + /// Initializes a new instance of the class. + /// + /// Tenant id. + public CommericalConfiguration(string tenantId) + { + this.tenantId = tenantId ?? throw new System.ArgumentNullException(nameof(tenantId)); + } + + /// + public string AzureAd_Instance => "https://login.microsoftonline.com"; + + /// + public string AzureAd_ValidIssuers => "https://login.microsoftonline.com/TENANT_ID/v2.0,https://sts.windows.net/TENANT_ID/"; + + /// + public string AuthorityUri => $"https://login.microsoftonline.com/{this.tenantId}"; + + /// + public string GraphBaseUrl => "https://graph.microsoft.com/v1.0"; + + /// + public string GraphDefaultScope => "https://graph.microsoft.com/.default"; + + /// + public string GraphUserReadScope => "https://graph.microsoft.com/User.Read openid profile"; + + /// + public string TeamsLicenseId => "57ff2da0-773e-42df-b2af-ffb7a2317929"; + } +} diff --git a/Source/CompanyCommunicator.Common/Configuration/ConfigurationFactory.cs b/Source/CompanyCommunicator.Common/Configuration/ConfigurationFactory.cs new file mode 100644 index 000000000..28a6c1e9e --- /dev/null +++ b/Source/CompanyCommunicator.Common/Configuration/ConfigurationFactory.cs @@ -0,0 +1,38 @@ +namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration +{ + /// + /// Configuration factory returns relevant configuration for a given environment. + /// + public class ConfigurationFactory + { + private readonly string tenantId; + + /// + /// Initializes a new instance of the class. + /// + /// Tenant id. + public ConfigurationFactory(string tenantId) + { + this.tenantId = tenantId ?? throw new System.ArgumentNullException(nameof(tenantId)); + } + + /// + /// Configuration factory returns relevant configuration for a given environment. + /// + /// Teams environment. + /// App configurstion. + public IAppConfiguration GetAppConfiguration(TeamsEnvironment env) + { + switch (env) + { + case TeamsEnvironment.Commercial: + case TeamsEnvironment.GCC: + return new CommericalConfiguration(this.tenantId); + case TeamsEnvironment.GCCH: + return new GCCHConfiguration(this.tenantId); + default: + return new CommericalConfiguration(this.tenantId); + } + } + } +} diff --git a/Source/CompanyCommunicator.Common/Configuration/GCCHConfiguration.cs b/Source/CompanyCommunicator.Common/Configuration/GCCHConfiguration.cs new file mode 100644 index 000000000..30c28c9dd --- /dev/null +++ b/Source/CompanyCommunicator.Common/Configuration/GCCHConfiguration.cs @@ -0,0 +1,40 @@ +namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration +{ + /// + /// App configuration for GCCH environment. + /// + internal class GCCHConfiguration : IAppConfiguration + { + private readonly string tenantId; + + /// + /// Initializes a new instance of the class. + /// + /// TenantId. + public GCCHConfiguration(string tenantId) + { + this.tenantId = tenantId ?? throw new System.ArgumentNullException(nameof(tenantId)); + } + + /// + public string AzureAd_Instance => "https://login.microsoftonline.us/"; + + /// + public string AzureAd_ValidIssuers => $"https://login.microsoftonline.us/{this.tenantId}/v2.0,https://sts.windows.net/{this.tenantId}/"; + + /// + public string AuthorityUri => $"https://login.microsoftonline.us/{this.tenantId}"; + + /// + public string GraphBaseUrl => "https://graph.microsoft.us/v1.0"; + + /// + public string GraphDefaultScope => "https://graph.microsoft.us/.default"; + + /// + public string GraphUserReadScope => "https://graph.microsoft.us/User.Read openid profile"; + + /// + public string TeamsLicenseId => "9953b155-8aef-4c56-92f3-72b0487fce41"; + } +} diff --git a/Source/CompanyCommunicator.Common/Configuration/IAppConfiguration.cs b/Source/CompanyCommunicator.Common/Configuration/IAppConfiguration.cs new file mode 100644 index 000000000..53320ac34 --- /dev/null +++ b/Source/CompanyCommunicator.Common/Configuration/IAppConfiguration.cs @@ -0,0 +1,27 @@ +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// + +namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration +{ + /// + /// App configuration interface. + /// + public interface IAppConfiguration + { + public string AzureAd_Instance { get; } + + public string AzureAd_ValidIssuers { get; } + + public string AuthorityUri { get; } + + public string GraphBaseUrl { get; } + + public string GraphDefaultScope { get; } + + public string GraphUserReadScope { get; } + + public string TeamsLicenseId { get; } + } +} diff --git a/Source/CompanyCommunicator.Common/Configuration/TeamsEnvironment.cs b/Source/CompanyCommunicator.Common/Configuration/TeamsEnvironment.cs new file mode 100644 index 000000000..cd76b208a --- /dev/null +++ b/Source/CompanyCommunicator.Common/Configuration/TeamsEnvironment.cs @@ -0,0 +1,23 @@ +namespace Microsoft.Teams.Apps.CompanyCommunicator.Common +{ + /// + /// Teams environment. + /// + public enum TeamsEnvironment + { + /// + /// Commmercial environment. + /// + Commercial, + + /// + /// GCC - https://learn.microsoft.com/en-us/office365/servicedescriptions/office-365-platform-service-description/office-365-us-government/gcc + /// + GCC, + + /// + /// GCCH - https://learn.microsoft.com/en-us/office365/servicedescriptions/office-365-platform-service-description/office-365-us-government/gcc-high-and-dod + /// + GCCH + } +} diff --git a/Source/CompanyCommunicator.Common/Constants.cs b/Source/CompanyCommunicator.Common/Constants.cs index 4076d1a71..a0acde3ce 100644 --- a/Source/CompanyCommunicator.Common/Constants.cs +++ b/Source/CompanyCommunicator.Common/Constants.cs @@ -60,11 +60,6 @@ public static class Constants /// public const string PermissionTypeKey = "x-api-permission"; - /// - /// get the default graph scope. - /// - public const string ScopeDefault = "https://graph.microsoft.com/.default"; - /// /// get the OData next page link. /// diff --git a/Source/CompanyCommunicator.Common/Extensions/ServiceCollectionExtension.cs b/Source/CompanyCommunicator.Common/Extensions/ServiceCollectionExtension.cs index 7124bdecb..a5dd28ac6 100644 --- a/Source/CompanyCommunicator.Common/Extensions/ServiceCollectionExtension.cs +++ b/Source/CompanyCommunicator.Common/Extensions/ServiceCollectionExtension.cs @@ -14,6 +14,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Extensions using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Identity.Client; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Secrets; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.CommonBot; @@ -41,7 +42,7 @@ public static void AddBlobClient(this IServiceCollection services, bool useManag { // Add using managed identities. services.AddSingleton(sp => new BlobContainerClient( - GetBlobContainerUri(sp.GetService().GetValue("StorageAccountName")), + GetBlobContainerUri(sp.GetService().GetValue("TeamsEnvironment", "Commerical"/*default*/), sp.GetService().GetValue("StorageAccountName")), new DefaultAzureCredential(), options)); } @@ -90,11 +91,12 @@ public static void AddConfidentialClient(this IServiceCollection services, bool { var options = provider.GetRequiredService>(); var certificateProvider = provider.GetRequiredService(); + var appConfiguration = provider.GetRequiredService(); var cert = certificateProvider.GetCertificateAsync(options.Value.ClientId).Result; return ConfidentialClientApplicationBuilder .Create(options.Value.ClientId) .WithCertificate(cert) - .WithAuthority(new Uri($"https://login.microsoftonline.com/{options.Value.TenantId}")) + .WithAuthority(new Uri(appConfiguration.AuthorityUri)) .Build(); }); } @@ -103,21 +105,77 @@ public static void AddConfidentialClient(this IServiceCollection services, bool services.AddSingleton(provider => { var options = provider.GetRequiredService>(); + var appConfiguration = provider.GetRequiredService(); return ConfidentialClientApplicationBuilder .Create(options.Value.ClientId) .WithClientSecret(options.Value.ClientSecret) - .WithAuthority(new Uri($"https://login.microsoftonline.com/{options.Value.TenantId}")) + .WithAuthority(new Uri(appConfiguration.AuthorityUri)) .Build(); }); } } - private static Uri GetBlobContainerUri(string storageAccountName) + /// + /// Adds relevant App configurations for Teams environment. + /// + /// Serivce collection. + /// Configuration. + public static void AddAppConfiguration(this IServiceCollection services, IConfiguration configuration) + { + var tenantId = configuration.GetValue("TenantId") ?? configuration.GetValue("AzureAd:TenantId"); + var env = configuration.GetTeamsEnvironment(); + services.AddSingleton(new ConfigurationFactory(tenantId).GetAppConfiguration(env)); + } + + public static AzureCloudInstance GetAzureCloudInstance(this IConfiguration configuration) + { + var teamsEnv = configuration.GetTeamsEnvironment(); + switch (teamsEnv) + { + case TeamsEnvironment.Commercial: + case TeamsEnvironment.GCC: + return AzureCloudInstance.AzurePublic; + case TeamsEnvironment.GCCH: + return AzureCloudInstance.AzureUsGovernment; + default: + return AzureCloudInstance.AzurePublic; + } + } + + /// + /// Reads Teams environment from the configuration. + /// + /// Configuration. + /// Teams environemnt. + public static TeamsEnvironment GetTeamsEnvironment(this IConfiguration configuration) + { + var envString = configuration.GetValue("TeamsEnvironment", "Commerical"/*default*/); + Enum.TryParse(envString, out TeamsEnvironment teamsEnvironment); + return teamsEnvironment; + } + + private static Uri GetBlobContainerUri(string envString, string storageAccountName) { - return new Uri(string.Format( + Enum.TryParse(envString, out TeamsEnvironment teamsEnvironment); + switch (teamsEnvironment) + { + case TeamsEnvironment.Commercial: + case TeamsEnvironment.GCC: + return new Uri(string.Format( "https://{0}.blob.core.windows.net/{1}", storageAccountName, Common.Constants.BlobContainerName)); + case TeamsEnvironment.GCCH: + return new Uri(string.Format( + "https://{0}.blob.core.usgovcloudapi.net/{1}", + storageAccountName, + Common.Constants.BlobContainerName)); + default: + return new Uri(string.Format( + "https://{0}.blob.core.windows.net/{1}", + storageAccountName, + Common.Constants.BlobContainerName)); + } } } } diff --git a/Source/CompanyCommunicator.Common/Microsoft.Teams.Apps.CompanyCommunicator.Common.csproj b/Source/CompanyCommunicator.Common/Microsoft.Teams.Apps.CompanyCommunicator.Common.csproj index 07d1ba09b..1d5a383fb 100644 --- a/Source/CompanyCommunicator.Common/Microsoft.Teams.Apps.CompanyCommunicator.Common.csproj +++ b/Source/CompanyCommunicator.Common/Microsoft.Teams.Apps.CompanyCommunicator.Common.csproj @@ -25,10 +25,10 @@ - + - + diff --git a/Source/CompanyCommunicator.Common/Services/CommonBot/ConfigurationCredentialProvider.cs b/Source/CompanyCommunicator.Common/Services/CommonBot/ConfigurationCredentialProvider.cs index 92b7d3e1e..77010b78d 100644 --- a/Source/CompanyCommunicator.Common/Services/CommonBot/ConfigurationCredentialProvider.cs +++ b/Source/CompanyCommunicator.Common/Services/CommonBot/ConfigurationCredentialProvider.cs @@ -8,35 +8,50 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.CommonBot using System; using System.Collections.Generic; using System.Linq; + using System.Threading; using System.Threading.Tasks; using Microsoft.Bot.Connector.Authentication; using Microsoft.Extensions.Options; + using Microsoft.Rest; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Secrets; /// /// This class implements ICredentialProvider, which is used by the bot framework to retrieve credential info. /// - public class ConfigurationCredentialProvider : ICredentialProvider + public class ConfigurationCredentialProvider : ServiceClientCredentialsFactory { - private readonly Dictionary credentials; + private readonly Dictionary credentials; + private readonly ICertificateProvider certificateProvider; /// /// Initializes a new instance of the class. /// A constructor that accepts a map of bot id list and credentials. /// /// bot options. - public ConfigurationCredentialProvider(IOptions botOptions) + /// Cert provider. + public ConfigurationCredentialProvider( + IOptions botOptions, + ICertificateProvider certificateProvider) { botOptions = botOptions ?? throw new ArgumentNullException(nameof(botOptions)); - this.credentials = new Dictionary(); + this.credentials = new Dictionary(); if (!string.IsNullOrEmpty(botOptions.Value.UserAppId)) { - this.credentials.Add(botOptions.Value.UserAppId, botOptions.Value.UserAppPassword); + var appId = botOptions.Value.UserAppId; + var password = botOptions.Value.UserAppPassword; + var credFactory = new PasswordServiceClientCredentialFactory(appId, password, string.Empty, null, null); + this.credentials.Add(appId, credFactory); } if (!string.IsNullOrEmpty(botOptions.Value.AuthorAppId)) { - this.credentials.Add(botOptions.Value.AuthorAppId, botOptions.Value.AuthorAppPassword); + var appId = botOptions.Value.AuthorAppId; + var password = botOptions.Value.AuthorAppPassword; + var credFactory = new PasswordServiceClientCredentialFactory(appId, password, string.Empty, null, null); + this.credentials.Add(appId, credFactory); } + + this.certificateProvider = certificateProvider ?? throw new ArgumentNullException(nameof(certificateProvider)); } /// @@ -46,34 +61,53 @@ public ConfigurationCredentialProvider(IOptions botOptions) /// A task that represents the work queued to execute. /// If the task is successful, the result is true if /// is valid for the controller; otherwise, false. - public Task IsValidAppIdAsync(string appId) + public override Task IsValidAppIdAsync(string appId, CancellationToken cancellationToken) { return Task.FromResult(this.credentials.ContainsKey(appId)); } /// - /// Gets the app password for a given bot app ID. + /// Checks whether bot authentication is disabled. /// - /// The ID of the app to get the password for. /// A task that represents the work queued to execute. - /// If the task is successful and the app ID is valid, the result - /// contains the password; otherwise, null. + /// If the task is successful and bot authentication is disabled, the result + /// is true; otherwise, false. /// - public Task GetAppPasswordAsync(string appId) + public override Task IsAuthenticationDisabledAsync(CancellationToken cancellationToken) { - return Task.FromResult(this.credentials.ContainsKey(appId) ? this.credentials[appId] : null); + return Task.FromResult(!this.credentials.Any()); } /// /// Checks whether bot authentication is disabled. /// /// A task that represents the work queued to execute. - /// If the task is successful and bot authentication is disabled, the result - /// is true; otherwise, false. + /// If the task is successful and bot authentication is disabled, the result is true; + /// otherwise, false.This method is async to enable custom implementations that need to call out + /// to serviced to validate the appId / password pair. /// - public Task IsAuthenticationDisabledAsync() + public async override Task CreateCredentialsAsync(string appId, string audience, string loginEndpoint, bool validateAuthority, CancellationToken cancellationToken) { - return Task.FromResult(!this.credentials.Any()); + appId = appId ?? throw new ArgumentNullException(nameof(appId)); + + if (this.certificateProvider.IsCertificateAuthenticationEnabled()) + { + var cert = await this.certificateProvider.GetCertificateAsync(appId); + var options = new CertificateAppCredentialsOptions() + { + AppId = appId, + ClientCertificate = cert, + OauthScope = null, + }; + + var certificateAppCredentials = new CertificateAppCredentials(options) as AppCredentials; + return certificateAppCredentials; + } + else + { + this.credentials.TryGetValue(appId, out ServiceClientCredentialsFactory factory); + return await factory.CreateCredentialsAsync(appId, audience, loginEndpoint, validateAuthority, cancellationToken); + } } } } diff --git a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Authentication/MsalAuthenticationProvider.cs b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Authentication/MsalAuthenticationProvider.cs index 9d236b88a..6da389618 100644 --- a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Authentication/MsalAuthenticationProvider.cs +++ b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Authentication/MsalAuthenticationProvider.cs @@ -12,6 +12,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap using System.Threading.Tasks; using Microsoft.Graph; using Microsoft.Identity.Client; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; /// /// MSAL Authentication provider for graph calls. @@ -19,14 +20,19 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap public class MsalAuthenticationProvider : IAuthenticationProvider { private readonly IConfidentialClientApplication clientApplication; + private readonly IAppConfiguration appConfiguration; /// /// Initializes a new instance of the class. /// /// MSAL.NET token acquisition service for confidential clients. - public MsalAuthenticationProvider(IConfidentialClientApplication clientApplication) + /// App configuration. + public MsalAuthenticationProvider( + IConfidentialClientApplication clientApplication, + IAppConfiguration appConfiguration) { this.clientApplication = clientApplication ?? throw new ArgumentNullException(nameof(clientApplication)); + this.appConfiguration = appConfiguration ?? throw new ArgumentNullException(nameof(appConfiguration)); } /// @@ -45,7 +51,7 @@ public async Task AuthenticateRequestAsync(HttpRequestMessage request) /// The access token. private async Task GetAccesTokenAsync() { - var scopes = new List { Common.Constants.ScopeDefault, }; + var scopes = new List { this.appConfiguration.GraphDefaultScope, }; var result = await this.clientApplication.AcquireTokenForClient(scopes) .ExecuteAsync(); diff --git a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Factory/GraphServiceFactory.cs b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Factory/GraphServiceFactory.cs index 61388069f..6d23ca423 100644 --- a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Factory/GraphServiceFactory.cs +++ b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Factory/GraphServiceFactory.cs @@ -7,6 +7,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap { using System; using Microsoft.Graph; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; /// /// Graph Service Factory. @@ -14,21 +15,25 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap public class GraphServiceFactory : IGraphServiceFactory { private readonly IGraphServiceClient serviceClient; + private readonly IAppConfiguration appConfiguration; /// /// Initializes a new instance of the class. /// /// V1 Graph service client. + /// App configuration. public GraphServiceFactory( - IGraphServiceClient serviceClient) + IGraphServiceClient serviceClient, + IAppConfiguration appConfiguration) { this.serviceClient = serviceClient ?? throw new ArgumentNullException(nameof(serviceClient)); + this.appConfiguration = appConfiguration ?? throw new ArgumentNullException(nameof(appConfiguration)); } /// public IUsersService GetUsersService() { - return new UsersService(this.serviceClient); + return new UsersService(this.serviceClient, this.appConfiguration); } /// @@ -52,7 +57,7 @@ public IChatsService GetChatsService() /// public IAppManagerService GetAppManagerService() { - return new AppManagerService(this.serviceClient); + return new AppManagerService(this.serviceClient, this.appConfiguration); } /// diff --git a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/GraphConstants.cs b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/GraphConstants.cs index 1d0029752..8e91d0088 100644 --- a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/GraphConstants.cs +++ b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/GraphConstants.cs @@ -10,16 +10,6 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap /// public class GraphConstants { - /// - /// Microsoft Graph version 1.0 base Url. - /// - public const string V1BaseUrl = "https://graph.microsoft.com/v1.0"; - - /// - /// Microsoft Graph Beta base url. - /// - public const string BetaBaseUrl = "https://graph.microsoft.com/beta"; - /// /// Max page size. /// diff --git a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/TeamWork/AppManagerService.cs b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/TeamWork/AppManagerService.cs index 854efd2d0..d69d4af4f 100644 --- a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/TeamWork/AppManagerService.cs +++ b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/TeamWork/AppManagerService.cs @@ -10,6 +10,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap using System.Linq; using System.Threading.Tasks; using Microsoft.Graph; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Policies; /// @@ -18,15 +19,19 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap internal class AppManagerService : IAppManagerService { private readonly IGraphServiceClient graphServiceClient; + private readonly IAppConfiguration appConfiguration; /// /// Initializes a new instance of the class. /// /// V1 Graph service client. + /// App configuration. internal AppManagerService( - IGraphServiceClient graphServiceClient) + IGraphServiceClient graphServiceClient, + IAppConfiguration appConfiguration) { this.graphServiceClient = graphServiceClient ?? throw new ArgumentNullException(nameof(graphServiceClient)); + this.appConfiguration = appConfiguration ?? throw new ArgumentNullException(nameof(appConfiguration)); } /// @@ -46,7 +51,7 @@ public async Task InstallAppForUserAsync(string appId, string userId) { AdditionalData = new Dictionary() { - { "teamsApp@odata.bind", $"{GraphConstants.V1BaseUrl}/appCatalogs/teamsApps/{appId}" }, + { "teamsApp@odata.bind", $"{this.appConfiguration.GraphBaseUrl}/appCatalogs/teamsApps/{appId}" }, }, }; @@ -77,7 +82,7 @@ public async Task InstallAppForTeamAsync(string appId, string teamId) { AdditionalData = new Dictionary() { - { "teamsApp@odata.bind", $"{GraphConstants.V1BaseUrl}/appCatalogs/teamsApps/{appId}" }, + { "teamsApp@odata.bind", $"{this.appConfiguration.GraphBaseUrl}/appCatalogs/teamsApps/{appId}" }, }, }; diff --git a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Users/UsersService.cs b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Users/UsersService.cs index 95cd325b1..3ddf77813 100644 --- a/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Users/UsersService.cs +++ b/Source/CompanyCommunicator.Common/Services/MicrosoftGraph/Users/UsersService.cs @@ -12,6 +12,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap using System.Text; using System.Threading.Tasks; using Microsoft.Graph; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; using Newtonsoft.Json.Linq; /// @@ -19,17 +20,20 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGrap /// internal class UsersService : IUsersService { - private const string TeamsLicenseId = "57ff2da0-773e-42df-b2af-ffb7a2317929"; - private readonly IGraphServiceClient graphServiceClient; + private readonly IAppConfiguration appConfiguration; /// /// Initializes a new instance of the class. /// /// graph service client. - internal UsersService(IGraphServiceClient graphServiceClient) + /// App configuration. + internal UsersService( + IGraphServiceClient graphServiceClient, + IAppConfiguration appConfiguration) { this.graphServiceClient = graphServiceClient ?? throw new ArgumentNullException(nameof(graphServiceClient)); + this.appConfiguration = appConfiguration ?? throw new ArgumentNullException(nameof(appConfiguration)); } /// @@ -256,7 +260,7 @@ private IEnumerable GetBatchRequest(IEnumerable string.Equals(sp.ServicePlanId?.ToString(), TeamsLicenseId))) + if (license.ServicePlans.Any(sp => string.Equals(sp.ServicePlanId?.ToString(), this.appConfiguration.TeamsLicenseId))) { return true; } diff --git a/Source/CompanyCommunicator.Common/Services/Teams/Conversations/ConversationService.cs b/Source/CompanyCommunicator.Common/Services/Teams/Conversations/ConversationService.cs index a213b75ea..931df8fd4 100644 --- a/Source/CompanyCommunicator.Common/Services/Teams/Conversations/ConversationService.cs +++ b/Source/CompanyCommunicator.Common/Services/Teams/Conversations/ConversationService.cs @@ -25,7 +25,7 @@ public class ConversationService : IConversationService { private static readonly string MicrosoftTeamsChannelId = "msteams"; - private readonly ICCBotFrameworkHttpAdapter botAdapter; + private readonly CCBotAdapterBase botAdapter; private readonly UserAppCredentials userAppCredentials; private readonly AuthorAppCredentials authorAppCredentials; @@ -36,7 +36,7 @@ public class ConversationService : IConversationService /// The user Microsoft app credentials. /// The author Microsoft app credentials. public ConversationService( - ICCBotFrameworkHttpAdapter botAdapter, + CCBotAdapterBase botAdapter, UserAppCredentials userAppCredentials, AuthorAppCredentials authorAppCredentials) { diff --git a/Source/CompanyCommunicator.Common/Services/Teams/Messages/MessageService.cs b/Source/CompanyCommunicator.Common/Services/Teams/Messages/MessageService.cs index 14bda0836..3b4d342ae 100644 --- a/Source/CompanyCommunicator.Common/Services/Teams/Messages/MessageService.cs +++ b/Source/CompanyCommunicator.Common/Services/Teams/Messages/MessageService.cs @@ -24,7 +24,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.Teams public class MessageService : IMessageService { private readonly string microsoftAppId; - private readonly ICCBotFrameworkHttpAdapter botAdapter; + private readonly CCBotAdapterBase botAdapter; /// /// Initializes a new instance of the class. @@ -33,7 +33,7 @@ public class MessageService : IMessageService /// The bot adapter. public MessageService( IOptions botOptions, - ICCBotFrameworkHttpAdapter botAdapter) + CCBotAdapterBase botAdapter) { this.microsoftAppId = botOptions?.Value?.UserAppId ?? throw new ArgumentNullException(nameof(botOptions)); this.botAdapter = botAdapter ?? throw new ArgumentNullException(nameof(botAdapter)); @@ -83,7 +83,7 @@ public async Task SendMessageAsync( }; await this.botAdapter.ContinueConversationAsync( - botId: this.microsoftAppId, + botAppId: this.microsoftAppId, reference: conversationReference, callback: async (turnContext, cancellationToken) => { diff --git a/Source/CompanyCommunicator.Common/Services/Teams/TeamMembers/TeamMembersService.cs b/Source/CompanyCommunicator.Common/Services/Teams/TeamMembers/TeamMembersService.cs index 186897b35..206bc0079 100644 --- a/Source/CompanyCommunicator.Common/Services/Teams/TeamMembers/TeamMembersService.cs +++ b/Source/CompanyCommunicator.Common/Services/Teams/TeamMembers/TeamMembersService.cs @@ -25,7 +25,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.Teams /// public class TeamMembersService : ITeamMembersService { - private readonly ICCBotFrameworkHttpAdapter botAdapter; + private readonly CCBotAdapterBase botAdapter; private readonly string userAppId; private readonly string authorAppId; @@ -35,7 +35,7 @@ public class TeamMembersService : ITeamMembersService /// Bot adapter. /// Bot options. public TeamMembersService( - ICCBotFrameworkHttpAdapter botAdapter, + CCBotAdapterBase botAdapter, IOptions botOptions) { this.botAdapter = botAdapter ?? throw new ArgumentNullException(nameof(botAdapter)); diff --git a/Source/CompanyCommunicator.Data.Func/Services/FileCardServices/FileCardService.cs b/Source/CompanyCommunicator.Data.Func/Services/FileCardServices/FileCardService.cs index 0de1a6166..ae0cf8ab5 100644 --- a/Source/CompanyCommunicator.Data.Func/Services/FileCardServices/FileCardService.cs +++ b/Source/CompanyCommunicator.Data.Func/Services/FileCardServices/FileCardService.cs @@ -25,7 +25,7 @@ public class FileCardService : IFileCardService { private readonly IUserDataRepository userDataRepository; private readonly string authorAppId; - private readonly ICCBotFrameworkHttpAdapter botAdapter; + private readonly CCBotAdapterBase botAdapter; private readonly IStringLocalizer localizer; /// @@ -37,7 +37,7 @@ public class FileCardService : IFileCardService /// Localization service. public FileCardService( IOptions botOptions, - ICCBotFrameworkHttpAdapter botAdapter, + CCBotAdapterBase botAdapter, IUserDataRepository userDataRepository, IStringLocalizer localizer) { @@ -79,7 +79,7 @@ public async Task DeleteAsync(string userId, string fileConsentId) int maxNumberOfAttempts = 10; await this.botAdapter.ContinueConversationAsync( - botId: this.authorAppId, + botAppId: this.authorAppId, reference: conversationReference, callback: async (turnContext, cancellationToken) => { diff --git a/Source/CompanyCommunicator.Data.Func/Startup.cs b/Source/CompanyCommunicator.Data.Func/Startup.cs index 55271ed20..f0dcbcbd1 100644 --- a/Source/CompanyCommunicator.Data.Func/Startup.cs +++ b/Source/CompanyCommunicator.Data.Func/Startup.cs @@ -94,9 +94,9 @@ public override void Configure(IFunctionsHostBuilder builder) // Add bot services. builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); // Add Secrets. var keyVaultUrl = Environment.GetEnvironmentVariable("KeyVault:Url"); diff --git a/Source/CompanyCommunicator.Prep.Func/Export/Activities/HandleExportFailureActivity.cs b/Source/CompanyCommunicator.Prep.Func/Export/Activities/HandleExportFailureActivity.cs index 9337df16b..f68f2af18 100644 --- a/Source/CompanyCommunicator.Prep.Func/Export/Activities/HandleExportFailureActivity.cs +++ b/Source/CompanyCommunicator.Prep.Func/Export/Activities/HandleExportFailureActivity.cs @@ -34,7 +34,7 @@ public class HandleExportFailureActivity private readonly IStorageClientFactory storageClientFactory; private readonly IUserDataRepository userDataRepository; private readonly string authorAppId; - private readonly ICCBotFrameworkHttpAdapter botAdapter; + private readonly CCBotAdapterBase botAdapter; private readonly IStringLocalizer localizer; /// @@ -50,7 +50,7 @@ public HandleExportFailureActivity( IExportDataRepository exportDataRepository, IStorageClientFactory storageClientFactory, IOptions botOptions, - ICCBotFrameworkHttpAdapter botAdapter, + CCBotAdapterBase botAdapter, IUserDataRepository userDataRepository, IStringLocalizer localizer) { @@ -114,7 +114,7 @@ private async Task SendFailureMessageAsync(string userId) int maxNumberOfAttempts = 10; await this.botAdapter.ContinueConversationAsync( - botId: this.authorAppId, + botAppId: this.authorAppId, reference: conversationReference, callback: async (turnContext, cancellationToken) => { diff --git a/Source/CompanyCommunicator.Prep.Func/Export/Activities/SendFileCardActivity.cs b/Source/CompanyCommunicator.Prep.Func/Export/Activities/SendFileCardActivity.cs index b402b1eda..c59856a07 100644 --- a/Source/CompanyCommunicator.Prep.Func/Export/Activities/SendFileCardActivity.cs +++ b/Source/CompanyCommunicator.Prep.Func/Export/Activities/SendFileCardActivity.cs @@ -32,7 +32,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.Export.Activities public class SendFileCardActivity { private readonly string authorAppId; - private readonly ICCBotFrameworkHttpAdapter botAdapter; + private readonly CCBotAdapterBase botAdapter; private readonly IUserDataRepository userDataRepository; private readonly IConversationService conversationService; private readonly TeamsConversationOptions options; @@ -51,7 +51,7 @@ public class SendFileCardActivity /// Localization service. public SendFileCardActivity( IOptions botOptions, - ICCBotFrameworkHttpAdapter botAdapter, + CCBotAdapterBase botAdapter, IUserDataRepository userDataRepository, IConversationService conversationService, IOptions options, @@ -105,7 +105,7 @@ public async Task SendFileCardActivityAsync( int maxNumberOfAttempts = 10; string consentId = string.Empty; await this.botAdapter.ContinueConversationAsync( - botId: this.authorAppId, + botAppId: this.authorAppId, reference: conversationReference, callback: async (turnContext, cancellationToken) => { diff --git a/Source/CompanyCommunicator.Prep.Func/Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.csproj b/Source/CompanyCommunicator.Prep.Func/Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.csproj index e0fe1906f..46116aec7 100644 --- a/Source/CompanyCommunicator.Prep.Func/Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.csproj +++ b/Source/CompanyCommunicator.Prep.Func/Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.csproj @@ -21,7 +21,7 @@ - + diff --git a/Source/CompanyCommunicator.Prep.Func/PreparingToSend/Activities/StoreMessageActivity.cs b/Source/CompanyCommunicator.Prep.Func/PreparingToSend/Activities/StoreMessageActivity.cs index a125e6a89..0190ab4a3 100644 --- a/Source/CompanyCommunicator.Prep.Func/PreparingToSend/Activities/StoreMessageActivity.cs +++ b/Source/CompanyCommunicator.Prep.Func/PreparingToSend/Activities/StoreMessageActivity.cs @@ -39,7 +39,6 @@ public StoreMessageActivity( this.sendingNotificationDataRepository = notificationRepo ?? throw new ArgumentNullException(nameof(notificationRepo)); this.adaptiveCardCreator = cardCreator ?? throw new ArgumentNullException(nameof(cardCreator)); this.memoryCache = memoryCache ?? throw new ArgumentNullException(nameof(memoryCache)); - } /// @@ -75,7 +74,6 @@ public async Task RunAsync( } notification.ImageLink += imageLink; - } var serializedContent = this.adaptiveCardCreator.CreateAdaptiveCard(notification).ToJson(); diff --git a/Source/CompanyCommunicator.Prep.Func/Startup.cs b/Source/CompanyCommunicator.Prep.Func/Startup.cs index dc27824b5..6d5cf5c38 100644 --- a/Source/CompanyCommunicator.Prep.Func/Startup.cs +++ b/Source/CompanyCommunicator.Prep.Func/Startup.cs @@ -17,8 +17,10 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func using Microsoft.Extensions.DependencyInjection; using Microsoft.Graph; using Microsoft.Identity.Client; + using Microsoft.Teams.Apps.CompanyCommunicator.Common; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Adapter; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Clients; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Extensions; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Repositories; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Repositories.ExportData; @@ -62,6 +64,9 @@ public override void Configure(IFunctionsHostBuilder builder) repositoryOptions.EnsureTableExists = !configuration.GetValue("IsItExpectedThatTableAlreadyExists", false); }); + + builder.Services.AddAppConfiguration(builder.GetContext().Configuration); + builder.Services.AddOptions() .Configure((botOptions, configuration) => { @@ -115,9 +120,9 @@ public override void Configure(IFunctionsHostBuilder builder) // Add bot services. builder.Services.AddSingleton(); builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); // Add repositories. builder.Services.AddSingleton(); @@ -167,6 +172,7 @@ private void AddGraphServices(IFunctionsHostBuilder builder) builder.Services.AddOptions(). Configure((confidentialClientApplicationOptions, configuration) => { + confidentialClientApplicationOptions.AzureCloudInstance = configuration.GetAzureCloudInstance(); confidentialClientApplicationOptions.ClientId = configuration.GetValue("GraphAppId"); confidentialClientApplicationOptions.ClientSecret = configuration.GetValue("GraphAppPassword", string.Empty); confidentialClientApplicationOptions.TenantId = configuration.GetValue("TenantId"); @@ -182,7 +188,9 @@ private void AddGraphServices(IFunctionsHostBuilder builder) // Add Graph Clients. builder.Services.AddSingleton( serviceProvider => - new GraphServiceClient(serviceProvider.GetRequiredService())); + new GraphServiceClient( + serviceProvider.GetRequiredService().GraphBaseUrl, + serviceProvider.GetRequiredService())); // Add Service Factory builder.Services.AddSingleton(); diff --git a/Source/CompanyCommunicator.Send.Func/Microsoft.Teams.Apps.CompanyCommunicator.Send.Func.csproj b/Source/CompanyCommunicator.Send.Func/Microsoft.Teams.Apps.CompanyCommunicator.Send.Func.csproj index c80457578..01e7e0a00 100644 --- a/Source/CompanyCommunicator.Send.Func/Microsoft.Teams.Apps.CompanyCommunicator.Send.Func.csproj +++ b/Source/CompanyCommunicator.Send.Func/Microsoft.Teams.Apps.CompanyCommunicator.Send.Func.csproj @@ -14,7 +14,7 @@ - + diff --git a/Source/CompanyCommunicator.Send.Func/SendFunction.cs b/Source/CompanyCommunicator.Send.Func/SendFunction.cs index 46d19163d..22f28d271 100644 --- a/Source/CompanyCommunicator.Send.Func/SendFunction.cs +++ b/Source/CompanyCommunicator.Send.Func/SendFunction.cs @@ -81,7 +81,6 @@ public SendFunction( this.sendQueue = sendQueue ?? throw new ArgumentNullException(nameof(sendQueue)); this.localizer = localizer ?? throw new ArgumentNullException(nameof(localizer)); this.memoryCache = memoryCache ?? throw new ArgumentNullException(nameof(memoryCache)); - } /// diff --git a/Source/CompanyCommunicator.Send.Func/Startup.cs b/Source/CompanyCommunicator.Send.Func/Startup.cs index 05686d872..f41006ace 100644 --- a/Source/CompanyCommunicator.Send.Func/Startup.cs +++ b/Source/CompanyCommunicator.Send.Func/Startup.cs @@ -84,9 +84,9 @@ public override void Configure(IFunctionsHostBuilder builder) // Add bot services. builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); // Add teams services. builder.Services.AddTransient(); diff --git a/Source/CompanyCommunicator/Authentication/AuthenticationServiceCollectionExtensions.cs b/Source/CompanyCommunicator/Authentication/AuthenticationServiceCollectionExtensions.cs index 2032ed1a8..1af8b109f 100644 --- a/Source/CompanyCommunicator/Authentication/AuthenticationServiceCollectionExtensions.cs +++ b/Source/CompanyCommunicator/Authentication/AuthenticationServiceCollectionExtensions.cs @@ -13,8 +13,11 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Authentication using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; + using Microsoft.Identity.Client; using Microsoft.Identity.Web; using Microsoft.IdentityModel.Tokens; + using Microsoft.Teams.Apps.CompanyCommunicator.Common; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Extensions; /// /// Extension class for registering auth services in DI container. @@ -89,6 +92,7 @@ private static void RegisterAuthenticationServicesWithCertificate( confidentialClientApplicationOptions => { configuration.Bind("AzureAd", confidentialClientApplicationOptions); + confidentialClientApplicationOptions.AzureCloudInstance = configuration.GetAzureCloudInstance(); }) .AddInMemoryTokenCaches(); } diff --git a/Source/CompanyCommunicator/Authentication/GraphTokenProvider.cs b/Source/CompanyCommunicator/Authentication/GraphTokenProvider.cs index b858cfdc6..aca9b1a73 100644 --- a/Source/CompanyCommunicator/Authentication/GraphTokenProvider.cs +++ b/Source/CompanyCommunicator/Authentication/GraphTokenProvider.cs @@ -12,6 +12,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Authentication using System.Threading.Tasks; using Microsoft.Graph; using Microsoft.Identity.Web; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGraph; /// @@ -20,14 +21,19 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Authentication public class GraphTokenProvider : IAuthenticationProvider { private readonly ITokenAcquisition tokenAcquisition; + private readonly IAppConfiguration appConfiguration; /// /// Initializes a new instance of the class. /// /// MSAL.NET token acquisition service. - public GraphTokenProvider(ITokenAcquisition tokenAcquisition) + /// App configuration. + public GraphTokenProvider( + ITokenAcquisition tokenAcquisition, + IAppConfiguration appConfiguration) { this.tokenAcquisition = tokenAcquisition ?? throw new ArgumentNullException(nameof(tokenAcquisition)); + this.appConfiguration = appConfiguration ?? throw new ArgumentNullException(nameof(appConfiguration)); } /// @@ -52,12 +58,12 @@ private async Task GetAccessToken(string permissionType) if (permissionType.Equals(GraphPermissionType.Application.ToString(), StringComparison.CurrentCultureIgnoreCase)) { // we use MSAL.NET to get a token to call the API for application - accessToken = await this.tokenAcquisition.GetAccessTokenForAppAsync(Common.Constants.ScopeDefault); + accessToken = await this.tokenAcquisition.GetAccessTokenForAppAsync(this.appConfiguration.GraphDefaultScope); } else { // we use MSAL.NET to get a token to call the API On Behalf Of the current user - accessToken = await this.tokenAcquisition.GetAccessTokenForUserAsync(new string[] { Common.Constants.ScopeDefault }); + accessToken = await this.tokenAcquisition.GetAccessTokenForUserAsync(new string[] { this.appConfiguration.GraphDefaultScope }); } return accessToken; diff --git a/Source/CompanyCommunicator/Bot/CompanyCommunicatorBotAdapter.cs b/Source/CompanyCommunicator/Bot/CompanyCommunicatorBotAdapter.cs index 1f320f70a..8bfff0824 100644 --- a/Source/CompanyCommunicator/Bot/CompanyCommunicatorBotAdapter.cs +++ b/Source/CompanyCommunicator/Bot/CompanyCommunicatorBotAdapter.cs @@ -6,57 +6,28 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Bot { using System; - using System.Threading.Tasks; using Microsoft.Bot.Builder.Integration.AspNet.Core; using Microsoft.Bot.Connector.Authentication; - using Microsoft.Teams.Apps.CompanyCommunicator.Common.Secrets; /// /// The Company Communicator Bot Adapter. /// - public class CompanyCommunicatorBotAdapter : BotFrameworkHttpAdapter + public class CompanyCommunicatorBotAdapter : CloudAdapter { - private readonly ICertificateProvider certificateProvider; - /// /// Initializes a new instance of the class. /// - /// Credential provider service instance. /// Teams message filter middleware instance. - /// Certificate provider service instance. + /// Bot framework authentication. public CompanyCommunicatorBotAdapter( - ICredentialProvider credentialProvider, CompanyCommunicatorBotFilterMiddleware companyCommunicatorBotFilterMiddleware, - ICertificateProvider certificateProvider) - : base(credentialProvider) + BotFrameworkAuthentication botFrameworkAuthentication) + : base(botFrameworkAuthentication) { companyCommunicatorBotFilterMiddleware = companyCommunicatorBotFilterMiddleware ?? throw new ArgumentNullException(nameof(companyCommunicatorBotFilterMiddleware)); - this.certificateProvider = certificateProvider ?? throw new ArgumentNullException(nameof(certificateProvider)); // Middleware this.Use(companyCommunicatorBotFilterMiddleware); } - - /// - protected override async Task BuildCredentialsAsync(string appId, string oAuthScope = null) - { - appId = appId ?? throw new ArgumentNullException(nameof(appId)); - - if (!this.certificateProvider.IsCertificateAuthenticationEnabled()) - { - return await base.BuildCredentialsAsync(appId, oAuthScope); - } - - var cert = await this.certificateProvider.GetCertificateAsync(appId); - var options = new CertificateAppCredentialsOptions() - { - AppId = appId, - ClientCertificate = cert, - OauthScope = oAuthScope, - }; - - var certificateAppCredentials = new CertificateAppCredentials(options) as AppCredentials; - return certificateAppCredentials; - } } } diff --git a/Source/CompanyCommunicator/ClientApp/package-lock.json b/Source/CompanyCommunicator/ClientApp/package-lock.json index d6a8b4c9b..258e336a7 100644 --- a/Source/CompanyCommunicator/ClientApp/package-lock.json +++ b/Source/CompanyCommunicator/ClientApp/package-lock.json @@ -34869,4 +34869,4 @@ "version": "0.1.0" } } -} +} \ No newline at end of file diff --git a/Source/CompanyCommunicator/ClientApp/package.json b/Source/CompanyCommunicator/ClientApp/package.json index d8becf979..c33a7e384 100644 --- a/Source/CompanyCommunicator/ClientApp/package.json +++ b/Source/CompanyCommunicator/ClientApp/package.json @@ -1,6 +1,6 @@ { "name": "company-communicator", - "version": "5.3.0", + "version": "5.4.0", "private": true, "dependencies": { "@fluentui/react-northstar": "^0.52.0", diff --git a/Source/CompanyCommunicator/Controllers/AuthenticationMetadataController.cs b/Source/CompanyCommunicator/Controllers/AuthenticationMetadataController.cs index 303d83f2b..a13b9b4bb 100644 --- a/Source/CompanyCommunicator/Controllers/AuthenticationMetadataController.cs +++ b/Source/CompanyCommunicator/Controllers/AuthenticationMetadataController.cs @@ -12,6 +12,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Controllers using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Microsoft.Teams.Apps.CompanyCommunicator.Authentication; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; /// /// Controller for the authentication sign in data. @@ -21,12 +22,16 @@ public class AuthenticationMetadataController : ControllerBase { private readonly string tenantId; private readonly string clientId; + private readonly IAppConfiguration appConfiguration; /// /// Initializes a new instance of the class. /// /// The authentication options. - public AuthenticationMetadataController(IOptions authenticationOptions) + /// App configuration. + public AuthenticationMetadataController( + IOptions authenticationOptions, + IAppConfiguration appConfiguration) { if (authenticationOptions is null) { @@ -35,6 +40,7 @@ public AuthenticationMetadataController(IOptions authenti this.tenantId = authenticationOptions.Value.AzureAdTenantId; this.clientId = authenticationOptions.Value.AzureAdClientId; + this.appConfiguration = appConfiguration ?? throw new ArgumentNullException(nameof(appConfiguration)); } /// @@ -64,7 +70,7 @@ public string GetConsentUrl( ["client_id"] = this.clientId, ["response_type"] = "id_token", ["response_mode"] = "fragment", - ["scope"] = "https://graph.microsoft.com/User.Read openid profile", + ["scope"] = this.appConfiguration.GraphUserReadScope, ["nonce"] = Guid.NewGuid().ToString(), ["state"] = Guid.NewGuid().ToString(), ["login_hint"] = loginHint, @@ -73,7 +79,7 @@ public string GetConsentUrl( .Select(p => $"{p.Key}={HttpUtility.UrlEncode(p.Value)}") .ToList(); - var consentUrlPrefix = $"https://login.microsoftonline.com/{this.tenantId}/oauth2/v2.0/authorize?"; + var consentUrlPrefix = $"{this.appConfiguration.AzureAd_Instance}/{this.tenantId}/oauth2/v2.0/authorize?"; var consentUrlString = consentUrlPrefix + string.Join('&', consentUrlComponentList); diff --git a/Source/CompanyCommunicator/Microsoft.Teams.Apps.CompanyCommunicator.csproj b/Source/CompanyCommunicator/Microsoft.Teams.Apps.CompanyCommunicator.csproj index fa0cc8899..a4730ab36 100644 --- a/Source/CompanyCommunicator/Microsoft.Teams.Apps.CompanyCommunicator.csproj +++ b/Source/CompanyCommunicator/Microsoft.Teams.Apps.CompanyCommunicator.csproj @@ -12,13 +12,13 @@ - - + + - + diff --git a/Source/CompanyCommunicator/Startup.cs b/Source/CompanyCommunicator/Startup.cs index 883b4dc8b..568aeb7f7 100644 --- a/Source/CompanyCommunicator/Startup.cs +++ b/Source/CompanyCommunicator/Startup.cs @@ -7,7 +7,6 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator { using System; using System.Net; - using System.Net.Http; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Hosting; @@ -24,6 +23,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator using Microsoft.Teams.Apps.CompanyCommunicator.Bot; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Adapter; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Clients; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Extensions; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Repositories; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Repositories.ExportData; @@ -78,6 +78,9 @@ public void ConfigureServices(IServiceCollection services) { Startup.FillAuthenticationOptionsProperties(authenticationOptions, configuration); }); + + services.AddAppConfiguration(this.Configuration); + services.AddOptions() .Configure((botOptions, configuration) => { @@ -156,10 +159,10 @@ public void ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddSingleton(); + services.AddSingleton(); services.AddTransient(); + services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); // Add repositories. services.AddSingleton(); @@ -184,7 +187,11 @@ public void ConfigureServices(IServiceCollection services) // Add microsoft graph services. services.AddScoped(); services.AddScoped(); - services.AddScoped(sp => new GraphServiceClient(sp.GetService(), sp.GetService())); + + services.AddScoped(sp => new GraphServiceClient( + sp.GetService().GraphBaseUrl, + sp.GetService(), + sp.GetService())); services.AddScoped(); services.AddScoped(sp => sp.GetRequiredService().GetGroupsService()); services.AddScoped(sp => sp.GetRequiredService().GetAppCatalogService()); @@ -198,7 +205,7 @@ public void ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); } diff --git a/Source/CompanyCommunicator/appsettings.json b/Source/CompanyCommunicator/appsettings.json index ab6f3f1b1..5bdc5dc9e 100644 --- a/Source/CompanyCommunicator/appsettings.json +++ b/Source/CompanyCommunicator/appsettings.json @@ -14,6 +14,7 @@ "Microsoft.Bot": "Warning" } }, + "TeamsEnvironment" : "{TeamsEnvironment}", "AllowedHosts": "*", "UserAppId": "[UserAppId]", "UserAppPassword": "[UserAppPassword]", diff --git a/Source/Test/CompanyCommunicator.Common.Test/Services/MicrosoftGraph/UsersServiceTests.cs b/Source/Test/CompanyCommunicator.Common.Test/Services/MicrosoftGraph/UsersServiceTests.cs index badf69515..f4fb07bb1 100644 --- a/Source/Test/CompanyCommunicator.Common.Test/Services/MicrosoftGraph/UsersServiceTests.cs +++ b/Source/Test/CompanyCommunicator.Common.Test/Services/MicrosoftGraph/UsersServiceTests.cs @@ -12,6 +12,7 @@ namespace Microsoft.Teams.App.CompanyCommunicator.Common.Test.Services.Microsoft using FluentAssertions; using Microsoft.Graph; using Microsoft.Teams.App.CompanyCommunicator.Common.Test.Services.Mock; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.MicrosoftGraph; using Moq; using Xunit; @@ -29,7 +30,9 @@ public void CreateInstance_AllParameters_ShouldBeSuccess() { // Arrange Mock graphServiceClientMock = new Mock(); - Action action = () => new UsersService(graphServiceClientMock.Object); + Mock appConfigurationMock = new Mock(); + + Action action = () => new UsersService(graphServiceClientMock.Object, appConfigurationMock.Object); // Act and Assert. action.Should().NotThrow(); @@ -42,7 +45,7 @@ public void CreateInstance_AllParameters_ShouldBeSuccess() public void CreateInstance_NullParameters_ThrowsArgumentNullException() { // Arrange - Action action = () => new UsersService(null); + Action action = () => new UsersService(null, null); // Act and Assert. action.Should().Throw(); @@ -211,7 +214,7 @@ private UsersService GetUsersService() }); GraphServiceClient client = new GraphServiceClient(new MockAuthenticationHelper(), mockHttpProvider); - return new UsersService(client); + return new UsersService(client, new CommericalConfiguration("tenant Id")); } } } diff --git a/Source/Test/CompanyCommunicator.Prep.Func.Test/Export/Activities/HandleExportFailureActivityTest.cs b/Source/Test/CompanyCommunicator.Prep.Func.Test/Export/Activities/HandleExportFailureActivityTest.cs index be20171c7..78d7b62a5 100644 --- a/Source/Test/CompanyCommunicator.Prep.Func.Test/Export/Activities/HandleExportFailureActivityTest.cs +++ b/Source/Test/CompanyCommunicator.Prep.Func.Test/Export/Activities/HandleExportFailureActivityTest.cs @@ -13,6 +13,8 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.Test.Export.Activit using global::Azure.Storage.Blobs; using global::Azure.Storage.Blobs.Models; using Microsoft.Bot.Builder; + using Microsoft.Bot.Builder.Integration.AspNet.Core; + using Microsoft.Bot.Connector.Authentication; using Microsoft.Bot.Schema; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Options; @@ -22,6 +24,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.Test.Export.Activit using Microsoft.Teams.Apps.CompanyCommunicator.Common.Repositories.ExportData; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Repositories.UserData; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Resources; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Secrets; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.CommonBot; using Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.Export.Activities; using Moq; @@ -36,9 +39,8 @@ public class HandleExportFailureActivityTest private readonly Mock storageClientFactory = new Mock(); private readonly Mock userDataRepository = new Mock(); private readonly Mock> botOptions = new Mock>(); - private readonly Mock botAdapter = new Mock(); private readonly Mock> localizer = new Mock>(); - private readonly Mock blobContainerClient = new Mock(); + private readonly Mock botAdapter = new Mock(new Mock().Object, new Mock().Object); /// /// Constructor test for all parameters. @@ -50,6 +52,7 @@ public void CreateInstance_AllParameters_ShouldBeSuccess() this.botOptions.Setup(x => x.Value).Returns(new BotOptions() { AuthorAppId = "AuthorAppId" }); Action action = () => new HandleExportFailureActivity(this.exportDataRepository.Object, this.storageClientFactory.Object, this.botOptions.Object, this.botAdapter.Object, this.userDataRepository.Object, this.localizer.Object); + // Act and Assert. action.Should().NotThrow(); } diff --git a/Source/Test/CompanyCommunicator.Prep.Func.Test/Export/Activities/SendFileCardActivityTest.cs b/Source/Test/CompanyCommunicator.Prep.Func.Test/Export/Activities/SendFileCardActivityTest.cs index 2ee6a011c..975f327a7 100644 --- a/Source/Test/CompanyCommunicator.Prep.Func.Test/Export/Activities/SendFileCardActivityTest.cs +++ b/Source/Test/CompanyCommunicator.Prep.Func.Test/Export/Activities/SendFileCardActivityTest.cs @@ -10,6 +10,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.Test.Export.Activit using System.Threading.Tasks; using FluentAssertions; using Microsoft.Bot.Builder; + using Microsoft.Bot.Connector.Authentication; using Microsoft.Bot.Schema; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; @@ -18,6 +19,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.Test.Export.Activit using Microsoft.Teams.Apps.CompanyCommunicator.Common.Repositories.NotificationData; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Repositories.UserData; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Resources; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Secrets; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.CommonBot; using Microsoft.Teams.Apps.CompanyCommunicator.Common.Services.Teams; using Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.Export.Activities; @@ -30,7 +32,6 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Prep.Func.Test.Export.Activit public class SendFileCardActivityTest { private readonly Mock> botOptions = new Mock>(); - private readonly Mock botAdapter = new Mock(); private readonly Mock userDataRepository = new Mock(); private readonly Mock conversationService = new Mock(); private readonly Mock> options = new Mock>(); @@ -38,6 +39,7 @@ public class SendFileCardActivityTest private readonly Mock> localizer = new Mock>(); private readonly Mock log = new Mock(); private readonly Mock turnContext = new Mock(); + private readonly Mock botAdapter = new Mock(new Mock().Object, new Mock().Object); /// /// Constructor test for all parameters. diff --git a/Source/Test/CompanyCommunicator.Test/Controllers/AuthenticationMetadataControllerTest.cs b/Source/Test/CompanyCommunicator.Test/Controllers/AuthenticationMetadataControllerTest.cs index 480154084..3e387c6be 100644 --- a/Source/Test/CompanyCommunicator.Test/Controllers/AuthenticationMetadataControllerTest.cs +++ b/Source/Test/CompanyCommunicator.Test/Controllers/AuthenticationMetadataControllerTest.cs @@ -11,6 +11,7 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Test.Controllers using FluentAssertions; using Microsoft.Extensions.Options; using Microsoft.Teams.Apps.CompanyCommunicator.Authentication; + using Microsoft.Teams.Apps.CompanyCommunicator.Common.Configuration; using Microsoft.Teams.Apps.CompanyCommunicator.Controllers; using Moq; using Xunit; @@ -21,6 +22,8 @@ namespace Microsoft.Teams.Apps.CompanyCommunicator.Test.Controllers public class AuthenticationMetadataControllerTest { private readonly Mock> options = new Mock>(); + private readonly Mock appConfigurationMock = new Mock(); + private readonly string tenantId = "tenantId"; private readonly string clientId = "clientId"; @@ -47,7 +50,7 @@ public void CreateInstance_AllParameters_ShouldBeSuccess() { // Arrange this.options.Setup(x => x.Value).Returns(new AuthenticationOptions() { AzureAdTenantId = this.tenantId, AzureAdClientId = this.clientId }); - Action action = () => new AuthenticationMetadataController(this.options.Object); + Action action = () => new AuthenticationMetadataController(this.options.Object, this.appConfigurationMock.Object); // Act and Assert. action.Should().NotThrow(); @@ -60,7 +63,7 @@ public void CreateInstance_AllParameters_ShouldBeSuccess() public void CreateInstance_NullParameter_ThrowsArgumentNullException() { // Arrange - Action action = () => new AuthenticationMetadataController(null /*authenticationOptions*/); + Action action = () => new AuthenticationMetadataController(null /*authenticationOptions*/, null); // Act and Assert. action.Should().Throw("authenticationOptions is null."); @@ -201,7 +204,7 @@ public void Check_consentUrl_JoinCharaterAmpersand() public AuthenticationMetadataController GetAuthenticationMetadataController() { this.options.Setup(x => x.Value).Returns(new AuthenticationOptions() { AzureAdTenantId = this.tenantId, AzureAdClientId = this.clientId }); - return new AuthenticationMetadataController(this.options.Object); + return new AuthenticationMetadataController(this.options.Object, new CommericalConfiguration("tenant Id")); } private List GetComponents() diff --git a/Wiki/Deployment-guide-gcch.md b/Wiki/Deployment-guide-gcch.md new file mode 100644 index 000000000..cb7c1b2cb --- /dev/null +++ b/Wiki/Deployment-guide-gcch.md @@ -0,0 +1,323 @@ +- Deployment Guide + - [Prerequisites](#prerequisites) + - [Steps](#Deployment-Steps) + - [Register AD Application](#1-register-azure-ad-application) + - [Deploy to Azure subscription](#2-deploy-to-your-azure-subscription) + - [Set-up Authentication](#3-set-up-authentication) + - [Add Permissions to your app](#4-add-permissions-to-your-app) + - [Create the Teams app packages](#5-create-the-teams-app-packages) + - [Install the apps in Microsoft Teams](#6-install-the-apps-in-microsoft-teams) + - [Troubleshooting](#troubleshooting) +- - - + +# Prerequisites + +To begin, you will need: +* An Azure subscription where you can create the following kinds of resources: + * App Service + * App Service Plan + * Bot Channels Registration + * Azure Function + * Azure Storage Account + * Service Bus + * Application Insights + * Azure Key vault +* A role to assign roles in Azure RBAC. To check if you have permission to do this, + * Goto the subscription page in Azure portal. Then, goto Access Control(IAM) and click on `View my access` button. + * Click on your `role` and in search permissions text box, search for `Microsoft.Authorization/roleAssignments/Write`. + * If your current role does not have the permission, then you can grant yourself the built in role `User Access Administrator` or create a custom role. + * Please follow this [link](https://docs.microsoft.com/en-us/azure/role-based-access-control/custom-roles#steps-to-create-a-custom-role) to create a custom role. Use this action `Microsoft.Authorization/roleAssignments/Write` in the custom role to assign roles in Azure RBAC. +* A team with the users who will be sending messages with this app. (You can add or remove team members later!) +* A copy of the Company Communicator app GitHub repo (https://github.com/OfficeDev/microsoft-teams-company-communicator-app) + + +- - - + +# Deployment Steps + +## 1. Register Azure AD application + +Register three Azure AD application in your tenant's directory: one for author bot, one for user bot and another for graph app. + +1. Log in to the Azure Portal for your subscription, and go to the [App registrations](https://portal.azure.us/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) blade. + +1. Click **New registration** to create an Azure AD application. + - **Name**: Name of your Teams App - if you are following the template for a default deployment, we recommend "Company Communicator User". + - **Supported account types**: Select "Accounts in any organizational directory" (*refer image below*). + - Leave the "Redirect URI" field blank for now. + + ![Azure AD app registration page](images/multitenant_app_creation.png) + +1. Click **Register** to complete the registration. + +1. When the app is registered, you'll be taken to the app's "Overview" page. Copy the **Application (client) ID**; we will need it later. Verify that the "Supported account types" is set to **Multiple organizations**. + + ![Azure AD app overview page](images/multitenant_app_overview_1.png) + +1. On the side rail in the Manage section, navigate to the "Certificates & secrets" section. In the Client secrets section, click on "+ New client secret". Add a description for the secret, and choose when the secret will expire. Click "Add". + + ![Azure AD app secret](images/multitenant_app_secret.png) + +1. Once the client secret is created, copy its **Value**; we will need it later. + +1. Go back to "App registrations", then repeat steps 2-5 to create another Azure AD application for the author bot. + - **Name**: Name of your Teams App - if you are following the template for a default deployment, we recommend "Company Communicator Author". + - **Supported account types**: Select "Accounts in any organizational directory". + - Leave the "Redirect URI" field blank for now. + +1. Go back to "App registrations", then repeat steps 2-5 to create another Azure AD application for the Microsoft Graph app. + - **Name**: Name of your Teams App - if you are following the template for a default deployment, we recommend "Company Communicator App". + - **Supported account types**: Select "Accounts in this organizational directory only(Default Directory only - Single tenant)". + - Leave the "Redirect URI" field blank for now. + + + At this point you should have the following 7 values: + 1. Application (client) ID for the user bot. + 2. Client secret for the user bot. + 3. Directory (tenant) ID. + 4. Application (client) Id for the author bot. + 5. Client secret for the author bot. + 6. Application (client) Id for the Microsoft Graph App. + 7. Client secret for the Microsoft Graph App. + + We recommend that you copy the values, we will need them later. + + ![Azure AD app overview page](images/multitenant_app_overview_2.png) + +## 2. Deploy to your Azure subscription +1. Click on the **Deploy to Azure** button below. + + [![Deploy to Azure](images/deploybutton.png)](https://portal.azure.us/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FOfficeDev%2Fmicrosoft-teams-apps-company-communicator%2Fmain%2FDeployment%2FGCCH%2Fazuredeploy.json) + +1. When prompted, log in to your Azure subscription. + +1. Azure will create a "Custom deployment" based on the Company Communicator ARM template and ask you to fill in the template parameters. + + > **Note:** Please ensure that you don't use underscore (_) or space in any of the field values otherwise the deployment may fail. + +1. Select a subscription and a resource group. + * We recommend creating a new resource group. + * The resource group location MUST be in a datacenter that supports all the following: + * Storage Accounts + * Application Insights + * Azure Functions + * Service Bus + * App Service + +1. Enter a **Base Resource Name**, which the template uses to generate names for the other resources. + * The `[Base Resource Name]` must be available. For example, if you select `contosocommunicator` as the base name, the name `contosocommunicator` must be available (not taken); otherwise, the deployment will fail with a Conflict error. + * Please make sure to limit the base resource name with maximum of 18 characters. + * Remember the base resource name that you selected. We will need it later. + +1. Update the following fields in the template: + 1. **User Client ID**: The application (client) ID of the Microsoft Teams user bot app. (from Step 1) + 2. **User Client Secret**: The client secret of the Microsoft Teams user bot app. (from Step 1) + 3. **Tenant Id**: The tenant ID. (from Step 1) + 4. **Author Client ID**: The application (client) ID of the Microsoft Teams author bot app. (from Step 1) + 5. **Author Client Secret**: The client secret of the Microsoft Teams author bot app. (from Step 1) + 6. **Microsoft Graph App Client ID**: The application (client) ID of the Microsoft Graph Azure AD app. (from Step 1) + 7. **Microsoft Graph App Secret**: The client secret of the Microsoft Graph Azure AD app. (from Step 1) + 8. **Proactively Install User App [Optional]**: Default value is `true`. You may set it to `false` if you want to disable the feature. + 9. **User App ExternalId [Optional]**: Default value is `148a66bb-e83d-425a-927d-09f4299a9274`. This **MUST** be the same `id` that is in the Teams app manifest for the user app. + 10. **Header Text [Optional]**: Default value is `Company Communicator`. This is the banner text that will appear starting v5.2 and later, you will have the option to modify later. + 11. **Header Logo URL [Optional]**: Default image is Microsoft logo. You will have the option to modify later. + 12. **Hosting Plan SKU [Optional]**: The pricing tier for the hosting plan. Default value is `Standard`. You may choose between Basic, Standard and Premium. + 13. **Hosting Plan Size [Optional]**: The size of the hosting plan (small - 1, medium - 2, or large - 3). Default value is `2`. + + > **Note:** The default value is 2 to minimize the chances of an error during app deployment. After deployment you can choose to change the size of the hosting plan. + 14. **Service Bus Web App Role Name Guid [Optional]**: Default value is `958380b3-630d-4823-b933-f59d92cdcada`. This **MUST** be the same `id` per app deployment. + + > **Note:** Make sure to keep the same values for an upgrade. Please change the role name GUIDs in case of another Company Communicator Deployment in same subscription. + + 15. **Service Bus Prep Func Role Name Guid [Optional]**: Default value is `ce6ca916-08e9-4639-bfbe-9d098baf42ca`. This **MUST** be the same `id` per app deployment. + 16. **Service Bus Send Func Role Name Guid [Optional]**: Default value is `960365a2-c7bf-4ff3-8887-efa86fe4a163`. This **MUST** be the same `id` per app deployment. + 17. **Service Bus Data Func Role Name Guid [Optional]**: Default value is `d42703bc-421d-4d98-bc4d-cd2bb16e5b0a`. This **MUST** be the same `id` per app deployment. + 18. **Storage Account Web App Role Name Guid [Optional]**: Default value is `edd0cc48-2cf7-490e-99e8-131311e42030`. This **MUST** be the same `id` per app deployment. + 19. **Storage Account Prep Func Role Name Guid [Optional]**: Default value is `9332a9e9-93f4-48d9-8121-d279f30a732e`. This **MUST** be the same `id` per app deployment. + 20. **Storage Account Data Func Role Name Guid [Optional]**: Default value is `5b67af51-4a98-47e1-9d22-745069f51a13`. This **MUST** be the same `id` per app deployment. + 21. **DefaultCulture [Optional]**: By default the application uses `en-US` locale. You can choose the locale from the list, if you wish to use the app in different locale. Also, you may add/update the resources for other locales and update this configuration if desired. + 22. **SupportedCultures [Optional]**: This is the list of locales that application supports currently. You may add/update the resources for other locales and update this configuration if desired. + + > **Note:** Make sure that the values are copied as-is, with no extra spaces. The template checks that GUIDs are exactly 36 characters. + +1. Update the "Sender UPN List", which is a semicolon-delimited list of users (Authors) who will be allowed to send messages using the Company Communicator. + * For example, to allow Megan Bowen (meganb@contoso.com) and Adele Vance (adelev@contoso.com) to send messages, set this parameter to `meganb@contoso.com;adelev@contoso.com`. + * You can change this list later by going to the App Service's "Configuration" blade. + +1. If you wish to change the app name, description, and icon from the defaults, modify the corresponding template parameters. + +1. If you wish to change the header/banner text and logo, refer to FAQ in the Wiki. + +1. Agree to the Azure terms and conditions by clicking on the check box "I agree to the terms and conditions stated above" located at the bottom of the page. + +1. Click on "Purchase" to start the deployment. + + > **Note:** The Bot Service will fail initially. Follow the steps below to resolve the issue. + +1. While the deployment is still in progress, go to the Resource group. Search for Author Bot Service created by ARM template. Name of Bot Service will be base resource name which was provided earlier. + +1. Click on Channels in Settings section of Bot Services and click on "Microsoft Teams" under Available Channels. + + ![Add channel to bot](images/botchannelgovernment_3.png) + +1. Accept the Terms of Service. + + ![Add channel to bot](images/botchannelgovernment_2.png) + +1. Select "Microsoft Teams for GCC High" and click on Apply. Repeat the above steps for User Bot Service. + + ![Add channel to bot](images/botchannelgovernment_1.png) + +1. Wait for the deployment to finish. You can check the progress of the deployment from the "Notifications" pane of the Azure Portal. It may take **up to an hour** for the deployment to finish. + + > If the deployment fails, see [this section](https://github.com/OfficeDev/microsoft-teams-company-communicator-app/wiki/Troubleshooting#1-code-deployment-failure) of the Troubleshooting guide. + +1. Once the deployment is successfully completed, go to the deployment's "Outputs" tab, and note down the following values. We will need them later. + * **authorBotId:** This is the Microsoft Application ID for the Company Communicator app. For the following steps, it will be referred to as `%authorBotId%`. + * **userBotId:** This is the Microsoft Application ID for the Company Communicator app. For the following steps, it will be referred to as `%userBotId%`. + * **appDomain:** This is the base domain for the Company Communicator app. For the following steps, it will be referred to as `%appDomain%`. + +## 3. Set-up Authentication + +1. Note that you have the `%authorBotId%`, `%userBotId%` and `%appDomain%` values from the previous step (Step 2). + + > If do not have these values, refer [this section](https://github.com/OfficeDev/microsoft-teams-company-communicator-app/wiki/Troubleshooting#2-forgetting-the-botId-or-appDomain) of the Troubleshooting guide for steps to get these values. + +1. Go to **App Registrations** page [here](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) and open the Microsoft Graph Azure AD app you created (in Step 1) from the application list. + + > NOTE: This step is to set-up authentication for Microsoft Graph Azure AD app. + +1. Under **Manage**, click on **Authentication** to bring up authentication settings. + + 1. Add a new entry to **Redirect URIs**: + - **Type**: Web + - **Redirect URI**: Enter `https://%appDomain%/signin-simple-end` for the URL e.g. `https://appName.azurefd.us/signin-simple-end` + + 1. Under **Implicit grant**, check **ID tokens**. + + 1. Click **Save** to commit your changes. + +1. Back under **Manage**, click on **Expose an API**. + + 1. Click on the **Set** link next to **Application ID URI**, and change the value to `api://%appDomain%` e.g. `api://appName.azurefd.us`. + + 1. Click **Save** to commit your changes. + + 1. Click on **Add a scope**, under **Scopes defined by this API**. In the flyout that appears, enter the following values: + * **Scope name:** access_as_user + * **Who can consent?:** Admins and users + * **Admin and user consent display name:** Access the API as the current logged-in user + * **Admin and user consent description:** Access the API as the current logged-in user + + 1. Click **Add scope** to commit your changes. + + 1. Click **Add a client application**, under **Authorized client applications**. In the flyout that appears, enter the following values: + * **Client ID**: `5e3ce6c0-2b1f-4285-8d4b-75ee78787346` + * **Authorized scopes**: Select the scope that ends with `access_as_user`. (There should only be 1 scope in this list.) + + 1. Click **Add application** to commit your changes. + + 1. **Repeat the previous two steps**, but with client ID = `1fec8e78-bce4-4aaf-ab1b-5451cc387264`. After this step you should have **two** client applications (`5e3ce6c0-2b1f-4285-8d4b-75ee78787346` and `1fec8e78-bce4-4aaf-ab1b-5451cc387264`) listed under **Authorized client applications**. + +1. Back under **Manage**, click on **Manifest**. + + 1. In the editor that appears, find the `optionalClaims` property in the JSON Azure AD application manifest, and replace it with the following block: + ``` + "optionalClaims": { + "idToken": [], + "accessToken": [ + { + "name": "upn", + "source": null, + "essential": false, + "additionalProperties": [] + } + ], + "saml2Token": [] + }, + ``` + + 2. Click **Save** to commit your changes. + +## 4. Add Permissions to your Microsoft Graph Azure AD app + +Continuing from the Microsoft Graph Azure AD app registration page where we ended Step 3. + +1. Select **API Permissions** blade from the left hand side. + +2. Click on **Add a permission** button to add permission to your app. + +3. In Microsoft APIs under Select an API label, select the particular service and give the following permissions, + + * Under **Commonly used Microsoft APIs**, + + * Select Microsoft Graph, then select **Delegated permissions** and check the following permissions, + 1. **GroupMember.Read.All** + 2. **AppCatalog.Read.All** + + * then select **Application permissions** and check the following permissions, + 1. **GroupMember.Read.All** + 2. **User.Read.All** + 3. **TeamsAppInstallation.ReadWriteForUser.All** + + * Click on **Add Permissions** to commit your changes. + + ![Azure AD API permissions](images/multitenant_app_permissions_1.png) + ![Azure AD API permissions](images/multitenant_app_permissions_2.png) + + > Please refer to [Solution overview](https://github.com/OfficeDev/microsoft-teams-company-communicator-app/wiki/Solution-overview#microsoft-graph-api) for more details about the above permissions. + +4. If you are logged in as the Global Administrator, click on the Grant admin consent for %tenant-name% button to grant admin consent, else inform your Admin to do the same through the portal. + +## 5. Create the Teams app packages + +Company communicator app comes with 2 applications Author, User. The Author application is intended for employees who create and send messages in the organization, and the User application is intended for employees who receive the messages. + +Create two Teams app packages: one to be installed to an Authors team and other for recipient’s to install personally and/or to teams. + +1. Make sure you have cloned the app repository locally. + +1. Open the `Manifest\manifest_authors.json` file in a text editor. + +1. Change the placeholder fields in the manifest to values appropriate for your organization. + * `developer.name` ([What's this?](https://docs.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#developer)) + * `developer.websiteUrl` + * `developer.privacyUrl` + * `developer.termsOfUseUrl` + +1. Change the `<>` placholder in the configurationUrl setting to be the `%appDomain%` value e.g. "`https://appName.azurefd.us/configtab`". + +1. Change the `<>` placeholder in the botId setting to be the `%authorBotId%` value - this is your author Azure AD application's ID from above. This is the same GUID that you entered in the template under "Author Client ID". Please note that there are two places in the manifest (for authors) where you will need to update Bot ID. + +1. Change the `<>` placeholder in the validDomains setting to be the `%appDomain%` value e.g. "`appName.azurefd.us`". + +1. Change the `<>` placeholder in the id setting of the webApplicationInfo section to be the `%authorBotId%` value. Change the `<>` placeholder in the resource setting of the webApplicationInfo section to be the `%appDomain%` value e.g. "`api://appName.azurefd.us`". + +1. Copy the `manifest_authors.json` file to a file named `manifest.json`. + +1. Create a ZIP package with the `manifest.json`,`color.png`, and `outline.png`. The two image files are the icons for your app in Teams. + * Name this package `company-communicator-authors.zip`, so you know that this is the app for the author teams. + * Make sure that the 3 files are the _top level_ of the ZIP package, with no nested folders. + ![image10](images/file-explorer.png) + +1. Delete the `manifest.json` file. + +Repeat the steps above but with the file `Manifest\manifest_users.json` and use `%userBotId%` for `<>` placeholder. Note: you will not need to change anything for the configurationUrl or webApplicationInfo section because the recipients app does not have the configurable tab. Name the resulting package `company-communicator-users.zip`, so you know that this is the app for the recipients. + +## 6. Install the apps in Microsoft Teams + +1. Install the authors app (the `company-communicator-authors.zip` package) to your team of message authors. + * Note that even if non-authors install the app, the UPN list in the app configuration will prevent them from accessing the message authoring experience. Only the users in the sender UPN list will be able to compose and send messages. + * If your tenant has sideloading apps enabled, you can install your app by following the instructions [here](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/apps/apps-upload#load-your-package-into-teams). + +2. Add the configurable tab to the team of authors, so that they can compose and send messages. + +3. Upload the User app to your tenant's app catalog so that it is available for everyone in your tenant to install. +> **IMPORTANT:** Proactive app installation will work only if you upload the User app to your tenant's app catalog. + +4. Install the User app (the `company-communicator-users.zip` package) to the users and teams that will be the target audience. +> If `proactiveAppInstallation` is enabled, you may skip this step. The service will install the app for all the recipients when authors send a message. +--- + +# Troubleshooting +Please check the [Troubleshooting](Troubleshooting) guide. diff --git a/Wiki/Deployment-guide.md b/Wiki/Deployment-guide.md index c96a89009..6edaec6f1 100644 --- a/Wiki/Deployment-guide.md +++ b/Wiki/Deployment-guide.md @@ -24,7 +24,7 @@ To begin, you will need: * Service Bus * Application Insights * Azure Key vault -* An role to assign roles in Azure RBAC. To check if you have permission to do this, +* A role to assign roles in Azure RBAC. To check if you have permission to do this, * Goto the subscription page in Azure portal. Then, goto Access Control(IAM) and click on `View my access` button. * Click on your `role` and in search permissions text box, search for `Microsoft.Authorization/roleAssignments/Write`. * If your current role does not have the permission, then you can grant yourself the built in role `User Access Administrator` or create a custom role. @@ -140,8 +140,8 @@ Register three Azure AD application in your tenant's directory: one for author b 18. **Storage Account Web App Role Name Guid [Optional]**: Default value is `edd0cc48-2cf7-490e-99e8-131311e42030`. This **MUST** be the same `id` per app deployment. 19. **Storage Account Prep Func Role Name Guid [Optional]**: Default value is `9332a9e9-93f4-48d9-8121-d279f30a732e`. This **MUST** be the same `id` per app deployment. 20. **Storage Account Data Func Role Name Guid [Optional]**: Default value is `5b67af51-4a98-47e1-9d22-745069f51a13`. This **MUST** be the same `id` per app deployment. - 21. **DefaultCulture [Optional]**: By default the application uses `en-US` locale. You can choose the locale from the list, if you wish to use the app in different locale.Also, you may add/update the resources for other locales and update this configuration if desired. - 22. **SupportedCultures [Optional]**: This is the list of locales that application supports currently.You may add/update the resources for other locales and update this configuration if desired. + 21. **DefaultCulture [Optional]**: By default the application uses `en-US` locale. You can choose the locale from the list, if you wish to use the app in different locale. Also, you may add/update the resources for other locales and update this configuration if desired. + 22. **SupportedCultures [Optional]**: This is the list of locales that application supports currently. You may add/update the resources for other locales and update this configuration if desired. > **Note:** Make sure that the values are copied as-is, with no extra spaces. The template checks that GUIDs are exactly 36 characters. @@ -163,7 +163,7 @@ Register three Azure AD application in your tenant's directory: one for author b > If the deployment fails, see [this section](https://github.com/OfficeDev/microsoft-teams-company-communicator-app/wiki/Troubleshooting#1-code-deployment-failure) of the Troubleshooting guide. -1. Once the deployment is successfully completed, go to the deployment's "Outputs" tab, and note down the follwing values. We will need them later. +1. Once the deployment is successfully completed, go to the deployment's "Outputs" tab, and note down the following values. We will need them later. * **authorBotId:** This is the Microsoft Application ID for the Company Communicator app. For the following steps, it will be referred to as `%authorBotId%`. * **userBotId:** This is the Microsoft Application ID for the Company Communicator app. For the following steps, it will be referred to as `%userBotId%`. * **appDomain:** This is the base domain for the Company Communicator app. For the following steps, it will be referred to as `%appDomain%`. @@ -270,7 +270,7 @@ Continuing from the Microsoft Graph Azure AD app registration page where we ende Company communicator app comes with 2 applications – Author, User. The Author application is intended for employees who create and send messages in the organization, and the User application is intended for employees who receive the messages. -Create two Teams app packages: one to be installed to an Authors team and other for recipients to install personally and/or to teams. +Create two Teams app packages: one to be installed to an Authors team and other for recipient’s to install personally and/or to teams. 1. Make sure you have cloned the app repository locally. diff --git a/Wiki/FAQ.md b/Wiki/FAQ.md index e84feb711..2479c0fcf 100644 --- a/Wiki/FAQ.md +++ b/Wiki/FAQ.md @@ -70,9 +70,11 @@ You can update the banner title and the logo by updating the configuration in Az ![Sync changes](images/sync_changes.png) ### 13. Is it possible to format the message in the summary field? -Yes, you can use markdown tags for formatting the message in the summary. CC v5.2 supports this feature, you can refer [here](https://docs.microsoft.com/en-us/adaptive-cards/authoring-cards/text-features) to know the list of styles supported. +Yes, you can use markdown tags for formatting the message in the summary. CC v5.2 and above versions support this feature, you can refer [here](https://docs.microsoft.com/en-us/adaptive-cards/authoring-cards/text-features) to know the list of styles supported. -### 14. Latest changes does not reflect after upgrading the app to v5.3.0? +### 14. Latest changes does not reflect after upgrading the app to latest versions? Teams client default behavior is to use client app resources (js/css/ images) from teams cache. To reflect the latest changes please sign out and sign in again to the teams client or clear the teams cache with the steps mentioned [here](https://docs.microsoft.com/en-us/microsoftteams/troubleshoot/teams-administration/clear-teams-cache). +### 15. Does the app works in GCC/GCCH tenant? +Yes, Company Communicator v5.4 works in Commercial, GCC and GCCH tenants. diff --git a/Wiki/Release-notes.md b/Wiki/Release-notes.md index f8374a58d..cb10ec116 100644 --- a/Wiki/Release-notes.md +++ b/Wiki/Release-notes.md @@ -4,8 +4,9 @@ Cumulative improvements in Company Communicator App. ### Version history -|Release |Published to
Microsoft Store | +|Version |Release Date | |---|---| +| 5.4 | May 10, 2023 | 5.3 | Dec 14, 2022 | 5.2 | Jul 26, 2022 | 5.1 | Apr 28, 2022 @@ -24,6 +25,10 @@ Cumulative improvements in Company Communicator App. | 1.0 | Dec 20, 2019 ### Company Communicator feature release notes +#### 5.4 (May 10, 2023) +##### Changes introduced +- Code changes to support Government Community Cloud High (GCCH) environment. + #### 5.3 (Dec 14, 2022) ##### Changes introduced - .NET upgrade from .NET Core 3.1 to .NET 6.0 diff --git a/Wiki/images/botchannelgovernment_1.png b/Wiki/images/botchannelgovernment_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ba49a531bb2977a3c4ec9ca8a54c8753fcb75a GIT binary patch literal 104217 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

{8sY9UF+&>HL)Oo; zZ{p(h1JY|HYTasj=3FV!&z*u?TqKQYM46efNJ&Wng2F!{B7z5iH$?K*eVgYy{KVRC zx5<{g&qsIXs&WD7Cf#RFCqRV=xG4WzV0q^P1N@P?Gy<%u69@dYz3|vqnm-HdluX{q zu}XNja{7*Up_Ym9DYK?%HqW! ze=Z|k`R_*M!428LNjm10(A=f4>eEV&3qig`HL1FEbqcE4ta7YLX!4c0zk(qDZb3Ge zHh;&?AbV{@EWpzV(gVnciuU`bwhQ%rIQ%QkdoC zLBS!g#^rC{Ua;slf4IWK#_k1(4-U66J)5XVo+xi&ZJF%KPnVy=5?VaY>1>vp3B9h5 z#4Rn8(QTbh*2GKoTW0QE`+g)cW#3d6X93?#^CDJvB8o4#+MCDVj}01O7J=&#TV%BA<6k za(yG(+;M5~G>C662spj2j;RBnth!&v#qP+Z`=kfQ#|LDod_zam__Tx0UU;8h&Yql| z$u!t4SDN%;YRg*dXltjS@9pj~0Q8OVWKJ-(FBTTo=^_7W@@mA|!9ipo8g4R=*jovS zrvSTRIiz?vV`6RimAzQdk(Gt5e6(E1A083j%cOwR;x%q} zLlQ?$P9AxCzHNMw%-OgZE$leE>}Gnh_S$6Ge4%!%-g*|dCj?J+wp@R*MpnfpbneT> zhKZSlx$$ay8wrm?EdJV9Qtnf)tAnm+3So!4!-ma%GJ7to6`DnEca7^Kk;>IA|Bj}L ztgH(33ouRl^>GXlvy-J|5zun|??~V_>v__ZZGj?7V39R4qR1D33AXSt{045}CeJAv zHYjDhHxyVmFTFG&Fo6gnz{yIR<>jk$JZxW@h7LXNN14W(&Y@qkOWFS}PG%oBb)K z0uj2G?LK#JLZL3o8q&A9Yi$zj=rWo+A(Sr)H~7l_7p55eWL~lbM2SKi-GU9@y?WXc zxVFDer~W1}h3_h6(YcbQi3EVHPUi;S-ZW;W*Kd;;={WP-EifFx>fhVQNK0p1H`sA0 zyYI$kQ!5MB^V5hRKipjsJ1R8nm6W%?#1p-V^?rOD;cna0Fe)G#j2~m~l)CI&;WJ!G+ z8yf15?UGbXrKmJN|MZ4j?)kMX4mj^VZi0IQNK0CkMo6DVlKoS-EleKoZ>u9Sr2flM zA0}Vr_rKE0G+04L#|a2&D8%m=aAjsFe(Py0=&es7b^pvm=oM`RIa@S#yXkxpC0Im+ z({V#utL0OamNU>5x?5j6i6QNsLbG~FLSM&x5z!gn>wbZ8zO zTD|eGumWRZDp1OE-j?H*)dIxPx6=;tX=|m$r24~!q2$%bNX3+rVHGlT2wsDm#IzOD-uQaqI)yVk z_zJt-v}7^7wGNok#?%z^6Jyb7d=7v<180QHZ;U>^H+pW@1W(GHrkTu0QO(h;Fo;5w zw-_v?lPWTEFrc3kj}RNT0EWL!)DqK-xi6oMR?I}~d&t30x#&JT*4`SwKR6j9)ffbH zp;}|Z!`%f@WSlm04pmn#J^Zu$QiENrXN^Zwe}#sH;cHriyXvfLkEH}UZuW;IE({%r z*{^^hhf}CKQ6#TT(+S}aW9HA!&dzXOqc2VS6Ey(=bDmkx5hCCJ-MFK1o;w)zYVURY zmu0pd-7BAjw5F?WATZfwg~97+Hwhn%`ntT|kY9b`$rTV z*C8%0;y{}kT|;-SNJT+G+T9%szc1)cXFx*ZrT@Nh5EE);F8%={WATg9a1A|X#jH(V z5s|iDPel@`2-P1}m-(Ujv;u;H+Wl0pgm< zg$#vQiyi@ZRHBiB&fD*#&QsTF4WN2XVeZP$F^ybiHUB3DQ<-syx-`N8O~XP*b*`@9 z*!v6LhiQ2Io90*1^>UKw738s~=N;iW>E!j)$wy=9IVJVFDLHOuTSHts^_LC*amM*g zPE)MLnzF)*2fJYwo?h#&_FmX0uHA;ues2UQXEJ>ugk!%w)zviA@Im}5{qhAT8JwTz z+f|0pupO=WM+kYon()@VE&2B>10Q*q{!Qgga7F*@e?d`Nb&L>V^!?w24cKBf@BdRh zz`J>r8pOj$TFGwEw8b2Qt}LE_kdV$yy72p=qvaN2fWhc$ zcCoGkqD~VVt4{5g`1pA95`y_w4}ulqv3MfBx92{Qw@>F%-DTt78y$4V9ZK_<2?)8z7VZ-0ckpB7t zr<6fHJ~k;Sd~dqFCxpuPi+0VY@X$($$#&~mWp6$gruO>{EGaThr+V$~^o)$CL1+Gr zadzww`PE(GA=;G?&g#khUdf<&XamLA36E ze@Z`5W5EtvNG&cceH(oH&)#y{{<~}BcQ`B3yhZUHq7ghk=RNt*#;#MP}Eiic;mGyU1hxLaH87x>`bY4e2?{ zC(KM5``h{*|ASa{KR6vYz3vbT459MaDkA>E>sObdpyclE{)&g^z;fV=OGkM4!gQ5L zbRGFP=5e5y&(Y9{;XE38K<|m zci%E(vA&F+r4V+UDdKf9Z=rrVI%~Loz3K-wt+QV>2*Mb!nX0>9c3bHmN#Ukd0aQg_ zYm@V2nXVft^4*yN`)fYBXMkMf$?<8seaMM~>H~^Y^zp_tKI>d2ysSTLa$cYWNd8EO+KG_s(Gn_!uuJzsoi)c{i`A~xa1h%eRqLPj zNPI^pGLII%s*{J{dpK)vUo(t!05Uqr_}DAo&ei&pMLT7JrJrBobi1&nZl>c-lNpn&QcyO)b%a!T1z>+ue9fS z8Zk4x;`5uF9-EPR)$?3w3l29PnX5wQk$A|(69XZ6?oPa>(OM;Z4Ri7FycXBiW(4G_ zwcgliWt?t(=dV80+<{1OVVaRoW6Az~GG-GC^+5GRdM%It7sAYYQy5wVILu$r&7yRr6NR{AxDuwdfo7%(PM~=|Mu-g;{ynq$gJUKa0&#aq#h-s4DO8l?>W{?<n zpx}~<%VE)?;+HwV| zfE`YznC^~m_XlS9x16f7)G!qNt5eSOo%ZrKe#^s_=BhTOlGP3zvl5v#I)DAb!4tiB ze$;x-c7M4ZGC2_HR$7rM9aDL@(-XcF1Em zqdHr>_x)sLP1o$WN@;VQxHYSOn^iF&6J!uGWxe}8)f+!2Coy)i{Mr*v0cfPpQ*m8O zM+fM@BV5l%`O~bquyaRTBG;`+6!{V$zW8z><-L0fb;{ zzn)b)(WHO;Ct(j$1^?9%si5YVE5t07vJ8u@RtM$X)uD7Gz8pxpelnPp@p{ca(1bVl z?jVA_{grqP7z_q#+F;kiMbjIP9iViSz8R<)UjvRN$p^Tn-MXEg`Q{MXn@XV=_&vCQ z&#wzlkGzh<^D9bQ6b#|`Es$20-o$0JfG|cP+HMwAW@&2& zKJ-(-_3BDy$u0iyW^b-ISBvD2+Aqv9TBto<`;78Y2}X)~dp<4(bu3g7 zx#XerI&iGD(dPXawM%#|)?BJ1O@(Tjm@J5aZ#k*-ap+EhzVX{;YVv&?0FL9&D13d%2)KX5}mlxf->JH z4jX(za0j`cLd$1nOeb?>uUE@-8^V9NudcKuRsEo6*I}e2B@fH7TwdTEp%rUFkQ!Ww3#DfU7ST>a@FH5ktaV=32O>Ha=+d0aMbp#MaGjcR zt|vN$V;KlYVZCeQ1YxRaz%6vMe*CNBTJYTaroyl9xW-THvturL`)*EzG zrIbI1zu_ac~XfY#S0BqEN{o=I58f6GqITm0oM3`io8N9;b{hunbh*Y zo5-i7QS#zeBISYJ*aR48V`!G@XMA$EQshsD$UVFwO>xxPU|Bq|g6xb|@UoV1DX&+V}vEvB<` z2$7|7R;@XV2z>cd{p9Mj>fdI9pfk@qltOsoMqM!4+A%!*h;`qt7o~Z@SP~cuJ)nrT zTem3a>iJq;7t+Sph$BeI*_mT1w7*esKUst>DyU^Zp4Mu1YEo-EOJtsJ&NZr}rbbQa zyM^xvD@S;!5@1X8-Rkd|C?OaJXe$gmkcbVvIgbFev+9VKU!dLAu7c_UOnIYVp8_SQV?4dFK;sgB@vt6m)mpVL3gR-FXzPhg0~ z)HJKG)pP*&&6_uab0XD%Z%&HVU*(Jw9QS$Eqp|>wuSG{7fS**u&7FM z<$TF6R-8)AqfIttJT9dFvkZ86ajeTyo+)X2pvuFT*32|9_|ei&ii_6B(+L^){m2v? zf$3vv>WKz zsd+*u#HlZqNLf}ayF2(5|;6?VHqbUuAH3Q_r~>bEit||lJ_A;)Ax2RjI?07!k=s2 zMUgBDnr|NsS}i&G?B{K+m=kt$A!&K$Z#X&e&v(Y5oX+VzJWN75IU!TOOQS5{W|eid z#XzC@KVOF@{TU-WUn41DYSt5eFUW;6_=sTJik--)e1}Iq%AXA)?0WR2qoZTQVyIY= zfoN|<5fCmXSBv%$Pqyc{*b31vPcP#vD@0dB9h{wsuXhP$K(dF6A+7h`BdLM}#l^+n zp7lK~>tA9Y4m~hefDT`=jj_oD2_-|8Xgf!{kkQPJRCEf4vIEhiTNj!|G(w&xpNo&( zoXRF7LbLPoPz?Pp34M7wQg8?GI?l%y=d8wnxFQ~O*Rsv8-(-s#^?%lr({G?L!$;LD z2~GHDw0-1#Z!JCJm{qKM7OQF$l%=iGu=_(q88>{;R<|MBtKrDO(M1}V|CIKo6nw!> zv=od*oKyMzNsP!93E+BaECIAWFwi#nw{+F=8&Dx(x0?V}_l~XL>bF2Rt(pc~GeD_# z*T>M(%frR%BHBo#G68nRvOWSjy;t~(1CbQ;1Mt>Z@YNN?BJH3CP-K{ArOwq@;Qbx= zZ8>Tu1ExZVfpB85o1$qi!ec*4am+&br+y5*QU_)XKn-g^>&B6w;K_2UM~#-xrpe|+ zp}iOiDk_X`CMHxn!pkDDQe=C3kLo#)lAf7ZZ~Zf6{RP zx6D?7VaM>ri_GN~&dxk_O~`a_5K5IvgVnOk)b~3VFPd~_W~S%F#LTK@UKhItef9LQ=F^RKA*wBfCU@431ti|o8Zzn@O9eBWw4-Wg$t5Ph|&B06%~LSuZel4 z6jv+CM;ycYPSP$V&|L0tNqB-x+*NRw@@RUE@f*+!Jl()zU+c!AH|ZUWOUi!^J83y? zjkr7Nz{8MzQ3(LjOD?nemdgcE=*rQntc+~^fcl|#R>dV1`p~kVMh^vn#Fx!;G;zY*fu4AghMH75~ph}E)+Az8og_|wML z?G}swmqZOj*U_~pe7DiKs%hwf8c(Ov9g0t5et)vj7g1%sgA2YN%;hR@hixl0{_#hn zU7J~H^BQTlH{IxsaM)Dh|HV8)*hjQzWjS^MlEcb5JGlrjgR%D|X|iMX-9%F+8U8QE z4bQ&~%#j4<;*FF)h+@L5E{jXgxr>6az=!hBx8MtFyAwdajId$Hx}rsyn$~%N+Lz=Y z+$0XEjIH^`gjDwqIPllhCdkx$Qm3S{U(Izs8H0du%+i zt@(Y=%cCYxEBspTXddni;iHoY;5l1yQc_})j}sTK@z$^q5;{K3rEaQa$L(`RT>d(( z&rKz4KyB2Nm;cXm8f3>meWP>JQ)H(|OOMzdyA1p%CFQlKl@hp={%Dk~$tb}PrCVOW zFXmy%Z-F7=>H6GUO}{szmkNdUMn*WZv$HQqNSML7WDKu&Xh<1k@~NPs@`|wNyY-Kb4`i?A1z}^1Xh7z0V;dS4%A-_DlFt^N>>baWqexoW#YZ+@2OqKqx9(wq_z9$P}k~{bmoo4NFzyebVKyVzfn@cnOqx67gAXL++fYp-}mFc-76$={`YTcf&D+|gii|pcbZxL zt3PvpApYO#V?Y-uKK`|g%-`Sz(4QGnV;+=>$js005P78{*MRvIhBzpm@+l2(sIlC> z;60vVfcNF+Dz-z;^YM&QS5Qfh?62cwsDc&T^eWz{K`Mgyga z>c}e`-H+O#P)kSq8HTrYh#cA`K5-1<3q(RSXx+HV%ZK4OuD{^s;jy%mPK=9t1Jl>N{Ja6M>VFVACS(jRh&pb&O)Q2dJOI^U(EaNi2~z^ zb^?V7a0S%e-Cl9J?vjBnX3DpbcR=Mp5e1kix&o~6&DlJbj*bpCg)9*j*X`+hWZvV&kFEhI9&_3x4+9UmV)aJ3}RVFH{BPi{FnNrZRD*}TEt-ky45 z({H$=JDiY;o*zY(z43WAQdT1MurXz7L)-0U9H0qZRn^w6{lI!!eldB> zrEn=LD^E4LmTCrA_YDr>;|!cwNLfUtr;~$2MBp<*-3J;P8t^eySaKMJN_>)o$J)N$Qr4}5;x`Hv>#<}hU|UDkg! zmf`LGs5F9tT^0H6ZLSYRUl6csGn%PUBFwKU!c6v3kV9W1US5~ckY?Hph+HPu^Pmzx zMQD<0geV;Z*44LiXkYxkrwF0UWEldQEt6=%M~OS^0kx^3m(|W+o14jv$NS674X8>e zmY)i&m_kTP%5{&2@%idUb-`$anB_^zBOwbQ>~9DfGDLiz@j&N| zO`*_m#q?zJuV$4U4vx~ZvYNc?Yh zA=h26k7NfV{MBzv$baCo0{ssJQolZ45dFst=?J(P2Ls@U%8>!~r|HUqZBY5Q0k`H0 zVHc}J>tu25;VI%ur@og(d?#F7ToSB>1AF;Oq~%T=S=yXUTwvXC_SnzQWpPbzRDJrVV}j>{>|-JpRjPx1|p7 zNJ;$xaZsnd%f=!T80fHI*XT_zE+#hbu(vOgtZ!(TWhJ+D8HNuZY~Em}Rvem6(>cDq zkzKtA$4@F*XGPuZbg*aup?rQnR!t%5&&&+$3uQj!Le87C>CgdR7v&mVIsI5R9exEl ziBkP$I;94*@%{!bYRRGjJkP(GTHtT0j_XmnuycX~!g*j|;2SUKwUn6;em)ZYD1?ay zr>8dd*R_~gL&+5PRD>M43A=2^MF~zMGsh4|`1w78$mtWJbBc?LySvzXCQu4rYl^$2 zYZ4};tj&Wy(l@Ka*D4PvGM%F*Gu>CJk*BPW6PVy>HiMwe&{b2c(>*BKZk3uG5AEl8 z*PnK^FI3Du>1VT|*f*xTsj$0*FnHGg2e539Zd7uwPfa%F^8=h5MfFwHgi2H#^)6;>vHz zDoxmZUZ6w$Eu;W*Jr3}Ps%mB%x#i$^iCYb~3(?$8&7++-1T^=VG~fgPLb*Gw*?lTS zGvJj9>Ulln6>~8W;Dl)ajnkTRGS7}hO~!)`FXzjClR(Z(T^U)5tD7D*j18L|itd*) zkHJYT4?Op_WtUf^e)Y zxQHo1ejm9AA}Y+^{r%|Uc903x;h-H*by~D0S#WVVow6X|s(BP{FfC{-RoRfrLb~Im zlKaBW!J!AVtrS<-B}k0qkNhJ~jXHzE;Xj=tm;&LzA26C{nV5s=G10D;uk3SyNbH3V zO1Y@>i(Ram;27btXZjq5=C-38gVVWmz)(65DzF*RIrD(Jd$2K9vWFJ4F;xc|wC+20)bG|3W_;iROF5IM*kxW#1_A9yVj>aBNoO?Abl^fq`(mhvUKXY)!_{RP80|Fh#GJlET4ASeRftDvRG~T!t8KJ#P^_^kop6oGJr#3)H;u> zlIu&=i*z3*@$c;FHSU9|b67}7WN3HCQ;aANL%TV@3k+$u3V%aTm-`^5qm=9ojq0?Z zJJYd}_Byd28nCcNNFN?yu8A03excnQA$fu5Z~e;bA=&?QHb* zm)!OfUV*EYCJ{Ahwi$lBZWWFAssQwjOz;s!svPGL;noMPVJ(P=FB+AD@fw>IQ z@?vGcRUq80wYrs~DPr;dtfZXo!Pf4jDMuG?sPr-WdJf;fFD}iY3fo0GB$`G)Gc|N$ z>#%I&9hc9{_h|oLX6xhsWV(*}I)ZqLNi}qR0-FY)p-bWa&`BA$zv`Ql)KtAVzr1*h z?O_d%eTkd*ur0%~r3=Czfl14cvYyeWZ_m$OFIxO@TgHIXSBziU>YKiUcEoQT$dsnB zN!U!WKqN!{Oox?)h5mV!+ksovciIA48d};Z-Voiqhh*jUIlOh#Ws$s?CfL|2&~vMq z8qC(a+tf4;w&zu=V?U&fyjI`%p-p8i8ukgmblA8t6~Y1^jrTq`+G~Y6kpUx^`|rM& zP50@1yZg5GnBcwNC2kTF74q6Ug2ufZ+3}csZhgjb7Jy$s3+9-261l*X4^_(T4zO!A z@V$`n*qrVqbH2SWMkpvKNgdyQdb?suDk0x#^mqV$YjN7}**sA>4xw^dNT)0#GPTDQ zcqF>}kfYxavF6! zCE~Qp`ZM#?Jh?QQmNBx^aUo!g%(y zco-F%;=7Rdy!%=xT@tnH`bai)+NbiSjr`O+ngS_U)FCT$p~XK0E9{5xUK7R&gW?Mf z3oIPNHtC+58(iJrVPWNM!=XhMQ3Y>xe0Gl(w(?RKb0Vf}Ozkx(DtBNp!?4HMz$xreEJ-;G3%U`{_$rs+UTB@qG}KDO=UiJiceXRBviW2<-YhXTmTdw-YFmc`fFj6l{h%exL%z`Y?)Juv zeEf%5yt-D{(!VjYxuV~bovR|#T871_ySo%)U%6+~uuCz8(X6&;w)QsFSP%{K-e;m8 z=vg&dD%Ypmu4p@&jwrm=OFv+vVv*1~gHEpu_wz3s0O9XzmWi1lwU68u@QCGAYPIjs_cyisue)PRZN^XL9mtX?*76!$b8% z?9H$#%Y|C2>E}Wm(gr zBvj%Y-d^pQ?6owHS&G{3k`1JBNs&CQG#|n%jBZXB{h+v#zMN`8OiUNAo?kJ>Js$GU zvr1qNosHQE$MdRKpu3~J2YqfO37Ixsd9Z{^nbc$7fQA>gG@S24ANgC5=0huhc5oW2 zcz5QjNo}w9eC3J>qL3!l+=5dY^;O=t(`(E0gF$FAZJ^D@PVi;y`v(ZjR`Kz{nt_iP zRdkIV`Ea3k@TuI~^zTl`f=?TxISiM_yEL%;EJ#o~bfiian}&KKWlMreg)xDNb{)lf zhtV)67_$L{738Hfp+03;nHF6;6V^I;D*@?B+hkDdE`R)bhJl-ltL=q@KdLIr(4%a= zILV}CKj+9Z47U2&s7QD1B(S%=+GOES$jM0OY#KgKJfqM%Z3SdwIUWHaA(hxIns$v9 zlkxYH?~%^P_V#R~97V0=cz&dnLZYclSUFZDP5Dz;)g;4WR}s2A89Grog@J); z8&e(JCJbnqn5?xE`Bu<+4p!DSz|7~y`fcp}s~;yDe@H%f@ejR1B$i#6rI8q?r@~wa zEL}(ll5T6mUh?4;0Cbl77${)CdlCHy--Y(jYv+8J7RC#NoR{+=;tO6YzQ)hYTedu0 z)C-u?O*Rfp!dWY?S1u|ZC+tp7cyv0LF`$-0^z!Sy4Gq6JwM{$`maH>~gUGcoxY_ul zU~^9jRS!9BbV$qhma({B+`~FzPN1VZl4Zrp8 zinUM{kOo^P+(n_(h*gQ@Xm~mPL7~vjIgNa0gr!SOx-bH;H2l+`Nb`Y!QyYo-j+Q z>Zjvy9vxd<;_&wx{Wtkmw~J{4RPN&P^Yn2Pk`26*sZ4YS5~E2)5%Pyz2EL z;^Nr%dY|2fE1S3Bm>xQeCB8R18WE)85~n$8oB64>vMtajBXi#-)G79&g!k@&pD+Lj z8js=^reFLAk!wETpY>eu9wRb+{R^xnMpGk3>p=1W>~NS3DGOGw>lzviK|E*O>hNv( z+pRs|Zenq7yt_rUo7t%iJxRSN!PFM~6oXY8@v8_69=|d+HD%rzgsG;TUSmC@A8&!d z3VTl@X9SGY4o%$SuaHD_3B}qeD4L#db+wVtdeB=fJ+^q{Q_{Aon)gMcB)wRaVa7TN zR9in1ad=eo6=SaAGh1(Vxb9nO+%*TF6x~VgI?JTqao2pC60wr!d^BxwM>PSbY{_Kb zEpFnN7oZMFkSQtn`*#A7Qj%VCQm6alTHEJiC-cPbpD(%btf@b;M7esJTO?UG@JS?2 z1MA6CY?1v}Dwi3{H0quKsRDr#O;&+ppH=egL9ihyX2 zA86gO3bS~%jOzqJKad?w_j9dAnB7y;kk%DWGj*f>IettZi-v&RA-vt%S%>gd#IEOV z`?#;K>?X;PP2eQ-s>b^KcwA-4uw7=_2M~#|s*OV&w6m#Nt3(?nIiZq+$*UhH? zmgc&eN@M#QtufIZvZ>JMNiLd6$Pl#X8!I{5QLuY>$p0v9SqJoSAl@K{80=)%9(S8z zSLOcpTZ^^ci_H~7{iKAaDEy2L=!z=^L4-=)Blw5kpwER;P@WgZJe8$QNbRb%nrFrQ zSvMt!(`-e1ln2K)7~*4FQ%G_A&ixb4Gki@REq2HWz-XHCZ9A*!iyXP|a}!R+DAb(z zoJO3?hhM)|SoK5@k5%e5XT!^(R+{6~QbxTd3%1*W*uUsL~}=DWWY?syp* zMiSX*-&3-B4KKz%OJRI8HvaL%ORLqUSkuUA$%)&kFc+VlpIw=CKy4X$UN!yBfe*fk z`>a2ckbeqVj}X*um>U0WhEc3gg~dQe|2BQO8OJaHuN!X7(nEmT#!7rC|1_F}D$ zuCrvKhVdzC+1)6r7Dx3ifLO9^a#$lsW~yWDy|PPGUBXz7-*TtN!U06GJre{4o6W1; zK7$ly_}|185xEF5s;|4B0^#sd?-G;wpbaRQs*WQB2dj1Q#WyFK{^?QJ%0UC?yG(p! z@Z@S4#FvA^w!FfTv|)LI_DjW}d--?_RCU{tl|R$yy3A)}D`0m(SFToDY~1SL@Hik9 zV$iTQ#uGSW&F{xKCzANA_>|S8L5U}eU@raf?yqXy1J;>-&je%qMK54c`G4pP*c@QfoGO>TlPKj^bIUM@Pu zoroacMTj^~Q*~?^7&NpXuW@l-=J|*0(Ya(Crtrso0C0zHu)0A811$Q82$1hDF}U`m zCVUfc_Qutamv%`wTVVin9f%*e`hJo`*`iT2FZDM&X@Heg{PMuj`8BF9Lzh|nkGxu3 zp-W+!KWGx#ZqPu)bsbRZ8fjVztS0Zd(=oVmWHJxP6}+|>_?JxMo*U?)r1%iaEY9$? zf&flm&B%Afv+bmT4-kP26&6Q*Mc4#gsvR>e`b`{(m=nU~?`uua1W{6Mrgn1>S2-5& zs}=Iu#WGJvHMbd%Qq=zSByEaBBjQ5%kSl-YfZ)%iVP{;)@N~YtqyQpX?D}<&KYmgo zBk6;e>)lO{8R@NY+BM-03>FOI@5q?c^E~$&4Oj_=MXs>Rb(PZuaeVKtc*fpkTyA_M zriAq{vni2v*6=xC%%3l8jrEoVZd5F(+2Cr1mDww^#O}Z|sJ~I7$Qzj|Xj2toina`` z3-we*eNf`5z%j+|Qp{|=s5!E6SonS9lyLmnFH%)QU=o*AE5O|Z_PE%p(Pf9%>^A#J zGsJ2C!H*w5%+ia$<&lyUp=e8$t;S^-nxuVEOl49me~ogo`7hv+c&yF)4e_`k$0hiLhZo!++-+GBSUG-RvR7;u@>CU3>F-E?w-8r|7 zyu>cOG*w%7(uc}ZOfaq$@#}s6KDaNP3K_fPsFEg@2o^lTOm6EGd~oXa(U(!QA+y>%0d{Azjo48y4Mj8?;zzPs@6Fl$-e z!<&wVSCjeL>4jLrd%7J?-#kraG6mdAjzU}@WO5Tt9_W0Ccmen98ML!W$}(ksZ3 zaTt*5hP$bhTs|Fc_8M#Fi{b1oL_oC)YrVVSsJGoX^`1KscmqS(Vp)LLrZ}t$`{_R~ zZ9Q#>gDSC#CPiQQDs_p9Gc2|*yewzQBRYG2+SzmdXqKCX;_UYOmjXgsg@CoFhwNwq zj}H6X-?}-uysV+c3$vpY;ZP{YxE_M5dry~N-MIbcNc6TQczcQT6_folFaF1%2X#U0 z2yK`D!pB>Ugner_FvfZ|kBjbacLhf=T;TKsC#Nl4oUZpmL_`?p=oFFci9B!UEFXG) zdD7Q2up*9=OnuIj|DTO!_fS)BVP9zwu6-7o%3V^F*U>j5QF4(V`t#3we!hA*UkGk7 zT@glmLZoVhx^7>eSXFe)Tk*fzYrONZ-&i@Ob3z5%y2#_MN~+F9F5u)8GJ^Pv+HXcT z?$v9MXm2mkS4keY%?1_Rg3wW(1bmSNZ^i0-^d=&5jv>=yQ_$7mG^F+RU*Q;MzH_i- ze1aK29%Le7_j96hGBxHyeqP_(4F+Hk7v)xtYmT zBobD%2Qouk0eCHnscXIEuC;dv4y5jHl9Q^2Rtpk$P(lJFk~!KKk7s(6P-l?1O2BP+ z#U1hj9u{fTK<%^IiC`O;*B-)eD`9d*Q ziB;cdiHb9Nd}1;+)z&74W-p70VCe}k{f1uTj-=Y|@+j*Zj~LuBZ%x(r7(KYoNKdCD zkdYM7-Gv<#G*MnC8kw}Vt%kZAmF4!b>Foa*SE0l|518~{d!u1s1LJjj?qWRpK{opx zIWqBTU)L@3kYdGMb3CuQIO`Q9n~sBs^zG3cy7rDV`OFmVs6*S)_kuA1mMMW>ruzoPv8B z&8#JlJ;iH;TfQCc`k=TSZ((*qJA;g4$iCs4+`RuA^rce z=3|n|=VD9tTIPzW?k0vT6tU_bwCAUPwQp(T7P)SxIl0&;EIssE_|`CHCU&lY!-?`W={Ef@tVx_ai5#4zeEwSW=t+_?;i}@%w=OpDUyL$Y~RY5Los%0D< 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

=$Pcj62Gw;!tOQ{)$^o_;w9y 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 literal 0 HcmV?d00001 diff --git a/Wiki/images/botchannelgovernment_2.png b/Wiki/images/botchannelgovernment_2.png new file mode 100644 index 0000000000000000000000000000000000000000..61291d76be63ab36c66152bedf85ecffcb9f16e9 GIT binary patch literal 114439 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 q^6tv8AvzCP$^QR7^i((# literal 0 HcmV?d00001 diff --git a/Wiki/images/botchannelgovernment_3.png b/Wiki/images/botchannelgovernment_3.png new file mode 100644 index 0000000000000000000000000000000000000000..24eb88cdb091d79b7e8e7e7362599f4802417d59 GIT binary patch literal 64247 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

      DJWPvW~ST zvpAE+Mjc1&rxe#hpN6ixxvR3r6J`Yfu~=)QA63Q6Q!SbIA*{*2)3@i{=J)h+W*{(eq!=cfC!-g4ZyQ;q*alQS8dKx<^4Q# zow(=jf~xR8g%OCvwWlQdP`D0Mdf|mtjw4-#$+skG#lzTC`Tnn*{=(MnDLn4Q32F9g z2kq>GUYF}a^;{p`-H(3H?ROkLI5@r`dXp|b>(}HEzvX13euBY>VVds${oK5DrRxIX XRI*8aUpeN00DSIh=&2X0B9Q+NXkgGO literal 0 HcmV?d00001 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 37ff861ed..531f959c2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -13,6 +13,26 @@ variables: steps: - checkout: self +- task: NodeTool@0 + displayName: 'Use Node =16.x' + inputs: + versionSpec: '=16.x' + +- task: Npm@1 + displayName: 'npm install' + inputs: + command: custom + workingDir: Source\CompanyCommunicator\ClientApp + verbose: false + customCommand: 'install --save --legacy-peer-deps' + +- task: Npm@1 + displayName: 'npm build' + inputs: + command: custom + workingDir: Source\CompanyCommunicator\ClientApp + verbose: false + customCommand: 'run build' - task: UseDotNet@2 displayName: 'Use .NET 6.0.x' inputs: