clean up
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Johannes Heuel
2022-10-09 20:21:37 +02:00
parent 32bd7d5b62
commit 949801fc4d
3 changed files with 41 additions and 38 deletions

View File

@@ -16,7 +16,7 @@ use zoidberg_lib::types::{
const VERSION: &str = env!("CARGO_PKG_VERSION"); const VERSION: &str = env!("CARGO_PKG_VERSION");
fn build_client(secret: &str) -> Client { fn build_client(secret: &str) -> Client {
let cookie = format!("{}", secret); let cookie = secret.to_string();
let mut headers = header::HeaderMap::new(); let mut headers = header::HeaderMap::new();
headers.insert( headers.insert(
@@ -50,7 +50,7 @@ impl Worker {
let r: RegisterResponse = serde_json::from_str(&body)?; let r: RegisterResponse = serde_json::from_str(&body)?;
log::info!("registered worker with id: {}", &r.id); log::info!("registered worker with id: {}", &r.id);
Ok(Worker { Ok(Worker {
id: r.id.to_string(), id: r.id,
secret: secret.to_string(), secret: secret.to_string(),
server: server.to_string(), server: server.to_string(),
}) })
@@ -129,7 +129,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
let matches = App::new("Zoidberg client") let matches = App::new("Zoidberg client")
.version(VERSION) .version(VERSION)
.author("Johannes Heuel") .author("by Johannes Heuel")
.arg( .arg(
Arg::with_name("server") Arg::with_name("server")
.takes_value(true) .takes_value(true)

View File

@@ -0,0 +1,24 @@
use actix_web::{dev, error::ErrorBadRequest, Error, FromRequest, HttpRequest, Result};
use futures::future::{err, ok, Ready};
pub struct Authorization {}
impl FromRequest for Authorization {
type Error = Error;
type Future = Ready<Result<Self, Self::Error>>;
fn from_request(req: &HttpRequest, _payload: &mut dev::Payload) -> Self::Future {
if let Some(head) = req.headers().get("cookie") {
if let Ok(cookie) = head.to_str() {
if let Some(secret) = req.app_data::<String>() {
if secret == cookie {
return ok(Authorization {});
} else {
return err(ErrorBadRequest("no auth"));
}
}
}
}
err(ErrorBadRequest("no auth"))
}
}

View File

@@ -1,13 +1,9 @@
use actix_web::error::ErrorBadRequest;
use actix_web::{ use actix_web::{
dev, get, middleware::Logger, post, web, App, Error, FromRequest, HttpRequest, HttpResponse, get, middleware::Logger, post, web, App, HttpResponse, HttpServer, Responder, Result,
HttpServer, Responder, Result,
}; };
use chrono::Utc; use chrono::Utc;
use clap;
use env_logger::Env; use env_logger::Env;
use futures::future::{err, ok, Ready};
use log;
use std::sync::Mutex; use std::sync::Mutex;
use std::time::Duration; use std::time::Duration;
use uuid::Uuid; use uuid::Uuid;
@@ -16,8 +12,11 @@ use zoidberg_lib::types::{
Worker, Worker,
}; };
mod auth;
mod webpage; mod webpage;
use auth::Authorization;
const VERSION: &str = env!("CARGO_PKG_VERSION"); const VERSION: &str = env!("CARGO_PKG_VERSION");
struct State { struct State {
@@ -38,28 +37,6 @@ impl State {
} }
} }
struct Authorization {}
impl FromRequest for Authorization {
type Error = Error;
type Future = Ready<Result<Self, Self::Error>>;
fn from_request(req: &HttpRequest, _payload: &mut dev::Payload) -> Self::Future {
if let Some(head) = req.headers().get("cookie") {
if let Ok(cookie) = head.to_str() {
if let Some(secret) = req.app_data::<String>() {
if secret == cookie {
return ok(Authorization {});
} else {
return err(ErrorBadRequest("no auth"));
}
}
}
}
err(ErrorBadRequest("no auth"))
}
}
#[get("/")] #[get("/")]
async fn index(data: web::Data<State>) -> impl Responder { async fn index(data: web::Data<State>) -> impl Responder {
let workers = data.workers.lock().unwrap(); let workers = data.workers.lock().unwrap();
@@ -204,7 +181,7 @@ async fn main() -> std::io::Result<()> {
let _matches = clap::App::new("Zoidberg server") let _matches = clap::App::new("Zoidberg server")
.version(VERSION) .version(VERSION)
.author("Johannes Heuel") .author("by Johannes Heuel")
.get_matches(); .get_matches();
let state = web::Data::new(State::new()); let state = web::Data::new(State::new());
@@ -272,12 +249,13 @@ mod tests {
.uri("/register") .uri("/register")
.to_request(); .to_request();
let resp: RegisterResponse = test::call_and_read_body_json(&app, req).await; let resp: RegisterResponse = test::call_and_read_body_json(&app, req).await;
assert!(resp.id.len() > 0); assert!(!resp.id.is_empty());
} }
#[actix_web::test] #[actix_web::test]
async fn test_fetch() { async fn test_fetch() {
let cmd = String::from("hi"); let cmd = String::from("hi");
let jobid = 11;
let app = test::init_service( let app = test::init_service(
App::new() App::new()
.app_data(String::from("secret")) .app_data(String::from("secret"))
@@ -288,7 +266,7 @@ mod tests {
last_heartbeat: None, last_heartbeat: None,
}]), }]),
new_jobs: Mutex::new(vec![Job { new_jobs: Mutex::new(vec![Job {
id: 0, id: jobid,
cmd: cmd.clone(), cmd: cmd.clone(),
status: Status::Submitted, status: Status::Submitted,
}]), }]),
@@ -313,7 +291,7 @@ mod tests {
panic!("did not expect FetchResponse::Terminate from worker {}", w) panic!("did not expect FetchResponse::Terminate from worker {}", w)
} }
FetchResponse::Jobs(new_jobs) => { FetchResponse::Jobs(new_jobs) => {
assert_eq!(new_jobs[0].id, 0); assert_eq!(new_jobs[0].id, jobid);
assert_eq!(new_jobs[0].cmd, cmd); assert_eq!(new_jobs[0].cmd, cmd);
} }
} }
@@ -322,6 +300,7 @@ mod tests {
#[actix_web::test] #[actix_web::test]
async fn test_status() { async fn test_status() {
let cmd = String::from("hi"); let cmd = String::from("hi");
let jobid = 1;
let app = test::init_service( let app = test::init_service(
App::new() App::new()
.app_data(String::from("secret")) .app_data(String::from("secret"))
@@ -330,7 +309,7 @@ mod tests {
workers: Mutex::new(Vec::new()), workers: Mutex::new(Vec::new()),
new_jobs: Mutex::new(Vec::new()), new_jobs: Mutex::new(Vec::new()),
jobs: Mutex::new(vec![Job { jobs: Mutex::new(vec![Job {
id: 1, id: jobid,
cmd: cmd.clone(), cmd: cmd.clone(),
status: Status::Submitted, status: Status::Submitted,
}]), }]),
@@ -340,11 +319,11 @@ mod tests {
.await; .await;
let req = test::TestRequest::post() let req = test::TestRequest::post()
.append_header(("cookie", "secret")) .append_header(("cookie", "secret"))
.set_json(vec![StatusRequest { id: 1 }]) .set_json(vec![StatusRequest { id: jobid }])
.uri("/status") .uri("/status")
.to_request(); .to_request();
let resp: Vec<Job> = test::call_and_read_body_json(&app, req).await; let resp: Vec<Job> = test::call_and_read_body_json(&app, req).await;
assert_eq!(resp[0].id, 1); assert_eq!(resp[0].id, jobid);
} }
#[actix_web::test] #[actix_web::test]