Include DM users in payload; fix permission query. + cargo fmt
This commit is contained in:
@@ -25,46 +25,6 @@ bitfield! {
|
|||||||
impl_op_ex!(+ |a: &ChannelPermission, b: &ChannelPermission| -> u32 { *a as u32 | *b as u32 });
|
impl_op_ex!(+ |a: &ChannelPermission, b: &ChannelPermission| -> u32 { *a as u32 | *b as u32 });
|
||||||
impl_op_ex_commutative!(+ |a: &u32, b: &ChannelPermission| -> u32 { *a | *b as u32 });
|
impl_op_ex_commutative!(+ |a: &u32, b: &ChannelPermission| -> u32 { *a | *b as u32 });
|
||||||
|
|
||||||
/*pub async fn calculate(user: &User, target: &Channel) -> Result<u32> {
|
|
||||||
match target {
|
|
||||||
Channel::SavedMessages { user: owner, .. } => {
|
|
||||||
if &user.id == owner {
|
|
||||||
Ok(ChannelPermission::View
|
|
||||||
+ ChannelPermission::SendMessage
|
|
||||||
+ ChannelPermission::ManageMessages)
|
|
||||||
} else {
|
|
||||||
Ok(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Channel::DirectMessage { recipients, .. } => {
|
|
||||||
if recipients.iter().find(|x| *x == &user.id).is_some() {
|
|
||||||
if let Some(recipient) = recipients.iter().find(|x| *x != &user.id) {
|
|
||||||
let perms = super::user::get(&user, recipient).await?;
|
|
||||||
|
|
||||||
if perms.get_send_message() {
|
|
||||||
return Ok(ChannelPermission::View + ChannelPermission::SendMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Ok(ChannelPermission::View as u32);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(0)
|
|
||||||
}
|
|
||||||
Channel::Group { recipients, .. } => {
|
|
||||||
if recipients.iter().find(|x| *x == &user.id).is_some() {
|
|
||||||
Ok(ChannelPermission::View + ChannelPermission::SendMessage)
|
|
||||||
} else {
|
|
||||||
Ok(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get(user: &User, target: &Channel) -> Result<ChannelPermissions<[u32; 1]>> {
|
|
||||||
Ok(ChannelPermissions([calculate(&user, &target).await?]))
|
|
||||||
}*/
|
|
||||||
|
|
||||||
impl<'a> PermissionCalculator<'a> {
|
impl<'a> PermissionCalculator<'a> {
|
||||||
pub async fn calculate_channel(self) -> Result<u32> {
|
pub async fn calculate_channel(self) -> Result<u32> {
|
||||||
let channel = if let Some(channel) = self.channel {
|
let channel = if let Some(channel) = self.channel {
|
||||||
|
|||||||
@@ -72,10 +72,10 @@ impl<'a> PermissionCalculator<'a> {
|
|||||||
{ "type": "Group" },
|
{ "type": "Group" },
|
||||||
{ "type": "DirectMessage" },
|
{ "type": "DirectMessage" },
|
||||||
],
|
],
|
||||||
"$and": {
|
"$and": [
|
||||||
"recipients": &self.perspective.id,
|
{ "recipients": &self.perspective.id },
|
||||||
"recipients": target
|
{ "recipients": target }
|
||||||
}
|
]
|
||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
|
|||||||
10
src/main.rs
10
src/main.rs
@@ -18,14 +18,16 @@ pub mod notifications;
|
|||||||
pub mod routes;
|
pub mod routes;
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
||||||
use log::info;
|
|
||||||
use futures::join;
|
|
||||||
use chrono::Duration;
|
use chrono::Duration;
|
||||||
|
use futures::join;
|
||||||
|
use log::info;
|
||||||
use rauth::auth::Auth;
|
use rauth::auth::Auth;
|
||||||
|
use rauth::options::{EmailVerification, Options, SMTP};
|
||||||
use rocket_cors::AllowedOrigins;
|
use rocket_cors::AllowedOrigins;
|
||||||
use rocket_prometheus::PrometheusMetrics;
|
use rocket_prometheus::PrometheusMetrics;
|
||||||
use rauth::options::{EmailVerification, Options, SMTP};
|
use util::variables::{
|
||||||
use util::variables::{PUBLIC_URL, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME, USE_EMAIL, USE_PROMETHEUS};
|
PUBLIC_URL, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME, USE_EMAIL, USE_PROMETHEUS,
|
||||||
|
};
|
||||||
|
|
||||||
#[async_std::main]
|
#[async_std::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ pub async fn generate_ready(mut user: User) -> Result<ClientboundNotification> {
|
|||||||
|
|
||||||
if let Channel::Group { recipients, .. } = &channel {
|
if let Channel::Group { recipients, .. } = &channel {
|
||||||
user_ids.extend(recipients.iter().cloned());
|
user_ids.extend(recipients.iter().cloned());
|
||||||
|
} else if let Channel::DirectMessage { recipients, .. } = &channel {
|
||||||
|
user_ids.extend(recipients.iter().cloned());
|
||||||
}
|
}
|
||||||
|
|
||||||
channels.push(channel);
|
channels.push(channel);
|
||||||
@@ -97,11 +99,7 @@ pub async fn generate_ready(mut user: User) -> Result<ClientboundNotification> {
|
|||||||
.for_user_given()
|
.for_user_given()
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
users.push(
|
users.push(other.from(&user).with(permissions));
|
||||||
other
|
|
||||||
.from(&user)
|
|
||||||
.with(permissions)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,5 @@ pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
|
|||||||
Err(Error::LabelMe)?
|
Err(Error::LabelMe)?
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(json!(
|
Ok(json!(target.from(&user).with(perm)))
|
||||||
target
|
|
||||||
.from(&user)
|
|
||||||
.with(perm)
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
|
use md5;
|
||||||
|
use mongodb::bson::doc;
|
||||||
use mongodb::options::FindOneOptions;
|
use mongodb::options::FindOneOptions;
|
||||||
use rocket::response::Redirect;
|
use rocket::response::Redirect;
|
||||||
use mongodb::bson::doc;
|
|
||||||
use urlencoding;
|
use urlencoding;
|
||||||
use md5;
|
|
||||||
|
|
||||||
|
use crate::database::*;
|
||||||
use crate::util::result::{Error, Result};
|
use crate::util::result::{Error, Result};
|
||||||
use crate::util::variables::PUBLIC_URL;
|
use crate::util::variables::PUBLIC_URL;
|
||||||
use crate::database::*;
|
|
||||||
|
|
||||||
#[get("/<target>/avatar")]
|
#[get("/<target>/avatar")]
|
||||||
pub async fn req(target: Ref) -> Result<Redirect> {
|
pub async fn req(target: Ref) -> Result<Redirect> {
|
||||||
@@ -17,32 +17,33 @@ pub async fn req(target: Ref) -> Result<Redirect> {
|
|||||||
},
|
},
|
||||||
FindOneOptions::builder()
|
FindOneOptions::builder()
|
||||||
.projection(doc! { "email": 1 })
|
.projection(doc! { "email": 1 })
|
||||||
.build()
|
.build(),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.map_err(|_| Error::DatabaseError { operation: "find_one", with: "user" })?
|
.map_err(|_| Error::DatabaseError {
|
||||||
|
operation: "find_one",
|
||||||
|
with: "user",
|
||||||
|
})?
|
||||||
.ok_or_else(|| Error::UnknownUser)?;
|
.ok_or_else(|| Error::UnknownUser)?;
|
||||||
|
|
||||||
let email = doc
|
let email = doc
|
||||||
.get_str("email")
|
.get_str("email")
|
||||||
.map_err(|_| Error::DatabaseError { operation: "get_str(email)", with: "user" })?
|
.map_err(|_| Error::DatabaseError {
|
||||||
|
operation: "get_str(email)",
|
||||||
|
with: "user",
|
||||||
|
})?
|
||||||
.to_lowercase();
|
.to_lowercase();
|
||||||
|
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"https://www.gravatar.com/avatar/{:x}?s=128&d={}",
|
"https://www.gravatar.com/avatar/{:x}?s=128&d={}",
|
||||||
md5::compute(email),
|
md5::compute(email),
|
||||||
urlencoding::encode(
|
urlencoding::encode(&format!(
|
||||||
&format!(
|
"{}/users/{}/default_avatar",
|
||||||
"{}/users/{}/default_avatar",
|
*PUBLIC_URL, &target.id
|
||||||
*PUBLIC_URL,
|
))
|
||||||
&target.id
|
);
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
dbg!(&url);
|
dbg!(&url);
|
||||||
|
|
||||||
Ok(
|
Ok(Redirect::to(url))
|
||||||
Redirect::to(url)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user