DM keys!!!
All checks were successful
Server Build / publish (push) Successful in 29s
Voice Build / publish (push) Successful in 25s

This commit is contained in:
olcxja 2026-05-27 23:45:41 +02:00
commit 1e40db62a4
2 changed files with 82 additions and 5 deletions

View file

@ -10,6 +10,59 @@ namespace LarpixServer.Room;
public class Requests
{
public static SemaphoreSlim createLock = new SemaphoreSlim(1, 1);
private const int MAX_DM_KEY_SIZE = 8192;
private static bool IsSafeDmId(string dmId)
{
if (string.IsNullOrEmpty(dmId)) return false;
//yk
if (dmId.Contains("..") || dmId.Contains("/") || dmId.Contains("\\"))
{
return false;
}
return true;
}
private static async Task<bool> IsMemberOfDm(string id, string dmId)
{
if (!IsSafeDmId(dmId)) return false;
string memberPath = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members/{id};{DOMAIN}";
return Fs.Exists(memberPath);
}
public static async Task<string> GetDmKey(string id, string dmId)
{
if (!await IsMemberOfDm(id, dmId))
{
return "error:forbidden";
}
string path = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/keys/0/{id};{DOMAIN}";
if (!Fs.Exists(path))
{
return "";
}
return Encoding.UTF8.GetString(await Fs.ReadFile(path));
}
public static async Task<string> UpdateDmKey(string id, string dmId, string key)
{
if (!await IsMemberOfDm(id, dmId))
{
return "error:forbidden";
}
if (key == null || key.Length > MAX_DM_KEY_SIZE)
{
return "error:dm.key.too.large";
}
string path = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/keys/0/{id};{DOMAIN}";
if (!Fs.Exists(path))
{
return "error:dm.key.not.found";
}
await Fs.WriteFile(path, Encoding.UTF8.GetBytes(key));
return "success:dm.key.updated";
}
public static async Task<string> DmInvite(string id, string targetId)
{
if (!Account.Utils.IsUserLocal(targetId, out string domain)) //federation
@ -166,8 +219,9 @@ public class Requests
string dmId = $"{users[0]}_{users[1]}";
await Fs.WriteFile($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members",
Encoding.UTF8.GetBytes($"{id}:{DOMAIN};{id2}:{domain}"));
Fs.CreateDirectory($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members");
await Fs.WriteFile($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members/{id};{DOMAIN}", Array.Empty<byte>());
await Fs.WriteFile($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members/{id2};{domain}", Array.Empty<byte>());
await Fs.WriteFile($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/messages/last", Encoding.UTF8.GetBytes($"0"));