Merge branch 'develop' into main

This commit is contained in:
maruyama.t 2023-12-01 11:42:41 +09:00
commit c4fecb9a0c
50 changed files with 19373 additions and 5929 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,96 @@
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"actionGroups_ag_manual_recovery_alerts_odms_dev_name": {
"type": "String"
},
"scheduledqueryrules_ManualRecoveryAlerts_name": {
"type": "String"
},
"sites_app_odms_dictation_dev_externalid": {
"type": "String"
}
},
"resources": [
{
"apiVersion": "2023-01-01",
"location": "Global",
"name": "[parameters('actionGroups_ag_manual_recovery_alerts_odms_dev_name')]",
"properties": {
"armRoleReceivers": [],
"automationRunbookReceivers": [],
"azureAppPushReceivers": [],
"azureFunctionReceivers": [],
"emailReceivers": [
{
"emailAddress": "saito.k@nds-tyo.co.jp",
"name": "テスト通知_-EmailAction-",
"useCommonAlertSchema": false
}
],
"enabled": true,
"eventHubReceivers": [],
"groupShortName": "手動復旧が必要なエラー",
"itsmReceivers": [],
"logicAppReceivers": [],
"smsReceivers": [],
"voiceReceivers": [],
"webhookReceivers": []
},
"tags": {
"Environment": "develop",
"Project": "ODMS",
"ms-resource-usage": "ManualRecoveryAlerts"
},
"type": "microsoft.insights/actionGroups"
},
{
"apiVersion": "2023-03-15-preview",
"dependsOn": [
"[resourceId('microsoft.insights/actionGroups', parameters('actionGroups_ag_manual_recovery_alerts_odms_dev_name'))]"
],
"location": "japaneast",
"name": "[parameters('scheduledqueryrules_ManualRecoveryAlerts_name')]",
"properties": {
"actions": {
"actionGroups": [
"[resourceId('microsoft.insights/actionGroups', parameters('actionGroups_ag_manual_recovery_alerts_odms_dev_name'))]"
],
"actionProperties": {},
"customProperties": {}
},
"autoMitigate": false,
"criteria": {
"allOf": [
{
"dimensions": [],
"failingPeriods": {
"minFailingPeriodsToAlert": 1,
"numberOfEvaluationPeriods": 1
},
"operator": "GreaterThanOrEqual",
"query": "AppServiceConsoleLogs | where Level == \"Error\" and ResultDescription contains \"[MANUAL_RECOVERY_REQUIRED]\"\n",
"threshold": 1.0,
"timeAggregation": "Count"
}
]
},
"description": "手動復旧が必要なエラーを検知し、設定されたメールアドレスに通知を行う",
"displayName": "[parameters('scheduledqueryrules_ManualRecoveryAlerts_name')]",
"enabled": true,
"evaluationFrequency": "PT1M",
"scopes": [
"[parameters('sites_app_odms_dictation_dev_externalid')]"
],
"severity": 0,
"targetResourceTypes": [
"Microsoft.Web/sites"
],
"windowSize": "PT1M"
},
"type": "microsoft.insights/scheduledqueryrules"
}
],
"variables": {}
}

View File

@ -1639,17 +1639,17 @@
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowDeveloperInboundYumoto')]",
"name": "AllowDeveloperInboundYumoto",
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowYumotoHTTPSInbound')]",
"name": "AllowYumotoHTTPSInbound",
"properties": {
"access": "Allow",
"description": "開発チーム NDS 湯本の動作確認用",
"description": "NDS湯本 開発用アクセス用許可",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 101,
"priority": 120,
"protocol": "TCP",
"sourceAddressPrefix": "180.39.76.100",
"sourceAddressPrefixes": [],
@ -1657,6 +1657,143 @@
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowSaitoHTTPSInbound')]",
"name": "AllowSaitoHTTPSInbound",
"properties": {
"access": "Allow",
"description": "NDS斎藤_Dev環境確認用",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 121,
"protocol": "TCP",
"sourceAddressPrefix": "220.215.248.24",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowMakabeHTTPSInbound')]",
"name": "AllowMakabeHTTPSInbound",
"properties": {
"access": "Allow",
"description": "NDS真壁 開発用アクセス用許可",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 122,
"protocol": "TCP",
"sourceAddressPrefix": "60.97.55.122",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowIwataHTTPSInbound')]",
"name": "AllowIwataHTTPSInbound",
"properties": {
"access": "Allow",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 123,
"protocol": "TCP",
"sourceAddressPrefix": "126.227.61.88",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowFukunagaHTTPSInbound')]",
"name": "AllowFukunagaHTTPSInbound",
"properties": {
"access": "Allow",
"description": "福永の動作確認用",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 124,
"protocol": "TCP",
"sourceAddressPrefix": "221.252.90.222",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowNDSHTTPSInbound')]",
"name": "AllowNDSHTTPSInbound",
"properties": {
"access": "Allow",
"description": "開発チームNDSからの動作確認用",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 125,
"protocol": "TCP",
"sourceAddressPrefix": "118.238.231.215",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowOuraHTTPSInbound')]",
"name": "AllowOuraHTTPSInbound",
"properties": {
"access": "Allow",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 127,
"protocol": "TCP",
"sourceAddressPrefix": "60.65.231.128",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowMaruyamaHTTPSInbound')]",
"name": "AllowMaruyamaHTTPSInbound",
"properties": {
"access": "Allow",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 126,
"protocol": "TCP",
"sourceAddressPrefix": "61.87.49.72",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
}
]
},
@ -1965,18 +2102,153 @@
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
],
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowDeveloperInboundYumoto')]",
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowFukunagaHTTPSInbound')]",
"properties": {
"access": "Allow",
"description": "開発チーム NDS 湯本の動作確認用",
"description": "福永の動作確認用",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 101,
"priority": 124,
"protocol": "TCP",
"sourceAddressPrefix": "180.39.76.100",
"sourceAddressPrefix": "221.252.90.222",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"apiVersion": "2023-05-01",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
],
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowIwataHTTPSInbound')]",
"properties": {
"access": "Allow",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 123,
"protocol": "TCP",
"sourceAddressPrefix": "126.227.61.88",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"apiVersion": "2023-05-01",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
],
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowMakabeHTTPSInbound')]",
"properties": {
"access": "Allow",
"description": "NDS真壁 開発用アクセス用許可",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 122,
"protocol": "TCP",
"sourceAddressPrefix": "60.97.55.122",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"apiVersion": "2023-05-01",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
],
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowMaruyamaHTTPSInbound')]",
"properties": {
"access": "Allow",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 126,
"protocol": "TCP",
"sourceAddressPrefix": "61.87.49.72",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"apiVersion": "2023-05-01",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
],
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowNDSHTTPSInbound')]",
"properties": {
"access": "Allow",
"description": "開発チームNDSからの動作確認用",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 125,
"protocol": "TCP",
"sourceAddressPrefix": "118.238.231.215",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"apiVersion": "2023-05-01",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
],
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowOuraHTTPSInbound')]",
"properties": {
"access": "Allow",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 127,
"protocol": "TCP",
"sourceAddressPrefix": "60.65.231.128",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"apiVersion": "2023-05-01",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
],
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowSaitoHTTPSInbound')]",
"properties": {
"access": "Allow",
"description": "NDS斎藤_Dev環境確認用",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 121,
"protocol": "TCP",
"sourceAddressPrefix": "220.215.248.24",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
@ -2005,6 +2277,29 @@
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"apiVersion": "2023-05-01",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
],
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowYumotoHTTPSInbound')]",
"properties": {
"access": "Allow",
"description": "NDS湯本 開発用アクセス用許可",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
"destinationPortRanges": [],
"direction": "Inbound",
"priority": 120,
"protocol": "TCP",
"sourceAddressPrefix": "180.39.76.100",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
},
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"apiVersion": "2023-05-01",
"dependsOn": [
@ -11040,6 +11335,13 @@
"*"
],
"service": "Microsoft.KeyVault"
},
{
"locations": [
"japaneast",
"japanwest"
],
"service": "Microsoft.Storage"
}
]
},
@ -11213,6 +11515,25 @@
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/sslCertificates/ca-odms-agw-dev')]"
}
}
},
{
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/httpListeners/listener-odms-public-dev')]",
"name": "listener-odms-public-dev",
"properties": {
"customErrorConfigurations": [],
"frontendIPConfiguration": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/frontendIPConfigurations/appGwPublicFrontendIpIPv4')]"
},
"frontendPort": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/frontendPorts/port_443')]"
},
"hostNames": [],
"protocol": "Https",
"requireServerNameIndication": false,
"sslCertificate": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/sslCertificates/ca-odms-agw-dev')]"
}
}
}
],
"listeners": [],
@ -11249,6 +11570,20 @@
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/urlPathMaps/rule-odms-private-dev')]"
}
}
},
{
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/requestRoutingRules/rule-odms-public-dev')]",
"name": "rule-odms-public-dev",
"properties": {
"httpListener": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/httpListeners/listener-odms-public-dev')]"
},
"priority": 2,
"ruleType": "PathBasedRouting",
"urlPathMap": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/urlPathMaps/rule-odms-public-dev')]"
}
}
}
],
"rewriteRuleSets": [],
@ -11300,6 +11635,35 @@
}
]
}
},
{
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/urlPathMaps/rule-odms-public-dev')]",
"name": "rule-odms-public-dev",
"properties": {
"defaultBackendAddressPool": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/backendAddressPools/pool-odms-staapp-dev')]"
},
"defaultBackendHttpSettings": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/backendHttpSettingsCollection/setting-odms-https-dev')]"
},
"pathRules": [
{
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/urlPathMaps/rule-odms-public-dev/pathRules/target-odms-app-dev')]",
"name": "target-odms-app-dev",
"properties": {
"backendAddressPool": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/backendAddressPools/pool-odms-app-dev')]"
},
"backendHttpSettings": {
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/backendHttpSettingsCollection/setting-odms-https-dev')]"
},
"paths": [
"/dictation/api/*"
]
}
}
]
}
}
]
},
@ -11432,6 +11796,13 @@
"*"
],
"service": "Microsoft.KeyVault"
},
{
"locations": [
"japaneast",
"japanwest"
],
"service": "Microsoft.Storage"
}
]
},

View File

@ -13,6 +13,7 @@
"name": "[parameters('namespaces_ntfns_odms_dev_name')]",
"properties": {
"namespaceType": "NotificationHub",
"networkAcls": {},
"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"status": "Created"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,39 @@
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"actionGroups__ag_manual_recovery_alerts_odms_stg_name": {
"type": "String"
}
},
"resources": [
{
"apiVersion": "2023-01-01",
"location": "Global",
"name": "[parameters('actionGroups__ag_manual_recovery_alerts_odms_stg_name')]",
"properties": {
"armRoleReceivers": [],
"automationRunbookReceivers": [],
"azureAppPushReceivers": [],
"azureFunctionReceivers": [],
"emailReceivers": [
{
"emailAddress": "saito.k@nds-tyo.co.jp",
"name": "Alert Notification Address_-EmailAction-",
"useCommonAlertSchema": false
}
],
"enabled": true,
"eventHubReceivers": [],
"groupShortName": "Žè“®•œŒƒGƒ‰<C692>[",
"itsmReceivers": [],
"logicAppReceivers": [],
"smsReceivers": [],
"voiceReceivers": [],
"webhookReceivers": []
},
"type": "microsoft.insights/actionGroups"
}
],
"variables": {}
}

View File

@ -586,6 +586,43 @@
"matchVariable": "RequestArgNames",
"selector": "idToken",
"selectorMatchOperator": "Equals"
},
{
"exclusionManagedRuleSets": [
{
"ruleGroups": [
{
"ruleGroupName": "REQUEST-920-PROTOCOL-ENFORCEMENT",
"rules": [
{
"ruleId": "920230"
}
]
},
{
"ruleGroupName": "REQUEST-931-APPLICATION-ATTACK-RFI",
"rules": [
{
"ruleId": "931130"
}
]
},
{
"ruleGroupName": "REQUEST-942-APPLICATION-ATTACK-SQLI",
"rules": [
{
"ruleId": "942430"
}
]
}
],
"ruleSetType": "OWASP",
"ruleSetVersion": "3.2"
}
],
"matchVariable": "RequestArgValues",
"selector": "handler",
"selectorMatchOperator": "Equals"
}
],
"managedRuleSets": [
@ -936,7 +973,7 @@
"direction": "Inbound",
"priority": 902,
"protocol": "TCP",
"sourceAddressPrefix": "125.193.161.194/32",
"sourceAddressPrefix": "126.227.61.88",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
@ -1197,6 +1234,7 @@
"name": "AllowMyIpAddressCustom8080Inbound.saito",
"properties": {
"access": "Allow",
"description": "saitoƒeƒXƒg",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
@ -1204,7 +1242,7 @@
"direction": "Inbound",
"priority": 999,
"protocol": "*",
"sourceAddressPrefix": "220.215.171.117",
"sourceAddressPrefix": "220.215.194.33",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
@ -1608,7 +1646,7 @@
"direction": "Inbound",
"priority": 902,
"protocol": "TCP",
"sourceAddressPrefix": "125.193.161.194/32",
"sourceAddressPrefix": "126.227.61.88",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []
@ -2220,6 +2258,7 @@
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_stg_name'), '/AllowMyIpAddressCustom8080Inbound.saito')]",
"properties": {
"access": "Allow",
"description": "saitoƒeƒXƒg",
"destinationAddressPrefix": "*",
"destinationAddressPrefixes": [],
"destinationPortRange": "443",
@ -2227,7 +2266,7 @@
"direction": "Inbound",
"priority": 999,
"protocol": "*",
"sourceAddressPrefix": "220.215.171.117",
"sourceAddressPrefix": "220.215.194.33",
"sourceAddressPrefixes": [],
"sourcePortRange": "*",
"sourcePortRanges": []

View File

@ -13,6 +13,7 @@
"name": "[parameters('namespaces_ntfns_odms_stg_name')]",
"properties": {
"namespaceType": "NotificationHub",
"networkAcls": {},
"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"status": "Created"

View File

@ -204,6 +204,22 @@
"*"
],
"maxAgeInSeconds": 28800
},
{
"allowedHeaders": [
"*"
],
"allowedMethods": [
"GET",
"OPTIONS"
],
"allowedOrigins": [
"https://20.210.206.188"
],
"exposedHeaders": [
"*"
],
"maxAgeInSeconds": 2880
}
]
},
@ -269,6 +285,22 @@
"*"
],
"maxAgeInSeconds": 28800
},
{
"allowedHeaders": [
"*"
],
"allowedMethods": [
"GET",
"OPTIONS"
],
"allowedOrigins": [
"https://20.210.206.188"
],
"exposedHeaders": [
"*"
],
"maxAgeInSeconds": 2880
}
]
},
@ -334,6 +366,22 @@
"*"
],
"maxAgeInSeconds": 28800
},
{
"allowedHeaders": [
"*"
],
"allowedMethods": [
"GET",
"OPTIONS"
],
"allowedOrigins": [
"https://20.210.206.188"
],
"exposedHeaders": [
"*"
],
"maxAgeInSeconds": 2880
}
]
},
@ -2134,6 +2182,125 @@
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-193')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-194')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-195')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-196')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-197')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-198')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-199')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
@ -2185,6 +2352,176 @@
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-200')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-201')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-202')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-203')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-204')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-205')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-206')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-207')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-208')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-209')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
@ -2202,6 +2539,601 @@
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-210')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-211')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-212')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-213')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-214')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-215')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-216')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-217')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-218')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-219')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-220')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-221')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-222')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsaustg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsaustg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsaustg_name'), '/default/account-223')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsaustg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsaustg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsaustg_name'), '/default/account-224')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-225')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-226')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-227')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-228')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-229')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-230')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-231')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-232')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-233')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-234')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-235')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-236')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-237')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-238')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-239')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-240')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-241')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-242')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-243')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
],
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-244')]",
"properties": {
"defaultEncryptionScope": "$account-encryption-key",
"denyEncryptionScopeOverride": false,
"immutableStorageWithVersioning": {
"enabled": false
},
"publicAccess": "None"
},
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
},
{
"apiVersion": "2023-01-01",
"dependsOn": [

View File

@ -2,9 +2,13 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/src/favicon.svg" />
<link
rel="icon"
type="image/svg+xml"
href="/src/assets/images/favicon.ico"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
<title>ODMS Cloud</title>
</head>
<body>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -1,15 +0,0 @@
<svg width="410" height="404" viewBox="0 0 410 404" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M399.641 59.5246L215.643 388.545C211.844 395.338 202.084 395.378 198.228 388.618L10.5817 59.5563C6.38087 52.1896 12.6802 43.2665 21.0281 44.7586L205.223 77.6824C206.398 77.8924 207.601 77.8904 208.776 77.6763L389.119 44.8058C397.439 43.2894 403.768 52.1434 399.641 59.5246Z" fill="url(#paint0_linear)"/>
<path d="M292.965 1.5744L156.801 28.2552C154.563 28.6937 152.906 30.5903 152.771 32.8664L144.395 174.33C144.198 177.662 147.258 180.248 150.51 179.498L188.42 170.749C191.967 169.931 195.172 173.055 194.443 176.622L183.18 231.775C182.422 235.487 185.907 238.661 189.532 237.56L212.947 230.446C216.577 229.344 220.065 232.527 219.297 236.242L201.398 322.875C200.278 328.294 207.486 331.249 210.492 326.603L212.5 323.5L323.454 102.072C325.312 98.3645 322.108 94.137 318.036 94.9228L279.014 102.454C275.347 103.161 272.227 99.746 273.262 96.1583L298.731 7.86689C299.767 4.27314 296.636 0.855181 292.965 1.5744Z" fill="url(#paint1_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="6.00017" y1="32.9999" x2="235" y2="344" gradientUnits="userSpaceOnUse">
<stop stop-color="#41D1FF"/>
<stop offset="1" stop-color="#BD34FE"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="194.651" y1="8.81818" x2="236.076" y2="292.989" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFEA83"/>
<stop offset="0.0833333" stop-color="#FFDD35"/>
<stop offset="1" stop-color="#FFA800"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -2,6 +2,7 @@ import { PayloadAction, createSlice } from "@reduxjs/toolkit";
import { Assignee, Task } from "api/api";
import { DictationState } from "./state";
import {
backupTasksAsync,
getSortColumnAsync,
listBackupPopupTasksAsync,
listTasksAsync,
@ -46,6 +47,7 @@ const initialState: DictationState = {
},
isLoading: true,
isBackupListLoading: false,
isDownloading: false,
},
};
@ -203,6 +205,15 @@ export const dictationSlice = createSlice({
builder.addCase(listBackupPopupTasksAsync.rejected, (state) => {
state.apps.isBackupListLoading = false;
});
builder.addCase(backupTasksAsync.pending, (state) => {
state.apps.isDownloading = true;
});
builder.addCase(backupTasksAsync.fulfilled, (state) => {
state.apps.isDownloading = false;
});
builder.addCase(backupTasksAsync.rejected, (state) => {
state.apps.isDownloading = false;
});
},
});

View File

@ -3,6 +3,7 @@ import type { RootState } from "app/store";
import { getTranslationID } from "translation";
import { openSnackbar } from "features/ui/uiSlice";
import { getAccessToken } from "features/auth";
import { BlobClient } from "@azure/storage-blob";
import {
TasksResponse,
TasksApi,
@ -11,6 +12,7 @@ import {
GetTypistsResponse,
GetTypistGroupsResponse,
Assignee,
FilesApi,
} from "../../api/api";
import { Configuration } from "../../api/configuration";
import { ErrorObject, createErrorObject } from "../../common/errors";
@ -22,6 +24,7 @@ import {
SORTABLE_COLUMN,
SortableColumnType,
} from "./constants";
import { BackupTask } from "./types";
export const listTasksAsync = createAsyncThunk<
TasksResponse,
@ -455,7 +458,7 @@ export const listBackupPopupTasksAsync = createAsyncThunk<
BACKUP_POPUP_LIST_SIZE,
offset,
BACKUP_POPUP_LIST_STATUS.join(","), // ステータスはFinished,Backupのみ
DIRECTION.ASC,
DIRECTION.DESC,
SORTABLE_COLUMN.Status,
{
headers: { authorization: `Bearer ${accessToken}` },
@ -476,3 +479,96 @@ export const listBackupPopupTasksAsync = createAsyncThunk<
return thunkApi.rejectWithValue({ error });
}
});
export const backupTasksAsync = createAsyncThunk<
{
// empty
},
{
// パラメータ
tasks: BackupTask[];
},
{
// rejectした時の返却値の型
rejectValue: {
error: ErrorObject;
};
}
>("dictations/backupTasksAsync", async (args, thunkApi) => {
const { tasks } = args;
// apiのConfigurationを取得する
const { getState } = thunkApi;
const state = getState() as RootState;
const { configuration } = state.auth;
const accessToken = getAccessToken(state.auth);
const config = new Configuration(configuration);
const tasksApi = new TasksApi(config);
const filesApi = new FilesApi(config);
try {
// eslint-disable-next-line no-restricted-syntax
for (const task of tasks) {
if (task.checked) {
// eslint-disable-next-line no-await-in-loop
const { data } = await filesApi.downloadLocation(task.audioFileId, {
headers: { authorization: `Bearer ${accessToken}` },
});
const { url } = data;
const { pathname } = new URL(url);
const paths = pathname.split("/").filter((p) => p !== "");
if (paths.length < 2) {
throw new Error("invalid path");
}
const blobName = paths[1];
// コンテナとBlobを取得
const blobClient = new BlobClient(url);
// Blobをダウンロード
// eslint-disable-next-line no-await-in-loop
const blobDownloadResponse = await blobClient.download();
// eslint-disable-next-line no-await-in-loop
const blobBody = await blobDownloadResponse.blobBody;
if (!blobBody) {
throw new Error("invalid blobBody");
}
// ダウンロードしたBlobをローカルに保存するリンクを作成してクリックする
const blobURL = window.URL.createObjectURL(blobBody);
const a = document.createElement("a");
a.href = blobURL;
a.download = blobName;
document.body.appendChild(a);
a.click();
a.parentNode?.removeChild(a);
// eslint-disable-next-line no-await-in-loop
await tasksApi.backup(task.audioFileId, {
headers: { authorization: `Bearer ${accessToken}` },
});
}
}
thunkApi.dispatch(
openSnackbar({
level: "info",
message: getTranslationID("common.message.success"),
})
);
return {};
} catch (e) {
// e ⇒ errorObjectに変換"
const error = createErrorObject(e);
thunkApi.dispatch(
openSnackbar({
level: "error",
message: getTranslationID("dictationPage.message.backupFailedError"),
})
);
return thunkApi.rejectWithValue({ error });
}
});

View File

@ -68,3 +68,6 @@ export const selectBackupAllChecked = (state: RootState) => {
export const selectIsBackupListLoading = (state: RootState) =>
state.dictation.apps.isBackupListLoading;
export const selectIsDownloading = (state: RootState) =>
state.dictation.apps.isDownloading;

View File

@ -32,6 +32,7 @@ export interface Apps {
};
isLoading: boolean;
isBackupListLoading: boolean;
isDownloading: boolean;
}
export interface Backup {

View File

@ -3,6 +3,7 @@ import styles from "styles/app.module.scss";
import { useDispatch, useSelector } from "react-redux";
import {
BACKUP_POPUP_LIST_SIZE,
backupTasksAsync,
changeBackupTaskAllCheched,
changeBackupTaskChecked,
listBackupPopupTasksAsync,
@ -11,6 +12,7 @@ import {
selectBackupTotal,
selectCurrentBackupPage,
selectIsBackupListLoading,
selectIsDownloading,
selectTotalBackupPage,
} from "features/dictation";
import { AppDispatch } from "app/store";
@ -30,6 +32,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
const [t] = useTranslation();
const isBackupListLoading = useSelector(selectIsBackupListLoading);
const isDownloading = useSelector(selectIsDownloading);
const backupTasks = useSelector(selectBackupTasks);
@ -41,8 +44,11 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
// ポップアップを閉じる処理
const closePopup = useCallback(() => {
if (isDownloading) {
return;
}
onClose(false);
}, [onClose]);
}, [onClose, isDownloading]);
useEffect(() => {
if (isOpen) {
@ -50,6 +56,33 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
}
}, [dispatch, isOpen]);
// ブラウザのウィンドウが閉じられようとしている場合に発火するイベントハンドラ
const handleBeforeUnload = (e: BeforeUnloadEvent) => {
// ファイルダウンロード中に閉じられようとしている場合、ダイアログを表示させる
if (isDownloading) {
e.preventDefault();
// ChromeではreturnValueが必要
e.returnValue = "";
}
};
// コンポーネントがマウントされた時にイベントハンドラを登録する
useEffect(() => {
window.addEventListener("beforeunload", handleBeforeUnload);
// コンポーネントがアンマウントされるときにイベントハンドラを解除する
return () => {
window.removeEventListener("beforeunload", handleBeforeUnload);
};
});
// バックアップ処理
const onBackup = useCallback(async () => {
await dispatch(backupTasksAsync({ tasks: backupTasks }));
// バックアップ処理の終了後、バックアップ対象タスク一覧を再取得する
dispatch(listBackupPopupTasksAsync({ offset: 0 }));
}, [dispatch, backupTasks]);
// ページネーションの制御
const getFirstPage = useCallback(() => {
dispatch(listBackupPopupTasksAsync({ offset: 0 }));
@ -75,7 +108,11 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
<div className={styles.modalBox}>
<p className={styles.modalTitle}>
{t(getTranslationID("dictationPage.label.fileBackup"))}
<button type="button" onClick={closePopup}>
<button
type="button"
onClick={closePopup}
style={{ pointerEvents: isDownloading ? "none" : "auto" }}
>
<img src={close} className={styles.modalTitleIcon} alt="close" />
</button>
</p>
@ -97,6 +134,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
})
)
}
disabled={isDownloading}
/>
</th>
<th className={styles.noLine}>
@ -133,6 +171,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
})
);
}}
disabled={isDownloading}
/>
</td>
<td>{task.jobNumber}</td>
@ -208,13 +247,25 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
</dd>
<dd className={`${styles.full} ${styles.alignCenter}`}>
<input
type="submit"
type="button"
name="submit"
value={t(
getTranslationID("dictationPage.label.downloadForBackup")
)}
className={`${styles.formSubmit} ${styles.marginBtm1} ${styles.isActive}`}
className={`${styles.formSubmit} ${styles.marginBtm1} ${
isDownloading || backupTasks.every((x) => !x.checked)
? ""
: styles.isActive
}`}
onClick={onBackup}
/>
{isDownloading && (
<img
src={progress_activit}
className={styles.icLoading}
alt="Loading"
/>
)}
</dd>
</dl>
</form>

View File

@ -32,7 +32,6 @@ import {
playbackAsync,
cancelAsync,
} from "features/dictation";
import { selectUserName } from "features/login/index";
import { getTranslationID } from "translation";
import { Task } from "api/api";
import { isAdminUser, isAuthorUser, isTypistUser } from "features/auth";
@ -75,9 +74,6 @@ const DictationPage: React.FC = (): JSX.Element => {
[dispatch, setIsChangeTranscriptionistPopupOpen]
);
// ログイン中のユーザ名
const myName = useSelector(selectUserName);
// 各カラムの表示/非表示
const displayColumn = useSelector(selectDisplayInfo);

View File

@ -248,7 +248,15 @@ export const LicenseSummary: React.FC<LicenseSummaryProps> = (
<dt>
{t(getTranslationID("LicenseSummaryPage.label.shortage"))}
</dt>
<dd>{licenseSummaryInfo.shortage}</dd>
<dd>
<span
className={
licenseSummaryInfo.shortage > 0 ? styles.isAlert : ""
}
>
{licenseSummaryInfo.shortage}
</span>
</dd>
<dt>
{t(
getTranslationID("LicenseSummaryPage.label.storageSize")

View File

@ -385,9 +385,18 @@ const PartnerLicense: React.FC = (): JSX.Element => {
</td>
<td>{ownPartnerLicenseInfo.issuedRequested}</td>
<td>
<span
className={
ownPartnerLicenseInfo.shortage > 0 &&
ownPartnerLicenseInfo.tier !== 1
? styles.isAlert
: ""
}
>
{ownPartnerLicenseInfo.tier !== 1
? ownPartnerLicenseInfo.shortage
: "-"}
</span>
</td>
<td>
{ownPartnerLicenseInfo.tier !== 1

View File

@ -901,6 +901,9 @@ h3 + .brCrumb .tlIcon {
text-align: right;
word-break: break-all;
}
.listVertical dd .isAlert {
color: #ff5a33;
}
.listDocument {
margin-bottom: 3rem;
}

View File

@ -49,6 +49,7 @@ declare const classNames: {
readonly formTrash: "formTrash";
readonly listVertical: "listVertical";
readonly listHeader: "listHeader";
readonly isAlert: "isAlert";
readonly listDocument: "listDocument";
readonly boxFlex: "boxFlex";
readonly aru: "aru";
@ -84,7 +85,6 @@ declare const classNames: {
readonly widthSml: "widthSml";
readonly widthMin: "widthMin";
readonly snackbar: "snackbar";
readonly isAlert: "isAlert";
readonly snackbarMessage: "snackbarMessage";
readonly snackbarIcon: "snackbarIcon";
readonly snackbarIconClose: "snackbarIconClose";

View File

@ -13,11 +13,13 @@
"@sendgrid/mail": "^7.7.0",
"dotenv": "^16.0.3",
"mysql2": "^2.3.3",
"redis": "^3.1.2",
"typeorm": "^0.3.10"
},
"devDependencies": {
"@types/jest": "^27.5.0",
"@types/node": "18.x",
"@types/redis": "^2.8.13",
"azure-functions-core-tools": "^4.x",
"jest": "^28.0.3",
"rimraf": "^5.0.0",
@ -1989,6 +1991,15 @@
"integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
"dev": true
},
"node_modules/@types/redis": {
"version": "2.8.32",
"resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.32.tgz",
"integrity": "sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/stack-utils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz",
@ -5252,9 +5263,9 @@
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
},
"node_modules/lru-cache": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
"integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
"integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
"dev": true,
"engines": {
"node": "14 || >=16.14"
@ -6371,8 +6382,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz",
"integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==",
"optional": true,
"peer": true,
"dependencies": {
"denque": "^1.5.0",
"redis-commands": "^1.7.0",
@ -6390,16 +6399,12 @@
"node_modules/redis-commands": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
"integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==",
"optional": true,
"peer": true
"integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ=="
},
"node_modules/redis-errors": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
"integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
"optional": true,
"peer": true,
"engines": {
"node": ">=4"
}
@ -6408,8 +6413,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
"integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
"optional": true,
"peer": true,
"dependencies": {
"redis-errors": "^1.0.0"
},
@ -6421,8 +6424,6 @@
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
"integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==",
"optional": true,
"peer": true,
"engines": {
"node": ">=0.10"
}

View File

@ -18,11 +18,13 @@
"@sendgrid/mail": "^7.7.0",
"dotenv": "^16.0.3",
"mysql2": "^2.3.3",
"redis": "^3.1.2",
"typeorm": "^0.3.10"
},
"devDependencies": {
"@types/jest": "^27.5.0",
"@types/node": "18.x",
"@types/redis": "^2.8.13",
"azure-functions-core-tools": "^4.x",
"jest": "^28.0.3",
"rimraf": "^5.0.0",

View File

@ -1,74 +0,0 @@
import { ClientSecretCredential } from "@azure/identity";
import { Client } from "@microsoft/microsoft-graph-client";
import { TokenCredentialAuthenticationProvider } from "@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials";
import { AdB2cResponse, AdB2cUser } from "./types/types";
import { error } from "console";
export class Adb2cTooManyRequestsError extends Error {}
export class AdB2cService {
private graphClient: Client;
constructor() {
// ADB2Cへの認証情報
if (
!process.env.ADB2C_TENANT_ID ||
!process.env.ADB2C_CLIENT_ID ||
!process.env.ADB2C_CLIENT_SECRET
) {
throw error;
}
const credential = new ClientSecretCredential(
process.env.ADB2C_TENANT_ID,
process.env.ADB2C_CLIENT_ID,
process.env.ADB2C_CLIENT_SECRET
);
const authProvider = new TokenCredentialAuthenticationProvider(credential, {
scopes: ["https://graph.microsoft.com/.default"],
});
this.graphClient = Client.initWithMiddleware({ authProvider });
}
/**
* Azure AD B2Cからユーザ情報を取得する
* @param externalIds ID
* @returns
*/
async getUsers(externalIds: string[]): Promise<AdB2cUser[]> {
const chunkExternalIds = splitArrayInChunksOfFifteen(externalIds);
try {
const b2cUsers: AdB2cUser[] = [];
for (let index = 0; index < chunkExternalIds.length; index++) {
const element = chunkExternalIds[index];
const res: AdB2cResponse = await this.graphClient
.api(`users/`)
.select(["id", "displayName", "identities"])
.filter(`id in (${element.map((y) => `'${y}'`).join(",")})`)
.get();
b2cUsers.push(...res.value);
}
return b2cUsers;
} catch (e) {
const { statusCode } = e;
if (statusCode === 429) {
throw new Adb2cTooManyRequestsError();
}
throw e;
} finally {
}
}
}
const splitArrayInChunksOfFifteen = (arr: string[]): string[][] => {
const result: string[][] = [];
const chunkSize = 15; // SDKの制限数
for (let i = 0; i < arr.length; i += chunkSize) {
result.push(arr.slice(i, i + chunkSize));
}
return result;
};

View File

@ -0,0 +1,147 @@
import { ClientSecretCredential } from "@azure/identity";
import { Client } from "@microsoft/microsoft-graph-client";
import { TokenCredentialAuthenticationProvider } from "@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials";
import { AdB2cResponse, AdB2cUser } from "./types/types";
import { error } from "console";
import { makeADB2CKey, restoreAdB2cID } from "../common/cache";
import { promisify } from "util";
import { createRedisClient } from "../redis/redis";
import { InvocationContext } from "@azure/functions";
export class Adb2cTooManyRequestsError extends Error {}
export class AdB2cService {
private graphClient: Client;
constructor() {
// ADB2Cへの認証情報
if (
!process.env.ADB2C_TENANT_ID ||
!process.env.ADB2C_CLIENT_ID ||
!process.env.ADB2C_CLIENT_SECRET ||
!process.env.ADB2C_CACHE_TTL
) {
throw error;
}
const credential = new ClientSecretCredential(
process.env.ADB2C_TENANT_ID,
process.env.ADB2C_CLIENT_ID,
process.env.ADB2C_CLIENT_SECRET
);
const authProvider = new TokenCredentialAuthenticationProvider(credential, {
scopes: ["https://graph.microsoft.com/.default"],
});
this.graphClient = Client.initWithMiddleware({ authProvider });
}
/**
* Azure AD B2Cからユーザ情報を取得する
* @param externalIds ID
* @returns
*/
async getUsers(
context: InvocationContext,
externalIds: string[]
): Promise<AdB2cUser[] | undefined> {
const redisClient = createRedisClient();
try {
const b2cUsers: AdB2cUser[] = [];
const keys = externalIds.map((externalId) => makeADB2CKey(externalId));
// 取得対象が0件だとmgetがエラーとなるので、1件以上のときに処理
if (keys.length !== 0) {
// redisからキャッシュされているユーザーを取得
let cacheUserObjects: {
key: string;
value: AdB2cUser;
}[] = [];
const mgetAsync = promisify(redisClient.mget).bind(redisClient);
try {
const values = await mgetAsync(...keys);
cacheUserObjects = values.map((value, index) => ({
key: keys[index],
value: value ? JSON.parse(value) : null,
}));
context.log("mget Result:", cacheUserObjects);
} catch (error) {
context.error("mget Error:", error);
}
// キャッシュ上に存在していれば、キャッシュから取得する
const cachedUsers = cacheUserObjects.flatMap((x) =>
x.value ? [x.value] : []
);
if (cachedUsers.length > 0) {
context.log(
`[CACHE HIT] ids: ${cachedUsers.map((x) => x.id).join(",")}`
);
}
// キャッシュ上に存在していなければ、ADB2Cから取得する
const queryExternalIds = cacheUserObjects
.filter((x) => x.value === null)
.map((x) => restoreAdB2cID(x.key));
const chunkExternalIds = splitArrayInChunksOfFifteen(queryExternalIds);
for (let index = 0; index < chunkExternalIds.length; index++) {
const element = chunkExternalIds[index];
const res: AdB2cResponse = await this.graphClient
.api(`users/`)
.select(["id", "displayName", "identities"])
.filter(`id in (${element.map((y) => `'${y}'`).join(",")})`)
.get();
b2cUsers.push(...res.value);
// 取得したユーザーをキャッシュに保存する
const users = res.value.map((user) => {
const key = makeADB2CKey(user.id);
return {
key: key,
value: user,
};
});
try {
const setexAsync = promisify(redisClient.setex).bind(redisClient);
const ttl = process.env.ADB2C_CACHE_TTL;
users.map(async (x) => {
await setexAsync(x.key, ttl, JSON.stringify(x.value));
context.log(
"setex Result:",
`key:${x.key},ttl:${ttl},value:${JSON.stringify(x.value)}`
);
});
} catch (error) {
context.error("setex Error:", error);
}
context.log(
`[ADB2C GET] externalIds: ${res.value?.map((x) => x.id).join(",")}`
);
}
return [...cachedUsers, ...b2cUsers];
} else {
return undefined;
}
} catch (e) {
const { statusCode } = e;
if (statusCode === 429) {
throw new Adb2cTooManyRequestsError();
}
throw e;
} finally {
redisClient.quit;
}
}
}
const splitArrayInChunksOfFifteen = (arr: string[]): string[][] => {
const result: string[][] = [];
const chunkSize = 15; // SDKの制限数
for (let i = 0; i < arr.length; i += chunkSize) {
result.push(arr.slice(i, i + chunkSize));
}
return result;
};

View File

@ -16,8 +16,8 @@ import {
} from "../common/types/types";
import { createMailContentOfLicenseShortage } from "../sendgrid/mailContents/U103ShortageAlert";
import { createMailContentOfLicenseExpiringSoon } from "../sendgrid/mailContents/U104ExpiringSoonAlert";
import { AdB2cService } from "../adb2c/adb2c.service";
import { SendGridService } from "../sendgrid/sendgrid.service";
import { AdB2cService } from "../adb2c/adb2c";
import { SendGridService } from "../sendgrid/sendgrid";
import { getMailFrom } from "../common/getEnv/getEnv";
export async function licenseAlertProcessing(
@ -156,8 +156,12 @@ export async function licenseAlertProcessing(
externalIds.push(x.secondaryAdminExternalId);
}
});
const adb2cUsers = await adb2c.getUsers(externalIds);
const adb2cUsers = await adb2c.getUsers(context, externalIds);
if (!adb2cUsers) {
context.log("Target user not found");
context.log("[OUT]licenseAlertProcessing");
return;
}
// ADB2Cから取得したメールアドレスをRDBから取得した情報にマージ
sendTargetAccounts.map((info) => {
const primaryAdminUser = adb2cUsers.find(

View File

@ -0,0 +1,29 @@
import { app, InvocationContext, Timer } from "@azure/functions";
import * as dotenv from "dotenv";
import { promisify } from "util";
import { createRedisClient } from "../redis/redis";
export async function redisTimerTest(
myTimer: Timer,
context: InvocationContext
): Promise<void> {
context.log("---Timer function processed request.");
dotenv.config({ path: ".env" });
dotenv.config({ path: ".env.local", override: true });
const redisClient = createRedisClient();
const setAsync = promisify(redisClient.set).bind(redisClient);
const getAsync = promisify(redisClient.get).bind(redisClient);
await setAsync("foo", "bar");
const value = await getAsync("foo");
context.log(`value=${value}`); // returns 'bar'
await redisClient.quit;
}
app.timer("redisTimerTest", {
schedule: "*/30 * * * * *",
handler: redisTimerTest,
});

View File

@ -0,0 +1,35 @@
import { createClient, RedisClient } from "redis";
import { error } from "console";
export const createRedisClient = (): RedisClient => {
if (
!process.env.REDIS_HOST ||
!process.env.REDIS_PORT ||
!process.env.REDIS_PASSWORD
) {
throw error("Required environment variables are not set.");
}
const host = process.env.REDIS_HOST;
const port = parseInt(process.env.REDIS_PORT, 10);
const password = process.env.REDIS_PASSWORD;
let client: RedisClient;
if (process.env.STAGE === "local") {
client = createClient({
host: host,
port: port,
password: password,
});
} else {
client = createClient({
url: `rediss://${host}:${port}`,
password: password,
tls: {},
});
}
client.on("error", (err) => console.log("Redis Client Error", err));
return client;
};

View File

@ -10,8 +10,8 @@ import {
} from "../common/types/types";
import { AdB2cUser } from "../adb2c/types/types";
import { ADB2C_SIGN_IN_TYPE } from "../constants";
import { SendGridService } from "../sendgrid/sendgrid.service";
import { AdB2cService } from "../adb2c/adb2c.service";
import { SendGridService } from "../sendgrid/sendgrid";
import { AdB2cService } from "../adb2c/adb2c";
import { InvocationContext } from "@azure/functions";
describe("licenseAlert", () => {
@ -209,7 +209,10 @@ export class AdB2cServiceMock {
* @param externalIds ID
* @returns
*/
async getUsers(externalIds: string[]): Promise<AdB2cUser[]> {
async getUsers(
context: InvocationContext,
externalIds: string[]
): Promise<AdB2cUser[]> {
const AdB2cMockUsers: AdB2cUser[] = [
{
id: "external_id1",

View File

@ -139,6 +139,12 @@ export const LICENSE_EXPIRATION_THRESHOLD_DAYS = 14;
*/
export const LICENSE_EXPIRATION_DAYS = 365;
/**
* 8
* @const {number}
*/
export const LICENSE_EXPIRATION_TIME_WITH_TIMEZONE = 8;
/**
*
* @const {number}

View File

@ -152,6 +152,10 @@ export class AccountsService {
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.getLicenseSummary.name}`,
);
}
}
/**
@ -179,7 +183,7 @@ export class AccountsService {
} | params: { ` +
`dealerAccountId: ${dealerAccountId}, ` +
`role: ${role}, ` +
`acceptedEulaVersion: ${acceptedEulaVersion} }, ` +
`acceptedEulaVersion: ${acceptedEulaVersion}, ` +
`acceptedDpaVersion: ${acceptedDpaVersion} };`,
);
try {
@ -333,6 +337,11 @@ export class AccountsService {
externalUserId: string,
context: Context,
): Promise<void> {
this.logger.log(
`[IN] [${context.getTrackingId()}] ${
this.createAccount.name
} | params: { ` + `externalUserId: ${externalUserId}};`,
);
try {
await this.adB2cService.deleteUser(externalUserId, context);
this.logger.log(
@ -344,6 +353,10 @@ export class AccountsService {
this.logger.error(
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete externalUser: ${externalUserId}`,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.deleteAdB2cUser.name}`,
);
}
}
@ -368,6 +381,10 @@ export class AccountsService {
this.logger.error(
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete account: ${accountId}, user: ${userId}`,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.deleteAccount.name}`,
);
}
}
@ -396,6 +413,10 @@ export class AccountsService {
this.logger.error(
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete container: ${accountId}, country: ${country}`,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.deleteBlobContainer.name}`,
);
}
}
@ -1184,6 +1205,10 @@ export class AccountsService {
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.createTypistGroup.name}`,
);
}
}

View File

@ -119,7 +119,7 @@ export class AuthService {
const privateKey = getPrivateKey(this.configService);
// ユーザーのロールを設定
const role = this.getUserRole(user.role);
const role = this.getUserRole(context, user.role);
const token = sign<RefreshToken>(
{
@ -250,7 +250,7 @@ export class AuthService {
const privateKey = getPrivateKey(this.configService);
// ユーザーのロールを設定
const role = this.getUserRole(adminUser.role);
const role = this.getUserRole(context, adminUser.role);
const token = sign<RefreshToken>(
{
@ -540,6 +540,7 @@ export class AuthService {
case jwt.JsonWebTokenError:
// メッセージごとにエラーを判定しHTTPエラーを生成
throw this.makeHttpErrorFromJsonWebTokenErrorMessage(
context,
message,
issuer,
);
@ -561,6 +562,9 @@ export class AuthService {
}
getPublicKeyFromJwk(context: Context, jwkKey: JwkSignKey): string {
this.logger.log(
`[IN] [${context.getTrackingId()}] ${this.getPublicKeyFromJwk.name}`,
);
try {
// JWK形式のJSONなのでJWTの公開鍵として使えるようにPEM形式に変換
const publicKey = jwkToPem({
@ -584,9 +588,16 @@ export class AuthService {
* JWT検証時のErrorJsonWebTokenErrorをメッセージごとに仕分けてHTTPエラーを生成
*/
makeHttpErrorFromJsonWebTokenErrorMessage = (
context: Context,
message: string,
issuer: string,
): Error => {
this.logger.log(
`[IN] [${context.getTrackingId()}] ${
this.makeHttpErrorFromJsonWebTokenErrorMessage.name
}`,
);
try {
// 署名が不正
if (message === 'invalid signature') {
return new HttpException(
@ -613,11 +624,26 @@ export class AuthService {
makeErrorResponse('E000101'),
HttpStatus.UNAUTHORIZED,
);
} catch (e) {
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
throw e;
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${
this.makeHttpErrorFromJsonWebTokenErrorMessage.name
}`,
);
}
};
/**
*
*/
getUserRole = (role: string): string => {
getUserRole = (context: Context, role: string): string => {
this.logger.log(
`[IN] [${context.getTrackingId()}] ${this.getUserRole.name}`,
);
try {
// ユーザーのロールを設定
// 万一不正なRoleが登録されていた場合、そのままDBの値を使用すると不正なロールのリフレッシュトークンが発行されるため、
// ロールの設定値はDBに保存したRoleの値を直接トークンに入れないように定数で設定する
@ -633,6 +659,14 @@ export class AuthService {
`Role from DB is unexpected value. role=${role}`,
);
}
} catch (e) {
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
throw e;
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.getUserRole.name}`,
);
}
};
/**

View File

@ -220,7 +220,9 @@ export class FilesController {
@ApiBearerAuth()
@UseGuards(AuthGuard)
@UseGuards(
RoleGuard.requireds({ roles: [USER_ROLES.AUTHOR, USER_ROLES.TYPIST] }),
RoleGuard.requireds({
roles: [ADMIN_ROLES.ADMIN, USER_ROLES.AUTHOR, USER_ROLES.TYPIST],
}),
)
async downloadLocation(
@Req() req: Request,

View File

@ -376,6 +376,7 @@ export class FilesService {
let country: string;
let isTypist: boolean;
let authorId: string | undefined;
let isAdmin: boolean;
try {
const user = await this.usersRepository.findUserByExternalId(externalId);
if (!user.account) {
@ -399,6 +400,9 @@ export class FilesService {
country = user.account.country;
isTypist = user.role === USER_ROLES.TYPIST;
authorId = user.author_id ?? undefined;
isAdmin =
user.account.primary_admin_user_id === user.id ||
user.account.secondary_admin_user_id === user.id;
} catch (e) {
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
this.logger.log(
@ -426,7 +430,9 @@ export class FilesService {
}
try {
const status = isTypist
// ユーザーが管理者でないTypistの場合はステータスがIN_PROGRESSかPENDINGのタスクのみ取得できる
const status =
!isAdmin && isTypist
? [TASK_STATUS.IN_PROGRESS, TASK_STATUS.PENDING]
: Object.values(TASK_STATUS);
@ -445,6 +451,8 @@ export class FilesService {
);
}
// ユーザーがAdminの場合は特にチェックしない
if (!isAdmin) {
// ユーザーがAuthorの場合、自身が追加したタスクでない場合はエラー
if (!isTypist && file.author_id !== authorId) {
throw new AuthorUserNotMatchError(
@ -458,6 +466,7 @@ export class FilesService {
`task typist is not match. audio_file_id:${audioFileId}, task.typist_user_id:${task.typist_user_id}, userId:${userId}`,
);
}
}
const filePath = `${file.file_name}`;

View File

@ -12,7 +12,6 @@ import {
import { LicensesRepositoryService } from '../../repositories/licenses/licenses.repository.service';
import { UserNotFoundError } from '../../repositories/users/errors/types';
import {
DateWithZeroTime,
GetAllocatableLicensesResponse,
IssueCardLicensesResponse,
} from './types/types';
@ -113,6 +112,10 @@ export class LicensesService {
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.licenseOrders.name}`,
);
}
}
async issueCardLicenseKeys(
@ -164,6 +167,10 @@ export class LicensesService {
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.issueCardLicenseKeys.name}`,
);
}
}

View File

@ -3,6 +3,7 @@ import { IsInt, Matches, Max, Min, Length } from 'class-validator';
import {
LICENSE_EXPIRATION_DAYS,
LICENSE_EXPIRATION_THRESHOLD_DAYS,
LICENSE_EXPIRATION_TIME_WITH_TIMEZONE,
TRIAL_LICENSE_EXPIRATION_DAYS,
} from '../../../constants';
@ -96,6 +97,8 @@ export class NewTrialLicenseExpirationDate extends Date {
} else {
super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
}
// タイムゾーンをカバーするために現在時刻に8時間を加算してから、30日後の日付を取得する
this.setHours(this.getHours() + LICENSE_EXPIRATION_TIME_WITH_TIMEZONE);
this.setDate(this.getDate() + TRIAL_LICENSE_EXPIRATION_DAYS);
this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
this.setMilliseconds(0);
@ -110,6 +113,8 @@ export class NewAllocatedLicenseExpirationDate extends Date {
} else {
super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
}
// タイムゾーンをカバーするために現在時刻に8時間を加算してから、365日後の日付を取得する
this.setHours(this.getHours() + LICENSE_EXPIRATION_TIME_WITH_TIMEZONE);
this.setDate(this.getDate() + LICENSE_EXPIRATION_DAYS);
this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
this.setMilliseconds(0);

View File

@ -1,6 +1,5 @@
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common';
import { TasksRepositoryService } from '../../repositories/tasks/tasks.repository.service';
import { AccessToken } from '../../common/token';
import { Assignee, Task } from './types/types';
import { Task as TaskEntity } from '../../repositories/tasks/entity/task.entity';
import { createTasks } from './types/convert';
@ -625,6 +624,10 @@ export class TasksService {
...new Set(assigneesExternalIds.concat(typistExternalIds)),
];
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.getB2cUsers.name}`,
);
// B2Cからユーザー名を取得する
return await this.adB2cService.getUsers(context, distinctedExternalIds);
}
@ -769,5 +772,8 @@ export class TasksService {
priority: file.priority === '00' ? 'Normal' : 'High',
uploadedAt: file.uploaded_at.toISOString(),
});
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.sendNotify.name}`,
);
}
}

View File

@ -117,6 +117,10 @@ export class UsersService {
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.confirmUser.name}`,
);
}
}
@ -313,6 +317,11 @@ export class UsersService {
// Azure AD B2Cに登録したユーザー情報を削除する
// TODO 「タスク 2452: リトライ処理を入れる箇所を検討し、実装する」の候補
private async deleteB2cUser(externalUserId: string, context: Context) {
this.logger.log(
`[IN] [${context.getTrackingId()}] ${
this.deleteB2cUser.name
} | params: { externalUserId: ${externalUserId} }`,
);
try {
await this.adB2cService.deleteUser(externalUserId, context);
this.logger.log(
@ -323,11 +332,20 @@ export class UsersService {
this.logger.error(
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete externalUser: ${externalUserId}`,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.deleteB2cUser.name}`,
);
}
}
// DBに登録したユーザー情報を削除する
private async deleteUser(userId: number, context: Context) {
this.logger.log(
`[IN] [${context.getTrackingId()}] ${
this.deleteUser.name
} | params: { userId: ${userId} }`,
);
try {
await this.usersRepository.deleteNormalUser(userId);
this.logger.log(`[${context.getTrackingId()}] delete user: ${userId}`);
@ -336,6 +354,10 @@ export class UsersService {
this.logger.error(
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete user: ${userId}`,
);
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.deleteUser.name}`,
);
}
}
@ -368,6 +390,7 @@ export class UsersService {
`encryption: ${encryption}, ` +
`prompt: ${prompt} };`,
);
try {
switch (role) {
case USER_ROLES.NONE:
case USER_ROLES.TYPIST:
@ -410,6 +433,14 @@ export class UsersService {
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
} catch (e) {
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
return e;
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${this.createNewUserInfo.name}`,
);
}
}
/**
@ -486,6 +517,12 @@ export class UsersService {
);
}
}
} finally {
this.logger.log(
`[OUT] [${context.getTrackingId()}] ${
this.confirmUserAndInitPassword.name
}`,
);
}
}

View File

@ -368,6 +368,10 @@ export class BlobstorageService {
throw e;
}
// SASの開始時刻より前に実行するとエラーになるため、開始時刻を15分前に設定
const startDate = new Date();
startDate.setTime(startDate.getTime() - 15 * 60 * 1000);
//SASの有効期限を設定
const expiryDate = new Date();
expiryDate.setHours(expiryDate.getHours() + this.sasTokenExpireHour);
@ -382,7 +386,7 @@ export class BlobstorageService {
containerName: containerClient.containerName,
blobName: blobClient.name,
permissions: permissions,
startsOn: new Date(),
startsOn: startDate,
expiresOn: expiryDate,
},
sharedKeyCredential,

View File

@ -5,12 +5,14 @@ az group export --name dev-database-rg --output json > configurations/azure/dev-
az group export --name dev-network-rg --output json > configurations/azure/dev-network-rg.json && ^
az group export --name dev-storage-rg --output json > configurations/azure/dev-storage-rg.json && ^
az group export --name dev-notification-rg --output json > configurations/azure/dev-notification-rg.json && ^
az group export --name dev-monitor-rg --output json > configurations/azure/dev-monitor-rg.json && ^
az group export --name stg-azureADB2C-rg --output json > configurations/azure/stg-azureADB2C-rg.json && ^
az group export --name stg-application-rg --output json > configurations/azure/stg-application-rg.json && ^
az group export --name stg-database-rg --output json > configurations/azure/stg-database-rg.json && ^
az group export --name stg-network-rg --output json > configurations/azure/stg-network-rg.json && ^
az group export --name stg-storage-rg --output json > configurations/azure/stg-storage-rg.json && ^
az group export --name stg-notification-rg --output json > configurations/azure/stg-notification-rg.json && ^
az group export --name stg-monitor-rg --output json > configurations/azure/stg-monitor-rg.json && ^
az group export --name maintenance-rg --output json > configurations/azure/maintenance-rg.json && ^
az group export --name shared-sendGrid-rg --output json > configurations/azure/shared-sendGrid-rg.json && ^
az group export --name shared-template-rg --output json > configurations/azure/shared-template-rg.json