implement secrets read from env vars

This commit is contained in:
2026-10-06 16:00:51 -05:00
parent 576199b1e9
commit 370fe2e4aa
10 changed files with 49 additions and 17 deletions
+2 -2
View File
@@ -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"));
}
+2
View File
@@ -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
View File
@@ -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
View File
@@ -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()));
}
+22
View File
@@ -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)
}