diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-29 23:24:24 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-29 23:24:24 +0200 |
commit | 50ca45dc839bf07d8ace9a84247b2f6f04e8c208 (patch) | |
tree | 63aa671ca77cb764979cae04d57e55c896e16802 | |
parent | 587edbc066a6f3359d29523428ea363b140dd676 (diff) |
load credentials from config file (same location as before)
-rw-r--r-- | Cargo.lock | 2 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | src/error.rs | 2 | ||||
-rw-r--r-- | src/main.rs | 25 |
4 files changed, 24 insertions, 7 deletions
@@ -779,6 +779,8 @@ dependencies = [ "rsdsl_ip_config", "rsdsl_netlinkd", "rsdsl_pppoe2_sys", + "serde", + "serde_json", "socket2 0.5.3", "thiserror", ] @@ -13,5 +13,7 @@ rand = "0.8.5" rsdsl_ip_config = { git = "https://github.com/rsdsl/ip_config.git", version = "0.2.0" } rsdsl_netlinkd = { git = "https://github.com/rsdsl/netlinkd.git", version = "0.4.0" } rsdsl_pppoe2_sys = { git = "https://github.com/rsdsl/pppoe2.git", version = "0.1.0" } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" socket2 = "0.5.3" thiserror = "1.0" diff --git a/src/error.rs b/src/error.rs index f51e2af..cdee786 100644 --- a/src/error.rs +++ b/src/error.rs @@ -14,6 +14,8 @@ pub enum Error { RsdslNetlinkd(#[from] rsdsl_netlinkd::error::Error), #[error("rsdsl_pppoe2_sys: {0}")] RsdslPppoe2Sys(#[from] rsdsl_pppoe2_sys::Error), + #[error("serde_json: {0}")] + SerdeJson(#[from] serde_json::Error), } pub type Result<T> = std::result::Result<T, Error>; diff --git a/src/main.rs b/src/main.rs index 03d43a3..c1ef4e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,11 +15,10 @@ use rsdsl_ip_config::{Ipv4Config, Ipv6Config}; use rsdsl_netlinkd::link; use rsdsl_pppoe2::{Ncp, Ppp, Pppoe, Result}; use rsdsl_pppoe2_sys::{new_discovery_socket, new_session}; +use serde::{Deserialize as SDeserialize, Serialize as SSerialize}; use socket2::Socket; const PPPOE_UPLINK: &str = "eth1"; -const USERNAME: &str = "foo"; -const PASSWORD: &str = "bar"; const MAX_ATTEMPTS: usize = 10; const MAX_STATUS_ATTEMPTS: usize = 2; @@ -33,6 +32,12 @@ enum Network { Ipv6, } +#[derive(Clone, Debug, Eq, PartialEq, SSerialize, SDeserialize)] +struct Config { + username: String, + password: String, +} + fn ifid(addr: Ipv6Addr) -> u64 { (u128::from(addr) & u64::MAX as u128) as u64 } @@ -264,6 +269,9 @@ fn session( pppoe_state: Arc<Mutex<Pppoe>>, session_id: u16, ) -> Result<()> { + let mut file = File::open("/data/pppoe.conf")?; + let config: Config = serde_json::from_reader(&mut file)?; + let mut sock_disc_w = BufWriter::with_capacity(1500, sock_disc); let (_sock_sess, ctl, ppp) = new_session(interface, remote_mac, session_id)?; @@ -396,8 +404,8 @@ fn session( Some(AuthProto::Pap) => { PppPkt::new_pap(PapPkt::new_authenticate_request( rand::random(), - USERNAME.into(), - PASSWORD.into(), + config.username.clone(), + config.password.clone(), )) .serialize(&mut ctl_w)?; ctl_w.flush()?; @@ -904,6 +912,9 @@ fn handle_pap(pap: PapPkt, state: Arc<Mutex<Ppp>>) -> Result<()> { } fn handle_chap(chap: ChapPkt, ctl_w: &mut BufWriter<File>, state: Arc<Mutex<Ppp>>) -> Result<()> { + let mut file = File::open("/data/pppoe.conf")?; + let config: Config = serde_json::from_reader(&mut file)?; + let algorithm = match *state.lock().expect("ppp state mutex is poisoned") { Ppp::Auth(Some(AuthProto::Chap(algo)), ..) => algo, _ => { @@ -917,7 +928,7 @@ fn handle_chap(chap: ChapPkt, ctl_w: &mut BufWriter<File>, state: Arc<Mutex<Ppp> let mut hash_input = Vec::new(); hash_input.push(chap.identifier); - hash_input.extend_from_slice(PASSWORD.as_bytes()); + hash_input.extend_from_slice(config.password.as_bytes()); hash_input.extend_from_slice(&chap_challenge.value); let challenge_hash = match algorithm { @@ -927,7 +938,7 @@ fn handle_chap(chap: ChapPkt, ctl_w: &mut BufWriter<File>, state: Arc<Mutex<Ppp> PppPkt::new_chap(ChapPkt::new_response( chap.identifier, challenge_hash.to_vec(), - USERNAME.into(), + config.username.clone(), )) .serialize(ctl_w)?; ctl_w.flush()?; @@ -938,7 +949,7 @@ fn handle_chap(chap: ChapPkt, ctl_w: &mut BufWriter<File>, state: Arc<Mutex<Ppp> ); println!( " -> chap response {}, name: {}, value: {:?}", - chap.identifier, USERNAME, challenge_hash + chap.identifier, config.username, challenge_hash ); Ok(()) |