Skip to content

Commit 89b28ac

Browse files
author
Isaiah Becker-Mayer
committed
Merge branch 'feat/deactivate-all' into feat/dynamic-resize
2 parents d2e315e + 1de1666 commit 89b28ac

File tree

4 files changed

+84
-118
lines changed

4 files changed

+84
-118
lines changed

crates/ironrdp-acceptor/src/lib.rs

+4-46
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#[macro_use]
22
extern crate tracing;
33

4-
use ironrdp_async::{Framed, FramedRead, FramedWrite, StreamWrapper};
5-
use ironrdp_connector::{custom_err, ConnectorResult, Sequence, Written};
4+
use ironrdp_async::{single_sequence_step, Framed, FramedRead, FramedWrite, StreamWrapper};
5+
use ironrdp_connector::ConnectorResult;
66
use ironrdp_pdu::write_buf::WriteBuf;
77

88
mod channel_connection;
@@ -41,7 +41,7 @@ where
4141
return Ok(result);
4242
}
4343

44-
single_accept_state(&mut framed, acceptor, &mut buf).await?;
44+
single_sequence_step(&mut framed, acceptor, &mut buf).await?;
4545
}
4646
}
4747

@@ -59,48 +59,6 @@ where
5959
return Ok((framed, result));
6060
}
6161

62-
single_accept_state(&mut framed, acceptor, &mut buf).await?;
62+
single_sequence_step(&mut framed, acceptor, &mut buf).await?;
6363
}
6464
}
65-
66-
async fn single_accept_state<S>(
67-
framed: &mut Framed<S>,
68-
acceptor: &mut Acceptor,
69-
buf: &mut WriteBuf,
70-
) -> ConnectorResult<Written>
71-
where
72-
S: FramedRead + FramedWrite,
73-
{
74-
buf.clear();
75-
76-
let written = if let Some(next_pdu_hint) = acceptor.next_pdu_hint() {
77-
debug!(
78-
acceptor.state = acceptor.state().name(),
79-
hint = ?next_pdu_hint,
80-
"Wait for PDU"
81-
);
82-
83-
let pdu = framed
84-
.read_by_hint(next_pdu_hint)
85-
.await
86-
.map_err(|e| custom_err!("read frame by hint", e))?;
87-
88-
trace!(length = pdu.len(), "PDU received");
89-
90-
acceptor.step(&pdu, buf)?
91-
} else {
92-
acceptor.step_no_input(buf)?
93-
};
94-
95-
if let Some(response_len) = written.size() {
96-
debug_assert_eq!(buf.filled_len(), response_len);
97-
let response = buf.filled();
98-
trace!(response_len, "Send response");
99-
framed
100-
.write_all(response)
101-
.await
102-
.map_err(|e| custom_err!("write all", e))?;
103-
}
104-
105-
Ok(written)
106-
}

crates/ironrdp-async/src/connector.rs

+5-69
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ use ironrdp_connector::credssp::{CredsspProcessGenerator, CredsspSequence, Kerbe
22
use ironrdp_connector::sspi::credssp::ClientState;
33
use ironrdp_connector::sspi::generator::GeneratorState;
44
use ironrdp_connector::{
5-
custom_err, ClientConnector, ClientConnectorState, ConnectionResult, ConnectorError, ConnectorResult, Sequence,
6-
ServerName, State as _, Written,
5+
custom_err, ClientConnector, ClientConnectorState, ConnectionResult, ConnectorError, ConnectorResult, ServerName,
6+
State as _,
77
};
88
use ironrdp_pdu::write_buf::WriteBuf;
99

1010
use crate::framed::{Framed, FramedRead, FramedWrite};
11-
use crate::AsyncNetworkClient;
11+
use crate::{single_sequence_step, AsyncNetworkClient};
1212

1313
#[non_exhaustive]
1414
pub struct ShouldUpgrade;
@@ -23,7 +23,7 @@ where
2323
info!("Begin connection procedure");
2424

2525
while !connector.should_perform_security_upgrade() {
26-
single_connect_step(framed, connector, &mut buf).await?;
26+
single_sequence_step(framed, connector, &mut buf).await?;
2727
}
2828

2929
Ok(ShouldUpgrade)
@@ -73,7 +73,7 @@ where
7373
}
7474

7575
let result = loop {
76-
single_connect_step(framed, &mut connector, &mut buf).await?;
76+
single_sequence_step(framed, &mut connector, &mut buf).await?;
7777

7878
if let ClientConnectorState::Connected { result } = connector.state {
7979
break result;
@@ -177,67 +177,3 @@ where
177177

178178
Ok(())
179179
}
180-
181-
pub async fn single_connect_step<S>(
182-
framed: &mut Framed<S>,
183-
connector: &mut ClientConnector,
184-
buf: &mut WriteBuf,
185-
) -> ConnectorResult<()>
186-
where
187-
S: FramedWrite + FramedRead,
188-
{
189-
buf.clear();
190-
let written = single_connect_step_read(framed, connector, buf).await?;
191-
single_connect_step_write(framed, buf, written).await
192-
}
193-
194-
pub async fn single_connect_step_read<S>(
195-
framed: &mut Framed<S>,
196-
connector: &mut dyn Sequence,
197-
buf: &mut WriteBuf,
198-
) -> ConnectorResult<Written>
199-
where
200-
S: FramedRead,
201-
{
202-
buf.clear();
203-
204-
if let Some(next_pdu_hint) = connector.next_pdu_hint() {
205-
debug!(
206-
connector.state = connector.state().name(),
207-
hint = ?next_pdu_hint,
208-
"Wait for PDU"
209-
);
210-
211-
let pdu = framed
212-
.read_by_hint(next_pdu_hint)
213-
.await
214-
.map_err(|e| ironrdp_connector::custom_err!("read frame by hint", e))?;
215-
216-
trace!(length = pdu.len(), "PDU received");
217-
218-
connector.step(&pdu, buf)
219-
} else {
220-
connector.step_no_input(buf)
221-
}
222-
}
223-
224-
async fn single_connect_step_write<S>(
225-
framed: &mut Framed<S>,
226-
buf: &mut WriteBuf,
227-
written: Written,
228-
) -> ConnectorResult<()>
229-
where
230-
S: FramedWrite,
231-
{
232-
if let Some(response_len) = written.size() {
233-
debug_assert_eq!(buf.filled_len(), response_len);
234-
let response = buf.filled();
235-
trace!(response_len, "Send response");
236-
framed
237-
.write_all(response)
238-
.await
239-
.map_err(|e| ironrdp_connector::custom_err!("write all", e))?;
240-
}
241-
242-
Ok(())
243-
}

crates/ironrdp-async/src/framed.rs

+66-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use std::io;
22

33
use bytes::{Bytes, BytesMut};
4-
use ironrdp_pdu::PduHint;
4+
use ironrdp_connector::{ConnectorResult, Sequence, Written};
5+
use ironrdp_pdu::{write_buf::WriteBuf, PduHint};
56

67
// TODO: investigate if we could use static async fn / return position impl trait in traits when stabilized:
78
// https://github.com/rust-lang/rust/issues/91611
@@ -213,3 +214,67 @@ where
213214
self.stream.write_all(buf).await
214215
}
215216
}
217+
218+
pub async fn single_sequence_step<S>(
219+
framed: &mut Framed<S>,
220+
sequence: &mut dyn Sequence,
221+
buf: &mut WriteBuf,
222+
) -> ConnectorResult<()>
223+
where
224+
S: FramedWrite + FramedRead,
225+
{
226+
buf.clear();
227+
let written = single_sequence_step_read(framed, sequence, buf).await?;
228+
single_sequence_step_write(framed, buf, written).await
229+
}
230+
231+
pub async fn single_sequence_step_read<S>(
232+
framed: &mut Framed<S>,
233+
sequence: &mut dyn Sequence,
234+
buf: &mut WriteBuf,
235+
) -> ConnectorResult<Written>
236+
where
237+
S: FramedRead,
238+
{
239+
buf.clear();
240+
241+
if let Some(next_pdu_hint) = sequence.next_pdu_hint() {
242+
debug!(
243+
connector.state = sequence.state().name(),
244+
hint = ?next_pdu_hint,
245+
"Wait for PDU"
246+
);
247+
248+
let pdu = framed
249+
.read_by_hint(next_pdu_hint)
250+
.await
251+
.map_err(|e| ironrdp_connector::custom_err!("read frame by hint", e))?;
252+
253+
trace!(length = pdu.len(), "PDU received");
254+
255+
sequence.step(&pdu, buf)
256+
} else {
257+
sequence.step_no_input(buf)
258+
}
259+
}
260+
261+
async fn single_sequence_step_write<S>(
262+
framed: &mut Framed<S>,
263+
buf: &mut WriteBuf,
264+
written: Written,
265+
) -> ConnectorResult<()>
266+
where
267+
S: FramedWrite,
268+
{
269+
if let Some(response_len) = written.size() {
270+
debug_assert_eq!(buf.filled_len(), response_len);
271+
let response = buf.filled();
272+
trace!(response_len, "Send response");
273+
framed
274+
.write_all(response)
275+
.await
276+
.map_err(|e| ironrdp_connector::custom_err!("write all", e))?;
277+
}
278+
279+
Ok(())
280+
}

crates/ironrdp-pdu/src/rdp/headers.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -520,16 +520,23 @@ bitflags! {
520520
#[derive(Debug, Clone, PartialEq, Eq)]
521521
pub struct ServerDeactivateAll;
522522

523+
impl ServerDeactivateAll {
524+
const FIXED_PART_SIZE: usize = 2 /* length_source_descriptor */ + 1 /* source_descriptor */;
525+
}
526+
523527
impl PduDecode<'_> for ServerDeactivateAll {
524528
fn decode(src: &mut ReadCursor<'_>) -> PduResult<Self> {
529+
ensure_fixed_part_size!(in: src);
525530
let length_source_descriptor = src.read_u16();
531+
ensure_size!(in: src, size: length_source_descriptor.into());
526532
let _ = src.read_slice(length_source_descriptor.into());
527-
Ok(Self)
533+
Ok(Self {})
528534
}
529535
}
530536

531537
impl PduEncode for ServerDeactivateAll {
532538
fn encode(&self, dst: &mut WriteCursor<'_>) -> PduResult<()> {
539+
ensure_fixed_part_size!(in: dst);
533540
// A 16-bit, unsigned integer. The size in bytes of the sourceDescriptor field.
534541
dst.write_u16(1);
535542
// Variable number of bytes. The source descriptor. This field SHOULD be set to 0x00.
@@ -542,6 +549,6 @@ impl PduEncode for ServerDeactivateAll {
542549
}
543550

544551
fn size(&self) -> usize {
545-
2 /* length_source_descriptor */ + 1 /* source_descriptor */
552+
Self::FIXED_PART_SIZE
546553
}
547554
}

0 commit comments

Comments
 (0)