[MOD] Fix out redacts a bit
Some checks failed
Compile Telodendria / Compile Telodendria (x86, alpine-v3.19) (push) Has been cancelled
Compile Telodendria / Compile Telodendria (x86, debian-v12.4) (push) Has been cancelled
Compile Telodendria / Compile Telodendria (x86, freebsd-v14.0) (push) Has been cancelled
Compile Telodendria / Compile Telodendria (x86, netbsd-v9.3) (push) Has been cancelled
Compile Telodendria / Compile Telodendria (x86_64, alpine-v3.19) (push) Has been cancelled
Compile Telodendria / Compile Telodendria (x86_64, debian-v12.4) (push) Has been cancelled
Compile Telodendria / Compile Telodendria (x86_64, freebsd-v14.0) (push) Has been cancelled
Compile Telodendria / Compile Telodendria (x86_64, netbsd-v9.3) (push) Has been cancelled
Compile Telodendria / Compile Telodendria (x86_64, openbsd-v7.4) (push) Has been cancelled

This commit is contained in:
LDA 2024-09-14 20:00:32 +02:00
parent 0d7f472a24
commit 29a298efe2
6 changed files with 19 additions and 8 deletions

View file

@ -45,6 +45,9 @@
"state_key": { "state_key": {
"type": "string" "type": "string"
}, },
"redacts": {
"type": "string"
},
"type": { "type": {
"type": "string", "type": "string",
"required": true "required": true

View file

@ -67,6 +67,7 @@
"origin_server_ts": { "type": "integer", "required": true }, "origin_server_ts": { "type": "integer", "required": true },
"sender": { "type": "string", "required": true }, "sender": { "type": "string", "required": true },
"state_key": { "type": "string" }, "state_key": { "type": "string" },
"redacts": { "type": "string" },
"type": { "type": "string", "required": true } "type": { "type": "string", "required": true }
}, },
"type": "struct" "type": "struct"

View file

@ -618,12 +618,13 @@ RoomLeave(Room *room, User *user, char **errp)
return ret; return ret;
} }
char * char *
RoomRedact(Room *room, User *user, char *eventID, char **errp) RoomRedact(Room *room, User *user, char *eventID, char *reason, char **errp)
{ {
CommonID *userId = NULL; CommonID *userId = NULL;
char *userString = NULL; char *userString = NULL;
char *server = NULL; char *server = NULL;
HashMap *event = NULL; HashMap *event = NULL;
HashMap *content = NULL;
HashMap *pdu = NULL; HashMap *pdu = NULL;
char *ret = NULL; char *ret = NULL;
@ -657,9 +658,11 @@ RoomRedact(Room *room, User *user, char *eventID, char **errp)
goto end; goto end;
} }
content = HashMapCreate();
HashMapSet(content, "reason", JsonValueString(reason));
event = RoomEventCreate(userString, event = RoomEventCreate(userString,
"m.room.redaction", NULL, "m.room.redaction", NULL,
HashMapCreate() content
); );
HashMapSet(event, "redacts", JsonValueString(eventID)); HashMapSet(event, "redacts", JsonValueString(eventID));
pdu = RoomEventSend(room, event, errp); pdu = RoomEventSend(room, event, errp);

View file

@ -56,6 +56,8 @@ EventFitsV1(PduV1 pdu)
JsonFree(hm); JsonFree(hm);
return ret; return ret;
} }
/* TODO: Rejection */
static PduV1Status static PduV1Status
RoomGetEventStatusV1(Room *room, PduV1 *pdu, State *prev, bool client, char **errp) RoomGetEventStatusV1(Room *room, PduV1 *pdu, State *prev, bool client, char **errp)
{ {
@ -79,17 +81,17 @@ RoomGetEventStatusV1(Room *room, PduV1 *pdu, State *prev, bool client, char **er
} }
if (!RoomAuthoriseEventV1(room, *pdu, prev, errp)) if (!RoomAuthoriseEventV1(room, *pdu, prev, errp))
{ {
/* Reject this event as the current state does not allow it. /* Reject this event as the PDU's own state does not allow it. */
* TODO: Make the auth check function return a string showing the
* errorr status to the user. */
return PDUV1_STATUS_DROPPED; return PDUV1_STATUS_DROPPED;
} }
if (!client) if (!client)
{ {
/* Checking for soft-failure is not that useful in that case,
* we're only doing pointless computation. */
State *current = StateCurrent(room); State *current = StateCurrent(room);
if (!RoomAuthoriseEventV1(room, *pdu, current, NULL)) if (!RoomAuthoriseEventV1(room, *pdu, current, errp))
{ {
StateFree(current); StateFree(current);
return PDUV1_STATUS_SOFTFAIL; return PDUV1_STATUS_SOFTFAIL;

View file

@ -57,6 +57,7 @@ ROUTE_IMPL(RouteRedact, path, argp)
char *transId = ArrayGet(path, 2); char *transId = ArrayGet(path, 2);
char *redactId = NULL; char *redactId = NULL;
char *sender = NULL; char *sender = NULL;
char *reason = NULL;
Room *room = NULL; Room *room = NULL;
@ -97,6 +98,7 @@ ROUTE_IMPL(RouteRedact, path, argp)
response = MatrixErrorCreate(M_NOT_JSON, NULL); response = MatrixErrorCreate(M_NOT_JSON, NULL);
goto finish; goto finish;
} }
reason = JsonValueAsString(HashMapGet(request, "reason"));
user = UserAuthenticate(db, token); user = UserAuthenticate(db, token);
if (!user) if (!user)
@ -123,7 +125,7 @@ ROUTE_IMPL(RouteRedact, path, argp)
goto finish; goto finish;
} }
if (!(redactId = RoomRedact(room, user, eventId, &err))) if (!(redactId = RoomRedact(room, user, eventId, reason, &err)))
{ {
HttpResponseStatus(args->context, HTTP_UNAUTHORIZED); HttpResponseStatus(args->context, HTTP_UNAUTHORIZED);
response = MatrixErrorCreate(M_FORBIDDEN, err); response = MatrixErrorCreate(M_FORBIDDEN, err);

View file

@ -234,7 +234,7 @@ extern bool RoomCanJoin(Room *, char *);
/** /**
* Makes a local user redact an event(from it's ID). * Makes a local user redact an event(from it's ID).
*/ */
extern char * RoomRedact(Room *, User *, char *, char **); extern char * RoomRedact(Room *, User *, char *, char *, char **);
/** /**
* Makes a local user join a room, and returns true if * Makes a local user join a room, and returns true if