using Microsoft.Identity.Client.NativeInterop; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; 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 TeamsNetphoneLink; namespace TeamsNetphoneLink.WPF { /// /// Interaktionslogik für SettingsWindow.xaml /// public partial class SettingsWindow : Window { Syncronisation _sync; public SettingsWindow(Syncronisation sync) { _sync = sync; InitializeComponent(); TenantIDTextBox.Text = Settings.Default.TenantID; AppIDTextBox.Text = Settings.Default.AppID; SaveEntraCredentialsCheck.IsChecked = Settings.Default.SaveEntraCredentials; UseGraphForMeetingStateCheck.IsChecked = Settings.Default.UseGraphForMeetingState; } private void RestartApplication() { string exePath = Process.GetCurrentProcess().MainModule.FileName; var startInfo = new ProcessStartInfo { FileName = exePath, UseShellExecute = true }; Process.Start(startInfo); Application.Current.Shutdown(); } // Speichern der Einstellungen private void SaveButton_Click(object sender, RoutedEventArgs e) { string tenantId = TenantIDTextBox.Text.Replace(" ", ""); string appId = AppIDTextBox.Text.Replace(" ", ""); bool SaveEntraCredentials = SaveEntraCredentialsCheck.IsChecked.HasValue ? SaveEntraCredentialsCheck.IsChecked.Value : false; bool UseGraphForMeetingState = UseGraphForMeetingStateCheck.IsChecked.HasValue ? UseGraphForMeetingStateCheck.IsChecked.Value : false; if (SaveEntraCredentials && !ShowSecurityWarningMessage()) return; Settings.Default.TenantID = tenantId; Settings.Default.AppID = appId; Settings.Default.SaveEntraCredentials = SaveEntraCredentials; Settings.Default.UseGraphForMeetingState = UseGraphForMeetingState; Settings.Default.Save(); RestartApplication(); } // Reset der Einstellungen private void ResetButton_Click(object sender, RoutedEventArgs e) { Settings.Default.Reset(); RestartApplication(); } private void SaveEntraCredentialsCheck_Checked(object sender, RoutedEventArgs e) { //ShowSecurityWarningMessage(); } public bool ShowSecurityWarningMessage() { string message = "Die Anmeldedaten werden mit dem MSAL Cache unter Verwendung von DPAPI (Data Protection API) gespeichert. " + "DPAPI bietet eine sichere Verschlüsselung der Daten auf Benutzerebene, sodass die Anmeldedaten nur für das Benutzerkonto zugänglich sind, " + "unter dem sie gespeichert wurden.\n\n" + "Allerdings ist zu beachten, dass theoretisch jede Anwendung mit derselben App-ID auf den MSAL Cache zugreifen könnte. " + "Das liegt daran, dass der Cache anhand der App-ID identifiziert wird. Wenn eine andere Anwendung dieselbe App-ID verwendet, " + "könnte sie versuchen, auf die gespeicherten Anmeldedaten zuzugreifen.\n\n" + "Bewertung des Sicherheitsrisikos:\n" + "- In einer vertrauenswürdigen Umgebung ist das Risiko gering.\n" + "- Die App-ID sollte geheim gehalten werden, um unbefugten Zugriff zu verhindern.\n" + "- DPAPI bietet eine starke Verschlüsselung, solange das Benutzerkonto nicht kompromittiert ist.\n\n" + "Unter normalen Umständen stellt die Verwendung des MSAL Caches kein signifikantes Sicherheitsrisiko dar. " + "Es ist jedoch wichtig, die App-ID geheim zu halten und sicherzustellen, dass nur vertrauenswürdige Anwendungen dieselbe App-ID verwenden.\n\n" + "Sollen die Einstellungen gespeichert werden?.\n\n"; var result = MessageBox.Show( message, "Sicherheitshinweis zur Speicherung von Anmeldedaten", MessageBoxButton.YesNo, MessageBoxImage.Warning ); if (result == MessageBoxResult.Yes) return true; return false; } private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { ValidateInput(); } private void ValidateInput() { if (this.IsInitialized) { bool isAppIDValid = Teams.TeamsGraph.IsGuid(AppIDTextBox.Text); bool isTenantIDValid = Teams.TeamsGraph.IsGuid(TenantIDTextBox.Text); // Set border color based on validation AppIDTextBox.BorderBrush = isAppIDValid ? System.Windows.Media.Brushes.Green : System.Windows.Media.Brushes.Red; TenantIDTextBox.BorderBrush = isTenantIDValid ? System.Windows.Media.Brushes.Green : System.Windows.Media.Brushes.Red; // Enable Save button only if both fields are valid SaveButton.IsEnabled = isAppIDValid && isTenantIDValid; } } } }