discovery-media-player 0.1.32 → 0.1.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server/handler.js +21 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discovery-media-player",
3
- "version": "0.1.32",
3
+ "version": "0.1.33",
4
4
  "description": "Self-hosted document viewer: per-recipient tracked links, reading analytics, live presentation. The core knows nothing about the application hosting it — everything it borrows arrives through an injected context.",
5
5
  "keywords": [
6
6
  "pdf-viewer",
package/server/handler.js CHANGED
@@ -2996,15 +2996,30 @@ async function handler(req, res) {
2996
2996
  // légitime dont le bouton pointe vers SON domaine. L'email part de l'hôte, avec sa
2997
2997
  // marque et sa réputation, vers le destinataire choisi par l'attaquant.
2998
2998
  //
2999
- // `PLAYER_PUBLIC_URL` d'abord — une valeur que l'exploitant a écrite. Le repli sur
3000
- // `Host` reste pour ne casser aucune instance existante, mais il est SIGNALÉ : une
3001
- // instance qui envoie des emails sans URL publique configurée doit le savoir avant de
3002
- // le découvrir dans un rapport d'hameçonnage.
2999
+ // ⚠️ UNE ALERTE N'EST PAS UNE INTERDICTION.
3000
+ //
3001
+ // 0.1.21 posait `PLAYER_PUBLIC_URL`, retombait sur `Host` quand elle manquait, et
3002
+ // SIGNALAIT le repli. C'était le bon réflexe de compatibilité et la mauvaise
3003
+ // conclusion : le journal ne bloque pas un email d'hameçonnage. Une instance mal
3004
+ // configurée continuait d'envoyer, signée de sa marque, avec un bouton pointant où le
3005
+ // lecteur voulait — et l'exploitant l'apprenait dans un rapport d'abus.
3006
+ //
3007
+ // ⚠️ CE QU'ON REFUSE, C'EST L'ENVOI — PAS LE LIEN. Le lien enfant est créé, tracé, et
3008
+ // rendu à l'appelant : il peut le transmettre lui-même. Ce qui est retenu est la seule
3009
+ // chose qu'on ne peut pas rattraper — un courrier parti de nos serveurs, avec notre
3010
+ // domaine dans l'en-tête et notre réputation d'expéditeur derrière.
3011
+ //
3012
+ // La compatibilité invoquée en 0.1.21 ne tenait donc pas : refuser l'envoi ne casse
3013
+ // pas la création du lien, qui est la fonction principale de cette route.
3014
+ //
3015
+ // Signalé par la seconde passe d'audit (P1-1).
3003
3016
  const publique = String(PLAYER.legal.publicUrl || "").trim();
3004
3017
  if (!publique) {
3005
- try { PLAYER.errors.capture(new Error("PLAYER_PUBLIC_URL non configurée : le lien de l'email est construit depuis l'en-tête Host, que le client choisit"), { route: "reshare" }); } catch { /* jamais bloquant */ }
3018
+ try { PLAYER.errors.capture(new Error("PLAYER_PUBLIC_URL non configurée : envoi refusé (le lien de l'email serait construit depuis l'en-tête Host, que le client choisit)"), { route: "reshare" }); } catch { /* jamais bloquant */ }
3019
+ refusEnvoi = "public-url-unconfigured";
3020
+ throw new Error("URL publique non configurée");
3006
3021
  }
3007
- const origin = publique || `https://${req.headers.host}`;
3022
+ const origin = publique;
3008
3023
  const r = await sendReshareEmail({ parent, childSlug: out.slug, origin, toEmail: mail, toName: body.name });
3009
3024
  sent = !!(r && r.sent);
3010
3025
  } catch { /* best-effort : le lien existe quand même */ }