Revert "Use config file to store sessions"

This reverts commit 850aa7a9
This commit is contained in:
bytedream 2023-07-13 16:07:05 +02:00
parent 8490263e84
commit dd2033d323
8 changed files with 48 additions and 179 deletions

82
Cargo.lock generated
View file

@ -397,7 +397,6 @@ dependencies = [
"sys-locale", "sys-locale",
"tempfile", "tempfile",
"tokio", "tokio",
"toml",
] ]
[[package]] [[package]]
@ -579,12 +578,6 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "equivalent"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1"
[[package]] [[package]]
name = "errno" name = "errno"
version = "0.3.1" version = "0.3.1"
@ -737,7 +730,7 @@ dependencies = [
"futures-sink", "futures-sink",
"futures-util", "futures-util",
"http", "http",
"indexmap 1.9.3", "indexmap",
"slab", "slab",
"tokio", "tokio",
"tokio-util", "tokio-util",
@ -750,12 +743,6 @@ version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "hashbrown"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
[[package]] [[package]]
name = "heck" name = "heck"
version = "0.4.1" version = "0.4.1"
@ -913,20 +900,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"hashbrown 0.12.3", "hashbrown",
"serde", "serde",
] ]
[[package]]
name = "indexmap"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
dependencies = [
"equivalent",
"hashbrown 0.14.0",
]
[[package]] [[package]]
name = "indicatif" name = "indicatif"
version = "0.17.5" version = "0.17.5"
@ -1482,15 +1459,6 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "serde_spanned"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "serde_urlencoded" name = "serde_urlencoded"
version = "0.7.1" version = "0.7.1"
@ -1512,7 +1480,7 @@ dependencies = [
"base64", "base64",
"chrono", "chrono",
"hex", "hex",
"indexmap 1.9.3", "indexmap",
"serde", "serde",
"serde_json", "serde_json",
"serde_with_macros", "serde_with_macros",
@ -1764,41 +1732,6 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "toml"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542"
dependencies = [
"indexmap 2.0.0",
"serde",
"serde_spanned",
"toml_datetime",
"toml_edit",
]
[[package]]
name = "toml_datetime"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
dependencies = [
"serde",
]
[[package]]
name = "toml_edit"
version = "0.19.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78"
dependencies = [
"indexmap 2.0.0",
"serde",
"serde_spanned",
"toml_datetime",
"winnow",
]
[[package]] [[package]]
name = "tower-service" name = "tower-service"
version = "0.3.2" version = "0.3.2"
@ -2181,15 +2114,6 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]]
name = "winnow"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81a2094c43cc94775293eaa0e499fbc30048a6d824ac82c0351a8c0bf9112529"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "winreg" name = "winreg"
version = "0.10.1" version = "0.10.1"

View file

@ -27,7 +27,6 @@ serde_json = "1.0"
serde_plain = "1.0" serde_plain = "1.0"
shlex = "1.1" shlex = "1.1"
tempfile = "3.6" tempfile = "3.6"
toml = { version = "0.7", features = ["display", "parse", "preserve_order"] }
tokio = { version = "1.29", features = ["macros", "rt-multi-thread", "time"] } tokio = { version = "1.29", features = ["macros", "rt-multi-thread", "time"] }
sys-locale = "0.3" sys-locale = "0.3"

View file

@ -17,7 +17,6 @@ mod login;
mod search; mod search;
mod utils; mod utils;
use crate::utils::config::{Auth, Config};
pub use archive::Archive; pub use archive::Archive;
use dialoguer::console::Term; use dialoguer::console::Term;
pub use download::Download; pub use download::Download;
@ -137,20 +136,8 @@ pub async fn cli_entrypoint() {
} }
Command::Login(login) => { Command::Login(login) => {
if login.remove { if login.remove {
match Config::load() { if let Some(session_file) = login::session_file_path() {
Ok(config) => { let _ = fs::remove_file(session_file);
if let Some(mut c) = config {
c.auth = None;
if let Err(e) = c.write() {
error!("{}", e);
std::process::exit(1)
}
}
}
Err(e) => {
error!("{}", e);
std::process::exit(1)
}
} }
return; return;
} else { } else {
@ -239,12 +226,11 @@ async fn execute_executor(executor: impl Execute, ctx: Context) {
} }
async fn create_ctx(cli: &mut Cli) -> Result<Context> { async fn create_ctx(cli: &mut Cli) -> Result<Context> {
let mut config = Config::load()?.unwrap_or_default(); let crunchy = crunchyroll_session(cli).await?;
let crunchy = crunchyroll_session(cli, &mut config).await?; Ok(Context { crunchy })
Ok(Context { crunchy, config })
} }
async fn crunchyroll_session(cli: &mut Cli, config: &mut Config) -> Result<Crunchyroll> { async fn crunchyroll_session(cli: &mut Cli) -> Result<Crunchyroll> {
let supported_langs = vec![ let supported_langs = vec![
Locale::ar_ME, Locale::ar_ME,
Locale::de_DE, Locale::de_DE,
@ -307,12 +293,20 @@ async fn crunchyroll_session(cli: &mut Cli, config: &mut Config) -> Result<Crunc
let progress_handler = progress!("Logging in"); let progress_handler = progress!("Logging in");
if root_login_methods_count + login_login_methods_count == 0 { if root_login_methods_count + login_login_methods_count == 0 {
if let Some(auth) = &config.auth { if let Some(login_file_path) = login::session_file_path() {
return match auth { if login_file_path.exists() {
Auth::RefreshToken { token } => Ok(builder.login_with_refresh_token(token).await?), let session = fs::read_to_string(login_file_path)?;
Auth::EtpRt { token } => Ok(builder.login_with_etp_rt(token).await?), if let Some((token_type, token)) = session.split_once(':') {
Auth::Anonymous => Ok(builder.login_anonymously().await?), match token_type {
}; "refresh_token" => {
return Ok(builder.login_with_refresh_token(token).await?)
}
"etp_rt" => return Ok(builder.login_with_etp_rt(token).await?),
_ => (),
}
}
bail!("Could not read stored session ('{}')", session)
}
} }
bail!("Please use a login method ('--credentials', '--etp-rt' or '--anonymous')") bail!("Please use a login method ('--credentials', '--etp-rt' or '--anonymous')")
} else if root_login_methods_count + login_login_methods_count > 1 { } else if root_login_methods_count + login_login_methods_count > 1 {

View file

@ -1,10 +1,12 @@
use crate::utils::config::Auth;
use crate::utils::context::Context; use crate::utils::context::Context;
use crate::Execute; use crate::Execute;
use anyhow::bail;
use anyhow::Result; use anyhow::Result;
use clap::Parser; use clap::Parser;
use crunchyroll_rs::crunchyroll::SessionToken; use crunchyroll_rs::crunchyroll::SessionToken;
use log::info; use log::info;
use std::fs;
use std::path::PathBuf;
#[derive(Debug, clap::Parser)] #[derive(Debug, clap::Parser)]
#[clap(about = "Save your login credentials persistent on disk")] #[clap(about = "Save your login credentials persistent on disk")]
@ -18,18 +20,26 @@ pub struct Login {
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl Execute for Login { impl Execute for Login {
async fn execute(self, mut ctx: Context) -> Result<()> { async fn execute(self, ctx: Context) -> Result<()> {
let auth = match ctx.crunchy.session_token().await { if let Some(login_file_path) = session_file_path() {
SessionToken::RefreshToken(token) => Auth::RefreshToken { token }, fs::create_dir_all(login_file_path.parent().unwrap())?;
SessionToken::EtpRt(token) => Auth::EtpRt { token },
SessionToken::Anonymous => Auth::Anonymous,
};
ctx.config.auth = Some(auth);
ctx.config.write()?;
info!("Saved login"); match ctx.crunchy.session_token().await {
SessionToken::RefreshToken(refresh_token) => {
fs::write(login_file_path, format!("refresh_token:{}", refresh_token))?
}
SessionToken::EtpRt(etp_rt) => {
fs::write(login_file_path, format!("etp_rt:{}", etp_rt))?
}
SessionToken::Anonymous => bail!("Anonymous login cannot be saved"),
}
Ok(()) info!("Saved login");
Ok(())
} else {
bail!("Cannot find config path")
}
} }
} }
@ -50,3 +60,7 @@ pub struct LoginMethod {
#[arg(long, default_value_t = false)] #[arg(long, default_value_t = false)]
pub anonymous: bool, pub anonymous: bool,
} }
pub fn session_file_path() -> Option<PathBuf> {
dirs::config_dir().map(|config_dir| config_dir.join("crunchy-cli").join("session"))
}

View file

@ -1,3 +1,3 @@
mod command; mod command;
pub use command::{Login, LoginMethod}; pub use command::{session_file_path, Login, LoginMethod};

View file

@ -1,59 +0,0 @@
use anyhow::{bail, Result};
use serde::{Deserialize, Serialize};
use std::fs;
use std::path::PathBuf;
#[derive(Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[serde(tag = "method")]
pub enum Auth {
RefreshToken { token: String },
EtpRt { token: String },
Anonymous,
}
#[derive(Default, Deserialize, Serialize)]
pub struct Config {
pub auth: Option<Auth>,
}
impl Config {
pub fn load() -> Result<Option<Self>> {
let path = Config::assert_config_file_path(true)?;
if let Some(p) = path {
if p.exists() {
let content = fs::read_to_string(p)?;
return Ok(Some(toml::from_str(&content)?));
}
}
Ok(None)
}
pub fn write(&self) -> Result<()> {
let path = Config::assert_config_file_path(false)?.unwrap();
Ok(fs::write(path, toml::to_string(self)?)?)
}
pub fn config_file_path() -> Option<PathBuf> {
dirs::config_dir().map(|config_dir| config_dir.join("crunchy-cli.conf"))
}
fn assert_config_file_path(ignore_non_existing_config_dir: bool) -> Result<Option<PathBuf>> {
let Some(path) = Config::config_file_path() else {
if ignore_non_existing_config_dir {
return Ok(None)
}
bail!("Cannot find config directory")
};
if path.exists() && path.is_dir() {
bail!(
"Config path ({}) is a directory (must be a normal file)",
path.to_string_lossy()
)
}
Ok(Some(path))
}
}

View file

@ -1,7 +1,5 @@
use crate::utils::config::Config;
use crunchyroll_rs::Crunchyroll; use crunchyroll_rs::Crunchyroll;
pub struct Context { pub struct Context {
pub crunchy: Crunchyroll, pub crunchy: Crunchyroll,
pub config: Config,
} }

View file

@ -1,5 +1,4 @@
pub mod clap; pub mod clap;
pub mod config;
pub mod context; pub mod context;
pub mod download; pub mod download;
pub mod ffmpeg; pub mod ffmpeg;