reopenconnect/protocol/cac/authc/authenticator/
run_init.rs

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