dockerisation app
Cadoles/nineskeletor/pipeline/head There was a failure building this commit Details

This commit is contained in:
afornerot 2024-06-30 12:06:40 +02:00
parent a59fe6372b
commit f659e27ad6
23 changed files with 892 additions and 717 deletions

69
.env
View File

@ -1,5 +1,5 @@
# Symfony
APP_ENV=prod
APP_ENV=dev
APP_SECRET=changeme
APP_SESSIONTIME=1440
@ -7,26 +7,29 @@ APP_SESSIONTIME=1440
MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
# Database
DATABASE_URL="postgresql://symfony:ChangeMe@127.0.0.1:5432/ninegate?serverVersion=13&charset=utf8"
DATABASE_URL="postgresql://symfony:ChangeMe@postgresql:5432/nineskeletor?serverVersion=13&charset=utf8"
# Redis Session
REDIS_HOST=127.0.0.1
REDIS_HOST=redis
REDIS_PORT=6379
# Mailer
MAILER_METHOD=smtp
MAILER_DSN=smtp://127.0.0.1:1025
MAILER_DSN=smtp://mailer:1025
MAILER_NOREPLY=noreply@noreply.fr
# Basic
APP_WEBURL=127.0.0.1:8000
APP_WEBURL=localhost:8005
APP_MASTERIDENTITY=SQL # SQL | SSO | LDAP
APP_AUTH=SQL # SQL | CAS | LDAP | OPENID | à faire SAML
APP_AUTH=OPENID # SQL | CAS | LDAP | OPENID
APP_ALIAS=/
APP_NAME=Nineskeletor
APP_MODEREGISTRATION= # null | BYADMIN | BYUSER
APP_ADMINS='["admin"]'
# Module = PORTAL | DOCUMENT
APP_MODULES='["PORTAL"]'
# Structure Organisationnelle
APP_NIVEAUUPDATABLE=0 # Quel degres de niveau est modifiable par les utilisateurs seule les admin et modo via console peuvent outre passer ce param
@ -60,7 +63,7 @@ APP_ANNUSCOPEUSER=ALL # ALL or number of niveau view : 1||2||3||4
APP_USERVIEWISVISIBLE=1 # Profil user with isvisible field
# Synchronisation
APP_SYNCHRO= # Synchronisation null | LDAP2NINE | NINE2LDAP | NINE2NINE
APP_SYNCHRO=NINE2LDAP # Synchronisation null | LDAP2NINE | NINE2LDAP | NINE2NINE
APP_SYNDCHROPURGENIVEAU01=1 # Purger les niveau01s obsolète en cas de synchronisation
APP_SYNDCHROPURGENIVEAU02=1 # Purger les niveau02s obsolète en cas de synchronisation
APP_SYNDCHROPURGENIVEAU03=1 # Purger les niveau03s obsolète en cas de synchronisation
@ -69,20 +72,20 @@ APP_SYNDCHROPURGEGROUP=1 # Purger les groups obsolète en cas de synchron
APP_SYNDCHROPURGEUSER=1 # Purger les users obsolète en cas de synchronisation
# LDAP
LDAP_HOST= # host du serveur ldap
LDAP_PORT= # port du serveur ldap
LDAP_HOST=openldap # host du serveur ldap ex:openldap
LDAP_PORT=389 # port du serveur ldap ex:389
LDAP_USETLS=0 # connection TLS 0/1
LDAP_USERWRITER=0 # LDAP_USER compte writer ? 0/1
LDAP_USER= # DN compte access ldap
LDAP_PASSWORD= # Password comte access ldap
LDAP_USERWRITER=1 # LDAP_USER compte writer ? 0/1
LDAP_USER="cn=admin,dc=nine,dc=fr" # DN compte access ldap
LDAP_PASSWORD=changeme # Password comte access ldap
LDAP_BASEDN= # Base DN ex:dc=nine,dc=fr
LDAP_BASEORGANISATION= # Base Organisation ex:ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU01= # Base Niveau01 ex:ou=niveau01,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU02= # Base Niveau02 ex:ou=niveau02,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU03= # Base Niveau03 ex:ou=niveau03,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU04= # Base Niveau04 ex:ou=niveau04,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASEGROUP= # Base Group ex:ou=groups,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASEUSER= # Base User ex:ou=users,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASEORGANISATION="ou=nineskeletor,dc=nine,dc=fr" # Base Organisation ex:ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU01="ou=niveau01,ou=nineskeletor,dc=nine,dc=fr" # Base Niveau01 ex:ou=niveau01,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU02="ou=niveau02,ou=nineskeletor,dc=nine,dc=fr" # Base Niveau02 ex:ou=niveau02,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU03="ou=niveau03,ou=nineskeletor,dc=nine,dc=fr" # Base Niveau03 ex:ou=niveau03,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU04="ou=niveau04,ou=nineskeletor,dc=nine,dc=fr" # Base Niveau04 ex:ou=niveau04,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASEGROUP="ou=groups,ou=nineskeletor,dc=nine,dc=fr" # Base Group ex:ou=groups,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASEUSER="ou=users,ou=nineskeletor,dc=nine,dc=fr" # Base User ex:ou=users,ou=nineskeletor,dc=nine,dc=fr
LDAP_USERNAME=uid # Attribut id d'un user
LDAP_FIRSTNAME=givenname # Attribut firstname d'un user
LDAP_LASTNAME=sn # Attribut lastname d'un user
@ -113,12 +116,12 @@ CAS_AUTOSUBMIT=1 # if APP_AUTH = CAS autocréer les users non exi
CAS_AUTOUPDATE=1 # if APP_AUTH = CAS automodifier les users existant
# If APP_AUTH = OPENID
OAUTH_CLIENTID=
OAUTH_CLIENTSECRET=
OAUTH_LOGINURL=
OAUTH_LOGOUTURL=
OAUTH_TOKENURL=
OAUTH_USERINFO=
OAUTH_CLIENTID=nineskeletor
OAUTH_CLIENTSECRET=changeme
OAUTH_LOGINURL="http://localhost:7080/oauth2/auth"
OAUTH_LOGOUTURL="http://localhost:7080/oauth2/sessions/logout"
OAUTH_TOKENURL="http://hydra:4444/oauth2/token"
OAUTH_USERINFO="http://hydra:4444/userinfo"
OAUTH_USERNAME=username
OAUTH_EMAIL=email
OAUTH_LASTNAME=lastname
@ -149,27 +152,27 @@ SONDE_USE=0
SONDE_URL=
# Mercure
MERCURE_URL=https://127.0.0.1/.well-known/mercure
MERCURE_URL=https://mercure/.well-known/mercure
MERCURE_PUBLIC_URL=https://127.0.0.1/.well-known/mercure
MERCURE_JWT_SECRET="!changeme!changeme!changeme!changeme!changeme!changeme!"
# Minio
MINIO_URL=http://127.0.0.1:9000
MINIO_URL=http://nginx:9000
MINIO_KEY=minio
MINIO_SECRET=changeme
MINIO_BUCKET=ninegate
MINIO_BUCKET=nineskeletor
MINIO_ROOT=
MINIO_PATH_STYLE=1
MINIO_SECURE=0
# Hydra apps
HYDRA_LOGINCHALLENGE="http://127.0.0.1:4445/oauth2/auth/requests/login?login_challenge="
HYDRA_LOGINCHALLENGEACCEPT="http://127.0.0.1:4445/oauth2/auth/requests/login/accept?login_challenge="
HYDRA_CONSENTCHALLENGE="http://127.0.0.1:4445/oauth2/auth/requests/consent?consent_challenge="
HYDRA_CONSENTCHALLENGEACCEPT="http://127.0.0.1:4445/oauth2/auth/requests/consent/accept?consent_challenge="
HYDRA_LOGINCHALLENGE="http://hydra:4445/oauth2/auth/requests/login?login_challenge="
HYDRA_LOGINCHALLENGEACCEPT="http://hydra:4445/oauth2/auth/requests/login/accept?login_challenge="
HYDRA_CONSENTCHALLENGE="http://hydra:4445/oauth2/auth/requests/consent?consent_challenge="
HYDRA_CONSENTCHALLENGEACCEPT="http://hydra:4445/oauth2/auth/requests/consent/accept?consent_challenge="
# Lock
LOCK_DSN="postgresql://symfony:ChangeMe@127.0.0.1:5432/ninegate?serverVersion=13&charset=utf8"
LOCK_DSN="postgresql://symfony:ChangeMe@postgresql:5432/nineskeletor?serverVersion=13&charset=utf8"
# Sentry
SENTRY_DSN=

3
.gitignore vendored
View File

@ -29,3 +29,6 @@ yarn-error.log
/public/uploads/ckeditor
.php-cs-fixer.cache
###> phpstan/phpstan ###
phpstan.neon
###< phpstan/phpstan ###

41
.php-cs-fixer.dist.php Executable file → Normal file
View File

@ -1,12 +1,45 @@
<?php
$finder = PhpCsFixer\Finder::create()
->in(__DIR__.'/src');
->in(__DIR__.'/src')
->name('*.php')
;
$config = new PhpCsFixer\Config();
return $config->setRules([
// TODO: Définir les règles de style communes
// spécifiques au projet
return (new PhpCsFixer\Config())
->setRules([
'@Symfony' => true,
'full_opening_tag' => false,
'concat_space' => ['spacing' => 'none'],
'array_syntax' => ['syntax' => 'short'],
'combine_consecutive_issets' => true,
'explicit_indirect_variable' => true,
'no_useless_return' => true,
'ordered_imports' => true,
'no_unused_imports' => true,
'no_spaces_after_function_name' => true,
'no_spaces_inside_parenthesis' => true,
'ternary_operator_spaces' => true,
'class_definition' => ['single_line' => true],
'whitespace_after_comma_in_array' => true,
// phpdoc
'phpdoc_add_missing_param_annotation' => ['only_untyped' => true],
'phpdoc_order' => true,
'phpdoc_types_order' => [
'null_adjustment' => 'always_last',
'sort_algorithm' => 'alpha',
],
'phpdoc_no_empty_return' => false,
'phpdoc_summary' => false,
'general_phpdoc_annotation_remove' => [
'annotations' => [
'expectedExceptionMessageRegExp',
'expectedException',
'expectedExceptionMessage',
'author',
],
],
])
->setFinder($finder)
;

View File

@ -123,6 +123,7 @@
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.4",
"lasserafn/php-initial-avatar-generator": "^4.2",
"phpstan/phpstan": "^1.11",
"phpunit/phpunit": "^9.5",
"symfony/browser-kit": "6.1.*",
"symfony/css-selector": "6.1.*",

62
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "479a2464d612243533a7aa3eae4281d9",
"content-hash": "dc1aeeadbcecb4aa48c52c26ec8b74bf",
"packages": [
{
"name": "aws/aws-crt-php",
@ -11705,6 +11705,64 @@
},
"time": "2022-02-21T01:04:05+00:00"
},
{
"name": "phpstan/phpstan",
"version": "1.11.5",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "490f0ae1c92b082f154681d7849aee776a7c1443"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/490f0ae1c92b082f154681d7849aee776a7c1443",
"reference": "490f0ae1c92b082f154681d7849aee776a7c1443",
"shasum": ""
},
"require": {
"php": "^7.2|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
},
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
"keywords": [
"dev",
"static analysis"
],
"support": {
"docs": "https://phpstan.org/user-guide/getting-started",
"forum": "https://github.com/phpstan/phpstan/discussions",
"issues": "https://github.com/phpstan/phpstan/issues",
"security": "https://github.com/phpstan/phpstan/security/policy",
"source": "https://github.com/phpstan/phpstan-src"
},
"funding": [
{
"url": "https://github.com/ondrejmirtes",
"type": "github"
},
{
"url": "https://github.com/phpstan",
"type": "github"
}
],
"time": "2024-06-17T15:10:54+00:00"
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.17",
@ -13596,5 +13654,5 @@
"ext-iconv": "*"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
"plugin-api-version": "2.2.0"
}

View File

@ -1,34 +1,35 @@
twig:
default_path: '%kernel.project_dir%/templates'
default_path: "%kernel.project_dir%/templates"
form_themes:
- 'Form/fields.html.twig'
- '@TetranzSelect2Entity/Form/fields.html.twig'
- "Form/fields.html.twig"
- "@TetranzSelect2Entity/Form/fields.html.twig"
globals:
appAlias: '%appAlias%'
appName: '%appName%'
appMasteridentity: '%appMasteridentity%'
appAuth: '%appAuth%'
appModeregistration: '%appModeregistration%'
appSynchro: '%appSynchro%'
appSynchroPurgeUser: '%appSynchroPurgeUser%'
appNiveau01label: '%appNiveau01label%'
appNiveau01labels: '%appNiveau01labels%'
appNiveau02use: '%appNiveau02use%'
appNiveau02label: '%appNiveau02label%'
appNiveau02labels: '%appNiveau02labels%'
appNiveau02mandatory: '%appNiveau02mandatory%'
appNiveau03use: '%appNiveau03use%'
appNiveau03label: '%appNiveau03label%'
appNiveau03labels: '%appNiveau03labels%'
appNiveau03mandatory: '%appNiveau03mandatory%'
appNiveau04use: '%appNiveau04use%'
appNiveau04label: '%appNiveau04label%'
appNiveau04labels: '%appNiveau04labels%'
appNiveau04mandatory: '%appNiveau04mandatory%'
appGroupuse: '%appGroupuse%'
sondeUse: '%sondeUse%'
sondeUrl: '%sondeUrl%'
auditUse: '%auditUse%'
appAlias: "%appAlias%"
appName: "%appName%"
appMasteridentity: "%appMasteridentity%"
appAuth: "%appAuth%"
appModeregistration: "%appModeregistration%"
appSynchro: "%appSynchro%"
appSynchroPurgeUser: "%appSynchroPurgeUser%"
appNiveau01label: "%appNiveau01label%"
appNiveau01labels: "%appNiveau01labels%"
appNiveau02use: "%appNiveau02use%"
appNiveau02label: "%appNiveau02label%"
appNiveau02labels: "%appNiveau02labels%"
appNiveau02mandatory: "%appNiveau02mandatory%"
appNiveau03use: "%appNiveau03use%"
appNiveau03label: "%appNiveau03label%"
appNiveau03labels: "%appNiveau03labels%"
appNiveau03mandatory: "%appNiveau03mandatory%"
appNiveau04use: "%appNiveau04use%"
appNiveau04label: "%appNiveau04label%"
appNiveau04labels: "%appNiveau04labels%"
appNiveau04mandatory: "%appNiveau04mandatory%"
appModules: "%appModules%"
appGroupuse: "%appGroupuse%"
sondeUse: "%sondeUse%"
sondeUrl: "%sondeUrl%"
auditUse: "%auditUse%"
when@test:
twig:

View File

@ -1,146 +1,147 @@
parameters:
appEnv: "%env(resolve:APP_ENV)%"
appSecret: "%env(resolve:APP_SECRET)%"
appSessiontime: "%env(resolve:APP_SESSIONTIME)%"
appEnv: '%env(resolve:APP_ENV)%'
appSecret: '%env(resolve:APP_SECRET)%'
appSessiontime: '%env(resolve:APP_SESSIONTIME)%'
appWeburl: "%env(resolve:APP_WEBURL)%"
appAuth: "%env(resolve:APP_AUTH)%"
appAlias: "%env(resolve:APP_ALIAS)%"
appName: "%env(resolve:APP_NAME)%"
appMasteridentity: "%env(resolve:APP_MASTERIDENTITY)%"
appModeregistration: "%env(resolve:APP_MODEREGISTRATION)%"
appAdmins: "%env(json:APP_ADMINS)%"
appWeburl: '%env(resolve:APP_WEBURL)%'
appAuth: '%env(resolve:APP_AUTH)%'
appAlias: '%env(resolve:APP_ALIAS)%'
appName: '%env(resolve:APP_NAME)%'
appMasteridentity: '%env(resolve:APP_MASTERIDENTITY)%'
appModeregistration: '%env(resolve:APP_MODEREGISTRATION)%'
appAdmins: '%env(json:APP_ADMINS)%'
appModules: "%env(json:APP_MODULES)%"
appNiveau01label: '%env(resolve:APP_NIVEAU01LABEL)%'
appNiveau01labels: '%env(resolve:APP_NIVEAU01LABELS)%'
appNiveau01label: "%env(resolve:APP_NIVEAU01LABEL)%"
appNiveau01labels: "%env(resolve:APP_NIVEAU01LABELS)%"
appNiveau02use: '%env(resolve:APP_NIVEAU02USE)%'
appNiveau02label: '%env(resolve:APP_NIVEAU02LABEL)%'
appNiveau02labels: '%env(resolve:APP_NIVEAU02LABELS)%'
appNiveau02mandatory: '%env(json:APP_NIVEAU02MANDATORY)%'
appNiveau02use: "%env(resolve:APP_NIVEAU02USE)%"
appNiveau02label: "%env(resolve:APP_NIVEAU02LABEL)%"
appNiveau02labels: "%env(resolve:APP_NIVEAU02LABELS)%"
appNiveau02mandatory: "%env(json:APP_NIVEAU02MANDATORY)%"
appNiveau03use: '%env(resolve:APP_NIVEAU03USE)%'
appNiveau03label: '%env(resolve:APP_NIVEAU03LABEL)%'
appNiveau03labels: '%env(resolve:APP_NIVEAU03LABELS)%'
appNiveau03mandatory: '%env(json:APP_NIVEAU03MANDATORY)%'
appNiveau03use: "%env(resolve:APP_NIVEAU03USE)%"
appNiveau03label: "%env(resolve:APP_NIVEAU03LABEL)%"
appNiveau03labels: "%env(resolve:APP_NIVEAU03LABELS)%"
appNiveau03mandatory: "%env(json:APP_NIVEAU03MANDATORY)%"
appNiveau04use: '%env(resolve:APP_NIVEAU04USE)%'
appNiveau04label: '%env(resolve:APP_NIVEAU04LABEL)%'
appNiveau04labels: '%env(resolve:APP_NIVEAU04LABELS)%'
appNiveau04mandatory: '%env(json:APP_NIVEAU04MANDATORY)%'
appNiveau04use: "%env(resolve:APP_NIVEAU04USE)%"
appNiveau04label: "%env(resolve:APP_NIVEAU04LABEL)%"
appNiveau04labels: "%env(resolve:APP_NIVEAU04LABELS)%"
appNiveau04mandatory: "%env(json:APP_NIVEAU04MANDATORY)%"
appNiveauupdatable: '%env(resolve:APP_NIVEAUUPDATABLE)%'
appNiveauupdatable: "%env(resolve:APP_NIVEAUUPDATABLE)%"
appGroupuse: '%env(resolve:APP_GROUPUSE)%'
appGroupsubmiter: '%env(json:APP_GROUPSUBMITER)%'
appGroupuse: "%env(resolve:APP_GROUPUSE)%"
appGroupsubmiter: "%env(json:APP_GROUPSUBMITER)%"
appAnnuscopeadmin: '%env(resolve:APP_ANNUSCOPEADMIN)%'
appAnnuscopemodo: '%env(resolve:APP_ANNUSCOPEMODO)%'
appAnnuscopemaster: '%env(resolve:APP_ANNUSCOPEMASTER)%'
appAnnuscopemanager: '%env(resolve:APP_ANNUSCOPEMANAGER)%'
appAnnuscopeuser: '%env(resolve:APP_ANNUSCOPEUSER)%'
appAnnuscopeadmin: "%env(resolve:APP_ANNUSCOPEADMIN)%"
appAnnuscopemodo: "%env(resolve:APP_ANNUSCOPEMODO)%"
appAnnuscopemaster: "%env(resolve:APP_ANNUSCOPEMASTER)%"
appAnnuscopemanager: "%env(resolve:APP_ANNUSCOPEMANAGER)%"
appAnnuscopeuser: "%env(resolve:APP_ANNUSCOPEUSER)%"
appUserviewisvisible: '%env(resolve:APP_USERVIEWISVISIBLE)%'
appUserviewisvisible: "%env(resolve:APP_USERVIEWISVISIBLE)%"
appSynchro: '%env(resolve:APP_SYNCHRO)%'
appSynchroPurgeNiveau01: '%env(resolve:APP_SYNDCHROPURGENIVEAU01)%'
appSynchroPurgeNiveau02: '%env(resolve:APP_SYNDCHROPURGENIVEAU02)%'
appSynchroPurgeNiveau03: '%env(resolve:APP_SYNDCHROPURGENIVEAU03)%'
appSynchroPurgeNiveau04: '%env(resolve:APP_SYNDCHROPURGENIVEAU04)%'
appSynchroPurgeGroup: '%env(resolve:APP_SYNDCHROPURGEGROUP)%'
appSynchroPurgeUser: '%env(resolve:APP_SYNDCHROPURGEUSER)%'
appSynchro: "%env(resolve:APP_SYNCHRO)%"
appSynchroPurgeNiveau01: "%env(resolve:APP_SYNDCHROPURGENIVEAU01)%"
appSynchroPurgeNiveau02: "%env(resolve:APP_SYNDCHROPURGENIVEAU02)%"
appSynchroPurgeNiveau03: "%env(resolve:APP_SYNDCHROPURGENIVEAU03)%"
appSynchroPurgeNiveau04: "%env(resolve:APP_SYNDCHROPURGENIVEAU04)%"
appSynchroPurgeGroup: "%env(resolve:APP_SYNDCHROPURGEGROUP)%"
appSynchroPurgeUser: "%env(resolve:APP_SYNDCHROPURGEUSER)%"
databaseUrl: '%env(resolve:DATABASE_URL)%'
databaseUrl: "%env(resolve:DATABASE_URL)%"
appMailmethod: '%env(resolve:MAILER_METHOD)%'
appMaildsn: '%env(resolve:MAILER_DSN)%'
appMailnoreply: '%env(resolve:MAILER_NOREPLY)%'
appMailmethod: "%env(resolve:MAILER_METHOD)%"
appMaildsn: "%env(resolve:MAILER_DSN)%"
appMailnoreply: "%env(resolve:MAILER_NOREPLY)%"
ldapHost: '%env(resolve:LDAP_HOST)%'
ldapPort: '%env(resolve:LDAP_PORT)%'
ldapUsetls: '%env(resolve:LDAP_USETLS)%'
ldapUserwriter: '%env(resolve:LDAP_USERWRITER)%'
ldapUser: '%env(resolve:LDAP_USER)%'
ldapPassword: '%env(resolve:LDAP_PASSWORD)%'
ldapBasedn: '%env(resolve:LDAP_BASEDN)%'
ldapBaseorganisation: '%env(resolve:LDAP_BASEORGANISATION)%'
ldapBaseniveau01: '%env(resolve:LDAP_BASENIVEAU01)%'
ldapBaseniveau02: '%env(resolve:LDAP_BASENIVEAU02)%'
ldapBaseniveau03: '%env(resolve:LDAP_BASENIVEAU03)%'
ldapBaseniveau04: '%env(resolve:LDAP_BASENIVEAU04)%'
ldapBasegroup: '%env(resolve:LDAP_BASEGROUP)%'
ldapBaseuser: '%env(resolve:LDAP_BASEUSER)%'
ldapUsername: '%env(resolve:LDAP_USERNAME)%'
ldapFirstname: '%env(resolve:LDAP_FIRSTNAME)%'
ldapLastname: '%env(resolve:LDAP_LASTNAME)%'
ldapEmail: '%env(resolve:LDAP_EMAIL)%'
ldapAvatar: '%env(resolve:LDAP_AVATAR)%'
ldapMemberof: '%env(resolve:LDAP_MEMBEROF)%'
ldapGroupgid: '%env(resolve:LDAP_GROUPGID)%'
ldapGroupname: '%env(resolve:LDAP_GROUPNAME)%'
ldapGroupmember: '%env(resolve:LDAP_GROUPMEMBER)%'
ldapGroupmemberisdn: '%env(resolve:LDAP_GROUPMEMBERISDN)%'
ldapFiltergroup: '%env(resolve:LDAP_FILTERGROUP)%'
ldapFilteruser: '%env(resolve:LDAP_FILTERUSER)%'
ldapAutosubmit: '%env(resolve:LDAP_AUTOSUBMIT)%'
ldapAutoupdate: '%env(resolve:LDAP_AUTOUPDATE)%'
ldapHost: "%env(resolve:LDAP_HOST)%"
ldapPort: "%env(resolve:LDAP_PORT)%"
ldapUsetls: "%env(resolve:LDAP_USETLS)%"
ldapUserwriter: "%env(resolve:LDAP_USERWRITER)%"
ldapUser: "%env(resolve:LDAP_USER)%"
ldapPassword: "%env(resolve:LDAP_PASSWORD)%"
ldapBasedn: "%env(resolve:LDAP_BASEDN)%"
ldapBaseorganisation: "%env(resolve:LDAP_BASEORGANISATION)%"
ldapBaseniveau01: "%env(resolve:LDAP_BASENIVEAU01)%"
ldapBaseniveau02: "%env(resolve:LDAP_BASENIVEAU02)%"
ldapBaseniveau03: "%env(resolve:LDAP_BASENIVEAU03)%"
ldapBaseniveau04: "%env(resolve:LDAP_BASENIVEAU04)%"
ldapBasegroup: "%env(resolve:LDAP_BASEGROUP)%"
ldapBaseuser: "%env(resolve:LDAP_BASEUSER)%"
ldapUsername: "%env(resolve:LDAP_USERNAME)%"
ldapFirstname: "%env(resolve:LDAP_FIRSTNAME)%"
ldapLastname: "%env(resolve:LDAP_LASTNAME)%"
ldapEmail: "%env(resolve:LDAP_EMAIL)%"
ldapAvatar: "%env(resolve:LDAP_AVATAR)%"
ldapMemberof: "%env(resolve:LDAP_MEMBEROF)%"
ldapGroupgid: "%env(resolve:LDAP_GROUPGID)%"
ldapGroupname: "%env(resolve:LDAP_GROUPNAME)%"
ldapGroupmember: "%env(resolve:LDAP_GROUPMEMBER)%"
ldapGroupmemberisdn: "%env(resolve:LDAP_GROUPMEMBERISDN)%"
ldapFiltergroup: "%env(resolve:LDAP_FILTERGROUP)%"
ldapFilteruser: "%env(resolve:LDAP_FILTERUSER)%"
ldapAutosubmit: "%env(resolve:LDAP_AUTOSUBMIT)%"
ldapAutoupdate: "%env(resolve:LDAP_AUTOUPDATE)%"
casHost: '%env(resolve:CAS_HOST)%'
casPort: '%env(resolve:CAS_PORT)%'
casPath: '%env(resolve:CAS_PATH)%'
casUsername: '%env(resolve:CAS_USERNAME)%'
casEmail: '%env(resolve:CAS_EMAIL)%'
casLastname: '%env(resolve:CAS_LASTNAME)%'
casFirstname: '%env(resolve:CAS_FIRSTNAME)%'
casAvatar: '%env(resolve:CAS_AVATAR)%'
casNiveau01: '%env(resolve:CAS_NIVEAU01)%'
casGroup: '%env(resolve:CAS_GROUP)%'
casAutosubmit: '%env(resolve:CAS_AUTOSUBMIT)%'
casAutoupdate: '%env(resolve:CAS_AUTOUPDATE)%'
casHost: "%env(resolve:CAS_HOST)%"
casPort: "%env(resolve:CAS_PORT)%"
casPath: "%env(resolve:CAS_PATH)%"
casUsername: "%env(resolve:CAS_USERNAME)%"
casEmail: "%env(resolve:CAS_EMAIL)%"
casLastname: "%env(resolve:CAS_LASTNAME)%"
casFirstname: "%env(resolve:CAS_FIRSTNAME)%"
casAvatar: "%env(resolve:CAS_AVATAR)%"
casNiveau01: "%env(resolve:CAS_NIVEAU01)%"
casGroup: "%env(resolve:CAS_GROUP)%"
casAutosubmit: "%env(resolve:CAS_AUTOSUBMIT)%"
casAutoupdate: "%env(resolve:CAS_AUTOUPDATE)%"
oauthClientid: '%env(resolve:OAUTH_CLIENTID)%'
oauthClientsecret: '%env(resolve:OAUTH_CLIENTSECRET)%'
oauthLoginurl: '%env(resolve:OAUTH_LOGINURL)%'
oauthLogouturl: '%env(resolve:OAUTH_LOGOUTURL)%'
oauthTokenurl: '%env(resolve:OAUTH_TOKENURL)%'
oauthUserinfo: '%env(resolve:OAUTH_USERINFO)%'
oauthUsername: '%env(resolve:OAUTH_USERNAME)%'
oauthEmail: '%env(resolve:OAUTH_EMAIL)%'
oauthLastname: '%env(resolve:OAUTH_LASTNAME)%'
oauthFirstname: '%env(resolve:OAUTH_FIRSTNAME)%'
oauthAvatar: '%env(resolve:OAUTH_AVATAR)%'
oauthNiveau01: '%env(resolve:OAUTH_NIVEAU01)%'
oauthGroup: '%env(resolve:OAUTH_GROUP)%'
oauthAutosubmit: '%env(resolve:OAUTH_AUTOSUBMIT)%'
oauthAutoupdate: '%env(resolve:OAUTH_AUTOUPDATE)%'
oauthClientid: "%env(resolve:OAUTH_CLIENTID)%"
oauthClientsecret: "%env(resolve:OAUTH_CLIENTSECRET)%"
oauthLoginurl: "%env(resolve:OAUTH_LOGINURL)%"
oauthLogouturl: "%env(resolve:OAUTH_LOGOUTURL)%"
oauthTokenurl: "%env(resolve:OAUTH_TOKENURL)%"
oauthUserinfo: "%env(resolve:OAUTH_USERINFO)%"
oauthUsername: "%env(resolve:OAUTH_USERNAME)%"
oauthEmail: "%env(resolve:OAUTH_EMAIL)%"
oauthLastname: "%env(resolve:OAUTH_LASTNAME)%"
oauthFirstname: "%env(resolve:OAUTH_FIRSTNAME)%"
oauthAvatar: "%env(resolve:OAUTH_AVATAR)%"
oauthNiveau01: "%env(resolve:OAUTH_NIVEAU01)%"
oauthGroup: "%env(resolve:OAUTH_GROUP)%"
oauthAutosubmit: "%env(resolve:OAUTH_AUTOSUBMIT)%"
oauthAutoupdate: "%env(resolve:OAUTH_AUTOUPDATE)%"
nineUrl: '%env(resolve:NINE_URL)%'
nineSecret: '%env(resolve:NINE_SECRET)%'
nineUrl: "%env(resolve:NINE_URL)%"
nineSecret: "%env(resolve:NINE_SECRET)%"
appModeregistrationterme: '%env(resolve:APP_MODEREGISTRATIONTERM)%'
appModeregistrationterme: "%env(resolve:APP_MODEREGISTRATIONTERM)%"
proxyUse: '%env(resolve:PROXY_USE)%'
proxyHost: '%env(resolve:PROXY_HOST)%'
proxyPort: '%env(resolve:PROXY_PORT)%'
proxyUse: "%env(resolve:PROXY_USE)%"
proxyHost: "%env(resolve:PROXY_HOST)%"
proxyPort: "%env(resolve:PROXY_PORT)%"
minioUrl: '%env(resolve:MINIO_URL)%'
minioKey: '%env(resolve:MINIO_KEY)%'
minioSecret: '%env(resolve:MINIO_SECRET)%'
minioBucket: '%env(resolve:MINIO_BUCKET)%'
minioRoot: '%env(resolve:MINIO_ROOT)%'
minioPathstyle: '%env(resolve:MINIO_PATH_STYLE)%'
minioSecure: '%env(resolve:MINIO_SECURE)%'
minioUrl: "%env(resolve:MINIO_URL)%"
minioKey: "%env(resolve:MINIO_KEY)%"
minioSecret: "%env(resolve:MINIO_SECRET)%"
minioBucket: "%env(resolve:MINIO_BUCKET)%"
minioRoot: "%env(resolve:MINIO_ROOT)%"
minioPathstyle: "%env(resolve:MINIO_PATH_STYLE)%"
minioSecure: "%env(resolve:MINIO_SECURE)%"
hydraLoginchallenge: '%env(resolve:HYDRA_LOGINCHALLENGE)%'
hydraLoginchallengeaccept: '%env(resolve:HYDRA_LOGINCHALLENGEACCEPT)%'
hydraConsentchallenge: '%env(resolve:HYDRA_CONSENTCHALLENGE)%'
hydraConsentchallengeaccept: '%env(resolve:HYDRA_CONSENTCHALLENGEACCEPT)%'
hydraLoginchallenge: "%env(resolve:HYDRA_LOGINCHALLENGE)%"
hydraLoginchallengeaccept: "%env(resolve:HYDRA_LOGINCHALLENGEACCEPT)%"
hydraConsentchallenge: "%env(resolve:HYDRA_CONSENTCHALLENGE)%"
hydraConsentchallengeaccept: "%env(resolve:HYDRA_CONSENTCHALLENGEACCEPT)%"
sondeUse: '%env(resolve:SONDE_USE)%'
sondeUrl: '%env(resolve:SONDE_URL)%'
sondeUse: "%env(resolve:SONDE_USE)%"
sondeUrl: "%env(resolve:SONDE_URL)%"
auditUse: '%env(resolve:AUDIT_USE)%'
auditUse: "%env(resolve:AUDIT_USE)%"
services:
_defaults:
@ -148,95 +149,100 @@ services:
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
App\:
resource: '../src/'
resource: "../src/"
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
- "../src/DependencyInjection/"
- "../src/Entity/"
- "../src/Kernel.php"
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
resource: "../src/Controller"
tags: ["controller.service_arguments"]
Redis:
class: Redis
calls:
- connect:
- '%env(REDIS_HOST)%'
- '%env(int:REDIS_PORT)%'
- "%env(REDIS_HOST)%"
- "%env(int:REDIS_PORT)%"
Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler:
arguments:
- '@Redis'
- "@Redis"
App\EventListener\AllSubscriber:
public: true
tags:
- name: 'doctrine.event_subscriber'
- name: "doctrine.event_subscriber"
App\EventListener\PurgefileSubscriber:
public: true
arguments: ['@App\Service\MinioService']
tags:
- name: 'doctrine.event_subscriber'
- name: "doctrine.event_subscriber"
App\EventListener\Niveau01Subscriber:
public: true
arguments: ['@doctrine.orm.entity_manager','@App\Service\LdapService']
arguments: ["@doctrine.orm.entity_manager", '@App\Service\LdapService']
tags:
- name: 'doctrine.event_subscriber'
- name: "doctrine.event_subscriber"
App\EventListener\Niveau02Subscriber:
public: true
arguments: ['@doctrine.orm.entity_manager','@App\Service\LdapService']
arguments: ["@doctrine.orm.entity_manager", '@App\Service\LdapService']
tags:
- name: 'doctrine.event_subscriber'
- name: "doctrine.event_subscriber"
App\EventListener\GroupSubscriber:
public: true
arguments: ['@doctrine.orm.entity_manager','@App\Service\LdapService']
arguments: ["@doctrine.orm.entity_manager", '@App\Service\LdapService']
tags:
- name: 'doctrine.event_subscriber'
- name: "doctrine.event_subscriber"
App\EventListener\UserSubscriber:
public: true
arguments: ['@doctrine.orm.entity_manager','@App\Service\LdapService']
arguments: ["@doctrine.orm.entity_manager", '@App\Service\LdapService']
tags:
- name: 'doctrine.event_subscriber'
- name: "doctrine.event_subscriber"
App\EventListener\UserGroupSubscriber:
public: true
arguments: ['@doctrine.orm.entity_manager','@App\Service\LdapService']
arguments: ["@doctrine.orm.entity_manager", '@App\Service\LdapService']
tags:
- name: 'doctrine.event_subscriber'
- name: "doctrine.event_subscriber"
App\Entity\User:
public: true
arguments: ['@security.password_hasher']
arguments: ["@security.password_hasher"]
App\Command\InitCommand:
public: true
arguments: ['@service_container','@doctrine.orm.entity_manager']
arguments: ["@service_container", "@doctrine.orm.entity_manager"]
App\Command\SetPasswordCommand:
public: true
arguments: ['@service_container','@doctrine.orm.entity_manager']
arguments: ["@service_container", "@doctrine.orm.entity_manager"]
App\Command\CronCommand:
public: true
arguments: ['@service_container','@doctrine.orm.entity_manager']
arguments: ["@service_container", "@doctrine.orm.entity_manager"]
App\Command\CleanCommand:
public: true
arguments: ['@service_container','@doctrine.orm.entity_manager']
arguments: ["@service_container", "@doctrine.orm.entity_manager"]
App\Command\CleanRegistrationCommand:
public: true
arguments: ['@service_container','@doctrine.orm.entity_manager']
arguments: ["@service_container", "@doctrine.orm.entity_manager"]
App\Command\SynchroCommand:
public: true
arguments: ['@service_container','@doctrine.orm.entity_manager','@App\Service\LdapService']
arguments:
[
"@service_container",
"@doctrine.orm.entity_manager",
'@App\Service\LdapService',
]
App\Twig\AppExtension:
calls:
@ -246,15 +252,29 @@ services:
App\Service\AppSession:
public: true
arguments: ["@service_container","@doctrine.orm.entity_manager","@request_stack","@security.token_storage"]
arguments:
[
"@service_container",
"@doctrine.orm.entity_manager",
"@request_stack",
"@security.token_storage",
]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onDomainParse }
- {
name: kernel.event_listener,
event: kernel.request,
method: onDomainParse,
}
App\Service\UploadListener:
public: true
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: kernel.event_listener, event: oneup_uploader.post_persist, method: onUpload }
- {
name: kernel.event_listener,
event: oneup_uploader.post_persist,
method: onUpload,
}
App\Service\UploadSamename:
public: true
@ -272,7 +292,18 @@ services:
App\Service\MinioService:
public: true
arguments: ["%kernel.project_dir%","%minioUrl%","%minioKey%","%minioSecret%","%minioBucket%","%minioRoot%","%minioPathstyle%","%minioSecure%","%kernel.environment%"]
arguments:
[
"%kernel.project_dir%",
"%minioUrl%",
"%minioKey%",
"%minioSecret%",
"%minioBucket%",
"%minioRoot%",
"%minioPathstyle%",
"%minioSecure%",
"%kernel.environment%",
]
App\Controller\RestController:
public: true

View File

@ -7,10 +7,10 @@ hydra:
description:
fr: Authentification via NINESQL
en: Authentication by NINESQL
icon_url: https://127.0.0.1:8000/medias/icon/icon_bdd.png
login_url: http://127.0.0.1:8000/hydra/loginsql
consent_url: http://127.0.0.1:8000/hydra/consent
logout_url: http://127.0.0.1:8000/hydra/logoutsql
icon_url: http://localhost:8005/medias/icon/icon_bdd.png
login_url: http://localhost:8005/hydra/loginsql
consent_url: http://localhost:8005/hydra/consent
logout_url: http://localhost:8005/hydra/logoutsql
attributes_rewrite_rules:
username:
- consent.session.id_token.username
@ -21,23 +21,23 @@ hydra:
lastname:
- consent.session.id_token.lastname
- id: nineldap
title:
fr: NINE LDAP
en: NINE LDAP
description:
fr: Authentification via NINELDAP
en: Authentication by NINELDAP
icon_url: https://127.0.0.1:8000/medias/icon/icon_phpldapadmin.png
login_url: http://127.0.0.1:8000/hydra/loginldap
consent_url: http://127.0.0.1:8000/hydra/consent
logout_url: http://127.0.0.1:8000/hydra/logoutldap
attributes_rewrite_rules:
username:
- consent.session.id_token.username
email:
- consent.session.id_token.email
firstname:
- consent.session.id_token.firstname
lastname:
- consent.session.id_token.lastname
#- id: nineldap
# title:
# fr: NINE LDAP
# en: NINE LDAP
# description:
# fr: Authentification via NINELDAP
# en: Authentication by NINELDAP
# icon_url: http://localhost:8005/medias/icon/icon_phpldapadmin.png
# login_url: http://localhost:8005/hydra/loginldap
# consent_url: http://localhost:8005/hydra/consent
# logout_url: http://localhost:8005/hydra/logoutldap
# attributes_rewrite_rules:
# username:
# - consent.session.id_token.username
# email:
# - consent.session.id_token.email
# firstname:
# - consent.session.id_token.firstname
# lastname:
# - consent.session.id_token.lastname

View File

@ -9,11 +9,12 @@
"jwks": {},
"metadata": {},
"token_endpoint_auth_method": "client_secret_post",
"post_logout_redirect_uris": ["https://127.0.0.1:8000"],
"redirect_uris": ["https://127.0.0.1:8000/oauth2/callback"],
"post_logout_redirect_uris": ["http://localhost:8005"],
"redirect_uris": ["http://localhost:8005/oauth2/callback"],
"response_types": [
"code"
],
"logo_uri": "https://127.0.0.1:8000/minio/logo",
"logo_uri": "http://localhost:8005/minio/logo",
"scope": "openid"
}

View File

@ -1,6 +1,7 @@
version: '3'
# Port
# 8005 = nineskeletor
# 6379 = redis
# 5432 = postgresql
# 80 = mercure
@ -14,10 +15,28 @@ version: '3'
services:
nineskeletor:
build:
context: .
dockerfile: ./misc/docker/Dockerfile
container_name: nineskeletor-app
image: reg.cadoles.com/envole/nineskeletor
ports:
- "8005:80"
- "5588:5588"
volumes:
- ./src:/app/src:delegated
- ./templates:/app/templates:delegated
- ./config:/app/config:delegated
- ./.env:/app/.env:delegated
- ./public/uploads:/app/public/uploads:delegated
- ./misc:/app/misc:delegated
# Service redis pour le stockage des sessions
redis:
image: redis:4.0
container_name: ninegate-redis
container_name: nineskeletor-redis
ports:
- 6379:6379
environment:
@ -28,10 +47,10 @@ services:
# Service postgresql pour le stockage de la bdd applicative
postgresql:
image: postgres:13-alpine
container_name: ninegate-postgresql
hostname: ninegate-postgresql
container_name: nineskeletor-postgresql
hostname: nineskeletor-postgresql
environment:
POSTGRES_MULTIPLE_DATABASES: ninegate,hydra
POSTGRES_MULTIPLE_DATABASES: nineskeletor,hydra
POSTGRES_PASSWORD: ChangeMe
POSTGRES_USER: symfony
ports:
@ -43,7 +62,7 @@ services:
# Service websocket
mercure:
image: dunglas/mercure
container_name: ninegate-mercure
container_name: nineskeletor-mercure
restart: unless-stopped
ports:
- "80"
@ -62,7 +81,7 @@ services:
# Service de stockage Minio
minio1:
image: minio/minio:RELEASE.2021-01-16T02-19-44Z
container_name: ninegate-minio1
container_name: nineskeletor-minio1
volumes:
- data1-1:/data1
- data1-2:/data2
@ -81,7 +100,7 @@ services:
# Service de stockage Minio
minio2:
image: minio/minio:RELEASE.2021-01-16T02-19-44Z
container_name: ninegate-minio2
container_name: nineskeletor-minio2
volumes:
- data2-1:/data1
- data2-2:/data2
@ -100,7 +119,7 @@ services:
# Service de stockage Minio
minio3:
image: minio/minio:RELEASE.2021-01-16T02-19-44Z
container_name: ninegate-minio3
container_name: nineskeletor-minio3
volumes:
- data3-1:/data1
- data3-2:/data2
@ -119,7 +138,7 @@ services:
# Service de stockage Minio
minio4:
image: minio/minio:RELEASE.2021-01-16T02-19-44Z
container_name: ninegate-minio4
container_name: nineskeletor-minio4
volumes:
- data4-1:/data1
- data4-2:/data2
@ -138,7 +157,7 @@ services:
# Service nginx orchestrateur des minio
nginx:
image: nginx:1.19.2-alpine
container_name: ninegate-nginx
container_name: nineskeletor-nginx
volumes:
- ./containers/minio/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
@ -152,7 +171,7 @@ services:
# Service hydra
hydra:
image: cadoles/hydra-v1
container_name: ninegate-hydra
container_name: nineskeletor-hydra
volumes:
- ./containers/hydra/clients.d:/etc/hydra/clients.d
ports:
@ -165,10 +184,11 @@ services:
restart: on-failure
environment:
LOG_LEAK_SENSITIVE_VALUES: "true"
HYDRA_URLS_SELF_ISSUER: http://127.0.0.1:7080
HYDRA_URLS_CONSENT: http://127.0.0.1:7081/consent
HYDRA_URLS_LOGIN: http://127.0.0.1:7081/login
HYDRA_URLS_LOGOUT: http://127.0.0.1:7081/logout
HYDRA_URLS_SELF_ISSUER: http://localhost:7080
HYDRA_URLS_CONSENT: http://localhost:7081/consent
HYDRA_URLS_LOGIN: http://localhost:7081/login
HYDRA_URLS_LOGOUT: http://localhost:7081/logout
HYDRA_URLS_ERROR: https://localhost:8005
HYDRA_DSN: postgres://symfony:ChangeMe@postgresql:5432/hydra
#HYDRA_WAIT4X_DATABASE_TYPE: postgres
#HYDRA_WAIT4X_DATABASE_DSN: postgres://symfony:ChangeMe@postgresql:5432/hydra
@ -178,7 +198,7 @@ services:
hydra-dispatcher:
build:
context: ./containers/hydra-dispatcher
container_name: ninegate-hydra-dispatcher
container_name: nineskeletor-hydra-dispatcher
links:
- hydra
ports:
@ -190,7 +210,7 @@ services:
- HYDRA_BASE_URL=http://hydra:4444
- HYDRA_ADMIN_BASE_URL=http://hydra:4445
# url dispatcher
- BASE_URL=http://127.0.0.1:7081
- BASE_URL=http://localhost:7081
- COOKIE_PATH=/
- DEFAULT_LOCALE=fr
- APP_LOCALES=fr,en
@ -202,15 +222,15 @@ services:
# Service fake smtp = optionnel
mailer:
image: schickling/mailcatcher
container_name: ninegate-mailer
container_name: nineskeletor-mailer
ports:
- 1025:1025
- 1080:1080
# Service fake openldap = optionnel si ninegate a une synchronisation avec un annuaire
# Service fake openldap = optionnel si nineskeletor a une synchronisation avec un annuaire
openldap:
image: osixia/openldap:1.5.0
container_name: ninegate-openldap
container_name: nineskeletor-openldap
environment:
LDAP_LOG_LEVEL: "256"
LDAP_ORGANISATION: "nine"
@ -232,7 +252,7 @@ services:
# Service tool phpldapadmin = optionnel dans le cas de la présence d'un fake openldap
phpldapadmin:
image: osixia/phpldapadmin:latest
container_name: ninegate-phpldapadmin
container_name: nineskeletor-phpldapadmin
environment:
PHPLDAPADMIN_LDAP_HOSTS: "openldap"
PHPLDAPADMIN_HTTPS: "false"
@ -244,7 +264,7 @@ services:
# Service tool adminer = optionnel
adminer:
image: adminer
container_name: ninegate-adminer
container_name: nineskeletor-adminer
restart: always
ports:
- 6081:8080

22
misc/docker/Dockerfile Normal file
View File

@ -0,0 +1,22 @@
FROM reg.cadoles.com/envole/nineapache:8.1
RUN echo "* * * * * /app/bin/console app:Cron --env=prod" >> /var/spool/cron/crontabs/root
WORKDIR /app
COPY . .
RUN yarn install
RUN yarn encore dev
RUN yarn encore prod
RUN mkdir -p /app/public/uploads
RUN chown apache /app/public/uploads -R
RUN chmod u+w /app/public/uploads -R
RUN mkdir -p /app/var
RUN chown apache /app/var -R
RUN chmod u+w /app/var -R
CMD /app/misc/script/reconfigure.sh && /etc/apache2/apache2.sh
#CMD /etc/apache2/apache2.sh

17
misc/script/reconfigure.sh Executable file
View File

@ -0,0 +1,17 @@
#!/bin/bash
set -eo pipefail
# Se positionner sur la racine du projet
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
cd ${DIR}
cd ../..
DIR=$(pwd)
# Installation des dépendances composer
composer install --no-interaction
bin/console d:s:u --force --complete
bin/console app:Init
exec $@

8
phpstan.dist.neon Normal file
View File

@ -0,0 +1,8 @@
parameters:
level: 6
paths:
- bin/
- config/
- public/
- src/
- tests/

View File

@ -18,6 +18,8 @@ class HomeController extends AbstractController
// Récupération de la page encours
$id = $request->query->get('id');
// Application Portal
if (in_array('PORTAL', $this->getParameter('appModules'))) {
// Calcul des pages de l'utilisateur
$em->getRepository("App\Entity\Page")->getPagesUser($this->getUser(), $id, $pagecurrent, $pagesportal, $pagesuser, $groups);
@ -37,6 +39,7 @@ class HomeController extends AbstractController
'widgetsgroup' => $em->getRepository("App\Entity\Widget")->getWidgetAccess('group'),
]);
}
}
if (!$this->getUser()) {
return $this->render('Home/home.html.twig', [

View File

@ -252,7 +252,6 @@ class PagewidgetController extends AbstractController
'idpage' => $idpage,
'form' => $form->createView(),
'usage' => $usage,
'group' => $group,
]);
}

View File

@ -237,6 +237,7 @@ class SecurityController extends AbstractController
$callback = $this->generateUrl('app_loginopenidcallback', [], UrlGeneratorInterface::ABSOLUTE_URL);
$apiurl = $this->getParameter('oauthTokenurl');
$query = [
'grant_type' => 'authorization_code',
'code' => $request->get('code'),
@ -244,10 +245,10 @@ class SecurityController extends AbstractController
'client_id' => $this->getParameter('oauthClientid'),
'client_secret' => $this->getParameter('oauthClientsecret'),
];
$response = $this->apiservice->run('POST', $apiurl, $query, null, 'form');
$response = $this->apiservice->run('POST', $apiurl, $query, null, 'form');
if (!$response || '200' != $response->code) {
exit('pb openid 01');
exit('pb openid 01 <a href="/login">login</a>');
}
$accesstoken = $response->body->access_token;
$accesstokentype = $response->body->token_type;
@ -257,10 +258,9 @@ class SecurityController extends AbstractController
$request->getSession()->set('oauthIdtoken', $îdtoken);
$apiurl = $this->getParameter('oauthUserinfo');
$response = $this->apiservice->run('GET', $apiurl, null, ['Authorization' => $accesstokentype.' '.$accesstoken]);
if (!$response || '200' != $response->code) {
exit('pb openid 02');
exit('pb openid 02 <a href="/login">login</a>');
}
$attributes = json_decode(json_encode($response->body), true);

View File

@ -176,14 +176,12 @@ class LdapService
return $this->resultToArray($result);
}
public function searchdn($dn, $subBranch = '')
public function searchdn($dn)
{
$connection = $this->connect();
$tbdn = ldap_explode_dn($dn, 0);
$branch = ($subBranch ? $subBranch : $this->basedn);
$result = ldap_search($connection, $branch, '('.$tbdn[0].')', [], 0, 0, 0);
$result = @ldap_read($connection, $dn, '(objectClass=*)');
if (!$result) {
$this->ldapError();
return null;
}
return $this->resultToArray($result);
@ -300,32 +298,32 @@ class LdapService
$this->addOrganisation($this->baseorganisation);
}
$ldapentrys = $this->searchdn($this->baseniveau01, $this->baseorganisation);
$ldapentrys = $this->searchdn($this->baseniveau01);
if (empty($ldapentrys)) {
$this->addOrganisation($this->baseniveau01);
}
$ldapentrys = $this->searchdn($this->baseniveau02, $this->baseorganisation);
$ldapentrys = $this->searchdn($this->baseniveau02);
if (empty($ldapentrys)) {
$this->addOrganisation($this->baseniveau02);
}
$ldapentrys = $this->searchdn($this->baseniveau03, $this->baseorganisation);
$ldapentrys = $this->searchdn($this->baseniveau03);
if (empty($ldapentrys)) {
$this->addOrganisation($this->baseniveau03);
}
$ldapentrys = $this->searchdn($this->baseniveau04, $this->baseorganisation);
$ldapentrys = $this->searchdn($this->baseniveau04);
if (empty($ldapentrys)) {
$this->addOrganisation($this->baseniveau04);
}
$ldapentrys = $this->searchdn($this->basegroup, $this->baseorganisation);
$ldapentrys = $this->searchdn($this->basegroup);
if (empty($ldapentrys)) {
$this->addOrganisation($this->basegroup);
}
$ldapentrys = $this->searchdn($this->baseuser, $this->baseorganisation);
$ldapentrys = $this->searchdn($this->baseuser);
if (empty($ldapentrys)) {
$this->addOrganisation($this->baseuser);
}

View File

@ -97,6 +97,18 @@
"config/routes/oneup_uploader.yaml"
]
},
"phpstan/phpstan": {
"version": "1.11",
"recipe": {
"repo": "github.com/symfony/recipes-contrib",
"branch": "main",
"version": "1.0",
"ref": "5e490cc197fb6bb1ae22e5abbc531ddc633b6767"
},
"files": [
"phpstan.dist.neon"
]
},
"phpunit/phpunit": {
"version": "9.5",
"recipe": {

View File

@ -127,6 +127,12 @@
{% endif %}
{% endfor %}
{% set toshow=true %}
{% if section.name == "PORTAIL" and not ("PORTAL" in appModules) %}
{% set toshow=false %}
{% endif %}
{% if toshow %}
<div class="nav-link-section">
<a class="nav-link nav-link-title" onClick="$('#sidebar .nav-link-items').hide();$(this).next().toggle();">
<i class="{{section.icon}}"></i>
@ -151,6 +157,7 @@
{% endfor %}
</div>
</div>
{% endif %}
{% endfor %}
</ul>
</div>

View File

@ -1,6 +1,7 @@
{% extends 'base.html.twig' %}
{% block localstyle %}
<style>
.thumbnail {
text-align:center;
}
@ -34,13 +35,14 @@
h3 {
margin-top:10px;
}
</style>
{% endblock %}
{% block body %}
<div style="width: 400px;margin: auto;text-align: center;margin-top: 10px;">
<div style="width: 400px;margin: auto;text-align: center;margin-top: 100px;">
<a href="{{ path("app_home") }}">
<img src="/{{ appAlias }}/uploads/logo/{{app.session.get("logolight")}}" style="max-width: 100%; max-height:200px;">
<img src="{{ path('app_minio_image',{file:"logo/"~app.session.get("logolight")}) }}" style="max-width: 100%; max-height:200px;margin-bottom: 30px;">
<h1 style="text-transform:uppercase; padding-top:0px">{{ app.session.get('appname') }}</h1>
</a>
@ -50,92 +52,4 @@ h3 {
<a href="{{ path("app_resetpwd01") }}">Mot de passe oublié ?</a>
{% endif %}
</div>
<div class="container row m-auto">
<div class="col-lg-3">
<div class="thumbnail" style="margin-top:10px; border:none; background-color:transparent">
<img class="imgreflect" src="/{{ appAlias }}/images/thumb-01.jpg"/>
<div class="caption">
<h3 style="text-align:center">Portail<br>Profilé</h3>
<p>Tous les éléments du portail peuvent être distribués en fonction du profil de l'utilisateur.</p>
<p>Il est possible de définir le profil de l'utilisateur en fonction :
<ul>
<li>De son groupe d'appartenance</li>
<li>D'attributs Annuaire</li>
<li>D'attributs SSO</li>
</ul>
</p>
<p>En fonction du profil de l'utilisateur, il est possible de distribuer :
<ul>
<li>Des pages en onglet</li>
<li>Des Flux RSS</li>
<li>Des Annonces</li>
<li>Des Applications Web</li>
<li>Des Calendriers</li>
</ul>
</p>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="thumbnail" style="margin-top:10px; border:none; background-color:transparent">
<img class="imgreflect" src="/{{ appAlias }}/images/thumb-02.jpg"/>
<div class="caption">
<h3 style="text-align:center">Portail<br>Personnalisable</h3>
<p>En fonction de la configuration et de leur profil, les utilisateurs du portail sont libres de créer leur propre page.</p>
<p>Les pages de l'utilisateur pouvant prendre plusieurs formes :
<ul>
<li>Une page pointant sur l'adresse d'un autre site</li>
<li>Une page construite par l'utilisateur via l'utilisation d'un éditeur riche</li>
<li>Une page constituée de widgets qu'il dispose selon son libre choix</li>
</ul>
</p>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="thumbnail" style="margin-top:10px; border:none; background-color:transparent">
<img class="imgreflect" src="/{{ appAlias }}/images/thumb-03.jpg"/>
<div class="caption">
<h3 style="text-align:center">Portail<br>Evolutif</h3>
<p>Ninegate est évolutif dans le sens où, vous disposerez d'une large bibliothèque de widgets qui composeront vos pages.</p>
<p>Voici quelques exemples :
<ul>
<li>Widget URL</li>
<li>Widget Flux RSS</li>
<li>Widget Editeur de texte</li>
<li>Widget Gestionnaire de tâches</li>
<li>Widget Calendriers</li>
<li>Widget Favoris</li>
<li>Widget Dépôt de Fichiers</li>
<li>Et bien d'autres encore</li>
</ul>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="thumbnail" style="margin-top:10px; border:none; background-color:transparent">
<img class="imgreflect" src="/{{ appAlias }}/images/thumb-04.jpg"/>
<div class="caption">
<h3 style="text-align:center">Portail</br>Open Source</h3>
<p>Ce projet est opensource
<ul>
<li>Vous pouvez à tout moment modifier le code de votre portail</li>
<li>Distribuer {{ app.session.get('appname') }}</li>
</ul>
</p>
<p>Ninegate est développé dans le cadre du projet <a href='https://envole.ac-dijon.fr/ninegate/' target='_blank'>Envole</a>. Vous pourrez trouver le code source de Ninegate sur la <a href='https://dev-eole.ac-dijon.fr/projects/eole-eportail' target='_blank'>forge du projet</a></p>
<p>Ninegate est propulsé par la société <a href='https://cadoles.com' target='_blank'>Cadoles</a></p>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,45 @@
<?php
$finder = PhpCsFixer\Finder::create()
->in(__DIR__.'/../../src')
->name('*.php')
;
// TODO: Définir les règles de style communes
// spécifiques au projet
return (new PhpCsFixer\Config())
->setRules([
'@Symfony' => true,
'concat_space' => ['spacing' => 'none'],
'array_syntax' => ['syntax' => 'short'],
'combine_consecutive_issets' => true,
'explicit_indirect_variable' => true,
'no_useless_return' => true,
'ordered_imports' => true,
'no_unused_imports' => true,
'no_spaces_after_function_name' => true,
'no_spaces_inside_parenthesis' => true,
'ternary_operator_spaces' => true,
'class_definition' => ['single_line' => true],
'whitespace_after_comma_in_array' => true,
// phpdoc
'phpdoc_add_missing_param_annotation' => ['only_untyped' => true],
'phpdoc_order' => true,
'phpdoc_types_order' => [
'null_adjustment' => 'always_last',
'sort_algorithm' => 'alpha',
],
'phpdoc_no_empty_return' => false,
'phpdoc_summary' => false,
'general_phpdoc_annotation_remove' => [
'annotations' => [
'expectedExceptionMessageRegExp',
'expectedException',
'expectedExceptionMessage',
'author',
],
],
])
->setFinder($finder)
;

2
tools/php-cs-fixer/composer.json Executable file → Normal file
View File

@ -1,5 +1,5 @@
{
"require": {
"friendsofphp/php-cs-fixer": "^3.9"
"friendsofphp/php-cs-fixer": "3.4"
}
}

337
tools/php-cs-fixer/composer.lock generated Executable file → Normal file
View File

@ -4,34 +4,34 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d6259871d743287ae7052fe34780cc5a",
"content-hash": "2548af5080aac64997dfc54d4110f2f7",
"packages": [
{
"name": "composer/pcre",
"version": "3.0.0",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
"reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd"
"reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd",
"reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd",
"url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560",
"reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.3",
"phpstan/phpstan-strict-rules": "^1.1",
"symfony/phpunit-bridge": "^5"
"symfony/phpunit-bridge": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
"dev-main": "1.x-dev"
}
},
"autoload": {
@ -59,7 +59,7 @@
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.0.0"
"source": "https://github.com/composer/pcre/tree/1.0.1"
},
"funding": [
{
@ -75,20 +75,20 @@
"type": "tidelift"
}
],
"time": "2022-02-25T20:21:48+00:00"
"time": "2022-01-21T20:24:37+00:00"
},
{
"name": "composer/semver",
"version": "3.3.2",
"version": "3.2.9",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
"reference": "a951f614bd64dcd26137bc9b7b2637ddcfc57649"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
"reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
"url": "https://api.github.com/repos/composer/semver/zipball/a951f614bd64dcd26137bc9b7b2637ddcfc57649",
"reference": "a951f614bd64dcd26137bc9b7b2637ddcfc57649",
"shasum": ""
},
"require": {
@ -140,7 +140,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.3.2"
"source": "https://github.com/composer/semver/tree/3.2.9"
},
"funding": [
{
@ -156,31 +156,31 @@
"type": "tidelift"
}
],
"time": "2022-04-01T19:23:25+00:00"
"time": "2022-02-04T13:58:43+00:00"
},
{
"name": "composer/xdebug-handler",
"version": "3.0.3",
"version": "2.0.5",
"source": {
"type": "git",
"url": "https://github.com/composer/xdebug-handler.git",
"reference": "ced299686f41dce890debac69273b47ffe98a40c"
"reference": "9e36aeed4616366d2b690bdce11f71e9178c579a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
"reference": "ced299686f41dce890debac69273b47ffe98a40c",
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a",
"reference": "9e36aeed4616366d2b690bdce11f71e9178c579a",
"shasum": ""
},
"require": {
"composer/pcre": "^1 || ^2 || ^3",
"php": "^7.2.5 || ^8.0",
"composer/pcre": "^1",
"php": "^5.3.2 || ^7.0 || ^8.0",
"psr/log": "^1 || ^2 || ^3"
},
"require-dev": {
"phpstan/phpstan": "^1.0",
"phpstan/phpstan-strict-rules": "^1.1",
"symfony/phpunit-bridge": "^6.0"
"symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0"
},
"type": "library",
"autoload": {
@ -206,7 +206,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/xdebug-handler/issues",
"source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
"source": "https://github.com/composer/xdebug-handler/tree/2.0.5"
},
"funding": [
{
@ -222,20 +222,20 @@
"type": "tidelift"
}
],
"time": "2022-02-25T21:32:43+00:00"
"time": "2022-02-24T20:20:32+00:00"
},
{
"name": "doctrine/annotations",
"version": "1.13.3",
"version": "1.13.2",
"source": {
"type": "git",
"url": "https://github.com/doctrine/annotations.git",
"reference": "648b0343343565c4a056bfc8392201385e8d89f0"
"reference": "5b668aef16090008790395c02c893b1ba13f7e08"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0",
"reference": "648b0343343565c4a056bfc8392201385e8d89f0",
"url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08",
"reference": "5b668aef16090008790395c02c893b1ba13f7e08",
"shasum": ""
},
"require": {
@ -247,10 +247,9 @@
"require-dev": {
"doctrine/cache": "^1.11 || ^2.0",
"doctrine/coding-standard": "^6.0 || ^8.1",
"phpstan/phpstan": "^1.4.10 || ^1.8.0",
"phpstan/phpstan": "^0.12.20",
"phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5",
"symfony/cache": "^4.4 || ^5.2",
"vimeo/psalm": "^4.10"
"symfony/cache": "^4.4 || ^5.2"
},
"type": "library",
"autoload": {
@ -293,9 +292,9 @@
],
"support": {
"issues": "https://github.com/doctrine/annotations/issues",
"source": "https://github.com/doctrine/annotations/tree/1.13.3"
"source": "https://github.com/doctrine/annotations/tree/1.13.2"
},
"time": "2022-07-02T10:48:51+00:00"
"time": "2021-08-05T19:00:23+00:00"
},
{
"name": "doctrine/lexer",
@ -375,52 +374,52 @@
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.9.5",
"version": "v3.4.0",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
"reference": "4465d70ba776806857a1ac2a6f877e582445ff36"
"reference": "47177af1cfb9dab5d1cc4daf91b7179c2efe7fad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/4465d70ba776806857a1ac2a6f877e582445ff36",
"reference": "4465d70ba776806857a1ac2a6f877e582445ff36",
"url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/47177af1cfb9dab5d1cc4daf91b7179c2efe7fad",
"reference": "47177af1cfb9dab5d1cc4daf91b7179c2efe7fad",
"shasum": ""
},
"require": {
"composer/semver": "^3.2",
"composer/xdebug-handler": "^3.0.3",
"doctrine/annotations": "^1.13",
"composer/xdebug-handler": "^2.0",
"doctrine/annotations": "^1.12",
"ext-json": "*",
"ext-tokenizer": "*",
"php": "^7.4 || ^8.0",
"php": "^7.2.5 || ^8.0",
"php-cs-fixer/diff": "^2.0",
"symfony/console": "^5.4 || ^6.0",
"symfony/event-dispatcher": "^5.4 || ^6.0",
"symfony/filesystem": "^5.4 || ^6.0",
"symfony/finder": "^5.4 || ^6.0",
"symfony/options-resolver": "^5.4 || ^6.0",
"symfony/console": "^4.4.20 || ^5.1.3 || ^6.0",
"symfony/event-dispatcher": "^4.4.20 || ^5.0 || ^6.0",
"symfony/filesystem": "^4.4.20 || ^5.0 || ^6.0",
"symfony/finder": "^4.4.20 || ^5.0 || ^6.0",
"symfony/options-resolver": "^4.4.20 || ^5.0 || ^6.0",
"symfony/polyfill-mbstring": "^1.23",
"symfony/polyfill-php80": "^1.25",
"symfony/polyfill-php81": "^1.25",
"symfony/process": "^5.4 || ^6.0",
"symfony/stopwatch": "^5.4 || ^6.0"
"symfony/polyfill-php80": "^1.23",
"symfony/polyfill-php81": "^1.23",
"symfony/process": "^4.4.20 || ^5.0 || ^6.0",
"symfony/stopwatch": "^4.4.20 || ^5.0 || ^6.0"
},
"require-dev": {
"justinrainbow/json-schema": "^5.2",
"keradus/cli-executor": "^1.5",
"mikey179/vfsstream": "^1.6.10",
"mikey179/vfsstream": "^1.6.8",
"php-coveralls/php-coveralls": "^2.5.2",
"php-cs-fixer/accessible-object": "^1.1",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1",
"phpspec/prophecy": "^1.15",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5",
"phpspec/prophecy-phpunit": "^1.1 || ^2.0",
"phpunit/phpunit": "^8.5.21 || ^9.5",
"phpunitgoodpractices/polyfill": "^1.5",
"phpunitgoodpractices/traits": "^1.9.1",
"symfony/phpunit-bridge": "^6.0",
"symfony/yaml": "^5.4 || ^6.0"
"symfony/phpunit-bridge": "^5.2.4 || ^6.0",
"symfony/yaml": "^4.4.20 || ^5.0 || ^6.0"
},
"suggest": {
"ext-dom": "For handling output formats in XML",
@ -452,7 +451,7 @@
"description": "A tool to automatically fix PHP code style",
"support": {
"issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues",
"source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.9.5"
"source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.4.0"
},
"funding": [
{
@ -460,7 +459,7 @@
"type": "github"
}
],
"time": "2022-07-22T08:43:51+00:00"
"time": "2021-12-11T16:25:08+00:00"
},
{
"name": "php-cs-fixer/diff",
@ -565,20 +564,20 @@
},
{
"name": "psr/container",
"version": "1.1.2",
"version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
"reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
"reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
"shasum": ""
},
"require": {
"php": ">=7.4.0"
"php": ">=7.2.0"
},
"type": "library",
"autoload": {
@ -607,9 +606,9 @@
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
"source": "https://github.com/php-fig/container/tree/1.1.2"
"source": "https://github.com/php-fig/container/tree/1.1.1"
},
"time": "2021-11-05T16:50:12+00:00"
"time": "2021-03-05T17:36:06+00:00"
},
{
"name": "psr/event-dispatcher",
@ -713,16 +712,16 @@
},
{
"name": "symfony/console",
"version": "v5.4.10",
"version": "v5.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000"
"reference": "d8111acc99876953f52fe16d4c50eb60940d49ad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000",
"reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000",
"url": "https://api.github.com/repos/symfony/console/zipball/d8111acc99876953f52fe16d4c50eb60940d49ad",
"reference": "d8111acc99876953f52fe16d4c50eb60940d49ad",
"shasum": ""
},
"require": {
@ -792,7 +791,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v5.4.10"
"source": "https://github.com/symfony/console/tree/v5.4.5"
},
"funding": [
{
@ -808,20 +807,20 @@
"type": "tidelift"
}
],
"time": "2022-06-26T13:00:04+00:00"
"time": "2022-02-24T12:45:35+00:00"
},
{
"name": "symfony/deprecation-contracts",
"version": "v2.5.2",
"version": "v2.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
"reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8",
"reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8",
"shasum": ""
},
"require": {
@ -859,7 +858,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0"
},
"funding": [
{
@ -875,20 +874,20 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2021-07-12T14:48:14+00:00"
},
{
"name": "symfony/event-dispatcher",
"version": "v5.4.9",
"version": "v5.4.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc"
"reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
"reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dec8a9f58d20df252b9cd89f1c6c1530f747685d",
"reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d",
"shasum": ""
},
"require": {
@ -944,7 +943,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9"
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.3"
},
"funding": [
{
@ -960,20 +959,20 @@
"type": "tidelift"
}
],
"time": "2022-05-05T16:45:39+00:00"
"time": "2022-01-02T09:53:40+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v2.5.2",
"version": "v2.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "f98b54df6ad059855739db6fcbc2d36995283fe1"
"reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1",
"reference": "f98b54df6ad059855739db6fcbc2d36995283fe1",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a",
"reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a",
"shasum": ""
},
"require": {
@ -1023,7 +1022,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0"
},
"funding": [
{
@ -1039,20 +1038,20 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2021-07-12T14:48:14+00:00"
},
{
"name": "symfony/filesystem",
"version": "v5.4.9",
"version": "v5.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba"
"reference": "797680071ea8f71b94eb958680c50d0e002638f5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba",
"reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/797680071ea8f71b94eb958680c50d0e002638f5",
"reference": "797680071ea8f71b94eb958680c50d0e002638f5",
"shasum": ""
},
"require": {
@ -1087,7 +1086,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v5.4.9"
"source": "https://github.com/symfony/filesystem/tree/v5.4.5"
},
"funding": [
{
@ -1103,20 +1102,20 @@
"type": "tidelift"
}
],
"time": "2022-05-20T13:55:35+00:00"
"time": "2022-02-27T10:31:47+00:00"
},
{
"name": "symfony/finder",
"version": "v5.4.8",
"version": "v5.4.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9"
"reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9",
"reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9",
"url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d",
"reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d",
"shasum": ""
},
"require": {
@ -1150,7 +1149,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v5.4.8"
"source": "https://github.com/symfony/finder/tree/v5.4.3"
},
"funding": [
{
@ -1166,7 +1165,7 @@
"type": "tidelift"
}
],
"time": "2022-04-15T08:07:45+00:00"
"time": "2022-01-26T16:34:36+00:00"
},
{
"name": "symfony/options-resolver",
@ -1239,16 +1238,16 @@
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.26.0",
"version": "v1.24.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
"reference": "30885182c981ab175d4d034db0f6f469898070ab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
"reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
"reference": "30885182c981ab175d4d034db0f6f469898070ab",
"shasum": ""
},
"require": {
@ -1263,7 +1262,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1301,7 +1300,7 @@
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.24.0"
},
"funding": [
{
@ -1317,20 +1316,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2021-10-20T20:35:02+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.26.0",
"version": "v1.24.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "433d05519ce6990bf3530fba6957499d327395c2"
"reference": "81b86b50cf841a64252b439e738e97f4a34e2783"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
"reference": "433d05519ce6990bf3530fba6957499d327395c2",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783",
"reference": "81b86b50cf841a64252b439e738e97f4a34e2783",
"shasum": ""
},
"require": {
@ -1342,7 +1341,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1382,7 +1381,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.24.0"
},
"funding": [
{
@ -1398,20 +1397,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2021-11-23T21:10:46+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.26.0",
"version": "v1.24.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "219aa369ceff116e673852dce47c3a41794c14bd"
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
"reference": "219aa369ceff116e673852dce47c3a41794c14bd",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
"shasum": ""
},
"require": {
@ -1423,7 +1422,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1466,7 +1465,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0"
},
"funding": [
{
@ -1482,20 +1481,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2021-02-19T12:13:01+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.26.0",
"version": "v1.24.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
"reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825",
"reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825",
"shasum": ""
},
"require": {
@ -1510,7 +1509,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1549,7 +1548,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0"
},
"funding": [
{
@ -1565,20 +1564,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2021-11-30T18:21:41+00:00"
},
{
"name": "symfony/polyfill-php73",
"version": "v1.26.0",
"version": "v1.24.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
"reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85"
"reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85",
"reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85",
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5",
"reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5",
"shasum": ""
},
"require": {
@ -1587,7 +1586,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1628,7 +1627,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-php73/tree/v1.24.0"
},
"funding": [
{
@ -1644,20 +1643,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2021-06-05T21:20:04+00:00"
},
{
"name": "symfony/polyfill-php80",
"version": "v1.26.0",
"version": "v1.24.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
"reference": "57b712b08eddb97c762a8caa32c84e037892d2e9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
"reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9",
"reference": "57b712b08eddb97c762a8caa32c84e037892d2e9",
"shasum": ""
},
"require": {
@ -1666,7 +1665,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1711,7 +1710,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0"
},
"funding": [
{
@ -1727,20 +1726,20 @@
"type": "tidelift"
}
],
"time": "2022-05-10T07:21:04+00:00"
"time": "2021-09-13T13:58:33+00:00"
},
{
"name": "symfony/polyfill-php81",
"version": "v1.26.0",
"version": "v1.24.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
"reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
"reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
"reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
"reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
"shasum": ""
},
"require": {
@ -1749,7 +1748,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1790,7 +1789,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-php81/tree/v1.24.0"
},
"funding": [
{
@ -1806,20 +1805,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2021-09-13T13:58:11+00:00"
},
{
"name": "symfony/process",
"version": "v5.4.8",
"version": "v5.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3"
"reference": "95440409896f90a5f85db07a32b517ecec17fa4c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
"reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
"url": "https://api.github.com/repos/symfony/process/zipball/95440409896f90a5f85db07a32b517ecec17fa4c",
"reference": "95440409896f90a5f85db07a32b517ecec17fa4c",
"shasum": ""
},
"require": {
@ -1852,7 +1851,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v5.4.8"
"source": "https://github.com/symfony/process/tree/v5.4.5"
},
"funding": [
{
@ -1868,26 +1867,26 @@
"type": "tidelift"
}
],
"time": "2022-04-08T05:07:18+00:00"
"time": "2022-01-30T18:16:22+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v2.5.2",
"version": "v2.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c"
"reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
"reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc",
"reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/container": "^1.1",
"symfony/deprecation-contracts": "^2.1|^3"
"symfony/deprecation-contracts": "^2.1"
},
"conflict": {
"ext-psr": "<1.1|>=2"
@ -1935,7 +1934,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v2.5.2"
"source": "https://github.com/symfony/service-contracts/tree/v2.5.0"
},
"funding": [
{
@ -1951,7 +1950,7 @@
"type": "tidelift"
}
],
"time": "2022-05-30T19:17:29+00:00"
"time": "2021-11-04T16:48:04+00:00"
},
{
"name": "symfony/stopwatch",
@ -2017,16 +2016,16 @@
},
{
"name": "symfony/string",
"version": "v5.4.10",
"version": "v5.4.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "4432bc7df82a554b3e413a8570ce2fea90e94097"
"reference": "92043b7d8383e48104e411bc9434b260dbeb5a10"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097",
"reference": "4432bc7df82a554b3e413a8570ce2fea90e94097",
"url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10",
"reference": "92043b7d8383e48104e411bc9434b260dbeb5a10",
"shasum": ""
},
"require": {
@ -2083,7 +2082,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v5.4.10"
"source": "https://github.com/symfony/string/tree/v5.4.3"
},
"funding": [
{
@ -2099,7 +2098,7 @@
"type": "tidelift"
}
],
"time": "2022-06-26T15:57:47+00:00"
"time": "2022-01-02T09:53:40+00:00"
}
],
"packages-dev": [],
@ -2110,5 +2109,5 @@
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
"plugin-api-version": "2.3.0"
"plugin-api-version": "2.2.0"
}