connection type
This commit is contained in:
		
							parent
							
								
									a3f5ffc15a
								
							
						
					
					
						commit
						e6744d031d
					
				@ -6,11 +6,19 @@ message RegisterPeer {
 | 
			
		||||
  int32 serial = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum ConnType {
 | 
			
		||||
  DEFAULT_CONN = 0;
 | 
			
		||||
  FILE_TRANSFER = 1;
 | 
			
		||||
  PORT_FORWARD = 2;
 | 
			
		||||
  RDP = 3;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message RegisterPeerResponse { bool request_pk = 2; }
 | 
			
		||||
 | 
			
		||||
message PunchHoleRequest { 
 | 
			
		||||
  string id = 1; 
 | 
			
		||||
  NatType nat_type = 2;
 | 
			
		||||
  ConnType conn_type = 4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message PunchHole { 
 | 
			
		||||
@ -52,6 +60,11 @@ message RegisterPkResponse {
 | 
			
		||||
  enum Result {
 | 
			
		||||
    OK = 1;
 | 
			
		||||
    UUID_MISMATCH = 2;
 | 
			
		||||
    ID_EXISTS = 3;
 | 
			
		||||
    TOO_FREQUENT = 4;
 | 
			
		||||
    INVALID_ID_FORMAT = 5;
 | 
			
		||||
    NOT_SUPPORT = 6;
 | 
			
		||||
    SERVER_ERROR = 7;
 | 
			
		||||
  }
 | 
			
		||||
  Result result = 1;
 | 
			
		||||
}
 | 
			
		||||
@ -62,6 +75,8 @@ message PunchHoleResponse {
 | 
			
		||||
  enum Failure {
 | 
			
		||||
    ID_NOT_EXIST = 1;
 | 
			
		||||
    OFFLINE = 2;
 | 
			
		||||
    LICENCE_MISMATCH = 3;
 | 
			
		||||
    LICENCE_OVERUSE = 4;
 | 
			
		||||
  }
 | 
			
		||||
  Failure failure = 3;
 | 
			
		||||
  string relay_server = 4;
 | 
			
		||||
@ -69,6 +84,7 @@ message PunchHoleResponse {
 | 
			
		||||
    NatType nat_type = 5;
 | 
			
		||||
    bool is_local = 6;
 | 
			
		||||
  }
 | 
			
		||||
  string other_failure = 7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message ConfigUpdate {
 | 
			
		||||
@ -82,6 +98,7 @@ message RequestRelay {
 | 
			
		||||
  bytes socket_addr = 3;
 | 
			
		||||
  string relay_server = 4;
 | 
			
		||||
  bool secure = 5;
 | 
			
		||||
  ConnType conn_type = 7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message RelayResponse {
 | 
			
		||||
@ -92,6 +109,7 @@ message RelayResponse {
 | 
			
		||||
    string id = 4;
 | 
			
		||||
    bytes pk = 5;
 | 
			
		||||
  }
 | 
			
		||||
  string refuse_reason = 6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message SoftwareUpdate { string url = 1; }
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ fn find_package(name: &str) -> Vec<PathBuf> {
 | 
			
		||||
    println!("cargo:info={}", target);
 | 
			
		||||
    path.push("installed");
 | 
			
		||||
    path.push(target);
 | 
			
		||||
    let mut lib = name.trim_start_matches("lib").to_string();
 | 
			
		||||
    let lib = name.trim_start_matches("lib").to_string();
 | 
			
		||||
    println!("{}", format!("cargo:rustc-link-lib=static={}", lib));
 | 
			
		||||
    println!(
 | 
			
		||||
        "{}",
 | 
			
		||||
 | 
			
		||||
@ -100,7 +100,7 @@ impl Drop for OboePlayer {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Client {
 | 
			
		||||
    pub async fn start(peer: &str) -> ResultType<(Stream, bool)> {
 | 
			
		||||
    pub async fn start(peer: &str, conn_type: ConnType) -> ResultType<(Stream, bool)> {
 | 
			
		||||
        // to-do: remember the port for each peer, so that we can retry easier
 | 
			
		||||
        let any_addr = Config::get_any_listen_addr();
 | 
			
		||||
        let rendezvous_server = crate::get_rendezvous_server(1_000).await;
 | 
			
		||||
@ -125,6 +125,7 @@ impl Client {
 | 
			
		||||
            msg_out.set_punch_hole_request(PunchHoleRequest {
 | 
			
		||||
                id: peer.to_owned(),
 | 
			
		||||
                nat_type: nat_type.into(),
 | 
			
		||||
                conn_type: conn_type.into(),
 | 
			
		||||
                ..Default::default()
 | 
			
		||||
            });
 | 
			
		||||
            socket.send(&msg_out).await?;
 | 
			
		||||
@ -140,7 +141,14 @@ impl Client {
 | 
			
		||||
                                    punch_hole_response::Failure::OFFLINE => {
 | 
			
		||||
                                        bail!("Remote desktop is offline");
 | 
			
		||||
                                    }
 | 
			
		||||
                                    _ => {}
 | 
			
		||||
                                    punch_hole_response::Failure::LICENCE_MISMATCH => {
 | 
			
		||||
                                        bail!("Key mismatch");
 | 
			
		||||
                                    }
 | 
			
		||||
                                    _ => {
 | 
			
		||||
                                        if !ph.other_failure.is_empty() {
 | 
			
		||||
                                            bail!(ph.other_failure);
 | 
			
		||||
                                        }
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            } else {
 | 
			
		||||
                                peer_nat_type = ph.get_nat_type();
 | 
			
		||||
@ -160,7 +168,8 @@ impl Client {
 | 
			
		||||
                            );
 | 
			
		||||
                            pk = rr.get_pk().into();
 | 
			
		||||
                            let mut conn =
 | 
			
		||||
                                Self::create_relay(peer, rr.uuid, rr.relay_server).await?;
 | 
			
		||||
                                Self::create_relay(peer, rr.uuid, rr.relay_server, conn_type)
 | 
			
		||||
                                    .await?;
 | 
			
		||||
                            Self::secure_connection(peer, pk, &mut conn).await?;
 | 
			
		||||
                            return Ok((conn, false));
 | 
			
		||||
                        }
 | 
			
		||||
@ -199,6 +208,7 @@ impl Client {
 | 
			
		||||
            peer_nat_type,
 | 
			
		||||
            my_nat_type,
 | 
			
		||||
            is_local,
 | 
			
		||||
            conn_type,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
    }
 | 
			
		||||
@ -214,8 +224,9 @@ impl Client {
 | 
			
		||||
        peer_nat_type: NatType,
 | 
			
		||||
        my_nat_type: i32,
 | 
			
		||||
        is_local: bool,
 | 
			
		||||
        conn_type: ConnType,
 | 
			
		||||
    ) -> ResultType<(Stream, bool)> {
 | 
			
		||||
        let mut direct_failures = 0;
 | 
			
		||||
        let direct_failures = PeerConfig::load(peer_id).direct_failures;
 | 
			
		||||
        let mut connect_timeout = 0;
 | 
			
		||||
        const MIN: u64 = 1000;
 | 
			
		||||
        if is_local || peer_nat_type == NatType::SYMMETRIC {
 | 
			
		||||
@ -231,13 +242,14 @@ impl Client {
 | 
			
		||||
                    }
 | 
			
		||||
                    if my_nat_type == NatType::ASYMMETRIC as i32 {
 | 
			
		||||
                        connect_timeout = CONNECT_TIMEOUT;
 | 
			
		||||
                        if direct_failures > 0 {
 | 
			
		||||
                            connect_timeout = punch_time_used * 6;
 | 
			
		||||
                        }
 | 
			
		||||
                    } else if my_nat_type == NatType::SYMMETRIC as i32 {
 | 
			
		||||
                        connect_timeout = MIN;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if connect_timeout == 0 {
 | 
			
		||||
                    let config = PeerConfig::load(peer_id);
 | 
			
		||||
                    direct_failures = config.direct_failures;
 | 
			
		||||
                    let n = if direct_failures > 0 { 3 } else { 6 };
 | 
			
		||||
                    connect_timeout = punch_time_used * (n as u64);
 | 
			
		||||
                }
 | 
			
		||||
@ -257,10 +269,14 @@ impl Client {
 | 
			
		||||
                    relay_server.to_owned(),
 | 
			
		||||
                    rendezvous_server,
 | 
			
		||||
                    pk.len() == sign::PUBLICKEYBYTES,
 | 
			
		||||
                    conn_type,
 | 
			
		||||
                )
 | 
			
		||||
                .await;
 | 
			
		||||
                if conn.is_err() {
 | 
			
		||||
                    bail!("Failed to connect via relay server");
 | 
			
		||||
                    bail!(
 | 
			
		||||
                        "Failed to connect via relay server: {}",
 | 
			
		||||
                        conn.err().unwrap()
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                bail!("Failed to make direct connection to remote desktop");
 | 
			
		||||
@ -318,7 +334,7 @@ impl Client {
 | 
			
		||||
                            }
 | 
			
		||||
                        } else {
 | 
			
		||||
                            // fall back to non-secure connection in case pk mismatch
 | 
			
		||||
                            // to-do: pop up a warning dialog to let user choose if continue
 | 
			
		||||
                            log::info!("pk mismatch, fall back to non-secure");
 | 
			
		||||
                            let mut msg_out = Message::new();
 | 
			
		||||
                            msg_out.set_public_key(PublicKey::new());
 | 
			
		||||
                            timeout(CONNECT_TIMEOUT, conn.send(&msg_out)).await??;
 | 
			
		||||
@ -342,6 +358,7 @@ impl Client {
 | 
			
		||||
        relay_server: String,
 | 
			
		||||
        rendezvous_server: SocketAddr,
 | 
			
		||||
        secure: bool,
 | 
			
		||||
        conn_type: ConnType,
 | 
			
		||||
    ) -> ResultType<Stream> {
 | 
			
		||||
        let any_addr = Config::get_any_listen_addr();
 | 
			
		||||
        let mut succeed = false;
 | 
			
		||||
@ -371,7 +388,10 @@ impl Client {
 | 
			
		||||
            socket.send(&msg_out).await?;
 | 
			
		||||
            if let Some(Ok(bytes)) = socket.next_timeout(i * 3000).await {
 | 
			
		||||
                if let Ok(msg_in) = RendezvousMessage::parse_from_bytes(&bytes) {
 | 
			
		||||
                    if let Some(rendezvous_message::Union::relay_response(_)) = msg_in.union {
 | 
			
		||||
                    if let Some(rendezvous_message::Union::relay_response(rs)) = msg_in.union {
 | 
			
		||||
                        if !rs.refuse_reason.is_empty() {
 | 
			
		||||
                            bail!(rs.refuse_reason);
 | 
			
		||||
                        }
 | 
			
		||||
                        succeed = true;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
@ -381,10 +401,15 @@ impl Client {
 | 
			
		||||
        if !succeed {
 | 
			
		||||
            bail!("");
 | 
			
		||||
        }
 | 
			
		||||
        Self::create_relay(peer, uuid, relay_server).await
 | 
			
		||||
        Self::create_relay(peer, uuid, relay_server, conn_type).await
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async fn create_relay(peer: &str, uuid: String, relay_server: String) -> ResultType<Stream> {
 | 
			
		||||
    async fn create_relay(
 | 
			
		||||
        peer: &str,
 | 
			
		||||
        uuid: String,
 | 
			
		||||
        relay_server: String,
 | 
			
		||||
        conn_type: ConnType,
 | 
			
		||||
    ) -> ResultType<Stream> {
 | 
			
		||||
        let mut conn = FramedStream::new(
 | 
			
		||||
            crate::check_port(relay_server, RELAY_PORT),
 | 
			
		||||
            Config::get_any_listen_addr(),
 | 
			
		||||
@ -396,6 +421,7 @@ impl Client {
 | 
			
		||||
        msg_out.set_request_relay(RequestRelay {
 | 
			
		||||
            id: peer.to_owned(),
 | 
			
		||||
            uuid,
 | 
			
		||||
            conn_type: conn_type.into(),
 | 
			
		||||
            ..Default::default()
 | 
			
		||||
        });
 | 
			
		||||
        conn.send(&msg_out).await?;
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,7 @@ use hbb_common::{
 | 
			
		||||
    log,
 | 
			
		||||
    message_proto::*,
 | 
			
		||||
    protobuf::Message as _,
 | 
			
		||||
    rendezvous_proto::ConnType,
 | 
			
		||||
    tcp, timeout,
 | 
			
		||||
    tokio::{self, net::TcpStream, sync::mpsc},
 | 
			
		||||
    tokio_util::codec::{BytesCodec, Framed},
 | 
			
		||||
@ -39,7 +40,7 @@ pub async fn listen(
 | 
			
		||||
                log::info!("new connection from {:?}", addr);
 | 
			
		||||
                let id = id.clone();
 | 
			
		||||
                let mut forward = Framed::new(forward, BytesCodec::new());
 | 
			
		||||
                match connect_and_login(&id, &mut ui_receiver, interface.clone(), &mut forward).await {
 | 
			
		||||
                match connect_and_login(&id, &mut ui_receiver, interface.clone(), &mut forward, is_rdp).await {
 | 
			
		||||
                    Ok(Some(stream)) => {
 | 
			
		||||
                        let interface = interface.clone();
 | 
			
		||||
                        tokio::spawn(async move {
 | 
			
		||||
@ -76,8 +77,14 @@ async fn connect_and_login(
 | 
			
		||||
    ui_receiver: &mut mpsc::UnboundedReceiver<Data>,
 | 
			
		||||
    interface: impl Interface,
 | 
			
		||||
    forward: &mut Framed<TcpStream, BytesCodec>,
 | 
			
		||||
    is_rdp: bool,
 | 
			
		||||
) -> ResultType<Option<Stream>> {
 | 
			
		||||
    let (mut stream, _) = Client::start(&id).await?;
 | 
			
		||||
    let conn_type = if is_rdp {
 | 
			
		||||
        ConnType::RDP
 | 
			
		||||
    } else {
 | 
			
		||||
        ConnType::PORT_FORWARD
 | 
			
		||||
    };
 | 
			
		||||
    let (mut stream, _) = Client::start(id, conn_type).await?;
 | 
			
		||||
    let mut interface = interface;
 | 
			
		||||
    let mut buffer = Vec::new();
 | 
			
		||||
    loop {
 | 
			
		||||
 | 
			
		||||
@ -155,6 +155,7 @@ impl RendezvousMediator {
 | 
			
		||||
                                    register_pk_response::Result::UUID_MISMATCH => {
 | 
			
		||||
                                        allow_err!(rz.handle_uuid_mismatch(&mut socket).await);
 | 
			
		||||
                                    }
 | 
			
		||||
                                    _ => {}
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            Some(rendezvous_message::Union::punch_hole(ph)) => {
 | 
			
		||||
 | 
			
		||||
@ -511,9 +511,9 @@ impl UI {
 | 
			
		||||
        format!("{}.{}", p.to_string_lossy(), self.get_software_ext())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn create_shortcut(&self, id: String) {
 | 
			
		||||
    fn create_shortcut(&self, _id: String) {
 | 
			
		||||
        #[cfg(windows)]
 | 
			
		||||
        crate::platform::windows::create_shortcut(&id).ok();
 | 
			
		||||
        crate::platform::windows::create_shortcut(&_id).ok();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn open_url(&self, url: String) {
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,7 @@ use hbb_common::{
 | 
			
		||||
    fs, log,
 | 
			
		||||
    message_proto::*,
 | 
			
		||||
    protobuf::Message as _,
 | 
			
		||||
    rendezvous_proto::ConnType,
 | 
			
		||||
    sleep,
 | 
			
		||||
    tokio::{
 | 
			
		||||
        self,
 | 
			
		||||
@ -494,6 +495,7 @@ impl Handler {
 | 
			
		||||
    fn set_no_confirm(&mut self, id: i32) {
 | 
			
		||||
        self.send(Data::SetNoConfirm(id));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn remove_dir(&mut self, id: i32, path: String, is_remote: bool) {
 | 
			
		||||
        if is_remote {
 | 
			
		||||
            self.send(Data::RemoveDir((id, path)));
 | 
			
		||||
@ -1144,7 +1146,12 @@ impl Remote {
 | 
			
		||||
    async fn io_loop(&mut self) {
 | 
			
		||||
        let stop_clipboard = self.start_clipboard();
 | 
			
		||||
        let mut last_recv_time = Instant::now();
 | 
			
		||||
        match Client::start(&self.handler.id).await {
 | 
			
		||||
        let conn_type = if self.handler.is_file_transfer() {
 | 
			
		||||
            ConnType::FILE_TRANSFER
 | 
			
		||||
        } else {
 | 
			
		||||
            ConnType::default()
 | 
			
		||||
        };
 | 
			
		||||
        match Client::start(&self.handler.id, conn_type).await {
 | 
			
		||||
            Ok((mut peer, direct)) => {
 | 
			
		||||
                self.handler
 | 
			
		||||
                    .call("setConnectionType", &make_args!(peer.is_secured(), direct));
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user