implement secrets read from env vars
This commit is contained in:
@@ -87,7 +87,7 @@ type HistoryViewEntry = (String, String, bool, String, String);
|
||||
async fn get_submission_history(
|
||||
secret_key: String,
|
||||
) -> Result<Vec<HistoryViewEntry>, ServerFnError> {
|
||||
if !crate::manage::valid_status_secret_key(&secret_key) {
|
||||
if !crate::secrets::validate_dev_secret_key(&secret_key)? {
|
||||
return Err(ServerFnError::new("Invalid secret key"));
|
||||
}
|
||||
|
||||
@@ -243,7 +243,7 @@ fn persist_submission(submission: &SuccessfulSubmission) -> Result<(), ServerFnE
|
||||
|
||||
#[server]
|
||||
async fn clear_submission_history(secret_key: String) -> Result<(), ServerFnError> {
|
||||
if !crate::manage::valid_status_secret_key(&secret_key) {
|
||||
if !crate::secrets::validate_dev_secret_key(&secret_key)? {
|
||||
return Err(ServerFnError::new("Invalid secret key"));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
pub mod app;
|
||||
pub mod codes;
|
||||
pub mod manage;
|
||||
#[cfg(feature = "ssr")]
|
||||
pub mod secrets;
|
||||
|
||||
#[cfg(feature = "hydrate")]
|
||||
#[wasm_bindgen::prelude::wasm_bindgen]
|
||||
|
||||
+5
-4
@@ -1,12 +1,13 @@
|
||||
|
||||
#[cfg(feature = "ssr")]
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
use axum::Router;
|
||||
use code_submission::app::*;
|
||||
use leptos::logging::log;
|
||||
use leptos::prelude::*;
|
||||
use leptos_axum::{generate_route_list, LeptosRoutes};
|
||||
use code_submission::app::*;
|
||||
|
||||
code_submission::secrets::load_dotenv().expect("Unable to load .env configuration");
|
||||
|
||||
let conf = get_configuration(None).unwrap();
|
||||
let addr = conf.leptos_options.site_addr;
|
||||
@@ -30,8 +31,8 @@ async fn main() {
|
||||
listener,
|
||||
app.into_make_service_with_connect_info::<std::net::SocketAddr>(),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "ssr"))]
|
||||
|
||||
+1
-9
@@ -12,14 +12,6 @@ pub(crate) fn server_live_state() -> bool {
|
||||
SERVER_LIVE.load(Ordering::SeqCst)
|
||||
}
|
||||
|
||||
#[cfg(feature = "ssr")]
|
||||
const STATUS_SECRET_KEY: &str = "password";
|
||||
|
||||
#[cfg(feature = "ssr")]
|
||||
pub(crate) fn valid_status_secret_key(secret_key: &str) -> bool {
|
||||
secret_key == STATUS_SECRET_KEY
|
||||
}
|
||||
|
||||
#[server]
|
||||
async fn get_live_state() -> Result<bool, ServerFnError> {
|
||||
Ok(server_live_state())
|
||||
@@ -27,7 +19,7 @@ async fn get_live_state() -> Result<bool, ServerFnError> {
|
||||
|
||||
#[server]
|
||||
async fn set_live_state(live: bool, secret_key: String) -> Result<(), ServerFnError> {
|
||||
if !valid_status_secret_key(&secret_key) {
|
||||
if !crate::secrets::validate_dev_secret_key(&secret_key)? {
|
||||
return Err(ServerFnError::ServerError("Invalid secret key".to_string()));
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
use leptos::prelude::ServerFnError;
|
||||
use std::io::ErrorKind;
|
||||
|
||||
pub(crate) const DEV_SECRET_KEY: &str = "DEV_SECRET_KEY";
|
||||
|
||||
pub fn load_dotenv() -> Result<(), String> {
|
||||
match dotenvy::dotenv() {
|
||||
Ok(_) => Ok(()),
|
||||
Err(dotenvy::Error::Io(error)) if error.kind() == ErrorKind::NotFound => Ok(()),
|
||||
Err(error) => Err(format!("Unable to load .env file: {error}")),
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn validate_dev_secret_key(provided_key: &str) -> Result<bool, ServerFnError> {
|
||||
let expected_key = std::env::var(DEV_SECRET_KEY).map_err(|_| {
|
||||
ServerFnError::new(format!(
|
||||
"Required server secret {DEV_SECRET_KEY} is not configured"
|
||||
))
|
||||
})?;
|
||||
|
||||
Ok(provided_key == expected_key)
|
||||
}
|
||||
Reference in New Issue
Block a user