From 9981a8cb3e6dcc16562c34a92f2d8859f6edd7bd Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 11:45:48 +1000
Subject: [PATCH 01/10] Updated UI with sign-in/out buttons, signed-in user
status, message display.
---
app/HealthyHabitat/Views/MainWindow.xaml | 89 ++++++++++++++++++++++++
1 file changed, 89 insertions(+)
diff --git a/app/HealthyHabitat/Views/MainWindow.xaml b/app/HealthyHabitat/Views/MainWindow.xaml
index 286b135..7bfbb50 100644
--- a/app/HealthyHabitat/Views/MainWindow.xaml
+++ b/app/HealthyHabitat/Views/MainWindow.xaml
@@ -243,5 +243,94 @@
+
+
+
+
+
+
+
+
+
From 6365ad1f0729d0e837315b296914f4eb23bd5f08 Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 11:51:08 +1000
Subject: [PATCH 02/10] Added UI controls for sign-in/out buttons, singed
in-user status, message display.
---
.../ViewModels/MainWindowViewModel.cs | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index 1835c5f..74cedaa 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -137,6 +137,50 @@ public bool LocationDialogVisible
}
}
+ private bool _signInButtonVisible;
+ public bool SignInButtonVisible
+ {
+ get { return _signInButtonVisible; }
+ set
+ {
+ _signInButtonVisible = value;
+ RaisePropertyChanged("SignInButtonVisible");
+ }
+ }
+
+ private bool _signOutButtonVisible;
+ public bool SignOutButtonVisible
+ {
+ get { return _signOutButtonVisible; }
+ set
+ {
+ _signOutButtonVisible = value;
+ RaisePropertyChanged("SignOutButtonVisible");
+ }
+ }
+
+ private string _signedInUserName;
+ public string SignedInUserName
+ {
+ get { return _signedInUserName; }
+ set
+ {
+ _signedInUserName = value;
+ RaisePropertyChanged("SignedInUserName");
+ }
+ }
+
+ private string _displayMessage;
+ public string DisplayMessage
+ {
+ get { return _displayMessage; }
+ set
+ {
+ _displayMessage = value;
+ RaisePropertyChanged("DisplayMessage");
+ }
+ }
+
public MainWindowViewModel(IDialogService dialogService)
{
NameValueCollection locationSection = (NameValueCollection)ConfigurationManager.GetSection("locations");
From 282d6637a7af60e9b96c3f2cea70f3e4c0e3b2e5 Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 11:57:51 +1000
Subject: [PATCH 03/10] Added sign-in/out commands.
---
.../ViewModels/MainWindowViewModel.cs | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index 74cedaa..cba6146 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -48,6 +48,18 @@ public RelayCommand DropCommand
private set;
}
+ public RelayCommand SignInCommand
+ {
+ get;
+ private set;
+ }
+
+ public RelayCommand SignOutCommand
+ {
+ get;
+ private set;
+ }
+
public ICommand ShowMessageBoxWithMessageCommand { get; }
#endregion Commands
@@ -219,6 +231,18 @@ public MainWindowViewModel(IDialogService dialogService)
LocationDialogVisible = true;
});
+
+ SignInCommand = new RelayCommand(async () =>
+ {
+ await Authorize();
+ DisplayBasicTokenInfo();
+ });
+
+ SignOutCommand = new RelayCommand(async () =>
+ {
+ await DeAuthorize();
+ DisplayBasicTokenInfo();
+ });
}
private async void CopyFilesToLocalCache(string[] files, string location, string season)
From f31bb7b80f9c7451fcf5fc86bd6402af27de516b Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 15:30:07 +1000
Subject: [PATCH 04/10] Added auth definitions and init.
---
app/HealthyHabitat/HealthyHabitat.csproj | 6 ++++
.../ViewModels/MainWindowViewModel.cs | 32 ++++++++++++++++---
app/HealthyHabitat/packages.config | 4 +++
3 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/app/HealthyHabitat/HealthyHabitat.csproj b/app/HealthyHabitat/HealthyHabitat.csproj
index dc899d1..98d3de7 100644
--- a/app/HealthyHabitat/HealthyHabitat.csproj
+++ b/app/HealthyHabitat/HealthyHabitat.csproj
@@ -60,6 +60,9 @@
..\packages\Microsoft.Azure.Storage.Common.11.1.0\lib\net452\Microsoft.Azure.Storage.Common.dll
+
+ ..\packages\Microsoft.Identity.Client.4.4.0\lib\net45\Microsoft.Identity.Client.dll
+
..\packages\MvvmDialogs.5.3.0\lib\net45\MvvmDialogs.dll
@@ -69,6 +72,9 @@
+
+
+
..\packages\MvvmLightLibs.5.4.1.1\lib\net45\System.Windows.Interactivity.dll
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index cba6146..d4e1bb9 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -20,6 +20,7 @@
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
+ using Microsoft.Identity.Client;
public class MainWindowViewModel : ViewModelBase
{
@@ -193,8 +194,31 @@ public string DisplayMessage
}
}
+ // Auth definitions -------------------------------------------------------------------
+ private readonly string ClientId = "18dd432c-1e9e-4da7-93f6-f7d60e3ea712"; // ToDo: ConfigurationManager.AppSettings["ClientID"].ToString()
+ private readonly string ClientScopes = "user.read https://storage.azure.com/user_impersonation"; // ToDo: ConfigurationManager.AppSettings["ClientScopes"].ToString()
+
+ private IPublicClientApplication PublicClientApp { get; set; }
+ private AuthenticationResult AuthResult { get; set; }
+
+ // End Auth definitions -------------------------------------------------------------------
+
public MainWindowViewModel(IDialogService dialogService)
{
+ // Auth init -------------------------------------------------------------------
+ SignInButtonVisible = true;
+ DisplayMessage = "Please sign in to continue";
+ SignedInUserName = "";
+ PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
+ .WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs)
+ .WithLogging((level, message, containsPii) =>
+ {
+ Debug.WriteLine($"MSAL: {level} {message} ");
+ }, Microsoft.Identity.Client.LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true)
+ .Build();
+
+ // End Auth init -------------------------------------------------------------------
+
NameValueCollection locationSection = (NameValueCollection)ConfigurationManager.GetSection("locations");
Locations = new ObservableCollection();
@@ -234,14 +258,14 @@ public MainWindowViewModel(IDialogService dialogService)
SignInCommand = new RelayCommand(async () =>
{
- await Authorize();
- DisplayBasicTokenInfo();
+ //await Authorize();
+ //DisplayBasicTokenInfo();
});
SignOutCommand = new RelayCommand(async () =>
{
- await DeAuthorize();
- DisplayBasicTokenInfo();
+ //await DeAuthorize();
+ //DisplayBasicTokenInfo();
});
}
diff --git a/app/HealthyHabitat/packages.config b/app/HealthyHabitat/packages.config
index 9ad31ba..c69ea12 100644
--- a/app/HealthyHabitat/packages.config
+++ b/app/HealthyHabitat/packages.config
@@ -4,7 +4,11 @@
+
+
+
+
\ No newline at end of file
From 3ab814721c2ca1c68cf8994a83378c40685096ac Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 15:34:02 +1000
Subject: [PATCH 05/10] Added auth async tasks.
---
.../ViewModels/MainWindowViewModel.cs | 85 ++++++++++++++++++-
1 file changed, 81 insertions(+), 4 deletions(-)
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index d4e1bb9..25c009c 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -258,17 +258,94 @@ public MainWindowViewModel(IDialogService dialogService)
SignInCommand = new RelayCommand(async () =>
{
- //await Authorize();
- //DisplayBasicTokenInfo();
+ await Authorize();
+ DisplayBasicTokenInfo();
});
SignOutCommand = new RelayCommand(async () =>
{
- //await DeAuthorize();
- //DisplayBasicTokenInfo();
+ await DeAuthorize();
+ DisplayBasicTokenInfo();
});
}
+ // Auth -------------------------------------------------------------------
+ private async Task Authorize()
+ {
+ AuthResult = null;
+
+ // It's good practice to not do work on the UI thread, so use ConfigureAwait(false) whenever possible.
+ IEnumerable accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(true);
+ IAccount firstAccount = accounts.FirstOrDefault();
+
+ try
+ {
+ AuthResult = await PublicClientApp.AcquireTokenSilent(ClientScopes.Split(), firstAccount)
+ .ExecuteAsync();
+ }
+ catch (MsalUiRequiredException ex)
+ {
+ // A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token
+ System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");
+
+ try
+ {
+ AuthResult = await PublicClientApp.AcquireTokenInteractive(ClientScopes.Split())
+ .ExecuteAsync()
+ .ConfigureAwait(false);
+ }
+ catch (MsalException msalex)
+ {
+ DisplayMessage = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
+ }
+ }
+ catch (Exception ex)
+ {
+ DisplayMessage = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
+ return;
+ }
+
+ if (AuthResult != null)
+ {
+ SignedInUserName = $"Signed in as: {AuthResult.Account.Username}";
+ SignInButtonVisible = false;
+ SignOutButtonVisible = true;
+ }
+ }
+
+ private async Task DeAuthorize()
+ {
+ IEnumerable accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false);
+ IAccount firstAccount = accounts.FirstOrDefault();
+
+ try
+ {
+ await PublicClientApp.RemoveAsync(firstAccount).ConfigureAwait(false);
+ AuthResult = null;
+ SignedInUserName = "";
+ SignOutButtonVisible = false;
+ SignInButtonVisible = true;
+ }
+ catch (MsalException ex)
+ {
+ DisplayMessage = $"Error signing-out user: {ex.Message}";
+ }
+ }
+
+ public void DisplayBasicTokenInfo()
+ {
+ if (AuthResult != null)
+ {
+ DisplayMessage = $"User Name: {AuthResult.Account.Username}" + Environment.NewLine + $"Token Expires: {AuthResult.ExpiresOn.ToLocalTime()}";
+ }
+ else
+ {
+ DisplayMessage = "You have been signed out. Please sign in to continue";
+ }
+ }
+
+ // End Auth -------------------------------------------------------------------
+
private async void CopyFilesToLocalCache(string[] files, string location, string season)
{
From 82cc672aaa8687c20b4a2af667611843194e3adc Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 18:37:00 +1000
Subject: [PATCH 06/10] Added CreateStorageContainer and CreateStorageBlobs so
uploads use signed-in user's token (not enabled yet).
---
.../ViewModels/MainWindowViewModel.cs | 143 +++++++++++++++++-
1 file changed, 139 insertions(+), 4 deletions(-)
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index 25c009c..8581c32 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -21,6 +21,7 @@
using System.Windows;
using System.Windows.Input;
using Microsoft.Identity.Client;
+ using Microsoft.Azure.Storage.Auth;
public class MainWindowViewModel : ViewModelBase
{
@@ -207,7 +208,7 @@ public MainWindowViewModel(IDialogService dialogService)
{
// Auth init -------------------------------------------------------------------
SignInButtonVisible = true;
- DisplayMessage = "Please sign in to continue";
+ DisplayMessage = "Please sign in.";
SignedInUserName = "";
PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
.WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs)
@@ -336,11 +337,11 @@ public void DisplayBasicTokenInfo()
{
if (AuthResult != null)
{
- DisplayMessage = $"User Name: {AuthResult.Account.Username}" + Environment.NewLine + $"Token Expires: {AuthResult.ExpiresOn.ToLocalTime()}";
+ DisplayMessage = $"User Name: {AuthResult.Account.Username}" + Environment.NewLine + $"Token Expires: {AuthResult.ExpiresOn.ToLocalTime()}" + Environment.NewLine;
}
else
{
- DisplayMessage = "You have been signed out. Please sign in to continue";
+ DisplayMessage = "You have been signed out.";
}
}
@@ -397,11 +398,145 @@ private async void CopyFilesToLocalCache(string[] files, string location, string
string[] subFolders = Directory.GetDirectories(cacheLocation);
+ //await CreateStorageContainer();
foreach (string folder in subFolders)
{
await InitiateAzCopy(folder, cacheLocation);
+ //await CreateStorageBlobs(folder, cacheLocation);
+ }
+ }
+
+ private async Task CreateStorageContainer()
+ {
+ if (AuthResult == null)
+ {
+ await Authorize();
+ }
+
+ if (AuthResult == null)
+ {
+ return;
+ }
+
+ int retryLimit = 3; // ToDo: ConfigurationManager.AppSettings["RetryLimit"].ToString()
+ int retrySeconds = 30; // ToDo: ConfigurationManager.AppSettings["RetrySeconds"].ToString()
+ string storageAccountName = "onpremisesdiag435"; // ToDo: ConfigurationManager.AppSettings["StorageAccountName"].ToString()
+ string storageContainerName = "container"; // ToDo: ConfigurationManager.AppSettings["StorageContainerName"].ToString()
+
+ TokenCredential tokenCredential = new TokenCredential(AuthResult.AccessToken);
+ StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);
+
+ CloudBlobContainer container = new CloudBlobContainer(
+ new Uri($"https://{storageAccountName}.blob.core.windows.net/{storageContainerName}"),
+ storageCredentials);
+
+ DisplayMessage = $"Creating storage container {container.Uri.ToString()}" + Environment.NewLine;
+
+ int createContainerOK = 0;
+ while (createContainerOK < retryLimit)
+ {
+ try
+ {
+ container.CreateIfNotExists();
+ createContainerOK = retryLimit + 1;
+ }
+ catch
+ {
+ createContainerOK++;
+ DisplayMessage += $"...Rety {createContainerOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine;
+ //System.Threading.Thread.Sleep(retrySeconds * 1000); // ToDo: Need to create timer, this will lock UI.
+ }
+
+ if (createContainerOK == retryLimit)
+ {
+ DisplayMessage += $"Error creating container, check that you have the correct permissions for this storage account." + Environment.NewLine;
+ }
+ }
+ }
+
+ private async Task CreateStorageBlobs(string sourceDirectory, string cacheDirectory)
+ {
+ if (AuthResult == null)
+ {
+ return;
+ }
+
+ int retryLimit = 3; // ToDo: ConfigurationManager.AppSettings["RetryLimit"].ToString()
+ int retrySeconds = 30; // ToDo: ConfigurationManager.AppSettings["RetrySeconds"].ToString()
+ string storageAccountName = "onpremisesdiag435"; // ToDo: ConfigurationManager.AppSettings["StorageAccountName"].ToString()
+ string storageContainerName = "container"; // ToDo: ConfigurationManager.AppSettings["StorageContainerName"].ToString()
+
+ TokenCredential tokenCredential = new TokenCredential(AuthResult.AccessToken);
+ StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);
+
+ string sourceDirName = new DirectoryInfo(sourceDirectory).Name;
+
+ foreach (string dir in Directory.GetDirectories(sourceDirectory))
+ {
+ string dirName = new DirectoryInfo(dir).Name;
+ DisplayMessage += $"Uploading {dir}" + Environment.NewLine;
+
+ int uploadDirectoryOK = 0;
+ foreach (string file in Directory.GetFiles(dir))
+ {
+ string fileName = new FileInfo(file).Name;
+
+ CloudBlockBlob blob = new CloudBlockBlob(
+ new Uri($"https://{storageAccountName}.blob.core.windows.net/{storageContainerName}/{sourceDirName}/{dirName}/{fileName}"),
+ storageCredentials);
+
+ DisplayMessage += $"Creating storage blob {blob.Uri.ToString()}" + Environment.NewLine;
+
+ int createBlobOK = 0;
+ while (createBlobOK < retryLimit)
+ {
+ try
+ {
+ await blob.UploadFromFileAsync(file);
+ createBlobOK = retryLimit + 1;
+ File.Delete(file);
+ }
+ catch
+ {
+ createBlobOK++;
+ DisplayMessage += $"...Rety {createBlobOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine;
+ //System.Threading.Thread.Sleep(retrySeconds * 1000); // not sure if this good / bad / ugly.
+ }
+
+ if (createBlobOK == retryLimit)
+ {
+ DisplayMessage += $"Error creating blob, check that you have the correct permissions for this storage account." + Environment.NewLine;
+ }
+ }
+
+ if (createBlobOK != retryLimit + 1)
+ {
+ uploadDirectoryOK++;
+ }
+
+ if (uploadDirectoryOK == retryLimit)
+ {
+ DisplayMessage += $"Failed upload, too many consecutive errors." + Environment.NewLine;
+ break;
+ }
+ }
+
+ if (Directory.GetFiles(dir).Length == 0)
+ {
+ DisplayMessage += "Upload successful.";
+ Directory.Delete(dir, true);
+ }
+ }
+
+ if (Directory.GetDirectories(sourceDirectory).Length == 0)
+ {
+ Directory.Delete(sourceDirectory, true);
+ }
+
+ if (Directory.GetDirectories(cacheDirectory).Length == 0)
+ {
+ Directory.Delete(cacheDirectory, true);
}
-
}
private async Task InitiateAzCopy(string sourceDir, string parentDir)
From 3f861fc8abe87ff0bb5ba43f20ef566bde55615b Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 18:43:38 +1000
Subject: [PATCH 07/10] Finished basic retry logic for upload.
---
app/HealthyHabitat/ViewModels/MainWindowViewModel.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index 8581c32..fc3dc9d 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -443,8 +443,8 @@ private async Task CreateStorageContainer()
catch
{
createContainerOK++;
- DisplayMessage += $"...Rety {createContainerOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine;
- //System.Threading.Thread.Sleep(retrySeconds * 1000); // ToDo: Need to create timer, this will lock UI.
+ DisplayMessage += $"...Retry {createContainerOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine;
+ await Task.Delay(retrySeconds * 1000);
}
if (createContainerOK == retryLimit)
@@ -499,8 +499,8 @@ private async Task CreateStorageBlobs(string sourceDirectory, string cacheDirect
catch
{
createBlobOK++;
- DisplayMessage += $"...Rety {createBlobOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine;
- //System.Threading.Thread.Sleep(retrySeconds * 1000); // not sure if this good / bad / ugly.
+ DisplayMessage += $"...Retry {createBlobOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine;
+ await Task.Delay(retrySeconds * 1000);
}
if (createBlobOK == retryLimit)
From 4f82f74f9e0006d4bdc0017cbb8199aa755072dd Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 18:55:01 +1000
Subject: [PATCH 08/10] Handle 'null' SelectedLocation.
---
app/HealthyHabitat/ViewModels/MainWindowViewModel.cs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index fc3dc9d..b1483df 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -233,6 +233,11 @@ public MainWindowViewModel(IDialogService dialogService)
UploadClickCommand = new RelayCommand(() =>
{
+ if (this.SelectedLocation == null)
+ {
+ return;
+ }
+
LocationDialogVisible = false;
ProgressVisible = true;
From 37c0af93e83c7e6839dc6502019e8c56f6c88f0f Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 19:32:56 +1000
Subject: [PATCH 09/10] Moved hardcoded value to appsettings.
---
app/HealthyHabitat/App.config | 4 ++++
.../ViewModels/MainWindowViewModel.cs | 20 +++++++++----------
2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/app/HealthyHabitat/App.config b/app/HealthyHabitat/App.config
index 99f37dd..679641c 100644
--- a/app/HealthyHabitat/App.config
+++ b/app/HealthyHabitat/App.config
@@ -14,9 +14,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index b1483df..c81c1a0 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -196,8 +196,8 @@ public string DisplayMessage
}
// Auth definitions -------------------------------------------------------------------
- private readonly string ClientId = "18dd432c-1e9e-4da7-93f6-f7d60e3ea712"; // ToDo: ConfigurationManager.AppSettings["ClientID"].ToString()
- private readonly string ClientScopes = "user.read https://storage.azure.com/user_impersonation"; // ToDo: ConfigurationManager.AppSettings["ClientScopes"].ToString()
+ private readonly string ClientId = ConfigurationManager.AppSettings["ApplicationId"].ToString();
+ private readonly string ClientScopes = ConfigurationManager.AppSettings["ClientScopes"].ToString();
private IPublicClientApplication PublicClientApp { get; set; }
private AuthenticationResult AuthResult { get; set; }
@@ -423,10 +423,10 @@ private async Task CreateStorageContainer()
return;
}
- int retryLimit = 3; // ToDo: ConfigurationManager.AppSettings["RetryLimit"].ToString()
- int retrySeconds = 30; // ToDo: ConfigurationManager.AppSettings["RetrySeconds"].ToString()
- string storageAccountName = "onpremisesdiag435"; // ToDo: ConfigurationManager.AppSettings["StorageAccountName"].ToString()
- string storageContainerName = "container"; // ToDo: ConfigurationManager.AppSettings["StorageContainerName"].ToString()
+ int retryLimit = System.Convert.ToInt32(ConfigurationManager.AppSettings["RetryLimit"].ToString());
+ int retrySeconds = System.Convert.ToInt32(ConfigurationManager.AppSettings["RetrySeconds"].ToString());
+ string storageAccountName = ConfigurationManager.AppSettings["StorageAccountName"].ToString();
+ string storageContainerName = ConfigurationManager.AppSettings["ContainerName"].ToString();
TokenCredential tokenCredential = new TokenCredential(AuthResult.AccessToken);
StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);
@@ -466,10 +466,10 @@ private async Task CreateStorageBlobs(string sourceDirectory, string cacheDirect
return;
}
- int retryLimit = 3; // ToDo: ConfigurationManager.AppSettings["RetryLimit"].ToString()
- int retrySeconds = 30; // ToDo: ConfigurationManager.AppSettings["RetrySeconds"].ToString()
- string storageAccountName = "onpremisesdiag435"; // ToDo: ConfigurationManager.AppSettings["StorageAccountName"].ToString()
- string storageContainerName = "container"; // ToDo: ConfigurationManager.AppSettings["StorageContainerName"].ToString()
+ int retryLimit = System.Convert.ToInt32(ConfigurationManager.AppSettings["RetryLimit"].ToString());
+ int retrySeconds = System.Convert.ToInt32(ConfigurationManager.AppSettings["RetrySeconds"].ToString());
+ string storageAccountName = ConfigurationManager.AppSettings["StorageAccountName"].ToString();
+ string storageContainerName = ConfigurationManager.AppSettings["ContainerName"].ToString();
TokenCredential tokenCredential = new TokenCredential(AuthResult.AccessToken);
StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);
From b8721497b2af3033b38a6470aa021a77beff662c Mon Sep 17 00:00:00 2001
From: "Alex.Gonzalez" <>
Date: Wed, 2 Oct 2019 19:35:06 +1000
Subject: [PATCH 10/10] Enabled CreateStorageContainer and CreateStorageBlobs
for authenticated uploads.
---
app/HealthyHabitat/ViewModels/MainWindowViewModel.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
index c81c1a0..44aa1af 100644
--- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
+++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs
@@ -403,11 +403,11 @@ private async void CopyFilesToLocalCache(string[] files, string location, string
string[] subFolders = Directory.GetDirectories(cacheLocation);
- //await CreateStorageContainer();
+ await CreateStorageContainer();
foreach (string folder in subFolders)
{
- await InitiateAzCopy(folder, cacheLocation);
- //await CreateStorageBlobs(folder, cacheLocation);
+ //await InitiateAzCopy(folder, cacheLocation);
+ await CreateStorageBlobs(folder, cacheLocation);
}
}