Commit 5dac33b6 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Merge branch 'develop'

parents cfb09d21 cec2b6b3
Pipeline #5180 failed with stage
in 9 seconds
vendor/
.idea
.DS_Store
stages:
- tests
- publish
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- vendor/
#unit-tests:
# stage: tests
# script:
# - composer install --no-interaction --no-suggest --no-progress
# - php vendor/bin/phpunit --coverage-text=coverage.txt --colors=never
# artifacts:
# paths:
# - coverage.txt
update-satis:
stage: publish
script:
- update-satis
###########################################################################################
#
# Image pour le dev.
#
###########################################################################################
ARG PHP_VERSION
FROM unicaen-dev-php${PHP_VERSION}-apache
LABEL maintainer="Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>"
WORKDIR /app
ENV APACHE_CONF_DIR=/etc/apache2 \
PHP_CONF_DIR=/etc/php/${PHP_VERSION}
## Installation de packages requis.
RUN apt-get update -qq && \
apt-get install -y \
sqlite3 \
php${PHP_VERSION}-pdo-sqlite
RUN pecl install ast && \
echo "extension=ast.so" > ${PHP_CONF_DIR}/cli/conf.d/ast.ini
# Nettoyage
RUN apt-get autoremove -y && apt-get clean && rm -rf /tmp/* /var/tmp/*
# Symlink apache access and error logs to stdout/stderr so Docker logs shows them
RUN ln -sf /dev/stdout /var/log/apache2/access.log
RUN ln -sf /dev/stdout /var/log/apache2/other_vhosts_access.log
RUN ln -sf /dev/stderr /var/log/apache2/error.log
# Configuration Apache et FPM
ADD docker/apache-ports.conf ${APACHE_CONF_DIR}/ports.conf
ADD docker/apache-site.conf ${APACHE_CONF_DIR}/sites-available/app.conf
ADD docker/apache-site-ssl.conf ${APACHE_CONF_DIR}/sites-available/app-ssl.conf
ADD docker/fpm/pool.d/app.conf ${PHP_CONF_DIR}/fpm/pool.d/app.conf
ADD docker/fpm/conf.d/app.ini ${PHP_CONF_DIR}/fpm/conf.d/app.ini
RUN a2ensite app app-ssl && \
service php${PHP_VERSION}-fpm reload
# Squelette d'application Unicaen
## Build et lancement du container Docker
$ docker-compose up --build -d
## Installation des dépendances PHP :
$ docker-compose run skeleton-application composer install
## Module Demo
Le module démo fournit une base de données de démonstration permettant d'avoir une authentification locale
qui fonctionne.
Jetez un oeil à la base de données de démo présente dans le module 'Demo' :
$ docker-compose run skeleton-application sqlite3 module/Demo/data/db/demo.sqlite ".schema"
Interrogez la table `user` pour vérifier la présence de l'utilisateur local `demo`, exemple :
$ docker-compose run skeleton-application sqlite3 module/Demo/data/db/demo.sqlite "select * from user;"
## Configuration du projet
- Renommez `config/autoload/local.php.dist` en `local.php`.
- Copiez dans votre dossier `config/autoload` les fichiers de configuration locaux et globaux `.dist`
des bibliothèques utilisées sans leur extension `.dist` :
```bash
cp vendor/unicaen/app/config/unicaen-app.global.php.dist config/autoload/unicaen-app.global.php
cp vendor/unicaen/app/config/unicaen-app.local.php.dist config/autoload/unicaen-app.local.php
cp vendor/unicaen/auth/config/unicaen-auth.global.php.dist config/autoload/unicaen-auth.global.php
cp vendor/unicaen/auth/config/unicaen-auth.local.php.dist config/autoload/unicaen-auth.local.php
cp vendor/unicaen/code/config/unicaen-code.global.php.dist config/autoload/unicaen-code.global.php
```
- Le cas échéant, reportez-vous aux docs des modules concernés pour adapter ces fichiers de configuration à vos besoins :
- [unicaen/app](https://git.unicaen.fr/lib/unicaen/app)
- [unicaen/auth](https://git.unicaen.fr/lib/unicaen/auth)
- [unicaen/code](https://git.unicaen.fr/lib/unicaen/code)
## Test de l'application
Théoriquement, l'application devrait être accessible à l'adresse [https://localhost:8843](https://localhost:8843).
Le port utilisé dépend des redirections configurées dans le fichier [docker-compose.yml](docker-compose.yml).
# check-compat
Tester la compatibilité des bibliothèques `unicaen/*` avec une version précise de PHP.
## PHP 7.0
```bash
docker run \
--rm \
-v ${PWD}:/app \
--workdir /app \
unicaen-dev-php7.0-apache \
./bin/check-compat.sh 7.0
```
## PHP 7.1
```bash
docker run \
--rm \
-v ${PWD}:/app \
--workdir /app \
unicaen-dev-php7.0-apache \
./bin/check-compat.sh 7.1
```
## PHP 7.2
```bash
docker run \
--rm \
-v ${PWD}:/app \
--workdir /app \
unicaen-dev-php7.0-apache \
./bin/check-compat.sh 7.2
```
## PHP 7.3
```bash
docker run \
--rm \
-v ${PWD}:/app \
--workdir /app \
unicaen-dev-php7.0-apache \
./bin/check-compat.sh 7.3
```
#!/usr/bin/env bash
[[ -z $1 ]] && echo "Veuillez spécifier les versions de PHP désirées (ex: 7.1 7.2 7.3)." && exit 1
DIR=$(cd `dirname $0` && pwd)
DIRNAME=$(basename ${DIR})
cd ${DIR}/..
versions=$1
phpcs="./vendor/bin/phpcs"
libdir="./vendor/unicaen"
outdir="./${DIRNAME}/reports"
mkdir -p ${outdir} #&& rm -rf ${outdir}/*
for path in ${libdir}/*
do
dirname=$(basename -- "$path")
for ver in "$1"
do
reportpath="${outdir}/compat-unicaen-${dirname}-${ver}.txt"
echo "Processing '${path}' against PHP version ${ver}"
echo "=> reporting into '${reportpath}'"
${phpcs} \
-p \
--standard=PHPCompatibility \
--runtime-set testVersion ${ver} \
--report-full=${reportpath} \
${path}
done
done
#!/usr/bin/env bash
DIR=$(cd `dirname $0` && pwd)
cd ${DIR}/..
v=7.0 ; docker build --rm -t skeleton-app-${v} -f Dockerfile-${v} .
v=7.0 ; docker rm -f skeleton-app-${v}-container
v=7.0 ; docker run -d -p 8070:80 -p 8470:443 -v ${PWD}/composer.json:/app/composer.json -v ${PWD}/.phan:/app/.phan --name skeleton-app-${v}-container skeleton-app-${v}
v=7.0 ; docker exec skeleton-app-${v}-container composer update --no-suggest --optimize-autoloader
v=7.1 ; docker build --rm -t skeleton-app-${v} -f Dockerfile-${v} .
v=7.1 ; docker rm -f skeleton-app-${v}-container
v=7.1 ; docker run -d -p 8071:80 -p 8471:443 -v ${PWD}/composer.json:/app/composer.json -v ${PWD}/.phan:/app/.phan --name skeleton-app-${v}-container skeleton-app-7.1
v=7.1 ; docker exec skeleton-app-${v}-container composer update --no-suggest --optimize-autoloader
v=7.2 ; docker build --rm -t skeleton-app-${v} -f Dockerfile-${v} .
v=7.2 ; docker rm -f skeleton-app-${v}-container
v=7.2 ; docker run -d -p 8072:80 -p 8472:443 -v ${PWD}/composer.json:/app/composer.json -v ${PWD}/.phan:/app/.phan --name skeleton-app-${v}-container skeleton-app-${v}
v=7.2 ; docker exec skeleton-app-${v}-container composer update --no-suggest --optimize-autoloader
v=7.3 ; docker build --rm -t skeleton-app-${v} -f Dockerfile-${v} .
v=7.3 ; docker rm -f skeleton-app-${v}-container
v=7.3 ; docker run -d -p 8073:80 -p 8473:443 -v ${PWD}/composer.json:/app/composer.json -v ${PWD}/.phan:/app/.phan --name skeleton-app-${v}-container skeleton-app-${v}
v=7.3 ; docker exec skeleton-app-${v}-container composer update --no-suggest --optimize-autoloader
# analyse des modules unicaen/* :
# v=7.0 ; docker exec skeleton-app-$v-container vendor/bin/phan --config-file .phan/config-unicaen.php --target-php-version $v > /tmp/phan-unicaen-$v.log
# v=7.1 ; docker exec skeleton-app-$v-container vendor/bin/phan --config-file .phan/config-unicaen.php --target-php-version $v > /tmp/phan-unicaen-$v.log
# v=7.2 ; docker exec skeleton-app-$v-container vendor/bin/phan --config-file .phan/config-unicaen.php --target-php-version $v > /tmp/phan-unicaen-$v.log
# v=7.3 ; docker exec skeleton-app-$v-container vendor/bin/phan --config-file .phan/config-unicaen.php --target-php-version $v > /tmp/phan-unicaen-$v.log
# analyse des vendors :
# v=7.0 ; docker exec skeleton-app-$v-container vendor/bin/phan --config-file .phan/config-vendor.php --target-php-version $v > /tmp/phan-vendor-$v.log
# v=7.1 ; docker exec skeleton-app-$v-container vendor/bin/phan --config-file .phan/config-vendor.php --target-php-version $v > /tmp/phan-vendor-$v.log
# v=7.2 ; docker exec skeleton-app-$v-container vendor/bin/phan --config-file .phan/config-vendor.php --target-php-version $v > /tmp/phan-vendor-$v.log
# v=7.3 ; docker exec skeleton-app-$v-container vendor/bin/phan --config-file .phan/config-vendor.php --target-php-version $v > /tmp/phan-vendor-$v.log
#!/usr/bin/env bash
[[ -z $1 ]] && echo "Veuillez spécifier la version de PHP désirée (ex: 7.1)." && exit 1
DIR=$(cd `dirname $0` && pwd)
DIRNAME=$(basename ${DIR})
cd ${DIR}/..
version=$1
# conversion de la version spécifiée au format PHP_VERSION_ID, ex: "7.2" devien "70200"
a=(${version//./ })
PHP_VERSION_ID=$((a[0]*10000+a[1]*100+a[2]))
phpcs="./vendor/bin/phpcs"
libdir="./vendor/unicaen"
outdir="./${DIRNAME}/reports"
mkdir -p ${outdir} #&& rm -rf ${outdir}/*
for path in ${libdir}/*
do
dirname=$(basename -- "$path")
reportpath="${outdir}/phpcs-unicaen-${dirname}-${version}.txt"
echo "Processing '${path}' against PHP version ${version} (PHP_VERSION_ID=${PHP_VERSION_ID})"
echo "=> reporting into '${reportpath}'"
${phpcs} \
-p \
--standard=ruleset.xml \
--runtime-set php_version ${PHP_VERSION_ID} \
--report-full=${reportpath} \
${path}
done
......@@ -8,14 +8,37 @@
}
],
"require": {
"unicaen/app": "^1.2",
"unicaen/auth": "^1.2"
"unicaen/app": "dev-zf-3.x",
"unicaen/auth": "dev-zf-3.x",
"unicaen/bjy-authorize": "dev-zf-3.x",
"unicaen/faq": "dev-zf-3.x",
"unicaen/import": "dev-zf-3.x",
"unicaen/ldap": "dev-zf-3.x",
"unicaen/leocarte": "dev-zf-3.x",
"unicaen/oracle": "^1.2"
},
"require-dev": {
"unicaen/code": "^1.0",
"zendframework/zend-test": ">=2.3",
"phpunit/PHPUnit": ">=3.7",
"zendframework/zend-developer-tools": ">=1.0"
"phpunit/phpunit": ">=3.7",
"zendframework/zend-developer-tools": ">=1.0",
"unicaen/php-compat": "dev-master"
},
"scripts": {
"post-install-cmd": [
"mkdir -p data/DoctrineORMModule/Proxy ; chmod -R 777 data/DoctrineORMModule/Proxy"
]
},
"autoload": {
"psr-4": {
"Application\\": "module/Application/src"
},
"files": [
"module/Application/Module.php"
]
},
"autoload-dev": {
"psr-4": {
"ApplicationTest\\": "module/Application/test"
}
}
}
\ No newline at end of file
}
This source diff could not be displayed because it is too large. You can view the blob instead.
<?php
$modules = [
'ZfcBase', 'DoctrineModule', 'DoctrineORMModule', 'ZfcUser', 'ZfcUserDoctrineORM',
'BjyAuthorize', 'AssetManager',
'UnicaenApp', 'UnicaenAuth',
'Zend\Cache',
'Zend\Filter',
'Zend\Form',
'Zend\Hydrator',
'Zend\I18n',
'Zend\InputFilter',
'Zend\Log',
'Zend\Mail',
'Zend\Mvc\Console',
'Zend\Mvc\I18n',
// 'Zend\Mvc\Plugin\FilePrg',
'Zend\Mvc\Plugin\FlashMessenger',
// 'Zend\Mvc\Plugin\Identity',
'Zend\Mvc\Plugin\Prg',
'Zend\Navigation',
'Zend\Paginator',
'Zend\Router',
'Zend\Session',
'Zend\Validator',
'DoctrineModule',
'DoctrineORMModule',
'ZfcUser',
'BjyAuthorize',
'UnicaenApp',
'UnicaenAuth',
'Application',
'Demo',
];
$applicationEnv = getenv('APPLICATION_ENV') ?: 'production';
if ('development' === $applicationEnv) {
$modules[] = 'ZendDeveloperTools';
$modules[] = 'UnicaenCode';
// $modules[] = 'UnicaenCode';
}
$moduleListenerOptions = [
......
About this directory:
=====================
By default, this application is configured to load all configs in
`./config/autoload/{,*.}{global,local}.php`. Doing this provides a
location for a developer to drop in configuration override files provided by
modules, as well as cleanly provide individual, application-wide config files
for things like database connections, etc.
<?php
return array(
'view_manager' => array(
'display_not_found_reason' => false,
'display_exceptions' => false,
),
);
return [
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
],
];
<?php
/**
* Configuration globale du module UnicaenApp.
*
* Copiez ce fichier dans le répertoire "config/autoload" de l'application,
* enlevez l'extension ".dist" et adaptez son contenu à vos besoins.
*/
use Zend\Session\Storage\SessionArrayStorage;
use Zend\Session\Validator\HttpUserAgent;
use Zend\Session\Validator\RemoteAddr;
return [
'unicaen-app' => [
/**
* Informations concernant cette application
*/
'app_infos' => [
'nom' => "NomDeVotreApplication",
'desc' => "Description succincte de votre application",
'version' => "0.0.1",
'date' => "07/11/2017",
'contact' => ['mail' => "dsi.applications@unicaen.fr", /*'tel' => "01 02 03 04 05"*/],
'mentionsLegales' => "http://www.unicaen.fr/acces-direct/mentions-legales/",
'informatiqueEtLibertes' => "http://www.unicaen.fr/acces-direct/informatique-et-libertes/",
],
/**
* Période d'exécution de la requête de rafraîchissement de la session utilisateur, en millisecondes.
*/
'session_refresh_period' => 0, // 0 <=> aucune requête exécutée
/**
* Paramètres de fonctionnement LDAP.
*/
'ldap' => [
'dn' => [
'UTILISATEURS_BASE_DN' => 'ou=people,dc=unicaen,dc=fr',
'UTILISATEURS_DESACTIVES_BASE_DN' => 'ou=deactivated,dc=unicaen,dc=fr',
'GROUPS_BASE_DN' => 'ou=groups,dc=unicaen,dc=fr',
'STRUCTURES_BASE_DN' => 'ou=structures,dc=unicaen,dc=fr',
],
'filters' => [
'LOGIN_FILTER' => '(supannAliasLogin=%s)',
'UTILISATEUR_STD_FILTER' => '(|(uid=p*)(&(uid=e*)(eduPersonAffiliation=student)))',
'CN_FILTER' => '(cn=%s)',
'NAME_FILTER' => '(cn=%s*)',
'UID_FILTER' => '(uid=%s)',
'NO_INDIVIDU_FILTER' => '(supannEmpId=%08s)',
'AFFECTATION_FILTER' => '(&(uid=*)(eduPersonOrgUnitDN=%s))',
'AFFECTATION_CSTRUCT_FILTER' => '(&(uid=*)(|(ucbnSousStructure=%s;*)(supannAffectation=%s;*)))',
'LOGIN_OR_NAME_FILTER' => '(|(supannAliasLogin=%s)(cn=%s*))',
'MEMBERSHIP_FILTER' => '(memberOf=%s)',
'AFFECTATION_ORG_UNIT_FILTER' => '(eduPersonOrgUnitDN=%s)',
'AFFECTATION_ORG_UNIT_PRIMARY_FILTER' => '(eduPersonPrimaryOrgUnitDN=%s)',
'ROLE_FILTER' => '(supannRoleEntite=[role={SUPANN}%s][type={SUPANN}%s][code=%s]*)',
'PROF_STRUCTURE' => '(&(eduPersonAffiliation=teacher)(eduPersonOrgUnitDN=%s))',
'FILTER_STRUCTURE_DN' => '(%s)',
'FILTER_STRUCTURE_CODE_ENTITE' => '(supannCodeEntite=%s)',
'FILTER_STRUCTURE_CODE_ENTITE_PARENT' => '(supannCodeEntiteParent=%s)',
],
],
],
//
// Session configuration.
//
'session_config' => [
// Session cookie will expire in 1 hour.
'cookie_lifetime' => 60*60*1,
// Session data will be stored on server maximum for 30 days.
'gc_maxlifetime' => 60*60*24*30,
],
//
// Session manager configuration.
//
'session_manager' => [
// Session validators (used for security).
'validators' => [
RemoteAddr::class,
// Erreur rencontrée avec ce validateur lorsqu'on passe en "Version pour ordinateur" sur un téléphone Android :
// `Fatal error: Uncaught Zend\Session\Exception\RuntimeException: Session validation failed
// in /var/www/app/vendor/zendframework/zend-session/src/SessionManager.php on line 162`
//HttpUserAgent::class,
]
],
//
// Session storage configuration.
//
'session_storage' => [
'type' => SessionArrayStorage::class
],
];
<?php
/**
* UnicaenAuth Global Configuration
*
* If you have a ./config/autoload/ directory set up for your project, you can
* drop this config file in it and change the values as you wish.
*/
$settings = [
/**
* Configuration de l'authentification locale.
*/
'local' => [
/**
* Affichage ou non du formulaire d'authentification avec un compte local.
*/
'enabled' => true,
],
/**
* Configuration de l'authentification LDAP.
*/
'ldap' => [
/**
* Affichage ou non du formulaire d'authentification via l'annuaire LDAP.
* NB: en réalité cela permet aussi l'authentification avec un compte local.
*/
'enabled' => false,
],
/**
* Flag indiquant si l'utilisateur authenitifié avec succès via l'annuaire LDAP doit
* être enregistré/mis à jour dans la table des utilisateurs de l'appli.
*/
'save_ldap_user_in_database' => false,
'enable_privileges' => true,
'entity_manager_name' => 'doctrine.entitymanager.orm_default', // nom du gestionnaire d'entités à utiliser
/**
* Attribut LDAP utilisé pour le username des utilisateurs
* A personnaliser au besoin
*/
//'ldap_username' => 'supannaliaslogin',
];
$config = [
'unicaen-auth' => $settings,
'bjyauthorize' => [
/* this module uses a meta-role that inherits from any roles that should
* be applied to the active user. the identity provider tells us which
* roles the "identity role" should inherit from.
*
* for ZfcUser, this will be your default identity provider
*/
'identity_provider' => 'UnicaenAuth\Provider\Identity\Chain',
/* role providers simply provide a list of roles that should be inserted
* into the Zend\Acl instance. the module comes with two providers, one
* to specify roles in a config file and one to load roles using a
* Zend\Db adapter.
*/
'role_providers' => [
/**
* Fournit les rôles issus de la base de données éventuelle de l'appli.
* NB: si le rôle par défaut 'guest' est fourni ici, il ne sera pas ajouté en double dans les ACL.
* NB: si la connexion à la base échoue, ce n'est pas bloquant!
*/
'UnicaenAuth\Provider\Role\DbRole' => [],
/**
* Fournit le rôle correspondant à l'identifiant de connexion de l'utilisateur.
* Cela est utile lorsque l'on veut gérer les habilitations d'un utilisateur unique
* sur des ressources.
*/
'UnicaenAuth\Provider\Role\Username' => [],
],
],
'zfcuser' => [
/**
* Classe de l'entité représentant un utilisateur authentifiable.
* Décommenter pour spécifier une autre classe que celle par défaut (\UnicaenAuth\Entity\Db\User).
* NB: la classe spécifiée doit hériter de \UnicaenAuth\Entity\Db\AbstractUser.
*/
//'user_entity_class' => \Application\Entity\Db\Utilisateur::class, // exemple
/**
* Enable registration
* Allows users to register through the website.
* Accepted values: boolean true or false
*/
'enable_registration' => false,
],
];
if ($settings['enable_privileges']) {
$privileges = [
'unicaen-auth' => [
/**
* Classes représentant les entités rôle et privilège.
* - Entité rôle : héritant de \UnicaenAuth\Entity\Db\AbstractRole ou implémentant \UnicaenAuth\Entity\Db\RoleInterface.
* - Entité privilège : héritant de \UnicaenAuth\Entity\Db\AbstractPrivilege ou implémentant \UnicaenAuth\Entity\Db\PrivilegeInterface.
*
* Valeurs par défaut :
* - 'role_entity_class' : 'UnicaenAuth\Entity\Db\Role'
* - 'privilege_entity_class' : 'UnicaenAuth\Entity\Db\Privilege'
*/
'role_entity_class' => 'UnicaenAuth\Entity\Db\Role',
'privilege_entity_class' => 'UnicaenAuth\Entity\Db\Privilege',
],