Compare commits
	
		
			2 Commits 
		
	
	
		
			65e83ecb1f
			...
			2249d986eb
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
									
								
								 | 
						2249d986eb | |
| 
							
							
								
									
								
								 | 
						ec07371cb3 | 
| 
						 | 
					@ -10,10 +10,13 @@ use axum_extra::{
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use cookie::time::Duration;
 | 
					use cookie::time::Duration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::server::{
 | 
					use crate::{
 | 
				
			||||||
    error::{AppError, AppResult},
 | 
					    gpodder,
 | 
				
			||||||
    gpodder::SESSION_ID_COOKIE,
 | 
					    server::{
 | 
				
			||||||
    Context,
 | 
					        error::{AppError, AppResult},
 | 
				
			||||||
 | 
					        gpodder::SESSION_ID_COOKIE,
 | 
				
			||||||
 | 
					        Context,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn router() -> Router<Context> {
 | 
					pub fn router() -> Router<Context> {
 | 
				
			||||||
| 
						 | 
					@ -33,6 +36,31 @@ async fn post_login(
 | 
				
			||||||
        return Err(AppError::BadRequest);
 | 
					        return Err(AppError::BadRequest);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // If a session token is present, we check if it's valid first and do nothing if it is
 | 
				
			||||||
 | 
					    if let Some(session_id) = jar
 | 
				
			||||||
 | 
					        .get(SESSION_ID_COOKIE)
 | 
				
			||||||
 | 
					        .and_then(|c| c.value().parse::<i64>().ok())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        let ctx = ctx.clone();
 | 
				
			||||||
 | 
					        match tokio::task::spawn_blocking(move || {
 | 
				
			||||||
 | 
					            let session = ctx.store.get_session(session_id)?;
 | 
				
			||||||
 | 
					            ctx.store.refresh_session(&session)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Ok(session)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .await
 | 
				
			||||||
 | 
					        .unwrap()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Ok(_) => {
 | 
				
			||||||
 | 
					                return Ok(jar);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Err(gpodder::AuthErr::UnknownSession) => {}
 | 
				
			||||||
 | 
					            Err(err) => {
 | 
				
			||||||
 | 
					                return Err(AppError::from(err));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let session = tokio::task::spawn_blocking(move || {
 | 
					    let session = tokio::task::spawn_blocking(move || {
 | 
				
			||||||
        let user = ctx
 | 
					        let user = ctx
 | 
				
			||||||
            .store
 | 
					            .store
 | 
				
			||||||
| 
						 | 
					@ -43,7 +71,12 @@ async fn post_login(
 | 
				
			||||||
    .unwrap()?;
 | 
					    .unwrap()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(jar.add(
 | 
					    Ok(jar.add(
 | 
				
			||||||
        Cookie::build((SESSION_ID_COOKIE, session.id.to_string())).max_age(Duration::days(365)),
 | 
					        Cookie::build((SESSION_ID_COOKIE, session.id.to_string()))
 | 
				
			||||||
 | 
					            .secure(false)
 | 
				
			||||||
 | 
					            .same_site(cookie::SameSite::Strict)
 | 
				
			||||||
 | 
					            .http_only(true)
 | 
				
			||||||
 | 
					            .path("/api")
 | 
				
			||||||
 | 
					            .max_age(Duration::days(365)),
 | 
				
			||||||
    ))
 | 
					    ))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
use chrono::{DateTime, Utc};
 | 
					use chrono::{DateTime, NaiveDateTime, Utc};
 | 
				
			||||||
use serde::{Deserialize, Serialize};
 | 
					use serde::{Deserialize, Serialize};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::gpodder;
 | 
					use crate::gpodder;
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@ pub enum EpisodeActionType {
 | 
				
			||||||
pub struct EpisodeAction {
 | 
					pub struct EpisodeAction {
 | 
				
			||||||
    pub podcast: String,
 | 
					    pub podcast: String,
 | 
				
			||||||
    pub episode: String,
 | 
					    pub episode: String,
 | 
				
			||||||
    pub timestamp: Option<i64>,
 | 
					    pub timestamp: Option<NaiveDateTime>,
 | 
				
			||||||
    #[serde(default)]
 | 
					    #[serde(default)]
 | 
				
			||||||
    pub device: Option<String>,
 | 
					    pub device: Option<String>,
 | 
				
			||||||
    #[serde(flatten)]
 | 
					    #[serde(flatten)]
 | 
				
			||||||
| 
						 | 
					@ -160,7 +160,7 @@ impl From<gpodder::EpisodeAction> for EpisodeAction {
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            podcast: value.podcast,
 | 
					            podcast: value.podcast,
 | 
				
			||||||
            episode: value.episode,
 | 
					            episode: value.episode,
 | 
				
			||||||
            timestamp: value.timestamp.map(|ts| ts.timestamp()),
 | 
					            timestamp: value.timestamp.map(|ts| ts.naive_utc()),
 | 
				
			||||||
            device: value.device,
 | 
					            device: value.device,
 | 
				
			||||||
            action: value.action.into(),
 | 
					            action: value.action.into(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -173,9 +173,7 @@ impl From<EpisodeAction> for gpodder::EpisodeAction {
 | 
				
			||||||
            podcast: value.podcast,
 | 
					            podcast: value.podcast,
 | 
				
			||||||
            episode: value.episode,
 | 
					            episode: value.episode,
 | 
				
			||||||
            // TODO remove this unwrap
 | 
					            // TODO remove this unwrap
 | 
				
			||||||
            timestamp: value
 | 
					            timestamp: value.timestamp.map(|ts| ts.and_utc()),
 | 
				
			||||||
                .timestamp
 | 
					 | 
				
			||||||
                .map(|ts| DateTime::from_timestamp(ts, 0).unwrap()),
 | 
					 | 
				
			||||||
            device: value.device,
 | 
					            device: value.device,
 | 
				
			||||||
            action: value.action.into(),
 | 
					            action: value.action.into(),
 | 
				
			||||||
            time_changed: DateTime::<Utc>::MIN_UTC,
 | 
					            time_changed: DateTime::<Utc>::MIN_UTC,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue