16 Commits

Author SHA1 Message Date
f29fc43c8a Merge pull request 'activeuser' (#3) from activeuser into master
All checks were successful
Cadoles/nineskeletor/pipeline/head This commit looks good
Reviewed-on: #3
2022-10-02 15:14:32 +02:00
1c644f8dca fix(activeuser): composer update
All checks were successful
Cadoles/nineskeletor/pipeline/pr-master This commit looks good
2022-10-02 15:09:30 +02:00
84230eb347 fix(activeuser): user isactive & adress niveau & route all
Some checks reported warnings
Cadoles/nineskeletor/pipeline/head This commit is unstable
Cadoles/nineskeletor/pipeline/pr-master This commit is unstable
2022-10-02 14:50:48 +02:00
2cad98ca86 fix(activeuser): reset structure bdd
Some checks reported warnings
Cadoles/nineskeletor/pipeline/head This commit is unstable
2022-09-29 16:53:21 +02:00
ca5f9fef2d Merge pull request 'Gestion de niveau 3 & 4' (#2) from morelevel into master
Some checks reported warnings
Cadoles/nineskeletor/pipeline/head This commit is unstable
Reviewed-on: #2
2022-09-29 16:05:30 +02:00
b9bb605ad2 fix(morelevel): level mandatory in proil
Some checks failed
Cadoles/nineskeletor/pipeline/pr-master There was a failure building this commit
Cadoles/nineskeletor/pipeline/head There was a failure building this commit
2022-09-27 16:48:57 +02:00
ea31b7255d fix(morelevel): perte de la conf redis
All checks were successful
Cadoles/nineskeletor/pipeline/head This commit looks good
2022-09-27 11:58:18 +02:00
d1431bcce4 fix(morelevel): ajout de niveau03 et niveau04
All checks were successful
Cadoles/nineskeletor/pipeline/head This commit looks good
2022-09-27 11:52:49 +02:00
89cb0433c0 Merge pull request 'Intégration d'outils de validation de qualité et pipeline Jenkins' (#1) from continuous-integration into master
Some checks failed
Cadoles/nineskeletor/pipeline/head There was a failure building this commit
Reviewed-on: #1
2022-09-26 09:44:29 +02:00
b78f54b76c fix(continuous-integration): correction php-cs-fixer
All checks were successful
Cadoles/nineskeletor/pipeline/pr-master This commit looks good
2022-09-23 16:14:15 +02:00
5f3cc51f5c fix(continuous-integration): correction point phpstan de level 1
All checks were successful
Cadoles/nineskeletor/pipeline/pr-master This commit looks good
2022-09-23 15:34:07 +02:00
86b11372e7 fix(continuous-integration): correction point phpstan
All checks were successful
Cadoles/nineskeletor/pipeline/pr-master This commit looks good
2022-09-23 14:53:47 +02:00
0ddb71006f chore: add jenkins validation pipeline
Some checks failed
Cadoles/nineskeletor/pipeline/head There was a failure building this commit
Cadoles/nineskeletor/pipeline/pr-master This commit looks good
2022-09-21 12:17:13 +02:00
44e6e012fd chore: add code quality tools 2022-09-21 12:16:42 +02:00
af5c6f9626 renforcer par un uuid la génération auto d'un password 2022-09-15 14:54:34 +02:00
87c9d362f2 suppression de variable d'environnement inutile 2022-09-15 14:48:36 +02:00
126 changed files with 16143 additions and 15296 deletions

48
.env
View File

@ -20,20 +20,48 @@ MAILER_NOREPLY=noreply@noreply.fr
# Basic # Basic
APP_WEBURL=127.0.0.1:8000 APP_WEBURL=127.0.0.1:8000
APP_MASTERIDENTITY=SQL # SQL | SSO | LDAP APP_MASTERIDENTITY=SQL # SQL | SSO | LDAP
APP_AUTH=SQL # SQL | CAS| LDAP | OPENID | à faire SAML APP_AUTH=SQL # SQL | CAS | LDAP | OPENID | à faire SAML
APP_ALIAS=/ APP_ALIAS=/
APP_NAME=Nineskeletor APP_NAME=Nineskeletor
APP_MASTERURL=
APP_MASTERKEY=
APP_MODEREGISTRATION= # null | BYADMIN | BYUSER APP_MODEREGISTRATION= # null | BYADMIN | BYUSER
APP_ADMINS='["admin"]' APP_ADMINS='["admin"]'
# 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
APP_NIVEAU01LABEL="Niveau 01" APP_NIVEAU01LABEL="Niveau 01"
APP_NIVEAU01LABELS="Niveaux 01"
APP_NIVEAU02USE=1
APP_NIVEAU02LABEL="Niveau 02" APP_NIVEAU02LABEL="Niveau 02"
APP_NIVEAU02LABELS="Niveaux 02"
APP_NIVEAU02MANDATORY='[""]'
APP_NIVEAU03USE=1
APP_NIVEAU03LABEL="Niveau 03"
APP_NIVEAU03LABELS="Niveaux 03"
APP_NIVEAU03MANDATORY='[""]'
APP_NIVEAU04USE=0
APP_NIVEAU04LABEL="Niveau 04"
APP_NIVEAU04LABELS="Niveaux 04"
APP_NIVEAU04MANDATORY='[""]'
APP_GROUPUSE=1
APP_GROUPSUBMITER='["ALL"]'
APP_ANNUSCOPEADMIN=ALL
APP_ANNUSCOPEMODO=ALL
APP_ANNUSCOPEMASTER=ALL
APP_ANNUSCOPEMANAGER=ALL
APP_ANNUSCOPEUSER=ALL
# Synchronisation # Synchronisation
APP_SYNCHRO= # Synchronisation null | LDAP2NINE | NINE2LDAP | NINE2NINE APP_SYNCHRO= # Synchronisation null | LDAP2NINE | NINE2LDAP | NINE2NINE
APP_SYNDCHROPURGENIVEAU01=1 # Purger les niveau01s obsolète en cas de synchronisation 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_SYNDCHROPURGENIVEAU02=1 # Purger les niveau02s obsolète en cas de synchronisation
APP_SYNDCHROPURGENIVEAU03=1 # Purger les niveau03s obsolète en cas de synchronisation
APP_SYNDCHROPURGENIVEAU04=1 # Purger les niveau04s obsolète en cas de synchronisation
APP_SYNDCHROPURGEGROUP=1 # Purger les groups obsolète en cas de synchronisation APP_SYNDCHROPURGEGROUP=1 # Purger les groups obsolète en cas de synchronisation
APP_SYNDCHROPURGEUSER=1 # Purger les users obsolète en cas de synchronisation APP_SYNDCHROPURGEUSER=1 # Purger les users obsolète en cas de synchronisation
@ -44,12 +72,14 @@ LDAP_USETLS=0 # connection TLS 0/1
LDAP_USERWRITER=0 # LDAP_USER compte writer ? 0/1 LDAP_USERWRITER=0 # LDAP_USER compte writer ? 0/1
LDAP_USER= # DN compte access ldap LDAP_USER= # DN compte access ldap
LDAP_PASSWORD= # Password comte access ldap LDAP_PASSWORD= # Password comte access ldap
LDAP_BASEDN= # Base DN ex:o=gouv,c=fr LDAP_BASEDN= # Base DN ex:dc=nine,dc=fr
LDAP_BASEORGANISATION= # Base Organisation ex:ou=nine,o=gouv,c=fr LDAP_BASEORGANISATION= # Base Organisation ex:ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU01= # Base Niveau01 ex:ou=niveau01,ou=nine,o=gouv,c=fr LDAP_BASENIVEAU01= # Base Niveau01 ex:ou=niveau01,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASENIVEAU02= # Base Niveau02 ex:ou=niveau02,ou=nine,o=gouv,c=fr LDAP_BASENIVEAU02= # Base Niveau02 ex:ou=niveau02,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASEGROUP= # Base Group ex:ou=groups,ou=nine,o=gouv,c=fr LDAP_BASENIVEAU03= # Base Niveau03 ex:ou=niveau03,ou=nineskeletor,dc=nine,dc=fr
LDAP_BASEUSER= # Base User ex:ou=users,ou=nine,o=gouv,c=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_USERNAME=uid # Attribut id d'un user LDAP_USERNAME=uid # Attribut id d'un user
LDAP_FIRSTNAME=givenname # Attribut firstname d'un user LDAP_FIRSTNAME=givenname # Attribut firstname d'un user
LDAP_LASTNAME=sn # Attribut lastname d'un user LDAP_LASTNAME=sn # Attribut lastname d'un user

18
.githooks/commit-msg Executable file
View File

@ -0,0 +1,18 @@
#!/bin/bash
set -eo pipefail
DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
export PATH="${PATH}:${DIR}/../node_modules/.bin"
function lint_commit_message {
local commit_message_file="$1"
cat "$commit_message_file" | commitlint
}
function main {
local commit_message_file="$1"
lint_commit_message "$commit_message_file"
}
main $@

2
.gitignore vendored
View File

@ -27,3 +27,5 @@ yarn-error.log
/public/uploads/logo/* /public/uploads/logo/*
!/public/uploads/logo/logo.png !/public/uploads/logo/logo.png
/public/uploads/ckeditor /public/uploads/ckeditor
.php-cs-fixer.cache

View File

@ -0,0 +1,15 @@
def exec() {
String dockerfile = readFile(file:'Dockerfile')
dockerfile = """
${dockerfile}
RUN apt update && apt install -y php-gd php-curl php-zip curl
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && apt-get install -y nodejs
RUN npm install -g yarn
""".stripIndent()
writeFile(file:'Dockerfile', text: dockerfile)
}
return this

12
.php-cs-fixer.dist.php Normal file
View File

@ -0,0 +1,12 @@
<?php
$finder = PhpCsFixer\Finder::create()
->in(__DIR__.'/src');
$config = new PhpCsFixer\Config();
return $config->setRules([
'@Symfony' => true,
'full_opening_tag' => false,
])
->setFinder($finder)
;

1
.php-version Normal file
View File

@ -0,0 +1 @@
8.1

3
Jenkinsfile vendored Normal file
View File

@ -0,0 +1,3 @@
@Library('cadoles') _
symfonyAppPipeline('ubuntu:22.04')

18
Makefile Normal file
View File

@ -0,0 +1,18 @@
SHELL := /bin/bash
export PATH := $(HOME)/.symfony/bin:$(PATH)
deps:
wget https://get.symfony.com/cli/installer -O - | bash
symfony composer install
symfony composer install --working-dir=tools/php-cs-fixer
symfony composer install --working-dir=tools/phpstan
npm ci
phpstan:
symfony php tools/phpstan/vendor/bin/phpstan analyze ./src -l 1
php-cs-fixer:
tools/php-cs-fixer/symfony-php-cs-fixer.sh fix --verbose --show-progress=dots
install-git-hooks:
git config core.hooksPath .githooks

1
commitlint.config.js Normal file
View File

@ -0,0 +1 @@
module.exports = {extends: ['@commitlint/config-conventional']};

741
composer.lock generated
View File

@ -58,16 +58,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.234.4", "version": "3.237.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "8d56ddb99632200273bb933cbf82b758ab9cde2a" "reference": "4667dd4b863a8686417e0d2a50da8682d8b68bb5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8d56ddb99632200273bb933cbf82b758ab9cde2a", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4667dd4b863a8686417e0d2a50da8682d8b68bb5",
"reference": "8d56ddb99632200273bb933cbf82b758ab9cde2a", "reference": "4667dd4b863a8686417e0d2a50da8682d8b68bb5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -86,6 +86,7 @@
"aws/aws-php-sns-message-validator": "~1.0", "aws/aws-php-sns-message-validator": "~1.0",
"behat/behat": "~3.0", "behat/behat": "~3.0",
"composer/composer": "^1.10.22", "composer/composer": "^1.10.22",
"dms/phpunit-arraysubset-asserts": "^0.4.0",
"doctrine/cache": "~1.4", "doctrine/cache": "~1.4",
"ext-dom": "*", "ext-dom": "*",
"ext-openssl": "*", "ext-openssl": "*",
@ -93,10 +94,11 @@
"ext-sockets": "*", "ext-sockets": "*",
"nette/neon": "^2.3", "nette/neon": "^2.3",
"paragonie/random_compat": ">= 2", "paragonie/random_compat": ">= 2",
"phpunit/phpunit": "^4.8.35 || ^5.6.3", "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5",
"psr/cache": "^1.0", "psr/cache": "^1.0",
"psr/simple-cache": "^1.0", "psr/simple-cache": "^1.0",
"sebastian/comparator": "^1.2.3" "sebastian/comparator": "^1.2.3 || ^4.0",
"yoast/phpunit-polyfills": "^1.0"
}, },
"suggest": { "suggest": {
"aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
@ -144,9 +146,9 @@
"support": { "support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.234.4" "source": "https://github.com/aws/aws-sdk-php/tree/3.237.1"
}, },
"time": "2022-08-26T18:20:48+00:00" "time": "2022-09-30T18:15:04+00:00"
}, },
{ {
"name": "brick/math", "name": "brick/math",
@ -438,16 +440,16 @@
}, },
{ {
"name": "doctrine/collections", "name": "doctrine/collections",
"version": "1.7.2", "version": "1.8.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/collections.git", "url": "https://github.com/doctrine/collections.git",
"reference": "3fe77330f5591108bbf1315da7377a7e704ed8a0" "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/collections/zipball/3fe77330f5591108bbf1315da7377a7e704ed8a0", "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e",
"reference": "3fe77330f5591108bbf1315da7377a7e704ed8a0", "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -502,22 +504,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/collections/issues", "issues": "https://github.com/doctrine/collections/issues",
"source": "https://github.com/doctrine/collections/tree/1.7.2" "source": "https://github.com/doctrine/collections/tree/1.8.0"
}, },
"time": "2022-08-27T16:08:58+00:00" "time": "2022-09-01T20:12:10+00:00"
}, },
{ {
"name": "doctrine/common", "name": "doctrine/common",
"version": "3.4.0", "version": "3.4.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/common.git", "url": "https://github.com/doctrine/common.git",
"reference": "e09556bbdf95b8420e649162b19ae9da2d1a80f3" "reference": "609c3a7b6af49a7b4b13945ca2fdf4af801946af"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/common/zipball/e09556bbdf95b8420e649162b19ae9da2d1a80f3", "url": "https://api.github.com/repos/doctrine/common/zipball/609c3a7b6af49a7b4b13945ca2fdf4af801946af",
"reference": "e09556bbdf95b8420e649162b19ae9da2d1a80f3", "reference": "609c3a7b6af49a7b4b13945ca2fdf4af801946af",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -525,13 +527,13 @@
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^9.0", "doctrine/coding-standard": "^9.0 || ^10.0",
"doctrine/collections": "^1", "doctrine/collections": "^1",
"phpstan/phpstan": "^1.4.1", "phpstan/phpstan": "^1.4.1",
"phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-phpunit": "^1",
"phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0",
"squizlabs/php_codesniffer": "^3.0", "squizlabs/php_codesniffer": "^3.0",
"symfony/phpunit-bridge": "^4.0.5", "symfony/phpunit-bridge": "^6.1",
"vimeo/psalm": "^4.4" "vimeo/psalm": "^4.4"
}, },
"type": "library", "type": "library",
@ -579,7 +581,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/common/issues", "issues": "https://github.com/doctrine/common/issues",
"source": "https://github.com/doctrine/common/tree/3.4.0" "source": "https://github.com/doctrine/common/tree/3.4.2"
}, },
"funding": [ "funding": [
{ {
@ -595,20 +597,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-23T19:46:56+00:00" "time": "2022-09-28T14:20:50+00:00"
}, },
{ {
"name": "doctrine/dbal", "name": "doctrine/dbal",
"version": "3.4.2", "version": "3.4.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/dbal.git", "url": "https://github.com/doctrine/dbal.git",
"reference": "22de295f10edbe00df74f517612f1fbd711131e2" "reference": "a5a58773109c0abb13e658c8ccd92aeec8d07f9e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/22de295f10edbe00df74f517612f1fbd711131e2", "url": "https://api.github.com/repos/doctrine/dbal/zipball/a5a58773109c0abb13e658c8ccd92aeec8d07f9e",
"reference": "22de295f10edbe00df74f517612f1fbd711131e2", "reference": "a5a58773109c0abb13e658c8ccd92aeec8d07f9e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -621,16 +623,16 @@
"psr/log": "^1|^2|^3" "psr/log": "^1|^2|^3"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "9.0.0", "doctrine/coding-standard": "10.0.0",
"jetbrains/phpstorm-stubs": "2022.1", "jetbrains/phpstorm-stubs": "2022.2",
"phpstan/phpstan": "1.8.2", "phpstan/phpstan": "1.8.3",
"phpstan/phpstan-strict-rules": "^1.3", "phpstan/phpstan-strict-rules": "^1.3",
"phpunit/phpunit": "9.5.21", "phpunit/phpunit": "9.5.24",
"psalm/plugin-phpunit": "0.17.0", "psalm/plugin-phpunit": "0.17.0",
"squizlabs/php_codesniffer": "3.7.1", "squizlabs/php_codesniffer": "3.7.1",
"symfony/cache": "^5.4|^6.0", "symfony/cache": "^5.4|^6.0",
"symfony/console": "^4.4|^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0",
"vimeo/psalm": "4.24.0" "vimeo/psalm": "4.27.0"
}, },
"suggest": { "suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files." "symfony/console": "For helpful console commands such as SQL execution and import of files."
@ -690,7 +692,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/dbal/issues", "issues": "https://github.com/doctrine/dbal/issues",
"source": "https://github.com/doctrine/dbal/tree/3.4.2" "source": "https://github.com/doctrine/dbal/tree/3.4.5"
}, },
"funding": [ "funding": [
{ {
@ -706,7 +708,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-21T14:21:06+00:00" "time": "2022-09-23T17:48:57+00:00"
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
@ -1043,28 +1045,28 @@
}, },
{ {
"name": "doctrine/inflector", "name": "doctrine/inflector",
"version": "2.0.4", "version": "2.0.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/inflector.git", "url": "https://github.com/doctrine/inflector.git",
"reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" "reference": "ade2b3bbfb776f27f0558e26eed43b5d9fe1b392"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", "url": "https://api.github.com/repos/doctrine/inflector/zipball/ade2b3bbfb776f27f0558e26eed43b5d9fe1b392",
"reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", "reference": "ade2b3bbfb776f27f0558e26eed43b5d9fe1b392",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2 || ^8.0" "php": "^7.2 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^8.2", "doctrine/coding-standard": "^9",
"phpstan/phpstan": "^0.12", "phpstan/phpstan": "^1.8",
"phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-phpunit": "^1.1",
"phpstan/phpstan-strict-rules": "^0.12", "phpstan/phpstan-strict-rules": "^1.3",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", "phpunit/phpunit": "^8.5 || ^9.5",
"vimeo/psalm": "^4.10" "vimeo/psalm": "^4.25"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -1114,7 +1116,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/inflector/issues", "issues": "https://github.com/doctrine/inflector/issues",
"source": "https://github.com/doctrine/inflector/tree/2.0.4" "source": "https://github.com/doctrine/inflector/tree/2.0.5"
}, },
"funding": [ "funding": [
{ {
@ -1130,7 +1132,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-10-22T20:16:43+00:00" "time": "2022-09-07T09:01:28+00:00"
}, },
{ {
"name": "doctrine/instantiator", "name": "doctrine/instantiator",
@ -1389,16 +1391,16 @@
}, },
{ {
"name": "doctrine/orm", "name": "doctrine/orm",
"version": "2.13.1", "version": "2.13.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/orm.git", "url": "https://github.com/doctrine/orm.git",
"reference": "35c44a56677adb3ce796138b6e4934ce93ec6811" "reference": "a8b02fd70fa777ca8278b9604fdef75c15c6a12f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/orm/zipball/35c44a56677adb3ce796138b6e4934ce93ec6811", "url": "https://api.github.com/repos/doctrine/orm/zipball/a8b02fd70fa777ca8278b9604fdef75c15c6a12f",
"reference": "35c44a56677adb3ce796138b6e4934ce93ec6811", "reference": "a8b02fd70fa777ca8278b9604fdef75c15c6a12f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1425,15 +1427,15 @@
}, },
"require-dev": { "require-dev": {
"doctrine/annotations": "^1.13", "doctrine/annotations": "^1.13",
"doctrine/coding-standard": "^9.0", "doctrine/coding-standard": "^9.0.2 || ^10.0",
"phpbench/phpbench": "^0.16.10 || ^1.0", "phpbench/phpbench": "^0.16.10 || ^1.0",
"phpstan/phpstan": "~1.4.10 || 1.8.2", "phpstan/phpstan": "~1.4.10 || 1.8.5",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"psr/log": "^1 || ^2 || ^3", "psr/log": "^1 || ^2 || ^3",
"squizlabs/php_codesniffer": "3.7.1", "squizlabs/php_codesniffer": "3.7.1",
"symfony/cache": "^4.4 || ^5.4 || ^6.0", "symfony/cache": "^4.4 || ^5.4 || ^6.0",
"symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0", "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0",
"vimeo/psalm": "4.26.0" "vimeo/psalm": "4.27.0"
}, },
"suggest": { "suggest": {
"ext-dom": "Provides support for XSD validation for XML mapping files", "ext-dom": "Provides support for XSD validation for XML mapping files",
@ -1483,9 +1485,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/orm/issues", "issues": "https://github.com/doctrine/orm/issues",
"source": "https://github.com/doctrine/orm/tree/2.13.1" "source": "https://github.com/doctrine/orm/tree/2.13.2"
}, },
"time": "2022-08-08T09:00:16+00:00" "time": "2022-09-22T13:36:43+00:00"
}, },
{ {
"name": "doctrine/persistence", "name": "doctrine/persistence",
@ -1872,16 +1874,16 @@
}, },
{ {
"name": "friendsofsymfony/rest-bundle", "name": "friendsofsymfony/rest-bundle",
"version": "3.3.0", "version": "3.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git", "url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git",
"reference": "54f5ffec4bff71b727a2aa4877915ad81358defc" "reference": "b888195589d245002880d07073ef23ab60e3795d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/54f5ffec4bff71b727a2aa4877915ad81358defc", "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/b888195589d245002880d07073ef23ab60e3795d",
"reference": "54f5ffec4bff71b727a2aa4877915ad81358defc", "reference": "b888195589d245002880d07073ef23ab60e3795d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1908,7 +1910,7 @@
"doctrine/annotations": "^1.13.2", "doctrine/annotations": "^1.13.2",
"friendsofphp/php-cs-fixer": "^3.0", "friendsofphp/php-cs-fixer": "^3.0",
"jms/serializer": "^1.13|^2.0|^3.0", "jms/serializer": "^1.13|^2.0|^3.0",
"jms/serializer-bundle": "^2.4.3|^3.0.1|^4.0", "jms/serializer-bundle": "^2.4.3|^3.0.1|^4.0|^5.0@beta",
"psr/http-message": "^1.0", "psr/http-message": "^1.0",
"psr/log": "^1.0|^2.0|^3.0", "psr/log": "^1.0|^2.0|^3.0",
"sensio/framework-extra-bundle": "^6.1", "sensio/framework-extra-bundle": "^6.1",
@ -1972,9 +1974,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/FriendsOfSymfony/FOSRestBundle/issues", "issues": "https://github.com/FriendsOfSymfony/FOSRestBundle/issues",
"source": "https://github.com/FriendsOfSymfony/FOSRestBundle/tree/3.3.0" "source": "https://github.com/FriendsOfSymfony/FOSRestBundle/tree/3.4.0"
}, },
"time": "2022-02-03T20:06:00+00:00" "time": "2022-09-18T04:54:54+00:00"
}, },
{ {
"name": "gregwar/captcha", "name": "gregwar/captcha",
@ -2617,16 +2619,16 @@
}, },
{ {
"name": "laminas/laminas-code", "name": "laminas/laminas-code",
"version": "4.6.0", "version": "4.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laminas/laminas-code.git", "url": "https://github.com/laminas/laminas-code.git",
"reference": "16ec7577ff315d53ac2e1b1f03a344d8fe680a6e" "reference": "0337d9265bc2e6376babad8c511500821620cb30"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-code/zipball/16ec7577ff315d53ac2e1b1f03a344d8fe680a6e", "url": "https://api.github.com/repos/laminas/laminas-code/zipball/0337d9265bc2e6376babad8c511500821620cb30",
"reference": "16ec7577ff315d53ac2e1b1f03a344d8fe680a6e", "reference": "0337d9265bc2e6376babad8c511500821620cb30",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2679,7 +2681,7 @@
"type": "community_bridge" "type": "community_bridge"
} }
], ],
"time": "2022-07-28T22:46:52+00:00" "time": "2022-09-13T10:33:30+00:00"
}, },
{ {
"name": "lcobucci/clock", "name": "lcobucci/clock",
@ -3029,16 +3031,16 @@
}, },
{ {
"name": "nelmio/api-doc-bundle", "name": "nelmio/api-doc-bundle",
"version": "v4.9.0", "version": "v4.10.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nelmio/NelmioApiDocBundle.git", "url": "https://github.com/nelmio/NelmioApiDocBundle.git",
"reference": "da02f3ad339437b939a6d309e9c98b62afe53c6c" "reference": "b42ac43bebe0dc3372e9feb0ef0a43ae3cfbb349"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/da02f3ad339437b939a6d309e9c98b62afe53c6c", "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/b42ac43bebe0dc3372e9feb0ef0a43ae3cfbb349",
"reference": "da02f3ad339437b939a6d309e9c98b62afe53c6c", "reference": "b42ac43bebe0dc3372e9feb0ef0a43ae3cfbb349",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3058,21 +3060,22 @@
"symfony/options-resolver": "^4.4|^5.0|^6.0", "symfony/options-resolver": "^4.4|^5.0|^6.0",
"symfony/property-info": "^4.4|^5.0|^6.0", "symfony/property-info": "^4.4|^5.0|^6.0",
"symfony/routing": "^4.4|^5.0|^6.0", "symfony/routing": "^4.4|^5.0|^6.0",
"zircote/swagger-php": "^3.2|^4.0" "zircote/swagger-php": "^4.2.15"
}, },
"conflict": { "conflict": {
"symfony/framework-bundle": "4.2.7" "symfony/framework-bundle": "4.2.7"
}, },
"require-dev": { "require-dev": {
"api-platform/core": "^2.6.8", "api-platform/core": "^2.7.0|^3@dev",
"composer/package-versions-deprecated": "1.11.99.1", "composer/package-versions-deprecated": "1.11.99.1",
"friendsofsymfony/rest-bundle": "^2.8|^3.0", "friendsofsymfony/rest-bundle": "^2.8|^3.0",
"jms/serializer": "^1.14|^3.0", "jms/serializer": "^1.14|^3.0",
"jms/serializer-bundle": "^2.3|^3.0|^4.0", "jms/serializer-bundle": "^2.3|^3.0|^4.0|^5.0@beta",
"sensio/framework-extra-bundle": "^4.4|^5.2|^6.0", "sensio/framework-extra-bundle": "^4.4|^5.2|^6.0",
"symfony/asset": "^4.4|^5.2|^6.0", "symfony/asset": "^4.4|^5.2|^6.0",
"symfony/browser-kit": "^4.4|^5.2|^6.0", "symfony/browser-kit": "^4.4|^5.2|^6.0",
"symfony/cache": "^4.4|^5.2|^6.0", "symfony/cache": "^4.4|^5.2|^6.0",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/dom-crawler": "^4.4|^5.2|^6.0", "symfony/dom-crawler": "^4.4|^5.2|^6.0",
"symfony/form": "^4.4|^5.2|^6.0", "symfony/form": "^4.4|^5.2|^6.0",
"symfony/phpunit-bridge": "^5.2", "symfony/phpunit-bridge": "^5.2",
@ -3093,8 +3096,8 @@
"symfony/form": "For describing your form type models.", "symfony/form": "For describing your form type models.",
"symfony/monolog-bundle": "For using a PSR-3 compatible logger implementation with the API PHP describer.", "symfony/monolog-bundle": "For using a PSR-3 compatible logger implementation with the API PHP describer.",
"symfony/serializer": "For describing your models.", "symfony/serializer": "For describing your models.",
"symfony/twig-bundle": "For using the Swagger UI.",
"symfony/validator": "For describing the validation constraints in your models.", "symfony/validator": "For describing the validation constraints in your models.",
"twig/twig-bundle": "For using the Swagger UI.",
"willdurand/hateoas-bundle": "For extracting HATEOAS metadata." "willdurand/hateoas-bundle": "For extracting HATEOAS metadata."
}, },
"type": "symfony-bundle", "type": "symfony-bundle",
@ -3134,22 +3137,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/nelmio/NelmioApiDocBundle/issues", "issues": "https://github.com/nelmio/NelmioApiDocBundle/issues",
"source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.9.0" "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.10.1"
}, },
"time": "2022-04-30T18:28:05+00:00" "time": "2022-09-28T20:10:51+00:00"
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v4.14.0", "version": "v4.15.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
"reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3190,9 +3193,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nikic/PHP-Parser/issues", "issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1"
}, },
"time": "2022-05-31T20:59:12+00:00" "time": "2022-09-04T07:30:47+00:00"
}, },
{ {
"name": "oneup/uploader-bundle", "name": "oneup/uploader-bundle",
@ -3289,16 +3292,16 @@
}, },
{ {
"name": "php-http/client-common", "name": "php-http/client-common",
"version": "2.5.0", "version": "2.6.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-http/client-common.git", "url": "https://github.com/php-http/client-common.git",
"reference": "d135751167d57e27c74de674d6a30cef2dc8e054" "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-http/client-common/zipball/d135751167d57e27c74de674d6a30cef2dc8e054", "url": "https://api.github.com/repos/php-http/client-common/zipball/45db684cd4e186dcdc2b9c06b22970fe123796c0",
"reference": "d135751167d57e27c74de674d6a30cef2dc8e054", "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3358,9 +3361,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-http/client-common/issues", "issues": "https://github.com/php-http/client-common/issues",
"source": "https://github.com/php-http/client-common/tree/2.5.0" "source": "https://github.com/php-http/client-common/tree/2.6.0"
}, },
"time": "2021-11-26T15:01:24+00:00" "time": "2022-09-29T09:59:43+00:00"
}, },
{ {
"name": "php-http/discovery", "name": "php-http/discovery",
@ -3838,16 +3841,16 @@
}, },
{ {
"name": "phpstan/phpdoc-parser", "name": "phpstan/phpdoc-parser",
"version": "1.7.0", "version": "1.8.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git", "url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "367a8d9d5f7da2a0136422d27ce8840583926955" "reference": "8dd908dd6156e974b9a0f8bb4cd5ad0707830f04"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/367a8d9d5f7da2a0136422d27ce8840583926955", "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/8dd908dd6156e974b9a0f8bb4cd5ad0707830f04",
"reference": "367a8d9d5f7da2a0136422d27ce8840583926955", "reference": "8dd908dd6156e974b9a0f8bb4cd5ad0707830f04",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3877,9 +3880,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types", "description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": { "support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues", "issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.7.0" "source": "https://github.com/phpstan/phpdoc-parser/tree/1.8.0"
}, },
"time": "2022-08-09T12:23:23+00:00" "time": "2022-09-04T18:59:06+00:00"
}, },
{ {
"name": "psr/cache", "name": "psr/cache",
@ -4424,20 +4427,20 @@
}, },
{ {
"name": "ramsey/uuid", "name": "ramsey/uuid",
"version": "4.4.0", "version": "4.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ramsey/uuid.git", "url": "https://github.com/ramsey/uuid.git",
"reference": "373f7bacfcf3de038778ff27dcce5672ddbf4c8a" "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/373f7bacfcf3de038778ff27dcce5672ddbf4c8a", "url": "https://api.github.com/repos/ramsey/uuid/zipball/a161a26d917604dc6d3aa25100fddf2556e9f35d",
"reference": "373f7bacfcf3de038778ff27dcce5672ddbf4c8a", "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"brick/math": "^0.8 || ^0.9 || ^0.10", "brick/math": "^0.8.8 || ^0.9 || ^0.10",
"ext-ctype": "*", "ext-ctype": "*",
"ext-json": "*", "ext-json": "*",
"php": "^8.0", "php": "^8.0",
@ -4458,12 +4461,13 @@
"php-mock/php-mock-mockery": "^1.3", "php-mock/php-mock-mockery": "^1.3",
"php-parallel-lint/php-parallel-lint": "^1.1", "php-parallel-lint/php-parallel-lint": "^1.1",
"phpbench/phpbench": "^1.0", "phpbench/phpbench": "^1.0",
"phpstan/extension-installer": "^1.0", "phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^0.12", "phpstan/phpstan": "^1.8",
"phpstan/phpstan-mockery": "^0.12", "phpstan/phpstan-mockery": "^1.1",
"phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-phpunit": "^1.1",
"phpunit/phpunit": "^8.5 || ^9", "phpunit/phpunit": "^8.5 || ^9",
"slevomat/coding-standard": "^7.0", "ramsey/composer-repl": "^1.4",
"slevomat/coding-standard": "^8.4",
"squizlabs/php_codesniffer": "^3.5", "squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "^4.9" "vimeo/psalm": "^4.9"
}, },
@ -4501,7 +4505,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/ramsey/uuid/issues", "issues": "https://github.com/ramsey/uuid/issues",
"source": "https://github.com/ramsey/uuid/tree/4.4.0" "source": "https://github.com/ramsey/uuid/tree/4.5.1"
}, },
"funding": [ "funding": [
{ {
@ -4513,20 +4517,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-05T17:58:37+00:00" "time": "2022-09-16T03:22:46+00:00"
}, },
{ {
"name": "sensio/framework-extra-bundle", "name": "sensio/framework-extra-bundle",
"version": "v6.2.6", "version": "v6.2.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git",
"reference": "6bd976c99ef3f78e31c9490a10ba6dd8901076eb" "reference": "bb962f8aed09e60b0942545f6e4842ffeee4aafd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/6bd976c99ef3f78e31c9490a10ba6dd8901076eb", "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb962f8aed09e60b0942545f6e4842ffeee4aafd",
"reference": "6bd976c99ef3f78e31c9490a10ba6dd8901076eb", "reference": "bb962f8aed09e60b0942545f6e4842ffeee4aafd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4589,9 +4593,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues",
"source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.6" "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.8"
}, },
"time": "2022-01-14T11:51:13+00:00" "time": "2022-09-05T16:44:56+00:00"
}, },
{ {
"name": "sentry/sdk", "name": "sentry/sdk",
@ -4652,16 +4656,16 @@
}, },
{ {
"name": "sentry/sentry", "name": "sentry/sentry",
"version": "3.7.0", "version": "3.8.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/getsentry/sentry-php.git", "url": "https://github.com/getsentry/sentry-php.git",
"reference": "877bca3f0f0ac0fc8ec0a218c6070cccea266795" "reference": "5150776a0a9835c4ea56ff0ecd94e0a109b6c163"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/getsentry/sentry-php/zipball/877bca3f0f0ac0fc8ec0a218c6070cccea266795", "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/5150776a0a9835c4ea56ff0ecd94e0a109b6c163",
"reference": "877bca3f0f0ac0fc8ec0a218c6070cccea266795", "reference": "5150776a0a9835c4ea56ff0ecd94e0a109b6c163",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4680,8 +4684,7 @@
"psr/http-message-implementation": "^1.0", "psr/http-message-implementation": "^1.0",
"psr/log": "^1.0|^2.0|^3.0", "psr/log": "^1.0|^2.0|^3.0",
"symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0", "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0",
"symfony/polyfill-php80": "^1.17", "symfony/polyfill-php80": "^1.17"
"symfony/polyfill-uuid": "^1.13.1"
}, },
"conflict": { "conflict": {
"php-http/client-common": "1.8.0", "php-http/client-common": "1.8.0",
@ -4707,7 +4710,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "3.7.x-dev" "dev-master": "3.8.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -4741,7 +4744,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/getsentry/sentry-php/issues", "issues": "https://github.com/getsentry/sentry-php/issues",
"source": "https://github.com/getsentry/sentry-php/tree/3.7.0" "source": "https://github.com/getsentry/sentry-php/tree/3.8.1"
}, },
"funding": [ "funding": [
{ {
@ -4753,7 +4756,7 @@
"type": "custom" "type": "custom"
} }
], ],
"time": "2022-07-18T07:55:36+00:00" "time": "2022-09-21T11:01:17+00:00"
}, },
{ {
"name": "sentry/sentry-symfony", "name": "sentry/sentry-symfony",
@ -4872,16 +4875,16 @@
}, },
{ {
"name": "stella-maris/clock", "name": "stella-maris/clock",
"version": "0.1.5", "version": "0.1.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "git@gitlab.com:stella-maris/clock.git", "url": "https://github.com/stella-maris-solutions/clock.git",
"reference": "447879c53ca0b2a762cdbfba5e76ccf4deca9158" "reference": "a94228dac03c9a8411198ce8c8dacbbe99c930c3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://gitlab.com/api/v4/projects/stella-maris%2Fclock/repository/archive.zip?sha=447879c53ca0b2a762cdbfba5e76ccf4deca9158", "url": "https://api.github.com/repos/stella-maris-solutions/clock/zipball/a94228dac03c9a8411198ce8c8dacbbe99c930c3",
"reference": "447879c53ca0b2a762cdbfba5e76ccf4deca9158", "reference": "a94228dac03c9a8411198ce8c8dacbbe99c930c3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4911,20 +4914,24 @@
"point in time", "point in time",
"psr20" "psr20"
], ],
"time": "2022-08-05T07:21:25+00:00" "support": {
"issues": "https://github.com/stella-maris-solutions/clock/issues",
"source": "https://github.com/stella-maris-solutions/clock/tree/0.1.6"
},
"time": "2022-09-27T15:03:11+00:00"
}, },
{ {
"name": "symfony/asset", "name": "symfony/asset",
"version": "v6.1.0", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/asset.git", "url": "https://github.com/symfony/asset.git",
"reference": "dc6f572f142627d42ba88a42ea34f79d3776ee6c" "reference": "6065b5edc36442cb1ba98dc40f7c7f6b9e154729"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/asset/zipball/dc6f572f142627d42ba88a42ea34f79d3776ee6c", "url": "https://api.github.com/repos/symfony/asset/zipball/6065b5edc36442cb1ba98dc40f7c7f6b9e154729",
"reference": "dc6f572f142627d42ba88a42ea34f79d3776ee6c", "reference": "6065b5edc36442cb1ba98dc40f7c7f6b9e154729",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4967,7 +4974,7 @@
"description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/asset/tree/v6.1.0" "source": "https://github.com/symfony/asset/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -4983,20 +4990,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-04-14T08:23:11+00:00" "time": "2022-08-31T08:17:45+00:00"
}, },
{ {
"name": "symfony/cache", "name": "symfony/cache",
"version": "v6.1.3", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/cache.git", "url": "https://github.com/symfony/cache.git",
"reference": "5cf8e75f02932818889e0609380b8d5427a6c86c" "reference": "9ae74e40fde37aba127ad5db65c5193f41f86f95"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/5cf8e75f02932818889e0609380b8d5427a6c86c", "url": "https://api.github.com/repos/symfony/cache/zipball/9ae74e40fde37aba127ad5db65c5193f41f86f95",
"reference": "5cf8e75f02932818889e0609380b8d5427a6c86c", "reference": "9ae74e40fde37aba127ad5db65c5193f41f86f95",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5056,14 +5063,14 @@
"homepage": "https://symfony.com/contributors" "homepage": "https://symfony.com/contributors"
} }
], ],
"description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"keywords": [ "keywords": [
"caching", "caching",
"psr6" "psr6"
], ],
"support": { "support": {
"source": "https://github.com/symfony/cache/tree/v6.1.3" "source": "https://github.com/symfony/cache/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -5079,7 +5086,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-29T07:42:06+00:00" "time": "2022-09-08T09:34:40+00:00"
}, },
{ {
"name": "symfony/cache-contracts", "name": "symfony/cache-contracts",
@ -5239,16 +5246,16 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "7fccea8728aa2d431a6725b02b3ce759049fc84d" "reference": "17524a64ebcfab68d237bbed247e9a9917747096"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/7fccea8728aa2d431a6725b02b3ce759049fc84d", "url": "https://api.github.com/repos/symfony/console/zipball/17524a64ebcfab68d237bbed247e9a9917747096",
"reference": "7fccea8728aa2d431a6725b02b3ce759049fc84d", "reference": "17524a64ebcfab68d237bbed247e9a9917747096",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5315,7 +5322,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v6.1.4" "source": "https://github.com/symfony/console/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -5331,20 +5338,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-26T10:32:31+00:00" "time": "2022-09-03T14:24:42+00:00"
}, },
{ {
"name": "symfony/dependency-injection", "name": "symfony/dependency-injection",
"version": "v6.1.3", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/dependency-injection.git", "url": "https://github.com/symfony/dependency-injection.git",
"reference": "079e336a1880f457b219aecc3d41bef2f1093b0b" "reference": "b9c797c9d56afc290d4265854bafd01b4e379240"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/079e336a1880f457b219aecc3d41bef2f1093b0b", "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b9c797c9d56afc290d4265854bafd01b4e379240",
"reference": "079e336a1880f457b219aecc3d41bef2f1093b0b", "reference": "b9c797c9d56afc290d4265854bafd01b4e379240",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5402,7 +5409,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application", "description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/dependency-injection/tree/v6.1.3" "source": "https://github.com/symfony/dependency-injection/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -5418,7 +5425,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-20T13:46:29+00:00" "time": "2022-09-28T16:00:52+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
@ -5489,16 +5496,16 @@
}, },
{ {
"name": "symfony/doctrine-bridge", "name": "symfony/doctrine-bridge",
"version": "v6.1.3", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/doctrine-bridge.git", "url": "https://github.com/symfony/doctrine-bridge.git",
"reference": "68b53b14f337dbc6f92cf6f1656a0adad42482e0" "reference": "ca0fdecd106f81d6bd7f123e77b5830c558e1148"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/68b53b14f337dbc6f92cf6f1656a0adad42482e0", "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/ca0fdecd106f81d6bd7f123e77b5830c558e1148",
"reference": "68b53b14f337dbc6f92cf6f1656a0adad42482e0", "reference": "ca0fdecd106f81d6bd7f123e77b5830c558e1148",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5584,7 +5591,7 @@
"description": "Provides integration for Doctrine with various Symfony components", "description": "Provides integration for Doctrine with various Symfony components",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/doctrine-bridge/tree/v6.1.3" "source": "https://github.com/symfony/doctrine-bridge/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -5600,7 +5607,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-29T07:42:06+00:00" "time": "2022-09-08T09:34:40+00:00"
}, },
{ {
"name": "symfony/doctrine-messenger", "name": "symfony/doctrine-messenger",
@ -6045,16 +6052,16 @@
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "3f39c04d2630c34019907b02f85672dac99f8659" "reference": "4d216a2beef096edf040a070117c39ca2abce307"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/3f39c04d2630c34019907b02f85672dac99f8659", "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d216a2beef096edf040a070117c39ca2abce307",
"reference": "3f39c04d2630c34019907b02f85672dac99f8659", "reference": "4d216a2beef096edf040a070117c39ca2abce307",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6088,7 +6095,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v6.1.4" "source": "https://github.com/symfony/filesystem/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -6104,7 +6111,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-02T16:17:38+00:00" "time": "2022-09-21T20:29:40+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
@ -6237,16 +6244,16 @@
}, },
{ {
"name": "symfony/form", "name": "symfony/form",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/form.git", "url": "https://github.com/symfony/form.git",
"reference": "0a1a3ea071a216e2902cebe0b47750ca51f12f27" "reference": "176a358d54c70ec70708c7cbb4e8ac93cc138e6c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/form/zipball/0a1a3ea071a216e2902cebe0b47750ca51f12f27", "url": "https://api.github.com/repos/symfony/form/zipball/176a358d54c70ec70708c7cbb4e8ac93cc138e6c",
"reference": "0a1a3ea071a216e2902cebe0b47750ca51f12f27", "reference": "176a358d54c70ec70708c7cbb4e8ac93cc138e6c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6319,7 +6326,7 @@
"description": "Allows to easily create, process and reuse HTML forms", "description": "Allows to easily create, process and reuse HTML forms",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/form/tree/v6.1.4" "source": "https://github.com/symfony/form/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -6335,20 +6342,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-09T09:57:18+00:00" "time": "2022-09-09T09:34:27+00:00"
}, },
{ {
"name": "symfony/framework-bundle", "name": "symfony/framework-bundle",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/framework-bundle.git", "url": "https://github.com/symfony/framework-bundle.git",
"reference": "4fabea93ce983b0d86512764ca852c683cc4730b" "reference": "be33f4a8b58e40c3ad876537ece359af374eb030"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/4fabea93ce983b0d86512764ca852c683cc4730b", "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/be33f4a8b58e40c3ad876537ece359af374eb030",
"reference": "4fabea93ce983b0d86512764ca852c683cc4730b", "reference": "be33f4a8b58e40c3ad876537ece359af374eb030",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6470,7 +6477,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/framework-bundle/tree/v6.1.4" "source": "https://github.com/symfony/framework-bundle/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -6486,20 +6493,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-26T10:32:31+00:00" "time": "2022-09-29T11:04:32+00:00"
}, },
{ {
"name": "symfony/http-client", "name": "symfony/http-client",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-client.git", "url": "https://github.com/symfony/http-client.git",
"reference": "06dc27cbdcee26d6796c226db5266a0d58359739" "reference": "565b0f2ce2c5882e89b3ef5e255d7e0478b9c675"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/06dc27cbdcee26d6796c226db5266a0d58359739", "url": "https://api.github.com/repos/symfony/http-client/zipball/565b0f2ce2c5882e89b3ef5e255d7e0478b9c675",
"reference": "06dc27cbdcee26d6796c226db5266a0d58359739", "reference": "565b0f2ce2c5882e89b3ef5e255d7e0478b9c675",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6554,7 +6561,7 @@
"description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-client/tree/v6.1.4" "source": "https://github.com/symfony/http-client/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -6570,7 +6577,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-02T16:17:38+00:00" "time": "2022-09-09T09:34:27+00:00"
}, },
{ {
"name": "symfony/http-client-contracts", "name": "symfony/http-client-contracts",
@ -6655,16 +6662,16 @@
}, },
{ {
"name": "symfony/http-foundation", "name": "symfony/http-foundation",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-foundation.git", "url": "https://github.com/symfony/http-foundation.git",
"reference": "18e0f106a32887bcebef757e5b39c88e39a08f20" "reference": "90f5d9726942db69490fe467a3acb5e7154fd555"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/18e0f106a32887bcebef757e5b39c88e39a08f20", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/90f5d9726942db69490fe467a3acb5e7154fd555",
"reference": "18e0f106a32887bcebef757e5b39c88e39a08f20", "reference": "90f5d9726942db69490fe467a3acb5e7154fd555",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6710,7 +6717,7 @@
"description": "Defines an object-oriented layer for the HTTP specification", "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-foundation/tree/v6.1.4" "source": "https://github.com/symfony/http-foundation/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -6726,20 +6733,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-19T14:27:04+00:00" "time": "2022-09-17T07:55:45+00:00"
}, },
{ {
"name": "symfony/http-kernel", "name": "symfony/http-kernel",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-kernel.git", "url": "https://github.com/symfony/http-kernel.git",
"reference": "2144c53a278254af57fa1e6f71427be656fab6f4" "reference": "bf433ef30c2dfbf1f47449d5dce8be243e8a0012"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/2144c53a278254af57fa1e6f71427be656fab6f4", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/bf433ef30c2dfbf1f47449d5dce8be243e8a0012",
"reference": "2144c53a278254af57fa1e6f71427be656fab6f4", "reference": "bf433ef30c2dfbf1f47449d5dce8be243e8a0012",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6820,7 +6827,7 @@
"description": "Provides a structured process for converting a Request into a Response", "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-kernel/tree/v6.1.4" "source": "https://github.com/symfony/http-kernel/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -6836,7 +6843,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-26T14:50:30+00:00" "time": "2022-09-30T08:10:57+00:00"
}, },
{ {
"name": "symfony/intl", "name": "symfony/intl",
@ -6997,16 +7004,16 @@
}, },
{ {
"name": "symfony/mailer", "name": "symfony/mailer",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/mailer.git", "url": "https://github.com/symfony/mailer.git",
"reference": "55a7cb8f8518d35e2a039daaec6e1ee20509510e" "reference": "e1b32deb9efc48def0c76b876860ad36f2123e89"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/mailer/zipball/55a7cb8f8518d35e2a039daaec6e1ee20509510e", "url": "https://api.github.com/repos/symfony/mailer/zipball/e1b32deb9efc48def0c76b876860ad36f2123e89",
"reference": "55a7cb8f8518d35e2a039daaec6e1ee20509510e", "reference": "e1b32deb9efc48def0c76b876860ad36f2123e89",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7051,7 +7058,7 @@
"description": "Helps sending emails", "description": "Helps sending emails",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/mailer/tree/v6.1.4" "source": "https://github.com/symfony/mailer/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -7067,20 +7074,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-03T05:16:05+00:00" "time": "2022-08-29T06:58:39+00:00"
}, },
{ {
"name": "symfony/maker-bundle", "name": "symfony/maker-bundle",
"version": "v1.45.0", "version": "v1.46.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/maker-bundle.git", "url": "https://github.com/symfony/maker-bundle.git",
"reference": "7ae4ff28ac1b6d6d55591999026040d58b8a3967" "reference": "682ce4fc6602acad33653ba0194d922356fd81f9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/maker-bundle/zipball/7ae4ff28ac1b6d6d55591999026040d58b8a3967", "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/682ce4fc6602acad33653ba0194d922356fd81f9",
"reference": "7ae4ff28ac1b6d6d55591999026040d58b8a3967", "reference": "682ce4fc6602acad33653ba0194d922356fd81f9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7144,7 +7151,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/symfony/maker-bundle/issues", "issues": "https://github.com/symfony/maker-bundle/issues",
"source": "https://github.com/symfony/maker-bundle/tree/v1.45.0" "source": "https://github.com/symfony/maker-bundle/tree/v1.46.0"
}, },
"funding": [ "funding": [
{ {
@ -7160,7 +7167,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-26T12:31:45+00:00" "time": "2022-09-23T13:30:21+00:00"
}, },
{ {
"name": "symfony/mercure", "name": "symfony/mercure",
@ -7331,16 +7338,16 @@
}, },
{ {
"name": "symfony/messenger", "name": "symfony/messenger",
"version": "v6.1.3", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/messenger.git", "url": "https://github.com/symfony/messenger.git",
"reference": "8d36b2447ed50a92a21f031bc6d3a3fefbe73bf3" "reference": "2ca8a6b074cd6682dcaeba90464eb90d9455317a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/messenger/zipball/8d36b2447ed50a92a21f031bc6d3a3fefbe73bf3", "url": "https://api.github.com/repos/symfony/messenger/zipball/2ca8a6b074cd6682dcaeba90464eb90d9455317a",
"reference": "8d36b2447ed50a92a21f031bc6d3a3fefbe73bf3", "reference": "2ca8a6b074cd6682dcaeba90464eb90d9455317a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7397,7 +7404,7 @@
"description": "Helps applications send and receive messages to/from other applications or via message queues", "description": "Helps applications send and receive messages to/from other applications or via message queues",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/messenger/tree/v6.1.3" "source": "https://github.com/symfony/messenger/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -7413,20 +7420,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-20T13:46:29+00:00" "time": "2022-09-17T07:55:45+00:00"
}, },
{ {
"name": "symfony/mime", "name": "symfony/mime",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/mime.git", "url": "https://github.com/symfony/mime.git",
"reference": "5d1de2d3c52f8ca469c488f4b9e007e9e9cee0b3" "reference": "d521b2204f7dcebe81c1b5fb99ed70dfb6f34b4b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/5d1de2d3c52f8ca469c488f4b9e007e9e9cee0b3", "url": "https://api.github.com/repos/symfony/mime/zipball/d521b2204f7dcebe81c1b5fb99ed70dfb6f34b4b",
"reference": "5d1de2d3c52f8ca469c488f4b9e007e9e9cee0b3", "reference": "d521b2204f7dcebe81c1b5fb99ed70dfb6f34b4b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7478,7 +7485,7 @@
"mime-type" "mime-type"
], ],
"support": { "support": {
"source": "https://github.com/symfony/mime/tree/v6.1.4" "source": "https://github.com/symfony/mime/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -7494,7 +7501,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-19T14:27:04+00:00" "time": "2022-09-02T08:05:20+00:00"
}, },
{ {
"name": "symfony/monolog-bridge", "name": "symfony/monolog-bridge",
@ -8297,88 +8304,6 @@
], ],
"time": "2022-05-24T11:49:31+00:00" "time": "2022-05-24T11:49:31+00:00"
}, },
{
"name": "symfony/polyfill-uuid",
"version": "v1.26.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-uuid.git",
"reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/a41886c1c81dc075a09c71fe6db5b9d68c79de23",
"reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"provide": {
"ext-uuid": "*"
},
"suggest": {
"ext-uuid": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Uuid\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Grégoire Pineau",
"email": "lyrixx@lyrixx.info"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for uuid functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"uuid"
],
"support": {
"source": "https://github.com/symfony/polyfill-uuid/tree/v1.26.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
},
{ {
"name": "symfony/process", "name": "symfony/process",
"version": "v6.1.3", "version": "v6.1.3",
@ -8676,16 +8601,16 @@
}, },
{ {
"name": "symfony/psr-http-message-bridge", "name": "symfony/psr-http-message-bridge",
"version": "v2.1.2", "version": "v2.1.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/psr-http-message-bridge.git", "url": "https://github.com/symfony/psr-http-message-bridge.git",
"reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34" "reference": "d444f85dddf65c7e57c58d8e5b3a4dbb593b1840"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34", "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/d444f85dddf65c7e57c58d8e5b3a4dbb593b1840",
"reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34", "reference": "d444f85dddf65c7e57c58d8e5b3a4dbb593b1840",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8744,7 +8669,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/symfony/psr-http-message-bridge/issues", "issues": "https://github.com/symfony/psr-http-message-bridge/issues",
"source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.2" "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.3"
}, },
"funding": [ "funding": [
{ {
@ -8760,20 +8685,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-11-05T13:13:39+00:00" "time": "2022-09-05T10:34:54+00:00"
}, },
{ {
"name": "symfony/routing", "name": "symfony/routing",
"version": "v6.1.3", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/routing.git", "url": "https://github.com/symfony/routing.git",
"reference": "ef9108b3a88045b7546e808fb404ddb073dd35ea" "reference": "f8c1ebb43d0f39e5ecd12a732ba1952a3dd8455c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/ef9108b3a88045b7546e808fb404ddb073dd35ea", "url": "https://api.github.com/repos/symfony/routing/zipball/f8c1ebb43d0f39e5ecd12a732ba1952a3dd8455c",
"reference": "ef9108b3a88045b7546e808fb404ddb073dd35ea", "reference": "f8c1ebb43d0f39e5ecd12a732ba1952a3dd8455c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8832,7 +8757,7 @@
"url" "url"
], ],
"support": { "support": {
"source": "https://github.com/symfony/routing/tree/v6.1.3" "source": "https://github.com/symfony/routing/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -8848,7 +8773,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-20T15:00:40+00:00" "time": "2022-09-09T09:26:14+00:00"
}, },
{ {
"name": "symfony/runtime", "name": "symfony/runtime",
@ -9028,16 +8953,16 @@
}, },
{ {
"name": "symfony/security-core", "name": "symfony/security-core",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-core.git", "url": "https://github.com/symfony/security-core.git",
"reference": "a3e6ee1e0bafb22418fb602445631c9d5849055c" "reference": "ddba1c08f084ac851c41eab99243db7c42ebf189"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-core/zipball/a3e6ee1e0bafb22418fb602445631c9d5849055c", "url": "https://api.github.com/repos/symfony/security-core/zipball/ddba1c08f084ac851c41eab99243db7c42ebf189",
"reference": "a3e6ee1e0bafb22418fb602445631c9d5849055c", "reference": "ddba1c08f084ac851c41eab99243db7c42ebf189",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9099,7 +9024,7 @@
"description": "Symfony Security Component - Core Library", "description": "Symfony Security Component - Core Library",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-core/tree/v6.1.4" "source": "https://github.com/symfony/security-core/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -9115,7 +9040,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-19T14:27:04+00:00" "time": "2022-09-17T07:55:45+00:00"
}, },
{ {
"name": "symfony/security-csrf", "name": "symfony/security-csrf",
@ -9190,16 +9115,16 @@
}, },
{ {
"name": "symfony/security-http", "name": "symfony/security-http",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-http.git", "url": "https://github.com/symfony/security-http.git",
"reference": "a106f0f55e9942da5aa9181fbf2175512f583449" "reference": "c2d2e1b388c241992f50d7468bc4a3000b4a44cd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-http/zipball/a106f0f55e9942da5aa9181fbf2175512f583449", "url": "https://api.github.com/repos/symfony/security-http/zipball/c2d2e1b388c241992f50d7468bc4a3000b4a44cd",
"reference": "a106f0f55e9942da5aa9181fbf2175512f583449", "reference": "c2d2e1b388c241992f50d7468bc4a3000b4a44cd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9253,7 +9178,7 @@
"description": "Symfony Security Component - HTTP Integration", "description": "Symfony Security Component - HTTP Integration",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-http/tree/v6.1.4" "source": "https://github.com/symfony/security-http/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -9269,20 +9194,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-26T10:32:31+00:00" "time": "2022-09-11T09:45:03+00:00"
}, },
{ {
"name": "symfony/serializer", "name": "symfony/serializer",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/serializer.git", "url": "https://github.com/symfony/serializer.git",
"reference": "03e5987dd9bb98038c60c7af3e58500c81c4aec1" "reference": "0986800f0c394bd46443afbf0a05c4386ffa1cd6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/serializer/zipball/03e5987dd9bb98038c60c7af3e58500c81c4aec1", "url": "https://api.github.com/repos/symfony/serializer/zipball/0986800f0c394bd46443afbf0a05c4386ffa1cd6",
"reference": "03e5987dd9bb98038c60c7af3e58500c81c4aec1", "reference": "0986800f0c394bd46443afbf0a05c4386ffa1cd6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9354,7 +9279,7 @@
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/serializer/tree/v6.1.4" "source": "https://github.com/symfony/serializer/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -9370,7 +9295,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-26T10:32:31+00:00" "time": "2022-09-29T11:04:32+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
@ -9459,16 +9384,16 @@
}, },
{ {
"name": "symfony/stopwatch", "name": "symfony/stopwatch",
"version": "v6.1.0", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/stopwatch.git", "url": "https://github.com/symfony/stopwatch.git",
"reference": "77dedae82ce2a26e2e9b481855473fc3b3e4e54d" "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/77dedae82ce2a26e2e9b481855473fc3b3e4e54d", "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7",
"reference": "77dedae82ce2a26e2e9b481855473fc3b3e4e54d", "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9501,7 +9426,7 @@
"description": "Provides a way to profile code", "description": "Provides a way to profile code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/stopwatch/tree/v6.1.0" "source": "https://github.com/symfony/stopwatch/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -9517,20 +9442,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-25T11:15:52+00:00" "time": "2022-09-28T16:00:52+00:00"
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "290972cad7b364e3befaa74ba0ec729800fb161c" "reference": "17c08b068176996a1d7db8d00ffae3c248267016"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/290972cad7b364e3befaa74ba0ec729800fb161c", "url": "https://api.github.com/repos/symfony/string/zipball/17c08b068176996a1d7db8d00ffae3c248267016",
"reference": "290972cad7b364e3befaa74ba0ec729800fb161c", "reference": "17c08b068176996a1d7db8d00ffae3c248267016",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9586,7 +9511,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v6.1.4" "source": "https://github.com/symfony/string/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -9602,7 +9527,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-12T18:05:43+00:00" "time": "2022-09-02T08:05:20+00:00"
}, },
{ {
"name": "symfony/templating", "name": "symfony/templating",
@ -10059,16 +9984,16 @@
}, },
{ {
"name": "symfony/validator", "name": "symfony/validator",
"version": "v6.1.4", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/validator.git", "url": "https://github.com/symfony/validator.git",
"reference": "14ec426b9c8ca8cf02bd863a645fb0cc0d73db79" "reference": "7d7724f550e0f657a591831a7c31e25678ff8779"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/validator/zipball/14ec426b9c8ca8cf02bd863a645fb0cc0d73db79", "url": "https://api.github.com/repos/symfony/validator/zipball/7d7724f550e0f657a591831a7c31e25678ff8779",
"reference": "14ec426b9c8ca8cf02bd863a645fb0cc0d73db79", "reference": "7d7724f550e0f657a591831a7c31e25678ff8779",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10147,7 +10072,7 @@
"description": "Provides tools to validate values", "description": "Provides tools to validate values",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/validator/tree/v6.1.4" "source": "https://github.com/symfony/validator/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -10163,20 +10088,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-12T13:09:07+00:00" "time": "2022-09-17T07:55:45+00:00"
}, },
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
"version": "v6.1.3", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-dumper.git", "url": "https://github.com/symfony/var-dumper.git",
"reference": "d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427" "reference": "d0833493fb2413a86f522fb54a1896a7718e98ec"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d0833493fb2413a86f522fb54a1896a7718e98ec",
"reference": "d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427", "reference": "d0833493fb2413a86f522fb54a1896a7718e98ec",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10235,7 +10160,7 @@
"dump" "dump"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-dumper/tree/v6.1.3" "source": "https://github.com/symfony/var-dumper/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -10251,7 +10176,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-20T13:46:29+00:00" "time": "2022-09-08T09:34:40+00:00"
}, },
{ {
"name": "symfony/var-exporter", "name": "symfony/var-exporter",
@ -10696,16 +10621,16 @@
}, },
{ {
"name": "twig/twig", "name": "twig/twig",
"version": "v3.4.2", "version": "v3.4.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/twigphp/Twig.git", "url": "https://github.com/twigphp/Twig.git",
"reference": "e07cdd3d430cd7e453c31b36eb5ad6c0c5e43077" "reference": "c38fd6b0b7f370c198db91ffd02e23b517426b58"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/e07cdd3d430cd7e453c31b36eb5ad6c0c5e43077", "url": "https://api.github.com/repos/twigphp/Twig/zipball/c38fd6b0b7f370c198db91ffd02e23b517426b58",
"reference": "e07cdd3d430cd7e453c31b36eb5ad6c0c5e43077", "reference": "c38fd6b0b7f370c198db91ffd02e23b517426b58",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10756,7 +10681,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/twigphp/Twig/issues", "issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.4.2" "source": "https://github.com/twigphp/Twig/tree/v3.4.3"
}, },
"funding": [ "funding": [
{ {
@ -10768,7 +10693,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-08-12T06:47:24+00:00" "time": "2022-09-28T08:42:51+00:00"
}, },
{ {
"name": "webmozart/assert", "name": "webmozart/assert",
@ -10929,16 +10854,16 @@
}, },
{ {
"name": "zircote/swagger-php", "name": "zircote/swagger-php",
"version": "4.4.8", "version": "4.4.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/zircote/swagger-php.git", "url": "https://github.com/zircote/swagger-php.git",
"reference": "34c0980c4cd4f32a1a43f995463001e450d18896" "reference": "0c1cdd31e8cfeb7116c54696aafdab9c778070fd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/zircote/swagger-php/zipball/34c0980c4cd4f32a1a43f995463001e450d18896", "url": "https://api.github.com/repos/zircote/swagger-php/zipball/0c1cdd31e8cfeb7116c54696aafdab9c778070fd",
"reference": "34c0980c4cd4f32a1a43f995463001e450d18896", "reference": "0c1cdd31e8cfeb7116c54696aafdab9c778070fd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -11000,9 +10925,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/zircote/swagger-php/issues", "issues": "https://github.com/zircote/swagger-php/issues",
"source": "https://github.com/zircote/swagger-php/tree/4.4.8" "source": "https://github.com/zircote/swagger-php/tree/4.4.9"
}, },
"time": "2022-08-16T23:21:13+00:00" "time": "2022-09-11T20:51:43+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [
@ -11247,16 +11172,16 @@
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.16", "version": "9.2.17",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "2593003befdcc10db5e213f9f28814f5aa8ac073" "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2593003befdcc10db5e213f9f28814f5aa8ac073", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8",
"reference": "2593003befdcc10db5e213f9f28814f5aa8ac073", "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -11312,7 +11237,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.16" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17"
}, },
"funding": [ "funding": [
{ {
@ -11320,7 +11245,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-08-20T05:26:47+00:00" "time": "2022-08-30T12:24:04+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@ -11565,16 +11490,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.5.23", "version": "9.5.25",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "888556852e7e9bbeeedb9656afe46118765ade34" "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/888556852e7e9bbeeedb9656afe46118765ade34", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"reference": "888556852e7e9bbeeedb9656afe46118765ade34", "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -11596,14 +11521,14 @@
"phpunit/php-timer": "^5.0.2", "phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1", "sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6", "sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5", "sebastian/comparator": "^4.0.8",
"sebastian/diff": "^4.0.3", "sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3", "sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3", "sebastian/exporter": "^4.0.5",
"sebastian/global-state": "^5.0.1", "sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3", "sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3", "sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^3.0", "sebastian/type": "^3.2",
"sebastian/version": "^3.0.2" "sebastian/version": "^3.0.2"
}, },
"suggest": { "suggest": {
@ -11647,7 +11572,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.23" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25"
}, },
"funding": [ "funding": [
{ {
@ -11657,9 +11582,13 @@
{ {
"url": "https://github.com/sebastianbergmann", "url": "https://github.com/sebastianbergmann",
"type": "github" "type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
"type": "tidelift"
} }
], ],
"time": "2022-08-22T14:01:36+00:00" "time": "2022-09-25T03:44:45+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@ -11830,16 +11759,16 @@
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "4.0.6", "version": "4.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382" "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382", "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -11892,7 +11821,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues", "issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
}, },
"funding": [ "funding": [
{ {
@ -11900,7 +11829,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2020-10-26T15:49:45+00:00" "time": "2022-09-14T12:41:17+00:00"
}, },
{ {
"name": "sebastian/complexity", "name": "sebastian/complexity",
@ -12090,16 +12019,16 @@
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",
"version": "4.0.4", "version": "4.0.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git", "url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -12155,7 +12084,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues", "issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
}, },
"funding": [ "funding": [
{ {
@ -12163,7 +12092,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2021-11-11T14:18:36+00:00" "time": "2022-09-14T06:03:37+00:00"
}, },
{ {
"name": "sebastian/global-state", "name": "sebastian/global-state",
@ -12518,16 +12447,16 @@
}, },
{ {
"name": "sebastian/type", "name": "sebastian/type",
"version": "3.1.0", "version": "3.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/type.git", "url": "https://github.com/sebastianbergmann/type.git",
"reference": "fb44e1cc6e557418387ad815780360057e40753e" "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb44e1cc6e557418387ad815780360057e40753e", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"reference": "fb44e1cc6e557418387ad815780360057e40753e", "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -12539,7 +12468,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "3.1-dev" "dev-master": "3.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -12562,7 +12491,7 @@
"homepage": "https://github.com/sebastianbergmann/type", "homepage": "https://github.com/sebastianbergmann/type",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/type/issues", "issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/3.1.0" "source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
}, },
"funding": [ "funding": [
{ {
@ -12570,7 +12499,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-08-29T06:55:37+00:00" "time": "2022-09-12T14:47:03+00:00"
}, },
{ {
"name": "sebastian/version", "name": "sebastian/version",
@ -12994,16 +12923,16 @@
}, },
{ {
"name": "symfony/web-profiler-bundle", "name": "symfony/web-profiler-bundle",
"version": "v6.1.2", "version": "v6.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/web-profiler-bundle.git", "url": "https://github.com/symfony/web-profiler-bundle.git",
"reference": "6589c2ee4b94d7df2f8ca160ec41265fee3f33eb" "reference": "7e9381a776881a32e59d8072beac6859e2ddbbc7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6589c2ee4b94d7df2f8ca160ec41265fee3f33eb", "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/7e9381a776881a32e59d8072beac6859e2ddbbc7",
"reference": "6589c2ee4b94d7df2f8ca160ec41265fee3f33eb", "reference": "7e9381a776881a32e59d8072beac6859e2ddbbc7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -13052,7 +12981,7 @@
"description": "Provides a development tool that gives detailed information about the execution of any request", "description": "Provides a development tool that gives detailed information about the execution of any request",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/web-profiler-bundle/tree/v6.1.2" "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.1.5"
}, },
"funding": [ "funding": [
{ {
@ -13068,7 +12997,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-06-12T09:53:37+00:00" "time": "2022-08-31T08:17:45+00:00"
}, },
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",

View File

@ -18,6 +18,7 @@ security:
pattern: ^/ pattern: ^/
provider: main provider: main
context: maincontext context: maincontext
user_checker: App\Service\UserChecker
form_login: form_login:
login_path: app_login login_path: app_login
check_path: app_login check_path: app_login
@ -32,8 +33,11 @@ security:
target: app_home target: app_home
access_control: access_control:
- { path: ^/user, roles: [ROLE_ADMIN, ROLE_MODO, ROLE_ANIM, ROLE_USER] } - { path: ^/all, roles: [ROLE_ADMIN, ROLE_MODO, ROLE_MASTER, ROLE_MANAGER, ROLE_USER] }
- { path: ^/modo, roles: [ROLE_ADMIN, ROLE_MODO] } - { path: ^/user, roles: [ROLE_USER] }
- { path: ^/manager, roles: [ROLE_MANAGER] }
- { path: ^/master, roles: [ROLE_MASTER] }
- { path: ^/modo, roles: [ROLE_MODO] }
- { path: ^/admin, roles: [ROLE_ADMIN] } - { path: ^/admin, roles: [ROLE_ADMIN] }
when@test: when@test:

View File

@ -12,7 +12,20 @@ twig:
appSynchro: '%appSynchro%' appSynchro: '%appSynchro%'
appSynchroPurgeUser: '%appSynchroPurgeUser%' appSynchroPurgeUser: '%appSynchroPurgeUser%'
appNiveau01label: '%appNiveau01label%' appNiveau01label: '%appNiveau01label%'
appNiveau01labels: '%appNiveau01labels%'
appNiveau02use: '%appNiveau02use%'
appNiveau02label: '%appNiveau02label%' 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%' sondeUse: '%sondeUse%'
sondeUrl: '%sondeUrl%' sondeUrl: '%sondeUrl%'
auditUse: '%auditUse%' auditUse: '%auditUse%'

View File

@ -6,23 +6,34 @@ app_home:
app_user_home: app_user_home:
path: /user path: /user
controller: App\Controller\HomeController::homeuser controller: App\Controller\HomeController::homeuser
defaults: { access: admin } defaults: { access: user }
app_admin_home: app_manager_home:
path: /admin path: /manager
controller: App\Controller\HomeController::homeadmin controller: App\Controller\HomeController::homemanager
defaults: { access: admin } defaults: { access: manager }
app_master_home:
path: /master
controller: App\Controller\HomeController::homemaster
defaults: { access: master }
app_modo_home: app_modo_home:
path: /modo path: /modo
controller: App\Controller\HomeController::homemodo controller: App\Controller\HomeController::homemodo
defaults: { access: modo } defaults: { access: modo }
app_admin_home:
path: /admin
controller: App\Controller\HomeController::homeadmin
defaults: { access: admin }
oneup_uploader: oneup_uploader:
resource: . resource: .
type: uploader type: uploader
#== Security ==================================================================================================== #== Security ====================================================================================================
#-- Access public
app_login: app_login:
path: /login path: /login
controller: App\Controller\SecurityController::login controller: App\Controller\SecurityController::login
@ -39,28 +50,21 @@ app_logout:
path: /logout path: /logout
controller: App\Controller\SecurityController::logout controller: App\Controller\SecurityController::logout
app_redirect:
path: /user/redirect/{route}/{id}
controller: App\Controller\SecurityController::redirecturl
defaults: { access: user }
app_noperm: app_noperm:
path: /noperm path: /noperm
controller: App\Controller\SecurityController::noperm controller: App\Controller\SecurityController::noperm
#== Websocket==================================================================================================== #== Websocket====================================================================================================
#-- Access user #-- Access all
app_publish_sample: app_publish_sample:
path: /user/publish/sample/{id} path: /all/publish/sample/{id}
controller: App\Controller\PublishController::sample controller: App\Controller\PublishController::sample
defaults: { access: user } defaults: { access: all }
app_publish: app_publish:
path: /user/publish/{channel}/{id} path: /all/publish/{channel}/{id}
controller: App\Controller\PublishController::publish controller: App\Controller\PublishController::publish
defaults: { access: user } defaults: { access: all }
#== Config ====================================================================================================== #== Config ======================================================================================================
#-- Access admin #-- Access admin
@ -95,7 +99,6 @@ app_admin_config_logo:
defaults: { access: admin } defaults: { access: admin }
#== Theme ======================================================================================================= #== Theme =======================================================================================================
#-- Access admin #-- Access admin
app_admin_theme: app_admin_theme:
path: /admin/theme path: /admin/theme
@ -108,7 +111,7 @@ app_admin_theme_select:
defaults: { name: "", access: admin } defaults: { name: "", access: admin }
#== API ========================================================================================================= #== API =========================================================================================================
#-- Access visiteur #-- Access public
app_rest: app_rest:
path: /docrest path: /docrest
controller: App\Controller\HomeController::docrest controller: App\Controller\HomeController::docrest
@ -146,44 +149,16 @@ app_admin_log_get:
defaults: { access: admin } defaults: { access: admin }
#== Crop ======================================================================================================== #== Crop ========================================================================================================
#-- Access user #-- Access all
app_user_crop01: app_all_crop01:
path: /user/crop01/{type}/{reportinput} path: /all/crop01/{type}/{reportinput}
controller: App\Controller\CropController::crop01 controller: App\Controller\CropController::crop01
app_user_crop02: app_all_crop02:
path: /user/crop02/{type}/{reportinput} path: /all/crop02/{type}/{reportinput}
controller: App\Controller\CropController::crop02 controller: App\Controller\CropController::crop02
#== Minio ======================================================================================================= #== Minio =======================================================================================================
#-- Access admin
app_admin_minio_image:
path: /admin/minio/image
controller: App\Controller\MinioController::image
app_admin_minio_document:
path: /admin/minio/document
controller: App\Controller\MinioController::document
#-- Access modo
app_modo_minio_image:
path: /modo/minio/image
controller: App\Controller\MinioController::image
app_modo_minio_document:
path: /modo/minio/document
controller: App\Controller\MinioController::document
#-- Access user
app_user_minio_image:
path: /user/minio/image
controller: App\Controller\MinioController::image
app_user_minio_document:
path: /user/minio/document
controller: App\Controller\MinioController::document
#-- Access public #-- Access public
app_minio_logo: app_minio_logo:
path: /minio/logo path: /minio/logo
@ -198,7 +173,7 @@ app_minio_document:
controller: App\Controller\MinioController::document controller: App\Controller\MinioController::document
#== Hydra ======================================================================================================= #== Hydra =======================================================================================================
#-- Access public
app_hydra_loginsql: app_hydra_loginsql:
path: /hydra/loginsql path: /hydra/loginsql
controller: App\Controller\HydraController::loginsql controller: App\Controller\HydraController::loginsql
@ -220,13 +195,13 @@ app_hydra_consent:
controller: App\Controller\HydraController::consent controller: App\Controller\HydraController::consent
#== Ckeditor ==================================================================================================== #== Ckeditor ====================================================================================================
#-- Access all
app_ckeditor_upload: app_ckeditor_upload:
path: /user/upload path: /all/upload
controller: App\Controller\MinioController::ckupload controller: App\Controller\MinioController::ckupload
defaults: { access: user } defaults: { access: all }
#== Audit ======================================================================================================= #== Audit =======================================================================================================
#--Access admin #--Access admin
app_admin_audit_renderid: app_admin_audit_renderid:
path: /admin/audit/{entityname}/{entityid} path: /admin/audit/{entityname}/{entityid}
@ -324,12 +299,126 @@ app_modo_niveau02_delete:
controller: App\Controller\Niveau02Controller::delete controller: App\Controller\Niveau02Controller::delete
defaults: { access: modo } defaults: { access: modo }
#-- Access public
#-- Access visiteur
app_niveau02_selectlist: app_niveau02_selectlist:
path: /niveau02/selectlist path: /niveau02/selectlist
controller: App\Controller\Niveau02Controller::selectlist controller: App\Controller\Niveau02Controller::selectlist
#== Niveau03 ====================================================================================================
#-- Access admin
app_admin_niveau03:
path: /admin/niveau03
controller: App\Controller\Niveau03Controller::list
defaults: { access: admin }
app_admin_niveau03_tablelist:
path: /admin/niveau03/tablelist
controller: App\Controller\Niveau03Controller::tablelist
defaults: { access: admin }
app_admin_niveau03_submit:
path: /admin/niveau03/submit
controller: App\Controller\Niveau03Controller::submit
defaults: { access: admin }
app_admin_niveau03_update:
path: /admin/niveau03/update/{id}
controller: App\Controller\Niveau03Controller::update
defaults: { access: admin }
app_admin_niveau03_delete:
path: /admin/niveau03/delete/{id}
controller: App\Controller\Niveau03Controller::delete
defaults: { access: admin }
#-- Access modo
app_modo_niveau03:
path: /modo/niveau03
controller: App\Controller\Niveau03Controller::list
defaults: { access: modo }
app_modo_niveau03_tablelist:
path: /modo/niveau03/tablelist
controller: App\Controller\Niveau03Controller::tablelist
defaults: { access: modo }
app_modo_niveau03_submit:
path: /modo/niveau03/submit
controller: App\Controller\Niveau03Controller::submit
defaults: { access: modo }
app_modo_niveau03_update:
path: /modo/niveau03/update/{id}
controller: App\Controller\Niveau03Controller::update
defaults: { access: modo }
app_modo_niveau03_delete:
path: /modo/niveau03/delete/{id}
controller: App\Controller\Niveau03Controller::delete
defaults: { access: modo }
#-- Access public
app_niveau03_selectlist:
path: /niveau03/selectlist
controller: App\Controller\Niveau03Controller::selectlist
#== Niveau04 ====================================================================================================
#-- Access admin
app_admin_niveau04:
path: /admin/niveau04
controller: App\Controller\Niveau04Controller::list
defaults: { access: admin }
app_admin_niveau04_tablelist:
path: /admin/niveau04/tablelist
controller: App\Controller\Niveau04Controller::tablelist
defaults: { access: admin }
app_admin_niveau04_submit:
path: /admin/niveau04/submit
controller: App\Controller\Niveau04Controller::submit
defaults: { access: admin }
app_admin_niveau04_update:
path: /admin/niveau04/update/{id}
controller: App\Controller\Niveau04Controller::update
defaults: { access: admin }
app_admin_niveau04_delete:
path: /admin/niveau04/delete/{id}
controller: App\Controller\Niveau04Controller::delete
defaults: { access: admin }
#-- Access modo
app_modo_niveau04:
path: /modo/niveau04
controller: App\Controller\Niveau04Controller::list
defaults: { access: modo }
app_modo_niveau04_tablelist:
path: /modo/niveau04/tablelist
controller: App\Controller\Niveau04Controller::tablelist
defaults: { access: modo }
app_modo_niveau04_submit:
path: /modo/niveau04/submit
controller: App\Controller\Niveau04Controller::submit
defaults: { access: modo }
app_modo_niveau04_update:
path: /modo/niveau04/update/{id}
controller: App\Controller\Niveau04Controller::update
defaults: { access: modo }
app_modo_niveau04_delete:
path: /modo/niveau04/delete/{id}
controller: App\Controller\Niveau04Controller::delete
defaults: { access: modo }
#-- Access public
app_niveau04_selectlist:
path: /niveau04/selectlist
controller: App\Controller\Niveau04Controller::selectlist
#== Group ======================================================================================================= #== Group =======================================================================================================
#-- Access admin #-- Access admin
@ -429,67 +518,66 @@ app_modo_group_usergroup_changerole:
controller: App\Controller\GroupController::userchangerole controller: App\Controller\GroupController::userchangerole
defaults: { access: modo } defaults: { access: modo }
#-- Access all
#-- Access user app_all_group:
app_user_group: path: /all/group
path: /user/group
controller: App\Controller\GroupController::list controller: App\Controller\GroupController::list
defaults: { access: user } defaults: { access: all }
app_user_group_tablelist: app_all_group_tablelist:
path: /user/group/tablelist path: /all/group/tablelist
controller: App\Controller\GroupController::tablelist controller: App\Controller\GroupController::tablelist
defaults: { access: user } defaults: { access: all }
app_user_group_submit: app_all_group_submit:
path: /user/group/submit path: /all/group/submit
controller: App\Controller\GroupController::submit controller: App\Controller\GroupController::submit
defaults: { access: user } defaults: { access: all }
app_user_group_update: app_all_group_update:
path: /user/group/update/{id} path: /all/group/update/{id}
controller: App\Controller\GroupController::update controller: App\Controller\GroupController::update
defaults: { access: user } defaults: { access: all }
app_user_group_delete: app_all_group_delete:
path: /user/group/delete/{id} path: /all/group/delete/{id}
controller: App\Controller\GroupController::delete controller: App\Controller\GroupController::delete
defaults: { access: user } defaults: { access: all }
app_user_group_users: app_all_group_users:
path: /user/group/users/{id} path: /all/group/users/{id}
controller: App\Controller\GroupController::users controller: App\Controller\GroupController::users
defaults: { access: user } defaults: { access: all }
app_user_group_usersnotin: app_all_group_usersnotin:
path: /user/group/usersnotin/{id} path: /all/group/usersnotin/{id}
controller: App\Controller\GroupController::usersnotin controller: App\Controller\GroupController::usersnotin
defaults: { access: user } defaults: { access: all }
app_user_group_usersin: app_all_group_usersin:
path: /user/group/usersin/{id} path: /all/group/usersin/{id}
controller: App\Controller\GroupController::usersin controller: App\Controller\GroupController::usersin
defaults: { access: user } defaults: { access: all }
app_user_group_usergroup_add: app_all_group_usergroup_add:
path: /user/group/usergroup/add/{groupid}/{userid} path: /all/group/usergroup/add/{groupid}/{userid}
controller: App\Controller\GroupController::useradd controller: App\Controller\GroupController::useradd
defaults: { access: user } defaults: { access: all }
app_user_group_usergroup_del: app_all_group_usergroup_del:
path: /user/group/usergroup/del/{groupid}/{userid} path: /all/group/usergroup/del/{groupid}/{userid}
controller: App\Controller\GroupController::userdel controller: App\Controller\GroupController::userdel
defaults: { access: user } defaults: { access: all }
app_user_group_usergroup_changerole: app_all_group_usergroup_changerole:
path: /user/group/usergroup/changerole/{groupid}/{userid}/{roleid} path: /all/group/usergroup/changerole/{groupid}/{userid}/{roleid}
controller: App\Controller\GroupController::userchangerole controller: App\Controller\GroupController::userchangerole
defaults: { access: user } defaults: { access: all }
app_user_group_userout: app_all_group_userout:
path: /user/group/userout/{id} path: /all/group/userout/{id}
controller: App\Controller\GroupController::userout controller: App\Controller\GroupController::userout
defaults: { access: user } defaults: { access: all }
#== Whitelist =================================================================================================== #== Whitelist ===================================================================================================
#-- Access admin #-- Access admin
@ -518,7 +606,7 @@ app_admin_whitelist_delete:
controller: App\Controller\WhitelistController::delete controller: App\Controller\WhitelistController::delete
defaults: { access: admin } defaults: { access: admin }
#-- Acces visiteur #-- Access public
app_whitelist_is: app_whitelist_is:
path: /whitelist/is path: /whitelist/is
controller: App\Controller\WhitelistController::is controller: App\Controller\WhitelistController::is
@ -566,7 +654,7 @@ app_modo_registration_delete:
controller: App\Controller\RegistrationController::delete controller: App\Controller\RegistrationController::delete
defaults: { access: modo } defaults: { access: modo }
#-- Access visiteur #-- Access public
app_registration: app_registration:
path: /registration path: /registration
controller: App\Controller\RegistrationController::submit controller: App\Controller\RegistrationController::submit
@ -650,33 +738,34 @@ app_modo_user_delete:
controller: App\Controller\UserController::delete controller: App\Controller\UserController::delete
defaults: { access: modo } defaults: { access: modo }
#-- Access user #-- Access all
app_user_user: app_all_user:
path: /user/update path: /all/update
controller: App\Controller\UserController::profil controller: App\Controller\UserController::profil
defaults: { access: user } defaults: { access: all }
app_user_users: app_all_users:
path: /user/users path: /all/users
controller: App\Controller\UserController::list controller: App\Controller\UserController::list
defaults: { access: user } defaults: { access: all }
app_user_user_tablelist: app_all_user_tablelist:
path: /user/user/tablelist path: /all/user/tablelist
controller: App\Controller\UserController::tablelist controller: App\Controller\UserController::tablelist
defaults: { access: user } defaults: { access: all }
app_user_user_selectlist: app_all_user_selectlist:
path: /user/user/selectlist path: /all/user/selectlist
controller: App\Controller\UserController::selectlist controller: App\Controller\UserController::selectlist
defaults: { access: user } defaults: { access: all }
app_user_view: app_all_view:
path: /user/view/{id} path: /all/view/{id}
controller: App\Controller\UserController::view controller: App\Controller\UserController::view
defaults: { access: user } defaults: { access: all }
app_user_preference: app_all_preference:
path: /user/preference path: /all/preference
controller: App\Controller\UserController::preference controller: App\Controller\UserController::preference
defaults: { access: user } defaults: { access: all }

View File

@ -8,16 +8,43 @@ parameters:
appAlias: '%env(resolve:APP_ALIAS)%' appAlias: '%env(resolve:APP_ALIAS)%'
appName: '%env(resolve:APP_NAME)%' appName: '%env(resolve:APP_NAME)%'
appMasteridentity: '%env(resolve:APP_MASTERIDENTITY)%' appMasteridentity: '%env(resolve:APP_MASTERIDENTITY)%'
appMasterurl: '%env(resolve:APP_MASTERURL)%'
appMasterkey: '%env(resolve:APP_MASTERKEY)%'
appModeregistration: '%env(resolve:APP_MODEREGISTRATION)%' appModeregistration: '%env(resolve:APP_MODEREGISTRATION)%'
appAdmins: '%env(json:APP_ADMINS)%' appAdmins: '%env(json:APP_ADMINS)%'
appNiveau01label: '%env(resolve:APP_NIVEAU01LABEL)%' appNiveau01label: '%env(resolve:APP_NIVEAU01LABEL)%'
appNiveau01labels: '%env(resolve:APP_NIVEAU01LABELS)%'
appNiveau02use: '%env(resolve:APP_NIVEAU02USE)%'
appNiveau02label: '%env(resolve:APP_NIVEAU02LABEL)%' 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)%'
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)%'
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)%'
appSynchro: '%env(resolve:APP_SYNCHRO)%' appSynchro: '%env(resolve:APP_SYNCHRO)%'
appSynchroPurgeNiveau01: '%env(resolve:APP_SYNDCHROPURGENIVEAU01)%' appSynchroPurgeNiveau01: '%env(resolve:APP_SYNDCHROPURGENIVEAU01)%'
appSynchroPurgeNiveau02: '%env(resolve:APP_SYNDCHROPURGENIVEAU02)%' appSynchroPurgeNiveau02: '%env(resolve:APP_SYNDCHROPURGENIVEAU02)%'
appSynchroPurgeNiveau03: '%env(resolve:APP_SYNDCHROPURGENIVEAU03)%'
appSynchroPurgeNiveau04: '%env(resolve:APP_SYNDCHROPURGENIVEAU04)%'
appSynchroPurgeGroup: '%env(resolve:APP_SYNDCHROPURGEGROUP)%' appSynchroPurgeGroup: '%env(resolve:APP_SYNDCHROPURGEGROUP)%'
appSynchroPurgeUser: '%env(resolve:APP_SYNDCHROPURGEUSER)%' appSynchroPurgeUser: '%env(resolve:APP_SYNDCHROPURGEUSER)%'
@ -37,6 +64,8 @@ parameters:
ldapBaseorganisation: '%env(resolve:LDAP_BASEORGANISATION)%' ldapBaseorganisation: '%env(resolve:LDAP_BASEORGANISATION)%'
ldapBaseniveau01: '%env(resolve:LDAP_BASENIVEAU01)%' ldapBaseniveau01: '%env(resolve:LDAP_BASENIVEAU01)%'
ldapBaseniveau02: '%env(resolve:LDAP_BASENIVEAU02)%' ldapBaseniveau02: '%env(resolve:LDAP_BASENIVEAU02)%'
ldapBaseniveau03: '%env(resolve:LDAP_BASENIVEAU03)%'
ldapBaseniveau04: '%env(resolve:LDAP_BASENIVEAU04)%'
ldapBasegroup: '%env(resolve:LDAP_BASEGROUP)%' ldapBasegroup: '%env(resolve:LDAP_BASEGROUP)%'
ldapBaseuser: '%env(resolve:LDAP_BASEUSER)%' ldapBaseuser: '%env(resolve:LDAP_BASEUSER)%'
ldapUsername: '%env(resolve:LDAP_USERNAME)%' ldapUsername: '%env(resolve:LDAP_USERNAME)%'

View File

@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration;
/** /**
* Auto-generated Migration: Please modify to your needs! * Auto-generated Migration: Please modify to your needs!
*/ */
final class Version20220729073725 extends AbstractMigration final class Version20221002124137 extends AbstractMigration
{ {
public function getDescription(): string public function getDescription(): string
{ {
@ -25,6 +25,8 @@ final class Version20220729073725 extends AbstractMigration
$this->addSql('CREATE SEQUENCE groupe_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); $this->addSql('CREATE SEQUENCE groupe_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
$this->addSql('CREATE SEQUENCE niveau01_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); $this->addSql('CREATE SEQUENCE niveau01_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
$this->addSql('CREATE SEQUENCE niveau02_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); $this->addSql('CREATE SEQUENCE niveau02_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
$this->addSql('CREATE SEQUENCE niveau03_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
$this->addSql('CREATE SEQUENCE niveau04_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
$this->addSql('CREATE SEQUENCE registration_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); $this->addSql('CREATE SEQUENCE registration_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
$this->addSql('CREATE SEQUENCE useraccount_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); $this->addSql('CREATE SEQUENCE useraccount_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
$this->addSql('CREATE SEQUENCE usergroupe_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); $this->addSql('CREATE SEQUENCE usergroupe_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
@ -38,21 +40,31 @@ final class Version20220729073725 extends AbstractMigration
$this->addSql('CREATE TABLE groupe (id INT NOT NULL, owner_id INT DEFAULT NULL, label VARCHAR(250) NOT NULL, description TEXT DEFAULT NULL, email VARCHAR(250) DEFAULT NULL, isopen BOOLEAN DEFAULT false NOT NULL, isworkgroup BOOLEAN DEFAULT false NOT NULL, apikey VARCHAR(255) NOT NULL, ldapfilter TEXT DEFAULT NULL, attributes TEXT DEFAULT NULL, idexternal TEXT DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE TABLE groupe (id INT NOT NULL, owner_id INT DEFAULT NULL, label VARCHAR(250) NOT NULL, description TEXT DEFAULT NULL, email VARCHAR(250) DEFAULT NULL, isopen BOOLEAN DEFAULT false NOT NULL, isworkgroup BOOLEAN DEFAULT false NOT NULL, apikey VARCHAR(255) NOT NULL, ldapfilter TEXT DEFAULT NULL, attributes TEXT DEFAULT NULL, idexternal TEXT DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE UNIQUE INDEX UNIQ_4B98C21EA750E8 ON groupe (label)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_4B98C21EA750E8 ON groupe (label)');
$this->addSql('CREATE INDEX IDX_4B98C217E3C61F9 ON groupe (owner_id)'); $this->addSql('CREATE INDEX IDX_4B98C217E3C61F9 ON groupe (owner_id)');
$this->addSql('CREATE TABLE niveau01 (id INT NOT NULL, label VARCHAR(250) NOT NULL, apikey VARCHAR(255) NOT NULL, ldapfilter TEXT DEFAULT NULL, attributes TEXT DEFAULT NULL, idexternal TEXT DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE TABLE niveau01 (id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, ldapfilter TEXT DEFAULT NULL, attributes TEXT DEFAULT NULL, idexternal TEXT DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE UNIQUE INDEX UNIQ_6DFC7E23EA750E8 ON niveau01 (label)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_6DFC7E23EA750E8 ON niveau01 (label)');
$this->addSql('CREATE TABLE niveau02 (id INT NOT NULL, niveau01_id INT NOT NULL, label VARCHAR(250) NOT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE TABLE niveau02 (id INT NOT NULL, niveau01_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE UNIQUE INDEX UNIQ_F4F52F99EA750E8 ON niveau02 (label)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_F4F52F99EA750E8 ON niveau02 (label)');
$this->addSql('CREATE INDEX IDX_F4F52F9959FDD7AB ON niveau02 (niveau01_id)'); $this->addSql('CREATE INDEX IDX_F4F52F9959FDD7AB ON niveau02 (niveau01_id)');
$this->addSql('CREATE TABLE registration (id INT NOT NULL, niveau01_id INT NOT NULL, niveau02_id INT DEFAULT NULL, username VARCHAR(128) NOT NULL, firstname VARCHAR(250) DEFAULT NULL, lastname VARCHAR(250) DEFAULT NULL, password VARCHAR(250) NOT NULL, salt VARCHAR(250) NOT NULL, email VARCHAR(128) NOT NULL, isvisible BOOLEAN NOT NULL, postaladress VARCHAR(250) DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, job VARCHAR(250) DEFAULT NULL, position VARCHAR(250) DEFAULT NULL, motivation TEXT DEFAULT NULL, note TEXT DEFAULT NULL, keyexpire TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, keyvalue VARCHAR(60) DEFAULT NULL, statut INT NOT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE TABLE niveau03 (id INT NOT NULL, niveau02_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE UNIQUE INDEX UNIQ_83F21F0FEA750E8 ON niveau03 (label)');
$this->addSql('CREATE INDEX IDX_83F21F0F4B487845 ON niveau03 (niveau02_id)');
$this->addSql('CREATE TABLE niveau04 (id INT NOT NULL, niveau03_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE UNIQUE INDEX UNIQ_1D968AACEA750E8 ON niveau04 (label)');
$this->addSql('CREATE INDEX IDX_1D968AACF3F41F20 ON niveau04 (niveau03_id)');
$this->addSql('CREATE TABLE registration (id INT NOT NULL, niveau01_id INT NOT NULL, niveau02_id INT DEFAULT NULL, niveau03_id INT DEFAULT NULL, niveau04_id INT DEFAULT NULL, username VARCHAR(128) NOT NULL, firstname VARCHAR(250) DEFAULT NULL, lastname VARCHAR(250) DEFAULT NULL, password VARCHAR(250) NOT NULL, salt VARCHAR(250) NOT NULL, email VARCHAR(128) NOT NULL, isvisible BOOLEAN NOT NULL, postaladress VARCHAR(250) DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, job VARCHAR(250) DEFAULT NULL, position VARCHAR(250) DEFAULT NULL, motivation TEXT DEFAULT NULL, note TEXT DEFAULT NULL, keyexpire TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, keyvalue VARCHAR(60) DEFAULT NULL, statut INT NOT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE UNIQUE INDEX UNIQ_62A8A7A7F85E0677 ON registration (username)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_62A8A7A7F85E0677 ON registration (username)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_62A8A7A7E7927C74 ON registration (email)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_62A8A7A7E7927C74 ON registration (email)');
$this->addSql('CREATE INDEX IDX_62A8A7A759FDD7AB ON registration (niveau01_id)'); $this->addSql('CREATE INDEX IDX_62A8A7A759FDD7AB ON registration (niveau01_id)');
$this->addSql('CREATE INDEX IDX_62A8A7A74B487845 ON registration (niveau02_id)'); $this->addSql('CREATE INDEX IDX_62A8A7A74B487845 ON registration (niveau02_id)');
$this->addSql('CREATE TABLE useraccount (id INT NOT NULL, niveau01_id INT NOT NULL, niveau02_id INT DEFAULT NULL, username VARCHAR(128) NOT NULL, apikey VARCHAR(255) NOT NULL, firstname VARCHAR(250) DEFAULT NULL, lastname VARCHAR(250) DEFAULT NULL, roles TEXT NOT NULL, password VARCHAR(250) NOT NULL, salt VARCHAR(250) NOT NULL, email VARCHAR(128) NOT NULL, avatar VARCHAR(250) DEFAULT \'0\', isvisible BOOLEAN NOT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, job VARCHAR(250) DEFAULT NULL, position VARCHAR(250) DEFAULT NULL, motivation TEXT DEFAULT NULL, note TEXT DEFAULT NULL, preference TEXT DEFAULT NULL, keyexpire TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, keyvalue VARCHAR(60) DEFAULT NULL, visitedate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, visitecpt INT DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX IDX_62A8A7A7F3F41F20 ON registration (niveau03_id)');
$this->addSql('CREATE INDEX IDX_62A8A7A76E232799 ON registration (niveau04_id)');
$this->addSql('CREATE TABLE useraccount (id INT NOT NULL, niveau01_id INT NOT NULL, niveau02_id INT DEFAULT NULL, niveau03_id INT DEFAULT NULL, niveau04_id INT DEFAULT NULL, username VARCHAR(128) NOT NULL, apikey VARCHAR(255) NOT NULL, firstname VARCHAR(250) DEFAULT NULL, lastname VARCHAR(250) DEFAULT NULL, roles TEXT NOT NULL, password VARCHAR(250) NOT NULL, salt VARCHAR(250) NOT NULL, isactive BOOLEAN NOT NULL, email VARCHAR(128) NOT NULL, avatar VARCHAR(250) DEFAULT \'0\', isvisible BOOLEAN NOT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, job VARCHAR(250) DEFAULT NULL, position VARCHAR(250) DEFAULT NULL, motivation TEXT DEFAULT NULL, note TEXT DEFAULT NULL, preference TEXT DEFAULT NULL, keyexpire TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, keyvalue VARCHAR(60) DEFAULT NULL, visitedate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, visitecpt INT DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE UNIQUE INDEX UNIQ_E157AA1AF85E0677 ON useraccount (username)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_E157AA1AF85E0677 ON useraccount (username)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_E157AA1AE7927C74 ON useraccount (email)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_E157AA1AE7927C74 ON useraccount (email)');
$this->addSql('CREATE INDEX IDX_E157AA1A59FDD7AB ON useraccount (niveau01_id)'); $this->addSql('CREATE INDEX IDX_E157AA1A59FDD7AB ON useraccount (niveau01_id)');
$this->addSql('CREATE INDEX IDX_E157AA1A4B487845 ON useraccount (niveau02_id)'); $this->addSql('CREATE INDEX IDX_E157AA1A4B487845 ON useraccount (niveau02_id)');
$this->addSql('CREATE INDEX IDX_E157AA1AF3F41F20 ON useraccount (niveau03_id)');
$this->addSql('CREATE INDEX IDX_E157AA1A6E232799 ON useraccount (niveau04_id)');
$this->addSql('COMMENT ON COLUMN useraccount.roles IS \'(DC2Type:array)\''); $this->addSql('COMMENT ON COLUMN useraccount.roles IS \'(DC2Type:array)\'');
$this->addSql('COMMENT ON COLUMN useraccount.preference IS \'(DC2Type:array)\''); $this->addSql('COMMENT ON COLUMN useraccount.preference IS \'(DC2Type:array)\'');
$this->addSql('CREATE TABLE usergroupe (id INT NOT NULL, user_id INT DEFAULT NULL, group_id INT DEFAULT NULL, rolegroup INT NOT NULL, apikey VARCHAR(60) NOT NULL, visitedate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, visitecpt INT DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE TABLE usergroupe (id INT NOT NULL, user_id INT DEFAULT NULL, group_id INT DEFAULT NULL, rolegroup INT NOT NULL, apikey VARCHAR(60) NOT NULL, visitedate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, visitecpt INT DEFAULT NULL, PRIMARY KEY(id))');
@ -78,10 +90,16 @@ final class Version20220729073725 extends AbstractMigration
$this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();'); $this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();');
$this->addSql('ALTER TABLE groupe ADD CONSTRAINT FK_4B98C217E3C61F9 FOREIGN KEY (owner_id) REFERENCES useraccount (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE groupe ADD CONSTRAINT FK_4B98C217E3C61F9 FOREIGN KEY (owner_id) REFERENCES useraccount (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE niveau02 ADD CONSTRAINT FK_F4F52F9959FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE niveau02 ADD CONSTRAINT FK_F4F52F9959FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE niveau03 ADD CONSTRAINT FK_83F21F0F4B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE niveau04 ADD CONSTRAINT FK_1D968AACF3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A759FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A759FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A74B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A74B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A7F3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A76E232799 FOREIGN KEY (niveau04_id) REFERENCES niveau04 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A59FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A59FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A4B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A4B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1AF3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A6E232799 FOREIGN KEY (niveau04_id) REFERENCES niveau04 (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE usergroupe ADD CONSTRAINT FK_6C439BE5A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE usergroupe ADD CONSTRAINT FK_6C439BE5A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE usergroupe ADD CONSTRAINT FK_6C439BE5FE54D947 FOREIGN KEY (group_id) REFERENCES groupe (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE usergroupe ADD CONSTRAINT FK_6C439BE5FE54D947 FOREIGN KEY (group_id) REFERENCES groupe (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE usermodo ADD CONSTRAINT FK_D162D6C4A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE usermodo ADD CONSTRAINT FK_D162D6C4A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
@ -92,32 +110,42 @@ final class Version20220729073725 extends AbstractMigration
{ {
// this down() migration is auto-generated, please modify it to your needs // this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE SCHEMA public'); $this->addSql('CREATE SCHEMA public');
$this->addSql('ALTER TABLE usergroupe DROP CONSTRAINT FK_6C439BE5FE54D947');
$this->addSql('ALTER TABLE niveau02 DROP CONSTRAINT FK_F4F52F9959FDD7AB');
$this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A759FDD7AB');
$this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A59FDD7AB');
$this->addSql('ALTER TABLE usermodo DROP CONSTRAINT FK_D162D6C459FDD7AB');
$this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A74B487845');
$this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A4B487845');
$this->addSql('ALTER TABLE groupe DROP CONSTRAINT FK_4B98C217E3C61F9');
$this->addSql('ALTER TABLE usergroupe DROP CONSTRAINT FK_6C439BE5A76ED395');
$this->addSql('ALTER TABLE usermodo DROP CONSTRAINT FK_D162D6C4A76ED395');
$this->addSql('DROP SEQUENCE audit_id_seq CASCADE'); $this->addSql('DROP SEQUENCE audit_id_seq CASCADE');
$this->addSql('DROP SEQUENCE cron_id_seq CASCADE'); $this->addSql('DROP SEQUENCE cron_id_seq CASCADE');
$this->addSql('DROP SEQUENCE groupe_id_seq CASCADE'); $this->addSql('DROP SEQUENCE groupe_id_seq CASCADE');
$this->addSql('DROP SEQUENCE niveau01_id_seq CASCADE'); $this->addSql('DROP SEQUENCE niveau01_id_seq CASCADE');
$this->addSql('DROP SEQUENCE niveau02_id_seq CASCADE'); $this->addSql('DROP SEQUENCE niveau02_id_seq CASCADE');
$this->addSql('DROP SEQUENCE niveau03_id_seq CASCADE');
$this->addSql('DROP SEQUENCE niveau04_id_seq CASCADE');
$this->addSql('DROP SEQUENCE registration_id_seq CASCADE'); $this->addSql('DROP SEQUENCE registration_id_seq CASCADE');
$this->addSql('DROP SEQUENCE useraccount_id_seq CASCADE'); $this->addSql('DROP SEQUENCE useraccount_id_seq CASCADE');
$this->addSql('DROP SEQUENCE usergroupe_id_seq CASCADE'); $this->addSql('DROP SEQUENCE usergroupe_id_seq CASCADE');
$this->addSql('DROP SEQUENCE usermodo_id_seq CASCADE'); $this->addSql('DROP SEQUENCE usermodo_id_seq CASCADE');
$this->addSql('DROP SEQUENCE whitelist_id_seq CASCADE'); $this->addSql('DROP SEQUENCE whitelist_id_seq CASCADE');
$this->addSql('ALTER TABLE groupe DROP CONSTRAINT FK_4B98C217E3C61F9');
$this->addSql('ALTER TABLE niveau02 DROP CONSTRAINT FK_F4F52F9959FDD7AB');
$this->addSql('ALTER TABLE niveau03 DROP CONSTRAINT FK_83F21F0F4B487845');
$this->addSql('ALTER TABLE niveau04 DROP CONSTRAINT FK_1D968AACF3F41F20');
$this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A759FDD7AB');
$this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A74B487845');
$this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A7F3F41F20');
$this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A76E232799');
$this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A59FDD7AB');
$this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A4B487845');
$this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1AF3F41F20');
$this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A6E232799');
$this->addSql('ALTER TABLE usergroupe DROP CONSTRAINT FK_6C439BE5A76ED395');
$this->addSql('ALTER TABLE usergroupe DROP CONSTRAINT FK_6C439BE5FE54D947');
$this->addSql('ALTER TABLE usermodo DROP CONSTRAINT FK_D162D6C4A76ED395');
$this->addSql('ALTER TABLE usermodo DROP CONSTRAINT FK_D162D6C459FDD7AB');
$this->addSql('DROP TABLE audit'); $this->addSql('DROP TABLE audit');
$this->addSql('DROP TABLE config'); $this->addSql('DROP TABLE config');
$this->addSql('DROP TABLE cron'); $this->addSql('DROP TABLE cron');
$this->addSql('DROP TABLE groupe'); $this->addSql('DROP TABLE groupe');
$this->addSql('DROP TABLE niveau01'); $this->addSql('DROP TABLE niveau01');
$this->addSql('DROP TABLE niveau02'); $this->addSql('DROP TABLE niveau02');
$this->addSql('DROP TABLE niveau03');
$this->addSql('DROP TABLE niveau04');
$this->addSql('DROP TABLE registration'); $this->addSql('DROP TABLE registration');
$this->addSql('DROP TABLE useraccount'); $this->addSql('DROP TABLE useraccount');
$this->addSql('DROP TABLE usergroupe'); $this->addSql('DROP TABLE usergroupe');

8867
package-lock.json generated
View File

@ -1,7627 +1,6 @@
{ {
"name": "nineskeletor",
"lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "lockfileVersion": 1,
"": {
"license": "UNLICENSED",
"dependencies": {
"@fortawesome/fontawesome-free": "^6.1.1",
"@popperjs/core": "^2.11.5",
"@ttskch/select2-bootstrap4-theme": "^1.5.2",
"bootstrap": "^5.1.3",
"ckeditor4": "^4.19.0",
"crop-select-js": "^1.0.1",
"datatables.net-bs4": "^1.12.1",
"dropzone": "^6.0.0-beta.2",
"file-loader": "^6.2.0",
"jquery": "^3.6.0",
"jquery-ui": "^1.13.1",
"select2": "^4.1.0-rc.0",
"spectrum-colorpicker2": "^2.0.9",
"yarn": "^1.22.19"
},
"devDependencies": {
"@hotwired/stimulus": "^3.0.0",
"@symfony/stimulus-bridge": "^3.0.0",
"@symfony/webpack-encore": "^2.0.0",
"core-js": "^3.0.0",
"regenerator-runtime": "^0.13.2",
"webpack-notifier": "^1.6.0"
}
},
"node_modules/@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"dev": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/code-frame": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
"integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
"dev": true,
"dependencies": {
"@babel/highlight": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
"version": "7.18.5",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz",
"integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.18.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz",
"integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7",
"@babel/generator": "^7.18.2",
"@babel/helper-compilation-targets": "^7.18.2",
"@babel/helper-module-transforms": "^7.18.0",
"@babel/helpers": "^7.18.2",
"@babel/parser": "^7.18.5",
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.18.5",
"@babel/types": "^7.18.4",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.2.1",
"semver": "^6.3.0"
},
"engines": {
"node": ">=6.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/core/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/generator": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
"integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.18.2",
"@jridgewell/gen-mapping": "^0.3.0",
"jsesc": "^2.5.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
"integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
"dev": true,
"dependencies": {
"@jridgewell/set-array": "^1.0.0",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/helper-annotate-as-pure": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
"integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
"integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
"dev": true,
"dependencies": {
"@babel/helper-explode-assignable-expression": "^7.16.7",
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz",
"integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.17.10",
"@babel/helper-validator-option": "^7.16.7",
"browserslist": "^4.20.2",
"semver": "^6.3.0"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-compilation-targets/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz",
"integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.16.7",
"@babel/helper-environment-visitor": "^7.16.7",
"@babel/helper-function-name": "^7.17.9",
"@babel/helper-member-expression-to-functions": "^7.17.7",
"@babel/helper-optimise-call-expression": "^7.16.7",
"@babel/helper-replace-supers": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz",
"integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.16.7",
"regexpu-core": "^5.0.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
"integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
"dev": true,
"dependencies": {
"@babel/helper-compilation-targets": "^7.13.0",
"@babel/helper-module-imports": "^7.12.13",
"@babel/helper-plugin-utils": "^7.13.0",
"@babel/traverse": "^7.13.0",
"debug": "^4.1.1",
"lodash.debounce": "^4.0.8",
"resolve": "^1.14.2",
"semver": "^6.1.2"
},
"peerDependencies": {
"@babel/core": "^7.4.0-0"
}
},
"node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz",
"integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-explode-assignable-expression": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
"integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.17.9",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
"integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
"dev": true,
"dependencies": {
"@babel/template": "^7.16.7",
"@babel/types": "^7.17.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
"integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
"version": "7.17.7",
"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz",
"integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.17.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
"integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz",
"integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==",
"dev": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.16.7",
"@babel/helper-module-imports": "^7.16.7",
"@babel/helper-simple-access": "^7.17.7",
"@babel/helper-split-export-declaration": "^7.16.7",
"@babel/helper-validator-identifier": "^7.16.7",
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.18.0",
"@babel/types": "^7.18.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-optimise-call-expression": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
"integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz",
"integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
"integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.16.7",
"@babel/helper-wrap-function": "^7.16.8",
"@babel/types": "^7.16.8"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-replace-supers": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz",
"integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==",
"dev": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.18.2",
"@babel/helper-member-expression-to-functions": "^7.17.7",
"@babel/helper-optimise-call-expression": "^7.16.7",
"@babel/traverse": "^7.18.2",
"@babel/types": "^7.18.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-simple-access": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz",
"integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==",
"dev": true,
"dependencies": {
"@babel/types": "^7.18.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
"integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
"integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
"integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
"integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
"dev": true,
"dependencies": {
"@babel/helper-function-name": "^7.16.7",
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.16.8",
"@babel/types": "^7.16.8"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz",
"integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==",
"dev": true,
"dependencies": {
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.18.2",
"@babel/types": "^7.18.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz",
"integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.16.7",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/@babel/highlight/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"node_modules/@babel/highlight/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@babel/highlight/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/parser": {
"version": "7.18.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
"integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz",
"integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz",
"integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
"@babel/plugin-proposal-optional-chaining": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.13.0"
}
},
"node_modules/@babel/plugin-proposal-async-generator-functions": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz",
"integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-remap-async-to-generator": "^7.16.8",
"@babel/plugin-syntax-async-generators": "^7.8.4"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-class-properties": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz",
"integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==",
"dev": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.17.12",
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-class-static-block": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz",
"integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==",
"dev": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-class-static-block": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.12.0"
}
},
"node_modules/@babel/plugin-proposal-dynamic-import": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
"integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-export-namespace-from": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz",
"integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-json-strings": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz",
"integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-json-strings": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-logical-assignment-operators": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz",
"integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz",
"integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-numeric-separator": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
"integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-object-rest-spread": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz",
"integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.17.10",
"@babel/helper-compilation-targets": "^7.17.10",
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
"@babel/plugin-transform-parameters": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-optional-catch-binding": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
"integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-optional-chaining": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz",
"integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-private-methods": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz",
"integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==",
"dev": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.17.12",
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-private-property-in-object": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz",
"integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.16.7",
"@babel/helper-create-class-features-plugin": "^7.17.12",
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-unicode-property-regex": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz",
"integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==",
"dev": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.17.12",
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=4"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
"integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-class-properties": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
"integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.12.13"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-class-static-block": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
"integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-dynamic-import": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
"integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-export-namespace-from": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
"integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.3"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-import-assertions": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz",
"integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-json-strings": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
"integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-logical-assignment-operators": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
"integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
"integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-numeric-separator": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
"integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
"integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-optional-catch-binding": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
"integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-optional-chaining": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
"integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-private-property-in-object": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
"integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-top-level-await": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
"integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz",
"integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-async-to-generator": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz",
"integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==",
"dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.16.7",
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-remap-async-to-generator": "^7.16.8"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
"integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
"version": "7.18.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz",
"integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-classes": {
"version": "7.18.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz",
"integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.16.7",
"@babel/helper-environment-visitor": "^7.18.2",
"@babel/helper-function-name": "^7.17.9",
"@babel/helper-optimise-call-expression": "^7.16.7",
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-replace-supers": "^7.18.2",
"@babel/helper-split-export-declaration": "^7.16.7",
"globals": "^11.1.0"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz",
"integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-destructuring": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz",
"integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
"integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
"dev": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.16.7",
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz",
"integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
"integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
"dev": true,
"dependencies": {
"@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-for-of": {
"version": "7.18.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz",
"integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-function-name": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
"integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
"dev": true,
"dependencies": {
"@babel/helper-compilation-targets": "^7.16.7",
"@babel/helper-function-name": "^7.16.7",
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-literals": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz",
"integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
"integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-modules-amd": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz",
"integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==",
"dev": true,
"dependencies": {
"@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12",
"babel-plugin-dynamic-import-node": "^2.3.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz",
"integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==",
"dev": true,
"dependencies": {
"@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-simple-access": "^7.18.2",
"babel-plugin-dynamic-import-node": "^2.3.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.18.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.5.tgz",
"integrity": "sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q==",
"dev": true,
"dependencies": {
"@babel/helper-hoist-variables": "^7.16.7",
"@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-validator-identifier": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-modules-umd": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz",
"integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==",
"dev": true,
"dependencies": {
"@babel/helper-module-transforms": "^7.18.0",
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz",
"integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==",
"dev": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.17.12",
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-transform-new-target": {
"version": "7.18.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.5.tgz",
"integrity": "sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-object-super": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
"integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-replace-supers": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-parameters": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz",
"integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-property-literals": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
"integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-regenerator": {
"version": "7.18.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz",
"integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"regenerator-transform": "^0.15.0"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-reserved-words": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz",
"integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
"integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-spread": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz",
"integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-sticky-regex": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
"integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-template-literals": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz",
"integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
"version": "7.17.12",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz",
"integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.17.12"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
"integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-unicode-regex": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
"integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
"dev": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.16.7",
"@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/preset-env": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz",
"integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.17.10",
"@babel/helper-compilation-targets": "^7.18.2",
"@babel/helper-plugin-utils": "^7.17.12",
"@babel/helper-validator-option": "^7.16.7",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12",
"@babel/plugin-proposal-async-generator-functions": "^7.17.12",
"@babel/plugin-proposal-class-properties": "^7.17.12",
"@babel/plugin-proposal-class-static-block": "^7.18.0",
"@babel/plugin-proposal-dynamic-import": "^7.16.7",
"@babel/plugin-proposal-export-namespace-from": "^7.17.12",
"@babel/plugin-proposal-json-strings": "^7.17.12",
"@babel/plugin-proposal-logical-assignment-operators": "^7.17.12",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12",
"@babel/plugin-proposal-numeric-separator": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.18.0",
"@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
"@babel/plugin-proposal-optional-chaining": "^7.17.12",
"@babel/plugin-proposal-private-methods": "^7.17.12",
"@babel/plugin-proposal-private-property-in-object": "^7.17.12",
"@babel/plugin-proposal-unicode-property-regex": "^7.17.12",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
"@babel/plugin-syntax-class-static-block": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3",
"@babel/plugin-syntax-import-assertions": "^7.17.12",
"@babel/plugin-syntax-json-strings": "^7.8.3",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
"@babel/plugin-syntax-numeric-separator": "^7.10.4",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
"@babel/plugin-syntax-optional-chaining": "^7.8.3",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-transform-arrow-functions": "^7.17.12",
"@babel/plugin-transform-async-to-generator": "^7.17.12",
"@babel/plugin-transform-block-scoped-functions": "^7.16.7",
"@babel/plugin-transform-block-scoping": "^7.17.12",
"@babel/plugin-transform-classes": "^7.17.12",
"@babel/plugin-transform-computed-properties": "^7.17.12",
"@babel/plugin-transform-destructuring": "^7.18.0",
"@babel/plugin-transform-dotall-regex": "^7.16.7",
"@babel/plugin-transform-duplicate-keys": "^7.17.12",
"@babel/plugin-transform-exponentiation-operator": "^7.16.7",
"@babel/plugin-transform-for-of": "^7.18.1",
"@babel/plugin-transform-function-name": "^7.16.7",
"@babel/plugin-transform-literals": "^7.17.12",
"@babel/plugin-transform-member-expression-literals": "^7.16.7",
"@babel/plugin-transform-modules-amd": "^7.18.0",
"@babel/plugin-transform-modules-commonjs": "^7.18.2",
"@babel/plugin-transform-modules-systemjs": "^7.18.0",
"@babel/plugin-transform-modules-umd": "^7.18.0",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12",
"@babel/plugin-transform-new-target": "^7.17.12",
"@babel/plugin-transform-object-super": "^7.16.7",
"@babel/plugin-transform-parameters": "^7.17.12",
"@babel/plugin-transform-property-literals": "^7.16.7",
"@babel/plugin-transform-regenerator": "^7.18.0",
"@babel/plugin-transform-reserved-words": "^7.17.12",
"@babel/plugin-transform-shorthand-properties": "^7.16.7",
"@babel/plugin-transform-spread": "^7.17.12",
"@babel/plugin-transform-sticky-regex": "^7.16.7",
"@babel/plugin-transform-template-literals": "^7.18.2",
"@babel/plugin-transform-typeof-symbol": "^7.17.12",
"@babel/plugin-transform-unicode-escapes": "^7.16.7",
"@babel/plugin-transform-unicode-regex": "^7.16.7",
"@babel/preset-modules": "^0.1.5",
"@babel/types": "^7.18.2",
"babel-plugin-polyfill-corejs2": "^0.3.0",
"babel-plugin-polyfill-corejs3": "^0.5.0",
"babel-plugin-polyfill-regenerator": "^0.3.0",
"core-js-compat": "^3.22.1",
"semver": "^6.3.0"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/preset-env/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/preset-modules": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
"integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
"@babel/plugin-transform-dotall-regex": "^7.4.4",
"@babel/types": "^7.4.4",
"esutils": "^2.0.2"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/runtime": {
"version": "7.18.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
"integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
"integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.16.7",
"@babel/parser": "^7.16.7",
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.18.5",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz",
"integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.16.7",
"@babel/generator": "^7.18.2",
"@babel/helper-environment-visitor": "^7.18.2",
"@babel/helper-function-name": "^7.17.9",
"@babel/helper-hoist-variables": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7",
"@babel/parser": "^7.18.5",
"@babel/types": "^7.18.4",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
"version": "7.18.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz",
"integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.16.7",
"to-fast-properties": "^2.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@discoveryjs/json-ext": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
"integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
"dev": true,
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/@fortawesome/fontawesome-free": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.1.1.tgz",
"integrity": "sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg==",
"hasInstallScript": true,
"engines": {
"node": ">=6"
}
},
"node_modules/@hotwired/stimulus": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.0.1.tgz",
"integrity": "sha512-oHsJhgY2cip+K2ED7vKUNd2P+BEswVhrCYcJ802DSsblJFv7mPFVk3cQKvm2vHgHeDVdnj7oOKrBbzp1u8D+KA==",
"dev": true
},
"node_modules/@hotwired/stimulus-webpack-helpers": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@hotwired/stimulus-webpack-helpers/-/stimulus-webpack-helpers-1.0.1.tgz",
"integrity": "sha512-wa/zupVG0eWxRYJjC1IiPBdt3Lruv0RqGN+/DTMmUWUyMAEB27KXmVY6a8YpUVTM7QwVuaLNGW4EqDgrS2upXQ==",
"dev": true,
"peerDependencies": {
"@hotwired/stimulus": ">= 3.0"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
"integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
"dev": true,
"dependencies": {
"@jridgewell/set-array": "^1.0.0",
"@jridgewell/sourcemap-codec": "^1.4.10"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
"integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
"integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
"integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
"dependencies": {
"@jridgewell/set-array": "^1.0.0",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.13",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
"integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w=="
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
"integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"node_modules/@leichtgewicht/ip-codec": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
"dev": true
},
"node_modules/@nuxt/friendly-errors-webpack-plugin": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/@nuxt/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-2.5.2.tgz",
"integrity": "sha512-LLc+90lnxVbpKkMqk5z1EWpXoODhc6gRkqqXJCInJwF5xabHAE7biFvbULfvTRmtaTzAaP8IV4HQDLUgeAUTTw==",
"dev": true,
"dependencies": {
"chalk": "^2.3.2",
"consola": "^2.6.0",
"error-stack-parser": "^2.0.0",
"string-width": "^4.2.3"
},
"engines": {
"node": ">=8.0.0",
"npm": ">=5.0.0"
},
"peerDependencies": {
"webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0"
}
},
"node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@popperjs/core": {
"version": "2.11.5",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz",
"integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@swc/helpers": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.2.14.tgz",
"integrity": "sha512-wpCQMhf5p5GhNg2MmGKXzUNwxe7zRiCsmqYsamez2beP7mKPCSiu+BjZcdN95yYSzO857kr0VfQewmGpS77nqA=="
},
"node_modules/@symfony/stimulus-bridge": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@symfony/stimulus-bridge/-/stimulus-bridge-3.2.1.tgz",
"integrity": "sha512-eawmVu+tLVkiTz7ewkcsxFvaSZKxFWXmdWxIsxr2jIfQ64PSJg7PIcd7GsPMDxX8sLwg3LGxXfJv5bASL1es+A==",
"dev": true,
"dependencies": {
"@hotwired/stimulus-webpack-helpers": "^1.0.1",
"@types/webpack-env": "^1.16.4",
"acorn": "^8.0.5",
"loader-utils": "^2.0.0",
"schema-utils": "^3.0.0"
},
"engines": {
"node": "^10.13.0 || >=12.0.0"
},
"peerDependencies": {
"@hotwired/stimulus": "^3.0"
}
},
"node_modules/@symfony/webpack-encore": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@symfony/webpack-encore/-/webpack-encore-2.1.0.tgz",
"integrity": "sha512-Cl4VhFUsiaG+R5vAntnpOqi0eBXyk2ccxR+7DatpJ9eq+qRtnxBD84/+q4jHM9AJ9gMqHzWTtBVcDmSj1rKuPA==",
"dev": true,
"dependencies": {
"@babel/core": "^7.17.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.0",
"@babel/preset-env": "^7.16.0",
"@nuxt/friendly-errors-webpack-plugin": "^2.5.1",
"assets-webpack-plugin": "7.0.*",
"babel-loader": "^8.2.2",
"chalk": "^4.0.0",
"clean-webpack-plugin": "^4.0.0",
"css-loader": "^6.7.0",
"css-minimizer-webpack-plugin": "^3.4.0",
"fast-levenshtein": "^3.0.0",
"mini-css-extract-plugin": "^2.6.0",
"pkg-up": "^3.1.0",
"pretty-error": "^4.0.0",
"resolve-url-loader": "^5.0.0",
"semver": "^7.3.2",
"style-loader": "^3.3.0",
"sync-rpc": "^1.3.6",
"terser-webpack-plugin": "^5.3.0",
"tmp": "^0.2.1",
"webpack": "^5.72",
"webpack-cli": "^4.9.1",
"webpack-dev-server": "^4.8.0",
"yargs-parser": "^21.0.0"
},
"bin": {
"encore": "bin/encore.js"
},
"engines": {
"node": "^12.13.0 || >=14.0.0"
}
},
"node_modules/@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
"dev": true,
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/@ttskch/select2-bootstrap4-theme": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ttskch/select2-bootstrap4-theme/-/select2-bootstrap4-theme-1.5.2.tgz",
"integrity": "sha512-gAj8qNy/VYwQDBkACm0USM66kxFai8flX83ayRXPNhzZckEgSqIBB9sM74SCM3ssgeX+ZVy4BifTnLis+KpIyg=="
},
"node_modules/@types/body-parser": {
"version": "1.19.2",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
"integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
"dev": true,
"dependencies": {
"@types/connect": "*",
"@types/node": "*"
}
},
"node_modules/@types/bonjour": {
"version": "3.5.10",
"resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
"integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/connect": {
"version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
"integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/connect-history-api-fallback": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
"integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
"dev": true,
"dependencies": {
"@types/express-serve-static-core": "*",
"@types/node": "*"
}
},
"node_modules/@types/eslint": {
"version": "8.4.3",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz",
"integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==",
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"node_modules/@types/eslint-scope": {
"version": "3.7.3",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
"integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": {
"version": "0.0.51",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
"integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
},
"node_modules/@types/express": {
"version": "4.17.13",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
"integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
"dev": true,
"dependencies": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.18",
"@types/qs": "*",
"@types/serve-static": "*"
}
},
"node_modules/@types/express-serve-static-core": {
"version": "4.17.29",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz",
"integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==",
"dev": true,
"dependencies": {
"@types/node": "*",
"@types/qs": "*",
"@types/range-parser": "*"
}
},
"node_modules/@types/glob": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
"dev": true,
"dependencies": {
"@types/minimatch": "*",
"@types/node": "*"
}
},
"node_modules/@types/http-proxy": {
"version": "1.17.9",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
"integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/json-schema": {
"version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
"integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
},
"node_modules/@types/mime": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
"dev": true
},
"node_modules/@types/minimatch": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
"dev": true
},
"node_modules/@types/node": {
"version": "18.0.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz",
"integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA=="
},
"node_modules/@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
"dev": true
},
"node_modules/@types/range-parser": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
"dev": true
},
"node_modules/@types/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
"integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
"dev": true
},
"node_modules/@types/serve-index": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
"integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
"dev": true,
"dependencies": {
"@types/express": "*"
}
},
"node_modules/@types/serve-static": {
"version": "1.13.10",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
"integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
"dev": true,
"dependencies": {
"@types/mime": "^1",
"@types/node": "*"
}
},
"node_modules/@types/sockjs": {
"version": "0.3.33",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
"integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/webpack-env": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.17.0.tgz",
"integrity": "sha512-eHSaNYEyxRA5IAG0Ym/yCyf86niZUIF/TpWKofQI/CVfh5HsMEUyfE2kwFxha4ow0s5g0LfISQxpDKjbRDrizw==",
"dev": true
},
"node_modules/@types/ws": {
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
"integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@webassemblyjs/ast": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
"integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
"dependencies": {
"@webassemblyjs/helper-numbers": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1"
}
},
"node_modules/@webassemblyjs/floating-point-hex-parser": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
"integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
},
"node_modules/@webassemblyjs/helper-api-error": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
"integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
},
"node_modules/@webassemblyjs/helper-buffer": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
"integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
},
"node_modules/@webassemblyjs/helper-numbers": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
"integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
"dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.11.1",
"@webassemblyjs/helper-api-error": "1.11.1",
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/helper-wasm-bytecode": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
"integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
},
"node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
"integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
"dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
"@webassemblyjs/wasm-gen": "1.11.1"
}
},
"node_modules/@webassemblyjs/ieee754": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
"integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
}
},
"node_modules/@webassemblyjs/leb128": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
"integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
"dependencies": {
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/utf8": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
"integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
},
"node_modules/@webassemblyjs/wasm-edit": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
"integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
"dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
"@webassemblyjs/helper-wasm-section": "1.11.1",
"@webassemblyjs/wasm-gen": "1.11.1",
"@webassemblyjs/wasm-opt": "1.11.1",
"@webassemblyjs/wasm-parser": "1.11.1",
"@webassemblyjs/wast-printer": "1.11.1"
}
},
"node_modules/@webassemblyjs/wasm-gen": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
"integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
"dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
"@webassemblyjs/ieee754": "1.11.1",
"@webassemblyjs/leb128": "1.11.1",
"@webassemblyjs/utf8": "1.11.1"
}
},
"node_modules/@webassemblyjs/wasm-opt": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
"integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
"dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1",
"@webassemblyjs/wasm-gen": "1.11.1",
"@webassemblyjs/wasm-parser": "1.11.1"
}
},
"node_modules/@webassemblyjs/wasm-parser": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
"integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
"dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-api-error": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
"@webassemblyjs/ieee754": "1.11.1",
"@webassemblyjs/leb128": "1.11.1",
"@webassemblyjs/utf8": "1.11.1"
}
},
"node_modules/@webassemblyjs/wast-printer": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
"integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
"dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webpack-cli/configtest": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
"integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
"dev": true,
"peerDependencies": {
"webpack": "4.x.x || 5.x.x",
"webpack-cli": "4.x.x"
}
},
"node_modules/@webpack-cli/info": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
"integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
"dev": true,
"dependencies": {
"envinfo": "^7.7.3"
},
"peerDependencies": {
"webpack-cli": "4.x.x"
}
},
"node_modules/@webpack-cli/serve": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
"integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
"dev": true,
"peerDependencies": {
"webpack-cli": "4.x.x"
},
"peerDependenciesMeta": {
"webpack-dev-server": {
"optional": true
}
}
},
"node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
},
"node_modules/accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"dev": true,
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/acorn": {
"version": "8.7.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-import-assertions": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
"integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
"peerDependencies": {
"acorn": "^8"
}
},
"node_modules/adjust-sourcemap-loader": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
"integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
"dev": true,
"dependencies": {
"loader-utils": "^2.0.0",
"regex-parser": "^2.2.11"
},
"engines": {
"node": ">=8.9"
}
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-formats": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"dev": true,
"dependencies": {
"ajv": "^8.0.0"
},
"peerDependencies": {
"ajv": "^8.0.0"
},
"peerDependenciesMeta": {
"ajv": {
"optional": true
}
}
},
"node_modules/ajv-formats/node_modules/ajv": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
"integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-formats/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/ansi-html-community": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
"integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
"dev": true,
"engines": [
"node >= 0.8.0"
],
"bin": {
"ansi-html": "bin/ansi-html"
}
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/array-flatten": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
"integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
"dev": true
},
"node_modules/array-union": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
"integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
"dev": true,
"dependencies": {
"array-uniq": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/array-uniq": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
"integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/assets-webpack-plugin": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/assets-webpack-plugin/-/assets-webpack-plugin-7.0.0.tgz",
"integrity": "sha512-DMZ9r6HFxynWeONRMhSOFTvTrmit5dovdoUKdJgCG03M6CC7XiwNImPH+Ad1jaVrQ2n59e05lBhte52xPt4MSA==",
"dev": true,
"dependencies": {
"camelcase": "^6.0.0",
"escape-string-regexp": "^4.0.0",
"lodash": "^4.17.20"
},
"engines": {
"node": ">=10.x.x"
},
"peerDependencies": {
"webpack": ">=5.0.0"
}
},
"node_modules/babel-loader": {
"version": "8.2.5",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz",
"integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
"dev": true,
"dependencies": {
"find-cache-dir": "^3.3.1",
"loader-utils": "^2.0.0",
"make-dir": "^3.1.0",
"schema-utils": "^2.6.5"
},
"engines": {
"node": ">= 8.9"
},
"peerDependencies": {
"@babel/core": "^7.0.0",
"webpack": ">=2"
}
},
"node_modules/babel-loader/node_modules/schema-utils": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
"integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.5",
"ajv": "^6.12.4",
"ajv-keywords": "^3.5.2"
},
"engines": {
"node": ">= 8.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/babel-plugin-dynamic-import-node": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
"integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
"dev": true,
"dependencies": {
"object.assign": "^4.1.0"
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
"integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.13.11",
"@babel/helper-define-polyfill-provider": "^0.3.1",
"semver": "^6.1.1"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/babel-plugin-polyfill-corejs3": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
"integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
"dev": true,
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.3.1",
"core-js-compat": "^3.21.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/babel-plugin-polyfill-regenerator": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
"integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
"dev": true,
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.3.1"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"node_modules/batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
"dev": true
},
"node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"engines": {
"node": "*"
}
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/body-parser": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
"integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
"dev": true,
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.10.3",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/body-parser/node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/body-parser/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/body-parser/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"node_modules/bonjour-service": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz",
"integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==",
"dev": true,
"dependencies": {
"array-flatten": "^2.1.2",
"dns-equal": "^1.0.0",
"fast-deep-equal": "^3.1.3",
"multicast-dns": "^7.2.5"
}
},
"node_modules/boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"dev": true
},
"node_modules/bootstrap": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
"integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/bootstrap"
},
"peerDependencies": {
"@popperjs/core": "^2.10.2"
}
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/browserslist": {
"version": "4.20.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
"integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
}
],
"dependencies": {
"caniuse-lite": "^1.0.30001349",
"electron-to-chromium": "^1.4.147",
"escalade": "^3.1.1",
"node-releases": "^2.0.5",
"picocolors": "^1.0.0"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"node_modules/bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/camelcase": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
"integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
"dev": true,
"dependencies": {
"browserslist": "^4.0.0",
"caniuse-lite": "^1.0.0",
"lodash.memoize": "^4.1.2",
"lodash.uniq": "^4.5.0"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001356",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001356.tgz",
"integrity": "sha512-/30854bktMLhxtjieIxsrJBfs2gTM1pel6MXKF3K+RdIVJZcsn2A2QdhsuR4/p9+R204fZw0zCBBhktX8xWuyQ==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
}
]
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/chrome-trace-event": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
"integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
"engines": {
"node": ">=6.0"
}
},
"node_modules/ckeditor4": {
"version": "4.19.0",
"resolved": "https://registry.npmjs.org/ckeditor4/-/ckeditor4-4.19.0.tgz",
"integrity": "sha512-hh+SslqHmqr9xmcUVMgdmWjO4tdxW+Lzd6jfxDzzjf6zwIFIoNSflgCqUvg2wcry4w0dHgdEoxVMdoJK9E7kUw=="
},
"node_modules/clean-webpack-plugin": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz",
"integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==",
"dev": true,
"dependencies": {
"del": "^4.1.1"
},
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"webpack": ">=4.0.0 <6.0.0"
}
},
"node_modules/clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
"integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
"dev": true,
"dependencies": {
"is-plain-object": "^2.0.4",
"kind-of": "^6.0.2",
"shallow-clone": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/colord": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
"integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
"dev": true
},
"node_modules/colorette": {
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
"node_modules/commander": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true,
"engines": {
"node": ">= 10"
}
},
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true
},
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
"integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
"dev": true,
"dependencies": {
"mime-db": ">= 1.43.0 < 2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/compression": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
"integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
"dev": true,
"dependencies": {
"accepts": "~1.3.5",
"bytes": "3.0.0",
"compressible": "~2.0.16",
"debug": "2.6.9",
"on-headers": "~1.0.2",
"safe-buffer": "5.1.2",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/compression/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/compression/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"node_modules/connect-history-api-fallback": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
"integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
"dev": true,
"engines": {
"node": ">=0.8"
}
},
"node_modules/consola": {
"version": "2.15.3",
"resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
"integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==",
"dev": true
},
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"dev": true,
"dependencies": {
"safe-buffer": "5.2.1"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/content-disposition/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/convert-source-map": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
"integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.1"
}
},
"node_modules/cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"dev": true
},
"node_modules/core-js": {
"version": "3.23.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.1.tgz",
"integrity": "sha512-wfMYHWi1WQjpgZNC9kAlN4ut04TM9fUTdi7CqIoTVM7yaiOUQTklOzfb+oWH3r9edQcT3F887swuVmxrV+CC8w==",
"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
"dev": true,
"hasInstallScript": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/core-js-compat": {
"version": "3.23.1",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.1.tgz",
"integrity": "sha512-KeYrEc8t6FJsKYB2qnDwRHWaC0cJNaqlHfCpMe5q3j/W1nje3moib/txNklddLPCtGb+etcBIyJ8zuMa/LN5/A==",
"dev": true,
"dependencies": {
"browserslist": "^4.20.4",
"semver": "7.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/core-js-compat/node_modules/semver": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true
},
"node_modules/crop-select-js": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/crop-select-js/-/crop-select-js-1.0.1.tgz",
"integrity": "sha512-spYDZnzUXxZvSmtcj1iMP4sR2f0ccYzUFnjd4MdxJNe9vaId0AQ/BQAVAtEaIyxz6BDE1zJbaVOPmy44uIbBDw=="
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/css-declaration-sorter": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz",
"integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >=14"
},
"peerDependencies": {
"postcss": "^8.0.9"
}
},
"node_modules/css-loader": {
"version": "6.7.1",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz",
"integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==",
"dev": true,
"dependencies": {
"icss-utils": "^5.1.0",
"postcss": "^8.4.7",
"postcss-modules-extract-imports": "^3.0.0",
"postcss-modules-local-by-default": "^4.0.0",
"postcss-modules-scope": "^3.0.0",
"postcss-modules-values": "^4.0.0",
"postcss-value-parser": "^4.2.0",
"semver": "^7.3.5"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.0.0"
}
},
"node_modules/css-minimizer-webpack-plugin": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz",
"integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==",
"dev": true,
"dependencies": {
"cssnano": "^5.0.6",
"jest-worker": "^27.0.2",
"postcss": "^8.3.5",
"schema-utils": "^4.0.0",
"serialize-javascript": "^6.0.0",
"source-map": "^0.6.1"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.0.0"
},
"peerDependenciesMeta": {
"@parcel/css": {
"optional": true
},
"clean-css": {
"optional": true
},
"csso": {
"optional": true
},
"esbuild": {
"optional": true
}
}
},
"node_modules/css-minimizer-webpack-plugin/node_modules/ajv": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
"integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
"integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.8.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.0.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/css-select": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
"integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
"dev": true,
"dependencies": {
"boolbase": "^1.0.0",
"css-what": "^6.0.1",
"domhandler": "^4.3.1",
"domutils": "^2.8.0",
"nth-check": "^2.0.1"
},
"funding": {
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css-tree": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
"integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
"dev": true,
"dependencies": {
"mdn-data": "2.0.14",
"source-map": "^0.6.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/css-what": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
"integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
"dev": true,
"engines": {
"node": ">= 6"
},
"funding": {
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true,
"bin": {
"cssesc": "bin/cssesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/cssnano": {
"version": "5.1.12",
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.12.tgz",
"integrity": "sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==",
"dev": true,
"dependencies": {
"cssnano-preset-default": "^5.2.12",
"lilconfig": "^2.0.3",
"yaml": "^1.10.2"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/cssnano"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/cssnano-preset-default": {
"version": "5.2.12",
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz",
"integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==",
"dev": true,
"dependencies": {
"css-declaration-sorter": "^6.3.0",
"cssnano-utils": "^3.1.0",
"postcss-calc": "^8.2.3",
"postcss-colormin": "^5.3.0",
"postcss-convert-values": "^5.1.2",
"postcss-discard-comments": "^5.1.2",
"postcss-discard-duplicates": "^5.1.0",
"postcss-discard-empty": "^5.1.1",
"postcss-discard-overridden": "^5.1.0",
"postcss-merge-longhand": "^5.1.6",
"postcss-merge-rules": "^5.1.2",
"postcss-minify-font-values": "^5.1.0",
"postcss-minify-gradients": "^5.1.1",
"postcss-minify-params": "^5.1.3",
"postcss-minify-selectors": "^5.2.1",
"postcss-normalize-charset": "^5.1.0",
"postcss-normalize-display-values": "^5.1.0",
"postcss-normalize-positions": "^5.1.1",
"postcss-normalize-repeat-style": "^5.1.1",
"postcss-normalize-string": "^5.1.0",
"postcss-normalize-timing-functions": "^5.1.0",
"postcss-normalize-unicode": "^5.1.0",
"postcss-normalize-url": "^5.1.0",
"postcss-normalize-whitespace": "^5.1.1",
"postcss-ordered-values": "^5.1.3",
"postcss-reduce-initial": "^5.1.0",
"postcss-reduce-transforms": "^5.1.0",
"postcss-svgo": "^5.1.0",
"postcss-unique-selectors": "^5.1.1"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/cssnano-utils": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
"integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/csso": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
"integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
"dev": true,
"dependencies": {
"css-tree": "^1.1.2"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/datatables.net": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.12.1.tgz",
"integrity": "sha512-e6XAMUoV41JdQPS/r9YRfRcmTPcCVvyZbWI+xog1Zg+kjVliMQbEkvWK5XFItmi64Cvwg+IqsZbTUJ1KSY3umA==",
"dependencies": {
"jquery": ">=1.7"
}
},
"node_modules/datatables.net-bs4": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/datatables.net-bs4/-/datatables.net-bs4-1.12.1.tgz",
"integrity": "sha512-LBeC8zUNVYyQT7ytC2lYqyXDn+k2kYpqvijC83oOjlcnEtb/8Tduzgquox5FrNKUJPcUrj9r+h5B0TDBbob/Gg==",
"dependencies": {
"datatables.net": ">=1.11.3",
"jquery": ">=1.7"
}
},
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/default-gateway": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
"integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
"dev": true,
"dependencies": {
"execa": "^5.0.0"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
"integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/define-properties": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
"integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
"dev": true,
"dependencies": {
"has-property-descriptors": "^1.0.0",
"object-keys": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/del": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
"integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
"dev": true,
"dependencies": {
"@types/glob": "^7.1.1",
"globby": "^6.1.0",
"is-path-cwd": "^2.0.0",
"is-path-in-cwd": "^2.0.0",
"p-map": "^2.0.0",
"pify": "^4.0.1",
"rimraf": "^2.6.3"
},
"engines": {
"node": ">=6"
}
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"dev": true,
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/detect-node": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"dev": true
},
"node_modules/dns-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
"integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
"dev": true
},
"node_modules/dns-packet": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz",
"integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==",
"dev": true,
"dependencies": {
"@leichtgewicht/ip-codec": "^2.0.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
"integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
"dev": true,
"dependencies": {
"utila": "~0.4"
}
},
"node_modules/dom-serializer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
"dev": true,
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
},
"funding": {
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
]
},
"node_modules/domhandler": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
"integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
"dev": true,
"dependencies": {
"domelementtype": "^2.2.0"
},
"engines": {
"node": ">= 4"
},
"funding": {
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
"dev": true,
"dependencies": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
},
"funding": {
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/dropzone": {
"version": "6.0.0-beta.2",
"resolved": "https://registry.npmjs.org/dropzone/-/dropzone-6.0.0-beta.2.tgz",
"integrity": "sha512-k44yLuFFhRk53M8zP71FaaNzJYIzr99SKmpbO/oZKNslDjNXQsBTdfLs+iONd0U0L94zzlFzRnFdqbLcs7h9fQ==",
"dependencies": {
"@swc/helpers": "^0.2.13",
"just-extend": "^5.0.0"
}
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"dev": true
},
"node_modules/electron-to-chromium": {
"version": "1.4.161",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.161.tgz",
"integrity": "sha512-sTjBRhqh6wFodzZtc5Iu8/R95OkwaPNn7tj/TaDU5nu/5EFiQDtADGAXdR4tJcTEHlYfJpHqigzJqHvPgehP8A=="
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"node_modules/emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"engines": {
"node": ">= 4"
}
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/enhanced-resolve": {
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz",
"integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true,
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/envinfo": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
"integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
"dev": true,
"bin": {
"envinfo": "dist/cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/error-stack-parser": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
"integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
"dev": true,
"dependencies": {
"stackframe": "^1.3.4"
}
},
"node_modules/es-module-lexer": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"engines": {
"node": ">=6"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"dev": true
},
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dependencies": {
"estraverse": "^5.2.0"
},
"engines": {
"node": ">=4.0"
}
},
"node_modules/esrecurse/node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"engines": {
"node": ">=4.0"
}
},
"node_modules/estraverse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"engines": {
"node": ">=4.0"
}
},
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true
},
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"dev": true,
"dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
"human-signals": "^2.1.0",
"is-stream": "^2.0.0",
"merge-stream": "^2.0.0",
"npm-run-path": "^4.0.1",
"onetime": "^5.1.2",
"signal-exit": "^3.0.3",
"strip-final-newline": "^2.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/express": {
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
"integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
"dev": true,
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.0",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
"qs": "6.10.3",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/express/node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"dev": true
},
"node_modules/express/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/express/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"node_modules/express/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"node_modules/fast-levenshtein": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz",
"integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==",
"dev": true,
"dependencies": {
"fastest-levenshtein": "^1.0.7"
}
},
"node_modules/fastest-levenshtein": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
"integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
"dev": true
},
"node_modules/faye-websocket": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
"integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
"dev": true,
"dependencies": {
"websocket-driver": ">=0.5.1"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
"integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
"dependencies": {
"loader-utils": "^2.0.0",
"schema-utils": "^3.0.0"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.0.0 || ^5.0.0"
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"dev": true,
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"statuses": "2.0.1",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/finalhandler/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/finalhandler/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"node_modules/find-cache-dir": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
"integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
"dev": true,
"dependencies": {
"commondir": "^1.0.1",
"make-dir": "^3.0.2",
"pkg-dir": "^4.1.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/avajs/find-cache-dir?sponsor=1"
}
},
"node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/follow-redirects": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fs-monkey": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
"integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
"dev": true
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/get-intrinsic": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
"integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-port": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
"integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
},
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/globby": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
"integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
"dev": true,
"dependencies": {
"array-union": "^1.0.1",
"glob": "^7.0.3",
"object-assign": "^4.0.1",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/globby/node_modules/pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
},
"node_modules/growly": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
"integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==",
"dev": true
},
"node_modules/handle-thing": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
"integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
"dev": true
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
"integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.1.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hpack.js": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
"integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
"dev": true,
"dependencies": {
"inherits": "^2.0.1",
"obuf": "^1.0.0",
"readable-stream": "^2.0.1",
"wbuf": "^1.1.0"
}
},
"node_modules/hpack.js/node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/hpack.js/node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/html-entities": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
"integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
"dev": true
},
"node_modules/htmlparser2": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
"integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
"dev": true,
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
],
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.0.0",
"domutils": "^2.5.2",
"entities": "^2.0.0"
}
},
"node_modules/http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
"integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
"dev": true
},
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dev": true,
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/http-parser-js": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz",
"integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==",
"dev": true
},
"node_modules/http-proxy": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"dev": true,
"dependencies": {
"eventemitter3": "^4.0.0",
"follow-redirects": "^1.0.0",
"requires-port": "^1.0.0"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/http-proxy-middleware": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
"integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
"dev": true,
"dependencies": {
"@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1",
"is-glob": "^4.0.1",
"is-plain-obj": "^3.0.0",
"micromatch": "^4.0.2"
},
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"@types/express": "^4.17.13"
},
"peerDependenciesMeta": {
"@types/express": {
"optional": true
}
}
},
"node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true,
"engines": {
"node": ">=10.17.0"
}
},
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/icss-utils": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
"integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/import-local": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
"integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
"dev": true,
"dependencies": {
"pkg-dir": "^4.2.0",
"resolve-cwd": "^3.0.0"
},
"bin": {
"import-local-fixture": "fixtures/cli.js"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"node_modules/interpret": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
"integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
"dev": true,
"engines": {
"node": ">= 0.10"
}
},
"node_modules/ipaddr.js": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
"integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
"dev": true,
"engines": {
"node": ">= 10"
}
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-core-module": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
"dev": true,
"dependencies": {
"has": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"dev": true,
"bin": {
"is-docker": "cli.js"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-path-cwd": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
"integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/is-path-in-cwd": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
"integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
"dev": true,
"dependencies": {
"is-path-inside": "^2.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/is-path-inside": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
"integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
"dev": true,
"dependencies": {
"path-is-inside": "^1.0.2"
},
"engines": {
"node": ">=6"
}
},
"node_modules/is-plain-obj": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"dev": true,
"dependencies": {
"isobject": "^3.0.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"dev": true,
"dependencies": {
"is-docker": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"dev": true
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"node_modules/isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/jest-worker": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/jest-worker/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jquery": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
},
"node_modules/jquery-ui": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz",
"integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==",
"dependencies": {
"jquery": ">=1.8.0 <4.0.0"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true,
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"node_modules/json5": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/just-extend": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-5.1.1.tgz",
"integrity": "sha512-b+z6yF1d4EOyDgylzQo5IminlUmzSeqR1hs/bzjBNjuGras4FXq/6TrzjxfN0j+TmI0ltJzTNlqXUMCniciwKQ=="
},
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/lilconfig": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
"integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"engines": {
"node": ">=6.11.5"
}
},
"node_modules/loader-utils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
"dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
},
"engines": {
"node": ">=8.9.0"
}
},
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"dev": true
},
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
"dev": true
},
"node_modules/lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
"dev": true
},
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"dependencies": {
"semver": "^6.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/make-dir/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/mdn-data": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"dev": true
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/memfs": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz",
"integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==",
"dev": true,
"dependencies": {
"fs-monkey": "1.0.3"
},
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
"dev": true
},
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
},
"node_modules/methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true,
"dependencies": {
"braces": "^3.0.2",
"picomatch": "^2.3.1"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/mini-css-extract-plugin": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz",
"integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==",
"dev": true,
"dependencies": {
"schema-utils": "^4.0.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.0.0"
}
},
"node_modules/mini-css-extract-plugin/node_modules/ajv": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
"integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"node_modules/mini-css-extract-plugin/node_modules/schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
"integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.8.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.0.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
"dev": true
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node_modules/multicast-dns": {
"version": "7.2.5",
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
"integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
"dev": true,
"dependencies": {
"dns-packet": "^5.2.2",
"thunky": "^1.0.2"
},
"bin": {
"multicast-dns": "cli.js"
}
},
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
"node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
"dev": true,
"engines": {
"node": ">= 6.13.0"
}
},
"node_modules/node-notifier": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz",
"integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==",
"dev": true,
"dependencies": {
"growly": "^1.3.0",
"is-wsl": "^2.2.0",
"semver": "^7.3.2",
"shellwords": "^0.1.1",
"uuid": "^8.3.0",
"which": "^2.0.2"
}
},
"node_modules/node-releases": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
"integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q=="
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/normalize-url": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
"dev": true,
"dependencies": {
"path-key": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"dev": true,
"dependencies": {
"boolbase": "^1.0.0"
},
"funding": {
"url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.assign": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
"integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3",
"has-symbols": "^1.0.1",
"object-keys": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/obuf": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
"integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
"dev": true
},
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dev": true,
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"dependencies": {
"wrappy": "1"
}
},
"node_modules/onetime": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
"dependencies": {
"mimic-fn": "^2.1.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/open": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
"integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
"dev": true,
"dependencies": {
"define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1",
"is-wsl": "^2.2.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-map": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
"integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/p-retry": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
"integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
"dev": true,
"dependencies": {
"@types/retry": "0.12.0",
"retry": "^0.13.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-is-inside": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
"integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
"dev": true
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"dev": true
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
"dev": true,
"dependencies": {
"pinkie": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
"dependencies": {
"find-up": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-up": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
"integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
"dev": true,
"dependencies": {
"find-up": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-up/node_modules/find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"dependencies": {
"locate-path": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/pkg-up/node_modules/locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"dependencies": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/pkg-up/node_modules/p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"dependencies": {
"p-limit": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/pkg-up/node_modules/path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/postcss": {
"version": "8.4.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
"integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
}
],
"dependencies": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postcss-calc": {
"version": "8.2.4",
"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
"integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.9",
"postcss-value-parser": "^4.2.0"
},
"peerDependencies": {
"postcss": "^8.2.2"
}
},
"node_modules/postcss-colormin": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz",
"integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==",
"dev": true,
"dependencies": {
"browserslist": "^4.16.6",
"caniuse-api": "^3.0.0",
"colord": "^2.9.1",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-convert-values": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz",
"integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==",
"dev": true,
"dependencies": {
"browserslist": "^4.20.3",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-discard-comments": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
"integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-discard-duplicates": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
"integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-discard-empty": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
"integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-discard-overridden": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
"integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-merge-longhand": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz",
"integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0",
"stylehacks": "^5.1.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-merge-rules": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz",
"integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==",
"dev": true,
"dependencies": {
"browserslist": "^4.16.6",
"caniuse-api": "^3.0.0",
"cssnano-utils": "^3.1.0",
"postcss-selector-parser": "^6.0.5"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-minify-font-values": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
"integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-minify-gradients": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
"integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
"dev": true,
"dependencies": {
"colord": "^2.9.1",
"cssnano-utils": "^3.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-minify-params": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz",
"integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==",
"dev": true,
"dependencies": {
"browserslist": "^4.16.6",
"cssnano-utils": "^3.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-minify-selectors": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
"integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.5"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-modules-extract-imports": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
"integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-modules-local-by-default": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
"integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
"dev": true,
"dependencies": {
"icss-utils": "^5.0.0",
"postcss-selector-parser": "^6.0.2",
"postcss-value-parser": "^4.1.0"
},
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-modules-scope": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
"integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.4"
},
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-modules-values": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
"integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
"dev": true,
"dependencies": {
"icss-utils": "^5.0.0"
},
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-normalize-charset": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
"integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
"dev": true,
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-display-values": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
"integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-positions": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
"integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-repeat-style": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
"integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-string": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
"integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-timing-functions": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
"integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-unicode": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz",
"integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==",
"dev": true,
"dependencies": {
"browserslist": "^4.16.6",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-url": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
"integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
"dev": true,
"dependencies": {
"normalize-url": "^6.0.1",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-whitespace": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
"integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-ordered-values": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
"integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
"dev": true,
"dependencies": {
"cssnano-utils": "^3.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-reduce-initial": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz",
"integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==",
"dev": true,
"dependencies": {
"browserslist": "^4.16.6",
"caniuse-api": "^3.0.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-reduce-transforms": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
"integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.10",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/postcss-svgo": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
"integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0",
"svgo": "^2.7.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-unique-selectors": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
"integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.5"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"node_modules/pretty-error": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
"integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
"dev": true,
"dependencies": {
"lodash": "^4.17.20",
"renderkid": "^3.0.0"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"dev": true,
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/proxy-addr/node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"dev": true,
"engines": {
"node": ">= 0.10"
}
},
"node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"engines": {
"node": ">=6"
}
},
"node_modules/qs": {
"version": "6.10.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
"integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
"dev": true,
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dependencies": {
"safe-buffer": "^5.1.0"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/raw-body": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"dev": true,
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/raw-body/node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true,
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/rechoir": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
"integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
"dev": true,
"dependencies": {
"resolve": "^1.9.0"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
"integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
"dev": true
},
"node_modules/regenerate-unicode-properties": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
"integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==",
"dev": true,
"dependencies": {
"regenerate": "^1.4.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
"dev": true
},
"node_modules/regenerator-transform": {
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
"integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.8.4"
}
},
"node_modules/regex-parser": {
"version": "2.2.11",
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
"integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==",
"dev": true
},
"node_modules/regexpu-core": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz",
"integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==",
"dev": true,
"dependencies": {
"regenerate": "^1.4.2",
"regenerate-unicode-properties": "^10.0.1",
"regjsgen": "^0.6.0",
"regjsparser": "^0.8.2",
"unicode-match-property-ecmascript": "^2.0.0",
"unicode-match-property-value-ecmascript": "^2.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/regjsgen": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz",
"integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==",
"dev": true
},
"node_modules/regjsparser": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz",
"integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
"dev": true,
"dependencies": {
"jsesc": "~0.5.0"
},
"bin": {
"regjsparser": "bin/parser"
}
},
"node_modules/regjsparser/node_modules/jsesc": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
"integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
"dev": true,
"bin": {
"jsesc": "bin/jsesc"
}
},
"node_modules/renderkid": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
"integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
"dev": true,
"dependencies": {
"css-select": "^4.1.3",
"dom-converter": "^0.2.0",
"htmlparser2": "^6.1.0",
"lodash": "^4.17.21",
"strip-ansi": "^6.0.1"
}
},
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true
},
"node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"dependencies": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/resolve-cwd": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
"integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
"dev": true,
"dependencies": {
"resolve-from": "^5.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/resolve-url-loader": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz",
"integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==",
"dev": true,
"dependencies": {
"adjust-sourcemap-loader": "^4.0.0",
"convert-source-map": "^1.7.0",
"loader-utils": "^2.0.0",
"postcss": "^8.2.14",
"source-map": "0.6.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/retry": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
"integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"dev": true,
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
}
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"node_modules/schema-utils": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
"dependencies": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
"integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
"dev": true
},
"node_modules/select2": {
"version": "4.1.0-rc.0",
"resolved": "https://registry.npmjs.org/select2/-/select2-4.1.0-rc.0.tgz",
"integrity": "sha512-Hr9TdhyHCZUtwznEH2CBf7967mEM0idtJ5nMtjvk3Up5tPukOLXbHUNmh10oRfeNIhj+3GD3niu+g6sVK+gK0A=="
},
"node_modules/selfsigned": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz",
"integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==",
"dev": true,
"dependencies": {
"node-forge": "^1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/semver": {
"version": "7.3.7",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"dev": true,
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"mime": "1.6.0",
"ms": "2.1.3",
"on-finished": "2.4.1",
"range-parser": "~1.2.1",
"statuses": "2.0.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/send/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/send/node_modules/debug/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
"node_modules/serialize-javascript": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
"dependencies": {
"randombytes": "^2.1.0"
}
},
"node_modules/serve-index": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
"integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
"dev": true,
"dependencies": {
"accepts": "~1.3.4",
"batch": "0.6.1",
"debug": "2.6.9",
"escape-html": "~1.0.3",
"http-errors": "~1.6.2",
"mime-types": "~2.1.17",
"parseurl": "~1.3.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/serve-index/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/serve-index/node_modules/depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-index/node_modules/http-errors": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
"integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
"dev": true,
"dependencies": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.0",
"statuses": ">= 1.4.0 < 2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-index/node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
"dev": true
},
"node_modules/serve-index/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"node_modules/serve-index/node_modules/setprototypeof": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
"dev": true
},
"node_modules/serve-index/node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"dev": true,
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true
},
"node_modules/shallow-clone": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
"integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
"dev": true,
"dependencies": {
"kind-of": "^6.0.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/shellwords": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
"integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
"dev": true
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
"node_modules/sockjs": {
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
"integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
"dev": true,
"dependencies": {
"faye-websocket": "^0.11.3",
"uuid": "^8.3.2",
"websocket-driver": "^0.7.4"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/spdy": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
"integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
"dev": true,
"dependencies": {
"debug": "^4.1.0",
"handle-thing": "^2.0.0",
"http-deceiver": "^1.2.7",
"select-hose": "^2.0.0",
"spdy-transport": "^3.0.0"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/spdy-transport": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
"integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
"dev": true,
"dependencies": {
"debug": "^4.1.0",
"detect-node": "^2.0.4",
"hpack.js": "^2.1.6",
"obuf": "^1.1.2",
"readable-stream": "^3.0.6",
"wbuf": "^1.7.3"
}
},
"node_modules/spectrum-colorpicker2": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/spectrum-colorpicker2/-/spectrum-colorpicker2-2.0.9.tgz",
"integrity": "sha512-tyNppC56VQHdoKtWdkEkqQfLg9D1hhBea/laO3ffJGrBs3uwFmCxpcBK3a2IOpxZnioykiT+bGlT3SsI7UySRw=="
},
"node_modules/stable": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
"deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
"dev": true
},
"node_modules/stackframe": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
"integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
"dev": true
},
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string_decoder/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-final-newline": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/style-loader": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz",
"integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==",
"dev": true,
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.0.0"
}
},
"node_modules/stylehacks": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz",
"integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==",
"dev": true,
"dependencies": {
"browserslist": "^4.16.6",
"postcss-selector-parser": "^6.0.4"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/svgo": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
"integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
"dev": true,
"dependencies": {
"@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^4.1.3",
"css-tree": "^1.1.3",
"csso": "^4.2.0",
"picocolors": "^1.0.0",
"stable": "^0.1.8"
},
"bin": {
"svgo": "bin/svgo"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/sync-rpc": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
"integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
"dev": true,
"dependencies": {
"get-port": "^3.1.0"
}
},
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
"engines": {
"node": ">=6"
}
},
"node_modules/terser": {
"version": "5.14.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
"integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
"dependencies": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/terser-webpack-plugin": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz",
"integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.7",
"jest-worker": "^27.4.5",
"schema-utils": "^3.1.1",
"serialize-javascript": "^6.0.0",
"terser": "^5.7.2"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.1.0"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"esbuild": {
"optional": true
},
"uglify-js": {
"optional": true
}
}
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
"dev": true
},
"node_modules/tmp": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
"integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
"dev": true,
"dependencies": {
"rimraf": "^3.0.0"
},
"engines": {
"node": ">=8.17.0"
}
},
"node_modules/tmp/node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true,
"engines": {
"node": ">=0.6"
}
},
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dev": true,
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
"integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-match-property-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
"integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
"dev": true,
"dependencies": {
"unicode-canonical-property-names-ecmascript": "^2.0.0",
"unicode-property-aliases-ecmascript": "^2.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-match-property-value-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
"integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-property-aliases-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
"integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
"node_modules/utila": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
"integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
"dev": true
},
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"dev": true,
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true,
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"dev": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/watchpack": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
"integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/wbuf": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
"integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
"dev": true,
"dependencies": {
"minimalistic-assert": "^1.0.0"
}
},
"node_modules/webpack": {
"version": "5.73.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz",
"integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==",
"dependencies": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^0.0.51",
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/wasm-edit": "1.11.1",
"@webassemblyjs/wasm-parser": "1.11.1",
"acorn": "^8.4.1",
"acorn-import-assertions": "^1.7.6",
"browserslist": "^4.14.5",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.9.3",
"es-module-lexer": "^0.9.0",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.2.9",
"json-parse-even-better-errors": "^2.3.1",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
"schema-utils": "^3.1.0",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.1.3",
"watchpack": "^2.3.1",
"webpack-sources": "^3.2.3"
},
"bin": {
"webpack": "bin/webpack.js"
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependenciesMeta": {
"webpack-cli": {
"optional": true
}
}
},
"node_modules/webpack-cli": {
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
"integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
"dev": true,
"dependencies": {
"@discoveryjs/json-ext": "^0.5.0",
"@webpack-cli/configtest": "^1.2.0",
"@webpack-cli/info": "^1.5.0",
"@webpack-cli/serve": "^1.7.0",
"colorette": "^2.0.14",
"commander": "^7.0.0",
"cross-spawn": "^7.0.3",
"fastest-levenshtein": "^1.0.12",
"import-local": "^3.0.2",
"interpret": "^2.2.0",
"rechoir": "^0.7.0",
"webpack-merge": "^5.7.3"
},
"bin": {
"webpack-cli": "bin/cli.js"
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "4.x.x || 5.x.x"
},
"peerDependenciesMeta": {
"@webpack-cli/generators": {
"optional": true
},
"@webpack-cli/migrate": {
"optional": true
},
"webpack-bundle-analyzer": {
"optional": true
},
"webpack-dev-server": {
"optional": true
}
}
},
"node_modules/webpack-dev-middleware": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
"integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
"dev": true,
"dependencies": {
"colorette": "^2.0.10",
"memfs": "^3.4.3",
"mime-types": "^2.1.31",
"range-parser": "^1.2.1",
"schema-utils": "^4.0.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.0.0 || ^5.0.0"
}
},
"node_modules/webpack-dev-middleware/node_modules/ajv": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
"integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"node_modules/webpack-dev-middleware/node_modules/schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
"integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.8.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.0.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/webpack-dev-server": {
"version": "4.9.2",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz",
"integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==",
"dev": true,
"dependencies": {
"@types/bonjour": "^3.5.9",
"@types/connect-history-api-fallback": "^1.3.5",
"@types/express": "^4.17.13",
"@types/serve-index": "^1.9.1",
"@types/serve-static": "^1.13.10",
"@types/sockjs": "^0.3.33",
"@types/ws": "^8.5.1",
"ansi-html-community": "^0.0.8",
"bonjour-service": "^1.0.11",
"chokidar": "^3.5.3",
"colorette": "^2.0.10",
"compression": "^1.7.4",
"connect-history-api-fallback": "^1.6.0",
"default-gateway": "^6.0.3",
"express": "^4.17.3",
"graceful-fs": "^4.2.6",
"html-entities": "^2.3.2",
"http-proxy-middleware": "^2.0.3",
"ipaddr.js": "^2.0.1",
"open": "^8.0.9",
"p-retry": "^4.5.0",
"rimraf": "^3.0.2",
"schema-utils": "^4.0.0",
"selfsigned": "^2.0.1",
"serve-index": "^1.9.1",
"sockjs": "^0.3.24",
"spdy": "^4.0.2",
"webpack-dev-middleware": "^5.3.1",
"ws": "^8.4.2"
},
"bin": {
"webpack-dev-server": "bin/webpack-dev-server.js"
},
"engines": {
"node": ">= 12.13.0"
},
"peerDependencies": {
"webpack": "^4.37.0 || ^5.0.0"
},
"peerDependenciesMeta": {
"webpack-cli": {
"optional": true
}
}
},
"node_modules/webpack-dev-server/node_modules/ajv": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
"integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/webpack-dev-server/node_modules/ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"node_modules/webpack-dev-server/node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/webpack-dev-server/node_modules/schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
"integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.8.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.0.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/webpack-merge": {
"version": "5.8.0",
"resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
"integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
"dev": true,
"dependencies": {
"clone-deep": "^4.0.1",
"wildcard": "^2.0.0"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/webpack-notifier": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.15.0.tgz",
"integrity": "sha512-N2V8UMgRB5komdXQRavBsRpw0hPhJq2/SWNOGuhrXpIgRhcMexzkGQysUyGStHLV5hkUlgpRiF7IUXoBqyMmzQ==",
"dev": true,
"dependencies": {
"node-notifier": "^9.0.0",
"strip-ansi": "^6.0.0"
},
"peerDependencies": {
"@types/webpack": ">4.41.31"
},
"peerDependenciesMeta": {
"@types/webpack": {
"optional": true
}
}
},
"node_modules/webpack-sources": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/websocket-driver": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
"integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
"dev": true,
"dependencies": {
"http-parser-js": ">=0.5.1",
"safe-buffer": ">=5.1.0",
"websocket-extensions": ">=0.1.1"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/websocket-extensions": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/wildcard": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
"node_modules/ws": {
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz",
"integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==",
"dev": true,
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"node_modules/yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/yargs-parser": {
"version": "21.0.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
"integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
"dev": true,
"engines": {
"node": ">=12"
}
},
"node_modules/yarn": {
"version": "1.22.19",
"resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.19.tgz",
"integrity": "sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ==",
"hasInstallScript": true,
"bin": {
"yarn": "bin/yarn.js",
"yarnpkg": "bin/yarn.js"
},
"engines": {
"node": ">=4.0.0"
}
}
},
"dependencies": { "dependencies": {
"@ampproject/remapping": { "@ampproject/remapping": {
"version": "2.2.0", "version": "2.2.0",
@ -8816,6 +1195,262 @@
"to-fast-properties": "^2.0.0" "to-fast-properties": "^2.0.0"
} }
}, },
"@commitlint/config-conventional": {
"version": "17.1.0",
"resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.1.0.tgz",
"integrity": "sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==",
"dev": true,
"requires": {
"conventional-changelog-conventionalcommits": "^5.0.0"
}
},
"@commitlint/config-validator": {
"version": "17.1.0",
"resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz",
"integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==",
"dev": true,
"requires": {
"@commitlint/types": "^17.0.0",
"ajv": "^8.11.0"
},
"dependencies": {
"ajv": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
"integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
}
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
}
}
},
"@commitlint/ensure": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz",
"integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==",
"dev": true,
"requires": {
"@commitlint/types": "^17.0.0",
"lodash": "^4.17.19"
}
},
"@commitlint/execute-rule": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz",
"integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==",
"dev": true
},
"@commitlint/format": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz",
"integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==",
"dev": true,
"requires": {
"@commitlint/types": "^17.0.0",
"chalk": "^4.1.0"
}
},
"@commitlint/is-ignored": {
"version": "17.1.0",
"resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.1.0.tgz",
"integrity": "sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==",
"dev": true,
"requires": {
"@commitlint/types": "^17.0.0",
"semver": "7.3.7"
}
},
"@commitlint/lint": {
"version": "17.1.0",
"resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.1.0.tgz",
"integrity": "sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==",
"dev": true,
"requires": {
"@commitlint/is-ignored": "^17.1.0",
"@commitlint/parse": "^17.0.0",
"@commitlint/rules": "^17.0.0",
"@commitlint/types": "^17.0.0"
}
},
"@commitlint/load": {
"version": "17.1.2",
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.1.2.tgz",
"integrity": "sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==",
"dev": true,
"requires": {
"@commitlint/config-validator": "^17.1.0",
"@commitlint/execute-rule": "^17.0.0",
"@commitlint/resolve-extends": "^17.1.0",
"@commitlint/types": "^17.0.0",
"@types/node": "^14.0.0",
"chalk": "^4.1.0",
"cosmiconfig": "^7.0.0",
"cosmiconfig-typescript-loader": "^4.0.0",
"lodash": "^4.17.19",
"resolve-from": "^5.0.0",
"ts-node": "^10.8.1",
"typescript": "^4.6.4"
},
"dependencies": {
"@types/node": {
"version": "14.18.29",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz",
"integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==",
"dev": true
}
}
},
"@commitlint/message": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz",
"integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==",
"dev": true
},
"@commitlint/parse": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz",
"integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==",
"dev": true,
"requires": {
"@commitlint/types": "^17.0.0",
"conventional-changelog-angular": "^5.0.11",
"conventional-commits-parser": "^3.2.2"
}
},
"@commitlint/read": {
"version": "17.1.0",
"resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.1.0.tgz",
"integrity": "sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==",
"dev": true,
"requires": {
"@commitlint/top-level": "^17.0.0",
"@commitlint/types": "^17.0.0",
"fs-extra": "^10.0.0",
"git-raw-commits": "^2.0.0",
"minimist": "^1.2.6"
}
},
"@commitlint/resolve-extends": {
"version": "17.1.0",
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz",
"integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==",
"dev": true,
"requires": {
"@commitlint/config-validator": "^17.1.0",
"@commitlint/types": "^17.0.0",
"import-fresh": "^3.0.0",
"lodash": "^4.17.19",
"resolve-from": "^5.0.0",
"resolve-global": "^1.0.0"
}
},
"@commitlint/rules": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz",
"integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==",
"dev": true,
"requires": {
"@commitlint/ensure": "^17.0.0",
"@commitlint/message": "^17.0.0",
"@commitlint/to-lines": "^17.0.0",
"@commitlint/types": "^17.0.0",
"execa": "^5.0.0"
}
},
"@commitlint/to-lines": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz",
"integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==",
"dev": true
},
"@commitlint/top-level": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz",
"integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==",
"dev": true,
"requires": {
"find-up": "^5.0.0"
},
"dependencies": {
"find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"requires": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
}
},
"locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"requires": {
"p-locate": "^5.0.0"
}
},
"p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"requires": {
"yocto-queue": "^0.1.0"
}
},
"p-locate": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"requires": {
"p-limit": "^3.0.2"
}
}
}
},
"@commitlint/types": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz",
"integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==",
"dev": true,
"requires": {
"chalk": "^4.1.0"
}
},
"@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"dev": true,
"requires": {
"@jridgewell/trace-mapping": "0.3.9"
},
"dependencies": {
"@jridgewell/trace-mapping": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"dev": true,
"requires": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
}
}
},
"@discoveryjs/json-ext": { "@discoveryjs/json-ext": {
"version": "0.5.7", "version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@ -8837,8 +1472,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@hotwired/stimulus-webpack-helpers/-/stimulus-webpack-helpers-1.0.1.tgz", "resolved": "https://registry.npmjs.org/@hotwired/stimulus-webpack-helpers/-/stimulus-webpack-helpers-1.0.1.tgz",
"integrity": "sha512-wa/zupVG0eWxRYJjC1IiPBdt3Lruv0RqGN+/DTMmUWUyMAEB27KXmVY6a8YpUVTM7QwVuaLNGW4EqDgrS2upXQ==", "integrity": "sha512-wa/zupVG0eWxRYJjC1IiPBdt3Lruv0RqGN+/DTMmUWUyMAEB27KXmVY6a8YpUVTM7QwVuaLNGW4EqDgrS2upXQ==",
"dev": true, "dev": true
"requires": {}
}, },
"@jridgewell/gen-mapping": { "@jridgewell/gen-mapping": {
"version": "0.1.1", "version": "0.1.1",
@ -8853,17 +1487,20 @@
"@jridgewell/resolve-uri": { "@jridgewell/resolve-uri": {
"version": "3.0.7", "version": "3.0.7",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
"integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
"dev": true
}, },
"@jridgewell/set-array": { "@jridgewell/set-array": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
"integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
"dev": true
}, },
"@jridgewell/source-map": { "@jridgewell/source-map": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
"dev": true,
"requires": { "requires": {
"@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9" "@jridgewell/trace-mapping": "^0.3.9"
@ -8873,6 +1510,7 @@
"version": "0.3.1", "version": "0.3.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
"integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
"dev": true,
"requires": { "requires": {
"@jridgewell/set-array": "^1.0.0", "@jridgewell/set-array": "^1.0.0",
"@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/sourcemap-codec": "^1.4.10",
@ -8884,12 +1522,14 @@
"@jridgewell/sourcemap-codec": { "@jridgewell/sourcemap-codec": {
"version": "1.4.13", "version": "1.4.13",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
"integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
"dev": true
}, },
"@jridgewell/trace-mapping": { "@jridgewell/trace-mapping": {
"version": "0.3.13", "version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
"integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
"dev": true,
"requires": { "requires": {
"@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10" "@jridgewell/sourcemap-codec": "^1.4.10"
@ -9032,6 +1672,30 @@
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
"dev": true "dev": true
}, },
"@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
"integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
"dev": true
},
"@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
"dev": true
},
"@tsconfig/node14": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
"dev": true
},
"@tsconfig/node16": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz",
"integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==",
"dev": true
},
"@ttskch/select2-bootstrap4-theme": { "@ttskch/select2-bootstrap4-theme": {
"version": "1.5.2", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ttskch/select2-bootstrap4-theme/-/select2-bootstrap4-theme-1.5.2.tgz", "resolved": "https://registry.npmjs.org/@ttskch/select2-bootstrap4-theme/-/select2-bootstrap4-theme-1.5.2.tgz",
@ -9079,6 +1743,7 @@
"version": "8.4.3", "version": "8.4.3",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz",
"integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==", "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==",
"dev": true,
"requires": { "requires": {
"@types/estree": "*", "@types/estree": "*",
"@types/json-schema": "*" "@types/json-schema": "*"
@ -9088,6 +1753,7 @@
"version": "3.7.3", "version": "3.7.3",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
"integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
"dev": true,
"requires": { "requires": {
"@types/eslint": "*", "@types/eslint": "*",
"@types/estree": "*" "@types/estree": "*"
@ -9096,7 +1762,8 @@
"@types/estree": { "@types/estree": {
"version": "0.0.51", "version": "0.0.51",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
"integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
"dev": true
}, },
"@types/express": { "@types/express": {
"version": "4.17.13", "version": "4.17.13",
@ -9157,10 +1824,29 @@
"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
"dev": true "dev": true
}, },
"@types/minimist": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
"integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
"dev": true
},
"@types/node": { "@types/node": {
"version": "18.0.0", "version": "18.0.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz",
"integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==",
"dev": true
},
"@types/normalize-package-data": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true
},
"@types/parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
"dev": true
}, },
"@types/qs": { "@types/qs": {
"version": "6.9.7", "version": "6.9.7",
@ -9227,6 +1913,7 @@
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
"integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
"dev": true,
"requires": { "requires": {
"@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-numbers": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1" "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
@ -9235,22 +1922,26 @@
"@webassemblyjs/floating-point-hex-parser": { "@webassemblyjs/floating-point-hex-parser": {
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
"integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
"dev": true
}, },
"@webassemblyjs/helper-api-error": { "@webassemblyjs/helper-api-error": {
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
"integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
"dev": true
}, },
"@webassemblyjs/helper-buffer": { "@webassemblyjs/helper-buffer": {
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
"integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
"dev": true
}, },
"@webassemblyjs/helper-numbers": { "@webassemblyjs/helper-numbers": {
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
"integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
"dev": true,
"requires": { "requires": {
"@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/floating-point-hex-parser": "1.11.1",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1",
@ -9260,12 +1951,14 @@
"@webassemblyjs/helper-wasm-bytecode": { "@webassemblyjs/helper-wasm-bytecode": {
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
"integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
"dev": true
}, },
"@webassemblyjs/helper-wasm-section": { "@webassemblyjs/helper-wasm-section": {
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
"integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
"dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1",
@ -9277,6 +1970,7 @@
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
"integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
"dev": true,
"requires": { "requires": {
"@xtuc/ieee754": "^1.2.0" "@xtuc/ieee754": "^1.2.0"
} }
@ -9285,6 +1979,7 @@
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
"integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
"dev": true,
"requires": { "requires": {
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
} }
@ -9292,12 +1987,14 @@
"@webassemblyjs/utf8": { "@webassemblyjs/utf8": {
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
"integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
"dev": true
}, },
"@webassemblyjs/wasm-edit": { "@webassemblyjs/wasm-edit": {
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
"integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
"dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1",
@ -9313,6 +2010,7 @@
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
"integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
"dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
@ -9325,6 +2023,7 @@
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
"integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
"dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1",
@ -9336,6 +2035,7 @@
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
"integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
"dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1",
@ -9349,6 +2049,7 @@
"version": "1.11.1", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
"integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
"dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.11.1", "@webassemblyjs/ast": "1.11.1",
"@xtuc/long": "4.2.2" "@xtuc/long": "4.2.2"
@ -9358,8 +2059,7 @@
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
"integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
"dev": true, "dev": true
"requires": {}
}, },
"@webpack-cli/info": { "@webpack-cli/info": {
"version": "1.5.0", "version": "1.5.0",
@ -9374,18 +2074,29 @@
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
"integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
"dev": true, "dev": true
"requires": {}
}, },
"@xtuc/ieee754": { "@xtuc/ieee754": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"dev": true
}, },
"@xtuc/long": { "@xtuc/long": {
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true
},
"JSONStream": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
"integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
"dev": true,
"requires": {
"jsonparse": "^1.2.0",
"through": ">=2.2.7 <3"
}
}, },
"accepts": { "accepts": {
"version": "1.3.8", "version": "1.3.8",
@ -9400,13 +2111,20 @@
"acorn": { "acorn": {
"version": "8.7.1", "version": "8.7.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
"dev": true
}, },
"acorn-import-assertions": { "acorn-import-assertions": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
"integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
"requires": {} "dev": true
},
"acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"dev": true
}, },
"adjust-sourcemap-loader": { "adjust-sourcemap-loader": {
"version": "4.0.0", "version": "4.0.0",
@ -9461,8 +2179,7 @@
"ajv-keywords": { "ajv-keywords": {
"version": "3.5.2", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
"requires": {}
}, },
"ansi-html-community": { "ansi-html-community": {
"version": "0.0.8", "version": "0.0.8",
@ -9495,12 +2212,24 @@
"picomatch": "^2.0.4" "picomatch": "^2.0.4"
} }
}, },
"arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true
},
"array-flatten": { "array-flatten": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
"integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
"dev": true "dev": true
}, },
"array-ify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
"integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
"dev": true
},
"array-union": { "array-union": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
@ -9516,6 +2245,12 @@
"integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
"dev": true "dev": true
}, },
"arrify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
"integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
"dev": true
},
"assets-webpack-plugin": { "assets-webpack-plugin": {
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmjs.org/assets-webpack-plugin/-/assets-webpack-plugin-7.0.0.tgz", "resolved": "https://registry.npmjs.org/assets-webpack-plugin/-/assets-webpack-plugin-7.0.0.tgz",
@ -9686,8 +2421,7 @@
"bootstrap": { "bootstrap": {
"version": "5.1.3", "version": "5.1.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
"integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q=="
"requires": {}
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
@ -9712,6 +2446,7 @@
"version": "4.20.4", "version": "4.20.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
"integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
"dev": true,
"requires": { "requires": {
"caniuse-lite": "^1.0.30001349", "caniuse-lite": "^1.0.30001349",
"electron-to-chromium": "^1.4.147", "electron-to-chromium": "^1.4.147",
@ -9723,7 +2458,8 @@
"buffer-from": { "buffer-from": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
}, },
"bytes": { "bytes": {
"version": "3.0.0", "version": "3.0.0",
@ -9741,12 +2477,37 @@
"get-intrinsic": "^1.0.2" "get-intrinsic": "^1.0.2"
} }
}, },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
"camelcase": { "camelcase": {
"version": "6.3.0", "version": "6.3.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true "dev": true
}, },
"camelcase-keys": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
"integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
"dev": true,
"requires": {
"camelcase": "^5.3.1",
"map-obj": "^4.0.0",
"quick-lru": "^4.0.1"
},
"dependencies": {
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
}
}
},
"caniuse-api": { "caniuse-api": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
@ -9762,7 +2523,8 @@
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001356", "version": "1.0.30001356",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001356.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001356.tgz",
"integrity": "sha512-/30854bktMLhxtjieIxsrJBfs2gTM1pel6MXKF3K+RdIVJZcsn2A2QdhsuR4/p9+R204fZw0zCBBhktX8xWuyQ==" "integrity": "sha512-/30854bktMLhxtjieIxsrJBfs2gTM1pel6MXKF3K+RdIVJZcsn2A2QdhsuR4/p9+R204fZw0zCBBhktX8xWuyQ==",
"dev": true
}, },
"chalk": { "chalk": {
"version": "4.1.2", "version": "4.1.2",
@ -9793,7 +2555,8 @@
"chrome-trace-event": { "chrome-trace-event": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
"integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
"dev": true
}, },
"ckeditor4": { "ckeditor4": {
"version": "4.19.0", "version": "4.19.0",
@ -9809,6 +2572,17 @@
"del": "^4.1.1" "del": "^4.1.1"
} }
}, },
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"clone-deep": { "clone-deep": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@ -9853,12 +2627,52 @@
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true "dev": true
}, },
"commitlint": {
"version": "17.1.2",
"resolved": "https://registry.npmjs.org/commitlint/-/commitlint-17.1.2.tgz",
"integrity": "sha512-ykPXC3TUfYlL8tqz/VOeaJpTPNrcdKrR4Y7ShxjF6l8SlBN/+4YhBJpomG2dx8Ac43FM9OE5rdn1+h7NxsIcAQ==",
"dev": true,
"requires": {
"@commitlint/cli": "^17.1.2",
"@commitlint/types": "^17.0.0"
},
"dependencies": {
"@commitlint/cli": {
"version": "17.1.2",
"resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.1.2.tgz",
"integrity": "sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==",
"dev": true,
"requires": {
"@commitlint/format": "^17.0.0",
"@commitlint/lint": "^17.1.0",
"@commitlint/load": "^17.1.2",
"@commitlint/read": "^17.1.0",
"@commitlint/types": "^17.0.0",
"execa": "^5.0.0",
"lodash": "^4.17.19",
"resolve-from": "5.0.0",
"resolve-global": "1.0.0",
"yargs": "^17.0.0"
}
}
}
},
"commondir": { "commondir": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true "dev": true
}, },
"compare-func": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
"integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
"dev": true,
"requires": {
"array-ify": "^1.0.0",
"dot-prop": "^5.1.0"
}
},
"compressible": { "compressible": {
"version": "2.0.18", "version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@ -9941,6 +2755,41 @@
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
"dev": true "dev": true
}, },
"conventional-changelog-angular": {
"version": "5.0.13",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz",
"integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==",
"dev": true,
"requires": {
"compare-func": "^2.0.0",
"q": "^1.5.1"
}
},
"conventional-changelog-conventionalcommits": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz",
"integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==",
"dev": true,
"requires": {
"compare-func": "^2.0.0",
"lodash": "^4.17.15",
"q": "^1.5.1"
}
},
"conventional-commits-parser": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz",
"integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==",
"dev": true,
"requires": {
"JSONStream": "^1.0.4",
"is-text-path": "^1.0.1",
"lodash": "^4.17.15",
"meow": "^8.0.0",
"split2": "^3.0.0",
"through2": "^4.0.0"
}
},
"convert-source-map": { "convert-source-map": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
@ -9992,6 +2841,31 @@
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true "dev": true
}, },
"cosmiconfig": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
"integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
"dev": true,
"requires": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
"yaml": "^1.10.0"
}
},
"cosmiconfig-typescript-loader": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.1.0.tgz",
"integrity": "sha512-HbWIuR5O+XO5Oj9SZ5bzgrD4nN+rfhrm2PMb0FVx+t+XIvC45n8F0oTNnztXtspWGw0i2IzHaUWFD5LzV1JB4A==",
"dev": true
},
"create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true
},
"crop-select-js": { "crop-select-js": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/crop-select-js/-/crop-select-js-1.0.1.tgz", "resolved": "https://registry.npmjs.org/crop-select-js/-/crop-select-js-1.0.1.tgz",
@ -10012,8 +2886,7 @@
"version": "6.3.0", "version": "6.3.0",
"resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz",
"integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==",
"dev": true, "dev": true
"requires": {}
}, },
"css-loader": { "css-loader": {
"version": "6.7.1", "version": "6.7.1",
@ -10173,8 +3046,7 @@
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
"integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
"dev": true, "dev": true
"requires": {}
}, },
"csso": { "csso": {
"version": "4.2.0", "version": "4.2.0",
@ -10185,6 +3057,12 @@
"css-tree": "^1.1.2" "css-tree": "^1.1.2"
} }
}, },
"dargs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
"integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
"dev": true
},
"datatables.net": { "datatables.net": {
"version": "1.12.1", "version": "1.12.1",
"resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.12.1.tgz", "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.12.1.tgz",
@ -10211,6 +3089,30 @@
"ms": "2.1.2" "ms": "2.1.2"
} }
}, },
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
"dev": true
},
"decamelize-keys": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
"integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
"dev": true,
"requires": {
"decamelize": "^1.1.0",
"map-obj": "^1.0.0"
},
"dependencies": {
"map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
"integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
"dev": true
}
}
},
"default-gateway": { "default-gateway": {
"version": "6.0.3", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
@ -10269,6 +3171,12 @@
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"dev": true "dev": true
}, },
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true
},
"dns-equal": { "dns-equal": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
@ -10330,6 +3238,15 @@
"domhandler": "^4.2.0" "domhandler": "^4.2.0"
} }
}, },
"dot-prop": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
"integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
"dev": true,
"requires": {
"is-obj": "^2.0.0"
}
},
"dropzone": { "dropzone": {
"version": "6.0.0-beta.2", "version": "6.0.0-beta.2",
"resolved": "https://registry.npmjs.org/dropzone/-/dropzone-6.0.0-beta.2.tgz", "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-6.0.0-beta.2.tgz",
@ -10348,7 +3265,8 @@
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.4.161", "version": "1.4.161",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.161.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.161.tgz",
"integrity": "sha512-sTjBRhqh6wFodzZtc5Iu8/R95OkwaPNn7tj/TaDU5nu/5EFiQDtADGAXdR4tJcTEHlYfJpHqigzJqHvPgehP8A==" "integrity": "sha512-sTjBRhqh6wFodzZtc5Iu8/R95OkwaPNn7tj/TaDU5nu/5EFiQDtADGAXdR4tJcTEHlYfJpHqigzJqHvPgehP8A==",
"dev": true
}, },
"emoji-regex": { "emoji-regex": {
"version": "8.0.0", "version": "8.0.0",
@ -10371,6 +3289,7 @@
"version": "5.9.3", "version": "5.9.3",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz",
"integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==",
"dev": true,
"requires": { "requires": {
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
"tapable": "^2.2.0" "tapable": "^2.2.0"
@ -10388,6 +3307,15 @@
"integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
"dev": true "dev": true
}, },
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
"requires": {
"is-arrayish": "^0.2.1"
}
},
"error-stack-parser": { "error-stack-parser": {
"version": "2.1.4", "version": "2.1.4",
"resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
@ -10400,12 +3328,14 @@
"es-module-lexer": { "es-module-lexer": {
"version": "0.9.3", "version": "0.9.3",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
"dev": true
}, },
"escalade": { "escalade": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
}, },
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
@ -10423,6 +3353,7 @@
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": { "requires": {
"esrecurse": "^4.3.0", "esrecurse": "^4.3.0",
"estraverse": "^4.1.1" "estraverse": "^4.1.1"
@ -10432,6 +3363,7 @@
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": { "requires": {
"estraverse": "^5.2.0" "estraverse": "^5.2.0"
}, },
@ -10439,14 +3371,16 @@
"estraverse": { "estraverse": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true
} }
} }
}, },
"estraverse": { "estraverse": {
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true
}, },
"esutils": { "esutils": {
"version": "2.0.3", "version": "2.0.3",
@ -10469,7 +3403,8 @@
"events": { "events": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"dev": true
}, },
"execa": { "execa": {
"version": "5.1.1", "version": "5.1.1",
@ -10679,6 +3614,17 @@
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true "dev": true
}, },
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"fs-monkey": { "fs-monkey": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
@ -10710,6 +3656,12 @@
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true "dev": true
}, },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
"get-intrinsic": { "get-intrinsic": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
@ -10733,6 +3685,19 @@
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true "dev": true
}, },
"git-raw-commits": {
"version": "2.0.11",
"resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz",
"integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==",
"dev": true,
"requires": {
"dargs": "^7.0.0",
"lodash": "^4.17.15",
"meow": "^8.0.0",
"split2": "^3.0.0",
"through2": "^4.0.0"
}
},
"glob": { "glob": {
"version": "7.2.3", "version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@ -10759,7 +3724,17 @@
"glob-to-regexp": { "glob-to-regexp": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true
},
"global-dirs": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
"integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==",
"dev": true,
"requires": {
"ini": "^1.3.4"
}
}, },
"globals": { "globals": {
"version": "11.12.0", "version": "11.12.0",
@ -10791,7 +3766,8 @@
"graceful-fs": { "graceful-fs": {
"version": "4.2.10", "version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
"dev": true
}, },
"growly": { "growly": {
"version": "1.3.0", "version": "1.3.0",
@ -10805,6 +3781,12 @@
"integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
"dev": true "dev": true
}, },
"hard-rejection": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
"dev": true
},
"has": { "has": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -10817,7 +3799,8 @@
"has-flag": { "has-flag": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
}, },
"has-property-descriptors": { "has-property-descriptors": {
"version": "1.0.0", "version": "1.0.0",
@ -10834,6 +3817,15 @@
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true "dev": true
}, },
"hosted-git-info": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"hpack.js": { "hpack.js": {
"version": "2.1.6", "version": "2.1.6",
"resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
@ -10958,8 +3950,25 @@
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
"integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
"dev": true
},
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true, "dev": true,
"requires": {} "requires": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
},
"dependencies": {
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
}
}
}, },
"import-local": { "import-local": {
"version": "3.1.0", "version": "3.1.0",
@ -10971,6 +3980,12 @@
"resolve-cwd": "^3.0.0" "resolve-cwd": "^3.0.0"
} }
}, },
"indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true
},
"inflight": { "inflight": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@ -10987,6 +4002,12 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true "dev": true
}, },
"ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"interpret": { "interpret": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
@ -10999,6 +4020,12 @@
"integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
"dev": true "dev": true
}, },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true
},
"is-binary-path": { "is-binary-path": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@ -11050,6 +4077,12 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true "dev": true
}, },
"is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true
},
"is-path-cwd": { "is-path-cwd": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
@ -11095,6 +4128,15 @@
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true "dev": true
}, },
"is-text-path": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
"integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==",
"dev": true,
"requires": {
"text-extensions": "^1.0.0"
}
},
"is-wsl": { "is-wsl": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@ -11126,6 +4168,7 @@
"version": "27.5.1", "version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
"dev": true,
"requires": { "requires": {
"@types/node": "*", "@types/node": "*",
"merge-stream": "^2.0.0", "merge-stream": "^2.0.0",
@ -11136,6 +4179,7 @@
"version": "8.1.1", "version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"requires": { "requires": {
"has-flag": "^4.0.0" "has-flag": "^4.0.0"
} }
@ -11170,7 +4214,8 @@
"json-parse-even-better-errors": { "json-parse-even-better-errors": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
}, },
"json-schema-traverse": { "json-schema-traverse": {
"version": "0.4.1", "version": "0.4.1",
@ -11182,6 +4227,22 @@
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
}, },
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
"integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
"dev": true
},
"just-extend": { "just-extend": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-5.1.1.tgz", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-5.1.1.tgz",
@ -11199,10 +4260,17 @@
"integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
"dev": true "dev": true
}, },
"lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
"loader-runner": { "loader-runner": {
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"dev": true
}, },
"loader-utils": { "loader-utils": {
"version": "2.0.2", "version": "2.0.2",
@ -11273,6 +4341,18 @@
} }
} }
}, },
"make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
"map-obj": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
"dev": true
},
"mdn-data": { "mdn-data": {
"version": "2.0.14", "version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
@ -11294,6 +4374,33 @@
"fs-monkey": "1.0.3" "fs-monkey": "1.0.3"
} }
}, },
"meow": {
"version": "8.1.2",
"resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
"integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
"dev": true,
"requires": {
"@types/minimist": "^1.2.0",
"camelcase-keys": "^6.2.2",
"decamelize-keys": "^1.1.0",
"hard-rejection": "^2.1.0",
"minimist-options": "4.1.0",
"normalize-package-data": "^3.0.0",
"read-pkg-up": "^7.0.1",
"redent": "^3.0.0",
"trim-newlines": "^3.0.0",
"type-fest": "^0.18.0",
"yargs-parser": "^20.2.3"
},
"dependencies": {
"yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true
}
}
},
"merge-descriptors": { "merge-descriptors": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@ -11303,7 +4410,8 @@
"merge-stream": { "merge-stream": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
}, },
"methods": { "methods": {
"version": "1.1.2", "version": "1.1.2",
@ -11330,12 +4438,14 @@
"mime-db": { "mime-db": {
"version": "1.52.0", "version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true
}, },
"mime-types": { "mime-types": {
"version": "2.1.35", "version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"requires": { "requires": {
"mime-db": "1.52.0" "mime-db": "1.52.0"
} }
@ -11346,6 +4456,12 @@
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true "dev": true
}, },
"min-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
"dev": true
},
"mini-css-extract-plugin": { "mini-css-extract-plugin": {
"version": "2.6.1", "version": "2.6.1",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz",
@ -11411,6 +4527,31 @@
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
}, },
"minimist": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
"minimist-options": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
"integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
"dev": true,
"requires": {
"arrify": "^1.0.1",
"is-plain-obj": "^1.1.0",
"kind-of": "^6.0.3"
},
"dependencies": {
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
"dev": true
}
}
},
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@ -11442,7 +4583,8 @@
"neo-async": { "neo-async": {
"version": "2.6.2", "version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
}, },
"node-forge": { "node-forge": {
"version": "1.3.1", "version": "1.3.1",
@ -11467,7 +4609,20 @@
"node-releases": { "node-releases": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
"integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
"dev": true
},
"normalize-package-data": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
"dev": true,
"requires": {
"hosted-git-info": "^4.0.1",
"is-core-module": "^2.5.0",
"semver": "^7.3.4",
"validate-npm-package-license": "^3.0.1"
}
}, },
"normalize-path": { "normalize-path": {
"version": "3.0.0", "version": "3.0.0",
@ -11619,6 +4774,27 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true "dev": true
}, },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"requires": {
"callsites": "^3.0.0"
}
},
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
}
},
"parseurl": { "parseurl": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -11661,10 +4837,17 @@
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"dev": true "dev": true
}, },
"path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true
},
"picocolors": { "picocolors": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
}, },
"picomatch": { "picomatch": {
"version": "2.3.1", "version": "2.3.1",
@ -11794,29 +4977,25 @@
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
"integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
"dev": true, "dev": true
"requires": {}
}, },
"postcss-discard-duplicates": { "postcss-discard-duplicates": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
"integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
"dev": true, "dev": true
"requires": {}
}, },
"postcss-discard-empty": { "postcss-discard-empty": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
"integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
"dev": true, "dev": true
"requires": {}
}, },
"postcss-discard-overridden": { "postcss-discard-overridden": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
"integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
"dev": true, "dev": true
"requires": {}
}, },
"postcss-merge-longhand": { "postcss-merge-longhand": {
"version": "5.1.6", "version": "5.1.6",
@ -11884,8 +5063,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
"integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
"dev": true, "dev": true
"requires": {}
}, },
"postcss-modules-local-by-default": { "postcss-modules-local-by-default": {
"version": "4.0.0", "version": "4.0.0",
@ -11920,8 +5098,7 @@
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
"integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
"dev": true, "dev": true
"requires": {}
}, },
"postcss-normalize-display-values": { "postcss-normalize-display-values": {
"version": "5.1.0", "version": "5.1.0",
@ -12100,6 +5277,12 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
}, },
"q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
"integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
"dev": true
},
"qs": { "qs": {
"version": "6.10.3", "version": "6.10.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
@ -12109,10 +5292,17 @@
"side-channel": "^1.0.4" "side-channel": "^1.0.4"
} }
}, },
"quick-lru": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
"integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
"dev": true
},
"randombytes": { "randombytes": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"requires": { "requires": {
"safe-buffer": "^5.1.0" "safe-buffer": "^5.1.0"
} }
@ -12143,6 +5333,69 @@
} }
} }
}, },
"read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
"requires": {
"@types/normalize-package-data": "^2.4.0",
"normalize-package-data": "^2.5.0",
"parse-json": "^5.0.0",
"type-fest": "^0.6.0"
},
"dependencies": {
"hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
"requires": {
"hosted-git-info": "^2.1.4",
"resolve": "^1.10.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
"type-fest": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
"dev": true
}
}
},
"read-pkg-up": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
"requires": {
"find-up": "^4.1.0",
"read-pkg": "^5.2.0",
"type-fest": "^0.8.1"
},
"dependencies": {
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
}
}
},
"readable-stream": { "readable-stream": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@ -12172,6 +5425,16 @@
"resolve": "^1.9.0" "resolve": "^1.9.0"
} }
}, },
"redent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
"integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
"dev": true,
"requires": {
"indent-string": "^4.0.0",
"strip-indent": "^3.0.0"
}
},
"regenerate": { "regenerate": {
"version": "1.4.2", "version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@ -12258,6 +5521,12 @@
"strip-ansi": "^6.0.1" "strip-ansi": "^6.0.1"
} }
}, },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true
},
"require-from-string": { "require-from-string": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@ -12296,6 +5565,15 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true "dev": true
}, },
"resolve-global": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
"integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
"dev": true,
"requires": {
"global-dirs": "^0.1.1"
}
},
"resolve-url-loader": { "resolve-url-loader": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz",
@ -12327,7 +5605,8 @@
"safe-buffer": { "safe-buffer": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
}, },
"safer-buffer": { "safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
@ -12424,6 +5703,7 @@
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
"dev": true,
"requires": { "requires": {
"randombytes": "^2.1.0" "randombytes": "^2.1.0"
} }
@ -12575,7 +5855,8 @@
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}, },
"source-map-js": { "source-map-js": {
"version": "1.0.2", "version": "1.0.2",
@ -12587,11 +5868,44 @@
"version": "0.5.21", "version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"requires": { "requires": {
"buffer-from": "^1.0.0", "buffer-from": "^1.0.0",
"source-map": "^0.6.0" "source-map": "^0.6.0"
} }
}, },
"spdx-correct": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
"integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-exceptions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
"integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
"dev": true
},
"spdx-expression-parse": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-license-ids": {
"version": "3.0.12",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
"integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
"dev": true
},
"spdy": { "spdy": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
@ -12624,6 +5938,15 @@
"resolved": "https://registry.npmjs.org/spectrum-colorpicker2/-/spectrum-colorpicker2-2.0.9.tgz", "resolved": "https://registry.npmjs.org/spectrum-colorpicker2/-/spectrum-colorpicker2-2.0.9.tgz",
"integrity": "sha512-tyNppC56VQHdoKtWdkEkqQfLg9D1hhBea/laO3ffJGrBs3uwFmCxpcBK3a2IOpxZnioykiT+bGlT3SsI7UySRw==" "integrity": "sha512-tyNppC56VQHdoKtWdkEkqQfLg9D1hhBea/laO3ffJGrBs3uwFmCxpcBK3a2IOpxZnioykiT+bGlT3SsI7UySRw=="
}, },
"split2": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
"integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
"dev": true,
"requires": {
"readable-stream": "^3.0.0"
}
},
"stable": { "stable": {
"version": "0.1.8", "version": "0.1.8",
"resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
@ -12642,6 +5965,17 @@
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true "dev": true
}, },
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
},
"string_decoder": { "string_decoder": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@ -12659,17 +5993,6 @@
} }
} }
}, },
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
},
"strip-ansi": { "strip-ansi": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@ -12685,12 +6008,20 @@
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true "dev": true
}, },
"strip-indent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
"integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
"dev": true,
"requires": {
"min-indent": "^1.0.0"
}
},
"style-loader": { "style-loader": {
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz",
"integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==",
"dev": true, "dev": true
"requires": {}
}, },
"stylehacks": { "stylehacks": {
"version": "5.1.0", "version": "5.1.0",
@ -12744,12 +6075,14 @@
"tapable": { "tapable": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
"dev": true
}, },
"terser": { "terser": {
"version": "5.14.1", "version": "5.14.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
"integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
"dev": true,
"requires": { "requires": {
"@jridgewell/source-map": "^0.3.2", "@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0", "acorn": "^8.5.0",
@ -12760,7 +6093,8 @@
"commander": { "commander": {
"version": "2.20.3", "version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
} }
} }
}, },
@ -12768,6 +6102,7 @@
"version": "5.3.3", "version": "5.3.3",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz",
"integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==",
"dev": true,
"requires": { "requires": {
"@jridgewell/trace-mapping": "^0.3.7", "@jridgewell/trace-mapping": "^0.3.7",
"jest-worker": "^27.4.5", "jest-worker": "^27.4.5",
@ -12776,6 +6111,27 @@
"terser": "^5.7.2" "terser": "^5.7.2"
} }
}, },
"text-extensions": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
"integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
"dev": true
},
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
"dev": true
},
"through2": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
"integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
"dev": true,
"requires": {
"readable-stream": "3"
}
},
"thunky": { "thunky": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@ -12823,6 +6179,39 @@
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true "dev": true
}, },
"trim-newlines": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
"integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
"dev": true
},
"ts-node": {
"version": "10.9.1",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
"integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
"dev": true,
"requires": {
"@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7",
"@tsconfig/node12": "^1.0.7",
"@tsconfig/node14": "^1.0.0",
"@tsconfig/node16": "^1.0.2",
"acorn": "^8.4.1",
"acorn-walk": "^8.1.1",
"arg": "^4.1.0",
"create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"v8-compile-cache-lib": "^3.0.1",
"yn": "3.1.1"
}
},
"type-fest": {
"version": "0.18.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
"integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
"dev": true
},
"type-is": { "type-is": {
"version": "1.6.18", "version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@ -12833,6 +6222,12 @@
"mime-types": "~2.1.24" "mime-types": "~2.1.24"
} }
}, },
"typescript": {
"version": "4.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz",
"integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==",
"dev": true
},
"unicode-canonical-property-names-ecmascript": { "unicode-canonical-property-names-ecmascript": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@ -12861,6 +6256,12 @@
"integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
"dev": true "dev": true
}, },
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
},
"unpipe": { "unpipe": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@ -12899,6 +6300,22 @@
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true "dev": true
}, },
"v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
"dev": true
},
"validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
"requires": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
}
},
"vary": { "vary": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@ -12909,6 +6326,7 @@
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
"integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
"dev": true,
"requires": { "requires": {
"glob-to-regexp": "^0.4.1", "glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2" "graceful-fs": "^4.1.2"
@ -12927,6 +6345,7 @@
"version": "5.73.0", "version": "5.73.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz",
"integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==",
"dev": true,
"requires": { "requires": {
"@types/eslint-scope": "^3.7.3", "@types/eslint-scope": "^3.7.3",
"@types/estree": "^0.0.51", "@types/estree": "^0.0.51",
@ -13138,7 +6557,8 @@
"webpack-sources": { "webpack-sources": {
"version": "3.2.3", "version": "3.2.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
"dev": true
}, },
"websocket-driver": { "websocket-driver": {
"version": "0.7.4", "version": "0.7.4",
@ -13172,6 +6592,17 @@
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true "dev": true
}, },
"wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
}
},
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@ -13182,8 +6613,13 @@
"version": "8.8.0", "version": "8.8.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz",
"integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==",
"dev": true, "dev": true
"requires": {} },
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true
}, },
"yallist": { "yallist": {
"version": "4.0.0", "version": "4.0.0",
@ -13197,6 +6633,21 @@
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"dev": true "dev": true
}, },
"yargs": {
"version": "17.5.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
"integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
"dev": true,
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.0.0"
}
},
"yargs-parser": { "yargs-parser": {
"version": "21.0.1", "version": "21.0.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
@ -13207,6 +6658,18 @@
"version": "1.22.19", "version": "1.22.19",
"resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.19.tgz", "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.19.tgz",
"integrity": "sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ==" "integrity": "sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ=="
},
"yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true
},
"yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true
} }
} }
} }

View File

@ -1,8 +1,10 @@
{ {
"devDependencies": { "devDependencies": {
"@commitlint/config-conventional": "^17.1.0",
"@hotwired/stimulus": "^3.0.0", "@hotwired/stimulus": "^3.0.0",
"@symfony/stimulus-bridge": "^3.0.0", "@symfony/stimulus-bridge": "^3.0.0",
"@symfony/webpack-encore": "^2.0.0", "@symfony/webpack-encore": "^2.0.0",
"commitlint": "^17.1.2",
"core-js": "^3.0.0", "core-js": "^3.0.0",
"regenerator-runtime": "^0.13.2", "regenerator-runtime": "^0.13.2",
"webpack-notifier": "^1.6.0" "webpack-notifier": "^1.6.0"

View File

@ -1,16 +1,13 @@
<?php <?php
namespace App\Command; namespace App\Command;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use App\Entity\Tallyday as Tallyday;
class CleanRegistrationCommand extends Command class CleanRegistrationCommand extends Command
{ {
@ -21,7 +18,7 @@ class CleanRegistrationCommand extends Command
private $rootlog; private $rootlog;
private $byexec; private $byexec;
public function __construct(ContainerInterface $container,EntityManagerInterface $em) public function __construct(ContainerInterface $container, EntityManagerInterface $em)
{ {
parent::__construct(); parent::__construct();
$this->container = $container; $this->container = $container;
@ -41,39 +38,47 @@ class CleanRegistrationCommand extends Command
{ {
$this->output = $output; $this->output = $output;
$this->filesystem = new Filesystem(); $this->filesystem = new Filesystem();
$this->rootlog = $this->container->get('kernel')->getLogDir()."/"; $this->rootlog = $this->container->get('kernel')->getLogDir().'/';
$this->writelnred(''); $this->writelnred('');
$this->writelnred('== app:CleanRegistration'); $this->writelnred('== app:CleanRegistration');
$this->writelnred('=========================================================================================================='); $this->writelnred('==========================================================================================================');
$now=new \DateTime('now'); $now = new \DateTime('now');
$datas = $this->em $datas = $this->em
->createQueryBuilder() ->createQueryBuilder()
->select('table') ->select('table')
->from('App\Entity\Registration','table') ->from('App\Entity\Registration', 'table')
->where('table.keyexpire<:now') ->where('table.keyexpire<:now')
->setParameter("now",$now->format("Y-m-d H:i:s")) ->setParameter('now', $now->format('Y-m-d H:i:s'))
->getQuery() ->getQuery()
->getResult(); ->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
$this->writeln('Inscription supprimée = '.$data->getkeyexpire()->format("Y-m-d H:i:s")." >> ".$data->getUsername()); $this->writeln('Inscription supprimée = '.$data->getkeyexpire()->format('Y-m-d H:i:s').' >> '.$data->getUsername());
$this->em->remove($data); $this->em->remove($data);
$this->em->flush(); $this->em->flush();
} }
$this->writeln(''); $this->writeln('');
return Command::SUCCESS; return Command::SUCCESS;
} }
private function writelnred($string) { private function writelnred($string)
{
$this->output->writeln('<fg=red>'.$string.'</>'); $this->output->writeln('<fg=red>'.$string.'</>');
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
if($this->byexec) $this->filesystem->appendToFile($this->rootlog.'exec.log', $string."\n"); if ($this->byexec) {
$this->filesystem->appendToFile($this->rootlog.'exec.log', $string."\n");
} }
private function writeln($string) { }
private function writeln($string)
{
$this->output->writeln($string); $this->output->writeln($string);
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
if($this->byexec) $this->filesystem->appendToFile($this->rootlog.'exec.log', $string."\n"); if ($this->byexec) {
$this->filesystem->appendToFile($this->rootlog.'exec.log', $string."\n");
}
} }
} }

View File

@ -2,28 +2,26 @@
namespace App\Command; namespace App\Command;
use App\Entity\Cron;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\LockableTrait;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Command\LockableTrait;
use App\Entity\Cron;
class CronCommand extends Command class CronCommand extends Command
{ {
use LockableTrait;
private $container; private $container;
private $em; private $em;
private $output; private $output;
private $filesystem; private $filesystem;
private $rootlog; private $rootlog;
use LockableTrait;
public function __construct(ContainerInterface $container,EntityManagerInterface $em) public function __construct(ContainerInterface $container, EntityManagerInterface $em)
{ {
parent::__construct(); parent::__construct();
$this->container = $container; $this->container = $container;
@ -42,17 +40,18 @@ class CronCommand extends Command
{ {
$this->output = $output; $this->output = $output;
$this->filesystem = new Filesystem(); $this->filesystem = new Filesystem();
$this->rootlog = $this->container->get('kernel')->getLogDir()."/"; $this->rootlog = $this->container->get('kernel')->getLogDir().'/';
if (!$this->lock()) { if (!$this->lock()) {
$this->output->writeln("CRON LOCK"); $this->output->writeln('CRON LOCK');
return Command::FAILURE; return Command::FAILURE;
} }
$crons = $this->em->getRepository('App\Entity\Cron')->toexec(); $crons = $this->em->getRepository('App\Entity\Cron')->toexec();
if($crons) { if ($crons) {
$now=new \DateTime(); $now = new \DateTime();
$this->writelnred(''); $this->writelnred('');
$this->writelnred(''); $this->writelnred('');
$this->writelnred(''); $this->writelnred('');
@ -60,72 +59,80 @@ class CronCommand extends Command
$this->writelnred('=========================================================================================================='); $this->writelnred('==========================================================================================================');
$this->writelnred('== CRON =================================================================================================='); $this->writelnred('== CRON ==================================================================================================');
$this->writelnred('=========================================================================================================='); $this->writelnred('==========================================================================================================');
$this->writeln ('Date = '.$now->format('Y-m-d H:i:s')); $this->writeln('Date = '.$now->format('Y-m-d H:i:s'));
$this->writeln ('Application = '.$this->container->getParameter("appName")); $this->writeln('Application = '.$this->container->getParameter('appName'));
} }
foreach($crons as $cron) { foreach ($crons as $cron) {
// Id du cron // Id du cron
$idcron = $cron->getId(); $idcron = $cron->getId();
// Flag d'execution en cours // Flag d'execution en cours
$now=new \DateTime(); $now = new \DateTime();
$cron->setStartexecdate($now); $cron->setStartexecdate($now);
//$cron->setStatut(1); // $cron->setStatut(1);
$this->em->flush(); $this->em->flush();
// Récupération de la commande // Récupération de la commande
$command = $this->getApplication()->find($cron->getCommand()); $command = $this->getApplication()->find($cron->getCommand());
// Réccuépration des parametres // Réccuépration des parametres
$jsonparameter=json_decode($cron->getJsonargument(),true); $jsonparameter = null;
if ($cron->getJsonargument()) {
$jsonparameter = json_decode($cron->getJsonargument(), true);
}
// Formater la chaine de parametre // Formater la chaine de parametre
if(!$jsonparameter) $jsonparameter=[]; if (!$jsonparameter) {
$jsonparameter = [];
}
$parameter = new ArrayInput($jsonparameter); $parameter = new ArrayInput($jsonparameter);
// Executer la commande // Executer la commande
try{ try {
$returnCode = $command->run($parameter, $output); $returnCode = $command->run($parameter, $output);
} } catch (\Exception $e) {
catch(\Exception $e) { $this->writelnred('JOB EN ERREUR .'.$e->getMessage());
$this->writelnred("JOB EN ERREUR .".$e->getMessage()); $returnCode = Command::FAILURE;
$returnCode=Command::FAILURE;
} }
// Flag de fin d'execution // Flag de fin d'execution
$now=new \DateTime(); $now = new \DateTime();
$cron->setEndexecdate($now); $cron->setEndexecdate($now);
// Si interval par heure // Si interval par heure
if(fmod($cron->getRepeatinterval(),3600)==0) if (0 == fmod($cron->getRepeatinterval(), 3600)) {
$next=clone $cron->getNextexecdate(); $next = clone $cron->getNextexecdate();
else } else {
$next=new \DateTime(); $next = new \DateTime();
}
$next->add(new \DateInterval('PT'.$cron->getRepeatinterval().'S')); $next->add(new \DateInterval('PT'.$cron->getRepeatinterval().'S'));
$cron->setNextexecdate($next); $cron->setNextexecdate($next);
// Statut OK/KO // Statut OK/KO
$cron->setStatut(($returnCode==Command::FAILURE?0:1)); $cron->setStatut(Command::FAILURE == $returnCode ? 0 : 1);
$this->em->flush(); $this->em->flush();
} }
if($crons) { if ($crons) {
$this->writelnred("=="); $this->writelnred('==');
$this->writelnred("FIN CRON"); $this->writelnred('FIN CRON');
$this->writelnred("=="); $this->writelnred('==');
$this->writelnred(""); $this->writelnred('');
} }
return Command::SUCCESS; return Command::SUCCESS;
} }
private function writelnred($string) { private function writelnred($string)
{
$this->output->writeln('<fg=red>'.$string.'</>'); $this->output->writeln('<fg=red>'.$string.'</>');
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
} }
private function writeln($string) {
private function writeln($string)
{
$this->output->writeln($string); $this->output->writeln($string);
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
} }

View File

@ -1,26 +1,24 @@
<?php <?php
namespace App\Command; namespace App\Command;
use App\Entity\Config;
use App\Entity\Cron;
use App\Entity\Group;
use App\Entity\Niveau01;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Id\AssignedGenerator;
use Doctrine\ORM\Mapping\ClassMetadata;
use Ramsey\Uuid\Uuid;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Ramsey\Uuid\Uuid;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Id\AssignedGenerator;
use App\Entity\Group;
use App\Entity\Niveau01;
use App\Entity\User;
use App\Entity\Config;
use App\Entity\Cron;
class InitCommand extends Command class InitCommand extends Command
{ {
private $container; private $container;
private $em; private $em;
private $output; private $output;
@ -29,14 +27,13 @@ class InitCommand extends Command
private $rootlog; private $rootlog;
private $appname; private $appname;
public function __construct(ContainerInterface $container,EntityManagerInterface $em) public function __construct(ContainerInterface $container, EntityManagerInterface $em)
{ {
parent::__construct(); parent::__construct();
$this->container = $container; $this->container = $container;
$this->em = $em; $this->em = $em;
} }
protected function configure() protected function configure()
{ {
$this $this
@ -50,7 +47,7 @@ class InitCommand extends Command
{ {
$this->output = $output; $this->output = $output;
$this->filesystem = new Filesystem(); $this->filesystem = new Filesystem();
$this->rootlog = $this->container->get('kernel')->getLogDir()."/"; $this->rootlog = $this->container->get('kernel')->getLogDir().'/';
$this->appname = $this->container->getParameter('appName'); $this->appname = $this->container->getParameter('appName');
$this->writeln('APP = Default Data'); $this->writeln('APP = Default Data');
@ -59,26 +56,25 @@ class InitCommand extends Command
$metadata = $this->em->getClassMetaData('App\Entity\Group'); $metadata = $this->em->getClassMetaData('App\Entity\Group');
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGenerator(new AssignedGenerator());
$group=$this->em->getRepository('App\Entity\Group')->findOneBy(['id'=>'-1']); $group = $this->em->getRepository('App\Entity\Group')->findOneBy(['id' => '-1']);
if(!$group) { if (!$group) {
$group=new Group(); $group = new Group();
$group->setId(-1); $group->setId(-1);
$group->setLabel("Tout le monde"); $group->setLabel('Tout le monde');
$group->setIsopen(false); $group->setIsopen(false);
$group->setIsworkgroup(false); $group->setIsworkgroup(false);
$group->setApikey(Uuid::uuid4()); $group->setApikey(Uuid::uuid4());
$this->em->persist($group); $this->em->persist($group);
$this->em->flush(); $this->em->flush();
} }
// On s'assure qu'il exite un niveau01 // On s'assure qu'il exite un niveau01
$metadata = $this->em->getClassMetaData('App\Entity\Niveau01'); $metadata = $this->em->getClassMetaData('App\Entity\Niveau01');
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGenerator(new AssignedGenerator());
$niveau01=$this->em->getRepository('App\Entity\Niveau01')->findOneBy(['id'=>'-1']); $niveau01 = $this->em->getRepository('App\Entity\Niveau01')->findOneBy(['id' => '-1']);
if(!$niveau01) { if (!$niveau01) {
$niveau01=new Niveau01(); $niveau01 = new Niveau01();
$niveau01->setId(-1); $niveau01->setId(-1);
$niveau01->setLabel($this->appname); $niveau01->setLabel($this->appname);
$niveau01->setApikey(Uuid::uuid4()); $niveau01->setApikey(Uuid::uuid4());
@ -90,18 +86,19 @@ class InitCommand extends Command
$metadata = $this->em->getClassMetaData('App\Entity\User'); $metadata = $this->em->getClassMetaData('App\Entity\User');
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGenerator(new AssignedGenerator());
$user=$this->em->getRepository('App\Entity\User')->findOneBy(['id'=>'-1']); $user = $this->em->getRepository('App\Entity\User')->findOneBy(['id' => '-1']);
if(!$user) { if (!$user) {
$user=new User(); $user = new User();
$user->setId(-1); $user->setId(-1);
$user->setUsername("admin"); $user->setUsername('admin');
$user->setFirstname("admin"); $user->setFirstname('admin');
$user->setLastname($this->appname); $user->setLastname($this->appname);
$user->setPassword($this->container->getParameter('appSecret')); $user->setPassword($this->container->getParameter('appSecret'));
$user->setEmail($this->container->getParameter('appMailnoreply')); $user->setEmail($this->container->getParameter('appMailnoreply'));
$user->setApikey(Uuid::uuid4()); $user->setApikey(Uuid::uuid4());
$user->setAvatar("admin.jpg"); $user->setAvatar('admin.jpg');
$user->setIsVisible(true); $user->setIsVisible(true);
$user->setIsActive(true);
$user->setNiveau01($niveau01); $user->setNiveau01($niveau01);
$this->em->persist($user); $this->em->persist($user);
@ -109,10 +106,10 @@ class InitCommand extends Command
} }
// On s'assure que les appAdmins sont bien admin // On s'assure que les appAdmins sont bien admin
foreach($this->container->getParameter('appAdmins') as $admin) { foreach ($this->container->getParameter('appAdmins') as $admin) {
$user=$this->em->getRepository('App\Entity\User')->findOneBy(['username'=>$admin]); $user = $this->em->getRepository('App\Entity\User')->findOneBy(['username' => $admin]);
if($user&&!$user->hasRole("ROLE_ADMIN")) { if ($user && !$user->hasRole('ROLE_ADMIN')) {
$user->setRole("ROLE_ADMIN"); $user->setRole('ROLE_ADMIN');
$this->em->flush(); $this->em->flush();
} }
} }
@ -120,383 +117,335 @@ class InitCommand extends Command
// colorbgbody = Couleur des fonds de page // colorbgbody = Couleur des fonds de page
$this->insertConfig( $this->insertConfig(
1, // order 1, // order
"site", // category 'site', // category
"appname", // id 'appname', // id
"Titre de votre site", // title 'Titre de votre site', // title
"", // value '', // value
$this->appname, // default $this->appname, // default
"string", // type, 'string', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Titre de votre site" 'Titre de votre site'
); );
$this->insertConfig( $this->insertConfig(
2, // order 2, // order
"site", // category 'site', // category
"appsubname", // id 'appsubname', // id
"Sous-titre de votre site", // title 'Sous-titre de votre site', // title
"", // value '', // value
"", // default '', // default
"string", // type, 'string', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Sous-titre de votre site" 'Sous-titre de votre site'
); );
$this->insertConfig( $this->insertConfig(
3, // order 3, // order
"site", // category 'site', // category
"appdescription", // id 'appdescription', // id
"Description de votre site", // title 'Description de votre site', // title
"", // value '', // value
"", // default '', // default
"editor", // type, 'editor', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Description de votre site" 'Description de votre site'
); );
$this->insertConfig( $this->insertConfig(
100, // order 100, // order
"site", // category 'site', // category
"fgforceconnect", // id 'fgforceconnect', // id
"Forcer la connexion", // title 'Forcer la connexion', // title
"", // value '', // value
"0", // default '0', // default
"boolean", // type, 'boolean', // type,
true, // visible true, // visible
true, // changeable true, // changeable
true, // required true, // required
"", // grouped '', // grouped
"Forcer la connexion afin de rendre votre site privé" 'Forcer la connexion afin de rendre votre site privé'
);
$this->insertConfig(
200, // order
"site", // category
"permgroup", // id
"Rôle créateur de groupe de travail", // title
"", // value
"ROLE_MASTER", // default
"role", // type,
true, // visible
true, // changeable
true, // required
"", // grouped
"Détermine quel rôle aura la permission de créer des groupes de travail"
);
$this->insertConfig(
201, // order
"site", // category
"permannu", // id
"Rôle accédant à l'annuaire", // title
"", // value
"ROLE_USER", // default
"role", // type,
true, // visible
true, // changeable
true, // required
"", // grouped
"Détermine quel rôle aura la permission de voir l'annuaire"
);
$this->insertConfig(
202, // order
"site", // category
"scopeannu", // id
"Scope de l'annuaire", // title
"", // value
"ALL", // default
"scopeannu", // type,
true, // visible
true, // changeable
true, // required
"", // grouped
"Détermine le scope des utilisateurs visibles dans l'annuaire par d'autres utilisateurs"
); );
$this->insertConfig( $this->insertConfig(
500, // order 500, // order
"site", // category 'site', // category
"apptheme", // id 'apptheme', // id
"Thème de votre site", // title 'Thème de votre site', // title
"", // value '', // value
"", // default '', // default
"string", // type, 'string', // type,
false, // visible false, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Thème de votre site" 'Thème de votre site'
); );
// colorbgbody = Couleur des fonds de page // colorbgbody = Couleur des fonds de page
$this->insertConfig( $this->insertConfig(
1, // order 1, // order
"colorbgbody", // category 'colorbgbody', // category
"colorbgbodydark", // id 'colorbgbodydark', // id
"Couleur de fond fonçée", // title 'Couleur de fond fonçée', // title
"", // value '', // value
"#2e3131", // default '#2e3131', // default
"color", // type, 'color', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"La couleur de fond quand le site a besoin d'avoir une couleur de fond foncée" "La couleur de fond quand le site a besoin d'avoir une couleur de fond foncée"
); );
$this->insertConfig( $this->insertConfig(
2, // order 2, // order
"colorbgbody", // category 'colorbgbody', // category
"colorbgbodylight", // id 'colorbgbodylight', // id
"Couleur de fond claire", // title 'Couleur de fond claire', // title
"", // value '', // value
"#ffffff", // default '#ffffff', // default
"color", // type, 'color', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"La couleur de fond quand le site a besoin d'avoir une couleur de fond claire" "La couleur de fond quand le site a besoin d'avoir une couleur de fond claire"
); );
// colorfttitle = Couleur des fontes titre // colorfttitle = Couleur des fontes titre
$this->insertConfig( $this->insertConfig(
1, // order 1, // order
"colorfttitle", // category 'colorfttitle', // category
"colorfttitledark", // id 'colorfttitledark', // id
"Couleur des titres sur fond fonçé", // title 'Couleur des titres sur fond fonçé', // title
"", // value '', // value
"#ffffff", // default '#ffffff', // default
"color", // type, 'color', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"La couleur des titres sur fond fonçé" 'La couleur des titres sur fond fonçé'
); );
$this->insertConfig( $this->insertConfig(
2, // order 2, // order
"colorfttitle", // category 'colorfttitle', // category
"colorfttitlelight", // id 'colorfttitlelight', // id
"Couleur des titres sur fond claire", // title 'Couleur des titres sur fond claire', // title
"", // value '', // value
"#2e3131", // default '#2e3131', // default
"color", // type, 'color', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"La couleur des titres sur fond claire" 'La couleur des titres sur fond claire'
); );
// colorftbody = Couleur des fontes titre // colorftbody = Couleur des fontes titre
$this->insertConfig( $this->insertConfig(
1, // order 1, // order
"colorftbody", // category 'colorftbody', // category
"colorftbodydark", // id 'colorftbodydark', // id
"Couleur de la police sur fond fonçé", // title 'Couleur de la police sur fond fonçé', // title
"", // value '', // value
"#ffffff", // default '#ffffff', // default
"color", // type, 'color', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"La couleur de la police sur fond fonçé" 'La couleur de la police sur fond fonçé'
); );
$this->insertConfig( $this->insertConfig(
2, // order 2, // order
"colorftbody", // category 'colorftbody', // category
"colorftbodylight", // id 'colorftbodylight', // id
"Couleur de la police sur fond claire", // title 'Couleur de la police sur fond claire', // title
"", // value '', // value
"#343a40", // default '#343a40', // default
"color", // type, 'color', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"La couleur de la police sur fond claire" 'La couleur de la police sur fond claire'
); );
// font = nom des polices // font = nom des polices
$this->insertConfig( $this->insertConfig(
1, // order 1, // order
"font", // category 'font', // category
"fonttitle", // id 'fonttitle', // id
"Police pour les titres", // title 'Police pour les titres', // title
"", // value '', // value
"Theboldfont", // default 'Theboldfont', // default
"font", // type, 'font', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"La couleur de la police de votre site" 'La couleur de la police de votre site'
); );
$this->insertConfig( $this->insertConfig(
2, // order 2, // order
"font", // category 'font', // category
"fontbody", // id 'fontbody', // id
"Police principale", // title 'Police principale', // title
"", // value '', // value
"Roboto-Regular", // default 'Roboto-Regular', // default
"font", // type, 'font', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Nom de la police principale" 'Nom de la police principale'
); );
$this->insertConfig( $this->insertConfig(
3, // order 3, // order
"font", // category 'font', // category
"fontsizeh1", // id 'fontsizeh1', // id
"Taille des titres h1", // title 'Taille des titres h1', // title
"", // value '', // value
"40", // default '40', // default
"integer", // type, 'integer', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Taille des titres h1 en px" 'Taille des titres h1 en px'
); );
$this->insertConfig( $this->insertConfig(
4, // order 4, // order
"font", // category 'font', // category
"fontsizeh2", // id 'fontsizeh2', // id
"Taille des titres h2", // title 'Taille des titres h2', // title
"", // value '', // value
"32", // default '32', // default
"integer", // type, 'integer', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Taille des titres h2 en px" 'Taille des titres h2 en px'
); );
$this->insertConfig( $this->insertConfig(
5, // order 5, // order
"font", // category 'font', // category
"fontsizeh3", // id 'fontsizeh3', // id
"Taille des titres h3", // title 'Taille des titres h3', // title
"", // value '', // value
"28", // default '28', // default
"integer", // type, 'integer', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Taille des titres h3 en px" 'Taille des titres h3 en px'
); );
$this->insertConfig( $this->insertConfig(
6, // order 6, // order
"font", // category 'font', // category
"fontsizeh4", // id 'fontsizeh4', // id
"Taille des titres h4", // title 'Taille des titres h4', // title
"", // value '', // value
"24", // default '24', // default
"integer", // type, 'integer', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Taille des titres h4 en px" 'Taille des titres h4 en px'
); );
// logo = // logo =
$this->insertConfig( $this->insertConfig(
1, // order 1, // order
"logo", // category 'logo', // category
"logodark", // id 'logodark', // id
"Logo sur fond fonçé", // title 'Logo sur fond fonçé', // title
"", // value '', // value
"logo.png", // default 'logo.png', // default
"logo", // type, 'logo', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Logo sur fond fonçé" 'Logo sur fond fonçé'
); );
$this->insertConfig( $this->insertConfig(
2, // order 2, // order
"logo", // category 'logo', // category
"logolight", // id 'logolight', // id
"Logo sur fond clair", // title 'Logo sur fond clair', // title
"", // value '', // value
"logo.png", // default 'logo.png', // default
"logo", // type, 'logo', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Logo sur fond clair" 'Logo sur fond clair'
); );
// header = // header =
$this->insertConfig( $this->insertConfig(
1, // order 1, // order
"header", // category 'header', // category
"headerimage", // id 'headerimage', // id
"Image de fond de la bannière", // title 'Image de fond de la bannière', // title
"", // value '', // value
"header.jpg", // default 'header.jpg', // default
"header", // type, 'header', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Image appnamede fond de la bannière" 'Image appnamede fond de la bannière'
); );
$this->insertConfig( $this->insertConfig(
1, // order 1, // order
"header", // category 'header', // category
"headerheight", // id 'headerheight', // id
"Hauteur de la bannière", // title 'Hauteur de la bannière', // title
"", // value '', // value
"100", // default '100', // default
"integer", // type, 'integer', // type,
true, // visible true, // visible
true, // changeable true, // changeable
false, // required false, // required
"", // grouped '', // grouped
"Image de fond de la bannière" 'Image de fond de la bannière'
); );
$output->writeln(''); $output->writeln('');
// Job synchronisation des comptes utilisateur // Job synchronisation des comptes utilisateur
// Toute les 24h à 3h00 // Toute les 24h à 3h00
$entity = $this->em->getRepository('App\Entity\Cron')->findOneBy(["command"=>"app:Synchro"]); $entity = $this->em->getRepository('App\Entity\Cron')->findOneBy(['command' => 'app:Synchro']);
if(!$entity) { if (!$entity) {
$entity = new Cron; $entity = new Cron();
$nextdate=$entity->getSubmitdate(); $nextdate = $entity->getSubmitdate();
$nextdate->setTime(4,0); $nextdate->setTime(4, 0);
$entity->setCommand("app:Synchro"); $entity->setCommand('app:Synchro');
$entity->setDescription("Synchronisation des comptes utilisateurs"); $entity->setDescription('Synchronisation des comptes utilisateurs');
$entity->setStatut(1); $entity->setStatut(1);
$entity->setRepeatinterval(86400); $entity->setRepeatinterval(86400);
$entity->setNextexecdate($nextdate); $entity->setNextexecdate($nextdate);
@ -505,11 +454,11 @@ class InitCommand extends Command
// Job purge des registrations obsolètes // Job purge des registrations obsolètes
// Toute les 5mn // Toute les 5mn
$entity = $this->em->getRepository('App\Entity\Cron')->findOneBy(["command"=>"app:CleanRegistration"]); $entity = $this->em->getRepository('App\Entity\Cron')->findOneBy(['command' => 'app:CleanRegistration']);
if(!$entity) { if (!$entity) {
$entity = new Cron; $entity = new Cron();
$entity->setCommand("app:CleanRegistration"); $entity->setCommand('app:CleanRegistration');
$entity->setDescription("Nettoyage des Inscriptions obsolètes"); $entity->setDescription('Nettoyage des Inscriptions obsolètes');
$entity->setStatut(1); $entity->setStatut(1);
$entity->setRepeatinterval(300); $entity->setRepeatinterval(300);
$entity->setNextexecdate($entity->getSubmitdate()); $entity->setNextexecdate($entity->getSubmitdate());
@ -519,13 +468,15 @@ class InitCommand extends Command
$this->em->flush(); $this->em->flush();
$output->writeln(''); $output->writeln('');
return Command::SUCCESS; return Command::SUCCESS;
} }
private function insertConfig($order,$category,$id,$title,$value,$default,$type,$visible,$changeable,$required,$grouped,$help) { private function insertConfig($order, $category, $id, $title, $value, $default, $type, $visible, $changeable, $required, $grouped, $help)
$entity=$this->em->getRepository("App\Entity\Config")->find($id); {
if(!$entity) { $entity = $this->em->getRepository("App\Entity\Config")->find($id);
$entity= new Config(); if (!$entity) {
$entity = new Config();
$entity->setId($id); $entity->setId($id);
$entity->setValue($value); $entity->setValue($value);
} }
@ -545,11 +496,14 @@ class InitCommand extends Command
$this->em->flush(); $this->em->flush();
} }
private function writelnred($string) { private function writelnred($string)
{
$this->output->writeln('<fg=red>'.$string.'</>'); $this->output->writeln('<fg=red>'.$string.'</>');
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
} }
private function writeln($string) {
private function writeln($string)
{
$this->output->writeln($string); $this->output->writeln($string);
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
} }

View File

@ -1,17 +1,15 @@
<?php <?php
namespace App\Command; namespace App\Command;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Cadoles\CoreBundle\Entity\User;
class SetPasswordCommand extends Command class SetPasswordCommand extends Command
{ {
private $container; private $container;
@ -20,7 +18,7 @@ class SetPasswordCommand extends Command
private $filesystem; private $filesystem;
private $rootlog; private $rootlog;
public function __construct(ContainerInterface $container,EntityManagerInterface $em) public function __construct(ContainerInterface $container, EntityManagerInterface $em)
{ {
parent::__construct(); parent::__construct();
$this->container = $container; $this->container = $container;
@ -42,9 +40,7 @@ class SetPasswordCommand extends Command
{ {
$this->output = $output; $this->output = $output;
$this->filesystem = new Filesystem(); $this->filesystem = new Filesystem();
$this->rootlog = $this->container->get('kernel')->getLogDir()."/"; $this->rootlog = $this->container->get('kernel')->getLogDir().'/';
$this->writelnred(''); $this->writelnred('');
$this->writelnred('== app:SetPasword'); $this->writelnred('== app:SetPasword');
@ -56,8 +52,8 @@ class SetPasswordCommand extends Command
$password = $input->getArgument('password'); $password = $input->getArgument('password');
$this->writeln($password); $this->writeln($password);
$user = $this->em->getRepository('App\Entity\User')->findOneBy(array('username' => $username)); $user = $this->em->getRepository('App\Entity\User')->findOneBy(['username' => $username]);
if($user) { if ($user) {
// Set Password // Set Password
$user->setPassword($password); $user->setPassword($password);
$this->em->persist($user); $this->em->persist($user);
@ -65,19 +61,22 @@ class SetPasswordCommand extends Command
} }
$this->writeln(''); $this->writeln('');
return Command::SUCCESS; return Command::SUCCESS;
} }
private function writelnred($string) { private function writelnred($string)
{
$this->output->writeln('<fg=red>'.$string.'</>'); $this->output->writeln('<fg=red>'.$string.'</>');
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
} }
private function writeln($string) {
if(!$string) $string=" "; private function writeln($string)
{
if (!$string) {
$string = ' ';
}
$this->output->writeln($string); $this->output->writeln($string);
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
} }
} }

View File

@ -1,29 +1,66 @@
<?php <?php
namespace App\Command; namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
use Ramsey\Uuid\Uuid;
use App\Service\LdapService;
use App\Service\ApiService;
use App\Entity\Niveau01;
use App\Entity\Niveau02;
use App\Entity\User;
use App\Entity\Group; use App\Entity\Group;
use App\Entity\Niveau01;
use App\Entity\User;
use App\Entity\UserGroup; use App\Entity\UserGroup;
use App\Service\ApiService;
use App\Service\LdapService;
use Doctrine\ORM\EntityManagerInterface;
use Ramsey\Uuid\Uuid;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Filesystem\Filesystem;
class SynchroCommand extends Command class SynchroCommand extends Command
{ {
public function __construct(ContainerInterface $container,EntityManagerInterface $em,LdapService $ldapservice,ApiService $apiservice) private $container;
private $em;
private $ldap;
private $apiservice;
private $output;
private $filesystem;
private $rootlog;
private $appMasteridentity;
private $synchro;
private $synchropurgeniveau01;
private $synchropurgeniveau02;
private $synchropurgeniveau03;
private $synchropurgeniveau04;
private $synchropurgegroup;
private $synchropurgeuser;
private $host;
private $port;
private $usetls;
private $userwriter;
private $user;
private $password;
private $basedn;
private $baseorganisation;
private $baseniveau01;
private $baseniveau02;
private $baseniveau03;
private $baseniveau04;
private $basegroup;
private $baseuser;
private $username;
private $firstname;
private $lastname;
private $email;
private $avatar;
private $memberof;
private $groupgid;
private $groupname;
private $groupmember;
private $groupmemberisdn;
private $filtergroup;
private $filteruser;
public function __construct(ContainerInterface $container, EntityManagerInterface $em, LdapService $ldapservice, ApiService $apiservice)
{ {
parent::__construct(); parent::__construct();
$this->container = $container; $this->container = $container;
@ -45,83 +82,86 @@ class SynchroCommand extends Command
{ {
$this->output = $output; $this->output = $output;
$this->filesystem = new Filesystem(); $this->filesystem = new Filesystem();
$this->rootlog = $this->container->get('kernel')->getLogDir()."/"; $this->rootlog = $this->container->get('kernel')->getLogDir().'/';
$this->appMasteridentity = $this->container->getParameter('appMasteridentity'); $this->appMasteridentity = $this->container->getParameter('appMasteridentity');
$appSynchro = $this->container->getParameter('appSynchro'); $appSynchro = $this->container->getParameter('appSynchro');
$this->synchro = $this->container->getParameter("appSynchro"); $this->synchro = $this->container->getParameter('appSynchro');
$this->synchropurgeniveau01 = $this->container->getParameter("appSynchroPurgeNiveau01"); $this->synchropurgeniveau01 = $this->container->getParameter('appSynchroPurgeNiveau01');
$this->synchropurgeniveau02 = $this->container->getParameter("appSynchroPurgeNiveau02"); $this->synchropurgeniveau02 = $this->container->getParameter('appSynchroPurgeNiveau02');
$this->synchropurgegroup = $this->container->getParameter("appSynchroPurgeGroup"); $this->synchropurgeniveau03 = $this->container->getParameter('appSynchroPurgeNiveau03');
$this->synchropurgeuser = $this->container->getParameter("appSynchroPurgeUser"); $this->synchropurgeniveau04 = $this->container->getParameter('appSynchroPurgeNiveau04');
$this->synchropurgegroup = $this->container->getParameter('appSynchroPurgeGroup');
$this->synchropurgeuser = $this->container->getParameter('appSynchroPurgeUser');
$this->host = $this->container->getParameter("ldapHost"); $this->host = $this->container->getParameter('ldapHost');
$this->port = $this->container->getParameter("ldapPort"); $this->port = $this->container->getParameter('ldapPort');
$this->usetls = $this->container->getParameter("ldapUsetls"); $this->usetls = $this->container->getParameter('ldapUsetls');
$this->userwriter = $this->container->getParameter("ldapUserwriter"); $this->userwriter = $this->container->getParameter('ldapUserwriter');
$this->user = $this->container->getParameter("ldapUser"); $this->user = $this->container->getParameter('ldapUser');
$this->password = $this->container->getParameter("ldapPassword"); $this->password = $this->container->getParameter('ldapPassword');
$this->basedn = $this->container->getParameter("ldapBasedn"); $this->basedn = $this->container->getParameter('ldapBasedn');
$this->baseorganisation = $this->container->getParameter("ldapBaseorganisation"); $this->baseorganisation = $this->container->getParameter('ldapBaseorganisation');
$this->baseniveau01 = $this->container->getParameter("ldapBaseniveau01"); $this->baseniveau01 = $this->container->getParameter('ldapBaseniveau01');
$this->baseniveau02 = $this->container->getParameter("ldapBaseniveau02"); $this->baseniveau02 = $this->container->getParameter('ldapBaseniveau02');
$this->basegroup = $this->container->getParameter("ldapBasegroup"); $this->baseniveau03 = $this->container->getParameter('ldapBaseniveau03');
$this->baseuser = $this->container->getParameter("ldapBaseuser"); $this->baseniveau04 = $this->container->getParameter('ldapBaseniveau04');
$this->username = $this->container->getParameter("ldapUsername"); $this->basegroup = $this->container->getParameter('ldapBasegroup');
$this->firstname = $this->container->getParameter("ldapFirstname"); $this->baseuser = $this->container->getParameter('ldapBaseuser');
$this->lastname = $this->container->getParameter("ldapLastname"); $this->username = $this->container->getParameter('ldapUsername');
$this->email = $this->container->getParameter("ldapEmail"); $this->firstname = $this->container->getParameter('ldapFirstname');
$this->avatar = $this->container->getParameter("ldapAvatar"); $this->lastname = $this->container->getParameter('ldapLastname');
$this->memberof = $this->container->getParameter("ldapMemberof"); $this->email = $this->container->getParameter('ldapEmail');
$this->groupgid = $this->container->getParameter("ldapGroupgid"); $this->avatar = $this->container->getParameter('ldapAvatar');
$this->groupname = $this->container->getParameter("ldapGroupname"); $this->memberof = $this->container->getParameter('ldapMemberof');
$this->groupmember = $this->container->getParameter("ldapGroupmember"); $this->groupgid = $this->container->getParameter('ldapGroupgid');
$this->groupmemberisdn = $this->container->getParameter("ldapGroupmemberisdn"); $this->groupname = $this->container->getParameter('ldapGroupname');
$this->filtergroup = $this->container->getParameter("ldapFiltergroup"); $this->groupmember = $this->container->getParameter('ldapGroupmember');
$this->filteruser = $this->container->getParameter("ldapFilteruser"); $this->groupmemberisdn = $this->container->getParameter('ldapGroupmemberisdn');
$this->filtergroup = $this->container->getParameter('ldapFiltergroup');
$this->filteruser = $this->container->getParameter('ldapFilteruser');
switch($appSynchro){ switch ($appSynchro) {
case "LDAP2NINE": case 'LDAP2NINE':
$return=$this->ldap2nine(); $return = $this->ldap2nine();
break; break;
case "NINE2LDAP": case 'NINE2LDAP':
$return=$this->nine2ldap(); $return = $this->nine2ldap();
break; break;
case "NINE2NINE": case 'NINE2NINE':
$return=$this->nine2nine(); $return = $this->nine2nine();
break; break;
default: default:
$return=Command::SUCCESS; $return = Command::SUCCESS;
break; break;
} }
$this->writeln(''); $this->writeln('');
return $return; return $return;
} }
private function ldap2nine() private function ldap2nine()
{ {
$this->writelnred(''); $this->writelnred('');
$this->writelnred('== app:Synchro'); $this->writelnred('== app:Synchro');
$this->writelnred('=========================================================================================================='); $this->writelnred('==========================================================================================================');
// Synchronisation ldap2nine possible uniquement si appMasteridentity=LDAP or SSO // Synchronisation ldap2nine possible uniquement si appMasteridentity=LDAP or SSO
if($this->appMasteridentity!="LDAP"&&$this->appMasteridentity!="SSO") { if ('LDAP' != $this->appMasteridentity && 'SSO' != $this->appMasteridentity) {
$this->writeln("Synchronisation impossible si appMasteridentity!=LDAP et appMasteridentity!=SSO"); $this->writeln('Synchronisation impossible si appMasteridentity!=LDAP et appMasteridentity!=SSO');
return Command::FAILURE; return Command::FAILURE;
} }
// Synchronisation impossible si aucune connexion à l'annuaire // Synchronisation impossible si aucune connexion à l'annuaire
if(!$this->ldap->connect()) { if (!$this->ldap->connect()) {
$this->writeln("Synchronisation impossible connexion impossible à l'annuaire"); $this->writeln("Synchronisation impossible connexion impossible à l'annuaire");
return Command::FAILURE; return Command::FAILURE;
} }
@ -130,92 +170,94 @@ class SynchroCommand extends Command
$this->writeln('== SYNCHONISATION LDAP TO NINE ======================'); $this->writeln('== SYNCHONISATION LDAP TO NINE ======================');
$this->writeln('====================================================='); $this->writeln('=====================================================');
$tbniveau01members=[]; $tbniveau01members = [];
$tbgroupmembers=[]; $tbgroupmembers = [];
$tbniveau01s=[]; $tbniveau01s = [];
$tbgroups=[]; $tbgroups = [];
$tbusers=[]; $tbusers = [];
$ldapniveau01s=$this->em->createQueryBuilder()->select('entity')->from('App:Niveau01','entity')->where('entity.ldapfilter IS NOT NULL')->getQuery()->getResult(); $ldapniveau01s = $this->em->createQueryBuilder()->select('entity')->from('App:Niveau01', 'entity')->where('entity.ldapfilter IS NOT NULL')->getQuery()->getResult();
$ldapgroups=$this->em->createQueryBuilder()->select('entity')->from('App:Group','entity')->where('entity.ldapfilter IS NOT NULL')->getQuery()->getResult(); $ldapgroups = $this->em->createQueryBuilder()->select('entity')->from('App:Group', 'entity')->where('entity.ldapfilter IS NOT NULL')->getQuery()->getResult();
$fgsynchroniveau01s=(!empty($this->baseniveau01)&&!empty($this->groupgid)&&!empty($this->groupname)&&!empty($this->filtergroup)); $fgsynchroniveau01s = (!empty($this->baseniveau01) && !empty($this->groupgid) && !empty($this->groupname) && !empty($this->filtergroup));
$fgsynchrogroups=(!empty($this->basegroup)&&!empty($this->groupgid)&&!empty($this->groupname)&&!empty($this->filtergroup)); $fgsynchrogroups = (!empty($this->basegroup) && !empty($this->groupgid) && !empty($this->groupname) && !empty($this->filtergroup));
$fgsynchrousers=(!empty($this->baseuser)&&!empty($this->username)&&!empty($this->email)&&!empty($this->filteruser)); $fgsynchrousers = (!empty($this->baseuser) && !empty($this->username) && !empty($this->email) && !empty($this->filteruser));
$fgsynchropurgeniveau01s=($fgsynchroniveau01s&&$this->synchropurgeniveau01); $fgsynchropurgeniveau01s = ($fgsynchroniveau01s && $this->synchropurgeniveau01);
$fgsynchropurgegroups=($fgsynchrogroups&&$this->synchropurgegroup); $fgsynchropurgegroups = ($fgsynchrogroups && $this->synchropurgegroup);
$fgsynchropurgeusers=($fgsynchrousers&&$this->synchropurgeuser); $fgsynchropurgeusers = ($fgsynchrousers && $this->synchropurgeuser);
// Synchronisation des niveau01s // Synchronisation des niveau01s
if($fgsynchroniveau01s) { if ($fgsynchroniveau01s) {
$this->writeln(''); $this->writeln('');
$this->writeln('== NIVEAU01 ========================================='); $this->writeln('== NIVEAU01 =========================================');
$ldapentrys=$this->ldap->search($this->filtergroup,[$this->groupgid,$this->groupname,$this->groupmember],$this->baseniveau01); $ldapentrys = $this->ldap->search($this->filtergroup, [$this->groupgid, $this->groupname, $this->groupmember], $this->baseniveau01);
foreach($ldapentrys as $ldapentry) { foreach ($ldapentrys as $ldapentry) {
$niveau01other=$this->em->getRepository("App\Entity\Niveau01")->findOneBy(["label"=>$ldapentry[$this->groupname]]); $niveau01other = $this->em->getRepository("App\Entity\Niveau01")->findOneBy(['label' => $ldapentry[$this->groupname]]);
if($niveau01other&&$niveau01other->getIdexternal()!=$ldapentry[$this->groupgid]) { if ($niveau01other && $niveau01other->getIdexternal() != $ldapentry[$this->groupgid]) {
$this->writelnred(" > ".$ldapentry[$this->groupname]." = Impossible à synchroniser un autre niveau01 existe déjà avec ce label"); $this->writelnred(' > '.$ldapentry[$this->groupname].' = Impossible à synchroniser un autre niveau01 existe déjà avec ce label');
continue; continue;
} }
// On recherche le groupe via le gid // On recherche le groupe via le gid
$this->writeln(' > '.$ldapentry[$this->groupname]); $this->writeln(' > '.$ldapentry[$this->groupname]);
$niveau01=$this->em->getRepository("App\Entity\Niveau01")->findOneBy(["idexternal"=>$ldapentry[$this->groupgid]]); $niveau01 = $this->em->getRepository("App\Entity\Niveau01")->findOneBy(['idexternal' => $ldapentry[$this->groupgid]]);
if(!$niveau01) { if (!$niveau01) {
$niveau01=new Niveau01(); $niveau01 = new Niveau01();
$niveau01->setApikey(Uuid::uuid4()); $niveau01->setApikey(Uuid::uuid4());
$this->em->persist($niveau01); $this->em->persist($niveau01);
} }
$niveau01->setIdexternal($ldapentry[$this->groupgid]); $niveau01->setIdexternal($ldapentry[$this->groupgid]);
$niveau01->setLabel($ldapentry[$this->groupname]); $niveau01->setLabel($ldapentry[$this->groupname]);
$niveau01->setLdapfilter("(".$this->groupname."=".$ldapentry[$this->groupname].")"); $niveau01->setLdapfilter('('.$this->groupname.'='.$ldapentry[$this->groupname].')');
$this->em->flush(); $this->em->flush();
// Sauvegarde du niveau01ldap // Sauvegarde du niveau01ldap
array_push($tbniveau01s,$ldapentry[$this->groupname]); array_push($tbniveau01s, $ldapentry[$this->groupname]);
// Sauvegarde des membres du niveau01 // Sauvegarde des membres du niveau01
if(!empty($ldapentry[$this->groupmember])) { if (!empty($ldapentry[$this->groupmember])) {
if(!is_array($ldapentry[$this->groupmember])) { if (!is_array($ldapentry[$this->groupmember])) {
$member=$ldapentry[$this->groupmember]; $member = $ldapentry[$this->groupmember];
if(!array_key_exists($member,$tbniveau01members)) $tbniveau01members[$member]=[]; if (!array_key_exists($member, $tbniveau01members)) {
array_push($tbniveau01members[$member],$ldapentry[$this->groupname]); $tbniveau01members[$member] = [];
} }
else { array_push($tbniveau01members[$member], $ldapentry[$this->groupname]);
foreach($ldapentry[$this->groupmember] as $member) { } else {
if(!array_key_exists($member,$tbniveau01members)) $tbniveau01members[$member]=[]; foreach ($ldapentry[$this->groupmember] as $member) {
array_push($tbniveau01members[$member],$ldapentry[$this->groupname]); if (!array_key_exists($member, $tbniveau01members)) {
$tbniveau01members[$member] = [];
}
array_push($tbniveau01members[$member], $ldapentry[$this->groupname]);
} }
} }
} }
} }
} } else {
else {
$this->writeln(''); $this->writeln('');
$this->writeln('== NIVEAU01 ========================================='); $this->writeln('== NIVEAU01 =========================================');
$this->writelnred(" > Synchronisation impossible il vous manque des paramétres ldap pour le faire"); $this->writelnred(' > Synchronisation impossible il vous manque des paramétres ldap pour le faire');
} }
// Synchronisation des groups // Synchronisation des groups
if($fgsynchrogroups) { if ($fgsynchrogroups) {
$this->writeln(''); $this->writeln('');
$this->writeln('== GROUP ============================================'); $this->writeln('== GROUP ============================================');
$ldapentrys=$this->ldap->search($this->filtergroup,[$this->groupgid,$this->groupname,$this->groupmember],$this->basegroup); $ldapentrys = $this->ldap->search($this->filtergroup, [$this->groupgid, $this->groupname, $this->groupmember], $this->basegroup);
foreach($ldapentrys as $ldapentry) { foreach ($ldapentrys as $ldapentry) {
$groupother=$this->em->getRepository("App\Entity\Group")->findOneBy(["label"=>$ldapentry[$this->groupname]]); $groupother = $this->em->getRepository("App\Entity\Group")->findOneBy(['label' => $ldapentry[$this->groupname]]);
if($groupother&&$groupother->getIdexternal()!=$ldapentry[$this->groupgid]) { if ($groupother && $groupother->getIdexternal() != $ldapentry[$this->groupgid]) {
$this->writelnred(" > ".$ldapentry[$this->groupname]." = Impossible à synchroniser un autre groupe existe déjà avec ce label"); $this->writelnred(' > '.$ldapentry[$this->groupname].' = Impossible à synchroniser un autre groupe existe déjà avec ce label');
continue; continue;
} }
// On recherche le groupe via le gid // On recherche le groupe via le gid
$this->writeln(' > '.$ldapentry[$this->groupname]); $this->writeln(' > '.$ldapentry[$this->groupname]);
$group=$this->em->getRepository("App\Entity\Group")->findOneBy(["idexternal"=>$ldapentry[$this->groupgid]]); $group = $this->em->getRepository("App\Entity\Group")->findOneBy(['idexternal' => $ldapentry[$this->groupgid]]);
if(!$group) { if (!$group) {
$group=new Group(); $group = new Group();
$group->setIsopen(false); $group->setIsopen(false);
$group->setIsworkgroup(false); $group->setIsworkgroup(false);
$group->setApikey(Uuid::uuid4()); $group->setApikey(Uuid::uuid4());
@ -224,105 +266,126 @@ class SynchroCommand extends Command
} }
$group->setIdexternal($ldapentry[$this->groupgid]); $group->setIdexternal($ldapentry[$this->groupgid]);
$group->setLabel($ldapentry[$this->groupname]); $group->setLabel($ldapentry[$this->groupname]);
$group->setLdapfilter("(".$this->groupname."=".$ldapentry[$this->groupname].")"); $group->setLdapfilter('('.$this->groupname.'='.$ldapentry[$this->groupname].')');
$this->em->flush(); $this->em->flush();
// Sauvegarde du groupldap // Sauvegarde du groupldap
array_push($tbgroups,$ldapentry[$this->groupname]); array_push($tbgroups, $ldapentry[$this->groupname]);
// Sauvegarde des membres du group // Sauvegarde des membres du group
if(!empty($ldapentry[$this->groupmember])) { if (!empty($ldapentry[$this->groupmember])) {
if(!is_array($ldapentry[$this->groupmember])) { if (!is_array($ldapentry[$this->groupmember])) {
$member=$ldapentry[$this->groupmember]; $member = $ldapentry[$this->groupmember];
if(!array_key_exists($member,$tbgroupmembers)) $tbgroupmembers[$member]=[]; if (!array_key_exists($member, $tbgroupmembers)) {
array_push($tbgroupmembers[$member],$ldapentry[$this->groupname]); $tbgroupmembers[$member] = [];
} }
else { array_push($tbgroupmembers[$member], $ldapentry[$this->groupname]);
foreach($ldapentry[$this->groupmember] as $member) { } else {
if(!array_key_exists($member,$tbgroupmembers)) $tbgroupmembers[$member]=[]; foreach ($ldapentry[$this->groupmember] as $member) {
array_push($tbgroupmembers[$member],$ldapentry[$this->groupname]); if (!array_key_exists($member, $tbgroupmembers)) {
$tbgroupmembers[$member] = [];
}
array_push($tbgroupmembers[$member], $ldapentry[$this->groupname]);
} }
} }
} }
} }
} } else {
else {
$this->writeln(''); $this->writeln('');
$this->writeln('== GROUP ============================================'); $this->writeln('== GROUP ============================================');
$this->writelnred(" > Synchronisation impossible il vous manque des paramétres ldap pour le faire"); $this->writelnred(' > Synchronisation impossible il vous manque des paramétres ldap pour le faire');
} }
// Synchronisation des users // Synchronisation des users
if($fgsynchrousers) { if ($fgsynchrousers) {
$this->writeln(''); $this->writeln('');
$this->writeln('== USER ============================================='); $this->writeln('== USER =============================================');
$ldapentrys=$this->ldap->search($this->filteruser,[$this->username,$this->firstname,$this->lastname,$this->email,$this->avatar,$this->memberof],$this->baseuser); $ldapentrys = $this->ldap->search($this->filteruser, [$this->username, $this->firstname, $this->lastname, $this->email, $this->avatar, $this->memberof], $this->baseuser);
foreach($ldapentrys as $ldapentry) { foreach ($ldapentrys as $ldapentry) {
$userother=$this->em->getRepository("App\Entity\User")->findOneBy(["email"=>$ldapentry[$this->email]]); $userother = $this->em->getRepository("App\Entity\User")->findOneBy(['email' => $ldapentry[$this->email]]);
if($userother&&$userother->getUSername()!=$ldapentry[$this->username]) { if ($userother && $userother->getUSername() != $ldapentry[$this->username]) {
$this->writelnred(" > ".$ldapentry[$this->groupname]." = Impossible à synchroniser un autre user existe déjà avec ce mail"); $this->writelnred(' > '.$ldapentry[$this->groupname].' = Impossible à synchroniser un autre user existe déjà avec ce mail');
continue; continue;
} }
$userother=$this->em->getRepository("App\Entity\Registration")->findOneBy(["email"=>$ldapentry[$this->email]]); $userother = $this->em->getRepository("App\Entity\Registration")->findOneBy(['email' => $ldapentry[$this->email]]);
if($userother&&$userother->getUSername()!=$ldapentry[$this->username]) { if ($userother && $userother->getUSername() != $ldapentry[$this->username]) {
$this->writelnred(" > ".$ldapentry[$this->username]." = Impossible à synchroniser un autre user existe déjà avec ce mail"); $this->writelnred(' > '.$ldapentry[$this->username].' = Impossible à synchroniser un autre user existe déjà avec ce mail');
continue; continue;
} }
// On recherche le user via le username // On recherche le user via le username
$this->writeln(' > '.$ldapentry[$this->username]); $this->writeln(' > '.$ldapentry[$this->username]);
$user=$this->em->getRepository("App\Entity\User")->findOneBy(["username"=>$ldapentry[$this->username]]); $user = $this->em->getRepository("App\Entity\User")->findOneBy(['username' => $ldapentry[$this->username]]);
if(!$user) { if (!$user) {
$user=new User(); $user = new User();
$user->setUsername($ldapentry[$this->username]); $user->setUsername($ldapentry[$this->username]);
$user->setIsactive(true);
$user->setIsvisible(true); $user->setIsvisible(true);
$user->setApikey(Uuid::uuid4()); $user->setApikey(Uuid::uuid4());
$user->setPassword("LDAPPWD-".$ldapentry[$this->username]); $user->setRole('ROLE_USER');
$user->setRole("ROLE_USER"); $user->setAvatar('noavatar.png');
$user->setAvatar("noavatar.png");
$uuid = Uuid::uuid4();
$user->setPassword('PWD-'.$ldapentry[$this->username].'-'.$uuid);
$this->em->persist($user); $this->em->persist($user);
} }
// Recherche du niveau01 // Recherche du niveau01
$niveau01=null; $niveau01 = null;
if($user->getNiveau01()&&empty($user->getNiveau01()->getIdexternal())) if ($user->getNiveau01() && empty($user->getNiveau01()->getIdexternal())) {
$niveau01=$user->getNiveau01(); $niveau01 = $user->getNiveau01();
if(array_key_exists($ldapentry[$this->username],$tbniveau01members)) }
$niveau01=$this->em->getRepository("App\Entity\Niveau01")->findOneBy(["label"=>$tbniveau01members[$ldapentry[$this->username]][0]]); if (array_key_exists($ldapentry[$this->username], $tbniveau01members)) {
if(!$niveau01) $niveau01 = $this->em->getRepository("App\Entity\Niveau01")->findOneBy(['label' => $tbniveau01members[$ldapentry[$this->username]][0]]);
$niveau01=$this->em->getRepository('App\Entity\Niveau01')->find(-1); }
if (!$niveau01) {
$niveau01 = $this->em->getRepository('App\Entity\Niveau01')->find(-1);
}
// Mise à jour des attributs // Mise à jour des attributs
if(!empty($ldapentry[$this->lastname])) $user->setLastname($ldapentry[$this->lastname]); if (!empty($ldapentry[$this->lastname])) {
if(!empty($ldapentry[$this->firstname])) $user->setFirstname($ldapentry[$this->firstname]); $user->setLastname($ldapentry[$this->lastname]);
if(!empty($ldapentry[$this->email])) $user->setEmail($ldapentry[$this->email]); }
if(!empty($ldapentry[$this->avatar])) $user->setAvatar($ldapentry[$this->avatar]); if (!empty($ldapentry[$this->firstname])) {
$user->setFirstname($ldapentry[$this->firstname]);
}
if (!empty($ldapentry[$this->email])) {
$user->setEmail($ldapentry[$this->email]);
}
if (!empty($ldapentry[$this->avatar])) {
$user->setAvatar($ldapentry[$this->avatar]);
}
// Mise à jour du niveau01 // Mise à jour du niveau01
if($niveau01!=$user->getNiveau01()) $user->setNiveau02(null); if ($niveau01 != $user->getNiveau01()) {
$user->setNiveau02(null);
$user->setNiveau03(null);
$user->setNiveau04(null);
}
$user->setNiveau01($niveau01); $user->setNiveau01($niveau01);
// Mise à jour du role // Mise à jour du role
if(in_array($ldapentry[$this->username],$this->container->getParameter("appAdmins"))) if (in_array($ldapentry[$this->username], $this->container->getParameter('appAdmins'))) {
$user->setRole("ROLE_ADMIN"); $user->setRole('ROLE_ADMIN');
}
// Sauvegarde en bdd // Sauvegarde en bdd
$this->em->flush(); $this->em->flush();
// Sauvegarde du userldap // Sauvegarde du userldap
array_push($tbusers,$ldapentry[$this->username]); array_push($tbusers, $ldapentry[$this->username]);
// Inscription au groupe // Inscription au groupe
if(array_key_exists($ldapentry[$this->username],$tbgroupmembers)) { if (array_key_exists($ldapentry[$this->username], $tbgroupmembers)) {
foreach($tbgroupmembers[$ldapentry[$this->username]] as $grouplabel) { foreach ($tbgroupmembers[$ldapentry[$this->username]] as $grouplabel) {
$group=$this->em->getRepository("App\Entity\Group")->findOneBy(["label"=>$grouplabel]); $group = $this->em->getRepository("App\Entity\Group")->findOneBy(['label' => $grouplabel]);
if($group) { if ($group) {
$usergroup=$this->em->getRepository("App\Entity\UserGroup")->findOneBy(["user"=>$user,"group"=>$group]); $usergroup = $this->em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $user, 'group' => $group]);
if(!$usergroup) { if (!$usergroup) {
$usergroup=new UserGroup(); $usergroup = new UserGroup();
$usergroup->setUser($user); $usergroup->setUser($user);
$usergroup->setGroup($group); $usergroup->setGroup($group);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());
@ -335,52 +398,55 @@ class SynchroCommand extends Command
} }
// Desinscription des group ldap // Desinscription des group ldap
foreach($ldapgroups as $group) { foreach ($ldapgroups as $group) {
if(!array_key_exists($ldapentry[$this->username],$tbgroupmembers)||!in_array($group->getLabel(),$tbgroupmembers[$ldapentry[$this->username]])) { if (!array_key_exists($ldapentry[$this->username], $tbgroupmembers) || !in_array($group->getLabel(), $tbgroupmembers[$ldapentry[$this->username]])) {
$usergroup=$this->em->getRepository("App\Entity\UserGroup")->findOneBy(["user"=>$user,"group"=>$group]); $usergroup = $this->em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $user, 'group' => $group]);
if($usergroup) { if ($usergroup) {
$this->em->remove($usergroup); $this->em->remove($usergroup);
$this->em->flush(); $this->em->flush();
} }
} }
} }
} }
} } else {
else {
$this->writeln(''); $this->writeln('');
$this->writeln('== USER ============================================='); $this->writeln('== USER =============================================');
$this->writelnred(" > Synchronisation impossible il vous manque des paramétres ldap pour le faire"); $this->writelnred(' > Synchronisation impossible il vous manque des paramétres ldap pour le faire');
} }
// Purge des users // Purge des users
if($fgsynchropurgeusers) { if ($fgsynchropurgeusers) {
$this->writeln(''); $this->writeln('');
$this->writeln('== PURGE USER ============================================='); $this->writeln('== PURGE USER =============================================');
$users=$this->em->getRepository("App\Entity\User")->findAll(); $users = $this->em->getRepository("App\Entity\User")->findAll();
foreach($users as $user) { foreach ($users as $user) {
if(!in_array($user->getUsername(),$tbusers)) { if (!in_array($user->getUsername(), $tbusers)) {
if($user->getId()>0) { if ($user->getId() > 0) {
$this->writeln(' > '.$user->getUSername()); $this->writeln(' > '.$user->getUSername());
try {
$this->em->remove($user); $this->em->remove($user);
$this->em->flush(); $this->em->flush();
} catch (\Exception $e) {
$user->setIsactive(false);
$this->em->flush();
}
} }
} }
} }
} }
// Purge des groups // Purge des groups
if($fgsynchropurgegroups) { if ($fgsynchropurgegroups) {
$this->writeln(''); $this->writeln('');
$this->writeln('== PURGE GROUP ============================================='); $this->writeln('== PURGE GROUP =============================================');
foreach($ldapgroups as $group) { foreach ($ldapgroups as $group) {
if(!in_array($group->getLabel(),$tbgroups)) { if (!in_array($group->getLabel(), $tbgroups)) {
if($group->getId()>0) { if ($group->getId() > 0) {
$this->writeln(' > '.$group->getLabel()); $this->writeln(' > '.$group->getLabel());
$this->em->remove($group); $this->em->remove($group);
} } else {
else {
$group->setLdapfilter(null); $group->setLdapfilter(null);
$group->setIdexternal(null); $group->setIdexternal(null);
} }
@ -391,24 +457,25 @@ class SynchroCommand extends Command
} }
// Purge des niveau01s // Purge des niveau01s
if($fgsynchropurgeniveau01s) { if ($fgsynchropurgeniveau01s) {
$this->writeln(''); $this->writeln('');
$this->writeln('== PURGE NIVEAU01 ============================================='); $this->writeln('== PURGE NIVEAU01 =============================================');
foreach($ldapniveau01s as $niveau01) { foreach ($ldapniveau01s as $niveau01) {
if(!in_array($niveau01->getLabel(),$tbniveau01s)) { if (!in_array($niveau01->getLabel(), $tbniveau01s)) {
if($niveau01->getId()>0) { if ($niveau01->getId() > 0) {
$user=$this->em->getRepository("App\Entity\User")->findOneBy(["niveau01"=>$niveau01]); $user = $this->em->getRepository("App\Entity\User")->findOneBy(['niveau01' => $niveau01]);
if($user) { if ($user) {
$resetniveau01=$this->em->getRepository("App\Entity\User")->find(-1); $resetniveau01 = $this->em->getRepository("App\Entity\User")->find(-1);
$user->setNiveau01($resetniveau01); $user->setNiveau01($resetniveau01);
$user->setNiveau02(null); $user->setNiveau02(null);
$user->setNiveau03(null);
$user->setNiveau04(null);
} }
$this->writeln(' > '.$niveau01->getLabel()); $this->writeln(' > '.$niveau01->getLabel());
$this->em->remove($niveau01); $this->em->remove($niveau01);
} } else {
else {
$niveau01->setLdapfilter(null); $niveau01->setLdapfilter(null);
$niveau01->setIdexternal(null); $niveau01->setIdexternal(null);
} }
@ -418,30 +485,26 @@ class SynchroCommand extends Command
} }
} }
return Command::SUCCESS; return Command::SUCCESS;
} }
private function nine2ldap() private function nine2ldap()
{ {
$this->writelnred(''); $this->writelnred('');
$this->writelnred('== app:Synchro'); $this->writelnred('== app:Synchro');
$this->writelnred('=========================================================================================================='); $this->writelnred('==========================================================================================================');
// Synchronisation impossible si aucune connexion à l'annuaire // Synchronisation impossible si aucune connexion à l'annuaire
if(!$this->ldap->isNine2Ldap()) { if (!$this->ldap->isNine2Ldap()) {
$this->writeln("Synchronisation impossible soit :"); $this->writeln('Synchronisation impossible soit :');
$this->writeln("- connexion impossible à l'annuaire"); $this->writeln("- connexion impossible à l'annuaire");
$this->writeln("- appMasteridentity!=SQL"); $this->writeln('- appMasteridentity!=SQL');
$this->writeln("- votre user ldap n'a pas de permission en écriture"); $this->writeln("- votre user ldap n'a pas de permission en écriture");
$this->writeln("- vous n'avez pas renseigné les bases de votre organisation"); $this->writeln("- vous n'avez pas renseigné les bases de votre organisation");
return Command::FAILURE; return Command::FAILURE;
} }
$this->writeln(''); $this->writeln('');
$this->writeln('====================================================='); $this->writeln('=====================================================');
$this->writeln('== SYNCHONISATION NINE TO LDAP ======================'); $this->writeln('== SYNCHONISATION NINE TO LDAP ======================');
@ -452,139 +515,199 @@ class SynchroCommand extends Command
$this->writeln($this->baseorganisation); $this->writeln($this->baseorganisation);
$this->writeln($this->baseniveau01); $this->writeln($this->baseniveau01);
$this->writeln($this->baseniveau02); $this->writeln($this->baseniveau02);
$this->writeln($this->baseniveau03);
$this->writeln($this->baseniveau04);
$this->writeln($this->basegroup); $this->writeln($this->basegroup);
$this->writeln($this->baseuser); $this->writeln($this->baseuser);
$this->ldap->addOrganisations(); $this->ldap->addOrganisations();
$this->writeln(''); $this->writeln('');
$this->writeln('== USER ============================================='); $this->writeln('== USER =============================================');
$users=$this->em->getRepository("App\Entity\User")->findAll(); $users = $this->em->getRepository("App\Entity\User")->findBy(['isactive' => true]);
$attributes=$this->ldap->listAttributesUser(); $attributes = $this->ldap->listAttributesUser();
foreach($users as $user) { foreach ($users as $user) {
$filter=str_replace("*",$user->getUsername(),$this->filteruser); $filter = str_replace('*', $user->getUsername(), $this->filteruser);
$ldapentrys=$this->ldap->search($filter,$attributes,$this->baseuser); $ldapentrys = $this->ldap->search($filter, $attributes, $this->baseuser);
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->writeln($user->getUsername()." = SUBMIT"); $this->writeln($user->getUsername().' = SUBMIT');
$this->ldap->addUser($user); $this->ldap->addUser($user);
} } elseif ($this->ldap->ismodifyUser($user, $ldapentrys[0])) {
elseif($this->ldap->ismodifyUser($user,$ldapentrys[0])) { $this->writeln($user->getUsername().' = UPDATE');
$this->writeln($user->getUsername()." = UPDATE");
$this->ldap->modifyUser($user); $this->ldap->modifyUser($user);
} }
} }
$ldapentrys=$this->ldap->search($this->filteruser,$attributes,$this->baseuser); $ldapentrys = $this->ldap->search($this->filteruser, $attributes, $this->baseuser);
foreach($ldapentrys as $ldapentry) { foreach ($ldapentrys as $ldapentry) {
$user=$this->em->getRepository("App\Entity\User")->findOneBy(["username"=>$ldapentry["uid"]]); $user = $this->em->getRepository("App\Entity\User")->findOneBy(['username' => $ldapentry['uid'], 'isactive' => true]);
if(!$user) { if (!$user) {
$this->writeln($ldapentry["uid"]." = DELETE"); $this->writeln($ldapentry['uid'].' = DELETE');
$dn=$this->ldap->getUserDN($ldapentry["uid"]); $dn = $this->ldap->getUserDN($ldapentry['uid']);
$this->ldap->deleteByDN($dn); $this->ldap->deleteByDN($dn);
} }
} }
$this->writeln(''); $this->writeln('');
$this->writeln('== GROUP ============================================'); $this->writeln('== GROUP ============================================');
$groups=$this->em->getRepository("App\Entity\Group")->findAll(); $groups = $this->em->getRepository("App\Entity\Group")->findAll();
$attributes=$this->ldap->listAttributesGroup(); $attributes = $this->ldap->listAttributesGroup();
foreach($groups as $group) { foreach ($groups as $group) {
if($group->getLdapfilter()) { if ($group->getLdapfilter()) {
$group->setLdapfilter(null); $group->setLdapfilter(null);
$this->em->flush(); $this->em->flush();
} }
$filter="gidnumber=".$group->getId(); $filter = 'gidnumber='.$group->getId();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->basegroup); $ldapentrys = $this->ldap->search($filter, $attributes, $this->basegroup);
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$filter=str_replace("*",$group->getLabel(),$this->filtergroup); $filter = str_replace('*', $group->getLabel(), $this->filtergroup);
$ldapentrys=$this->ldap->search($filter,$attributes,$this->baseniveau01); $ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau01);
} }
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->writeln($group->getLabel()." = SUBMIT"); $this->writeln($group->getLabel().' = SUBMIT');
$this->ldap->addGroup($group); $this->ldap->addGroup($group);
} } elseif ($this->ldap->ismodifyGroup($group, $ldapentrys[0])) {
elseif($this->ldap->ismodifyGroup($group,$ldapentrys[0])) { $this->writeln($group->getLabel().' = UPDATE');
$this->writeln($group->getLabel()." = UPDATE"); $this->ldap->modifyGroup($group, $ldapentrys[0]['cn']);
$this->ldap->modifyGroup($group,$ldapentrys[0]["cn"]);
} }
} }
$ldapentrys=$this->ldap->search($this->filtergroup,$attributes,$this->basegroup); $ldapentrys = $this->ldap->search($this->filtergroup, $attributes, $this->basegroup);
foreach($ldapentrys as $ldapentry) { foreach ($ldapentrys as $ldapentry) {
$group=$this->em->getRepository("App\Entity\Group")->find($ldapentry["gidnumber"]); $group = $this->em->getRepository("App\Entity\Group")->find($ldapentry['gidnumber']);
if(!$group) { if (!$group) {
$this->writeln($ldapentry["cn"]." = DELETE"); $this->writeln($ldapentry['cn'].' = DELETE');
$dn=$this->ldap->getGroupDN($ldapentry["cn"]); $dn = $this->ldap->getGroupDN($ldapentry['cn']);
$this->ldap->deleteByDN($dn);
}
}
$this->writeln('');
$this->writeln('== NIVEAU04 =========================================');
$niveau04s = $this->em->getRepository("App\Entity\Niveau04")->findAll();
$attributes = $this->ldap->listAttributesNiveau04();
foreach ($niveau04s as $niveau04) {
$filter = 'gidnumber='.$niveau04->getId();
$ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau04);
if (empty($ldapentrys)) {
$filter = str_replace('*', $niveau04->getLabel(), $this->filtergroup);
$ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau01);
}
if (empty($ldapentrys)) {
$this->writeln($niveau04->getLabel().' = SUBMIT');
$this->ldap->addNiveau04($niveau04);
} elseif ($this->ldap->ismodifyNiveau04($niveau04, $ldapentrys[0])) {
$this->writeln($niveau04->getLabel().' = UPDATE');
$this->ldap->modifyNiveau04($niveau04, $ldapentrys[0]['cn']);
}
}
$ldapentrys = $this->ldap->search($this->filtergroup, $attributes, $this->baseniveau04);
foreach ($ldapentrys as $ldapentry) {
$niveau04 = $this->em->getRepository("App\Entity\Niveau04")->find($ldapentry['gidnumber']);
if (!$niveau04) {
$this->writeln($ldapentry['cn'].' = DELETE');
$dn = $this->ldap->getNiveau04DN($ldapentry['cn']);
$this->ldap->deleteByDN($dn);
}
}
$this->writeln('');
$this->writeln('== NIVEAU03 =========================================');
$niveau03s = $this->em->getRepository("App\Entity\Niveau03")->findAll();
$attributes = $this->ldap->listAttributesNiveau03();
foreach ($niveau03s as $niveau03) {
$filter = 'gidnumber='.$niveau03->getId();
$ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau03);
if (empty($ldapentrys)) {
$filter = str_replace('*', $niveau03->getLabel(), $this->filtergroup);
$ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau01);
}
if (empty($ldapentrys)) {
$this->writeln($niveau03->getLabel().' = SUBMIT');
$this->ldap->addNiveau03($niveau03);
} elseif ($this->ldap->ismodifyNiveau03($niveau03, $ldapentrys[0])) {
$this->writeln($niveau03->getLabel().' = UPDATE');
$this->ldap->modifyNiveau03($niveau03, $ldapentrys[0]['cn']);
}
}
$ldapentrys = $this->ldap->search($this->filtergroup, $attributes, $this->baseniveau03);
foreach ($ldapentrys as $ldapentry) {
$niveau03 = $this->em->getRepository("App\Entity\Niveau03")->find($ldapentry['gidnumber']);
if (!$niveau03) {
$this->writeln($ldapentry['cn'].' = DELETE');
$dn = $this->ldap->getNiveau03DN($ldapentry['cn']);
$this->ldap->deleteByDN($dn); $this->ldap->deleteByDN($dn);
} }
} }
$this->writeln(''); $this->writeln('');
$this->writeln('== NIVEAU02 ========================================='); $this->writeln('== NIVEAU02 =========================================');
$niveau02s=$this->em->getRepository("App\Entity\Niveau02")->findAll(); $niveau02s = $this->em->getRepository("App\Entity\Niveau02")->findAll();
$attributes=$this->ldap->listAttributesNiveau02(); $attributes = $this->ldap->listAttributesNiveau02();
foreach($niveau02s as $niveau02) { foreach ($niveau02s as $niveau02) {
$filter="gidnumber=".$niveau02->getId(); $filter = 'gidnumber='.$niveau02->getId();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->baseniveau02); $ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau02);
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$filter=str_replace("*",$niveau02->getLabel(),$this->filtergroup); $filter = str_replace('*', $niveau02->getLabel(), $this->filtergroup);
$ldapentrys=$this->ldap->search($filter,$attributes,$this->baseniveau01); $ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau01);
} }
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->writeln($niveau02->getLabel()." = SUBMIT"); $this->writeln($niveau02->getLabel().' = SUBMIT');
$this->ldap->addNiveau02($niveau02); $this->ldap->addNiveau02($niveau02);
} } elseif ($this->ldap->ismodifyNiveau02($niveau02, $ldapentrys[0])) {
elseif($this->ldap->ismodifyNiveau02($niveau02,$ldapentrys[0])) { $this->writeln($niveau02->getLabel().' = UPDATE');
$this->writeln($niveau02->getLabel()." = UPDATE"); $this->ldap->modifyNiveau02($niveau02, $ldapentrys[0]['cn']);
$this->ldap->modifyNiveau02($niveau02,$ldapentrys[0]["cn"]);
} }
} }
$ldapentrys=$this->ldap->search($this->filtergroup,$attributes,$this->baseniveau02); $ldapentrys = $this->ldap->search($this->filtergroup, $attributes, $this->baseniveau02);
foreach($ldapentrys as $ldapentry) { foreach ($ldapentrys as $ldapentry) {
$niveau02=$this->em->getRepository("App\Entity\Niveau02")->find($ldapentry["gidnumber"]); $niveau02 = $this->em->getRepository("App\Entity\Niveau02")->find($ldapentry['gidnumber']);
if(!$niveau02) { if (!$niveau02) {
$this->writeln($ldapentry["cn"]." = DELETE"); $this->writeln($ldapentry['cn'].' = DELETE');
$dn=$this->ldap->getNiveau02DN($ldapentry["cn"]); $dn = $this->ldap->getNiveau02DN($ldapentry['cn']);
$this->ldap->deleteByDN($dn); $this->ldap->deleteByDN($dn);
} }
} }
$this->writeln(''); $this->writeln('');
$this->writeln('== NIVEAU01 ========================================='); $this->writeln('== NIVEAU01 =========================================');
$niveau01s=$this->em->getRepository("App\Entity\Niveau01")->findAll(); $niveau01s = $this->em->getRepository("App\Entity\Niveau01")->findAll();
$attributes=$this->ldap->listAttributesNiveau01(); $attributes = $this->ldap->listAttributesNiveau01();
foreach($niveau01s as $niveau01) { foreach ($niveau01s as $niveau01) {
if($niveau01->getLdapfilter()) { if ($niveau01->getLdapfilter()) {
$niveau01->setLdapfilter(null); $niveau01->setLdapfilter(null);
$this->em->flush(); $this->em->flush();
} }
$filter="gidnumber=".$niveau01->getId(); $filter = 'gidnumber='.$niveau01->getId();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->baseniveau01); $ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau01);
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$filter=str_replace("*",$niveau01->getLabel(),$this->filtergroup); $filter = str_replace('*', $niveau01->getLabel(), $this->filtergroup);
$ldapentrys=$this->ldap->search($filter,$attributes,$this->baseniveau01); $ldapentrys = $this->ldap->search($filter, $attributes, $this->baseniveau01);
} }
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->writeln($niveau01->getLabel()." = SUBMIT"); $this->writeln($niveau01->getLabel().' = SUBMIT');
$this->ldap->addNiveau01($niveau01); $this->ldap->addNiveau01($niveau01);
} } elseif ($this->ldap->ismodifyNiveau01($niveau01, $ldapentrys[0])) {
elseif($this->ldap->ismodifyNiveau01($niveau01,$ldapentrys[0])) { $this->writeln($niveau01->getLabel().' = UPDATE');
$this->writeln($niveau01->getLabel()." = UPDATE"); $this->ldap->modifyNiveau01($niveau01, $ldapentrys[0]['cn']);
$this->ldap->modifyNiveau01($niveau01,$ldapentrys[0]["cn"]);
} }
} }
$ldapentrys=$this->ldap->search($this->filtergroup,$attributes,$this->baseniveau01); $ldapentrys = $this->ldap->search($this->filtergroup, $attributes, $this->baseniveau01);
foreach($ldapentrys as $ldapentry) { foreach ($ldapentrys as $ldapentry) {
$niveau01=$this->em->getRepository("App\Entity\Niveau01")->find($ldapentry["gidnumber"]); $niveau01 = $this->em->getRepository("App\Entity\Niveau01")->find($ldapentry['gidnumber']);
if(!$niveau01) { if (!$niveau01) {
$this->writeln($ldapentry["cn"]." = DELETE"); $this->writeln($ldapentry['cn'].' = DELETE');
$dn=$this->ldap->getNiveau01DN($ldapentry["cn"]); $dn = $this->ldap->getNiveau01DN($ldapentry['cn']);
$this->ldap->deleteByDN($dn); $this->ldap->deleteByDN($dn);
} }
} }
@ -594,61 +717,63 @@ class SynchroCommand extends Command
private function nine2nine() private function nine2nine()
{ {
$this->writelnred(''); $this->writelnred('');
$this->writelnred('== app:Synchro'); $this->writelnred('== app:Synchro');
$this->writelnred('=========================================================================================================='); $this->writelnred('==========================================================================================================');
// Synchronisation ldap2nine possible uniquement si appMasteridentity=NINE // Synchronisation ldap2nine possible uniquement si appMasteridentity=NINE
if($this->appMasteridentity!="NINE") { if ('NINE' != $this->appMasteridentity) {
$this->writeln("Synchronisation impossible si appMasteridentity!=NINE"); $this->writeln('Synchronisation impossible si appMasteridentity!=NINE');
return Command::FAILURE; return Command::FAILURE;
} }
$nineurl = $this->container->getParameter("nineUrl"); $nineurl = $this->container->getParameter('nineUrl');
$ninesecret = $this->container->getParameter("nineSecret"); $ninesecret = $this->container->getParameter('nineSecret');
if(!$nineurl||!$ninesecret) { if (!$nineurl || !$ninesecret) {
$this->writeln("Synchronisation impossible soit parametres NINE_URL et/ou NINE_SECRET manquant"); $this->writeln('Synchronisation impossible soit parametres NINE_URL et/ou NINE_SECRET manquant');
return Command::FAILURE; return Command::FAILURE;
} }
$nineurl.="/rest/"; $nineurl .= '/rest/';
$this->writeln(''); $this->writeln('');
$this->writeln('====================================================='); $this->writeln('=====================================================');
$this->writeln('== SYNCHONISATION NINE TO NINE ======================'); $this->writeln('== SYNCHONISATION NINE TO NINE ======================');
$this->writeln('====================================================='); $this->writeln('=====================================================');
$nineniveau01s=$this->em->createQueryBuilder()->select('entity')->from('App:Niveau01','entity')->where('entity.idexternal IS NOT NULL')->getQuery()->getResult(); $nineniveau01s = $this->em->createQueryBuilder()->select('entity')->from('App:Niveau01', 'entity')->where('entity.idexternal IS NOT NULL')->getQuery()->getResult();
$ninegroups=$this->em->createQueryBuilder()->select('entity')->from('App:Group','entity')->where('entity.idexternal IS NOT NULL')->getQuery()->getResult(); $ninegroups = $this->em->createQueryBuilder()->select('entity')->from('App:Group', 'entity')->where('entity.idexternal IS NOT NULL')->getQuery()->getResult();
$tbniveau01members=[]; $tbniveau01members = [];
$tbgroupmembers=[]; $tbgroupmembers = [];
$tbniveau01s=[]; $tbniveau01s = [];
$tbgroups=[]; $tbgroups = [];
$tbusers=[]; $tbusers = [];
$fgsynchropurgeniveau01s=($this->synchropurgeniveau01); $fgsynchropurgeniveau01s = $this->synchropurgeniveau01;
$fgsynchropurgegroups=($this->synchropurgegroup); $fgsynchropurgegroups = $this->synchropurgegroup;
$fgsynchropurgeusers=($this->synchropurgeuser); $fgsynchropurgeusers = $this->synchropurgeuser;
$this->writeln(''); $this->writeln('');
$this->writeln('== NIVEAU01 ========================================='); $this->writeln('== NIVEAU01 =========================================');
$response = $this->apiservice->run("GET",$nineurl."getAllNiveau01s",null,["key"=>$ninesecret]); $response = $this->apiservice->run('GET', $nineurl.'getAllNiveau01s', null, ['key' => $ninesecret]);
if($response->code!="200") return Command::FAILURE; if ('200' != $response->code) {
foreach($response->body as $nineniveau01 ) { return Command::FAILURE;
$niveau01other=$this->em->getRepository("App\Entity\Niveau01")->findOneBy(["label"=>$nineniveau01->niveau01label]); }
if($niveau01other&&$niveau01other->getIdexternal()!=$nineniveau01->niveau01id) { foreach ($response->body as $nineniveau01) {
$this->writelnred(" > ".$nineniveau01->niveau01label." = Impossible à synchroniser un autre niveau01 existe déjà avec ce label"); $niveau01other = $this->em->getRepository("App\Entity\Niveau01")->findOneBy(['label' => $nineniveau01->niveau01label]);
if ($niveau01other && $niveau01other->getIdexternal() != $nineniveau01->niveau01id) {
$this->writelnred(' > '.$nineniveau01->niveau01label.' = Impossible à synchroniser un autre niveau01 existe déjà avec ce label');
continue; continue;
} }
// On recherche le groupe via le gid // On recherche le groupe via le gid
$this->writeln(' > '.$nineniveau01->niveau01label); $this->writeln(' > '.$nineniveau01->niveau01label);
$niveau01=$this->em->getRepository("App\Entity\Niveau01")->findOneBy(["idexternal"=>$nineniveau01->niveau01id]); $niveau01 = $this->em->getRepository("App\Entity\Niveau01")->findOneBy(['idexternal' => $nineniveau01->niveau01id]);
if(!$niveau01) { if (!$niveau01) {
$niveau01=new Niveau01(); $niveau01 = new Niveau01();
$niveau01->setApikey(Uuid::uuid4()); $niveau01->setApikey(Uuid::uuid4());
$this->em->persist($niveau01); $this->em->persist($niveau01);
} }
@ -658,13 +783,15 @@ class SynchroCommand extends Command
$this->em->flush(); $this->em->flush();
// Sauvegarde du niveau01nine // Sauvegarde du niveau01nine
array_push($tbniveau01s,$nineniveau01->niveau01label); array_push($tbniveau01s, $nineniveau01->niveau01label);
// Sauvegarde des membres du niveau01 // Sauvegarde des membres du niveau01
if(!empty($nineniveau01->niveau01users)) { if (!empty($nineniveau01->niveau01users)) {
foreach($nineniveau01->niveau01users as $member) { foreach ($nineniveau01->niveau01users as $member) {
if(!array_key_exists($member->userlogin,$tbniveau01members)) $tbniveau01members[$member->userlogin]=[]; if (!array_key_exists($member->userlogin, $tbniveau01members)) {
array_push($tbniveau01members[$member->userlogin],$nineniveau01->niveau01label); $tbniveau01members[$member->userlogin] = [];
}
array_push($tbniveau01members[$member->userlogin], $nineniveau01->niveau01label);
} }
} }
} }
@ -672,20 +799,22 @@ class SynchroCommand extends Command
$this->writeln(''); $this->writeln('');
$this->writeln('== GROUP ============================================'); $this->writeln('== GROUP ============================================');
$response = $this->apiservice->run("GET",$nineurl."getAllGroups",null,["key"=>$ninesecret]); $response = $this->apiservice->run('GET', $nineurl.'getAllGroups', null, ['key' => $ninesecret]);
if($response->code!="200") return Command::FAILURE; if ('200' != $response->code) {
foreach($response->body as $ninegroup ) { return Command::FAILURE;
$groupother=$this->em->getRepository("App\Entity\Group")->findOneBy(["label"=>$ninegroup->grouplabel]); }
if($groupother&&$groupother->getIdexternal()!=$ninegroup->groupid) { foreach ($response->body as $ninegroup) {
$this->writelnred(" > ".$ninegroup->grouplabel." = Impossible à synchroniser un autre group existe déjà avec ce label"); $groupother = $this->em->getRepository("App\Entity\Group")->findOneBy(['label' => $ninegroup->grouplabel]);
if ($groupother && $groupother->getIdexternal() != $ninegroup->groupid) {
$this->writelnred(' > '.$ninegroup->grouplabel.' = Impossible à synchroniser un autre group existe déjà avec ce label');
continue; continue;
} }
// On recherche le groupe via le gid // On recherche le groupe via le gid
$this->writeln(' > '.$ninegroup->grouplabel); $this->writeln(' > '.$ninegroup->grouplabel);
$group=$this->em->getRepository("App\Entity\Group")->findOneBy(["idexternal"=>$ninegroup->groupid]); $group = $this->em->getRepository("App\Entity\Group")->findOneBy(['idexternal' => $ninegroup->groupid]);
if(!$group) { if (!$group) {
$group=new Group(); $group = new Group();
$group->setIsopen(false); $group->setIsopen(false);
$group->setIsworkgroup(false); $group->setIsworkgroup(false);
$group->setApikey(Uuid::uuid4()); $group->setApikey(Uuid::uuid4());
@ -698,87 +827,110 @@ class SynchroCommand extends Command
$this->em->flush(); $this->em->flush();
// Sauvegarde du groupnine // Sauvegarde du groupnine
array_push($tbgroups,$ninegroup->grouplabel); array_push($tbgroups, $ninegroup->grouplabel);
// Sauvegarde des membres du group // Sauvegarde des membres du group
if(!empty($ninegroup->groupusers)) { if (!empty($ninegroup->groupusers)) {
foreach($ninegroup->groupusers as $member) { foreach ($ninegroup->groupusers as $member) {
if(!array_key_exists($member->userlogin,$tbgroupmembers)) $tbgroupmembers[$member->userlogin]=[]; if (!array_key_exists($member->userlogin, $tbgroupmembers)) {
array_push($tbgroupmembers[$member->userlogin],$ninegroup->grouplabel); $tbgroupmembers[$member->userlogin] = [];
}
array_push($tbgroupmembers[$member->userlogin], $ninegroup->grouplabel);
} }
} }
} }
$this->writeln(''); $this->writeln('');
$this->writeln('== USER ============================================='); $this->writeln('== USER =============================================');
$response = $this->apiservice->run("GET",$nineurl."getAllUsers",null,["key"=>$ninesecret]); $response = $this->apiservice->run('GET', $nineurl.'getAllUsers', null, ['key' => $ninesecret]);
if($response->code!="200") return Command::FAILURE; if ('200' != $response->code) {
$nineusers=$response->body; return Command::FAILURE;
}
$nineusers = $response->body;
foreach($nineusers as $nineuser) { foreach ($nineusers as $nineuser) {
$userother=$this->em->getRepository("App\Entity\User")->findOneBy(["email"=>$nineuser->useremail]); $userother = $this->em->getRepository("App\Entity\User")->findOneBy(['email' => $nineuser->useremail]);
if($userother&&$userother->getUsername()!=$nineuser->userlogin) { if ($userother && $userother->getUsername() != $nineuser->userlogin) {
$this->writelnred(" > ".$nineuser->userlogin." = Impossible à synchroniser un autre user existe déjà avec ce mail"); $this->writelnred(' > '.$nineuser->userlogin.' = Impossible à synchroniser un autre user existe déjà avec ce mail');
continue; continue;
} }
$userother=$this->em->getRepository("App\Entity\Registration")->findOneBy(["email"=>$nineuser->useremail]); $userother = $this->em->getRepository("App\Entity\Registration")->findOneBy(['email' => $nineuser->useremail]);
if($userother&&$userother->getUSername()!=$nineuser->userlogin) { if ($userother && $userother->getUSername() != $nineuser->userlogin) {
$this->writelnred(" > ".$nineuser->userlogin." = Impossible à synchroniser un autre user existe déjà avec ce mail"); $this->writelnred(' > '.$nineuser->userlogin.' = Impossible à synchroniser un autre user existe déjà avec ce mail');
continue; continue;
} }
// On recherche le user via le username // On recherche le user via le username
$this->writeln(' > '.$nineuser->userlogin); $this->writeln(' > '.$nineuser->userlogin);
$user=$this->em->getRepository("App\Entity\User")->findOneBy(["username"=>$nineuser->userlogin]); $user = $this->em->getRepository("App\Entity\User")->findOneBy(['username' => $nineuser->userlogin]);
if(!$user) { if (!$user) {
$user=new User(); $user = new User();
$user->setUsername($nineuser->userlogin); $user->setUsername($nineuser->userlogin);
$user->setIsactive(true);
$user->setIsvisible(true); $user->setIsvisible(true);
$user->setApikey(Uuid::uuid4()); $user->setApikey(Uuid::uuid4());
$user->setPassword("NINEPWD-".$nineuser->userlogin); $user->setRole('ROLE_USER');
$user->setRole("ROLE_USER");
$user->setAvatar($nineuser->useravatar); $user->setAvatar($nineuser->useravatar);
$uuid = Uuid::uuid4();
$user->setPassword('PWD-'.$nineuser->userlogin.'-'.$uuid);
$this->em->persist($user); $this->em->persist($user);
} }
// Recherche du niveau01 // Recherche du niveau01
$niveau01=null; $niveau01 = null;
if($user->getNiveau01()&&empty($user->getNiveau01()->getIdexternal())) if ($user->getNiveau01() && empty($user->getNiveau01()->getIdexternal())) {
$niveau01=$user->getNiveau01(); $niveau01 = $user->getNiveau01();
if(array_key_exists($nineuser->userlogin,$tbniveau01members)) }
$niveau01=$this->em->getRepository("App\Entity\Niveau01")->findOneBy(["label"=>$tbniveau01members[$nineuser->userlogin][0]]); if (array_key_exists($nineuser->userlogin, $tbniveau01members)) {
if(!$niveau01) $niveau01 = $this->em->getRepository("App\Entity\Niveau01")->findOneBy(['label' => $tbniveau01members[$nineuser->userlogin][0]]);
$niveau01=$this->em->getRepository('App\Entity\Niveau01')->find(-1); }
if (!$niveau01) {
$niveau01 = $this->em->getRepository('App\Entity\Niveau01')->find(-1);
}
// Mise à jour des attributs // Mise à jour des attributs
if(!empty($nineuser->userlastname)) $user->setLastname($nineuser->userlastname); if (!empty($nineuser->userlastname)) {
if(!empty($nineuser->userfirstname)) $user->setFirstname($nineuser->userfirstname); $user->setLastname($nineuser->userlastname);
if(!empty($nineuser->useremail)) $user->setEmail($nineuser->useremail); }
if(!empty($nineuser->useravatar)) $user->setAvatar($nineuser->useravatar); if (!empty($nineuser->userfirstname)) {
$user->setFirstname($nineuser->userfirstname);
}
if (!empty($nineuser->useremail)) {
$user->setEmail($nineuser->useremail);
}
if (!empty($nineuser->useravatar)) {
$user->setAvatar($nineuser->useravatar);
}
// Mise à jour du niveau01 // Mise à jour du niveau01
if($niveau01!=$user->getNiveau01()) $user->setNiveau02(null); if ($niveau01 != $user->getNiveau01()) {
$user->setNiveau02(null);
$user->setNiveau03(null);
$user->setNiveau04(null);
}
$user->setNiveau01($niveau01); $user->setNiveau01($niveau01);
// Mise à jour du role // Mise à jour du role
if(in_array($nineuser->userlogin,$this->container->getParameter("appAdmins"))) if (in_array($nineuser->userlogin, $this->container->getParameter('appAdmins'))) {
$user->setRole("ROLE_ADMIN"); $user->setRole('ROLE_ADMIN');
}
// Sauvegarde en bdd // Sauvegarde en bdd
$this->em->flush(); $this->em->flush();
// Sauvegarde du userldap // Sauvegarde du userldap
array_push($tbusers,$nineuser->userlogin); array_push($tbusers, $nineuser->userlogin);
// Inscription au groupe // Inscription au groupe
if(array_key_exists($nineuser->userlogin,$tbgroupmembers)) { if (array_key_exists($nineuser->userlogin, $tbgroupmembers)) {
foreach($tbgroupmembers[$nineuser->userlogin] as $grouplabel) { foreach ($tbgroupmembers[$nineuser->userlogin] as $grouplabel) {
$group=$this->em->getRepository("App\Entity\Group")->findOneBy(["label"=>$grouplabel]); $group = $this->em->getRepository("App\Entity\Group")->findOneBy(['label' => $grouplabel]);
if($group) { if ($group) {
$usergroup=$this->em->getRepository("App\Entity\UserGroup")->findOneBy(["user"=>$user,"group"=>$group]); $usergroup = $this->em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $user, 'group' => $group]);
if(!$usergroup) { if (!$usergroup) {
$usergroup=new UserGroup(); $usergroup = new UserGroup();
$usergroup->setUser($user); $usergroup->setUser($user);
$usergroup->setGroup($group); $usergroup->setGroup($group);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());
@ -791,10 +943,10 @@ class SynchroCommand extends Command
} }
// Desinscription des group ldap // Desinscription des group ldap
foreach($ninegroups as $group) { foreach ($ninegroups as $group) {
if(!array_key_exists($nineuser->userlogin,$tbgroupmembers)||!in_array($group->getLabel(),$tbgroupmembers[$nineuser->userlogin])) { if (!array_key_exists($nineuser->userlogin, $tbgroupmembers) || !in_array($group->getLabel(), $tbgroupmembers[$nineuser->userlogin])) {
$usergroup=$this->em->getRepository("App\Entity\UserGroup")->findOneBy(["user"=>$user,"group"=>$group]); $usergroup = $this->em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $user, 'group' => $group]);
if($usergroup) { if ($usergroup) {
$this->em->remove($usergroup); $this->em->remove($usergroup);
$this->em->flush(); $this->em->flush();
} }
@ -802,36 +954,39 @@ class SynchroCommand extends Command
} }
} }
// Purge des users // Purge des users
if($fgsynchropurgeusers) { if ($fgsynchropurgeusers) {
$this->writeln(''); $this->writeln('');
$this->writeln('== PURGE USER ============================================='); $this->writeln('== PURGE USER =============================================');
$users=$this->em->getRepository("App\Entity\User")->findAll(); $users = $this->em->getRepository("App\Entity\User")->findAll();
foreach($users as $user) { foreach ($users as $user) {
if(!in_array($user->getUsername(),$tbusers)) { if (!in_array($user->getUsername(), $tbusers)) {
if($user->getId()>0) { if ($user->getId() > 0) {
$this->writeln(' > '.$user->getUsername()); $this->writeln(' > '.$user->getUsername());
try {
$this->em->remove($user); $this->em->remove($user);
$this->em->flush(); $this->em->flush();
} catch (\Exception $e) {
$user->setIsactive(false);
$this->em->flush();
}
} }
} }
} }
} }
// Purge des groups // Purge des groups
if($fgsynchropurgegroups) { if ($fgsynchropurgegroups) {
$this->writeln(''); $this->writeln('');
$this->writeln('== PURGE GROUP ============================================='); $this->writeln('== PURGE GROUP =============================================');
foreach($ninegroups as $group) { foreach ($ninegroups as $group) {
if(!in_array($group->getLabel(),$tbgroups)) { if (!in_array($group->getLabel(), $tbgroups)) {
if($group->getId()>0) { if ($group->getId() > 0) {
$this->writeln(' > '.$group->getLabel()); $this->writeln(' > '.$group->getLabel());
$this->em->remove($group); $this->em->remove($group);
} } else {
else {
$group->setLdapfilter(null); $group->setLdapfilter(null);
$group->setIdexternal(null); $group->setIdexternal(null);
} }
@ -842,24 +997,25 @@ class SynchroCommand extends Command
} }
// Purge des niveau01s // Purge des niveau01s
if($fgsynchropurgeniveau01s) { if ($fgsynchropurgeniveau01s) {
$this->writeln(''); $this->writeln('');
$this->writeln('== PURGE NIVEAU01 ============================================='); $this->writeln('== PURGE NIVEAU01 =============================================');
foreach($nineniveau01s as $niveau01) { foreach ($nineniveau01s as $niveau01) {
if(!in_array($niveau01->getLabel(),$tbniveau01s)) { if (!in_array($niveau01->getLabel(), $tbniveau01s)) {
if($niveau01->getId()>0) { if ($niveau01->getId() > 0) {
$user=$this->em->getRepository("App\Entity\User")->findOneBy(["niveau01"=>$niveau01]); $user = $this->em->getRepository("App\Entity\User")->findOneBy(['niveau01' => $niveau01]);
if($user) { if ($user) {
$resetniveau01=$this->em->getRepository("App\Entity\User")->find(-1); $resetniveau01 = $this->em->getRepository("App\Entity\User")->find(-1);
$user->setNiveau01($resetniveau01); $user->setNiveau01($resetniveau01);
$user->setNiveau02(null); $user->setNiveau02(null);
$user->setNiveau03(null);
$user->setNiveau04(null);
} }
$this->writeln(' > '.$niveau01->getLabel()); $this->writeln(' > '.$niveau01->getLabel());
$this->em->remove($niveau01); $this->em->remove($niveau01);
} } else {
else {
$niveau01->setLdapfilter(null); $niveau01->setLdapfilter(null);
$niveau01->setIdexternal(null); $niveau01->setIdexternal(null);
} }
@ -869,22 +1025,23 @@ class SynchroCommand extends Command
} }
} }
return Command::SUCCESS; return Command::SUCCESS;
} }
private function writelnred($string) { private function writelnred($string)
{
$this->output->writeln('<fg=red>'.$string.'</>'); $this->output->writeln('<fg=red>'.$string.'</>');
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
} }
private function writeln($string) { private function writeln($string)
{
$this->output->writeln($string); $this->output->writeln($string);
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n"); $this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");
} }
protected function addUser($niveau01,$username,$firstname,$lastname,$email,$usersadmin) { protected function addUser($niveau01, $username, $firstname, $lastname, $email, $usersadmin)
{
$user = new User(); $user = new User();
$user->setUsername($username); $user->setUsername($username);
@ -893,39 +1050,34 @@ class SynchroCommand extends Command
$user->setEmail($email); $user->setEmail($email);
$user->setNiveau01($niveau01); $user->setNiveau01($niveau01);
$user->setSiren($niveau01->getSiren()); $user->setSiren($niveau01->getSiren());
$user->setPassword("PASSWORDFROMEXTERNE");
$user->setVisible(true); $user->setVisible(true);
$user->setAuthlevel("simple"); $user->setAuthlevel('simple');
$user->setBelongingpopulation("agent"); $user->setBelongingpopulation('agent');
if(in_array($username,$usersadmin)) $uuid = Uuid::uuid4();
$user->setRole("ROLE_ADMIN"); $user->setPassword('PWD-'.$username.'-'.$uuid);
else {
$user->setRole("ROLE_USER");
// Si modèle scribe if (in_array($username, $usersadmin)) {
$ldap_template = $this->container->getParameter('ldap_template'); $user->setRole('ROLE_ADMIN');
if($ldap_template=="scribe") { } else {
$ldapfilter="(|(&(uid=".$user->getUsername().")(ENTPersonProfils=enseignant))(&(uid=".$user->getUsername().")(typeadmin=0))(&(uid=".$user->getUsername().")(typeadmin=2)))"; $user->setRole('ROLE_USER');
$results = $this->ldap->search($ldapfilter, ['uid'], $this->ldap_basedn);
if($results) $user->setRole("ROLE_ANIM");
}
} }
$this->em->persist($user); $this->em->persist($user);
$this->em->flush(); $this->em->flush();
} }
protected function modUser($user,$username,$firstname,$lastname,$email,$usersadmin) { protected function modUser($user, $username, $firstname, $lastname, $email, $usersadmin)
{
$user->setLastname($lastname); $user->setLastname($lastname);
$user->setFirstname($firstname); $user->setFirstname($firstname);
$user->setEmail($email); $user->setEmail($email);
if(in_array($username,$usersadmin)) if (in_array($username, $usersadmin)) {
$user->setRole("ROLE_ADMIN"); $user->setRole('ROLE_ADMIN');
}
$this->em->persist($user); $this->em->persist($user);
$this->em->flush(); $this->em->flush();
} }
} }

View File

@ -1,37 +1,35 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\Audit as Entity; use App\Entity\Audit as Entity;
use App\Form\AuditType as Form; use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class AuditController extends AbstractController class AuditController extends AbstractController
{ {
private $data="audit"; private $data = 'audit';
private $entity="App\Entity\Audit"; private $entity = "App\Entity\Audit";
private $twig="Audit/"; private $twig = 'Audit/';
private $route="app_admin_audit"; private $route = 'app_admin_audit';
public function list($entityname,$access,ManagerRegistry $em): Response public function list($entityname, $access, ManagerRegistry $em): Response
{ {
$datas = $em->getRepository($this->entity)->findBy(["entityname"=>$entityname]); $datas = $em->getRepository($this->entity)->findBy(['entityname' => $entityname]);
return $this->render($this->twig.'list.html.twig',[ return $this->render($this->twig.'list.html.twig', [
$this->data."s" => $datas, $this->data.'s' => $datas,
"entityname" => $entityname, 'entityname' => $entityname,
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
]); ]);
} }
public function auditrender($entityname,$entityid,$access,ManagerRegistry $em): Response public function auditrender($entityname, $entityid, $access, ManagerRegistry $em): Response
{ {
$datas = $em->getRepository($this->entity)->findBy(["entityname"=>$entityname,"entityid"=>$entityid]); $datas = $em->getRepository($this->entity)->findBy(['entityname' => $entityname, 'entityid' => $entityid]);
/* /*
if($entityname=="User") { if($entityname=="User") {
@ -52,8 +50,8 @@ class AuditController extends AbstractController
} }
*/ */
return $this->render($this->twig.'render.html.twig',[ return $this->render($this->twig.'render.html.twig', [
$this->data."s" => $datas, $this->data.'s' => $datas,
]); ]);
} }
} }

View File

@ -1,49 +1,49 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use App\Form\ConfigType as Form;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\Config as Entity;
use App\Form\ConfigType as Form;
class ConfigController extends AbstractController class ConfigController extends AbstractController
{ {
private $data="config"; private $data = 'config';
private $entity="App\Entity\Config"; private $entity = "App\Entity\Config";
private $twig="Config/"; private $twig = 'Config/';
private $route="app_admin_config"; private $route = 'app_admin_config';
public function list($access): Response public function list($access): Response
{ {
return $this->render($this->twig.'list.html.twig',[ return $this->render($this->twig.'list.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"access"=>$access, 'access' => $access,
]); ]);
} }
public function listrender($access,$category,ManagerRegistry $em): Response public function listrender($access, $category, ManagerRegistry $em): Response
{ {
$datas = $em->getRepository($this->entity)->findBy(["visible"=>true,"category"=>$category]); $datas = $em->getRepository($this->entity)->findBy(['visible' => true, 'category' => $category]);
return $this->render($this->twig.'render.html.twig',[ return $this->render($this->twig.'render.html.twig', [
$this->data."s" => $datas, $this->data.'s' => $datas,
]); ]);
} }
public function update($access,$id,Request $request,ManagerRegistry $em): Response public function update($access, $id, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if(!$data->getValue()) if (!$data->getValue()) {
$data->setValue($request->getSession()->get($data->getId())); $data->setValue($request->getSession()->get($data->getId()));
}
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"update","id"=>$data->getId(),"type"=>$data->getType(),"required"=>$data->isRequired())); $form = $this->createForm(Form::class, $data, ['mode' => 'update', 'id' => $data->getId(), 'type' => $data->getType(), 'required' => $data->isRequired()]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -64,18 +64,19 @@ class ConfigController extends AbstractController
'usesidebar' => true, 'usesidebar' => true,
$this->data => $data, $this->data => $data,
'mode' => 'update', 'mode' => 'update',
'form' => $form->createView() 'form' => $form->createView(),
]); ]);
} }
public function delete($access,$id,Request $request,ManagerRegistry $em): Response public function delete($access, $id, Request $request, ManagerRegistry $em): Response
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$config=$em->getRepository($this->entity)->find($id); $config = $em->getRepository($this->entity)->find($id);
if(!$config->isRequired()) { if (!$config->isRequired()) {
$config->setValue(""); $config->setValue('');
$em->getManager()->flush(); $em->getManager()->flush();
} }
return $this->redirectToRoute($this->route); return $this->redirectToRoute($this->route);
} }

View File

@ -2,119 +2,120 @@
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use App\Form\CronType as Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use App\Form\CronType as Form;
class CronController extends AbstractController class CronController extends AbstractController
{ {
private $data="cron"; private $data = 'cron';
private $entity="App\Entity\Cron"; private $entity = "App\Entity\Cron";
private $twig="Cron/"; private $twig = 'Cron/';
private $route="app_admin_cron"; private $route = 'app_admin_cron';
public function list($access): Response public function list($access): Response
{ {
return $this->render($this->twig.'list.html.twig',[ return $this->render($this->twig.'list.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"access"=>$access, 'access' => $access,
]); ]);
} }
public function tablelist(Request $request,ManagerRegistry $em): Response public function tablelist(Request $request, ManagerRegistry $em): Response
{ {
$query=$request->query->all(); $query = $request->query->all();
$start=$query['start']; $start = $query['start'];
$length=$query['length']; $length = $query['length'];
$search=$query['search']; $search = $query['search'];
$draw= $query['draw']; $draw = $query['draw'];
$ordercolumn=$query['order'][0]['column']; $ordercolumn = $query['order'][0]['column'];
$orderdir=$query['order'][0]['dir']; $orderdir = $query['order'][0]['dir'];
// Nombre total d'enregistrement // Nombre total d'enregistrement
$total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity,'entity')->getQuery()->getSingleScalarResult(); $total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity, 'entity')->getQuery()->getSingleScalarResult();
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if(!$search||$search["value"]=="") if (!$search || '' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->where('entity.command LIKE :value OR entity.description LIKE :value') ->where('entity.command LIKE :value OR entity.description LIKE :value')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
} }
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('entity')->from($this->entity,'entity'); $qb->select('entity')->from($this->entity, 'entity');
if($search&&$search["value"]!="") { if ($search && '' != $search['value']) {
$qb ->andWhere('entity.command LIKE :value OR entity.description LIKE :value') $qb->andWhere('entity.command LIKE :value OR entity.description LIKE :value')
->setParameter("value", "%".$search["value"]."%"); ->setParameter('value', '%'.$search['value'].'%');
} }
if($ordercolumn) { if ($ordercolumn) {
switch($ordercolumn) { switch ($ordercolumn) {
case 1 : case 1:
$qb->orderBy('entity.nextexecdate',$orderdir); $qb->orderBy('entity.nextexecdate', $orderdir);
break; break;
case 2 : case 2:
$qb->orderBy('entity.command',$orderdir); $qb->orderBy('entity.command', $orderdir);
break; break;
} }
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
// Action // Action
$action = ""; $action = '';
$action.="<a href='".$this->generateUrl($this->route.'_update', array('id'=>$data->getId()))."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl($this->route.'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
$tmp=array(); $tmp = [];
array_push($tmp,$action); array_push($tmp, $action);
array_push($tmp,$data->getNextexecdate()->format("d/m/Y H:i")); array_push($tmp, $data->getNextexecdate()->format('d/m/Y H:i'));
array_push($tmp,$data->getCommand()); array_push($tmp, $data->getCommand());
array_push($tmp,$data->getDescription()); array_push($tmp, $data->getDescription());
array_push($tmp,$data->getStatutLabel()); array_push($tmp, $data->getStatutLabel());
array_push($output["data"],$tmp); array_push($output['data'], $tmp);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function update($id,$access,Request $request,ManagerRegistry $em): Response public function update($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"update", 'mode' => 'update',
)); ]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -142,7 +143,7 @@ class CronController extends AbstractController
public function log() public function log()
{ {
return $this->render($this->render.'logs.html.twig', [ return $this->render($this->twig.'logs.html.twig', [
'useheader' => true, 'useheader' => true,
'usesidebar' => true, 'usesidebar' => true,
]); ]);
@ -150,36 +151,36 @@ class CronController extends AbstractController
public function getlog(Request $request, $id) public function getlog(Request $request, $id)
{ {
$path = $this->getParameter('kernel.project_dir'); $path = $this->getParameter('kernel.project_dir');
if($id=="dump") if ('dump' == $id) {
$file = $path . '/var/log/' . $this->getParameter("appAlias") . '.sql'; $file = $path.'/var/log/'.$this->getParameter('appAlias').'.sql';
else } else {
$file = $path . '/var/log/'.$id.'.log'; $file = $path.'/var/log/'.$id.'.log';
}
$fs = new Filesystem(); $fs = new Filesystem();
if($fs->exists($file)) { if ($fs->exists($file)) {
$response = new BinaryFileResponse($file); $response = new BinaryFileResponse($file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
return $response; return $response;
} else {
return $this->redirectToRoute($this->route.'_log');
} }
else return $this->redirectToRoute($this->route."_log");
} }
protected function getErrorForm($id, $form, $request, $data, $mode)
protected function getErrorForm($id,$form,$request,$data,$mode) { {
if ($form->get('submit')->isClicked()&&$mode=="delete") { if ($form->get('submit')->isClicked() && 'delete' == $mode) {
} }
if ($form->get('submit')->isClicked() && $mode=="submit") { if ($form->get('submit')->isClicked() && 'submit' == $mode) {
} }
if ($form->get('submit')->isClicked() && !$form->isValid()) { if ($form->get('submit')->isClicked() && !$form->isValid()) {
$this->get('session')->getFlashBag()->clear();
$errors = $form->getErrors(); $errors = $form->getErrors();
foreach( $errors as $error ) { foreach ($errors as $error) {
$request->getSession()->getFlashBag()->add("error", $error->getMessage()); $request->getSession()->getFlashBag()->add('error', $error->getMessage());
} }
} }
} }

View File

@ -2,14 +2,14 @@
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpFoundation\Response;
use App\Service\MinioService; use App\Service\MinioService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
class CropController extends AbstractController class CropController extends AbstractController
{ {
@ -23,78 +23,82 @@ class CropController extends AbstractController
} }
// Etape 01 - Téléchargement de l'image // Etape 01 - Téléchargement de l'image
public function crop01($type,$reportinput): Response public function crop01($type, $reportinput): Response
{ {
return $this->render('Crop/crop01.html.twig',[ return $this->render('Crop/crop01.html.twig', [
'useheader' => false, 'useheader' => false,
'usesidebar' => false, 'usesidebar' => false,
'type' => $type, 'type' => $type,
'reportinput' => $reportinput 'reportinput' => $reportinput,
]); ]);
} }
// Etape 02 - Couper votre l'image // Etape 02 - Couper votre l'image
public function crop02($type,$reportinput,Request $request) public function crop02($type, $reportinput, Request $request)
{ {
// Récupération de l'image à cropper // Récupération de l'image à cropper
$file=$request->query->get('file'); $file = $request->query->get('file');
$large_image_location=$this->minio->download($type."/".$file,$type."/".$file,true); $large_image_location = $this->minio->download($type.'/'.$file, $type.'/'.$file, true);
// Récupérer les tailles de l'image // Récupérer les tailles de l'image
$width = $this->getWidth($large_image_location); $width = $this->getWidth($large_image_location);
$height = $this->getHeight($large_image_location); $height = $this->getHeight($large_image_location);
$max_height = null;
$max_width = null;
$ratio = null;
// Définir le pourcentage de réduction de l'image // Définir le pourcentage de réduction de l'image
switch ($type) { switch ($type) {
case "illustration": case 'illustration':
$max_height=0; $max_height = 0;
$ratio="1:1"; $ratio = '1:1';
break; break;
case "avatar": case 'avatar':
$max_height=900; $max_height = 900;
$max_width=900; $max_width = 900;
$ratio="1:1"; $ratio = '1:1';
break; break;
case "header": case 'header':
$max_height=1600; $max_height = 1600;
$max_width=1600; $max_width = 1600;
$ratio="16:2"; $ratio = '16:2';
break; break;
case "hero": case 'hero':
$max_height=1600; $max_height = 1600;
$max_width=1600; $max_width = 1600;
$ratio="16:9"; $ratio = '16:9';
break; break;
case "image": case 'image':
$max_height=1600; $max_height = 1600;
$max_width=1600; $max_width = 1600;
$ratio="1:1"; $ratio = '1:1';
break; break;
} }
if($max_height>0) { if ($max_height > 0) {
$scale = $max_height/$height; $scale = $max_height / $height;
if(($width*$scale)>$max_width) { if (($width * $scale) > $max_width) {
$scale = $max_width/$width; $scale = $max_width / $width;
} }
$this->resizeImage($large_image_location,$width,$height,$scale); $this->resizeImage($large_image_location, $width, $height, $scale);
$this->minio->upload($large_image_location,$type."/".$file,false); $this->minio->upload($large_image_location, $type.'/'.$file, false);
} else {
$scale = 1;
} }
else $scale=1;
// Construction du formulaire // Construction du formulaire
$submited=false; $submited = false;
$form = $this->createFormBuilder() $form = $this->createFormBuilder()
->add('submit',SubmitType::class,array("label" => "Valider","attr" => array("class" => "btn btn-success"))) ->add('submit', SubmitType::class, ['label' => 'Valider', 'attr' => ['class' => 'btn btn-success']])
->add('x',HiddenType::class) ->add('x', HiddenType::class)
->add('y',HiddenType::class) ->add('y', HiddenType::class)
->add('w',HiddenType::class) ->add('w', HiddenType::class)
->add('h',HiddenType::class) ->add('h', HiddenType::class)
->add('xs',HiddenType::class) ->add('xs', HiddenType::class)
->add('ys',HiddenType::class) ->add('ys', HiddenType::class)
->add('ws',HiddenType::class) ->add('ws', HiddenType::class)
->add('hs',HiddenType::class) ->add('hs', HiddenType::class)
->getForm(); ->getForm();
// Récupération des data du formulaire // Récupération des data du formulaire
@ -104,14 +108,14 @@ class CropController extends AbstractController
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
// Récupération des valeurs du formulaire // Récupération des valeurs du formulaire
$data = $form->getData(); $data = $form->getData();
$tmpdir=$this->appKernel->getProjectDir()."/var/tmp"; $tmpdir = $this->appKernel->getProjectDir().'/var/tmp';
$thumb_image_location = "$tmpdir/$type/thumb_".$file; $thumb_image_location = "$tmpdir/$type/thumb_".$file;
$cropped = $this->resizeThumbnailImage($thumb_image_location, $large_image_location,$data["ws"],$data["hs"],$data["xs"],$data["ys"],$scale); $cropped = $this->resizeThumbnailImage($thumb_image_location, $large_image_location, $data['ws'], $data['hs'], $data['xs'], $data['ys'], $scale);
// Dépot des fichiers sur minio // Dépot des fichiers sur minio
$this->minio->upload($thumb_image_location,$type."/thumb_".$file,false); $this->minio->upload($thumb_image_location, $type.'/thumb_'.$file, false);
$submited=true; $submited = true;
} }
return $this->render('Crop/crop02.html.twig', [ return $this->render('Crop/crop02.html.twig', [
@ -121,67 +125,76 @@ class CropController extends AbstractController
'type' => $type, 'type' => $type,
'file' => $file, 'file' => $file,
'ratio' => $ratio, 'ratio' => $ratio,
"reportinput" => $reportinput, 'reportinput' => $reportinput,
"submited" => $submited 'submited' => $submited,
]); ]);
} }
// Calcul de la hauteur // Calcul de la hauteur
protected function getHeight($image) { protected function getHeight($image)
{
$size = getimagesize($image); $size = getimagesize($image);
$height = $size[1]; $height = $size[1];
return $height; return $height;
} }
// Cacul de la largeur // Cacul de la largeur
protected function getWidth($image) { protected function getWidth($image)
{
$size = getimagesize($image); $size = getimagesize($image);
$width = $size[0]; $width = $size[0];
return $width; return $width;
} }
protected function resizeImage($image,$width,$height,$scale) { protected function resizeImage($image, $width, $height, $scale)
{
list($imagewidth, $imageheight, $imageType) = getimagesize($image); list($imagewidth, $imageheight, $imageType) = getimagesize($image);
$imageType = image_type_to_mime_type($imageType); $imageType = image_type_to_mime_type($imageType);
$newImageWidth = ceil($width * $scale); $newImageWidth = ceil($width * $scale);
$newImageHeight = ceil($height * $scale); $newImageHeight = ceil($height * $scale);
$newImage = imagecreatetruecolor($newImageWidth,$newImageHeight); $newImage = imagecreatetruecolor($newImageWidth, $newImageHeight);
switch($imageType) { $source = null;
case "image/gif":
$source=imagecreatefromgif($image); switch ($imageType) {
case 'image/gif':
$source = imagecreatefromgif($image);
break; break;
case "image/pjpeg": case 'image/pjpeg':
case "image/jpeg": case 'image/jpeg':
case "image/jpg": case 'image/jpg':
$source=imagecreatefromjpeg($image); $source = imagecreatefromjpeg($image);
break; break;
case "image/png": case 'image/png':
case "image/x-png": case 'image/x-png':
$source=imagecreatefrompng($image); $source = imagecreatefrompng($image);
break; break;
} }
imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height); imagecopyresampled($newImage, $source, 0, 0, 0, 0, $newImageWidth, $newImageHeight, $width, $height);
switch($imageType) { switch ($imageType) {
case "image/gif": case 'image/gif':
imagegif($newImage,$image); imagegif($newImage, $image);
break; break;
case "image/pjpeg": case 'image/pjpeg':
case "image/jpeg": case 'image/jpeg':
case "image/jpg": case 'image/jpg':
imagejpeg($newImage,$image,90); imagejpeg($newImage, $image, 90);
break; break;
case "image/png": case 'image/png':
case "image/x-png": case 'image/x-png':
imagepng($newImage,$image); imagepng($newImage, $image);
break; break;
} }
chmod($image, 0640); chmod($image, 0640);
return $image; return $image;
} }
protected function resizeThumbnailImage($thumb_image_name, $image, $width, $height, $start_width, $start_height, $scale){ protected function resizeThumbnailImage($thumb_image_name, $image, $width, $height, $start_width, $start_height, $scale)
{
$fs = new Filesystem(); $fs = new Filesystem();
$fs->remove($thumb_image_name); $fs->remove($thumb_image_name);
@ -189,47 +202,47 @@ class CropController extends AbstractController
$imageType = image_type_to_mime_type($imageType); $imageType = image_type_to_mime_type($imageType);
$newImageWidth = ceil($width * $scale); $newImageWidth = ceil($width * $scale);
$newImageHeight = ceil($height * $scale); $newImageHeight = ceil($height * $scale);
$newImageWidth=900; $newImageWidth = 900;
$newImageHeight=900; $newImageHeight = 900;
$newImage = imagecreatetruecolor($newImageWidth,$newImageHeight); $newImage = imagecreatetruecolor($newImageWidth, $newImageHeight);
$source = null;
switch ($imageType) {
switch($imageType) { case 'image/gif':
case "image/gif": $source = imagecreatefromgif($image);
$source=imagecreatefromgif($image);
break; break;
case "image/pjpeg": case 'image/pjpeg':
case "image/jpeg": case 'image/jpeg':
case "image/jpg": case 'image/jpg':
dump("here"); dump('here');
$source=imagecreatefromjpeg($image); $source = imagecreatefromjpeg($image);
break; break;
case "image/png": case 'image/png':
case "image/x-png": case 'image/x-png':
$source=imagecreatefrompng($image); $source = imagecreatefrompng($image);
break; break;
} }
$ok=imagecopyresampled($newImage,$source,0,0,$start_width,$start_height,$newImageWidth,$newImageHeight,$width,$height); $ok = imagecopyresampled($newImage, $source, 0, 0, $start_width, $start_height, $newImageWidth, $newImageHeight, $width, $height);
switch($imageType) { switch ($imageType) {
case "image/gif": case 'image/gif':
imagegif($newImage,$thumb_image_name); imagegif($newImage, $thumb_image_name);
break; break;
case "image/pjpeg": case 'image/pjpeg':
case "image/jpeg": case 'image/jpeg':
case "image/jpg": case 'image/jpg':
dump($thumb_image_name); dump($thumb_image_name);
imagejpeg($newImage,$thumb_image_name,100); imagejpeg($newImage, $thumb_image_name, 100);
break; break;
case "image/png": case 'image/png':
case "image/x-png": case 'image/x-png':
imagepng($newImage,$thumb_image_name); imagepng($newImage, $thumb_image_name);
break; break;
} }
chmod($thumb_image_name, 0640); chmod($thumb_image_name, 0640);
return $thumb_image_name; return $thumb_image_name;
} }
} }

View File

@ -1,210 +1,217 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use App\Entity\Group as Entity; use App\Entity\Group as Entity;
use App\Entity\UserGroup; use App\Entity\UserGroup;
use App\Form\GroupType as Form; use App\Form\GroupType as Form;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class GroupController extends AbstractController class GroupController extends AbstractController
{ {
private $data="group"; private $data = 'group';
private $entity="App\Entity\Group"; private $entity = "App\Entity\Group";
private $twig="Group/"; private $twig = 'Group/';
private $route="app_admin_group"; private $route = 'app_admin_group';
public function list($access): Response public function list($access): Response
{ {
return $this->render($this->twig.'list.html.twig',[ return $this->render($this->twig.'list.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>($access!="user"), 'usesidebar' => ('all' != $access),
"access"=>$access, 'access' => $access,
]); ]);
} }
public function tablelist($access,Request $request,ManagerRegistry $em): Response public function tablelist($access, Request $request, ManagerRegistry $em): Response
{ {
$query=$request->query->all(); $query = $request->query->all();
$start=$query['start']; $start = $query['start'];
$length=$query['length']; $length = $query['length'];
$search=$query['search']; $search = $query['search'];
$draw= $query['draw']; $draw = $query['draw'];
$ordercolumn=$query['order'][0]['column']; $ordercolumn = $query['order'][0]['column'];
$orderdir=$query['order'][0]['dir']; $orderdir = $query['order'][0]['dir'];
$user=$this->getUser(); $user = $this->getUser();
// Nombre total d'enregistrement // Nombre total d'enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('COUNT(entity)')->from($this->entity,'entity')->getQuery()->getSingleScalarResult(); $qb->select('COUNT(entity)')->from($this->entity, 'entity')->getQuery()->getSingleScalarResult();
if($access=="user") { if ('all' == $access) {
$qb ->from("App:UserGroup","usergroup") $qb->from('App:UserGroup', 'usergroup')
->andWhere(("entity.isworkgroup=:flag")) ->andWhere('entity.isworkgroup=:flag')
->andWhere("entity.id=usergroup.group") ->andWhere('entity.id=usergroup.group')
->andWhere("usergroup.user=:user") ->andWhere('usergroup.user=:user')
->setParameter("flag", true) ->setParameter('flag', true)
->setParameter("user", $user); ->setParameter('user', $user);
} }
$total = $qb->getQuery()->getSingleScalarResult(); $total = $qb->getQuery()->getSingleScalarResult();
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if(!$search||$search["value"]=="") if (!$search || '' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
$qb= $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb ->select('COUNT(entity)') $qb->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->where('entity.label LIKE :value') ->where('entity.label LIKE :value')
->leftJoin('App:User', 'user','WITH','entity.owner = user.id AND user.username LIKE :value') ->leftJoin('App:User', 'user', 'WITH', 'entity.owner = user.id AND user.username LIKE :value')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
if($access=="user") { if ('all' == $access) {
$qb ->from("App:UserGroup","usergroup") $qb->from('App:UserGroup', 'usergroup')
->andWhere(("entity.isworkgroup=:flag")) ->andWhere('entity.isworkgroup=:flag')
->andWhere("entity.id=usergroup.group") ->andWhere('entity.id=usergroup.group')
->andWhere("usergroup.user=:user") ->andWhere('usergroup.user=:user')
->setParameter("flag", true) ->setParameter('flag', true)
->setParameter("user", $user); ->setParameter('user', $user);
} }
$totalf= $qb->getQuery()->getSingleScalarResult(); $totalf = $qb->getQuery()->getSingleScalarResult();
} }
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb ->select('entity') $qb->select('entity')
->from($this->entity,'entity'); ->from($this->entity, 'entity');
if($access=="user") { if ('all' == $access) {
$qb ->from("App:UserGroup","usergroup") $qb->from('App:UserGroup', 'usergroup')
->andWhere(("entity.isworkgroup=:flag")) ->andWhere('entity.isworkgroup=:flag')
->andWhere("entity.id=usergroup.group") ->andWhere('entity.id=usergroup.group')
->andWhere("usergroup.user=:user") ->andWhere('usergroup.user=:user')
->setParameter("flag", true) ->setParameter('flag', true)
->setParameter("user", $user); ->setParameter('user', $user);
} }
if($search&&$search["value"]!="") { if ($search && '' != $search['value']) {
$qb ->andWhere('entity.label LIKE :value') $qb->andWhere('entity.label LIKE :value')
->setParameter("value", "%".$search["value"]."%"); ->setParameter('value', '%'.$search['value'].'%');
} }
if($ordercolumn) { if ($ordercolumn) {
switch($ordercolumn) { switch ($ordercolumn) {
case 1 : case 1:
$qb->orderBy('entity.label',$orderdir); $qb->orderBy('entity.label', $orderdir);
break; break;
case 2 : case 2:
$qb->orderBy('entity.isworkgroup',$orderdir); $qb->orderBy('entity.isworkgroup', $orderdir);
break; break;
case 3 : case 3:
$qb->orderBy('entity.isopen',$orderdir); $qb->orderBy('entity.isopen', $orderdir);
break; break;
case 4 : case 4:
$qb->orderBy('entity.owner',$orderdir); $qb->orderBy('entity.owner', $orderdir);
break; break;
} }
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
// Action // Action
$action = ""; $action = '';
switch($access) { switch ($access) {
case "admin": case 'admin':
if($this->canupdate($access,$data,$em,false)) if ($this->canupdate($access, $data, $em, false)) {
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_".$access."_",$this->route).'_update', ['id'=>$data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
}
if($this->canseemember($access,$data,$em,false)) if ($this->canseemember($access, $data, $em, false)) {
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_".$access."_",$this->route).'_users', ['id'=>$data->getId()])."'><i class='fa fa-users fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_'.$access.'_', $this->route).'_users', ['id' => $data->getId()])."'><i class='fa fa-users fa-fw fa-2x'></i></a>";
}
break; break;
case "modo": case 'modo':
if($this->canupdate($access,$data,$em,false)) if ($this->canupdate($access, $data, $em, false)) {
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_".$access."_",$this->route).'_update', ['id'=>$data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
}
if($this->canseemember($access,$data,$em,false)) if ($this->canseemember($access, $data, $em, false)) {
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_".$access."_",$this->route).'_users', ['id'=>$data->getId()])."'><i class='fa fa-users fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_'.$access.'_', $this->route).'_users', ['id' => $data->getId()])."'><i class='fa fa-users fa-fw fa-2x'></i></a>";
}
break; break;
case "user": case 'all':
if($this->canupdate($access,$data,$em,false)) if ($this->canupdate($access, $data, $em, false)) {
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_".$access."_",$this->route).'_update', ['id'=>$data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
}
if($this->canseemember($access,$data,$em,false))
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_".$access."_",$this->route).'_users', ['id'=>$data->getId()])."'><i class='fa fa-users fa-fw fa-2x'></i></a>";
if ($this->canseemember($access, $data, $em, false)) {
$action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_'.$access.'_', $this->route).'_users', ['id' => $data->getId()])."'><i class='fa fa-users fa-fw fa-2x'></i></a>";
}
// On ne peut se désinscrire que si le groupe est ouvert et qu'il n'est pas lié à un groupe ldap ou sso // On ne peut se désinscrire que si le groupe est ouvert et qu'il n'est pas lié à un groupe ldap ou sso
if($data->getOwner()!=$this->getUser()&&($data->isIsOpen()||$this->canupdatemember($access,$data,$em,false))) if ($data->getOwner() != $this->getUser() && ($data->isIsOpen() || $this->canupdatemember($access, $data, $em, false))) {
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_".$access."_",$this->route).'_userout', ['id'=>$data->getId()])."'><i class='fa fa-sign-out-alt fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_'.$access.'_', $this->route).'_userout', ['id' => $data->getId()])."'><i class='fa fa-sign-out-alt fa-fw fa-2x'></i></a>";
}
break; break;
} }
$userinfo=""; $userinfo = '';
if($data->getOwner()) { if ($data->getOwner()) {
$userinfo.="<img src='".$this->generateUrl('app_minio_image',["file"=>"avatar/".$data->getOwner()->getAvatar()])."' class='avatar'>"; $userinfo .= '<div class="d-flex align-items-center">';
$userinfo.="<br>".$data->getOwner()->getUsername(); $userinfo .= "<img src='".$this->generateUrl('app_minio_image', ['file' => 'avatar/'.$data->getOwner()->getAvatar()])."' class='avatar me-2'>";
$userinfo .= '<div>'.$data->getOwner()->getFullname().'</div>';
$userinfo .= '</div>';
} }
$visitecpt=0; $visitecpt = 0;
$visitelast=null; $visitelast = null;
foreach($data->getUsers() as $usergroup) { foreach ($data->getUsers() as $usergroup) {
$visitecpt+=intval($usergroup->getVisitecpt()); $visitecpt += intval($usergroup->getVisitecpt());
$visitelast=($usergroup->getVisitedate()>$visitelast?$usergroup->getVisitedate():$visitelast); $visitelast = ($usergroup->getVisitedate() > $visitelast ? $usergroup->getVisitedate() : $visitelast);
} }
$tmp=array(); $tmp = [];
array_push($tmp,$action); array_push($tmp, $action);
array_push($tmp,$data->getLabel()); array_push($tmp, $data->getLabel());
array_push($tmp,($data->isIsworkgroup()?"oui":"non")); array_push($tmp, $data->isIsworkgroup() ? 'oui' : 'non');
array_push($tmp,($data->isIsopen()?"oui":"non")); array_push($tmp, $data->isIsopen() ? 'oui' : 'non');
array_push($tmp,$userinfo); array_push($tmp, $userinfo);
array_push($tmp,($visitelast?$visitelast->format("d/m/Y H:i")."<br>":"")."nb = ".$visitecpt); array_push($tmp, ($visitelast ? $visitelast->format('d/m/Y H:i').'<br>' : '').'nb = '.$visitecpt);
array_push($output["data"],$tmp); array_push($output['data'], $tmp);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function submit($access, Request $request, ManagerRegistry $em): Response
public function submit($access,Request $request,ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data = new Entity(); $data = new Entity();
$data->setApikey(Uuid::uuid4()); $data->setApikey(Uuid::uuid4());
if($access=="user") { if ('all' == $access) {
$data->setOwner($this->getUser()); $data->setOwner($this->getUser());
$data->setIsworkgroup(true); $data->setIsworkgroup(true);
} }
// Controler les permissions // Controler les permissions
$this->cansubmit($access,$em); if (!$this->cansubmit($access, $request)) {
throw $this->createAccessDeniedException('Permission denied');
}
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"submit", 'mode' => 'submit',
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"access"=>$access, 'access' => $access,
)); ]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -214,44 +221,48 @@ class GroupController extends AbstractController
$data = $form->getData(); $data = $form->getData();
// Les groupes opé ne sont pas ouvert // Les groupes opé ne sont pas ouvert
if(!$data->isIsworkgroup()) $data->setIsopen(false); if (!$data->isIsworkgroup()) {
$data->setIsopen(false);
}
// Sauvegarde // Sauvegarde
$em->getManager()->persist($data); $em->getManager()->persist($data);
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [ return $this->render($this->twig.'edit.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>($access!="user"), 'usesidebar' => ('all' != $access),
"mode"=>"submit", 'mode' => 'submit',
"access"=>$access, 'access' => $access,
"form"=>$form->createView(), 'form' => $form->createView(),
$this->data=>$data, $this->data => $data,
"maxsize"=>($access=="user"?1200:null), 'maxsize' => ('all' == $access ? 1200 : null),
]); ]);
} }
public function update($id,$access,Request $request,ManagerRegistry $em): Response public function update($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data or $id<0) throw $this->createNotFoundException('Unable to find entity.'); if (!$data or $id < 0) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canupdate($access,$data,$em); $this->canupdate($access, $data, $em);
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"update", 'mode' => 'update',
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"access"=>$access, 'access' => $access,
)); ]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -261,430 +272,493 @@ class GroupController extends AbstractController
$data = $form->getData(); $data = $form->getData();
// Les groupes opé ne sont pas ouvert // Les groupes opé ne sont pas ouvert
if(!$data->isIsworkgroup()) $data->setIsopen(false); if (!$data->isIsworkgroup()) {
$data->setIsopen(false);
}
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [ return $this->render($this->twig.'edit.html.twig', [
"useheader" => true, 'useheader' => true,
"usemenu" => false, 'usemenu' => false,
"usesidebar" => ($access!="user"), 'usesidebar' => ('all' != $access),
$this->data => $data, $this->data => $data,
"mode" => "update", 'mode' => 'update',
"access"=>$access, 'access' => $access,
"form" => $form->createView(), 'form' => $form->createView(),
"maxsize"=>($access=="user"?1200:null), 'maxsize' => ('all' == $access ? 1200 : null),
]); ]);
} }
public function delete($id,$access,Request $request,ManagerRegistry $em): Response public function delete($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canupdate($access,$data,$em); $this->canupdate($access, $data, $em);
// Tentative de suppression // Tentative de suppression
try{ try {
$em->getManager()->remove($data); $em->getManager()->remove($data);
$em->getManager()->flush(); $em->getManager()->flush();
} } catch (\Exception $e) {
catch (\Exception $e) { $request->getSession()->getFlashBag()->add('error', $e->getMessage());
$request->getSession()->getFlashBag()->add("error", $e->getMessage());
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)."_update",["id"=>$id]); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
} }
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
public function users($id, $access, Request $request, ManagerRegistry $em)
public function users($id,$access,Request $request,ManagerRegistry $em)
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canseemember($access,$data,$em); $this->canseemember($access, $data, $em);
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'users.html.twig', [ return $this->render($this->twig.'users.html.twig', [
'useheader' => true, 'useheader' => true,
'usemenu' => false, 'usemenu' => false,
'usesidebar' => ($access!="user"), 'usesidebar' => ('all' != $access),
'access' => $access, 'access' => $access,
$this->data => $data, $this->data => $data,
]); ]);
} }
public function usersnotin($id,$access,Request $request,ManagerRegistry $em) public function usersnotin($id, $access, Request $request, ManagerRegistry $em)
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$group=$em->getRepository($this->entity)->find($id); $group = $em->getRepository($this->entity)->find($id);
if (!$group) throw $this->createNotFoundException('Unable to find entity.'); if (!$group) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canseemember($access,$group,$em); $this->canseemember($access, $group, $em);
$sub = $em->getManager()->createQueryBuilder(); $sub = $em->getManager()->createQueryBuilder();
$sub->select("usergroup"); $sub->select('usergroup');
$sub->from("App:UserGroup","usergroup"); $sub->from('App:UserGroup', 'usergroup');
$sub->andWhere('usergroup.user = user.id'); $sub->andWhere('usergroup.user = user.id');
$sub->andWhere('usergroup.group = :groupid'); $sub->andWhere('usergroup.group = :groupid');
$query=$request->query->all(); $query = $request->query->all();
$start=$query['start']; $start = $query['start'];
$length=$query['length']; $length = $query['length'];
$search=$query['search']; $search = $query['search'];
$draw= $query['draw']; $draw = $query['draw'];
$ordercolumn=$query['order'][0]['column']; $ordercolumn = $query['order'][0]['column'];
$orderdir=$query['order'][0]['dir']; $orderdir = $query['order'][0]['dir'];
$usermodo = null;
$niveau01 = null;
$niveau02 = null;
$niveau03 = null;
$niveau04 = null;
// Nombre total d'enregistrement // Nombre total d'enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
switch($access) { switch ($access) {
case "admin": case 'admin':
$qb->select('COUNT(user)') $qb->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->where($qb->expr()->not($qb->expr()->exists($sub->getDQL()))) ->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->setParameter("groupid",$id); ->andWhere('user.isactive=:isactive')
->setParameter('groupid', $id)
->setParameter('isactive', true);
break; break;
case "modo": case 'modo':
$usermodo=$this->getUser()->getId(); $usermodo = $this->getUser()->getId();
$qb->select('COUNT(user)') $qb->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->from('App:UserModo','usermodo') ->from('App:UserModo', 'usermodo')
->where($qb->expr()->not($qb->expr()->exists($sub->getDQL()))) ->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->andWhere("usermodo.niveau01 = user.niveau01") ->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere("usermodo.user = :userid") ->andWhere('usermodo.user = :userid')
->setParameter("userid", $usermodo) ->andWhere('user.isactive=:isactive')
->setParameter("groupid",$id); ->setParameter('userid', $usermodo)
->setParameter('groupid', $id)
->setParameter('isactive', true);
break; break;
case "user": case 'all':
$niveau01=$this->getUser()->getNiveau01(); $niveau01 = $this->getUser()->getNiveau01();
$niveau02=$this->getUser()->getNiveau02(); $niveau02 = $this->getUser()->getNiveau02();
$niveau03 = $this->getUser()->getNiveau03();
$niveau04 = $this->getUser()->getNiveau04();
$qb->select('COUNT(user)') $qb->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->where($qb->expr()->not($qb->expr()->exists($sub->getDQL()))) ->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->setParameter("groupid",$id); ->andWhere('user.isactive=:isactive')
->setParameter('groupid', $id)
->setParameter('isactive', true);
switch($request->getSession()->get("scopeannu")) { switch ($request->getSession()->get('scopeannu')) {
case "SAME_NIVEAU01": case 1:
$qb->andWhere("user.niveau01 = :niveau01")->setParameter("niveau01",$niveau01); $qb->andWhere('user.niveau01 = :niveau01')->setParameter('niveau01', $niveau01);
break; break;
case "SAME_NIVEAU02": case 2:
$qb->andWhere("user.niveau02 = :niveau02")->setParameter("niveau02",$niveau02); $qb->andWhere('user.niveau02 = :niveau02')->setParameter('niveau02', $niveau02);
break;
case 3:
$qb->andWhere('user.niveau03 = :niveau03')->setParameter('niveau02', $niveau03);
break;
case 4:
$qb->andWhere('user.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break; break;
} }
break; break;
} }
$total=$qb->getQuery()->getSingleScalarResult(); $total = $qb->getQuery()->getSingleScalarResult();
$totalf = null;
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if($search["value"]=="") if ('' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
switch($access) { switch ($access) {
case "admin": case 'admin':
$totalf= $em->getManager()->createQueryBuilder()
->select('COUNT(user)')
->from('App:User','user')
->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->setParameter("value", "%".$search["value"]."%")
->setParameter("groupid",$id)
->getQuery()
->getSingleScalarResult();
break;
case "modo":
$totalf = $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(user)') ->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->from('App:UserModo','usermodo')
->where('user.username LIKE :value OR user.email LIKE :value') ->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL()))) ->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->andWhere("usermodo.niveau01 = user.niveau01") ->andWhere('user.isactive=:isactive')
->andWhere("usermodo.user = :userid") ->setParameter('value', '%'.$search['value'].'%')
->setParameter("userid", $usermodo) ->setParameter('groupid', $id)
->setParameter("value", "%".$search["value"]."%") ->setParameter('isactive', true)
->setParameter("groupid",$id)
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
break; break;
case "user": case 'modo':
$qb = $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(user)') ->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->from('App:UserModo', 'usermodo')
->where('user.username LIKE :value OR user.email LIKE :value') ->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL()))) ->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->setParameter("value", "%".$search["value"]."%") ->andWhere('usermodo.niveau01 = user.niveau01')
->setParameter("groupid",$id); ->andWhere('usermodo.user = :userid')
->andWhere('user.isactive=:isactive')
switch($request->getSession()->get("scopeannu")) { ->setParameter('userid', $usermodo)
case "SAME_NIVEAU01": ->setParameter('value', '%'.$search['value'].'%')
$qb->andWhere("user.niveau01 = :niveau01")->setParameter("niveau01",$niveau01); ->setParameter('groupid', $id)
->setParameter('isactive', true)
->getQuery()
->getSingleScalarResult();
break; break;
case "SAME_NIVEAU02": case 'all':
$qb->andWhere("user.niveau02 = :niveau02")->setParameter("niveau02",$niveau02); $qb = $em->getManager()->createQueryBuilder()
->select('COUNT(user)')
->from('App:User', 'user')
->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->andWhere('user.isactive=:isactive')
->setParameter('value', '%'.$search['value'].'%')
->setParameter('groupid', $id)
->setParameter('isactive', true);
switch ($request->getSession()->get('scopeannu')) {
case 1:
$qb->andWhere('user.niveau01 = :niveau01')->setParameter('niveau01', $niveau01);
break;
case 2:
$qb->andWhere('user.niveau02 = :niveau02')->setParameter('niveau02', $niveau02);
break;
case 3:
$qb->andWhere('user.niveau03 = :niveau03')->setParameter('niveau02', $niveau03);
break;
case 4:
$qb->andWhere('user.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break; break;
} }
$totalf=$qb->getQuery()->getSingleScalarResult(); $totalf = $qb->getQuery()->getSingleScalarResult();
break; break;
} }
} }
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('user')->from("App:User",'user'); $qb->select('user')->from('App:User', 'user')->Where('user.isactive=:isactive')->setParameter('isactive', true);
switch($access) { switch ($access) {
case "admin": case 'admin':
$qb->where($qb->expr()->not($qb->expr()->exists($sub->getDQL()))); $qb->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())));
break; break;
case "modo": case 'modo':
$qb->from('App:UserModo','usermodo') $qb->from('App:UserModo', 'usermodo')
->where($qb->expr()->not($qb->expr()->exists($sub->getDQL()))) ->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->andWhere("usermodo.niveau01 = user.niveau01") ->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere("usermodo.user = :userid") ->andWhere('usermodo.user = :userid')
->setParameter("userid", $usermodo); ->setParameter('userid', $usermodo);
break; break;
case "user": case 'all':
$qb->where($qb->expr()->not($qb->expr()->exists($sub->getDQL()))); $qb->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())));
switch($request->getSession()->get("scopeannu")) { switch ($request->getSession()->get('scopeannu')) {
case "SAME_NIVEAU01": case 1:
$qb->andWhere("user.niveau01 = :niveau01")->setParameter("niveau01",$niveau01); $qb->andWhere('user.niveau01 = :niveau01')->setParameter('niveau01', $niveau01);
break; break;
case "SAME_NIVEAU02": case 2:
$qb->andWhere("user.niveau02 = :niveau02")->setParameter("niveau02",$niveau02); $qb->andWhere('user.niveau02 = :niveau02')->setParameter('niveau02', $niveau02);
break;
case 3:
$qb->andWhere('user.niveau03 = :niveau03')->setParameter('niveau02', $niveau03);
break;
case 4:
$qb->andWhere('user.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break; break;
} }
break; break;
} }
if($search["value"]!="") { if ('' != $search['value']) {
$qb ->andWhere('user.username LIKE :value OR user.email LIKE :value') $qb->andWhere('user.username LIKE :value OR user.email LIKE :value')
->setParameter("value", "%".$search["value"]."%"); ->setParameter('value', '%'.$search['value'].'%');
} }
$qb->setParameter("groupid",$id); $qb->setParameter('groupid', $id);
switch($ordercolumn) { switch ($ordercolumn) {
case 2 : case 2:
$qb->orderBy('user.username',$orderdir); $qb->orderBy('user.username', $orderdir);
break; break;
case 3 : case 3:
$qb->orderBy('user.email',$orderdir); $qb->orderBy('user.email', $orderdir);
break; break;
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
$canupdatemember=$this->canupdatemember($access,$group,$em,false); $canupdatemember = $this->canupdatemember($access, $group, $em, false);
foreach($datas as $data) { foreach ($datas as $data) {
// Action // Action
$action = ""; $action = '';
if($canupdatemember) if ($canupdatemember) {
$action.="<a style='cursor:pointer' onClick='addUsers(".$data->getId().")'><i class='fa fa-plus fa-fw'></i></a>"; $action .= "<a style='cursor:pointer' onClick='addUsers(".$data->getId().")'><i class='fa fa-plus fa-fw'></i></a>";
}
// Avatar // Avatar
$avatar="<img src='".$this->generateUrl('app_minio_image',["file"=>"avatar/".$data->getAvatar()])."' class='avatar'>"; $avatar = "<img src='".$this->generateUrl('app_minio_image', ['file' => 'avatar/'.$data->getAvatar()])."' class='avatar'>";
array_push($output["data"],array("DT_RowId"=>"user".$data->getId(),$action,$avatar,$data->getUsername(),$data->getEmail(),"","")); array_push($output['data'], ['DT_RowId' => 'user'.$data->getId(), $action, $avatar, $data->getUsername(), $data->getEmail(), '', '']);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function usersin($id, $access, Request $request, ManagerRegistry $em)
public function usersin($id,$access,Request $request,ManagerRegistry $em)
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$group=$em->getRepository($this->entity)->find($id); $group = $em->getRepository($this->entity)->find($id);
if (!$group) throw $this->createNotFoundException('Unable to find entity.'); if (!$group) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canseemember($access,$group,$em); $this->canseemember($access, $group, $em);
$sub = $em->getManager()->createQueryBuilder(); $sub = $em->getManager()->createQueryBuilder();
$sub->select("usergroup"); $sub->select('usergroup');
$sub->from("App:UserGroup","usergroup"); $sub->from('App:UserGroup', 'usergroup');
$sub->andWhere('usergroup.user = user.id'); $sub->andWhere('usergroup.user = user.id');
$sub->andWhere('usergroup.group = :groupid'); $sub->andWhere('usergroup.group = :groupid');
$query=$request->query->all(); $query = $request->query->all();
$start=$query['start']; $start = $query['start'];
$length=$query['length']; $length = $query['length'];
$search=$query['search']; $search = $query['search'];
$draw= $query['draw']; $draw = $query['draw'];
$ordercolumn=$query['order'][0]['column']; $ordercolumn = $query['order'][0]['column'];
$orderdir=$query['order'][0]['dir']; $orderdir = $query['order'][0]['dir'];
$usermodo = null;
// Nombre total d'enregistrement // Nombre total d'enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
if($access=="admin"||$access=="user") if ('admin' == $access || 'all' == $access) {
$qb->select('COUNT(user)') $qb->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->where($qb->expr()->exists($sub->getDQL())) ->where($qb->expr()->exists($sub->getDQL()))
->setParameter("groupid",$id); ->setParameter('groupid', $id);
else { } else {
$usermodo=$this->getUser()->getId(); $usermodo = $this->getUser()->getId();
$qb->select('COUNT(user)') $qb->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->from('App:UserModo','usermodo') ->from('App:UserModo', 'usermodo')
->where($qb->expr()->exists($sub->getDQL())) ->where($qb->expr()->exists($sub->getDQL()))
->andWhere("usermodo.niveau01 = user.niveau01") ->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere("usermodo.user = :userid") ->andWhere('usermodo.user = :userid')
->setParameter("userid", $usermodo) ->setParameter('userid', $usermodo)
->setParameter("groupid",$id); ->setParameter('groupid', $id);
} }
$total=$qb->getQuery()->getSingleScalarResult(); $total = $qb->getQuery()->getSingleScalarResult();
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if($search["value"]=="") if ('' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
if($access=="admin"||$access=="user") if ('admin' == $access || 'all' == $access) {
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(user)') ->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->where('user.username LIKE :value OR user.email LIKE :value') ->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->exists($sub->getDQL())) ->andWhere($qb->expr()->exists($sub->getDQL()))
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->setParameter("groupid",$id) ->setParameter('groupid', $id)
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
else } else {
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(user)') ->select('COUNT(user)')
->from('App:User','user') ->from('App:User', 'user')
->from('App:UserModo','usermodo') ->from('App:UserModo', 'usermodo')
->where('user.username LIKE :value OR user.email LIKE :value') ->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->exists($sub->getDQL())) ->andWhere($qb->expr()->exists($sub->getDQL()))
->andWhere("usermodo.niveau01 = user.niveau01") ->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere("usermodo.user = :userid") ->andWhere('usermodo.user = :userid')
->setParameter("userid", $usermodo) ->setParameter('userid', $usermodo)
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->setParameter("groupid",$id) ->setParameter('groupid', $id)
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
}
} }
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('user')->from("App:User",'user'); $qb->select('user')->from('App:User', 'user');
if($access=="admin"||$access=="user") if ('admin' == $access || 'all' == $access) {
$qb->where($qb->expr()->exists($sub->getDQL())); $qb->where($qb->expr()->exists($sub->getDQL()));
else } else {
$qb->from('App:UserModo','usermodo') $qb->from('App:UserModo', 'usermodo')
->where($qb->expr()->exists($sub->getDQL())) ->where($qb->expr()->exists($sub->getDQL()))
->andWhere("usermodo.niveau01 = user.niveau01") ->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere("usermodo.user = :userid") ->andWhere('usermodo.user = :userid')
->setParameter("userid", $usermodo); ->setParameter('userid', $usermodo);
if($search["value"]!="") {
$qb ->andWhere('user.username LIKE :value OR user.email LIKE :value')
->setParameter("value", "%".$search["value"]."%");
} }
$qb->setParameter("groupid",$id);
switch($ordercolumn) { if ('' != $search['value']) {
case 2 : $qb->andWhere('user.username LIKE :value OR user.email LIKE :value')
$qb->orderBy('user.username',$orderdir); ->setParameter('value', '%'.$search['value'].'%');
}
$qb->setParameter('groupid', $id);
switch ($ordercolumn) {
case 2:
$qb->orderBy('user.username', $orderdir);
break; break;
case 3 : case 3:
$qb->orderBy('user.email',$orderdir); $qb->orderBy('user.email', $orderdir);
break; break;
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
// Propriétaire // Propriétaire
$usergroup=$em->getRepository("App\Entity\UserGroup")->findOneBy(["user"=>$data->getId(),"group"=>$id]); $usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $data->getId(), 'group' => $id]);
$fgproprio=($usergroup->getUser()==$group->getOwner()); $fgproprio = ($usergroup->getUser() == $group->getOwner());
$fgme=($usergroup->getUser()==$this->getUser()&&$access!="admin"); $fgme = ($usergroup->getUser() == $this->getUser() && 'admin' != $access);
// Action // Action
$action = ""; $action = '';
if($this->canupdatemember($access,$group,$em,false)&&!$fgproprio&&!$fgme) if ($this->canupdatemember($access, $group, $em, false) && !$fgproprio && !$fgme) {
$action.="<a style='cursor:pointer' onClick='delUsers(".$data->getId().")'><i class='fa fa-minus fa-fw'></i></a>"; $action .= "<a style='cursor:pointer' onClick='delUsers(".$data->getId().")'><i class='fa fa-minus fa-fw'></i></a>";
}
// Avatar // Avatar
$avatar="<img src='".$this->generateUrl('app_minio_image',["file"=>"avatar/".$data->getAvatar()])."' class='avatar'>"; $avatar = "<img src='".$this->generateUrl('app_minio_image', ['file' => 'avatar/'.$data->getAvatar()])."' class='avatar'>";
// Flag manager // Flag manager
$rolegroup=""; $rolegroup = '';
if($fgproprio) $rolegroup="Propriétaire du groupe"; if ($fgproprio) {
elseif($this->canupdatemember($access,$group,$em,false)&&!$fgme) { $rolegroup = 'Propriétaire du groupe';
$selectuser=($usergroup->getRolegroup()==0?"selected='selected'":""); } elseif ($this->canupdatemember($access, $group, $em, false) && !$fgme) {
$selectwritter=($usergroup->getRolegroup()==50?"selected='selected'":""); $selectuser = (0 == $usergroup->getRolegroup() ? "selected='selected'" : '');
$selectmanager=($usergroup->getRolegroup()==90?"selected='selected'":""); $selectwritter = (50 == $usergroup->getRolegroup() ? "selected='selected'" : '');
$selectmanager = (90 == $usergroup->getRolegroup() ? "selected='selected'" : '');
$rolegroup='<select id="roleuser-'.$data->getId().'" name="user[visible]" onChange="changeRole('.$data->getId().');"><option value="0" '.$selectuser.'>Utilisateur</option><option value="50" '.$selectwritter.'>Collaborateur</option><option value="90" '.$selectmanager.'>Gestionnaire</option></select>'; $rolegroup = '<select id="roleuser-'.$data->getId().'" name="user[visible]" onChange="changeRole('.$data->getId().');"><option value="0" '.$selectuser.'>Utilisateur</option><option value="50" '.$selectwritter.'>Collaborateur</option><option value="90" '.$selectmanager.'>Gestionnaire</option></select>';
} else {
$rolegroup = (0 == $usergroup->getRolegroup() ? 'Utilisateur' : (50 == $usergroup->getRolegroup() ? 'Collaborateur' : 'Gestionnaire'));
} }
else $rolegroup=($usergroup->getRolegroup()==0?"Utilisateur":($usergroup->getRolegroup()==50?"Collaborateur":"Gestionnaire"));
$tmp=array("DT_RowId"=>"user".$data->getId(),$action,$avatar,$data->getUsername(),$data->getEmail(),$rolegroup); $tmp = ['DT_RowId' => 'user'.$data->getId(), $action, $avatar, $data->getUsername().(!$data->isIsactive() ? '<br><small><i>Inactif</i></small>' : ''), $data->getEmail(), $rolegroup];
array_push($output["data"],$tmp); array_push($output['data'], $tmp);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function useradd($groupid,$userid,$access,Request $request,ManagerRegistry $em) public function useradd($groupid, $userid, $access, Request $request, ManagerRegistry $em)
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$group=$em->getRepository($this->entity)->find($groupid); $group = $em->getRepository($this->entity)->find($groupid);
if (!$group) throw $this->createNotFoundException('Unable to find entity.'); if (!$group) {
throw $this->createNotFoundException('Unable to find entity.');
}
$user=$em->getRepository("App\Entity\User")->find($userid); $user = $em->getRepository("App\Entity\User")->find($userid);
if (!$user) throw $this->createNotFoundException('Unable to find entity.'); if (!$user) {
throw $this->createNotFoundException('Unable to find entity.');
}
$output=array(); $output = [];
$this->canupdatemember($access,$group,$em,true); $this->canupdatemember($access, $group, $em, true);
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(array("user"=>$user,"group"=>$group)); $usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $user, 'group' => $group]);
if($usergroup) return new JsonResponse($output); if ($usergroup) {
return new JsonResponse($output);
}
$usergroup=new UserGroup(); $usergroup = new UserGroup();
$usergroup->setUser($user); $usergroup->setUser($user);
$usergroup->setGroup($group); $usergroup->setGroup($group);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());
@ -696,21 +770,27 @@ class GroupController extends AbstractController
return new JsonResponse($output); return new JsonResponse($output);
} }
public function userdel($groupid,$userid,$access,Request $request,ManagerRegistry $em) public function userdel($groupid, $userid, $access, Request $request, ManagerRegistry $em)
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$group=$em->getRepository($this->entity)->find($groupid); $group = $em->getRepository($this->entity)->find($groupid);
if (!$group) throw $this->createNotFoundException('Unable to find entity.'); if (!$group) {
throw $this->createNotFoundException('Unable to find entity.');
}
$user=$em->getRepository("App\Entity\User")->find($userid); $user = $em->getRepository("App\Entity\User")->find($userid);
if (!$user) throw $this->createNotFoundException('Unable to find entity.'); if (!$user) {
throw $this->createNotFoundException('Unable to find entity.');
}
$output=array(); $output = [];
$this->canupdatemember($access,$group,$em,true); $this->canupdatemember($access, $group, $em, true);
if($user==$group->getOwner()) throw $this->createAccessDeniedException('Permission denied'); if ($user == $group->getOwner()) {
throw $this->createAccessDeniedException('Permission denied');
}
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(array("user"=>$user,"group"=>$group)); $usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $user, 'group' => $group]);
if($usergroup) { if ($usergroup) {
$em->getManager()->remove($usergroup); $em->getManager()->remove($usergroup);
$em->getManager()->flush(); $em->getManager()->flush();
} }
@ -719,22 +799,27 @@ class GroupController extends AbstractController
return new JsonResponse($output); return new JsonResponse($output);
} }
public function userchangerole($groupid,$userid,$roleid,$access,Request $request,ManagerRegistry $em) public function userchangerole($groupid, $userid, $roleid, $access, Request $request, ManagerRegistry $em)
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$group=$em->getRepository($this->entity)->find($groupid); $group = $em->getRepository($this->entity)->find($groupid);
if (!$group) throw $this->createNotFoundException('Unable to find entity.'); if (!$group) {
throw $this->createNotFoundException('Unable to find entity.');
}
$user=$em->getRepository("App\Entity\User")->find($userid); $user = $em->getRepository("App\Entity\User")->find($userid);
if (!$user) throw $this->createNotFoundException('Unable to find entity.'); if (!$user) {
throw $this->createNotFoundException('Unable to find entity.');
}
$output=array(); $output = [];
$this->canupdatemember($access,$group,$em,true); $this->canupdatemember($access, $group, $em, true);
if($user==$group->getOwner()) throw $this->createAccessDeniedException('Permission denied'); if ($user == $group->getOwner()) {
throw $this->createAccessDeniedException('Permission denied');
}
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $user, 'group' => $group]);
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(array("user"=>$user,"group"=>$group)); if ($usergroup) {
if($usergroup) {
$usergroup->setRolegroup($roleid); $usergroup->setRolegroup($roleid);
$em->getManager()->persist($usergroup); $em->getManager()->persist($usergroup);
$em->getManager()->flush(); $em->getManager()->flush();
@ -744,74 +829,107 @@ class GroupController extends AbstractController
return new JsonResponse($output); return new JsonResponse($output);
} }
public function userout($id,$access,Request $request,ManagerRegistry $em) public function userout($id, $access, Request $request, ManagerRegistry $em)
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$group=$em->getRepository($this->entity)->find($id); $group = $em->getRepository($this->entity)->find($id);
if (!$group) throw $this->createNotFoundException('Unable to find entity.'); if (!$group) {
throw $this->createNotFoundException('Unable to find entity.');
}
// On ne peut se désinscrire que si le groupe est ouvert et qu'il n'est pas lié à un groupe ldap ou sso // On ne peut se désinscrire que si le groupe est ouvert et qu'il n'est pas lié à un groupe ldap ou sso
if($group->getOwner()!=$this->getUser()&&($group->isIsOpen()||$this->canupdatemember($access,$group,$em,false))) { if ($group->getOwner() != $this->getUser() && ($group->isIsOpen() || $this->canupdatemember($access, $group, $em, false))) {
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(array("user"=>$this->getUser(),"group"=>$group)); $usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $this->getUser(), 'group' => $group]);
if($usergroup) { if ($usergroup) {
$em->getManager()->remove($usergroup); $em->getManager()->remove($usergroup);
$em->getManager()->flush(); $em->getManager()->flush();
} }
} }
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
private function cansubmit($access,$em) { private function cansubmit($access, $request)
switch($access) { {
case "admin" : return true; break; switch ($access) {
case "user" : return true; break; case 'admin': return true;
break;
case 'modo': return false;
break;
case 'all': return $request->getSession()->get('submitgroup');
break;
} }
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
} }
private function canupdate($access, $entity, $em, $fgblock = true)
private function canupdate($access,$entity,$em,$fgblock=true) { {
$toreturn=false; $toreturn = false;
switch($access) { switch ($access) {
case "admin" : $toreturn=($entity->getId()>0); break; case 'admin': $toreturn = ($entity->getId() > 0);
case "user": break;
if(!$entity->isIsworkgroup()||$entity->getOwner()!=$this->getUser()) $toreturn=false; case 'all':
else $toreturn=true; if (!$entity->isIsworkgroup() || $entity->getOwner() != $this->getUser()) {
$toreturn = false;
} else {
$toreturn = true;
}
break; break;
} }
if($fgblock&&!$toreturn) throw $this->createAccessDeniedException('Permission denied'); if ($fgblock && !$toreturn) {
throw $this->createAccessDeniedException('Permission denied');
}
return $toreturn; return $toreturn;
} }
private function canseemember($access,$entity,$em,$fgblock=true) { private function canseemember($access, $entity, $em, $fgblock = true)
switch($access) { {
case "admin" : $toreturn=($entity->getId()>0); break; $toreturn = false;
case "modo" : $toreturn=($entity->getId()>0); break; switch ($access) {
case "user": case 'admin': $toreturn = ($entity->getId() > 0);
$usergroup=$em->getRepository("App\Entity\UserGroup")->findOneBy(["user"=>$this->getUser(),"group"=>$entity]); break;
if(!$usergroup||!$entity->isIsworkgroup()||$entity->getId()<0) $toreturn=false; case 'modo': $toreturn = ($entity->getId() > 0);
else $toreturn=true; break;
case 'all':
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $this->getUser(), 'group' => $entity]);
if (!$usergroup || !$entity->isIsworkgroup() || $entity->getId() < 0) {
$toreturn = false;
} else {
$toreturn = true;
}
break; break;
} }
if($fgblock&&!$toreturn) throw $this->createAccessDeniedException('Permission denied'); if ($fgblock && !$toreturn) {
throw $this->createAccessDeniedException('Permission denied');
}
return $toreturn; return $toreturn;
} }
private function canupdatemember($access, $entity, $em, $fgblock = true)
private function canupdatemember($access,$entity,$em,$fgblock=true) { {
$toreturn=false; $toreturn = false;
switch($access) { switch ($access) {
case "admin" : $toreturn=($entity->getId()>0&&!$entity->getLdapfilter()); break; case 'admin': $toreturn = ($entity->getId() > 0 && !$entity->getLdapfilter());
case "modo" : $toreturn=($entity->getId()>0); break; break;
case "user": case 'modo': $toreturn = ($entity->getId() > 0);
$usergroup=$em->getRepository("App\Entity\UserGroup")->findOneBy(["user"=>$this->getUser(),"group"=>$entity]); break;
if(!$usergroup||!$entity->isIsworkgroup()||$entity->getId()<0) $toreturn=false; case 'all':
elseif($usergroup->getRolegroup()<90) $toreturn=false; $usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $this->getUser(), 'group' => $entity]);
else $toreturn=true; if (!$usergroup || !$entity->isIsworkgroup() || $entity->getId() < 0) {
$toreturn = false;
} elseif ($usergroup->getRolegroup() < 90) {
$toreturn = false;
} else {
$toreturn = true;
}
break; break;
} }
if($fgblock&&!$toreturn) throw $this->createAccessDeniedException('Permission denied'); if ($fgblock && !$toreturn) {
throw $this->createAccessDeniedException('Permission denied');
}
return $toreturn; return $toreturn;
} }
} }

View File

@ -1,57 +1,53 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
class HomeController extends AbstractController class HomeController extends AbstractController
{ {
public function home(Request $request): Response public function home(Request $request): Response
{ {
if($request->getSession()->get("fgforceconnect")) if ($request->getSession()->get('fgforceconnect')) {
return $this->redirectToRoute("app_user_home"); return $this->redirectToRoute('app_user_home');
}
return $this->render('Home/home.html.twig',[ return $this->render('Home/home.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>true, 'usemenu' => true,
"usesidebar"=>false, 'usesidebar' => false,
"maxsize"=>1000, 'maxsize' => 1000,
]); ]);
} }
public function homeuser($access): Response public function homeuser($access): Response
{ {
return $this->render('Home/home.html.twig',[ return $this->render('Home/home.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>false, 'usesidebar' => false,
"maxsize"=>1000, 'maxsize' => 1000,
]); ]);
} }
public function homeadmin($access): Response public function homeadmin($access): Response
{ {
return $this->redirectToRoute("app_admin_config"); return $this->redirectToRoute('app_admin_config');
} }
public function homemodo($access): Response public function homemodo($access): Response
{ {
return $this->redirectToRoute("app_modo_niveau02"); return $this->redirectToRoute('app_modo_niveau02');
} }
public function docrest(): Response public function docrest(): Response
{ {
return $this->render('Home/docrest.html.twig',[ return $this->render('Home/docrest.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
]); ]);
} }
} }

View File

@ -1,27 +1,24 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use App\Form\LoginType;
use App\Service\ApiService;
use App\Service\LdapService;
use App\Service\PasswordEncoder;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Doctrine\Persistence\ManagerRegistry;
use App\Service\ApiService;
use App\Service\PasswordEncoder;
use App\Service\LdapService;
use App\Form\LoginType;
class HydraController extends AbstractController class HydraController extends AbstractController
{ {
private $apiservice; private $apiservice;
private $passwordencoder; private $passwordencoder;
private $ldapservice; private $ldapservice;
public function __construct(ApiService $apiservice,LdapService $ldapservice,PasswordEncoder $passwordencoder) public function __construct(ApiService $apiservice, LdapService $ldapservice, PasswordEncoder $passwordencoder)
{ {
$this->apiservice = $apiservice; $this->apiservice = $apiservice;
$this->passwordencoder = $passwordencoder; $this->passwordencoder = $passwordencoder;
@ -30,7 +27,6 @@ class HydraController extends AbstractController
public function loginsql(Request $request): Response public function loginsql(Request $request): Response
{ {
$challenge = $request->query->get('login_challenge'); $challenge = $request->query->get('login_challenge');
// S'il n'y a pas de challenge, on déclenche une bad request // S'il n'y a pas de challenge, on déclenche une bad request
@ -39,9 +35,10 @@ class HydraController extends AbstractController
} }
// On vérifie que la requête d'identification provient bien de hydra // On vérifie que la requête d'identification provient bien de hydra
$response = $this->apiservice->run("GET",$this->getParameter('hydraLoginchallenge').$challenge,null); $response = $this->apiservice->run('GET', $this->getParameter('hydraLoginchallenge').$challenge, null);
if(!$response) if (!$response) {
throw new BadRequestException('challenge invalide'); throw new BadRequestException('challenge invalide');
}
// si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect // si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect
$request->getSession()->set('hydraChallenge', $challenge); $request->getSession()->set('hydraChallenge', $challenge);
@ -52,48 +49,52 @@ class HydraController extends AbstractController
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
// Affichage du formulaire // Affichage du formulaire
return $this->render("Home/loginHYDRA.html.twig", [ return $this->render('Home/loginHYDRA.html.twig', [
"useheader"=>false, 'useheader' => false,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>false, 'usesidebar' => false,
"form"=>$form->createView(), 'form' => $form->createView(),
"mode"=>"SQL", 'mode' => 'SQL',
]); ]);
} }
public function checkloginsql(Request $request,ManagerRegistry $em) { public function checkloginsql(Request $request, ManagerRegistry $em)
$username=$request->get('login')["username"]; {
$password=$request->get('login')["password"]; $username = $request->get('login')['username'];
$password = $request->get('login')['password'];
// user exist ? // user exist ?
$user=$em->getRepository("App\Entity\User")->findOneBy(["username"=>$username]); $user = $em->getRepository("App\Entity\User")->findOneBy(['username' => $username]);
if(!$user) return $this->redirect($this->generateUrl('app_hydra_loginsql',["login_challenge"=>$request->getSession()->get("hydraChallenge")])); if (!$user) {
return $this->redirect($this->generateUrl('app_hydra_loginsql', ['login_challenge' => $request->getSession()->get('hydraChallenge')]));
}
$islogin=$this->passwordencoder->verify($user->getPassword(),$password,$user->getSalt()); $islogin = $this->passwordencoder->verify($user->getPassword(), $password, $user->getSalt());
if(!$islogin) return $this->redirect($this->generateUrl('app_hydra_loginsql',["login_challenge"=>$request->getSession()->get("hydraChallenge")])); if (!$islogin) {
return $this->redirect($this->generateUrl('app_hydra_loginsql', ['login_challenge' => $request->getSession()->get('hydraChallenge')]));
}
$response = $this->apiservice->run("PUT",$this->getParameter('hydraLoginchallengeaccept').$request->getSession()->get('hydraChallenge'),["subject"=>$user->getEmail(),"acr"=>"string"]); $response = $this->apiservice->run('PUT', $this->getParameter('hydraLoginchallengeaccept').$request->getSession()->get('hydraChallenge'), ['subject' => $user->getEmail(), 'acr' => 'string']);
if(!$response||$response->code!="200") if (!$response || '200' != $response->code) {
throw new BadRequestException('login accept invalide'); throw new BadRequestException('login accept invalide');
}
$datas=[ $datas = [
"username"=>$user->getUsername(), 'username' => $user->getUsername(),
"email"=>$user->getEmail(), 'email' => $user->getEmail(),
"firstname"=>$user->getFirstname(), 'firstname' => $user->getFirstname(),
"lastname"=>$user->getLastname() 'lastname' => $user->getLastname(),
]; ];
$request->getSession()->set("datas",$datas); $request->getSession()->set('datas', $datas);
$redirect = $response->body->redirect_to;
$redirect=$response->body->redirect_to;
return $this->redirect($redirect, 301); return $this->redirect($redirect, 301);
} }
public function loginldap(Request $request): Response public function loginldap(Request $request): Response
{ {
$challenge = $request->query->get('login_challenge'); $challenge = $request->query->get('login_challenge');
// S'il n'y a pas de challenge, on déclenche une bad request // S'il n'y a pas de challenge, on déclenche une bad request
@ -102,9 +103,10 @@ class HydraController extends AbstractController
} }
// On vérifie que la requête d'identification provient bien de hydra // On vérifie que la requête d'identification provient bien de hydra
$response = $this->apiservice->run("GET",$this->getParameter('hydraLoginchallenge').$challenge,null); $response = $this->apiservice->run('GET', $this->getParameter('hydraLoginchallenge').$challenge, null);
if(!$response) if (!$response) {
throw new BadRequestException('challenge invalide'); throw new BadRequestException('challenge invalide');
}
// si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect // si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect
$request->getSession()->set('hydraChallenge', $challenge); $request->getSession()->set('hydraChallenge', $challenge);
@ -115,60 +117,64 @@ class HydraController extends AbstractController
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
// Affichage du formulaire // Affichage du formulaire
return $this->render("Home/loginHYDRA.html.twig", [ return $this->render('Home/loginHYDRA.html.twig', [
"useheader"=>false, 'useheader' => false,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>false, 'usesidebar' => false,
"form"=>$form->createView(), 'form' => $form->createView(),
"mode"=>"LDAP", 'mode' => 'LDAP',
]); ]);
} }
public function checkloginldap(Request $request,ManagerRegistry $em) { public function checkloginldap(Request $request, ManagerRegistry $em)
$username=$request->get('login')["username"]; {
$password=$request->get('login')["password"]; $username = $request->get('login')['username'];
$password = $request->get('login')['password'];
// L'utilisateur se co à l'annuaire ? // L'utilisateur se co à l'annuaire ?
$userldap=$this->ldapservice->userconnect($username,$password); $userldap = $this->ldapservice->userconnect($username, $password);
if(!$userldap) if (!$userldap) {
return $this->redirect($this->generateUrl('app_hydra_loginldap',["login_challenge"=>$request->getSession()->get("hydraChallenge")])); return $this->redirect($this->generateUrl('app_hydra_loginldap', ['login_challenge' => $request->getSession()->get('hydraChallenge')]));
}
$userldap=$userldap[0]; $userldap = $userldap[0];
// Init // Init
$email = "$username@nomail.fr"; $email = "$username@nomail.fr";
$lastname = $username; $lastname = $username;
$firstname = " "; $firstname = ' ';
// Rechercher l'utilisateur // Rechercher l'utilisateur
if(isset($userldap[$this->getParameter('ldapFirstname')])) if (isset($userldap[$this->getParameter('ldapFirstname')])) {
$firstname = $userldap[$this->getParameter('ldapFirstname')]; $firstname = $userldap[$this->getParameter('ldapFirstname')];
if(isset($userldap[$this->getParameter('ldapLastname')]))
$lastname = $userldap[$this->getParameter('ldapLastname')];
if(isset($userldap[$this->getParameter('ldapEmail')]))
$email = $userldap[$this->getParameter('ldapEmail')];
$response = $this->apiservice->run("PUT",$this->getParameter('hydraLoginchallengeaccept').$request->getSession()->get('hydraChallenge'),["subject"=>$email,"acr"=>"string"]);
if(!$response||$response->code!="200")
throw new BadRequestException('login accept invalide');
$datas=[
"username"=>$username,
"email"=>$email,
"firstname"=>$firstname,
"lastname"=>$lastname
];
$request->getSession()->set("datas",$datas);
$redirect=$response->body->redirect_to;
return $this->redirect($redirect, 301);
} }
if (isset($userldap[$this->getParameter('ldapLastname')])) {
$lastname = $userldap[$this->getParameter('ldapLastname')];
}
if (isset($userldap[$this->getParameter('ldapEmail')])) {
$email = $userldap[$this->getParameter('ldapEmail')];
}
$response = $this->apiservice->run('PUT', $this->getParameter('hydraLoginchallengeaccept').$request->getSession()->get('hydraChallenge'), ['subject' => $email, 'acr' => 'string']);
if (!$response || '200' != $response->code) {
throw new BadRequestException('login accept invalide');
}
$datas = [
'username' => $username,
'email' => $email,
'firstname' => $firstname,
'lastname' => $lastname,
];
$request->getSession()->set('datas', $datas);
$redirect = $response->body->redirect_to;
return $this->redirect($redirect, 301);
}
public function consent(Request $request) public function consent(Request $request)
{ {
@ -178,20 +184,22 @@ class HydraController extends AbstractController
} }
// On vérifie que la requête d'identification provient bien de hydra // On vérifie que la requête d'identification provient bien de hydra
$response = $this->apiservice->run("GET",$this->getParameter('hydraConsentchallenge').$challenge,null); $response = $this->apiservice->run('GET', $this->getParameter('hydraConsentchallenge').$challenge, null);
if(!$response) if (!$response) {
throw new BadRequestException('challenge invalide'); throw new BadRequestException('challenge invalide');
$response = $this->apiservice->run("PUT",$this->getParameter('hydraConsentchallengeaccept').$challenge,[
'grant_scope' => ['openid', 'offline_access'],
'session' => ['id_token' => $request->getSession()->get('datas')]
]);
if(!$response)
throw new BadRequestException('challenge not accept');
$redirect=$response->body->redirect_to;
return $this->redirect($redirect, 301);
} }
$response = $this->apiservice->run('PUT', $this->getParameter('hydraConsentchallengeaccept').$challenge, [
'grant_scope' => ['openid', 'offline_access'],
'session' => ['id_token' => $request->getSession()->get('datas')],
]);
if (!$response) {
throw new BadRequestException('challenge not accept');
}
$redirect = $response->body->redirect_to;
return $this->redirect($redirect, 301);
}
} }

View File

@ -2,15 +2,16 @@
namespace App\Controller; namespace App\Controller;
use App\Service\MinioService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use App\Service\MinioService;
use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Filesystem\Filesystem;
class MinioController extends AbstractController class MinioController extends AbstractController
{ {
private $appKernel;
private $minio; private $minio;
public function __construct(KernelInterface $appKernel, MinioService $minio) public function __construct(KernelInterface $appKernel, MinioService $minio)
@ -19,7 +20,7 @@ class MinioController extends AbstractController
$this->minio = $minio; $this->minio = $minio;
} }
public function ckupload($access,Request $request): Response public function ckupload($access, Request $request): Response
{ {
// Fichier temporaire uploadé // Fichier temporaire uploadé
$tmpfile = $request->files->get('upload'); $tmpfile = $request->files->get('upload');
@ -27,46 +28,46 @@ class MinioController extends AbstractController
// Répertoire de Destination // Répertoire de Destination
$fs = new Filesystem(); $fs = new Filesystem();
$rootdir = $this->getParameter('kernel.project_dir') . '/var/tmp'; $rootdir = $this->getParameter('kernel.project_dir').'/var/tmp';
$fs->mkdir($rootdir."/ckeditor"); $fs->mkdir($rootdir.'/ckeditor');
// Fichier cible // Fichier cible
$targetName = uniqid().".".$extention; $targetName = uniqid().'.'.$extention;
$targetFile = "ckeditor/".$targetName; $targetFile = 'ckeditor/'.$targetName;
$targetUrl = $this->generateUrl('app_minio_document',["file"=>"ckeditor/".$targetName]); $targetUrl = $this->generateUrl('app_minio_document', ['file' => 'ckeditor/'.$targetName]);
//move_uploaded_file($tmpfile,$targetFile); // move_uploaded_file($tmpfile,$targetFile);
$this->minio->upload($tmpfile,$targetFile,true); $this->minio->upload($tmpfile, $targetFile, true);
$output["uploaded"]=1; $output['uploaded'] = 1;
$output["fileName"]=$targetName; $output['fileName'] = $targetName;
$output["url"]=$targetUrl; $output['url'] = $targetUrl;
return new Response(json_encode($output)); return new Response(json_encode($output));
} }
public function logo(Request $request): Response { public function logo(Request $request): Response
{
return $this->redirectToRoute("app_minio_image",["file"=>"logo/".$request->getSession()->get("logolight")]); return $this->redirectToRoute('app_minio_image', ['file' => 'logo/'.$request->getSession()->get('logolight')]);
} }
public function image(Request $request): Response public function image(Request $request): Response
{ {
$file=$request->query->get("file"); $file = $request->query->get('file');
switch($file) { switch ($file) {
case "avatar/admin.jpg": case 'avatar/admin.jpg':
case "avatar/noavatar.png": case 'avatar/noavatar.png':
case "avatar/system.jpg": case 'avatar/system.jpg':
case "header/header.jpg": case 'header/header.jpg':
case "logo/logo.png": case 'logo/logo.png':
$file = "medias/".$file; $file = 'medias/'.$file;
$filePath = $file; $filePath = $file;
$content = file_get_contents($file); $content = file_get_contents($file);
break; break;
default: default:
// C'est une url = on affiche l'url // C'est une url = on affiche l'url
if(stripos($file,"http")===0) { if (0 === stripos($file, 'http')) {
$filePath = $file; $filePath = $file;
$content = file_get_contents($file); $content = file_get_contents($file);
} }
@ -87,7 +88,7 @@ class MinioController extends AbstractController
public function document(Request $request) public function document(Request $request)
{ {
$file=$request->query->get("file"); $file = $request->query->get('file');
$filePath = $this->minio->download($file, $file, true); $filePath = $this->minio->download($file, $file, true);
$content = file_get_contents($filePath); $content = file_get_contents($filePath);

View File

@ -1,119 +1,121 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use App\Entity\Niveau01 as Entity; use App\Entity\Niveau01 as Entity;
use App\Form\Niveau01Type as Form; use App\Form\Niveau01Type as Form;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class Niveau01Controller extends AbstractController class Niveau01Controller extends AbstractController
{ {
private $data="niveau01"; private $data = 'niveau01';
private $entity="App\Entity\Niveau01"; private $entity = "App\Entity\Niveau01";
private $twig="Niveau01/"; private $twig = 'Niveau01/';
private $route="app_admin_niveau01"; private $route = 'app_admin_niveau01';
public function list($access): Response public function list($access): Response
{ {
return $this->render($this->twig.'list.html.twig',[ return $this->render($this->twig.'list.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"access"=>$access, 'access' => $access,
]); ]);
} }
public function tablelist(Request $request,ManagerRegistry $em): Response public function tablelist(Request $request, ManagerRegistry $em): Response
{ {
$query=$request->query->all(); $query = $request->query->all();
$start=$query['start']; $start = $query['start'];
$length=$query['length']; $length = $query['length'];
$search=$query['search']; $search = $query['search'];
$draw= $query['draw']; $draw = $query['draw'];
$ordercolumn=$query['order'][0]['column']; $ordercolumn = $query['order'][0]['column'];
$orderdir=$query['order'][0]['dir']; $orderdir = $query['order'][0]['dir'];
// Nombre total d'enregistrement // Nombre total d'enregistrement
$total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity,'entity')->getQuery()->getSingleScalarResult(); $total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity, 'entity')->getQuery()->getSingleScalarResult();
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if(!$search||$search["value"]=="") if (!$search || '' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->where('entity.label LIKE :value') ->where('entity.label LIKE :value')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
} }
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('entity')->from($this->entity,'entity'); $qb->select('entity')->from($this->entity, 'entity');
if($search&&$search["value"]!="") { if ($search && '' != $search['value']) {
$qb ->andWhere('entity.label LIKE :value') $qb->andWhere('entity.label LIKE :value')
->setParameter("value", "%".$search["value"]."%"); ->setParameter('value', '%'.$search['value'].'%');
} }
if($ordercolumn) { if ($ordercolumn) {
switch($ordercolumn) { switch ($ordercolumn) {
case 1 : case 1:
$qb->orderBy('entity.label',$orderdir); $qb->orderBy('entity.label', $orderdir);
break; break;
} }
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
// Action // Action
$action = ""; $action = '';
$action.="<a href='".$this->generateUrl($this->route.'_update', array('id'=>$data->getId()))."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl($this->route.'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
$tmp=array(); $tmp = [];
array_push($tmp,$action); array_push($tmp, $action);
array_push($tmp,$data->getLabel()); array_push($tmp, $data->getLabel());
if($this->getParameter("appMasteridentity")=="LDAP"||$this->getParameter("appSynchro")=="LDAP2NINE") array_push($tmp,$data->getLdapfilter()); if ('LDAP' == $this->getParameter('appMasteridentity') || 'LDAP2NINE' == $this->getParameter('appSynchro')) {
if($this->getParameter("appMasteridentity")=="SSO") array_push($tmp,$data->getAttributes()); array_push($tmp, $data->getLdapfilter());
}
if ('SSO' == $this->getParameter('appMasteridentity')) {
array_push($tmp, $data->getAttributes());
}
array_push($output["data"],$tmp); array_push($output['data'], $tmp);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function submit($access, Request $request, ManagerRegistry $em): Response
public function submit($access,Request $request,ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data = new Entity(); $data = new Entity();
$data->setApikey(Uuid::uuid4()); $data->setApikey(Uuid::uuid4());
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"submit", 'mode' => 'submit',
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"appSynchro"=>$this->GetParameter("appSynchro"), 'appSynchro' => $this->GetParameter('appSynchro'),
"appNiveau01label"=>$this->GetParameter("appNiveau01label"), 'appNiveau01label' => $this->GetParameter('appNiveau01label'),
)); ]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -132,29 +134,31 @@ class Niveau01Controller extends AbstractController
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [ return $this->render($this->twig.'edit.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"mode"=>"submit", 'mode' => 'submit',
"form"=>$form->createView(), 'form' => $form->createView(),
$this->data=>$data, $this->data => $data,
"access"=>$access, 'access' => $access,
]); ]);
} }
public function update($id,$access,Request $request,ManagerRegistry $em): Response public function update($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"update", 'mode' => 'update',
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"appSynchro"=>$this->GetParameter("appSynchro"), 'appSynchro' => $this->GetParameter('appSynchro'),
"appNiveau01label"=>$this->GetParameter("appNiveau01label"), 'appNiveau01label' => $this->GetParameter('appNiveau01label'),
)); ]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -176,24 +180,26 @@ class Niveau01Controller extends AbstractController
$this->data => $data, $this->data => $data,
'mode' => 'update', 'mode' => 'update',
'form' => $form->createView(), 'form' => $form->createView(),
"access" => $access 'access' => $access,
]); ]);
} }
public function delete($id,$access,Request $request,ManagerRegistry $em): Response public function delete($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Tentative de suppression // Tentative de suppression
try{ try {
$em->getManager()->remove($data); $em->getManager()->remove($data);
$em->getManager()->flush(); $em->getManager()->flush();
} } catch (\Exception $e) {
catch (\Exception $e) { $request->getSession()->getFlashBag()->add('error', $e->getMessage());
$request->getSession()->getFlashBag()->add("error", $e->getMessage());
return $this->redirectToRoute($this->route."_update",["id"=>$id]); return $this->redirectToRoute($this->route.'_update', ['id' => $id]);
} }
return $this->redirectToRoute($this->route); return $this->redirectToRoute($this->route);

View File

@ -1,93 +1,92 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use App\Entity\Niveau02 as Entity; use App\Entity\Niveau02 as Entity;
use App\Form\Niveau02Type as Form; use App\Form\Niveau02Type as Form;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class Niveau02Controller extends AbstractController class Niveau02Controller extends AbstractController
{ {
private $data="niveau02"; private $data = 'niveau02';
private $entity="App\Entity\Niveau02"; private $entity = "App\Entity\Niveau02";
private $twig="Niveau02/"; private $twig = 'Niveau02/';
private $route="app_admin_niveau02"; private $route = 'app_admin_niveau02';
public function list($access): Response public function list($access): Response
{ {
return $this->render($this->twig.'list.html.twig',[ return $this->render($this->twig.'list.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"access"=>$access, 'access' => $access,
]); ]);
} }
public function tablelist($access,Request $request,ManagerRegistry $em): Response public function tablelist($access, Request $request, ManagerRegistry $em): Response
{ {
$query=$request->query->all(); $query = $request->query->all();
$start=$query['start']; $start = $query['start'];
$length=$query['length']; $length = $query['length'];
$search=$query['search']; $search = $query['search'];
$draw= $query['draw']; $draw = $query['draw'];
$ordercolumn=$query['order'][0]['column']; $ordercolumn = $query['order'][0]['column'];
$orderdir=$query['order'][0]['dir']; $orderdir = $query['order'][0]['dir'];
$total = null;
$totalf = null;
// Nombre total d'enregistrement // Nombre total d'enregistrement
switch($access) { switch ($access) {
case "admin": case 'admin':
$total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity,'entity')->getQuery()->getSingleScalarResult(); $total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity, 'entity')->getQuery()->getSingleScalarResult();
break; break;
case "modo": case 'modo':
$total = $em->getManager()->createQueryBuilder() $total = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from("App\Entity\UserModo",'usermodo') ->from("App\Entity\UserModo", 'usermodo')
->where("usermodo.niveau01 = entity.niveau01") ->where('usermodo.niveau01 = entity.niveau01')
->andWhere("usermodo.user = :user") ->andWhere('usermodo.user = :user')
->setParameter("user", $this->getUser()) ->setParameter('user', $this->getUser())
->getQuery()->getSingleScalarResult(); ->getQuery()->getSingleScalarResult();
break; break;
} }
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if(!$search||$search["value"]=="") if (!$search || '' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
switch($access) { switch ($access) {
case "admin": case 'admin':
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from("App\Entity\Niveau01",'niveau01') ->from("App\Entity\Niveau01", 'niveau01')
->where('entity.niveau01=niveau01.id') ->where('entity.niveau01=niveau01.id')
->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value') ->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
break; break;
case "modo": case 'modo':
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from("App\Entity\Niveau01",'niveau01') ->from("App\Entity\Niveau01", 'niveau01')
->from("App\Entity\UserModo",'usermodo') ->from("App\Entity\UserModo", 'usermodo')
->where('entity.niveau01=niveau01.id') ->where('entity.niveau01=niveau01.id')
->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value') ->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value')
->andWhere("usermodo.niveau01 = entity.niveau01") ->andWhere('usermodo.niveau01 = entity.niveau01')
->andWhere("usermodo.user = :user") ->andWhere('usermodo.user = :user')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->setParameter("user", $this->getUser()) ->setParameter('user', $this->getUser())
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
break; break;
@ -95,123 +94,124 @@ class Niveau02Controller extends AbstractController
} }
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
switch($access) { switch ($access) {
case "admin": case 'admin':
$qb->select('entity') $qb->select('entity')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from("App:Niveau01",'niveau01') ->from('App:Niveau01', 'niveau01')
->where('entity.niveau01=niveau01.id'); ->where('entity.niveau01=niveau01.id');
break; break;
case "modo": case 'modo':
$qb->select('entity') $qb->select('entity')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from("App:Niveau01",'niveau01') ->from('App:Niveau01', 'niveau01')
->from("App\Entity\UserModo",'usermodo') ->from("App\Entity\UserModo", 'usermodo')
->where('entity.niveau01=niveau01.id') ->where('entity.niveau01=niveau01.id')
->andWhere("usermodo.niveau01 = entity.niveau01") ->andWhere('usermodo.niveau01 = entity.niveau01')
->andWhere("usermodo.user = :user") ->andWhere('usermodo.user = :user')
->setParameter("user", $this->getUser()); ->setParameter('user', $this->getUser());
break; break;
} }
if($search&&$search["value"]!="") { if ($search && '' != $search['value']) {
$qb ->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value') $qb->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value')
->setParameter("value", "%".$search["value"]."%"); ->setParameter('value', '%'.$search['value'].'%');
} }
if($ordercolumn) { if ($ordercolumn) {
switch($ordercolumn) { switch ($ordercolumn) {
case 1 : case 1:
$qb->orderBy('niveau01.label',$orderdir); $qb->orderBy('niveau01.label', $orderdir);
break; break;
case 2 : case 2:
$qb->orderBy('entity.label',$orderdir); $qb->orderBy('entity.label', $orderdir);
break; break;
} }
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
// Action // Action
$action = ""; $action = '';
switch($access) { switch ($access) {
case "admin": case 'admin':
$action.="<a href='".$this->generateUrl($this->route.'_update', array('id'=>$data->getId()))."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl($this->route.'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
break; break;
case "modo": case 'modo':
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_modo_",$this->route).'_update', array('id'=>$data->getId()))."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_modo_', $this->route).'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
break; break;
} }
$tmp=array(); $tmp = [];
array_push($tmp,$action); array_push($tmp, $action);
array_push($tmp,$data->getNiveau01()->getLabel()); array_push($tmp, $data->getNiveau01()->getLabel());
array_push($tmp,$data->getLabel()); array_push($tmp, $data->getLabel());
array_push($output["data"],$tmp); array_push($output['data'], $tmp);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function selectlist(Request $request,ManagerRegistry $em): Response public function selectlist(Request $request, ManagerRegistry $em): Response
{ {
$output=array(); $output = [];
$page_limit=$request->query->get('page_limit'); $page_limit = $request->query->get('page_limit');
$q=$request->query->get('q'); $q = $request->query->get('q');
$niveau01id=$request->get('niveau01'); $niveau01id = $request->get('niveau01');
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('entity') $qb->select('entity')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->where('entity.label LIKE :value') ->where('entity.label LIKE :value')
->andwhere('entity.niveau01=:niveau01') ->andwhere('entity.niveau01=:niveau01')
->setParameter("value", "%".$q."%") ->setParameter('value', '%'.$q.'%')
->setParameter("niveau01", $niveau01id) ->setParameter('niveau01', $niveau01id)
->orderBy('entity.label'); ->orderBy('entity.label');
$datas=$qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
array_push($output,array("id"=>$data->getId(),"text"=>$data->getLabel())); array_push($output, ['id' => $data->getId(), 'text' => $data->getLabel()]);
} }
$ret_string["results"]=$output; $ret_string['results'] = $output;
$response = new Response(json_encode($ret_string)); $response = new Response(json_encode($ret_string));
$response->headers->set('Content-Type', 'application/json'); $response->headers->set('Content-Type', 'application/json');
return $response; return $response;
} }
public function submit($access,Request $request,ManagerRegistry $em): Response public function submit($access, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data = new Entity(); $data = new Entity();
$data->setApikey(Uuid::uuid4()); $data->setApikey(Uuid::uuid4());
// Controler les permissions // Controler les permissions
$this->cansubmit($access,$em); $this->cansubmit($access, $em);
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"submit", 'mode' => 'submit',
"access"=>$access, 'access' => $access,
"userid"=>$this->getUser()->getId(), 'userid' => $this->getUser()->getId(),
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"appNiveau01label"=>$this->GetParameter("appNiveau01label"), 'appNiveau01label' => $this->GetParameter('appNiveau01label'),
"appNiveau02label"=>$this->GetParameter("appNiveau02label"), 'appNiveau02label' => $this->GetParameter('appNiveau02label'),
)); ]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -225,37 +225,39 @@ class Niveau02Controller extends AbstractController
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [ return $this->render($this->twig.'edit.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"mode"=>"submit", 'mode' => 'submit',
"access"=>$access, 'access' => $access,
"form"=>$form->createView(), 'form' => $form->createView(),
$this->data=>$data, $this->data => $data,
]); ]);
} }
public function update($id,$access,Request $request,ManagerRegistry $em): Response public function update($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canupdate($access,$data,$em); $this->canupdate($access, $data, $em);
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"update", 'mode' => 'update',
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"appNiveau01label"=>$this->GetParameter("appNiveau01label"), 'appNiveau01label' => $this->GetParameter('appNiveau01label'),
"appNiveau02label"=>$this->GetParameter("appNiveau02label"), 'appNiveau02label' => $this->GetParameter('appNiveau02label'),
)); ]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -266,7 +268,7 @@ class Niveau02Controller extends AbstractController
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
// Affichage du formulaire // Affichage du formulaire
@ -277,47 +279,56 @@ class Niveau02Controller extends AbstractController
$this->data => $data, $this->data => $data,
'mode' => 'update', 'mode' => 'update',
'access' => $access, 'access' => $access,
'form' => $form->createView() 'form' => $form->createView(),
]); ]);
} }
public function delete($id,$access,Request $request,ManagerRegistry $em): Response public function delete($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canupdate($access,$data,$em); $this->canupdate($access, $data, $em);
// Tentative de suppression // Tentative de suppression
try{ try {
$em->getManager()->remove($data); $em->getManager()->remove($data);
$em->getManager()->flush(); $em->getManager()->flush();
} } catch (\Exception $e) {
catch (\Exception $e) { $request->getSession()->getFlashBag()->add('error', $e->getMessage());
$request->getSession()->getFlashBag()->add("error", $e->getMessage());
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)."_update",["id"=>$id]); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
} }
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
private function cansubmit($access,$em) { private function cansubmit($access, $em)
switch($access) { {
case "admin" : return true; break; switch ($access) {
case "modo" : return true; break; case 'admin': return true;
break;
case 'modo': return true;
break;
} }
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
} }
private function canupdate($access, $entity, $em)
{
switch ($access) {
case 'admin': return true;
break;
case 'modo':
$usermodo = $em->getRepository("App\Entity\UserModo")->findOneBy(['user' => $this->getUser(), 'niveau01' => $entity->getNiveau01()]);
if (!$usermodo) {
throw $this->createAccessDeniedException('Permission denied');
}
private function canupdate($access,$entity,$em) {
switch($access) {
case "admin" : return true; break;
case "modo" :
$usermodo=$em->getRepository("App\Entity\UserModo")->findOneBy(["user"=>$this->getUser(),"niveau01"=>$entity->getNiveau01()]);
if(!$usermodo) throw $this->createAccessDeniedException('Permission denied');
return true; return true;
break; break;
} }

View File

@ -0,0 +1,354 @@
<?php
namespace App\Controller;
use App\Entity\Niveau03 as Entity;
use App\Form\Niveau03Type as Form;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class Niveau03Controller extends AbstractController
{
private $data = 'niveau03';
private $entity = "App\Entity\Niveau03";
private $twig = 'Niveau03/';
private $route = 'app_admin_niveau03';
public function list($access): Response
{
return $this->render($this->twig.'list.html.twig', [
'useheader' => true,
'usemenu' => false,
'usesidebar' => true,
'access' => $access,
]);
}
public function tablelist($access, Request $request, ManagerRegistry $em): Response
{
$query = $request->query->all();
$start = $query['start'];
$length = $query['length'];
$search = $query['search'];
$draw = $query['draw'];
$ordercolumn = $query['order'][0]['column'];
$orderdir = $query['order'][0]['dir'];
$total = null;
$totalf = null;
// Nombre total d'enregistrement
switch ($access) {
case 'admin':
$total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity, 'entity')->getQuery()->getSingleScalarResult();
break;
case 'modo':
$total = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)')
->from($this->entity, 'entity')
->from("App\Entity\UserModo", 'usermodo')
->from("App\Entity\Niveau02", 'niveau02')
->where('entity.niveau02 = niveau02.id')
->andwhere('usermodo.niveau01 = niveau02.niveau01')
->andWhere('usermodo.user = :user')
->setParameter('user', $this->getUser())
->getQuery()->getSingleScalarResult();
break;
}
// Nombre d'enregistrement filtré
if (!$search || '' == $search['value']) {
$totalf = $total;
} else {
switch ($access) {
case 'admin':
$totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)')
->from($this->entity, 'entity')
->from("App\Entity\Niveau01", 'niveau01')
->from("App\Entity\Niveau02", 'niveau02')
->where('entity.niveau02 = niveau02.id')
->andwhere('niveau02.niveau01=niveau01.id')
->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value OR niveau02.label LIKE :value')
->setParameter('value', '%'.$search['value'].'%')
->getQuery()
->getSingleScalarResult();
break;
case 'modo':
$totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)')
->from($this->entity, 'entity')
->from("App\Entity\Niveau01", 'niveau01')
->from("App\Entity\Niveau02", 'niveau02')
->from("App\Entity\UserModo", 'usermodo')
->where('entity.niveau02 = niveau02.id')
->andwhere('niveau02.niveau01=niveau01.id')
->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value OR niveau02.label LIKE :value')
->andWhere('usermodo.niveau01 = niveau01.id')
->andWhere('usermodo.user = :user')
->setParameter('value', '%'.$search['value'].'%')
->setParameter('user', $this->getUser())
->getQuery()
->getSingleScalarResult();
break;
}
}
// Construction du tableau de retour
$output = [
'draw' => $draw,
'recordsFiltered' => $totalf,
'recordsTotal' => $total,
'data' => [],
];
// Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder();
switch ($access) {
case 'admin':
$qb->select('entity')
->from($this->entity, 'entity')
->from('App:Niveau01', 'niveau01')
->from('App:Niveau02', 'niveau02')
->where('entity.niveau02=niveau02.id')
->andwhere('niveau02.niveau01=niveau01.id');
break;
case 'modo':
$qb->select('entity')
->from($this->entity, 'entity')
->from('App:Niveau01', 'niveau01')
->from('App:Niveau02', 'niveau02')
->from("App\Entity\UserModo", 'usermodo')
->where('entity.niveau02=niveau02.id')
->andwhere('niveau02.niveau01=niveau01.id')
->andWhere('usermodo.niveau01 = niveau01.id')
->andWhere('usermodo.user = :user')
->setParameter('user', $this->getUser());
break;
}
if ($search && '' != $search['value']) {
$qb->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value OR niveau02.label LIKE :value')
->setParameter('value', '%'.$search['value'].'%');
}
if ($ordercolumn) {
switch ($ordercolumn) {
case 1:
$qb->orderBy('niveau01.label', $orderdir);
break;
case 2:
$qb->orderBy('niveau02.label', $orderdir);
break;
case 3:
$qb->orderBy('entity.label', $orderdir);
break;
}
}
$datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach ($datas as $data) {
// Action
$action = '';
switch ($access) {
case 'admin':
$action .= "<a href='".$this->generateUrl($this->route.'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
break;
case 'modo':
$action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_modo_', $this->route).'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
break;
}
$tmp = [];
array_push($tmp, $action);
array_push($tmp, $data->getNiveau02()->getNiveau01()->getLabel());
array_push($tmp, $data->getNiveau02()->getLabel());
array_push($tmp, $data->getLabel());
array_push($output['data'], $tmp);
}
// Retour
return new JsonResponse($output);
}
public function selectlist(Request $request, ManagerRegistry $em): Response
{
$output = [];
$page_limit = $request->query->get('page_limit');
$q = $request->query->get('q');
$niveau02id = $request->get('niveau02');
$qb = $em->getManager()->createQueryBuilder();
$qb->select('entity')
->from($this->entity, 'entity')
->where('entity.label LIKE :value')
->andwhere('entity.niveau02=:niveau02')
->setParameter('value', '%'.$q.'%')
->setParameter('niveau02', $niveau02id)
->orderBy('entity.label');
$datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult();
foreach ($datas as $data) {
array_push($output, ['id' => $data->getId(), 'text' => $data->getLabel()]);
}
$ret_string['results'] = $output;
$response = new Response(json_encode($ret_string));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
public function submit($access, Request $request, ManagerRegistry $em): Response
{
// Initialisation de l'enregistrement
$data = new Entity();
$data->setApikey(Uuid::uuid4());
// Controler les permissions
$this->cansubmit($access, $em);
// Création du formulaire
$form = $this->createForm(Form::class, $data, [
'mode' => 'submit',
'access' => $access,
'userid' => $this->getUser()->getId(),
'appMasteridentity' => $this->GetParameter('appMasteridentity'),
'appNiveau01label' => $this->GetParameter('appNiveau01label'),
'appNiveau02label' => $this->GetParameter('appNiveau02label'),
'appNiveau03label' => $this->GetParameter('appNiveau03label'),
]);
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
// Sauvegarde
$em->getManager()->persist($data);
$em->getManager()->flush();
// Retour à la liste
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
}
// Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [
'useheader' => true,
'usemenu' => false,
'usesidebar' => true,
'mode' => 'submit',
'access' => $access,
'form' => $form->createView(),
$this->data => $data,
]);
}
public function update($id, $access, Request $request, ManagerRegistry $em): Response
{
// Initialisation de l'enregistrement
$data = $em->getRepository($this->entity)->find($id);
if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions
$this->canupdate($access, $data, $em);
// Création du formulaire
$form = $this->createForm(Form::class, $data, [
'mode' => 'update',
'appMasteridentity' => $this->GetParameter('appMasteridentity'),
'appNiveau01label' => $this->GetParameter('appNiveau01label'),
'appNiveau02label' => $this->GetParameter('appNiveau02label'),
'appNiveau03label' => $this->GetParameter('appNiveau03label'),
]);
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
$em->getManager()->flush();
// Retour à la liste
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
}
// Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [
'useheader' => true,
'usemenu' => false,
'usesidebar' => true,
$this->data => $data,
'mode' => 'update',
'access' => $access,
'form' => $form->createView(),
]);
}
public function delete($id, $access, Request $request, ManagerRegistry $em): Response
{
// Récupération de l'enregistrement courant
$data = $em->getRepository($this->entity)->find($id);
if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions
$this->canupdate($access, $data, $em);
// Tentative de suppression
try {
$em->getManager()->remove($data);
$em->getManager()->flush();
} catch (\Exception $e) {
$request->getSession()->getFlashBag()->add('error', $e->getMessage());
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
}
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
}
private function cansubmit($access, $em)
{
switch ($access) {
case 'admin': return true;
break;
case 'modo': return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
private function canupdate($access, $entity, $em)
{
switch ($access) {
case 'admin': return true;
break;
case 'modo':
$usermodo = $em->getRepository("App\Entity\UserModo")->findOneBy(['user' => $this->getUser(), 'niveau01' => $entity->getNiveau02()->getNiveau01()]);
if (!$usermodo) {
throw $this->createAccessDeniedException('Permission denied');
}
return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
}

View File

@ -0,0 +1,371 @@
<?php
namespace App\Controller;
use App\Entity\Niveau04 as Entity;
use App\Form\Niveau04Type as Form;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class Niveau04Controller extends AbstractController
{
private $data = 'niveau04';
private $entity = "App\Entity\Niveau04";
private $twig = 'Niveau04/';
private $route = 'app_admin_niveau04';
public function list($access): Response
{
return $this->render($this->twig.'list.html.twig', [
'useheader' => true,
'usemenu' => false,
'usesidebar' => true,
'access' => $access,
]);
}
public function tablelist($access, Request $request, ManagerRegistry $em): Response
{
$query = $request->query->all();
$start = $query['start'];
$length = $query['length'];
$search = $query['search'];
$draw = $query['draw'];
$ordercolumn = $query['order'][0]['column'];
$orderdir = $query['order'][0]['dir'];
$total = null;
$totalf = null;
// Nombre total d'enregistrement
switch ($access) {
case 'admin':
$total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity, 'entity')->getQuery()->getSingleScalarResult();
break;
case 'modo':
$total = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)')
->from($this->entity, 'entity')
->from("App\Entity\UserModo", 'usermodo')
->from("App\Entity\Niveau02", 'niveau02')
->from("App\Entity\Niveau03", 'niveau03')
->where('entity.niveau03 = niveau03.id')
->andWhere('niveau03.niveau02=niveau02.id')
->andwhere('usermodo.niveau01 = niveau02.niveau01')
->andWhere('usermodo.user = :user')
->setParameter('user', $this->getUser())
->getQuery()->getSingleScalarResult();
break;
}
// Nombre d'enregistrement filtré
if (!$search || '' == $search['value']) {
$totalf = $total;
} else {
switch ($access) {
case 'admin':
$totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)')
->from($this->entity, 'entity')
->from("App\Entity\Niveau01", 'niveau01')
->from("App\Entity\Niveau02", 'niveau02')
->from("App\Entity\Niveau03", 'niveau03')
->where('entity.niveau03 = niveau03.id')
->andWhere('niveau03.niveau02=niveau02.id')
->andwhere('niveau02.niveau01=niveau01.id')
->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value OR niveau02.label LIKE :value OR niveau03.label LIKE :value')
->setParameter('value', '%'.$search['value'].'%')
->getQuery()
->getSingleScalarResult();
break;
case 'modo':
$totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)')
->from($this->entity, 'entity')
->from("App\Entity\Niveau01", 'niveau01')
->from("App\Entity\Niveau02", 'niveau02')
->from("App\Entity\Niveau03", 'niveau03')
->from("App\Entity\UserModo", 'usermodo')
->where('entity.niveau03 = niveau03.id')
->andWhere('niveau03.niveau02=niveau02.id')
->andwhere('niveau02.niveau01=niveau01.id')
->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value OR niveau02.label LIKE :value OR niveau03.label LIKE :value')
->andWhere('usermodo.niveau01 = niveau01.id')
->andWhere('usermodo.user = :user')
->setParameter('value', '%'.$search['value'].'%')
->setParameter('user', $this->getUser())
->getQuery()
->getSingleScalarResult();
break;
}
}
// Construction du tableau de retour
$output = [
'draw' => $draw,
'recordsFiltered' => $totalf,
'recordsTotal' => $total,
'data' => [],
];
// Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder();
switch ($access) {
case 'admin':
$qb->select('entity')
->from($this->entity, 'entity')
->from('App:Niveau01', 'niveau01')
->from('App:Niveau02', 'niveau02')
->from("App\Entity\Niveau03", 'niveau03')
->where('entity.niveau03 = niveau03.id')
->andWhere('niveau03.niveau02=niveau02.id')
->andwhere('niveau02.niveau01=niveau01.id');
break;
case 'modo':
$qb->select('entity')
->from($this->entity, 'entity')
->from('App:Niveau01', 'niveau01')
->from('App:Niveau02', 'niveau02')
->from("App\Entity\Niveau03", 'niveau03')
->from("App\Entity\UserModo", 'usermodo')
->where('entity.niveau03 = niveau03.id')
->andWhere('niveau03.niveau02=niveau02.id')
->andwhere('niveau02.niveau01=niveau01.id')
->andWhere('usermodo.niveau01 = niveau01.id')
->andWhere('usermodo.user = :user')
->setParameter('user', $this->getUser());
break;
}
if ($search && '' != $search['value']) {
$qb->andwhere('entity.label LIKE :value OR niveau01.label LIKE :value OR niveau02.label LIKE :value OR niveau03.label LIKE :value')
->setParameter('value', '%'.$search['value'].'%');
}
if ($ordercolumn) {
switch ($ordercolumn) {
case 1:
$qb->orderBy('niveau01.label', $orderdir);
break;
case 2:
$qb->orderBy('niveau02.label', $orderdir);
break;
case 3:
$qb->orderBy('niveau03.label', $orderdir);
break;
case 4:
$qb->orderBy('entity.label', $orderdir);
break;
}
}
$datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach ($datas as $data) {
// Action
$action = '';
switch ($access) {
case 'admin':
$action .= "<a href='".$this->generateUrl($this->route.'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
break;
case 'modo':
$action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_modo_', $this->route).'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
break;
}
$tmp = [];
array_push($tmp, $action);
array_push($tmp, $data->getNiveau03()->getNiveau02()->getNiveau01()->getLabel());
array_push($tmp, $data->getNiveau03()->getNiveau02()->getLabel());
array_push($tmp, $data->getNiveau03()->getLabel());
array_push($tmp, $data->getLabel());
array_push($output['data'], $tmp);
}
// Retour
return new JsonResponse($output);
}
public function selectlist(Request $request, ManagerRegistry $em): Response
{
$output = [];
$page_limit = $request->query->get('page_limit');
$q = $request->query->get('q');
$niveau03id = $request->get('niveau03');
$qb = $em->getManager()->createQueryBuilder();
$qb->select('entity')
->from($this->entity, 'entity')
->where('entity.label LIKE :value')
->andwhere('entity.niveau03=:niveau03')
->setParameter('value', '%'.$q.'%')
->setParameter('niveau03', $niveau03id)
->orderBy('entity.label');
$datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult();
foreach ($datas as $data) {
array_push($output, ['id' => $data->getId(), 'text' => $data->getLabel()]);
}
$ret_string['results'] = $output;
$response = new Response(json_encode($ret_string));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
public function submit($access, Request $request, ManagerRegistry $em): Response
{
// Initialisation de l'enregistrement
$data = new Entity();
$data->setApikey(Uuid::uuid4());
// Controler les permissions
$this->cansubmit($access, $em);
// Création du formulaire
$form = $this->createForm(Form::class, $data, [
'mode' => 'submit',
'access' => $access,
'userid' => $this->getUser()->getId(),
'appMasteridentity' => $this->GetParameter('appMasteridentity'),
'appNiveau01label' => $this->GetParameter('appNiveau01label'),
'appNiveau02label' => $this->GetParameter('appNiveau02label'),
'appNiveau03label' => $this->GetParameter('appNiveau03label'),
'appNiveau04label' => $this->GetParameter('appNiveau04label'),
]);
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
// Sauvegarde
$em->getManager()->persist($data);
$em->getManager()->flush();
// Retour à la liste
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
}
// Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [
'useheader' => true,
'usemenu' => false,
'usesidebar' => true,
'mode' => 'submit',
'access' => $access,
'form' => $form->createView(),
$this->data => $data,
]);
}
public function update($id, $access, Request $request, ManagerRegistry $em): Response
{
// Initialisation de l'enregistrement
$data = $em->getRepository($this->entity)->find($id);
if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions
$this->canupdate($access, $data, $em);
// Création du formulaire
$form = $this->createForm(Form::class, $data, [
'mode' => 'update',
'appMasteridentity' => $this->GetParameter('appMasteridentity'),
'appNiveau01label' => $this->GetParameter('appNiveau01label'),
'appNiveau02label' => $this->GetParameter('appNiveau02label'),
'appNiveau03label' => $this->GetParameter('appNiveau03label'),
'appNiveau04label' => $this->GetParameter('appNiveau04label'),
]);
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
$em->getManager()->flush();
// Retour à la liste
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
}
// Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [
'useheader' => true,
'usemenu' => false,
'usesidebar' => true,
$this->data => $data,
'mode' => 'update',
'access' => $access,
'form' => $form->createView(),
]);
}
public function delete($id, $access, Request $request, ManagerRegistry $em): Response
{
// Récupération de l'enregistrement courant
$data = $em->getRepository($this->entity)->find($id);
if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions
$this->canupdate($access, $data, $em);
// Tentative de suppression
try {
$em->getManager()->remove($data);
$em->getManager()->flush();
} catch (\Exception $e) {
$request->getSession()->getFlashBag()->add('error', $e->getMessage());
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
}
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
}
private function cansubmit($access, $em)
{
switch ($access) {
case 'admin': return true;
break;
case 'modo': return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
private function canupdate($access, $entity, $em)
{
switch ($access) {
case 'admin': return true;
break;
case 'modo':
$usermodo = $em->getRepository("App\Entity\UserModo")->findOneBy(['user' => $this->getUser(), 'niveau01' => $entity->getNiveau03()->getNiveau02()->getNiveau01()]);
if (!$usermodo) {
throw $this->createAccessDeniedException('Permission denied');
}
return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
}

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@ -9,24 +10,24 @@ use Symfony\Component\Mercure\Update;
class PublishController extends AbstractController class PublishController extends AbstractController
{ {
public function sample($id){ public function sample($id)
return $this->render('Home/publishsample.html.twig',[ {
'id'=>$id return $this->render('Home/publishsample.html.twig', [
'id' => $id,
]); ]);
} }
public function publish($channel, $id, Request $request, HubInterface $hub): Response public function publish($channel, $id, Request $request, HubInterface $hub): Response
{ {
$ret=$request->get("msg"); $ret = $request->get('msg');
$ret["from"]=[]; $ret['from'] = [];
$ret["from"]["id"]=$this->getUser()->getId(); $ret['from']['id'] = $this->getUser()->getId();
$ret["from"]["username"]=$this->getUser()->getUsername(); $ret['from']['username'] = $this->getUser()->getUsername();
$ret["from"]["displayname"]=$this->getUser()->getDisplayname(); $ret['from']['displayname'] = $this->getUser()->getDisplayname();
$ret["from"]["avatar"]=$this->generateUrl('app_minio_image',["file"=>"avatar/".$this->getUser()->getAvatar()]); $ret['from']['avatar'] = $this->generateUrl('app_minio_image', ['file' => 'avatar/'.$this->getUser()->getAvatar()]);
$update = new Update( $update = new Update(
$channel."-".$id, $channel.'-'.$id,
json_encode( json_encode(
['ret' => $ret]) ['ret' => $ret])
); );

View File

@ -2,33 +2,31 @@
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Form\FormError;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Service\MailService;
use Ramsey\Uuid\Uuid;
use App\Entity\User;
use App\Entity\Usergroup;
use App\Entity\Registration; use App\Entity\Registration;
use App\Entity\User;
use App\Form\RegistrationType as Form; use App\Form\RegistrationType as Form;
use App\Form\ResetpwdType; use App\Form\ResetpwdType;
use App\Service\MailService;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class RegistrationController extends AbstractController class RegistrationController extends AbstractController
{ {
private $data="registration"; private $data = 'registration';
private $entity="App\Entity\Registration"; private $entity = "App\Entity\Registration";
private $twig="Registration/"; private $twig = 'Registration/';
private $route="app_admin_registration"; private $route = 'app_admin_registration';
private $mail; private $mail;
public function __construct(MailService $mail) {
public function __construct(MailService $mail)
{
$this->mail = $mail; $this->mail = $mail;
} }
@ -36,10 +34,11 @@ class RegistrationController extends AbstractController
{ {
$appmoderegistration = $this->getParameter('appModeregistration'); $appmoderegistration = $this->getParameter('appModeregistration');
$appMasteridentity = $this->getParameter('appMasteridentity'); $appMasteridentity = $this->getParameter('appMasteridentity');
if($appmoderegistration=="none"||$appMasteridentity!="SQL") if ('none' == $appmoderegistration || 'SQL' != $appMasteridentity) {
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
}
return $this->render($this->twig.'list.html.twig',[ return $this->render($this->twig.'list.html.twig', [
'useheader' => true, 'useheader' => true,
'usemenu' => false, 'usemenu' => false,
'usesidebar' => true, 'usesidebar' => true,
@ -47,179 +46,187 @@ class RegistrationController extends AbstractController
]); ]);
} }
public function tablelist($access, Request $request,ManagerRegistry $em): Response public function tablelist($access, Request $request, ManagerRegistry $em): Response
{ {
$query = $request->query->all();
$query=$request->query->all(); $start = $query['start'];
$start=$query['start']; $length = $query['length'];
$length=$query['length']; $search = $query['search'];
$search=$query['search']; $draw = $query['draw'];
$draw= $query['draw']; $ordercolumn = $query['order'][0]['column'];
$ordercolumn=$query['order'][0]['column']; $orderdir = $query['order'][0]['dir'];
$orderdir=$query['order'][0]['dir']; $usermodo = null;
// Nombre total d'enregistrement // Nombre total d'enregistrement
if($access=="admin") if ('admin' == $access) {
$total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity,'entity')->getQuery()->getSingleScalarResult(); $total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity, 'entity')->getQuery()->getSingleScalarResult();
else { } else {
$usermodo=$this->getUser(); $usermodo = $this->getUser();
$total = $em->getManager()->createQueryBuilder() $total = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from("App:UserModo",'usermodo') ->from('App:UserModo', 'usermodo')
->where("usermodo.niveau01 = entity.niveau01") ->where('usermodo.niveau01 = entity.niveau01')
->andWhere("usermodo.user = :user") ->andWhere('usermodo.user = :user')
->setParameter("user", $usermodo) ->setParameter('user', $usermodo)
->getQuery()->getSingleScalarResult(); ->getQuery()->getSingleScalarResult();
} }
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if($search["value"]=="") if ('' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
if($access=="admin") if ('admin' == $access) {
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->where('entity.username LIKE :value') ->where('entity.username LIKE :value')
->orWhere('entity.email LIKE :value') ->orWhere('entity.email LIKE :value')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
else } else {
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from("App:UserModo",'usermodo') ->from('App:UserModo', 'usermodo')
->where('entity.username LIKE :value OR entity.email LIKE :value') ->where('entity.username LIKE :value OR entity.email LIKE :value')
->andWhere("usermodo.niveau01 = entity.niveau01") ->andWhere('usermodo.niveau01 = entity.niveau01')
->andWhere("usermodo.user = :user") ->andWhere('usermodo.user = :user')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->setParameter("user", $usermodo) ->setParameter('user', $usermodo)
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
} }
}
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
if($this->isGranted('ROLE_ADMIN')) { if ($this->isGranted('ROLE_ADMIN')) {
$qb->select('entity')->from($this->entity,'entity')->from('App:Niveau01','niveau01'); $qb->select('entity')->from($this->entity, 'entity')->from('App:Niveau01', 'niveau01');
$qb->where('entity.niveau01=niveau01.id'); $qb->where('entity.niveau01=niveau01.id');
} } else {
else{ $qb->select('entity')->from($this->entity, 'entity')->from('App:Niveau01', 'niveau01')->from('App:UserModo', 'usermodo');
$qb->select('entity')->from($this->entity,'entity')->from('App:Niveau01','niveau01')->from("App:UserModo",'usermodo');
$qb->where('entity.niveau01=niveau01.id') $qb->where('entity.niveau01=niveau01.id')
->andWhere("usermodo.niveau01 = entity.niveau01") ->andWhere('usermodo.niveau01 = entity.niveau01')
->andWhere("usermodo.user = :user") ->andWhere('usermodo.user = :user')
->setParameter("user", $usermodo); ->setParameter('user', $usermodo);
} }
if ('' != $search['value']) {
if($search["value"]!="") { $qb->andWhere('entity.username LIKE :value OR entity.email LIKE :value OR niveau01.label LIKE :value')
$qb ->andWhere('entity.username LIKE :value OR entity.email LIKE :value OR niveau01.label LIKE :value') ->setParameter('value', '%'.$search['value'].'%');
->setParameter("value", "%".$search["value"]."%");
} }
switch($ordercolumn) { switch ($ordercolumn) {
case 1 : case 1:
$qb->orderBy('entity.username',$orderdir); $qb->orderBy('entity.username', $orderdir);
break; break;
case 2 : case 2:
$qb->orderBy('entity.email',$orderdir); $qb->orderBy('entity.email', $orderdir);
break; break;
case 3 : case 3:
$qb->orderBy('entity.label',$orderdir); $qb->orderBy('entity.label', $orderdir);
break; break;
case 4 : case 7:
$qb->orderBy('entity.statut',$orderdir); $qb->orderBy('entity.statut', $orderdir);
break; break;
case 5 : case 8:
$qb->orderBy('entity.keyexpire',$orderdir); $qb->orderBy('entity.keyexpire', $orderdir);
break; break;
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
$action =""; $action = '';
// Si inscription non périmée // Si inscription non périmée
if($data->getStatut()<=2) { if ($data->getStatut() <= 2) {
$action.="<a href='".$this->generateUrl('app_'.$access.'_registration_update', array('id'=>$data->getId()))."'><i class='fa fa-envelope fa-2x fa-fw'></i></a>"; $action .= "<a href='".$this->generateUrl('app_'.$access.'_registration_update', ['id' => $data->getId()])."'><i class='fa fa-envelope fa-2x fa-fw'></i></a>";
} }
$statut=""; $statut = '';
switch($data->getStatut()) { switch ($data->getStatut()) {
case 1: $statut='En attente validation Administration'; break; case 1: $statut = 'En attente validation Administration';
case 2: $statut='En attente validation Utilisateur'; break; break;
case 3: $statut='Inscription expirée'; break; case 2: $statut = 'En attente validation Utilisateur';
break;
case 3: $statut = 'Inscription expirée';
break;
} }
array_push($output["data"],array( array_push($output['data'], [
$action, $action,
$data->getUsername(), $data->getUsername(),
$data->getEmail(), $data->getEmail(),
$data->getNiveau01()->getLabel(), $data->getNiveau01()->getLabel(),
$data->getNiveau02() ? $data->getNiveau02()->getLabel() : '',
$data->getNiveau03() ? $data->getNiveau03()->getLabel() : '',
$data->getNiveau04() ? $data->getNiveau04()->getLabel() : '',
$statut, $statut,
(is_null($data->getKeyexpire())?"":$data->getKeyexpire()->format('d/m/Y H:i:s')) is_null($data->getKeyexpire()) ? '' : $data->getKeyexpire()->format('d/m/Y H:i:s'),
)); ]);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function submit(Request $request, ManagerRegistry $em): Response
public function submit(Request $request,ManagerRegistry $em): Response
{ {
$appmoderegistration = $this->getParameter('appModeregistration'); $appmoderegistration = $this->getParameter('appModeregistration');
$appMasteridentity = $this->getParameter('appMasteridentity'); $appMasteridentity = $this->getParameter('appMasteridentity');
if($appmoderegistration=="none"||$appMasteridentity!="SQL") if ('none' == $appmoderegistration || 'SQL' != $appMasteridentity) {
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
}
$data = new Registration(); $data = new Registration();
$data->setIsvisible(true); $data->setIsvisible(true);
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"submit", 'mode' => 'submit',
"access"=>"user", 'access' => 'all',
"userid"=>null, 'userid' => null,
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"appNiveau01label"=>$this->GetParameter("appNiveau01label"), 'appNiveau01label' => $this->GetParameter('appNiveau01label'),
"appNiveau02label"=>$this->GetParameter("appNiveau02label"), 'appNiveau02use' => $this->GetParameter('appNiveau02use'),
)); 'appNiveau02label' => $this->GetParameter('appNiveau02label'),
'appNiveau03use' => $this->GetParameter('appNiveau03use'),
'appNiveau03label' => $this->GetParameter('appNiveau03label'),
'appNiveau04use' => $this->GetParameter('appNiveau04use'),
'appNiveau04label' => $this->GetParameter('appNiveau04label'),
]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
// si mode de registration BYUSER // si mode de registration BYUSER
if($appmoderegistration=="BYUSER") { if ('BYUSER' == $appmoderegistration) {
$idstatut=2; $idstatut = 2;
} } else {
else {
// On recherche le domaine du mail dans la liste blanche // On recherche le domaine du mail dans la liste blanche
$email=explode("@",$data->getEmail()); $email = explode('@', $data->getEmail());
$domaine=end($email); $domaine = end($email);
$whitelist = $em->getRepository("App\Entity\Whitelist")->findBy(["label"=>$domaine]); $whitelist = $em->getRepository("App\Entity\Whitelist")->findBy(['label' => $domaine]);
$idstatut=(!$whitelist?1:2); $idstatut = (!$whitelist ? 1 : 2);
} }
$data->setStatut($idstatut); $data->setStatut($idstatut);
// Sur erreur // Sur erreur
$this->getErrorForm(null,$form,$request,$data,"submit",$idstatut,$em); $this->getErrorForm(null, $form, $request, $data, 'submit', $idstatut, $em);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
@ -230,11 +237,11 @@ class RegistrationController extends AbstractController
$appModeregistrationterme = $this->getParameter('appModeregistrationterme'); $appModeregistrationterme = $this->getParameter('appModeregistrationterme');
// si non : validation par administrateur // si non : validation par administrateur
if($idstatut==1) { if (1 == $idstatut) {
// Email à destination de l'inscript pour le prévenir qu'un administrateur doit valider // Email à destination de l'inscript pour le prévenir qu'un administrateur doit valider
$subject=$appname." : Inscription en cours de validation"; $subject = $appname.' : Inscription en cours de validation';
$body="Votre inscription a bien été enregistrée.<br>Cependant, un administrateur doit encore valider votre inscription avant que celle-ci ne devienne effective.<br><br>Vous recevrez un mail quand votre inscription sera validée"; $body = 'Votre inscription a bien été enregistrée.<br>Cependant, un administrateur doit encore valider votre inscription avant que celle-ci ne devienne effective.<br><br>Vous recevrez un mail quand votre inscription sera validée';
$info=$body; $info = $body;
$to = $data->getEmail(); $to = $data->getEmail();
$from = $noreply; $from = $noreply;
$fromName = $appname; $fromName = $appname;
@ -242,65 +249,64 @@ class RegistrationController extends AbstractController
// Email à l'ensemble administrateurs pour les prévenir qu'il y a une personne à valider // Email à l'ensemble administrateurs pour les prévenir qu'il y a une personne à valider
$url = $this->generateUrl('app_admin_registration', [], UrlGeneratorInterface::ABSOLUTE_URL); $url = $this->generateUrl('app_admin_registration', [], UrlGeneratorInterface::ABSOLUTE_URL);
$to=array(); $to = [];
$from = $noreply; $from = $noreply;
$fromName = $appname; $fromName = $appname;
$subject=$appname." : Inscription à valider"; $subject = $appname.' : Inscription à valider';
$motivation = "Login = ".$data->getUsername()."<br>"; $motivation = 'Login = '.$data->getUsername().'<br>';
$motivation.= "Nom = ".$data->getLastname()."<br>"; $motivation .= 'Nom = '.$data->getLastname().'<br>';
$motivation.= "Prénom = ".$data->getFirstname()."<br>"; $motivation .= 'Prénom = '.$data->getFirstname().'<br>';
$motivation.= "Mail = ".$data->getEmail()."<br>"; $motivation .= 'Mail = '.$data->getEmail().'<br>';
$motivation.= $this->getParameter("appNiveau01label")." = ".$data->getNiveau01()->getLabel(); $motivation .= $this->getParameter('appNiveau01label').' = '.$data->getNiveau01()->getLabel();
$motivation.= $data->getMotivation(); $motivation .= $data->getMotivation();
$body="Un utilisateur dont le mail nest pas en liste blanche souhaite sinscrire à ".$appname.".\nMerci dapprouver son inscription pour finaliser celle-ci.<br><br>Veuillez vérifier cette inscription à cette adresse:<br><a href='$url'>$url</a><br><br>".$motivation; $body = 'Un utilisateur dont le mail nest pas en liste blanche souhaite sinscrire à '.$appname.".\nMerci dapprouver son inscription pour finaliser celle-ci.<br><br>Veuillez vérifier cette inscription à cette adresse:<br><a href='$url'>$url</a><br><br>".$motivation;
$emailadmins= $em ->getManager()->createQueryBuilder() $emailadmins = $em->getManager()->createQueryBuilder()
->select('table.email') ->select('table.email')
->from("App:User",'table') ->from('App:User', 'table')
->where('table.roles LIKE :value') ->where('table.roles LIKE :value')
->setParameter("value", "%ROLE_ADMIN%") ->setParameter('value', '%ROLE_ADMIN%')
->getQuery() ->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR); ->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR);
foreach($emailadmins as $emailadmin) { foreach ($emailadmins as $emailadmin) {
array_push($to,$emailadmin["email"]); array_push($to, $emailadmin['email']);
} }
$this->mail->sendEmail($subject, $body, $to, $from, $fromName); $this->mail->sendEmail($subject, $body, $to, $from, $fromName);
// Email à l'ensemble des modérateurs du service pour les prévenir qu'il y a une personne à valider // Email à l'ensemble des modérateurs du service pour les prévenir qu'il y a une personne à valider
$niveau01id=$data->getNiveau01()->getId(); $niveau01id = $data->getNiveau01()->getId();
$url = $this->generateUrl('app_modo_registration', [], UrlGeneratorInterface::ABSOLUTE_URL); $url = $this->generateUrl('app_modo_registration', [], UrlGeneratorInterface::ABSOLUTE_URL);
$to=array(); $to = [];
$from = $noreply; $from = $noreply;
$fromName = $appname; $fromName = $appname;
$subject=$appname." : Inscription à valider"; $subject = $appname.' : Inscription à valider';
$motivation = "Login = ".$data->getUsername()."<br>"; $motivation = 'Login = '.$data->getUsername().'<br>';
$motivation.= "Nom = ".$data->getLastname()."<br>"; $motivation .= 'Nom = '.$data->getLastname().'<br>';
$motivation.= "Prénom = ".$data->getFirstname()."<br>"; $motivation .= 'Prénom = '.$data->getFirstname().'<br>';
$motivation.= "Mail = ".$data->getEmail()."<br>"; $motivation .= 'Mail = '.$data->getEmail().'<br>';
$motivation.= $this->getParameter("appNiveau01label")." = ".$data->getNiveau01()->getLabel(); $motivation .= $this->getParameter('appNiveau01label').' = '.$data->getNiveau01()->getLabel();
$motivation.= $data->getMotivation(); $motivation .= $data->getMotivation();
$body="Un utilisateur dont le mail nest pas en liste blanche souhaite sinscrire à ".$appname.".\nMerci dapprouver son inscription pour finaliser celle-ci.<br><br>Veuillez vérifier cette inscription à cette adresse:<br><a href='$url'>$url</a><br><br>".$motivation; $body = 'Un utilisateur dont le mail nest pas en liste blanche souhaite sinscrire à '.$appname.".\nMerci dapprouver son inscription pour finaliser celle-ci.<br><br>Veuillez vérifier cette inscription à cette adresse:<br><a href='$url'>$url</a><br><br>".$motivation;
$emailmodos= $em ->getManager()->createQueryBuilder() $emailmodos = $em->getManager()->createQueryBuilder()
->select('user.email') ->select('user.email')
->from("App:UserModo",'usermodo') ->from('App:UserModo', 'usermodo')
->from("App:User",'user') ->from('App:User', 'user')
->where("usermodo.niveau01 = :niveau01id") ->where('usermodo.niveau01 = :niveau01id')
->andWhere("user.id = usermodo.user") ->andWhere('user.id = usermodo.user')
->andWhere('user.roles LIKE :value') ->andWhere('user.roles LIKE :value')
->setParameter("niveau01id", $niveau01id) ->setParameter('niveau01id', $niveau01id)
->setParameter("value", "%ROLE_MODO%") ->setParameter('value', '%ROLE_MODO%')
->getQuery() ->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR); ->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR);
foreach($emailmodos as $emailmodo) { foreach ($emailmodos as $emailmodo) {
array_push($to,$emailmodo["email"]); array_push($to, $emailmodo['email']);
} }
$this->mail->sendEmail($subject, $body, $to, $from, $fromName); $this->mail->sendEmail($subject, $body, $to, $from, $fromName);
} }
// si oui : Domaine de confiance : email de validation d'inscription directement à l'utilisateur // si oui : Domaine de confiance : email de validation d'inscription directement à l'utilisateur
else { else {
// Génération de la date de fin de validité de la clé // Génération de la date de fin de validité de la clé
$keyexpire=new \DateTime(); $keyexpire = new \DateTime();
$keyexpire->add(new \DateInterval('PT'.$appModeregistrationterme.'H')); $keyexpire->add(new \DateInterval('PT'.$appModeregistrationterme.'H'));
// Enregistrement des valeurs // Enregistrement des valeurs
@ -308,10 +314,10 @@ class RegistrationController extends AbstractController
$data->setKeyexpire($keyexpire); $data->setKeyexpire($keyexpire);
// Email à l'utilisateur // Email à l'utilisateur
$url = $this->generateUrl('app_registration_validation', array("key"=>$data->getKeyvalue()), UrlGeneratorInterface::ABSOLUTE_URL); $url = $this->generateUrl('app_registration_validation', ['key' => $data->getKeyvalue()], UrlGeneratorInterface::ABSOLUTE_URL);
$subject=$appname." : confirmation de validation"; $subject = $appname.' : confirmation de validation';
$body="<p>Merci de confirmer votre inscription en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url."</a></p><br><p>Attention vous disposez dun délai de 8 heures pour le faire. Passé ce délai, vous devrez vous réinscrire.</p>"; $body = "<p>Merci de confirmer votre inscription en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url.'</a></p><br><p>Attention vous disposez dun délai de 8 heures pour le faire. Passé ce délai, vous devrez vous réinscrire.</p>';
$info="Vous allez recevoir un mail de confirmation pour finaliser votre inscription"; $info = 'Vous allez recevoir un mail de confirmation pour finaliser votre inscription';
$to = $data->getEmail(); $to = $data->getEmail();
$from = $noreply; $from = $noreply;
$fromName = $appname; $fromName = $appname;
@ -324,12 +330,11 @@ class RegistrationController extends AbstractController
// A voir retour sur un écran d'info indiquant si validation par admion ou s'il doit matter ses email // A voir retour sur un écran d'info indiquant si validation par admion ou s'il doit matter ses email
$request->getSession()->set('registrationinfo', $info); $request->getSession()->set('registrationinfo', $info);
$request->getSession()->set('registrationmode', "info"); $request->getSession()->set('registrationmode', 'info');
$request->getSession()->set('registrationredirectto', null); $request->getSession()->set('registrationredirectto', null);
return $this->redirectToRoute('app_registration_info'); return $this->redirectToRoute('app_registration_info');
} } else {
else {
return $this->render($this->twig.'edit.html.twig', [ return $this->render($this->twig.'edit.html.twig', [
'useheader' => true, 'useheader' => true,
'usemenu' => false, 'usemenu' => false,
@ -337,18 +342,17 @@ class RegistrationController extends AbstractController
'maxsize' => 1200, 'maxsize' => 1200,
$this->data => $data, $this->data => $data,
'mode' => 'submit', 'mode' => 'submit',
'form' => $form->createView() 'form' => $form->createView(),
]); ]);
} }
} }
public function info(Request $request) public function info(Request $request)
{ {
$info = $request->getSession()->get('registrationinfo'); $info = $request->getSession()->get('registrationinfo');
$mode = $request->getSession()->get('registrationmode'); $mode = $request->getSession()->get('registrationmode');
$redirectto = $request->getSession()->get('registrationredirectto'); $redirectto = $request->getSession()->get('registrationredirectto');
return $this->render($this->twig.'info.html.twig', [ return $this->render($this->twig.'info.html.twig', [
'useheader' => true, 'useheader' => true,
'usemenu' => false, 'usemenu' => false,
@ -360,32 +364,40 @@ class RegistrationController extends AbstractController
]); ]);
} }
public function update($id,$access,Request $request,ManagerRegistry $em): Response public function update($id, $access, Request $request, ManagerRegistry $em): Response
{ {
$appname = $request->getSession()->get('appname'); $appname = $request->getSession()->get('appname');
$noreply = $this->getParameter('appMailnoreply'); $noreply = $this->getParameter('appMailnoreply');
$appModeregistrationterme = $this->getParameter('appModeregistrationterme'); $appModeregistrationterme = $this->getParameter('appModeregistrationterme');
$appMasteridentity = $this->getParameter('appMasteridentity'); $appMasteridentity = $this->getParameter('appMasteridentity');
if($appModeregistrationterme=="none"||$appMasteridentity!="SQL") if ('none' == $appModeregistrationterme || 'SQL' != $appMasteridentity) {
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
}
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canupdate($access,$data,$em); $this->canupdate($access, $data, $em);
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"update", 'mode' => 'update',
"access"=>$access, 'access' => $access,
"userid"=>$this->getUser()->getId(), 'userid' => $this->getUser()->getId(),
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"appNiveau01label"=>$this->GetParameter("appNiveau01label"), 'appNiveau01label' => $this->GetParameter('appNiveau01label'),
"appNiveau02label"=>$this->GetParameter("appNiveau02label"), 'appNiveau02use' => $this->GetParameter('appNiveau02use'),
)); 'appNiveau02label' => $this->GetParameter('appNiveau02label'),
'appNiveau03use' => $this->GetParameter('appNiveau03use'),
'appNiveau03label' => $this->GetParameter('appNiveau03label'),
'appNiveau04use' => $this->GetParameter('appNiveau04use'),
'appNiveau04label' => $this->GetParameter('appNiveau04label'),
]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -398,7 +410,7 @@ class RegistrationController extends AbstractController
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
// Sur validation // Sur validation
@ -410,7 +422,7 @@ class RegistrationController extends AbstractController
$appModeregistrationterme = $this->getParameter('appModeregistrationterme'); $appModeregistrationterme = $this->getParameter('appModeregistrationterme');
// Génération de la date de fin de validité de la clé // Génération de la date de fin de validité de la clé
$keyexpire=new \DateTime(); $keyexpire = new \DateTime();
$keyexpire->add(new \DateInterval('PT'.$appModeregistrationterme.'H')); $keyexpire->add(new \DateInterval('PT'.$appModeregistrationterme.'H'));
// Enregistrement des valeurs // Enregistrement des valeurs
@ -421,9 +433,9 @@ class RegistrationController extends AbstractController
$data->setStatut(2); $data->setStatut(2);
// Email à l'utilisateur // Email à l'utilisateur
$url = $this->generateUrl('app_registration_validation', array("key"=>$data->getKeyvalue()), UrlGeneratorInterface::ABSOLUTE_URL); $url = $this->generateUrl('app_registration_validation', ['key' => $data->getKeyvalue()], UrlGeneratorInterface::ABSOLUTE_URL);
$subject=$appname." : confirmation de validation"; $subject = $appname.' : confirmation de validation';
$body="<p>Merci de confirmer votre inscription en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url."</a></p><br><p>Attention vous disposez dun délai de 8 heures pour le faire. Passé ce délai, vous devrez vous réinscrire.</p>"; $body = "<p>Merci de confirmer votre inscription en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url.'</a></p><br><p>Attention vous disposez dun délai de 8 heures pour le faire. Passé ce délai, vous devrez vous réinscrire.</p>';
$to = $data->getEmail(); $to = $data->getEmail();
$from = $noreply; $from = $noreply;
$fromName = $appname; $fromName = $appname;
@ -433,7 +445,7 @@ class RegistrationController extends AbstractController
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
// Affichage du formulaire // Affichage du formulaire
@ -444,55 +456,56 @@ class RegistrationController extends AbstractController
$this->data => $data, $this->data => $data,
'mode' => 'update', 'mode' => 'update',
'access' => $access, 'access' => $access,
'form' => $form->createView() 'form' => $form->createView(),
]); ]);
} }
public function validation($key,Request $request,ManagerRegistry $em) public function validation($key, Request $request, ManagerRegistry $em)
{ {
$appmoderegistration = $this->getParameter('appModeregistration'); $appmoderegistration = $this->getParameter('appModeregistration');
$appMasteridentity = $this->getParameter('appMasteridentity'); $appMasteridentity = $this->getParameter('appMasteridentity');
if($appmoderegistration=="none"||$appMasteridentity!="SQL") if ('none' == $appmoderegistration || 'SQL' != $appMasteridentity) {
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
}
$now=new \DateTime(); $now = new \DateTime();
$data = $em ->getManager()->createQueryBuilder() $data = $em->getManager()->createQueryBuilder()
->select('entity') ->select('entity')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->where('entity.keyvalue= :key') ->where('entity.keyvalue= :key')
->andWhere('entity.keyexpire >= :date') ->andWhere('entity.keyexpire >= :date')
->setParameter("key", $key) ->setParameter('key', $key)
->setParameter("date", $now) ->setParameter('date', $now)
->getQuery() ->getQuery()
->getSingleResult(); ->getSingleResult();
if(!$data) { if (!$data) {
$info="Clé de validation invalide"; $info = 'Clé de validation invalide';
$mode="danger"; $mode = 'danger';
$request->getSession()->set('registrationinfo', $info); $request->getSession()->set('registrationinfo', $info);
$request->getSession()->set('registrationmode', $mode); $request->getSession()->set('registrationmode', $mode);
$request->getSession()->set('registrationredirectto', null); $request->getSession()->set('registrationredirectto', null);
} } else {
else { $url = $this->generateUrl('app_login');
$url=$this->generateUrl('app_login'); $info = "<p>Votre compte est à présent activé</p><p>Vous allez être redirigé vers la mire de connexion</p><p><a href='".$url."'>Connexion</a>";
$info="<p>Votre compte est à présent activé</p><p>Vous allez être redirigé vers la mire de connexion</p><p><a href='".$url."'>Connexion</a>"; $mode = 'success';
$mode="success";
$request->getSession()->set('registrationinfo', $info); $request->getSession()->set('registrationinfo', $info);
$request->getSession()->set('registrationmode', $mode); $request->getSession()->set('registrationmode', $mode);
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$user = new User(); $user = new User();
$user->setAvatar("noavatar.png"); $user->setAvatar('noavatar.png');
$user->setUsername($data->getUsername()); $user->setUsername($data->getUsername());
$user->setEmail($data->getEmail()); $user->setEmail($data->getEmail());
$user->setLastname($data->getLastname()); $user->setLastname($data->getLastname());
$user->setFirstname($data->getFirstname()); $user->setFirstname($data->getFirstname());
$user->setSalt($data->getSalt()); $user->setSalt($data->getSalt());
$user->setPasswordDirect($data->getPassword()); $user->setPasswordDirect($data->getPassword());
$user->setIsactive(true);
$user->setIsvisible($data->isIsvisible()); $user->setIsvisible($data->isIsvisible());
$user->setMotivation($data->getMotivation()); $user->setMotivation($data->getMotivation());
$user->setNote($data->getNote()); $user->setNote($data->getNote());
@ -500,12 +513,14 @@ class RegistrationController extends AbstractController
$user->setNiveau01($data->getNiveau01()); $user->setNiveau01($data->getNiveau01());
$user->setNiveau02($data->getNiveau02()); $user->setNiveau02($data->getNiveau02());
$user->setNiveau03($data->getNiveau03());
$user->setNiveau04($data->getNiveau04());
$user->setTelephonenumber($data->getTelephonenumber()); $user->setTelephonenumber($data->getTelephonenumber());
$user->setPostaladress($data->getPostaladress()); $user->setPostaladress($data->getPostaladress());
$user->setJob($data->getJob()); $user->setJob($data->getJob());
$user->setPosition($data->getPosition()); $user->setPosition($data->getPosition());
$user->setRoles(["ROLE_USER"]); $user->setRoles(['ROLE_USER']);
// Sauvegarde // Sauvegarde
$em->getManager()->persist($user); $em->getManager()->persist($user);
@ -519,73 +534,75 @@ class RegistrationController extends AbstractController
return $this->redirectToRoute('app_registration_info'); return $this->redirectToRoute('app_registration_info');
} }
public function delete($id, $access, Request $request, ManagerRegistry $em)
public function delete($id,$access,Request $request,ManagerRegistry $em)
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->candelete($access,$data,$em); $this->candelete($access, $data, $em);
// Tentative de suppression // Tentative de suppression
try{ try {
$em->getManager()->remove($data); $em->getManager()->remove($data);
$em->getManager()->flush(); $em->getManager()->flush();
} } catch (\Exception $e) {
catch (\Exception $e) { $request->getSession()->getFlashBag()->add('error', $e->getMessage());
$request->getSession()->getFlashBag()->add("error", $e->getMessage());
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)."_update",["id"=>$id]); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
} }
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
public function resetpwd01(Request $request,ManagerRegistry $em) public function resetpwd01(Request $request, ManagerRegistry $em)
{ {
$appmoderegistration = $this->getParameter('appModeregistration'); $appmoderegistration = $this->getParameter('appModeregistration');
$appMasteridentity = $this->getParameter('appMasteridentity'); $appMasteridentity = $this->getParameter('appMasteridentity');
if($appMasteridentity!="SQL") if ('SQL' != $appMasteridentity) {
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
}
// Création du formulaire // Création du formulaire
$form = $this->createForm(ResetpwdType::class,null,array("mode"=>"resetpwd01")); $form = $this->createForm(ResetpwdType::class, null, ['mode' => 'resetpwd01']);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
$data = $form->getData(); $data = $form->getData();
if ($form->get('submit')->isClicked()) { if ($form->get('submit')->isClicked()) {
$user=$em->getRepository("App\Entity\User")->findOneby(["email"=>$data->getEmail()]); $user = $em->getRepository("App\Entity\User")->findOneby(['email' => $data->getEmail()]);
// On s'assure que le mail existe dans la base des utilisateurs // On s'assure que le mail existe dans la base des utilisateurs
if(!$user) { if (!$user) {
$request->getSession()->getFlashBag()->add("error", 'Mail inconnu'); $request->getSession()->getFlashBag()->add('error', 'Mail inconnu');
// Affichage du formulaire // Affichage du formulaire
dump("here"); dump('here');
return $this->render($this->twig.'resetpwd01.html.twig', [ return $this->render($this->twig.'resetpwd01.html.twig', [
'useheader' => true, 'useheader' => true,
'usemenu' => false, 'usemenu' => false,
'usesidebar' => false, 'usesidebar' => false,
'maxsize' => 1200, 'maxsize' => 1200,
'form' => $form->createView() 'form' => $form->createView(),
]); ]);
} }
} }
// Sur validation // Sur validation
if ($form->get('submit')->isClicked()) { if ($form->get('submit')->isClicked()) {
$user=$em->getRepository("App\Entity\User")->findOneby(["email"=>$data->getEmail()]); $user = $em->getRepository("App\Entity\User")->findOneby(['email' => $data->getEmail()]);
$appname = $request->getSession()->get('appname'); $appname = $request->getSession()->get('appname');
$noreply = $this->getParameter('appMailnoreply'); $noreply = $this->getParameter('appMailnoreply');
$appModeregistrationterme = $this->getParameter('appModeregistrationterme'); $appModeregistrationterme = $this->getParameter('appModeregistrationterme');
// Génération de la date de fin de validité de la clé // Génération de la date de fin de validité de la clé
$keyexpire=new \DateTime(); $keyexpire = new \DateTime();
$keyexpire->add(new \DateInterval('PT'.$appModeregistrationterme.'H')); $keyexpire->add(new \DateInterval('PT'.$appModeregistrationterme.'H'));
// Enregistrement des valeurs // Enregistrement des valeurs
@ -596,17 +613,17 @@ class RegistrationController extends AbstractController
$em->getManager()->flush(); $em->getManager()->flush();
// Email au user // Email au user
$url = $this->generateUrl('app_resetpwd02', array("key"=>$user->getKeyvalue()), UrlGeneratorInterface::ABSOLUTE_URL); $url = $this->generateUrl('app_resetpwd02', ['key' => $user->getKeyvalue()], UrlGeneratorInterface::ABSOLUTE_URL);
$subject=$appname." : réinitialisation mot de passe"; $subject = $appname.' : réinitialisation mot de passe';
$body="<p>Merci de réinitialiser votre mot de passe en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url."</a></p><br><p>Attention vous disposez dun délai de ".$appModeregistrationterme." heures pour le faire.</p><p>Vous pourrez par la suite vous connecter avec votre login : ".$user->getUsername()."</p>"; $body = "<p>Merci de réinitialiser votre mot de passe en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url.'</a></p><br><p>Attention vous disposez dun délai de '.$appModeregistrationterme.' heures pour le faire.</p><p>Vous pourrez par la suite vous connecter avec votre login : '.$user->getUsername().'</p>';
$to = $user->getEmail(); $to = $user->getEmail();
$from = $noreply; $from = $noreply;
$fromName = $appname; $fromName = $appname;
$this->mail->sendEmail($subject, $body, $to, $from, $fromName); $this->mail->sendEmail($subject, $body, $to, $from, $fromName);
// Info // Info
$info="Vous allez recevoir un mail avec lien qui vous permettra de réinitialiser votre mot de passe"; $info = 'Vous allez recevoir un mail avec lien qui vous permettra de réinitialiser votre mot de passe';
$mode="info"; $mode = 'info';
$request->getSession()->set('registrationinfo', $info); $request->getSession()->set('registrationinfo', $info);
$request->getSession()->set('registrationmode', $mode); $request->getSession()->set('registrationmode', $mode);
$request->getSession()->set('registrationredirectto', null); $request->getSession()->set('registrationredirectto', null);
@ -620,39 +637,40 @@ class RegistrationController extends AbstractController
'usemenu' => false, 'usemenu' => false,
'usesidebar' => false, 'usesidebar' => false,
'maxsize' => 1200, 'maxsize' => 1200,
'form' => $form->createView() 'form' => $form->createView(),
]); ]);
} }
public function resetpwd02($key,Request $request,ManagerRegistry $em) public function resetpwd02($key, Request $request, ManagerRegistry $em)
{ {
$appMasteridentity = $this->getParameter('appMasteridentity'); $appMasteridentity = $this->getParameter('appMasteridentity');
if($appMasteridentity!="SQL") if ('SQL' != $appMasteridentity) {
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
}
$now=new \DateTime(); $now = new \DateTime();
$user = $em ->getManager()->createQueryBuilder() $user = $em->getManager()->createQueryBuilder()
->select('table') ->select('table')
->from("App:User",'table') ->from('App:User', 'table')
->where('table.keyvalue= :key') ->where('table.keyvalue= :key')
->andWhere('table.keyexpire >= :date') ->andWhere('table.keyexpire >= :date')
->setParameter("key", $key) ->setParameter('key', $key)
->setParameter("date", $now) ->setParameter('date', $now)
->getQuery() ->getQuery()
->getSingleResult(); ->getSingleResult();
if(!$user) { if (!$user) {
$info="Clé de validation invalide"; $info = 'Clé de validation invalide';
$mode="danger"; $mode = 'danger';
$request->getSession()->set('registrationinfo', $info); $request->getSession()->set('registrationinfo', $info);
$request->getSession()->set('registrationmode', $mode); $request->getSession()->set('registrationmode', $mode);
$request->getSession()->set('registrationredirectto', null); $request->getSession()->set('registrationredirectto', null);
return $this->redirectToRoute('app_registration_info'); return $this->redirectToRoute('app_registration_info');
} } else {
else {
// Création du formulaire // Création du formulaire
$form = $this->createForm(ResetpwdType::class,$user,array("mode"=>"resetpwd02")); $form = $this->createForm(ResetpwdType::class, $user, ['mode' => 'resetpwd02']);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -666,12 +684,13 @@ class RegistrationController extends AbstractController
// Sauvegarde // Sauvegarde
$em->getManager()->flush(); $em->getManager()->flush();
$url=$this->generateUrl('app_login'); $url = $this->generateUrl('app_login');
$info="<p>Nouveau mot de passe prise en compte</p><p>Vous allez être redirigé vers la mire de connexion</p><p><a href='".$url."'>Connexion</a>"; $info = "<p>Nouveau mot de passe prise en compte</p><p>Vous allez être redirigé vers la mire de connexion</p><p><a href='".$url."'>Connexion</a>";
$mode="success"; $mode = 'success';
$request->getSession()->set('registrationinfo', $info); $request->getSession()->set('registrationinfo', $info);
$request->getSession()->set('registrationmode', $mode); $request->getSession()->set('registrationmode', $mode);
$request->getSession()->set('registrationredirectto', null); $request->getSession()->set('registrationredirectto', null);
return $this->redirectToRoute('app_registration_info'); return $this->redirectToRoute('app_registration_info');
} }
@ -681,57 +700,67 @@ class RegistrationController extends AbstractController
'usemenu' => false, 'usemenu' => false,
'usesidebar' => false, 'usesidebar' => false,
'maxsize' => 1200, 'maxsize' => 1200,
'form' => $form->createView() 'form' => $form->createView(),
]); ]);
} }
} }
private function canupdate($access,$entity,$em) { private function canupdate($access, $entity, $em)
switch($access) { {
case "admin" : return true; break; switch ($access) {
case "modo" : case 'admin': return true;
$usermodo=$em->getRepository("App\Entity\UserModo")->findOneBy(["user"=>$this->getUser(),"niveau01"=>$entity->getNiveau01()]); break;
if(!$usermodo) throw $this->createAccessDeniedException('Permission denied'); case 'modo':
$usermodo = $em->getRepository("App\Entity\UserModo")->findOneBy(['user' => $this->getUser(), 'niveau01' => $entity->getNiveau01()]);
if (!$usermodo) {
throw $this->createAccessDeniedException('Permission denied');
}
return true; return true;
break; break;
} }
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
} }
private function candelete($access,$entity,$em) { private function candelete($access, $entity, $em)
switch($access) { {
case "admin" : return true; break; switch ($access) {
case "modo" : case 'admin': return true;
$usermodo=$em->getRepository("App\Entity\UserModo")->findOneBy(["user"=>$this->getUser(),"niveau01"=>$entity->getNiveau01()]); break;
if(!$usermodo) throw $this->createAccessDeniedException('Permission denied'); case 'modo':
$usermodo = $em->getRepository("App\Entity\UserModo")->findOneBy(['user' => $this->getUser(), 'niveau01' => $entity->getNiveau01()]);
if (!$usermodo) {
throw $this->createAccessDeniedException('Permission denied');
}
return true; return true;
break; break;
} }
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
} }
protected function getErrorForm($id,$form,$request,$data,$mode,$idstatut,$em) { protected function getErrorForm($id, $form, $request, $data, $mode, $idstatut, $em)
if ($form->get('submit')->isClicked() && $mode=="submit") { {
if ($form->get('submit')->isClicked() && 'submit' == $mode) {
// Si validation par administrateur demander une motivation // Si validation par administrateur demander une motivation
$appmoderegistration = $this->getParameter('appModeregistration'); $appmoderegistration = $this->getParameter('appModeregistration');
if(is_null($data->getMotivation())&&$appmoderegistration=="BYADMIN") { if (is_null($data->getMotivation()) && 'BYADMIN' == $appmoderegistration) {
// On recherche le domaine du mail dans la liste blanche // On recherche le domaine du mail dans la liste blanche
$email=explode("@",$data->getEmail()); $email = explode('@', $data->getEmail());
$domaine=end($email); $domaine = end($email);
$whitelist = $em->getManager()->getRepository("App\Entity\Whitelist")->findBy(["label"=>$domaine]); $whitelist = $em->getManager()->getRepository("App\Entity\Whitelist")->findBy(['label' => $domaine]);
if(!$whitelist) if (!$whitelist) {
$form->addError(new FormError("Attention, le suffixe de votre adresse mail nest pas dans la liste des administrations autorisées, merci de bien vouloir privilégier votre adresse professionnelle si vous en avez une.<br>Si ce nest pas le cas, il faut que vous renseigniez la case motivation de votre demande")); $form->addError(new FormError('Attention, le suffixe de votre adresse mail nest pas dans la liste des administrations autorisées, merci de bien vouloir privilégier votre adresse professionnelle si vous en avez une.<br>Si ce nest pas le cas, il faut que vous renseigniez la case motivation de votre demande'));
}
} }
} }
if ($form->get('submit')->isClicked() && !$form->isValid()) { if ($form->get('submit')->isClicked() && !$form->isValid()) {
$errors = $form->getErrors(); $errors = $form->getErrors();
foreach( $errors as $error ) { foreach ($errors as $error) {
$request->getSession()->getFlashBag()->add("error", $error->getMessage()); $request->getSession()->getFlashBag()->add('error', $error->getMessage());
$request->getSession()->getFlashBag()->add("error", $error->getMessage()); $request->getSession()->getFlashBag()->add('error', $error->getMessage());
} }
} }
} }
} }

View File

@ -2,20 +2,19 @@
namespace App\Controller; namespace App\Controller;
use Doctrine\Persistence\ManagerRegistry;
use FOS\RestBundle\Controller\AbstractFOSRestController; use FOS\RestBundle\Controller\AbstractFOSRestController;
use Symfony\Component\HttpFoundation\Request;
use FOS\RestBundle\Controller\Annotations as FOSRest; use FOS\RestBundle\Controller\Annotations as FOSRest;
use OpenApi\Annotations as OA; use OpenApi\Annotations as OA;
use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\HttpFoundation\Request;
class RestController extends AbstractFOSRestController class RestController extends AbstractFOSRestController
{ {
private $output=[]; private $output = [];
private $cpt; private $cpt;
/** /**
* getAllUsers * getAllUsers.
*
* *
* @FOSRest\Get("/rest/getAllUsers") * @FOSRest\Get("/rest/getAllUsers")
* @OA\Response( * @OA\Response(
@ -31,33 +30,31 @@ class RestController extends AbstractFOSRestController
* @OA\Schema(type="string") * @OA\Schema(type="string")
* ) * )
*/ */
public function getAllUsers(Request $request, ManagerRegistry $em)
{
public function getAllUsers(Request $request,ManagerRegistry $em) {
set_time_limit(0); set_time_limit(0);
ini_set('memory_limit', '1024M'); ini_set('memory_limit', '1024M');
// Récupération des parametres // Récupération des parametres
if(!$this->iskey($request->headers->get("key"))) { if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view("API Key inconnue", 403); $view = $this->view('API Key inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output = []; $output = [];
$users=$em->getRepository("App\Entity\User")->findAll(); $users = $em->getRepository("App\Entity\User")->findAll();
foreach($users as $user) { foreach ($users as $user) {
array_push($output,$this->userFormat($user)); array_push($output, $this->userFormat($user));
} }
$view = $this->view($output, 200); $view = $this->view($output, 200);
return $this->handleView($view); return $this->handleView($view);
} }
/** /**
* getOneUser * getOneUser.
*
* *
* @FOSRest\Get("/rest/getOneUser") * @FOSRest\Get("/rest/getOneUser")
* @OA\Response( * @OA\Response(
@ -80,34 +77,34 @@ class RestController extends AbstractFOSRestController
* @OA\Schema(type="string") * @OA\Schema(type="string")
* ) * )
*/ */
public function getOneUser(Request $request, ManagerRegistry $em)
{
public function getOneUser(Request $request,ManagerRegistry $em) {
set_time_limit(0); set_time_limit(0);
ini_set('memory_limit', '1024M'); ini_set('memory_limit', '1024M');
// Récupération des parametres // Récupération des parametres
if(!$this->iskey($request->headers->get("key"))) { if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view("API Key inconnue", 403); $view = $this->view('API Key inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output = []; $output = [];
$user=$em->getRepository("App\Entity\User")->findOneBy(["username"=>$request->headers->get("login")]); $user = $em->getRepository("App\Entity\User")->findOneBy(['username' => $request->headers->get('login')]);
if(!$user) { if (!$user) {
$view = $this->view("Utilisateur inconnue", 403); $view = $this->view('Utilisateur inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output=$this->userFormat($user); $output = $this->userFormat($user);
$view = $this->view($output, 200); $view = $this->view($output, 200);
return $this->handleView($view); return $this->handleView($view);
} }
/** /**
* getAllNiveau01s * getAllNiveau01s.
*
* *
* @FOSRest\Get("/rest/getAllNiveau01s") * @FOSRest\Get("/rest/getAllNiveau01s")
* @OA\Response( * @OA\Response(
@ -123,32 +120,31 @@ class RestController extends AbstractFOSRestController
* @OA\Schema(type="string") * @OA\Schema(type="string")
* ) * )
*/ */
public function getAllNiveau01s(Request $request, ManagerRegistry $em)
{
public function getAllNiveau01s(Request $request,ManagerRegistry $em) {
set_time_limit(0); set_time_limit(0);
ini_set('memory_limit', '1024M'); ini_set('memory_limit', '1024M');
// Récupération des parametres // Récupération des parametres
if(!$this->iskey($request->headers->get("key"))) { if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view("API Key inconnue", 403); $view = $this->view('API Key inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output = []; $output = [];
$niveau01s=$em->getRepository("App\Entity\Niveau01")->findAll(); $niveau01s = $em->getRepository("App\Entity\Niveau01")->findAll();
foreach($niveau01s as $niveau01) { foreach ($niveau01s as $niveau01) {
array_push($output,$this->niveau01Format($niveau01,true)); array_push($output, $this->niveau01Format($niveau01, true));
} }
$view = $this->view($output, 200); $view = $this->view($output, 200);
return $this->handleView($view); return $this->handleView($view);
} }
/** /**
* getOneNiveau01 * getOneNiveau01.
*
* *
* @FOSRest\Get("/rest/getOneNiveau01") * @FOSRest\Get("/rest/getOneNiveau01")
* @OA\Response( * @OA\Response(
@ -171,34 +167,34 @@ class RestController extends AbstractFOSRestController
* @OA\Schema(type="string") * @OA\Schema(type="string")
* ) * )
*/ */
public function getOneNiveau01(Request $request, ManagerRegistry $em)
{
public function getOneNiveau01(Request $request,ManagerRegistry $em) {
set_time_limit(0); set_time_limit(0);
ini_set('memory_limit', '1024M'); ini_set('memory_limit', '1024M');
// Récupération des parametres // Récupération des parametres
if(!$this->iskey($request->headers->get("key"))) { if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view("API Key inconnue", 403); $view = $this->view('API Key inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output = []; $output = [];
$niveau01=$em->getRepository("App\Entity\Niveau01")->findOneBy(["label"=>$request->headers->get("label")]); $niveau01 = $em->getRepository("App\Entity\Niveau01")->findOneBy(['label' => $request->headers->get('label')]);
if(!$niveau01) { if (!$niveau01) {
$view = $this->view("Niveau01 inconnu", 403); $view = $this->view('Niveau01 inconnu', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output=$this->niveau01Format($niveau01,true); $output = $this->niveau01Format($niveau01, true);
$view = $this->view($output, 200); $view = $this->view($output, 200);
return $this->handleView($view); return $this->handleView($view);
} }
/** /**
* getAllNiveau02s * getAllNiveau02s.
*
* *
* @FOSRest\Get("/rest/getAllNiveau02s") * @FOSRest\Get("/rest/getAllNiveau02s")
* @OA\Response( * @OA\Response(
@ -214,32 +210,31 @@ class RestController extends AbstractFOSRestController
* @OA\Schema(type="string") * @OA\Schema(type="string")
* ) * )
*/ */
public function getAllNiveau02s(Request $request, ManagerRegistry $em)
{
public function getAllNiveau02s(Request $request,ManagerRegistry $em) {
set_time_limit(0); set_time_limit(0);
ini_set('memory_limit', '1024M'); ini_set('memory_limit', '1024M');
// Récupération des parametres // Récupération des parametres
if(!$this->iskey($request->headers->get("key"))) { if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view("API Key inconnue", 403); $view = $this->view('API Key inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output = []; $output = [];
$niveau02s=$em->getRepository("App\Entity\Niveau02")->findAll(); $niveau02s = $em->getRepository("App\Entity\Niveau02")->findAll();
foreach($niveau02s as $niveau02) { foreach ($niveau02s as $niveau02) {
array_push($output,$this->niveau02Format($niveau02,true)); array_push($output, $this->niveau02Format($niveau02, true));
} }
$view = $this->view($output, 200); $view = $this->view($output, 200);
return $this->handleView($view); return $this->handleView($view);
} }
/** /**
* getOneNiveau02 * getOneNiveau02.
*
* *
* @FOSRest\Get("/rest/getOneNiveau02") * @FOSRest\Get("/rest/getOneNiveau02")
* @OA\Response( * @OA\Response(
@ -262,34 +257,214 @@ class RestController extends AbstractFOSRestController
* @OA\Schema(type="string") * @OA\Schema(type="string")
* ) * )
*/ */
public function getOneNiveau02(Request $request, ManagerRegistry $em)
{
public function getOneNiveau02(Request $request,ManagerRegistry $em) {
set_time_limit(0); set_time_limit(0);
ini_set('memory_limit', '1024M'); ini_set('memory_limit', '1024M');
// Récupération des parametres // Récupération des parametres
if(!$this->iskey($request->headers->get("key"))) { if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view("API Key inconnue", 403); $view = $this->view('API Key inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output = []; $output = [];
$niveau02=$em->getRepository("App\Entity\Niveau02")->findOneBy(["label"=>$request->headers->get("label")]); $niveau02 = $em->getRepository("App\Entity\Niveau02")->findOneBy(['label' => $request->headers->get('label')]);
if(!$niveau02) { if (!$niveau02) {
$view = $this->view("Niveau02 inconnu", 403); $view = $this->view('Niveau02 inconnu', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output=$this->niveau02Format($niveau02,true); $output = $this->niveau02Format($niveau02, true);
$view = $this->view($output, 200); $view = $this->view($output, 200);
return $this->handleView($view); return $this->handleView($view);
} }
/** /**
* getAllGroups * getAllNiveau03s.
* *
* @FOSRest\Get("/rest/getAllNiveau03s")
* @OA\Response(
* response=200,
* description="get all niveau03"
* )
* )
* @OA\Parameter(
* name="key",
* in="header",
* required=true,
* description="APIKey",
* @OA\Schema(type="string")
* )
*/
public function getAllNiveau03s(Request $request, ManagerRegistry $em)
{
set_time_limit(0);
ini_set('memory_limit', '1024M');
// Récupération des parametres
if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view('API Key inconnue', 403);
return $this->handleView($view);
}
$output = [];
$niveau03s = $em->getRepository("App\Entity\Niveau03")->findAll();
foreach ($niveau03s as $niveau03) {
array_push($output, $this->niveau03Format($niveau03, true));
}
$view = $this->view($output, 200);
return $this->handleView($view);
}
/**
* getOneNiveau03.
*
* @FOSRest\Get("/rest/getOneNiveau03")
* @OA\Response(
* response=200,
* description="get one niveau03 by label"
* )
* )
* @OA\Parameter(
* name="key",
* in="header",
* required=true,
* description="APIKey",
* @OA\Schema(type="string")
* )
* @OA\Parameter(
* name="label",
* in="header",
* required=true,
* description="Label",
* @OA\Schema(type="string")
* )
*/
public function getOneNiveau03(Request $request, ManagerRegistry $em)
{
set_time_limit(0);
ini_set('memory_limit', '1024M');
// Récupération des parametres
if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view('API Key inconnue', 403);
return $this->handleView($view);
}
$output = [];
$niveau03 = $em->getRepository("App\Entity\Niveau03")->findOneBy(['label' => $request->headers->get('label')]);
if (!$niveau03) {
$view = $this->view('Niveau03 inconnu', 403);
return $this->handleView($view);
}
$output = $this->niveau03Format($niveau03, true);
$view = $this->view($output, 200);
return $this->handleView($view);
}
/**
* getAllNiveau04s.
*
* @FOSRest\Get("/rest/getAllNiveau04s")
* @OA\Response(
* response=200,
* description="get all niveau04"
* )
* )
* @OA\Parameter(
* name="key",
* in="header",
* required=true,
* description="APIKey",
* @OA\Schema(type="string")
* )
*/
public function getAllNiveau04s(Request $request, ManagerRegistry $em)
{
set_time_limit(0);
ini_set('memory_limit', '1024M');
// Récupération des parametres
if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view('API Key inconnue', 403);
return $this->handleView($view);
}
$output = [];
$niveau04s = $em->getRepository("App\Entity\Niveau04")->findAll();
foreach ($niveau04s as $niveau04) {
array_push($output, $this->niveau04Format($niveau04, true));
}
$view = $this->view($output, 200);
return $this->handleView($view);
}
/**
* getOneNiveau04.
*
* @FOSRest\Get("/rest/getOneNiveau04")
* @OA\Response(
* response=200,
* description="get one niveau04 by label"
* )
* )
* @OA\Parameter(
* name="key",
* in="header",
* required=true,
* description="APIKey",
* @OA\Schema(type="string")
* )
* @OA\Parameter(
* name="label",
* in="header",
* required=true,
* description="Label",
* @OA\Schema(type="string")
* )
*/
public function getOneNiveau04(Request $request, ManagerRegistry $em)
{
set_time_limit(0);
ini_set('memory_limit', '1024M');
// Récupération des parametres
if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view('API Key inconnue', 403);
return $this->handleView($view);
}
$output = [];
$niveau04 = $em->getRepository("App\Entity\Niveau04")->findOneBy(['label' => $request->headers->get('label')]);
if (!$niveau04) {
$view = $this->view('Niveau04 inconnu', 403);
return $this->handleView($view);
}
$output = $this->niveau04Format($niveau04, true);
$view = $this->view($output, 200);
return $this->handleView($view);
}
/**
* getAllGroups.
* *
* @FOSRest\Get("/rest/getAllGroups") * @FOSRest\Get("/rest/getAllGroups")
* @OA\Response( * @OA\Response(
@ -305,33 +480,34 @@ class RestController extends AbstractFOSRestController
* @OA\Schema(type="string") * @OA\Schema(type="string")
* ) * )
*/ */
public function getAllGroups(Request $request, ManagerRegistry $em)
{
public function getAllGroups(Request $request,ManagerRegistry $em) {
set_time_limit(0); set_time_limit(0);
ini_set('memory_limit', '1024M'); ini_set('memory_limit', '1024M');
// Récupération des parametres // Récupération des parametres
if(!$this->iskey($request->headers->get("key"))) { if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view("API Key inconnue", 403); $view = $this->view('API Key inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output = []; $output = [];
$groups=$em->getRepository("App\Entity\Group")->findAll(); $groups = $em->getRepository("App\Entity\Group")->findAll();
foreach($groups as $group) { foreach ($groups as $group) {
if($group->getId()<0) continue; if ($group->getId() < 0) {
array_push($output,$this->groupFormat($group,true)); continue;
}
array_push($output, $this->groupFormat($group, true));
} }
$view = $this->view($output, 200); $view = $this->view($output, 200);
return $this->handleView($view); return $this->handleView($view);
} }
/** /**
* getOneGroup * getOneGroup.
*
* *
* @FOSRest\Get("/rest/getOneGroup") * @FOSRest\Get("/rest/getOneGroup")
* @OA\Response( * @OA\Response(
@ -354,114 +530,182 @@ class RestController extends AbstractFOSRestController
* @OA\Schema(type="string") * @OA\Schema(type="string")
* ) * )
*/ */
public function getOneGroup(Request $request, ManagerRegistry $em)
{
public function getOneGroup(Request $request,ManagerRegistry $em) {
set_time_limit(0); set_time_limit(0);
ini_set('memory_limit', '1024M'); ini_set('memory_limit', '1024M');
// Récupération des parametres // Récupération des parametres
if(!$this->iskey($request->headers->get("key"))) { if (!$this->iskey($request->headers->get('key'))) {
$view = $this->view("API Key inconnue", 403); $view = $this->view('API Key inconnue', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output = []; $output = [];
$group=$em->getRepository("App\Entity\Group")->findOneBy(["label"=>$request->headers->get("label")]); $group = $em->getRepository("App\Entity\Group")->findOneBy(['label' => $request->headers->get('label')]);
if(!$group) { if (!$group) {
$view = $this->view("Group inconnu", 403); $view = $this->view('Group inconnu', 403);
return $this->handleView($view); return $this->handleView($view);
} }
$output=$this->groupFormat($group,true); $output = $this->groupFormat($group, true);
$view = $this->view($output, 200); $view = $this->view($output, 200);
return $this->handleView($view); return $this->handleView($view);
} }
private function iskey($key)
{
return $key == $this->getParameter('appSecret');
private function iskey($key) {
return ($key==$this->getParameter("appSecret"));
} }
private function userFormat($user) { private function userFormat($user)
$output=[]; {
$output = [];
$output["userid"]=$user->getId(); $output['userid'] = $user->getId();
$output["userlogin"]=$user->getUsername(); $output['userlogin'] = $user->getUsername();
$output["userlastname"]=$user->getLastname(); $output['userlastname'] = $user->getLastname();
$output["userfirstname"]=$user->getFirstname(); $output['userfirstname'] = $user->getFirstname();
$output["useremail"]=$user->getEmail(); $output['useremail'] = $user->getEmail();
$output["userjob"]=$user->getJob(); $output['userjob'] = $user->getJob();
$output["userposition"]=$user->getPosition(); $output['userposition'] = $user->getPosition();
$output["userpostaladress"]=$user->getPostaladress(); $output['userpostaladress'] = $user->getPostaladress();
$output["usertelephonenumber"]=$user->getTelephonenumber(); $output['usertelephonenumber'] = $user->getTelephonenumber();
$output["useravatar"]="https://".str_replace("//","/",$this->getParameter("appWeburl").$this->getParameter("appAlias").$this->generateUrl('app_minio_image',["file"=>"avatar/".$user->getAvatar()],true)); $output['useravatar'] = 'https://'.str_replace('//', '/', $this->getParameter('appWeburl').$this->getParameter('appAlias').$this->generateUrl('app_minio_image', ['file' => 'avatar/'.$user->getAvatar()], true));
$output["userniveau01"]=$this->niveau01Format($user->getNiveau01()); $output['userniveau01'] = $this->niveau01Format($user->getNiveau01());
$output["userniveau02"]=$this->niveau02Format($user->getNiveau02()); $output['userniveau02'] = $this->niveau02Format($user->getNiveau02());
$output["usergroups"]=[]; $output['userniveau03'] = $this->niveau03Format($user->getNiveau03());
foreach($user->getGroups() as $usergroup) { $output['userniveau04'] = $this->niveau03Format($user->getNiveau04());
$groupFormat=$this->groupFormat($usergroup->getGroup()); $output['usergroups'] = [];
if($groupFormat) array_push($output["usergroups"],$groupFormat); foreach ($user->getGroups() as $usergroup) {
$groupFormat = $this->groupFormat($usergroup->getGroup());
if ($groupFormat) {
array_push($output['usergroups'], $groupFormat);
} }
if(empty($output["usergroups"])) $output["usergroups"]=null;
return $output;
} }
if (empty($output['usergroups'])) {
private function niveau01Format($niveau01,$withmembers=false){ $output['usergroups'] = null;
if(!$niveau01) return null;
$output=[];
$output["niveau01id"]=$niveau01->getId();
$output["niveau01label"]=$niveau01->getLabel();
if($withmembers) {
$output["niveau01users"]=[];
foreach($niveau01->getUsers() as $user) {
array_push($output["niveau01users"],["userid"=>$user->getId(),"userlogin"=>$user->getUsername()]);
}
if(empty($output["niveau01users"])) $output["niveau01users"]=null;
} }
return $output; return $output;
} }
private function niveau02Format($niveau02,$withmembers=false){ private function niveau01Format($niveau01, $withmembers = false)
if(!$niveau02) return null; {
$output=[]; if (!$niveau01) {
$output["niveau02id"]=$niveau02->getId(); return null;
$output["niveau02label"]=$niveau02->getLabel(); }
$output = [];
if($withmembers) { $output['niveau01id'] = $niveau01->getId();
$output["niveau02niveau01"]=$this->niveau01Format($niveau02->getNiveau01()); $output['niveau01label'] = $niveau01->getLabel();
$output["niveau02users"]=[];
foreach($niveau02->getUsers() as $user) { if ($withmembers) {
array_push($output["niveau02users"],["userid"=>$user->getId(),"userlogin"=>$user->getUsername()]); $output['niveau01users'] = [];
foreach ($niveau01->getUsers() as $user) {
array_push($output['niveau01users'], ['userid' => $user->getId(), 'userlogin' => $user->getUsername()]);
}
if (empty($output['niveau01users'])) {
$output['niveau01users'] = null;
} }
if(empty($output["niveau02users"])) $output["niveau02users"]=null;
} }
return $output; return $output;
} }
private function groupFormat($group,$withmembers=false){ private function niveau02Format($niveau02, $withmembers = false)
if(!$group||$group->getId()<0) return null; {
$output=[]; if (!$niveau02) {
$output["groupid"]=$group->getId(); return null;
$output["grouplabel"]=$group->getLabel(); }
$output = [];
if($withmembers) { $output['niveau02id'] = $niveau02->getId();
$output["groupusers"]=[]; $output['niveau02label'] = $niveau02->getLabel();
foreach($group->getUsers() as $usergroup) {
array_push($output["groupusers"],["userid"=>$usergroup->getUser()->getId(),"userlogin"=>$usergroup->getUser()->getUsername()]); if ($withmembers) {
$output['niveau02niveau01'] = $this->niveau01Format($niveau02->getNiveau01());
$output['niveau02users'] = [];
foreach ($niveau02->getUsers() as $user) {
array_push($output['niveau02users'], ['userid' => $user->getId(), 'userlogin' => $user->getUsername()]);
}
if (empty($output['niveau02users'])) {
$output['niveau02users'] = null;
}
}
return $output;
}
private function niveau03Format($niveau03, $withmembers = false)
{
if (!$niveau03) {
return null;
}
$output = [];
$output['niveau03id'] = $niveau03->getId();
$output['niveau03label'] = $niveau03->getLabel();
if ($withmembers) {
$output['niveau03niveau01'] = $this->niveau01Format($niveau03->getNiveau02()->getNiveau01());
$output['niveau03niveau02'] = $this->niveau02Format($niveau03->getNiveau02());
$output['niveau03users'] = [];
foreach ($niveau03->getUsers() as $user) {
array_push($output['niveau03users'], ['userid' => $user->getId(), 'userlogin' => $user->getUsername()]);
}
if (empty($output['niveau03users'])) {
$output['niveau03users'] = null;
}
}
return $output;
}
private function niveau04Format($niveau04, $withmembers = false)
{
if (!$niveau04) {
return null;
}
$output = [];
$output['niveau04id'] = $niveau04->getId();
$output['niveau04label'] = $niveau04->getLabel();
if ($withmembers) {
$output['niveau04niveau01'] = $this->niveau01Format($niveau04->getNiveau03()->getNiveau02()->getNiveau01());
$output['niveau04niveau02'] = $this->niveau02Format($niveau04->getNiveau03()->getNiveau02());
$output['niveau04niveau03'] = $this->niveau02Format($niveau04->getNiveau03());
$output['niveau04users'] = [];
foreach ($niveau04->getUsers() as $user) {
array_push($output['niveau04users'], ['userid' => $user->getId(), 'userlogin' => $user->getUsername()]);
}
if (empty($output['niveau04users'])) {
$output['niveau04users'] = null;
}
}
return $output;
}
private function groupFormat($group, $withmembers = false)
{
if (!$group || $group->getId() < 0) {
return null;
}
$output = [];
$output['groupid'] = $group->getId();
$output['grouplabel'] = $group->getLabel();
if ($withmembers) {
$output['groupusers'] = [];
foreach ($group->getUsers() as $usergroup) {
array_push($output['groupusers'], ['userid' => $usergroup->getUser()->getId(), 'userlogin' => $usergroup->getUser()->getUsername()]);
}
if (empty($output['groupusers'])) {
$output['groupusers'] = null;
} }
if(empty($output["groupusers"])) $output["groupusers"]=null;
} }
return $output; return $output;
} }
} }

View File

@ -2,24 +2,23 @@
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Ramsey\Uuid\Uuid;
use App\Entity\User;
use App\Entity\Niveau01;
use App\Entity\Group; use App\Entity\Group;
use App\Entity\Niveau01;
use App\Entity\User;
use App\Form\LoginType; use App\Form\LoginType;
use App\Service\LdapService;
use App\Service\ApiService; use App\Service\ApiService;
use App\Service\LdapService;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
class SecurityController extends AbstractController class SecurityController extends AbstractController
{ {
@ -38,56 +37,55 @@ class SecurityController extends AbstractController
public function noperm(Request $request) public function noperm(Request $request)
{ {
return $this->render('Home/noperm.html.twig',[ return $this->render('Home/noperm.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
]); ]);
} }
public function login(Request $request, AuthenticationUtils $authenticationUtils,ManagerRegistry $em) public function login(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
{ {
switch($this->getParameter("appAuth")) { switch ($this->getParameter('appAuth')) {
case "SQL": case 'SQL':
return $this->loginSQL($request,$authenticationUtils,$em); return $this->loginSQL($request, $authenticationUtils, $em);
break; break;
case "CAS": case 'CAS':
return $this->loginCAS($request,$authenticationUtils,$em); return $this->loginCAS($request, $authenticationUtils, $em);
break; break;
case "LDAP": case 'LDAP':
return $this->loginLDAP($request,$authenticationUtils,$em); return $this->loginLDAP($request, $authenticationUtils, $em);
break; break;
case "OPENID": case 'OPENID':
return $this->loginOPENID($request,$authenticationUtils,$em); return $this->loginOPENID($request, $authenticationUtils, $em);
break; break;
} }
} }
public function loginSQL(Request $request, AuthenticationUtils $authenticationUtils) public function loginSQL(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
{ {
return $this->render('Home/loginSQL.html.twig', array( return $this->render('Home/loginSQL.html.twig', [
'last_username' => $authenticationUtils->getLastUsername(), 'last_username' => $authenticationUtils->getLastUsername(),
'error' => $authenticationUtils->getLastAuthenticationError(), 'error' => $authenticationUtils->getLastAuthenticationError(),
)); ]);
} }
public function loginCAS(Request $request, AuthenticationUtils $authenticationUtils,ManagerRegistry $em) public function loginCAS(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
{ {
// Récupération de la cible de navigation // Récupération de la cible de navigation
$redirect = $request->getSession()->get("_security.main.target_path"); $redirect = $request->getSession()->get('_security.main.target_path');
// Masteridentity // Masteridentity
$appMasteridentity=$this->getParameter("appMasteridentity"); $appMasteridentity = $this->getParameter('appMasteridentity');
// Init Client CAS // Init Client CAS
$alias=$this->getParameter('appAlias'); $alias = $this->getParameter('appAlias');
\phpCAS::setDebug($this->appKernel->getProjectDir()."/var/log/cas.log"); \phpCAS::setDebug($this->appKernel->getProjectDir().'/var/log/cas.log');
\phpCAS::client(CAS_VERSION_2_0, $this->getParameter('casHost'), intval($this->getParameter('casPort')), is_null($this->getParameter('casPath')) ? '' : $this->getParameter('casPath'), false); \phpCAS::client(CAS_VERSION_2_0, $this->getParameter('casHost'), intval($this->getParameter('casPort')), is_null($this->getParameter('casPath')) ? '' : $this->getParameter('casPath'), false);
\phpCAS::setNoCasServerValidation(); \phpCAS::setNoCasServerValidation();
// Authentification // Authentification
\phpCAS::forceAuthentication(); \phpCAS::forceAuthentication();
@ -100,50 +98,57 @@ class SecurityController extends AbstractController
// Init // Init
$email = "$username@nomail.fr"; $email = "$username@nomail.fr";
$lastname = $username; $lastname = $username;
$firstname = " "; $firstname = ' ';
$avatar="noavatar.png"; $avatar = 'noavatar.png';
// Rechercher l'utilisateur // Rechercher l'utilisateur
if(isset($attributes[$this->getParameter('casUsername')])) if (isset($attributes[$this->getParameter('casUsername')])) {
$username = $attributes[$this->getParameter('casUsername')]; $username = $attributes[$this->getParameter('casUsername')];
}
if(isset($attributes[$this->getParameter('casEmail')])) if (isset($attributes[$this->getParameter('casEmail')])) {
$email = $attributes[$this->getParameter('casEmail')]; $email = $attributes[$this->getParameter('casEmail')];
}
if(isset($attributes[$this->getParameter('casLastname')])) if (isset($attributes[$this->getParameter('casLastname')])) {
$lastname = $attributes[$this->getParameter('casLastname')]; $lastname = $attributes[$this->getParameter('casLastname')];
}
if(isset($attributes[$this->getParameter('casFirstname')])) if (isset($attributes[$this->getParameter('casFirstname')])) {
$firstname = $attributes[$this->getParameter('casFirstname')]; $firstname = $attributes[$this->getParameter('casFirstname')];
}
if(isset($attributes[$this->getParameter('casAvatar')])) if (isset($attributes[$this->getParameter('casAvatar')])) {
$avatar = $attributes[$this->getParameter('casAvatar')]; $avatar = $attributes[$this->getParameter('casAvatar')];
}
// Rechercher l'utilisateur // Rechercher l'utilisateur
$user = $em->getRepository('App\Entity\User')->findOneBy(array("username"=>$username)); $user = $em->getRepository('App\Entity\User')->findOneBy(['username' => $username]);
if (!$user) { if (!$user) {
if(!$this->getParameter("casAutosubmit")) return $this->redirect($this->generateUrl('app_noperm')); if (!$this->getParameter('casAutosubmit')) {
return $this->redirect($this->generateUrl('app_noperm'));
$this->submitSSONiveau01($attributes,$em);
$this->submitSSOGroup($attributes,$em);
$niveau01=$em->getRepository('App\Entity\Niveau01')->calculateSSONiveau01($attributes);
$user=$this->submituser($username,$firstname,$lastname,$email,$password,$niveau01,$em);
$user=$em->getRepository('App\Entity\Group')->calculateSSOGroup($user,$attributes);
}
elseif($this->getParameter("casAutoupdate")) {
$this->submitSSONiveau01($attributes,$em);
$this->submitSSOGroup($attributes,$em);
$this->updateuser($user,$firstname,$lastname,$email,$avatar,$em);
$user=$em->getRepository('App\Entity\Group')->calculateSSOGroup($user,$attributes);
} }
$this->submitSSONiveau01($attributes, $em);
$this->submitSSOGroup($attributes, $em);
$niveau01 = $em->getRepository('App\Entity\Niveau01')->calculateSSONiveau01($attributes);
$user = $this->submituser($username, $firstname, $lastname, $email, $avatar, $niveau01, $em);
$user = $em->getRepository('App\Entity\Group')->calculateSSOGroup($user, $attributes);
} elseif ($this->getParameter('casAutoupdate')) {
if (!$user->Isactive()) {
return $this->redirect($this->generateUrl('app_noperm'));
}
$this->submitSSONiveau01($attributes, $em);
$this->submitSSOGroup($attributes, $em);
$this->updateuser($user, $firstname, $lastname, $email, $avatar, $em);
$user = $em->getRepository('App\Entity\Group')->calculateSSOGroup($user, $attributes);
}
// Autoconnexion // Autoconnexion
return $this->autoconnexion($user,$redirect,$request); return $this->autoconnexion($user, $redirect, $request);
} }
public function loginLDAP(Request $request) public function loginLDAP(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
{ {
// Création du formulaire // Création du formulaire
$form = $this->createForm(LoginType::class); $form = $this->createForm(LoginType::class);
@ -152,253 +157,276 @@ class SecurityController extends AbstractController
$form->handleRequest($request); $form->handleRequest($request);
// Affichage du formulaire // Affichage du formulaire
return $this->render("Home/loginLDAP.html.twig", [ return $this->render('Home/loginLDAP.html.twig', [
"useheader"=>false, 'useheader' => false,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>false, 'usesidebar' => false,
"form"=>$form->createView(), 'form' => $form->createView(),
]); ]);
} }
public function loginldapcheck(Request $request, AuthenticationUtils $authenticationUtils,ManagerRegistry $em) public function loginldapcheck(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
{ {
$username = $request->get('login')['username'];
$username=$request->get('login')["username"]; $password = $request->get('login')['password'];
$password=$request->get('login')["password"];
// Récupération de la cible de navigation // Récupération de la cible de navigation
$redirect = $request->getSession()->get("_security.main.target_path"); $redirect = $request->getSession()->get('_security.main.target_path');
// L'utilisateur se co à l'annuaire // L'utilisateur se co à l'annuaire
$userldap=$this->ldapservice->userconnect($username,$password); $userldap = $this->ldapservice->userconnect($username, $password);
if($userldap) { if ($userldap) {
$userldap=$userldap[0]; $userldap = $userldap[0];
// Init // Init
$email = "$username@nomail.fr"; $email = "$username@nomail.fr";
$lastname = $username; $lastname = $username;
$firstname = " "; $firstname = ' ';
$avatar="noavatar.png"; $avatar = 'noavatar.png';
// Rechercher l'utilisateur // Rechercher l'utilisateur
if(isset($userldap[$this->getParameter('ldapFirstname')])) if (isset($userldap[$this->getParameter('ldapFirstname')])) {
$firstname = $userldap[$this->getParameter('ldapFirstname')]; $firstname = $userldap[$this->getParameter('ldapFirstname')];
}
if(isset($userldap[$this->getParameter('ldapLastname')])) if (isset($userldap[$this->getParameter('ldapLastname')])) {
$lastname = $userldap[$this->getParameter('ldapLastname')]; $lastname = $userldap[$this->getParameter('ldapLastname')];
}
if(isset($userldap[$this->getParameter('ldapEmail')])) if (isset($userldap[$this->getParameter('ldapEmail')])) {
$email = $userldap[$this->getParameter('ldapEmail')]; $email = $userldap[$this->getParameter('ldapEmail')];
}
if(isset($userldap[$this->getParameter('ldapAvatar')])) if (isset($userldap[$this->getParameter('ldapAvatar')])) {
$avatar = $userldap[$this->getParameter('ldapAvatar')]; $avatar = $userldap[$this->getParameter('ldapAvatar')];
}
$user = $em->getRepository('App\Entity\User')->findOneBy(array("username"=>$username)); $user = $em->getRepository('App\Entity\User')->findOneBy(['username' => $username]);
if (!$user) { if (!$user) {
if(!$this->getParameter("ldapAutosubmit")) return $this->redirect($this->generateUrl('app_noperm')); if (!$this->getParameter('ldapAutosubmit')) {
$niveau01=$em->getRepository('App\Entity\Niveau01')->calculateLDAPNiveau01($username); return $this->redirect($this->generateUrl('app_noperm'));
$user=$this->submituser($username,$firstname,$lastname,$email,$avatar,$niveau01,$em);
} }
elseif($this->getParameter("ldapAutoupdate")) { $niveau01 = $em->getRepository('App\Entity\Niveau01')->calculateLDAPNiveau01($username);
$this->updateuser($user,$firstname,$lastname,$email,$avatar,$em); $user = $this->submituser($username, $firstname, $lastname, $email, $avatar, $niveau01, $em);
} elseif ($this->getParameter('ldapAutoupdate')) {
$this->updateuser($user, $firstname, $lastname, $email, $avatar, $em);
} }
// Autoconnexion // Autoconnexion
return $this->autoconnexion($user,$redirect,$request); return $this->autoconnexion($user, $redirect, $request);
} }
return $this->redirect($this->generateUrl('app_login')); return $this->redirect($this->generateUrl('app_login'));
} }
public function loginOPENID(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
public function loginOPENID(Request $request, AuthenticationUtils $authenticationUtils)
{ {
$state=Uuid::uuid4(); $state = Uuid::uuid4();
$request->getSession()->set("oauthState",$state); $request->getSession()->set('oauthState', $state);
$callback=$this->generateUrl('app_loginopenidcallback', array(), UrlGeneratorInterface::ABSOLUTE_URL); $callback = $this->generateUrl('app_loginopenidcallback', [], UrlGeneratorInterface::ABSOLUTE_URL);
$url=$this->getParameter("oauthLoginurl")."?client_id=".$this->getParameter("oauthClientid")."&redirect_uri=".$callback."&response_type=code&state=".$state."&scope=openid"; $url = $this->getParameter('oauthLoginurl').'?client_id='.$this->getParameter('oauthClientid').'&redirect_uri='.$callback.'&response_type=code&state='.$state.'&scope=openid';
return $this->redirect($url); return $this->redirect($url);
} }
public function loginopenidcallback(Request $request, AuthenticationUtils $authenticationUtils,ManagerRegistry $em) public function loginopenidcallback(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
{ {
// Récupération de la cible de navigation // Récupération de la cible de navigation
$redirect = $request->getSession()->get("_security.main.target_path"); $redirect = $request->getSession()->get('_security.main.target_path');
// Masteridentity // Masteridentity
$appMasteridentity=$this->getParameter("appMasteridentity"); $appMasteridentity = $this->getParameter('appMasteridentity');
$callback=$this->generateUrl('app_loginopenidcallback', array(), UrlGeneratorInterface::ABSOLUTE_URL); $callback = $this->generateUrl('app_loginopenidcallback', [], UrlGeneratorInterface::ABSOLUTE_URL);
$apiurl = $this->getParameter("oauthTokenurl"); $apiurl = $this->getParameter('oauthTokenurl');
$query= [ $query = [
"grant_type" => "authorization_code", 'grant_type' => 'authorization_code',
"code" => $request->get("code"), 'code' => $request->get('code'),
"redirect_uri" => $callback, 'redirect_uri' => $callback,
"client_id" => $this->getParameter("oauthClientid"), 'client_id' => $this->getParameter('oauthClientid'),
"client_secret" => $this->getParameter("oauthClientsecret"), '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||$response->code!="200") die("pb openid 01"); if (!$response || '200' != $response->code) {
$accesstoken=$response->body->access_token; exit('pb openid 01');
$accesstokentype=$response->body->token_type; }
$îdtoken=$response->body->id_token; $accesstoken = $response->body->access_token;
$accesstokentype = $response->body->token_type;
$îdtoken = $response->body->id_token;
$request->getSession()->set("oauthAccesstoken",$accesstoken); $request->getSession()->set('oauthAccesstoken', $accesstoken);
$request->getSession()->set("oauthIdtoken",$îdtoken); $request->getSession()->set('oauthIdtoken', $îdtoken);
$apiurl = $this->getParameter("oauthUserinfo"); $apiurl = $this->getParameter('oauthUserinfo');
$response=$this->apiservice->run("GET",$apiurl,null,["Authorization"=>$accesstokentype." ".$accesstoken]); $response = $this->apiservice->run('GET', $apiurl, null, ['Authorization' => $accesstokentype.' '.$accesstoken]);
if(!$response||$response->code!="200") die("pb openid 02"); if (!$response || '200' != $response->code) {
exit('pb openid 02');
}
$attributes=json_decode(json_encode($response->body), true); $attributes = json_decode(json_encode($response->body), true);
// Username // Username
if(isset($attributes[$this->getParameter('oauthUsername')])) $username = '';
if (isset($attributes[$this->getParameter('oauthUsername')])) {
$username = $attributes[$this->getParameter('oauthUsername')]; $username = $attributes[$this->getParameter('oauthUsername')];
}
// Valeur par défaut // Valeur par défaut
$email = "$username@nomail.fr"; $email = "$username@nomail.fr";
$lastname = $username; $lastname = $username;
$firstname = " "; $firstname = ' ';
$avatar="noavatar.png"; $avatar = 'noavatar.png';
// Récupérer les attributs associés // Récupérer les attributs associés
if(isset($attributes[$this->getParameter('oauthEmail')])) if (isset($attributes[$this->getParameter('oauthEmail')])) {
$email = $attributes[$this->getParameter('oauthEmail')]; $email = $attributes[$this->getParameter('oauthEmail')];
}
if(isset($attributes[$this->getParameter('oauthLastname')])) if (isset($attributes[$this->getParameter('oauthLastname')])) {
$lastname = $attributes[$this->getParameter('oauthLastname')]; $lastname = $attributes[$this->getParameter('oauthLastname')];
}
if(isset($attributes[$this->getParameter('oauthFirstname')])) if (isset($attributes[$this->getParameter('oauthFirstname')])) {
$firstname = $attributes[$this->getParameter('oauthFirstname')]; $firstname = $attributes[$this->getParameter('oauthFirstname')];
}
if(isset($attributes[$this->getParameter('oauthAvatar')])) if (isset($attributes[$this->getParameter('oauthAvatar')])) {
$avatar = $attributes[$this->getParameter('oauthAvatar')]; $avatar = $attributes[$this->getParameter('oauthAvatar')];
}
// Rechercher l'utilisateur // Rechercher l'utilisateur
$user = $em->getRepository('App\Entity\User')->findOneBy(array("username"=>$username)); $user = $em->getRepository('App\Entity\User')->findOneBy(['username' => $username]);
if (!$user) { if (!$user) {
if(!$this->getParameter("oauthAutosubmit")) return $this->redirect($this->generateUrl('app_noperm')); if (!$this->getParameter('oauthAutosubmit')) {
return $this->redirect($this->generateUrl('app_noperm'));
$this->submitSSONiveau01($attributes,$em);
$this->submitSSOGroup($attributes,$em);
$niveau01=$em->getRepository('App\Entity\Niveau01')->calculateSSONiveau01($attributes);
$user=$this->submituser($username,$firstname,$lastname,$email,$avatar,$niveau01,$em);
} }
elseif($this->getParameter("oauthAutoupdate")) {
$this->submitSSONiveau01($attributes,$em); $this->submitSSONiveau01($attributes, $em);
$this->submitSSOGroup($attributes,$em); $this->submitSSOGroup($attributes, $em);
$this->updateuser($user,$firstname,$lastname,$email,$avatar,$em); $niveau01 = $em->getRepository('App\Entity\Niveau01')->calculateSSONiveau01($attributes);
$user=$em->getRepository('App\Entity\Group')->calculateSSOGroup($user,$attributes); $user = $this->submituser($username, $firstname, $lastname, $email, $avatar, $niveau01, $em);
} elseif ($this->getParameter('oauthAutoupdate')) {
$this->submitSSONiveau01($attributes, $em);
$this->submitSSOGroup($attributes, $em);
$this->updateuser($user, $firstname, $lastname, $email, $avatar, $em);
$user = $em->getRepository('App\Entity\Group')->calculateSSOGroup($user, $attributes);
} }
// Autoconnexion // Autoconnexion
return $this->autoconnexion($user,$redirect,$request); return $this->autoconnexion($user, $redirect, $request);
} }
public function logout(Request $request) { public function logout(Request $request)
$auth_mode=$this->getParameter("appAuth"); {
switch($auth_mode) { $auth_mode = $this->getParameter('appAuth');
case "SQL": switch ($auth_mode) {
case 'SQL':
return $this->logoutSQL($request); return $this->logoutSQL($request);
break; break;
case "CAS": case 'CAS':
return $this->logoutCAS($request); return $this->logoutCAS($request);
break; break;
case "LDAP": case 'LDAP':
return $this->logoutLDAP($request); return $this->logoutLDAP($request);
break; break;
case "OPENID": case 'OPENID':
return $this->logoutOPENID($request); return $this->logoutOPENID($request);
break; break;
} }
} }
public function logoutSQL(Request $request) { public function logoutSQL(Request $request)
{
$this->tokenstorage->setToken(null); $this->tokenstorage->setToken(null);
$request->getSession()->invalidate(); $request->getSession()->invalidate();
return $this->redirect($this->generateUrl("app_home"));
return $this->redirect($this->generateUrl('app_home'));
} }
public function logoutCAS(Request $request) { public function logoutCAS(Request $request)
{
$this->tokenstorage->setToken(null); $this->tokenstorage->setToken(null);
$request->getSession()->invalidate(); $request->getSession()->invalidate();
// Init Client CAS // Init Client CAS
$alias=$this->getParameter('appAlias'); $alias = $this->getParameter('appAlias');
\phpCAS::setDebug($this->appKernel->getProjectDir()."/var/log/cas.log"); \phpCAS::setDebug($this->appKernel->getProjectDir().'/var/log/cas.log');
\phpCAS::client(CAS_VERSION_2_0, $this->getParameter('casHost'), intval($this->getParameter('casPort')), is_null($this->getParameter('casPath')) ? '' : $this->getParameter('casPath'), false); \phpCAS::client(CAS_VERSION_2_0, $this->getParameter('casHost'), intval($this->getParameter('casPort')), is_null($this->getParameter('casPath')) ? '' : $this->getParameter('casPath'), false);
\phpCAS::setNoCasServerValidation(); \phpCAS::setNoCasServerValidation();
// Logout // Logout
$url=$this->generateUrl('app_home', array(), UrlGeneratorInterface::ABSOLUTE_URL); $url = $this->generateUrl('app_home', [], UrlGeneratorInterface::ABSOLUTE_URL);
\phpCAS::logout(array("service"=>$url)); \phpCAS::logout(['service' => $url]);
return true; return true;
} }
public function logoutLDAP(Request $request) { public function logoutLDAP(Request $request)
{
$this->tokenstorage->setToken(null); $this->tokenstorage->setToken(null);
$request->getSession()->invalidate(); $request->getSession()->invalidate();
return $this->redirect($this->generateUrl("app_home"));
return $this->redirect($this->generateUrl('app_home'));
} }
public function logoutOPENID(Request $request)
public function logoutOPENID(Request $request) { {
$accesstoken=$request->getSession()->get("oauthAccesstoken"); $accesstoken = $request->getSession()->get('oauthAccesstoken');
$idtoken=$request->getSession()->get("oauthIdtoken"); $idtoken = $request->getSession()->get('oauthIdtoken');
$state=$request->getSession()->get("oauthState"); $state = $request->getSession()->get('oauthState');
$this->tokenstorage->setToken(null); $this->tokenstorage->setToken(null);
$request->getSession()->invalidate(); $request->getSession()->invalidate();
$url=$this->getParameter("oauthLogouturl"); $url = $this->getParameter('oauthLogouturl');
if($url) { if ($url) {
$callback=($request->isSecure()?"https://":"http://").str_replace("//","/",$this->getParameter("appWeburl").$this->getParameter("appAlias").$this->generateUrl('app_home')); $callback = ($request->isSecure() ? 'https://' : 'http://').str_replace('//', '/', $this->getParameter('appWeburl').$this->getParameter('appAlias').$this->generateUrl('app_home'));
$callback=substr($callback, 0, -1); $callback = substr($callback, 0, -1);
$url .= "?id_token_hint=$idtoken&scope=openid&post_logout_redirect_uri=$callback";
$url.="?id_token_hint=$idtoken&scope=openid&post_logout_redirect_uri=$callback";
return $this->redirect($url); return $this->redirect($url);
} else {
} else return $this->redirect($this->generateUrl("app_home")); return $this->redirect($this->generateUrl('app_home'));
}
} }
// Génération automatique des niveau01 provenant de l'attribut casniveau01 // Génération automatique des niveau01 provenant de l'attribut casniveau01
private function submitSSONiveau01($attributes,ManagerRegistry $em) { private function submitSSONiveau01($attributes, ManagerRegistry $em)
$attrNiveau01=($this->getParameter("appAuth")=="CAS"?$this->getParameter('casNiveau01'):$this->getParameter('oauthNiveau01')); {
if(!$attrNiveau01) $attrNiveau01 = ('CAS' == $this->getParameter('appAuth') ? $this->getParameter('casNiveau01') : $this->getParameter('oauthNiveau01'));
if (!$attrNiveau01) {
return null; return null;
// Si l'utilisateur possège l'attribut niveau01 dans ses attributs
if(array_key_exists($attrNiveau01,$attributes)) {
if(!is_array($attributes[$attrNiveau01])) {
$attributes[$attrNiveau01]=[$attributes[$attrNiveau01]];
} }
foreach($attributes[$attrNiveau01] as $ssoniveau01) { // Si l'utilisateur possège l'attribut niveau01 dans ses attributs
$basedn=$this->getParameter('ldapBasedn'); if (array_key_exists($attrNiveau01, $attributes)) {
$name=$ssoniveau01; if (!is_array($attributes[$attrNiveau01])) {
if($basedn!="") { $attributes[$attrNiveau01] = [$attributes[$attrNiveau01]];
}
foreach ($attributes[$attrNiveau01] as $ssoniveau01) {
$basedn = $this->getParameter('ldapBasedn');
$name = $ssoniveau01;
if ('' != $basedn) {
// Si présence du basedn dans le nom du groupe = nous sommes en présence d'un DN = on récupere donc comme nom que son cn // Si présence du basedn dans le nom du groupe = nous sommes en présence d'un DN = on récupere donc comme nom que son cn
if(stripos($name,$basedn)!==false) { if (false !== stripos($name, $basedn)) {
$tbname=explode(",",$name); $tbname = explode(',', $name);
$tbname=explode("=",$tbname[0]); $tbname = explode('=', $tbname[0]);
$name=$tbname[1]; $name = $tbname[1];
} }
} }
// Recherche du groupe // Recherche du groupe
$niveau01=$em->getRepository("App\Entity\Niveau01")->findOneBy(["label"=>$name]); $niveau01 = $em->getRepository("App\Entity\Niveau01")->findOneBy(['label' => $name]);
if(!$niveau01) { if (!$niveau01) {
$niveau01=new Niveau01(); $niveau01 = new Niveau01();
$niveau01->setLabel($name); $niveau01->setLabel($name);
$niveau01->setApikey(Uuid::uuid4()); $niveau01->setApikey(Uuid::uuid4());
} }
@ -410,35 +438,36 @@ class SecurityController extends AbstractController
} }
} }
// Génération automatique des groupes provenant de l'attribut casgroup ou oauthgroup // Génération automatique des groupes provenant de l'attribut casgroup ou oauthgroup
private function submitSSOGroup($attributes,ManagerRegistry $em) { private function submitSSOGroup($attributes, ManagerRegistry $em)
$attrGroup=($this->getParameter("appAuth")=="CAS"?$this->getParameter('casGroup'):$this->getParameter('oauthGroup')); {
if(!$attrGroup) $attrGroup = ('CAS' == $this->getParameter('appAuth') ? $this->getParameter('casGroup') : $this->getParameter('oauthGroup'));
if (!$attrGroup) {
return null; return null;
// Si l'utilisateur possège l'attribut groupe dans ses attributs
if(array_key_exists($attrGroup,$attributes)) {
if(!is_array($attributes[$attrGroup])) {
$attributes[$attrGroup]=[$attributes[$attrGroup]];
} }
foreach($attributes[$attrGroup] as $ssogroup) { // Si l'utilisateur possège l'attribut groupe dans ses attributs
$basedn=$this->getParameter('ldapBasedn'); if (array_key_exists($attrGroup, $attributes)) {
$name=$ssogroup; if (!is_array($attributes[$attrGroup])) {
if($basedn!="") { $attributes[$attrGroup] = [$attributes[$attrGroup]];
}
foreach ($attributes[$attrGroup] as $ssogroup) {
$basedn = $this->getParameter('ldapBasedn');
$name = $ssogroup;
if ('' != $basedn) {
// Si présence du basedn dans le nom du groupe = nous sommes en présence d'un DN = on récupere donc comme nom que son cn // Si présence du basedn dans le nom du groupe = nous sommes en présence d'un DN = on récupere donc comme nom que son cn
if(stripos($name,$basedn)!==false) { if (false !== stripos($name, $basedn)) {
$tbname=explode(",",$name); $tbname = explode(',', $name);
$tbname=explode("=",$tbname[0]); $tbname = explode('=', $tbname[0]);
$name=$tbname[1]; $name = $tbname[1];
} }
} }
// Recherche du groupe // Recherche du groupe
$group=$em->getRepository("App\Entity\Group")->findOneBy(["label"=>$name]); $group = $em->getRepository("App\Entity\Group")->findOneBy(['label' => $name]);
if(!$group) { if (!$group) {
$group=new Group(); $group = new Group();
$group->setLabel($name); $group->setLabel($name);
$group->setIsopen(false); $group->setIsopen(false);
$group->setIsworkgroup(false); $group->setIsworkgroup(false);
@ -452,15 +481,27 @@ class SecurityController extends AbstractController
} }
} }
private function submituser($username,$firstname,$lastname,$email,$avatar,$niveau01,$em) { private function submituser($username, $firstname, $lastname, $email, $avatar, $niveau01, $em)
if(empty($email)) $email = $username."@nomail.com"; {
if(empty($avatar)) $avatar = "noavatar.png"; if (empty($email)) {
if(empty($firstname)) $firstname = " "; $email = $username.'@nomail.com';
if(empty($lastname)) $lastname = $username; }
$password=$this->getParameter("appAuth")."PWD-".$username; if (empty($avatar)) {
$avatar = 'noavatar.png';
}
if (empty($firstname)) {
$firstname = ' ';
}
if (empty($lastname)) {
$lastname = $username;
}
$uuid = Uuid::uuid4();
$password = $this->getParameter('appAuth').'PWD-'.$username.'-'.$uuid;
// Si aucun niveau01 on prend par défaut le niveau system // Si aucun niveau01 on prend par défaut le niveau system
if(!$niveau01) $niveau01=$em->getRepository('App\Entity\Niveau01')->find(-1); if (!$niveau01) {
$niveau01 = $em->getRepository('App\Entity\Niveau01')->find(-1);
}
// Autogénération du user vu qu'il a pu se connecter // Autogénération du user vu qu'il a pu se connecter
$user = new User(); $user = new User();
@ -475,11 +516,13 @@ class SecurityController extends AbstractController
$user->setNiveau01($niveau01); $user->setNiveau01($niveau01);
$user->setAvatar($avatar); $user->setAvatar($avatar);
$user->setIsactive(true);
$user->setIsvisible(true); $user->setIsvisible(true);
$user->setRole("ROLE_USER"); $user->setRole('ROLE_USER');
if(in_array($username,$this->getParameter("appAdmins"))) if (in_array($username, $this->getParameter('appAdmins'))) {
$user->setRole("ROLE_ADMIN"); $user->setRole('ROLE_ADMIN');
}
$em->getManager()->persist($user); $em->getManager()->persist($user);
$em->getManager()->flush(); $em->getManager()->flush();
@ -487,24 +530,40 @@ class SecurityController extends AbstractController
return $user; return $user;
} }
private function updateuser($user,$firstname,$lastname,$email,$avatar,$em) { private function updateuser($user, $firstname, $lastname, $email, $avatar, $em)
if($avatar=="noavatar.png") $avatar=$user->getAvatar(); {
if ('noavatar.png' == $avatar) {
$avatar = $user->getAvatar();
}
if(!empty($lastname)) $user->setLastname($lastname); if (!empty($lastname)) {
if(!empty($firstname)) $user->setFirstname($firstname); $user->setLastname($lastname);
if(!empty($email)) $user->setEmail($email); }
if(!empty($avatar)) $user->setAvatar($avatar); if (!empty($firstname)) {
$user->setFirstname($firstname);
}
if (!empty($email)) {
$user->setEmail($email);
}
if (!empty($avatar)) {
$user->setAvatar($avatar);
}
if(in_array($user->getUsername(),$this->getParameter("appAdmins"))) if (in_array($user->getUsername(), $this->getParameter('appAdmins'))) {
$user->setRole("ROLE_ADMIN"); $user->setRole('ROLE_ADMIN');
}
$em->getManager()->flush(); $em->getManager()->flush();
} }
private function autoconnexion($user,$redirect,Request $request) private function autoconnexion($user, $redirect, Request $request)
{ {
if (!$user->isIsactive()) {
return $this->redirect($this->generateUrl('app_noperm'));
}
// Récupérer le token de l'utilisateur // Récupérer le token de l'utilisateur
$token = new UsernamePasswordToken($user, "main", $user->getRoles()); $token = new UsernamePasswordToken($user, 'main', $user->getRoles());
$this->tokenstorage->setToken($token); $this->tokenstorage->setToken($token);
$request->getSession()->set('_security_main', serialize($token)); $request->getSession()->set('_security_main', serialize($token));
@ -514,9 +573,10 @@ class SecurityController extends AbstractController
$dispatcher->dispatch($event); $dispatcher->dispatch($event);
// Redirection // Redirection
if($redirect) if ($redirect) {
return $this->redirect($redirect); return $this->redirect($redirect);
else } else {
return $this->redirect($this->generateUrl('app_home')); return $this->redirect($this->generateUrl('app_home'));
} }
}
} }

View File

@ -1,11 +1,12 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Yaml\Yaml;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Yaml\Yaml;
class ThemeController extends AbstractController class ThemeController extends AbstractController
{ {
@ -13,43 +14,43 @@ class ThemeController extends AbstractController
{ {
$finder = new Finder(); $finder = new Finder();
$dir = $this->getParameter('kernel.project_dir')."/public/themes"; $dir = $this->getParameter('kernel.project_dir').'/public/themes';
$url=$this->getParameter('appAlias')."themes"; $url = $this->getParameter('appAlias').'themes';
$finder->in($dir)->directories()->depth('== 0'); $finder->in($dir)->directories()->depth('== 0');
$themes=[]; $themes = [];
$themes[""]["dir"]=""; $themes['']['dir'] = '';
$themes[""]["url"]=$url; $themes['']['url'] = $url;
$themes[""]["name"]="Thème par défaut"; $themes['']['name'] = 'Thème par défaut';
foreach ($finder as $file) { foreach ($finder as $file) {
$key=$file->getRelativePathname(); $key = $file->getRelativePathname();
$themes[$key]["dir"]=$key; $themes[$key]['dir'] = $key;
$themes[$key]["url"]=$url."/".$key; $themes[$key]['url'] = $url.'/'.$key;
$yml=Yaml::parseFile($dir.'/'.$key.'/info.yml'); $yml = Yaml::parseFile($dir.'/'.$key.'/info.yml');
$themes[$key]["name"]=$yml["name"]; $themes[$key]['name'] = $yml['name'];
} }
$current=$request->getSession()->get("apptheme"); $current = $request->getSession()->get('apptheme');
$currentheme=$themes[$current]; $currentheme = $themes[$current];
unset($themes[$current]); unset($themes[$current]);
return $this->render('Theme/list.html.twig',[ return $this->render('Theme/list.html.twig', [
'useheader' => true, 'useheader' => true,
'usesidebar' => true, 'usesidebar' => true,
'currentheme' => $currentheme, 'currentheme' => $currentheme,
'themes' => $themes 'themes' => $themes,
]); ]);
} }
public function select($name,Request $request,ManagerRegistry $em) public function select($name, Request $request, ManagerRegistry $em)
{ {
$config=$em->getRepository("App\Entity\Config")->findoneBy(["id"=>"apptheme"]); $config = $em->getRepository("App\Entity\Config")->findoneBy(['id' => 'apptheme']);
$config->setValue($name); $config->setValue($name);
$em->getManager()->flush(); $em->getManager()->flush();
return $this->redirectToRoute("app_admin_theme"); return $this->redirectToRoute('app_admin_theme');
} }
} }

View File

@ -1,80 +1,112 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use App\Entity\User as Entity; use App\Entity\User as Entity;
use App\Entity\UserGroup; use App\Entity\UserGroup;
use App\Entity\UserModo; use App\Entity\UserModo;
use App\Form\UserType as Form; use App\Form\UserType as Form;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class UserController extends AbstractController class UserController extends AbstractController
{ {
private $data="user"; private $data = 'user';
private $entity="App\Entity\User"; private $entity = "App\Entity\User";
private $twig="User/"; private $twig = 'User/';
private $route="app_admin_user"; private $route = 'app_admin_user';
public function list($access,Request $request): Response public function list($access, Request $request, ManagerRegistry $em): Response
{ {
if($access=="user"&&!$request->getSession()->get("showannuaire")) if ('all' == $access && !$request->getSession()->get('showannuaire')) {
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
}
return $this->render($this->twig.'list.html.twig',[ dump($em->getRepository($this->entity)->getPreference($this->getUser(), 'userisactive', true));
"useheader"=>true,
"usemenu"=>false, return $this->render($this->twig.'list.html.twig', [
"usesidebar"=>($access!="user"), 'useheader' => true,
"access"=>$access 'usemenu' => false,
'usesidebar' => ('all' != $access),
'access' => $access,
'isactive' => ('true' == $em->getRepository($this->entity)->getPreference($this->getUser(), 'userisactive', true)),
]); ]);
} }
public function tablelist($access, Request $request,ManagerRegistry $em): Response public function tablelist($access, Request $request, ManagerRegistry $em): Response
{ {
$query=$request->query->all(); $query = $request->query->all();
$start=$query['start']; $start = $query['start'];
$length=$query['length']; $length = $query['length'];
$search=$query['search']; $search = $query['search'];
$draw= $query['draw']; $draw = $query['draw'];
$ordercolumn=$query['order'][0]['column']; $ordercolumn = $query['order'][0]['column'];
$orderdir=$query['order'][0]['dir']; $orderdir = $query['order'][0]['dir'];
$niveau01 = null;
$niveau02 = null;
$niveau03 = null;
$niveau04 = null;
$isactive = true;
// Nombre total d'enregistrement // Nombre total d'enregistrement
switch($access) { switch ($access) {
case "admin": case 'admin':
$total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity,'entity')->getQuery()->getSingleScalarResult(); $isactive = $em->getRepository($this->entity)->getPreference($this->getUser(), 'userisactive', true);
break;
case "modo":
$total = $em->getManager()->createQueryBuilder() $total = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from("App\Entity\UserModo",'usermodo') ->where('entity.isactive = :isactive')
->where("usermodo.niveau01 = entity.niveau01") ->setParameter('isactive', $isactive)
->andWhere("usermodo.user = :user") ->getQuery()->getSingleScalarResult();
->setParameter("user", $this->getUser()) break;
case 'modo':
$isactive = $em->getRepository($this->entity)->getPreference($this->getUser(), 'userisactive', true);
$total = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)')
->from($this->entity, 'entity')
->from("App\Entity\UserModo", 'usermodo')
->where('usermodo.niveau01 = entity.niveau01')
->andWhere('usermodo.user = :user')
->where('entity.isactive = :isactive')
->setParameter('isactive', $isactive)
->setParameter('user', $this->getUser())
->getQuery()->getSingleScalarResult(); ->getQuery()->getSingleScalarResult();
break; break;
default: default:
$niveau01=$this->getUser()->getNiveau01(); $isactive = true;
$niveau02=$this->getUser()->getNiveau02(); $niveau01 = $this->getUser()->getNiveau01();
$niveau02 = $this->getUser()->getNiveau02();
$niveau03 = $this->getUser()->getNiveau03();
$niveau04 = $this->getUser()->getNiveau04();
$qb=$em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity,'entity')->where('entity.isvisible=true'); $qb = $em->getManager()->createQueryBuilder()
switch($request->getSession()->get("scopeannu")) { ->select('COUNT(entity)')
case "SAME_NIVEAU01": ->from($this->entity, 'entity')
$qb->andWhere("entity.niveau01 = :niveau01")->setParameter("niveau01",$niveau01); ->where('entity.isvisible=true')
->where('entity.isactive = :isactive')
->setParameter('isactive', $isactive);
switch ($request->getSession()->get('scopeannu')) {
case 1:
$qb->andWhere('entity.niveau01 = :niveau01')->setParameter('niveau01', $niveau01);
break; break;
case "SAME_NIVEAU02": case 2:
$qb->andWhere("entity.niveau02 = :niveau02")->setParameter("niveau02",$niveau02); $qb->andWhere('entity.niveau02 = :niveau02')->setParameter('niveau02', $niveau02);
break;
case 3:
$qb->andWhere('entity.niveau03 = :niveau03')->setParameter('niveau03', $niveau03);
break;
case 4:
$qb->andWhere('entity.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break; break;
} }
@ -83,34 +115,38 @@ class UserController extends AbstractController
} }
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if(!$search||$search["value"]=="") if (!$search || '' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
switch($access) { switch ($access) {
case "admin": case 'admin':
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from('App:Niveau01', 'niveau01') ->from('App:Niveau01', 'niveau01')
->where('entity.niveau01=niveau01.id') ->where('entity.niveau01=niveau01.id')
->andwhere('entity.isactive = :isactive')
->andWhere('entity.username LIKE :value OR entity.firstname LIKE :value OR entity.lastname LIKE :value OR entity.email LIKE :value OR entity.roles LIKE :value OR niveau01.label LIKE :value') ->andWhere('entity.username LIKE :value OR entity.firstname LIKE :value OR entity.lastname LIKE :value OR entity.email LIKE :value OR entity.roles LIKE :value OR niveau01.label LIKE :value')
->setParameter("value", "%".$search["value"]."%") ->setParameter('isactive', $isactive)
->setParameter('value', '%'.$search['value'].'%')
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
break; break;
case "modo": case 'modo':
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from('App:Niveau01', 'niveau01') ->from('App:Niveau01', 'niveau01')
->from("App:UserModo",'usermodo') ->from('App:UserModo', 'usermodo')
->where('entity.niveau01=niveau01.id') ->where('entity.niveau01=niveau01.id')
->andwhere('entity.isactive = :isactive')
->andWhere('entity.username LIKE :value OR entity.firstname LIKE :value OR entity.lastname LIKE :value OR entity.email LIKE :value OR entity.roles LIKE :value OR niveau01.label LIKE :value') ->andWhere('entity.username LIKE :value OR entity.firstname LIKE :value OR entity.lastname LIKE :value OR entity.email LIKE :value OR entity.roles LIKE :value OR niveau01.label LIKE :value')
->andWhere("usermodo.niveau01 = entity.niveau01") ->andWhere('usermodo.niveau01 = entity.niveau01')
->andWhere("usermodo.user = :userid") ->andWhere('usermodo.user = :userid')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->setParameter("userid", $this->getUser()->getId()) ->setParameter('isactive', $isactive)
->setParameter('userid', $this->getUser()->getId())
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
break; break;
@ -118,209 +154,248 @@ class UserController extends AbstractController
default: default:
$qb = $em->getManager()->createQueryBuilder() $qb = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->from('App:Niveau01', 'niveau01') ->from('App:Niveau01', 'niveau01')
->where('entity.niveau01=niveau01.id') ->where('entity.niveau01=niveau01.id')
->andwhere('entity.isactive = :isactive')
->andWhere('entity.isvisible=true') ->andWhere('entity.isvisible=true')
->andWhere('entity.username LIKE :value OR entity.firstname LIKE :value OR entity.lastname LIKE :value OR entity.email LIKE :value OR entity.roles LIKE :value OR niveau01.label LIKE :value') ->andWhere('entity.username LIKE :value OR entity.firstname LIKE :value OR entity.lastname LIKE :value OR entity.email LIKE :value OR entity.roles LIKE :value OR niveau01.label LIKE :value')
->setParameter("value", "%".$search["value"]."%"); ->setParameter('value', '%'.$search['value'].'%')
->setParameter('isactive', $isactive);
switch($request->getSession()->get("scopeannu")) { switch ($request->getSession()->get('scopeannu')) {
case "SAME_NIVEAU01": case 1:
$qb->andWhere("entity.niveau01 = :niveau01")->setParameter("niveau01",$niveau01); $qb->andWhere('entity.niveau01 = :niveau01')->setParameter('niveau01', $niveau01);
break; break;
case "SAME_NIVEAU02": case 2:
$qb->andWhere("entity.niveau02 = :niveau02")->setParameter("niveau02",$niveau02); $qb->andWhere('entity.niveau02 = :niveau02')->setParameter('niveau02', $niveau02);
break;
case 3:
$qb->andWhere('entity.niveau03 = :niveau03')->setParameter('niveau03', $niveau03);
break;
case 4:
$qb->andWhere('entity.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break; break;
} }
$totalf=$qb->getQuery()->getSingleScalarResult(); $totalf = $qb->getQuery()->getSingleScalarResult();
break; break;
} }
} }
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
switch($access) { switch ($access) {
case "admin": case 'admin':
$qb->select('entity')->from($this->entity,'entity')->from('App:Niveau01','niveau01'); $qb->select('entity')->from($this->entity, 'entity')->from('App:Niveau01', 'niveau01');
$qb->where('entity.niveau01=niveau01.id'); $qb->where('entity.niveau01=niveau01.id');
$qb->andwhere('entity.isactive = :isactive');
$qb->setParameter('isactive', $isactive);
break; break;
case "modo": case 'modo':
$qb->select('entity')->from($this->entity,'entity')->from('App:Niveau01','niveau01')->from("App:UserModo",'usermodo'); $qb->select('entity')->from($this->entity, 'entity')->from('App:Niveau01', 'niveau01')->from('App:UserModo', 'usermodo');
$qb->where('entity.niveau01=niveau01.id'); $qb->where('entity.niveau01=niveau01.id');
$qb->andWhere("usermodo.niveau01 = entity.niveau01"); $qb->andWhere('usermodo.niveau01 = entity.niveau01');
$qb->andWhere("usermodo.user = :userid"); $qb->andWhere('usermodo.user = :userid');
$qb->setParameter("userid", $this->getUser()->getId()); $qb->andwhere('entity.isactive = :isactive');
$qb->setParameter('isactive', $isactive);
$qb->setParameter('userid', $this->getUser()->getId());
break; break;
default: default:
$qb->select('entity')->from($this->entity,'entity')->from('App:Niveau01','niveau01'); $qb->select('entity')->from($this->entity, 'entity')->from('App:Niveau01', 'niveau01');
$qb->where('entity.niveau01=niveau01.id'); $qb->where('entity.niveau01=niveau01.id');
$qb->andWhere('entity.isvisible=true'); $qb->andWhere('entity.isvisible=true');
$qb->andwhere('entity.isactive = :isactive');
$qb->setParameter('isactive', $isactive);
switch($request->getSession()->get("scopeannu")) { switch ($request->getSession()->get('scopeannu')) {
case "SAME_NIVEAU01": case 1:
$qb->andWhere("entity.niveau01 = :niveau01")->setParameter("niveau01",$niveau01); $qb->andWhere('entity.niveau01 = :niveau01')->setParameter('niveau01', $niveau01);
break; break;
case "SAME_NIVEAU02": case 2:
$qb->andWhere("entity.niveau02 = :niveau02")->setParameter("niveau02",$niveau02); $qb->andWhere('entity.niveau02 = :niveau02')->setParameter('niveau02', $niveau02);
break;
case 3:
$qb->andWhere('entity.niveau03 = :niveau03')->setParameter('niveau03', $niveau03);
break;
case 4:
$qb->andWhere('entity.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break; break;
} }
break; break;
} }
if($search&&$search["value"]!="") { if ($search && '' != $search['value']) {
$qb ->andWhere('entity.username LIKE :value OR entity.firstname LIKE :value OR entity.lastname LIKE :value OR entity.email LIKE :value OR entity.roles LIKE :value OR niveau01.label LIKE :value') $qb->andWhere('entity.username LIKE :value OR entity.firstname LIKE :value OR entity.lastname LIKE :value OR entity.email LIKE :value OR entity.roles LIKE :value OR niveau01.label LIKE :value')
->setParameter("value", "%".$search["value"]."%"); ->setParameter('value', '%'.$search['value'].'%');
} }
if($ordercolumn) { if ($ordercolumn) {
if($access=="admin"||$access=="modo") { if ('admin' == $access || 'modo' == $access) {
$ordercolumn=$ordercolumn-1; $ordercolumn = $ordercolumn - 1;
} }
switch($ordercolumn) { switch ($ordercolumn) {
case 1 : case 1:
$qb->orderBy('entity.username',$orderdir); $qb->orderBy('entity.username', $orderdir);
break; break;
case 2 : case 2:
$qb->orderBy('entity.lastname',$orderdir); $qb->orderBy('entity.lastname', $orderdir);
break; break;
case 3 : case 3:
$qb->orderBy('entity.firstname',$orderdir); $qb->orderBy('entity.firstname', $orderdir);
break; break;
case 4 : case 4:
$qb->orderBy('entity.email',$orderdir); $qb->orderBy('entity.email', $orderdir);
break; break;
case 5 : case 5:
$qb->orderBy('entity.telephonenumber',$orderdir); $qb->orderBy('entity.telephonenumber', $orderdir);
break; break;
case 6 : case 6:
$qb->orderBy('niveau01.label',$orderdir); $qb->orderBy('niveau01.label', $orderdir);
break; break;
case 8 : case 8:
$qb->orderBy('entity.visitedate',$orderdir); $qb->orderBy('entity.visitedate', $orderdir);
break; break;
case 9 : case 9:
$qb->orderBy('entity.roles',$orderdir); $qb->orderBy('entity.roles', $orderdir);
break; break;
} }
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
// Action // Action
$action = ""; $action = '';
switch($access) { switch ($access) {
case "admin": case 'admin':
$action.="<a href='".$this->generateUrl($this->route.'_update', array('id'=>$data->getId()))."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl($this->route.'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
break; break;
case "modo": case 'modo':
$action.="<a href='".$this->generateUrl(str_replace("_admin_","_modo_",$this->route).'_update', array('id'=>$data->getId()))."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl(str_replace('_admin_', '_modo_', $this->route).'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
break; break;
} }
// Groupes // Groupes
$groups=""; $groups = '';
foreach($data->getGroups() as $usergroup) { foreach ($data->getGroups() as $usergroup) {
$groups.=$usergroup->getGroup()->getLabel()."<br>"; $groups .= $usergroup->getGroup()->getLabel().'<br>';
} }
// Roles // Roles
$roles=""; $roles = '';
foreach($data->getRoles() as $role) { foreach ($data->getRoles() as $role) {
$roles.=$role."<br>"; $roles .= $role.'<br>';
} }
$tmp=array(); $tmp = [];
if($access=="admin"||$access=="modo") array_push($tmp,$action); if ('admin' == $access || 'modo' == $access) {
array_push($tmp, $action);
}
array_push($tmp,"<img src='".$this->generateUrl('app_minio_image',["file"=>"avatar/".$data->getAvatar()])."' class='avatar'>"); array_push($tmp, "<img src='".$this->generateUrl('app_minio_image', ['file' => 'avatar/'.$data->getAvatar()])."' class='avatar'>");
array_push($tmp,$data->getUsername()); array_push($tmp, $data->getUsername());
array_push($tmp,$data->getLastname()); array_push($tmp, $data->getLastname());
array_push($tmp,$data->getFirstname()); array_push($tmp, $data->getFirstname());
array_push($tmp,"<a href='mailto:".$data->getEmail()."'>".$data->getEmail()."</a>"); array_push($tmp, "<a href='mailto:".$data->getEmail()."'>".$data->getEmail().'</a>');
array_push($tmp,$data->getTelephonenumber()); array_push($tmp, $data->getTelephonenumber());
array_push($tmp,$data->getNiveau01()->getLabel()); array_push($tmp, $data->getNiveau01()->getLabel());
array_push($tmp,($data->getNiveau02()?$data->getNiveau02()->getLabel():"")); array_push($tmp, $data->getNiveau02() ? $data->getNiveau02()->getLabel() : '');
array_push($tmp,($data->getVisitedate()?$data->getVisitedate()->format("d/m/Y H:i")."<br>nb = ".$data->getVisitecpt():"")); array_push($tmp, $data->getNiveau03() ? $data->getNiveau03()->getLabel() : '');
array_push($tmp,$roles); array_push($tmp, $data->getNiveau04() ? $data->getNiveau04()->getLabel() : '');
array_push($tmp,$groups); array_push($tmp, $data->getVisitedate() ? $data->getVisitedate()->format('d/m/Y H:i').'<br>nb = '.$data->getVisitecpt() : '');
array_push($tmp, $roles);
array_push($tmp, $groups);
array_push($output["data"],$tmp); array_push($output['data'], $tmp);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function selectlist($access, Request $request,ManagerRegistry $em): Response public function selectlist($access, Request $request, ManagerRegistry $em): Response
{ {
$output=array(); $output = [];
$page_limit=$request->query->get('page_limit'); $page_limit = $request->query->get('page_limit');
$q=$request->query->get('q'); $q = $request->query->get('q');
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('entity')->from($this->entity,'entity') $qb->select('entity')->from($this->entity, 'entity')
->where('entity.username LIKE :value') ->where('entity.username LIKE :value')
->setParameter("value", "%".$q."%") ->orWhere('entity.lastname LIKE :value')
->orWhere('entity.firstname LIKE :value')
->setParameter('value', '%'.$q.'%')
->orderBy('entity.username'); ->orderBy('entity.username');
$datas=$qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
array_push($output,array("id"=>$data->getId(),"text"=>$data->getUsername())); array_push($output, ['id' => $data->getId(), 'text' => $data->getFullname()]);
} }
$ret_string["results"]=$output; $ret_string['results'] = $output;
$response = new JsonResponse($ret_string); $response = new JsonResponse($ret_string);
return $response; return $response;
} }
public function submit($access, Request $request,ManagerRegistry $em): Response public function submit($access, Request $request, ManagerRegistry $em): Response
{ {
// Vérifier que l'on puisse créer // Vérifier que l'on puisse créer
if($this->getParameter("appMasteridentity")!="SQL" && $this->getParameter("appSynchroPurgeUser")) if ('SQL' != $this->getParameter('appMasteridentity') && $this->getParameter('appSynchroPurgeUser')) {
throw $this->createNotFoundException('Permission denied'); throw $this->createNotFoundException('Permission denied');
}
// Controler les permissions // Controler les permissions
$this->cansubmit($access,$em); $this->cansubmit($access, $em);
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data = new Entity(); $data = new Entity();
$data->setAvatar("noavatar.png"); $data->setAvatar('noavatar.png');
$data->setIsvisible(true); $data->setIsvisible(true);
$data->setIsactive(true);
$data->setApikey(Uuid::uuid4()); $data->setApikey(Uuid::uuid4());
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"submit", 'mode' => 'submit',
"access"=>$access, 'access' => $access,
"userid"=>$this->getUser()->getId(), 'userid' => $this->getUser()->getId(),
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"appNiveau01label"=>$this->GetParameter("appNiveau01label"), 'appNiveau01label' => $this->GetParameter('appNiveau01label'),
"appNiveau02label"=>$this->GetParameter("appNiveau02label"), 'appNiveau02use' => $this->GetParameter('appNiveau02use'),
)); 'appNiveau02label' => $this->GetParameter('appNiveau02label'),
'appNiveau03use' => $this->GetParameter('appNiveau03use'),
'appNiveau03label' => $this->GetParameter('appNiveau03label'),
'appNiveau04use' => $this->GetParameter('appNiveau04use'),
'appNiveau04label' => $this->GetParameter('appNiveau04label'),
'appNiveauupdatable' => $this->GetParameter('appNiveauupdatable'),
]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -330,28 +405,26 @@ class UserController extends AbstractController
$data = $form->getData(); $data = $form->getData();
// S'assurer que les modos ne donne pas des ROLE_ADMIN ou ROLE_USER au user qu'il submit // S'assurer que les modos ne donne pas des ROLE_ADMIN ou ROLE_USER au user qu'il submit
if($access=="modo") { if ('modo' == $access) {
$roles=$data->getRoles(); $roles = $data->getRoles();
$roles=array_diff($roles,["ROLE_ADMIN","ROLE_MODO"]); $roles = array_diff($roles, ['ROLE_ADMIN', 'ROLE_MODO']);
$data->setRoles($roles); $data->setRoles($roles);
} }
// On récupère les groupes et on cacule ceux à ajouter ou à supprimer // On récupère les groupes et on cacule ceux à ajouter ou à supprimer
$lstgroups=array_filter(explode(",",$form->get("linkgroups")->getData())); $lstgroups = array_filter(explode(',', $form->get('linkgroups')->getData()));
$lstmodos=array_filter(explode(",",$form->get("linkmodos")->getData())); $lstmodos = array_filter(explode(',', $form->get('linkmodos')->getData()));
// Sauvegarde // Sauvegarde
$em->getManager()->persist($data); $em->getManager()->persist($data);
$em->getManager()->flush(); $em->getManager()->flush();
// Ajout des groupes // Ajout des groupes
foreach($lstgroups as $idgroup) { foreach ($lstgroups as $idgroup) {
$group=$em->getRepository("App\Entity\Group")->find($idgroup); $group = $em->getRepository("App\Entity\Group")->find($idgroup);
$usergroup=$em->getRepository('App\Entity\UserGroup')->findBy(["user"=>$data,"group"=>$group]); $usergroup = $em->getRepository('App\Entity\UserGroup')->findBy(['user' => $data, 'group' => $group]);
if(!$usergroup) { if (!$usergroup) {
$usergroup= new UserGroup(); $usergroup = new UserGroup();
$usergroup->setUser($data); $usergroup->setUser($data);
$usergroup->setGroup($group); $usergroup->setGroup($group);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());
@ -363,13 +436,13 @@ class UserController extends AbstractController
} }
// Ajout des modos // Ajout des modos
foreach($lstmodos as $idmodo) { foreach ($lstmodos as $idmodo) {
$niveau01=$em->getRepository("App\Entity\Niveau01")->find($idmodo); $niveau01 = $em->getRepository("App\Entity\Niveau01")->find($idmodo);
$usermodo=$em->getRepository('App\Entity\UserModo')->findBy(["user"=>$data,"niveau01"=>$niveau01]); $usermodo = $em->getRepository('App\Entity\UserModo')->findBy(['user' => $data, 'niveau01' => $niveau01]);
if(!$usermodo) { if (!$usermodo) {
$usermodo= new UserModo(); $usermodo = new UserModo();
$usermodo->setUser($data); $usermodo->setUser($data);
$usermodo->setNiveau01($dataniveau01); $usermodo->setNiveau01($niveau01);
$em->getManager()->persist($usermodo); $em->getManager()->persist($usermodo);
$em->getManager()->flush(); $em->getManager()->flush();
@ -377,62 +450,71 @@ class UserController extends AbstractController
} }
// Retour à la liste // Retour à la liste
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [ return $this->render($this->twig.'edit.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"access"=>$access, 'access' => $access,
"mode"=>"submit", 'mode' => 'submit',
"form"=>$form->createView(), 'form' => $form->createView(),
$this->data=>$data, $this->data => $data,
"listgroups"=>$this->getListGroups("admin",$em), 'listgroups' => $this->getListGroups('admin', $em),
"listmodos"=> $this->getListModos($em) 'listmodos' => $this->getListModos($em),
]); ]);
} }
public function profil($access,Request $request,ManagerRegistry $em): Response public function profil($access, Request $request, ManagerRegistry $em): Response
{ {
$id=$this->getUser()->getId(); $id = $this->getUser()->getId();
return $this->update($access,$id,$request,$em);
return $this->update($access, $id, $request, $em);
} }
public function update($access,$id,Request $request,ManagerRegistry $em): Response public function update($access, $id, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->canupdate($access,$data,$em); $this->canupdate($access, $data, $em);
// Récupération de l'ancien password // Récupération de l'ancien password
$oldpassword=$data->getPassword(); $oldpassword = $data->getPassword();
// Récuparation des groupes associés // Récuparation des groupes associés
$oldlstgroups=[]; $oldlstgroups = [];
foreach($data->getGroups() as $group){ foreach ($data->getGroups() as $group) {
$oldlstgroups[] = $group->getGroup()->getId(); $oldlstgroups[] = $group->getGroup()->getId();
} }
// Récuparation des modos associés // Récuparation des modos associés
$oldlstmodos=[]; $oldlstmodos = [];
foreach($data->getModos() as $modo){ foreach ($data->getModos() as $modo) {
$oldlstmodos[] = $modo->getNiveau01()->getId(); $oldlstmodos[] = $modo->getNiveau01()->getId();
} }
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array( $form = $this->createForm(Form::class, $data, [
"mode"=>"update", 'mode' => 'update',
"access"=>$access, 'access' => $access,
"userid"=>$this->getUser()->getId(), 'userid' => $this->getUser()->getId(),
"appMasteridentity"=>$this->GetParameter("appMasteridentity"), 'appMasteridentity' => $this->GetParameter('appMasteridentity'),
"appNiveau01label"=>$this->GetParameter("appNiveau01label"), 'appNiveau01label' => $this->GetParameter('appNiveau01label'),
"appNiveau02label"=>$this->GetParameter("appNiveau02label"), 'appNiveau02use' => $this->GetParameter('appNiveau02use'),
)); 'appNiveau02label' => $this->GetParameter('appNiveau02label'),
'appNiveau03use' => $this->GetParameter('appNiveau03use'),
'appNiveau03label' => $this->GetParameter('appNiveau03label'),
'appNiveau04use' => $this->GetParameter('appNiveau04use'),
'appNiveau04label' => $this->GetParameter('appNiveau04label'),
'appNiveauupdatable' => $this->GetParameter('appNiveauupdatable'),
]);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -442,14 +524,14 @@ class UserController extends AbstractController
$data = $form->getData(); $data = $form->getData();
// S'assurer que les modos ne donne pas des ROLE_ADMIN ou ROLE_USER au user qu'il update // S'assurer que les modos ne donne pas des ROLE_ADMIN ou ROLE_USER au user qu'il update
if($access=="modo") { if ('modo' == $access) {
$roles=$data->getRoles(); $roles = $data->getRoles();
$roles=array_diff($roles,["ROLE_ADMIN","ROLE_MODO"]); $roles = array_diff($roles, ['ROLE_ADMIN', 'ROLE_MODO']);
$data->setRoles($roles); $data->setRoles($roles);
} }
// Si pas de changement de password on replace l'ancien // Si pas de changement de password on replace l'ancien
if($data->getPassword()=="") { if ('' == $data->getPassword()) {
$data->setPassword($oldpassword); $data->setPassword($oldpassword);
} }
// Sinon on encode le nouveau // Sinon on encode le nouveau
@ -461,16 +543,16 @@ class UserController extends AbstractController
$em->getManager()->flush(); $em->getManager()->flush();
// On récupère les groupes et on cacule ceux à ajouter ou à supprimer // On récupère les groupes et on cacule ceux à ajouter ou à supprimer
$lstgroups=array_filter(explode(",",$form->get("linkgroups")->getData())); $lstgroups = array_filter(explode(',', $form->get('linkgroups')->getData()));
$removegroups=array_diff($oldlstgroups,$lstgroups); $removegroups = array_diff($oldlstgroups, $lstgroups);
$addgroups=array_diff($lstgroups,$oldlstgroups); $addgroups = array_diff($lstgroups, $oldlstgroups);
// Ajout des nouveaux groupes // Ajout des nouveaux groupes
foreach($addgroups as $idgroup) { foreach ($addgroups as $idgroup) {
$group=$em->getRepository("App\Entity\Group")->find($idgroup); $group = $em->getRepository("App\Entity\Group")->find($idgroup);
$usergroup=$em->getRepository('App\Entity\UserGroup')->findOneBy(["user"=>$data,"group"=>$group]); $usergroup = $em->getRepository('App\Entity\UserGroup')->findOneBy(['user' => $data, 'group' => $group]);
if(!$usergroup) { if (!$usergroup) {
$usergroup= new UserGroup(); $usergroup = new UserGroup();
$usergroup->setUser($data); $usergroup->setUser($data);
$usergroup->setGroup($group); $usergroup->setGroup($group);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());
@ -481,27 +563,26 @@ class UserController extends AbstractController
} }
// Suppression des groupes obsolètes // Suppression des groupes obsolètes
foreach($removegroups as $idgroup) { foreach ($removegroups as $idgroup) {
$group=$em->getRepository("App\Entity\Group")->find($idgroup); $group = $em->getRepository("App\Entity\Group")->find($idgroup);
$usergroup=$em->getRepository('App\Entity\UserGroup')->findOneBy(["user"=>$data,"group"=>$group]); $usergroup = $em->getRepository('App\Entity\UserGroup')->findOneBy(['user' => $data, 'group' => $group]);
if($usergroup) { if ($usergroup) {
$em->getManager()->remove($usergroup); $em->getManager()->remove($usergroup);
$em->getManager()->flush(); $em->getManager()->flush();
} }
} }
// On récupère les modos et on cacule ceux à ajouter ou à supprimer // On récupère les modos et on cacule ceux à ajouter ou à supprimer
$linkmodos=array_filter(explode(",",$form->get("linkmodos")->getData())); $linkmodos = array_filter(explode(',', $form->get('linkmodos')->getData()));
$removemodos=array_diff($oldlstmodos,$linkmodos); $removemodos = array_diff($oldlstmodos, $linkmodos);
$addmodos=array_diff($linkmodos,$oldlstmodos); $addmodos = array_diff($linkmodos, $oldlstmodos);
// Ajout des nouveaux modos // Ajout des nouveaux modos
foreach($addmodos as $idmodo) { foreach ($addmodos as $idmodo) {
$niveau01=$em->getRepository("App\Entity\Niveau01")->find($idmodo); $niveau01 = $em->getRepository("App\Entity\Niveau01")->find($idmodo);
$usermodo=$em->getRepository('App\Entity\UserModo')->findOneBy(["user"=>$data,"niveau01"=>$niveau01]); $usermodo = $em->getRepository('App\Entity\UserModo')->findOneBy(['user' => $data, 'niveau01' => $niveau01]);
if(!$usermodo) { if (!$usermodo) {
$usermodo= new UserModo(); $usermodo = new UserModo();
$usermodo->setUser($data); $usermodo->setUser($data);
$usermodo->setNiveau01($niveau01); $usermodo->setNiveau01($niveau01);
$em->getManager()->persist($usermodo); $em->getManager()->persist($usermodo);
@ -510,154 +591,180 @@ class UserController extends AbstractController
} }
// Suppression des modos obsolètes // Suppression des modos obsolètes
foreach($removemodos as $idmodo) { foreach ($removemodos as $idmodo) {
$niveau01=$em->getRepository("App\Entity\Niveau01")->find($idmodo); $niveau01 = $em->getRepository("App\Entity\Niveau01")->find($idmodo);
$usermodo=$em->getRepository('App\Entity\UserModo')->findOneBy(["user"=>$data,"niveau01"=>$niveau01]); $usermodo = $em->getRepository('App\Entity\UserModo')->findOneBy(['user' => $data, 'niveau01' => $niveau01]);
if($usermodo) { if ($usermodo) {
$em->getManager()->remove($usermodo); $em->getManager()->remove($usermodo);
$em->getManager()->flush(); $em->getManager()->flush();
} }
} }
// Retour à la liste // Retour à la liste
if($access=="user") if ('all' == $access) {
return $this->redirectToRoute("app_home"); return $this->redirectToRoute('app_home');
else } else {
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
}
} }
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [ return $this->render($this->twig.'edit.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>($access=="admin"), 'usesidebar' => ('admin' == $access),
"access"=>$access, 'access' => $access,
"mode"=>"update", 'mode' => 'update',
"form"=>$form->createView(), 'form' => $form->createView(),
$this->data=>$data, $this->data => $data,
"listgroups"=>$this->getListGroups($access,$em), 'listgroups' => $this->getListGroups($access, $em),
"listmodos"=> $this->getListModos($em), 'listmodos' => $this->getListModos($em),
"maxsize"=>($access=="user"?1200:null), 'maxsize' => ('all' == $access ? 1200 : null),
]); ]);
} }
public function delete($access,$id,Request $request,ManagerRegistry $em): Response public function delete($access, $id, Request $request, ManagerRegistry $em): Response
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Controler les permissions // Controler les permissions
$this->candelete($access,$data,$em); $this->candelete($access, $data, $em);
// Tentative de suppression // Tentative de suppression
try{ try {
$em->getManager()->remove($data); $em->getManager()->remove($data);
$em->getManager()->flush(); $em->getManager()->flush();
} } catch (\Exception $e) {
catch (\Exception $e) { $request->getSession()->getFlashBag()->add('error', $e->getMessage());
$request->getSession()->getFlashBag()->add("error", $e->getMessage());
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)."_update",["id"=>$id]); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
} }
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
} }
protected function getListGroups($access,$em) protected function getListGroups($access, $em)
{ {
$qb=$em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('b')->from('App:Group','b'); $qb->select('b')->from('App:Group', 'b');
if($access!="admin") $qb->where("b.isopen=true AND b.isworkgroup=true"); if ('admin' != $access) {
$qb->andWhere("b.ldapfilter IS NULL"); $qb->where('b.isopen=true AND b.isworkgroup=true');
$qb->andWhere("b.attributes IS NULL"); }
$qb->andWhere("b.id>0"); $qb->andWhere('b.ldapfilter IS NULL');
$datas=$qb->getQuery()->getResult(); $qb->andWhere('b.attributes IS NULL');
$qb->andWhere('b.id>0');
$datas = $qb->getQuery()->getResult();
return $datas; return $datas;
} }
protected function getListModos($em) protected function getListModos($em)
{ {
$qb=$em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('b')->from('App:Niveau01','b'); $qb->select('b')->from('App:Niveau01', 'b');
$datas=$qb->getQuery()->getResult(); $datas = $qb->getQuery()->getResult();
return $datas; return $datas;
} }
private function cansubmit($access, $em)
private function cansubmit($access,$em) {
switch($access) {
case "admin" : return true; break;
case "modo" : return true; break;
}
throw $this->createAccessDeniedException('Permission denied');
}
private function canupdate($access,$entity,$em) {
switch($access) {
case "admin" : return true; break;
case "modo" :
$usermodo=$em->getRepository("App\Entity\UserModo")->findOneBy(["user"=>$this->getUser(),"niveau01"=>$entity->getNiveau01()]);
if(!$usermodo) throw $this->createAccessDeniedException('Permission denied');
return true;
break;
case "user" :
if($this->getUser()->getId()!=$entity->getId()) throw $this->createAccessDeniedException('Permission denied');
return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
private function candelete($access,$entity,$em) {
switch($access) {
case "admin" : return true; break;
case "modo" :
$usermodo=$em->getRepository("App\Entity\UserModo")->findOneBy(["user"=>$this->getUser(),"niveau01"=>$entity->getNiveau01()]);
if(!$usermodo) throw $this->createAccessDeniedException('Permission denied');
if($entity->hasRole("ROLE_ADMIN")||$entity->hasRole("ROLE_MODO")) throw $this->createAccessDeniedException('Permission denied');
return true;
break;
case "user" :
if($this->getUser()->getId()!=$entity->getId()) throw $this->createAccessDeniedException('Permission denied');
return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
public function preference($access,Request $request,ManagerRegistry $em): Response
{ {
$key=$request->request->get('key'); switch ($access) {
$id=$request->request->get('id'); case 'admin': return true;
$value=$request->request->get('value'); break;
case 'modo': return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
private function canupdate($access, $entity, $em)
{
switch ($access) {
case 'admin': return true;
break;
case 'modo':
$usermodo = $em->getRepository("App\Entity\UserModo")->findOneBy(['user' => $this->getUser(), 'niveau01' => $entity->getNiveau01()]);
if (!$usermodo) {
throw $this->createAccessDeniedException('Permission denied');
}
return true;
break;
case 'all':
if ($this->getUser()->getId() != $entity->getId()) {
throw $this->createAccessDeniedException('Permission denied');
}
return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
private function candelete($access, $entity, $em)
{
switch ($access) {
case 'admin': return true;
break;
case 'modo':
$usermodo = $em->getRepository("App\Entity\UserModo")->findOneBy(['user' => $this->getUser(), 'niveau01' => $entity->getNiveau01()]);
if (!$usermodo) {
throw $this->createAccessDeniedException('Permission denied');
}
if ($entity->hasRole('ROLE_ADMIN') || $entity->hasRole('ROLE_MODO')) {
throw $this->createAccessDeniedException('Permission denied');
}
return true;
break;
case 'all':
if ($this->getUser()->getId() != $entity->getId()) {
throw $this->createAccessDeniedException('Permission denied');
}
return true;
break;
}
throw $this->createAccessDeniedException('Permission denied');
}
public function preference($access, Request $request, ManagerRegistry $em): Response
{
$key = $request->request->get('key');
$id = $request->request->get('id');
$value = $request->request->get('value');
// Récupérer les préférences de l'utilisateur // Récupérer les préférences de l'utilisateur
$preference=$this->getUser()->getPreference(); $preference = $this->getUser()->getPreference();
// Mise à jour de la préférence // Mise à jour de la préférence
$toupdate=false; $toupdate = false;
if(!is_array($preference)) { if (!is_array($preference)) {
$toupdate=true; $toupdate = true;
$preference=[]; $preference = [];
} }
if(!array_key_exists($key,$preference)) { if (!array_key_exists($key, $preference)) {
$toupdate=true; $toupdate = true;
$preference[$key]=[]; $preference[$key] = [];
} }
if((!array_key_exists($id,$preference[$key]))) { if (!array_key_exists($id, $preference[$key])) {
$toupdate=true; $toupdate = true;
$preference[$key][$id]=$value; $preference[$key][$id] = $value;
} }
if($preference[$key][$id]!=$value) { if ($preference[$key][$id] != $value) {
$toupdate=true; $toupdate = true;
$preference[$key][$id]=$value; $preference[$key][$id] = $value;
} }
// Mise à jour des préferences // Mise à jour des préferences
if($toupdate) { if ($toupdate) {
$this->getUser()->setPreference($preference); $this->getUser()->setPreference($preference);
$em->getManager()->flush(); $em->getManager()->flush();
} }

View File

@ -2,110 +2,113 @@
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\Whitelist as Entity; use App\Entity\Whitelist as Entity;
use App\Form\WhitelistType as Form; use App\Form\WhitelistType as Form;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class WhitelistController extends AbstractController class WhitelistController extends AbstractController
{ {
private $data="whitelist"; private $data = 'whitelist';
private $entity="App\Entity\Whitelist"; private $entity = "App\Entity\Whitelist";
private $twig="Whitelist/"; private $twig = 'Whitelist/';
private $route="app_admin_whitelist"; private $route = 'app_admin_whitelist';
public function list($access): Response public function list($access): Response
{ {
return $this->render($this->twig.'list.html.twig',[ return $this->render($this->twig.'list.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"access"=>$access, 'access' => $access,
]); ]);
} }
public function tablelist(Request $request,ManagerRegistry $em): Response public function tablelist(Request $request, ManagerRegistry $em): Response
{ {
$query=$request->query->all(); $query = $request->query->all();
$start=$query['start']; $start = $query['start'];
$length=$query['length']; $length = $query['length'];
$search=$query['search']; $search = $query['search'];
$draw= $query['draw']; $draw = $query['draw'];
$ordercolumn=$query['order'][0]['column']; $ordercolumn = $query['order'][0]['column'];
$orderdir=$query['order'][0]['dir']; $orderdir = $query['order'][0]['dir'];
// Nombre total d'enregistrement // Nombre total d'enregistrement
$total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity,'entity')->getQuery()->getSingleScalarResult(); $total = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity, 'entity')->getQuery()->getSingleScalarResult();
// Nombre d'enregistrement filtré // Nombre d'enregistrement filtré
if(!$search||$search["value"]=="") if (!$search || '' == $search['value']) {
$totalf = $total; $totalf = $total;
else { } else {
$totalf= $em->getManager()->createQueryBuilder() $totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(entity)') ->select('COUNT(entity)')
->from($this->entity,'entity') ->from($this->entity, 'entity')
->where('entity.label LIKE :value') ->where('entity.label LIKE :value')
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
} }
// Construction du tableau de retour // Construction du tableau de retour
$output = array( $output = [
'draw' => $draw, 'draw' => $draw,
'recordsFiltered' => $totalf, 'recordsFiltered' => $totalf,
'recordsTotal' => $total, 'recordsTotal' => $total,
'data' => array(), 'data' => [],
); ];
// Parcours des Enregistrement // Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder(); $qb = $em->getManager()->createQueryBuilder();
$qb->select('entity')->from($this->entity,'entity'); $qb->select('entity')->from($this->entity, 'entity');
if($search&&$search["value"]!="") { if ($search && '' != $search['value']) {
$qb ->andWhere('entity.label LIKE :value') $qb->andWhere('entity.label LIKE :value')
->setParameter("value", "%".$search["value"]."%"); ->setParameter('value', '%'.$search['value'].'%');
} }
if($ordercolumn) { if ($ordercolumn) {
switch($ordercolumn) { switch ($ordercolumn) {
case 1 : case 1:
$qb->orderBy('entity.label',$orderdir); $qb->orderBy('entity.label', $orderdir);
break; break;
} }
} }
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) { foreach ($datas as $data) {
// Action // Action
$action = ""; $action = '';
$action.="<a href='".$this->generateUrl($this->route.'_update', array('id'=>$data->getId()))."'><i class='fa fa-file fa-fw fa-2x'></i></a>"; $action .= "<a href='".$this->generateUrl($this->route.'_update', ['id' => $data->getId()])."'><i class='fa fa-file fa-fw fa-2x'></i></a>";
$tmp=array(); $tmp = [];
array_push($tmp,$action); array_push($tmp, $action);
array_push($tmp,$data->getLabel()); array_push($tmp, $data->getLabel());
if($this->getParameter("appMasteridentity")=="LDAP"||$this->getParameter("appSynchro")=="LDAP2NINE") array_push($tmp,$data->getLdapfilter()); if ('LDAP' == $this->getParameter('appMasteridentity') || 'LDAP2NINE' == $this->getParameter('appSynchro')) {
if($this->getParameter("appMasteridentity")=="SSO") array_push($tmp,$data->getAttributes()); array_push($tmp, $data->getLdapfilter());
}
if ('SSO' == $this->getParameter('appMasteridentity')) {
array_push($tmp, $data->getAttributes());
}
array_push($output["data"],$tmp); array_push($output['data'], $tmp);
} }
// Retour // Retour
return new JsonResponse($output); return new JsonResponse($output);
} }
public function submit($access,Request $request,ManagerRegistry $em): Response public function submit($access, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data = new Entity(); $data = new Entity();
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"submit")); $form = $this->createForm(Form::class, $data, ['mode' => 'submit']);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -124,24 +127,26 @@ class WhitelistController extends AbstractController
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'edit.html.twig', [ return $this->render($this->twig.'edit.html.twig', [
"useheader"=>true, 'useheader' => true,
"usemenu"=>false, 'usemenu' => false,
"usesidebar"=>true, 'usesidebar' => true,
"mode"=>"submit", 'mode' => 'submit',
"form"=>$form->createView(), 'form' => $form->createView(),
$this->data=>$data, $this->data => $data,
"access"=>$access, 'access' => $access,
]); ]);
} }
public function update($id,$access,Request $request,ManagerRegistry $em): Response public function update($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Initialisation de l'enregistrement // Initialisation de l'enregistrement
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Création du formulaire // Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"update")); $form = $this->createForm(Form::class, $data, ['mode' => 'update']);
// Récupération des data du formulaire // Récupération des data du formulaire
$form->handleRequest($request); $form->handleRequest($request);
@ -163,40 +168,43 @@ class WhitelistController extends AbstractController
$this->data => $data, $this->data => $data,
'mode' => 'update', 'mode' => 'update',
'form' => $form->createView(), 'form' => $form->createView(),
"access"=>$access, 'access' => $access,
]); ]);
} }
public function delete($id,$access,Request $request,ManagerRegistry $em): Response public function delete($id, $access, Request $request, ManagerRegistry $em): Response
{ {
// Récupération de l'enregistrement courant // Récupération de l'enregistrement courant
$data=$em->getRepository($this->entity)->find($id); $data = $em->getRepository($this->entity)->find($id);
if (!$data) throw $this->createNotFoundException('Unable to find entity.'); if (!$data) {
throw $this->createNotFoundException('Unable to find entity.');
}
// Tentative de suppression // Tentative de suppression
try{ try {
$em->getManager()->remove($data); $em->getManager()->remove($data);
$em->getManager()->flush(); $em->getManager()->flush();
} } catch (\Exception $e) {
catch (\Exception $e) { $request->getSession()->getFlashBag()->add('error', $e->getMessage());
$request->getSession()->getFlashBag()->add("error", $e->getMessage());
return $this->redirectToRoute($this->route."_update",["id"=>$id]); return $this->redirectToRoute($this->route.'_update', ['id' => $id]);
} }
return $this->redirectToRoute($this->route); return $this->redirectToRoute($this->route);
} }
public function is(Request $request,ManagerRegistry $em) public function is(Request $request, ManagerRegistry $em)
{ {
$email=$request->request->get('email'); $email = $request->request->get('email');
$email=explode("@",$email); $email = explode('@', $email);
$domaine=end($email); $domaine = end($email);
// Rechercher le mail dans la liste blanche // Rechercher le mail dans la liste blanche
$whitelist=$em->getRepository($this->entity)->findOneBy(["label"=>$domaine]); $whitelist = $em->getRepository($this->entity)->findOneBy(['label' => $domaine]);
if($whitelist) if ($whitelist) {
return new Response("OK", 200); return new Response('OK', 200);
else } else {
return new Response("KO", 200); return new Response('KO', 200);
}
} }
} }

View File

@ -2,12 +2,10 @@
namespace App\Entity; namespace App\Entity;
use App\Repository\AuditRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* Cron * Cron.
* *
* @ORM\Table(name="audit",indexes={@ORM\Index(name="search_idx", columns={"entityname", "entityid", "datesubmit"})}) * @ORM\Table(name="audit",indexes={@ORM\Index(name="search_idx", columns={"entityname", "entityid", "datesubmit"})})
* @ORM\Entity(repositoryClass="App\Repository\AuditRepository") * @ORM\Entity(repositoryClass="App\Repository\AuditRepository")
@ -35,7 +33,6 @@ class Audit
*/ */
private $datesubmit; private $datesubmit;
/** /**
* @ORM\Column(type="string", length=250, nullable=false) * @ORM\Column(type="string", length=250, nullable=false)
*/ */
@ -49,7 +46,7 @@ class Audit
/** /**
* @ORM\Column(type="array", nullable=true) * @ORM\Column(type="array", nullable=true)
*/ */
private $detail = array(); private $detail = [];
public function getId(): ?int public function getId(): ?int
{ {
@ -127,6 +124,4 @@ class Audit
return $this; return $this;
} }
} }

View File

@ -2,12 +2,10 @@
namespace App\Entity; namespace App\Entity;
use App\Repository\ConfigRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* Cron * Cron.
* *
* @ORM\Table(name="config") * @ORM\Table(name="config")
* @ORM\HasLifecycleCallbacks() * @ORM\HasLifecycleCallbacks()
@ -75,7 +73,7 @@ class Config
*/ */
private $help; private $help;
//== CODE A NE PAS REGENERER // == CODE A NE PAS REGENERER
public function setId(string $id): self public function setId(string $id): self
{ {
@ -86,18 +84,20 @@ class Config
public function getValue(): ?string public function getValue(): ?string
{ {
if($this->value=="") return $this->default; if ('' == $this->value) {
else return $this->value; return $this->default;
} else {
return $this->value;
}
} }
//== FIN DU CODE A NE PAS REGENERER // == FIN DU CODE A NE PAS REGENERER
public function getId(): ?string public function getId(): ?string
{ {
return $this->id; return $this->id;
} }
public function getTitle(): ?string public function getTitle(): ?string
{ {
return $this->title; return $this->title;

View File

@ -2,12 +2,11 @@
namespace App\Entity; namespace App\Entity;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
/** /**
* Cron * Cron.
* *
* @ORM\Table(name="cron") * @ORM\Table(name="cron")
* @ORM\Entity(repositoryClass="App\Repository\CronRepository") * @ORM\Entity(repositoryClass="App\Repository\CronRepository")
@ -15,7 +14,7 @@ use Symfony\Component\Validator\Constraints as Assert;
class Cron class Cron
{ {
/** /**
* @var integer * @var int
* *
* @ORM\Column(name="id", type="integer") * @ORM\Column(name="id", type="integer")
* @ORM\Id * @ORM\Id
@ -28,7 +27,6 @@ class Cron
* *
* @ORM\Column(name="command", type="string", nullable=false) * @ORM\Column(name="command", type="string", nullable=false)
* @Assert\NotBlank() * @Assert\NotBlank()
*
*/ */
private $command; private $command;
@ -72,11 +70,11 @@ class Cron
*/ */
private $jsonargument; private $jsonargument;
// A garder pour forcer l'id en init // A garder pour forcer l'id en init
public function setId($id) public function setId($id)
{ {
$this->id = $id; $this->id = $id;
return $this; return $this;
} }
@ -88,10 +86,13 @@ class Cron
// A garder pour récupérer le label du statut // A garder pour récupérer le label du statut
public function getStatutLabel() public function getStatutLabel()
{ {
switch($this->statut) { switch ($this->statut) {
case -1: return "Désactivé"; break; case -1: return 'Désactivé';
case 0: return "KO"; break; break;
case 1: return "OK"; break; case 0: return 'KO';
break;
case 1: return 'OK';
break;
} }
} }

View File

@ -1,11 +1,10 @@
<?php <?php
namespace App\Entity; namespace App\Entity;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/** /**
@ -79,7 +78,7 @@ class Group
private $owner; private $owner;
/** /**
* @var ArrayCollection $users * @var ArrayCollection
* @var UserGroup * @var UserGroup
* *
* @ORM\OneToMany(targetEntity="UserGroup", mappedBy="group", cascade={"persist"}, orphanRemoval=true) * @ORM\OneToMany(targetEntity="UserGroup", mappedBy="group", cascade={"persist"}, orphanRemoval=true)
@ -91,13 +90,14 @@ class Group
$this->users = new ArrayCollection(); $this->users = new ArrayCollection();
} }
//== CODE A NE PAS REGENERER // == CODE A NE PAS REGENERER
public function setId(int $id): self public function setId(int $id): self
{ {
$this->id = $id; $this->id = $id;
return $this; return $this;
} }
//== FIN DU CODE A NE PAS REGENERER // == FIN DU CODE A NE PAS REGENERER
public function getId(): ?int public function getId(): ?int
{ {
@ -212,18 +212,6 @@ class Group
return $this; return $this;
} }
public function getInvitations(): ?array
{
return $this->invitations;
}
public function setInvitations(?array $invitations): self
{
$this->invitations = $invitations;
return $this;
}
public function getOwner(): ?User public function getOwner(): ?User
{ {
return $this->owner; return $this->owner;

View File

@ -1,13 +1,12 @@
<?php <?php
namespace App\Entity; namespace App\Entity;
use Doctrine\Common\Collections\Collection; use App\Validator;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use App\Validator as Validator;
/** /**
* @ORM\Entity * @ORM\Entity
@ -33,6 +32,26 @@ class Niveau01
*/ */
private $label; private $label;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $code;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $postaladress;
/**
* @ORM\Column(type="string", length=60, nullable=true)
*/
private $telephonenumber;
/**
* @ORM\Column(type="string", length=60, nullable=true)
*/
private $email;
/** /**
* @ORM\Column(type="string") * @ORM\Column(type="string")
*/ */
@ -54,7 +73,7 @@ class Niveau01
private $idexternal; private $idexternal;
/** /**
* @var ArrayCollection $niveau02s * @var ArrayCollection
* @var Registration * @var Registration
* *
* @ORM\OneToMany(targetEntity="Niveau02", mappedBy="niveau01", cascade={"persist"}, orphanRemoval=false) * @ORM\OneToMany(targetEntity="Niveau02", mappedBy="niveau01", cascade={"persist"}, orphanRemoval=false)
@ -62,7 +81,7 @@ class Niveau01
private $niveau02s; private $niveau02s;
/** /**
* @var ArrayCollection $registrations * @var ArrayCollection
* @var Registration * @var Registration
* *
* @ORM\OneToMany(targetEntity="Registration", mappedBy="niveau01", cascade={"persist"}, orphanRemoval=false) * @ORM\OneToMany(targetEntity="Registration", mappedBy="niveau01", cascade={"persist"}, orphanRemoval=false)
@ -70,16 +89,15 @@ class Niveau01
private $registrations; private $registrations;
/** /**
* @var ArrayCollection $users * @var ArrayCollection
* @var User * @var User
* *
* @ORM\OneToMany(targetEntity="User", mappedBy="niveau01", cascade={"persist"}, orphanRemoval=false) * @ORM\OneToMany(targetEntity="User", mappedBy="niveau01", cascade={"persist"}, orphanRemoval=false)
*/ */
private $users; private $users;
/** /**
* @var ArrayCollection $modos * @var ArrayCollection
* @var User * @var User
* *
* @ORM\OneToMany(targetEntity="UserModo", mappedBy="niveau01", cascade={"persist"}, orphanRemoval=false) * @ORM\OneToMany(targetEntity="UserModo", mappedBy="niveau01", cascade={"persist"}, orphanRemoval=false)
@ -94,14 +112,14 @@ class Niveau01
$this->modos = new ArrayCollection(); $this->modos = new ArrayCollection();
} }
// == CODE A NE PAS REGENERER
//== CODE A NE PAS REGENERER
public function setId(int $id): self public function setId(int $id): self
{ {
$this->id = $id; $this->id = $id;
return $this; return $this;
} }
//== FIN DU CODE A NE PAS REGENERER // == FIN DU CODE A NE PAS REGENERER
public function getId(): ?int public function getId(): ?int
{ {
@ -288,5 +306,51 @@ class Niveau01
return $this; return $this;
} }
public function getCode(): ?string
{
return $this->code;
}
public function setCode(?string $code): self
{
$this->code = $code;
return $this;
}
public function getPostaladress(): ?string
{
return $this->postaladress;
}
public function setPostaladress(?string $postaladress): self
{
$this->postaladress = $postaladress;
return $this;
}
public function getTelephonenumber(): ?string
{
return $this->telephonenumber;
}
public function setTelephonenumber(?string $telephonenumber): self
{
$this->telephonenumber = $telephonenumber;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
} }

View File

@ -1,12 +1,12 @@
<?php <?php
namespace App\Entity; namespace App\Entity;
use App\Validator;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use App\Validator as Validator;
/** /**
* @ORM\Entity * @ORM\Entity
@ -32,6 +32,26 @@ class Niveau02
*/ */
private $label; private $label;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $code;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $postaladress;
/**
* @ORM\Column(type="string", length=60, nullable=true)
*/
private $telephonenumber;
/**
* @ORM\Column(type="string", length=60, nullable=true)
*/
private $email;
/** /**
* @ORM\Column(type="string") * @ORM\Column(type="string")
*/ */
@ -44,7 +64,15 @@ class Niveau02
private $niveau01; private $niveau01;
/** /**
* @var ArrayCollection $registrations * @var ArrayCollection
* @var Registration
*
* @ORM\OneToMany(targetEntity="Niveau03", mappedBy="niveau02", cascade={"persist"}, orphanRemoval=false)
*/
private $niveau03s;
/**
* @var ArrayCollection
* @var Registration * @var Registration
* *
* @ORM\OneToMany(targetEntity="Registration", mappedBy="niveau02", cascade={"persist"}, orphanRemoval=false) * @ORM\OneToMany(targetEntity="Registration", mappedBy="niveau02", cascade={"persist"}, orphanRemoval=false)
@ -52,7 +80,7 @@ class Niveau02
private $registrations; private $registrations;
/** /**
* @var ArrayCollection $users * @var ArrayCollection
* @var User * @var User
* *
* @ORM\OneToMany(targetEntity="User", mappedBy="niveau02", cascade={"persist"}, orphanRemoval=false) * @ORM\OneToMany(targetEntity="User", mappedBy="niveau02", cascade={"persist"}, orphanRemoval=false)
@ -61,6 +89,7 @@ class Niveau02
public function __construct() public function __construct()
{ {
$this->niveau03s = new ArrayCollection();
$this->registrations = new ArrayCollection(); $this->registrations = new ArrayCollection();
$this->users = new ArrayCollection(); $this->users = new ArrayCollection();
} }
@ -106,6 +135,36 @@ class Niveau02
return $this; return $this;
} }
/**
* @return Collection<int, Niveau03>
*/
public function getNiveau03s(): Collection
{
return $this->niveau03s;
}
public function addNiveau03(Niveau03 $niveau03): self
{
if (!$this->niveau03s->contains($niveau03)) {
$this->niveau03s->add($niveau03);
$niveau03->setNiveau02($this);
}
return $this;
}
public function removeNiveau03(Niveau03 $niveau03): self
{
if ($this->niveau03s->removeElement($niveau03)) {
// set the owning side to null (unless already changed)
if ($niveau03->getNiveau02() === $this) {
$niveau03->setNiveau02(null);
}
}
return $this;
}
/** /**
* @return Collection<int, Registration> * @return Collection<int, Registration>
*/ */
@ -117,7 +176,7 @@ class Niveau02
public function addRegistration(Registration $registration): self public function addRegistration(Registration $registration): self
{ {
if (!$this->registrations->contains($registration)) { if (!$this->registrations->contains($registration)) {
$this->registrations[] = $registration; $this->registrations->add($registration);
$registration->setNiveau02($this); $registration->setNiveau02($this);
} }
@ -147,7 +206,7 @@ class Niveau02
public function addUser(User $user): self public function addUser(User $user): self
{ {
if (!$this->users->contains($user)) { if (!$this->users->contains($user)) {
$this->users[] = $user; $this->users->add($user);
$user->setNiveau02($this); $user->setNiveau02($this);
} }
@ -166,4 +225,51 @@ class Niveau02
return $this; return $this;
} }
public function getCode(): ?string
{
return $this->code;
}
public function setCode(?string $code): self
{
$this->code = $code;
return $this;
}
public function getPostaladress(): ?string
{
return $this->postaladress;
}
public function setPostaladress(?string $postaladress): self
{
$this->postaladress = $postaladress;
return $this;
}
public function getTelephonenumber(): ?string
{
return $this->telephonenumber;
}
public function setTelephonenumber(?string $telephonenumber): self
{
$this->telephonenumber = $telephonenumber;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
} }

291
src/Entity/Niveau03.php Normal file
View File

@ -0,0 +1,291 @@
<?php
namespace App\Entity;
use App\Validator;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity
* @ORM\Table(name="niveau03")
* @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="App\Repository\Niveau03Repository")
*
* @UniqueEntity(fields="label", message="Un Niveau de rang 3 existe déjà avec ce label")
*/
class Niveau03
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=250, unique=true)
* @Validator\Grouplabel()
* @Validator\Niveau02unique()
*/
private $label;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $code;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $postaladress;
/**
* @ORM\Column(type="string", length=60, nullable=true)
*/
private $telephonenumber;
/**
* @ORM\Column(type="string", length=60, nullable=true)
*/
private $email;
/**
* @ORM\Column(type="string")
*/
private $apikey;
/**
* @ORM\ManyToOne(targetEntity="Niveau02", inversedBy="niveau03s")
* @ORM\JoinColumn(nullable=false)
*/
private $niveau02;
/**
* @var ArrayCollection
* @var Registration
*
* @ORM\OneToMany(targetEntity="Niveau04", mappedBy="niveau03", cascade={"persist"}, orphanRemoval=false)
*/
private $niveau04s;
/**
* @var ArrayCollection
* @var Registration
*
* @ORM\OneToMany(targetEntity="Registration", mappedBy="niveau03", cascade={"persist"}, orphanRemoval=false)
*/
private $registrations;
/**
* @var ArrayCollection
* @var User
*
* @ORM\OneToMany(targetEntity="User", mappedBy="niveau03", cascade={"persist"}, orphanRemoval=false)
*/
private $users;
// == CODE A NE PAS REGENERER
private $niveau01;
public function getNiveau01(): ?Niveau01
{
return $this->niveau02 ? $this->niveau02->getNiveau01() : null;
}
public function setNiveau01(?Niveau01 $niveau01): self
{
$this->niveau01 = $niveau01;
return $this;
}
// ==
public function __construct()
{
$this->niveau04s = new ArrayCollection();
$this->registrations = new ArrayCollection();
$this->users = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getLabel(): ?string
{
return $this->label;
}
public function setLabel(string $label): self
{
$this->label = $label;
return $this;
}
public function getApikey(): ?string
{
return $this->apikey;
}
public function setApikey(string $apikey): self
{
$this->apikey = $apikey;
return $this;
}
public function getNiveau02(): ?Niveau02
{
return $this->niveau02;
}
public function setNiveau02(?Niveau02 $niveau02): self
{
$this->niveau02 = $niveau02;
return $this;
}
/**
* @return Collection<int, Niveau04>
*/
public function getNiveau04s(): Collection
{
return $this->niveau04s;
}
public function addNiveau04(Niveau04 $niveau04): self
{
if (!$this->niveau04s->contains($niveau04)) {
$this->niveau04s->add($niveau04);
$niveau04->setNiveau03($this);
}
return $this;
}
public function removeNiveau04(Niveau04 $niveau04): self
{
if ($this->niveau04s->removeElement($niveau04)) {
// set the owning side to null (unless already changed)
if ($niveau04->getNiveau03() === $this) {
$niveau04->setNiveau03(null);
}
}
return $this;
}
/**
* @return Collection<int, Registration>
*/
public function getRegistrations(): Collection
{
return $this->registrations;
}
public function addRegistration(Registration $registration): self
{
if (!$this->registrations->contains($registration)) {
$this->registrations->add($registration);
$registration->setNiveau03($this);
}
return $this;
}
public function removeRegistration(Registration $registration): self
{
if ($this->registrations->removeElement($registration)) {
// set the owning side to null (unless already changed)
if ($registration->getNiveau03() === $this) {
$registration->setNiveau03(null);
}
}
return $this;
}
/**
* @return Collection<int, User>
*/
public function getUsers(): Collection
{
return $this->users;
}
public function addUser(User $user): self
{
if (!$this->users->contains($user)) {
$this->users->add($user);
$user->setNiveau03($this);
}
return $this;
}
public function removeUser(User $user): self
{
if ($this->users->removeElement($user)) {
// set the owning side to null (unless already changed)
if ($user->getNiveau03() === $this) {
$user->setNiveau03(null);
}
}
return $this;
}
public function getCode(): ?string
{
return $this->code;
}
public function setCode(?string $code): self
{
$this->code = $code;
return $this;
}
public function getPostaladress(): ?string
{
return $this->postaladress;
}
public function setPostaladress(?string $postaladress): self
{
$this->postaladress = $postaladress;
return $this;
}
public function getTelephonenumber(): ?string
{
return $this->telephonenumber;
}
public function setTelephonenumber(?string $telephonenumber): self
{
$this->telephonenumber = $telephonenumber;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
}

267
src/Entity/Niveau04.php Normal file
View File

@ -0,0 +1,267 @@
<?php
namespace App\Entity;
use App\Validator;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity
* @ORM\Table(name="niveau04")
* @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="App\Repository\Niveau04Repository")
*
* @UniqueEntity(fields="label", message="Un Niveau de rang 4 existe déjà avec ce label")
*/
class Niveau04
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=250, unique=true)
* @Validator\Grouplabel()
* @Validator\Niveau02unique()
*/
private $label;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $code;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $postaladress;
/**
* @ORM\Column(type="string", length=60, nullable=true)
*/
private $telephonenumber;
/**
* @ORM\Column(type="string", length=60, nullable=true)
*/
private $email;
/**
* @ORM\Column(type="string")
*/
private $apikey;
/**
* @ORM\ManyToOne(targetEntity="Niveau03", inversedBy="niveau04s")
* @ORM\JoinColumn(nullable=false)
*/
private $niveau03;
/**
* @var ArrayCollection
* @var Registration
*
* @ORM\OneToMany(targetEntity="Registration", mappedBy="niveau04", cascade={"persist"}, orphanRemoval=false)
*/
private $registrations;
/**
* @var ArrayCollection
* @var User
*
* @ORM\OneToMany(targetEntity="User", mappedBy="niveau04", cascade={"persist"}, orphanRemoval=false)
*/
private $users;
// == CODE A NE PAS REGENERER
private $niveau01;
public function getNiveau01(): ?Niveau01
{
return $this->niveau03 ? $this->niveau03->getNiveau02()->getNiveau01() : null;
}
public function setNiveau01(?Niveau01 $niveau01): self
{
$this->niveau01 = $niveau01;
return $this;
}
private $niveau02;
public function getNiveau02(): ?Niveau02
{
return $this->niveau03 ? $this->niveau03->getNiveau02() : null;
}
public function setNiveau02(?Niveau02 $niveau02): self
{
$this->niveau02 = $niveau02;
return $this;
}
// ==
public function __construct()
{
$this->registrations = new ArrayCollection();
$this->users = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getLabel(): ?string
{
return $this->label;
}
public function setLabel(string $label): self
{
$this->label = $label;
return $this;
}
public function getApikey(): ?string
{
return $this->apikey;
}
public function setApikey(string $apikey): self
{
$this->apikey = $apikey;
return $this;
}
public function getNiveau03(): ?Niveau03
{
return $this->niveau03;
}
public function setNiveau03(?Niveau03 $niveau03): self
{
$this->niveau03 = $niveau03;
return $this;
}
/**
* @return Collection<int, Registration>
*/
public function getRegistrations(): Collection
{
return $this->registrations;
}
public function addRegistration(Registration $registration): self
{
if (!$this->registrations->contains($registration)) {
$this->registrations->add($registration);
$registration->setNiveau04($this);
}
return $this;
}
public function removeRegistration(Registration $registration): self
{
if ($this->registrations->removeElement($registration)) {
// set the owning side to null (unless already changed)
if ($registration->getNiveau04() === $this) {
$registration->setNiveau04(null);
}
}
return $this;
}
/**
* @return Collection<int, User>
*/
public function getUsers(): Collection
{
return $this->users;
}
public function addUser(User $user): self
{
if (!$this->users->contains($user)) {
$this->users->add($user);
$user->setNiveau04($this);
}
return $this;
}
public function removeUser(User $user): self
{
if ($this->users->removeElement($user)) {
// set the owning side to null (unless already changed)
if ($user->getNiveau04() === $this) {
$user->setNiveau04(null);
}
}
return $this;
}
public function getCode(): ?string
{
return $this->code;
}
public function setCode(?string $code): self
{
$this->code = $code;
return $this;
}
public function getPostaladress(): ?string
{
return $this->postaladress;
}
public function setPostaladress(?string $postaladress): self
{
$this->postaladress = $postaladress;
return $this;
}
public function getTelephonenumber(): ?string
{
return $this->telephonenumber;
}
public function setTelephonenumber(?string $telephonenumber): self
{
$this->telephonenumber = $telephonenumber;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
}

View File

@ -1,16 +1,12 @@
<?php <?php
namespace App\Entity; namespace App\Entity;
use Doctrine\Common\Collections\Collection; use App\Validator;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\LegacyPasswordAuthenticatedUserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\LegacyPasswordAuthenticatedUserInterface;
use App\Validator as Validator; use Symfony\Component\Security\Core\User\UserInterface;
/** /**
* @ORM\Entity * @ORM\Entity
@ -126,14 +122,24 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
*/ */
private $niveau02; private $niveau02;
/**
* @ORM\ManyToOne(targetEntity="Niveau03", inversedBy="registrations")
*/
private $niveau03;
/**
* @ORM\ManyToOne(targetEntity="Niveau04", inversedBy="registrations")
*/
private $niveau04;
// == CODE A NE PAS REGENERER
private $roles;
//== CODE A NE PAS REGENERER
public function getUserIdentifier(): string public function getUserIdentifier(): string
{ {
return $this->username; return $this->username;
} }
public function setPasswordDirect($password) public function setPasswordDirect($password)
{ {
// Permet de setter le password généré lors de l'inscription // Permet de setter le password généré lors de l'inscription
@ -152,13 +158,13 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
public function setPassword($password): self public function setPassword($password): self
{ {
if($password!=$this->password&&$password!=""){ if ($password != $this->password && '' != $password) {
// Placer le password non encodé dans une variable tempo sur laquel on va appliquer la contraite de form // Placer le password non encodé dans une variable tempo sur laquel on va appliquer la contraite de form
$this->passwordplain = $password; $this->passwordplain = $password;
// Password encrypté format openldap // Password encrypté format openldap
$this->salt = uniqid(mt_rand(), true); $this->salt = uniqid(mt_rand(), true);
$hash = "{SSHA}" . base64_encode(pack("H*", sha1($password . $this->salt)) . $this->salt); $hash = '{SSHA}'.base64_encode(pack('H*', sha1($password.$this->salt)).$this->salt);
$this->password = $hash; $this->password = $hash;
} }
@ -192,22 +198,24 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
public function hasRole(string $role): ?bool public function hasRole(string $role): ?bool
{ {
return in_array($role,$this->getRoles()); return in_array($role, $this->getRoles());
} }
public function setRole(string $role): self public function setRole(string $role): self
{ {
if(!$this->hasRole($role)) if (!$this->hasRole($role)) {
array_push($this->roles,$role); array_push($this->roles, $role);
}
return $this; return $this;
} }
public function getDisplayname() { public function getDisplayname()
return $this->firstname." ".$this->lastname; {
return $this->firstname.' '.$this->lastname;
} }
//== FIN DU CODE A NE PAS REGENERER // == FIN DU CODE A NE PAS REGENERER
public function getId(): ?int public function getId(): ?int
{ {
@ -413,4 +421,27 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
return $this; return $this;
} }
public function getNiveau03(): ?Niveau03
{
return $this->niveau03;
}
public function setNiveau03(?Niveau03 $niveau03): self
{
$this->niveau03 = $niveau03;
return $this;
}
public function getNiveau04(): ?Niveau04
{
return $this->niveau04;
}
public function setNiveau04(?Niveau04 $niveau04): self
{
$this->niveau04 = $niveau04;
return $this;
}
} }

View File

@ -1,16 +1,14 @@
<?php <?php
namespace App\Entity; namespace App\Entity;
use Doctrine\Common\Collections\Collection; use App\Validator;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Security\Core\User\UserInterface; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\LegacyPasswordAuthenticatedUserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\LegacyPasswordAuthenticatedUserInterface;
use App\Validator as Validator; use Symfony\Component\Security\Core\User\UserInterface;
/** /**
* @ORM\Entity * @ORM\Entity
@ -56,7 +54,7 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
* *
* @ORM\Column(type="array", length=255) * @ORM\Column(type="array", length=255)
*/ */
private $roles = array(); private $roles = [];
/** /**
* @ORM\Column(type="string", length=250) * @ORM\Column(type="string", length=250)
@ -73,6 +71,11 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
*/ */
private $salt; private $salt;
/**
* @ORM\Column(type="boolean")
*/
protected $isactive;
/** /**
* @ORM\Column(type="string", length=128, unique=true) * @ORM\Column(type="string", length=128, unique=true)
*/ */
@ -155,7 +158,17 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
private $niveau02; private $niveau02;
/** /**
* @var ArrayCollection $groups * @ORM\ManyToOne(targetEntity="Niveau03", inversedBy="users")
*/
private $niveau03;
/**
* @ORM\ManyToOne(targetEntity="Niveau04", inversedBy="users")
*/
private $niveau04;
/**
* @var ArrayCollection
* @var UserGroup * @var UserGroup
* *
* @ORM\OneToMany(targetEntity="UserGroup", mappedBy="user", cascade={"persist"}, orphanRemoval=true) * @ORM\OneToMany(targetEntity="UserGroup", mappedBy="user", cascade={"persist"}, orphanRemoval=true)
@ -163,7 +176,7 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
private $groups; private $groups;
/** /**
* @var ArrayCollection $ownergroups * @var ArrayCollection
* @var Group * @var Group
* *
* @ORM\OneToMany(targetEntity="Group", mappedBy="owner", cascade={"persist"}, orphanRemoval=false) * @ORM\OneToMany(targetEntity="Group", mappedBy="owner", cascade={"persist"}, orphanRemoval=false)
@ -171,7 +184,7 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
private $ownergroups; private $ownergroups;
/** /**
* @var ArrayCollection $groups * @var ArrayCollection
* @var UserGroup * @var UserGroup
* *
* @ORM\OneToMany(targetEntity="UserModo", mappedBy="user", cascade={"persist"}, orphanRemoval=true) * @ORM\OneToMany(targetEntity="UserModo", mappedBy="user", cascade={"persist"}, orphanRemoval=true)
@ -185,20 +198,19 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
$this->modos = new ArrayCollection(); $this->modos = new ArrayCollection();
} }
//== CODE A NE PAS REGENERER // == CODE A NE PAS REGENERER
public function setId(int $id): self public function setId(int $id): self
{ {
$this->id = $id; $this->id = $id;
return $this; return $this;
} }
public function getUserIdentifier(): string public function getUserIdentifier(): string
{ {
return $this->username; return $this->username;
} }
public function setPasswordDirect($password) public function setPasswordDirect($password)
{ {
// Permet de setter le password généré lors de l'inscription // Permet de setter le password généré lors de l'inscription
@ -217,13 +229,13 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
public function setPassword($password): self public function setPassword($password): self
{ {
if($password!=$this->password&&$password!=""){ if ($password != $this->password && '' != $password) {
// Placer le password non encodé dans une variable tempo sur laquel on va appliquer la contraite de form // Placer le password non encodé dans une variable tempo sur laquel on va appliquer la contraite de form
$this->passwordplain = $password; $this->passwordplain = $password;
// Password encrypté format openldap // Password encrypté format openldap
$this->salt = uniqid(mt_rand(), true); $this->salt = uniqid(mt_rand(), true);
$hash = "{SSHA}" . base64_encode(pack("H*", sha1($password . $this->salt)) . $this->salt); $hash = '{SSHA}'.base64_encode(pack('H*', sha1($password.$this->salt)).$this->salt);
$this->password = $hash; $this->password = $hash;
} }
@ -257,22 +269,29 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
public function hasRole(string $role): ?bool public function hasRole(string $role): ?bool
{ {
return in_array($role,$this->getRoles()); return in_array($role, $this->getRoles());
} }
public function setRole(string $role): self public function setRole(string $role): self
{ {
if(!$this->hasRole($role)) if (!$this->hasRole($role)) {
array_push($this->roles,$role); array_push($this->roles, $role);
}
return $this; return $this;
} }
public function getDisplayname() { public function getDisplayname()
return $this->firstname." ".$this->lastname; {
return $this->firstname.' '.$this->lastname.(!$this->isactive ? ' (inactif)' : '');
} }
//== FIN DU CODE A NE PAS REGENERER public function getFullname()
{
return $this->username.' = '.$this->firstname.' '.$this->lastname.(!$this->isactive ? ' (inactif)' : '');
}
// == FIN DU CODE A NE PAS REGENERER
public function getId(): ?int public function getId(): ?int
{ {
@ -623,4 +642,39 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
return $this; return $this;
} }
public function getNiveau03(): ?Niveau03
{
return $this->niveau03;
}
public function setNiveau03(?Niveau03 $niveau03): self
{
$this->niveau03 = $niveau03;
return $this;
}
public function getNiveau04(): ?Niveau04
{
return $this->niveau04;
}
public function setNiveau04(?Niveau04 $niveau04): self
{
$this->niveau04 = $niveau04;
return $this;
}
public function isIsactive(): ?bool
{
return $this->isactive;
}
public function setIsactive(bool $isactive): self
{
$this->isactive = $isactive;
return $this;
}
} }

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Entity; namespace App\Entity;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
@ -128,5 +128,4 @@ class UserGroup
return $this; return $this;
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Entity; namespace App\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
@ -59,4 +60,4 @@ class UserModo
return $this; return $this;
} }
} }

View File

@ -1,8 +1,8 @@
<?php <?php
namespace App\Entity; namespace App\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/** /**

View File

@ -2,24 +2,23 @@
namespace App\EventListener; namespace App\EventListener;
use App\Entity\Audit;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface; use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events; use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs; use Doctrine\Persistence\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Doctrine\ORM\Proxy\Proxy;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use App\Entity\Audit as Audit;
class AllSubscriber implements EventSubscriberInterface class AllSubscriber implements EventSubscriberInterface
{ {
private $entity; private $em;
private $token; private $token;
private $params; private $params;
private $entity;
public function __construct(EntityManagerInterface $em, TokenStorageInterface $token,ParameterBagInterface $params) public function __construct(EntityManagerInterface $em, TokenStorageInterface $token, ParameterBagInterface $params)
{ {
$this->em = $em; $this->em = $em;
$this->token = $token; $this->token = $token;
@ -39,25 +38,33 @@ class AllSubscriber implements EventSubscriberInterface
$this->entity = $args->getObject(); $this->entity = $args->getObject();
// Les enregistrements négatifs sont des enregistrements systeme indispensable // Les enregistrements négatifs sont des enregistrements systeme indispensable
if($this->entity->getId()<0) if ($this->entity->getId() < 0) {
throw new \Exception("Impossible de supprimer cet enregistrement. C'est un enregistrement système"); throw new \Exception("Impossible de supprimer cet enregistrement. C'est un enregistrement système");
} }
}
public function onFlush(OnFlushEventArgs $eventArgs): void public function onFlush(OnFlushEventArgs $eventArgs): void
{ {
$this->entity = $eventArgs->getEntityManager(); $this->entity = $eventArgs->getEntityManager();
if ($this->entity instanceof Audit||!$this->params->get("auditUse")) return; if ($this->entity instanceof Audit || !$this->params->get('auditUse')) {
return;
}
$this->audit(); $this->audit();
} }
private function audit() { private function audit()
{
$token = $this->token->getToken(); $token = $this->token->getToken();
if(!$token)$user="job"; if (!$token) {
else { $user = 'job';
$user=$token->getUser(); } else {
if($user!="anon.") $user = $user->getUsername(); $user = $token->getUser();
else $user="job"; if ('anon.' != $user) {
$user = $user->getUsername();
} else {
$user = 'job';
}
} }
$uow = $this->em->getUnitOfWork(); $uow = $this->em->getUnitOfWork();
@ -65,23 +72,24 @@ class AllSubscriber implements EventSubscriberInterface
foreach ($uow->getScheduledEntityInsertions() as $entity) { foreach ($uow->getScheduledEntityInsertions() as $entity) {
$metaCar = $this->em->getClassMetadata(get_class($entity)); $metaCar = $this->em->getClassMetadata(get_class($entity));
$className=str_replace("App\\Entity\\","",$metaCar->getName()); $className = str_replace('App\\Entity\\', '', $metaCar->getName());
$nameold=""; $nameold = '';
if($metaCar->hasField("name")) if ($metaCar->hasField('name')) {
$nameold=" = ".$entity>getName(); $nameold = ' = '.$entity->getName();
elseif($metaCar->hasField("label")) } elseif ($metaCar->hasField('label')) {
$nameold=" = ".$entity->getLabel(); $nameold = ' = '.$entity->getLabel();
elseif($metaCar->hasField("username")) } elseif ($metaCar->hasField('username')) {
$nameold=" = ".$entity->getUsername(); $nameold = ' = '.$entity->getUsername();
}
$audit=new Audit(); $audit = new Audit();
$audit->setDatesubmit(new \DateTime("now")); $audit->setDatesubmit(new \DateTime('now'));
$audit->setEntityname($className); $audit->setEntityname($className);
$audit->setEntityid($entity->getId()); $audit->setEntityid($entity->getId());
$audit->setUsername($user); $audit->setUsername($user);
$audit->setDescription("SUBMIT"); $audit->setDescription('SUBMIT');
$audit->setDetail(["id"=>$entity->getId().$nameold]); $audit->setDetail(['id' => $entity->getId().$nameold]);
$this->em->persist($audit); $this->em->persist($audit);
$uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit); $uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit);
@ -89,23 +97,24 @@ class AllSubscriber implements EventSubscriberInterface
foreach ($uow->getScheduledEntityDeletions() as $entity) { foreach ($uow->getScheduledEntityDeletions() as $entity) {
$metaCar = $this->em->getClassMetadata(get_class($entity)); $metaCar = $this->em->getClassMetadata(get_class($entity));
$className=str_replace("App\\Entity\\","",$metaCar->getName()); $className = str_replace('App\\Entity\\', '', $metaCar->getName());
$nameold=""; $nameold = '';
if($metaCar->hasField("name")) if ($metaCar->hasField('name')) {
$nameold=" = ".$entity>getName(); $nameold = ' = '.$entity->getName();
elseif($metaCar->hasField("label")) } elseif ($metaCar->hasField('label')) {
$nameold=" = ".$entity->getLabel(); $nameold = ' = '.$entity->getLabel();
elseif($metaCar->hasField("username")) } elseif ($metaCar->hasField('username')) {
$nameold=" = ".$entity->getUsername(); $nameold = ' = '.$entity->getUsername();
}
$audit=new Audit(); $audit = new Audit();
$audit->setDatesubmit(new \DateTime("now")); $audit->setDatesubmit(new \DateTime('now'));
$audit->setEntityname($className); $audit->setEntityname($className);
$audit->setEntityid($entity->getId()); $audit->setEntityid($entity->getId());
$audit->setUsername($user); $audit->setUsername($user);
$audit->setDescription("DELETE"); $audit->setDescription('DELETE');
$audit->setDetail(["id"=>$entity->getId().$nameold]); $audit->setDetail(['id' => $entity->getId().$nameold]);
$this->em->persist($audit); $this->em->persist($audit);
$uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit); $uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit);
@ -115,76 +124,76 @@ class AllSubscriber implements EventSubscriberInterface
$changeSet = $uow->getEntityChangeSet($entity); $changeSet = $uow->getEntityChangeSet($entity);
// Unaudit field // Unaudit field
$className = str_replace("App\\Entity\\","",$this->em->getClassMetadata(get_class($entity))->getName()); $className = str_replace('App\\Entity\\', '', $this->em->getClassMetadata(get_class($entity))->getName());
switch($className) { switch ($className) {
case "Audit": case 'Audit':
$changeSet=null; $changeSet = null;
break; break;
case "User": case 'User':
unset($changeSet["visitecpt"]); unset($changeSet['visitecpt']);
unset($changeSet["visitedate"]); unset($changeSet['visitedate']);
unset($changeSet["preference"]); unset($changeSet['preference']);
unset($changeSet["keyvalue"]); unset($changeSet['keyvalue']);
unset($changeSet["keyexpire"]); unset($changeSet['keyexpire']);
unset($changeSet["apikey"]); unset($changeSet['apikey']);
unset($changeSet["password"]); unset($changeSet['password']);
unset($changeSet["passwordplain"]); unset($changeSet['passwordplain']);
unset($changeSet["salt"]); unset($changeSet['salt']);
break; break;
default: default:
unset($changeSet["apikey"]); unset($changeSet['apikey']);
break; break;
} }
if ($changeSet) { if ($changeSet) {
$mychange=[]; $mychange = [];
foreach($changeSet as $key => $value) { foreach ($changeSet as $key => $value) {
// Le champs modifié est-il une entité // Le champs modifié est-il une entité
$isentity0=($value[0]&&is_object($value[0])&&get_class($value[0])&&get_class($value[0])!="DateTime"); $isentity0 = ($value[0] && is_object($value[0]) && get_class($value[0]) && 'DateTime' != get_class($value[0]));
$isentity1=($value[1]&&is_object($value[1])&&get_class($value[1])&&get_class($value[1])!="DateTime"); $isentity1 = ($value[1] && is_object($value[1]) && get_class($value[1]) && 'DateTime' != get_class($value[1]));
if($isentity0||$isentity1) { if ($isentity0 || $isentity1) {
$nameold=""; $nameold = '';
if($isentity0) { if ($isentity0) {
$metaCar = $this->em->getClassMetadata(get_class($value[0])); $metaCar = $this->em->getClassMetadata(get_class($value[0]));
if($metaCar->hasField("name")) if ($metaCar->hasField('name')) {
$nameold=" = ".$value[0]->getName(); $nameold = ' = '.$value[0]->getName();
elseif($metaCar->hasField("label")) } elseif ($metaCar->hasField('label')) {
$nameold=" = ".$value[0]->getLabel(); $nameold = ' = '.$value[0]->getLabel();
elseif($metaCar->hasField("username")) } elseif ($metaCar->hasField('username')) {
$nameold=" = ".$value[0]->getUsername(); $nameold = ' = '.$value[0]->getUsername();
$nameold= $value[0]->getId().$nameold;
} }
$nameold = $value[0]->getId().$nameold;
}
$namenew=""; $namenew = '';
if($isentity1) { if ($isentity1) {
$metaCar = $this->em->getClassMetadata(get_class($value[1])); $metaCar = $this->em->getClassMetadata(get_class($value[1]));
if($metaCar->hasField("name")) if ($metaCar->hasField('name')) {
$namenew=" = ".$value[1]->getName(); $namenew = ' = '.$value[1]->getName();
elseif($metaCar->hasField("label")) } elseif ($metaCar->hasField('label')) {
$namenew=" = ".$value[1]->getLabel(); $namenew = ' = '.$value[1]->getLabel();
elseif($metaCar->hasField("username")) } elseif ($metaCar->hasField('username')) {
$namenew=" = ".$value[1]->getUsername(); $namenew = ' = '.$value[1]->getUsername();
$namenew= $value[1]->getId().$namenew;
} }
$mychange[$key]=[$nameold,$namenew]; $namenew = $value[1]->getId().$namenew;
} }
else $mychange[$key]=$value;
$mychange[$key] = [$nameold, $namenew];
} else {
$mychange[$key] = $value;
} }
$audit=new Audit(); }
$audit->setDatesubmit(new \DateTime("now")); $audit = new Audit();
$audit->setDatesubmit(new \DateTime('now'));
$audit->setEntityname($className); $audit->setEntityname($className);
$audit->setEntityid($entity->getId()); $audit->setEntityid($entity->getId());
$audit->setUsername($user); $audit->setUsername($user);
$audit->setDescription("UPDATE"); $audit->setDescription('UPDATE');
$audit->setDetail($mychange); $audit->setDetail($mychange);
$this->em->persist($audit); $this->em->persist($audit);
@ -192,6 +201,4 @@ class AllSubscriber implements EventSubscriberInterface
} }
} }
} }
} }

View File

@ -2,29 +2,27 @@
namespace App\EventListener; namespace App\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Group as Entity; use App\Entity\Group as Entity;
use App\Entity\UserGroup as UserGroup; use App\Entity\UserGroup;
use App\Service\LdapService;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface; use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Events; use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs; use Doctrine\Persistence\Event\LifecycleEventArgs;
use Ramsey\Uuid\Uuid; use Ramsey\Uuid\Uuid;
use App\Service\LdapService;
class GroupSubscriber implements EventSubscriberInterface class GroupSubscriber implements EventSubscriberInterface
{ {
private $em; private $em;
private $entity; private $entity;
private $ldap; private $ldap;
public function __construct(EntityManagerInterface $em,LdapService $ldap) public function __construct(EntityManagerInterface $em, LdapService $ldap)
{ {
$this->em = $em; $this->em = $em;
$this->ldap = $ldap; $this->ldap = $ldap;
} }
public function getSubscribedEvents(): array public function getSubscribedEvents(): array
{ {
return [ return [
@ -39,7 +37,9 @@ class GroupSubscriber implements EventSubscriberInterface
public function postPersist(LifecycleEventArgs $args): void public function postPersist(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
@ -51,13 +51,17 @@ class GroupSubscriber implements EventSubscriberInterface
public function preUpdate(LifecycleEventArgs $args): void public function preUpdate(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
} }
public function postUpdate(LifecycleEventArgs $args): void public function postUpdate(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
@ -69,7 +73,9 @@ class GroupSubscriber implements EventSubscriberInterface
public function preRemove(LifecycleEventArgs $args): void public function preRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldapremove(); $this->nine2ldapremove();
@ -78,64 +84,66 @@ class GroupSubscriber implements EventSubscriberInterface
public function postRemove(LifecycleEventArgs $args): void public function postRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
} }
private function nine2ldap() { private function nine2ldap()
if($this->ldap->isNine2Ldap()) { {
if ($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente // On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations(); $this->ldap->addOrganisations();
// Ajout / Modification group dans annuaire // Ajout / Modification group dans annuaire
$filter="gidnumber=".$this->entity->getId(); $filter = 'gidnumber='.$this->entity->getId();
$attributes=$this->ldap->listAttributesGroup(); $attributes = $this->ldap->listAttributesGroup();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("basegroup")); $ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('basegroup'));
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->ldap->addGroup($this->entity); $this->ldap->addGroup($this->entity);
} } elseif ($this->ldap->ismodifyGroup($this->entity, $ldapentrys[0])) {
elseif($this->ldap->ismodifyGroup($this->entity,$ldapentrys[0])) { $this->ldap->modifyGroup($this->entity, $ldapentrys[0]['cn']);
$this->ldap->modifyGroup($this->entity,$ldapentrys[0]["cn"]);
} }
} }
} }
private function nine2ldapremove()
private function nine2ldapremove() { {
if($this->ldap->isNine2Ldap()) { if ($this->ldap->isNine2Ldap()) {
$filter="gidnumber=".$this->entity->getId(); $filter = 'gidnumber='.$this->entity->getId();
$attributes=$this->ldap->listAttributesGroup(); $attributes = $this->ldap->listAttributesGroup();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("basegroup")); $ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('basegroup'));
if(!empty($ldapentrys)) { if (!empty($ldapentrys)) {
$this->ldap->deleteGroup($this->entity); $this->ldap->deleteGroup($this->entity);
} }
} }
} }
private function ctrlOwner() { private function ctrlOwner()
$group=$this->entity; {
$group = $this->entity;
// Le propriétaire passe manager // Le propriétaire passe manager
$usergroups=$this->em->getRepository("App\Entity\UserGroup")->findBy(["group"=>$group,"rolegroup"=>"100"]); $usergroups = $this->em->getRepository("App\Entity\UserGroup")->findBy(['group' => $group, 'rolegroup' => '100']);
foreach($usergroups as $usergroup) { foreach ($usergroups as $usergroup) {
if($usergroup->getUser()!=$group->getOwner()) { if ($usergroup->getUser() != $group->getOwner()) {
$usergroup->setRolegroup(90); $usergroup->setRolegroup(90);
$this->em->flush(); $this->em->flush();
} }
} }
// Le propriétaire prend son role dans le groupe // Le propriétaire prend son role dans le groupe
if($group->getOwner()) { if ($group->getOwner()) {
$usergroup=$this->em->getRepository("App\Entity\UserGroup")->findOneBy(["group"=>$group,"user"=>$group->getOwner()]); $usergroup = $this->em->getRepository("App\Entity\UserGroup")->findOneBy(['group' => $group, 'user' => $group->getOwner()]);
if(!$usergroup) { if (!$usergroup) {
$usergroup=new UserGroup(); $usergroup = new UserGroup();
$usergroup->setUser($group->getOwner()); $usergroup->setUser($group->getOwner());
$usergroup->setGroup($group); $usergroup->setGroup($group);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());
$usergroup->setRolegroup(100); $usergroup->setRolegroup(100);
$this->em->persist($usergroup); $this->em->persist($usergroup);
$this->em->flush(); $this->em->flush();
} } elseif (100 != $usergroup->getRolegroup()) {
elseif($usergroup->getRolegroup()!=100) {
$usergroup->setRolegroup(100); $usergroup->setRolegroup(100);
$this->em->flush(); $this->em->flush();
} }

View File

@ -2,28 +2,25 @@
namespace App\EventListener; namespace App\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Niveau01 as Entity; use App\Entity\Niveau01 as Entity;
use App\Service\LdapService;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface; use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Events; use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs; use Doctrine\Persistence\Event\LifecycleEventArgs;
use App\Service\LdapService;
class Niveau01Subscriber implements EventSubscriberInterface class Niveau01Subscriber implements EventSubscriberInterface
{ {
private $em; private $em;
private $entity; private $entity;
private $ldap; private $ldap;
public function __construct(EntityManagerInterface $em,LdapService $ldap) public function __construct(EntityManagerInterface $em, LdapService $ldap)
{ {
$this->em = $em; $this->em = $em;
$this->ldap = $ldap; $this->ldap = $ldap;
} }
public function getSubscribedEvents(): array public function getSubscribedEvents(): array
{ {
return [ return [
@ -38,7 +35,9 @@ class Niveau01Subscriber implements EventSubscriberInterface
public function postPersist(LifecycleEventArgs $args): void public function postPersist(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
@ -47,13 +46,17 @@ class Niveau01Subscriber implements EventSubscriberInterface
public function preUpdate(LifecycleEventArgs $args): void public function preUpdate(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
} }
public function postUpdate(LifecycleEventArgs $args): void public function postUpdate(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
@ -62,19 +65,24 @@ class Niveau01Subscriber implements EventSubscriberInterface
public function preRemove(LifecycleEventArgs $args): void public function preRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Impossible de supprimer si présence de niveau02 rattaché // Impossible de supprimer si présence de niveau02 rattaché
if(!$this->entity->getNiveau02s()->isEmpty()) if (!$this->entity->getNiveau02s()->isEmpty()) {
throw new \Exception("Impossible de supprimer cet enregistrement. Il est lié à des niveaux de rang 02"); throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des niveaux de rang 02');
}
// Impossible de supprimer si présence de registration rattaché // Impossible de supprimer si présence de registration rattaché
if(!$this->entity->getRegistrations()->isEmpty()) if (!$this->entity->getRegistrations()->isEmpty()) {
throw new \Exception("Impossible de supprimer cet enregistrement. Il est lié à des inscriptions"); throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des inscriptions');
}
// Impossible de supprimer si présence de user rattaché // Impossible de supprimer si présence de user rattaché
if(!$this->entity->getUsers()->isEmpty()) if (!$this->entity->getUsers()->isEmpty()) {
throw new \Exception("Impossible de supprimer cet enregistrement. Il est lié à des utilisateurs"); throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des utilisateurs');
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldapremove(); $this->nine2ldapremove();
@ -83,34 +91,36 @@ class Niveau01Subscriber implements EventSubscriberInterface
public function postRemove(LifecycleEventArgs $args): void public function postRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
} }
private function nine2ldap()
private function nine2ldap() { {
if($this->ldap->isNine2Ldap()) { if ($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente // On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations(); $this->ldap->addOrganisations();
// Ajout / Modification dans annuaire // Ajout / Modification dans annuaire
$filter="gidnumber=".$this->entity->getId(); $filter = 'gidnumber='.$this->entity->getId();
$attributes=$this->ldap->listAttributesNiveau01(); $attributes = $this->ldap->listAttributesNiveau01();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("baseniveau01")); $ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseniveau01'));
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->ldap->addNiveau01($this->entity); $this->ldap->addNiveau01($this->entity);
} } elseif ($this->ldap->ismodifyNiveau01($this->entity, $ldapentrys[0])) {
elseif($this->ldap->ismodifyNiveau01($this->entity,$ldapentrys[0])) { $this->ldap->modifyNiveau01($this->entity, $ldapentrys[0]['cn']);
$this->ldap->modifyNiveau01($this->entity,$ldapentrys[0]["cn"]);
} }
} }
} }
private function nine2ldapremove() { private function nine2ldapremove()
if($this->ldap->isNine2Ldap()) { {
$filter="gidnumber=".$this->entity->getId(); if ($this->ldap->isNine2Ldap()) {
$attributes=$this->ldap->listAttributesNiveau01(); $filter = 'gidnumber='.$this->entity->getId();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("baseniveau01")); $attributes = $this->ldap->listAttributesNiveau01();
if(!empty($ldapentrys)) { $ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseniveau01'));
if (!empty($ldapentrys)) {
$this->ldap->deleteNiveau01($this->entity); $this->ldap->deleteNiveau01($this->entity);
} }
} }

View File

@ -2,21 +2,20 @@
namespace App\EventListener; namespace App\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Niveau02 as Entity; use App\Entity\Niveau02 as Entity;
use App\Service\LdapService;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface; use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Events; use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs; use Doctrine\Persistence\Event\LifecycleEventArgs;
use App\Service\LdapService;
class Niveau02Subscriber implements EventSubscriberInterface class Niveau02Subscriber implements EventSubscriberInterface
{ {
private $em; private $em;
private $entity; private $entity;
private $ldap; private $ldap;
public function __construct(EntityManagerInterface $em,LdapService $ldap) public function __construct(EntityManagerInterface $em, LdapService $ldap)
{ {
$this->em = $em; $this->em = $em;
$this->ldap = $ldap; $this->ldap = $ldap;
@ -36,8 +35,9 @@ class Niveau02Subscriber implements EventSubscriberInterface
public function postPersist(LifecycleEventArgs $args): void public function postPersist(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
@ -46,13 +46,17 @@ class Niveau02Subscriber implements EventSubscriberInterface
public function preUpdate(LifecycleEventArgs $args): void public function preUpdate(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
} }
public function postUpdate(LifecycleEventArgs $args): void public function postUpdate(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
@ -61,15 +65,24 @@ class Niveau02Subscriber implements EventSubscriberInterface
public function preRemove(LifecycleEventArgs $args): void public function preRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Impossible de supprimer si présence de niveau03 rattaché
if (!$this->entity->getNiveau03s()->isEmpty()) {
throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des niveaux de rang 03');
}
// Impossible de supprimer si présence de registration rattaché // Impossible de supprimer si présence de registration rattaché
if(!$this->entity->getRegistrations()->isEmpty()) if (!$this->entity->getRegistrations()->isEmpty()) {
throw new \Exception("Impossible de supprimer cet enregistrement. Il est lié à des inscriptions"); throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des inscriptions');
}
// Impossible de supprimer si présence de user rattaché // Impossible de supprimer si présence de user rattaché
if(!$this->entity->getUsers()->isEmpty()) if (!$this->entity->getUsers()->isEmpty()) {
throw new \Exception("Impossible de supprimer cet enregistrement. Il est lié à des utilisateurs"); throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des utilisateurs');
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldapremove(); $this->nine2ldapremove();
@ -78,33 +91,36 @@ class Niveau02Subscriber implements EventSubscriberInterface
public function postRemove(LifecycleEventArgs $args): void public function postRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return;; if (!$this->entity instanceof Entity) {
return;
}
} }
private function nine2ldap() { private function nine2ldap()
if($this->ldap->isNine2Ldap()) { {
if ($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente // On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations(); $this->ldap->addOrganisations();
// Ajout / Modification dans annuaire // Ajout / Modification dans annuaire
$filter="gidnumber=".$this->entity->getId(); $filter = 'gidnumber='.$this->entity->getId();
$attributes=$this->ldap->listAttributesNiveau02(); $attributes = $this->ldap->listAttributesNiveau02();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("baseniveau02")); $ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseniveau02'));
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->ldap->addNiveau02($this->entity); $this->ldap->addNiveau02($this->entity);
} } elseif ($this->ldap->ismodifyNiveau02($this->entity, $ldapentrys[0])) {
elseif($this->ldap->ismodifyNiveau02($this->entity,$ldapentrys[0])) { $this->ldap->modifyNiveau02($this->entity, $ldapentrys[0]['cn']);
$this->ldap->modifyNiveau02($this->entity,$ldapentrys[0]["cn"]);
} }
} }
} }
private function nine2ldapremove() { private function nine2ldapremove()
if($this->ldap->isNine2Ldap()) { {
$filter="gidnumber=".$this->entity->getId(); if ($this->ldap->isNine2Ldap()) {
$attributes=$this->ldap->listAttributesNiveau02(); $filter = 'gidnumber='.$this->entity->getId();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("baseniveau02")); $attributes = $this->ldap->listAttributesNiveau02();
if(!empty($ldapentrys)) { $ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseniveau02'));
if (!empty($ldapentrys)) {
$this->ldap->deleteNiveau02($this->entity); $this->ldap->deleteNiveau02($this->entity);
} }
} }

View File

@ -0,0 +1,128 @@
<?php
namespace App\EventListener;
use App\Entity\Niveau03 as Entity;
use App\Service\LdapService;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs;
class Niveau03Subscriber implements EventSubscriberInterface
{
private $em;
private $entity;
private $ldap;
public function __construct(EntityManagerInterface $em, LdapService $ldap)
{
$this->em = $em;
$this->ldap = $ldap;
}
public function getSubscribedEvents(): array
{
return [
Events::postPersist,
Events::preUpdate,
Events::postUpdate,
Events::preRemove,
Events::postRemove,
];
}
public function postPersist(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap
$this->nine2ldap();
}
public function preUpdate(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
}
public function postUpdate(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap
$this->nine2ldap();
}
public function preRemove(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
// Impossible de supprimer si présence de niveau04 rattaché
if (!$this->entity->getNiveau04s()->isEmpty()) {
throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des niveaux de rang 04');
}
// Impossible de supprimer si présence de registration rattaché
if (!$this->entity->getRegistrations()->isEmpty()) {
throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des inscriptions');
}
// Impossible de supprimer si présence de user rattaché
if (!$this->entity->getUsers()->isEmpty()) {
throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des utilisateurs');
}
// Synchronisation nine2ldap
$this->nine2ldapremove();
}
public function postRemove(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
}
private function nine2ldap()
{
if ($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations();
// Ajout / Modification dans annuaire
$filter = 'gidnumber='.$this->entity->getId();
$attributes = $this->ldap->listAttributesNiveau03();
$ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseniveau03'));
if (empty($ldapentrys)) {
$this->ldap->addNiveau03($this->entity);
} elseif ($this->ldap->ismodifyNiveau03($this->entity, $ldapentrys[0])) {
$this->ldap->modifyNiveau03($this->entity, $ldapentrys[0]['cn']);
}
}
}
private function nine2ldapremove()
{
if ($this->ldap->isNine2Ldap()) {
$filter = 'gidnumber='.$this->entity->getId();
$attributes = $this->ldap->listAttributesNiveau03();
$ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseniveau03'));
if (!empty($ldapentrys)) {
$this->ldap->deleteNiveau03($this->entity);
}
}
}
}

View File

@ -0,0 +1,123 @@
<?php
namespace App\EventListener;
use App\Entity\Niveau04 as Entity;
use App\Service\LdapService;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs;
class Niveau04Subscriber implements EventSubscriberInterface
{
private $em;
private $entity;
private $ldap;
public function __construct(EntityManagerInterface $em, LdapService $ldap)
{
$this->em = $em;
$this->ldap = $ldap;
}
public function getSubscribedEvents(): array
{
return [
Events::postPersist,
Events::preUpdate,
Events::postUpdate,
Events::preRemove,
Events::postRemove,
];
}
public function postPersist(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap
$this->nine2ldap();
}
public function preUpdate(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
}
public function postUpdate(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap
$this->nine2ldap();
}
public function preRemove(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
// Impossible de supprimer si présence de registration rattaché
if (!$this->entity->getRegistrations()->isEmpty()) {
throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des inscriptions');
}
// Impossible de supprimer si présence de user rattaché
if (!$this->entity->getUsers()->isEmpty()) {
throw new \Exception('Impossible de supprimer cet enregistrement. Il est lié à des utilisateurs');
}
// Synchronisation nine2ldap
$this->nine2ldapremove();
}
public function postRemove(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
if (!$this->entity instanceof Entity) {
return;
}
}
private function nine2ldap()
{
if ($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations();
// Ajout / Modification dans annuaire
$filter = 'gidnumber='.$this->entity->getId();
$attributes = $this->ldap->listAttributesNiveau04();
$ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseniveau04'));
if (empty($ldapentrys)) {
$this->ldap->addNiveau04($this->entity);
} elseif ($this->ldap->ismodifyNiveau04($this->entity, $ldapentrys[0])) {
$this->ldap->modifyNiveau04($this->entity, $ldapentrys[0]['cn']);
}
}
}
private function nine2ldapremove()
{
if ($this->ldap->isNine2Ldap()) {
$filter = 'gidnumber='.$this->entity->getId();
$attributes = $this->ldap->listAttributesNiveau04();
$ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseniveau04'));
if (!empty($ldapentrys)) {
$this->ldap->deleteNiveau04($this->entity);
}
}
}
}

View File

@ -2,21 +2,20 @@
namespace App\EventListener; namespace App\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\UserGroup as Entity; use App\Entity\UserGroup as Entity;
use App\Service\LdapService;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface; use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Events; use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs; use Doctrine\Persistence\Event\LifecycleEventArgs;
use App\Service\LdapService;
class UserGroupSubscriber implements EventSubscriberInterface class UserGroupSubscriber implements EventSubscriberInterface
{ {
private $em; private $em;
private $entity; private $entity;
private $ldap; private $ldap;
public function __construct(EntityManagerInterface $em,LdapService $ldap) public function __construct(EntityManagerInterface $em, LdapService $ldap)
{ {
$this->em = $em; $this->em = $em;
$this->ldap = $ldap; $this->ldap = $ldap;
@ -33,8 +32,9 @@ class UserGroupSubscriber implements EventSubscriberInterface
public function postPersist(LifecycleEventArgs $args): void public function postPersist(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
@ -43,14 +43,17 @@ class UserGroupSubscriber implements EventSubscriberInterface
public function preRemove(LifecycleEventArgs $args): void public function preRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldapremove(); $this->nine2ldapremove();
} }
private function nine2ldap() { private function nine2ldap()
if($this->ldap->isNine2Ldap()) { {
if ($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente // On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations(); $this->ldap->addOrganisations();
@ -59,8 +62,9 @@ class UserGroupSubscriber implements EventSubscriberInterface
} }
} }
private function nine2ldapremove() { private function nine2ldapremove()
if($this->ldap->isNine2Ldap()) { {
if ($this->ldap->isNine2Ldap()) {
$this->ldap->delUserGroup($this->entity); $this->ldap->delUserGroup($this->entity);
} }
} }

View File

@ -2,29 +2,27 @@
namespace App\EventListener; namespace App\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\User as Entity; use App\Entity\User as Entity;
use App\Entity\UserGroup as UserGroup; use App\Entity\UserGroup;
use App\Service\LdapService;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface; use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Events; use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs; use Doctrine\Persistence\Event\LifecycleEventArgs;
use Ramsey\Uuid\Uuid; use Ramsey\Uuid\Uuid;
use App\Service\LdapService;
class UserSubscriber implements EventSubscriberInterface class UserSubscriber implements EventSubscriberInterface
{ {
private $em; private $em;
private $entity; private $entity;
private $ldap; private $ldap;
public function __construct(EntityManagerInterface $em,LdapService $ldap) public function __construct(EntityManagerInterface $em, LdapService $ldap)
{ {
$this->em = $em; $this->em = $em;
$this->ldap = $ldap; $this->ldap = $ldap;
} }
public function getSubscribedEvents(): array public function getSubscribedEvents(): array
{ {
return [ return [
@ -39,15 +37,16 @@ class UserSubscriber implements EventSubscriberInterface
public function postPersist(LifecycleEventArgs $args): void public function postPersist(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
// Recherche du group tout le monde // Recherche du group tout le monde
$group=$this->em->getRepository("App\Entity\Group")->find(-1); $group = $this->em->getRepository("App\Entity\Group")->find(-1);
$usergroup=new UserGroup(); $usergroup = new UserGroup();
$usergroup->setUser($this->entity); $usergroup->setUser($this->entity);
$usergroup->setGroup($group); $usergroup->setGroup($group);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());
@ -60,24 +59,32 @@ class UserSubscriber implements EventSubscriberInterface
public function preUpdate(LifecycleEventArgs $args): void public function preUpdate(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
} }
public function postUpdate(LifecycleEventArgs $args): void public function postUpdate(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldap(); $this->nine2ldap();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
} }
public function preRemove(LifecycleEventArgs $args): void public function preRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return; if (!$this->entity instanceof Entity) {
return;
}
// Synchronisation nine2ldap // Synchronisation nine2ldap
$this->nine2ldapremove(); $this->nine2ldapremove();
@ -86,23 +93,29 @@ class UserSubscriber implements EventSubscriberInterface
public function postRemove(LifecycleEventArgs $args): void public function postRemove(LifecycleEventArgs $args): void
{ {
$this->entity = $args->getObject(); $this->entity = $args->getObject();
if (!$this->entity instanceof Entity) return;; if (!$this->entity instanceof Entity) {
return;
}
} }
private function nine2ldap() { private function nine2ldap()
if($this->ldap->isNine2Ldap()) { {
if ($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente // On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations(); $this->ldap->addOrganisations();
// Ajout / Modification dans annuaire // Ajout / Modification dans annuaire
$filter=str_replace("*",$this->entity->getUsername(),$this->ldap->getParameter("filteruser")); $filter = str_replace('*', $this->entity->getUsername(), $this->ldap->getParameter('filteruser'));
$attributes=$this->ldap->listAttributesNiveau02(); $attributes = $this->ldap->listAttributesUser();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("baseuser")); $ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseuser'));
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
if ($this->entity->isIsactive()) {
$this->ldap->addUser($this->entity); $this->ldap->addUser($this->entity);
} }
elseif($this->ldap->ismodifyUser($this->entity,$ldapentrys[0])) { } elseif (!$this->entity->isIsactive()) {
$this->ldap->modifyUser($this->entity,$ldapentrys[0]["cn"]); $this->nine2ldapremove();
} elseif ($this->ldap->ismodifyUser($this->entity, $ldapentrys[0])) {
$this->ldap->modifyUser($this->entity, $ldapentrys[0]['cn']);
} }
// Mise à jour des niveaux du user // Mise à jour des niveaux du user
@ -110,17 +123,18 @@ class UserSubscriber implements EventSubscriberInterface
} }
} }
private function nine2ldapremove() { private function nine2ldapremove()
if($this->ldap->isNine2Ldap()) { {
$filter=str_replace("*",$this->entity->getUsername(),$this->ldap->getParameter("filteruser")); if ($this->ldap->isNine2Ldap()) {
$attributes=$this->ldap->listAttributesNiveau02(); $filter = str_replace('*', $this->entity->getUsername(), $this->ldap->getParameter('filteruser'));
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("baseuser")); $attributes = $this->ldap->listAttributesUser();
if(!empty($ldapentrys)) { $ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('baseuser'));
if (!empty($ldapentrys)) {
$this->ldap->deleteUser($this->entity); $this->ldap->deleteUser($this->entity);
} }
// Mise à jour des niveaux du user en forçant le détachement // Mise à jour des niveaux du user en forçant le détachement
$this->ldap->updateNiveauUser($this->entity,true); $this->ldap->updateNiveauUser($this->entity, true);
} }
} }
} }

View File

@ -1,189 +1,174 @@
<?php <?php
namespace App\Form; namespace App\Form;
use FOS\CKEditorBundle\Form\Type\CKEditorType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use FOS\CKEditorBundle\Form\Type\CKEditorType;
class ConfigType extends AbstractType class ConfigType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => ["class" => "btn btn-success"], 'attr' => ['class' => 'btn btn-success'],
] ]
); );
$builder->add('id', $builder->add('id',
TextType::class, TextType::class,
array("label" =>"Clé", ['label' => 'Clé',
'disabled' => true)); 'disabled' => true, ]);
switch($options["type"]) { switch ($options['type']) {
case "string": case 'string':
$builder->add('value', $builder->add('value',
TextType::class, TextType::class,
array("label" => "Valeur", ['label' => 'Valeur',
'required' => ($options["required"]==0?false:true))); 'required' => (0 == $options['required'] ? false : true), ]);
break; break;
case "boolean": case 'boolean':
$choices=["oui" => "1","non" => "0"]; $choices = ['oui' => '1', 'non' => '0'];
$builder->add("value", ChoiceType::class, $builder->add('value', ChoiceType::class,
array("label" =>"Valeur", ['label' => 'Valeur',
'required' => ($options["required"]==0?false:true), 'required' => (0 == $options['required'] ? false : true),
"choices" => $choices)); 'choices' => $choices, ]);
break; break;
case "integer": case 'integer':
$builder->add("value", $builder->add('value',
IntegerType::class, [ IntegerType::class, [
"label" =>"Valeur", 'label' => 'Valeur',
"attr" => ["min" => "0"], 'attr' => ['min' => '0'],
"required" => ($options["required"]==0?false:true), 'required' => (0 == $options['required'] ? false : true),
] ]
); );
break; break;
case "pourcentage": case 'pourcentage':
$builder->add("value", $builder->add('value',
IntegerType::class, [ IntegerType::class, [
"label" =>"Valeur", 'label' => 'Valeur',
"attr" => ["min" => "0", "max"=>"100"], 'attr' => ['min' => '0', 'max' => '100'],
"required" => ($options["required"]==0?false:true), 'required' => (0 == $options['required'] ? false : true),
] ]
); );
break; break;
case "font": case 'font':
$choices=[ $choices = [
"ABeeZee-Regular" => "ABeeZee-Regular", 'ABeeZee-Regular' => 'ABeeZee-Regular',
"Acme-Regular" => "Acme-Regular", 'Acme-Regular' => 'Acme-Regular',
"AlfaSlabOne-Regular" => "AlfaSlabOne-Regular", 'AlfaSlabOne-Regular' => 'AlfaSlabOne-Regular',
"Anton-Regular" => "Anton-Regular", 'Anton-Regular' => 'Anton-Regular',
"Baloo-Regular" => "Baloo-Regular", 'Baloo-Regular' => 'Baloo-Regular',
"CarterOne-Regular" => "CarterOne-Regular", 'CarterOne-Regular' => 'CarterOne-Regular',
"Chewy-Regular" => "Chewy-Regular", 'Chewy-Regular' => 'Chewy-Regular',
"Courgette-Regular" => "Courgette-Regular", 'Courgette-Regular' => 'Courgette-Regular',
"FredokaOne-Regular" => "FredokaOne-Regular", 'FredokaOne-Regular' => 'FredokaOne-Regular',
"Grandstander" => "Grandstander", 'Grandstander' => 'Grandstander',
"Helvetica" => "Helvetica", 'Helvetica' => 'Helvetica',
"Justanotherhand-Regular" => "Justanotherhand-Regular", 'Justanotherhand-Regular' => 'Justanotherhand-Regular',
"Lato-Regular" => "Lato-Regular", 'Lato-Regular' => 'Lato-Regular',
"LexendDeca-Regular" => "LexendDeca-Regular", 'LexendDeca-Regular' => 'LexendDeca-Regular',
"LuckiestGuy-Regular" => "LuckiestGuy-Regular", 'LuckiestGuy-Regular' => 'LuckiestGuy-Regular',
"Overpass-Black" => "Overpass-Black", 'Overpass-Black' => 'Overpass-Black',
"PassionOne" => "PassionOne", 'PassionOne' => 'PassionOne',
"Peacesans" => "Peacesans", 'Peacesans' => 'Peacesans',
"Redressed" => "Redressed", 'Redressed' => 'Redressed',
"Righteous-Regular" => "Righteous-Regular", 'Righteous-Regular' => 'Righteous-Regular',
"Roboto-Regular" => "Roboto-Regular", 'Roboto-Regular' => 'Roboto-Regular',
"RubikMonoOne-Regular" => "RubikMonoOne-Regular", 'RubikMonoOne-Regular' => 'RubikMonoOne-Regular',
"SigmarOne-Regular" => "SigmarOne-Regular", 'SigmarOne-Regular' => 'SigmarOne-Regular',
"Signika-Regular" => "Signika-Regular", 'Signika-Regular' => 'Signika-Regular',
"Teko-Bold" => "Teko-Bold", 'Teko-Bold' => 'Teko-Bold',
"Theboldfont" => "Theboldfont", 'Theboldfont' => 'Theboldfont',
"Viga-Regular" => "Viga-Regular", 'Viga-Regular' => 'Viga-Regular',
]; ];
$builder->add("value", ChoiceType::class, $builder->add('value', ChoiceType::class,
array("label" =>"Valeur", ['label' => 'Valeur',
'required' => ($options["required"]==0?false:true), 'required' => (0 == $options['required'] ? false : true),
"choices" => $choices)); 'choices' => $choices, ]);
break; break;
case "editor": case 'editor':
$builder->add('value', $builder->add('value',
CKEditorType::class,[ CKEditorType::class, [
"required" => ($options["required"]==0?false:true), 'required' => (0 == $options['required'] ? false : true),
"config_name" => "full_config", 'config_name' => 'full_config',
"config" => [ 'config' => [
'height' => 600, 'height' => 600,
'filebrowserUploadRoute' => 'app_ckeditor_upload', 'filebrowserUploadRoute' => 'app_ckeditor_upload',
] ],
] ]
); );
break; break;
case 'role':
$choices = [
'NO_BODY' => 'NO_BODY',
'ROLE_USER' => 'ROLE_USER',
'ROLE_MASTER' => 'ROLE_MASTER',
'ROLE_MANAGER' => 'ROLE_MANAGER',
'ROLE_MODO' => 'ROLE_MODO',
];
case "role": $builder->add('value', ChoiceType::class,
$choices=array( ['label' => 'Valeur',
"NO_BODY" => "NO_BODY", 'label_attr' => ['style' => 'margin-top:15px;'],
"ROLE_USER" => "ROLE_USER", 'attr' => ['class' => 'form-control'],
"ROLE_MASTER" => "ROLE_MASTER", 'required' => (0 == $options['required'] ? false : true),
"ROLE_MODO" => "ROLE_MODO", 'choices' => $choices, ]);
);
$builder->add("value", ChoiceType::class,
array("label" =>"Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control"),
'required' => ($options["required"]==0?false:true),
"choices" => $choices));
break; break;
case 'logo':
case "scopeannu": $builder->add('value', HiddenType::class);
$choices=array(
"ALL" => "ALL",
"SAME_NIVEAU01" => "SAME_NIVEAU01",
"SAME_NIVEAU02" => "SAME_NIVEAU02",
);
$builder->add("value", ChoiceType::class,
array("label" =>"Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control"),
'required' => ($options["required"]==0?false:true),
"choices" => $choices));
break; break;
case "logo": case 'header':
$builder->add('value',HiddenType::class); $builder->add('value', HiddenType::class);
break; break;
case "header": case 'image':
$builder->add('value',HiddenType::class); $builder->add('value', HiddenType::class);
break; break;
case "image": case 'color':
$builder->add('value',HiddenType::class);
break;
case "color":
$builder->add('value', $builder->add('value',
TextType::class, TextType::class,
array("label" => "Valeur", ['label' => 'Valeur',
"attr" => ["class" => "pick-a-color"], 'attr' => ['class' => 'pick-a-color'],
'required' => ($options["required"]==0?false:true))); 'required' => (0 == $options['required'] ? false : true), ]);
break; break;
} }
$builder->add('help', $builder->add('help',
TextareaType::class, TextareaType::class,
array("label" =>"Aide", ['label' => 'Aide',
"attr" => ["style" => "height: 200px;"], 'attr' => ['style' => 'height: 200px;'],
'required' => false, 'required' => false,
'disabled' => true)); 'disabled' => true, ]);
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'App\Entity\Config', 'data_class' => 'App\Entity\Config',
'mode' => "string", 'mode' => 'string',
'id' => "string", 'id' => 'string',
'type' => "string", 'type' => 'string',
'required' => "string", 'required' => 'string',
)); ]);
} }
} }

View File

@ -3,64 +3,57 @@
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType; use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CronType extends AbstractType class CronType extends AbstractType
{ {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('submit', SubmitType::class, [ ->add('submit', SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => array("class" => "btn btn-success") 'attr' => ['class' => 'btn btn-success'],
]) ])
->add('command', TextType::class, [ ->add('command', TextType::class, [
'label' => 'Commande', 'label' => 'Commande',
"disabled" => true, 'disabled' => true,
]) ])
->add('jsonargument', TextType::class, [ ->add('jsonargument', TextType::class, [
'label' => 'Argument Commande au format json', 'label' => 'Argument Commande au format json',
"disabled" => true, 'disabled' => true,
]) ])
->add('statut', ChoiceType::class, [ ->add('statut', ChoiceType::class, [
'label' => "Statut", 'label' => 'Statut',
'choices' => array("Désactivé" => -1,"KO" => "0","OK" => "1") 'choices' => ['Désactivé' => -1, 'KO' => '0', 'OK' => '1'],
]) ])
->add('repeatinterval', IntegerType::class, [ ->add('repeatinterval', IntegerType::class, [
'label' => "Interval en seconde entre deux éxécution" 'label' => 'Interval en seconde entre deux éxécution',
]) ])
->add('nextexecdate', DatetimeType::class, [ ->add('nextexecdate', DatetimeType::class, [
'label' => "Prochaine exécution", 'label' => 'Prochaine exécution',
'widget' => 'single_text', 'widget' => 'single_text',
"html5"=>true, 'html5' => true,
'input_format' => "d/m/Y H:i" 'input_format' => 'd/m/Y H:i',
]) ])
; ;
} }
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults([ $resolver->setDefaults([
'data_class' => 'App\Entity\Cron', 'data_class' => 'App\Entity\Cron',
'mode' => 'string' 'mode' => 'string',
]); ]);
} }
} }

View File

@ -1,130 +1,123 @@
<?php <?php
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType; use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManager;
class GroupType extends AbstractType class GroupType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => ["class" => "btn btn-success"], 'attr' => ['class' => 'btn btn-success'],
] ]
); );
if($options["access"]=="admin") { if ('admin' == $options['access']) {
$builder->add('isworkgroup', $builder->add('isworkgroup',
ChoiceType::class,[ ChoiceType::class, [
"label" =>"Groupe de Travail", 'label' => 'Groupe de Travail',
"choices" => ["non" => "0","oui" => "1"], 'choices' => ['non' => '0', 'oui' => '1'],
] ]
); );
} }
if($options["access"]=="admin" || $options["mode"] == "update") { if ('admin' == $options['access'] || 'update' == $options['mode']) {
$builder->add('owner', $builder->add('owner',
Select2EntityType::class, [ Select2EntityType::class, [
"label" => "Propriétaire", 'label' => 'Propriétaire',
"required" => false, 'required' => false,
"multiple" => false, 'multiple' => false,
"remote_route" => 'app_'.$options["access"].'_user_selectlist', 'remote_route' => 'app_'.$options['access'].'_user_selectlist',
"class" => 'App\Entity\User', 'class' => 'App\Entity\User',
"primary_key" => 'id', 'primary_key' => 'id',
"text_property" => 'username', 'text_property' => 'fullname',
"minimum_input_length" => 2, 'minimum_input_length' => 2,
"page_limit" => 10, 'page_limit' => 10,
"allow_clear" => true, 'allow_clear' => true,
"delay" => 250, 'delay' => 250,
"cache" => false, 'cache' => false,
"cache_timeout" => 60000, // if 'cache' is true 'cache_timeout' => 60000, // if 'cache' is true
"language" => 'fr', 'language' => 'fr',
"placeholder" => 'Selectionner un propriétaire', 'placeholder' => 'Selectionner un propriétaire',
] ]
); );
} }
if($options["access"]=="admin") { if ('admin' == $options['access']) {
$builder->add('email', $builder->add('email',
EmailType::class, [ EmailType::class, [
"label" => "Mail", 'label' => 'Mail',
"required" => false, 'required' => false,
] ]
); );
} }
$builder->add("description", $builder->add('description',
TextareaType::class, [ TextareaType::class, [
"label" => 'Description', 'label' => 'Description',
"required" => false, 'required' => false,
"attr" => ["rows" => '4'], 'attr' => ['rows' => '4'],
] ]
); );
$builder->add('label', $builder->add('label',
TextType::class, [ TextType::class, [
"label" =>"Label", 'label' => 'Label',
] ]
); );
$builder->add("isopen", $builder->add('isopen',
ChoiceType::class,array( ChoiceType::class, [
"label" =>"Groupe Ouvert (inscription possible par les utilisateurs)", 'label' => 'Groupe Ouvert (inscription possible par les utilisateurs)',
"choices" => ["non" => "0","oui" => "1"], 'choices' => ['non' => '0', 'oui' => '1'],
) ]
); );
// Si masteridentity = LDAP alors on demande le filtre des utilisateurs qui appartiennent à ce groupe // Si masteridentity = LDAP alors on demande le filtre des utilisateurs qui appartiennent à ce groupe
if($options["appMasteridentity"]=="LDAP"&&$options["access"]=="admin") if ('LDAP' == $options['appMasteridentity'] && 'admin' == $options['access']) {
{ $builder->add('fgassoc',
$builder->add("fgassoc", ChoiceType::class, [
ChoiceType::class,[ 'mapped' => false,
"mapped" => false, 'label' => "Groupe associé à l'annuaire ?",
"label" => "Groupe associé à l'annuaire ?", 'choices' => ['non' => '0', 'oui' => '1'],
"choices" => ["non" => "0","oui" => "1"],
] ]
); );
$builder->add('ldapfilter', $builder->add('ldapfilter',
TextType::class, [ TextType::class, [
"label" => "Filtre LDAP des utilisateurs", 'label' => 'Filtre LDAP des utilisateurs',
"label_attr" => ["id" => "label_group_ldapfilter"], 'label_attr' => ['id' => 'label_group_ldapfilter'],
"required" => false, 'required' => false,
] ]
); );
} }
if($options["appMasteridentity"]=="SSO"&&$options["access"]=="admin") if ('SSO' == $options['appMasteridentity'] && 'admin' == $options['access']) {
{ $builder->add('fgassoc',
$builder->add("fgassoc", ChoiceType::class, [
ChoiceType::class,[ 'mapped' => false,
"mapped" => false, 'label' => 'Groupe associé à des attributs SSO ?',
"label" => "Groupe associé à des attributs SSO ?", 'choices' => ['non' => '0', 'oui' => '1'],
"choices" => ["non" => "0","oui" => "1"],
] ]
); );
$builder->add('attributes', $builder->add('attributes',
TextareaType::class, [ TextareaType::class, [
"label" => "Attributs SSO des utilisateurs", 'label' => 'Attributs SSO des utilisateurs',
"label_attr" => ["id" => "label_group_attributes"], 'label_attr' => ['id' => 'label_group_attributes'],
"required" => false, 'required' => false,
"attr" => ["rows" => 10] 'attr' => ['rows' => 10],
] ]
); );
} }
@ -132,11 +125,11 @@ class GroupType extends AbstractType
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'App\Entity\Group', 'data_class' => 'App\Entity\Group',
'mode' => "string", 'mode' => 'string',
'access' => "string", 'access' => 'string',
'appMasteridentity' => "string", 'appMasteridentity' => 'string',
)); ]);
} }
} }

View File

@ -1,37 +1,37 @@
<?php <?php
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
class LoginType extends AbstractType class LoginType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => ["class" => "btn btn-success mt-4 float-end"], 'attr' => ['class' => 'btn btn-success mt-4 float-end'],
] ]
); );
$builder->add('username', $builder->add('username',
TextType::class,[ TextType::class, [
"label" =>"Login", 'label' => 'Login',
"attr" => ["autocomplete" => "new-password"] 'attr' => ['autocomplete' => 'new-password'],
] ]
); );
$builder->add('password', $builder->add('password',
PasswordType::class, [ PasswordType::class, [
"always_empty" => true, 'always_empty' => true,
"label" => "Mot de Passe", 'label' => 'Mot de Passe',
"attr" => ["autocomplete" => "new-password"] 'attr' => ['autocomplete' => 'new-password'],
] ]
); );
} }
} }

View File

@ -1,81 +1,109 @@
<?php <?php
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
class Niveau01Type extends AbstractType class Niveau01Type extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => ["class" => "btn btn-success"], 'attr' => ['class' => 'btn btn-success'],
] ]
); );
$builder->add('label', $builder->add('label',
TextType::class, [ TextType::class, [
"label" =>"Label", 'label' => 'Label',
]
);
$builder->add('code',
TextType::class, [
'label' => 'Code',
'required' => false,
]
);
$builder->add('email',
EmailType::class, [
'label' => 'Mail',
'required' => false,
]
);
$builder->add('postaladress',
TextareaType::class, [
'label' => 'Adresse',
'required' => false,
'attr' => ['style' => 'height:90px'],
]
);
$builder->add('telephonenumber',
TextType::class, [
'label' => 'Téléphone',
'required' => false,
] ]
); );
// Si masteridentity = LDAP alors on demande le filtre des utilisateurs qui appartiennent à ce groupe // Si masteridentity = LDAP alors on demande le filtre des utilisateurs qui appartiennent à ce groupe
if($options["appMasteridentity"]=="LDAP"||$options["appSynchro"]=="LDAP2NINE") if ('LDAP' == $options['appMasteridentity'] || 'LDAP2NINE' == $options['appSynchro']) {
{ $builder->add('fgassocldap',
$builder->add("fgassocldap", ChoiceType::class, [
ChoiceType::class,[ 'mapped' => false,
"mapped" => false, 'label' => $options['appNiveau01label']." associé à l'annuaire ?",
"label" => $options["appNiveau01label"]." associé à l'annuaire ?", 'choices' => ['non' => '0', 'oui' => '1'],
"choices" => ["non" => "0","oui" => "1"],
] ]
); );
$builder->add('ldapfilter', $builder->add('ldapfilter',
TextType::class, [ TextType::class, [
"label" => "Filtre LDAP du ".$options["appNiveau01label"], 'label' => 'Filtre LDAP du '.$options['appNiveau01label'],
"label_attr" => ["id" => "label_group_ldapfilter"], 'label_attr' => ['id' => 'label_group_ldapfilter'],
"required" => false, 'required' => false,
] ]
); );
} }
if($options["appMasteridentity"]=="SSO") if ('SSO' == $options['appMasteridentity']) {
{ $builder->add('fgassocsso',
$builder->add("fgassocsso", ChoiceType::class, [
ChoiceType::class,[ 'mapped' => false,
"mapped" => false, 'label' => $options['appNiveau01label'].' associé à des attributs SSO ?',
"label" => $options["appNiveau01label"]." associé à des attributs SSO ?", 'choices' => ['non' => '0', 'oui' => '1'],
"choices" => ["non" => "0","oui" => "1"],
] ]
); );
$builder->add('attributes', $builder->add('attributes',
TextareaType::class, [ TextareaType::class, [
"label" => "Attributs SSO du ".$options["appNiveau01label"], 'label' => 'Attributs SSO du '.$options['appNiveau01label'],
"label_attr" => ["id" => "label_group_attributes"], 'label_attr' => ['id' => 'label_group_attributes'],
"required" => false, 'required' => false,
"attr" => ["rows" => 10] 'attr' => ['rows' => 10],
] ]
); );
} }
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'App\Entity\Niveau01', 'data_class' => 'App\Entity\Niveau01',
'mode' => "string", 'mode' => 'string',
'appMasteridentity' => "string", 'appMasteridentity' => 'string',
"appSynchro" => "string", 'appSynchro' => 'string',
'appNiveau01label' => "string" 'appNiveau01label' => 'string',
)); ]);
} }
} }

View File

@ -1,46 +1,49 @@
<?php <?php
namespace App\Form;
use Symfony\Component\Form\AbstractType; namespace App\Form;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository; use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Query\Expr\Join;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class Niveau02Type extends AbstractType class Niveau02Type extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => ["class" => "btn btn-success"], 'attr' => ['class' => 'btn btn-success'],
] ]
); );
$access=$options["access"]; $access = $options['access'];
$userid=$options["userid"]; $userid = $options['userid'];
$builder->add('niveau01', $builder->add('niveau01',
EntityType::class, [ EntityType::class, [
"class" => "App\Entity\Niveau01", 'class' => "App\Entity\Niveau01",
"label" => $options["appNiveau01label"], 'label' => $options['appNiveau01label'],
"placeholder" => "== Choisir ".$options["appNiveau01label"]." ==", 'placeholder' => '== Choisir '.$options['appNiveau01label'].' ==',
"choice_label" => "label", 'choice_label' => 'label',
"disabled" => ($options["mode"]!="submit"), 'disabled' => ('submit' != $options['mode']),
"query_builder"=> function (EntityRepository $er) use($access,$userid) { 'query_builder' => function (EntityRepository $er) use ($access, $userid) {
switch($access) { switch ($access) {
case "admin": case 'admin':
return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label','ASC'); return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label', 'ASC');
break; break;
case "modo": case 'modo':
$result=$er->createQueryBuilder("table")->innerJoin("App:UserModo", "usermodo", Join::WITH, "table.id = usermodo.niveau01")->orderBy('table.label','ASC'); $result = $er->createQueryBuilder('table')->innerJoin('App:UserModo', 'usermodo', Join::WITH, 'table.id = usermodo.niveau01')->orderBy('table.label', 'ASC');
$result->andWhere("usermodo.user = :user"); $result->andWhere('usermodo.user = :user');
$result->setParameter('user', $userid); $result->setParameter('user', $userid);
return $result; return $result;
break; break;
} }
@ -50,21 +53,50 @@ class Niveau02Type extends AbstractType
$builder->add('label', $builder->add('label',
TextType::class, [ TextType::class, [
"label" =>"Label", 'label' => 'Label',
]
);
$builder->add('code',
TextType::class, [
'label' => 'Code',
'required' => false,
]
);
$builder->add('email',
EmailType::class, [
'label' => 'Mail',
'required' => false,
]
);
$builder->add('postaladress',
TextareaType::class, [
'label' => 'Adresse',
'required' => false,
'attr' => ['style' => 'height:90px'],
]
);
$builder->add('telephonenumber',
TextType::class, [
'label' => 'Téléphone',
'required' => false,
] ]
); );
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'App\Entity\Niveau02', 'data_class' => 'App\Entity\Niveau02',
'mode' => "string", 'mode' => 'string',
'access' => "string", 'access' => 'string',
'userid' => "string", 'userid' => 'string',
'appMasteridentity' => "string", 'appMasteridentity' => 'string',
'appNiveau01label' => "string", 'appNiveau01label' => 'string',
'appNiveau02label' => "string" 'appNiveau02label' => 'string',
)); ]);
} }
} }

125
src/Form/Niveau03Type.php Normal file
View File

@ -0,0 +1,125 @@
<?php
namespace App\Form;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
class Niveau03Type extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('submit',
SubmitType::class, [
'label' => 'Valider',
'attr' => ['class' => 'btn btn-success'],
]
);
$access = $options['access'];
$userid = $options['userid'];
$builder->add('niveau01',
EntityType::class, [
'class' => "App\Entity\Niveau01",
'label' => $options['appNiveau01label'],
'placeholder' => '== Choisir '.$options['appNiveau01label'].' ==',
'choice_label' => 'label',
'disabled' => ('submit' != $options['mode']),
'query_builder' => function (EntityRepository $er) use ($access, $userid) {
switch ($access) {
case 'admin':
return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label', 'ASC');
break;
case 'modo':
$result = $er->createQueryBuilder('table')->innerJoin('App:UserModo', 'usermodo', Join::WITH, 'table.id = usermodo.niveau01')->orderBy('table.label', 'ASC');
$result->andWhere('usermodo.user = :user');
$result->setParameter('user', $userid);
return $result;
break;
}
},
]
);
$builder->add('niveau02',
Select2EntityType::class, [
'label' => $options['appNiveau02label'],
'required' => true,
'disabled' => ('submit' != $options['mode']),
'remote_route' => 'app_niveau02_selectlist',
'class' => "App\Entity\Niveau02",
// "req_params" => ["niveau01" => "parent.children[niveau01]"],
'primary_key' => 'id',
'text_property' => 'label',
'minimum_input_length' => 0,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'cache' => false,
'cache_timeout' => 60000,
'language' => 'fr',
'placeholder' => '== Choisir '.$options['appNiveau02label'].' ==',
]
);
$builder->add('label',
TextType::class, [
'label' => 'Label',
]
);
$builder->add('code',
TextType::class, [
'label' => 'Code',
'required' => false,
]
);
$builder->add('email',
EmailType::class, [
'label' => 'Mail',
'required' => false,
]
);
$builder->add('postaladress',
TextareaType::class, [
'label' => 'Adresse',
'required' => false,
'attr' => ['style' => 'height:90px'],
]
);
$builder->add('telephonenumber',
TextType::class, [
'label' => 'Téléphone',
'required' => false,
]
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'App\Entity\Niveau03',
'mode' => 'string',
'access' => 'string',
'userid' => 'string',
'appMasteridentity' => 'string',
'appNiveau01label' => 'string',
'appNiveau02label' => 'string',
'appNiveau03label' => 'string',
]);
}
}

147
src/Form/Niveau04Type.php Normal file
View File

@ -0,0 +1,147 @@
<?php
namespace App\Form;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
class Niveau04Type extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('submit',
SubmitType::class, [
'label' => 'Valider',
'attr' => ['class' => 'btn btn-success'],
]
);
$access = $options['access'];
$userid = $options['userid'];
$builder->add('niveau01',
EntityType::class, [
'class' => "App\Entity\Niveau01",
'label' => $options['appNiveau01label'],
'placeholder' => '== Choisir '.$options['appNiveau01label'].' ==',
'choice_label' => 'label',
'disabled' => ('submit' != $options['mode']),
'query_builder' => function (EntityRepository $er) use ($access, $userid) {
switch ($access) {
case 'admin':
return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label', 'ASC');
break;
case 'modo':
$result = $er->createQueryBuilder('table')->innerJoin('App:UserModo', 'usermodo', Join::WITH, 'table.id = usermodo.niveau01')->orderBy('table.label', 'ASC');
$result->andWhere('usermodo.user = :user');
$result->setParameter('user', $userid);
return $result;
break;
}
},
]
);
$builder->add('niveau02',
Select2EntityType::class, [
'label' => $options['appNiveau02label'],
'required' => true,
'disabled' => ('submit' != $options['mode']),
'remote_route' => 'app_niveau02_selectlist',
'class' => "App\Entity\Niveau02",
// "req_params" => ["niveau01" => "parent.children[niveau01]"],
'primary_key' => 'id',
'text_property' => 'label',
'minimum_input_length' => 0,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'cache' => false,
'cache_timeout' => 60000,
'language' => 'fr',
'placeholder' => '== Choisir '.$options['appNiveau02label'].' ==',
]
);
$builder->add('niveau03',
Select2EntityType::class, [
'label' => $options['appNiveau03label'],
'required' => true,
'disabled' => ('submit' != $options['mode']),
'remote_route' => 'app_niveau03_selectlist',
'class' => "App\Entity\Niveau03",
// "req_params" => ["niveau01" => "parent.children[niveau01]"],
'primary_key' => 'id',
'text_property' => 'label',
'minimum_input_length' => 0,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'cache' => false,
'cache_timeout' => 60000,
'language' => 'fr',
'placeholder' => '== Choisir '.$options['appNiveau03label'].' ==',
]
);
$builder->add('label',
TextType::class, [
'label' => 'Label',
]
);
$builder->add('code',
TextType::class, [
'label' => 'Code',
'required' => false,
]
);
$builder->add('email',
EmailType::class, [
'label' => 'Mail',
'required' => false,
]
);
$builder->add('postaladress',
TextareaType::class, [
'label' => 'Adresse',
'required' => false,
'attr' => ['style' => 'height:90px'],
]
);
$builder->add('telephonenumber',
TextType::class, [
'label' => 'Téléphone',
'required' => false,
]
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'App\Entity\Niveau04',
'mode' => 'string',
'access' => 'string',
'userid' => 'string',
'appMasteridentity' => 'string',
'appNiveau01label' => 'string',
'appNiveau02label' => 'string',
'appNiveau03label' => 'string',
'appNiveau04label' => 'string',
]);
}
}

View File

@ -1,212 +1,257 @@
<?php <?php
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Gregwar\CaptchaBundle\Type\CaptchaType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Doctrine\ORM\EntityRepository; use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Query\Expr\Join;
use Gregwar\CaptchaBundle\Type\CaptchaType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
class RegistrationType extends AbstractType class RegistrationType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => ($options["mode"]=="submit"?"Confirmer":"Enregistrer et envoyer le mail de confirmation"), 'label' => ('submit' == $options['mode'] ? 'Confirmer' : 'Enregistrer et envoyer le mail de confirmation'),
"attr" => ["class" => "btn btn-success"], 'attr' => ['class' => 'btn btn-success'],
] ]
); );
if($options["mode"]=="update") { if ('update' == $options['mode']) {
$builder->add('save', $builder->add('save',
SubmitType::class, array( SubmitType::class, [
"label" => "Enregistrer sans envoyer le mail de confirmation", 'label' => 'Enregistrer sans envoyer le mail de confirmation',
"attr" => array("class" => "btn btn-success") 'attr' => ['class' => 'btn btn-success'],
) ]
); );
$builder->add('note', $builder->add('note',
TextareaType::class, array( TextareaType::class, [
"label" => "Notes Administrateur", 'label' => 'Notes Administrateur',
"required" => false, 'required' => false,
"disabled" => ($options["mode"]=="delete"?true:false), 'disabled' => ('delete' == $options['mode'] ? true : false),
"attr" => array("class" => "form-control", "style" => "margin-bottom:15px; height: 130px") 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px; height: 130px'],
) ]
); );
} }
$builder->add('username', $builder->add('username',
TextType::class,[ TextType::class, [
"label" =>"Login", 'label' => 'Login',
"disabled" => ($options["mode"]!="submit"), 'disabled' => ('submit' != $options['mode']),
"attr" => ["autocomplete" => "new-password"] 'attr' => ['autocomplete' => 'new-password'],
] ]
); );
$builder->add('lastname', $builder->add('lastname',
TextType::class, [ TextType::class, [
"label" =>"Nom", 'label' => 'Nom',
"disabled" => ($options["appMasteridentity"]!="SQL"&&$options["mode"]!="submit"), 'disabled' => ('SQL' != $options['appMasteridentity'] && 'submit' != $options['mode']),
] ]
); );
$builder->add('firstname', $builder->add('firstname',
TextType::class, [ TextType::class, [
"label" =>"Prénom", 'label' => 'Prénom',
"disabled" => ($options["appMasteridentity"]!="SQL"&&$options["mode"]!="submit"), 'disabled' => ('SQL' != $options['appMasteridentity'] && 'submit' != $options['mode']),
] ]
); );
$builder->add('email', $builder->add('email',
EmailType::class, array( EmailType::class, [
"label" =>"Mail", 'label' => 'Mail',
"disabled" => ($options["appMasteridentity"]!="SQL")&&$options["mode"]!="submit", 'disabled' => ('SQL' != $options['appMasteridentity']) && 'submit' != $options['mode'],
) ]
); );
$access=$options["access"]; $access = $options['access'];
$userid=$options["userid"]; $userid = $options['userid'];
$builder->add('niveau01', $builder->add('niveau01',
EntityType::class, [ EntityType::class, [
"class" => "App\Entity\Niveau01", 'class' => "App\Entity\Niveau01",
"label" => $options["appNiveau01label"], 'label' => $options['appNiveau01label'],
"placeholder" => "== Choisir ".$options["appNiveau01label"]." ==", 'placeholder' => '== Choisir '.$options['appNiveau01label'].' ==',
"choice_label" => "label", 'choice_label' => 'label',
"disabled" => ($options["appMasteridentity"]!="SQL"&&$options["mode"]!="submit"), 'disabled' => ('SQL' != $options['appMasteridentity'] && 'submit' != $options['mode']),
"query_builder"=> function (EntityRepository $er) use($access,$userid) { 'query_builder' => function (EntityRepository $er) use ($access, $userid) {
switch($access) { switch ($access) {
case "admin": case 'admin':
return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label','ASC'); return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label', 'ASC');
break; break;
case "modo": case 'modo':
$result=$er->createQueryBuilder("table")->innerJoin("App:UserModo", "usermodo", Join::WITH, "table.id = usermodo.niveau01")->orderBy('table.label','ASC'); $result = $er->createQueryBuilder('table')->innerJoin('App:UserModo', 'usermodo', Join::WITH, 'table.id = usermodo.niveau01')->orderBy('table.label', 'ASC');
$result->andWhere("usermodo.user = :user"); $result->andWhere('usermodo.user = :user');
$result->setParameter('user', $userid); $result->setParameter('user', $userid);
return $result; return $result;
break; break;
default: default:
return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label','ASC'); return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label', 'ASC');
break; break;
} }
}, },
] ]
); );
if ($options['appNiveau02use']) {
$builder->add('niveau02', $builder->add('niveau02',
Select2EntityType::class, [ Select2EntityType::class, [
"label" => $options["appNiveau02label"], 'label' => $options['appNiveau02label'],
"required" => false, 'required' => false,
"remote_route" => "app_niveau02_selectlist", 'remote_route' => 'app_niveau02_selectlist',
"class" => "App\Entity\Niveau02", 'class' => "App\Entity\Niveau02",
//"req_params" => ["niveau01" => "parent.children[niveau01]"], 'primary_key' => 'id',
"primary_key" => "id", 'text_property' => 'label',
"text_property" => "label", 'minimum_input_length' => 0,
"minimum_input_length" => 0, 'page_limit' => 10,
"page_limit" => 10, 'allow_clear' => true,
"allow_clear" => true, 'delay' => 250,
"delay" => 250, 'cache' => false,
"cache" => false, 'cache_timeout' => 60000,
"cache_timeout" => 60000, 'language' => 'fr',
"language" => "fr", 'placeholder' => '== Choisir '.$options['appNiveau02label'].' ==',
"placeholder" => "== Choisir ".$options["appNiveau02label"]." ==",
] ]
); );
# Password
if($options["mode"]=="submit") {
$builder->add('password',
RepeatedType::class, array(
"type" => PasswordType::class,
"required" => ($options["mode"]=="submit"?true:false),
"first_options" => array("label" => "Mot de Passe","attr" => array("class" => "form-control", "style" => "margin-bottom:15px", "autocomplete" => "new-password")),
"second_options" => array('label' => 'Confirmer Mot de Passe',"attr" => array("class" => "form-control", "style" => "margin-bottom:15px")),
"invalid_message" => "Mot de passe non valide"
)
);
$builder->add('passwordplain',PasswordType::class,["mapped"=>false,"required"=>false]);
$builder->add('captcha',
CaptchaType::class,array(
"width" => 200,
"height" => 50,
"length" => 6,
)
);
} }
if ($options['appNiveau03use']) {
$builder->add('niveau03',
Select2EntityType::class, [
'label' => $options['appNiveau03label'],
'required' => false,
'remote_route' => 'app_niveau03_selectlist',
'class' => "App\Entity\Niveau03",
'primary_key' => 'id',
'text_property' => 'label',
'minimum_input_length' => 0,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'cache' => false,
'cache_timeout' => 60000,
'language' => 'fr',
'placeholder' => '== Choisir '.$options['appNiveau03label'].' ==',
]
);
}
$choices=array("oui" => "1","non" => "0"); if ($options['appNiveau04use']) {
$builder->add("isvisible", $builder->add('niveau04',
ChoiceType::class,array( Select2EntityType::class, [
"label" =>"Visible", 'label' => $options['appNiveau04label'],
"choices" => $choices 'required' => false,
) 'remote_route' => 'app_niveau04_selectlist',
'class' => "App\Entity\Niveau04",
'primary_key' => 'id',
'text_property' => 'label',
'minimum_input_length' => 0,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'cache' => false,
'cache_timeout' => 60000,
'language' => 'fr',
'placeholder' => '== Choisir '.$options['appNiveau04label'].' ==',
]
);
}
// Password
if ('submit' == $options['mode']) {
$builder->add('password',
RepeatedType::class, [
'type' => PasswordType::class,
'required' => ('submit' == $options['mode'] ? true : false),
'first_options' => ['label' => 'Mot de Passe', 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px', 'autocomplete' => 'new-password']],
'second_options' => ['label' => 'Confirmer Mot de Passe', 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px']],
'invalid_message' => 'Mot de passe non valide',
]
);
$builder->add('passwordplain', PasswordType::class, ['mapped' => false, 'required' => false]);
$builder->add('captcha',
CaptchaType::class, [
'width' => 200,
'height' => 50,
'length' => 6,
]
);
}
$choices = ['oui' => '1', 'non' => '0'];
$builder->add('isvisible',
ChoiceType::class, [
'label' => 'Visible',
'choices' => $choices,
]
); );
$builder->add('postaladress', $builder->add('postaladress',
TextareaType::class, [ TextareaType::class, [
"label" => "Adresse", 'label' => 'Adresse',
"required" => false, 'required' => false,
"attr" => ["style" => "height:90px"] 'attr' => ['style' => 'height:90px'],
] ]
); );
$builder->add('telephonenumber', $builder->add('telephonenumber',
TextType::class, [ TextType::class, [
"label" => "Téléphone", 'label' => 'Téléphone',
"required" => false, 'required' => false,
] ]
); );
$builder->add('job', $builder->add('job',
TextType::class, [ TextType::class, [
"label" => "Métier", 'label' => 'Métier',
"required" => false, 'required' => false,
] ]
); );
$builder->add('position', $builder->add('position',
TextType::class, [ TextType::class, [
"label" => "Fonction", 'label' => 'Fonction',
"required" => false, 'required' => false,
] ]
); );
$builder->add('motivation', $builder->add('motivation',
TextareaType::class, [ TextareaType::class, [
"label" => "Motivation", 'label' => 'Motivation',
"required" => false, 'required' => false,
"attr" => ["style" => "height: 90px"], 'attr' => ['style' => 'height: 90px'],
] ]
); );
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'App\Entity\Registration', 'data_class' => 'App\Entity\Registration',
'mode' => "string", 'mode' => 'string',
'access' => "string", 'access' => 'string',
'userid' => "string", 'userid' => 'string',
'appMasteridentity' => "string", 'appMasteridentity' => 'string',
'appNiveau01label' => "string", 'appNiveau01label' => 'string',
'appNiveau02label' => "string", 'appNiveau02use' => 'string',
)); 'appNiveau02label' => 'string',
'appNiveau03use' => 'string',
'appNiveau03label' => 'string',
'appNiveau04use' => 'string',
'appNiveau04label' => 'string',
]);
} }
} }

View File

@ -1,55 +1,54 @@
<?php <?php
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class ResetpwdType extends AbstractType class ResetpwdType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => ["class" => "btn btn-success"], 'attr' => ['class' => 'btn btn-success'],
] ]
); );
if($options["mode"]=="resetpwd01") { if ('resetpwd01' == $options['mode']) {
$builder->add('email', $builder->add('email',
TextType::class, array( TextType::class, [
"label" =>"Votre Mail", 'label' => 'Votre Mail',
"disabled" => ($options["mode"]=="delete"?true:false), 'disabled' => ('delete' == $options['mode'] ? true : false),
"attr" => array("class" => "form-control", "style" => "margin-bottom:15px") 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px'],
) ]
); );
} } else {
else {
$builder->add('password', $builder->add('password',
RepeatedType::class, array( RepeatedType::class, [
"type" => PasswordType::class, 'type' => PasswordType::class,
"required" => ($options["mode"]=="submit"?true:false), 'required' => ('submit' == $options['mode'] ? true : false),
"options" => array("always_empty" => true), 'options' => ['always_empty' => true],
"first_options" => array("label" => "Votre nouveau Mot de Passe","attr" => array("class" => "form-control", "style" => "margin-bottom:15px")), 'first_options' => ['label' => 'Votre nouveau Mot de Passe', 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px']],
"second_options" => array('label' => 'Confirmer votre nouveau Mot de Passe',"attr" => array("class" => "form-control", "style" => "margin-bottom:15px")), 'second_options' => ['label' => 'Confirmer votre nouveau Mot de Passe', 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px']],
"invalid_message" => "Mot de passe non valide" 'invalid_message' => 'Mot de passe non valide',
) ]
); );
$builder->add('passwordplain',PasswordType::class,["mapped"=>false,"required"=>false]); $builder->add('passwordplain', PasswordType::class, ['mapped' => false, 'required' => false]);
} }
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'App\Entity\User', 'data_class' => 'App\Entity\User',
'mode' => "string" 'mode' => 'string',
)); ]);
} }
} }

View File

@ -1,232 +1,290 @@
<?php <?php
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Doctrine\ORM\EntityRepository; use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Query\Expr\Join;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
class UserType extends AbstractType class UserType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => ["class" => "btn btn-success"], 'attr' => ['class' => 'btn btn-success'],
] ]
); );
$builder->add('username', $builder->add('username',
TextType::class,[ TextType::class, [
"label" =>"Login", 'label' => 'Login',
"disabled" => ($options["mode"]!="submit"), 'disabled' => ('submit' != $options['mode']),
"attr" => ["autocomplete" => "new-password"] 'attr' => ['autocomplete' => 'new-password'],
] ]
); );
if($options["appMasteridentity"]=="SQL"||$options["mode"]=="submit") { if ('all' != $options['access']) {
$builder->add('password', $choices = ['oui' => '1', 'non' => '0'];
RepeatedType::class, [ $builder->add('isactive',
"type" => PasswordType::class, ChoiceType::class, [
"required" => ($options["mode"]=="submit"), 'label' => 'Actif',
"options" => ["always_empty" => true], 'choices' => $choices,
"first_options" => ["label" => "Mot de Passe","attr" => ["autocomplete" => "new-password"]],
"second_options" => ["label" => 'Confirmer Mot de Passe'],
"invalid_message" => "Mot de passe non valide"
] ]
); );
$builder->add('passwordplain',PasswordType::class,["mapped"=>false,"required"=>false]); }
if ('SQL' == $options['appMasteridentity'] || 'submit' == $options['mode']) {
$builder->add('password',
RepeatedType::class, [
'type' => PasswordType::class,
'required' => ('submit' == $options['mode']),
'options' => ['always_empty' => true],
'first_options' => ['label' => 'Mot de Passe', 'attr' => ['autocomplete' => 'new-password']],
'second_options' => ['label' => 'Confirmer Mot de Passe'],
'invalid_message' => 'Mot de passe non valide',
]
);
$builder->add('passwordplain', PasswordType::class, ['mapped' => false, 'required' => false]);
} }
$builder->add('lastname', $builder->add('lastname',
TextType::class, [ TextType::class, [
"label" =>"Nom", 'label' => 'Nom',
"disabled" => ($options["appMasteridentity"]!="SQL"&&$options["mode"]!="submit"), 'disabled' => ('SQL' != $options['appMasteridentity'] && 'submit' != $options['mode']),
] ]
); );
$builder->add('firstname', $builder->add('firstname',
TextType::class, [ TextType::class, [
"label" =>"Prénom", 'label' => 'Prénom',
"disabled" => ($options["appMasteridentity"]!="SQL"&&$options["mode"]!="submit"), 'disabled' => ('SQL' != $options['appMasteridentity'] && 'submit' != $options['mode']),
] ]
); );
$builder->add('email', $builder->add('email',
EmailType::class, array( EmailType::class, [
"label" =>"Mail", 'label' => 'Mail',
"disabled" => ($options["appMasteridentity"]!="SQL")&&$options["mode"]!="submit", 'disabled' => ('SQL' != $options['appMasteridentity']) && 'submit' != $options['mode'],
) ]
); );
$access=$options["access"]; $access = $options['access'];
$userid=$options["userid"]; $userid = $options['userid'];
$builder->add('niveau01', $builder->add('niveau01',
EntityType::class, [ EntityType::class, [
"class" => "App\Entity\Niveau01", 'class' => "App\Entity\Niveau01",
"label" => $options["appNiveau01label"], 'label' => $options['appNiveau01label'],
"placeholder" => "== Choisir ".$options["appNiveau01label"]." ==", 'placeholder' => '== Choisir '.$options['appNiveau01label'].' ==',
"choice_label" => "label", 'choice_label' => 'label',
"disabled" => ($options["appMasteridentity"]!="SQL"&&$options["mode"]!="submit"), 'disabled' => (('SQL' != $options['appMasteridentity'] && 'submit' != $options['mode']) || ('admin' != $access && 'modo' != $access && $options['appNiveauupdatable'] > 1)),
"query_builder"=> function (EntityRepository $er) use($access,$userid) { 'query_builder' => function (EntityRepository $er) use ($access, $userid) {
switch($access) { switch ($access) {
case "admin": case 'admin':
return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label','ASC'); return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label', 'ASC');
break; break;
case "modo": case 'modo':
$result=$er->createQueryBuilder("table")->innerJoin("App:UserModo", "usermodo", Join::WITH, "table.id = usermodo.niveau01")->orderBy('table.label','ASC'); $result = $er->createQueryBuilder('table')->innerJoin('App:UserModo', 'usermodo', Join::WITH, 'table.id = usermodo.niveau01')->orderBy('table.label', 'ASC');
$result->andWhere("usermodo.user = :user"); $result->andWhere('usermodo.user = :user');
$result->setParameter('user', $userid); $result->setParameter('user', $userid);
return $result; return $result;
break; break;
default: default:
return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label','ASC'); return $er->createQueryBuilder('niveau01')->orderBy('niveau01.label', 'ASC');
break; break;
} }
}, },
] ]
); );
if ($options['appNiveau02use']) {
$builder->add('niveau02', $builder->add('niveau02',
Select2EntityType::class, [ Select2EntityType::class, [
"label" => $options["appNiveau02label"], 'label' => $options['appNiveau02label'],
"required" => false, 'required' => false,
"remote_route" => "app_niveau02_selectlist", 'disabled' => ('admin' != $access && 'modo' != $access && $options['appNiveauupdatable'] > 2),
"class" => "App\Entity\Niveau02", 'remote_route' => 'app_niveau02_selectlist',
//"req_params" => ["niveau01" => "parent.children[niveau01]"], 'class' => "App\Entity\Niveau02",
"primary_key" => "id", 'primary_key' => 'id',
"text_property" => "label", 'text_property' => 'label',
"minimum_input_length" => 0, 'minimum_input_length' => 0,
"page_limit" => 10, 'page_limit' => 10,
"allow_clear" => true, 'allow_clear' => true,
"delay" => 250, 'delay' => 250,
"cache" => false, 'cache' => false,
"cache_timeout" => 60000, 'cache_timeout' => 60000,
"language" => "fr", 'language' => 'fr',
"placeholder" => "== Choisir ".$options["appNiveau02label"]." ==", 'placeholder' => '== Choisir '.$options['appNiveau02label'].' ==',
] ]
); );
}
$choices=array("oui" => "1","non" => "0"); if ($options['appNiveau03use']) {
$builder->add("isvisible", $builder->add('niveau03',
ChoiceType::class,array( Select2EntityType::class, [
"label" =>"Visible", 'label' => $options['appNiveau03label'],
"choices" => $choices 'required' => false,
) 'disabled' => ('admin' != $access && 'modo' != $access && $options['appNiveauupdatable'] > 3),
'remote_route' => 'app_niveau03_selectlist',
'class' => "App\Entity\Niveau03",
'primary_key' => 'id',
'text_property' => 'label',
'minimum_input_length' => 0,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'cache' => false,
'cache_timeout' => 60000,
'language' => 'fr',
'placeholder' => '== Choisir '.$options['appNiveau03label'].' ==',
]
);
}
if ($options['appNiveau04use']) {
$builder->add('niveau04',
Select2EntityType::class, [
'label' => $options['appNiveau04label'],
'required' => false,
'disabled' => ('admin' != $access && 'modo' != $access && $options['appNiveauupdatable'] > 4),
'remote_route' => 'app_niveau04_selectlist',
'class' => "App\Entity\Niveau04",
'primary_key' => 'id',
'text_property' => 'label',
'minimum_input_length' => 0,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'cache' => false,
'cache_timeout' => 60000,
'language' => 'fr',
'placeholder' => '== Choisir '.$options['appNiveau04label'].' ==',
]
);
}
$choices = ['oui' => '1', 'non' => '0'];
$builder->add('isvisible',
ChoiceType::class, [
'label' => 'Visible',
'choices' => $choices,
]
); );
$builder->add('postaladress', $builder->add('postaladress',
TextareaType::class, [ TextareaType::class, [
"label" => "Adresse", 'label' => 'Adresse',
"required" => false, 'required' => false,
"attr" => ["style" => "height:90px"] 'attr' => ['style' => 'height:90px'],
] ]
); );
$builder->add('telephonenumber', $builder->add('telephonenumber',
TextType::class, [ TextType::class, [
"label" => "Téléphone", 'label' => 'Téléphone',
"required" => false, 'required' => false,
] ]
); );
$builder->add('job', $builder->add('job',
TextType::class, [ TextType::class, [
"label" => "Métier", 'label' => 'Métier',
"required" => false, 'required' => false,
] ]
); );
$builder->add('position', $builder->add('position',
TextType::class, [ TextType::class, [
"label" => "Fonction", 'label' => 'Fonction',
"required" => false, 'required' => false,
] ]
); );
$builder->add('visitedate', $builder->add('visitedate',
DateTimeType::class, [ DateTimeType::class, [
"label" => "Date de dernière visite", 'label' => 'Date de dernière visite',
"disabled" => true, 'disabled' => true,
"required" => false, 'required' => false,
"widget" => 'single_text', 'widget' => 'single_text',
] ]
); );
$builder->add('visitecpt', $builder->add('visitecpt',
IntegerType::class, [ IntegerType::class, [
"label" => "Nombre de visites", 'label' => 'Nombre de visites',
"disabled" => true, 'disabled' => true,
"required" => false, 'required' => false,
] ]
); );
$builder->add('motivation', $builder->add('motivation',
TextareaType::class, [ TextareaType::class, [
"label" => "Motivation", 'label' => 'Motivation',
"required" => false, 'required' => false,
"attr" => ["style" => "height: 90px"], 'attr' => ['style' => 'height: 90px'],
] ]
); );
$builder->add('avatar',HiddenType::class); $builder->add('avatar', HiddenType::class);
$builder->add('linkgroups',HiddenType::class, array("mapped" => false)); $builder->add('linkgroups', HiddenType::class, ['mapped' => false]);
$builder->add('linkmodos',HiddenType::class, array("mapped" => false)); $builder->add('linkmodos', HiddenType::class, ['mapped' => false]);
if($options["access"]=="admin" || $options["access"]=="modo") { if ('admin' == $options['access'] || 'modo' == $options['access']) {
$choices=array("ROLE_ADMIN" => "ROLE_ADMIN","ROLE_MODO" => "ROLE_MODO","ROLE_MASTER" => "ROLE_MASTER","ROLE_USER" => "ROLE_USER"); $choices = ['ROLE_ADMIN' => 'ROLE_ADMIN', 'ROLE_MODO' => 'ROLE_MODO', 'ROLE_MASTER' => 'ROLE_MASTER', 'ROLE_MANAGER' => 'ROLE_MANAGER', 'ROLE_USER' => 'ROLE_USER'];
$builder->add("roles", $builder->add('roles',
ChoiceType::class,[ ChoiceType::class, [
"label" =>"Rôle", 'label' => 'Rôle',
"required" => true, 'required' => true,
"multiple" => true, 'multiple' => true,
"expanded" => true, 'expanded' => true,
"choices" => $choices 'choices' => $choices,
] ]
); );
$builder->add('note', $builder->add('note',
TextareaType::class, [ TextareaType::class, [
"label" => "Notes Administrateur", 'label' => 'Notes Administrateur',
"required" => false, 'required' => false,
"attr" => ["style" => "height: 130px"] 'attr' => ['style' => 'height: 130px'],
] ]
); );
} }
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'App\Entity\User', 'data_class' => 'App\Entity\User',
'mode' => "string", 'mode' => 'string',
'access' => "string", 'access' => 'string',
'userid' => "string", 'userid' => 'string',
'appMasteridentity' => "string", 'appMasteridentity' => 'string',
'appNiveau01label' => "string", 'appNiveau01label' => 'string',
'appNiveau02label' => "string", 'appNiveau02use' => 'string',
)); 'appNiveau02label' => 'string',
'appNiveau03use' => 'string',
'appNiveau03label' => 'string',
'appNiveau04use' => 'string',
'appNiveau04label' => 'string',
'appNiveauupdatable' => 'string',
]);
} }
} }

View File

@ -1,35 +1,36 @@
<?php <?php
namespace App\Form; namespace App\Form;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class WhitelistType extends AbstractType class WhitelistType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->add('submit', $builder->add('submit',
SubmitType::class,[ SubmitType::class, [
"label" => "Valider", 'label' => 'Valider',
"attr" => ["class" => "btn btn-success"], 'attr' => ['class' => 'btn btn-success'],
] ]
); );
$builder->add('label', $builder->add('label',
TextType::class, [ TextType::class, [
"label" =>"Label", 'label' => 'Label',
] ]
); );
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults(array( $resolver->setDefaults([
'data_class' => 'App\Entity\Whitelist', 'data_class' => 'App\Entity\Whitelist',
'mode' => "string" 'mode' => 'string',
)); ]);
} }
} }

View File

@ -39,12 +39,11 @@ class CronRepository extends ServiceEntityRepository
// = statut = 3 (KO) et derniere execution + interval > now et nombre d'appel = 0 // = statut = 3 (KO) et derniere execution + interval > now et nombre d'appel = 0
// = statut = 3 (KO) et nombre d'execution < nombre d'appel // = statut = 3 (KO) et nombre d'execution < nombre d'appel
$now = new \DateTime();
$now=new \DateTime();
$qb = $this->createQueryBuilder('cron') $qb = $this->createQueryBuilder('cron')
->Where('(cron.statut=0 OR cron.statut=1) AND cron.nextexecdate<:now'); ->Where('(cron.statut=0 OR cron.statut=1) AND cron.nextexecdate<:now');
return $qb->getQuery()->setParameter('now',$now->format("Y-m-d H:i:s"))->getResult(); return $qb->getQuery()->setParameter('now', $now->format('Y-m-d H:i:s'))->getResult();
} }
} }

View File

@ -3,10 +3,10 @@
namespace App\Repository; namespace App\Repository;
use App\Entity\Group; use App\Entity\Group;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Common\Collections\ArrayCollection;
use App\Entity\UserGroup; use App\Entity\UserGroup;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Persistence\ManagerRegistry;
use Ramsey\Uuid\Uuid; use Ramsey\Uuid\Uuid;
class GroupRepository extends ServiceEntityRepository class GroupRepository extends ServiceEntityRepository
@ -35,43 +35,44 @@ class GroupRepository extends ServiceEntityRepository
} }
/* Déterminer les groupes d'un user SSO en fonction de ses attributs */ /* Déterminer les groupes d'un user SSO en fonction de ses attributs */
public function calculateSSOGroup($user,$attruser) public function calculateSSOGroup($user, $attruser)
{ {
$groups = $this->_em->getRepository('App\Entity\Group')->findAll(); $groups = $this->_em->getRepository('App\Entity\Group')->findAll();
$retgroups= new ArrayCollection(); $retgroups = new ArrayCollection();
foreach($groups as $group) { foreach ($groups as $group) {
if($group->getAttributes()) { if ($group->getAttributes()) {
$attgroup=json_decode($group->getAttributes(),true); $attgroup = json_decode($group->getAttributes(), true);
foreach($attgroup as $key => $value) { foreach ($attgroup as $key => $value) {
if(array_key_exists($key,$attruser)) { if (array_key_exists($key, $attruser)) {
if(is_array($attruser[$key])) { if (is_array($attruser[$key])) {
foreach($attruser[$key] as $val) { foreach ($attruser[$key] as $val) {
if($value=="*") if ('*' == $value) {
$retgroups->add($group); $retgroups->add($group);
elseif($val==$value) } elseif ($val == $value) {
$retgroups->add($group); $retgroups->add($group);
} }
} }
else { } else {
if($value=="*") if ('*' == $value) {
$retgroups->add($group); $retgroups->add($group);
elseif($value==$attruser[$key]) } elseif ($value == $attruser[$key]) {
$retgroups->add($group); $retgroups->add($group);
} }
} }
} }
} }
} }
}
// Pour chaque groupe de l'utilisateur // Pour chaque groupe de l'utilisateur
$usergroups=$user->getGroups(); $usergroups = $user->getGroups();
// On le détache des groupes auxquelles il n'appartient plus // On le détache des groupes auxquelles il n'appartient plus
if($usergroups) { if ($usergroups) {
foreach($usergroups as $usergroup) { foreach ($usergroups as $usergroup) {
if($usergroup->getGroup()->getAttributes()!="") { if ('' != $usergroup->getGroup()->getAttributes()) {
if(!$retgroups->contains($usergroup->getGroup())) { if (!$retgroups->contains($usergroup->getGroup())) {
$user->removeGroup($usergroup); $user->removeGroup($usergroup);
} }
} }
@ -79,10 +80,10 @@ class GroupRepository extends ServiceEntityRepository
} }
// On attache le user aux groupes // On attache le user aux groupes
foreach($retgroups as $retgroup) { foreach ($retgroups as $retgroup) {
$usergroup=$this->_em->getRepository('App\Entity\UserGroup')->findBy(["user"=>$user,"group"=>$retgroup]); $usergroup = $this->_em->getRepository('App\Entity\UserGroup')->findBy(['user' => $user, 'group' => $retgroup]);
if(!$usergroup) { if (!$usergroup) {
$usergroup=new UserGroup(); $usergroup = new UserGroup();
$usergroup->setUser($user); $usergroup->setUser($user);
$usergroup->setGroup($retgroup); $usergroup->setGroup($retgroup);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());

View File

@ -2,19 +2,19 @@
namespace App\Repository; namespace App\Repository;
use App\Entity\Niveau01;
use App\Service\LdapService;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
use App\Entity\Niveau01;
use App\Service\LdapService;
class Niveau01Repository extends ServiceEntityRepository class Niveau01Repository extends ServiceEntityRepository
{ {
private $ldapservice;
public function __construct(ManagerRegistry $registry, LdapService $ldapservice) public function __construct(ManagerRegistry $registry, LdapService $ldapservice)
{ {
parent::__construct($registry, Niveau01::class); parent::__construct($registry, Niveau01::class);
$this->ldapservice=$ldapservice; $this->ldapservice = $ldapservice;
} }
public function add(Niveau01 $entity, bool $flush = false): void public function add(Niveau01 $entity, bool $flush = false): void
@ -39,30 +39,31 @@ class Niveau01Repository extends ServiceEntityRepository
public function calculateSSONiveau01($attruser) public function calculateSSONiveau01($attruser)
{ {
$niveau01s = $this->_em->getRepository('App\Entity\Niveau01')->findAll(); $niveau01s = $this->_em->getRepository('App\Entity\Niveau01')->findAll();
foreach($niveau01s as $niveau01) { foreach ($niveau01s as $niveau01) {
if($niveau01->getAttributes()) { if ($niveau01->getAttributes()) {
$attniveau=json_decode($niveau01->getAttributes(),true); $attniveau = json_decode($niveau01->getAttributes(), true);
foreach($attniveau as $key => $value) { foreach ($attniveau as $key => $value) {
if(array_key_exists($key,$attruser)) { if (array_key_exists($key, $attruser)) {
if(is_array($attruser[$key])) { if (is_array($attruser[$key])) {
foreach($attruser[$key] as $val) { foreach ($attruser[$key] as $val) {
if($value=="*") if ('*' == $value) {
return $niveau01; return $niveau01;
elseif($val==$value) } elseif ($val == $value) {
return $niveau01; return $niveau01;
} }
} }
else { } else {
if($value=="*") if ('*' == $value) {
return $niveau01; return $niveau01;
elseif($value==$attruser[$key]) } elseif ($value == $attruser[$key]) {
return $niveau01; return $niveau01;
} }
} }
} }
} }
} }
}
return false; return false;
} }
@ -71,10 +72,12 @@ class Niveau01Repository extends ServiceEntityRepository
public function calculateLDAPNiveau01($username) public function calculateLDAPNiveau01($username)
{ {
$niveau01s = $this->_em->getRepository('App\Entity\Niveau01')->findAll(); $niveau01s = $this->_em->getRepository('App\Entity\Niveau01')->findAll();
foreach($niveau01s as $niveau01) { foreach ($niveau01s as $niveau01) {
if($niveau01->getLdapfilter()) { if ($niveau01->getLdapfilter()) {
$ismember=$this->ldapservice->findNiveau01ismember($niveau01->getLdapfilter(),$username); $ismember = $this->ldapservice->findNiveau01ismember($niveau01->getLdapfilter(), $username);
if($ismember) return $niveau01; if ($ismember) {
return $niveau01;
}
} }
} }

View File

@ -2,18 +2,18 @@
namespace App\Repository; namespace App\Repository;
use App\Entity\Statistic; use App\Entity\Niveau03;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
class StatisticRepository extends ServiceEntityRepository class Niveau03Repository extends ServiceEntityRepository
{ {
public function __construct(ManagerRegistry $registry) public function __construct(ManagerRegistry $registry)
{ {
parent::__construct($registry, Statistic::class); parent::__construct($registry, Niveau03::class);
} }
public function add(Statistic $entity, bool $flush = false): void public function add(Niveau03 $entity, bool $flush = false): void
{ {
$this->getEntityManager()->persist($entity); $this->getEntityManager()->persist($entity);
@ -22,7 +22,7 @@ class StatisticRepository extends ServiceEntityRepository
} }
} }
public function remove(Statistic $entity, bool $flush = false): void public function remove(Niveau03 $entity, bool $flush = false): void
{ {
$this->getEntityManager()->remove($entity); $this->getEntityManager()->remove($entity);

View File

@ -0,0 +1,33 @@
<?php
namespace App\Repository;
use App\Entity\Niveau04;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class Niveau04Repository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Niveau04::class);
}
public function add(Niveau04 $entity, bool $flush = false): void
{
$this->getEntityManager()->persist($entity);
if ($flush) {
$this->getEntityManager()->flush();
}
}
public function remove(Niveau04 $entity, bool $flush = false): void
{
$this->getEntityManager()->remove($entity);
if ($flush) {
$this->getEntityManager()->flush();
}
}
}

View File

@ -30,4 +30,17 @@ class UserRepository extends ServiceEntityRepository
$this->getEntityManager()->flush(); $this->getEntityManager()->flush();
} }
} }
public function getPreference(User $entity, $key, $default)
{
$preference = $entity->getPreference();
dump($preference);
if (is_array($preference)) {
if (array_key_exists($key, $preference)) {
return $preference[$key][0];
}
}
return $default;
}
} }

View File

@ -3,7 +3,6 @@
namespace App\Service; namespace App\Service;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class ApiService class ApiService
{ {
@ -14,33 +13,42 @@ class ApiService
$this->params = $params; $this->params = $params;
} }
public function setbody(Array $array) public function setbody(array $array)
{ {
return \Unirest\Request\Body::json($array); return \Unirest\Request\Body::json($array);
} }
public function run($method,$url,$query,$header=null,$content="json") { public function run($method, $url, $query, $header = null, $content = 'json')
{
// Entete // Entete
switch($content) { $headerini = null;
case "json": switch ($content) {
case 'json':
$headerini = [ $headerini = [
'Accept' => 'application/json', 'Accept' => 'application/json',
'Content-Type' => 'application/json', 'Content-Type' => 'application/json',
]; ];
if($query) $query = \Unirest\Request\Body::json($query); if ($query) {
$query = \Unirest\Request\Body::json($query);
}
break; break;
case "form": case 'form':
$headerini = [ $headerini = [
'Accept' => 'application/json', 'Accept' => 'application/json',
'Content-Type' => 'application/x-www-form-urlencoded', 'Content-Type' => 'application/x-www-form-urlencoded',
]; ];
if($query) $query = \Unirest\Request\Body::form($query); if ($query) {
$query = \Unirest\Request\Body::form($query);
}
break; break;
} }
if($header) $header=array_merge($headerini,$header); if ($header) {
else $header=$headerini; $header = array_merge($headerini, $header);
} else {
$header = $headerini;
}
// Paramétrage unirest // Paramétrage unirest
\Unirest\Request::verifyPeer(false); \Unirest\Request::verifyPeer(false);
@ -48,60 +56,56 @@ class ApiService
\Unirest\Request::timeout(5); \Unirest\Request::timeout(5);
// Déclaration du proxy // Déclaration du proxy
$proxyUse = $this->params->get("proxyUse"); $proxyUse = $this->params->get('proxyUse');
if($proxyUse) { if ($proxyUse) {
$proxyHost = $this->params->get("proxyHost"); $proxyHost = $this->params->get('proxyHost');
$proxyPort = $this->params->get("proxyPort"); $proxyPort = $this->params->get('proxyPort');
\Unirest\Request::proxy($proxyHost, $proxyPort, CURLPROXY_HTTP, true); \Unirest\Request::proxy($proxyHost, $proxyPort, CURLPROXY_HTTP, true);
} }
$response = false; $response = false;
switch($method) { switch ($method) {
case "POST": case 'POST':
try{ try {
$response = \Unirest\Request::post($url,$header,$query); $response = \Unirest\Request::post($url, $header, $query);
} } catch (\Exception $e) {
catch (\Exception $e) {
return false; return false;
} }
break; break;
case "GET": case 'GET':
try{ try {
$response = @\Unirest\Request::get($url,$header,$query); $response = @\Unirest\Request::get($url, $header, $query);
} } catch (\Exception $e) {
catch (\Exception $e) {
return false; return false;
} }
break; break;
case "PUT": case 'PUT':
try{ try {
$response = \Unirest\Request::put($url,$header,$query); $response = \Unirest\Request::put($url, $header, $query);
} } catch (\Exception $e) {
catch (\Exception $e) {
return false; return false;
} }
break; break;
case "DELETE": case 'DELETE':
try{ try {
$response = \Unirest\Request::delete($url,$header,$query); $response = \Unirest\Request::delete($url, $header, $query);
} } catch (\Exception $e) {
catch (\Exception $e) {
return false; return false;
} }
break; break;
case "PATCH": case 'PATCH':
try{ try {
$response = \Unirest\Request::patch($url,$header,$query); $response = \Unirest\Request::patch($url, $header, $query);
} } catch (\Exception $e) {
catch (\Exception $e) {
return false; return false;
} }
break; break;
} }
return $response; return $response;
} }
} }

View File

@ -1,14 +1,15 @@
<?php <?php
namespace App\Service;
use Symfony\Component\DependencyInjection\ContainerInterface; namespace App\Service;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class AppSession { class AppSession
{
private $container; private $container;
protected $em; protected $em;
protected $requeststack; protected $requeststack;
@ -22,103 +23,108 @@
$this->token = $token; $this->token = $token;
} }
public function onDomainParse(RequestEvent $event) { public function onDomainParse(RequestEvent $event)
{
$session = $this->requeststack->getSession(); $session = $this->requeststack->getSession();
$configs = $this->em->getRepository("App\Entity\Config")->findAll(); $configs = $this->em->getRepository("App\Entity\Config")->findAll();
foreach($configs as $config) { foreach ($configs as $config) {
$session->set($config->getId(), strval($config->getValue())); $session->set($config->getId(), strval($config->getValue()));
} }
$session->set("headerimage","header/".$session->get("headerimage")); $session->set('headerimage', 'header/'.$session->get('headerimage'));
// Calcul couleur // Calcul couleur
$session->set("colorbgbodylight-darker", $this->adjustBrightness($session->get("colorbgbodylight"),-10)); $session->set('colorbgbodylight-darker', $this->adjustBrightness($session->get('colorbgbodylight'), -10));
$session->set("colorfttitlelight-darker", $this->adjustBrightness($session->get("colorfttitlelight"),-50)); $session->set('colorfttitlelight-darker', $this->adjustBrightness($session->get('colorfttitlelight'), -50));
$session->set("colorbgbodydark-darker", $this->adjustBrightness($session->get("colorbgbodydark"),-50)); $session->set('colorbgbodydark-darker', $this->adjustBrightness($session->get('colorbgbodydark'), -50));
$session->set("colorbgbodydark-lighter", $this->adjustBrightness($session->get("colorbgbodydark"),+50)); $session->set('colorbgbodydark-lighter', $this->adjustBrightness($session->get('colorbgbodydark'), +50));
$session->set("colorbgbodydark-rgb", $this->hexToRgb($session->get("colorbgbodydark"))); $session->set('colorbgbodydark-rgb', $this->hexToRgb($session->get('colorbgbodydark')));
$session->set("colorbgbodydark-darkrgb", $this->hexToRgb($session->get("colorbgbodydark-darker"))); $session->set('colorbgbodydark-darkrgb', $this->hexToRgb($session->get('colorbgbodydark-darker')));
$session->set("colorbgbodydark-lightrgb", $this->hexToRgb($session->get("colorbgbodydark-lighter"))); $session->set('colorbgbodydark-lightrgb', $this->hexToRgb($session->get('colorbgbodydark-lighter')));
// Current user // Current user
$token = $this->token->getToken(); $token = $this->token->getToken();
if(!$token) return; if (!$token) {
$curentuser=$token->getUser(); return;
}
$curentuser = $token->getUser();
// Préférence par défaut // Préférence par défaut
$session->set("fgheader", true); $session->set('fgheader', true);
$session->set("fgaudit", false); $session->set('fgaudit', false);
// Préférence // Préférence
if($curentuser!="anon.") { if ('anon.' != $curentuser) {
$preference=$curentuser->getPreference(); $preference = $curentuser->getPreference();
if(is_array($preference)) { if (is_array($preference)) {
// Préférence header // Préférence header
if(array_key_exists("fgheader",$preference)) { if (array_key_exists('fgheader', $preference)) {
$fgheader=($preference["fgheader"][0]=="true"); $fgheader = ('true' == $preference['fgheader'][0]);
$session->set("fgheader", $fgheader); $session->set('fgheader', $fgheader);
} }
// Préférence audit // Préférence audit
if(array_key_exists("fgaudit",$preference)) { if (array_key_exists('fgaudit', $preference)) {
$fgaudit=($preference["fgaudit"][0]=="true"); $fgaudit = ('true' == $preference['fgaudit'][0]);
$session->set("fgaudit", $fgaudit); $session->set('fgaudit', $fgaudit);
} }
} }
} }
// Permissions // Permissions
$showannuaire=false; $showannuaire = false;
$submitgroup=false; $submitgroup = false;
if($curentuser!="anon.") { if ('anon.' != $curentuser) {
switch($session->get("permannu")) { if ($curentuser->hasRole('ROLE_ADMIN') && null != $this->container->getParameter('appAnnuscopeadmin')) {
case "ROLE_USER" : $showannuaire = true;
$showannuaire=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")||$curentuser->hasRole("ROLE_MASTER")||$curentuser->hasRole("ROLE_USER")); $session->set('scopeannu', $this->container->getParameter('appAnnuscopeadmin'));
break; } elseif ($curentuser->hasRole('ROLE_MODO') && null != $this->container->getParameter('appAnnuscopemodo')) {
$showannuaire = true;
case "ROLE_MASTER" : $session->set('scopeannu', $this->container->getParameter('appAnnuscopemodo'));
$showannuaire=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")||$curentuser->hasRole("ROLE_MASTER")); } elseif ($curentuser->hasRole('ROLE_MASTER') && null != $this->container->getParameter('appAnnuscopemaster')) {
break; $showannuaire = true;
$session->set('scopeannu', $this->container->getParameter('appAnnuscopemaster'));
case "ROLE_MODO" : } elseif ($curentuser->hasRole('ROLE_MANAGER') && null != $this->container->getParameter('appAnnuscopemanager')) {
$showannuaire=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")); $showannuaire = true;
break; $session->set('scopeannu', $this->container->getParameter('appAnnuscopemanager'));
} elseif ($curentuser->hasRole('ROLE_USER') && null != $this->container->getParameter('appAnnuscopeuser')) {
$showannuaire = true;
$session->set('scopeannu', $this->container->getParameter('appAnnuscopeuser'));
} }
switch($session->get("permgroup")) { if (in_array('ALL', $this->container->getParameter('appGroupsubmiter'))) {
case "ROLE_USER" : $submitgroup = true;
$submitgroup=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")||$curentuser->hasRole("ROLE_MASTER")||$curentuser->hasRole("ROLE_USER")); } elseif ($curentuser->hasRole('ROLE_ADMIN') && in_array('ROLE_ADMIN', $this->container->getParameter('appGroupsubmiter'))) {
break; $submitgroup = true;
} elseif ($curentuser->hasRole('ROLE_MODO') && in_array('ROLE_MODO', $this->container->getParameter('appGroupsubmiter'))) {
case "ROLE_MASTER" : $submitgroup = true;
$submitgroup=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")||$curentuser->hasRole("ROLE_MASTER")); } elseif ($curentuser->hasRole('ROLE_MASTER') && in_array('ROLE_MASTER', $this->container->getParameter('appGroupsubmiter'))) {
break; $submitgroup = true;
} elseif ($curentuser->hasRole('ROLE_MANAGER') && in_array('ROLE_MANAGER', $this->container->getParameter('appGroupsubmiter'))) {
case "ROLE_MODO" : $submitgroup = true;
$submitgroup=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")); } elseif ($curentuser->hasRole('ROLE_USER') && in_array('ROLE_USER', $this->container->getParameter('appGroupsubmiter'))) {
break; $submitgroup = true;
} }
} }
$session->set("showannuaire", $showannuaire); $session->set('showannuaire', $showannuaire);
$session->set("submitgroup", $submitgroup); $session->set('submitgroup', $submitgroup);
// Visite // Visite
if($curentuser!="anon.") { if ('anon.' != $curentuser) {
$now=new \DateTime(); $now = new \DateTime();
if(!$curentuser->getVisitedate()) { if (!$curentuser->getVisitedate()) {
$curentuser->setVisitedate($now); $curentuser->setVisitedate($now);
$curentuser->setVisitecpt($curentuser->getVisitecpt()+1); $curentuser->setVisitecpt($curentuser->getVisitecpt() + 1);
$this->em->persist($curentuser); $this->em->persist($curentuser);
$this->em->flush(); $this->em->flush();
} } else {
else { $visitedate = clone $curentuser->getVisitedate();
$visitedate=clone $curentuser->getVisitedate(); $visitedate->add(new \DateInterval('PT1H'));
$visitedate->add(new \DateInterval("PT1H")); if ($visitedate < $now) {
if($visitedate<$now) {
$curentuser->setVisitedate($now); $curentuser->setVisitedate($now);
$curentuser->setVisitecpt($curentuser->getVisitecpt()+1); $curentuser->setVisitecpt($curentuser->getVisitecpt() + 1);
$this->em->persist($curentuser); $this->em->persist($curentuser);
$this->em->flush(); $this->em->flush();
} }
@ -126,15 +132,15 @@
} }
} }
private function adjustBrightness($hex, $steps)
private function adjustBrightness($hex, $steps) { {
// Steps should be between -255 and 255. Negative = darker, positive = lighter // Steps should be between -255 and 255. Negative = darker, positive = lighter
$steps = max(-255, min(255, $steps)); $steps = max(-255, min(255, $steps));
// Normalize into a six character long hex string // Normalize into a six character long hex string
$hex = str_replace('#', '', $hex); $hex = str_replace('#', '', $hex);
if (strlen($hex) == 3) { if (3 == strlen($hex)) {
$hex = str_repeat(substr($hex,0,1), 2).str_repeat(substr($hex,1,1), 2).str_repeat(substr($hex,2,1), 2); $hex = str_repeat(substr($hex, 0, 1), 2).str_repeat(substr($hex, 1, 1), 2).str_repeat(substr($hex, 2, 1), 2);
} }
// Split into three parts: R, G and B // Split into three parts: R, G and B
@ -143,20 +149,21 @@
foreach ($color_parts as $color) { foreach ($color_parts as $color) {
$color = hexdec($color); // Convert to decimal $color = hexdec($color); // Convert to decimal
$color = max(0,min(255,$color + $steps)); // Adjust color $color = max(0, min(255, $color + $steps)); // Adjust color
$return .= str_pad(dechex($color), 2, '0', STR_PAD_LEFT); // Make two char hex code $return .= str_pad(dechex($color), 2, '0', STR_PAD_LEFT); // Make two char hex code
} }
return '#'.$return; return '#'.$return;
} }
public function hexToRgb($hex) { public function hexToRgb($hex)
{
$hex = str_replace('#', '', $hex); $hex = str_replace('#', '', $hex);
$length = strlen($hex); $length = strlen($hex);
$rgb['r'] = hexdec($length == 6 ? substr($hex, 0, 2) : ($length == 3 ? str_repeat(substr($hex, 0, 1), 2) : 0)); $rgb['r'] = hexdec(6 == $length ? substr($hex, 0, 2) : (3 == $length ? str_repeat(substr($hex, 0, 1), 2) : 0));
$rgb['g'] = hexdec($length == 6 ? substr($hex, 2, 2) : ($length == 3 ? str_repeat(substr($hex, 1, 1), 2) : 0)); $rgb['g'] = hexdec(6 == $length ? substr($hex, 2, 2) : (3 == $length ? str_repeat(substr($hex, 1, 1), 2) : 0));
$rgb['b'] = hexdec($length == 6 ? substr($hex, 4, 2) : ($length == 3 ? str_repeat(substr($hex, 2, 1), 2) : 0)); $rgb['b'] = hexdec(6 == $length ? substr($hex, 4, 2) : (3 == $length ? str_repeat(substr($hex, 2, 1), 2) : 0));
return $rgb['r'].",".$rgb['g'].",".$rgb['b']; return $rgb['r'].','.$rgb['g'].','.$rgb['b'];
}
} }
}

View File

@ -2,171 +2,231 @@
namespace App\Service; namespace App\Service;
use Symfony\Component\DependencyInjection\ContainerInterface; use App\Entity\Group;
use App\Entity\User;
use App\Entity\Niveau01; use App\Entity\Niveau01;
use App\Entity\Niveau02; use App\Entity\Niveau02;
use App\Entity\Group; use App\Entity\Niveau03;
use App\Entity\Niveau04;
use App\Entity\User;
use App\Entity\UserGroup; use App\Entity\UserGroup;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LdapService class LdapService
{ {
private $appMasteridentity;
private $synchro;
private $host;
private $port;
private $usetls;
private $userwriter;
private $user;
private $password;
private $basedn;
private $baseorganisation;
private $baseniveau01;
private $baseniveau02;
private $baseniveau03;
private $baseniveau04;
private $basegroup;
private $baseuser;
private $username;
private $firstname;
private $lastname;
private $email;
private $avatar;
private $memberof;
private $groupgid;
private $groupname;
private $groupmember;
private $groupmemberisdn;
private $filtergroup;
private $filteruser;
private $userattributes;
private $connection; private $connection;
public function __construct(ContainerInterface $container) public function __construct(ContainerInterface $container)
{ {
$this->appMasteridentity = $container->getParameter('appMasteridentity');
$this->synchro = $container->getParameter('appSynchro');
$this->host = $container->getParameter('ldapHost');
$this->port = $container->getParameter('ldapPort');
$this->usetls = $container->getParameter('ldapUsetls');
$this->userwriter = $container->getParameter('ldapUserwriter');
$this->user = $container->getParameter('ldapUser');
$this->password = $container->getParameter('ldapPassword');
$this->basedn = $container->getParameter('ldapBasedn');
$this->baseorganisation = $container->getParameter('ldapBaseorganisation');
$this->baseniveau01 = $container->getParameter('ldapBaseniveau01');
$this->baseniveau02 = $container->getParameter('ldapBaseniveau02');
$this->baseniveau03 = $container->getParameter('ldapBaseniveau03');
$this->baseniveau04 = $container->getParameter('ldapBaseniveau04');
$this->basegroup = $container->getParameter('ldapBasegroup');
$this->baseuser = $container->getParameter('ldapBaseuser');
$this->username = $container->getParameter('ldapUsername');
$this->firstname = $container->getParameter('ldapFirstname');
$this->lastname = $container->getParameter('ldapLastname');
$this->email = $container->getParameter('ldapEmail');
$this->avatar = $container->getParameter('ldapAvatar');
$this->memberof = $container->getParameter('ldapMemberof');
$this->groupgid = $container->getParameter('ldapGroupgid');
$this->groupname = $container->getParameter('ldapGroupname');
$this->groupmember = $container->getParameter('ldapGroupmember');
$this->groupmemberisdn = $container->getParameter('ldapGroupmemberisdn');
$this->filtergroup = $container->getParameter('ldapFiltergroup');
$this->filteruser = $container->getParameter('ldapFilteruser');
$this->appMasteridentity = $container->getParameter("appMasteridentity"); $this->userattributes = [$this->username, $this->firstname, $this->lastname, $this->email, $this->avatar, $this->memberof];
$this->synchro = $container->getParameter("appSynchro");
$this->host = $container->getParameter("ldapHost");
$this->port = $container->getParameter("ldapPort");
$this->usetls = $container->getParameter("ldapUsetls");
$this->userwriter = $container->getParameter("ldapUserwriter");
$this->user = $container->getParameter("ldapUser");
$this->password = $container->getParameter("ldapPassword");
$this->basedn = $container->getParameter("ldapBasedn");
$this->baseorganisation = $container->getParameter("ldapBaseorganisation");
$this->baseniveau01 = $container->getParameter("ldapBaseniveau01");
$this->baseniveau02 = $container->getParameter("ldapBaseniveau02");
$this->basegroup = $container->getParameter("ldapBasegroup");
$this->baseuser = $container->getParameter("ldapBaseuser");
$this->username = $container->getParameter("ldapUsername");
$this->firstname = $container->getParameter("ldapFirstname");
$this->lastname = $container->getParameter("ldapLastname");
$this->email = $container->getParameter("ldapEmail");
$this->avatar = $container->getParameter("ldapAvatar");
$this->memberof = $container->getParameter("ldapMemberof");
$this->groupgid = $container->getParameter("ldapGroupgid");
$this->groupname = $container->getParameter("ldapGroupname");
$this->groupmember = $container->getParameter("ldapGroupmember");
$this->groupmemberisdn = $container->getParameter("ldapGroupmemberisdn");
$this->filtergroup = $container->getParameter("ldapFiltergroup");
$this->filteruser = $container->getParameter("ldapFilteruser");
$this->userattributes = [$this->username,$this->firstname,$this->lastname,$this->email,$this->avatar,$this->memberof];
} }
public function isNine2Ldap() { public function isNine2Ldap()
return ($this->appMasteridentity=="SQL"&&$this->synchro=="NINE2LDAP"&&$this->userwriter&&$this->baseorganisation&&$this->baseniveau01&&$this->baseniveau02&&$this->basegroup&&$this->baseuser&&$this->connect()); {
return ('SQL' == $this->appMasteridentity) && 'NINE2LDAP' == $this->synchro && $this->userwriter && $this->baseorganisation && $this->baseniveau01 && $this->baseniveau02 && $this->baseniveau03 && $this->baseniveau04 && $this->basegroup && $this->baseuser && $this->connect();
} }
public function connect() { public function connect()
{
// Si on est déjà co = on rebind pour gérer le cas d'un timeout de connection // Si on est déjà co = on rebind pour gérer le cas d'un timeout de connection
if($this->connection){ if ($this->connection) {
if(!@ldap_bind($this->connection, $this->user, $this->password)){ if (!@ldap_bind($this->connection, $this->user, $this->password)) {
$this->disconnect(); $this->disconnect();
} }
} }
if($this->connection){ if ($this->connection) {
return $this->connection; return $this->connection;
} else { } else {
$ldapConn = ldap_connect($this->host, $this->port); $ldapConn = ldap_connect($this->host, $this->port);
if ($ldapConn) {
if($ldapConn){
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0); ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
if($this->usetls) ldap_start_tls($ldapConn); if ($this->usetls) {
ldap_start_tls($ldapConn);
}
if(@ldap_bind( $ldapConn, $this->user, $this->password)){ if (@ldap_bind($ldapConn, $this->user, $this->password)) {
$this->connection = $ldapConn; $this->connection = $ldapConn;
return $this->connection; return $this->connection;
} }
} }
} }
return false; return false;
} }
public function userconnect($username,$userpassword) { public function userconnect($username, $userpassword)
{
$ldapConn = ldap_connect($this->host, $this->port); $ldapConn = ldap_connect($this->host, $this->port);
$this->connection = $ldapConn; $this->connection = $ldapConn;
if($this->connection){ if ($this->connection) {
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0); ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
if($this->usetls) ldap_start_tls($ldapConn); if ($this->usetls) {
ldap_start_tls($ldapConn);
}
$dn = $this->getUserDN($username); $dn = $this->getUserDN($username);
if(@ldap_bind( $ldapConn, $dn, $userpassword)){ if (@ldap_bind($ldapConn, $dn, $userpassword)) {
$res = $this->search(str_replace("*",$username,$this->filteruser),$this->userattributes, $this->baseuser); $res = $this->search(str_replace('*', $username, $this->filteruser), $this->userattributes, $this->baseuser);
$this->disconnect(); $this->disconnect();
return $res; return $res;
} }
} }
$this->disconnect(); $this->disconnect();
return false; return false;
} }
public function getParameter($key) { public function getParameter($key)
switch($key) { {
case "baseuser" : return $this->baseuser; break; switch ($key) {
case "basegroup" : return $this->basegroup; break; case 'baseuser': return $this->baseuser;
case "baseniveau01" : return $this->baseniveau01; break; break;
case "baseniveau02" : return $this->baseniveau02; break; case 'basegroup': return $this->basegroup;
case "basedn" : return $this->basedn; break; break;
case "filteruser" : return $this->filteruser; break; case 'baseniveau01': return $this->baseniveau01;
break;
case 'baseniveau02': return $this->baseniveau02;
break;
case 'baseniveau03': return $this->baseniveau03;
break;
case 'baseniveau04': return $this->baseniveau04;
break;
case 'basedn': return $this->basedn;
break;
case 'filteruser': return $this->filteruser;
break;
} }
} }
public function search($filter, $attributes = array(), $subBranch = '') { public function search($filter, $attributes = [], $subBranch = '')
{
$connection = $this->connect(); $connection = $this->connect();
$branch = ($subBranch ? $subBranch : $this->basedn); $branch = ($subBranch ? $subBranch : $this->basedn);
$result = ldap_search($connection, $branch, $filter, $attributes,0,0,0); $result = ldap_search($connection, $branch, $filter, $attributes, 0, 0, 0);
if(!$result) { if (!$result) {
$this->ldapError(); $this->ldapError();
} }
return $this->resultToArray($result); return $this->resultToArray($result);
} }
public function searchdn($dn, $subBranch = '') { public function searchdn($dn, $subBranch = '')
{
$connection = $this->connect(); $connection = $this->connect();
$tbdn=ldap_explode_dn($dn,0); $tbdn = ldap_explode_dn($dn, 0);
$branch = ($subBranch ? $subBranch : $this->basedn); $branch = ($subBranch ? $subBranch : $this->basedn);
$result = ldap_search($connection, $branch, "(".$tbdn[0].")", [],0,0,0); $result = ldap_search($connection, $branch, '('.$tbdn[0].')', [], 0, 0, 0);
if(!$result) { if (!$result) {
$this->ldapError(); $this->ldapError();
} }
return $this->resultToArray($result); return $this->resultToArray($result);
} }
public function deleteByDN($dn){ public function deleteByDN($dn)
{
$connection = $this->connect(); $connection = $this->connect();
$removed = ldap_delete($connection, $dn); $removed = ldap_delete($connection, $dn);
if(!$removed){ if (!$removed) {
$this->ldapError(); $this->ldapError();
} }
} }
public function rename($oldDN, $newDN, $parentDN = '', $deleteOldDN = true){ public function rename($oldDN, $newDN, $parentDN = '', $deleteOldDN = true)
{
$connection = $this->connect(); $connection = $this->connect();
$result = ldap_rename($connection, $oldDN, $newDN, $parentDN, $deleteOldDN); $result = ldap_rename($connection, $oldDN, $newDN, $parentDN, $deleteOldDN);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
return $result; return $result;
} }
private function resultToArray($result)
private function resultToArray($result){ {
$connection = $this->connect(); $connection = $this->connect();
$resultArray = array(); $resultArray = [];
if($result){ if ($result) {
$entry = ldap_first_entry($connection, $result); $entry = ldap_first_entry($connection, $result);
while ($entry){ while ($entry) {
$row = array(); $row = [];
$attr = ldap_first_attribute($connection, $entry); $attr = ldap_first_attribute($connection, $entry);
while ($attr){ while ($attr) {
$val = ldap_get_values_len($connection, $entry, $attr); $val = ldap_get_values_len($connection, $entry, $attr);
if(array_key_exists('count', $val) AND $val['count'] == 1){ if (array_key_exists('count', $val) and 1 == $val['count']) {
$row[strtolower($attr)] = $val[0]; $row[strtolower($attr)] = $val[0];
} else { } else {
$row[strtolower($attr)] = $val; $row[strtolower($attr)] = $val;
} }
if(is_array($row[strtolower($attr)])) { if (is_array($row[strtolower($attr)])) {
unset($row[strtolower($attr)]["count"]); unset($row[strtolower($attr)]['count']);
} }
$attr = ldap_next_attribute($connection, $entry); $attr = ldap_next_attribute($connection, $entry);
@ -179,227 +239,340 @@ class LdapService
return $resultArray; return $resultArray;
} }
public function in_array_r($item , $array){ public function in_array_r($item, $array)
return preg_match('/"'.$item.'"/i' , json_encode($array)); {
return preg_match('/"'.$item.'"/i', json_encode($array));
} }
public function disconnect(){ public function disconnect()
if($this->connection) { {
if ($this->connection) {
ldap_unbind($this->connection); ldap_unbind($this->connection);
$this->connection=null; $this->connection = null;
} }
} }
public function ldapError(){ public function ldapError()
{
$connection = $this->connect(); $connection = $this->connect();
throw new \Exception( throw new \Exception('Error: ('.ldap_errno($connection).') '.ldap_error($connection));
'Error: ('. ldap_errno($connection) .') '. ldap_error($connection)
);
} }
public function ldapModify($dn,$attrs) { public function ldapModify($dn, $attrs)
{
$connection = $this->connect(); $connection = $this->connect();
$result = ldap_modify($connection, $dn, $attrs); $result = ldap_modify($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
//================================================================================================================================================================== // ==================================================================================================================================================================
//== Function Organisation========================================================================================================================================== // == Function Organisation==========================================================================================================================================
//================================================================================================================================================================== // ==================================================================================================================================================================
public function addOrganisations() { public function addOrganisations()
$ldapentrys=$this->searchdn($this->baseorganisation); {
if(empty($ldapentrys)) { $ldapentrys = $this->searchdn($this->baseorganisation);
if (empty($ldapentrys)) {
$this->addOrganisation($this->baseorganisation); $this->addOrganisation($this->baseorganisation);
} }
$ldapentrys=$this->searchdn($this->baseniveau01,$this->baseorganisation); $ldapentrys = $this->searchdn($this->baseniveau01, $this->baseorganisation);
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->addOrganisation($this->baseniveau01); $this->addOrganisation($this->baseniveau01);
} }
$ldapentrys=$this->searchdn($this->baseniveau02,$this->baseorganisation); $ldapentrys = $this->searchdn($this->baseniveau02, $this->baseorganisation);
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->addOrganisation($this->baseniveau02); $this->addOrganisation($this->baseniveau02);
} }
$ldapentrys=$this->searchdn($this->basegroup,$this->baseorganisation); $ldapentrys = $this->searchdn($this->baseniveau03, $this->baseorganisation);
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->addOrganisation($this->baseniveau03);
}
$ldapentrys = $this->searchdn($this->baseniveau04, $this->baseorganisation);
if (empty($ldapentrys)) {
$this->addOrganisation($this->baseniveau04);
}
$ldapentrys = $this->searchdn($this->basegroup, $this->baseorganisation);
if (empty($ldapentrys)) {
$this->addOrganisation($this->basegroup); $this->addOrganisation($this->basegroup);
} }
$ldapentrys=$this->searchdn($this->baseuser,$this->baseorganisation); $ldapentrys = $this->searchdn($this->baseuser, $this->baseorganisation);
if(empty($ldapentrys)) { if (empty($ldapentrys)) {
$this->addOrganisation($this->baseuser); $this->addOrganisation($this->baseuser);
} }
} }
public function addOrganisation($dn) { public function addOrganisation($dn)
{
$connection = $this->connect(); $connection = $this->connect();
$attrs = array(); $attrs = [];
$attrs['objectclass'] = ["top","organizationalUnit"]; $attrs['objectclass'] = ['top', 'organizationalUnit'];
$result = ldap_add($connection, $dn, $attrs); $result = ldap_add($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
return $result; return $result;
} }
//================================================================================================================================================================== // ==================================================================================================================================================================
//== Function User================================================================================================================================================== // == Function User==================================================================================================================================================
//================================================================================================================================================================== // ==================================================================================================================================================================
public function addUser(User $user) {
public function addUser(User $user)
{
$connection = $this->connect(); $connection = $this->connect();
$dn = $this->getUserDN($user->getUsername()); $dn = $this->getUserDN($user->getUsername());
$attrs = array(); $attrs = [];
$attrs['objectclass'] = $this->getObjectClassesUser(); $attrs['objectclass'] = $this->getObjectClassesUser();
$this->fillAttributesUser($user, $attrs); $this->fillAttributesUser($user, $attrs);
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
$result = ldap_add($connection, $dn, $attrs); $result = ldap_add($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
return $result; return $result;
} }
public function ismodifyUser(User $user,$entry){ public function ismodifyUser(User $user, $entry)
{
$attrs = []; $attrs = [];
$this->fillAttributesUser($user, $attrs); $this->fillAttributesUser($user, $attrs);
foreach($attrs as $key => $value) { foreach ($attrs as $key => $value) {
if(!array_key_exists($key,$entry)&&!empty($value)) return true; if (!array_key_exists($key, $entry) && !empty($value)) {
elseif(array_key_exists($key,$entry)&&$value!=$entry[$key]) return true; return true;
} elseif (array_key_exists($key, $entry) && $value != $entry[$key]) {
return true;
}
} }
foreach($entry as $key => $value) { foreach ($entry as $key => $value) {
if(!array_key_exists($key,$attrs)&&!empty($value)) return true; if (!array_key_exists($key, $attrs) && !empty($value)) {
elseif(array_key_exists($key,$attrs)&&$value!=$attrs[$key]) return true; return true;
} elseif (array_key_exists($key, $attrs) && $value != $attrs[$key]) {
return true;
}
} }
return false; return false;
} }
public function modifyUser(User $user){ public function modifyUser(User $user)
{
$dn = $this->basedn; $dn = $this->basedn;
$connection = $this->connect(); $connection = $this->connect();
$attrs = array(); $attrs = [];
$this->fillAttributesUser($user, $attrs); $this->fillAttributesUser($user, $attrs);
// Rechercher le DN du user // Rechercher le DN du user
$dn = $this->getUserDN($user->getUsername()); $dn = $this->getUserDN($user->getUsername());
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
// Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus // Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus
@ldap_mod_del($connection, $dn, array($key => array())); @ldap_mod_del($connection, $dn, [$key => []]);
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
$result = ldap_modify($connection, $dn, $attrs); $result = ldap_modify($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
public function modifyUserpwd(User $user)
public function modifyUserpwd(User $user){ {
$dn = $this->basedn; $dn = $this->basedn;
$connection = $this->connect(); $connection = $this->connect();
$attrs = array(); $attrs = [];
// Attributs associés au password // Attributs associés au password
if($this->type=="AD")
$attrs["unicodepwd"] = $user->getPasswordad();
$attrs['userpassword'] = $user->getPassword(); $attrs['userpassword'] = $user->getPassword();
// Rechercher le DN du user // Rechercher le DN du user
$dn = $this->getUserDN($user->getUsername()); $dn = $this->getUserDN($user->getUsername());
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
// Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus // Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus
@ldap_mod_del($connection, $dn, array($key => array())); @ldap_mod_del($connection, $dn, [$key => []]);
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
$result = ldap_modify($connection, $dn, $attrs); $result = ldap_modify($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
public function updateNiveauUser(User $user,$todel=false) { public function updateNiveauUser(User $user, $todel = false)
{
$dn = $this->basedn; $dn = $this->basedn;
$connection = $this->connect(); $connection = $this->connect();
$result = null;
if (!$user->isIsactive()) {
$todel = true;
}
// NIVEAU01 // NIVEAU01
// On recherche le Niveau01 actuellement asscocié à l'utilisateur // On recherche le Niveau01 actuellement asscocié à l'utilisateur
$criteria = '(&(cn=*)(memberUid='.$user->getUsername().'))'; $criteria = '(&(cn=*)(memberUid='.$user->getUsername().'))';
$subbranch=$this->baseniveau01; $subbranch = $this->baseniveau01;
$results = $this->search($criteria, array('cn'), $subbranch); $results = $this->search($criteria, ['cn'], $subbranch);
foreach($results as $result) { foreach ($results as $result) {
// Si Niveau01 différent de celui en cours on le détache de ce Niveau01 // Si Niveau01 différent de celui en cours on le détache de ce Niveau01
if($result["cn"]!=$user->getNiveau01()->getLabel()||$todel) { if ($result['cn'] != $user->getNiveau01()->getLabel() || $todel) {
$dn = $this->getNiveau01DN($result["cn"]); $dn = $this->getNiveau01DN($result['cn']);
$entry['memberuid'] = $user->getUsername(); $entry['memberuid'] = $user->getUsername();
$result = ldap_mod_del($connection, $dn, $entry); $result = ldap_mod_del($connection, $dn, $entry);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
} }
// On recherche le Niveau01 en cours // On recherche le Niveau01 en cours
if(!$todel) { if (!$todel) {
$criteria = '(cn='.$user->getNiveau01()->getLabel().')'; $criteria = '(cn='.$user->getNiveau01()->getLabel().')';
$subbranch=$this->baseniveau01; $subbranch = $this->baseniveau01;
$result = $this->search($criteria, array('memberuid'), $subbranch); $result = $this->search($criteria, ['memberuid'], $subbranch);
// S'il n'est pas membre du Niveau01 on le rattache // S'il n'est pas membre du Niveau01 on le rattache
if(!$this->in_array_r($user->getUsername(),$result[0])) { if (!$this->in_array_r($user->getUsername(), $result[0])) {
$dn = $this->getNiveau01DN($user->getNiveau01()->getLabel()); $dn = $this->getNiveau01DN($user->getNiveau01()->getLabel());
$entry['memberuid'] = $user->getUsername(); $entry['memberuid'] = $user->getUsername();
$result = ldap_mod_add($connection, $dn, $entry); $result = ldap_mod_add($connection, $dn, $entry);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
} }
// NIVEAU02 // NIVEAU02
// On recherche le Niveau02 actuellement asscocié à l'utilisateur // On recherche le Niveau02 actuellement asscocié à l'utilisateur
$criteria = '(&(cn=*)(memberUid='.$user->getUsername().'))'; $criteria = '(&(cn=*)(memberUid='.$user->getUsername().'))';
$subbranch=$this->baseniveau02; $subbranch = $this->baseniveau02;
$results = $this->search($criteria, array('cn'), $subbranch); $results = $this->search($criteria, ['cn'], $subbranch);
foreach($results as $result) { foreach ($results as $result) {
// Si Niveau02 différent de celui en cours on le détache de ce Niveau02 // Si Niveau02 différent de celui en cours on le détache de ce Niveau02
if($user->getNiveau02()===null||$result["cn"]!=$user->getNiveau02()->getLabel()||$todel) { if (null === $user->getNiveau02() || $result['cn'] != $user->getNiveau02()->getLabel() || $todel) {
$dn = $this->getNiveau02DN($result["cn"]); $dn = $this->getNiveau02DN($result['cn']);
$entry['memberuid'] = $user->getUsername(); $entry['memberuid'] = $user->getUsername();
$result = ldap_mod_del($connection, $dn, $entry); $result = ldap_mod_del($connection, $dn, $entry);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
} }
// On recherche le Niveau02 en cours // On recherche le Niveau02 en cours
if(!$todel) { if (!$todel) {
if($user->getNiveau02()!==null) { if (null !== $user->getNiveau02()) {
$criteria = '(cn='.$user->getNiveau02()->getLabel().')'; $criteria = '(cn='.$user->getNiveau02()->getLabel().')';
$subbranch=$this->baseniveau02; $subbranch = $this->baseniveau02;
$result = $this->search($criteria, array('memberuid'), $subbranch); $result = $this->search($criteria, ['memberuid'], $subbranch);
// S'il n'est pas membre du Niveau02 on le rattache // S'il n'est pas membre du Niveau02 on le rattache
if(empty($result)||!$this->in_array_r($user->getUsername(),$result[0])) { if (empty($result) || !$this->in_array_r($user->getUsername(), $result[0])) {
$dn = $this->getNiveau02DN($user->getNiveau02()->getLabel()); $dn = $this->getNiveau02DN($user->getNiveau02()->getLabel());
$entry['memberuid'] = $user->getUsername(); $entry['memberuid'] = $user->getUsername();
$result = ldap_mod_add($connection, $dn, $entry); $result = ldap_mod_add($connection, $dn, $entry);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
}
}
}
// NIVEAU03
// On recherche le Niveau03 actuellement asscocié à l'utilisateur
$criteria = '(&(cn=*)(memberUid='.$user->getUsername().'))';
$subbranch = $this->baseniveau03;
$results = $this->search($criteria, ['cn'], $subbranch);
foreach ($results as $result) {
// Si Niveau03 différent de celui en cours on le détache de ce Niveau03
if (null === $user->getNiveau03() || $result['cn'] != $user->getNiveau03()->getLabel() || $todel) {
$dn = $this->getNiveau03DN($result['cn']);
$entry['memberuid'] = $user->getUsername();
$result = ldap_mod_del($connection, $dn, $entry);
if (!$result) {
$this->ldapError();
}
}
}
// On recherche le Niveau03 en cours
if (!$todel) {
if (null !== $user->getNiveau03()) {
$criteria = '(cn='.$user->getNiveau03()->getLabel().')';
$subbranch = $this->baseniveau03;
$result = $this->search($criteria, ['memberuid'], $subbranch);
// S'il n'est pas membre du Niveau03 on le rattache
if (empty($result) || !$this->in_array_r($user->getUsername(), $result[0])) {
$dn = $this->getNiveau03DN($user->getNiveau03()->getLabel());
$entry['memberuid'] = $user->getUsername();
$result = ldap_mod_add($connection, $dn, $entry);
if (!$result) {
$this->ldapError();
}
}
}
}
// NIVEAU04
// On recherche le Niveau04 actuellement asscocié à l'utilisateur
$criteria = '(&(cn=*)(memberUid='.$user->getUsername().'))';
$subbranch = $this->baseniveau04;
$results = $this->search($criteria, ['cn'], $subbranch);
foreach ($results as $result) {
// Si Niveau04 différent de celui en cours on le détache de ce Niveau04
if (null === $user->getNiveau04() || $result['cn'] != $user->getNiveau04()->getLabel() || $todel) {
$dn = $this->getNiveau04DN($result['cn']);
$entry['memberuid'] = $user->getUsername();
$result = ldap_mod_del($connection, $dn, $entry);
if (!$result) {
$this->ldapError();
}
}
}
// On recherche le Niveau04 en cours
if (!$todel) {
if (null !== $user->getNiveau04()) {
$criteria = '(cn='.$user->getNiveau04()->getLabel().')';
$subbranch = $this->baseniveau04;
$result = $this->search($criteria, ['memberuid'], $subbranch);
// S'il n'est pas membre du Niveau04 on le rattache
if (empty($result) || !$this->in_array_r($user->getUsername(), $result[0])) {
$dn = $this->getNiveau04DN($user->getNiveau04()->getLabel());
$entry['memberuid'] = $user->getUsername();
$result = ldap_mod_add($connection, $dn, $entry);
if (!$result) {
$this->ldapError();
}
} }
} }
} }
@ -407,433 +580,776 @@ class LdapService
return $result; return $result;
} }
public function deleteUser(User $user){ public function deleteUser(User $user)
{
$dn = $this->getUserDN($user->getUsername()); $dn = $this->getUserDN($user->getUsername());
return $this->deleteByDN($dn); return $this->deleteByDN($dn);
} }
public function getObjectClassesUser() { public function getObjectClassesUser()
$oc = array( {
$oc = [
'top', 'top',
'person', 'person',
'organizationalPerson', 'organizationalPerson',
'inetOrgPerson', 'inetOrgPerson',
); ];
return $oc; return $oc;
} }
public function listAttributesUser() { public function listAttributesUser()
{
return [ return [
"uid", 'uid',
"cn", 'cn',
"givenname", 'givenname',
"sn", 'sn',
"mail", 'mail',
"displayname", 'displayname',
"telephonenumber", 'telephonenumber',
"postaladdress", 'postaladdress',
"userpassword", 'userpassword',
]; ];
} }
public function fillAttributesUser(User $user, array &$attrs) { public function fillAttributesUser(User $user, array &$attrs)
{
$attrs['uid'] = $user->getUsername(); $attrs['uid'] = $user->getUsername();
$attrs['cn'] = $user->getFirstname() . ' ' . $user->getLastname(); $attrs['cn'] = $user->getFirstname().' '.$user->getLastname();
$attrs['givenname'] = $user->getFirstname(); $attrs['givenname'] = $user->getFirstname();
$attrs['sn'] = $user->getLastname(); $attrs['sn'] = $user->getLastname();
$attrs['mail'] = $user->getEmail(); $attrs['mail'] = $user->getEmail();
$attrs['displayname'] = $user->getFirstname() . ' ' . $user->getLastname(); $attrs['displayname'] = $user->getFirstname().' '.$user->getLastname();
$attrs['telephonenumber'] = $user->getTelephonenumber(); $attrs['telephonenumber'] = $user->getTelephonenumber();
$attrs['postaladdress'] = $user->getPostaladress(); $attrs['postaladdress'] = $user->getPostaladress();
$attrs['userpassword'] = $user->getPassword(); $attrs['userpassword'] = $user->getPassword();
} }
public function getUserDN($username) { public function getUserDN($username)
{
return $this->username.'='.$username.','.$this->baseuser; return $this->username.'='.$username.','.$this->baseuser;
} }
//================================================================================================================================================================== // ==================================================================================================================================================================
//== Function Niveau01============================================================================================================================================== // == Function Niveau01==============================================================================================================================================
//================================================================================================================================================================== // ==================================================================================================================================================================
public function findNiveau01($ldapfilter)
{
$ldapentrys = $this->search($ldapfilter, [$this->groupgid, $this->groupname, $this->groupmember], $this->baseniveau01);
public function findNiveau01($ldapfilter) {
$ldapentrys=$this->search($ldapfilter,[$this->groupgid,$this->groupname,$this->groupmember],$this->baseniveau01);
return $ldapentrys; return $ldapentrys;
} }
public function findNiveau01ismember($ldapfilter,$username) { public function findNiveau01ismember($ldapfilter, $username)
$ldapentrys=$this->findNiveau01($ldapfilter); {
foreach($ldapentrys as $ldapentry) { $ldapentrys = $this->findNiveau01($ldapfilter);
if(is_array($ldapentry[$this->groupmember])) { foreach ($ldapentrys as $ldapentry) {
if(in_array($username,$ldapentry[$this->groupmember])) return true; if (is_array($ldapentry[$this->groupmember])) {
if (in_array($username, $ldapentry[$this->groupmember])) {
return true;
} }
elseif($username==$ldapentry[$this->groupmember]) return true; } elseif ($username == $ldapentry[$this->groupmember]) {
return true;
} }
}
return false; return false;
} }
public function addNiveau01(Niveau01 $niveau01) { public function addNiveau01(Niveau01 $niveau01)
{
$connection = $this->connect(); $connection = $this->connect();
$dn = $this->getNiveau01DN($niveau01->getLabel()); $dn = $this->getNiveau01DN($niveau01->getLabel());
$attrs = array(); $attrs = [];
$attrs['objectclass'] = $this->getObjectClassesNiveau01(); $attrs['objectclass'] = $this->getObjectClassesNiveau01();
$this->fillAttributesNiveau01($niveau01, $attrs); $this->fillAttributesNiveau01($niveau01, $attrs);
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
$result = ldap_add($connection, $dn, $attrs); $result = ldap_add($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
return $result; return $result;
} }
public function ismodifyNiveau01(Niveau01 $niveau01, $entry)
public function ismodifyNiveau01(Niveau01 $niveau01,$entry){ {
$attrs = []; $attrs = [];
$this->fillAttributesNiveau01($niveau01, $attrs); $this->fillAttributesNiveau01($niveau01, $attrs);
foreach($attrs as $key => $value) { foreach ($attrs as $key => $value) {
if(!array_key_exists($key,$entry)&&!empty($value)) return true; if (!array_key_exists($key, $entry) && !empty($value)) {
elseif(array_key_exists($key,$entry)&&$value!=$entry[$key]) return true; return true;
} elseif (array_key_exists($key, $entry) && $value != $entry[$key]) {
return true;
}
} }
foreach($entry as $key => $value) { foreach ($entry as $key => $value) {
if(!array_key_exists($key,$attrs)&&!empty($value)) return true; if (!array_key_exists($key, $attrs) && !empty($value)) {
elseif(array_key_exists($key,$attrs)&&$value!=$attrs[$key]) return true; return true;
} elseif (array_key_exists($key, $attrs) && $value != $attrs[$key]) {
return true;
}
} }
return false; return false;
} }
public function modifyNiveau01(Niveau01 $niveau01,$oldid){ public function modifyNiveau01(Niveau01 $niveau01, $oldid)
{
$dn = $this->basedn; $dn = $this->basedn;
$connection = $this->connect(); $connection = $this->connect();
$attrs = array(); $attrs = [];
$this->fillAttributesNiveau01($niveau01, $attrs); $this->fillAttributesNiveau01($niveau01, $attrs);
unset($attrs["cn"]); unset($attrs['cn']);
$dn = $this->getNiveau01DN($niveau01->getLabel()); $dn = $this->getNiveau01DN($niveau01->getLabel());
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
// Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus // Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus
@ldap_mod_del($connection, $dn, array($key => array())); @ldap_mod_del($connection, $dn, [$key => []]);
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
if(isset($oldid)&&$oldid!=$niveau01->getLabel()) { if (isset($oldid) && $oldid != $niveau01->getLabel()) {
$olddn = $this->getNiveau01DN($oldid); $olddn = $this->getNiveau01DN($oldid);
$this->rename($olddn,"cn=".$niveau01->getLabel(),$this->baseniveau01); $this->rename($olddn, 'cn='.$niveau01->getLabel(), $this->baseniveau01);
} }
$result = ldap_modify($connection, $dn, $attrs); $result = ldap_modify($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
public function deleteNiveau01(Niveau01 $niveau01){ public function deleteNiveau01(Niveau01 $niveau01)
{
$dn = $this->getNiveau01DN($niveau01->getLabel()); $dn = $this->getNiveau01DN($niveau01->getLabel());
return $this->deleteByDN($dn); return $this->deleteByDN($dn);
} }
private function getObjectClassesNiveau01() { private function getObjectClassesNiveau01()
$oc = array( {
$oc = [
'top', 'top',
'posixGroup', 'posixGroup',
); ];
return $oc; return $oc;
} }
public function listAttributesNiveau01() { public function listAttributesNiveau01()
{
return [ return [
"cn", 'cn',
"gidnumber", 'gidnumber',
"memberuid", 'memberuid',
]; ];
} }
public function fillAttributesNiveau01(Niveau01 $niveau01, array &$attrs) { public function fillAttributesNiveau01(Niveau01 $niveau01, array &$attrs)
{
$attrs['cn'] = $niveau01->getLabel(); $attrs['cn'] = $niveau01->getLabel();
$attrs['gidnumber'] = $niveau01->getId(); $attrs['gidnumber'] = $niveau01->getId();
$attrs['memberuid'] = []; $attrs['memberuid'] = [];
foreach($niveau01->getUsers() as $user) { foreach ($niveau01->getUsers() as $user) {
array_push($attrs['memberuid'],$user->getUsername()); if ($user->isIsactive()) {
array_push($attrs['memberuid'], $user->getUsername());
}
} }
sort($attrs['memberuid']); sort($attrs['memberuid']);
if(count($attrs['memberuid'])==1) $attrs['memberuid'] = $attrs['memberuid'][0]; if (1 == count($attrs['memberuid'])) {
$attrs['memberuid'] = $attrs['memberuid'][0];
}
} }
public function getNiveau01DN($id) { public function getNiveau01DN($id)
{
return 'cn='.$id.','.$this->baseniveau01; return 'cn='.$id.','.$this->baseniveau01;
} }
//================================================================================================================================================================== // ==================================================================================================================================================================
//== Function Niveau02============================================================================================================================================== // == Function Niveau02==============================================================================================================================================
//================================================================================================================================================================== // ==================================================================================================================================================================
public function addNiveau02(Niveau02 $niveau02) {
public function addNiveau02(Niveau02 $niveau02)
{
$connection = $this->connect(); $connection = $this->connect();
$dn = $this->getNiveau02DN($niveau02->getLabel()); $dn = $this->getNiveau02DN($niveau02->getLabel());
$attrs = array(); $attrs = [];
$attrs['objectclass'] = $this->getObjectClassesNiveau02(); $attrs['objectclass'] = $this->getObjectClassesNiveau02();
$this->fillAttributesNiveau02($niveau02, $attrs); $this->fillAttributesNiveau02($niveau02, $attrs);
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
$result = ldap_add($connection, $dn, $attrs); $result = ldap_add($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
return $result; return $result;
} }
public function ismodifyNiveau02(Niveau02 $niveau02,$entry){ public function ismodifyNiveau02(Niveau02 $niveau02, $entry)
{
$attrs = []; $attrs = [];
$this->fillAttributesNiveau02($niveau02, $attrs); $this->fillAttributesNiveau02($niveau02, $attrs);
foreach($attrs as $key => $value) { foreach ($attrs as $key => $value) {
if(!array_key_exists($key,$entry)&&!empty($value)) return true; if (!array_key_exists($key, $entry) && !empty($value)) {
elseif(array_key_exists($key,$entry)&&$value!=$entry[$key]) return true; return true;
} elseif (array_key_exists($key, $entry) && $value != $entry[$key]) {
return true;
}
} }
foreach($entry as $key => $value) { foreach ($entry as $key => $value) {
if(!array_key_exists($key,$attrs)&&!empty($value)) return true; if (!array_key_exists($key, $attrs) && !empty($value)) {
elseif(array_key_exists($key,$attrs)&&$value!=$attrs[$key]) return true; return true;
} elseif (array_key_exists($key, $attrs) && $value != $attrs[$key]) {
return true;
}
} }
return false; return false;
} }
public function modifyNiveau02(Niveau02 $niveau02,$oldid){ public function modifyNiveau02(Niveau02 $niveau02, $oldid)
{
$dn = $this->basedn; $dn = $this->basedn;
$connection = $this->connect(); $connection = $this->connect();
$attrs = array(); $attrs = [];
$this->fillAttributesNiveau02($niveau02, $attrs); $this->fillAttributesNiveau02($niveau02, $attrs);
unset($attrs["cn"]); unset($attrs['cn']);
$dn = $this->getNiveau02DN($niveau02->getLabel()); $dn = $this->getNiveau02DN($niveau02->getLabel());
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
// Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus // Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus
@ldap_mod_del($connection, $dn, array($key => array())); @ldap_mod_del($connection, $dn, [$key => []]);
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
if(isset($oldid)&&$oldid!=$niveau02->getLabel()) { if (isset($oldid) && $oldid != $niveau02->getLabel()) {
$olddn = $this->getNiveau02DN($oldid); $olddn = $this->getNiveau02DN($oldid);
$this->rename($olddn,"cn=".$niveau02->getLabel(),$this->baseniveau02); $this->rename($olddn, 'cn='.$niveau02->getLabel(), $this->baseniveau02);
} }
$result = ldap_modify($connection, $dn, $attrs); $result = ldap_modify($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
public function deleteNiveau02(Niveau02 $niveau02)
{
public function deleteNiveau02(Niveau02 $niveau02){
$dn = $this->getNiveau02DN($niveau02->getLabel()); $dn = $this->getNiveau02DN($niveau02->getLabel());
return $this->deleteByDN($dn); return $this->deleteByDN($dn);
} }
private function getObjectClassesNiveau02() { private function getObjectClassesNiveau02()
$oc = array( {
$oc = [
'top', 'top',
'posixGroup', 'posixGroup',
); ];
return $oc; return $oc;
} }
public function listAttributesNiveau02() { public function listAttributesNiveau02()
{
return [ return [
"cn", 'cn',
"gidnumber", 'gidnumber',
"memberuid" 'memberuid',
]; ];
} }
public function fillAttributesNiveau02(Niveau02 $niveau02, array &$attrs) { public function fillAttributesNiveau02(Niveau02 $niveau02, array &$attrs)
{
$attrs['cn'] = $niveau02->getLabel(); $attrs['cn'] = $niveau02->getLabel();
$attrs['gidnumber'] = $niveau02->getId(); $attrs['gidnumber'] = $niveau02->getId();
$attrs['memberuid'] = []; $attrs['memberuid'] = [];
foreach($niveau02->getUsers() as $user) { foreach ($niveau02->getUsers() as $user) {
array_push($attrs['memberuid'],$user->getUsername()); if ($user->isIsactive()) {
array_push($attrs['memberuid'], $user->getUsername());
}
} }
sort($attrs['memberuid']); sort($attrs['memberuid']);
if(count($attrs['memberuid'])==1) $attrs['memberuid'] = $attrs['memberuid'][0]; if (1 == count($attrs['memberuid'])) {
$attrs['memberuid'] = $attrs['memberuid'][0];
}
} }
public function getNiveau02DN($id) { public function getNiveau02DN($id)
{
return 'cn='.$id.','.$this->baseniveau02; return 'cn='.$id.','.$this->baseniveau02;
} }
//================================================================================================================================================================== // ==================================================================================================================================================================
//== Function Group================================================================================================================================================= // == Function Niveau03==============================================================================================================================================
//================================================================================================================================================================== // ==================================================================================================================================================================
public function addGroup(Group $group) {
public function addNiveau03(Niveau03 $niveau03)
{
$connection = $this->connect(); $connection = $this->connect();
$dn = $this->getGroupDN($group->getLabel()); $dn = $this->getNiveau03DN($niveau03->getLabel());
$attrs = array(); $attrs = [];
$attrs['objectclass'] = $this->getObjectClassesGroup(); $attrs['objectclass'] = $this->getObjectClassesNiveau03();
$this->fillAttributesGroup($group, $attrs); $this->fillAttributesNiveau03($niveau03, $attrs);
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
$result = ldap_add($connection, $dn, $attrs); $result = ldap_add($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
return $result; return $result;
} }
public function ismodifyGroup(Group $group,$entry){ public function ismodifyNiveau03(Niveau03 $niveau03, $entry)
{
$attrs = []; $attrs = [];
$this->fillAttributesGroup($group, $attrs); $this->fillAttributesNiveau03($niveau03, $attrs);
foreach($attrs as $key => $value) { foreach ($attrs as $key => $value) {
if(!array_key_exists($key,$entry)&&!empty($value)) return true; if (!array_key_exists($key, $entry) && !empty($value)) {
elseif(array_key_exists($key,$entry)&&$value!=$entry[$key]) return true; return true;
} elseif (array_key_exists($key, $entry) && $value != $entry[$key]) {
return true;
}
} }
foreach($entry as $key => $value) { foreach ($entry as $key => $value) {
if(!array_key_exists($key,$attrs)&&!empty($value)) return true; if (!array_key_exists($key, $attrs) && !empty($value)) {
elseif(array_key_exists($key,$attrs)&&$value!=$attrs[$key]) return true; return true;
} elseif (array_key_exists($key, $attrs) && $value != $attrs[$key]) {
return true;
}
} }
return false; return false;
} }
public function modifyGroup(Group $group,$oldid){ public function modifyNiveau03(Niveau03 $niveau03, $oldid)
{
$dn = $this->basedn; $dn = $this->basedn;
$connection = $this->connect(); $connection = $this->connect();
$attrs = array(); $attrs = [];
$this->fillAttributesGroup($group, $attrs); $this->fillAttributesNiveau03($niveau03, $attrs);
unset($attrs["cn"]); unset($attrs['cn']);
$dn = $this->getGroupDN($group->getLabel()); $dn = $this->getNiveau03DN($niveau03->getLabel());
foreach($attrs as $key => $value){ foreach ($attrs as $key => $value) {
if(empty($value)){ if (empty($value)) {
// Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus // Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus
@ldap_mod_del($connection, $dn, array($key => array())); @ldap_mod_del($connection, $dn, [$key => []]);
unset($attrs[$key]); unset($attrs[$key]);
} }
} }
if(isset($oldid)&&$oldid!=$group->getLabel()) { if (isset($oldid) && $oldid != $niveau03->getLabel()) {
$olddn = $this->getGroupDN($oldid); $olddn = $this->getNiveau03DN($oldid);
$this->rename($olddn,"cn=".$group->getLabel(),$this->basegroup); $this->rename($olddn, 'cn='.$niveau03->getLabel(), $this->baseniveau03);
} }
$result = ldap_modify($connection, $dn, $attrs); $result = ldap_modify($connection, $dn, $attrs);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
public function deleteGroup(Group $group){ public function deleteNiveau03(Niveau03 $niveau03)
$dn = $this->getGroupDN($group->getLabel()); {
$dn = $this->getNiveau03DN($niveau03->getLabel());
return $this->deleteByDN($dn); return $this->deleteByDN($dn);
} }
private function getObjectClassesGroup() { private function getObjectClassesNiveau03()
$oc = array( {
$oc = [
'top', 'top',
'posixGroup', 'posixGroup',
); ];
return $oc; return $oc;
} }
public function listAttributesGroup() { public function listAttributesNiveau03()
{
return [ return [
"cn", 'cn',
"gidnumber", 'gidnumber',
"memberuid" 'memberuid',
]; ];
} }
public function fillAttributesGroup(Group $group, array &$attrs) { public function fillAttributesNiveau03(Niveau03 $niveau03, array &$attrs)
$attrs['cn'] = $group->getLabel(); {
$attrs['gidnumber'] = $group->getId(); $attrs['cn'] = $niveau03->getLabel();
$attrs['gidnumber'] = $niveau03->getId();
$attrs['memberuid'] = []; $attrs['memberuid'] = [];
foreach($group->getUsers() as $usergroup) { foreach ($niveau03->getUsers() as $user) {
array_push($attrs['memberuid'],$usergroup->getUser()->getUsername()); if ($user->isIsactive()) {
array_push($attrs['memberuid'], $user->getUsername());
}
} }
sort($attrs['memberuid']); sort($attrs['memberuid']);
if(count($attrs['memberuid'])==1) $attrs['memberuid'] = $attrs['memberuid'][0]; if (1 == count($attrs['memberuid'])) {
$attrs['memberuid'] = $attrs['memberuid'][0];
}
} }
public function getGroupDN($id) { public function getNiveau03DN($id)
return 'cn='.$id.','.$this->basegroup; {
return 'cn='.$id.','.$this->baseniveau03;
} }
//================================================================================================================================================================== // ==================================================================================================================================================================
//== Function UserGroup============================================================================================================================================= // == Function Niveau04==============================================================================================================================================
//================================================================================================================================================================== // ==================================================================================================================================================================
function addUserGroup(UserGroup $usergroup) { public function addNiveau04(Niveau04 $niveau04)
$dn = $this->basedn; {
$connection = $this->connect(); $connection = $this->connect();
$dn = $this->getNiveau04DN($niveau04->getLabel());
// On recherche le group en cours $attrs = [];
$criteria = '(cn='.$usergroup->getGroup()->getLabel().')'; $attrs['objectclass'] = $this->getObjectClassesNiveau04();
$subbranch=$this->basegroup; $this->fillAttributesNiveau04($niveau04, $attrs);
$result = $this->search($criteria, array('memberuid'), $subbranch);
if(!$this->in_array_r($usergroup->getUser()->getUsername(),$result[0])) { foreach ($attrs as $key => $value) {
$dn = $this->getGroupDN($usergroup->getGroup()->getLabel()); if (empty($value)) {
$entry['memberuid'] = $usergroup->getUser()->getUsername(); unset($attrs[$key]);
$result = ldap_mod_add($connection, $dn, $entry); }
if(!$result) $this->ldapError(); }
$result = ldap_add($connection, $dn, $attrs);
if (!$result) {
$this->ldapError();
} }
return $result; return $result;
} }
function delUserGroup(UserGroup $usergroup) { public function ismodifyNiveau04(Niveau04 $niveau04, $entry)
{
$attrs = [];
$this->fillAttributesNiveau04($niveau04, $attrs);
foreach ($attrs as $key => $value) {
if (!array_key_exists($key, $entry) && !empty($value)) {
return true;
} elseif (array_key_exists($key, $entry) && $value != $entry[$key]) {
return true;
}
}
foreach ($entry as $key => $value) {
if (!array_key_exists($key, $attrs) && !empty($value)) {
return true;
} elseif (array_key_exists($key, $attrs) && $value != $attrs[$key]) {
return true;
}
}
return false;
}
public function modifyNiveau04(Niveau04 $niveau04, $oldid)
{
$dn = $this->basedn;
$connection = $this->connect();
$attrs = [];
$this->fillAttributesNiveau04($niveau04, $attrs);
unset($attrs['cn']);
$dn = $this->getNiveau04DN($niveau04->getLabel());
foreach ($attrs as $key => $value) {
if (empty($value)) {
// Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus
@ldap_mod_del($connection, $dn, [$key => []]);
unset($attrs[$key]);
}
}
if (isset($oldid) && $oldid != $niveau04->getLabel()) {
$olddn = $this->getNiveau04DN($oldid);
$this->rename($olddn, 'cn='.$niveau04->getLabel(), $this->baseniveau04);
}
$result = ldap_modify($connection, $dn, $attrs);
if (!$result) {
$this->ldapError();
}
}
public function deleteNiveau04(Niveau04 $niveau04)
{
$dn = $this->getNiveau04DN($niveau04->getLabel());
return $this->deleteByDN($dn);
}
private function getObjectClassesNiveau04()
{
$oc = [
'top',
'posixGroup',
];
return $oc;
}
public function listAttributesNiveau04()
{
return [
'cn',
'gidnumber',
'memberuid',
];
}
public function fillAttributesNiveau04(Niveau04 $niveau04, array &$attrs)
{
$attrs['cn'] = $niveau04->getLabel();
$attrs['gidnumber'] = $niveau04->getId();
$attrs['memberuid'] = [];
foreach ($niveau04->getUsers() as $user) {
if ($user->isIsactive()) {
array_push($attrs['memberuid'], $user->getUsername());
}
}
sort($attrs['memberuid']);
if (1 == count($attrs['memberuid'])) {
$attrs['memberuid'] = $attrs['memberuid'][0];
}
}
public function getNiveau04DN($id)
{
return 'cn='.$id.','.$this->baseniveau04;
}
// ==================================================================================================================================================================
// == Function Group=================================================================================================================================================
// ==================================================================================================================================================================
public function addGroup(Group $group)
{
$connection = $this->connect();
$dn = $this->getGroupDN($group->getLabel());
$attrs = [];
$attrs['objectclass'] = $this->getObjectClassesGroup();
$this->fillAttributesGroup($group, $attrs);
foreach ($attrs as $key => $value) {
if (empty($value)) {
unset($attrs[$key]);
}
}
$result = ldap_add($connection, $dn, $attrs);
if (!$result) {
$this->ldapError();
}
return $result;
}
public function ismodifyGroup(Group $group, $entry)
{
$attrs = [];
$this->fillAttributesGroup($group, $attrs);
foreach ($attrs as $key => $value) {
if (!array_key_exists($key, $entry) && !empty($value)) {
return true;
} elseif (array_key_exists($key, $entry) && $value != $entry[$key]) {
return true;
}
}
foreach ($entry as $key => $value) {
if (!array_key_exists($key, $attrs) && !empty($value)) {
return true;
} elseif (array_key_exists($key, $attrs) && $value != $attrs[$key]) {
return true;
}
}
return false;
}
public function modifyGroup(Group $group, $oldid)
{
$dn = $this->basedn;
$connection = $this->connect();
$attrs = [];
$this->fillAttributesGroup($group, $attrs);
unset($attrs['cn']);
$dn = $this->getGroupDN($group->getLabel());
foreach ($attrs as $key => $value) {
if (empty($value)) {
// Bien mettre un @ car si l'attribut est déjà vide cela crache une erreur car l'attribut n'existe déjà plus
@ldap_mod_del($connection, $dn, [$key => []]);
unset($attrs[$key]);
}
}
if (isset($oldid) && $oldid != $group->getLabel()) {
$olddn = $this->getGroupDN($oldid);
$this->rename($olddn, 'cn='.$group->getLabel(), $this->basegroup);
}
$result = ldap_modify($connection, $dn, $attrs);
if (!$result) {
$this->ldapError();
}
}
public function deleteGroup(Group $group)
{
$dn = $this->getGroupDN($group->getLabel());
return $this->deleteByDN($dn);
}
private function getObjectClassesGroup()
{
$oc = [
'top',
'posixGroup',
];
return $oc;
}
public function listAttributesGroup()
{
return [
'cn',
'gidnumber',
'memberuid',
];
}
public function fillAttributesGroup(Group $group, array &$attrs)
{
$attrs['cn'] = $group->getLabel();
$attrs['gidnumber'] = $group->getId();
$attrs['memberuid'] = [];
foreach ($group->getUsers() as $usergroup) {
if ($usergroup->getUser()->isIsactive()) {
array_push($attrs['memberuid'], $usergroup->getUser()->getUsername());
}
}
sort($attrs['memberuid']);
if (1 == count($attrs['memberuid'])) {
$attrs['memberuid'] = $attrs['memberuid'][0];
}
}
public function getGroupDN($id)
{
return 'cn='.$id.','.$this->basegroup;
}
// ==================================================================================================================================================================
// == Function UserGroup=============================================================================================================================================
// ==================================================================================================================================================================
public function addUserGroup(UserGroup $usergroup)
{
$dn = $this->basedn; $dn = $this->basedn;
$connection = $this->connect(); $connection = $this->connect();
// On recherche le group en cours // On recherche le group en cours
$criteria = '(cn='.$usergroup->getGroup()->getLabel().')'; $criteria = '(cn='.$usergroup->getGroup()->getLabel().')';
$subbranch=$this->basegroup; $subbranch = $this->basegroup;
$result = $this->search($criteria, array('memberuid'), $subbranch); $result = $this->search($criteria, ['memberuid'], $subbranch);
if($this->in_array_r($usergroup->getUser()->getUsername(),$result[0])) { if (!$this->in_array_r($usergroup->getUser()->getUsername(), $result[0])) {
if ($usergroup->getUser()->isIsactive()) {
$dn = $this->getGroupDN($usergroup->getGroup()->getLabel());
$entry['memberuid'] = $usergroup->getUser()->getUsername();
$result = ldap_mod_add($connection, $dn, $entry);
if (!$result) {
$this->ldapError();
}
}
}
return $result;
}
public function delUserGroup(UserGroup $usergroup)
{
$dn = $this->basedn;
$connection = $this->connect();
// On recherche le group en cours
$criteria = '(cn='.$usergroup->getGroup()->getLabel().')';
$subbranch = $this->basegroup;
$result = $this->search($criteria, ['memberuid'], $subbranch);
if ($this->in_array_r($usergroup->getUser()->getUsername(), $result[0])) {
$dn = $this->getGroupDN($usergroup->getGroup()->getLabel()); $dn = $this->getGroupDN($usergroup->getGroup()->getLabel());
$entry['memberuid'] = $usergroup->getUser()->getUsername(); $entry['memberuid'] = $usergroup->getUser()->getUsername();
$result = ldap_mod_del($connection, $dn, $entry); $result = ldap_mod_del($connection, $dn, $entry);
if(!$result) $this->ldapError(); if (!$result) {
$this->ldapError();
}
} }
return $result; return $result;

View File

@ -1,10 +1,11 @@
<?php <?php
namespace App\Service; namespace App\Service;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface; use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
class MailService class MailService
{ {
@ -18,7 +19,7 @@ class MailService
} }
/** /**
* Send email * Send email.
* *
* @param string $template email template * @param string $template email template
* @param mixed $parameters custom params for template * @param mixed $parameters custom params for template
@ -26,27 +27,28 @@ class MailService
* @param string $from from email address * @param string $from from email address
* @param string $fromName from name * @param string $fromName from name
* *
* @return boolean send status * @return bool send status
*/ */
public function sendEmail($subject, $body, $to, $from, $fromName = null) public function sendEmail($subject, $body, $to, $from, $fromName = null)
{ {
$template = $this->twig->load('Home/mail.html.twig'); $template = $this->twig->load('Home/mail.html.twig');
$parameters=["subject"=>$subject,"body"=>$body]; $parameters = ['subject' => $subject, 'body' => $body];
$subject = $template->renderBlock('subject', $parameters); $subject = $template->renderBlock('subject', $parameters);
$bodyHtml = $template->renderBlock('body', $parameters); $bodyHtml = $template->renderBlock('body', $parameters);
try { try {
if(!is_array($to)) $to=[$to]; if (!is_array($to)) {
$to = [$to];
}
foreach($to as $t) { foreach ($to as $t) {
$message = (new Email()) $message = (new Email())
->subject($subject) ->subject($subject)
->from(Address::create($fromName. "<".$from.">")) ->from(Address::create($fromName.'<'.$from.'>'))
->to($t) ->to($t)
->html($bodyHtml); ->html($bodyHtml);
$this->mailer->send($message); $this->mailer->send($message);
} }
} catch (TransportExceptionInterface $e) { } catch (TransportExceptionInterface $e) {
return $e->getMessage(); return $e->getMessage();

View File

@ -4,27 +4,27 @@ namespace App\Service;
use Aws\S3\Exception\S3Exception; use Aws\S3\Exception\S3Exception;
use Exception; use Exception;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class MinioService class MinioService
{ {
const ERR_UNAVAILABLE = 'Service de gestion de fichiers momentanément indisponible.'; public const ERR_UNAVAILABLE = 'Service de gestion de fichiers momentanément indisponible.';
const ERR_FILE_NOT_FOUND = 'messages.minio.404'; public const ERR_FILE_NOT_FOUND = 'messages.minio.404';
protected $client;
protected $listClient; private $rootPath;
protected $minioBucket; private $client;
protected $minioRoot; private $listClient;
protected $minioPathStyle; private $minioBucket;
protected $minioSecure; private $minioRoot;
private $minioPathStyle;
private $minioSecure;
public function __construct($rootPath, $minioUrl, $minioKey, $minioSecret, $minioBucket, $minioRoot, $minioPathstyle, $minioSecure) public function __construct($rootPath, $minioUrl, $minioKey, $minioSecret, $minioBucket, $minioRoot, $minioPathstyle, $minioSecure)
{ {
$this->rootPath = $rootPath; $this->rootPath = $rootPath;
$this->minioBucket = $minioBucket; $this->minioBucket = $minioBucket;
$this->minioPathStyle = ($minioPathstyle==1?true:false); $this->minioPathStyle = (1 == $minioPathstyle ? true : false);
$this->minioRoot = $minioRoot; $this->minioRoot = $minioRoot;
$this->client = $this->getClient($minioUrl, $minioKey, $minioSecret, $minioPathstyle, $minioSecure); $this->client = $this->getClient($minioUrl, $minioKey, $minioSecret, $minioPathstyle, $minioSecure);
$this->initBucket(); $this->initBucket();
@ -34,11 +34,11 @@ class MinioService
{ {
// On s'assure que le repertoire temporaire de destination existe bien // On s'assure que le repertoire temporaire de destination existe bien
$fs = new Filesystem(); $fs = new Filesystem();
$tmpdir=$this->rootPath."/var/tmp"; $tmpdir = $this->rootPath.'/var/tmp';
$fs->mkdir($tmpdir."/".dirname($filename)); $fs->mkdir($tmpdir.'/'.dirname($filename));
// Approche repassant par le serveur d'appel // Approche repassant par le serveur d'appel
if(!$usecache||!$fs->exists($tmpdir.'/'.$filename)) { if (!$usecache || !$fs->exists($tmpdir.'/'.$filename)) {
try { try {
$result = $this->client->getObject([ $result = $this->client->getObject([
'Bucket' => $this->minioBucket, 'Bucket' => $this->minioBucket,
@ -48,7 +48,7 @@ class MinioService
} catch (S3Exception $e) { } catch (S3Exception $e) {
switch ($e->getResponse()->getStatusCode()) { switch ($e->getResponse()->getStatusCode()) {
case 404: case 404:
throw new NotFoundHttpException($this->translator->trans(self::ERR_FILE_NOT_FOUND, [], 'messages')); throw new NotFoundHttpException(self::ERR_FILE_NOT_FOUND);
break; break;
default: default:
\Sentry\captureException($e); \Sentry\captureException($e);
@ -78,8 +78,8 @@ class MinioService
} }
if ($deleteSource) { if ($deleteSource) {
$tmpdir=$this->rootPath."/var/tmp"; $tmpdir = $this->rootPath.'/var/tmp';
@unlink($tmpdir."/".$filename); @unlink($tmpdir.'/'.$filename);
} }
} }
@ -133,7 +133,7 @@ class MinioService
*/ */
public function countKeys(string $prefix) public function countKeys(string $prefix)
{ {
//On utilise un path spécifique car listObjectsV2 utilise une autre config de client // On utilise un path spécifique car listObjectsV2 utilise une autre config de client
try { try {
$response = $this->client->listObjectsV2([ $response = $this->client->listObjectsV2([
'Bucket' => $this->minioBucket, 'Bucket' => $this->minioBucket,
@ -154,7 +154,7 @@ class MinioService
*/ */
public function listKeys(string $prefix) public function listKeys(string $prefix)
{ {
//On utilise un path spécifique car listObjectsV2 utilise une autre config de client // On utilise un path spécifique car listObjectsV2 utilise une autre config de client
try { try {
$response = $this->client->listObjectsV2([ $response = $this->client->listObjectsV2([
'Bucket' => $this->minioBucket, 'Bucket' => $this->minioBucket,
@ -175,21 +175,19 @@ class MinioService
* @param string $filename Nom du fichier dans la réponse * @param string $filename Nom du fichier dans la réponse
* @param bool $returnFile Retourner un fichier ou une réponse * @param bool $returnFile Retourner un fichier ou une réponse
*/ */
protected function getClient($minioUrl, $minioKey, $minioSecret, bool $minioPathstyle, bool $minioSecure) protected function getClient($minioUrl, $minioKey, $minioSecret, bool $minioPathstyle, bool $minioSecure)
{ {
$client = new \Aws\S3\S3Client([ $client = new \Aws\S3\S3Client([
'version' => 'latest', 'version' => 'latest',
'region' => 'eu-west-1', 'region' => 'eu-west-1',
'endpoint' => $minioUrl, 'endpoint' => $minioUrl,
//On force le mode DNS // On force le mode DNS
'use_path_style_endpoint' => $minioPathstyle, 'use_path_style_endpoint' => $minioPathstyle,
'credentials' => [ 'credentials' => [
'key' => $minioKey, 'key' => $minioKey,
'secret' => $minioSecret, 'secret' => $minioSecret,
], ],
//On désactive les checks SSL pour le moment // On désactive les checks SSL pour le moment
'http' => [ 'http' => [
'verify' => $minioSecure, 'verify' => $minioSecure,
], ],

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Service; namespace App\Service;
use Symfony\Component\PasswordHasher\Exception\InvalidPasswordException; use Symfony\Component\PasswordHasher\Exception\InvalidPasswordException;
@ -11,11 +12,11 @@ class PasswordEncoder implements LegacyPasswordHasherInterface
public function hash(string $plainPassword, string $salt = null): string public function hash(string $plainPassword, string $salt = null): string
{ {
if ($this->isPasswordTooLong($plainPassword)) { if ($this->isPasswordTooLong($plainPassword)) {
throw new InvalidPasswordException(); throw new InvalidPasswordException();
} }
$hash = "{SSHA}" . base64_encode(pack("H*", sha1($plainPassword . $salt)) . $salt); $hash = '{SSHA}'.base64_encode(pack('H*', sha1($plainPassword.$salt)).$salt);
return $hash; return $hash;
} }
@ -25,7 +26,7 @@ class PasswordEncoder implements LegacyPasswordHasherInterface
return false; return false;
} }
return $this->hash($plainPassword,$salt) === $hashedPassword; return $this->hash($plainPassword, $salt) === $hashedPassword;
} }
public function needsRehash(string $hashedPassword): bool public function needsRehash(string $hashedPassword): bool

View File

@ -1,9 +1,9 @@
<?php <?php
namespace App\Service; namespace App\Service;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Oneup\UploaderBundle\Event\PostPersistEvent; use Oneup\UploaderBundle\Event\PostPersistEvent;
use App\Service\MinioService;
class UploadListener class UploadListener
{ {
@ -16,76 +16,84 @@ class UploadListener
$this->minio = $minio; $this->minio = $minio;
} }
protected function getHeight($image) { protected function getHeight($image)
{
$size = getimagesize($image); $size = getimagesize($image);
$height = $size[1]; $height = $size[1];
return $height; return $height;
} }
// Cacul de la largeur // Cacul de la largeur
protected function getWidth($image) { protected function getWidth($image)
{
$size = getimagesize($image); $size = getimagesize($image);
$width = $size[0]; $width = $size[0];
return $width; return $width;
} }
protected function resizeImage($image,$width,$height,$scale) { protected function resizeImage($image, $width, $height, $scale)
{
list($imagewidth, $imageheight, $imageType) = getimagesize($image); list($imagewidth, $imageheight, $imageType) = getimagesize($image);
$imageType = image_type_to_mime_type($imageType); $imageType = image_type_to_mime_type($imageType);
$newImageWidth = ceil($width * $scale); $newImageWidth = ceil($width * $scale);
$newImageHeight = ceil($height * $scale); $newImageHeight = ceil($height * $scale);
$newImage = imagecreatetruecolor($newImageWidth,$newImageHeight); $newImage = imagecreatetruecolor($newImageWidth, $newImageHeight);
switch($imageType) { $source = null;
case "image/gif":
$source=imagecreatefromgif($image); switch ($imageType) {
case 'image/gif':
$source = imagecreatefromgif($image);
break; break;
case "image/pjpeg": case 'image/pjpeg':
case "image/jpeg": case 'image/jpeg':
case "image/jpg": case 'image/jpg':
$source=imagecreatefromjpeg($image); $source = imagecreatefromjpeg($image);
break; break;
case "image/png": case 'image/png':
case "image/x-png": case 'image/x-png':
$source=imagecreatefrompng($image); $source = imagecreatefrompng($image);
break; break;
} }
$newImage = imagecreatetruecolor( $newImageWidth, $newImageHeight ); $newImage = imagecreatetruecolor($newImageWidth, $newImageHeight);
imagealphablending( $newImage, false ); imagealphablending($newImage, false);
imagesavealpha( $newImage, true ); imagesavealpha($newImage, true);
imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height); imagecopyresampled($newImage, $source, 0, 0, 0, 0, $newImageWidth, $newImageHeight, $width, $height);
switch($imageType) { switch ($imageType) {
case "image/gif": case 'image/gif':
imagegif($newImage,$image); imagegif($newImage, $image);
break; break;
case "image/pjpeg": case 'image/pjpeg':
case "image/jpeg": case 'image/jpeg':
case "image/jpg": case 'image/jpg':
imagejpeg($newImage,$image,90); imagejpeg($newImage, $image, 90);
break; break;
case "image/png": case 'image/png':
case "image/x-png": case 'image/x-png':
imagepng($newImage,$image); imagepng($newImage, $image);
break; break;
} }
chmod($image, 0640); chmod($image, 0640);
return $image; return $image;
} }
public function onUpload(PostPersistEvent $event) public function onUpload(PostPersistEvent $event)
{ {
$type=$event->getType(); $type = $event->getType();
switch($type) { switch ($type) {
default: default:
$file=$event->getFile(); $file = $event->getFile();
$filename=$file->getFilename(); $filename = $file->getFilename();
$response = $event->getResponse(); $response = $event->getResponse();
$response['file'] = $filename; $response['file'] = $filename;
$this->minio->upload($file,$type."/".$filename,true); $this->minio->upload($file, $type.'/'.$filename, true);
break; break;
} }
} }

View File

@ -0,0 +1,34 @@
<?php
namespace App\Service;
use App\Entity\User;
use Symfony\Component\Security\Core\Exception\AccountExpiredException;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAccountStatusException;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class UserChecker implements UserCheckerInterface
{
public function checkPreAuth(UserInterface $user): void
{
if (!$user instanceof User) {
return;
}
if (!$user->isIsactive()) {
throw new CustomUserMessageAccountStatusException('Votre compte a été désactivé');
}
}
public function checkPostAuth(UserInterface $user): void
{
if (!$user instanceof User) {
return;
}
if (!$user->isIsactive()) {
throw new AccountExpiredException('...');
}
}
}

View File

@ -1,10 +1,10 @@
<?php <?php
namespace App\Twig; namespace App\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
use Ramsey\Uuid\Uuid; use Ramsey\Uuid\Uuid;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class AppExtension extends AbstractExtension class AppExtension extends AbstractExtension
{ {
@ -17,8 +17,9 @@ class AppExtension extends AbstractExtension
]; ];
} }
public function getUniqueId() { public function getUniqueId()
return str_replace("-","",Uuid::uuid4()); {
return str_replace('-', '', Uuid::uuid4());
} }
public function setContainer($container) public function setContainer($container)

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
@ -8,5 +9,5 @@ use Symfony\Component\Validator\Constraint;
*/ */
class Grouplabel extends Constraint class Grouplabel extends Constraint
{ {
public $message = "Caractères interdit dans ce label"; public $message = 'Caractères interdit dans ce label';
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
@ -21,8 +22,7 @@ class GrouplabelValidator extends ConstraintValidator
// On s'assure que le label ne contient pas des caractères speciaux // On s'assure que le label ne contient pas des caractères speciaux
$string = preg_replace('~[^ éèêôöàïî\'@a-zA-Z0-9._-]~', '', $value); $string = preg_replace('~[^ éèêôöàïî\'@a-zA-Z0-9._-]~', '', $value);
if($string!=$value) if ($string != $value) {
{
$this->context->addViolation($constraint->message); $this->context->addViolation($constraint->message);
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
@ -8,6 +9,6 @@ use Symfony\Component\Validator\Constraint;
*/ */
class Niveau01unique extends Constraint class Niveau01unique extends Constraint
{ {
public $messagegroup = "Un groupe utilise déjà ce label"; public $messagegroup = 'Un groupe utilise déjà ce label';
public $messageniveau02 = "Un niveau de rang 02 utilise déjà ce label"; public $messageniveau02 = 'Un niveau de rang 02 utilise déjà ce label';
} }

View File

@ -1,9 +1,10 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator; use Symfony\Component\Validator\ConstraintValidator;
use Doctrine\ORM\EntityManagerInterface;
/** /**
* @Annotation * @Annotation
@ -19,13 +20,13 @@ class Niveau01uniqueValidator extends ConstraintValidator
public function validate($value, Constraint $constraint) public function validate($value, Constraint $constraint)
{ {
$group = $this->em->getRepository("App\Entity\Group")->findOneBy(["label"=>$value]); $group = $this->em->getRepository("App\Entity\Group")->findOneBy(['label' => $value]);
if($group) { if ($group) {
$this->context->addViolation($constraint->messagegroup); $this->context->addViolation($constraint->messagegroup);
} }
$niveau02 = $this->em->getRepository("App\Entity\Niveau02")->findOneBy(["label"=>$value]); $niveau02 = $this->em->getRepository("App\Entity\Niveau02")->findOneBy(['label' => $value]);
if($niveau02) { if ($niveau02) {
$this->context->addViolation($constraint->messageniveau02); $this->context->addViolation($constraint->messageniveau02);
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
@ -8,6 +9,6 @@ use Symfony\Component\Validator\Constraint;
*/ */
class Niveau02unique extends Constraint class Niveau02unique extends Constraint
{ {
public $messagegroup = "Un groupe utilise déjà ce label"; public $messagegroup = 'Un groupe utilise déjà ce label';
public $messageniveau01 = "Un niveau de rang 01 utilise déjà ce label"; public $messageniveau01 = 'Un niveau de rang 01 utilise déjà ce label';
} }

View File

@ -1,9 +1,10 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator; use Symfony\Component\Validator\ConstraintValidator;
use Doctrine\ORM\EntityManagerInterface;
/** /**
* @Annotation * @Annotation
@ -19,13 +20,13 @@ class Niveau02uniqueValidator extends ConstraintValidator
public function validate($value, Constraint $constraint) public function validate($value, Constraint $constraint)
{ {
$group = $this->em->getRepository("App\Entity\Group")->findOneBy(["label"=>$value]); $group = $this->em->getRepository("App\Entity\Group")->findOneBy(['label' => $value]);
if($group) { if ($group) {
$this->context->addViolation($constraint->messagegroup); $this->context->addViolation($constraint->messagegroup);
} }
$niveau02 = $this->em->getRepository("App\Entity\Niveau01")->findOneBy(["label"=>$value]); $niveau02 = $this->em->getRepository("App\Entity\Niveau01")->findOneBy(['label' => $value]);
if($niveau02) { if ($niveau02) {
$this->context->addViolation($constraint->messageniveau01); $this->context->addViolation($constraint->messageniveau01);
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
@ -8,5 +9,5 @@ use Symfony\Component\Validator\Constraint;
*/ */
class Password extends Constraint class Password extends Constraint
{ {
public $message = "Votre mot de passe doit contenir au minimum 8 caractères, constitué de chiffres, de lettres et caractères spéciaux"; public $message = 'Votre mot de passe doit contenir au minimum 8 caractères, constitué de chiffres, de lettres et caractères spéciaux';
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
@ -11,17 +12,14 @@ class PasswordValidator extends ConstraintValidator
{ {
public function validate($value, Constraint $constraint) public function validate($value, Constraint $constraint)
{ {
if(!empty($value)) { if (!empty($value)) {
if (strlen($value) < '8') { if (strlen($value) < '8') {
$this->context->addViolation($constraint->message); $this->context->addViolation($constraint->message);
} } elseif (!preg_match('#[0-9]+#', $value)) {
elseif(!preg_match("#[0-9]+#",$value)) {
$this->context->addViolation($constraint->message); $this->context->addViolation($constraint->message);
} } elseif (!preg_match('#[a-zA-Z]+#', $value)) {
elseif(!preg_match("#[a-zA-Z]+#",$value)) {
$this->context->addViolation($constraint->message); $this->context->addViolation($constraint->message);
} } elseif (!preg_match("/[|!@#$%&*\/=?,;.:\-_+~^\\\]/", $value)) {
elseif(!preg_match("/[|!@#$%&*\/=?,;.:\-_+~^\\\]/",$value)) {
$this->context->addViolation($constraint->message); $this->context->addViolation($constraint->message);
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
@ -9,5 +10,5 @@ use Symfony\Component\Validator\Constraint;
class Userusername extends Constraint class Userusername extends Constraint
{ {
public $messageinvalid = "Le login n'est pas valide"; public $messageinvalid = "Le login n'est pas valide";
public $messagenotunique = "Le login exisite déjà"; public $messagenotunique = 'Le login exisite déjà';
} }

View File

@ -1,9 +1,10 @@
<?php <?php
namespace App\Validator; namespace App\Validator;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator; use Symfony\Component\Validator\ConstraintValidator;
use Doctrine\ORM\EntityManagerInterface;
/** /**
* @Annotation * @Annotation
@ -19,7 +20,7 @@ class UserusernameValidator extends ConstraintValidator
public function validate($value, Constraint $constraint) public function validate($value, Constraint $constraint)
{ {
if(!empty($value)) { if (!empty($value)) {
// On s'assure que le login soit de 5 caractères minimum // On s'assure que le login soit de 5 caractères minimum
if (strlen($value) < '5') { if (strlen($value) < '5') {
$this->context->addViolation($constraint->messageinvalid); $this->context->addViolation($constraint->messageinvalid);
@ -27,15 +28,15 @@ class UserusernameValidator extends ConstraintValidator
// On s'assure que le username ne contient pas des caractères speciaux // On s'assure que le username ne contient pas des caractères speciaux
$string = preg_replace('~[^@a-zA-Z0-9._-]~', '', $value); $string = preg_replace('~[^@a-zA-Z0-9._-]~', '', $value);
if($string!=$value) if ($string != $value) {
$this->context->addViolation($constraint->messageinvalid); $this->context->addViolation($constraint->messageinvalid);
// On s'assure que le username n'existe pas dans la table des registration
$registration = $this->em->getRepository("App\Entity\Registration")->findOneBy(["username"=>$value]);
if($registration) {
$this->context->addViolation($constraint->messagenotunique);
} }
// On s'assure que le username n'existe pas dans la table des registration
$registration = $this->em->getRepository("App\Entity\Registration")->findOneBy(['username' => $value]);
if ($registration) {
$this->context->addViolation($constraint->messagenotunique);
}
} }
} }
} }

View File

@ -49,7 +49,7 @@
{% if app.user %} {% if app.user %}
$.ajax({ $.ajax({
method: "POST", method: "POST",
url: "{{ path('app_user_preference') }}", url: "{{ path('app_all_preference') }}",
data: { data: {
id:0, id:0,
key:'fgaudit', key:'fgaudit',

Some files were not shown because too many files have changed in this diff Show More