aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-07-29 23:24:24 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-07-29 23:24:24 +0200
commit50ca45dc839bf07d8ace9a84247b2f6f04e8c208 (patch)
tree63aa671ca77cb764979cae04d57e55c896e16802
parent587edbc066a6f3359d29523428ea363b140dd676 (diff)
load credentials from config file (same location as before)
-rw-r--r--Cargo.lock2
-rw-r--r--Cargo.toml2
-rw-r--r--src/error.rs2
-rw-r--r--src/main.rs25
4 files changed, 24 insertions, 7 deletions
diff --git a/Cargo.lock b/Cargo.lock
index c8cdced..46b81de 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -779,6 +779,8 @@ dependencies = [
"rsdsl_ip_config",
"rsdsl_netlinkd",
"rsdsl_pppoe2_sys",
+ "serde",
+ "serde_json",
"socket2 0.5.3",
"thiserror",
]
diff --git a/Cargo.toml b/Cargo.toml
index 8ed830c..f680094 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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(())