Skip to main content

phemios_core/
enrichment.rs

1//! Private request preparation for shared app-owned service credentials.
2use serde_json::{Value, json};
3/// Attach only retained native keys after capability discovery; never accept keys from the WebView.
4pub fn attach_service_keys(body: &mut Value, keys: &Value, status: &Value) -> Result<(), String> {
5    let request = body
6        .as_object_mut()
7        .ok_or("Demande d’enrichissement invalide.")?;
8    if request.contains_key("service_keys") {
9        return Err("Les clés des sources externes restent dans la configuration native.".into());
10    }
11    let mut shared = json!({});
12    for (stored, wire) in [("fanart", "fanarttv"), ("acoustid", "acoustid")] {
13        if let Some(value) = keys.get(stored) {
14            let key = value.as_str().ok_or("Clés invalides.")?;
15            if key.trim().is_empty() || key.len() > 1024 || key.chars().any(char::is_control) {
16                return Err("Clé API invalide.".into());
17            }
18            shared[wire] = key.into();
19        }
20    }
21    if shared.as_object().is_some_and(|object| !object.is_empty()) {
22        if !status["capabilities"]
23            .as_array()
24            .is_some_and(|rows| rows.iter().any(|row| row == "fetch_service_keys"))
25        {
26            return Err(
27                "Mettez à jour puis redémarrez Aède pour utiliser les clés communes.".into(),
28            );
29        }
30        request.insert("service_keys".into(), shared);
31    }
32    Ok(())
33}
34#[cfg(test)]
35#[path = "enrichment_tests.rs"]
36mod tests;