diff options
author | FxQnLr <[email protected]> | 2023-10-15 17:51:08 +0200 |
---|---|---|
committer | GitHub <[email protected]> | 2023-10-15 17:51:08 +0200 |
commit | e0be33fc23d210dbd630a1bed2fe0ecb2ea6ce0b (patch) | |
tree | 4d7a2e553c0ea67f7aa3c63d788d76d714479fd1 /src | |
parent | b0e8aabfb9ea0f4c40a2aa330dd59f07b6c91216 (diff) | |
parent | abd4fbbf0ebd0385f68507eb20f9385db1b96793 (diff) | |
download | webol-e0be33fc23d210dbd630a1bed2fe0ecb2ea6ce0b.tar webol-e0be33fc23d210dbd630a1bed2fe0ecb2ea6ce0b.tar.gz webol-e0be33fc23d210dbd630a1bed2fe0ecb2ea6ce0b.zip |
Merge pull request #2 from FxQnLr/test
Get working actions and build into main
Diffstat (limited to 'src')
-rw-r--r-- | src/auth.rs | 7 | ||||
-rw-r--r-- | src/main.rs | 17 | ||||
-rw-r--r-- | src/routes/device.rs | 4 | ||||
-rw-r--r-- | src/routes/start.rs | 3 |
4 files changed, 23 insertions, 8 deletions
diff --git a/src/auth.rs b/src/auth.rs index b7693a0..81e798f 100644 --- a/src/auth.rs +++ b/src/auth.rs | |||
@@ -1,21 +1,26 @@ | |||
1 | use std::error::Error; | 1 | use std::error::Error; |
2 | use axum::headers::HeaderValue; | 2 | use axum::headers::HeaderValue; |
3 | use axum::http::StatusCode; | 3 | use axum::http::StatusCode; |
4 | use tracing::error; | 4 | use tracing::{debug, error, trace}; |
5 | use crate::auth::AuthError::{MissingSecret, ServerError, WrongSecret}; | 5 | use crate::auth::AuthError::{MissingSecret, ServerError, WrongSecret}; |
6 | use crate::config::SETTINGS; | 6 | use crate::config::SETTINGS; |
7 | 7 | ||
8 | pub fn auth(secret: Option<&HeaderValue>) -> Result<bool, AuthError> { | 8 | pub fn auth(secret: Option<&HeaderValue>) -> Result<bool, AuthError> { |
9 | debug!("auth request with secret {:?}", secret); | ||
9 | if let Some(value) = secret { | 10 | if let Some(value) = secret { |
11 | trace!("value exists"); | ||
10 | let key = SETTINGS | 12 | let key = SETTINGS |
11 | .get_string("apikey") | 13 | .get_string("apikey") |
12 | .map_err(|err| ServerError(Box::new(err)))?; | 14 | .map_err(|err| ServerError(Box::new(err)))?; |
13 | if value.to_str().map_err(|err| ServerError(Box::new(err)))? == key.as_str() { | 15 | if value.to_str().map_err(|err| ServerError(Box::new(err)))? == key.as_str() { |
16 | debug!("successful auth"); | ||
14 | Ok(true) | 17 | Ok(true) |
15 | } else { | 18 | } else { |
19 | debug!("unsuccessful auth (wrong secret)"); | ||
16 | Err(WrongSecret) | 20 | Err(WrongSecret) |
17 | } | 21 | } |
18 | } else { | 22 | } else { |
23 | debug!("unsuccessful auth (no secret)"); | ||
19 | Err(MissingSecret) | 24 | Err(MissingSecret) |
20 | } | 25 | } |
21 | } | 26 | } |
diff --git a/src/main.rs b/src/main.rs index bb37dc2..b7306ea 100644 --- a/src/main.rs +++ b/src/main.rs | |||
@@ -7,6 +7,7 @@ use sqlx::postgres::PgPoolOptions; | |||
7 | use time::util::local_offset; | 7 | use time::util::local_offset; |
8 | use tracing::{debug, info, level_filters::LevelFilter}; | 8 | use tracing::{debug, info, level_filters::LevelFilter}; |
9 | use tracing_subscriber::{EnvFilter, fmt::{self, time::LocalTime}, prelude::*}; | 9 | use tracing_subscriber::{EnvFilter, fmt::{self, time::LocalTime}, prelude::*}; |
10 | use crate::config::SETTINGS; | ||
10 | use crate::routes::device::{get_device, post_device, put_device}; | 11 | use crate::routes::device::{get_device, post_device, put_device}; |
11 | use crate::routes::start::start; | 12 | use crate::routes::start::start; |
12 | 13 | ||
@@ -37,13 +38,12 @@ async fn main() { | |||
37 | 38 | ||
38 | let version = env!("CARGO_PKG_VERSION"); | 39 | let version = env!("CARGO_PKG_VERSION"); |
39 | 40 | ||
40 | info!("starting webol v{}", version); | 41 | info!("start webol v{}", version); |
41 | 42 | ||
42 | let db = init_db_pool().await; | 43 | let db = init_db_pool().await; |
43 | 44 | ||
44 | let shared_state = Arc::new(AppState { db }); | 45 | let shared_state = Arc::new(AppState { db }); |
45 | 46 | ||
46 | // build our application with a single route | ||
47 | let app = Router::new() | 47 | let app = Router::new() |
48 | .route("/start", post(start)) | 48 | .route("/start", post(start)) |
49 | .route("/device", get(get_device)) | 49 | .route("/device", get(get_device)) |
@@ -51,8 +51,9 @@ async fn main() { | |||
51 | .route("/device", post(post_device)) | 51 | .route("/device", post(post_device)) |
52 | .with_state(shared_state); | 52 | .with_state(shared_state); |
53 | 53 | ||
54 | // run it with hyper on localhost:3000 | 54 | let addr = SETTINGS.get_string("serveraddr").unwrap_or("0.0.0.0:7229".to_string()); |
55 | axum::Server::bind(&"0.0.0.0:3000".parse().unwrap()) | 55 | info!("start server on {}", addr); |
56 | axum::Server::bind(&addr.parse().unwrap()) | ||
56 | .serve(app.into_make_service()) | 57 | .serve(app.into_make_service()) |
57 | .await | 58 | .await |
58 | .unwrap(); | 59 | .unwrap(); |
@@ -63,9 +64,13 @@ pub struct AppState { | |||
63 | } | 64 | } |
64 | 65 | ||
65 | async fn init_db_pool() -> PgPool { | 66 | async fn init_db_pool() -> PgPool { |
67 | #[cfg(not(debug_assertions))] | ||
68 | let db_url = SETTINGS.get_string("database.url").unwrap(); | ||
69 | |||
70 | #[cfg(debug_assertions)] | ||
66 | let db_url = env::var("DATABASE_URL").unwrap(); | 71 | let db_url = env::var("DATABASE_URL").unwrap(); |
67 | 72 | ||
68 | debug!("attempting to connect dbPool to '{}'", db_url); | 73 | debug!("attempt to connect dbPool to '{}'", db_url); |
69 | 74 | ||
70 | let pool = PgPoolOptions::new() | 75 | let pool = PgPoolOptions::new() |
71 | .max_connections(5) | 76 | .max_connections(5) |
@@ -76,4 +81,4 @@ async fn init_db_pool() -> PgPool { | |||
76 | info!("dbPool successfully connected to '{}'", db_url); | 81 | info!("dbPool successfully connected to '{}'", db_url); |
77 | 82 | ||
78 | pool | 83 | pool |
79 | } \ No newline at end of file | 84 | } |
diff --git a/src/routes/device.rs b/src/routes/device.rs index d5d7144..025c7d0 100644 --- a/src/routes/device.rs +++ b/src/routes/device.rs | |||
@@ -4,11 +4,13 @@ use axum::headers::HeaderMap; | |||
4 | use axum::Json; | 4 | use axum::Json; |
5 | use serde::{Deserialize, Serialize}; | 5 | use serde::{Deserialize, Serialize}; |
6 | use serde_json::{json, Value}; | 6 | use serde_json::{json, Value}; |
7 | use tracing::info; | ||
7 | use crate::auth::auth; | 8 | use crate::auth::auth; |
8 | use crate::db::Device; | 9 | use crate::db::Device; |
9 | use crate::error::WebolError; | 10 | use crate::error::WebolError; |
10 | 11 | ||
11 | pub async fn get_device(State(state): State<Arc<crate::AppState>>, headers: HeaderMap, Json(payload): Json<GetDevicePayload>) -> Result<Json<Value>, WebolError> { | 12 | pub async fn get_device(State(state): State<Arc<crate::AppState>>, headers: HeaderMap, Json(payload): Json<GetDevicePayload>) -> Result<Json<Value>, WebolError> { |
13 | info!("GET request"); | ||
12 | let secret = headers.get("authorization"); | 14 | let secret = headers.get("authorization"); |
13 | if auth(secret).map_err(WebolError::Auth)? { | 15 | if auth(secret).map_err(WebolError::Auth)? { |
14 | let device = sqlx::query_as!( | 16 | let device = sqlx::query_as!( |
@@ -33,6 +35,7 @@ pub struct GetDevicePayload { | |||
33 | } | 35 | } |
34 | 36 | ||
35 | pub async fn put_device(State(state): State<Arc<crate::AppState>>, headers: HeaderMap, Json(payload): Json<PutDevicePayload>) -> Result<Json<Value>, WebolError> { | 37 | pub async fn put_device(State(state): State<Arc<crate::AppState>>, headers: HeaderMap, Json(payload): Json<PutDevicePayload>) -> Result<Json<Value>, WebolError> { |
38 | info!("PUT request"); | ||
36 | let secret = headers.get("authorization"); | 39 | let secret = headers.get("authorization"); |
37 | if auth(secret).map_err(WebolError::Auth)? { | 40 | if auth(secret).map_err(WebolError::Auth)? { |
38 | sqlx::query!( | 41 | sqlx::query!( |
@@ -64,6 +67,7 @@ pub struct PutDeviceResponse { | |||
64 | } | 67 | } |
65 | 68 | ||
66 | pub async fn post_device(State(state): State<Arc<crate::AppState>>, headers: HeaderMap, Json(payload): Json<PostDevicePayload>) -> Result<Json<Value>, WebolError> { | 69 | pub async fn post_device(State(state): State<Arc<crate::AppState>>, headers: HeaderMap, Json(payload): Json<PostDevicePayload>) -> Result<Json<Value>, WebolError> { |
70 | info!("POST request"); | ||
67 | let secret = headers.get("authorization"); | 71 | let secret = headers.get("authorization"); |
68 | if auth(secret).map_err(WebolError::Auth)? { | 72 | if auth(secret).map_err(WebolError::Auth)? { |
69 | let device = sqlx::query_as!( | 73 | let device = sqlx::query_as!( |
diff --git a/src/routes/start.rs b/src/routes/start.rs index d16ea4e..163d58c 100644 --- a/src/routes/start.rs +++ b/src/routes/start.rs | |||
@@ -12,6 +12,7 @@ use crate::db::Device; | |||
12 | use crate::error::WebolError; | 12 | use crate::error::WebolError; |
13 | 13 | ||
14 | pub async fn start(State(state): State<Arc<crate::AppState>>, headers: HeaderMap, Json(payload): Json<StartPayload>) -> Result<Json<Value>, WebolError> { | 14 | pub async fn start(State(state): State<Arc<crate::AppState>>, headers: HeaderMap, Json(payload): Json<StartPayload>) -> Result<Json<Value>, WebolError> { |
15 | info!("POST request"); | ||
15 | let secret = headers.get("authorization"); | 16 | let secret = headers.get("authorization"); |
16 | if auth(secret).map_err(WebolError::Auth)? { | 17 | if auth(secret).map_err(WebolError::Auth)? { |
17 | let device = sqlx::query_as!( | 18 | let device = sqlx::query_as!( |
@@ -28,7 +29,7 @@ pub async fn start(State(state): State<Arc<crate::AppState>>, headers: HeaderMap | |||
28 | 29 | ||
29 | let bind_addr = SETTINGS | 30 | let bind_addr = SETTINGS |
30 | .get_string("bindaddr") | 31 | .get_string("bindaddr") |
31 | .map_err(|err| WebolError::Server(Box::new(err)))?; | 32 | .unwrap_or("0.0.0.0:1111".to_string()); |
32 | 33 | ||
33 | let _ = send_packet( | 34 | let _ = send_packet( |
34 | &bind_addr.parse().map_err(|err| WebolError::Server(Box::new(err)))?, | 35 | &bind_addr.parse().map_err(|err| WebolError::Server(Box::new(err)))?, |