Coder Social home page Coder Social logo

audioconf's Introduction

Audioconf

Des conférences téléphoniques pour les agents de l'Etat.

Développement

L'environnement de développement est préconfiguré pour Visual Code. Pour profiter de l'intégration avec ESLint, il faut installer le plugin du même nom.

Lancer le projet

Générer clé API OVH

Demander à vos collègues les identifiants pour générer la clé sur ce lien : https://eu.api.ovh.com/createToken/ Pour créer le token, il faut :

  • OVH_ROOM_ACCOUNT_NUMBER: il est de la forme aa1111111-ovh-1. L'account ID à renseigner doit être aa1111111-ovh
  • Password : à récupérer auprès de vos collègues
  • Script name : Local ton nom
  • Script description : Local ton nom

Configuration OVH de Dev

Avec OVH_ROOM_ACCOUNT_NUMBER à demander à vos collègues

POST /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/*
PUT /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/*
GET /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/*

En local sans docker

Installer et lancer postgres et maildev en local, ensuite:

  1. cp .env.sample .env. Remplir le fichier avec les configurations obtenues par OVH
  2. npm install
  3. npm run migrate
  4. npm run dev

Avec docker compose

  1. cp .env.sample .env.conferences.dev. Remplir le fichier avec les configurations obtenues par OVH
  2. Récupérer les dépendences : docker-compose run -u root web npm install
  3. Créer les tables de la DB : docker-compose run web npm run migrate
  4. Lancer le service : docker-compose up ou docker-compose run -p 8080:8080 web npm run dev

Mail

Pour consulter les mails envoyés avec Docker, se connecter à l'adresse http://localhost:1080

Bon déroulement de l'opération

Vous devriez normalement voir dans les logs ceci :

CoucouCollègues listening at http://localhost:8080

Test

Docker compose

docker-compose run web npm test

Sans docker

npm test

Tester manuellement l'application

  1. Se connecter sur http://localhost:8080
  2. Remplir son adresse mail et son horaire
  3. Consulter le http://localhost:1080/#/ pour voir l'email envoyé par le service

Créer des migrations

KnexJS permet de créer des migrations de base de données. Un shortcut a été ajouté au package.json pour créer une migration :

npm run makeMigration <nom de la migration>

Une fois la migration créée, vous pouvez l'appliquer avec :

npm run migrate

Pour utiliser d'autres commandes, le CLI de KnexJS est disponible avec ./node_modules/knex/bin/cli.js. Par exemple, pour faire un rollback :

./node_modules/knex/bin/cli.js migrate:rollback

Test de charge Locust

Tester que le HTML d'un site est valide

npm run checkHTML --  <url du site à tester>

Si on veut checker pour une PR donnée, utiliser l'url de la review app de la PR (voir les checks dans la PR).

Pour valider le code en local :

npm run checkHTMLLocal

Afficher des annonces

Pour afficher des annonces de service (maintenance, formulaire, ...), on utilise la variable d'environnement ANNOUNCEMENTS (voir .env.sample ou le fichier docker-compose) qui peut être configurée sur l'hebergeur Scalingo. Elle permet d'afficher de l'HTML ou du texte.

Sticky sessions

Le système de session est in memory. Dans un environnement à plusieurs containers web, cela peut poser des problèmes. Comme la production est dans ce cas, il faut activer les sticky sessions. Bien vérifier donc qu'ils sont activés (dans Scalingo > Settings).

SQL

  • Total de réservation par nom de domaine : select substring(email from '@[^@]*$') as domain, count(*) from conferences group by domain order by count DESC;
  • Nombre de réservations par durée de réservation : SELECT "durationInMinutes" , count(*) as count from conferences GROUP BY "durationInMinutes" ORDER BY count DESC;
  • Nombre de réservations annulées : SELECT "canceledAt" IS NOT NULL as canceled, count(*) from conferences GROUP BY canceled;### Configuration OVH de Prod

Configuration production OVH pour générer les clés

Points d'API nécessaires pour les fonctionalités actuelles, pour l'API Rooms :

POST /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${OVH_ROOM_PHONE_NUMBER}/rooms
PUT /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${OVH_ROOM_PHONE_NUMBER}/rooms/*
GET /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${OVH_ROOM_PHONE_NUMBER}/roomsStats

Pour le job qui récupère les stats :

GET /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${OVH_ROOM_PHONE_NUMBER}/histories
GET /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${OVH_ROOM_PHONE_NUMBER}/histories/*

Pour le job qui récupère le web access:

POST /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${OVH_ROOM_PHONE_NUMBER}/rooms/*/webAccess

Pour le dashboard

POST /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${phoneNumber}/rooms/${roomNumber}/*
GET /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${phoneNumber}/rooms/${roomNumber}/participants
GET /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${phoneNumber}/rooms/${roomNumber}/participants/${id}
POST /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${phoneNumber}/rooms/${roomNumber}/participants/${id}/*

Détail des appels API OVH utilisés

Création des confs

Les appels que nous faisons à l'API OVH sont les suivants :

  • Créer une conférence : POST /telephony/${OVH_ROOM_ACCOUNT_NUMBER}/conference/${OVH_ROOM_PHONE_NUMBER}/rooms

L'API retourne le code d'accès de la conférence (roomNumber).

  • Configurer la conférence créée : PUT /telephony/${config.OVH_ROOM_ACCOUNT_NUMBER}/conference/${config.OVH_ROOM_PHONE_NUMBER}/rooms/${roomNumber}

On fait ce deuxième appel API pour enlever le PIN qu'on utilise pas et ajouter une date d'expiration à la conférence.

Obtenir des stats sur les confs

  • Obtenir des stats sur les conférences actuellement en cours : GET /telephony/${config.OVH_ROOM_ACCOUNT_NUMBER}/conference/${config.OVH_ROOM_PHONE_NUMBER}/roomsStats

On récupère des stats sur les confs actuellement en cours, dont : le nombre de conférences réservées (bookedRoomsCount), le nombre d'appels actuellement en cours (activeConfsCount), le nombre total de participants en ligne dans ces appels (onlineParticipantsCount).

On utilise également cet appel dans la page de status, pour vérifier que la connection à OVH marche toujours (si cet appel répond bien, on considère qu'on est bien connectés).

  • Obtenir la liste des confs passées : GET /telephony/${process.env.OVH_ACCOUNT_NUMBER}/conference/${phoneNumber}/histories

  • Obtenir l'historique d'une conf passée donnée : GET /telephony/${process.env.OVH_ACCOUNT_NUMBER}/conference/${phoneNumber}/histories/${callId}

Mise en prod

La mise en prod est faite à la main pour le moment.

Procédé basique :

  • On crée une branche release:
git checkout main
git pull
git checkout -B release/X.Y.Z
  • On incrémente le numéro de version dans package.json et on commit dans la branche de release.
  • On crée une PR de cette branche de release vers la branche prod, la PR est testée par la CI.
  • On crée une release sur github (https://github.com/betagouv/audioconf/releases/new) en décrivant les modifications apportées par cette release. Ce process crée un tag sur le commit de la release.
  • Quand on merge la PR, la branche prod est déployée automatiquement sur scalingo.
  • Créer ensuite une PR depuis prod vers main, pour récupérer le numéro de version et les éventuelles modifs de test.

Les PR sont nécessaires car les branches prod et main sont protégées, on ne peut pas push directement dessus.

audioconf's People

Contributors

estellecomment avatar jdauphant avatar astranchet avatar dependabot[bot] avatar pom421 avatar tut-tuuut avatar mcalinghee avatar benoitserrano avatar flightan avatar nylda-dadjio avatar celiacheff avatar polomarcus avatar adenoix avatar lucascharrier avatar supertanuki avatar

Stargazers

Eth avatar  avatar Caro-L avatar  avatar tyjak avatar Sascha Xander avatar Jérémy Buget avatar

Watchers

James Cloos avatar Sabrina Demagny avatar Samuel Paccoud avatar Olivier D avatar  avatar aleb_the_flash avatar

audioconf's Issues

nonce obligatoire dans la requete d'authorisation vers tchap-identite

Afin de repondre aux normes de l'ANSSI, il faut implementer :

  • utilisation du nonce pour la requete d'authorisation (attention ceci n'est pas code_verifier/code_challenge)

nonce
OPTIONAL. String value used to associate a Client session with an ID Token, and to mitigate replay attacks. The value is passed through unmodified from the Authentication Request to the ID Token. Sufficient entropy MUST be present in the nonce values used to prevent attackers from guessing values. For implementation notes, see Section 15.5.2.

Plus d'information sur le endpoint : https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint

Send booking confirmation on Tchap

For the users who chose Tchap to receive their security code (through tchap-identite), provide the option to receive their booking confirmation details on Tchap.

Supprimer un espace

Page de confirmation de réservation : supprimer l'espace entre le 2e bullet point et "Tapez"

image

Améliorer la délivrabilité des mails de confirmation

Certains utilisateurs reçoivent le mail de confirmation de réservation plusieurs minutes après avoir réservé leur conférence.

Cela peut aller jusqu'à 5 minutes, ce qui laisse penser aux utilisateurs qu'ils n'ont pas réussi à réserver leur conférence, et qu'il existe un problème.

Plein d'auto-replies dans le support

Notre support est spammé par les messages genre “Réponse automatique : Confirmez la réservation de votre conférence audio” et “Réponse automatique : Donner votre avis sur l'audioconférence d'hier”

Il faudrait les filtrer dans Crisp, ou alors ne pas les recevoir du tout.

Partager l'url de contrôle à des utilisateurs selectionnés (fonction temporaire)

[email protected],[email protected]

Envoi de l'url de controle dans un second email à la création de la réservation

Sujet : [Confidenciel] Administration de votre conférence téléphonique du ${conferenceDay ? `du ${format.formatFrenchDate(new Date(conferenceDay))} `

Bonjour,

Voici l'adresse d'administration de votre conférence 123 456 789 du 17 juin 2021.
https://www.....

Cette adresse est confidenciel et n'est pas partageable aux participants.

L'équipe Audioconf

Note

  • Il faut comparer les emails en minuscule
  • C'est une implementation temporaire en attendant d'investiguer plus la fonctionnalité
  • Il faudra collecter les retours des utilisateurs sur leurs usages de cette fonctionnalité

User-tester la pastille Rizomo et fixer les problèmes

Il y a des problèmes avec la pastille Rizomo.

  • Pas de titre de fenêtre : on ne sait pas où on est, ce qu'est cette fenetre
  • La version anglaise n'est pas à jour, le texte est incohérent (dans l'onglet home / A propos)
  • Icone plein écran est un "?" (c'est l'icone pour "aide" conventionnellement)
  • Couleur de l'icone sac à dos ne respecte pas les normes d'accessibilité (gris clair sur blanc, pas assez de contraste)
  • Le vert de la barre de titre pas compatible avec le DSFR
  • Lien vers audioconf :
    • Inversion du titre et sous titre : le titre doit être "AudioConf", le sous-titre "Conférences téléphoniques pour les agents de l'État" (même titre et sous titre que sur la page d'audioConf)
    • mauvais logo pour Audioconf : l'image n'est pas transparente, la couleur n'est pas compatible avec le DSFR, l'équipe n'a pas choisi ce logo

Au vu de ces problèmes, il est possible que cette pastille ajoute plus de confusion que d'utilité à l'utilisateur. Il faut faire des tests utilisateurs pour découvrir comment l'améliorer, et fixer les problèmes ci-dessus, avant de le mettre en prod.

Vérifier l'intégrité de l'ID Token (regle ANSSI R26)

Le but est de cette tache est de verifier la recommandation R26.
https://www.ssi.gouv.fr/uploads/2020/09/anssi-guide-recommandations_pour_la_securisation_de_la_mise_en_oeuvre_du_protocole_openid_connect-v1.0.pdf

R26 - Vérifier l'intégrité de l'ID Token :

Dans le cadre d’une mesure de défense en profondeur, le client OIDC peut vérifier le HMAC ou la signature électronique de l’ID Token lors de sa réception.

OIDC a ajouté au protocole OAuth2.0 la notion d’ID Token. Il contient des informations sur l’authentification de l’utilisateur telles que :
■ iss : l’URL du serveur du fournisseur d’identité qui a généré l’ID Token ;
■ aud : l’identifiant du client OIDC pour lequel l’ID Token a été généré ;
■ sub : un identifiant unique de l’utilisateur ;
■ iat : date à laquelle l’ID Token a été généré ;
■ exp : date à laquelle l’ID Token expire ;
■ nonce (optionnelle) : valeur aléatoire transmise dans la demande d’authentification.
Il est transmis sous la forme d’un JWS protégé en intégrité par un HMAC ou une signature électronique. Dans le cadre de la cinématique authorization code, l’ID token est protégé en intégrité par le flux TLS entre le client OIDC et le Token Endpoint. Cependant, vérifier l’intégrité de l’ID Token est une bonne pratique.

Ajout de Rizomo

Demande

Le déploiement de la pastille démarre à partir d'aujourd'hui, pouvez-vous ajouter la ligne

<script type="text/javascript" src="https://rizomo.numerique.gouv.fr/scripts/widget"></script>

dans le header des pages du site audioconf.numerique.gouv.fr

et dans le même temps ajouter la ligne

<script type="text/javascript" src="https://rizomo-demo.numerique.gouv.fr/scripts/widget"></script>

sur le site de pre-prod/test/integration de audiconf

Implémentation technique

Variable d'environnement : RIZOMO_SCRIPT, si la variable est présente intégrer le code JS : <script type="text/javascript" src="$RIZOMO_SCRIPT"></script> en bas du code de toutes les pages

Note

Est-ce que le script devrait être présent sur les pages où le numéro de conférence est visible ? ou la page de contrôle de la conférence ?

Pouvoir réserver une conférence plus de deux semaines à l'avance

Certains utilisateurs (1/2 par mois) se plaignent de ne pas pouvoir réserver une conférence plus longtemps à l'avance que les 14 jours actuels.

-> Est-ce qu'il est envisageable d'autoriser la réservation de conférence avec un préavis plus important, par exemple 28 jours ?

Test the admin dashboard

Refactor the code where needed in order to test :

  • that the dashboard link is sent, or not, depending on flag and on email
  • that the jwt encryption is well decoded at the other end (encrypt and decrypt, end to end test)

Changement de texte

Page d'accueil : les participants qui utilisent AC pour la première fois ou peu souvent se demandent toujours pourquoi ils ne doivent pas donner l'heure de leur conférence. Ils ne lisent pas la phrase qui répond à la question et ne trouvent la réponse qu'au moment de la confirmation de réservation.

Remplacer “La conférence vous sera réservée pour la journée choisie” par “La conférence vous sera réservée pour la journée entière” et mettre “journée entière” en gras.

[Proposition] Supprimer une phrase qui prête à confusion

Concernant la phrase "AudioConf de Preprod utilise un service d'authentification pour assurer que seuls les agents publics utilisent les services qui leur sont réservés." sur la page "Renseignez le code que vous avez reçu" en Preprod :

Problème 1 : Certains utilisateurs pensent que seuls les agents publics peuvent utiliser AudioConf, et que les prestataires ne peuvent pas rejoindre une AudioConf.

Problème 2 : La phrase n'apporte pas d'information utile, mais provoque des questions que les utilisateurs ne se posaient pas nécessairement. Ils n'ont pas besoin de savoir.

Proposition : Supprimer la phrase.

Mentionner Tchap

Page d'accueil, point 3 : on dit que le code va arriver par mail, mais pas par Tchap, donc certains participants ne s’y attendaient pas.

Ajouter "par mail et sur Tchap".

image

Crash après connexion

2023-03-16 22:59:02.699808071 +0100 CET [web-1] at async Client.grant (/app/node_modules/openid-client/lib/client.js:1336:22)
2023-03-16 22:59:02.699801816 +0100 CET [web-1] RPError: outgoing request timed out after 3500ms
2023-03-16 22:59:02.699808443 +0100 CET [web-1] at async Client.callback (/app/node_modules/openid-client/lib/client.js:474:24)
2023-03-16 22:59:02.699807153 +0100 CET [web-1] at /app/node_modules/openid-client/lib/helpers/request.js:136:13
2023-03-16 22:59:02.699808915 +0100 CET [web-1] at async Object.module.exports.finishAuth (/app/lib/oidcAuth.js:97:20)
2023-03-16 22:59:02.699809273 +0100 CET [web-1] at async module.exports.createConf (/app/controllers/createConfController.js:48:20)

Surement lié à Authentification

Partager les taches de support avec PNP

Pour pouvoir répondre au support à plusieurs, et se passer les tickets selon les niveaux de support nécessaires, un software de support comme rocketchat ou chatwoot serait utile. Ou sinon Crisp, c'est payant mais ca fait le job.

Qu'est-ce que PNP utilise deja comme logiciel de tickets de support ?

Stats : satisfaction utilisateur

On nous demande de reporter chaque lundi un certain nombre de stats, donc la satisfaction utilisateur, qu'on demande dans un sondage.
Ca serait cool de l'ajouter au dashboard metabase.

Déployer le questionnaire

Remplacer

<p class="rf-callout__text">Entre le 23 et le 28 janvier, le soir après 20h GMT+1, notre base de données sera en maintenance. Le service de réservation pourra être perturbé ou bloqué, pendant 20 minutes maximum. Cela n'affecte pas les conférences déjà réservées.</p>

par quelque chose comme :

image

Remplacer Typeform, il n'est pas utilisable par la dgfip

Les sondages de satisfaction sont gérés par Typeform. C'est bloqué par la dgfip, qui constitue une bonne part de nos utilisateurs.

Utiliser un logiciel qui est partageable avec des multiples admin, dont l'equipe PNP. A l'heure actuelle on se passe les stats par mail, c'est un peu bête, il vaudrait mieux que Nylda ait accès directement aux resultats.

Wrong date displayed in confCreated page for some timezones

Reported by user b***.r***@martinique.pref.gouv.fr

If your time zone is west of GMT+1, you will get the wrong date displayed in the confirmation page (confCreated.ejs) when the conference is created.

Reproduce :

  • set your computer time to martinique time
  • book a conference for day X
  • the confirmation page displays the wrong day : X+1 (while the email displays the right day X)

That is because the date is displayed based on conference.expiresAt, which for these timezones can be the day after (because it is at midnight in the local time zone, which is the next day in UTC).

Proposed fix : use conferenceDay, which is a date and not a datetime, rather than expiresAt, for display on confCreated.ejs

Verifier les informations d'un ID Token (recommandation ANSSI R28)

Le but de cette tache est de verifier la recommandation R28 de l'ANSSI.
https://www.ssi.gouv.fr/uploads/2020/09/anssi-guide-recommandations_pour_la_securisation_de_la_mise_en_oeuvre_du_protocole_openid_connect-v1.0.pdf

R28 : Verifier les informations d'un ID Token

Le client OIDC doit faire les vérifications qui concernent l’ID Token indiquées dans les spécifications de la norme OIDC

Le client OIDC peut utiliser les informations reçues dans l’ID Token pour vérifier qu’il n’a pas été rejoué ou qu’il lui est bien destiné. On peut citer par exemple :

  • comparer la valeur du champ nonce avec celle envoyée dans la demande d’authentification et conservée dans la session de l’utilisateur ;
  • comparer la valeur du champ iss avec l’URL de l’Authorization Endpoint utilisée dans la demande d’authentification ;
  • comparer la valeur du champ aud avec son identifiant client (client_id) ;
  • vérifier que l’ID Token est valide grâce aux champs iat et exp.

Méthode plus efficace pour remonter les problèmes d'appels à OVH

Actuellement on doit demander par mail des détails à l'utilisateur, puis ouvrir un ticket chez OVH. Ca prend du temps.

OVH pourrait le faire à notre place, puisque pour les problèmes techniques sur les appels on n'ajoute aucune valeur, à part passer l'info à OVH.

Je commence par demander une réunion avec eux pour voir ce qu'ils peuvent faire.
De notre coté on pourrait par exemple envoyer les utilisateurs vers un formulaire à remplir qui pose les bonnes questions (quel est le code de la conf, quelle date/heure, quels telephones, etc).

Add message on the AudioConf landing page

Add the following message on the AudioConf landing page:

Nous recherchons des personnes pour tester une nouvelle version d'AudioConf pendant 20 minutes en visio.
Si participer à l'amélioration d'AudioConf vous intéresse, contactez-nous :
[email protected]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.