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 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 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 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}