Verified Commit 0ca714c1 authored by Kourser's avatar Kourser
Browse files

Veille : une adresse venue d'un flux n'est pas forcément une adresse

Le contenu d'un flux RSS ou d'une recherche publique est écrit par des tiers.
« javascript: » dans une balise <link> était un lien qui s'exécutait au clic,
dans la session de qui avait cliqué. Le bouton n'apparaît plus que pour ce qui
est réellement du web.

Co-Authored-By: Claude (RCA)
Signed-off-by: default avatarJordan Grossemy <jordan.grossemy@rca.fr>
parent 97332f32
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -30,6 +30,24 @@ interface Signal {
 * en ajout seul ne se purge pas. Seul « retenir » inscrit — parce qu’alors
 * quelqu’un a décidé que cela comptait.
 */
/**
 * Une adresse venue d'un flux externe n'est pas forcément une adresse.
 *
 * Le contenu d'un flux RSS ou d'une recherche publique est écrit par des tiers,
 * et « javascript: » dans une balise <link> est un lien qui s'exécute au clic,
 * dans la session de qui a cliqué. On n'affiche donc le bouton que pour ce qui
 * est réellement du web.
 */
function lienSur(url: string | null): boolean {
  if (!url) return false;
  try {
    const p = new URL(url, window.location.origin).protocol;
    return p === "http:" || p === "https:";
  } catch {
    return false;
  }
}

export function VeilleExterne({ organisationId, criseId }: {
  organisationId: string; criseId?: string | null;
}) {
@@ -158,8 +176,8 @@ export function VeilleExterne({ organisationId, criseId }: {
                </div>
                <p style={{ margin: "6px 0", fontSize: 14, lineHeight: 1.45 }}>{s.texte}</p>
                <div className="ligne" style={{ gap: 6 }}>
                  {s.url && (
                    <a className="bouton petit" href={s.url} target="_blank" rel="noreferrer">
                  {lienSur(s.url) && (
                    <a className="bouton petit" href={s.url!} target="_blank" rel="noreferrer">
                      Ouvrir
                    </a>
                  )}