Planète

Par ftorregrosa
Florent Torregrosa

Réorganisation de mes images Docker et mise en place builds automatisés

Hier, j'ai réorganisé mes images Docker. Cet article va résumer les changements et expliquer pourquoi de telles modifications.

C'est un commentaire d'Ines Wallon à propos du fait que le hub Docker peut être paramètré pour construire les images Docker automatiquement qui a déclenché cette réorganisation.

Tags: 
Par LaboRouge

Les Rencontres Interactives #18 : La dette technique

J'aurais le plaisir de vous présenter ma conférence intitulé "La dette technique : état des lieux" dans le cadre des Rencontres Interactives de Caen le 6 juin prochain.

Aprés avoir traité le sujet de la dette technique sous Drupal 7 au Drupal Camp de Lannion, je voulais approfondir ce sujet sur un aspect moins "technique" et plus "gestion de projet".

Cette conférence est donc le fruit de cette réflexion.

Par LaboRouge

Les Rencontres Interactives #18 : La dette technique

J'aurais le plaisir de vous présenter ma conférence intitulé "La dette technique : état des lieux" dans le cadre des Rencontres Interactives de Caen le 6 juin prochain.

Aprés avoir traité le sujet de la dette technique sous Drupal 7 au Drupal Camp de Lannion, je voulais approfondir ce sujet sur un aspect moins "technique" et plus "gestion de projet".

Cette conférence est donc le fruit de cette réflexion.

Basculer de Google Maps vers Leaflet et OpenStreetMap avec Geolocation sur Drupal 8

Le 2 mai 2018 Google a annoncé un changement de politique majeure concernant l'utilisation de ses services en ligne, et dont notamment son célèbre service de cartographie GoogleMaps et toutes ses API associées, pour embarquer ou générer des informations géolocalisées. Ce changement de politique rend désormais payant un service auparavant disponible gratuitement dans certaines limites de quota. Il est donc temps de cesser d'utiliser ces solutions, par habitude ou par facilité, et d'aller voir ce qui se fait très bien aussi ailleurs. Regardons comment sur Drupal 8 nous pouvons basculer sur une solution open source basée sur Leaflet et OpenStreetMap.

Alerte de sécurité critique - Drupal core PSA-2018-003

L'équipe de sécurité de Drupal vient de publier ce jour, lundi 23 avril 2018, un bulletin d'alerte (Drupal 7 and 8 core critical release on April 25th, 2018 PSA-2018-003) annonçant la publication prochaine d'une mise à jour de sécurité critique. Cette mise à jour de sécurité sera publiée et diffusée le mercredi 25 avril entre 16h00 et 18h00 UTC (soit entre 18h et 20h heure française). Soit après-demain. Les 2 versions en cours de Drupal (Drupal 7 et Drupal 8) sont concernées par cette annonce.

Mettre en place un contrôle de stock simple avec Drupal Commerce 2

Si nous ne disposons pas (encore) d'une solution contribuée (commerce_stock devrait être prochainement être disponible), Drupal Commerce 2 dispose d'ores et déjà d'une API pour mettre en place un contrôle des stocks, avec le service Availability Manager. Découvrons comment mettre en place un contrôle de stock très simple, basé sur un champ (par exemple field_stock) qui aura été ajouté sur un produit.

Par kgaut
Kevin Gautreau

Drupal 8 - Entité - Champ de base Fichier (File)

Voici comment créer un champ « fichier » au sein d'un type d'entité custom dans drupal 8 :

  1. $fields['programme_pdf'] = BaseFieldDefinition::create('file')
  2. ->setLabel(t('Programme PDF'))
  3. ->setSetting('file_directory', 'formations/programme') // dossier d'upload
  4. ->setSetting('max_filesize', '10MB') // taille max du fichier
  5. ->setSetting('file_extensions', 'pdf') // extensions autorisées, à séparer par un espace
  6. ->setSetting('description_field', FALSE) // si on veut activer un champ « description »
  7. ->setDisplayOptions('form', [
  8. 'label' => 'hidden',
  9. 'type' => 'file_generic',
  10. 'weight' => 4,
  11. ])
  12. ->setDisplayConfigurable('form', TRUE)
  13. ->setDisplayConfigurable('view', TRUE);

 

Par admin

Préparer la mise à jour critique Drupal 6/7/8 du 28/03/2018

Le 21/03/2018, la Security Team de Drupal a annoncé dans son "Public Service
Announcement" PSA-2018-001
la sortie imminente de versions de sécurité pour Drupal, le mercredi 28/03/2018.

De telles préannonces sont particulièrement rares, la précédente remontant à la
faille d'injection SQL "Drupalgeddon" de novembre 2014, et sont réservées aux
mises à jour les plus critiques.

Sévérité / Criticité

En temps normal, la couverture de sécurité est limitée aux versions supportées,
qui sont actuellement la version courante (8.5.x) et la précédente (7.x).

Fait inhabituel là aussi, la mise à jour du 28 couvre également les versions
obsolètes 8.3.x et 8.4.x, et un patch a également été annoncé sur le projet
D6LTS pour une mise à jour équivalente sur Drupal 6.x, alors que son support est
terminé depuis le 24/02/2016, ce qui renforce le niveau de risque estimé de la
faille que corrigent ces mises à jour, et l'importance de les appliquer dans les
meilleurs délais.

Quand agir ?

Mais quels sont ces délais, précisément ? Selon le bulletin PSA-2018-001, les
"exploits" de la faille révélée par le correctif pourraient être développés dans
les "heures ou jours qui suivent" la publication.

En 2014, la faille Drupalgeddon avait commencé à être exploitée dans les 6 heures
qui avaient suivi la publication du correctif. Avec l'élévation progressive du
niveau de risque des agresseurs, tout permet de supposer que le délai pourrait
être encore plus court cette fois.

La Security Team annonce une publication des correctifs mercredi entre 18:00
et 20:30 UTC, soit 20:00-21:30 heure de Paris, du fait de l'heure d'été.

Une marge de sécurité de 6 heures, comme celle dont ont bénéficié les sites en
2014, mène donc au mieux à 03:30 jeudi matin, et au pire 02:00. Dans tous les
cas, une mise à jour le jeudi matin 29/03 court donc un risque important
d'arriver trop tard.

En résumé: préparez votre équipe à une intervention dans la nuit de mercredi
à jeudi.

Stratégie de mise à niveau

Selon le bulletin PSA-2018-001 et les compléments du project D6LTS, la
stratégie recommandée est la suivante:

  • Sites sous drupal 8.5.x ou 7.x: appliquer la version de sécurité publiée
    dans ce correctif selon la procédure standard.
  • Sites sous Drupal 8.4.x: appliquer immédiatement la version 8.4.x qui sera
    publiée dans ce correctif, puis planifier une mise à jour vers la plus
    récente version 8.5.x de sécurité, annoncée pour le mois d'avril.
  • Sites sous Drupal 8.3.x: appliquer immédiatement la version 8.3.x qui sera
    publiée dans ce correctif, puis planifier une mise à jour vers la plus
    récente version 8.5.x de sécurité, annoncée pour le mois d'avril.
  • Sites sous Drupal/Pressflow 6.x avec un contrat de support auprès de l'un
    des prestataires du programme commercial D6LTS: suivre les recommandations
    spécifiques de ce programme.
  • Sites sous Drupal/Pressflow 6.x sans contrat D6LTS: télécharger le patch
    disponible sur
    https://www.drupal.org/project/issues/d6lts
    et l'appliquer au site avec les commandes de patch standard.

Les versions exactes à utiliser pour les mises à jour seront indiquées lors
de la publication du correctif.

Ces mises à jour de sécurité ne modifieront pas le schéma de base de données
par rapport à la dernière version actuellement disponible sur chacune des
branches concernées.

Attention sur les sites utilisant 8.3.x/8.4.x, le rapport du module
update sur le tableau de bord d'administration disponible sur
/admin/reports/status indiquera une mise à jour recommandée vers
une release 8.5.x plutôt que vers la version de sécurité 8.3.x/8.4.x, mais
compte tenu des évolutions entre les versions 8.3/8.4/8.5, ceci présente un
risque d'effets de bord non souhaités, et il est donc préférable d'appliquer les
mises à jour indiquées par le bulletin de sécurité plutôt que celles indiquées
par le site, afin de pouvoir plus sereinement préparer la mise à jour en 8.5.x
pour avril 2018.

Tactique de déploiement

Si votre équipe ou prestataire a d'ores et déjà choisi une stratégie, mieux
vaut l'appliquer qu'improviser au dernier moment: ce sont ceux qui sont les
mieux placés pour connaître les contraintes d'exploitation de votre site.

A défaut, quatre principales tactiques sont envisageables pour ce déploiement.
Les détails dépendent évidemment de vos processus de déploiement et, le cas
échéant, de ceux de l'agence ou infogérant en charge de votre site. Cela étant
dit, les grandes lignes tactiques sont les suivantes, et commençent AVANT la
publication du bulletin:

  1. Avant l'après-midi de mercredi 26, mettre à jour le site à la dernière
    version courante sur la branche concernée: 8.3.x, 8.4.x, 8.5.x. Ne pas
    tenter à ce stade une mise à jour précipitée vers 8.5.x
    , pour éviter toute
    situation problématique à la veille d'une mise à jour de sécurité critique
  2. En fin d'après-midi du 26, préparer une sauvegarde intégrale du/des
    serveurs, par exemple un snapshot disque. En effet, si un exploit vient à
    être réalisé avant la fin du déploiement du correctif, seule une
    restauration intégrale de l'infrastructure - par opposition à une
    restauration de Drupal seul - permettra de garantir l'absence de maliciel
    sur les serveurs. S'assurer que cette sauvegarde est terminée pour 20:00,
    heure de publication annoncée au plus tôt
  3. Dès la publication, télécharger le patch s'il est disponible, ou la version
    complète recommandées sinon, et en extraire un patch.
  4. Appliquer immédiatement le patch en production. Cela permet de fermer la
    faille après seulement quelques minutes de vulnérabilité, avec un niveau de
    risque fonctionnel des plus limités puisque les sites auront été mis au
    dernier niveau de correction de bogues avant mercredi (cf premier point). Si
    cette étape n'est pas appliquée, par exemple du fait de règle interdisant les
    mises à jour en production dans un processus industrialisé certifié, passer
    immédiadatement au point suivant, sinon la suite des opérations peut attendre
    jeudi matin pour travailler dans de bonnes conditions.
  5. Intégrer la nouvelle version complète au projet, et lui faire passer la
    suite de tests sur l'environnement de recette/préproduction. Une fois la version
    validée, la déployer. Fin de l'incident.
  6. Si le patch a été déployé dès le début, le niveau de risque est très faible,
    et le déploiement peut être réalisé sur les serveurs en l'état. Si l'étape
    du patch a été omise et que la nouvelle mise en production a été réalisée
    moins de 4h après la publication de la version de sécurité, le risque demeure
    faible. Mais si, en l'absence de patch, la mise en production a attendu
    jusqu'au jeudi matin, il est préférable de réaliser un nouveau cliché des
    serveurs, puis de restaurer la version de la veille et de lui appliquer la
    nouvelle version avant de revenir en ligne. Le cliché du matin pourra alors
    être examiné pour rechercher des traces d'éventuelles tentatives d'intrusion
    durant la période de vulnérabilité.
  7. Si les contraintes organisationnelles ne permettent pas de réaliser les
    étapes précédentes, la méthode la plus prudente consiste à mettre le site
    hors ligne mercredi juste avant 20:00, avec une page statique signalant le
    caractère volontaire/prudentiel de cette interruption de service, et ne le
    remettre en ligne qu'une fois la nouvelle version déployée le lendemain
  8. S'il n'est possible ni de suivre les procédures de mise à jour rapides
    précédentes, ni de mettre le site hors ligne jusqu'à la correction, le plus
    raisonnable sera de considérer que le site est susceptible d'avoir été
    exploité, donc réaliser une sauvegarde intégrale des serveurs et des serveurs
    de logs (journaux) disponible, avant de redéployer sur des machines vierges
    ou sur la sauvegarde de la veille la version corrigée, puis de procéder à un
    audit visant à identifier si une pénétration a effectivement eu lieu. A ce
    stade, la présentation
    Mon site est hacké, que faire ?
    pourra vous être utile

Pour plus d'informations

La Security Team pas plus qu'aucune tierce partie ne peut communiquer plus
d'informations jusqu'à la publication des correctifs.

L'annonce du correctif sera publiées sur https://www.drupal.org/security, sur
Twitter, et par courriel pour les abonnés à la liste de diffusion de la Security
Team, à laquelle il est possible de s'abonner en allant sur sa page de profil
sur https://drupal.org (pas sur https://drupal.fr), et en se rendant sur
l'onglet My newsletters pour s'abonner à cette liste de diffusion.

Les journalistes intéressés par plus d'informations sur les développements
de ce sujet sont invités à contacter directement
security-press@drupal.org
pour obtenir une version centrée sur leurs préoccupations. La Security Team
publiera un courriel résumé à destination de la presse en même temps que la
publication du code et du bulletin de version associé.

Licence Creative Commons

Cet article, créé par OSInet est mis
à disposition selon les termes de la
Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 France.
pour faciliter la diffusion de l'information de sécurité de Drupal.

En page d'accueil : 
Version de Drupal : 

Alerte de sécurité critique - Drupal core PSA-2018-001

L'équipe de sécurité de Drupal a publié mercredi 21 mars 2018 un bulletin d'alerte annonçant la publication prochaine d'une mise à jour de sécurité hautement critique. Cette mise à jour de sécurité critique sera publiée et diffusée le mercredi 28 mars à partir de 18h00. Les 2 versions en cours de Drupal (Drupal 7 et Drupal 8) sont concernées par cette annonce. Tenez vous prêt à mettre à jour votre ou vos projets Drupal, 7 ou 8.

Par kgaut
Kevin Gautreau

Drupal 8 - Entitée & Views - Créer une relations inverse

Prenons deux types d'entités custom : « Bière » et « Brasserie » avec une relation 1-n entre les deux dans le sens :

  • Une bière provient d'une et d'une seule brasserie
  • Une brasserie peut proposer N bières

 Ainsi :

drupal-views-relations.png

En drupalisme, on aurait une propriété « entity_reference » au niveau de notre bière qui fera référence à la brasserie.

Dans views, si on fait un listing des bières, pas de soucis pour accéder au contenu de la brasserie depuis la bière, par contre l'inverse n'est pas possible.

Depuis un listing de brasserie, il n'est pas possible d’accéder aux bières de la brasserie.

Pour cela il faut utiliser la classe en charge de views_data, définie dans l'annotation de notre type d'entité brasserie :

drupal-entitee-annotation.png

Et voila le contenu de ce fichier

  1.  
  2. namespace Drupal\mon_module\Entity\ViewsData;
  3.  
  4. use Drupal\views\EntityViewsData;
  5.  
  6. class BrasserieViewsData extends EntityViewsData {
  7.  
  8. /**
  9.   * {@inheritdoc}
  10.   */
  11. public function getViewsData() {
  12. $data = parent::getViewsData();
  13. $data['brasserie']['bieres'] = [
  14. 'title' => t('Bieres'),
  15. 'help' => t('Lie la brasserie aux bières produites'),
  16. 'relationship' => [
  17. 'group' => t('bieres'), // Affiché en information dans la partie « relationship » de views
  18. 'label' => t('Actions de formation'), // Affiché en information dans la partie « relationship » de views
  19. 'base' => 'biere', // Table de base de l'entitée cible
  20. 'field table' => 'biere', // Table contenant le champ de l'entitée cible sur lequel on fera la jointure
  21. 'base field' => 'brasserie',// Champ de l'entité cible Champ sur lequel on fera la jointure
  22. 'relationship field' => 'brasserie_id', // Champ de l'entité source sur lequel on fera la jointure
  23. 'id' => 'standard',
  24. ],
  25. ];
  26. return $data;
  27. }
  28. }

Et voila le travail !

views-relationship.png

Par kgaut
Kevin Gautreau

Drupal - PSA-2018-001 - Patch de sécurité déployé le 28/03/2018

Il vient d'être annoncé par l'équipe gérant la sécurité du CMS drupal qu'un gros correctif de sécurité pour drupal 7 et drupal 8 sera déployé mercredi 28/03/2018 entre 19h et 20h30 (heures Françaises).

On ne sait pas encore où se situe la faille. On sait seulement qu'elle semble (très) importante et qu'il est recommandé d'appliquer le patch immédiatement.

La dernière fois qu'un cas similaire s'est présenté, une fois le correctif disponible, les sites non patchés ont été très rapidement piratés. En effet : une fois que l'on a accès au patch, il est facile de trouver la faille corrigée et ainsi de l'exploiter sur des sites non protégés.

Si vous êtes développeur ou si vous gérez vos propres sites drupal, prévoyez une permanence mercredi soir pour vous occuper de ça.

Si vous avez un site drupal qui est géré par un tiers, assurez-vous qu'il soit au courant et qu'il s'en occupera au plus tôt.

Encore une fois, les versions 7 et 8 de drupal sont concernées.

Plus d'informations : https://www.drupal.org/psa-2018-001

 

 

Par kgaut
Kevin Gautreau

Drupal 8 - Menu - Ajouter un élément de menu avec des paramètres GET

Voici comment créer un Menu item (élément de menu) avec des paramètres GET.

Pour cela on utilise le fichier MON_MODULE.links.menu.yml (à noter que cela marchera aussi dans les fichiers MON_MODULE.links.action.yml et MON_MODULE.links.task.yml)

  1. formations.element:
  2.   title: 'Mon titre de menu'
  3.   weight : 2
  4.   route_name: view.front_formations.page
  5.   menu_name: menu-formation
  6.   options:
  7.   query:
  8.   label: 'prise-de-vue'
  9.   cat: 2

Ici l'url aura comme « query string » : ?label=prise-de-vue&cat=2

Pour rappel la clé menu_name attend le nom du menu dans lequel on veut placer l'élément de menu que l'on vient de définir.

Par kgaut
Kevin Gautreau

Drupal 8 - Entité - Champ de base « Nombre Décimal »

Le type nombre décimal peut-être pratique pour stocker tout nombre à virgule (un prix par exemple).

Voici comment attacher une propriété « nombre décimal » à un type d'entité personnalisé.

  1. $fields['prix'] = BaseFieldDefinition::create('decimal')
  2. ->setLabel(t('Prix'))
  3. ->setSetting('unsigned', TRUE)
  4. ->setSetting('scale', 2)
  5. ->setSetting('min', 0)
  6. ->setSetting('suffix', '€ TTC')
  7. ->setRequired(TRUE)
  8. ->setDisplayOptions('form', array(
  9. 'type' => 'number',
  10. 'weight' => 5,
  11. ))
  12. ->setDisplayConfigurable('form', TRUE)
  13. ->setDisplayConfigurable('view', TRUE);

 

Par kgaut
Kevin Gautreau

Drupal 8 - Générer un lien de « flagging » dans le code

Voici comment générer un lien pour « flaguer » une entité avec drupal 8 et le module flag :

  1. $type_entite_a_flaguer = 'user';
  2. $id_entitee_a_flaguer = $user->id();
  3. $id_du_flag = 'follow_user';
  4.  
  5. $f = \Drupal::service('flag.link_builder');
  6. $link = $f->build($type_entite_a_flaguer, $id_entitee_a_flaguer, $id_du_flag);

vous pourrez alors utiliser le lien dans un template en faisant par exemple :

  1. {{- link -}}

 

Par kgaut
Kevin Gautreau

Drupal 8 - Afficher un webform où l'on veut via le code

Pour récupérer et retourner un webform où l'on veut via le code (que ce soit dans un bloc, un controller...) on peut utiliser les lignes suivantes :

  1. // Ici, « contact » est le nom machine de mon webform
  2. $webform = \Drupal::entityTypeManager()->getStorage('webform')->load('contact');
  3. return $webform->getSubmissionForm();

 

Par kgaut
Kevin Gautreau

Drupal 8 - Domain Access - récupérer le domaine courant

Voici comment récupérer le domaine actif quand on utilise le module Domain Access pour Drupal 8 :

  1. $current_domain = \Drupal::service('domain.negotiator')->getActiveDomain();

Pour récupérer le domaine par défaut :

  1. $default_domain = \Drupal::service('domain.negotiator')->loadDefaultDomain();

 

Par kgaut
Kevin Gautreau

Drupal 8 - Entité - Champ de base « link » (lien / URL)

Pour créer un champ de base de type lien, dans la définition de votre entité :

  1. $fields['mon_lien'] = BaseFieldDefinition::create('link')
  2. ->setLabel(t('Path'))
  3. // valeurs possible : LinkItemInterface::LINK_EXTERNAL ou LinkItemInterface::LINK_GENERIC
  4. ->setSetting('link_type', LinkItemInterface::LINK_GENERIC)
  5. //Activer ou non le titre
  6. ->setSetting('title', DRUPAL_DISABLED)
  7. ->setDisplayOptions('form', [
  8. 'type' => 'link_default',
  9. 'weight' => 0,
  10. ])
  11. ->setDisplayConfigurable('form', TRUE);

 

Par kgaut
Kevin Gautreau

Drupal 8 & Search API - effectuer une requête dans le code

Avec Drupal et Drupal 8 encore plus la recherche passe la plupart du temps par Search API, une interface qui se branche devant plusieurs moteur de base de données (SolR, ElasticSearch, Database...)

Le plus souvent on va faire nos pages de résultats de recherche à l'aide de Views (et du module Search views pour Drupal 7). Mais dans certains cas on va vouloir avoir plus la main sur la recherche et donc aller interroger Search API directement dans le code.

Initialisation de la requête

Chargement de l'index (ici, le nom machine est « contenu »)

  1. // Chargement de l'index « contenu »
  2. $query = Index::load('contenu')->query();

Définition de la requête recherchée

Terme sur lesquels vont être effectués la requête.

  1. // On lancer la recherche sur « hello world »
  2. $query->keys("hello world");

Mode de la requête

  1. // Les différentes possibilités sont
  2. // - « direct » => Requête directe
  3. // - « terms » => Multiple words
  4. // - « phrase » => Single phrase
  5. $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')->createInstance('direct');
  6.  
  7. // Optionnellement, on peut choisir un opérateur spécifique (OR ou AND)
  8. $parse_mode->setConjunction('OR');
  9.  
  10. // Affectation du mode de la requête
  11. $query->setParseMode($parse_mode);

Définitions des champs sur lesquels rechercher

Évidement c'est optionnel, par défaut la recherche se fera sur l'ensemble des champs « fulltext » contenus dans l'index.

  1. // Recherche uniquement sur le champ « body »
  2. $query->setFulltextFields(['body']);
  3.  
  4. // Recherche uniquement sur les champs « body » et « title »
  5. $query->setFulltextFields(['body', 'title']);

Ajout de conditions supplémentaires

L'objet retourné par Index::load('contenu')->query(); est une query classique drupal, sur laquelle on peut effectuer les traitement classique que l'on peut faire sur n'importe quelle Query drupal8.

À noter ici que le nom des champs doit être celui que l'on renseigne dans l'index, ils peuvent être différents des noms des champs définis dans nos types de contenu.

Quelques exemples en vrac :

Condition sur un champ boolean

  1. // le champ private doit être « TRUE »
  2. $query->addCondition('private', TRUE);

Condition sur un champ « varchar »

  1. // on veut que le contenu retourné soit un article ou un snippet
  2. $query->addCondition('type', ['article', 'snippet'], 'IN');

Condition sur un champ date

À noter le format de date à utiliser : "Y-m-d\TH:i:s\Z"

  1. $btf = \DateTime::createFromFormat('d/m/Y', '21/10/2015');
  2. $date_formatted = $btf->format("Y-m-d\TH:i:s\Z")
  3.  
  4. // Date de création de l'article > date définie
  5. $query->addCondition('created', $date_formatted, '>');
  6.  
  7. // Et l'inverse
  8. $query->addCondition('created', $date_to, ');

Pagination

Gestion de la pagination identique à une requête classique

  1. // Récupération des 20 premiers résultats.
  2. $query->range(0, 20);

Exécution de la requête et récupération des résultats

  1. $results_set = $query->execute();
  2.  
  3. //Nombre de résultats retournés
  4. $nb_results = $results_set->getResultCount()
  5.  
  6. // Récupération des entités
  7. foreach ($results_set->getResultItems() as $item) {
  8. $resultat = $item->getOriginalObject()->getValue();
  9. }

Sources

Pas trouvé grand chose sur le sujet à part cette page dans la documentation sur drupal.org : https://www.drupal.org/docs/8/modules/search-api/developer-documentatio…

Si vous avez d'autres liens pouvant aider, je suis preneur.

Pages