mirror of
				https://github.com/nitnelave/lldap.git
				synced 2023-04-12 14:25:13 +00:00 
			
		
		
		
	Changed the struct to make things launch. I've done no testing.
This commit is contained in:
		
							parent
							
								
									665e525f0a
								
							
						
					
					
						commit
						cef5252a60
					
				@ -86,7 +86,7 @@ impl CommonComponent<CreateUserForm> for CreateUserForm {
 | 
				
			|||||||
                    user: create_user::CreateUserInput {
 | 
					                    user: create_user::CreateUserInput {
 | 
				
			||||||
                        id: model.username,
 | 
					                        id: model.username,
 | 
				
			||||||
                        email: model.email,
 | 
					                        email: model.email,
 | 
				
			||||||
                        displayName: to_option(model.display_name),
 | 
					                        displayName: model.display_name,
 | 
				
			||||||
                        firstName: to_option(model.first_name),
 | 
					                        firstName: to_option(model.first_name),
 | 
				
			||||||
                        lastName: to_option(model.last_name),
 | 
					                        lastName: to_option(model.last_name),
 | 
				
			||||||
                        avatar: None,
 | 
					                        avatar: None,
 | 
				
			||||||
 | 
				
			|||||||
@ -355,7 +355,7 @@ impl UserDetailsForm {
 | 
				
			|||||||
        let mut user_input = update_user::UpdateUserInput {
 | 
					        let mut user_input = update_user::UpdateUserInput {
 | 
				
			||||||
            id: self.common.user.id.clone(),
 | 
					            id: self.common.user.id.clone(),
 | 
				
			||||||
            email: None,
 | 
					            email: None,
 | 
				
			||||||
            displayName: None,
 | 
					            displayName: self.common.user.id.clone(),
 | 
				
			||||||
            firstName: None,
 | 
					            firstName: None,
 | 
				
			||||||
            lastName: None,
 | 
					            lastName: None,
 | 
				
			||||||
            avatar: None,
 | 
					            avatar: None,
 | 
				
			||||||
@ -367,7 +367,7 @@ impl UserDetailsForm {
 | 
				
			|||||||
            user_input.email = Some(email);
 | 
					            user_input.email = Some(email);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if base_user.display_name != model.display_name {
 | 
					        if base_user.display_name != model.display_name {
 | 
				
			||||||
            user_input.displayName = Some(model.display_name);
 | 
					            user_input.displayName = model.display_name;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if base_user.first_name != model.first_name {
 | 
					        if base_user.first_name != model.first_name {
 | 
				
			||||||
            user_input.firstName = Some(model.first_name);
 | 
					            user_input.firstName = Some(model.first_name);
 | 
				
			||||||
 | 
				
			|||||||
@ -57,7 +57,7 @@ type Query {
 | 
				
			|||||||
input CreateUserInput {
 | 
					input CreateUserInput {
 | 
				
			||||||
  id: String!
 | 
					  id: String!
 | 
				
			||||||
  email: String!
 | 
					  email: String!
 | 
				
			||||||
  displayName: String
 | 
					  displayName: String!
 | 
				
			||||||
  firstName: String
 | 
					  firstName: String
 | 
				
			||||||
  lastName: String
 | 
					  lastName: String
 | 
				
			||||||
  avatar: String
 | 
					  avatar: String
 | 
				
			||||||
@ -84,7 +84,7 @@ type Success {
 | 
				
			|||||||
input UpdateUserInput {
 | 
					input UpdateUserInput {
 | 
				
			||||||
  id: String!
 | 
					  id: String!
 | 
				
			||||||
  email: String
 | 
					  email: String
 | 
				
			||||||
  displayName: String
 | 
					  displayName: String!
 | 
				
			||||||
  firstName: String
 | 
					  firstName: String
 | 
				
			||||||
  lastName: String
 | 
					  lastName: String
 | 
				
			||||||
  avatar: String
 | 
					  avatar: String
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,8 @@
 | 
				
			|||||||
use super::{
 | 
					use super::{
 | 
				
			||||||
    error::Result,
 | 
					    error::Result,
 | 
				
			||||||
    types::{
 | 
					    types::{
 | 
				
			||||||
        Group, GroupDetails, GroupId, JpegPhoto, User, UserAndGroups, UserColumn, UserId, Uuid,
 | 
					        DisplayName, Group, GroupDetails, GroupId, JpegPhoto, User, UserAndGroups, UserColumn,
 | 
				
			||||||
 | 
					        UserId, Uuid,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use async_trait::async_trait;
 | 
					use async_trait::async_trait;
 | 
				
			||||||
@ -44,7 +45,7 @@ pub struct CreateUserRequest {
 | 
				
			|||||||
    // Same fields as User, but no creation_date, and with password.
 | 
					    // Same fields as User, but no creation_date, and with password.
 | 
				
			||||||
    pub user_id: UserId,
 | 
					    pub user_id: UserId,
 | 
				
			||||||
    pub email: String,
 | 
					    pub email: String,
 | 
				
			||||||
    pub display_name: Option<String>,
 | 
					    pub display_name: DisplayName,
 | 
				
			||||||
    pub first_name: Option<String>,
 | 
					    pub first_name: Option<String>,
 | 
				
			||||||
    pub last_name: Option<String>,
 | 
					    pub last_name: Option<String>,
 | 
				
			||||||
    pub avatar: Option<JpegPhoto>,
 | 
					    pub avatar: Option<JpegPhoto>,
 | 
				
			||||||
@ -55,7 +56,7 @@ pub struct UpdateUserRequest {
 | 
				
			|||||||
    // Same fields as CreateUserRequest, but no with an extra layer of Option.
 | 
					    // Same fields as CreateUserRequest, but no with an extra layer of Option.
 | 
				
			||||||
    pub user_id: UserId,
 | 
					    pub user_id: UserId,
 | 
				
			||||||
    pub email: Option<String>,
 | 
					    pub email: Option<String>,
 | 
				
			||||||
    pub display_name: Option<String>,
 | 
					    pub display_name: DisplayName,
 | 
				
			||||||
    pub first_name: Option<String>,
 | 
					    pub first_name: Option<String>,
 | 
				
			||||||
    pub last_name: Option<String>,
 | 
					    pub last_name: Option<String>,
 | 
				
			||||||
    pub avatar: Option<JpegPhoto>,
 | 
					    pub avatar: Option<JpegPhoto>,
 | 
				
			||||||
 | 
				
			|||||||
@ -48,7 +48,7 @@ fn get_user_attribute(
 | 
				
			|||||||
                .into_bytes()
 | 
					                .into_bytes()
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
            .collect(),
 | 
					            .collect(),
 | 
				
			||||||
        "cn" | "displayname" => vec![user.display_name.clone()?.into_bytes()],
 | 
					        "cn" | "displayname" => vec![user.display_name.to_string().into_bytes()],
 | 
				
			||||||
        "createtimestamp" | "modifytimestamp" => vec![user.creation_date.to_rfc3339().into_bytes()],
 | 
					        "createtimestamp" | "modifytimestamp" => vec![user.creation_date.to_rfc3339().into_bytes()],
 | 
				
			||||||
        "1.1" => return None,
 | 
					        "1.1" => return None,
 | 
				
			||||||
        // We ignore the operational attribute wildcard.
 | 
					        // We ignore the operational attribute wildcard.
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@
 | 
				
			|||||||
use sea_orm::entity::prelude::*;
 | 
					use sea_orm::entity::prelude::*;
 | 
				
			||||||
use serde::{Deserialize, Serialize};
 | 
					use serde::{Deserialize, Serialize};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::domain::types::{JpegPhoto, UserId, Uuid};
 | 
					use crate::domain::types::{DisplayName, JpegPhoto, UserId, Uuid};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Copy, Clone, Default, Debug, DeriveEntity)]
 | 
					#[derive(Copy, Clone, Default, Debug, DeriveEntity)]
 | 
				
			||||||
pub struct Entity;
 | 
					pub struct Entity;
 | 
				
			||||||
@ -14,7 +14,7 @@ pub struct Model {
 | 
				
			|||||||
    #[sea_orm(primary_key, auto_increment = false)]
 | 
					    #[sea_orm(primary_key, auto_increment = false)]
 | 
				
			||||||
    pub user_id: UserId,
 | 
					    pub user_id: UserId,
 | 
				
			||||||
    pub email: String,
 | 
					    pub email: String,
 | 
				
			||||||
    pub display_name: Option<String>,
 | 
					    pub display_name: DisplayName,
 | 
				
			||||||
    pub first_name: Option<String>,
 | 
					    pub first_name: Option<String>,
 | 
				
			||||||
    pub last_name: Option<String>,
 | 
					    pub last_name: Option<String>,
 | 
				
			||||||
    pub avatar: Option<JpegPhoto>,
 | 
					    pub avatar: Option<JpegPhoto>,
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,7 @@ pub mod tests {
 | 
				
			|||||||
                CreateUserRequest, GroupBackendHandler, UserBackendHandler, UserRequestFilter,
 | 
					                CreateUserRequest, GroupBackendHandler, UserBackendHandler, UserRequestFilter,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            sql_tables::init_table,
 | 
					            sql_tables::init_table,
 | 
				
			||||||
            types::{GroupId, UserId},
 | 
					            types::{DisplayName, GroupId, UserId},
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        infra::configuration::ConfigurationBuilder,
 | 
					        infra::configuration::ConfigurationBuilder,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@ -86,7 +86,7 @@ pub mod tests {
 | 
				
			|||||||
            .create_user(CreateUserRequest {
 | 
					            .create_user(CreateUserRequest {
 | 
				
			||||||
                user_id: UserId::new(name),
 | 
					                user_id: UserId::new(name),
 | 
				
			||||||
                email: "bob@bob.bob".to_string(),
 | 
					                email: "bob@bob.bob".to_string(),
 | 
				
			||||||
                display_name: Some("display ".to_string() + name),
 | 
					                display_name: DisplayName::new(("display ".to_owned() + name).as_str()),
 | 
				
			||||||
                first_name: Some("first ".to_string() + name),
 | 
					                first_name: Some("first ".to_string() + name),
 | 
				
			||||||
                last_name: Some("last ".to_string() + name),
 | 
					                last_name: Some("last ".to_string() + name),
 | 
				
			||||||
                ..Default::default()
 | 
					                ..Default::default()
 | 
				
			||||||
 | 
				
			|||||||
@ -163,7 +163,7 @@ impl UserBackendHandler for SqlBackendHandler {
 | 
				
			|||||||
        let new_user = model::users::ActiveModel {
 | 
					        let new_user = model::users::ActiveModel {
 | 
				
			||||||
            user_id: Set(request.user_id),
 | 
					            user_id: Set(request.user_id),
 | 
				
			||||||
            email: Set(request.email),
 | 
					            email: Set(request.email),
 | 
				
			||||||
            display_name: to_value(&request.display_name),
 | 
					            display_name: ActiveValue::Set(request.display_name),
 | 
				
			||||||
            first_name: to_value(&request.first_name),
 | 
					            first_name: to_value(&request.first_name),
 | 
				
			||||||
            last_name: to_value(&request.last_name),
 | 
					            last_name: to_value(&request.last_name),
 | 
				
			||||||
            avatar: request.avatar.into_active_value(),
 | 
					            avatar: request.avatar.into_active_value(),
 | 
				
			||||||
@ -181,7 +181,7 @@ impl UserBackendHandler for SqlBackendHandler {
 | 
				
			|||||||
        let update_user = model::users::ActiveModel {
 | 
					        let update_user = model::users::ActiveModel {
 | 
				
			||||||
            user_id: ActiveValue::Set(request.user_id),
 | 
					            user_id: ActiveValue::Set(request.user_id),
 | 
				
			||||||
            email: request.email.map(ActiveValue::Set).unwrap_or_default(),
 | 
					            email: request.email.map(ActiveValue::Set).unwrap_or_default(),
 | 
				
			||||||
            display_name: to_value(&request.display_name),
 | 
					            display_name: ActiveValue::Set(request.display_name),
 | 
				
			||||||
            first_name: to_value(&request.first_name),
 | 
					            first_name: to_value(&request.first_name),
 | 
				
			||||||
            last_name: to_value(&request.last_name),
 | 
					            last_name: to_value(&request.last_name),
 | 
				
			||||||
            avatar: request.avatar.into_active_value(),
 | 
					            avatar: request.avatar.into_active_value(),
 | 
				
			||||||
@ -238,7 +238,7 @@ mod tests {
 | 
				
			|||||||
    use super::*;
 | 
					    use super::*;
 | 
				
			||||||
    use crate::domain::{
 | 
					    use crate::domain::{
 | 
				
			||||||
        sql_backend_handler::tests::*,
 | 
					        sql_backend_handler::tests::*,
 | 
				
			||||||
        types::{JpegPhoto, UserColumn},
 | 
					        types::{DisplayName, JpegPhoto, UserColumn},
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[tokio::test]
 | 
					    #[tokio::test]
 | 
				
			||||||
@ -407,11 +407,7 @@ mod tests {
 | 
				
			|||||||
            .map(|u| {
 | 
					            .map(|u| {
 | 
				
			||||||
                (
 | 
					                (
 | 
				
			||||||
                    u.user.user_id.to_string(),
 | 
					                    u.user.user_id.to_string(),
 | 
				
			||||||
                    u.user
 | 
					                    u.user.display_name.to_string(),
 | 
				
			||||||
                        .display_name
 | 
					 | 
				
			||||||
                        .as_deref()
 | 
					 | 
				
			||||||
                        .unwrap_or("<unknown>")
 | 
					 | 
				
			||||||
                        .to_owned(),
 | 
					 | 
				
			||||||
                    u.groups
 | 
					                    u.groups
 | 
				
			||||||
                        .unwrap_or_default()
 | 
					                        .unwrap_or_default()
 | 
				
			||||||
                        .into_iter()
 | 
					                        .into_iter()
 | 
				
			||||||
@ -567,7 +563,7 @@ mod tests {
 | 
				
			|||||||
            .update_user(UpdateUserRequest {
 | 
					            .update_user(UpdateUserRequest {
 | 
				
			||||||
                user_id: UserId::new("bob"),
 | 
					                user_id: UserId::new("bob"),
 | 
				
			||||||
                email: Some("email".to_string()),
 | 
					                email: Some("email".to_string()),
 | 
				
			||||||
                display_name: Some("display_name".to_string()),
 | 
					                display_name: DisplayName::new("display_name"),
 | 
				
			||||||
                first_name: Some("first_name".to_string()),
 | 
					                first_name: Some("first_name".to_string()),
 | 
				
			||||||
                last_name: Some("last_name".to_string()),
 | 
					                last_name: Some("last_name".to_string()),
 | 
				
			||||||
                avatar: Some(JpegPhoto::for_tests()),
 | 
					                avatar: Some(JpegPhoto::for_tests()),
 | 
				
			||||||
@ -581,7 +577,7 @@ mod tests {
 | 
				
			|||||||
            .await
 | 
					            .await
 | 
				
			||||||
            .unwrap();
 | 
					            .unwrap();
 | 
				
			||||||
        assert_eq!(user.email, "email");
 | 
					        assert_eq!(user.email, "email");
 | 
				
			||||||
        assert_eq!(user.display_name.unwrap(), "display_name");
 | 
					        assert_eq!(user.display_name.as_str(), "display_name");
 | 
				
			||||||
        assert_eq!(user.first_name.unwrap(), "first_name");
 | 
					        assert_eq!(user.first_name.unwrap(), "first_name");
 | 
				
			||||||
        assert_eq!(user.last_name.unwrap(), "last_name");
 | 
					        assert_eq!(user.last_name.unwrap(), "last_name");
 | 
				
			||||||
        assert_eq!(user.avatar, Some(JpegPhoto::for_tests()));
 | 
					        assert_eq!(user.avatar, Some(JpegPhoto::for_tests()));
 | 
				
			||||||
@ -607,7 +603,7 @@ mod tests {
 | 
				
			|||||||
            .get_user_details(&UserId::new("bob"))
 | 
					            .get_user_details(&UserId::new("bob"))
 | 
				
			||||||
            .await
 | 
					            .await
 | 
				
			||||||
            .unwrap();
 | 
					            .unwrap();
 | 
				
			||||||
        assert_eq!(user.display_name.unwrap(), "display bob");
 | 
					        assert_eq!(user.display_name.as_str(), "display bob");
 | 
				
			||||||
        assert_eq!(user.first_name.unwrap(), "first_name");
 | 
					        assert_eq!(user.first_name.unwrap(), "first_name");
 | 
				
			||||||
        assert_eq!(user.last_name, None);
 | 
					        assert_eq!(user.last_name, None);
 | 
				
			||||||
        assert_eq!(user.avatar, None);
 | 
					        assert_eq!(user.avatar, None);
 | 
				
			||||||
 | 
				
			|||||||
@ -167,6 +167,82 @@ impl ValueType for UserId {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(PartialEq, Eq, Clone, Debug, Default, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					#[serde(from = "String")]
 | 
				
			||||||
 | 
					pub struct DisplayName(String);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl DisplayName {
 | 
				
			||||||
 | 
					    pub fn new(display_name: &str) -> Self {
 | 
				
			||||||
 | 
					        Self(display_name.to_string())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn as_str(&self) -> &str {
 | 
				
			||||||
 | 
					        self.0.as_str()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn into_string(self) -> String {
 | 
				
			||||||
 | 
					        self.0
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl std::fmt::Display for DisplayName {
 | 
				
			||||||
 | 
					    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
 | 
				
			||||||
 | 
					        write!(f, "{}", self.0)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<String> for DisplayName {
 | 
				
			||||||
 | 
					    fn from(s: String) -> Self {
 | 
				
			||||||
 | 
					        Self::new(&s)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<DisplayName> for Value {
 | 
				
			||||||
 | 
					    fn from(display_name: DisplayName) -> Self {
 | 
				
			||||||
 | 
					        display_name.into_string().into()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<&DisplayName> for Value {
 | 
				
			||||||
 | 
					    fn from(display_name: &DisplayName) -> Self {
 | 
				
			||||||
 | 
					        display_name.as_str().into()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl TryGetable for DisplayName {
 | 
				
			||||||
 | 
					    fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError> {
 | 
				
			||||||
 | 
					        Ok(DisplayName::new(&String::try_get(res, pre, col)?))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl TryFromU64 for DisplayName {
 | 
				
			||||||
 | 
					    fn try_from_u64(_n: u64) -> Result<Self, DbErr> {
 | 
				
			||||||
 | 
					        Err(DbErr::ConvertFromU64(
 | 
				
			||||||
 | 
					            "DisplayName cannot be constructed from u64",
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl ValueType for DisplayName {
 | 
				
			||||||
 | 
					    fn try_from(v: Value) -> Result<Self, ValueTypeErr> {
 | 
				
			||||||
 | 
					        Ok(DisplayName::new(
 | 
				
			||||||
 | 
					            <String as ValueType>::try_from(v)?.as_str(),
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn type_name() -> String {
 | 
				
			||||||
 | 
					        "DisplayName".to_owned()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn array_type() -> ArrayType {
 | 
				
			||||||
 | 
					        ArrayType::String
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn column_type() -> ColumnType {
 | 
				
			||||||
 | 
					        ColumnType::String(Some(255))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)]
 | 
					#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)]
 | 
				
			||||||
pub struct JpegPhoto(#[serde(with = "serde_bytes")] Vec<u8>);
 | 
					pub struct JpegPhoto(#[serde(with = "serde_bytes")] Vec<u8>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -304,7 +380,7 @@ impl IntoActiveValue<JpegPhoto> for JpegPhoto {
 | 
				
			|||||||
pub struct User {
 | 
					pub struct User {
 | 
				
			||||||
    pub user_id: UserId,
 | 
					    pub user_id: UserId,
 | 
				
			||||||
    pub email: String,
 | 
					    pub email: String,
 | 
				
			||||||
    pub display_name: Option<String>,
 | 
					    pub display_name: DisplayName,
 | 
				
			||||||
    pub first_name: Option<String>,
 | 
					    pub first_name: Option<String>,
 | 
				
			||||||
    pub last_name: Option<String>,
 | 
					    pub last_name: Option<String>,
 | 
				
			||||||
    pub avatar: Option<JpegPhoto>,
 | 
					    pub avatar: Option<JpegPhoto>,
 | 
				
			||||||
@ -320,7 +396,7 @@ impl Default for User {
 | 
				
			|||||||
        User {
 | 
					        User {
 | 
				
			||||||
            user_id: UserId::default(),
 | 
					            user_id: UserId::default(),
 | 
				
			||||||
            email: String::new(),
 | 
					            email: String::new(),
 | 
				
			||||||
            display_name: None,
 | 
					            display_name: DisplayName::default(),
 | 
				
			||||||
            first_name: None,
 | 
					            first_name: None,
 | 
				
			||||||
            last_name: None,
 | 
					            last_name: None,
 | 
				
			||||||
            avatar: None,
 | 
					            avatar: None,
 | 
				
			||||||
 | 
				
			|||||||
@ -171,9 +171,7 @@ where
 | 
				
			|||||||
        Some(token) => token,
 | 
					        Some(token) => token,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    if let Err(e) = super::mail::send_password_reset_email(
 | 
					    if let Err(e) = super::mail::send_password_reset_email(
 | 
				
			||||||
        user.display_name
 | 
					        user.display_name.as_str(),
 | 
				
			||||||
            .as_deref()
 | 
					 | 
				
			||||||
            .unwrap_or_else(|| user.user_id.as_str()),
 | 
					 | 
				
			||||||
        &user.email,
 | 
					        &user.email,
 | 
				
			||||||
        &token,
 | 
					        &token,
 | 
				
			||||||
        &data.server_url,
 | 
					        &data.server_url,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
use crate::domain::{
 | 
					use crate::domain::{
 | 
				
			||||||
    handler::{BackendHandler, CreateUserRequest, UpdateGroupRequest, UpdateUserRequest},
 | 
					    handler::{BackendHandler, CreateUserRequest, UpdateGroupRequest, UpdateUserRequest},
 | 
				
			||||||
    types::{GroupId, JpegPhoto, UserId},
 | 
					    types::{DisplayName, GroupId, JpegPhoto, UserId},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use anyhow::Context as AnyhowContext;
 | 
					use anyhow::Context as AnyhowContext;
 | 
				
			||||||
use juniper::{graphql_object, FieldResult, GraphQLInputObject, GraphQLObject};
 | 
					use juniper::{graphql_object, FieldResult, GraphQLInputObject, GraphQLObject};
 | 
				
			||||||
@ -27,7 +27,7 @@ impl<Handler: BackendHandler> Mutation<Handler> {
 | 
				
			|||||||
pub struct CreateUserInput {
 | 
					pub struct CreateUserInput {
 | 
				
			||||||
    id: String,
 | 
					    id: String,
 | 
				
			||||||
    email: String,
 | 
					    email: String,
 | 
				
			||||||
    display_name: Option<String>,
 | 
					    display_name: String,
 | 
				
			||||||
    first_name: Option<String>,
 | 
					    first_name: Option<String>,
 | 
				
			||||||
    last_name: Option<String>,
 | 
					    last_name: Option<String>,
 | 
				
			||||||
    // Base64 encoded JpegPhoto.
 | 
					    // Base64 encoded JpegPhoto.
 | 
				
			||||||
@ -39,7 +39,7 @@ pub struct CreateUserInput {
 | 
				
			|||||||
pub struct UpdateUserInput {
 | 
					pub struct UpdateUserInput {
 | 
				
			||||||
    id: String,
 | 
					    id: String,
 | 
				
			||||||
    email: Option<String>,
 | 
					    email: Option<String>,
 | 
				
			||||||
    display_name: Option<String>,
 | 
					    display_name: String,
 | 
				
			||||||
    first_name: Option<String>,
 | 
					    first_name: Option<String>,
 | 
				
			||||||
    last_name: Option<String>,
 | 
					    last_name: Option<String>,
 | 
				
			||||||
    // Base64 encoded JpegPhoto.
 | 
					    // Base64 encoded JpegPhoto.
 | 
				
			||||||
@ -79,6 +79,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
 | 
				
			|||||||
            return Err("Unauthorized user creation".into());
 | 
					            return Err("Unauthorized user creation".into());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        let user_id = UserId::new(&user.id);
 | 
					        let user_id = UserId::new(&user.id);
 | 
				
			||||||
 | 
					        let display_name = DisplayName::new(&user.display_name);
 | 
				
			||||||
        let avatar = user
 | 
					        let avatar = user
 | 
				
			||||||
            .avatar
 | 
					            .avatar
 | 
				
			||||||
            .map(base64::decode)
 | 
					            .map(base64::decode)
 | 
				
			||||||
@ -92,7 +93,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
 | 
				
			|||||||
            .create_user(CreateUserRequest {
 | 
					            .create_user(CreateUserRequest {
 | 
				
			||||||
                user_id: user_id.clone(),
 | 
					                user_id: user_id.clone(),
 | 
				
			||||||
                email: user.email,
 | 
					                email: user.email,
 | 
				
			||||||
                display_name: user.display_name,
 | 
					                display_name: display_name.clone(),
 | 
				
			||||||
                first_name: user.first_name,
 | 
					                first_name: user.first_name,
 | 
				
			||||||
                last_name: user.last_name,
 | 
					                last_name: user.last_name,
 | 
				
			||||||
                avatar,
 | 
					                avatar,
 | 
				
			||||||
@ -137,6 +138,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
 | 
				
			|||||||
            debug!(?user.id);
 | 
					            debug!(?user.id);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        let user_id = UserId::new(&user.id);
 | 
					        let user_id = UserId::new(&user.id);
 | 
				
			||||||
 | 
					        let display_name = DisplayName::new(&user.display_name);
 | 
				
			||||||
        if !context.validation_result.can_write(&user_id) {
 | 
					        if !context.validation_result.can_write(&user_id) {
 | 
				
			||||||
            span.in_scope(|| debug!("Unauthorized"));
 | 
					            span.in_scope(|| debug!("Unauthorized"));
 | 
				
			||||||
            return Err("Unauthorized user update".into());
 | 
					            return Err("Unauthorized user update".into());
 | 
				
			||||||
@ -154,7 +156,7 @@ impl<Handler: BackendHandler + Sync> Mutation<Handler> {
 | 
				
			|||||||
            .update_user(UpdateUserRequest {
 | 
					            .update_user(UpdateUserRequest {
 | 
				
			||||||
                user_id,
 | 
					                user_id,
 | 
				
			||||||
                email: user.email,
 | 
					                email: user.email,
 | 
				
			||||||
                display_name: user.display_name,
 | 
					                display_name: display_name.clone(),
 | 
				
			||||||
                first_name: user.first_name,
 | 
					                first_name: user.first_name,
 | 
				
			||||||
                last_name: user.last_name,
 | 
					                last_name: user.last_name,
 | 
				
			||||||
                avatar,
 | 
					                avatar,
 | 
				
			||||||
 | 
				
			|||||||
@ -214,7 +214,7 @@ impl<Handler: BackendHandler + Sync> User<Handler> {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn display_name(&self) -> &str {
 | 
					    fn display_name(&self) -> &str {
 | 
				
			||||||
        self.user.display_name.as_deref().unwrap_or("")
 | 
					        self.user.display_name.as_str()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn first_name(&self) -> &str {
 | 
					    fn first_name(&self) -> &str {
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ use crate::{
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        opaque_handler::OpaqueHandler,
 | 
					        opaque_handler::OpaqueHandler,
 | 
				
			||||||
        types::{JpegPhoto, UserId},
 | 
					        types::{DisplayName, JpegPhoto, UserId},
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    infra::auth_service::{Permission, ValidationResults},
 | 
					    infra::auth_service::{Permission, ValidationResults},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -460,6 +460,8 @@ impl<Backend: BackendHandler + LoginHandler + OpaqueHandler> LdapHandler<Backend
 | 
				
			|||||||
            &self.ldap_info.base_dn,
 | 
					            &self.ldap_info.base_dn,
 | 
				
			||||||
            &self.ldap_info.base_dn_str,
 | 
					            &self.ldap_info.base_dn_str,
 | 
				
			||||||
        )?;
 | 
					        )?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
        fn parse_attribute(mut attr: LdapPartialAttribute) -> LdapResult<(String, Vec<u8>)> {
 | 
					        fn parse_attribute(mut attr: LdapPartialAttribute) -> LdapResult<(String, Vec<u8>)> {
 | 
				
			||||||
            if attr.vals.len() > 1 {
 | 
					            if attr.vals.len() > 1 {
 | 
				
			||||||
                Err(LdapError {
 | 
					                Err(LdapError {
 | 
				
			||||||
@ -506,7 +508,12 @@ impl<Backend: BackendHandler + LoginHandler + OpaqueHandler> LdapHandler<Backend
 | 
				
			|||||||
                    .or_else(|| get_attribute("email"))
 | 
					                    .or_else(|| get_attribute("email"))
 | 
				
			||||||
                    .transpose()?
 | 
					                    .transpose()?
 | 
				
			||||||
                    .unwrap_or_default(),
 | 
					                    .unwrap_or_default(),
 | 
				
			||||||
                display_name: get_attribute("cn").transpose()?,
 | 
					                display_name: DisplayName::new(
 | 
				
			||||||
 | 
					                    get_attribute("cn")
 | 
				
			||||||
 | 
					                        .transpose()?
 | 
				
			||||||
 | 
					                        .unwrap_or_default()
 | 
				
			||||||
 | 
					                        .as_str(),
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
                first_name: get_attribute("givenname").transpose()?,
 | 
					                first_name: get_attribute("givenname").transpose()?,
 | 
				
			||||||
                last_name: get_attribute("sn").transpose()?,
 | 
					                last_name: get_attribute("sn").transpose()?,
 | 
				
			||||||
                avatar: attributes
 | 
					                avatar: attributes
 | 
				
			||||||
@ -989,7 +996,7 @@ mod tests {
 | 
				
			|||||||
                    user: User {
 | 
					                    user: User {
 | 
				
			||||||
                        user_id: UserId::new("bob_1"),
 | 
					                        user_id: UserId::new("bob_1"),
 | 
				
			||||||
                        email: "bob@bobmail.bob".to_string(),
 | 
					                        email: "bob@bobmail.bob".to_string(),
 | 
				
			||||||
                        display_name: Some("Bôb Böbberson".to_string()),
 | 
					                        display_name: DisplayName::new("Bôb Böbberson"),
 | 
				
			||||||
                        first_name: Some("Bôb".to_string()),
 | 
					                        first_name: Some("Bôb".to_string()),
 | 
				
			||||||
                        last_name: Some("Böbberson".to_string()),
 | 
					                        last_name: Some("Böbberson".to_string()),
 | 
				
			||||||
                        uuid: uuid!("698e1d5f-7a40-3151-8745-b9b8a37839da"),
 | 
					                        uuid: uuid!("698e1d5f-7a40-3151-8745-b9b8a37839da"),
 | 
				
			||||||
@ -1001,7 +1008,7 @@ mod tests {
 | 
				
			|||||||
                    user: User {
 | 
					                    user: User {
 | 
				
			||||||
                        user_id: UserId::new("jim"),
 | 
					                        user_id: UserId::new("jim"),
 | 
				
			||||||
                        email: "jim@cricket.jim".to_string(),
 | 
					                        email: "jim@cricket.jim".to_string(),
 | 
				
			||||||
                        display_name: Some("Jimminy Cricket".to_string()),
 | 
					                        display_name: DisplayName::new("Jimminy Cricket"),
 | 
				
			||||||
                        first_name: Some("Jim".to_string()),
 | 
					                        first_name: Some("Jim".to_string()),
 | 
				
			||||||
                        last_name: Some("Cricket".to_string()),
 | 
					                        last_name: Some("Cricket".to_string()),
 | 
				
			||||||
                        avatar: Some(JpegPhoto::for_tests()),
 | 
					                        avatar: Some(JpegPhoto::for_tests()),
 | 
				
			||||||
@ -1540,7 +1547,7 @@ mod tests {
 | 
				
			|||||||
                user: User {
 | 
					                user: User {
 | 
				
			||||||
                    user_id: UserId::new("bob_1"),
 | 
					                    user_id: UserId::new("bob_1"),
 | 
				
			||||||
                    email: "bob@bobmail.bob".to_string(),
 | 
					                    email: "bob@bobmail.bob".to_string(),
 | 
				
			||||||
                    display_name: Some("Bôb Böbberson".to_string()),
 | 
					                    display_name: DisplayName::new("Bôb Böbberson"),
 | 
				
			||||||
                    first_name: Some("Bôb".to_string()),
 | 
					                    first_name: Some("Bôb".to_string()),
 | 
				
			||||||
                    last_name: Some("Böbberson".to_string()),
 | 
					                    last_name: Some("Böbberson".to_string()),
 | 
				
			||||||
                    ..Default::default()
 | 
					                    ..Default::default()
 | 
				
			||||||
@ -1614,7 +1621,7 @@ mod tests {
 | 
				
			|||||||
                user: User {
 | 
					                user: User {
 | 
				
			||||||
                    user_id: UserId::new("bob_1"),
 | 
					                    user_id: UserId::new("bob_1"),
 | 
				
			||||||
                    email: "bob@bobmail.bob".to_string(),
 | 
					                    email: "bob@bobmail.bob".to_string(),
 | 
				
			||||||
                    display_name: Some("Bôb Böbberson".to_string()),
 | 
					                    display_name: DisplayName::new("Bôb Böbberson"),
 | 
				
			||||||
                    last_name: Some("Böbberson".to_string()),
 | 
					                    last_name: Some("Böbberson".to_string()),
 | 
				
			||||||
                    avatar: Some(JpegPhoto::for_tests()),
 | 
					                    avatar: Some(JpegPhoto::for_tests()),
 | 
				
			||||||
                    uuid: uuid!("b4ac75e0-2900-3e21-926c-2f732c26b3fc"),
 | 
					                    uuid: uuid!("b4ac75e0-2900-3e21-926c-2f732c26b3fc"),
 | 
				
			||||||
@ -2041,7 +2048,7 @@ mod tests {
 | 
				
			|||||||
            .with(eq(CreateUserRequest {
 | 
					            .with(eq(CreateUserRequest {
 | 
				
			||||||
                user_id: UserId::new("bob"),
 | 
					                user_id: UserId::new("bob"),
 | 
				
			||||||
                email: "".to_owned(),
 | 
					                email: "".to_owned(),
 | 
				
			||||||
                display_name: Some("Bob".to_string()),
 | 
					                display_name: DisplayName::new("Bob"),
 | 
				
			||||||
                ..Default::default()
 | 
					                ..Default::default()
 | 
				
			||||||
            }))
 | 
					            }))
 | 
				
			||||||
            .times(1)
 | 
					            .times(1)
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ use crate::{
 | 
				
			|||||||
        handler::{CreateUserRequest, GroupBackendHandler, GroupRequestFilter, UserBackendHandler},
 | 
					        handler::{CreateUserRequest, GroupBackendHandler, GroupRequestFilter, UserBackendHandler},
 | 
				
			||||||
        sql_backend_handler::SqlBackendHandler,
 | 
					        sql_backend_handler::SqlBackendHandler,
 | 
				
			||||||
        sql_opaque_handler::register_password,
 | 
					        sql_opaque_handler::register_password,
 | 
				
			||||||
 | 
					        types::DisplayName,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    infra::{cli::*, configuration::Configuration, db_cleaner::Scheduler, healthcheck, mail},
 | 
					    infra::{cli::*, configuration::Configuration, db_cleaner::Scheduler, healthcheck, mail},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -33,7 +34,7 @@ async fn create_admin_user(handler: &SqlBackendHandler, config: &Configuration)
 | 
				
			|||||||
        .create_user(CreateUserRequest {
 | 
					        .create_user(CreateUserRequest {
 | 
				
			||||||
            user_id: config.ldap_user_dn.clone(),
 | 
					            user_id: config.ldap_user_dn.clone(),
 | 
				
			||||||
            email: config.ldap_user_email.clone(),
 | 
					            email: config.ldap_user_email.clone(),
 | 
				
			||||||
            display_name: Some("Administrator".to_string()),
 | 
					            display_name: DisplayName::new("Administrator"),
 | 
				
			||||||
            ..Default::default()
 | 
					            ..Default::default()
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        .and_then(|_| register_password(handler, &config.ldap_user_dn, &config.ldap_user_pass))
 | 
					        .and_then(|_| register_password(handler, &config.ldap_user_dn, &config.ldap_user_pass))
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user