Erreur javascript : uncaught typerror ...... reading trim

Bonjour,

je suis en 4.3.5 et j’ai sur un écran d’un plugin l’erreur javascript suivante :

Uncaught TypeError: Cannot read properties of undefined (reading 'trim')

cf Screenshot de la console de débogage :

Et un copie/colle du code (je laisse le screenshot car la petite croix rouge n’apparait pas si on copie juste le code :wink:

if ('SecurityPolicyViolationEvent' in window) { // Check browser support of SecurityPolicyViolationEnevt interface
  window.addEventListener("securitypolicyviolation", function(event) {
    var uri = event.blockedURI
    if (event.originalPolicy && event.violatedDirective) {
      var violation = event.originalPolicy.trim().split(';').find(e => e.trim().startsWith(event.violatedDirective)).trim()
      if (event.disposition == 'enforce')
        var msg = `Impossible de charger la ressource "${uri}", car elle va contre la directive de Content Security Policy :<br /> "${violation}"`
      else
        var msg = `La ressource "${uri}" a été chargée, mais elle va contre la directive de Content Security Policy :<br /> "${violation}"`
    }else {
      var msg = `Erreur de directive Content Security Policy sur la ressource "${uri}"`
    }
    jeedomUtils.JS_ERROR.push({"filename": event.documentURI, "lineno": "0", "message": msg})
    $('#bt_jsErrorModal').show()
    $.hideLoading()
  })

Je pense que ca parlera à des dev !

Norbert

Salut,

Par défaut, c’est plus simple de mettre le code copié plutôt qu’une capture pour des recherches dans le code :wink:

Sinon, apparemment, le find ne retourne rien : aucun élément commençant par event.violatedDirective trouvé.
Donc tu ne peux pas appliquer la fonction sur un undefined (pas d’éléments retourné)

A voir si c’est un test sur le retour du find qu’il faut ajouter avant de faire le trim() ?

@Bad ?

cf https://community.jeedom.com/t/conseil-integration-maps/87372/21

ca vient du core, @ngrataloup ne cherche rien à faire :slight_smile:

Checking :sweat_smile:

Il va probablement falloir rajouter un check sur
event.originalPolicy != undefined

1 « J'aime »

Oui, je sais bien, c’est ce que j’ai constaté. Ca n’empêche qu’il peut y avoir quelque chose à corriger dans le core :wink:

même problème ici peut-être: Erreur récurrente suite à l'upgrade en 4.3

Si tu veux tester

event = new Event('securitypolicyviolation')
event.violatedDirective = ';'
event.originalPolicy = ';'
window.dispatchEvent(event)

OK, c’est normalement fixé par ce PR :

@ngrataloup, tu peux essayer de replacer :

if ('SecurityPolicyViolationEvent' in window) { // Check browser support of SecurityPolicyViolationEnevt interface
  window.addEventListener("securitypolicyviolation", function(event) {
    var uri = event.blockedURI
    if (event.originalPolicy && event.violatedDirective) {
      var violation = event.originalPolicy.trim().split(';').find(e => e.trim().startsWith(event.violatedDirective)).trim()
      if (event.disposition == 'enforce')
        var msg = `Impossible de charger la ressource "${uri}", car elle va contre la directive de Content Security Policy :<br /> "${violation}"`
      else
        var msg = `La ressource "${uri}" a été chargée, mais elle va contre la directive de Content Security Policy :<br /> "${violation}"`
    }else {
      var msg = `Erreur de directive Content Security Policy sur la ressource "${uri}"`
    }
    jeedomUtils.JS_ERROR.push({"filename": event.documentURI, "lineno": "0", "message": msg})
    $('#bt_jsErrorModal').show()
    $.hideLoading()
  })

par

if ('SecurityPolicyViolationEvent' in window) { // Check browser support of SecurityPolicyViolationEnevt interface
  window.addEventListener("securitypolicyviolation", function(event) {
    var uri = event.blockedURI
    var msg = `{{Erreur de directive Content Security Policy sur la ressource "${uri}"}}`
    if (event.originalPolicy && event.violatedDirective) {
      var violation = event.originalPolicy.trim().split(';').find(e => e.trim().startsWith(event.violatedDirective));
      if (typeof violation === 'string') {
        if (event.disposition == 'enforce')
          var msg = `{{Impossible de charger la ressource "${uri}", car elle va contre la directive de Content Security Policy :<br /> "${violation.trim()}"}}`
        else
          var msg = `{{La ressource "${uri}" a été chargée, mais elle va contre la directive de Content Security Policy :<br /> "${violation.trim()}"}}`
      }
    }
    jeedomUtils.JS_ERROR.push({"filename": event.documentURI, "lineno": "0", "message": msg})
    $('#bt_jsErrorModal').show()
    $.hideLoading()
  })

dans desktop/common/js/utils.js vers la ligne 47 et test stp ?

Bad

Bonjour @Bad

Le message d’erreur javascript n’est effectivement plus présent avec le correctif

Norbert

1 « J'aime »

Mais tu en as probablement un autre lié à un morceau de page qui se charge en dehors de Jeedom, correct ?

Dans ce cas, il faut relancer le script « Apache non sécurisé » regarder si c’est effectivement un problème de sécurité ou non, et adapter la CSP, cf :

Oui, c’est bien ca,
C’est dans les mains du dev du plugin (JC en l’occurrence)

Norbert

Ca va vite etre compliqué si chaque utilisateur « bidouille » (car la majorité ne va pas reelement savoir ce qu ils font) le fichier de securite apache. Et risque fortement de perdre tout l intérêt de la chose (securiser) si ya des ajouts dans tous les sens !
Le mieux ca serait quand meme d avoir un module standard dans le core qui sache/puisse gérer tout ca.

@Mips avait émis une (superbe) idee a ce sujet, il me semble
(:pencil2: : en effet, sujet ici )

Oui je te rejoins.
La politique CSP est faite pour augmenter la sécurité, mais peut aussi grandement augmenter les problèmes. Elle ne devait pas être « enforced », le temps de trouver une solution de ce coté là.

Sachant que j’ai proposé cette solution à ngrataloup (et GotierLdl dans l’autre fil), car ils semblent avoir ce qu’il faut pour aller fouiller dans le code et se débrouiller :wink:

J’avais aussi proposé le PR initial pour que les utilisateurs aient de la visibilité sur ce qui rentre en violation de la CSP et puisse le remonter aux devs (core ou plugins) sans avoir besoin de chercher longtemps pourquoi tel ou tel contenu est bloqué.

Bref, un vaste sujet…

:scream:

Je ne suis pas dev, donc n’ai pas accès à la proposition, mais avoir une « interface » de gestion qui permet de modifier ce paramétrage sans prendre de risque (ou en tout cas en les limitant !) me semble être une bonne chose …
Etre trop restrictif, c’est à coup sur inciter les utilisateurs qui n’y connaissent pas grand chose à tout ouvrir (cf une extension Chrome qui le permet en 3 clics) → impact sécurité inverse à ce que l’on souhaite.
ou peut-être une fonction du core qui permet (pour le dev d’un plugin, lors de l’installation du plugin ou install des dépendances, d’aller ajouter les bons sites nécessaires à son plugin)

En tout cas, bon courage sur ce point, la sécurité est indispensable, mais c’est toujours compliqué à expliquer

Norbert

C’était l’idée, mais la CSP est gérée par Apache directement (serveur web de Jeedom), donc c’est très risquer de laisser du code la modifier, car au moindre problème la réparation doit se faire en ssh…
En tout cas c’est le point de vu que Loïc a mis en avant sur le sujet, et je le partage.

Hello,

Je vais peut être faire le rabat joie. Mais je pense que vous vous faites des rêve.

Aujourd’hui Loïc a dis non pour le faire via une interface ou en dynamique. Et malheureusement c’est la seul personne qui prend des décisions la dessus.

Mettre un système dynamique peux créer des failles de sécurité, et je rappel que jeedom est au départ pour les pro. Et donc je les vois pas rajouter des possibles failles de sécurité a cause de la version communautaire, alors que les pro (Leur source de revenus principal) elle cherche a avoir le mois possible.

Le mieux qu’il pourrait faire, c’est un proxy directement dans le core. Mais on est toujours en attente d’un retour de Loïc depuis janvier. Donc je pense que cela est aussi tombé à l’eau.

Cordialement
Thibaut

Le proxy est de loin plus risqué en terme de sécurité qu’une config correcte des csp surtout si le changement de config est géré par le core.

Justement s’il n’y a pas de solution apporté dans le core on se retrouve avec des devs tiers qui bricolent des solutions (il doit y en avoir plusieurs), solutions pas du tout transparentes ni éprouvées qui, parce que c’est du code, contiennent des failles, c’est certain.

Ce type de sécurité doit être gérée par le serveur web, c’est son boulot, pas par du code applicatif homemade.

Hello,

Sauf que Loïc a dis qu’il ne ferai rien sur les CSP apache directement. Et qu’il réfléchirai a un proxy directement dans le core.

Après a vous d’argumenter a font, mais je pense que c’est peine perdue.

Après je me souviens que a l’époque tu étais pour le proxy de ton côté.
Pourquoi ce changement d’avis ?

Cordialement
Thibaut

Ce n’est pas un changement d’avis radical mais oui j’ai évolué dans ma position par rapport au post cité plus haut.
le proxy, soit, mais c’est un workaround pas une solution et je trouve qu’il y a trop de risque.

Des posts comme celui-ci il y en a eu d’autres, dans lesquels j’avais déjà donné ce dernier avis donc c’est pas neuf non plus comme position.

Donc comme tu dis, je pense qu’on a déjà fait le tour de la question et que maintenant on attend une direction où avancer.