mirror of
https://github.com/TheFunny/TelegramTwitterMediaBot.git
synced 2026-10-01 00:32:05 +00:00
fix(pixiv): treat an empty refresh token as unset
docker-compose injects PIXIV_REFRESH_TOKEN='' for a blank .env value and enabled() only checked that the variable exists, so a default deployment read pixiv as configured, sent an empty refresh token to OAuth and failed login validation on every boot (error line + admin DM) — and it disagreed with the empty-as-unset gating the tests already use. Filter empty strings in PIXIV_CLIENT and enabled(), like twitter and bilibili; a unit test pins empty == unset.
This commit is contained in:
@@ -354,16 +354,23 @@ impl PixivAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// pixiv3-rs replacement: `None` when `PIXIV_REFRESH_TOKEN` is unset.
|
/// pixiv3-rs replacement: `None` when `PIXIV_REFRESH_TOKEN` is unset or empty
|
||||||
static PIXIV_CLIENT: LazyLock<Option<PixivAPI>> =
|
/// (compose injects an empty string for a blank `.env` value; an empty token
|
||||||
LazyLock::new(|| env::var("PIXIV_REFRESH_TOKEN").ok().map(PixivAPI::new));
|
/// must mean "not configured" instead of being sent to OAuth).
|
||||||
|
static PIXIV_CLIENT: LazyLock<Option<PixivAPI>> = LazyLock::new(|| {
|
||||||
|
env::var("PIXIV_REFRESH_TOKEN")
|
||||||
|
.ok()
|
||||||
|
.filter(|token| !token.is_empty())
|
||||||
|
.map(PixivAPI::new)
|
||||||
|
});
|
||||||
|
|
||||||
/// Set at startup when the login validation fails; pixiv stays disabled until
|
/// Set at startup when the login validation fails; pixiv stays disabled until
|
||||||
/// the next process start.
|
/// the next process start.
|
||||||
static DISABLED: AtomicBool = AtomicBool::new(false);
|
static DISABLED: AtomicBool = AtomicBool::new(false);
|
||||||
|
|
||||||
pub fn enabled() -> bool {
|
pub fn enabled() -> bool {
|
||||||
!DISABLED.load(Ordering::Relaxed) && env::var("PIXIV_REFRESH_TOKEN").is_ok()
|
!DISABLED.load(Ordering::Relaxed)
|
||||||
|
&& env::var("PIXIV_REFRESH_TOKEN").is_ok_and(|token| !token.is_empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Permanently disables pixiv until the next process start.
|
/// Permanently disables pixiv until the next process start.
|
||||||
@@ -397,6 +404,29 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
use dotenv::dotenv;
|
use dotenv::dotenv;
|
||||||
|
|
||||||
|
/// An empty `PIXIV_REFRESH_TOKEN` (what compose injects for a blank
|
||||||
|
/// `.env` value, and what an unset GitHub secret looks like) must read as
|
||||||
|
/// "not configured", exactly like unset — otherwise a default deployment
|
||||||
|
/// sends an empty refresh token to OAuth and fails login validation on
|
||||||
|
/// every boot.
|
||||||
|
#[test]
|
||||||
|
fn empty_refresh_token_reads_as_unset() {
|
||||||
|
// SAFETY: the value is restored before returning; `enabled()` keys on
|
||||||
|
// this variable alone and no other test mutates it. Concurrent readers
|
||||||
|
// see unset or empty, which this very fix makes the same answer.
|
||||||
|
let previous = env::var("PIXIV_REFRESH_TOKEN").ok();
|
||||||
|
unsafe { env::set_var("PIXIV_REFRESH_TOKEN", "") };
|
||||||
|
let empty = enabled();
|
||||||
|
unsafe { env::remove_var("PIXIV_REFRESH_TOKEN") };
|
||||||
|
let unset = enabled();
|
||||||
|
match previous {
|
||||||
|
Some(value) => unsafe { env::set_var("PIXIV_REFRESH_TOKEN", value) },
|
||||||
|
None => unsafe { env::remove_var("PIXIV_REFRESH_TOKEN") },
|
||||||
|
}
|
||||||
|
assert!(!empty, "an empty token must not enable pixiv");
|
||||||
|
assert_eq!(empty, unset, "empty must read exactly like unset");
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
#[ignore = "live network: requires outbound HTTPS to oauth.secure.pixiv.net"]
|
#[ignore = "live network: requires outbound HTTPS to oauth.secure.pixiv.net"]
|
||||||
async fn live_validate_with_bogus_token_fails() {
|
async fn live_validate_with_bogus_token_fails() {
|
||||||
|
|||||||
Reference in New Issue
Block a user