kanidm_client/
domain.rs

1use crate::{ClientError, KanidmClient};
2use kanidm_proto::constants::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    /// Add or update the domain logo/image
21    pub async fn idm_domain_update_image(&self, image: ImageValue) -> Result<(), ClientError> {
22        let file_content_type = image.filetype.as_content_type_str();
23
24        let file_data = match multipart::Part::bytes(image.contents.clone())
25            .file_name(image.filename)
26            .mime_str(file_content_type)
27        {
28            Ok(part) => part,
29            Err(err) => {
30                error!(
31                    "Failed to generate multipart body from image data: {:}",
32                    err
33                );
34                return Err(ClientError::SystemError);
35            }
36        };
37
38        let form = multipart::Form::new().part("image", file_data);
39
40        // send it
41        let response = self
42            .client
43            .post(self.make_url("/v1/domain/_image"))
44            .multipart(form);
45
46        let response = {
47            let tguard = self.bearer_token.read().await;
48            if let Some(token) = &(*tguard) {
49                response.bearer_auth(token)
50            } else {
51                response
52            }
53        };
54        let response = response
55            .send()
56            .await
57            .map_err(|err| self.handle_response_error(err))?;
58        self.expect_version(&response).await;
59
60        let opid = self.get_kopid_from_response(&response);
61
62        match response.status() {
63            reqwest::StatusCode::OK => {}
64            unexpect => {
65                return Err(ClientError::Http(
66                    unexpect,
67                    response.json().await.ok(),
68                    opid,
69                ))
70            }
71        }
72        response
73            .json()
74            .await
75            .map_err(|e| ClientError::JsonDecode(e, opid))
76    }
77}