Skip to content

Commit e3aa8bc

Browse files
author
Isaiah Becker-Mayer
authored
feat: support for Server Deactivate All PDU (#418)
1 parent 31ed09b commit e3aa8bc

File tree

22 files changed

+725
-423
lines changed

22 files changed

+725
-423
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ tracing = { version = "0.1", features = ["log"] }
5959
thiserror = "1.0"
6060
png = "0.17"
6161
bitflags = "2.4"
62+
byteorder = "1.5"
6263

6364
[profile.dev]
6465
opt-level = 1

crates/ironrdp-acceptor/src/lib.rs

Lines changed: 4 additions & 46 deletions
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

Lines changed: 5 additions & 47 deletions
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,
6-
Sequence as _, ServerName, State as _,
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,45 +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-
191-
let written = if let Some(next_pdu_hint) = connector.next_pdu_hint() {
192-
debug!(
193-
connector.state = connector.state.name(),
194-
hint = ?next_pdu_hint,
195-
"Wait for PDU"
196-
);
197-
198-
let pdu = framed
199-
.read_by_hint(next_pdu_hint)
200-
.await
201-
.map_err(|e| ironrdp_connector::custom_err!("read frame by hint", e))?;
202-
203-
trace!(length = pdu.len(), "PDU received");
204-
205-
connector.step(&pdu, buf)?
206-
} else {
207-
connector.step_no_input(buf)?
208-
};
209-
210-
if let Some(response_len) = written.size() {
211-
debug_assert_eq!(buf.filled_len(), response_len);
212-
let response = buf.filled();
213-
trace!(response_len, "Send response");
214-
framed
215-
.write_all(response)
216-
.await
217-
.map_err(|e| ironrdp_connector::custom_err!("write all", e))?;
218-
}
219-
220-
Ok(())
221-
}

crates/ironrdp-async/src/framed.rs

Lines changed: 66 additions & 1 deletion
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-client/src/rdp.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ async fn active_session(
280280
ActiveStageOutput::PointerBitmap(_) => {
281281
// Not applicable, because we use the software cursor rendering.
282282
}
283+
ActiveStageOutput::DeactivateAll(_) => todo!("DeactivateAll"),
283284
ActiveStageOutput::Terminate(reason) => break 'outer reason,
284285
}
285286
}

0 commit comments

Comments
 (0)