diff --git a/src/main.rs b/src/main.rs index 8f49e9b..08f3b87 100644 --- a/src/main.rs +++ b/src/main.rs @@ -38,6 +38,7 @@ use std::str::FromStr; use std::time::Duration; use std::{env, fs}; use tokio::task::JoinHandle; +use crate::nex::user::User; mod endianness; mod prudp; @@ -317,10 +318,12 @@ async fn start_secure() -> JoinHandle<()> { info!("new connected user on secure :D!"); - let _ = new_rmc_gateway_connection(conn, |_| AuthHandler { - destination_server_acct: &SECURE_SERVER_ACCOUNT, - build_name: "branch:origin/project/wup-agmj build:3_8_15_2004_0", - station_url: &SECURE_STATION_URL, + let ip = conn.socket_addr.regular_socket_addr; + let pid = conn.user_id; + + let _ = new_rmc_gateway_connection(conn, |_| User { + ip, + pid }); } }) diff --git a/src/nex/mod.rs b/src/nex/mod.rs index 20e508c..623d6d8 100644 --- a/src/nex/mod.rs +++ b/src/nex/mod.rs @@ -1,2 +1,3 @@ pub mod account; -pub mod auth_handler; \ No newline at end of file +pub mod auth_handler; +pub mod user; \ No newline at end of file diff --git a/src/nex/user.rs b/src/nex/user.rs new file mode 100644 index 0000000..77ebfb6 --- /dev/null +++ b/src/nex/user.rs @@ -0,0 +1,45 @@ +use std::net::{Ipv4Addr, SocketAddrV4}; +use macros::rmc_struct; +use crate::define_rmc_proto; +use crate::prudp::station_url::{nat_types, StationUrl}; +use crate::prudp::station_url::Type::PRUDPS; +use crate::prudp::station_url::UrlOptions::{Address, NatFiltering, NatMapping, NatType, Port, PrincipalID, RVConnectionID}; +use crate::rmc::protocols::secure::{RemoteAuth, RawAuthInfo, RawAuth, Auth}; +use crate::rmc::response::ErrorCode; +use crate::rmc::structures::qresult::QResult; + +define_rmc_proto!( + proto UserProtocol{ + Auth + } +); + +#[rmc_struct(UserProtocol)] +pub struct User { + pub pid: u32, + pub ip: SocketAddrV4, +} + +impl Auth for User{ + async fn register(&self, station_urls: Vec) -> Result<(QResult, u32, String), ErrorCode> { + let public_station = StationUrl{ + url_type: PRUDPS, + options: vec![ + RVConnectionID(0), + Address(*self.ip.ip()), + Port(self.ip.port()), + NatFiltering(0), + NatMapping(0), + NatType(nat_types::BEHIND_NAT), + PrincipalID(self.pid), + ] + }; + + let result = QResult::success(ErrorCode::Core_Unknown); + + Ok((result, 0, public_station.to_string())) + } +} + + + diff --git a/src/rmc/protocols/mod.rs b/src/rmc/protocols/mod.rs index 4640592..fd09e63 100644 --- a/src/rmc/protocols/mod.rs +++ b/src/rmc/protocols/mod.rs @@ -1,6 +1,7 @@ #![allow(async_fn_in_trait)] pub mod auth; +pub mod secure; use crate::prudp::socket::{ExternalConnection, SendingConnection}; use crate::rmc::message::RMCMessage; diff --git a/src/rmc/protocols/secure.rs b/src/rmc/protocols/secure.rs new file mode 100644 index 0000000..fa11c35 --- /dev/null +++ b/src/rmc/protocols/secure.rs @@ -0,0 +1,12 @@ +use macros::{method_id, rmc_proto}; +use crate::prudp::station_url::StationUrl; +use crate::rmc::response::ErrorCode; +use crate::rmc::structures::any::Any; +use crate::rmc::structures::connection_data::ConnectionData; +use crate::rmc::structures::qresult::QResult; + +#[rmc_proto(11)] +pub trait Auth { + #[method_id(1)] + async fn register(&self, station_urls: Vec) -> Result<(QResult, u32, String), ErrorCode>; +}