// Matrix Construct // // Copyright (C) Matrix Construct Developers, Authors & Contributors // Copyright (C) 2016-2018 Jason Volk // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. #include "rooms.h" using namespace ircd; m::resource::response post__unban(client &client, const m::resource::request &request, const m::room::id &room_id) { const m::user::id &user_id { unquote(request.at("user_id")) }; const json::string &reason // non-spec, but wth { request["reason"] }; const m::room room { room_id }; // These items will be checked again during eval for an atomic // determination of whether this request will go through. However // we can save a lot of trouble by testing these conditions first // out here and erroring early; this also warms the cache for eval. const m::room::power power{room}; if(!power(request.user_id, "ban")) throw m::ACCESS_DENIED { "Your power level (%ld) is not high enough for ban (%ld) so you cannot unban.", power.level_user(request.user_id), power.level("ban") }; if(!membership(room, user_id, "ban")) throw m::error { http::OK, "M_BAD_STATE", "User %s is not banned from room %s", string_view{user_id}, string_view{room_id} }; const auto event_id { send(room, request.user_id, "m.room.member", user_id, { { "membership", "leave" }, { "reason", reason }, }) }; return m::resource::response { client, http::OK, json::members { { "event_id", event_id } } }; }