Compare commits

...

7 Commits

Author SHA1 Message Date
Paul Makles
c59c4146c4 chore: bump quark, fixes #156 2022-05-08 10:13:45 +01:00
Paul Makles
bd455b59fb fix: use i64::MAX for default role permission 2022-05-07 17:55:58 +01:00
Paul Makles
d03cb44071 chore: limit deletions to past week 2022-05-07 16:53:15 +01:00
Paul Makles
ac4cedd014 feat: bulk message delete 2022-05-07 16:42:06 +01:00
Paul Makles
09e918d8e0 feat: clean up bot restrictions 2022-05-07 15:20:42 +01:00
Paul Makles
97fef56bad fix: masquerade not being applied to mesages
fixes #153
2022-04-30 16:09:52 +01:00
Paul Makles
408743476b chore: bump quark revision 2022-04-29 17:34:01 +01:00
21 changed files with 126 additions and 14 deletions

2
Cargo.lock generated
View File

@@ -2999,7 +2999,7 @@ dependencies = [
[[package]]
name = "revolt-quark"
version = "0.1.0"
source = "git+https://github.com/revoltchat/quark?rev=68403fb55912de9ad98257741b8c93ce165b7abf#68403fb55912de9ad98257741b8c93ce165b7abf"
source = "git+https://github.com/revoltchat/quark?rev=45706b93d4da11cf3e0f3ca41514c73945bb348d#45706b93d4da11cf3e0f3ca41514c73945bb348d"
dependencies = [
"async-recursion",
"async-std",

View File

@@ -64,5 +64,5 @@ schemars = "0.8.8"
rocket_okapi = { git = "https://github.com/insertish/okapi", rev = "dcf0df115596ee07a587a7a543cddf3d7944645b", features = [ "swagger" ] }
# quark
revolt-quark = { git = "https://github.com/revoltchat/quark", rev = "68403fb55912de9ad98257741b8c93ce165b7abf" }
revolt-quark = { git = "https://github.com/revoltchat/quark", rev = "45706b93d4da11cf3e0f3ca41514c73945bb348d" }
# revolt-quark = { path = "../quark" }

View File

@@ -1,3 +1,3 @@
#!/bin/bash
export version=0.5.3
export version=0.5.3-patch.2
echo "pub const VERSION: &str = \"${version}\";" > src/version.rs

View File

@@ -1,4 +1,4 @@
use revolt_quark::{models::User, perms, Db, EmptyResponse, Permission, Ref, Result};
use revolt_quark::{models::User, perms, Db, EmptyResponse, Error, Permission, Ref, Result};
/// # Acknowledge Message
///
@@ -6,6 +6,10 @@ use revolt_quark::{models::User, perms, Db, EmptyResponse, Permission, Ref, Resu
#[openapi(tag = "Messaging")]
#[put("/<target>/ack/<message>")]
pub async fn req(db: &Db, user: User, target: Ref, message: Ref) -> Result<EmptyResponse> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let channel = target.as_channel(db).await?;
perms(&user)
.channel(&channel)

View File

@@ -9,6 +9,10 @@ use revolt_quark::{
#[openapi(tag = "Groups")]
#[put("/<target>/recipients/<member>")]
pub async fn req(db: &Db, user: User, target: Ref, member: Ref) -> Result<EmptyResponse> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let mut channel = target.as_channel(db).await?;
perms(&user)
.channel(&channel)

View File

@@ -37,6 +37,10 @@ pub struct DataCreateGroup {
#[openapi(tag = "Groups")]
#[post("/create", data = "<info>")]
pub async fn req(db: &Db, user: User, info: Json<DataCreateGroup>) -> Result<Json<Channel>> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let info = info.into_inner();
info.validate()
.map_err(|error| Error::FailedValidation { error })?;

View File

@@ -9,6 +9,10 @@ use revolt_quark::{
#[openapi(tag = "Groups")]
#[delete("/<target>/recipients/<member>")]
pub async fn req(db: &Db, user: User, target: Ref, member: Ref) -> Result<EmptyResponse> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let channel = target.as_channel(db).await?;
match &channel {

View File

@@ -1,6 +1,6 @@
use revolt_quark::{
models::{Invite, User},
perms, Db, Permission, Ref, Result,
perms, Db, Error, Permission, Ref, Result,
};
use rocket::serde::json::Json;
@@ -13,6 +13,10 @@ use rocket::serde::json::Json;
#[openapi(tag = "Channel Invites")]
#[post("/<target>/invites")]
pub async fn req(db: &Db, user: User, target: Ref) -> Result<Json<Invite>> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let channel = target.as_channel(db).await?;
perms(&user)
.channel(&channel)

View File

@@ -11,6 +11,10 @@ use rocket::serde::json::Json;
#[openapi(tag = "Groups")]
#[get("/<target>/members")]
pub async fn req(db: &Db, user: User, target: Ref) -> Result<Json<Vec<User>>> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let channel = target.as_channel(db).await?;
perms(&user)
.channel(&channel)

View File

@@ -0,0 +1,59 @@
use chrono::Utc;
use revolt_quark::{
models::{Message, User},
perms, Db, EmptyResponse, Error, Permission, Ref, Result,
};
use rocket::serde::json::Json;
use serde::Deserialize;
use validator::Validate;
/// # Search Parameters
#[derive(Validate, Deserialize, JsonSchema)]
pub struct OptionsBulkDelete {
/// Message IDs
#[validate(length(min = 1, max = 100))]
ids: Vec<String>,
}
/// # Bulk Delete Messages
///
/// Delete multiple messages you've sent or one you have permission to delete.
///
/// This will always require `ManageMessages` permission regardless of whether you own the message or not.
///
/// Messages must have been sent within the past 1 week.
#[openapi(tag = "Messaging")]
#[delete("/<target>/messages/bulk", data = "<options>", rank = 1)]
pub async fn req(
db: &Db,
user: User,
target: Ref,
options: Json<OptionsBulkDelete>,
) -> Result<EmptyResponse> {
let options = options.into_inner();
options
.validate()
.map_err(|error| Error::FailedValidation { error })?;
for id in &options.ids {
if ulid::Ulid::from_string(id)
.map_err(|_| Error::InvalidOperation)?
.datetime()
.signed_duration_since(Utc::now())
.num_days()
.abs()
> 7
{
return Err(Error::InvalidOperation);
}
}
perms(&user)
.channel(&target.as_channel(db).await?)
.throw_permission(db, Permission::ManageMessages)
.await?;
Message::bulk_delete(db, &target.id, options.ids)
.await
.map(|_| EmptyResponse)
}

View File

@@ -4,7 +4,7 @@ use revolt_quark::{models::User, perms, Db, EmptyResponse, Error, Permission, Re
///
/// Delete a message you've sent or one you have permission to delete.
#[openapi(tag = "Messaging")]
#[delete("/<target>/messages/<msg>")]
#[delete("/<target>/messages/<msg>", rank = 2)]
pub async fn req(db: &Db, user: User, target: Ref, msg: Ref) -> Result<EmptyResponse> {
let message = msg.as_message(db).await?;
if message.channel != target.id {

View File

@@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize};
use validator::Validate;
/// # Search Parameters
#[derive(Validate, Serialize, Deserialize, JsonSchema, FromForm)]
#[derive(Validate, Serialize, Deserialize, JsonSchema)]
pub struct OptionsMessageSearch {
/// Full-text search query
///
@@ -48,6 +48,10 @@ pub async fn req(
target: Ref,
options: Json<OptionsMessageSearch>,
) -> Result<Json<BulkMessageResponse>> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let options = options.into_inner();
options
.validate()

View File

@@ -80,6 +80,7 @@ pub async fn message_send(
id: message_id.clone(),
channel: channel.id().to_string(),
author: user.id.clone(),
masquerade: data.masquerade,
..Default::default()
};
@@ -94,7 +95,7 @@ pub async fn message_send(
}
// 2. Verify permissions for masquerade.
if data.masquerade.is_some() {
if message.masquerade.is_some() {
permissions
.throw_permission(db, Permission::Masquerade)
.await?;

View File

@@ -10,6 +10,7 @@ mod group_create;
mod group_remove_member;
mod invite_create;
mod members_fetch;
mod message_bulk_delete;
mod message_delete;
mod message_edit;
mod message_fetch;
@@ -35,6 +36,7 @@ pub fn routes() -> (Vec<Route>, OpenApi) {
message_query_stale::req,
message_fetch::req,
message_edit::req,
message_bulk_delete::req,
message_delete::req,
group_create::req,
group_add_member::req,

View File

@@ -1,6 +1,6 @@
use revolt_quark::{
models::{Invite, User},
perms, Db, Permission, Ref, Result,
perms, Db, Error, Permission, Ref, Result,
};
use rocket::serde::json::Json;
@@ -11,6 +11,10 @@ use rocket::serde::json::Json;
#[openapi(tag = "Server Members")]
#[get("/<target>/invites")]
pub async fn req(db: &Db, user: User, target: Ref) -> Result<Json<Vec<Invite>>> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let server = target.as_server(db).await?;
perms(&user)
.server(&server)

View File

@@ -1,4 +1,4 @@
use revolt_quark::{models::User, perms, Db, EmptyResponse, Ref, Result};
use revolt_quark::{models::User, perms, Db, EmptyResponse, Error, Ref, Result};
/// # Mark Server As Read
///
@@ -6,6 +6,10 @@ use revolt_quark::{models::User, perms, Db, EmptyResponse, Ref, Result};
#[openapi(tag = "Server Information")]
#[put("/<target>/ack")]
pub async fn req(db: &Db, user: User, target: Ref) -> Result<EmptyResponse> {
if user.bot.is_some() {
return Err(Error::IsBot);
}
let server = target.as_server(db).await?;
perms(&user).server(&server).calc(db).await?;

View File

@@ -1,5 +1,5 @@
use revolt_quark::models::User;
use revolt_quark::{Database, Result};
use revolt_quark::{Database, Error, Result};
use rocket::serde::json::Json;
use rocket::State;
@@ -11,6 +11,11 @@ use rocket::State;
#[put("/<username>/friend")]
pub async fn req(db: &State<Database>, user: User, username: String) -> Result<Json<User>> {
let mut target = db.fetch_user_by_username(&username).await?;
if user.bot.is_some() || target.bot.is_some() {
return Err(Error::IsBot);
}
user.add_friend(db, &mut target).await?;
Ok(Json(target.with_auto_perspective(db, &user).await))
}

View File

@@ -24,6 +24,10 @@ pub async fn req(db: &State<Database>, user: User, target: Ref) -> Result<Json<M
return Err(Error::InvalidOperation);
}
if user.bot.is_some() {
return Err(Error::IsBot);
}
let target = target.as_user(db).await?;
if perms(&user)

View File

@@ -1,5 +1,5 @@
use revolt_quark::models::User;
use revolt_quark::{Database, Result};
use revolt_quark::{Database, Error, Result};
use rocket::serde::json::Json;
use rocket::State;
@@ -11,6 +11,11 @@ use rocket::State;
#[delete("/<target>/friend")]
pub async fn req(db: &State<Database>, user: User, target: String) -> Result<Json<User>> {
let mut target = db.fetch_user(&target).await?;
if user.bot.is_some() || target.bot.is_some() {
return Err(Error::IsBot);
}
user.remove_friend(db, &mut target).await?;
Ok(Json(target.with_auto_perspective(db, &user).await))
}

View File

@@ -136,7 +136,7 @@ fn resolve_bucket_limit(bucket: &str) -> u8 {
"messaging" => 10,
"channels" => 15,
"servers" => 5,
"auth" => 3,
"auth" => 15,
"auth_delete" => 255,
"swagger" => 100,
_ => 20,

View File

@@ -1 +1 @@
pub const VERSION: &str = "0.5.3";
pub const VERSION: &str = "0.5.3-patch.2";