Fix Scan Trigger by providing JWT Auth
All checks were successful
Run Tests on Code / run-tests (push) Successful in 15s

This commit is contained in:
Neshura 2024-08-07 22:50:02 +02:00
parent 3abca4c124
commit 3e27cad6a8
Signed by: Neshura
GPG key ID: 4E2D47B1374C297D

View file

@ -1,7 +1,6 @@
mod logging; mod logging;
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::format;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use axum::body::BodyDataStream; use axum::body::BodyDataStream;
use axum::extract::{Request, State}; use axum::extract::{Request, State};
@ -11,8 +10,7 @@ use axum::routing::post;
use dotenv::{dotenv, var}; use dotenv::{dotenv, var};
use futures::TryStreamExt; use futures::TryStreamExt;
use log::LevelFilter; use log::LevelFilter;
use reqwest::{Error, Response}; use serde::{Deserialize, Serialize};
use serde::Serialize;
use systemd_journal_logger::JournalLog; use systemd_journal_logger::JournalLog;
use tokio::fs::File; use tokio::fs::File;
use tokio::{fs, io}; use tokio::{fs, io};
@ -200,29 +198,43 @@ async fn upload_file(state: &mut App, request: Request) {
///$KAVITA_URL/api/Library/scan-folder ///$KAVITA_URL/api/Library/scan-folder
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let url = format!("{}/api/Library/scan-folder", var("KAVITA_URL").expect("KAVITA_URL needs to be set in the .env file")); let jwt_url = format!("{}/api/Plugin/authenticate?apiKey={}&pluginName=kwm-api", var("KAVITA_URL").expect("KAVITA_URL needs to be set in the .env file"), var("KAVITA_API_KEY").expect("KAVITA_API_KEY needs to be set in the .env file"));
let request_body = LibraryScanBody {
folder_path: file.format,
api_key: var("KAVITA_API_KEY").expect("KAVITA_API_KEY needs to be set in the .env file")
};
let body = serde_json::to_string::<LibraryScanBody>(&request_body).expect("Unable to Parse LibraryScanBody"); match client.post(jwt_url).send().await {
Ok(data) => {
let auth: PluginAuthResponse = serde_json::from_str(&data.text().await.unwrap()).unwrap();
let url = format!("{}/api/Library/scan-folder", var("KAVITA_URL").expect("KAVITA_URL needs to be set in the .env file"));
let res = client let request_body = LibraryScanBody {
.post(url) folder_path: file.format,
.body(body) api_key: var("KAVITA_API_KEY").expect("KAVITA_API_KEY needs to be set in the .env file")
.send() };
.await;
let body = serde_json::to_string::<LibraryScanBody>(&request_body).expect("Unable to Parse LibraryScanBody");
match res {
Ok(_) => { let res = client
state.log.info("Scan Triggered".to_string()); .post(url)
.bearer_auth(auth.token)
.body(body)
.send()
.await;
match res {
Ok(_) => {
state.log.info("Scan Triggered".to_string());
}
Err(e) => {
state.log.error(format!("Error Triggering Library Scan: {e}"));
}
}
} }
Err(e) => { Err(e) => {
state.log.error(format!("Error Triggering Library Scan: {e}"));
} }
} }
} }
async fn stream_to_file(path: &PathBuf, stream: BodyDataStream) -> Result<(), (StatusCode, String)> async fn stream_to_file(path: &PathBuf, stream: BodyDataStream) -> Result<(), (StatusCode, String)>
@ -252,3 +264,15 @@ struct LibraryScanBody {
folder_path: String, folder_path: String,
api_key: String, api_key: String,
} }
#[derive(Deserialize)]
#[serde(rename_all="camelCase")]
struct PluginAuthResponse {
username: String,
token: String,
refresh_token: String,
api_key: String,
preferences: serde_json::Value,
age_restriction: serde_json::Value,
kavita_version: String
}