reopenconnect/protocol/cac/authc/authenticator/
run_init.rs1use std::convert::TryFrom;
2
3use ::hyper::header::HeaderValue;
4
5use crate::protocol::cac::authc::client_pdu;
6use crate::protocol::cac::authc::server_pdu::AuthConfigServerPDU;
7use crate::util::HttpHeaders;
8
9use super::*;
10
11impl<IO, Ctx> Authenticator<IO, Ctx>
12where
13 IO: HttpIo,
14 Ctx: BorrowMutAuthenticatorContext,
15{
16 pub(super) async fn run_init(
17 &mut self,
18 ) -> Result<(HttpHeaders, AuthConfigServerPDU), AuthenticatorError> {
19 let context = self.context.borrow_mut();
20
21 let http_host = context.http_host().await.map_err(ContextInvocationError)?;
22
23 let method = HttpMethod::POST;
24 let path = "/";
25
26 let mut headers = HttpHeaders::new();
27
28 headers.append(
29 "Host",
30 HeaderValue::from_str(&http_host).map_err(HttpError::HeaderValue)?,
31 );
32 headers.append(
33 "Connection",
34 HeaderValue::from_str("Keep-Alive").map_err(HttpError::HeaderValue)?,
35 );
36 headers.append(
37 "Accept",
38 HeaderValue::from_str("*/*").map_err(HttpError::HeaderValue)?,
39 );
40 headers.append(
41 "Accept-Encoding",
42 HeaderValue::from_str("identity").map_err(HttpError::HeaderValue)?,
43 );
44 headers.append(
45 "Content-Type",
46 HeaderValue::from_str("application/x-www-form-urlencoded")
47 .map_err(HttpError::HeaderValue)?,
48 );
49
50 let () = context
51 .patch_http_headers(AuthenticationPhase::Init, &mut headers)
52 .await
53 .map_err(ContextInvocationError)?;
54
55 let mut version = client_pdu::common::Version::new("0.1");
56 let () = context
57 .patch_version(AuthenticationPhase::Init, &mut version)
58 .await
59 .map_err(ContextInvocationError)?;
60
61 let mut device_id = client_pdu::common::DeviceID::new("turing-machine");
62 let () = context
63 .patch_device_id(AuthenticationPhase::Init, &mut device_id)
64 .await
65 .map_err(ContextInvocationError)?;
66
67 let mut group_access =
68 client_pdu::common::GroupAccess::new(format!("https://{}", http_host));
69 let () = context
70 .group_access(AuthenticationPhase::Init, &mut group_access)
71 .await
72 .map_err(ContextInvocationError)?;
73
74 let mut init_rq = client_pdu::AuthConfigInit {
75 extra_attrs: Default::default(),
76 version,
77 device_id,
78 group_access,
79 extra_children: Default::default(),
80 };
81 let () = context
82 .patch_init_rq(&mut init_rq)
83 .await
84 .map_err(ContextInvocationError)?;
85
86 log::trace!("Rq\n{:?}\n{:#?}\n{:#?}", method, headers, init_rq);
87
88 let http_request = self.create_request(method, path, headers, Some(init_rq))?;
89 let http_response = self.process_request(http_request).await?;
90
91 let http_status = http_response.status();
92 let http_headers = http_response.headers().to_owned();
93
94 log::trace!("response-status: {:?}", http_status);
95 log::trace!("response-headers: {:#?}", http_headers);
96
97 let body_xml = self
98 .collect_body_xml(http_status, http_response.into_body())
99 .await?;
100
101 let server_pdu =
102 AuthConfigServerPDU::try_from(body_xml).map_err(AuthenticatorError::CACProtocol)?;
103
104 Ok((http_headers, server_pdu))
105 }
106}