rename some varibles
This commit is contained in:
parent
6bb3b637ea
commit
ea90cf2b63
@ -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);
|
||||
|
0
webrdp/src/rdp/protocol/core/iso.rs
Normal file
0
webrdp/src/rdp/protocol/core/iso.rs
Normal 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]) {
|
||||
|
@ -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
|
||||
|
@ -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!(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user