use new 'id_property' for user::User and use it in api calls
this allows us to return a user::User (or Vec<> of it) instead of a generic serde value Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
		
				
					committed by
					
						
						Dietmar Maurer
					
				
			
			
				
	
			
			
			
						parent
						
							16c75c580b
						
					
				
				
					commit
					522c0da0a0
				
			@ -22,37 +22,8 @@ pub const PBS_PASSWORD_SCHEMA: Schema = StringSchema::new("User Password.")
 | 
				
			|||||||
        description: "List users (with config digest).",
 | 
					        description: "List users (with config digest).",
 | 
				
			||||||
        type: Array,
 | 
					        type: Array,
 | 
				
			||||||
        items: {
 | 
					        items: {
 | 
				
			||||||
            type: Object,
 | 
					            type: user::User,
 | 
				
			||||||
            description: "User configuration (without password).",
 | 
					            description: "User configuration (without password).",
 | 
				
			||||||
            properties: {
 | 
					 | 
				
			||||||
                userid: {
 | 
					 | 
				
			||||||
                    schema: PROXMOX_USER_ID_SCHEMA,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                comment: {
 | 
					 | 
				
			||||||
                    schema: SINGLE_LINE_COMMENT_SCHEMA,
 | 
					 | 
				
			||||||
                    optional: true,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                enable: {
 | 
					 | 
				
			||||||
                    schema: user::ENABLE_USER_SCHEMA,
 | 
					 | 
				
			||||||
                    optional: true,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                expire: {
 | 
					 | 
				
			||||||
                    schema: user::EXPIRE_USER_SCHEMA,
 | 
					 | 
				
			||||||
                    optional: true,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                firstname: {
 | 
					 | 
				
			||||||
                    schema: user::FIRST_NAME_SCHEMA,
 | 
					 | 
				
			||||||
                    optional: true,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                lastname: {
 | 
					 | 
				
			||||||
                    schema: user::LAST_NAME_SCHEMA,
 | 
					 | 
				
			||||||
                    optional: true,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                email: {
 | 
					 | 
				
			||||||
                    schema: user::EMAIL_SCHEMA,
 | 
					 | 
				
			||||||
                    optional: true,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    access: {
 | 
					    access: {
 | 
				
			||||||
@ -63,14 +34,16 @@ pub const PBS_PASSWORD_SCHEMA: Schema = StringSchema::new("User Password.")
 | 
				
			|||||||
pub fn list_users(
 | 
					pub fn list_users(
 | 
				
			||||||
    _param: Value,
 | 
					    _param: Value,
 | 
				
			||||||
    _info: &ApiMethod,
 | 
					    _info: &ApiMethod,
 | 
				
			||||||
    _rpcenv: &mut dyn RpcEnvironment,
 | 
					    mut rpcenv: &mut dyn RpcEnvironment,
 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					) -> Result<Vec<user::User>, Error> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let (config, digest) = user::config()?;
 | 
					    let (config, digest) = user::config()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let value = config.convert_to_array("userid", Some(&digest), &[]);
 | 
					    let list = config.convert_to_typed_array("user")?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(value.into())
 | 
					    rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ok(list)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[api(
 | 
					#[api(
 | 
				
			||||||
@ -119,7 +92,9 @@ pub fn create_user(userid: String, password: Option<String>, param: Value) -> Re
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    let _lock = crate::tools::open_file_locked(user::USER_CFG_LOCKFILE, std::time::Duration::new(10, 0))?;
 | 
					    let _lock = crate::tools::open_file_locked(user::USER_CFG_LOCKFILE, std::time::Duration::new(10, 0))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let user: user::User = serde_json::from_value(param.clone())?;
 | 
					    let mut data = param.clone();
 | 
				
			||||||
 | 
					    data["userid"] = Value::from(userid.clone());
 | 
				
			||||||
 | 
					    let user: user::User = serde_json::from_value(data)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let (mut config, _digest) = user::config()?;
 | 
					    let (mut config, _digest) = user::config()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -158,12 +133,11 @@ pub fn create_user(userid: String, password: Option<String>, param: Value) -> Re
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
)]
 | 
					)]
 | 
				
			||||||
/// Read user configuration data.
 | 
					/// Read user configuration data.
 | 
				
			||||||
pub fn read_user(userid: String) -> Result<Value, Error> {
 | 
					pub fn read_user(userid: String, mut rpcenv: &mut dyn RpcEnvironment) -> Result<user::User, Error> {
 | 
				
			||||||
    let (config, digest) = user::config()?;
 | 
					    let (config, digest) = user::config()?;
 | 
				
			||||||
    let mut data = config.lookup_json("user", &userid)?;
 | 
					    let user = config.lookup("user", &userid)?;
 | 
				
			||||||
    data.as_object_mut().unwrap()
 | 
					    rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into();
 | 
				
			||||||
        .insert("digest".into(), proxmox::tools::digest_to_hex(&digest).into());
 | 
					    Ok(user)
 | 
				
			||||||
    Ok(data)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[api(
 | 
					#[api(
 | 
				
			||||||
 | 
				
			|||||||
@ -56,6 +56,9 @@ pub const EMAIL_SCHEMA: Schema = StringSchema::new("E-Mail Address.")
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#[api(
 | 
					#[api(
 | 
				
			||||||
    properties: {
 | 
					    properties: {
 | 
				
			||||||
 | 
					        userid: {
 | 
				
			||||||
 | 
					            schema: PROXMOX_USER_ID_SCHEMA,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        comment: {
 | 
					        comment: {
 | 
				
			||||||
            optional: true,
 | 
					            optional: true,
 | 
				
			||||||
            schema: SINGLE_LINE_COMMENT_SCHEMA,
 | 
					            schema: SINGLE_LINE_COMMENT_SCHEMA,
 | 
				
			||||||
@ -85,6 +88,7 @@ pub const EMAIL_SCHEMA: Schema = StringSchema::new("E-Mail Address.")
 | 
				
			|||||||
#[derive(Serialize,Deserialize)]
 | 
					#[derive(Serialize,Deserialize)]
 | 
				
			||||||
/// User properties.
 | 
					/// User properties.
 | 
				
			||||||
pub struct User {
 | 
					pub struct User {
 | 
				
			||||||
 | 
					    pub userid: String,
 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
    pub comment: Option<String>,
 | 
					    pub comment: Option<String>,
 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
@ -105,7 +109,7 @@ fn init() -> SectionConfig {
 | 
				
			|||||||
        _ => unreachable!(),
 | 
					        _ => unreachable!(),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let plugin = SectionConfigPlugin::new("user".to_string(), None, obj_schema);
 | 
					    let plugin = SectionConfigPlugin::new("user".to_string(), Some("userid".to_string()), obj_schema);
 | 
				
			||||||
    let mut config = SectionConfig::new(&PROXMOX_USER_ID_SCHEMA);
 | 
					    let mut config = SectionConfig::new(&PROXMOX_USER_ID_SCHEMA);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    config.register_plugin(plugin);
 | 
					    config.register_plugin(plugin);
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user