use abol::codegen::rfc2865::Rfc2865Ext;
use abol::core::{Cidr, Code, Request, Response};
use abol::rt::Runtime;
use abol::server::{BoxError, HandlerFn, SecretManager, SecretSource, Server};
use abol_util::rt::tokio::TokioRuntime;
use std::net::SocketAddr;
use std::sync::Arc;
pub struct StaticSecretSource {
pub secret: Vec<u8>,
}
impl SecretSource for StaticSecretSource {
async fn get_all_secrets(&self) -> Result<Vec<(Cidr, Vec<u8>)>, BoxError> {
let cidr = Cidr {
ip: "0.0.0.0".parse()?,
prefix: 0,
};
Ok(vec![(cidr, self.secret.clone())])
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let addr: SocketAddr = "0.0.0.0:1812".parse()?;
let source = Arc::new(StaticSecretSource {
secret: b"testing123".to_vec(),
});
let secret_manager = SecretManager::new(source, 3600);
let handler = HandlerFn(|request: Request| async move {
let name = request
.packet
.get_user_name()
.unwrap_or_else(|| "Guest".to_string());
match request.packet.get_user_password() {
Some(p) if p.as_bytes() == b"supersecretpassword" => {
let mut res = request.packet.create_response_packet(Code::AccessAccept);
res.set_reply_message(format!("Hello {}, access granted!", name));
Ok(Response { packet: res })
}
_ => {
let res = request.packet.create_response_packet(Code::AccessReject);
Ok(Response { packet: res })
}
}
});
let runtime = TokioRuntime::new();
let socket = runtime.bind(addr).await?;
let server = Server::new(runtime, socket, secret_manager, handler);
server.listen_and_serve().await?;
println!("Abol (Tokio) listening on {}", addr);
Ok(())
}