Restore SEBPatch

This commit is contained in:
2025-06-01 11:56:28 +02:00
parent 8c656e3137
commit 00707825b4
1009 changed files with 5005 additions and 6502 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2024 ETH Zürich, IT Services
* Copyright (c) 2025 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
@@ -43,11 +43,12 @@ namespace SafeExamBrowser.Server
private readonly Parser parser;
private readonly Timer pingTimer;
private readonly IPowerSupply powerSupply;
private readonly Sanitizer sanitizer;
private readonly ISystemInfo systemInfo;
private readonly IUserInfo userInfo;
private readonly INetworkAdapter networkAdapter;
private ApiVersion1 api;
private Api api;
private int currentHandId;
private int currentLockScreenId;
private string examId;
@@ -75,7 +76,7 @@ namespace SafeExamBrowser.Server
IPowerSupply powerSupply = default,
INetworkAdapter networkAdapter = default)
{
this.api = new ApiVersion1();
this.api = new Api();
this.appConfig = appConfig;
this.keyGenerator = keyGenerator;
this.fileSystem = new FileSystem(appConfig, logger);
@@ -87,6 +88,7 @@ namespace SafeExamBrowser.Server
this.parser = new Parser(logger);
this.pingTimer = new Timer();
this.powerSupply = powerSupply;
this.sanitizer = new Sanitizer();
this.systemInfo = systemInfo;
this.userInfo = userInfo;
}
@@ -110,7 +112,7 @@ namespace SafeExamBrowser.Server
public ServerResponse Connect()
{
var request = new ApiRequest(api, httpClient, logger, parser, settings);
var request = new ApiRequest(api, httpClient, logger, parser, sanitizer, settings);
var success = request.TryExecute(out api, out var message);
if (success)
@@ -194,8 +196,8 @@ namespace SafeExamBrowser.Server
return new ConnectionInfo
{
Api = JsonConvert.SerializeObject(api),
ConnectionToken = BaseRequest.ConnectionToken,
Oauth2Token = BaseRequest.Oauth2Token
ConnectionToken = Request.ConnectionToken,
Oauth2Token = Request.Oauth2Token
};
}
@@ -204,7 +206,7 @@ namespace SafeExamBrowser.Server
this.settings = settings;
httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(settings.ServerUrl);
httpClient.BaseAddress = sanitizer.Sanitize(settings.ServerUrl);
if (settings.RequestTimeout > 0)
{
@@ -214,11 +216,11 @@ namespace SafeExamBrowser.Server
public void Initialize(string api, string connectionToken, string examId, string oauth2Token, ServerSettings settings)
{
this.api = JsonConvert.DeserializeObject<ApiVersion1>(api);
this.api = JsonConvert.DeserializeObject<Api>(api);
this.examId = examId;
BaseRequest.ConnectionToken = connectionToken;
BaseRequest.Oauth2Token = oauth2Token;
Request.ConnectionToken = connectionToken;
Request.Oauth2Token = oauth2Token;
Initialize(settings);
}
@@ -284,30 +286,22 @@ namespace SafeExamBrowser.Server
var request = new SelectExamRequest(api, httpClient, logger, parser, settings);
var success = request.TryExecute(exam, out var message, out var appSignatureKeySalt, out var browserExamKey);
if (browserExamKey != default)
{
logger.Info("Custom browser exam key detected.");
}
if (success)
{
logger.Info("Successfully sent selected exam.");
success = TryFinishHandshake(out message, appSignatureKeySalt);
}
else
{
logger.Error("Failed to send selected exam!");
}
if (success && appSignatureKeySalt != default)
{
logger.Info("App signature key salt detected, performing key exchange...");
success = TrySendAppSignatureKey(appSignatureKeySalt, out message);
}
else
{
logger.Info("No app signature key salt detected, skipping key exchange.");
}
if (browserExamKey != default)
{
logger.Info("Custom browser exam key detected.");
}
return new ServerResponse<string>(success, browserExamKey, message);
}
@@ -515,19 +509,30 @@ namespace SafeExamBrowser.Server
}
}
private bool TrySendAppSignatureKey(string salt, out string message)
private bool TryFinishHandshake(out string message, string appSignatureKeySalt = default)
{
var appSignatureKey = keyGenerator.CalculateAppSignatureKey(BaseRequest.ConnectionToken, salt);
var request = new AppSignatureKeyRequest(api, httpClient, logger, parser, settings);
var success = request.TryExecute(appSignatureKey, out message);
var appSignatureKey = default(string);
if (success)
if (appSignatureKeySalt != default)
{
logger.Info("Successfully sent app signature key.");
logger.Info("App signature key salt available, performing key exchange...");
appSignatureKey = keyGenerator.CalculateAppSignatureKey(Request.ConnectionToken, appSignatureKeySalt);
}
else
{
logger.Error("Failed to send app signature key!");
logger.Info("App signature key salt not available, not performing key exchange.");
}
var request = new FinishHandshakeRequest(api, httpClient, logger, parser, settings);
var success = request.TryExecute(out message, appSignatureKey);
if (success)
{
logger.Info("Successfully finished handshake.");
}
else
{
logger.Error("Failed to finish handshake!");
}
return success;