AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
This commit is contained in:
@@ -12,6 +12,8 @@ public class ChatTest : WebSocketBehavior
|
||||
public static string? ServerPrivateKey { get; set; }
|
||||
public static string? ChannelDbKey { get; set; }
|
||||
public static SurrealDb.Net.SurrealDbClient? Db { get; set; }
|
||||
private static readonly Dictionary<string, string> ActiveRtcOffersByChannel = new();
|
||||
private static readonly HashSet<string> ActiveRtcChannels = new();
|
||||
|
||||
protected override void OnMessage(MessageEventArgs e)
|
||||
{
|
||||
@@ -41,7 +43,7 @@ public class ChatTest : WebSocketBehavior
|
||||
HandleGetHistory(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
SocketRtcSignalMessage? rtcProbe = null;
|
||||
try
|
||||
{
|
||||
@@ -60,7 +62,7 @@ public class ChatTest : WebSocketBehavior
|
||||
|
||||
HandleEncryptedClientMessage(msg);
|
||||
}
|
||||
|
||||
|
||||
private static string ExtractUsernameFromUserId(string senderUserId)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(senderUserId))
|
||||
@@ -89,10 +91,8 @@ public class ChatTest : WebSocketBehavior
|
||||
return;
|
||||
}
|
||||
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await ClientKeyService.RegisterOrUpdateKeyAsync(username, publicKey);
|
||||
}).GetAwaiter().GetResult();
|
||||
Task.Run(async () => { await ClientKeyService.RegisterOrUpdateKeyAsync(username, publicKey); }).GetAwaiter()
|
||||
.GetResult();
|
||||
|
||||
Send($"SERVER:REGISTERED_KEY:{username}");
|
||||
}
|
||||
@@ -125,7 +125,7 @@ public class ChatTest : WebSocketBehavior
|
||||
|
||||
Send(JsonSerializer.Serialize(payload));
|
||||
}
|
||||
|
||||
|
||||
private void HandleGetServerKey()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(ServerPublicKey))
|
||||
@@ -322,7 +322,7 @@ public class ChatTest : WebSocketBehavior
|
||||
Send(JsonSerializer.Serialize(outbound));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static string GetRecordId(object? id)
|
||||
{
|
||||
if (id is null)
|
||||
@@ -339,7 +339,7 @@ public class ChatTest : WebSocketBehavior
|
||||
|
||||
return $"{table}:{recordId}";
|
||||
}
|
||||
|
||||
|
||||
private void HandleEncryptedRtcSignal(string msg)
|
||||
{
|
||||
SocketRtcSignalMessage? clientPayload;
|
||||
@@ -384,10 +384,91 @@ public class ChatTest : WebSocketBehavior
|
||||
return;
|
||||
}
|
||||
|
||||
RtcSignalMessage? rtcSignal;
|
||||
|
||||
try
|
||||
{
|
||||
rtcSignal = JsonSerializer.Deserialize<RtcSignalMessage>(plainJson);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Failed to parse decrypted RTC signal JSON: {ex.Message}");
|
||||
return;
|
||||
}
|
||||
|
||||
if (rtcSignal is null)
|
||||
return;
|
||||
|
||||
var allKeys = Task.Run(async () => await ClientKeyService.GetAllAsync())
|
||||
.GetAwaiter()
|
||||
.GetResult();
|
||||
|
||||
if (rtcSignal.Type == "rtc_join")
|
||||
{
|
||||
var joinState = new
|
||||
{
|
||||
type = "rtc_join_state",
|
||||
from = "server",
|
||||
channelId = rtcSignal.ChannelId,
|
||||
isInitiator = !ActiveRtcOffersByChannel.ContainsKey(rtcSignal.ChannelId)
|
||||
};
|
||||
|
||||
var senderClient = allKeys.FirstOrDefault(x => x.Username == clientPayload.SenderUsername);
|
||||
if (senderClient is null)
|
||||
{
|
||||
Console.WriteLine($"No client key found for RTC join sender {clientPayload.SenderUsername}");
|
||||
return;
|
||||
}
|
||||
|
||||
var joinStateJson = JsonSerializer.Serialize(joinState);
|
||||
var encryptedJoinState = E2EeHelper.EncryptForRecipient(joinStateJson, senderClient.PublicKey);
|
||||
|
||||
var joinStateOutbound = new SocketRtcSignalMessage
|
||||
{
|
||||
Type = "encrypted_rtc_signal",
|
||||
SenderUsername = "server",
|
||||
ChannelId = clientPayload.ChannelId,
|
||||
CipherText = encryptedJoinState.CipherText,
|
||||
Nonce = encryptedJoinState.Nonce,
|
||||
Tag = encryptedJoinState.Tag,
|
||||
EncryptedKey = encryptedJoinState.EncryptedKey
|
||||
};
|
||||
|
||||
Send(JsonSerializer.Serialize(joinStateOutbound));
|
||||
|
||||
if (ActiveRtcOffersByChannel.TryGetValue(rtcSignal.ChannelId, out var storedOfferJson))
|
||||
{
|
||||
var encryptedStoredOffer = E2EeHelper.EncryptForRecipient(storedOfferJson, senderClient.PublicKey);
|
||||
|
||||
var storedOfferOutbound = new SocketRtcSignalMessage
|
||||
{
|
||||
Type = "encrypted_rtc_signal",
|
||||
SenderUsername = "server",
|
||||
ChannelId = clientPayload.ChannelId,
|
||||
CipherText = encryptedStoredOffer.CipherText,
|
||||
Nonce = encryptedStoredOffer.Nonce,
|
||||
Tag = encryptedStoredOffer.Tag,
|
||||
EncryptedKey = encryptedStoredOffer.EncryptedKey
|
||||
};
|
||||
|
||||
Send(JsonSerializer.Serialize(storedOfferOutbound));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (rtcSignal.Type == "rtc_offer")
|
||||
{
|
||||
ActiveRtcOffersByChannel[rtcSignal.ChannelId] = plainJson;
|
||||
ActiveRtcChannels.Add(rtcSignal.ChannelId);
|
||||
}
|
||||
|
||||
if (rtcSignal.Type == "rtc_leave")
|
||||
{
|
||||
ActiveRtcOffersByChannel.Remove(rtcSignal.ChannelId);
|
||||
ActiveRtcChannels.Remove(rtcSignal.ChannelId);
|
||||
}
|
||||
|
||||
foreach (var client in allKeys)
|
||||
{
|
||||
if (client.Username == clientPayload.SenderUsername)
|
||||
|
||||
Reference in New Issue
Block a user