seb-win-refactoring/SafeExamBrowser.ResetUtility/Procedure/Restore.cs

163 lines
4.4 KiB
C#

/*
* Copyright (c) 2024 ETH Zürich, IT Services
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using SafeExamBrowser.Configuration.Contracts;
using SafeExamBrowser.Lockdown.Contracts;
namespace SafeExamBrowser.ResetUtility.Procedure
{
internal class Restore : ProcedureStep
{
private ProcedureStep next;
public Restore(ProcedureContext context) : base(context)
{
next = new MainMenu(Context);
}
internal override ProcedureStepResult Execute()
{
var filePath = $@"config\systemprofile\AppData\Local\{nameof(SafeExamBrowser)}\{AppConfig.BACKUP_FILE_NAME}";
var x86FilePath = Environment.ExpandEnvironmentVariables($@"%WINDIR%\system32\{filePath}");
var x64FilePath = Environment.ExpandEnvironmentVariables($@"%WINDIR%\SysWOW64\{filePath}");
InitializeConsole();
Logger.Info("Searching backup file...");
Logger.Debug($"x86 path => {x86FilePath}");
Logger.Debug($"x64 path => {x64FilePath}");
Console.WriteLine("Searching backup file...");
if (File.Exists(x86FilePath))
{
RestoreBackup(x86FilePath);
}
else if (File.Exists(x64FilePath))
{
RestoreBackup(x64FilePath);
}
else
{
HandleNoBackupFile();
}
return ProcedureStepResult.Continue;
}
internal override ProcedureStep GetNextStep()
{
return next;
}
private void RestoreBackup(string filePath)
{
var backup = Context.CreateBackup(filePath);
var configurations = backup.GetAllConfigurations();
var failed = new List<IFeatureConfiguration>();
Logger.Info($"Found backup file '{filePath}' with {configurations.Count} items. Initiating restore procedure...");
Console.WriteLine($"Found backup file with {configurations.Count} items.");
Console.WriteLine();
Console.WriteLine("Initiating restore procedure...");
foreach (var configuration in configurations)
{
var success = configuration.Restore();
if (success)
{
backup.Delete(configuration);
}
else
{
failed.Add(configuration);
}
ShowProgress(configurations.IndexOf(configuration) + 1, configurations.Count);
}
PerformUpdate();
if (failed.Any())
{
HandleFailure(failed);
}
else
{
HandleSuccess();
}
Console.WriteLine();
Console.WriteLine("Press any key to return to the main menu.");
Console.ReadKey();
}
private void PerformUpdate()
{
Console.WriteLine();
Console.WriteLine("Performing system configuration update, please wait...");
StartProgressAnimation();
Context.Update.Execute();
StopProgressAnimation();
Console.WriteLine("Update completed.");
}
private void HandleFailure(IList<IFeatureConfiguration> configurations)
{
Logger.Warn($"Failed to restore {configurations.Count} items!");
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"Failed to restore {configurations.Count} items!");
foreach (var configuration in configurations)
{
Console.WriteLine($" - {configuration.GetType().Name}");
}
Console.ForegroundColor = ForegroundColor;
Console.WriteLine();
Console.WriteLine("Some configuration values may be user specific. In order to restore these values, the user who used SEB needs to be logged in.");
}
private void HandleSuccess()
{
Logger.Info("Successfully restored all changes!");
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine("Successfully restored all changes!");
Console.ForegroundColor = ForegroundColor;
}
private void HandleNoBackupFile()
{
var yes = new MenuOption { IsSelected = true, Text = "Yes" };
var no = new MenuOption { Text = "No" };
Logger.Warn("Could not find any backup file!");
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine("Could not find any backup file!");
Console.ForegroundColor = ForegroundColor;
Console.WriteLine();
Console.WriteLine("Would you like to reset all configuration values possibly changed by SEB?");
ShowMenu(new List<MenuOption> { yes, no });
if (yes.IsSelected)
{
next = new Reset(Context);
}
Logger.Info($"The user chose {(yes.IsSelected ? "" : "not ")}to perform a reset.");
}
}
}