Compare commits

..
16 changed files with 53 additions and 30 deletions
Generated
+15 -8
View File
@@ -806,6 +806,12 @@ dependencies = [
"uuid", "uuid",
] ]
[[package]]
name = "decancer"
version = "1.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "808127a7de612079ec37bfc1abc48ed77a6015a971a8bd7d4178d79147cbc839"
[[package]] [[package]]
name = "derivative" name = "derivative"
version = "2.2.0" version = "2.2.0"
@@ -2837,7 +2843,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt-bonfire" name = "revolt-bonfire"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"async-std", "async-std",
"async-tungstenite", "async-tungstenite",
@@ -2854,7 +2860,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt-database" name = "revolt-database"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"async-recursion", "async-recursion",
"async-std", "async-std",
@@ -2885,7 +2891,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt-delta" name = "revolt-delta"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"async-channel", "async-channel",
"async-std", "async-std",
@@ -2925,7 +2931,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt-models" name = "revolt-models"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"revolt-permissions", "revolt-permissions",
"revolt_optional_struct", "revolt_optional_struct",
@@ -2936,7 +2942,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt-permissions" name = "revolt-permissions"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"async-std", "async-std",
"async-trait", "async-trait",
@@ -2950,7 +2956,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt-presence" name = "revolt-presence"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"async-std", "async-std",
"log", "log",
@@ -2961,7 +2967,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt-quark" name = "revolt-quark"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"async-lock", "async-lock",
"async-recursion", "async-recursion",
@@ -2974,6 +2980,7 @@ dependencies = [
"bson", "bson",
"dashmap", "dashmap",
"deadqueue", "deadqueue",
"decancer",
"dotenv", "dotenv",
"futures", "futures",
"impl_ops", "impl_ops",
@@ -3012,7 +3019,7 @@ dependencies = [
[[package]] [[package]]
name = "revolt-result" name = "revolt-result"
version = "0.6.0" version = "0.6.1"
dependencies = [ dependencies = [
"revolt_okapi", "revolt_okapi",
"revolt_rocket_okapi", "revolt_rocket_okapi",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "revolt-bonfire" name = "revolt-bonfire"
version = "0.6.0" version = "0.6.1"
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
edition = "2021" edition = "2021"
+5 -5
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "revolt-database" name = "revolt-database"
version = "0.6.0" version = "0.6.1"
edition = "2021" edition = "2021"
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
authors = [ "Paul Makles <me@insrt.uk>" ] authors = [ "Paul Makles <me@insrt.uk>" ]
@@ -22,10 +22,10 @@ default = [ "mongodb", "async-std-runtime" ]
[dependencies] [dependencies]
# Core # Core
revolt-result = { version = "0.6.0", path = "../result" } revolt-result = { version = "0.6.1", path = "../result" }
revolt-models = { version = "0.6.0", path = "../models" } revolt-models = { version = "0.6.1", path = "../models" }
revolt-presence = { version = "0.6.0", path = "../presence" } revolt-presence = { version = "0.6.1", path = "../presence" }
revolt-permissions = { version = "0.6.0", path = "../permissions", features = [ "serde", "bson" ] } revolt-permissions = { version = "0.6.1", path = "../permissions", features = [ "serde", "bson" ] }
# Utility # Utility
log = "0.4" log = "0.4"
@@ -16,7 +16,8 @@ auto_derived_partial!(
/// Discriminator /// Discriminator
pub discriminator: String, pub discriminator: String,
/// Display name /// Display name
pub display_name: String, #[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
/// Avatar attachment /// Avatar attachment
pub avatar: Option<File>, pub avatar: Option<File>,
@@ -208,8 +209,10 @@ pub static DISCRIMINATOR_SEARCH_SPACE: Lazy<HashSet<String>> = Lazy::new(|| {
.map(|v| format!("{:0>4}", v)) .map(|v| format!("{:0>4}", v))
.collect::<HashSet<String>>(); .collect::<HashSet<String>>();
for discrim in [1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999] { for discrim in [
set.remove(&discrim.to_string()); 123, 1234, 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999,
] {
set.remove(&format!("{:0>4}", discrim));
} }
set.into_iter().collect() set.into_iter().collect()
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "revolt-models" name = "revolt-models"
version = "0.6.0" version = "0.6.1"
edition = "2021" edition = "2021"
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
authors = [ "Paul Makles <me@insrt.uk>" ] authors = [ "Paul Makles <me@insrt.uk>" ]
@@ -18,7 +18,7 @@ default = [ "serde", "partials" ]
[dependencies] [dependencies]
# Core # Core
revolt-permissions = { version = "0.6.0", path = "../permissions" } revolt-permissions = { version = "0.6.1", path = "../permissions" }
# Serialisation # Serialisation
revolt_optional_struct = { version = "0.2.0", optional = true } revolt_optional_struct = { version = "0.2.0", optional = true }
+2 -1
View File
@@ -11,7 +11,8 @@ auto_derived!(
/// Discriminator /// Discriminator
pub discriminator: String, pub discriminator: String,
/// Display name /// Display name
pub display_name: String, #[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
/// Avatar attachment /// Avatar attachment
pub avatar: Option<File>, pub avatar: Option<File>,
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "revolt-permissions" name = "revolt-permissions"
version = "0.6.0" version = "0.6.1"
edition = "2021" edition = "2021"
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
authors = [ "Paul Makles <me@insrt.uk>" ] authors = [ "Paul Makles <me@insrt.uk>" ]
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "revolt-presence" name = "revolt-presence"
version = "0.6.0" version = "0.6.1"
edition = "2021" edition = "2021"
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
authors = [ "Paul Makles <me@insrt.uk>" ] authors = [ "Paul Makles <me@insrt.uk>" ]
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "revolt-result" name = "revolt-result"
version = "0.6.0" version = "0.6.1"
edition = "2021" edition = "2021"
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
authors = [ "Paul Makles <me@insrt.uk>" ] authors = [ "Paul Makles <me@insrt.uk>" ]
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "revolt-delta" name = "revolt-delta"
version = "0.6.0" version = "0.6.1"
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
authors = ["Paul Makles <paulmakles@gmail.com>"] authors = ["Paul Makles <paulmakles@gmail.com>"]
edition = "2018" edition = "2018"
+1 -1
View File
@@ -27,7 +27,6 @@ pub struct UserProfileData {
#[derive(Validate, Serialize, Deserialize, JsonSchema)] #[derive(Validate, Serialize, Deserialize, JsonSchema)]
pub struct DataEditUser { pub struct DataEditUser {
/// New display name /// New display name
#[serde(rename = "displayName")]
#[validate(length(min = 2, max = 32), regex = "RE_DISPLAY_NAME")] #[validate(length(min = 2, max = 32), regex = "RE_DISPLAY_NAME")]
display_name: Option<String>, display_name: Option<String>,
/// Attachment Id for avatar /// Attachment Id for avatar
@@ -123,6 +122,7 @@ pub async fn req(
} }
let mut partial: PartialUser = PartialUser { let mut partial: PartialUser = PartialUser {
display_name: data.display_name,
badges: data.badges, badges: data.badges,
flags: data.flags, flags: data.flags,
..Default::default() ..Default::default()
+2 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "revolt-quark" name = "revolt-quark"
version = "0.6.0" version = "0.6.1"
edition = "2021" edition = "2021"
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
@@ -64,6 +64,7 @@ nanoid = "0.4.0"
linkify = "0.8.1" linkify = "0.8.1"
dotenv = "0.15.0" dotenv = "0.15.0"
indexmap = "1.9.1" indexmap = "1.9.1"
decancer = "1.6.2"
impl_ops = "0.1.1" impl_ops = "0.1.1"
num_enum = "0.5.6" num_enum = "0.5.6"
reqwest = "0.11.10" reqwest = "0.11.10"
+10 -2
View File
@@ -68,6 +68,7 @@ impl User {
x.background = None; x.background = None;
} }
} }
FieldsUser::DisplayName => self.display_name = None,
} }
} }
@@ -176,6 +177,11 @@ impl User {
// Copy the username for validation // Copy the username for validation
let username_lowercase = username.to_lowercase(); let username_lowercase = username.to_lowercase();
// Block homoglyphs
if decancer::cure(&username_lowercase).into_str() != username_lowercase {
return Err(Error::InvalidUsername);
}
// Ensure the username itself isn't blocked // Ensure the username itself isn't blocked
const BLOCKED_USERNAMES: &[&str] = &["admin", "revolt"]; const BLOCKED_USERNAMES: &[&str] = &["admin", "revolt"];
@@ -457,8 +463,10 @@ pub static DISCRIMINATOR_SEARCH_SPACE_QUARK: Lazy<HashSet<String>> = Lazy::new(|
.map(|v| format!("{:0>4}", v)) .map(|v| format!("{:0>4}", v))
.collect::<HashSet<String>>(); .collect::<HashSet<String>>();
for discrim in [1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999] { for discrim in [
set.remove(&discrim.to_string()); 123, 1234, 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999,
] {
set.remove(&format!("{:0>4}", discrim));
} }
set.into_iter().collect() set.into_iter().collect()
@@ -337,6 +337,7 @@ impl IntoDocumentPath for FieldsUser {
FieldsUser::ProfileContent => "profile.content", FieldsUser::ProfileContent => "profile.content",
FieldsUser::StatusPresence => "status.presence", FieldsUser::StatusPresence => "status.presence",
FieldsUser::StatusText => "status.text", FieldsUser::StatusText => "status.text",
FieldsUser::DisplayName => "display_name",
}) })
} }
} }
+3 -1
View File
@@ -131,7 +131,8 @@ pub struct User {
/// Discriminator /// Discriminator
pub discriminator: String, pub discriminator: String,
/// Display name /// Display name
pub display_name: String, #[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
/// Avatar attachment /// Avatar attachment
pub avatar: Option<File>, pub avatar: Option<File>,
@@ -176,6 +177,7 @@ pub enum FieldsUser {
StatusPresence, StatusPresence,
ProfileContent, ProfileContent,
ProfileBackground, ProfileBackground,
DisplayName,
} }
/// Enumeration providing a hint to the type of user we are handling /// Enumeration providing a hint to the type of user we are handling
+1 -1
View File
@@ -8,6 +8,6 @@ pub fn prefix_keys<T: Serialize>(t: &T, prefix: &str) -> HashMap<String, serde_j
let v: HashMap<String, serde_json::Value> = serde_json::from_str(&v).unwrap(); let v: HashMap<String, serde_json::Value> = serde_json::from_str(&v).unwrap();
v.into_iter() v.into_iter()
.filter(|(_k, v)| !v.is_null()) .filter(|(_k, v)| !v.is_null())
.map(|(k, v)| (prefix.to_owned() + &k, v)) .map(|(k, v)| (format!("{}{}", prefix.to_owned(), k), v))
.collect() .collect()
} }