domain: introduce UserId to make uid case insensitive

Note that if there was a non-lowercase user already in the DB, it cannot
be found again. To fix this, run in the DB:

sqlite> UPDATE users SET user_id = LOWER(user_id);
This commit is contained in:
Valentin Tolmer
2022-03-26 18:00:37 +01:00
committed by nitnelave
parent 26cedcb621
commit ca19e61f50
13 changed files with 299 additions and 181 deletions

View File

@@ -1,5 +1,5 @@
use crate::domain::handler::{
BackendHandler, CreateUserRequest, GroupId, UpdateGroupRequest, UpdateUserRequest,
BackendHandler, CreateUserRequest, GroupId, UpdateGroupRequest, UpdateUserRequest, UserId,
};
use juniper::{graphql_object, FieldResult, GraphQLInputObject, GraphQLObject};
@@ -66,10 +66,11 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
if !context.validation_result.is_admin {
return Err("Unauthorized user creation".into());
}
let user_id = UserId::new(&user.id);
context
.handler
.create_user(CreateUserRequest {
user_id: user.id.clone(),
user_id: user_id.clone(),
email: user.email,
display_name: user.display_name,
first_name: user.first_name,
@@ -78,7 +79,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
.await?;
Ok(context
.handler
.get_user_details(&user.id)
.get_user_details(&user_id)
.await
.map(Into::into)?)
}
@@ -108,7 +109,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
context
.handler
.update_user(UpdateUserRequest {
user_id: user.id,
user_id: UserId::new(&user.id),
email: user.email,
display_name: user.display_name,
first_name: user.first_name,
@@ -148,7 +149,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
}
context
.handler
.add_user_to_group(&user_id, GroupId(group_id))
.add_user_to_group(&UserId::new(&user_id), GroupId(group_id))
.await?;
Ok(Success::new())
}
@@ -166,7 +167,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
}
context
.handler
.remove_user_from_group(&user_id, GroupId(group_id))
.remove_user_from_group(&UserId::new(&user_id), GroupId(group_id))
.await?;
Ok(Success::new())
}
@@ -178,7 +179,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
if context.validation_result.user == user_id {
return Err("Cannot delete current user".into());
}
context.handler.delete_user(&user_id).await?;
context.handler.delete_user(&UserId::new(&user_id)).await?;
Ok(Success::new())
}

View File

@@ -1,4 +1,4 @@
use crate::domain::handler::{BackendHandler, GroupId, GroupIdAndName};
use crate::domain::handler::{BackendHandler, GroupId, GroupIdAndName, UserId};
use juniper::{graphql_object, FieldResult, GraphQLInputObject};
use serde::{Deserialize, Serialize};
@@ -48,6 +48,9 @@ impl TryInto<DomainRequestFilter> for RequestFilter {
return Err("Multiple fields specified in request filter".to_string());
}
if let Some(e) = self.eq {
if e.field.to_lowercase() == "uid" {
return Ok(DomainRequestFilter::UserId(UserId::new(&e.value)));
}
return Ok(DomainRequestFilter::Equality(e.field, e.value));
}
if let Some(c) = self.any {
@@ -109,7 +112,7 @@ impl<Handler: BackendHandler + Sync> Query<Handler> {
}
Ok(context
.handler
.get_user_details(&user_id)
.get_user_details(&UserId::new(&user_id))
.await
.map(Into::into)?)
}
@@ -170,7 +173,7 @@ impl<Handler: BackendHandler> Default for User<Handler> {
#[graphql_object(context = Context<Handler>)]
impl<Handler: BackendHandler + Sync> User<Handler> {
fn id(&self) -> &str {
&self.user.user_id
self.user.user_id.as_str()
}
fn email(&self) -> &str {
@@ -260,7 +263,7 @@ impl<Handler: BackendHandler> From<DomainGroup> for Group<Handler> {
Self {
group_id: group.id.0,
display_name: group.display_name,
members: Some(group.users.into_iter().map(Into::into).collect()),
members: Some(group.users.into_iter().map(UserId::into_string).collect()),
_phantom: std::marker::PhantomData,
}
}
@@ -305,10 +308,10 @@ mod tests {
let mut mock = MockTestBackendHandler::new();
mock.expect_get_user_details()
.with(eq("bob"))
.with(eq(UserId::new("bob")))
.return_once(|_| {
Ok(DomainUser {
user_id: "bob".to_string(),
user_id: UserId::new("bob"),
email: "bob@bobbers.on".to_string(),
..Default::default()
})
@@ -316,7 +319,7 @@ mod tests {
let mut groups = HashSet::new();
groups.insert(GroupIdAndName(GroupId(3), "Bobbersons".to_string()));
mock.expect_get_user_groups()
.with(eq("bob"))
.with(eq(UserId::new("bob")))
.return_once(|_| Ok(groups));
let context = Context::<MockTestBackendHandler> {
@@ -369,12 +372,12 @@ mod tests {
.return_once(|_| {
Ok(vec![
DomainUser {
user_id: "bob".to_string(),
user_id: UserId::new("bob"),
email: "bob@bobbers.on".to_string(),
..Default::default()
},
DomainUser {
user_id: "robert".to_string(),
user_id: UserId::new("robert"),
email: "robert@bobbers.on".to_string(),
..Default::default()
},