rename some varibles

This commit is contained in:
Jovi Hsu 2022-10-21 02:10:12 +00:00
parent 6bb3b637ea
commit ea90cf2b63
6 changed files with 78 additions and 47 deletions

View File

@ -6,13 +6,6 @@ mod x11keyboard;
use rdp_impl::RdpInner;
use std::{rc::Rc, sync::Mutex};
type ConnectCb = fn(&mut RdpInner);
type FailCb = fn(&mut RdpInner, &str);
pub trait Engine {
fn hello(&mut self, rdp: &mut RdpInner);
fn do_input(&mut self, rdp: &mut RdpInner);
}
pub enum MouseEventType {
Down,
Up,
@ -162,6 +155,12 @@ impl StreamReader {
}
}
pub fn read_to_end(&mut self) -> Vec<u8> {
let mut out = Vec::with_capacity(self.remain);
self.read_exact_vec(&mut out, self.remain);
out
}
pub fn read_u8(&mut self) -> u8 {
let mut buf = [0u8; 1];
self.read_exact(&mut buf, 1);

View File

View File

@ -2,8 +2,7 @@
use super::ntlm::*;
use super::{super::ber::*, to_unicode};
use crate::rdp::rdp_impl::RdpInner;
use crate::rdp::*;
use crate::rdp::rdp_impl::{ConnectCb, FailCb, RdpInitializer, RdpInner};
use x509_parser::prelude::*;
enum State {
@ -46,7 +45,7 @@ impl CsspClient {
}
}
impl Engine for CsspClient {
impl RdpInitializer for CsspClient {
fn hello(&mut self, rdp: &mut RdpInner) {
self.state = State::ServerPubkeyWait;
self.ntlm
@ -59,16 +58,14 @@ impl Engine for CsspClient {
State::ServerPubkeyWait => self.handle_server_publickey(rdp),
State::ClientNegoSent => self.handle_server_challenge(rdp),
State::ClientChalSent => self.handle_server_auth(rdp),
State::ServerAuthRecv => unimplemented!(),
State::ServerAuthRecv => unreachable!(),
}
}
}
impl CsspClient {
fn handle_server_publickey(&mut self, rdp: &mut RdpInner) {
let mut x509_der = Vec::new();
rdp.reader
.read_exact_vec(&mut x509_der, rdp.reader.remain());
let x509_der = rdp.reader.read_to_end();
let x509 = X509Certificate::from_der(&x509_der).unwrap();
self.server_key = x509
.1
@ -85,9 +82,7 @@ impl CsspClient {
}
fn handle_server_challenge(&mut self, rdp: &mut RdpInner) {
let mut server_challenge = Vec::with_capacity(rdp.reader.remain());
rdp.reader
.read_exact_vec(&mut server_challenge, rdp.reader.remain());
let server_challenge = rdp.reader.read_to_end();
let ans1_tree = BerObj::from_der(&server_challenge);
// console_log!("ans1_tree {:#?}", ans1_tree);
if let ASN1Type::SequenceOwned(ref seq) = ans1_tree.get_value() {
@ -98,22 +93,28 @@ impl CsspClient {
if let ASN1Type::OctetString(server_chal) = nego_item.get_value() {
self.ntlm.generate_client_chal(server_chal);
} else {
panic!("Unknown response");
(self.on_fail)(rdp, "Wrong nla response");
return;
}
} else {
panic!("Unknown response");
(self.on_fail)(rdp, "Wrong nla response");
return;
}
} else {
panic!("Unknown response");
(self.on_fail)(rdp, "Wrong nla response");
return;
}
} else {
panic!("Unknown response");
(self.on_fail)(rdp, "Wrong nla response");
return;
}
} else {
panic!("Unknown response");
(self.on_fail)(rdp, "Wrong nla response");
return;
}
} else {
panic!("Unknown response");
(self.on_fail)(rdp, "Wrong nla response");
return;
}
let pubkey_auth = self.ntlm.encrypt(&self.server_key, self.send_seq);
self.send_seq += 1;
@ -123,9 +124,7 @@ impl CsspClient {
}
fn handle_server_auth(&mut self, rdp: &mut RdpInner) {
let mut not_in_use = Vec::new();
rdp.reader
.read_exact_vec(&mut not_in_use, rdp.reader.remain());
let _ = rdp.reader.read_to_end();
let auth_data = ber_seq!(
/* [0] credType (INTEGER) */
@ -148,6 +147,8 @@ impl CsspClient {
let auth = self.ntlm.encrypt(&auth_data, self.send_seq);
self.send_seq += 1;
self.send_ts_auth(rdp, &auth);
self.state = State::ServerAuthRecv;
(self.on_connect)(rdp)
}
fn send_tsrequest(&self, rdp: &mut RdpInner, nego: &[u8]) {

View File

@ -1,7 +1,6 @@
#![allow(dead_code)]
use super::super::rdp_impl::RdpInner;
use super::super::*;
use super::super::rdp_impl::{RdpInitializer, RdpInner, ConnectCb, FailCb};
const RDP_X224_VER: u8 = 3;
const RDP_X224_LEN: u8 = 0x13;
@ -49,7 +48,7 @@ impl X224 {
}
}
impl Engine for X224 {
impl RdpInitializer for X224 {
fn hello(&mut self, rdp: &mut RdpInner) {
// send X.224 request
// Client X.224 Connection Request PDU

View File

@ -3,17 +3,27 @@ use crate::{console_log, log};
use super::protocol::*;
use super::*;
pub type ConnectCb = fn(&mut RdpInner);
pub type FailCb = fn(&mut RdpInner, &str);
pub trait RdpInitializer {
fn hello(&mut self, rdp: &mut RdpInner);
fn do_input(&mut self, rdp: &mut RdpInner);
}
#[derive(Debug)]
enum State {
Init,
X224,
Nla,
Core,
Disconnected,
}
pub struct RdpInner {
state: State,
engine: Option<Box<dyn super::Engine>>,
initializer: Option<Box<dyn RdpInitializer>>,
// core: Box<dyn super::RdpInitializer>,
pub reader: StreamReader,
pub writer: StreamWriter,
outs: Vec<RdpOutput>,
@ -25,7 +35,8 @@ impl RdpInner {
pub fn new() -> Self {
RdpInner {
state: State::Init,
engine: None,
initializer: None,
// core: None,
reader: StreamReader::new(Vec::with_capacity(10), 0),
writer: StreamWriter::new(Vec::with_capacity(1024)),
outs: Vec::with_capacity(10),
@ -35,7 +46,7 @@ impl RdpInner {
}
pub fn init(&mut self) {
if self.engine.is_some() {
if self.initializer.is_some() {
panic!("inited");
}
self.move_next();
@ -47,16 +58,26 @@ impl RdpInner {
};
self.reader.append(buf);
while self.reader.remain() >= self.require {
let mut handler = self.engine.take().unwrap();
match self.state {
State::Disconnected => {
unimplemented!("TO DO, clean up")
}
State::Core => {
unimplemented!("TO DO")
}
_ => {
let mut handler = self.initializer.take().unwrap();
handler.do_input(self);
if self.engine.is_none() {
self.engine = Some(handler);
}
handler.do_input(self);
if self.initializer.is_none() {
self.initializer = Some(handler);
}
// console_log!("left {}, require {}", self.reader.remain(), self.require);
if let State::Disconnected = self.state {
break;
// console_log!("left {}, require {}", self.reader.remain(), self.require);
if let State::Disconnected = self.state {
break;
}
}
}
}
}
@ -78,6 +99,13 @@ impl RdpInner {
}
}
pub fn flush(&mut self) {
if !self.writer.buf.is_empty() {
self.outs.push(RdpOutput::WsBuf(self.writer.buf.clone()));
self.writer.buf.clear();
}
}
pub fn close(&mut self) {
self.state = State::Disconnected;
}
@ -90,7 +118,7 @@ impl RdpInner {
State::Init => {
let mut x224 = x224::X224::new(Self::move_next, Self::disconnect_with_err);
x224.hello(self);
self.engine = Some(Box::new(x224));
self.initializer = Some(Box::new(x224));
self.state = State::X224;
}
State::X224 => {
@ -105,14 +133,18 @@ impl RdpInner {
"webrdp",
);
nla.hello(self);
self.engine = Some(Box::new(nla));
self.initializer = Some(Box::new(nla));
self.state = State::Nla;
} else {
unimplemented!("Only nla is supported now");
self.state = State::Core;
}
}
State::Nla => {}
State::Disconnected => {}
State::Nla => {
self.flush();
self.state = State::Core;
}
State::Core => unreachable!(),
State::Disconnected => unreachable!(),
}
}

View File

@ -132,7 +132,7 @@ fn vnc_close_handle(vnc: &Vnc, canvas: &CanvasUtils, msg: &str) {
fn start_websocket() -> Result<(), JsValue> {
// connect
let url = format!(
"{scheme}://{host}/websockify",
"{scheme}://{host}/ws?bookmark=12vnc",
scheme = if web_sys::window()
.unwrap()
.location()
@ -143,7 +143,7 @@ fn start_websocket() -> Result<(), JsValue> {
} else {
"ws"
},
host = web_sys::window().unwrap().location().host()?
host = "10.103.14.110:4433"
);
let ws = WebSocket::new_with_str(&url, "binary")?;
let canvas = CanvasUtils::new();