From 42890acd3a4ef0dcb96555d236309f72f312705a Mon Sep 17 00:00:00 2001 From: Martin Regen Date: Fri, 21 Dec 2018 11:38:50 +0100 Subject: [PATCH] Create new key pair for app cert in KeyVault (#24) - fix comments and warnings - create a new key pair in keyvault instead of in the service - start with deployment script, still lacks a few security settings --- .editorconfig | 4 +- Directory.Build.props | 2 + app/Controllers/ApplicationController.cs | 28 +- app/Controllers/DownloadController.cs | 18 +- app/Dockerfile | 12 +- azure-iiot-opc-vault-service.sln | 7 +- common.props | 17 + deploy/.gitignore | 3 + deploy/cloud/run.ps1 | 134 ++ deploy/cloud/template.json | 131 ++ deploy/deploy.ps1 | 770 +++++++ module/OpcVaultApplicationsDatabase.cs | 8 +- project.props | 7 + .../CosmosDBApplicationsDatabase.cs | 53 +- src/CosmosDB/DocumentDBCollection.cs | 15 +- Dockerfile => src/Dockerfile | 0 Dockerfile.Windows => src/Dockerfile.Windows | 0 src/Dockerfile.Windows-Server2016 | 20 + .../KeyVaultCertificateGroupProvider.cs | 51 +- src/KeyVault/KeyVaultServiceClient.cs | 125 +- src/KeyVault/KeyVaultSignature.cs | 6 +- src/v1/Controllers/StatusController.cs | 8 +- thirdpartynotices.txt | 1798 +++++++++++++++++ version.props | 6 - 24 files changed, 3137 insertions(+), 86 deletions(-) create mode 100644 common.props create mode 100644 deploy/.gitignore create mode 100644 deploy/cloud/run.ps1 create mode 100644 deploy/cloud/template.json create mode 100644 deploy/deploy.ps1 create mode 100644 project.props rename Dockerfile => src/Dockerfile (100%) rename Dockerfile.Windows => src/Dockerfile.Windows (100%) create mode 100644 src/Dockerfile.Windows-Server2016 create mode 100644 thirdpartynotices.txt diff --git a/.editorconfig b/.editorconfig index 254ae76..8897cc1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -17,7 +17,7 @@ charset = utf-8 indent_size = 2 # project files -[*.{sh] +[*.{sh}] end_of_line = lf [*.{cs}] @@ -32,7 +32,7 @@ trim_trailing_whitespace = false [*.{cs}] # Organize usings -dotnet_sort_system_directives_first = false +dotnet_sort_system_directives_first = true:warning # this. preferences dotnet_style_qualification_for_field = false:warning diff --git a/Directory.Build.props b/Directory.Build.props index f0932b1..c3aab74 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,3 +1,5 @@  + + diff --git a/app/Controllers/ApplicationController.cs b/app/Controllers/ApplicationController.cs index f12cfa7..f78561d 100644 --- a/app/Controllers/ApplicationController.cs +++ b/app/Controllers/ApplicationController.cs @@ -22,19 +22,19 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.Controllers [Authorize] public class ApplicationController : Controller { - private IOpcVault opcVault; - private readonly OpcVaultApiOptions opcVaultOptions; - private readonly AzureADOptions azureADOptions; - private readonly ITokenCacheService tokenCacheService; + private IOpcVault _opcVault; + private readonly OpcVaultApiOptions _opcVaultOptions; + private readonly AzureADOptions _azureADOptions; + private readonly ITokenCacheService _tokenCacheService; public ApplicationController( OpcVaultApiOptions opcVaultOptions, AzureADOptions azureADOptions, ITokenCacheService tokenCacheService) { - this.opcVaultOptions = opcVaultOptions; - this.azureADOptions = azureADOptions; - this.tokenCacheService = tokenCacheService; + _opcVaultOptions = opcVaultOptions; + _azureADOptions = azureADOptions; + _tokenCacheService = tokenCacheService; } @@ -46,7 +46,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.Controllers var applicationsTrimmed = new List(); do { - var applications = await opcVault.QueryApplicationsPageAsync(applicationQuery); + var applications = await _opcVault.QueryApplicationsPageAsync(applicationQuery); foreach (var app in applications.Applications) { applicationsTrimmed.Add(new ApplicationRecordTrimmedApiModel(app)); @@ -64,7 +64,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.Controllers return new BadRequestResult(); } AuthorizeClient(); - var application = await opcVault.GetApplicationAsync(id); + var application = await _opcVault.GetApplicationAsync(id); if (application == null) { return new NotFoundResult(); @@ -79,7 +79,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.Controllers public async Task UnregisterConfirmedAsync([Bind("Id")] string id) { AuthorizeClient(); - await opcVault.UnregisterApplicationAsync(id); + await _opcVault.UnregisterApplicationAsync(id); return RedirectToAction("Index"); } @@ -87,7 +87,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.Controllers public async Task DetailsAsync(string id) { AuthorizeClient(); - var application = await opcVault.GetApplicationAsync(id); + var application = await _opcVault.GetApplicationAsync(id); if (application == null) { return new NotFoundResult(); @@ -97,11 +97,11 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.Controllers private void AuthorizeClient() { - if (opcVault == null) + if (_opcVault == null) { ServiceClientCredentials serviceClientCredentials = - new OpcVaultLoginCredentials(opcVaultOptions, azureADOptions, tokenCacheService, User); - opcVault = new OpcVault(new Uri(opcVaultOptions.BaseAddress), serviceClientCredentials); + new OpcVaultLoginCredentials(_opcVaultOptions, _azureADOptions, _tokenCacheService, User); + _opcVault = new OpcVault(new Uri(_opcVaultOptions.BaseAddress), serviceClientCredentials); } } diff --git a/app/Controllers/DownloadController.cs b/app/Controllers/DownloadController.cs index 09ed5a1..cc92b5e 100644 --- a/app/Controllers/DownloadController.cs +++ b/app/Controllers/DownloadController.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for // license information. // @@ -21,18 +21,18 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.Controllers public class DownloadController : Controller { protected IOpcVault opcVault; - private readonly OpcVaultApiOptions opcVaultOptions; - private readonly AzureADOptions azureADOptions; - private readonly ITokenCacheService tokenCacheService; + private readonly OpcVaultApiOptions _opcVaultOptions; + private readonly AzureADOptions _azureADOptions; + private readonly ITokenCacheService _tokenCacheService; public DownloadController( OpcVaultApiOptions opcVaultOptions, AzureADOptions azureADOptions, ITokenCacheService tokenCacheService) { - this.opcVaultOptions = opcVaultOptions; - this.azureADOptions = azureADOptions; - this.tokenCacheService = tokenCacheService; + _opcVaultOptions = opcVaultOptions; + _azureADOptions = azureADOptions; + _tokenCacheService = tokenCacheService; } [ActionName("Details")] @@ -298,8 +298,8 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.Controllers if (opcVault == null) { ServiceClientCredentials serviceClientCredentials = - new OpcVaultLoginCredentials(opcVaultOptions, azureADOptions, tokenCacheService, User); - opcVault = new OpcVault(new Uri(opcVaultOptions.BaseAddress), serviceClientCredentials); + new OpcVaultLoginCredentials(_opcVaultOptions, _azureADOptions, _tokenCacheService, User); + opcVault = new OpcVault(new Uri(_opcVaultOptions.BaseAddress), serviceClientCredentials); } } diff --git a/app/Dockerfile b/app/Dockerfile index 76478ca..1028948 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -5,16 +5,16 @@ EXPOSE 44342 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src -COPY opc-gds-app/Microsoft.Azure.IIoT.OpcUa.Services.Gds.App.csproj Gds.App/ -RUN dotnet restore Gds.App/Microsoft.Azure.IIoT.OpcUa.Services.Gds.App.csproj +COPY Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.csproj Vault.App/ +RUN dotnet restore Vault.App/Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.csproj COPY . . -WORKDIR /src/Gds.App -RUN dotnet build Microsoft.Azure.IIoT.OpcUa.Services.Gds.App.csproj -c Release -o /app +WORKDIR /src/Vault.App +RUN dotnet build Microsoft.Azure.IIoT.OpcUa.Services.Gds.Vault.csproj -c Release -o /app FROM build AS publish -RUN dotnet publish Microsoft.Azure.IIoT.OpcUa.Services.Gds.App.csproj -c Release -o /app +RUN dotnet publish Microsoft.Azure.IIoT.OpcUa.Services.Gds.Vault.csproj -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . -ENTRYPOINT ["dotnet", "Microsoft.Azure.IIoT.OpcUa.Services.Gds.App.dll"] +ENTRYPOINT ["dotnet", "Microsoft.Azure.IIoT.OpcUa.Services.Vault.App.dll"] diff --git a/azure-iiot-opc-vault-service.sln b/azure-iiot-opc-vault-service.sln index 48b8f53..b8dfe91 100644 --- a/azure-iiot-opc-vault-service.sln +++ b/azure-iiot-opc-vault-service.sln @@ -10,11 +10,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .gitattributes = .gitattributes .gitignore = .gitignore .travis.yml = .travis.yml + common.props = common.props CONTRIBUTING.md = CONTRIBUTING.md DEVELOPMENT.md = DEVELOPMENT.md - Dockerfile = Dockerfile - Dockerfile.Windows = Dockerfile.Windows + src\Dockerfile = src\Dockerfile + app\Dockerfile = app\Dockerfile + src\Dockerfile.Windows = src\Dockerfile.Windows LICENSE = LICENSE + project.props = project.props README.md = README.md version.props = version.props EndProjectSection diff --git a/common.props b/common.props new file mode 100644 index 0000000..a1c9acc --- /dev/null +++ b/common.props @@ -0,0 +1,17 @@ + + + Microsoft Azure Industrial IoT OPC UA Vault Service + $(RepositoryUrl)/blob/master/LICENSE + Microsoft + Microsoft + © Microsoft Corporation. All rights reserved. + http://go.microsoft.com/fwlink/?LinkID=288890 + $(RepositoryUrl)/releases + $(RepositoryUrl) + true + true + true + + false + + diff --git a/deploy/.gitignore b/deploy/.gitignore new file mode 100644 index 0000000..2e0a0ca --- /dev/null +++ b/deploy/.gitignore @@ -0,0 +1,3 @@ +.user +.app +.env \ No newline at end of file diff --git a/deploy/cloud/run.ps1 b/deploy/cloud/run.ps1 new file mode 100644 index 0000000..aa306a3 --- /dev/null +++ b/deploy/cloud/run.ps1 @@ -0,0 +1,134 @@ +<# + .SYNOPSIS + Deploys to Azure + + .DESCRIPTION + Deploys an Azure Resource Manager template of choice + + .PARAMETER resourceGroupName + The resource group where the template will be deployed. + + .PARAMETER aadConfig + The AAD configuration the template will be configured with. + + .PARAMETER interactive + Whether to run in interactive mode +#> + +param( + [Parameter(Mandatory=$True)] [string] $resourceGroupName, + $aadConfig = $null, + $interactive = $true +) + +#****************************************************************************** +# Generate a random password +#****************************************************************************** +Function CreateRandomPassword() { + param( + $length = 15 + ) + $punc = 46..46 + $digits = 48..57 + $lcLetters = 65..90 + $ucLetters = 97..122 + + $password = ` + [char](Get-Random -Count 1 -InputObject ($lcLetters)) + ` + [char](Get-Random -Count 1 -InputObject ($ucLetters)) + ` + [char](Get-Random -Count 1 -InputObject ($digits)) + ` + [char](Get-Random -Count 1 -InputObject ($punc)) + $password += get-random -Count ($length -4) ` + -InputObject ($punc + $digits + $lcLetters + $ucLetters) |` + % -begin { $aa = $null } -process {$aa += [char]$_} -end {$aa} + + return $password +} + +#****************************************************************************** +# Script body +#****************************************************************************** +$ErrorActionPreference = "Stop" +$ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path + +# Register RPs +Register-AzureRmResourceProvider -ProviderNamespace "microsoft.web" | Out-Null +#Register-AzureRmResourceProvider -ProviderNamespace "microsoft.compute" | Out-Null + +# Set admin password +$adminPassword = CreateRandomPassword +$templateParameters = @{ + # adminPassword = $adminPassword +} + +try { + # Try set branch name as current branch + $output = cmd /c "git rev-parse --abbrev-ref HEAD" 2`>`&1 + $branchName = ("{0}" -f $output); + Write-Host "VM deployment will use configuration from '$branchName' branch." + # $templateParameters.Add("branchName", $branchName) +} +catch { + # $templateParameters.Add("branchName", "master") +} + +# Configure auth +if ($aadConfig) { + if (![string]::IsNullOrEmpty($aadConfig.Audience)) { + # $templateParameters.Add("authAudience", $aadConfig.Audience) + } + if (![string]::IsNullOrEmpty($aadConfig.ClientId)) { + # $templateParameters.Add("aadClientId", $aadConfig.ClientId) + } + if (![string]::IsNullOrEmpty($aadConfig.TenantId)) { + # $templateParameters.Add("aadTenantId", $aadConfig.TenantId) + } + if (![string]::IsNullOrEmpty($aadConfig.Instance)) { + # $templateParameters.Add("aadInstance", $aadConfig.Instance) + } +} + + +# Set website name +if ($interactive) { + $webAppName = Read-Host "Please specify a website name" + if (![string]::IsNullOrEmpty($webAppName)) { + $templateParameters.Add("webAppName", $webAppName) + } +} + +# Start the deployment +$templateFilePath = Join-Path $ScriptDir "template.json" +Write-Host "Starting deployment..." +$deployment = New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName ` + -TemplateFile $templateFilePath -TemplateParameterObject $templateParameters + +$webAppPortalUrl = $deployment.Outputs["webAppPortalUrl"].Value +$webAppServiceUrl = $deployment.Outputs["webAppServiceUrl"].Value +#$adminUser = $deployment.Outputs["adminUsername"].Value + +if ($aadConfig -and $aadConfig.ClientObjectId) { + # + # Update client application to add reply urls required permissions. + # + Write-Host "Adding ReplyUrls:" + $replyUrls = New-Object System.Collections.Generic.List[System.String] + $replyUrls.Add($webAppPortalUrl) + $replyUrls.Add($webAppPortalUrl + "/oauth2-redirect.html") + Write-Host $webAppPortalUrl + "/oauth2-redirect.html" + # still connected + Set-AzureADApplication -ObjectId $aadConfig.ClientObjectId -ReplyUrls $replyUrls +} + +Write-Host +Write-Host "To access the web portal go to:" +Write-Host $webAppPortalUrl +Write-Host +Write-Host "To access the web service go to:" +Write-Host $webAppServiceUrl +Write-Host +#Write-Host "Use the following User and Password to log onto your VM:" +#Write-Host +#Write-Host $adminUser +#Write-Host $adminPassword +#Write-Host diff --git a/deploy/cloud/template.json b/deploy/cloud/template.json new file mode 100644 index 0000000..75e3731 --- /dev/null +++ b/deploy/cloud/template.json @@ -0,0 +1,131 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "webAppName": { + "type": "string", + "metadata": { + "description": "Base name of the resource such as web app name and app service plan " + }, + "minLength": 2 + } + }, + "variables": { + "tenantId": "[subscription().tenantId]", + "randomSuffix": "[take(uniqueString(subscription().subscriptionId, resourceGroup().id, parameters('webAppName')), 5)]", + "applocation": "[resourceGroup().location]", + "keyVaultName": "[concat('vault-', variables('randomSuffix'))]", + "vaultSku": "Premium", + "enabledForDeployment": true, + "enabledForTemplateDeployment": false, + "enableVaultForVolumeEncryption": false, + "webAppSku": "S1", + "webAppPortalName": "[concat(parameters('webAppName'), '-app')]", + "webAppServiceName": "[concat(parameters('webAppName'), '-service')]", + "appServicePlanName": "[concat('AppServicePlan-', parameters('webAppName'))]", + "documentDBName": "[concat('cosmosdb-', variables('randomSuffix'))]", + "documentDBApiVersion": "2016-03-19", + "documentDBResourceId": "[resourceId('Microsoft.DocumentDb/databaseAccounts', variables('documentDBName'))]", + "apiType": "SQL", + "offerType": "Standard" + }, + "resources": [ + { + "apiVersion": "2017-08-01", + "type": "Microsoft.Web/serverfarms", + "kind": "app", + "name": "[variables('appServicePlanName')]", + "location": "[variables('applocation')]", + "comments": "This app service plan is used for the web app and slots.", + "properties": {}, + "dependsOn": [], + "sku": { + "name": "[variables('webAppSku')]" + } + }, + { + "comments": "Azure CosmosDb", + "apiVersion": "[variables('documentDBApiVersion')]", + "type": "Microsoft.DocumentDb/databaseAccounts", + "kind": "GlobalDocumentDB", + "name": "[variables('documentDBName')]", + "location": "[variables('applocation')]", + "properties": { + "name": "[variables('documentDBName')]", + "databaseAccountOfferType": "standard", + "consistencyPolicy": { + "defaultConsistencyLevel": "Session", + "maxStalenessPrefix": 10, + "maxIntervalInSeconds": 5 + } + }, + "dependsOn": [] + }, + { + "type": "Microsoft.KeyVault/vaults", + "name": "[variables('keyVaultName')]", + "apiVersion": "2015-06-01", + "location": "[variables('applocation')]", + "tags": { + "displayName": "KeyVault" + }, + "properties": { + "enabledForDeployment": "[variables('enabledForDeployment')]", + "enabledForTemplateDeployment": "[variables('enabledForTemplateDeployment')]", + "enabledForVolumeEncryption": "[variables('enableVaultForVolumeEncryption')]", + "tenantId": "[variables('tenantId')]", + "sku": { + "name": "[variables('vaultSku')]", + "family": "A" + }, + "accessPolicies": [] + } + }, + { + "apiVersion": "2016-08-01", + "type": "Microsoft.Web/sites", + "kind": "app", + "name": "[variables('webAppPortalName')]", + "location": "[variables('applocation')]", + "comments": "This is the web app, also the default 'nameless' slot.", + "properties": { + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]" + ] + }, + { + "apiVersion": "2016-08-01", + "type": "Microsoft.Web/sites", + "kind": "app", + "name": "[variables('webAppServiceName')]", + "location": "[variables('applocation')]", + "comments": "This is the web app service, also the default 'nameless' slot.", + "properties": { + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]" + ] + } + ], + "outputs": { + "webAppPortalUrl": { + "type": "string", + "value": "[concat('https://', reference(concat('Microsoft.Web/sites/', variables('webAppPortalName'))).hostNames[0])]" + }, + "webAppServiceUrl": { + "type": "string", + "value": "[concat('https://', reference(concat('Microsoft.Web/sites/', variables('webAppServiceName'))).hostNames[0])]" + }, + "resourceGroup": { + "type": "string", + "value": "[resourceGroup().name]" + }, + "tenantId": { + "type": "string", + "value": "[variables('tenantId')]" + } + } +} diff --git a/deploy/deploy.ps1 b/deploy/deploy.ps1 new file mode 100644 index 0000000..3eae1a3 --- /dev/null +++ b/deploy/deploy.ps1 @@ -0,0 +1,770 @@ +<# + .SYNOPSIS + Deploys Industrial IoT services to Azure + + .DESCRIPTION + Deploys the Industrial IoT services dependencies and optionally micro services and UI to Azure. + + .PARAMETER type + The type of deployment (cloud, vm, local) + + .PARAMETER resourceGroupName + Can be the name of an existing or a new resource group. + + .PARAMETER subscriptionId + Optional, the subscription id where resources will be deployed. + + .PARAMETER subscriptionName + Or alternatively the subscription name. + + .PARAMETER resourceGroupLocation + Optional, a resource group location. If specified, will try to create a new resource group in this location. + + .PARAMETER withAuthentication + Whether to enable authentication - defaults to $true. + + .PARAMETER tenantId + AD tenant to use. + + .PARAMETER credentials + To support non interactive usage of script. (TODO) +#> + +param( + [string] $type = "cloud", + [string] $resourceGroupName, + [string] $resourceGroupLocation, + [string] $subscriptionName, + [string] $subscriptionId, + [string] $accountName, + $credentials, + [string] $tenantId, + [bool] $withAuthentication = $true, + [ValidateSet("AzureCloud")] [string] $environmentName = "AzureCloud" +) + +$script:optionIndex = 0 + +#******************************************************************************************************* +# Validate environment names +#******************************************************************************************************* +Function SelectEnvironment() { + switch ($script:environmentName) { + "AzureCloud" { + if ((Get-AzureRMEnvironment AzureCloud) -eq $null) { + Add-AzureRMEnvironment -Name AzureCloud -EnableAdfsAuthentication $False ` + -ActiveDirectoryServiceEndpointResourceId https://management.core.windows.net/ ` + -GalleryUrl https://gallery.azure.com/ ` + -ServiceManagementUrl https://management.core.windows.net/ ` + -SqlDatabaseDnsSuffix .database.windows.net ` + -StorageEndpointSuffix core.windows.net ` + -ActiveDirectoryAuthority https://login.microsoftonline.com/ ` + -GraphUrl https://graph.windows.net/ ` + -trafficManagerDnsSuffix trafficmanager.net ` + -AzureKeyVaultDnsSuffix vault.azure.net ` + -AzureKeyVaultServiceEndpointResourceId https://vault.azure.net ` + -ResourceManagerUrl https://management.azure.com/ ` + -ManagementPortalUrl http://go.microsoft.com/fwlink/?LinkId=254433 + } + $script:locations = @("West US", "North Europe", "West Europe") + } + default { + throw ("'{0}' is not a supported Azure Cloud environment" -f $script:environmentName) + } + } + $script:environment = Get-AzureRmEnvironment $script:environmentName + $script:environmentName = $script:environment.Name +} + +#******************************************************************************************************* +# Called in case no account is configured to let user choose the account. +#******************************************************************************************************* +Function SelectAccount() { + if (![string]::IsNullOrEmpty($script:accountName)) { + # Validate Azure account + $account = Get-AzureAccount -Name $script:accountName + if ($account -eq $null) { + Write-Error ("Specified account {0} does not exist" -f $script:accountName) + } + else { + if ([string]::IsNullOrEmpty($account.Subscriptions) -or ` + (Get-AzureSubscription -SubscriptionId ` + ($account.Subscriptions -replace '(?:\r\n)',',').split(",")[0]) -eq $null) { + Write-Warning ("No subscriptions in account {0}." -f $script:accountName) + $account = $null + } + } + } + if ($account -eq $null) { + $accounts = Get-AzureAccount + if ($accounts -eq $null) { + $account = Add-AzureAccount -Environment $script:environmentName + } + else { + Write-Host "Select Azure account to use" + $script:optionIndex = 1 + Write-Host + Write-Host ("Available accounts in Azure environment '{0}':" -f $script:environmentName) + Write-Host + Write-Host (($accounts | ` + Format-Table @{ ` + Name = 'Option'; ` + Expression = { ` + $script:optionIndex; $script:optionIndex+=1 ` + }; ` + Alignment = 'right' ` + }, Id, Subscriptions -AutoSize) | Out-String).Trim() + Write-Host (("{0}" -f $script:optionIndex).PadLeft(6) + " Use another account") + Write-Host + $account = $null + while ($account -eq $null) { + try { + [int]$script:optionIndex = Read-Host "Select an option" + } + catch { + Write-Host "Must be a number" + continue + } + if ($script:optionIndex -eq $accounts.length + 1) { + $account = Add-AzureAccount -Environment $script:environmentName + break + } + if ($script:optionIndex -lt 1 -or $script:optionIndex -gt $accounts.length) { + continue + } + $account = $accounts[$script:optionIndex - 1] + } + } + } + if ([string]::IsNullOrEmpty($account.Id)) { + throw ("There was no account selected. Please check and try again.") + } + $script:accountName = $account.Id +} + +#******************************************************************************************************* +# Perform login - uses profile file if exists +#******************************************************************************************************* +Function Login() { + $rmProfileLoaded = $False + $profileFile = Join-Path $script:ScriptDir ".user" + if ([string]::IsNullOrEmpty($script:accountName)) { + # Try to use saved profile if one is available + if (Test-Path "$profileFile") { + Write-Output ("Use saved profile from '{0}'" -f $profileFile) + $rmProfile = Import-AzureRmContext -Path "$profileFile" + $rmProfileLoaded = ($rmProfile -ne $null) ` + -and ($rmProfile.Context -ne $null) ` + -and ((Get-AzureRmSubscription) -ne $null) + } + if ($rmProfileLoaded) { + $script:accountName = $rmProfile.Context.Account.Id + } + } + if (!$rmProfileLoaded) { + # select account + Write-Host "Logging in..." + SelectAccount + try { + Login-AzureRmAccount -EnvironmentName $script:environmentName -ErrorAction Stop | Out-Null + } + catch { + throw "The login to the Azure account was not successful." + } + $reply = Read-Host -Prompt "Save user profile in $profileFile? [y/n]" + if ($reply -match "[yY]") { + Save-AzureRmContext -Path "$profileFile" + } + } +} + +#******************************************************************************************************* +# Select the subscription identifier +#******************************************************************************************************* +Function SelectSubscription() { + $subscriptions = Get-AzureRMSubscription + if ($script:subscriptionName -ne $null -and $script:subscriptionName -ne "") { + $subscriptionId = Get-AzureRmSubscription -SubscriptionName $script:subscriptionName + } + else { + $subscriptionId = $script:subscriptionId + } + + if (![string]::IsNullOrEmpty($subscriptionId)) { + if (!$subscriptions.Id.Contains($subscriptionId)) { + Write-Error ("Invalid subscription id {0}" -f $subscriptionId) + $subscriptionId = "" + } + } + + if ([string]::IsNullOrEmpty($subscriptionId)) { + if ($subscriptions.Count -eq 1) { + $subscriptionId = $subscriptions[0].Id + } + else { + Write-Output "Select an Azure subscription to use... " + $script:optionIndex = 1 + Write-Host + Write-Host ("Available subscriptions for account '{0}'" -f $script:accountName) + Write-Host + Write-Host ($subscriptions | Format-Table @{ ` + Name='Option'; ` + Expression={ ` + $script:optionIndex;$script:optionIndex+=1 ` + }; ` + Alignment='right' ` + },Name, Id -AutoSize | Out-String).Trim() + Write-Host + while (!$subscriptions.Id.Contains($subscriptionId)) { + try { + [int]$script:optionIndex = Read-Host "Select an option" + } + catch { + Write-Host "Must be a number!" + continue + } + if ($script:optionIndex -lt 1 -or $script:optionIndex -gt $subscriptions.length) { + continue + } + $subscriptionId = $subscriptions[$script:optionIndex - 1].Id + } + } + } + $script:subscriptionId = $subscriptionId + Write-Host "Azure subscriptionId '$subscriptionId' selected." +} + +#******************************************************************************************************* +# Called if no Azure location is configured for the deployment to let the user choose a location. +#******************************************************************************************************* +Function SelectLocation() { + $locations = @() + $index = 1 + foreach ($location in $script:locations) { + $newLocation = New-Object System.Object + $newLocation | Add-Member -MemberType NoteProperty -Name "Option" -Value $index + $newLocation | Add-Member -MemberType NoteProperty -Name "Location" -Value $location + $locations += $newLocation + $index += 1 + } + Write-Host + Write-Host ("Please choose a location in Azure environment '{0}':" -f $script:environmentName) + $script:optionIndex = 1 + Write-Host ($locations | Format-Table @{ ` + Name='Option'; ` + Expression={ ` + $script:optionIndex;$script:optionIndex+=1 ` + }; ` + Alignment='right' ` + }, @{ ` + Name="Location"; ` + Expression={ ` + $_.Location ` + } ` + } -AutoSize | Out-String).Trim() + Write-Host + $location = "" + while ($location -eq "" -or !(ValidateLocation $location)) { + try { + [int]$script:optionIndex = Read-Host "Select an option" + } + catch { + Write-Host "Must be a number" + continue + } + if ($script:optionIndex -lt 1 -or $script:optionIndex -ge $index) { + continue + } + $location = $script:locations[$script:optionIndex - 1] + } + Write-Verbose "Azure location '$location' selected." + $script:resourceGroupLocation = $location +} + +#******************************************************************************************************* +# Validate a location +#******************************************************************************************************* +Function ValidateLocation() { + Param ( + [string] $locationToValidate + ) + if (![string]::IsNullOrEmpty($locationToValidate)) { + $locationToValidate = $locationToValidate.Replace(' ', '').ToLowerInvariant() + foreach ($location in $script:locations) { + if ($location.Replace(' ', '').ToLowerInvariant() -eq $locationToValidate) { + return $True + } + } + Write-Warning "Location '$locationToValidate' is not available." + } + return $false +} + +#******************************************************************************************************* +# Acquire bearer token for user +#******************************************************************************************************* +Function AcquireToken() { + Param ( + [string] $tenant, + [string] $authUri, + [string] $resourceUri, + [Parameter(Mandatory=$false)] [string] $user = $null, + [Parameter(Mandatory=$false)] [string] $prompt = "Auto" + ) + $psAadClientId = "1950a258-227b-4e31-a9cf-717495945fc2" + [Uri]$aadRedirectUri = "urn:ietf:wg:oauth:2.0:oob" + $authority = "{0}{1}" -f $authUri, $tenant + $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" ` + -ArgumentList $authority,$true + $userId = [Microsoft.IdentityModel.Clients.ActiveDirectory.UserIdentifier]::AnyUser + if (![string]::IsNullOrEmpty($user)) { + $userId = new-object Microsoft.IdentityModel.Clients.ActiveDirectory.UserIdentifier ` + -ArgumentList $user, "OptionalDisplayableId" + } + $authResult = $authContext.AcquireToken($resourceUri, $psAadClientId, ` + $aadRedirectUri, $prompt, $userId) + return $authResult +} + + +#******************************************************************************************************* +# Select azure ad tenant available to user +#******************************************************************************************************* +Function SelectAzureADTenantId() { + $tenants = Get-AzureRmTenant + if ($tenants.Count -eq 0) { + throw ("No Active Directory domains found for '{0}'" -f $script:accountName) + } + if ($tenants.Count -eq 1) { + $tenantId = $tenants[0].Id + } + else { + # List Active directories associated with account + $directories = @() + $index = 1 + [int]$selectedIndex = -1 + foreach ($tenantObj in $tenants) { + $tenant = $tenantObj.Id + $uri = "{0}{1}/me?api-version=1.6" -f $script:environment.GraphUrl, $tenant + $token = AcquireToken $tenant $script:environment.ActiveDirectoryAuthority ` + $script:environment.GraphUrl $script:accountName "Auto" + $result = Invoke-RestMethod -Method "GET" -Uri $uri -Headers @{ ` + "Authorization"=$($token.CreateAuthorizationHeader()); ` + "Content-Type"="application/json" ` + } + $directory = New-Object System.Object + $directory | Add-Member -MemberType NoteProperty ` + -Name "Option" -Value $index + $directory | Add-Member -MemberType NoteProperty ` + -Name "Directory Name" -Value ($result.userPrincipalName.Split('@')[1]) + $directory | Add-Member -MemberType NoteProperty ` + -Name "Tenant Id" -Value $tenant + $directories += $directory + $index += 1 + } + if ($selectedIndex -eq -1) { + Write-Host + Write-Host "Select an Active Directory Tenant to use..." + Write-Host "Available:" + Write-Host + Write-Host ($directories | Out-String) -NoNewline + while ($selectedIndex -lt 1 -or $selectedIndex -ge $index) { + try { + [int]$selectedIndex = Read-Host "Select an option" + } + catch { + Write-Host "Must be a number" + } + } + } + $tenantId = $tenants[$selectedIndex - 1].Id + } + return $tenantId +} + +#******************************************************************************************************* +# Login to Azure AD (interactive if credentials are not already provided. +#******************************************************************************************************* +Function ConnectToAzureADTenant() { + if ($script:interactive) { + # Interactive + if (!$script:tenantId) { + if (!$script:withAuthentication) { + $reply = Read-Host -Prompt "Enable authentication? [y/n]" + if ( $reply -notmatch "[yY]" ) { + return $null + } + } + $script:tenantId = SelectAzureADTenantId + } + } + if (!$script:credentials) { + if (!$script:tenantId) { + throw "No tenant selected for AAD connect." + } + else { + # Make sure we get token from token cache instead of interactive logon + $graphAuth = AcquireToken $script:tenantId $script:environment.ActiveDirectoryAuthority ` + $script:environment.GraphUrl $script:accountName "Auto" + $user = Invoke-RestMethod -Method "GET" ` + -Uri ("{0}{1}/me?api-version=1.6" -f $script:environment.GraphUrl, $script:tenantId) ` + -Headers @{ ` + "Authorization"=$($graphAuth.CreateAuthorizationHeader()); ` + "Content-Type"="application/json" ` + } + return Connect-AzureAD -MsAccessToken $graphAuth.AccessToken -TenantId $script:tenantId ` + -ErrorAction Stop -AadAccessToken $graphAuth.AccessToken -AccountId $user.userPrincipalName + } + } + else { + if (!$script:tenantId) { + # use home tenant + return Connect-AzureAD -Credential $script:credential ` + -ErrorAction Stop + } + else { + return Connect-AzureAD -Credential $script:credential -TenantId $script:tenantId ` + -ErrorAction Stop + } + } + return $null +} + +#******************************************************************************************************* +# Adds the requiredAccesses (expressed as a pipe separated string) to the requiredAccess structure +#******************************************************************************************************* +Function AddResourcePermission() { + Param ( + $requiredAccess, + $exposedPermissions, + [string]$requiredAccesses, ` + [string]$permissionType + ) + foreach($permission in $requiredAccesses.Trim().Split("|")) { + foreach($exposedPermission in $exposedPermissions) { + if ($exposedPermission.Value -eq $permission) { + $resourceAccess = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess + # Scope = Delegated permissions | Role = Application permissions + $resourceAccess.Type = $permissionType + # Read directory data + $resourceAccess.Id = $exposedPermission.Id + $requiredAccess.ResourceAccess.Add($resourceAccess) + } + } + } +} + +#******************************************************************************************************* +# Example: GetRequiredPermissions "Microsoft Graph" "Graph.Read|User.Read" +#******************************************************************************************************* +Function GetRequiredPermissions() { + Param( + [string] $applicationDisplayName, + [string] $requiredDelegatedPermissions, + [string] $requiredApplicationPermissions, + $servicePrincipal + ) + + # If we are passed the service principal we use it directly, otherwise we find it from + # the display name (which might not be unique) + if ($servicePrincipal) { + $sp = $servicePrincipal + } + else { + $sp = Get-AzureADServicePrincipal -Filter "DisplayName eq '$applicationDisplayName'" + } + + $appid = $sp.AppId + $requiredAccess = New-Object Microsoft.Open.AzureAD.Model.RequiredResourceAccess + $requiredAccess.ResourceAppId = $appid + $requiredAccess.ResourceAccess = + New-Object System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.ResourceAccess] + + if ($requiredDelegatedPermissions) { + AddResourcePermission $requiredAccess -exposedPermissions $sp.Oauth2Permissions ` + -requiredAccesses $requiredDelegatedPermissions -permissionType "Scope" + } + if ($requiredApplicationPermissions) { + AddResourcePermission $requiredAccess -exposedPermissions $sp.AppRoles ` + -requiredAccesses $requiredApplicationPermissions -permissionType "Role" + } + return $requiredAccess +} + +#******************************************************************************************************* +# Create an application role of given name and description +#******************************************************************************************************* +Function CreateAppRole() { + param( + $current, + [string] $name, + [string] $description, + [string] $value + ) + $appRole = $current | Where-Object { $_.Value -eq $value } + if (!$appRole) { + $appRole = New-Object Microsoft.Open.AzureAD.Model.AppRole + $appRole.AllowedMemberTypes = New-Object System.Collections.Generic.List[string] + $appRole.AllowedMemberTypes.Add("User"); + $appRole.Id = New-Guid + $appRole.IsEnabled = $true + $appRole.Value = $value; + } + $appRole.DisplayName = $name + $appRole.Description = $description + return $appRole +} + +#******************************************************************************************************* +# Get configuration object for service and client applications +#******************************************************************************************************* +Function GetAzureADApplicationConfig() { + $serviceDisplayName = $script:resourceGroupName + "-service" + $clientDisplayName = $script:resourceGroupName + "-client" + $moduleDisplayName = $script:resourceGroupName + "-module" + try { + $creds = ConnectToAzureADTenant + if (!$creds) { + return $null + } + $script:tenantId = $creds.Tenant.Id + if (!$script:tenantId) { + return $null + } + + $tenant = Get-AzureADTenantDetail + $tenantName = ($tenant.VerifiedDomains | Where { $_._Default -eq $True }).Name + Write-Host "Selected Tenant '$tenantName' as authority." + + $serviceAadApplication=Get-AzureADApplication ` + -Filter "identifierUris/any(uri:uri eq 'https://$tenantName/$serviceDisplayName')" + if (!$serviceAadApplication) { + $serviceAadApplication = New-AzureADApplication -DisplayName $serviceDisplayName ` + -PublicClient $False -HomePage "https://localhost" ` + -IdentifierUris "https://$tenantName/$serviceDisplayName" + Write-Host "Created new AAD service application."+$serviceDisplayName + } + $serviceServicePrincipal=Get-AzureADServicePrincipal ` + -Filter "AppId eq '$($serviceAadApplication.AppId)'" + if (!$serviceServicePrincipal) { + $serviceServicePrincipal = New-AzureADServicePrincipal ` + -AppId $serviceAadApplication.AppId ` + -Tags {WindowsAzureActiveDirectoryIntegratedApp} + } + + $clientAadApplication=Get-AzureADApplication ` + -Filter "DisplayName eq '$clientDisplayName'" + if (!$clientAadApplication) { + $clientAadApplication = New-AzureADApplication -DisplayName $clientDisplayName ` + -PublicClient $True + Write-Host "Created new AAD client application."+$clientDisplayName + } + + $moduleAadApplication=Get-AzureADApplication ` + -Filter "DisplayName eq '$moduleDisplayName'" + if (!$moduleAadApplication) { + $moduleAadApplication = New-AzureADApplication -DisplayName $moduleDisplayName ` + -PublicClient $True + Write-Host "Created new AAD Module application. "+$moduleDisplayName + } + + # Find client principal + $clientServicePrincipal=Get-AzureADServicePrincipal ` + -Filter "AppId eq '$($clientAadApplication.AppId)'" + if (!$clientServicePrincipal) { + $clientServicePrincipal = New-AzureADServicePrincipal ` + -AppId $clientAadApplication.AppId ` + -Tags {WindowsAzureActiveDirectoryIntegratedApp} + } + + # + # Try to add current user as app owner + # + try { + $user = Get-AzureADUser -ObjectId $creds.Account.Id -ErrorAction Stop + # TODO: Check whether already owner... + + Add-AzureADApplicationOwner -ObjectId $serviceAadApplication.ObjectId ` + -RefObjectId $user.ObjectId + Add-AzureADApplicationOwner -ObjectId $clientAadApplication.ObjectId ` + -RefObjectId $user.ObjectId + Add-AzureADApplicationOwner -ObjectId $moduleAadApplication.ObjectId ` + -RefObjectId $user.ObjectId + Write-Host "'$($user.UserPrincipalName)' added as owner for applications." + } + catch { + Write-Verbose "Adding $($creds.Account.Id) as owner failed." + } + + # + # Update service application to add roles, known applications and required permissions + # + $approverRole = CreateAppRole -current $serviceAadApplication.AppRoles -name "Approver" ` + -value "Sign" -description "Approvers have the ability to issue certificates." + $writerRole = CreateAppRole -current $serviceAadApplication.AppRoles -name "Writer" ` + -value "Write" -description "Writers Have the ability to change entities." + $adminRole = CreateAppRole -current $serviceAadApplication.AppRoles -name "Administrator" ` + -value "Admin" -description "Admins can access advanced features." + $appRoles = New-Object ` + System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.AppRole] + $appRoles.Add($writerRole) + $appRoles.Add($approverRole) + $appRoles.Add($adminRole) + $knownApplications = New-Object System.Collections.Generic.List[System.String] + $knownApplications.Add($clientAadApplication.AppId) + $requiredResourcesAccess = ` + New-Object System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.RequiredResourceAccess] + $requiredPermissions = GetRequiredPermissions -applicationDisplayName "Azure Key Vault" ` + -requiredDelegatedPermissions "user_impersonation" + $requiredResourcesAccess.Add($requiredPermissions) + $requiredPermissions = GetRequiredPermissions -applicationDisplayName "Microsoft Graph" ` + -requiredDelegatedPermissions "User.Read" + $requiredResourcesAccess.Add($requiredPermissions) + Set-AzureADApplication -ObjectId $serviceAadApplication.ObjectId ` + -RequiredResourceAccess $requiredResourcesAccess ` + -KnownClientApplications $knownApplications -AppRoles $appRoles + + # + # Update client application to add reply urls required permissions. + # + $replyUrls = New-Object System.Collections.Generic.List[System.String] + $replyUrls.Add("urn:ietf:wg:oauth:2.0:oob") + $requiredResourcesAccess = ` + New-Object System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.RequiredResourceAccess] + $requiredPermissions = GetRequiredPermissions -applicationDisplayName $serviceDisplayName ` + -requiredDelegatedPermissions "user_impersonation" # "Directory.Read.All|User.Read" + $requiredResourcesAccess.Add($requiredPermissions) + $requiredPermissions = GetRequiredPermissions -applicationDisplayName "Microsoft Graph" ` + -requiredDelegatedPermissions "User.Read" + $requiredResourcesAccess.Add($requiredPermissions) + Set-AzureADApplication -ObjectId $clientAadApplication.ObjectId ` + -RequiredResourceAccess $requiredResourcesAccess -ReplyUrls $replyUrls ` + -Oauth2AllowImplicitFlow $True -Oauth2AllowUrlPathMatching $True + + # + # Update module application to add reply urls required permissions. + # + $replyUrls = New-Object System.Collections.Generic.List[System.String] + $replyUrls.Add("urn:ietf:wg:oauth:2.0:oob") + $requiredResourcesAccess = ` + New-Object System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.RequiredResourceAccess] + $requiredPermissions = GetRequiredPermissions -applicationDisplayName $serviceDisplayName ` + -requiredDelegatedPermissions "user_impersonation" # "Directory.Read.All|User.Read" + $requiredResourcesAccess.Add($requiredPermissions) + $requiredPermissions = GetRequiredPermissions -applicationDisplayName "Microsoft Graph" ` + -requiredDelegatedPermissions "User.Read" + $requiredResourcesAccess.Add($requiredPermissions) + Set-AzureADApplication -ObjectId $moduleAadApplication.ObjectId ` + -RequiredResourceAccess $requiredResourcesAccess -ReplyUrls $replyUrls ` + -Oauth2AllowImplicitFlow $True -Oauth2AllowUrlPathMatching $True + + return [pscustomobject] @{ + TenantId = $tenantId + Instance = $script:environment.ActiveDirectoryAuthority + Audience = $serviceAadApplication.IdentifierUris[0].ToString() + AppId = $serviceAadApplication.AppId + AppObjectId = $serviceAadApplication.ObjectId + ClientId = $clientAadApplication.AppId + ClientObjectId = $clientAadApplication.ObjectId + ModuleId = $moduleAadApplication.AppId + ModuleObjectId = $moduleAadApplication.ObjectId + } + } + catch { + $ex = $_.Exception + + Write-Host + Write-Host "An error occurred: $($ex.Message)" + Write-Host + Write-Host "Ensure you have installed the AzureAD cmdlets:" + Write-Host "1) Run Powershell as an administrator" + Write-Host "2) in the PowerShell window, type: Install-Module AzureAD" + Write-Host + + $reply = Read-Host -Prompt "Continue without authentication? [y/n]" + if ($reply -match "[yY]") { + return $null + } + throw $ex + } +} + +#******************************************************************************************************* +# Get or create new resource group +#******************************************************************************************************* +Function GetOrCreateResourceGroup() { + + # Registering default resource providers + Register-AzureRmResourceProvider -ProviderNamespace "microsoft.devices" | Out-Null + Register-AzureRmResourceProvider -ProviderNamespace "microsoft.documentdb" | Out-Null + Register-AzureRmResourceProvider -ProviderNamespace "microsoft.eventhub" | Out-Null + Register-AzureRmResourceProvider -ProviderNamespace "microsoft.storage" | Out-Null + + while ([string]::IsNullOrEmpty($script:resourceGroupName)) { + Write-Host + $script:resourceGroupName = Read-Host "Please provide a name for the resource group" + } + + # Create or check for existing resource group + Select-AzureRmSubscription -SubscriptionId $script:subscriptionId -Force | Out-Host + $resourceGroup = Get-AzureRmResourceGroup -Name $script:resourceGroupName ` + -ErrorAction SilentlyContinue + if(!$resourceGroup) { + Write-Host "Resource group '$script:resourceGroupName' does not exist." + if(!(ValidateLocation $script:resourceGroupLocation)) { + SelectLocation + } + New-AzureRmResourceGroup -Name $script:resourceGroupName ` + -Location $script:resourceGroupLocation | Out-Host + return $True + } + else{ + Write-Host "Using existing resource group '$script:resourceGroupName'..." + return $False + } +} + +#******************************************************************************************************* +# Script body +#******************************************************************************************************* +$ErrorActionPreference = "Stop" +$script:ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path + +$deploymentScript = Join-Path $script:ScriptDir $script:type +$deploymentScript = Join-Path $deploymentScript "run.ps1" +if(![System.IO.File]::Exists($deploymentScript)) { + throw "Invalid deployment type '$type' specified." +} + +$script:interactive = $($script:credential -eq $null) +$script:subscriptionId = $null + +SelectEnvironment +Login +SelectSubscription + +$deleteOnErrorPrompt = GetOrCreateResourceGroup +$aadConfig = GetAzureADApplicationConfig + +try { + Write-Host "Almost done..." + & ($deploymentScript) -resourceGroupName $script:resourceGroupName ` + -interactive $script:interactive -aadConfig $aadConfig + Write-Host "Deployment succeeded." +} +catch { + Write-Host "Deployment failed." + $ex = $_.Exception + if ($deleteOnErrorPrompt) { + $reply = Read-Host -Prompt "Delete resource group? [y/n]" + if ($reply -match "[yY]") { + try { + Remove-AzureRmResourceGroup -Name $script:resourceGroupName -Force + } + catch { + Write-Host $_.Exception.Message + } + } + } + throw $ex +} diff --git a/module/OpcVaultApplicationsDatabase.cs b/module/OpcVaultApplicationsDatabase.cs index 6824c7b..a8fa98c 100644 --- a/module/OpcVaultApplicationsDatabase.cs +++ b/module/OpcVaultApplicationsDatabase.cs @@ -1,14 +1,14 @@ -// ------------------------------------------------------------ +// ------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License (MIT). See License.txt in the repo root for license information. // ------------------------------------------------------------ -using Microsoft.Azure.IIoT.OpcUa.Api.Vault; -using Microsoft.Azure.IIoT.OpcUa.Api.Vault.Models; -using Opc.Ua.Gds.Server.OpcVault; using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Azure.IIoT.OpcUa.Api.Vault; +using Microsoft.Azure.IIoT.OpcUa.Api.Vault.Models; +using Opc.Ua.Gds.Server.OpcVault; namespace Opc.Ua.Gds.Server.Database.OpcVault { diff --git a/project.props b/project.props new file mode 100644 index 0000000..9eb99ca --- /dev/null +++ b/project.props @@ -0,0 +1,7 @@ + + + Azure Industrial IoT OPC Vault Services + https://github.com/Azure/azure-iiot-opc-vault-service + Industrial;Manufacturing;OPC;OPCUA;Azure;IoT;IIoT;Certificate;OpcVault;KeyVault;.NET + + diff --git a/src/ApplicationDatabase/CosmosDBApplicationsDatabase.cs b/src/ApplicationDatabase/CosmosDBApplicationsDatabase.cs index 66ebac6..c3932c6 100644 --- a/src/ApplicationDatabase/CosmosDBApplicationsDatabase.cs +++ b/src/ApplicationDatabase/CosmosDBApplicationsDatabase.cs @@ -1,4 +1,4 @@ -// ------------------------------------------------------------ +// ------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License (MIT). See License.txt in the repo root for license information. // ------------------------------------------------------------ @@ -24,23 +24,23 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault { internal sealed class CosmosDBApplicationsDatabase : IApplicationsDatabase { - const int DefaultRecordsPerQuery = 10; + const int _defaultRecordsPerQuery = 10; private readonly ILogger _log; - private readonly string Endpoint; - private readonly SecureString AuthKeyOrResourceToken; - private readonly ILifetimeScope Scope = null; + private readonly string _endpoint; + private readonly SecureString _authKeyOrResourceToken; + private readonly ILifetimeScope _scope = null; public CosmosDBApplicationsDatabase( ILifetimeScope scope, IServicesConfig config, ILogger logger) { - this.Scope = scope; - this.Endpoint = config.CosmosDBEndpoint; - this.AuthKeyOrResourceToken = new SecureString(); + _scope = scope; + _endpoint = config.CosmosDBEndpoint; + _authKeyOrResourceToken = new SecureString(); foreach (char ch in config.CosmosDBToken) { - this.AuthKeyOrResourceToken.AppendChar(ch); + _authKeyOrResourceToken.AppendChar(ch); } _log = logger; _log.Debug("Creating new instance of `CosmosDBApplicationsDatabase` service " + config.CosmosDBEndpoint, () => { }); @@ -59,7 +59,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault application.ID = await GetMaxAppIDAsync(); application.CreateTime = application.UpdateTime = DateTime.UtcNow; application.ApplicationId = Guid.NewGuid(); - var result = await Applications.CreateAsync(application); + var result = await _applications.CreateAsync(application); applicationId = new Guid(result.Id); return applicationId.ToString(); @@ -93,7 +93,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault { retryUpdate = false; - var record = await Applications.GetAsync(applicationId); + var record = await _applications.GetAsync(applicationId); if (record == null) { throw new ArgumentException("A record with the specified application id does not exist.", nameof(id)); @@ -114,7 +114,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault record.DiscoveryUrls = application.DiscoveryUrls; try { - await Applications.UpdateAsync(applicationId, record, record.ETag); + await _applications.UpdateAsync(applicationId, record, record.ETag); } catch (DocumentClientException dce) { @@ -139,13 +139,13 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault List certificates = new List(); - var application = await Applications.GetAsync(appId); + var application = await _applications.GetAsync(appId); if (application == null) { throw new ResourceNotFoundException("A record with the specified application id does not exist."); } - ICertificateRequest certificateRequestsService = Scope.Resolve(); + ICertificateRequest certificateRequestsService = _scope.Resolve(); // mark all requests as deleted ReadRequestResultModel[] certificateRequests; string nextPageLink = null; @@ -158,7 +158,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault } } while (nextPageLink != null); - await Applications.DeleteAsync(appId); + await _applications.DeleteAsync(appId); } public async Task GetApplicationAsync(string id) @@ -169,7 +169,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault } Guid appId = new Guid(id); - return await Applications.GetAsync(appId); + return await _applications.GetAsync(appId); } public async Task FindApplicationAsync(string applicationUri) @@ -179,7 +179,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault throw new ArgumentException("The applicationUri must be provided", nameof(applicationUri)); } - var results = await Applications.GetAsync(ii => ii.ApplicationUri == applicationUri); + var results = await _applications.GetAsync(ii => ii.ApplicationUri == applicationUri); return results.ToArray(); } @@ -217,10 +217,10 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault bool lastQuery = false; do { - uint queryRecords = complexQuery ? DefaultRecordsPerQuery : maxRecordsToReturn; + uint queryRecords = complexQuery ? _defaultRecordsPerQuery : maxRecordsToReturn; string query = CreateServerQuery(startingRecordId, queryRecords); nextRecordId = startingRecordId + 1; - var applications = await Applications.GetAsync(query); + var applications = await _applications.GetAsync(query); lastQuery = queryRecords == 0 || applications.Count() < queryRecords || applications.Count() == 0; foreach (var application in applications) @@ -315,13 +315,13 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault if (maxRecordsToReturn < 0) { - maxRecordsToReturn = DefaultRecordsPerQuery; + maxRecordsToReturn = _defaultRecordsPerQuery; } string query = CreateServerQuery(0, 0); do { IEnumerable applications; - (nextPageLink, applications) = await Applications.GetPageAsync(query, nextPageLink, maxRecordsToReturn - records.Count); + (nextPageLink, applications) = await _applications.GetPageAsync(query, nextPageLink, maxRecordsToReturn - records.Count); foreach (var application in applications) { @@ -389,8 +389,8 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault #region Private Members private void Initialize() { - db = new DocumentDBRepository(Endpoint, AuthKeyOrResourceToken); - Applications = new DocumentDBCollection(db); + _db = new DocumentDBRepository(_endpoint, _authKeyOrResourceToken); + _applications = new DocumentDBCollection(_db); } private string CreateServerQuery(uint startingRecordId, uint maxRecordsToQuery) @@ -527,15 +527,14 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault private async Task GetMaxAppIDAsync() { // find new ID for QueryServers - var maxAppIDEnum = await Applications.GetAsync("SELECT TOP 1 * FROM Applications a ORDER BY a.ID DESC"); + var maxAppIDEnum = await _applications.GetAsync("SELECT TOP 1 * FROM Applications a ORDER BY a.ID DESC"); var maxAppID = maxAppIDEnum.SingleOrDefault(); return (maxAppID != null) ? maxAppID.ID + 1 : 1; } #endregion #region Private Fields - private DateTime queryCounterResetTime = DateTime.UtcNow; - private DocumentDBRepository db; - private IDocumentDBCollection Applications; + private DocumentDBRepository _db; + private IDocumentDBCollection _applications; #endregion } } diff --git a/src/CosmosDB/DocumentDBCollection.cs b/src/CosmosDB/DocumentDBCollection.cs index 37b7592..1241bab 100644 --- a/src/CosmosDB/DocumentDBCollection.cs +++ b/src/CosmosDB/DocumentDBCollection.cs @@ -21,12 +21,23 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.CosmosDB /// public DocumentCollection Collection { get; private set; } private readonly IDocumentDBRepository db; - private readonly string CollectionId = typeof(T).Name; + private readonly string CollectionId; private const int RequestLevelLowest = 400; /// - public DocumentDBCollection(IDocumentDBRepository db) + public DocumentDBCollection(IDocumentDBRepository db) : this(db, typeof(T).Name) { + } + + /// + public DocumentDBCollection(IDocumentDBRepository db, string collectionId) + { + if (string.IsNullOrEmpty(collectionId)) + throw new ArgumentNullException("collectionId must be set"); + if (db == null) + throw new ArgumentNullException(nameof(db)); + + this.CollectionId = collectionId; this.db = db; CreateCollectionIfNotExistsAsync().Wait(); } diff --git a/Dockerfile b/src/Dockerfile similarity index 100% rename from Dockerfile rename to src/Dockerfile diff --git a/Dockerfile.Windows b/src/Dockerfile.Windows similarity index 100% rename from Dockerfile.Windows rename to src/Dockerfile.Windows diff --git a/src/Dockerfile.Windows-Server2016 b/src/Dockerfile.Windows-Server2016 new file mode 100644 index 0000000..62fa5b9 --- /dev/null +++ b/src/Dockerfile.Windows-Server2016 @@ -0,0 +1,20 @@ +FROM microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016 AS base +WORKDIR /app +EXPOSE 80 + +FROM microsoft/dotnet:2.1-sdk-nanoserver-sac2016 AS build +WORKDIR /src +COPY src/Microsoft.Azure.IIoT.OpcUa.Services.Vault.csproj src/ +COPY NuGet.Config NuGet.Config +RUN dotnet restore --configfile NuGet.Config -nowarn:msb3202,nu1503 src/Microsoft.Azure.IIoT.OpcUa.Services.Vault.csproj +COPY . . +WORKDIR /src/src +RUN dotnet build Microsoft.Azure.IIoT.OpcUa.Services.Vault.csproj -c Release -o /app + +FROM build AS publish +RUN dotnet publish Microsoft.Azure.IIoT.OpcUa.Services.Vault.csproj -c Release -o /app + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "Microsoft.Azure.IIoT.OpcUa.Services.Vault.dll"] diff --git a/src/KeyVault/KeyVaultCertificateGroupProvider.cs b/src/KeyVault/KeyVaultCertificateGroupProvider.cs index 4f890d7..349638e 100644 --- a/src/KeyVault/KeyVaultCertificateGroupProvider.cs +++ b/src/KeyVault/KeyVaultCertificateGroupProvider.cs @@ -1,4 +1,4 @@ -// ------------------------------------------------------------ +// ------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License (MIT). See License.txt in the repo root for license information. // ------------------------------------------------------------ @@ -301,11 +301,11 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault } return null; } + /// /// Revokes a certificate collection. /// Finds for each the matching CA cert version and updates Crl. /// - public async Task RevokeCertificatesAsync( X509Certificate2Collection certificates) { @@ -354,6 +354,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault Crl = await _keyVaultServiceClient.LoadCACrl(Configuration.Id, Certificate); return remainingCertificates; } + /// /// Creates a new key pair with certificate offline and signs it with KeyVault. /// @@ -363,6 +364,52 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault string[] domainNames, string privateKeyFormat, string privateKeyPassword) + { + await LoadPublicAssets().ConfigureAwait(false); + + DateTime notBefore = TrimmedNotBeforeDate(); + DateTime notAfter = notBefore.AddMonths(Configuration.DefaultCertificateLifetime); + // create new cert in HSM storage + using (var signedCertWithPrivateKey = await _keyVaultServiceClient.CreateSignedKeyPairAsync( + Configuration.Id, + Certificate, + application.ApplicationUri, + application.ApplicationNames.Count > 0 ? application.ApplicationNames[0].Text : "ApplicationName", + subjectName, + domainNames, + notBefore, + notAfter, + Configuration.DefaultCertificateKeySize, + Configuration.DefaultCertificateHashSize, + new KeyVaultSignatureGenerator(_keyVaultServiceClient, _caCertKeyIdentifier, Certificate) + ).ConfigureAwait(false)) + { + byte[] privateKey; + if (privateKeyFormat == "PFX") + { + privateKey = signedCertWithPrivateKey.Export(X509ContentType.Pfx, privateKeyPassword); + } + else if (privateKeyFormat == "PEM") + { + privateKey = CertificateFactory.ExportPrivateKeyAsPEM(signedCertWithPrivateKey); + } + else + { + throw new ServiceResultException(StatusCodes.BadInvalidArgument, "Invalid private key format"); + } + return new X509Certificate2KeyPair(new X509Certificate2(signedCertWithPrivateKey.RawData), privateKeyFormat, privateKey); + } + } + + /// + /// Creates a new key pair with certificate offline and signs it with KeyVault. + /// + public async Task NewKeyPairRequestOfflineAsync( + ApplicationRecordDataType application, + string subjectName, + string[] domainNames, + string privateKeyFormat, + string privateKeyPassword) { DateTime notBefore = DateTime.UtcNow.AddDays(-1); // create self signed diff --git a/src/KeyVault/KeyVaultServiceClient.cs b/src/KeyVault/KeyVaultServiceClient.cs index 4d33925..f0b040b 100644 --- a/src/KeyVault/KeyVaultServiceClient.cs +++ b/src/KeyVault/KeyVaultServiceClient.cs @@ -1,4 +1,4 @@ -// ------------------------------------------------------------ +// ------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License (MIT). See License.txt in the repo root for license information. // ------------------------------------------------------------ @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; +using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.IIoT.Diagnostics; @@ -466,6 +467,113 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault } } + /// + /// Creates a new signed application certificate in group id. + /// + public async Task CreateSignedKeyPairAsync( + string caCertId, + X509Certificate2 issuerCert, + string applicationUri, + string applicationName, + string subjectName, + string[] domainNames, + DateTime notBefore, + DateTime notAfter, + int keySize, + int hashSize, + KeyVaultSignatureGenerator generator, + CancellationToken ct = default) + { + CertificateOperation createResult = null; + var certName = KeyStoreName(caCertId, Guid.NewGuid().ToString()); + try + { + // policy unknown issuer, new key, exportable + var policyUnknownNewExportable = CreateCertificatePolicy(subjectName, keySize, false, false, true); + var attributes = CreateCertificateAttributes(notBefore, notAfter); + + // create the CSR + createResult = await _keyVaultClient.CreateCertificateAsync( + _vaultBaseUrl, + certName, + policyUnknownNewExportable, + attributes, + null, + ct) + .ConfigureAwait(false); + + if (createResult.Csr == null) + { + throw new ServiceResultException(StatusCodes.BadInvalidArgument, "Failed to read CSR from CreateCertificate."); + } + + // decode the CSR and verify consistency + var pkcs10CertificationRequest = new Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest(createResult.Csr); + var info = pkcs10CertificationRequest.GetCertificationRequestInfo(); + if (createResult.Csr == null || + pkcs10CertificationRequest == null || + !pkcs10CertificationRequest.Verify()) + { + throw new ServiceResultException(StatusCodes.BadInvalidArgument, "Invalid CSR."); + } + + // create the self signed app cert + var publicKey = KeyVaultCertFactory.GetRSAPublicKey(info.SubjectPublicKeyInfo); + var signedcert = await KeyVaultCertFactory.CreateSignedCertificate( + applicationUri, + applicationName, + subjectName, + domainNames, + (ushort)keySize, + notBefore, + notAfter, + (ushort)hashSize, + issuerCert, + publicKey, + generator, + true); + + // merge signed cert with keystore + var mergeResult = await _keyVaultClient.MergeCertificateAsync( + _vaultBaseUrl, + certName, + new X509Certificate2Collection(signedcert) + ); + + X509Certificate2 keyPair = null; + var secret = await _keyVaultClient.GetSecretAsync(mergeResult.SecretIdentifier.Identifier, ct); + if (secret.ContentType == CertificateContentType.Pfx) + { + var certBlob = Convert.FromBase64String(secret.Value); + keyPair = CertificateFactory.CreateCertificateFromPKCS12(certBlob, string.Empty); + } + else if (secret.ContentType == CertificateContentType.Pem) + { + Encoding encoder = Encoding.UTF8; + var privateKey = encoder.GetBytes(secret.Value.ToCharArray()); + keyPair = CertificateFactory.CreateCertificateWithPEMPrivateKey(signedcert, privateKey, string.Empty); + } + + return keyPair; + } + catch + { + throw new ServiceResultException(StatusCodes.BadInternalError, "Failed to create new key pair certificate"); + } + finally + { + try + { + var deletedCertBundle = await _keyVaultClient.DeleteCertificateAsync(_vaultBaseUrl, certName, ct); + await _keyVaultClient.PurgeDeletedCertificateAsync(_vaultBaseUrl, certName, ct); + } + catch + { + // intentionally fall through, purge may fail + } + } + } + /// /// Imports a new CRL for group id. /// @@ -752,7 +860,8 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault string subject, int keySize, bool selfSigned, - bool reuseKey = false) + bool reuseKey = false, + bool exportable = false) { var policy = new CertificatePolicy @@ -763,9 +872,9 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault }, KeyProperties = new KeyProperties { - Exportable = false, + Exportable = exportable, KeySize = keySize, - KeyType = _keyStoreHSM ? "RSA-HSM" : "RSA", + KeyType = (_keyStoreHSM && !exportable) ? "RSA-HSM" : "RSA", ReuseKey = reuseKey }, SecretProperties = new SecretProperties @@ -780,9 +889,13 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault return policy; } - private string CrlSecretName(string name, X509Certificate2 certificate) + private string KeyStoreName(string id, string requestId) { - return name + "Crl" + certificate.Thumbprint; + return id + "Keys" + requestId; + } + private string CrlSecretName(string id, X509Certificate2 certificate) + { + return id + "Crl" + certificate.Thumbprint; } private async Task LoadCrlSecret(string secretIdentifier, CancellationToken ct = default(CancellationToken)) diff --git a/src/KeyVault/KeyVaultSignature.cs b/src/KeyVault/KeyVaultSignature.cs index 453e7c5..62efcd6 100644 --- a/src/KeyVault/KeyVaultSignature.cs +++ b/src/KeyVault/KeyVaultSignature.cs @@ -20,6 +20,7 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault public class KeyVaultCertFactory { const int SerialNumberLength = 20; + const int DefaultKeySize = 2048; /// /// Creates a KeyVault signed certificate. @@ -131,7 +132,6 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault } } - var issuerSubjectName = issuerCAKeyCert != null ? issuerCAKeyCert.SubjectName : subjectDN; X509Certificate2 signedCert = request.Create( issuerSubjectName, @@ -355,9 +355,9 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.KeyVault ref ushort keySize) { // enforce recommended keysize unless lower value is enforced. - if (keySize < 1024) + if (keySize < 2048) { - keySize = CertificateFactory.defaultKeySize; + keySize = DefaultKeySize; } if (keySize % 1024 != 0) diff --git a/src/v1/Controllers/StatusController.cs b/src/v1/Controllers/StatusController.cs index 2a59ff2..e3e573b 100644 --- a/src/v1/Controllers/StatusController.cs +++ b/src/v1/Controllers/StatusController.cs @@ -1,4 +1,4 @@ -// ------------------------------------------------------------ +// ------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License (MIT). See License.txt in the repo root for license information. // ------------------------------------------------------------ @@ -7,17 +7,19 @@ namespace Microsoft.Azure.IIoT.OpcUa.Services.Vault.v1.Controllers { + using System; + using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.IIoT.Diagnostics; + using Microsoft.Azure.IIoT.OpcUa.Services.Vault.v1.Auth; using Microsoft.Azure.IIoT.OpcUa.Services.Vault.v1.Filters; using Microsoft.Azure.IIoT.OpcUa.Services.Vault.v1.Models; using Swashbuckle.AspNetCore.Annotations; - using System; /// [Route(VersionInfo.PATH + "/[controller]"), TypeFilter(typeof(ExceptionsFilterAttribute))] [Produces("application/json")] - + [Authorize(Policy = Policies.CanRead)] public sealed class StatusController : Controller { private readonly ILogger log; diff --git a/thirdpartynotices.txt b/thirdpartynotices.txt new file mode 100644 index 0000000..b811d96 --- /dev/null +++ b/thirdpartynotices.txt @@ -0,0 +1,1798 @@ +Third Party Notices + +This file is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Unless otherwise specified, Microsoft licenses the Third Party IP to you under the licensing terms for the Microsoft product. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +*** + +Newtonsoft.Json +The MIT License (MIT) +Copyright (c) .NET Foundation and Contributors +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +NETStandard.Library +The MIT License (MIT) +Copyright (c) .NET Foundation and Contributors +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +OPCFoundation.NetStandard.Opc.Ua + +OPC REDISTRIBUTABLES Agreement of Use +Version 1.3, February 06, 2017, OPC Foundation +The terms and conditions of the Agreement apply to the Software Deliverables including without limitation any OPC Foundation: +updates, +supplements +Internet-based services, and +support services +for the Software Deliverables, unless OPC Foundation specifies that any other terms accompany such items, in which case the alternate terms specified by OPC Foundation would apply. + +BY USING THE SOURCE DELIVERABLES, YOU ACCEPT THE TERMS OF THIS AGREEMENT. IF YOU DO NOT ACCEPT THE TERMS OF THIS AGREEMENT, DO NOT USE THE SOFTWARE DELIVERABLES. +If you comply with this Agreement, you have the rights below. +1. INSTALLATION AND USE RIGHTS. +You may install and use any number of copies of the Software Deliverables. +2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. +Distributable Code. The Software Deliverables contain compiled code that you are permitted to distribute with programs you develop if you comply with the terms below. +Right to Use and Distribute. +You may copy and distribute all files that are part of this Software Deliverables. +Third Party Distribution. You may permit distributors of your programs to copy and distribute the Software Deliverables as part of those programs. +Distribution Requirements. For any Software Deliverables you distribute, you must: +add significant primary functionality to it in your programs; +require distributors and external end users to agree to terms that protect it at least as much as this Agreement; +display your valid copyright notice on your programs; and +indemnify, defend, and hold harmless the OPC Foundation from any claims, including attorneys’ fees, related to the distribution or use of your programs. +Distribution Restrictions. You may not: +alter any copyright, trademark or patent notice in the Software Deliverables; +use the OPC Foundation’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by the OPC Foundation; +include Software Deliverables in malicious, deceptive or unlawful programs; +modify or distribute the source code of any Software Deliverables so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that (1). the code be disclosed or distributed in source code form; or (2) permit or otherwise allow others to have the right to modify such Software Deliverables; or +create additional software components that directly link or directly load the Software Deliverables without accepting the corresponding source license for that Software Deliverable. +3. SCOPE OF LICENSE. +The Software Deliverables are licensed, not sold. This Agreement only gives you some rights to use the Software Deliverables. The OPC Foundation reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this Agreement. In doing so, you must comply with any technical limitations in the Software Deliverables that only allow you to use it in certain ways. You may not: +disclose the results of any benchmark tests of the Software Deliverables to any third party without OPC Foundation’s prior written approval; +work around any technical limitations in the Software Deliverables; +reverse engineer, decompile or disassemble the Software Deliverables, except and only to the extent that applicable law expressly permits, despite this limitation; +make more copies of the Software Deliverables than specified in this Agreement or allowed by applicable law, despite this limitation; +publish the Software Deliverables for others to copy; or +rent, lease or lend the Software Deliverables. +4. BACKUP COPY. +You may make one backup copy of the Software Deliverables. You may use such copy only to reinstall the Software. +5. DOCUMENTATION. +Any person that has valid access to your computer or internal network may copy and use the documentation related to the Software Deliverables for your internal reference purposes. +6. EXPORT RESTRICTIONS. +The Software Deliverables are subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the Software Deliverables. These laws include restrictions on destinations, end users and end use. +7. SUPPORT SERVICES. +Because you accept the Software3 Deliverables from OPC Foundation “as is,” OPC Foundation may not provide support services for it. +8. ENTIRE AGREEMENT. +This Agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire Agreement for the Software Deliverables and support services. +10. LEGAL EFFECT +This Agreement describes certain legal rights. You may have other rights under the laws of your country. This Agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. +11. DISCLAIMER OF WARRANTY. +THE SOFTWARE DELIVERABLES ARE LICENSED “AS-IS.” YOU BEAR THE RISK OF USING THE SPECIFICATIONS. THE OPC FOUNDATION MAKES NO WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, WITH REGARD TO THE SOFTWARE DELIVERABLES, INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF TITLE OR OWNERSHIP, IMPLIED WARRANTY OF MERCHANTABILITY, OR WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE.YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS UNDER YOUR LOCAL LAWS THAT THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, THE OPC FOUNDATION EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL THE OPC FOUNDATION BE LIABLE FOR ERRORS CONTAINED IN THE SOURCE DELIVERABLES OR FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, RELIANCE OR COVER DAMAGES, INCLUDING LOSS OF PROFITS, REVENUE, DATA, OR USE, INCURRED BY ANY USER OR ANY THIRD PARTY IN CONNECTION WITH THE FURNISHING, PERFORMANCE, OR USE OF THE SOFTWARE DELIVERABLES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE USING THE SOFTWARE DELIVERABLES IS BORNE BY YOU AND/OR THE USER. + +*** + +Autofixture, Autofixture.Automoq + +The MIT License (MIT) + +Copyright (c) 2013 Mark Seemann + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** + +Castle.Core + +Copyright 2004-2016 Castle Project - http://www.castleproject.org/ + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +*** + +YamlDotNet +Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Antoine Aubry and contributors +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** + +xuint.runner.visualstudio + + Copyright (c) .NET Foundation and Contributors + All Rights Reserved + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----------------------- + +The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: + https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions + +The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: + https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel + +Both sets of code are covered by the following license: + + The MIT License (MIT) + + Copyright (c) 2015 .NET Foundation + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +*** + +xuint + + Copyright (c) .NET Foundation and Contributors + All Rights Reserved + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----------------------- + +The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: + https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions + +The code in src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: + https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel + +Both sets of code are covered by the following license: + + The MIT License (MIT) + + Copyright (c) 2015 .NET Foundation + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +*** + +System.ValueTuple +The MIT License (MIT) + + + +Copyright (c) .NET Foundation and Contributors + + + +All rights reserved. + + + +Permission is hereby granted, free of charge, to any person obtaining a copy + +of this software and associated documentation files (the "Software"), to deal + +in the Software without restriction, including without limitation the rights + +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + +copies of the Software, and to permit persons to whom the Software is + +furnished to do so, subject to the following conditions: + + + +The above copyright notice and this permission notice shall be included in all + +copies or substantial portions of the Software. + + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + +SOFTWARE. + + +*** + +RunProcessAsTask +The MIT License (MIT) +Copyright (c) 2013 James Manning +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** + +RocksDbSharp +(Simplified BSD License) + +Copyright (c) 2015, Warren Falk +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*** + +RocksDbNative +(Simplified BSD License) + +Copyright (c) 2015, Warren Falk +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*** + +Portable.BouncyCastle + + + + + License + + +

The Bouncy Castle Cryptographic C#® API

+

License:

+The Bouncy Castle License
+Copyright (c) 2000-2011 The Legion Of The Bouncy Castle +(http://www.bouncycastle.org)
+Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sub license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", +WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ + + +*** + +System.Reactive +Copyright (c) .NET Foundation and Contributors + +All Rights Reserved + + + +Licensed under the Apache License, Version 2.0 (the "License"); you + +may not use this file except in compliance with the License. You may + +obtain a copy of the License at + + + +http://www.apache.org/licenses/LICENSE-2.0 + + + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + +implied. See the License for the specific language governing permissions + +and limitations under the License. + +*** + +System.Collections.Immutable, System.IO.FileSystem.Watcher, System.Reflections.Extensions, System.Reflections.TypeExtensions, System.Runtime.Loader, System.Threading.Tasks.Dataflow, System.Thread +MICROSOFT SOFTWARE LICENSE TERMS +MICROSOFT .NET LIBRARY +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft +· updates, +· supplements, +· Internet-based services, and +· support services +for this software, unless other terms accompany those items. If so, those terms apply. +BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE. +IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. +1. INSTALLATION AND USE RIGHTS. +a. Installation and Use. You may install and use any number of copies of the software to design, develop and test your programs. +b. Third Party Programs. The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only. +2. DATA. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to improve our products and services. You can learn more about data collection and use in the help documentation and the privacy statement at http://go.microsoft.com/fwlink/?LinkId=528096 . Your use of the software operates as your consent to these practices. +3. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. +a. DISTRIBUTABLE CODE. The software is comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in programs you develop if you comply with the terms below. +i . Right to Use and Distribute. +· You may copy and distribute the object code form of the software. +· Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs. +ii. Distribution Requirements. For any Distributable Code you distribute, you must +· add significant primary functionality to it in your programs; +· require distributors and external end users to agree to terms that protect it at least as much as this agreement; +· display your valid copyright notice on your programs; and +· indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your programs. +iii. Distribution Restrictions. You may not +· alter any copyright, trademark or patent notice in the Distributable Code; +· use Microsoft’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by Microsoft; +· include Distributable Code in malicious, deceptive or unlawful programs; or +· modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that +· the code be disclosed or distributed in source code form; or +· others have the right to modify it. +4. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not +· work around any technical limitations in the software; +· reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation; +· publish the software for others to copy; +· rent, lease or lend the software; +· transfer the software or this agreement to any third party; or +· use the software for commercial software hosting services. +5. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the software. +6. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. +7. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see www.microsoft.com/exporting. +8. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. +9. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. +10. APPLICABLE LAW. +a. United States. If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort. +b. Outside the United States. If you acquired the software in any other country, the laws of that country apply. +11. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. +12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +FOR AUSTRALIA – YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. +13. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to +· anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and +· claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. +Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. +Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. +Cette limitationconcerne: +· tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et +· les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. + +*** + +Xunit skippablefact + +This software is licensed under the Microsoft Public License +http://opensource.org/licenses/ms-pl + +This license governs use of the accompanying software. If you use the software, you +accept this license. If you do not accept the license, do not use the software. + +1. Definitions + The terms "reproduce," "reproduction," "derivative works," and "distribution" have the + same meaning here as under U.S. copyright law. + A "contribution" is the original software, or any additions or changes to the software. + A "contributor" is any person that distributes its contribution under this license. + "Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. + +*** + +Swashbuckle.AspNetCore + +The MIT License (MIT) + +Copyright (c) 2016 Richard Morris + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +*** + +SSH.net + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +Dynamitey + +Apache License, Version 2.0 +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +*** + +Fare + +The MIT License (MIT) + +Copyright (c) 2013 Nikos Baxevanis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +Newtonsoft.Json +The MIT License (MIT) +Copyright (c) .NET Foundation and Contributors +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +NETStandard.Library +The MIT License (MIT) +Copyright (c) .NET Foundation and Contributors +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +Moq +Copyright (c) 2007. Clarius Consulting, Manas Technology Solutions, InSTEDD +http://www.moqthis.com/ +All rights reserved. + +Redistribution and use in source and binary forms, +with or without modification, are permitted provided +that the following conditions are met: + + * Redistributions of source code must retain the + above copyright notice, this list of conditions and + the following disclaimer. + + * Redistributions in binary form must reproduce + the above copyright notice, this list of conditions + and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Clarius Consulting, Manas Technology Solutions or InSTEDD nor the + names of its contributors may be used to endorse + or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +[This is the BSD license, see + http://opensource.org/licenses/BSD-3-Clause] + +*** + +Microsoft.Extensions.Logging +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. + +*** + +Microsoft.Azure.KeyVault +The MIT License (MIT) + +Copyright (c) Microsoft + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +Microsoft.Azure.EventHubs +MIT License + +Copyright (c) 2016 Microsoft Azure + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +Microsoft.AspNetCore, MicrosoftAspNetCore.Hosting, MicrosoftAspNetCore.Http, MicrosoftAspNetCore.Http.Extensions, MicrosoftAspNetCore.Http.Features, MicrosoftAspNetCore.Mvc +MICROSOFT SOFTWARE LICENSE TERMS +MICROSOFT .NET LIBRARY +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft +· updates, +· supplements, +· Internet-based services, and +· support services +for this software, unless other terms accompany those items. If so, those terms apply. +BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE. +IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. +1. INSTALLATION AND USE RIGHTS. +a. Installation and Use. You may install and use any number of copies of the software to design, develop and test your programs. You may modify, copy, distribute or deploy any .js files contained in the software as part of your programs. +b. Third Party Programs. The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only. +2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. +a. DISTRIBUTABLE CODE. In addition to the .js files described above, the software is comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in programs you develop if you comply with the terms below. +i. Right to Use and Distribute. +· You may copy and distribute the object code form of the software. +· Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs. +ii. Distribution Requirements. For any Distributable Code you distribute, you must +· use the Distributable Code in your programs and not as a standalone distribution; +· require distributors and external end users to agree to terms that protect it at least as much as this agreement; +· display your valid copyright notice on your programs; and +· indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your programs. +iii. Distribution Restrictions. You may not +· alter any copyright, trademark or patent notice in the Distributable Code; +· use Microsoft’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by Microsoft; +· include Distributable Code in malicious, deceptive or unlawful programs; or +· modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that +· the code be disclosed or distributed in source code form; or +· others have the right to modify it. +3. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not +· work around any technical limitations in the software; +· reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation; +· publish the software for others to copy; +· rent, lease or lend the software; or +· transfer the software or this agreement to any third party. +4. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the software. +5. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. +6. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see www.microsoft.com/exporting. +7. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. +8. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. +9. APPLICABLE LAW. +a. United States. If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort. +b. Outside the United States. If you acquired the software in any other country, the laws of that country apply. +10. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. +11. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +FOR AUSTRALIA – YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. +12. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to +· anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and +· claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. +Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. +Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. +Cette limitation concerne : +· tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et +· les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. + +*** + +McMaster.Extensions.CommandLineUtils + + Apache License Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + +*** + + +JetBrains.Annotations +MIT License + +Copyright (c) 2016 JetBrains http://www.jetbrains.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*** + +Docker.DotNet + + Apache License Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +BouncyCastle.NetCore +Copyright (c) 2000 - 2018 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org) +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** + +Serilog.Sinks.Console + + Apache License Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + +*** + +Serilog.Extensions.Logging + + Apache License Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + +*** +BouncyCastle.NetCore +Copyright (c) 2000 - 2018 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org) +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** + +Autofac.Extensions.DependencyInjection +Copyright +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** + +Autofac +Copyright +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** + +Autofac.Extras.Moq +Copyright +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** +Antlr4, Antlr4.CodeGenerator, Antlr4.Runtime + +[The "BSD license"] +Copyright (c) 2013 Sam Harwell +Copyright (c) 2013 Terence Parr +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*** + +moby +Docker +Copyright 2012-2017 Docker, Inc. +Apache 2.0 License +Licensed under the Apache License, Version 2.0 (the License); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS-IS" BASES, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for specific language governing permissions and limitations under the License. + +Docker +Copyright 2012-2017 Docker, Inc. +This product includes software developed at Docker, Inc. (https://www.docker.com). +This product contains software (https://github.com/kr/pty) developed by Keith Rarick, licensed under the MIT License. +The following is courtesy of our legal counsel: +Use and transfer of Docker may be subject to certain restrictions by the United States and other governments. It is your responsibility to ensure that your use and/or transfer does not violate applicable laws. +For more information, please see https://www.bis.doc.gov +See also https://www.apache.org/dev/crypto.html and/or seek legal counsel. + +*** + +docker/cli +Docker +Copyright 2012-2017 Docker, Inc. +Apache 2.0 License +Licensed under the Apache License, Version 2.0 (the License); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS-IS" BASES, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for specific language governing permissions and limitations under the License. + +Docker +Copyright 2012-2017 Docker, Inc. +This product includes software developed at Docker, Inc. (https://www.docker.com). +This product contains software (https://github.com/kr/pty) developed by Keith Rarick, licensed under the MIT License. +The following is courtesy of our legal counsel: +Use and transfer of Docker may be subject to certain restrictions by the United States and other governments. It is your responsibility to ensure that your use and/or transfer does not violate applicable laws. +For more information, please see https://www.bis.doc.gov +See also https://www.apache.org/dev/crypto.html and/or seek legal counsel. + +*** diff --git a/version.props b/version.props index 5e62f59..ee7ffb4 100644 --- a/version.props +++ b/version.props @@ -2,11 +2,5 @@ 1.0.0 preview-$([System.DateTime]::Now.ToString("yyyyMMdd")) - Copyright © 2018 Microsoft Corp. All rights reserved. - Microsoft - https://github.com/Azure/azure-iiot-opc-vault-service/blob/master/LICENSE - Microsoft Azure Industrial IoT OPC UA Vault Service - - false