diff --git a/src/Room.c b/src/Room.c index 47fc903..d04864b 100644 --- a/src/Room.c +++ b/src/Room.c @@ -1076,7 +1076,7 @@ AuthorizeBanMembershipV1(Room * room, PduV1 pdu, HashMap *state) * the sender's power level, allow. */ ban_pl = RoomMinPL(room, state, NULL, "ban"); pdu_pl = RoomUserPL(room, state, pdu.sender); - target_pl = RoomUserPL(room, state, pdu.sender); + target_pl = RoomUserPL(room, state, pdu.state_key); if ((pdu_pl >= ban_pl) && (target_pl < pdu_pl)) { return true; diff --git a/src/Routes.c b/src/Routes.c index ad61ad0..0457ee5 100644 --- a/src/Routes.c +++ b/src/Routes.c @@ -81,7 +81,7 @@ RouterBuild(void) R("/_matrix/client/v3/rooms/(.*)/state/(.*)", RouteSendState); R("/_matrix/client/v3/rooms/(.*)/event/(.*)", RouteFetchEvent); R("/_matrix/client/v3/rooms/(.*)/join", RouteJoinRoom); - R("/_matrix/client/v3/rooms/(.*)/kick", RouteKickRoom); + R("/_matrix/client/v3/rooms/(.*)/(kick|ban)", RouteKickRoom); R("/_matrix/client/v3/rooms/(.*)/messages", RouteMessages); R("/_matrix/client/v3/join/(.*)", RouteJoinRoomAlias); diff --git a/src/Routes/RouteActRoom.c b/src/Routes/RouteActRoom.c index dce551f..f41f483 100644 --- a/src/Routes/RouteActRoom.c +++ b/src/Routes/RouteActRoom.c @@ -171,14 +171,17 @@ ROUTE_IMPL(RouteKickRoom, path, argp) CommonID *id = NULL; char *roomId = ArrayGet(path, 0); + char *action = ArrayGet(path, 1); char *kicked = NULL, *reason = NULL; char *sender = NULL, *serverName = NULL; + char *membershipState = StrEquals(action, "kick") ? + "leave" : "ban"; Room *room = NULL; char *err; - if (!roomId) + if (!roomId || !action) { /* Should be impossible */ HttpResponseStatus(args->context, HTTP_INTERNAL_SERVER_ERROR); @@ -244,7 +247,7 @@ ROUTE_IMPL(RouteKickRoom, path, argp) } if (!RoomContainsUser(room, kicked)) { - err = "Kicked user is not present in the room"; + err = "Victim is not present in the room"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); response = MatrixErrorCreate(M_BAD_STATE, err); goto finish; @@ -257,7 +260,7 @@ ROUTE_IMPL(RouteKickRoom, path, argp) content ); - HashMapSet(content, "membership", JsonValueString("leave")); + HashMapSet(content, "membership", JsonValueString(membershipState)); if (reason) { HashMapSet(content, "reason", JsonValueString(reason)); @@ -266,9 +269,11 @@ ROUTE_IMPL(RouteKickRoom, path, argp) pduResponse = RoomEventSend(room, membership); if (!pduResponse) { - err = "Couldn't accept kick event"; + err = "Couldn't accept event"; HttpResponseStatus(args->context, HTTP_INTERNAL_SERVER_ERROR); response = MatrixErrorCreate(M_UNKNOWN, err); + + JsonFree(membership); goto finish; } JsonFree(pduResponse);