api: access: domains: add BasicRealmInfo struct and use it

to have better type safety and as preparation for adding more types

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2021-07-09 13:43:56 +02:00 committed by Thomas Lamprecht
parent be3a0295b6
commit 0c27d880b0

View File

@ -2,33 +2,61 @@
use anyhow::{Error}; use anyhow::{Error};
use serde::{Deserialize, Serialize};
use serde_json::{json, Value}; use serde_json::{json, Value};
use proxmox::api::{api, Permission}; use proxmox::api::{api, Permission, Router, RpcEnvironment};
use proxmox::api::router::Router;
use crate::api2::types::*; use crate::api2::types::*;
#[api]
#[derive(Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
/// type of the realm
pub enum RealmType {
/// The PAM realm
Pam,
/// The PBS realm
Pbs,
/// An OpenID Connect realm
OpenId,
}
#[api(
properties: {
realm: {
schema: REALM_ID_SCHEMA,
},
"type": {
type: RealmType,
},
comment: {
optional: true,
schema: SINGLE_LINE_COMMENT_SCHEMA,
},
},
)]
#[derive(Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
/// Basic Information about a realm
pub struct BasicRealmInfo {
pub realm: String,
#[serde(rename = "type")]
pub ty: RealmType,
/// True if it is the default realm
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
}
#[api( #[api(
returns: { returns: {
description: "List of realms.", description: "List of realms with basic info.",
type: Array, type: Array,
items: { items: {
type: Object, type: BasicRealmInfo,
description: "User configuration (without password).",
properties: {
realm: {
schema: REALM_ID_SCHEMA,
},
comment: {
schema: SINGLE_LINE_COMMENT_SCHEMA,
optional: true,
},
default: {
description: "Default realm.",
type: bool,
}
},
} }
}, },
access: { access: {
@ -37,29 +65,32 @@ use crate::api2::types::*;
} }
)] )]
/// Authentication domain/realm index. /// Authentication domain/realm index.
fn list_domains() -> Result<Value, Error> { fn list_domains(mut rpcenv: &mut dyn RpcEnvironment) -> Result<Vec<BasicRealmInfo>, Error> {
let mut list = Vec::new(); let mut list = Vec::new();
list.push(json!({ "realm": "pam", "comment": "Linux PAM standard authentication", "default": true })); list.push(serde_json::from_value(json!({
list.push(json!({ "realm": "pbs", "comment": "Proxmox Backup authentication server" })); "realm": "pam",
"type": "pam",
"comment": "Linux PAM standard authentication",
"default": Some(true),
}))?);
list.push(serde_json::from_value(json!({
"realm": "pbs",
"type": "pbs",
"comment": "Proxmox Backup authentication server",
}))?);
let (config, _digest) = crate::config::domains::config()?; let (config, digest) = config::domains::config()?;
for (realm, (section_type, v)) in config.sections.iter() {
let mut item = json!({
"type": section_type,
"realm": realm,
});
if v["comment"].as_str().is_some() {
item["comment"] = v["comment"].clone();
}
list.push(item);
for (_, (section_type, v)) in config.sections.iter() {
let mut entry = v.clone();
entry["type"] = Value::from(section_type.clone());
list.push(serde_json::from_value(entry)?);
} }
Ok(list.into()) rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into();
Ok(list)
} }
pub const ROUTER: Router = Router::new() pub const ROUTER: Router = Router::new()