diff --git a/src/auth/mod.rs b/src/auth/mod.rs deleted file mode 100644 index 0a2a180..0000000 --- a/src/auth/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod providers; -pub mod routes; diff --git a/src/auth/providers.rs b/src/auth/providers.rs deleted file mode 100644 index 65c3ad2..0000000 --- a/src/auth/providers.rs +++ /dev/null @@ -1,12 +0,0 @@ -// enum Providers { -// Ldap(LdapProvider), -// Local(LocalProvider), -// } - -// struct LdapProvider { -// user_filter: String, -// group_filter: String, -// // ... -// } - -// struct LocalProvider; diff --git a/src/main.rs b/src/main.rs index 31133b2..b0baa7f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,62 +4,23 @@ #[macro_use] extern crate rocket_contrib; #[macro_use] extern crate diesel; -use rocket::State; -use rocket::http::Status; - -use rocket_contrib::json::Json; - -use trust_dns_client::client::{Client, SyncClient}; +use trust_dns_client::client::SyncClient; use trust_dns_client::tcp::TcpClientConnection; -use trust_dns_client::op::{DnsResponse, ResponseCode}; -use trust_dns_client::rr::{DNSClass, Name, RecordType}; mod models; mod config; -mod auth; mod schema; +mod routes; -use models::errors::ErrorResponse; -use models::users::UserInfo; -use auth::routes::*; +use routes::users::*; +use routes::zones::*; #[database("db")] pub struct DbConn(diesel::SqliteConnection); +type DnsClient = SyncClient; -#[get("/zones//records")] -fn get_zone_records( - client: State>, - _user_info: UserInfo, - zone: String -) -> Result>, ErrorResponse<()>> { - - // TODO: Implement FromParam for Name - let name = Name::from_utf8(&zone).unwrap(); - - let response: DnsResponse = client.query(&name, DNSClass::IN, RecordType::AXFR).unwrap(); - - if response.response_code() != ResponseCode::NoError { - return ErrorResponse::new( - Status::NotFound, - format!("zone {} could not be found", name.to_utf8()) - ).err() - } - - let answers = response.answers(); - let mut records: Vec<_> = answers.to_vec().into_iter() - .map(|record| models::dns::Record::from(record)) - .filter(|record| match record.rdata { - models::dns::RData::NULL { .. } | models::dns::RData::DNSSEC(_) => false, - _ => true, - }).collect(); - - // AXFR response ends with SOA, we remove it so it is not doubled in the response. - records.pop(); - - Ok(Json(records)) -} #[launch] fn rocket() -> rocket::Rocket { diff --git a/src/routes/mod.rs b/src/routes/mod.rs new file mode 100644 index 0000000..7100db1 --- /dev/null +++ b/src/routes/mod.rs @@ -0,0 +1,2 @@ +pub mod users; +pub mod zones; diff --git a/src/auth/routes.rs b/src/routes/users.rs similarity index 100% rename from src/auth/routes.rs rename to src/routes/users.rs diff --git a/src/routes/zones.rs b/src/routes/zones.rs new file mode 100644 index 0000000..1ccbe73 --- /dev/null +++ b/src/routes/zones.rs @@ -0,0 +1,47 @@ +use rocket::State; +use rocket::http::Status; + +use rocket_contrib::json::Json; + +use trust_dns_client::client::{Client}; +use trust_dns_client::op::{DnsResponse, ResponseCode}; +use trust_dns_client::rr::{DNSClass, Name, RecordType}; + +use crate::models::dns; +use crate::models::errors::ErrorResponse; +use crate::models::users::UserInfo; +use crate::DnsClient; + + +#[get("/zones//records")] +pub fn get_zone_records( + client: State, + _user_info: UserInfo, + zone: String +) -> Result>, ErrorResponse<()>> { + + // TODO: Implement FromParam for Name + let name = Name::from_utf8(&zone).unwrap(); + + let response: DnsResponse = client.query(&name, DNSClass::IN, RecordType::AXFR).unwrap(); + + if response.response_code() != ResponseCode::NoError { + return ErrorResponse::new( + Status::NotFound, + format!("zone {} could not be found", name.to_utf8()) + ).err() + } + + let answers = response.answers(); + let mut records: Vec<_> = answers.to_vec().into_iter() + .map(|record| dns::Record::from(record)) + .filter(|record| match record.rdata { + dns::RData::NULL { .. } | dns::RData::DNSSEC(_) => false, + _ => true, + }).collect(); + + // AXFR response ends with SOA, we remove it so it is not doubled in the response. + records.pop(); + + Ok(Json(records)) +}