Skip to main content

kanidm_client/
domain.rs

1use crate::{ClientError, KanidmClient};
2use kanidm_proto::constants::{ATTR_DOMAIN_ALLOW_ACCOUNT_RECOVERY, ATTR_DOMAIN_ALLOW_EASTER_EGGS};
3use kanidm_proto::internal::ImageValue;
4use reqwest::multipart;
5
6impl KanidmClient {
7    /// Clear the current domain logo/image
8    pub async fn idm_domain_delete_image(&self) -> Result<(), ClientError> {
9        self.perform_delete_request("/v1/domain/_image").await
10    }
11
12    pub async fn idm_set_domain_allow_easter_eggs(&self, enable: bool) -> Result<(), ClientError> {
13        self.perform_put_request(
14            &format!("/v1/domain/_attr/{}", ATTR_DOMAIN_ALLOW_EASTER_EGGS),
15            vec![enable.to_string()],
16        )
17        .await
18    }
19
20    pub async fn idm_set_domain_allow_account_recovery(
21        &self,
22        enable: bool,
23    ) -> Result<(), ClientError> {
24        self.perform_put_request(
25            &format!("/v1/domain/_attr/{}", ATTR_DOMAIN_ALLOW_ACCOUNT_RECOVERY),
26            vec![enable.to_string()],
27        )
28        .await
29    }
30
31    /// Add or update the domain logo/image
32    pub async fn idm_domain_update_image(&self, image: ImageValue) -> Result<(), ClientError> {
33        let file_content_type = image.filetype.as_content_type_str();
34
35        let file_data = match multipart::Part::bytes(image.contents.clone())
36            .file_name(image.filename)
37            .mime_str(file_content_type)
38        {
39            Ok(part) => part,
40            Err(err) => {
41                error!(
42                    "Failed to generate multipart body from image data: {:}",
43                    err
44                );
45                return Err(ClientError::SystemError);
46            }
47        };
48
49        let form = multipart::Form::new().part("image", file_data);
50
51        // send it
52        let response = self
53            .client
54            .post(self.make_url("/v1/domain/_image"))
55            .multipart(form);
56
57        let response = {
58            let tguard = self.bearer_token.read().await;
59            if let Some(token) = &(*tguard) {
60                response.bearer_auth(token)
61            } else {
62                response
63            }
64        };
65        let response = response
66            .send()
67            .await
68            .map_err(|err| self.handle_response_error(err))?;
69        self.expect_version(&response).await;
70
71        let opid = self.get_kopid_from_response(&response);
72
73        self.ok_or_clienterror(&opid, response)
74            .await?
75            .json()
76            .await
77            .map_err(|e| ClientError::JsonDecode(e, opid))
78    }
79}