fix: set secure only for https

This commit is contained in:
Ruben Fiszel
2022-08-15 10:40:01 +02:00
parent 92d1a3a441
commit 1275f5f7fb
3 changed files with 22 additions and 5 deletions
+4 -1
View File
@@ -87,7 +87,7 @@ pub async fn connect_db() -> anyhow::Result<DB> {
}
struct BaseUrl(String);
struct IsSecure(bool);
struct CloudHosted(bool);
pub async fn run_server(
@@ -127,6 +127,9 @@ pub async fn run_server(
.layer(Extension(Arc::new(CloudHosted(
std::env::var("CLOUD_HOSTED").is_ok(),
))))
.layer(Extension(Arc::new(IsSecure(
base_url.starts_with("https://"),
))))
.layer(Extension(http_client))
.layer(CookieManagerLayer::new());
// build our application with a route
+12 -2
View File
@@ -22,6 +22,7 @@ use sqlx::{Postgres, Transaction};
use tokio::{fs::File, io::AsyncReadExt};
use tower_cookies::{Cookie, Cookies};
use crate::IsSecure;
use crate::{
audit::{audit_log, ActionKind},
db::{UserDB, DB},
@@ -706,6 +707,7 @@ async fn login_callback(
Extension(clients): Extension<Arc<AllClients>>,
Extension(db): Extension<DB>,
Extension(http_client): Extension<Client>,
Extension(is_secure): Extension<Arc<IsSecure>>,
) -> error::Result<String> {
let client = (&clients
.logins
@@ -731,7 +733,14 @@ async fn login_callback(
if let Some((email, login_type, super_admin)) = login {
let login_type = serde_json::json!(login_type);
if login_type == client_name {
crate::users::create_session_token(&email, super_admin, &mut tx, cookies).await?;
crate::users::create_session_token(
&email,
super_admin,
&mut tx,
cookies,
is_secure.0,
)
.await?;
} else {
return Err(error::Error::BadRequest(format!(
"an user with the email associated to this login exists but with a different \
@@ -751,7 +760,8 @@ async fn login_callback(
.bind(user.company)
.execute(&mut tx)
.await?;
crate::users::create_session_token(&email, false, &mut tx, cookies).await?;
crate::users::create_session_token(&email, false, &mut tx, cookies, is_secure.0)
.await?;
audit_log(
&mut tx,
&email,
+6 -2
View File
@@ -13,6 +13,7 @@ use crate::{
db::{UserDB, DB},
error::{self, Error, JsonResult, Result},
utils::{require_admin, require_super_admin, Pagination},
IsSecure,
};
use argon2::{password_hash::SaltString, Argon2, PasswordHash, PasswordHasher, PasswordVerifier};
use axum::{
@@ -1228,6 +1229,7 @@ async fn login(
cookies: Cookies,
Extension(db): Extension<DB>,
Extension(argon2): Extension<Arc<Argon2<'_>>>,
Extension(is_secure): Extension<Arc<IsSecure>>,
Json(Login { email, password }): Json<Login>,
) -> Result<String> {
let mut tx = db.begin().await?;
@@ -1249,7 +1251,8 @@ async fn login(
{
Err(Error::BadRequest("Invalid login".to_string()))
} else {
let token = create_session_token(&email, super_admin, &mut tx, cookies).await?;
let token =
create_session_token(&email, super_admin, &mut tx, cookies, is_secure.0).await?;
tx.commit().await?;
Ok(token)
}
@@ -1263,6 +1266,7 @@ pub async fn create_session_token<'c>(
super_admin: bool,
tx: &mut sqlx::Transaction<'c, sqlx::Postgres>,
cookies: Cookies,
is_secure: bool,
) -> Result<String> {
let token = gen_token();
sqlx::query!(
@@ -1278,7 +1282,7 @@ pub async fn create_session_token<'c>(
.execute(tx)
.await?;
let mut cookie = Cookie::new(COOKIE_NAME, token.clone());
cookie.set_secure(true);
cookie.set_secure(is_secure);
cookie.set_path(COOKIE_PATH);
let mut expire: OffsetDateTime = time::OffsetDateTime::now_utc();
expire += time::Duration::days(3);