@@ -14,119 +14,120 @@ using Wino.Messaging.Client.Mails;
|
||||
using Wino.Messaging.Server;
|
||||
|
||||
|
||||
namespace Wino.Views.ImapSetup;
|
||||
|
||||
public sealed partial class TestingImapConnectionPage : Page
|
||||
namespace Wino.Views.ImapSetup
|
||||
{
|
||||
private IWinoServerConnectionManager _winoServerConnectionManager = App.Current.Services.GetService<IWinoServerConnectionManager>();
|
||||
private AutoDiscoverySettings autoDiscoverySettings;
|
||||
private CustomServerInformation serverInformationToTest;
|
||||
|
||||
public TestingImapConnectionPage()
|
||||
public sealed partial class TestingImapConnectionPage : Page
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
private IWinoServerConnectionManager _winoServerConnectionManager = App.Current.Services.GetService<IWinoServerConnectionManager>();
|
||||
private AutoDiscoverySettings autoDiscoverySettings;
|
||||
private CustomServerInformation serverInformationToTest;
|
||||
|
||||
protected override async void OnNavigatedTo(NavigationEventArgs e)
|
||||
{
|
||||
base.OnNavigatedTo(e);
|
||||
|
||||
// We can only go back to this page from failed connection page.
|
||||
// We must go back once again in that case to actual setup dialog.
|
||||
if (e.NavigationMode == NavigationMode.Back)
|
||||
public TestingImapConnectionPage()
|
||||
{
|
||||
WeakReferenceMessenger.Default.Send(new ImapSetupBackNavigationRequested());
|
||||
InitializeComponent();
|
||||
}
|
||||
else
|
||||
|
||||
protected override async void OnNavigatedTo(NavigationEventArgs e)
|
||||
{
|
||||
// Test connection
|
||||
base.OnNavigatedTo(e);
|
||||
|
||||
// Discovery settings are passed.
|
||||
// Create server information out of the discovery settings.
|
||||
if (e.Parameter is AutoDiscoverySettings parameterAutoDiscoverySettings)
|
||||
// We can only go back to this page from failed connection page.
|
||||
// We must go back once again in that case to actual setup dialog.
|
||||
if (e.NavigationMode == NavigationMode.Back)
|
||||
{
|
||||
autoDiscoverySettings = parameterAutoDiscoverySettings;
|
||||
serverInformationToTest = autoDiscoverySettings.ToServerInformation();
|
||||
}
|
||||
else if (e.Parameter is CustomServerInformation customServerInformation)
|
||||
{
|
||||
// Only server information is passed.
|
||||
serverInformationToTest = customServerInformation;
|
||||
}
|
||||
|
||||
// Make sure that certificate dialog must be present in case of SSL handshake fails.
|
||||
await PerformTestAsync(allowSSLHandshake: false);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task PerformTestAsync(bool allowSSLHandshake)
|
||||
{
|
||||
CertificateDialog.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
|
||||
TestingConnectionPanel.Visibility = Windows.UI.Xaml.Visibility.Visible;
|
||||
|
||||
await Task.Delay(1000);
|
||||
|
||||
var testResultResponse = await _winoServerConnectionManager
|
||||
.GetResponseAsync<ImapConnectivityTestResults, ImapConnectivityTestRequested>(new ImapConnectivityTestRequested(serverInformationToTest, allowSSLHandshake));
|
||||
|
||||
if (!testResultResponse.IsSuccess)
|
||||
{
|
||||
// Wino Server is connection is failed.
|
||||
ReturnWithError(testResultResponse.Message);
|
||||
}
|
||||
else
|
||||
{
|
||||
var testResultData = testResultResponse.Data;
|
||||
|
||||
if (testResultData.IsSuccess)
|
||||
{
|
||||
// All success. Finish setup with validated server information.
|
||||
ReturnWithSuccess();
|
||||
WeakReferenceMessenger.Default.Send(new ImapSetupBackNavigationRequested());
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check if certificate UI is required.
|
||||
// Test connection
|
||||
|
||||
if (testResultData.IsCertificateUIRequired)
|
||||
// Discovery settings are passed.
|
||||
// Create server information out of the discovery settings.
|
||||
if (e.Parameter is AutoDiscoverySettings parameterAutoDiscoverySettings)
|
||||
{
|
||||
// Certificate UI is required. Show certificate dialog.
|
||||
autoDiscoverySettings = parameterAutoDiscoverySettings;
|
||||
serverInformationToTest = autoDiscoverySettings.ToServerInformation();
|
||||
}
|
||||
else if (e.Parameter is CustomServerInformation customServerInformation)
|
||||
{
|
||||
// Only server information is passed.
|
||||
serverInformationToTest = customServerInformation;
|
||||
}
|
||||
|
||||
CertIssuer.Text = testResultData.CertificateIssuer;
|
||||
CertValidFrom.Text = testResultData.CertificateValidFromDateString;
|
||||
CertValidTo.Text = testResultData.CertificateExpirationDateString;
|
||||
// Make sure that certificate dialog must be present in case of SSL handshake fails.
|
||||
await PerformTestAsync(allowSSLHandshake: false);
|
||||
}
|
||||
}
|
||||
|
||||
TestingConnectionPanel.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
|
||||
CertificateDialog.Visibility = Windows.UI.Xaml.Visibility.Visible;
|
||||
private async Task PerformTestAsync(bool allowSSLHandshake)
|
||||
{
|
||||
CertificateDialog.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
|
||||
TestingConnectionPanel.Visibility = Windows.UI.Xaml.Visibility.Visible;
|
||||
|
||||
await Task.Delay(1000);
|
||||
|
||||
var testResultResponse = await _winoServerConnectionManager
|
||||
.GetResponseAsync<ImapConnectivityTestResults, ImapConnectivityTestRequested>(new ImapConnectivityTestRequested(serverInformationToTest, allowSSLHandshake));
|
||||
|
||||
if (!testResultResponse.IsSuccess)
|
||||
{
|
||||
// Wino Server is connection is failed.
|
||||
ReturnWithError(testResultResponse.Message);
|
||||
}
|
||||
else
|
||||
{
|
||||
var testResultData = testResultResponse.Data;
|
||||
|
||||
if (testResultData.IsSuccess)
|
||||
{
|
||||
// All success. Finish setup with validated server information.
|
||||
ReturnWithSuccess();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Connection test failed. Show error dialog.
|
||||
// Check if certificate UI is required.
|
||||
|
||||
var protocolLog = testResultData.FailureProtocolLog;
|
||||
if (testResultData.IsCertificateUIRequired)
|
||||
{
|
||||
// Certificate UI is required. Show certificate dialog.
|
||||
|
||||
ReturnWithError(testResultData.FailedReason, protocolLog);
|
||||
CertIssuer.Text = testResultData.CertificateIssuer;
|
||||
CertValidFrom.Text = testResultData.CertificateValidFromDateString;
|
||||
CertValidTo.Text = testResultData.CertificateExpirationDateString;
|
||||
|
||||
TestingConnectionPanel.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
|
||||
CertificateDialog.Visibility = Windows.UI.Xaml.Visibility.Visible;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Connection test failed. Show error dialog.
|
||||
|
||||
var protocolLog = testResultData.FailureProtocolLog;
|
||||
|
||||
ReturnWithError(testResultData.FailedReason, protocolLog);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ReturnWithError(string error, string protocolLog = "")
|
||||
{
|
||||
var failurePackage = new ImapConnectionFailedPackage(error, protocolLog, autoDiscoverySettings);
|
||||
WeakReferenceMessenger.Default.Send(new ImapSetupBackNavigationRequested(typeof(ImapConnectionFailedPage), failurePackage));
|
||||
}
|
||||
private void ReturnWithError(string error, string protocolLog = "")
|
||||
{
|
||||
var failurePackage = new ImapConnectionFailedPackage(error, protocolLog, autoDiscoverySettings);
|
||||
WeakReferenceMessenger.Default.Send(new ImapSetupBackNavigationRequested(typeof(ImapConnectionFailedPage), failurePackage));
|
||||
}
|
||||
|
||||
private void ReturnWithSuccess()
|
||||
=> WeakReferenceMessenger.Default.Send(new ImapSetupDismissRequested(serverInformationToTest));
|
||||
private void ReturnWithSuccess()
|
||||
=> WeakReferenceMessenger.Default.Send(new ImapSetupDismissRequested(serverInformationToTest));
|
||||
|
||||
private void DenyClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e)
|
||||
=> ReturnWithError(Translator.IMAPSetupDialog_CertificateDenied, string.Empty);
|
||||
private void DenyClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e)
|
||||
=> ReturnWithError(Translator.IMAPSetupDialog_CertificateDenied, string.Empty);
|
||||
|
||||
private async void AllowClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e)
|
||||
{
|
||||
// Run the test again, but this time allow SSL handshake.
|
||||
// Any authentication error will be shown to the user after this test.
|
||||
private async void AllowClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e)
|
||||
{
|
||||
// Run the test again, but this time allow SSL handshake.
|
||||
// Any authentication error will be shown to the user after this test.
|
||||
|
||||
await PerformTestAsync(allowSSLHandshake: true);
|
||||
await PerformTestAsync(allowSSLHandshake: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user