Giter Club home page Giter Club logo

gramc3's People

Contributors

calmip avatar vignemail1 avatar

Watchers

 avatar  avatar

gramc3's Issues

Coding style

Description

Depuis 2009 un ensemble de règles d'écriture de code PHP simplifie la reprise du code écrit et le travail collaboratif.
Ces règles sont devenus les standards PSR (https://en.wikipedia.org/wiki/PHP_Standard_Recommendation ; https://www.php-fig.org/psr/), adressant différents aspects du code : autoload, indentation et alignements, logging, ...

Problème

Ne pas avoir de code ayant un style fixe produit des commit git et des soucis d'alignement dans les éditeurs (parfois le code est indenté avec des tabulations, parfois avec des espaces, les ouvertures et fermetures d'accolade ne sont pas forcement identiques dans différentes sections du code, ce qui se traduit pas de difficultés à relire le code et d'apporter des contributions productives.

Proposition de solution

L'implémentation du standard PSR-12 (version actuelle qui améliore PSR-0 et PSR-2) permettrait d'implémenter un style commun et reconnu et des outils comme PHP_codesniffer (binaires phpcs et phpcbf) permettraient de détecter et voire automatiquement corriger le code afin de garder un style PSR-12 uniforme.

De plus, le suivi des standards permet aux outils d'analyse de mieux lire le code pour différentes fonctions comme l'analyse de compatibilité avec des versions de PHP, trouver les blocs de code non factorisés, ...

Les outils d'intégration continue permettent de dérouler des scripts de tests avec différents outils (phpunit avec code coverage et des outils comme ceux de la liste ci-dessous) permettant entre autre la détection de problèmes et un éventuel reporting.

Liens web de documentation

  • Descriptif du standard PSR-12 : https://www.php-fig.org/psr/psr-12/
  • PHPCompatibility : plugin sous forme d'un code style standard pour phpcs (pour détecter l'usage de fonctions, ... pour une ou plusieurs versions de PHP)
  • phpstan : analyseur de code PHP statique
  • phpmd : PHP Mess Detector pour détecter de possibles bugs, du code complexes à maintenir, ...
  • phpcpd : PHP Copy/Paste Detector pour détecter les manques dans la factorisation

Incomplete version table in feature/criann branch

Description du problème

Contexte: version de la branche feature/criann, commit

Différentes pages de la section Administrateur sont indisponibles (remontent des Exceptions) dû à des champs de la DB qui sont manquants voire même de table(s) manquante(s).

Par exemple, la page /gramc3/projet/donnees retourne :

An exception occurred while executing 'SELECT t0.etat_version AS etat_version_1, t0.prj_l_labo AS prj_l_labo_2, t0.prj_titre AS prj_titre_3, t0.dem_heures AS dem_heures_4, t0.attr_heures AS attr_heures_5, t0.politique AS politique_6, t0.prj_sous_thematique AS prj_sous_thematique_7, t0.prj_financement AS prj_financement_8, t0.prj_genci_machines AS prj_genci_machines_9, t0.prj_genci_centre AS prj_genci_centre_10, t0.prj_genci_heures AS prj_genci_heures_11, t0.prj_resume AS prj_resume_12, t0.prj_expose AS prj_expose_13, t0.prj_justif_renouv AS prj_justif_renouv_14, t0.prj_algorithme AS prj_algorithme_15, t0.prj_conception AS prj_conception_16, t0.prj_developpement AS prj_developpement_17, t0.prj_parallelisation AS prj_parallelisation_18, t0.prj_utilisation AS prj_utilisation_19, t0.prj_fiche AS prj_fiche_20, t0.prj_fiche_val AS prj_fiche_val_21, t0.prj_genci_dari AS prj_genci_dari_22, t0.code_nom AS code_nom_23, t0.code_langage AS code_langage_24, t0.code_c AS code_c_25, t0.code_cpp AS code_cpp_26, t0.code_for AS code_for_27, t0.code_autre AS code_autre_28, t0.code_licence AS code_licence_29, t0.code_util_sur_mach AS code_util_sur_mach_30, t0.code_heures_p_job AS code_heures_p_job_31, t0.code_ram_p_coeur AS code_ram_p_coeur_32, t0.gpu AS gpu_33, t0.code_ram_part AS code_ram_part_34, t0.code_eff_paral AS code_eff_paral_35, t0.code_vol_donn_tmp AS code_vol_donn_tmp_36, t0.dem_logiciels AS dem_logiciels_37, t0.dem_bib AS dem_bib_38, t0.dem_post_trait AS dem_post_trait_39, t0.dem_form_maison AS dem_form_maison_40, t0.dem_form_prise AS dem_form_prise_41, t0.dem_form_debogage AS dem_form_debogage_42, t0.dem_form_optimisation AS dem_form_optimisation_43, t0.dem_form_autres AS dem_form_autres_44, t0.dem_form_0 AS dem_form_0_45, t0.dem_form_1 AS dem_form_1_46, t0.dem_form_2 AS dem_form_2_47, t0.dem_form_3 AS dem_form_3_48, t0.dem_form_4 AS dem_form_4_49, t0.dem_form_5 AS dem_form_5_50, t0.dem_form_6 AS dem_form_6_51, t0.dem_form_7 AS dem_form_7_52, t0.dem_form_8 AS dem_form_8_53, t0.dem_form_9 AS dem_form_9_54, t0.dem_form_fortran AS dem_form_fortran_55, t0.dem_form_c AS dem_form_c_56, t0.dem_form_cpp AS dem_form_cpp_57, t0.dem_form_python AS dem_form_python_58, t0.dem_form_mpi AS dem_form_mpi_59, t0.dem_form_openmp AS dem_form_openmp_60, t0.dem_form_openacc AS dem_form_openacc_61, t0.dem_form_paraview AS dem_form_paraview_62, t0.libelle_thematique AS libelle_thematique_63, t0.attr_accept AS attr_accept_64, t0.rap_conf AS rap_conf_65, t0.maj_stamp AS maj_stamp_66, t0.sond_vol_donn_perm AS sond_vol_donn_perm_67, t0.sond_duree_donn_perm AS sond_duree_donn_perm_68, t0.prj_fiche_len AS prj_fiche_len_69, t0.penal_heures AS penal_heures_70, t0.attr_heures_ete AS attr_heures_ete_71, t0.sond_justif_donn_perm AS sond_justif_donn_perm_72, t0.dem_form_autres_autres AS dem_form_autres_autres_73, t0.cgu AS cgu_74, t0.id_version AS id_version_75, t0.data_metadataformat AS data_metadataformat_76, t0.data_tailledatasets AS data_tailledatasets_77, t0.data_nombredatasets AS data_nombredatasets_78, t0.fct_stamp AS fct_stamp_79, t0.maj_ind AS maj_ind_80, t0.prj_id_thematique AS prj_id_thematique_81, t0.prj_id_rattachement AS prj_id_rattachement_82, t0.id_session AS id_session_83, t0.id_projet AS id_projet_84 FROM version t0 WHERE t0.id_session IS NULL’:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.dem_form_0' in 'field list'

Proposition de solutions

  1. Mettre à jour le dump SQL qui permet d'initialiser la base (si les modifications ont pour but d'être intégrées dans la branche principale
  2. Convertir le dump SQL initial en migrations à dérouler à l'installation et ajouter les migrations complémentaires au gré de l'évolution de l'application
  • La première solution a l'avantage de s'appliquer sur une base existante ou nouvelle.
  • La deuxième solution est sans doute la plus pérenne dans le temps et permet de transformer une base de donnée existante au fil de l'eau.

Il pourrait également être intéressant d'étudier le cas d'un champ de type JSON pour stocker les données de formulaire dont la structure peut évoluer au gré des besoins (https://mariadb.com/kb/en/json_search/ , https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#json).

Easier IP restriction in dev mode

Description du problème

Le mode dev requiert de saisir dans un fichier adresses.txt la liste des adresses IP individuelles pour autoriser l'accès au mode dev.
Dans un contexte dual stack (IPv4 et IPv6 par poste) et/ou de taille de réseau parfois grand (par exemple /24 pour IPv4 et /64 pour IPv6), il serait intéressant d'utiliser des fonctions qui permettraient de detecter si l'IP du visiteur fait partie d'une liste d'IP et/ou subnets (IPv4 et/ou IPv6).

Proposition de solution

Il existe un module qui peut être facilement chargé avec composer pour étendre les fonctionnalités de traitement des adresses IPv4 et IPv6 et notamment tester si une adresse est dans un subnet, ce qui permettrait de saisir des adresses et/ou subnets IPv4 et IPv6 dans le fichiers adresses.txt afin d'arriver à un résultat plus compact.

URL : https://packagist.org/packages/mlocati/ip-lib

Comme le fichier index.php, qui réalise le test, charge le fichier bootstrap.php qui charge l'autoloader, les fonctions du module seraient directement accessibles.

Wrong order in installation documentation

Description du problème

Dans la documentation à la base du projet, il est spécifier de lancer 2 commandes afin de générer un fichier .htaccess mais ces commandes tentent de lire les fichiers de configurations qui sont dans une étape qui après les deux commandes, ce qui provoque des erreurs aux moment de lancer les 2 commandes.

root@gramc:/var/www/html/gramc3# ./composer.phar remove symfony/apache-pack
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]?
symfony/apache-pack is not required in your composer.json and has not been removed
./composer.json has been updated
Running composer update symfony/apache-pack
Loading composer repositories with package information
Updating dependencies
Package "symfony/apache-pack" listed for update is not locked.
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Package twig/extensions is abandoned, you should avoid using it. No replacement was suggested.
Generating autoload files
composer/package-versions-deprecated: Generating version class...
composer/package-versions-deprecated: ...done generating version class
87 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

Run composer recipes at any time to see the status of your Symfony recipes.

Executing script cache:clear [KO]
 [KO]
Script cache:clear returned with error code 1
!!
!!  In ParameterBag.php line 100:
!!
!!    You have requested a non-existent parameter "mailadmin".
!!
!!
!!
Script @auto-scripts was called via post-update-cmd

Proposition de solution

L'ordre des actions devrait donc être :

  • de d'abord configurer les fichiers .yaml de l'application
  • puis de lancer les commandes pour générer le fichier .htaccess

vendor folder

Description

Le dossier vendor est normalement généré par composer suivant ce qui est écrit dans les fichiers composer.json (qui décrit les dépendances de l'applications avec les versions utilisables en suivant la SemVer de composer ainsi que d'autres éléments comme des alias de scripts) et composer.lock (versions des modules qui ont été testés et conformes avec les versions spécifiées dans composer.json).

Problème

Le dossier vendor n'a, à priori, pas besoin d'être peuplé dans le dépôt git car il doit être 100% reconstructible depuis le contenu des deux fichiers composer.* qui décrivent les dépendances pour l'application.

Proposition de solution

  • Supprimer le contenu du dossier vendor
  • Ajouter une exclusion du contenu du dossier vendor dans un fichier .gitignore à la base du projet
  • Documenter qu'il faut lancer une commande composer install après le git clone afin de récupérer les dépendances

SMTP service requirements

Description du problème

Afin de valider la configuration de la partie envoi de mail depuis l'application, il faut définir des paramètres MAILER_* qui permettent au module symfony/mailer d'utiliser le transport smtp.
Le service DOIT avoir TLS d'activé sinon le test d'envoi de mail échoue sur une erreur OpenSSL.

Fichier config/services.yaml :

...
    mailer_transport: '%env(MAILER_TRANSPORT)%'
    mailer_host: '%env(MAILER_HOST)%'
    mailer_user: '%env(MAILER_USER)%'
    mailer_password: '%env(MAILER_PASSWORD)%'
...

Fichier .env.local :

MAILER_RECIPIENT[email protected]
MAILER_TRANSPORT=smtp
MAILER_HOST=localhost
MAILER_USER=null
MAILER_PASSWORD=null
root@gramc:/var/www/html/gramc3# ./bin/console app:send-a-mail [email protected]

In SocketStream.php line 154:

  Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error mess
  ages:
  error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed


app:send-a-mail [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command> <dest>

Proposition de solutions

  • soit trouver des paramètres qui permettent de garder la possibilité de désactiver l'usage de TLS
  • soit regénérer le certificat par défaut du postfix local afin d'avoir un CN=localhost, ajouter le dossier /etc/ssl/certs dans le fichier de configuration php.ini du SAPI cli utilisé et de lancer la commande c_rehash pour regénérer le fichier ca-certificates.crt qui agrège les clés publiques du système
  • soit utiliser un service SMTP avec certificat valide dont la chaine de certification est connue du système PHP qui héberge gramc

Une commande Symfony ./bin/console cache:clear peut être nécessaire pour valider les changements avant de refaire un essai d'envoi de mail ./bin/console app:send-a-mail [email protected].

Regénérer le snake-oil local

testé sous Ubuntu 20.04

Par défaut postfix vient avec un certificat snake-oil self-signed ayant pour CN=<short_hostname> et le module s'attend à un CN=localhost.
Un contournement est de :

  • regénérer le certificat après avoir temporairement ajouter localhost (en premier) avec l'IP non-localhost de la machine dans le fichier /etc/hosts (ex: aaa.bbb.ccc.ddd localhost gramc.domain.tld gramc)
  • lancer la commande make-ssl-cert generate-default-snakeoil --force-overwrite
  • lancer la commande c_rehash
  • supprimer le mot localhost de la ligne aaa.bbb.ccc.ddd dans /etc/hosts
  • ajouter, dans /etc/php/7.4/cli/php.ini
    [openssl]
    openssl.capath=/etc/ssl/certs
    

Duplicate services.yaml.dist keys

Description

La bibliothèque de parse YAML, déclenchée par des scripts du projet, ne supporte pas d'avoir des clés YAML dupliquées.

Problème

Lors de la phase d'installation, un jeu de 2 commandes doivent êtres lancés afin de générer un fichier .htaccess adéquat. Le problème est que ces commandes utilisent les fichiers YAML de configuration et que si des clés YAML sont dupliquées, la bibliothèque retourne en erreur.

Par exemple :

root@gramc:/var/www/html/gramc3# ./composer.phar remove symfony/apache-pack
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]?
symfony/apache-pack is not required in your composer.json and has not been removed
./composer.json has been updated
Running composer update symfony/apache-pack
Loading composer repositories with package information
Updating dependencies
Package "symfony/apache-pack" listed for update is not locked.
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 0 updates, 1 removal
  - Removing symfony/apache-pack (v1.0.1)
Package twig/extensions is abandoned, you should avoid using it. No replacement was suggested.
Generating autoload files
composer/package-versions-deprecated: Generating version class...
composer/package-versions-deprecated: ...done generating version class
87 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

Symfony operations: 1 recipe (72830c83b3ff33fbf202fda374aef8c2)
  - Unconfiguring symfony/apache-pack (>=1.0): From github.com/symfony/recipes-contrib:master
Executing script cache:clear [KO]
 [KO]
Script cache:clear returned with error code 1
!!
!!  In FileLoader.php line 180:
!!
!!    The file "/var/www/gramc3/config/services.yaml" does not contain valid YAML
!!    : Duplicate key "password_consoupload" detected at line 146 (near "password
!!    _consoupload: '%env(PASSWORD_CONSOUPLOAD)%'") in /var/www/gramc3/config/ser
!!    vices.yaml (which is loaded in resource "/var/www/gramc3/config/services.ya
!!    ml").
!!
!!
!!  In YamlFileLoader.php line 693:
!!
!!    The file "/var/www/gramc3/config/services.yaml" does not contain valid YAML
!!    : Duplicate key "password_consoupload" detected at line 146 (near "password
!!    _consoupload: '%env(PASSWORD_CONSOUPLOAD)%'").
!!
!!
!!  In Parser.php line 345:
!!
!!    Duplicate key "password_consoupload" detected at line 146 (near "password_c
!!    onsoupload: '%env(PASSWORD_CONSOUPLOAD)%'").
!!
!!
!!
Script @auto-scripts was called via post-update-cmd

Proposition de solution

La solution qui semble la plus pertinente est donc de s'assurer qu'aucune clé YAML ne soit dupliquée dans le fichier exemple services.yaml.dist

Les clés dupliquées :

  • password_consoupload
  • mailer_transport
  • mailer_host
  • mailer_user
  • mailer_password

Exception raised when no session exists

Description du problème

Contexte: Version de gramc v3: feature/criann

Lors de la première utilisation des différents menus du mode Administrateur, alors qu'aucune session n'a été créée, des Exceptions sont remontées.
Lorsque l'on cliques sur "Projets ( par session )" on obtient le message suivant

Error:
Call to a member function getIdSession() on null

  at src/Controller/ProjetController.php:862
  at App\Controller\ProjetController->sessionAction()
     (vendor/symfony/http-kernel/HttpKernel.php:158)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
     (vendor/symfony/http-kernel/HttpKernel.php:80)
  at Symfony\Component\HttpKernel\HttpKernel->handle()
     (vendor/symfony/http-kernel/Kernel.php:201)
  at Symfony\Component\HttpKernel\Kernel->handle()
     (public/index.php:66)                
Error
in src/Controller/ProjetController.php (line 862)
            'nombreTermine'       => $nombreTermine,
            'nombreAnnule'        => $nombreAnnule,
            'nombreEditionFil'    => $nombreEditionFil,
            'nombreExpertiseFil'  => $nombreExpertiseFil,
            'form'                => $form->createView(), // formulaire 
            'idSession'           => $session->getIdSession(), // formulaire
            'session'             => $session,
            'versions'            => $versions,
            'versions_suppl'      => $versions_suppl,
            'nombreNouveaux'      => $nombreNouveaux,
            'demHeures'           => $demHeures,
in vendor/symfony/http-kernel/HttpKernel.php -> sessionAction (line 158)
in vendor/symfony/http-kernel/HttpKernel.php -> handleRaw (line 80)
in vendor/symfony/http-kernel/Kernel.php -> handle (line 201)
Kernel->handle()
in public/index.php (line 66)
Level Channel Message
INFO10:13:09 request Matched route "projet_session".{ "route": "projet_session", "route_parameters": { "_route": "projet_session", "_controller": "App\Controller\ProjetController::sessionAction" }, "request_uri": "https://gramc.criann.fr/gramc3/projet/session", "method": "GET" }
DEBUG10:13:09 security Read existing security token from the session.{ "key": "_security_global_security_context", "token_class": "Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken" }
DEBUG10:13:09 doctrine SELECT t0.eppn AS eppn_1, t0.id_individu AS id_individu_2 FROM sso t0 WHERE t0.eppn = ? LIMIT 1[ 1 ]
DEBUG10:13:09 doctrine SELECT t0.creation_stamp AS creation_stamp_1, t0.nom AS nom_2, t0.prenom AS prenom_3, t0.mail AS mail_4, t0.admin AS admin_5, t0.sysadmin AS sysadmin_6, t0.obs AS obs_7, t0.expert AS expert_8, t0.president AS president_9, t0.desactive AS desactive_10, t0.id_individu AS id_individu_11, t0.id_statut AS id_statut_12, t0.id_labo AS id_labo_13, t0.id_etab AS id_etab_14 FROM individu t0 WHERE t0.id_individu = ? LIMIT 1[ 1 ]
DEBUG10:13:09 security User was reloaded from a user provider.{ "provider": "App\Security\User\GramcUserProvider", "username": 1 }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName".{ "event": "kernel.request", "listener": "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator".{ "event": "kernel.request", "listener": "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest" }
DEBUG10:13:09 doctrine SELECT t0.cle AS cle_1, t0.val AS val_2, t0.id_param AS id_param_3 FROM param t0 WHERE t0.cle = ? LIMIT 1[ "now" ]
DEBUG10:13:09 doctrine SELECT t0.cle AS cle_1, t0.val AS val_2, t0.id_param AS id_param_3 FROM param t0 WHERE t0.cle = ? LIMIT 1[ "DateString" ]
DEBUG10:13:09 doctrine SELECT t0.cle AS cle_1, t0.val AS val_2, t0.id_param AS id_param_3 FROM param t0 WHERE t0.cle = ? LIMIT 1[ "DateShift" ]
DEBUG10:13:09 doctrine SELECT t0.cle AS cle_1, t0.val AS val_2, t0.id_param AS id_param_3 FROM param t0 WHERE t0.cle = ? LIMIT 1[ "NewDate" ]
DEBUG10:13:09 doctrine SELECT s0_.type_session AS type_session_0, s0_.hparannee AS hparannee_1, s0_.comm_global AS comm_global_2, s0_.date_debut_session AS date_debut_session_3, s0_.date_fin_session AS date_fin_session_4, s0_.etat_session AS etat_session_5, s0_.id_session AS id_session_6, s0_.id_president AS id_president_7 FROM session s0_ WHERE s0_.etat_session <> ? ORDER BY s0_.id_session DESC[ 9 ]
DEBUG10:13:09 doctrine SELECT s0_.type_session AS type_session_0, s0_.hparannee AS hparannee_1, s0_.comm_global AS comm_global_2, s0_.date_debut_session AS date_debut_session_3, s0_.date_fin_session AS date_fin_session_4, s0_.etat_session AS etat_session_5, s0_.id_session AS id_session_6, s0_.id_president AS id_president_7 FROM session s0_ WHERE s0_.etat_session <> ? ORDER BY s0_.id_session DESC[ 9 ]
INFO10:13:09 php User Deprecated: The "Sensio\Bundle\FrameworkExtraBundle\Configuration\Method" annotation is deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route" instead.{ "exception": {} }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController".{ "event": "kernel.controller", "listener": "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController".{ "event": "kernel.controller", "listener": "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController" }
DEBUG10:13:09 event Notified event "debug.security.authorization.vote" to listener "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote".{ "event": "debug.security.authorization.vote", "listener": "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" }
DEBUG10:13:09 event Notified event "debug.security.authorization.vote" to listener "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote".{ "event": "debug.security.authorization.vote", "listener": "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" }
DEBUG10:13:09 event Notified event "kernel.controller_arguments" to listener "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments" }
DEBUG10:13:09 event Notified event "kernel.controller_arguments" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments" }
DEBUG10:13:09 event Notified event "kernel.controller_arguments" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments" }
DEBUG10:13:09 doctrine SELECT s0_.type_session AS type_session_0, s0_.hparannee AS hparannee_1, s0_.comm_global AS comm_global_2, s0_.date_debut_session AS date_debut_session_3, s0_.date_fin_session AS date_fin_session_4, s0_.etat_session AS etat_session_5, s0_.id_session AS id_session_6, s0_.id_president AS id_president_7 FROM session s0_ WHERE s0_.etat_session <> ? ORDER BY s0_.id_session DESC[ 9 ]
DEBUG10:13:09 doctrine SELECT t0.type_session AS type_session_1, t0.hparannee AS hparannee_2, t0.comm_global AS comm_global_3, t0.date_debut_session AS date_debut_session_4, t0.date_fin_session AS date_fin_session_5, t0.etat_session AS etat_session_6, t0.id_session AS id_session_7, t0.id_president AS id_president_8 FROM session t0 ORDER BY t0.id_session DESC
DEBUG10:13:09 doctrine SELECT v0_.etat_version AS etat_version_0, v0_.prj_l_labo AS prj_l_labo_1, v0_.prj_titre AS prj_titre_2, v0_.dem_heures AS dem_heures_3, v0_.attr_heures AS attr_heures_4, v0_.politique AS politique_5, v0_.prj_genci_dari AS prj_genci_dari_6, v0_.sond_vol_donn_perm AS sond_vol_donn_perm_7, v0_.penal_heures AS penal_heures_8, v0_.id_version AS id_version_9, v0_.maj_ind AS maj_ind_10, v0_.prj_id_thematique AS prj_id_thematique_11, v0_.prj_id_rattachement AS prj_id_rattachement_12, v0_.id_session AS id_session_13, v0_.id_projet AS id_projet_14 FROM version v0_ INNER JOIN session s1_ ON v0_.id_session = s1_.id_session WHERE (s1_.id_session = ? AND NOT v0_.etat_version = ?)[ null, 10 ]
DEBUG10:13:09 doctrine SELECT t0.libelle_thematique AS libelle_thematique_1, t0.id_thematique AS id_thematique_2, t0.id_meta_thematique AS id_meta_thematique_3 FROM thematique t0
DEBUG10:13:09 doctrine SELECT t0.libelle_rattachement AS libelle_rattachement_1, t0.id_rattachement AS id_rattachement_2 FROM rattachement t0
CRITICAL10:13:09 php Uncaught Error: Call to a member function getIdSession() on null{ "exception": {} }
INFO10:13:09 php User Deprecated: The "Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent::getException()" method is deprecated since Symfony 4.4, use "getThrowable()" instead.{ "exception": {} }
INFO10:13:09 php User Deprecated: The "Symfony\Component\Debug\Exception\FatalThrowableError" class is deprecated since Symfony 4.4.{ "exception": {} }
INFO10:13:09 php User Deprecated: The "Symfony\Component\Debug\Exception\FatalErrorException" class is deprecated since Symfony 4.4, use "Symfony\Component\ErrorHandler\Error\FatalError" instead.{ "exception": {} }
WARNING10:13:09 app Error to /gramc3/projet/session{ "exception": {}, "request": { "attributes": {}, "request": {}, "query": {}, "server": {}, "files": {}, "cookies": {}, "headers": {} } }
ERROR10:13:09 app App\EventListener\ExceptionListener::onKernelException:241 Exception Symfony\Component\Debug\Exception\FatalThrowableError : Call to a member function getIdSession() on null À partir de URL : /projet/session
CRITICAL10:13:09 request Uncaught PHP Exception Error: "Call to a member function getIdSession() on null" at /var/www/gramc3/src/Controller/ProjetController.php line 862{ "exception": {} }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName".{ "event": "kernel.request", "listener": "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator".{ "event": "kernel.request", "listener": "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator" }
DEBUG10:13:09 event Notified event "kernel.request" to listener "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest".{ "event": "kernel.request", "listener": "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController".{ "event": "kernel.controller", "listener": "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController".{ "event": "kernel.controller", "listener": "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController".{ "event": "kernel.controller", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController" }
DEBUG10:13:09 event Notified event "kernel.controller_arguments" to listener "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments" }
DEBUG10:13:09 event Notified event "kernel.controller_arguments" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments" }
DEBUG10:13:09 event Notified event "kernel.controller_arguments" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments".{ "event": "kernel.controller_arguments", "listener": "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments" }

## Etapes pour reproduire

  • Version de gramc v3: feature/criann
  • Installation vierge (base de données fraichement installée)
  • Se connecter en mode dev (admin admin)
  • Aller dans le menu Administrateur
  • Cliquer sur le lien "Projets ( par session )"

Apache configuration

Description du problème

Afin que Symfony puisse correctement utiliser le module rewrite d'Apache, les directives Rewrite* doivent être autorisées, ce qui n'est pas le cas dans la configuration d'Apache 2.4 par défaut. Il faut autoriser certaines directives via la directive AllowOverride.

Sous Ubuntu ou par défaut depuis Apache 2.3.9, la directive AllowOverride vaut None par défaut alors que pour le module Rewrite il faut avoir à minima FileInfo.
De même, le fichier .htaccess généré utilise la directive DirectoryIndex pour spécifier le fichier par défaut. Cette directive nécessite l'option AllowOverride Indexes.
Enfin, pour pouvoir lire le fichier .htaccess, il faut également la surcharge Options

Il serait intéressant que la documentation est fasse état afin de simplifier la phase d'installation.

Proposition de solution

Sur la base d'une copie de gramc3 dans /var/www/gramc3 et d'un lien symbolique ln -s /var/www/gramc3/public /var/www/html/gramc3 avec la variable export BASE="/gramc3" dans /etc/apache2/envvars comme dans la documentation.

Un exemple minimal de virtualhost incluant les valeurs nécessaires pour la directive AllowOverride :

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        <Directory /var/www>
                AllowOverride FileInfo Indexes Options=MultiViews
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Pour l'utilisation de la Fédération, il faut que le site soit accessible via HTTPS donc une version minimale serait

<VirtualHost *:80>
    ServerName gramc.domain.tld
    ServerAdmin webmaster@localhost

    RewriteEngine On
    # This will enable the Rewrite capabilities
    RewriteCond %{HTTPS} !=on
    # This checks to make sure the connection is not already HTTPS
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName gramc.domain.tld
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/html>
        Options +FollowSymLinks
        AllowOverride FileInfo Indexes Options=MultiViews
    </Directory>

    <Location /Shibboleth.sso>
        AuthType None
        SetHandler shib
        Require all granted
    </Location>

    ShibCompatValidUser On
    <Location /gramc3/login>
        AuthType shibboleth
        ShibRequestSetting requireSession 1
        ShibRequestSetting applicationId default
        # Require shibboleth
        require shib-session
    </Location>

    UseCanonicalName On

    <IfModule mod_ssl.c>
        SSLEngine On

        SSLCertificateFile /etc/ssl/certs/server.crt
        SSLCertificateKeyFile /etc/ssl/private/server.key
        SSLCertificateChainFile /etc/ssl/certs/sectigo-chain.crt
    </IfModule>
</VirtualHost>

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.