589 lines
22 KiB
C#
589 lines
22 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
using System.Windows.Documents;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using System.Windows.Media.Imaging;
|
|
using System.Windows.Shapes;
|
|
|
|
using C4IT.Logging;
|
|
using static C4IT.Logging.cLogManager;
|
|
using C4IT.MultiLanguage;
|
|
using C4IT.FASD.Base;
|
|
|
|
using FasdDesktopUi.Basics.Models;
|
|
using C4IT.FASD.Cockpit.Communication;
|
|
using FasdDesktopUi.Basics;
|
|
using FasdDesktopUi.Pages.M42AuthenticationPage;
|
|
using FasdDesktopUi.Pages.DetailsPage;
|
|
using System.ComponentModel;
|
|
using System.Globalization;
|
|
using System.Diagnostics.Eventing.Reader;
|
|
|
|
namespace FasdDesktopUi.Pages.SettingsPage
|
|
{
|
|
public partial class M42SettingsPageView : SettingsPageBase
|
|
{
|
|
private static M42SettingsPageView _Instance = null;
|
|
|
|
public static M42SettingsPageView Instance
|
|
{
|
|
get
|
|
{
|
|
return _Instance ?? (_Instance = new M42SettingsPageView());
|
|
}
|
|
}
|
|
|
|
private double borderWidth = double.MaxValue;
|
|
|
|
private enumM42AuthenticationMethod authenticationMethod;
|
|
|
|
private enumM42AuthenticationControl authenticationControl;
|
|
|
|
private bool formsAuthenticated = false;
|
|
|
|
private bool IsTemporaryDisabled = false;
|
|
|
|
private bool _isMethodBlurred = false;
|
|
public bool IsNotMethodBlurred
|
|
{
|
|
get { return !_isMethodBlurred; }
|
|
}
|
|
public bool IsMethodBlurred
|
|
{
|
|
get { return _isMethodBlurred; }
|
|
set
|
|
{
|
|
if (value != _isMethodBlurred)
|
|
{
|
|
_isMethodBlurred = value;
|
|
OnPropertyChanged(nameof(IsMethodBlurred));
|
|
OnPropertyChanged(nameof(IsNotMethodBlurred));
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _isMethodAuto = false;
|
|
public bool IsNotMethodAuto { get { return !_isMethodAuto; } }
|
|
public bool IsMethodAuto
|
|
{
|
|
get { return _isMethodAuto; }
|
|
set
|
|
{
|
|
if (value != _isMethodAuto)
|
|
{
|
|
_isMethodAuto = value;
|
|
OnPropertyChanged(nameof(IsMethodAuto));
|
|
OnPropertyChanged(nameof(IsNotMethodAuto));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
private M42SettingsPageView()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void M42SettingsWindows_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (e.NewValue is bool isVisible)
|
|
{
|
|
if (isVisible && !IsTemporaryDisabled)
|
|
{
|
|
App.HideAllSettingViews();
|
|
|
|
if (this.IsLoaded)
|
|
InitializeControlValues();
|
|
}
|
|
}
|
|
|
|
BlurInvoker_IsActiveChanged(sender, e);
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
#region DialogButton_Click
|
|
|
|
public void DialogButton_Click(object sender)
|
|
{
|
|
if (!(sender is FrameworkElement senderElement))
|
|
return;
|
|
|
|
if (!(senderElement.Tag is bool tagValue))
|
|
return;
|
|
|
|
if (tagValue)
|
|
{
|
|
}
|
|
|
|
Close();
|
|
|
|
if (tagValue)
|
|
{
|
|
var _h = Dispatcher.Invoke(async () =>
|
|
{
|
|
await Task.Delay(300);
|
|
|
|
var dialogResult = CustomMessageBox.CustomMessageBox.Show(cMultiLanguageSupport.GetItem("M42Settings.ChangedInfoDialog.Text"), cMultiLanguageSupport.GetItem("M42Settings.RestartDialog.Caption"), enumHealthCardStateLevel.Info, null, true);
|
|
|
|
if (dialogResult == true)
|
|
{
|
|
System.Windows.Forms.Application.Restart();
|
|
Application.Current.Shutdown();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CloseButton_Click
|
|
|
|
private void CloseButton_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
private void CloseButton_TouchDown(object sender, TouchEventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
#endregion
|
|
|
|
private async void M42SettingsWindows_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
var CM = MethodBase.GetCurrentMethod();
|
|
LogMethodBegin(CM);
|
|
try
|
|
{
|
|
// initialize the window title
|
|
var _ServerDisplayName = cCockpitConfiguration.Instance?.m42ServerConfiguration?.DisplayName;
|
|
if (!string.IsNullOrEmpty(_ServerDisplayName))
|
|
{
|
|
var _strTitle = cMultiLanguageSupport.GetItem("M42Settings.Header");
|
|
_strTitle = string.Format(_strTitle, _ServerDisplayName);
|
|
txtHeader.Text = _strTitle;
|
|
}
|
|
|
|
// get the current logon user info
|
|
var _currUserInfo = await cFasdCockpitCommunicationBase.Instance.GetAdditionalUserInfo(enumAdditionalAuthentication.M42WinLogon);
|
|
if (_currUserInfo != null)
|
|
{
|
|
var _txt = cMultiLanguageSupport.GetItem("M42Settings.LogonMethod.CurrentUserValid");
|
|
var _ci = new CultureInfo(cMultiLanguageSupport.CurrentLanguage);
|
|
var _dt = _currUserInfo.ValidUntil.ToLocalTime().ToString(_ci);
|
|
_txt = string.Format(_txt, _currUserInfo.Name, _dt);
|
|
txtCurrentUser.Text = _txt;
|
|
}
|
|
else
|
|
{
|
|
txtCurrentUser.Text = cMultiLanguageSupport.GetItem("M42Settings.LogonMethod.CurrentUserInvalid");
|
|
}
|
|
|
|
// get user name for passthrough label
|
|
string userName;
|
|
string userAccount;
|
|
lock (cFasdCockpitCommunicationBase.CockpitUserInfoLock)
|
|
{
|
|
userName = cFasdCockpitCommunicationBase.CockpitUserInfo?.Name;
|
|
userAccount = cFasdCockpitCommunicationBase.CockpitUserInfo?.AdAccount;
|
|
}
|
|
string str = null;
|
|
if (string.IsNullOrEmpty(userName))
|
|
{
|
|
if (!string.IsNullOrEmpty(userAccount))
|
|
str = userAccount;
|
|
}
|
|
else
|
|
{
|
|
if (string.IsNullOrEmpty(userAccount))
|
|
str = userName;
|
|
else
|
|
str = $"{userName}({userAccount})";
|
|
}
|
|
|
|
|
|
if (str != null)
|
|
{
|
|
var s = cMultiLanguageSupport.GetItem("M42Settings.LogonMethod.PassthoughUser");
|
|
str = string.Format(s, str);
|
|
labelPassthough.Text = str;
|
|
}
|
|
|
|
txtAuthenticationError.Visibility = Visibility.Hidden;
|
|
|
|
InitializeControlValues();
|
|
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
LogMethodEnd(CM);
|
|
}
|
|
|
|
}
|
|
|
|
private void InitializeControlValues()
|
|
{
|
|
// set the initial input control values
|
|
BasicUserName.Text = cFasdCockpitConfig.Instance?.M42Config?.BasicUser ?? "";
|
|
|
|
var _pw = PrivateSecurePassword.Instance.Decode(cFasdCockpitConfig.Instance?.M42Config.BasicPassword) ?? "";
|
|
pwBoxPasswordBasicShow.Password = _pw;
|
|
|
|
_pw = PrivateSecurePassword.Instance.Decode(cFasdCockpitConfig.Instance?.M42Config.ApiToken) ?? "";
|
|
pwBoxPasswordTokenShow.Password = _pw;
|
|
|
|
txtBoxPasswordBasicShow.Text = pwBoxPasswordBasicShow?.Password;
|
|
txtBoxPasswordTokenShow.Text = pwBoxPasswordTokenShow?.Password;
|
|
|
|
// set the initial radio button values
|
|
switch (cFasdCockpitConfig.Instance?.M42Config?.Control)
|
|
{
|
|
case enumM42AuthenticationControl.always:
|
|
radioButtonLogonActiveYes.IsChecked = true;
|
|
break;
|
|
case enumM42AuthenticationControl.never:
|
|
radioButtonLogonActiveNo.IsChecked = true;
|
|
break;
|
|
default:
|
|
radioButtonLogonActiveAuto.IsChecked = true;
|
|
break;
|
|
}
|
|
|
|
authenticationMethod = cFasdCockpitConfig.Instance?.M42Config?.Method ?? enumM42AuthenticationMethod.passthrough;
|
|
switch (cFasdCockpitConfig.Instance?.M42Config?.Method)
|
|
{
|
|
case enumM42AuthenticationMethod.basic:
|
|
radioButtonLogonMethodBasic.IsChecked = true;
|
|
break;
|
|
case enumM42AuthenticationMethod.token:
|
|
radioButtonLogonMethodToken.IsChecked = true;
|
|
break;
|
|
case enumM42AuthenticationMethod.forms:
|
|
radioButtonLogonMethodForms.IsChecked = true;
|
|
break;
|
|
default:
|
|
radioButtonLogonMethodPassthrough.IsChecked = true;
|
|
break;
|
|
}
|
|
LogonActiveChanged();
|
|
}
|
|
|
|
private void logonMethodChanged()
|
|
{
|
|
if (radioButtonLogonMethodBasic.IsChecked == true)
|
|
{
|
|
authenticationMethod = enumM42AuthenticationMethod.basic;
|
|
additionalBlockLogonMethodBasic.Visibility = Visibility.Visible;
|
|
additionalBlockLogonMethodToken.Visibility = Visibility.Collapsed;
|
|
additionalBlockLogonMethodForms.Visibility = Visibility.Collapsed;
|
|
}
|
|
else if (radioButtonLogonMethodToken.IsChecked == true)
|
|
{
|
|
authenticationMethod = enumM42AuthenticationMethod.token;
|
|
additionalBlockLogonMethodBasic.Visibility = Visibility.Collapsed;
|
|
additionalBlockLogonMethodToken.Visibility = Visibility.Visible;
|
|
additionalBlockLogonMethodForms.Visibility = Visibility.Collapsed;
|
|
}
|
|
else if (radioButtonLogonMethodForms.IsChecked == true)
|
|
{
|
|
authenticationMethod = enumM42AuthenticationMethod.forms;
|
|
additionalBlockLogonMethodBasic.Visibility = Visibility.Collapsed;
|
|
additionalBlockLogonMethodToken.Visibility = Visibility.Collapsed;
|
|
additionalBlockLogonMethodForms.Visibility = Visibility.Visible;
|
|
}
|
|
else
|
|
{
|
|
authenticationMethod = enumM42AuthenticationMethod.passthrough;
|
|
additionalBlockLogonMethodBasic.Visibility = Visibility.Collapsed;
|
|
additionalBlockLogonMethodToken.Visibility = Visibility.Collapsed;
|
|
additionalBlockLogonMethodForms.Visibility = Visibility.Collapsed;
|
|
}
|
|
}
|
|
|
|
private void radioButtonLogonMethod_Checked(object sender, RoutedEventArgs e)
|
|
{
|
|
logonMethodChanged();
|
|
}
|
|
|
|
private void LogonActiveChanged()
|
|
{
|
|
if (radioButtonLogonActiveNo.IsChecked == true)
|
|
{
|
|
authenticationControl = enumM42AuthenticationControl.never;
|
|
IsMethodBlurred = true;
|
|
IsMethodAuto = false;
|
|
}
|
|
else if (radioButtonLogonActiveYes.IsChecked == true)
|
|
{
|
|
authenticationControl = enumM42AuthenticationControl.always;
|
|
IsMethodBlurred = false;
|
|
IsMethodAuto = false;
|
|
}
|
|
else
|
|
{
|
|
authenticationControl = enumM42AuthenticationControl.auto;
|
|
IsMethodBlurred = false;
|
|
IsMethodAuto = true;
|
|
radioButtonLogonMethodPassthrough.IsChecked = true;
|
|
}
|
|
|
|
}
|
|
|
|
private void radioButtonLogonActive_Checked(object sender, RoutedEventArgs e)
|
|
{
|
|
LogonActiveChanged();
|
|
}
|
|
|
|
private void borderLogon_SizeChanged(object sender, SizeChangedEventArgs e)
|
|
{
|
|
var _w = e.NewSize.Width;
|
|
if (_w < borderWidth)
|
|
{
|
|
borderWidth = _w;
|
|
additionalBlockLogonMethodBasic.MaxWidth = _w;
|
|
additionalBlockLogonMethodForms.MaxWidth = _w;
|
|
additionalBlockLogonMethodToken.MaxWidth = _w;
|
|
}
|
|
}
|
|
|
|
private void pwBoxPasswordBasicShow_PasswordChanged(object sender, RoutedEventArgs e)
|
|
{
|
|
if (txtBoxPasswordBasicShow != null && txtBoxPasswordBasicShow.Visibility != Visibility.Visible)
|
|
txtBoxPasswordBasicShow.Text = pwBoxPasswordBasicShow?.Password;
|
|
}
|
|
|
|
private void txtBoxPasswordBasicShow_TextChanged(object sender, TextChangedEventArgs e)
|
|
{
|
|
if (pwBoxPasswordBasicShow != null && pwBoxPasswordBasicShow.Visibility != Visibility.Visible)
|
|
pwBoxPasswordBasicShow.Password = txtBoxPasswordBasicShow?.Text;
|
|
}
|
|
|
|
private void pwBoxPasswordTokenShow_PasswordChanged(object sender, RoutedEventArgs e)
|
|
{
|
|
if (txtBoxPasswordTokenShow != null && txtBoxPasswordTokenShow.Visibility != Visibility.Visible)
|
|
txtBoxPasswordTokenShow.Text = pwBoxPasswordTokenShow?.Password;
|
|
}
|
|
|
|
private void pwBoxPasswordTokenHide_TextChanged(object sender, TextChangedEventArgs e)
|
|
{
|
|
if (pwBoxPasswordTokenShow != null && pwBoxPasswordTokenShow.Visibility != Visibility.Visible)
|
|
pwBoxPasswordTokenShow.Password = txtBoxPasswordBasicShow?.Text;
|
|
}
|
|
|
|
private void iconPasswordShow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (!(sender is FrameworkElement _fr))
|
|
return;
|
|
|
|
switch (_fr.Tag.ToString())
|
|
{
|
|
case "PwBasicOn":
|
|
iconPasswordBasicHide.Visibility = Visibility.Visible;
|
|
iconPasswordBasicShow.Visibility = Visibility.Collapsed;
|
|
txtBoxPasswordBasicShow.Visibility = Visibility.Visible;
|
|
pwBoxPasswordBasicShow.Visibility = Visibility.Collapsed;
|
|
return;
|
|
case "PwBasicOff":
|
|
iconPasswordBasicShow.Visibility = Visibility.Visible;
|
|
iconPasswordBasicHide.Visibility = Visibility.Collapsed;
|
|
pwBoxPasswordBasicShow.Visibility = Visibility.Visible;
|
|
txtBoxPasswordBasicShow.Visibility = Visibility.Collapsed;
|
|
return;
|
|
case "TokenOn":
|
|
iconTokenHide.Visibility = Visibility.Visible;
|
|
iconTokenShow.Visibility = Visibility.Collapsed;
|
|
txtBoxPasswordTokenShow.Visibility = Visibility.Visible;
|
|
pwBoxPasswordTokenShow.Visibility = Visibility.Collapsed;
|
|
return;
|
|
case "TokenOff":
|
|
iconTokenShow.Visibility = Visibility.Visible;
|
|
iconTokenHide.Visibility = Visibility.Collapsed;
|
|
pwBoxPasswordTokenShow.Visibility = Visibility.Visible;
|
|
txtBoxPasswordTokenShow.Visibility = Visibility.Collapsed;
|
|
return;
|
|
}
|
|
}
|
|
|
|
private void ConfirmButton_MouseDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
ConfirmButton_Click(sender);
|
|
}
|
|
|
|
private void ConfirmButton_TouchDown(object sender, TouchEventArgs e)
|
|
{
|
|
ConfirmButton_Click(sender);
|
|
}
|
|
|
|
private async void ConfirmButton_Click(object sender)
|
|
{
|
|
var CM = MethodBase.GetCurrentMethod();
|
|
LogMethodBegin(CM);
|
|
try
|
|
{
|
|
this.IsEnabled = false;
|
|
Mouse.OverrideCursor = Cursors.Wait;
|
|
|
|
cFasdCockpitConfig.Instance.M42Config.Control = authenticationControl;
|
|
cFasdCockpitConfig.Instance.Save("M42Config\\Control");
|
|
|
|
if (authenticationControl == enumM42AuthenticationControl.never)
|
|
{
|
|
Close();
|
|
return;
|
|
}
|
|
|
|
bool isAuthenticated = false;
|
|
cF4sdCockpitM42BearerTokenInfo TokenInfo = null;
|
|
bool HasChanged = false;
|
|
HasChanged |= authenticationMethod != cFasdCockpitConfig.Instance.M42Config.Method;
|
|
switch (authenticationMethod)
|
|
{
|
|
case enumM42AuthenticationMethod.passthrough:
|
|
TokenInfo = await cFasdCockpitCommunicationBase.Instance.M42.ValidateLogonPassthrough();
|
|
if (TokenInfo?.Token != null)
|
|
isAuthenticated = true;
|
|
break;
|
|
case enumM42AuthenticationMethod.basic:
|
|
var _user = BasicUserName.Text;
|
|
var _pw = pwBoxPasswordBasicShow.Password;
|
|
HasChanged |= _user != cFasdCockpitConfig.Instance.M42Config.BasicUser;
|
|
HasChanged |= PrivateSecurePassword.Instance.Decode(cFasdCockpitConfig.Instance.M42Config.BasicPassword) != _pw;
|
|
TokenInfo = await cFasdCockpitCommunicationBase.Instance.M42.ValidateLogonBasic(_user, _pw);
|
|
if (TokenInfo?.Token != null)
|
|
{
|
|
isAuthenticated = true;
|
|
if (HasChanged)
|
|
{
|
|
cFasdCockpitConfig.Instance.M42Config.BasicUser = _user;
|
|
cFasdCockpitConfig.Instance.M42Config.BasicPassword = PrivateSecurePassword.Instance.Encode(_pw);
|
|
cFasdCockpitConfig.Instance.Save("M42Config\\BasicUser");
|
|
cFasdCockpitConfig.Instance.Save("M42Config\\BasicPassword");
|
|
}
|
|
}
|
|
break;
|
|
case enumM42AuthenticationMethod.token:
|
|
var _token = pwBoxPasswordTokenShow.Password;
|
|
HasChanged |= PrivateSecurePassword.Instance.Decode(cFasdCockpitConfig.Instance.M42Config.ApiToken) != _token;
|
|
TokenInfo = await cFasdCockpitCommunicationBase.Instance.M42.ValidateLogonToken(_token);
|
|
if (TokenInfo?.Token != null)
|
|
{
|
|
isAuthenticated = true;
|
|
if (HasChanged)
|
|
{
|
|
cFasdCockpitConfig.Instance.M42Config.ApiToken = PrivateSecurePassword.Instance.Encode(_token);
|
|
cFasdCockpitConfig.Instance.Save("M42Config\\ApiToken");
|
|
}
|
|
}
|
|
break;
|
|
case enumM42AuthenticationMethod.forms:
|
|
if (formsAuthenticated)
|
|
isAuthenticated = true;
|
|
break;
|
|
}
|
|
|
|
if (isAuthenticated)
|
|
{
|
|
cFasdCockpitConfig.Instance.M42Config.Method = authenticationMethod;
|
|
cFasdCockpitConfig.Instance.Save("M42Config\\Method");
|
|
|
|
txtAuthenticationError.Visibility = Visibility.Hidden;
|
|
if (HasChanged)
|
|
{
|
|
var _tsk = Dispatcher.Invoke(async () =>
|
|
{
|
|
await Task.Delay(100);
|
|
|
|
var dialogResult = CustomMessageBox.CustomMessageBox.Show(cMultiLanguageSupport.GetItem("M42Settings.ChangedInfoDialog.Text"), cMultiLanguageSupport.GetItem("M42Settings.RestartDialog.Caption"), enumHealthCardStateLevel.Info, null, true);
|
|
|
|
if (dialogResult == true)
|
|
{
|
|
System.Windows.Forms.Application.Restart();
|
|
Application.Current.Shutdown();
|
|
}
|
|
});
|
|
}
|
|
|
|
Close();
|
|
}
|
|
else
|
|
{
|
|
txtAuthenticationError.Visibility = Visibility.Visible;
|
|
}
|
|
|
|
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
Mouse.OverrideCursor = null; ;
|
|
this.IsEnabled = true;
|
|
LogMethodEnd(CM);
|
|
}
|
|
|
|
}
|
|
|
|
private void DoFormsAuthentication_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
var CM = MethodBase.GetCurrentMethod();
|
|
LogMethodBegin(CM);
|
|
try
|
|
{
|
|
if (cFasdCockpitCommunicationBase.CockpitUserInfo == null)
|
|
return;
|
|
|
|
IsTemporaryDisabled = true;
|
|
this.IsEnabled = false;
|
|
|
|
var logonPage = new F4sdM42FormsAuthentication(Reauthenticate: false);
|
|
var _ret = logonPage.ShowDialog();
|
|
logonPage = null;
|
|
|
|
if (_ret == true)
|
|
{
|
|
formsAuthenticated = true;
|
|
txtAuthenticationError.Visibility = Visibility.Hidden;
|
|
}
|
|
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
this.IsEnabled = true;
|
|
IsTemporaryDisabled = false;
|
|
LogMethodEnd(CM);
|
|
}
|
|
}
|
|
|
|
private void M42SettingsWindows_Closed(object sender, EventArgs e)
|
|
{
|
|
_Instance = null;
|
|
}
|
|
|
|
}
|
|
}
|