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;
|
return;
|
||||||
}
|
}
|
||||||
string id = idQuery.ToString().Split(":")[0];
|
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(
|
Universal2String keys = JsonSerializer.Deserialize(
|
||||||
await Utils.GetUserKeys(id),
|
keysRaw,
|
||||||
AppJsonSerializerContext.Default.Universal2String
|
AppJsonSerializerContext.Default.Universal2String
|
||||||
);
|
);
|
||||||
await context.Response.WriteAsync(keys.string2);
|
await context.Response.WriteAsync(keys.string2 ?? "");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -631,6 +636,24 @@ public class Requests
|
||||||
await Room.Requests.DmCreate(id, serializedBody.string2)
|
await Room.Requests.DmCreate(id, serializedBody.string2)
|
||||||
, password));
|
, password));
|
||||||
break;
|
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:
|
default:
|
||||||
await context.Response.WriteAsync(Encryption.Encryption.EncryptString(
|
await context.Response.WriteAsync(Encryption.Encryption.EncryptString(
|
||||||
$"error:unknown.request:{serializedBody.string1}"
|
$"error:unknown.request:{serializedBody.string1}"
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,59 @@ namespace LarpixServer.Room;
|
||||||
public class Requests
|
public class Requests
|
||||||
{
|
{
|
||||||
public static SemaphoreSlim createLock = new SemaphoreSlim(1, 1);
|
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)
|
public static async Task<string> DmInvite(string id, string targetId)
|
||||||
{
|
{
|
||||||
if (!Account.Utils.IsUserLocal(targetId, out string domain)) //federation
|
if (!Account.Utils.IsUserLocal(targetId, out string domain)) //federation
|
||||||
|
|
@ -166,8 +219,9 @@ public class Requests
|
||||||
string dmId = $"{users[0]}_{users[1]}";
|
string dmId = $"{users[0]}_{users[1]}";
|
||||||
|
|
||||||
|
|
||||||
await Fs.WriteFile($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members",
|
Fs.CreateDirectory($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members");
|
||||||
Encoding.UTF8.GetBytes($"{id}:{DOMAIN};{id2}:{domain}"));
|
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"));
|
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