DM keys!!!
This commit is contained in:
parent
79af6fcddf
commit
1e40db62a4
2 changed files with 82 additions and 5 deletions
|
|
@ -504,12 +504,17 @@ public class Requests
|
|||
return;
|
||||
}
|
||||
string id = idQuery.ToString().Split(":")[0];
|
||||
|
||||
string keysRaw = await Utils.GetUserKeys(id);
|
||||
if (string.IsNullOrEmpty(keysRaw))
|
||||
{
|
||||
await context.Response.WriteAsync("");
|
||||
return;
|
||||
}
|
||||
Universal2String keys = JsonSerializer.Deserialize(
|
||||
await Utils.GetUserKeys(id),
|
||||
keysRaw,
|
||||
AppJsonSerializerContext.Default.Universal2String
|
||||
);
|
||||
await context.Response.WriteAsync(keys.string2);
|
||||
await context.Response.WriteAsync(keys.string2 ?? "");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -631,6 +636,24 @@ public class Requests
|
|||
await Room.Requests.DmCreate(id, serializedBody.string2)
|
||||
, password));
|
||||
break;
|
||||
case "dm/key/get":
|
||||
await context.Response.WriteAsync(
|
||||
Encryption.Encryption.EncryptString(
|
||||
await Room.Requests.GetDmKey(id, serializedBody.string2)
|
||||
, password));
|
||||
break;
|
||||
case "dm/key/update":
|
||||
{
|
||||
Universal2String dmKeyUpdate = JsonSerializer.Deserialize(
|
||||
serializedBody.string2,
|
||||
AppJsonSerializerContext.Default.Universal2String
|
||||
);
|
||||
await context.Response.WriteAsync(
|
||||
Encryption.Encryption.EncryptString(
|
||||
await Room.Requests.UpdateDmKey(id, dmKeyUpdate.string1, dmKeyUpdate.string2)
|
||||
, password));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
await context.Response.WriteAsync(Encryption.Encryption.EncryptString(
|
||||
$"error:unknown.request:{serializedBody.string1}"
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue