10 Commits

Author SHA1 Message Date
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
116 changed files with 15094 additions and 14734 deletions

46
.env
View File

@ -20,18 +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_MODEREGISTRATION= # null | BYADMIN | BYUSER APP_MODEREGISTRATION= # null | BYADMIN | BYUSER
APP_ADMINS='["admin"]' APP_ADMINS='["admin"]'
# Structure Organisationnelle
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_NIVEAUUPDATABLE=0 # Quel degres de niveau est modifiable par les utilisateurs seule les admin et modo via console peuvent outre passer ce param
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
@ -42,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']};

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

@ -330,6 +330,122 @@ 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 visiteur
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 visiteur
app_niveau04_selectlist:
path: /niveau04/selectlist
controller: App\Controller\Niveau04Controller::selectlist
#== Group ======================================================================================================= #== Group =======================================================================================================
#-- Access admin #-- Access admin

View File

@ -10,12 +10,41 @@ parameters:
appMasteridentity: '%env(resolve:APP_MASTERIDENTITY)%' appMasteridentity: '%env(resolve:APP_MASTERIDENTITY)%'
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)%'
@ -35,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

@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20220926081328 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$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 TABLE niveau03 (id INT NOT NULL, niveau02_id INT NOT NULL, label VARCHAR(250) NOT 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, 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('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 niveau03_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE registration ADD niveau04_id INT DEFAULT NULL');
$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('CREATE INDEX IDX_62A8A7A7F3F41F20 ON registration (niveau03_id)');
$this->addSql('CREATE INDEX IDX_62A8A7A76E232799 ON registration (niveau04_id)');
$this->addSql('ALTER TABLE useraccount ADD niveau03_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE useraccount ADD niveau04_id INT DEFAULT NULL');
$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('CREATE INDEX IDX_E157AA1AF3F41F20 ON useraccount (niveau03_id)');
$this->addSql('CREATE INDEX IDX_E157AA1A6E232799 ON useraccount (niveau04_id)');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE SCHEMA public');
$this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A7F3F41F20');
$this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1AF3F41F20');
$this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A76E232799');
$this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A6E232799');
$this->addSql('DROP SEQUENCE niveau03_id_seq CASCADE');
$this->addSql('DROP SEQUENCE niveau04_id_seq CASCADE');
$this->addSql('ALTER TABLE niveau03 DROP CONSTRAINT FK_83F21F0F4B487845');
$this->addSql('ALTER TABLE niveau04 DROP CONSTRAINT FK_1D968AACF3F41F20');
$this->addSql('DROP TABLE niveau03');
$this->addSql('DROP TABLE niveau04');
$this->addSql('DROP INDEX IDX_E157AA1AF3F41F20');
$this->addSql('DROP INDEX IDX_E157AA1A6E232799');
$this->addSql('ALTER TABLE useraccount DROP niveau03_id');
$this->addSql('ALTER TABLE useraccount DROP niveau04_id');
$this->addSql('DROP INDEX IDX_62A8A7A7F3F41F20');
$this->addSql('DROP INDEX IDX_62A8A7A76E232799');
$this->addSql('ALTER TABLE registration DROP niveau03_id');
$this->addSql('ALTER TABLE registration DROP niveau04_id');
}
}

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;
@ -39,41 +36,49 @@ class CleanRegistrationCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{ {
$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;
@ -40,93 +38,102 @@ class CronCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{ {
$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('');
$this->writelnred(''); $this->writelnred('');
$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) {
$this->writelnred('JOB EN ERREUR .'.$e->getMessage());
$returnCode = Command::FAILURE;
} }
catch(\Exception $e) {
$this->writelnred("JOB EN ERREUR .".$e->getMessage());
$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
@ -48,455 +45,406 @@ class InitCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{ {
$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');
// On s'assure que le groupe tout le monde existe // On s'assure que le groupe tout le monde existe
$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());
$this->em->persist($niveau01); $this->em->persist($niveau01);
$this->em->flush(); $this->em->flush();
} }
// On s'assure que le user admin existe // On s'assure que le user admin existe
$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->setNiveau01($niveau01); $user->setNiveau01($niveau01);
$this->em->persist($user); $this->em->persist($user);
$this->em->flush(); $this->em->flush();
} }
// 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();
} }
} }
// 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,27 +453,29 @@ 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());
$this->em->persist($entity); $this->em->persist($entity);
} }
$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,12 +495,15 @@ 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;
@ -33,21 +31,19 @@ class SetPasswordCommand extends Command
->setName('app:SetPassword') ->setName('app:SetPassword')
->setDescription("Modifier le password d'un utilisateur") ->setDescription("Modifier le password d'un utilisateur")
->setHelp("Modifier le password d'un utilisateur") ->setHelp("Modifier le password d'un utilisateur")
->addArgument('username', InputArgument::OPTIONAL, 'username') ->addArgument('username', InputArgument::OPTIONAL, 'username')
->addArgument('password', InputArgument::OPTIONAL, 'password') ->addArgument('password', InputArgument::OPTIONAL, 'password')
; ;
} }
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{ {
$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');
$this->writelnred('=========================================================================================================='); $this->writelnred('==========================================================================================================');
$username = $input->getArgument('username'); $username = $input->getArgument('username');
@ -56,28 +52,31 @@ 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);
$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");
} }
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;
@ -43,85 +80,88 @@ class SynchroCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{ {
$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->host = $this->container->getParameter("ldapHost"); $this->synchropurgeuser = $this->container->getParameter('appSynchroPurgeUser');
$this->port = $this->container->getParameter("ldapPort");
$this->usetls = $this->container->getParameter("ldapUsetls");
$this->userwriter = $this->container->getParameter("ldapUserwriter");
$this->user = $this->container->getParameter("ldapUser");
$this->password = $this->container->getParameter("ldapPassword");
$this->basedn = $this->container->getParameter("ldapBasedn");
$this->baseorganisation = $this->container->getParameter("ldapBaseorganisation");
$this->baseniveau01 = $this->container->getParameter("ldapBaseniveau01");
$this->baseniveau02 = $this->container->getParameter("ldapBaseniveau02");
$this->basegroup = $this->container->getParameter("ldapBasegroup");
$this->baseuser = $this->container->getParameter("ldapBaseuser");
$this->username = $this->container->getParameter("ldapUsername");
$this->firstname = $this->container->getParameter("ldapFirstname");
$this->lastname = $this->container->getParameter("ldapLastname");
$this->email = $this->container->getParameter("ldapEmail");
$this->avatar = $this->container->getParameter("ldapAvatar");
$this->memberof = $this->container->getParameter("ldapMemberof");
$this->groupgid = $this->container->getParameter("ldapGroupgid");
$this->groupname = $this->container->getParameter("ldapGroupname");
$this->groupmember = $this->container->getParameter("ldapGroupmember");
$this->groupmemberisdn = $this->container->getParameter("ldapGroupmemberisdn");
$this->filtergroup = $this->container->getParameter("ldapFiltergroup");
$this->filteruser = $this->container->getParameter("ldapFilteruser");
switch($appSynchro){ $this->host = $this->container->getParameter('ldapHost');
case "LDAP2NINE": $this->port = $this->container->getParameter('ldapPort');
$return=$this->ldap2nine(); $this->usetls = $this->container->getParameter('ldapUsetls');
break; $this->userwriter = $this->container->getParameter('ldapUserwriter');
$this->user = $this->container->getParameter('ldapUser');
$this->password = $this->container->getParameter('ldapPassword');
$this->basedn = $this->container->getParameter('ldapBasedn');
$this->baseorganisation = $this->container->getParameter('ldapBaseorganisation');
$this->baseniveau01 = $this->container->getParameter('ldapBaseniveau01');
$this->baseniveau02 = $this->container->getParameter('ldapBaseniveau02');
$this->baseniveau03 = $this->container->getParameter('ldapBaseniveau03');
$this->baseniveau04 = $this->container->getParameter('ldapBaseniveau04');
$this->basegroup = $this->container->getParameter('ldapBasegroup');
$this->baseuser = $this->container->getParameter('ldapBaseuser');
$this->username = $this->container->getParameter('ldapUsername');
$this->firstname = $this->container->getParameter('ldapFirstname');
$this->lastname = $this->container->getParameter('ldapLastname');
$this->email = $this->container->getParameter('ldapEmail');
$this->avatar = $this->container->getParameter('ldapAvatar');
$this->memberof = $this->container->getParameter('ldapMemberof');
$this->groupgid = $this->container->getParameter('ldapGroupgid');
$this->groupname = $this->container->getParameter('ldapGroupname');
$this->groupmember = $this->container->getParameter('ldapGroupmember');
$this->groupmemberisdn = $this->container->getParameter('ldapGroupmemberisdn');
$this->filtergroup = $this->container->getParameter('ldapFiltergroup');
$this->filteruser = $this->container->getParameter('ldapFilteruser');
case "NINE2LDAP": switch ($appSynchro) {
$return=$this->nine2ldap(); case 'LDAP2NINE':
break; $return = $this->ldap2nine();
break;
case "NINE2NINE": case 'NINE2LDAP':
$return=$this->nine2nine(); $return = $this->nine2ldap();
break; break;
case 'NINE2NINE':
$return = $this->nine2nine();
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,240 +170,258 @@ 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());
$this->em->persist($group); $this->em->persist($group);
} }
$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->setIsvisible(true); $user->setIsvisible(true);
$user->setApikey(Uuid::uuid4()); $user->setApikey(Uuid::uuid4());
$user->setRole("ROLE_USER"); $user->setRole('ROLE_USER');
$user->setAvatar("noavatar.png"); $user->setAvatar('noavatar.png');
$uuid=Uuid::uuid4(); $uuid = Uuid::uuid4();
$user->setPassword("PWD-".$ldapentry[$this->username]."-".$uuid); $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());
$usergroup->setRolegroup(0); $usergroup->setRolegroup(0);
$this->em->persist($usergroup); $this->em->persist($usergroup);
$this->em->flush(); $this->em->flush();
} }
} }
} }
} }
// 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());
$this->em->remove($user); $this->em->remove($user);
$this->em->flush(); $this->em->flush();
@ -373,17 +431,16 @@ class SynchroCommand extends Command
} }
// 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,27 +448,28 @@ class SynchroCommand extends Command
$this->em->flush(); $this->em->flush();
} }
} }
} }
// 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);
} }
@ -419,32 +477,28 @@ class SynchroCommand extends Command
$this->em->flush(); $this->em->flush();
} }
} }
} }
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 ======================');
@ -455,352 +509,437 @@ 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")->findAll();
$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']]);
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)) {
$this->writeln($group->getLabel()." = SUBMIT");
$this->ldap->addGroup($group);
}
elseif($this->ldap->ismodifyGroup($group,$ldapentrys[0])) {
$this->writeln($group->getLabel()." = UPDATE");
$this->ldap->modifyGroup($group,$ldapentrys[0]["cn"]);
}
}
$ldapentrys=$this->ldap->search($this->filtergroup,$attributes,$this->basegroup); if (empty($ldapentrys)) {
foreach($ldapentrys as $ldapentry) { $this->writeln($group->getLabel().' = SUBMIT');
$group=$this->em->getRepository("App\Entity\Group")->find($ldapentry["gidnumber"]); $this->ldap->addGroup($group);
if(!$group) { } elseif ($this->ldap->ismodifyGroup($group, $ldapentrys[0])) {
$this->writeln($ldapentry["cn"]." = DELETE"); $this->writeln($group->getLabel().' = UPDATE');
$dn=$this->ldap->getGroupDN($ldapentry["cn"]); $this->ldap->modifyGroup($group, $ldapentrys[0]['cn']);
$this->ldap->deleteByDN($dn); }
}
$ldapentrys = $this->ldap->search($this->filtergroup, $attributes, $this->basegroup);
foreach ($ldapentrys as $ldapentry) {
$group = $this->em->getRepository("App\Entity\Group")->find($ldapentry['gidnumber']);
if (!$group) {
$this->writeln($ldapentry['cn'].' = DELETE');
$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->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])) {
$this->writeln($niveau02->getLabel().' = UPDATE');
$this->ldap->modifyNiveau02($niveau02, $ldapentrys[0]['cn']);
} }
elseif($this->ldap->ismodifyNiveau02($niveau02,$ldapentrys[0])) { }
$this->writeln($niveau02->getLabel()." = UPDATE");
$this->ldap->modifyNiveau02($niveau02,$ldapentrys[0]["cn"]); $ldapentrys = $this->ldap->search($this->filtergroup, $attributes, $this->baseniveau02);
} foreach ($ldapentrys as $ldapentry) {
} $niveau02 = $this->em->getRepository("App\Entity\Niveau02")->find($ldapentry['gidnumber']);
if (!$niveau02) {
$ldapentrys=$this->ldap->search($this->filtergroup,$attributes,$this->baseniveau02); $this->writeln($ldapentry['cn'].' = DELETE');
foreach($ldapentrys as $ldapentry) { $dn = $this->ldap->getNiveau02DN($ldapentry['cn']);
$niveau02=$this->em->getRepository("App\Entity\Niveau02")->find($ldapentry["gidnumber"]); $this->ldap->deleteByDN($dn);
if(!$niveau02) {
$this->writeln($ldapentry["cn"]." = DELETE");
$dn=$this->ldap->getNiveau02DN($ldapentry["cn"]);
$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);
} }
} }
return Command::SUCCESS; return Command::SUCCESS;
} }
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;
$fgsynchropurgegroups = $this->synchropurgegroup;
$fgsynchropurgeusers = $this->synchropurgeuser;
$fgsynchropurgeniveau01s=($this->synchropurgeniveau01);
$fgsynchropurgegroups=($this->synchropurgegroup);
$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);
} }
$niveau01->setIdexternal($nineniveau01->niveau01id); $niveau01->setIdexternal($nineniveau01->niveau01id);
$niveau01->setLabel($nineniveau01->niveau01label); $niveau01->setLabel($nineniveau01->niveau01label);
$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);
} }
} }
} }
$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());
$this->em->persist($group); $this->em->persist($group);
} }
$group->setIdexternal($ninegroup->groupid); $group->setIdexternal($ninegroup->groupid);
$group->setLabel($ninegroup->grouplabel); $group->setLabel($ninegroup->grouplabel);
$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->setIsvisible(true); $user->setIsvisible(true);
$user->setApikey(Uuid::uuid4()); $user->setApikey(Uuid::uuid4());
$user->setRole("ROLE_USER"); $user->setRole('ROLE_USER');
$user->setAvatar($nineuser->useravatar); $user->setAvatar($nineuser->useravatar);
$uuid=Uuid::uuid4(); $uuid = Uuid::uuid4();
$user->setPassword("PWD-".$nineuser->userlogin."-".$uuid); $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());
$usergroup->setRolegroup(0); $usergroup->setRolegroup(0);
$this->em->persist($usergroup); $this->em->persist($usergroup);
$this->em->flush(); $this->em->flush();
} }
} }
} }
} }
// 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();
} }
@ -808,16 +947,15 @@ 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());
$this->em->remove($user); $this->em->remove($user);
$this->em->flush(); $this->em->flush();
@ -827,17 +965,16 @@ class SynchroCommand extends Command
} }
// 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);
} }
@ -845,27 +982,28 @@ class SynchroCommand extends Command
$this->em->flush(); $this->em->flush();
} }
} }
} }
// 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);
} }
@ -873,67 +1011,61 @@ class SynchroCommand extends Command
$this->em->flush(); $this->em->flush();
} }
} }
} }
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);
$user->setLastname($lastname); $user->setLastname($lastname);
$user->setFirstname($firstname); $user->setFirstname($firstname);
$user->setEmail($email); $user->setEmail($email);
$user->setNiveau01($niveau01); $user->setNiveau01($niveau01);
$user->setSiren($niveau01->getSiren()); $user->setSiren($niveau01->getSiren());
$user->setVisible(true); $user->setVisible(true);
$user->setAuthlevel("simple"); $user->setAuthlevel('simple');
$user->setBelongingpopulation("agent"); $user->setBelongingpopulation('agent');
$uuid=Uuid::uuid4(); $uuid = Uuid::uuid4();
$user->setPassword("PWD-".$username."-".$uuid); $user->setPassword('PWD-'.$username.'-'.$uuid);
if(in_array($username,$usersadmin)) if (in_array($username, $usersadmin)) {
$user->setRole("ROLE_ADMIN"); $user->setRole('ROLE_ADMIN');
else { } else {
$user->setRole("ROLE_USER"); $user->setRole('ROLE_USER');
}
// Si modèle scribe
$ldap_template = $this->container->getParameter('ldap_template');
if($ldap_template=="scribe") {
$ldapfilter="(|(&(uid=".$user->getUsername().")(ENTPersonProfils=enseignant))(&(uid=".$user->getUsername().")(typeadmin=0))(&(uid=".$user->getUsername().")(typeadmin=2)))";
$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,38 +1,36 @@
<?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
{
$datas = $em->getRepository($this->entity)->findBy(["entityname"=>$entityname]);
return $this->render($this->twig.'list.html.twig',[ public function list($entityname, $access, ManagerRegistry $em): Response
$this->data."s" => $datas, {
"entityname" => $entityname, $datas = $em->getRepository($this->entity)->findBy(['entityname' => $entityname]);
"useheader"=>true,
"usemenu"=>false, return $this->render($this->twig.'list.html.twig', [
"usesidebar"=>true, $this->data.'s' => $datas,
'entityname' => $entityname,
'useheader' => true,
'usemenu' => false,
'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") {
$user=$em->getRepository("App\Entity\User")->find($entityid); $user=$em->getRepository("App\Entity\User")->find($entityid);
@ -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,86 +1,87 @@
<?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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute($this->route); return $this->redirectToRoute($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,
$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);
} }
public function logo($access): Response public function logo($access): Response
{ {
return $this->render($this->twig.'logo.html.twig'); return $this->render($this->twig.'logo.html.twig');
} }
} }

View File

@ -2,185 +2,186 @@
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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute($this->route); return $this->redirectToRoute($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,
$this->data => $data, $this->data => $data,
'mode' => 'update', 'mode' => 'update',
'form' => $form->createView(), 'form' => $form->createView(),
'access' => $access, 'access' => $access,
]); ]);
} }
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,
]); ]);
} }
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();
if($fs->exists($file)) {
$response = new BinaryFileResponse($file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
return $response;
}
else return $this->redirectToRoute($this->route."_log");
}
protected function getErrorForm($id,$form,$request,$data,$mode) {
if ($form->get('submit')->isClicked()&&$mode=="delete") {
} }
if ($form->get('submit')->isClicked() && $mode=="submit") { $fs = new Filesystem();
if ($fs->exists($file)) {
$response = new BinaryFileResponse($file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
return $response;
} else {
return $this->redirectToRoute($this->route.'_log');
}
}
protected function getErrorForm($id, $form, $request, $data, $mode)
{
if ($form->get('submit')->isClicked() && 'delete' == $mode) {
}
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;
case 'hero':
$max_height = 1600;
$max_width = 1600;
$ratio = '16:9';
break;
case 'image':
$max_height = 1600;
$max_width = 1600;
$ratio = '1:1';
break; break;
case "hero":
$max_height=1600;
$max_width=1600;
$ratio="16:9";
break;
case "image":
$max_height=1600;
$max_width=1600;
$ratio="1:1";
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 {
else $scale=1; $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,132 +108,141 @@ 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', [
'useheader' => false, 'useheader' => false,
'usesidebar' => false, 'usesidebar' => false,
'form' => $form->createView(), 'form' => $form->createView(),
'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); {
$height = $size[1]; $size = getimagesize($image);
return $height; $height = $size[1];
}
// Cacul de la largeur return $height;
protected function getWidth($image) { }
$size = getimagesize($image);
$width = $size[0];
return $width;
}
protected function resizeImage($image,$width,$height,$scale) { // Cacul de la largeur
list($imagewidth, $imageheight, $imageType) = getimagesize($image); protected function getWidth($image)
$imageType = image_type_to_mime_type($imageType); {
$newImageWidth = ceil($width * $scale); $size = getimagesize($image);
$newImageHeight = ceil($height * $scale); $width = $size[0];
$newImage = imagecreatetruecolor($newImageWidth,$newImageHeight);
switch($imageType) {
case "image/gif":
$source=imagecreatefromgif($image);
break;
case "image/pjpeg":
case "image/jpeg":
case "image/jpg":
$source=imagecreatefromjpeg($image);
break;
case "image/png":
case "image/x-png":
$source=imagecreatefrompng($image);
break;
}
imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height);
switch($imageType) { return $width;
case "image/gif": }
imagegif($newImage,$image);
break;
case "image/pjpeg":
case "image/jpeg":
case "image/jpg":
imagejpeg($newImage,$image,90);
break;
case "image/png":
case "image/x-png":
imagepng($newImage,$image);
break;
}
chmod($image, 0640); protected function resizeImage($image, $width, $height, $scale)
return $image; {
} list($imagewidth, $imageheight, $imageType) = getimagesize($image);
$imageType = image_type_to_mime_type($imageType);
$newImageWidth = ceil($width * $scale);
$newImageHeight = ceil($height * $scale);
$newImage = imagecreatetruecolor($newImageWidth, $newImageHeight);
$source = null;
protected function resizeThumbnailImage($thumb_image_name, $image, $width, $height, $start_width, $start_height, $scale){ switch ($imageType) {
case 'image/gif':
$source = imagecreatefromgif($image);
break;
case 'image/pjpeg':
case 'image/jpeg':
case 'image/jpg':
$source = imagecreatefromjpeg($image);
break;
case 'image/png':
case 'image/x-png':
$source = imagecreatefrompng($image);
break;
}
imagecopyresampled($newImage, $source, 0, 0, 0, 0, $newImageWidth, $newImageHeight, $width, $height);
switch ($imageType) {
case 'image/gif':
imagegif($newImage, $image);
break;
case 'image/pjpeg':
case 'image/jpeg':
case 'image/jpg':
imagejpeg($newImage, $image, 90);
break;
case 'image/png':
case 'image/x-png':
imagepng($newImage, $image);
break;
}
chmod($image, 0640);
return $image;
}
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);
list($imagewidth, $imageheight, $imageType) = getimagesize($image);
$imageType = image_type_to_mime_type($imageType);
$newImageWidth = ceil($width * $scale);
$newImageHeight = ceil($height * $scale);
$newImageWidth=900;
$newImageHeight=900;
$newImage = imagecreatetruecolor($newImageWidth,$newImageHeight);
list($imagewidth, $imageheight, $imageType) = getimagesize($image);
$imageType = image_type_to_mime_type($imageType);
$newImageWidth = ceil($width * $scale);
$newImageHeight = ceil($height * $scale);
$newImageWidth = 900;
$newImageHeight = 900;
$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,690 +1,750 @@
<?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' => ('user' != $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 ('user' == $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 ('user' == $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 ('user' == $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 'user':
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 .= "<img src='".$this->generateUrl('app_minio_image', ['file' => 'avatar/'.$data->getOwner()->getAvatar()])."' class='avatar'>";
$userinfo.="<br>".$data->getOwner()->getUsername(); $userinfo .= '<br>'.$data->getOwner()->getUsername();
} }
$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 ('user' == $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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$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' => ('user' != $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' => ('user' == $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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$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' => ('user' != $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' => ('user' == $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));
}
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
}
public function users($id,$access,Request $request,ManagerRegistry $em) return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
{ }
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' => ('user' != $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();
$start = $query['start'];
$length = $query['length'];
$search = $query['search'];
$draw = $query['draw'];
$ordercolumn = $query['order'][0]['column'];
$orderdir = $query['order'][0]['dir'];
$usermodo = null;
$niveau01 = null;
$niveau02 = null;
$niveau03 = null;
$niveau04 = null;
$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'];
// 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); ->setParameter('groupid', $id);
break;
case "modo":
$usermodo=$this->getUser()->getId();
$qb->select('COUNT(user)')
->from('App:User','user')
->from('App:UserModo','usermodo')
->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->andWhere("usermodo.niveau01 = user.niveau01")
->andWhere("usermodo.user = :userid")
->setParameter("userid", $usermodo)
->setParameter("groupid",$id);
break;
case "user":
$niveau01=$this->getUser()->getNiveau01();
$niveau02=$this->getUser()->getNiveau02();
$qb->select('COUNT(user)')
->from('App:User','user')
->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->setParameter("groupid",$id);
switch($request->getSession()->get("scopeannu")) {
case "SAME_NIVEAU01":
$qb->andWhere("user.niveau01 = :niveau01")->setParameter("niveau01",$niveau01);
break;
case "SAME_NIVEAU02":
$qb->andWhere("user.niveau02 = :niveau02")->setParameter("niveau02",$niveau02);
break;
}
break;
}
$total=$qb->getQuery()->getSingleScalarResult();
// Nombre d'enregistrement filtré
if($search["value"]=="")
$totalf = $total;
else {
switch($access) {
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; break;
case "modo": case 'modo':
$usermodo = $this->getUser()->getId();
$qb->select('COUNT(user)')
->from('App:User', 'user')
->from('App:UserModo', 'usermodo')
->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere('usermodo.user = :userid')
->setParameter('userid', $usermodo)
->setParameter('groupid', $id);
break;
case 'user':
$niveau01 = $this->getUser()->getNiveau01();
$niveau02 = $this->getUser()->getNiveau02();
$niveau03 = $this->getUser()->getNiveau03();
$niveau04 = $this->getUser()->getNiveau04();
$qb->select('COUNT(user)')
->from('App:User', 'user')
->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->setParameter('groupid', $id);
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;
}
$total = $qb->getQuery()->getSingleScalarResult();
$totalf = null;
// Nombre d'enregistrement filtré
if ('' == $search['value']) {
$totalf = $total;
} else {
switch ($access) {
case 'admin':
$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") ->setParameter('value', '%'.$search['value'].'%')
->andWhere("usermodo.user = :userid") ->setParameter('groupid', $id)
->setParameter("userid", $usermodo)
->setParameter("value", "%".$search["value"]."%")
->setParameter("groupid",$id)
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
break; break;
case "user": case 'modo':
$totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(user)')
->from('App:User', 'user')
->from('App:UserModo', 'usermodo')
->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere('usermodo.user = :userid')
->setParameter('userid', $usermodo)
->setParameter('value', '%'.$search['value'].'%')
->setParameter('groupid', $id)
->getQuery()
->getSingleScalarResult();
break;
case 'user':
$qb = $em->getManager()->createQueryBuilder() $qb = $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()->not($qb->expr()->exists($sub->getDQL()))) ->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())))
->setParameter("value", "%".$search["value"]."%") ->setParameter('value', '%'.$search['value'].'%')
->setParameter("groupid",$id); ->setParameter('groupid', $id);
switch($request->getSession()->get("scopeannu")) {
case "SAME_NIVEAU01":
$qb->andWhere("user.niveau01 = :niveau01")->setParameter("niveau01",$niveau01);
break;
case "SAME_NIVEAU02":
$qb->andWhere("user.niveau02 = :niveau02")->setParameter("niveau02",$niveau02);
break;
}
$totalf=$qb->getQuery()->getSingleScalarResult(); 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;
}
$totalf = $qb->getQuery()->getSingleScalarResult();
break;
}
}
// Construction du tableau de retour
$output = [
'draw' => $draw,
'recordsFiltered' => $totalf,
'recordsTotal' => $total,
'data' => [],
];
// Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder();
$qb->select('user')->from('App:User', 'user');
switch ($access) {
case 'admin':
$qb->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())));
break; break;
}
}
// Construction du tableau de retour case 'modo':
$output = array( $qb->from('App:UserModo', 'usermodo')
'draw' => $draw,
'recordsFiltered' => $totalf,
'recordsTotal' => $total,
'data' => array(),
);
// Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder();
$qb->select('user')->from("App:User",'user');
switch($access) {
case "admin":
$qb->where($qb->expr()->not($qb->expr()->exists($sub->getDQL())));
break;
case "modo":
$qb->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); ->setParameter('userid', $usermodo);
break; break;
case "user": case 'user':
$qb->where($qb->expr()->not($qb->expr()->exists($sub->getDQL()))); $qb->where($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; 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;
} }
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="<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(),"",""));
}
// Retour
return new JsonResponse($output);
}
public function usersin($id,$access,Request $request,ManagerRegistry $em)
{
// Récupération de l'enregistrement courant
$group=$em->getRepository($this->entity)->find($id);
if (!$group) throw $this->createNotFoundException('Unable to find entity.');
// Controler les permissions
$this->canseemember($access,$group,$em);
$sub = $em->getManager()->createQueryBuilder();
$sub->select("usergroup");
$sub->from("App:UserGroup","usergroup");
$sub->andWhere('usergroup.user = user.id');
$sub->andWhere('usergroup.group = :groupid');
$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'];
// Nombre total d'enregistrement
$qb = $em->getManager()->createQueryBuilder();
if($access=="admin"||$access=="user")
$qb->select('COUNT(user)')
->from('App:User','user')
->where($qb->expr()->exists($sub->getDQL()))
->setParameter("groupid",$id);
else {
$usermodo=$this->getUser()->getId();
$qb->select('COUNT(user)')
->from('App:User','user')
->from('App:UserModo','usermodo')
->where($qb->expr()->exists($sub->getDQL()))
->andWhere("usermodo.niveau01 = user.niveau01")
->andWhere("usermodo.user = :userid")
->setParameter("userid", $usermodo)
->setParameter("groupid",$id);
}
$total=$qb->getQuery()->getSingleScalarResult();
// Nombre d'enregistrement filtré
if($search["value"]=="")
$totalf = $total;
else {
if($access=="admin"||$access=="user")
$totalf= $em->getManager()->createQueryBuilder()
->select('COUNT(user)')
->from('App:User','user')
->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->exists($sub->getDQL()))
->setParameter("value", "%".$search["value"]."%")
->setParameter("groupid",$id)
->getQuery()
->getSingleScalarResult();
else
$totalf= $em->getManager()->createQueryBuilder()
->select('COUNT(user)')
->from('App:User','user')
->from('App:UserModo','usermodo')
->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->exists($sub->getDQL()))
->andWhere("usermodo.niveau01 = user.niveau01")
->andWhere("usermodo.user = :userid")
->setParameter("userid", $usermodo)
->setParameter("value", "%".$search["value"]."%")
->setParameter("groupid",$id)
->getQuery()
->getSingleScalarResult();
}
// Construction du tableau de retour
$output = array(
'draw' => $draw,
'recordsFiltered' => $totalf,
'recordsTotal' => $total,
'data' => array(),
);
// Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder();
$qb->select('user')->from("App:User",'user');
if($access=="admin"||$access=="user")
$qb->where($qb->expr()->exists($sub->getDQL()));
else
$qb->from('App:UserModo','usermodo')
->where($qb->expr()->exists($sub->getDQL()))
->andWhere("usermodo.niveau01 = user.niveau01")
->andWhere("usermodo.user = :userid")
->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) {
case 2 :
$qb->orderBy('user.username',$orderdir);
break;
case 3 :
$qb->orderBy('user.email',$orderdir);
break;
}
$datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach($datas as $data) {
// Propriétaire
$usergroup=$em->getRepository("App\Entity\UserGroup")->findOneBy(["user"=>$data->getId(),"group"=>$id]);
$fgproprio=($usergroup->getUser()==$group->getOwner());
$fgme=($usergroup->getUser()==$this->getUser()&&$access!="admin");
// Action
$action = "";
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>";
// Avatar
$avatar="<img src='".$this->generateUrl('app_minio_image',["file"=>"avatar/".$data->getAvatar()])."' class='avatar'>";
// Flag manager
$rolegroup="";
if($fgproprio) $rolegroup="Propriétaire du groupe";
elseif($this->canupdatemember($access,$group,$em,false)&&!$fgme) {
$selectuser=($usergroup->getRolegroup()==0?"selected='selected'":"");
$selectwritter=($usergroup->getRolegroup()==50?"selected='selected'":"");
$selectmanager=($usergroup->getRolegroup()==90?"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>';
} }
else $rolegroup=($usergroup->getRolegroup()==0?"Utilisateur":($usergroup->getRolegroup()==50?"Collaborateur":"Gestionnaire"));
// Avatar
$tmp=array("DT_RowId"=>"user".$data->getId(),$action,$avatar,$data->getUsername(),$data->getEmail(),$rolegroup); $avatar = "<img src='".$this->generateUrl('app_minio_image', ['file' => 'avatar/'.$data->getAvatar()])."' class='avatar'>";
array_push($output["data"],$tmp);
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 useradd($groupid,$userid,$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($groupid); $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.');
}
$user=$em->getRepository("App\Entity\User")->find($userid); // Controler les permissions
if (!$user) throw $this->createNotFoundException('Unable to find entity.'); $this->canseemember($access, $group, $em);
$output=array(); $sub = $em->getManager()->createQueryBuilder();
$this->canupdatemember($access,$group,$em,true); $sub->select('usergroup');
$sub->from('App:UserGroup', 'usergroup');
$sub->andWhere('usergroup.user = user.id');
$sub->andWhere('usergroup.group = :groupid');
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(array("user"=>$user,"group"=>$group)); $query = $request->query->all();
if($usergroup) return new JsonResponse($output); $start = $query['start'];
$length = $query['length'];
$search = $query['search'];
$draw = $query['draw'];
$ordercolumn = $query['order'][0]['column'];
$orderdir = $query['order'][0]['dir'];
$usermodo = null;
$usergroup=new UserGroup(); // Nombre total d'enregistrement
$qb = $em->getManager()->createQueryBuilder();
if ('admin' == $access || 'user' == $access) {
$qb->select('COUNT(user)')
->from('App:User', 'user')
->where($qb->expr()->exists($sub->getDQL()))
->setParameter('groupid', $id);
} else {
$usermodo = $this->getUser()->getId();
$qb->select('COUNT(user)')
->from('App:User', 'user')
->from('App:UserModo', 'usermodo')
->where($qb->expr()->exists($sub->getDQL()))
->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere('usermodo.user = :userid')
->setParameter('userid', $usermodo)
->setParameter('groupid', $id);
}
$total = $qb->getQuery()->getSingleScalarResult();
// Nombre d'enregistrement filtré
if ('' == $search['value']) {
$totalf = $total;
} else {
if ('admin' == $access || 'user' == $access) {
$totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(user)')
->from('App:User', 'user')
->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->exists($sub->getDQL()))
->setParameter('value', '%'.$search['value'].'%')
->setParameter('groupid', $id)
->getQuery()
->getSingleScalarResult();
} else {
$totalf = $em->getManager()->createQueryBuilder()
->select('COUNT(user)')
->from('App:User', 'user')
->from('App:UserModo', 'usermodo')
->where('user.username LIKE :value OR user.email LIKE :value')
->andWhere($qb->expr()->exists($sub->getDQL()))
->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere('usermodo.user = :userid')
->setParameter('userid', $usermodo)
->setParameter('value', '%'.$search['value'].'%')
->setParameter('groupid', $id)
->getQuery()
->getSingleScalarResult();
}
}
// Construction du tableau de retour
$output = [
'draw' => $draw,
'recordsFiltered' => $totalf,
'recordsTotal' => $total,
'data' => [],
];
// Parcours des Enregistrement
$qb = $em->getManager()->createQueryBuilder();
$qb->select('user')->from('App:User', 'user');
if ('admin' == $access || 'user' == $access) {
$qb->where($qb->expr()->exists($sub->getDQL()));
} else {
$qb->from('App:UserModo', 'usermodo')
->where($qb->expr()->exists($sub->getDQL()))
->andWhere('usermodo.niveau01 = user.niveau01')
->andWhere('usermodo.user = :userid')
->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) {
case 2:
$qb->orderBy('user.username', $orderdir);
break;
case 3:
$qb->orderBy('user.email', $orderdir);
break;
}
$datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
foreach ($datas as $data) {
// Propriétaire
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $data->getId(), 'group' => $id]);
$fgproprio = ($usergroup->getUser() == $group->getOwner());
$fgme = ($usergroup->getUser() == $this->getUser() && 'admin' != $access);
// Action
$action = '';
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>";
}
// Avatar
$avatar = "<img src='".$this->generateUrl('app_minio_image', ['file' => 'avatar/'.$data->getAvatar()])."' class='avatar'>";
// Flag manager
$rolegroup = '';
if ($fgproprio) {
$rolegroup = 'Propriétaire du groupe';
} elseif ($this->canupdatemember($access, $group, $em, false) && !$fgme) {
$selectuser = (0 == $usergroup->getRolegroup() ? "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>';
} else {
$rolegroup = (0 == $usergroup->getRolegroup() ? 'Utilisateur' : (50 == $usergroup->getRolegroup() ? 'Collaborateur' : 'Gestionnaire'));
}
$tmp = ['DT_RowId' => 'user'.$data->getId(), $action, $avatar, $data->getUsername(), $data->getEmail(), $rolegroup];
array_push($output['data'], $tmp);
}
// Retour
return new JsonResponse($output);
}
public function useradd($groupid, $userid, $access, Request $request, ManagerRegistry $em)
{
// Récupération de l'enregistrement courant
$group = $em->getRepository($this->entity)->find($groupid);
if (!$group) {
throw $this->createNotFoundException('Unable to find entity.');
}
$user = $em->getRepository("App\Entity\User")->find($userid);
if (!$user) {
throw $this->createNotFoundException('Unable to find entity.');
}
$output = [];
$this->canupdatemember($access, $group, $em, true);
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $user, 'group' => $group]);
if ($usergroup) {
return new JsonResponse($output);
}
$usergroup = new UserGroup();
$usergroup->setUser($user); $usergroup->setUser($user);
$usergroup->setGroup($group); $usergroup->setGroup($group);
$usergroup->setApikey(Uuid::uuid4()); $usergroup->setApikey(Uuid::uuid4());
@ -692,126 +752,170 @@ class GroupController extends AbstractController
$em->getManager()->persist($usergroup); $em->getManager()->persist($usergroup);
$em->getManager()->flush(); $em->getManager()->flush();
// Retour // Retour
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();
} }
// Retour // Retour
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(array("user"=>$user,"group"=>$group)); $usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['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();
} }
// Retour // Retour
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
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));
if($usergroup) {
$em->getManager()->remove($usergroup);
$em->getManager()->flush();
}
} }
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)); // 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))) {
$usergroup = $em->getRepository("App\Entity\UserGroup")->findOneBy(['user' => $this->getUser(), 'group' => $group]);
if ($usergroup) {
$em->getManager()->remove($usergroup);
$em->getManager()->flush();
}
}
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 'user': 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 'user':
else $toreturn=true; if (!$entity->isIsworkgroup() || $entity->getOwner() != $this->getUser()) {
break; $toreturn = false;
} else {
$toreturn = true;
}
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;
break; case 'user':
$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;
} }
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 'user':
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) {
break; $toreturn = false;
} elseif ($usergroup->getRolegroup() < 90) {
$toreturn = false;
} else {
$toreturn = true;
}
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;
@ -29,19 +26,19 @@ 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
if (!$challenge) { if (!$challenge) {
throw new BadRequestException('pas de challenge'); throw new BadRequestException('pas de challenge');
} }
// 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);
@ -51,60 +48,65 @@ 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
if (!$challenge) { if (!$challenge) {
throw new BadRequestException('pas de challenge'); throw new BadRequestException('pas de challenge');
} }
// 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);
@ -114,62 +116,66 @@ 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')]))
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')];
}
$response = $this->apiservice->run("PUT",$this->getParameter('hydraLoginchallengeaccept').$request->getSession()->get('hydraChallenge'),["subject"=>$email,"acr"=>"string"]); $response = $this->apiservice->run('PUT', $this->getParameter('hydraLoginchallengeaccept').$request->getSession()->get('hydraChallenge'), ['subject' => $email, '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"=>$username, 'username' => $username,
"email"=>$email, 'email' => $email,
"firstname"=>$firstname, 'firstname' => $firstname,
"lastname"=>$lastname 'lastname' => $lastname,
]; ];
$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 consent(Request $request) public function consent(Request $request)
{ {
$challenge = $request->query->get('consent_challenge'); $challenge = $request->query->get('consent_challenge');
@ -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,[ $response = $this->apiservice->run('PUT', $this->getParameter('hydraConsentchallengeaccept').$challenge, [
'grant_scope' => ['openid', 'offline_access'], 'grant_scope' => ['openid', 'offline_access'],
'session' => ['id_token' => $request->getSession()->get('datas')] 'session' => ['id_token' => $request->getSession()->get('datas')],
]); ]);
if(!$response) if (!$response) {
throw new BadRequestException('challenge not accept'); throw new BadRequestException('challenge not accept');
}
$redirect = $response->body->redirect_to;
$redirect=$response->body->redirect_to;
return $this->redirect($redirect, 301); 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,54 +20,54 @@ 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');
$extention = $tmpfile->getClientOriginalExtension(); $extention = $tmpfile->getClientOriginalExtension();
// 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
$targetName = uniqid().".".$extention;
$targetFile = "ckeditor/".$targetName;
$targetUrl = $this->generateUrl('app_minio_document',["file"=>"ckeditor/".$targetName]);
//move_uploaded_file($tmpfile,$targetFile); // Fichier cible
$this->minio->upload($tmpfile,$targetFile,true); $targetName = uniqid().'.'.$extention;
$targetFile = 'ckeditor/'.$targetName;
$output["uploaded"]=1; $targetUrl = $this->generateUrl('app_minio_document', ['file' => 'ckeditor/'.$targetName]);
$output["fileName"]=$targetName;
$output["url"]=$targetUrl; // move_uploaded_file($tmpfile,$targetFile);
$this->minio->upload($tmpfile, $targetFile, true);
$output['uploaded'] = 1;
$output['fileName'] = $targetName;
$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);
} }
@ -75,7 +76,7 @@ class MinioController extends AbstractController
$filePath = $this->minio->download($file, $file, true); $filePath = $this->minio->download($file, $file, true);
$content = file_get_contents($filePath); $content = file_get_contents($filePath);
} }
break; break;
} }
return new Response($content, 200, [ return new Response($content, 200, [
@ -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,127 +1,129 @@
<?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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
// Sauvegarde // Sauvegarde
$em->getManager()->persist($data); $em->getManager()->persist($data);
$em->getManager()->flush(); $em->getManager()->flush();
@ -129,73 +131,77 @@ class Niveau01Controller extends AbstractController
// Retour à la liste // Retour à la liste
return $this->redirectToRoute($this->route); return $this->redirectToRoute($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',
"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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute($this->route); return $this->redirectToRoute($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,
$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) {
$request->getSession()->getFlashBag()->add('error', $e->getMessage());
return $this->redirectToRoute($this->route.'_update', ['id' => $id]);
} }
catch (\Exception $e) {
$request->getSession()->getFlashBag()->add("error", $e->getMessage());
return $this->redirectToRoute($this->route."_update",["id"=>$id]);
}
return $this->redirectToRoute($this->route); return $this->redirectToRoute($this->route);
} }
} }

View File

@ -1,326 +1,337 @@
<?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;
} }
} }
// 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;
}
public function submit($access,Request $request,ManagerRegistry $em): Response return $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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
// 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"=>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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
$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,
$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));
}
private function cansubmit($access,$em) { return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
switch($access) { }
case "admin" : return true; break;
case "modo" : return true; break; 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'); 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;
} }
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
} }
} }

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])
); );
@ -35,4 +36,4 @@ class PublishController extends AbstractController
return new Response('published!'); return new Response('published!');
} }
} }

View File

@ -2,224 +2,231 @@
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;
} }
public function list($access) public function list($access)
{ {
$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,
'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']; $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 :
$qb->orderBy('entity.statut',$orderdir);
break;
case 5 : case 7:
$qb->orderBy('entity.keyexpire',$orderdir); $qb->orderBy('entity.statut', $orderdir);
break; break;
case 8:
$qb->orderBy('entity.keyexpire', $orderdir);
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' => 'user',
"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()) {
@ -228,79 +235,78 @@ class RegistrationController extends AbstractController
$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');
// 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;
$this->mail->sendEmail($subject, $body, $to, $from, $fromName); $this->mail->sendEmail($subject, $body, $to, $from, $fromName);
// 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,88 +314,94 @@ 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;
$this->mail->sendEmail($subject, $body, $to, $from, $fromName); $this->mail->sendEmail($subject, $body, $to, $from, $fromName);
} }
// Sauvegarde // Sauvegarde
$em->getManager()->persist($data); $em->getManager()->persist($data);
$em->getManager()->flush(); $em->getManager()->flush();
// 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,
'usesidebar' => false, 'usesidebar' => false,
'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,
'usesidebar' => false, 'usesidebar' => false,
'maxwidth' => true, 'maxwidth' => true,
'info' => $info, 'info' => $info,
'mode' => $mode, 'mode' => $mode,
'redirectto' => $redirectto, 'redirectto' => $redirectto,
]); ]);
} }
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);
// Sur validation // Sur validation
if ($form->get('save')->isClicked() && $form->isValid()) { if ($form->get('save')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
@ -398,19 +410,19 @@ 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
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
$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
@ -421,11 +433,11 @@ 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;
$this->mail->sendEmail($subject, $body, $to, $from, $fromName); $this->mail->sendEmail($subject, $body, $to, $from, $fromName);
@ -433,60 +445,60 @@ 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
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,
$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());
@ -500,12 +512,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);
@ -515,77 +529,79 @@ class RegistrationController extends AbstractController
$em->getManager()->remove($data); $em->getManager()->remove($data);
$em->getManager()->flush(); $em->getManager()->flush();
} }
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) {
$request->getSession()->getFlashBag()->add('error', $e->getMessage());
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
} }
catch (\Exception $e) {
$request->getSession()->getFlashBag()->add("error", $e->getMessage()); return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
return $this->redirectToRoute(str_replace("_admin_","_".$access."_",$this->route)."_update",["id"=>$id]);
}
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,67 +612,68 @@ 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);
return $this->redirectToRoute('app_registration_info'); return $this->redirectToRoute('app_registration_info');
} }
// Affichage du formulaire // Affichage du formulaire
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(),
]); ]);
} }
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);
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
$user->setKeyvalue(null); $user->setKeyvalue(null);
@ -664,74 +681,85 @@ class RegistrationController extends AbstractController
$user->setPassword($data->getPassword()); $user->setPassword($data->getPassword());
// 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');
} }
// Affichage du formulaire // Affichage du formulaire
return $this->render($this->twig.'resetpwd02.html.twig', [ return $this->render($this->twig.'resetpwd02.html.twig', [
'useheader' => true, 'useheader' => true,
'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)
{
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 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');
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,22 +2,21 @@
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(
* response=200, * response=200,
* description="get all users" * description="get all users"
@ -31,35 +30,33 @@ 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(
* response=200, * response=200,
* description="get one user by login" * description="get one user by login"
@ -80,36 +77,36 @@ 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(
* response=200, * response=200,
* description="get all niveau01" * description="get all niveau01"
@ -123,34 +120,33 @@ 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(
* response=200, * response=200,
* description="get one niveau01 by label" * description="get one niveau01 by label"
@ -171,36 +167,36 @@ 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(
* response=200, * response=200,
* description="get all niveau02" * description="get all niveau02"
@ -214,34 +210,33 @@ 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(
* response=200, * response=200,
* description="get one niveau02 by label" * description="get one niveau02 by label"
@ -262,36 +257,216 @@ 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);
} }
/**
* 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);
}
/** /**
* getAllGroups * 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/getAllGroups") * @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")
* @OA\Response( * @OA\Response(
* response=200, * response=200,
* description="get all group" * description="get all group"
@ -305,35 +480,36 @@ 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(
* response=200, * response=200,
* description="get one group by label" * description="get one group by label"
@ -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(empty($output["usergroups"])) $output["usergroups"]=null; if ($groupFormat) {
return $output; array_push($output['usergroups'], $groupFormat);
}
private function niveau01Format($niveau01,$withmembers=false){
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; }
if (empty($output['usergroups'])) {
$output['usergroups'] = 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 = [];
$output['niveau01id'] = $niveau01->getId();
$output['niveau01label'] = $niveau01->getLabel();
if($withmembers) { if ($withmembers) {
$output["niveau02niveau01"]=$this->niveau01Format($niveau02->getNiveau01()); $output['niveau01users'] = [];
$output["niveau02users"]=[]; foreach ($niveau01->getUsers() as $user) {
foreach($niveau02->getUsers() as $user) { array_push($output['niveau01users'], ['userid' => $user->getId(), 'userlogin' => $user->getUsername()]);
array_push($output["niveau02users"],["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 = [];
$output['niveau02id'] = $niveau02->getId();
$output['niveau02label'] = $niveau02->getLabel();
if($withmembers) { if ($withmembers) {
$output["groupusers"]=[]; $output['niveau02niveau01'] = $this->niveau01Format($niveau02->getNiveau01());
foreach($group->getUsers() as $usergroup) { $output['niveau02users'] = [];
array_push($output["groupusers"],["userid"=>$usergroup->getUser()->getId(),"userlogin"=>$usergroup->getUser()->getUsername()]); 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

@ -1,523 +1,574 @@
<?php <?php
namespace App\Controller; namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use App\Entity\Group;
use Symfony\Component\HttpFoundation\Request; use App\Entity\Niveau01;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use App\Form\LoginType;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use App\Service\ApiService;
use Symfony\Component\EventDispatcher\EventDispatcher; use App\Service\LdapService;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpKernel\KernelInterface; use Ramsey\Uuid\Uuid;
use Doctrine\Persistence\ManagerRegistry; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\EventDispatcher\EventDispatcher;
use Ramsey\Uuid\Uuid; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\KernelInterface;
use App\Entity\User; use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Entity\Niveau01; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use App\Entity\Group; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use App\Form\LoginType; use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use App\Service\LdapService; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use App\Service\ApiService;
class SecurityController extends AbstractController
class SecurityController extends AbstractController {
{ private $appKernel;
private $appKernel; private $tokenstorage;
private $tokenstorage; private $ldapservice;
private $ldapservice; private $apiservice;
private $apiservice;
public function __construct(KernelInterface $appKernel, TokenStorageInterface $tokenstorage, LdapService $ldapservice, ApiService $apiservice)
public function __construct(KernelInterface $appKernel, TokenStorageInterface $tokenstorage, LdapService $ldapservice, ApiService $apiservice) {
{ $this->appKernel = $appKernel;
$this->appKernel = $appKernel; $this->tokenstorage = $tokenstorage;
$this->tokenstorage = $tokenstorage; $this->ldapservice = $ldapservice;
$this->ldapservice = $ldapservice; $this->apiservice = $apiservice;
$this->apiservice = $apiservice; }
}
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, ManagerRegistry $em)
public function loginSQL(Request $request, AuthenticationUtils $authenticationUtils) {
{ return $this->render('Home/loginSQL.html.twig', [
return $this->render('Home/loginSQL.html.twig', array( '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
\phpCAS::forceAuthentication();
// Authentification
\phpCAS::forceAuthentication(); // Récupération UID
$username = \phpCAS::getUser();
// Récupération UID
$username = \phpCAS::getUser(); // Récupération Attribut
$attributes = \phpCAS::getAttributes();
// Récupération Attribut
$attributes = \phpCAS::getAttributes(); // Init
$email = "$username@nomail.fr";
// Init $lastname = $username;
$email = "$username@nomail.fr"; $firstname = ' ';
$lastname = $username; $avatar = 'noavatar.png';
$firstname = " ";
$avatar="noavatar.png"; // Rechercher l'utilisateur
if (isset($attributes[$this->getParameter('casUsername')])) {
// Rechercher l'utilisateur $username = $attributes[$this->getParameter('casUsername')];
if(isset($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')]))
$firstname = $attributes[$this->getParameter('casFirstname')]; if (isset($attributes[$this->getParameter('casFirstname')])) {
$firstname = $attributes[$this->getParameter('casFirstname')];
if(isset($attributes[$this->getParameter('casAvatar')])) }
$avatar = $attributes[$this->getParameter('casAvatar')];
if (isset($attributes[$this->getParameter('casAvatar')])) {
// Rechercher l'utilisateur $avatar = $attributes[$this->getParameter('casAvatar')];
$user = $em->getRepository('App\Entity\User')->findOneBy(array("username"=>$username)); }
if (!$user) {
if(!$this->getParameter("casAutosubmit")) return $this->redirect($this->generateUrl('app_noperm')); // Rechercher l'utilisateur
$user = $em->getRepository('App\Entity\User')->findOneBy(['username' => $username]);
$this->submitSSONiveau01($attributes,$em); if (!$user) {
$this->submitSSOGroup($attributes,$em); if (!$this->getParameter('casAutosubmit')) {
$niveau01=$em->getRepository('App\Entity\Niveau01')->calculateSSONiveau01($attributes); return $this->redirect($this->generateUrl('app_noperm'));
$user=$this->submituser($username,$firstname,$lastname,$email,$password,$niveau01,$em); }
$user=$em->getRepository('App\Entity\Group')->calculateSSOGroup($user,$attributes);
} $this->submitSSONiveau01($attributes, $em);
elseif($this->getParameter("casAutoupdate")) { $this->submitSSOGroup($attributes, $em);
$this->submitSSONiveau01($attributes,$em); $niveau01 = $em->getRepository('App\Entity\Niveau01')->calculateSSONiveau01($attributes);
$this->submitSSOGroup($attributes,$em); $user = $this->submituser($username, $firstname, $lastname, $email, $avatar, $niveau01, $em);
$this->updateuser($user,$firstname,$lastname,$email,$avatar,$em); $user = $em->getRepository('App\Entity\Group')->calculateSSOGroup($user, $attributes);
$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);
// Autoconnexion }
return $this->autoconnexion($user,$redirect,$request);
} // Autoconnexion
return $this->autoconnexion($user, $redirect, $request);
public function loginLDAP(Request $request) }
{
// Création du formulaire public function loginLDAP(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
$form = $this->createForm(LoginType::class); {
// Création du formulaire
// Récupération des data du formulaire $form = $this->createForm(LoginType::class);
$form->handleRequest($request);
// Récupération des data du formulaire
// Affichage du formulaire $form->handleRequest($request);
return $this->render("Home/loginLDAP.html.twig", [
"useheader"=>false, // Affichage du formulaire
"usemenu"=>false, return $this->render('Home/loginLDAP.html.twig', [
"usesidebar"=>false, 'useheader' => false,
"form"=>$form->createView(), 'usemenu' => false,
]); 'usesidebar' => false,
} '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"]; {
$password=$request->get('login')["password"]; $username = $request->get('login')['username'];
$password = $request->get('login')['password'];
// Récupération de la cible de navigation
$redirect = $request->getSession()->get("_security.main.target_path"); // Récupération de la cible de navigation
$redirect = $request->getSession()->get('_security.main.target_path');
// L'utilisateur se co à l'annuaire
$userldap=$this->ldapservice->userconnect($username,$password); // L'utilisateur se co à l'annuaire
if($userldap) { $userldap = $this->ldapservice->userconnect($username, $password);
$userldap=$userldap[0]; if ($userldap) {
$userldap = $userldap[0];
// Init
$email = "$username@nomail.fr"; // Init
$lastname = $username; $email = "$username@nomail.fr";
$firstname = " "; $lastname = $username;
$avatar="noavatar.png"; $firstname = ' ';
$avatar = 'noavatar.png';
// Rechercher l'utilisateur
if(isset($userldap[$this->getParameter('ldapFirstname')])) // Rechercher l'utilisateur
$firstname = $userldap[$this->getParameter('ldapFirstname')]; if (isset($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('ldapLastname')])) {
if(isset($userldap[$this->getParameter('ldapEmail')])) $lastname = $userldap[$this->getParameter('ldapLastname')];
$email = $userldap[$this->getParameter('ldapEmail')]; }
if(isset($userldap[$this->getParameter('ldapAvatar')])) if (isset($userldap[$this->getParameter('ldapEmail')])) {
$avatar = $userldap[$this->getParameter('ldapAvatar')]; $email = $userldap[$this->getParameter('ldapEmail')];
}
$user = $em->getRepository('App\Entity\User')->findOneBy(array("username"=>$username));
if (isset($userldap[$this->getParameter('ldapAvatar')])) {
if (!$user) { $avatar = $userldap[$this->getParameter('ldapAvatar')];
if(!$this->getParameter("ldapAutosubmit")) return $this->redirect($this->generateUrl('app_noperm')); }
$niveau01=$em->getRepository('App\Entity\Niveau01')->calculateLDAPNiveau01($username);
$user=$this->submituser($username,$firstname,$lastname,$email,$avatar,$niveau01,$em); $user = $em->getRepository('App\Entity\User')->findOneBy(['username' => $username]);
}
elseif($this->getParameter("ldapAutoupdate")) { if (!$user) {
$this->updateuser($user,$firstname,$lastname,$email,$avatar,$em); if (!$this->getParameter('ldapAutosubmit')) {
} return $this->redirect($this->generateUrl('app_noperm'));
}
// Autoconnexion $niveau01 = $em->getRepository('App\Entity\Niveau01')->calculateLDAPNiveau01($username);
return $this->autoconnexion($user,$redirect,$request); $user = $this->submituser($username, $firstname, $lastname, $email, $avatar, $niveau01, $em);
} } elseif ($this->getParameter('ldapAutoupdate')) {
$this->updateuser($user, $firstname, $lastname, $email, $avatar, $em);
return $this->redirect($this->generateUrl('app_login')); }
}
// Autoconnexion
return $this->autoconnexion($user, $redirect, $request);
public function loginOPENID(Request $request, AuthenticationUtils $authenticationUtils) }
{
$state=Uuid::uuid4(); return $this->redirect($this->generateUrl('app_login'));
$request->getSession()->set("oauthState",$state); }
$callback=$this->generateUrl('app_loginopenidcallback', array(), UrlGeneratorInterface::ABSOLUTE_URL);
$url=$this->getParameter("oauthLoginurl")."?client_id=".$this->getParameter("oauthClientid")."&redirect_uri=".$callback."&response_type=code&state=".$state."&scope=openid"; public function loginOPENID(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
return $this->redirect($url); {
} $state = Uuid::uuid4();
$request->getSession()->set('oauthState', $state);
public function loginopenidcallback(Request $request, AuthenticationUtils $authenticationUtils,ManagerRegistry $em) $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';
// Récupération de la cible de navigation
$redirect = $request->getSession()->get("_security.main.target_path"); return $this->redirect($url);
}
// Masteridentity
$appMasteridentity=$this->getParameter("appMasteridentity"); public function loginopenidcallback(Request $request, AuthenticationUtils $authenticationUtils, ManagerRegistry $em)
{
$callback=$this->generateUrl('app_loginopenidcallback', array(), UrlGeneratorInterface::ABSOLUTE_URL); // Récupération de la cible de navigation
$apiurl = $this->getParameter("oauthTokenurl"); $redirect = $request->getSession()->get('_security.main.target_path');
$query= [
"grant_type" => "authorization_code", // Masteridentity
"code" => $request->get("code"), $appMasteridentity = $this->getParameter('appMasteridentity');
"redirect_uri" => $callback,
"client_id" => $this->getParameter("oauthClientid"), $callback = $this->generateUrl('app_loginopenidcallback', [], UrlGeneratorInterface::ABSOLUTE_URL);
"client_secret" => $this->getParameter("oauthClientsecret"), $apiurl = $this->getParameter('oauthTokenurl');
]; $query = [
$response=$this->apiservice->run("POST",$apiurl,$query,null,"form"); 'grant_type' => 'authorization_code',
'code' => $request->get('code'),
if(!$response||$response->code!="200") die("pb openid 01"); 'redirect_uri' => $callback,
$accesstoken=$response->body->access_token; 'client_id' => $this->getParameter('oauthClientid'),
$accesstokentype=$response->body->token_type; 'client_secret' => $this->getParameter('oauthClientsecret'),
$îdtoken=$response->body->id_token; ];
$response = $this->apiservice->run('POST', $apiurl, $query, null, 'form');
$request->getSession()->set("oauthAccesstoken",$accesstoken);
$request->getSession()->set("oauthIdtoken",$îdtoken); if (!$response || '200' != $response->code) {
exit('pb openid 01');
$apiurl = $this->getParameter("oauthUserinfo"); }
$accesstoken = $response->body->access_token;
$response=$this->apiservice->run("GET",$apiurl,null,["Authorization"=>$accesstokentype." ".$accesstoken]); $accesstokentype = $response->body->token_type;
if(!$response||$response->code!="200") die("pb openid 02"); $îdtoken = $response->body->id_token;
$attributes=json_decode(json_encode($response->body), true); $request->getSession()->set('oauthAccesstoken', $accesstoken);
$request->getSession()->set('oauthIdtoken', $îdtoken);
// Username
if(isset($attributes[$this->getParameter('oauthUsername')])) $apiurl = $this->getParameter('oauthUserinfo');
$username = $attributes[$this->getParameter('oauthUsername')];
$response = $this->apiservice->run('GET', $apiurl, null, ['Authorization' => $accesstokentype.' '.$accesstoken]);
// Valeur par défaut if (!$response || '200' != $response->code) {
$email = "$username@nomail.fr"; exit('pb openid 02');
$lastname = $username; }
$firstname = " ";
$avatar="noavatar.png"; $attributes = json_decode(json_encode($response->body), true);
// Récupérer les attributs associés // Username
if(isset($attributes[$this->getParameter('oauthEmail')])) $username = '';
$email = $attributes[$this->getParameter('oauthEmail')]; if (isset($attributes[$this->getParameter('oauthUsername')])) {
$username = $attributes[$this->getParameter('oauthUsername')];
if(isset($attributes[$this->getParameter('oauthLastname')])) }
$lastname = $attributes[$this->getParameter('oauthLastname')];
// Valeur par défaut
if(isset($attributes[$this->getParameter('oauthFirstname')])) $email = "$username@nomail.fr";
$firstname = $attributes[$this->getParameter('oauthFirstname')]; $lastname = $username;
$firstname = ' ';
if(isset($attributes[$this->getParameter('oauthAvatar')])) $avatar = 'noavatar.png';
$avatar = $attributes[$this->getParameter('oauthAvatar')];
// Récupérer les attributs associés
// Rechercher l'utilisateur if (isset($attributes[$this->getParameter('oauthEmail')])) {
$user = $em->getRepository('App\Entity\User')->findOneBy(array("username"=>$username)); $email = $attributes[$this->getParameter('oauthEmail')];
if (!$user) { }
if(!$this->getParameter("oauthAutosubmit")) return $this->redirect($this->generateUrl('app_noperm'));
if (isset($attributes[$this->getParameter('oauthLastname')])) {
$this->submitSSONiveau01($attributes,$em); $lastname = $attributes[$this->getParameter('oauthLastname')];
$this->submitSSOGroup($attributes,$em); }
$niveau01=$em->getRepository('App\Entity\Niveau01')->calculateSSONiveau01($attributes);
$user=$this->submituser($username,$firstname,$lastname,$email,$avatar,$niveau01,$em); if (isset($attributes[$this->getParameter('oauthFirstname')])) {
} $firstname = $attributes[$this->getParameter('oauthFirstname')];
elseif($this->getParameter("oauthAutoupdate")) { }
$this->submitSSONiveau01($attributes,$em);
$this->submitSSOGroup($attributes,$em); if (isset($attributes[$this->getParameter('oauthAvatar')])) {
$this->updateuser($user,$firstname,$lastname,$email,$avatar,$em); $avatar = $attributes[$this->getParameter('oauthAvatar')];
$user=$em->getRepository('App\Entity\Group')->calculateSSOGroup($user,$attributes); }
}
// Rechercher l'utilisateur
// Autoconnexion $user = $em->getRepository('App\Entity\User')->findOneBy(['username' => $username]);
return $this->autoconnexion($user,$redirect,$request); if (!$user) {
} if (!$this->getParameter('oauthAutosubmit')) {
return $this->redirect($this->generateUrl('app_noperm'));
public function logout(Request $request) { }
$auth_mode=$this->getParameter("appAuth");
switch($auth_mode) { $this->submitSSONiveau01($attributes, $em);
case "SQL": $this->submitSSOGroup($attributes, $em);
return $this->logoutSQL($request); $niveau01 = $em->getRepository('App\Entity\Niveau01')->calculateSSONiveau01($attributes);
break; $user = $this->submituser($username, $firstname, $lastname, $email, $avatar, $niveau01, $em);
} elseif ($this->getParameter('oauthAutoupdate')) {
case "CAS": $this->submitSSONiveau01($attributes, $em);
return $this->logoutCAS($request); $this->submitSSOGroup($attributes, $em);
break; $this->updateuser($user, $firstname, $lastname, $email, $avatar, $em);
$user = $em->getRepository('App\Entity\Group')->calculateSSOGroup($user, $attributes);
case "LDAP": }
return $this->logoutLDAP($request);
break; // Autoconnexion
return $this->autoconnexion($user, $redirect, $request);
case "OPENID": }
return $this->logoutOPENID($request);
break; public function logout(Request $request)
} {
$auth_mode = $this->getParameter('appAuth');
} switch ($auth_mode) {
case 'SQL':
public function logoutSQL(Request $request) { return $this->logoutSQL($request);
$this->tokenstorage->setToken(null); break;
$request->getSession()->invalidate();
return $this->redirect($this->generateUrl("app_home")); case 'CAS':
} return $this->logoutCAS($request);
break;
public function logoutCAS(Request $request) {
$this->tokenstorage->setToken(null); case 'LDAP':
$request->getSession()->invalidate(); return $this->logoutLDAP($request);
break;
// Init Client CAS
$alias=$this->getParameter('appAlias'); case 'OPENID':
\phpCAS::setDebug($this->appKernel->getProjectDir()."/var/log/cas.log"); return $this->logoutOPENID($request);
\phpCAS::client(CAS_VERSION_2_0, $this->getParameter('casHost'), intval($this->getParameter('casPort')), is_null($this->getParameter('casPath')) ? '' : $this->getParameter('casPath'), false); break;
\phpCAS::setNoCasServerValidation(); }
}
// Logout public function logoutSQL(Request $request)
$url=$this->generateUrl('app_home', array(), UrlGeneratorInterface::ABSOLUTE_URL); {
\phpCAS::logout(array("service"=>$url)); $this->tokenstorage->setToken(null);
$request->getSession()->invalidate();
return true;
} return $this->redirect($this->generateUrl('app_home'));
}
public function logoutLDAP(Request $request) {
$this->tokenstorage->setToken(null); public function logoutCAS(Request $request)
$request->getSession()->invalidate(); {
return $this->redirect($this->generateUrl("app_home")); $this->tokenstorage->setToken(null);
} $request->getSession()->invalidate();
// Init Client CAS
public function logoutOPENID(Request $request) { $alias = $this->getParameter('appAlias');
$accesstoken=$request->getSession()->get("oauthAccesstoken"); \phpCAS::setDebug($this->appKernel->getProjectDir().'/var/log/cas.log');
$idtoken=$request->getSession()->get("oauthIdtoken"); \phpCAS::client(CAS_VERSION_2_0, $this->getParameter('casHost'), intval($this->getParameter('casPort')), is_null($this->getParameter('casPath')) ? '' : $this->getParameter('casPath'), false);
$state=$request->getSession()->get("oauthState"); \phpCAS::setNoCasServerValidation();
$this->tokenstorage->setToken(null); // Logout
$request->getSession()->invalidate(); $url = $this->generateUrl('app_home', [], UrlGeneratorInterface::ABSOLUTE_URL);
\phpCAS::logout(['service' => $url]);
$url=$this->getParameter("oauthLogouturl");
if($url) { return true;
$callback=($request->isSecure()?"https://":"http://").str_replace("//","/",$this->getParameter("appWeburl").$this->getParameter("appAlias").$this->generateUrl('app_home')); }
$callback=substr($callback, 0, -1);
public function logoutLDAP(Request $request)
$url.="?id_token_hint=$idtoken&scope=openid&post_logout_redirect_uri=$callback"; {
return $this->redirect($url); $this->tokenstorage->setToken(null);
$request->getSession()->invalidate();
} 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
private function submitSSONiveau01($attributes,ManagerRegistry $em) { public function logoutOPENID(Request $request)
$attrNiveau01=($this->getParameter("appAuth")=="CAS"?$this->getParameter('casNiveau01'):$this->getParameter('oauthNiveau01')); {
if(!$attrNiveau01) $accesstoken = $request->getSession()->get('oauthAccesstoken');
return null; $idtoken = $request->getSession()->get('oauthIdtoken');
$state = $request->getSession()->get('oauthState');
// Si l'utilisateur possège l'attribut niveau01 dans ses attributs
if(array_key_exists($attrNiveau01,$attributes)) { $this->tokenstorage->setToken(null);
if(!is_array($attributes[$attrNiveau01])) { $request->getSession()->invalidate();
$attributes[$attrNiveau01]=[$attributes[$attrNiveau01]];
} $url = $this->getParameter('oauthLogouturl');
if ($url) {
foreach($attributes[$attrNiveau01] as $ssoniveau01) { $callback = ($request->isSecure() ? 'https://' : 'http://').str_replace('//', '/', $this->getParameter('appWeburl').$this->getParameter('appAlias').$this->generateUrl('app_home'));
$basedn=$this->getParameter('ldapBasedn'); $callback = substr($callback, 0, -1);
$name=$ssoniveau01;
if($basedn!="") { $url .= "?id_token_hint=$idtoken&scope=openid&post_logout_redirect_uri=$callback";
// 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) { return $this->redirect($url);
$tbname=explode(",",$name); } else {
$tbname=explode("=",$tbname[0]); return $this->redirect($this->generateUrl('app_home'));
$name=$tbname[1]; }
} }
}
// Génération automatique des niveau01 provenant de l'attribut casniveau01
// Recherche du groupe private function submitSSONiveau01($attributes, ManagerRegistry $em)
$niveau01=$em->getRepository("App\Entity\Niveau01")->findOneBy(["label"=>$name]); {
if(!$niveau01) { $attrNiveau01 = ('CAS' == $this->getParameter('appAuth') ? $this->getParameter('casNiveau01') : $this->getParameter('oauthNiveau01'));
$niveau01=new Niveau01(); if (!$attrNiveau01) {
$niveau01->setLabel($name); return null;
$niveau01->setApikey(Uuid::uuid4()); }
}
// Si l'utilisateur possège l'attribut niveau01 dans ses attributs
$niveau01->setAttributes('{"'.$attrNiveau01.'":"'.$ssoniveau01.'"}'); if (array_key_exists($attrNiveau01, $attributes)) {
$em->getManager()->persist($niveau01); if (!is_array($attributes[$attrNiveau01])) {
$em->getManager()->flush(); $attributes[$attrNiveau01] = [$attributes[$attrNiveau01]];
} }
}
} foreach ($attributes[$attrNiveau01] as $ssoniveau01) {
$basedn = $this->getParameter('ldapBasedn');
$name = $ssoniveau01;
// Génération automatique des groupes provenant de l'attribut casgroup ou oauthgroup if ('' != $basedn) {
private function submitSSOGroup($attributes,ManagerRegistry $em) { // 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
$attrGroup=($this->getParameter("appAuth")=="CAS"?$this->getParameter('casGroup'):$this->getParameter('oauthGroup')); if (false !== stripos($name, $basedn)) {
if(!$attrGroup) $tbname = explode(',', $name);
return null; $tbname = explode('=', $tbname[0]);
$name = $tbname[1];
// 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]]; // Recherche du groupe
} $niveau01 = $em->getRepository("App\Entity\Niveau01")->findOneBy(['label' => $name]);
if (!$niveau01) {
foreach($attributes[$attrGroup] as $ssogroup) { $niveau01 = new Niveau01();
$basedn=$this->getParameter('ldapBasedn'); $niveau01->setLabel($name);
$name=$ssogroup; $niveau01->setApikey(Uuid::uuid4());
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
if(stripos($name,$basedn)!==false) { $niveau01->setAttributes('{"'.$attrNiveau01.'":"'.$ssoniveau01.'"}');
$tbname=explode(",",$name); $em->getManager()->persist($niveau01);
$tbname=explode("=",$tbname[0]); $em->getManager()->flush();
$name=$tbname[1]; }
} }
} }
// Recherche du groupe // Génération automatique des groupes provenant de l'attribut casgroup ou oauthgroup
$group=$em->getRepository("App\Entity\Group")->findOneBy(["label"=>$name]); private function submitSSOGroup($attributes, ManagerRegistry $em)
if(!$group) { {
$group=new Group(); $attrGroup = ('CAS' == $this->getParameter('appAuth') ? $this->getParameter('casGroup') : $this->getParameter('oauthGroup'));
$group->setLabel($name); if (!$attrGroup) {
$group->setIsopen(false); return null;
$group->setIsworkgroup(false); }
$group->setApikey(Uuid::uuid4());
} // Si l'utilisateur possège l'attribut groupe dans ses attributs
if (array_key_exists($attrGroup, $attributes)) {
$group->setAttributes('{"'.$attrGroup.'":"'.$ssogroup.'"}'); if (!is_array($attributes[$attrGroup])) {
$em->getManager()->persist($group); $attributes[$attrGroup] = [$attributes[$attrGroup]];
$em->getManager()->flush(); }
}
} foreach ($attributes[$attrGroup] as $ssogroup) {
} $basedn = $this->getParameter('ldapBasedn');
$name = $ssogroup;
private function submituser($username,$firstname,$lastname,$email,$avatar,$niveau01,$em) { if ('' != $basedn) {
if(empty($email)) $email = $username."@nomail.com"; // 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(empty($avatar)) $avatar = "noavatar.png"; if (false !== stripos($name, $basedn)) {
if(empty($firstname)) $firstname = " "; $tbname = explode(',', $name);
if(empty($lastname)) $lastname = $username; $tbname = explode('=', $tbname[0]);
$uuid=Uuid::uuid4(); $name = $tbname[1];
$password=$this->getParameter("appAuth")."PWD-".$username."-".$uuid; }
}
// Si aucun niveau01 on prend par défaut le niveau system
if(!$niveau01) $niveau01=$em->getRepository('App\Entity\Niveau01')->find(-1); // Recherche du groupe
$group = $em->getRepository("App\Entity\Group")->findOneBy(['label' => $name]);
// Autogénération du user vu qu'il a pu se connecter if (!$group) {
$user = new User(); $group = new Group();
$group->setLabel($name);
$user->setUsername($username); $group->setIsopen(false);
$user->setEmail($email); $group->setIsworkgroup(false);
$user->setLastname($lastname); $group->setApikey(Uuid::uuid4());
$user->setFirstname($firstname); }
$user->setApikey(Uuid::uuid4());
$group->setAttributes('{"'.$attrGroup.'":"'.$ssogroup.'"}');
$user->setPassword($password); $em->getManager()->persist($group);
$user->setNiveau01($niveau01); $em->getManager()->flush();
}
$user->setAvatar($avatar); }
$user->setIsvisible(true); }
$user->setRole("ROLE_USER");
private function submituser($username, $firstname, $lastname, $email, $avatar, $niveau01, $em)
if(in_array($username,$this->getParameter("appAdmins"))) {
$user->setRole("ROLE_ADMIN"); if (empty($email)) {
$email = $username.'@nomail.com';
$em->getManager()->persist($user); }
$em->getManager()->flush(); if (empty($avatar)) {
$avatar = 'noavatar.png';
return $user; }
} if (empty($firstname)) {
$firstname = ' ';
private function updateuser($user,$firstname,$lastname,$email,$avatar,$em) { }
if($avatar=="noavatar.png") $avatar=$user->getAvatar(); if (empty($lastname)) {
$lastname = $username;
if(!empty($lastname)) $user->setLastname($lastname); }
if(!empty($firstname)) $user->setFirstname($firstname); $uuid = Uuid::uuid4();
if(!empty($email)) $user->setEmail($email); $password = $this->getParameter('appAuth').'PWD-'.$username.'-'.$uuid;
if(!empty($avatar)) $user->setAvatar($avatar);
// Si aucun niveau01 on prend par défaut le niveau system
if(in_array($user->getUsername(),$this->getParameter("appAdmins"))) if (!$niveau01) {
$user->setRole("ROLE_ADMIN"); $niveau01 = $em->getRepository('App\Entity\Niveau01')->find(-1);
}
$em->getManager()->flush();
} // Autogénération du user vu qu'il a pu se connecter
$user = new User();
private function autoconnexion($user,$redirect,Request $request)
{ $user->setUsername($username);
// Récupérer le token de l'utilisateur $user->setEmail($email);
$token = new UsernamePasswordToken($user, "main", $user->getRoles()); $user->setLastname($lastname);
$this->tokenstorage->setToken($token); $user->setFirstname($firstname);
$request->getSession()->set('_security_main', serialize($token)); $user->setApikey(Uuid::uuid4());
// Simuler l'evenement de connexion $user->setPassword($password);
$event = new InteractiveLoginEvent($request, $token); $user->setNiveau01($niveau01);
$dispatcher = new EventDispatcher();
$dispatcher->dispatch($event); $user->setAvatar($avatar);
$user->setIsvisible(true);
// Redirection $user->setRole('ROLE_USER');
if($redirect)
return $this->redirect($redirect); if (in_array($username, $this->getParameter('appAdmins'))) {
else $user->setRole('ROLE_ADMIN');
return $this->redirect($this->generateUrl('app_home')); }
}
} $em->getManager()->persist($user);
$em->getManager()->flush();
return $user;
}
private function updateuser($user, $firstname, $lastname, $email, $avatar, $em)
{
if ('noavatar.png' == $avatar) {
$avatar = $user->getAvatar();
}
if (!empty($lastname)) {
$user->setLastname($lastname);
}
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'))) {
$user->setRole('ROLE_ADMIN');
}
$em->getManager()->flush();
}
private function autoconnexion($user, $redirect, Request $request)
{
// Récupérer le token de l'utilisateur
$token = new UsernamePasswordToken($user, 'main', $user->getRoles());
$this->tokenstorage->setToken($token);
$request->getSession()->set('_security_main', serialize($token));
// Simuler l'evenement de connexion
$event = new InteractiveLoginEvent($request, $token);
$dispatcher = new EventDispatcher();
$dispatcher->dispatch($event);
// Redirection
if ($redirect) {
return $this->redirect($redirect);
} else {
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,357 +1,395 @@
<?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
{
if($access=="user"&&!$request->getSession()->get("showannuaire"))
throw $this->createAccessDeniedException('Permission denied');
return $this->render($this->twig.'list.html.twig',[ public function list($access, Request $request): Response
"useheader"=>true, {
"usemenu"=>false, if ('user' == $access && !$request->getSession()->get('showannuaire')) {
"usesidebar"=>($access!="user"), throw $this->createAccessDeniedException('Permission denied');
"access"=>$access }
return $this->render($this->twig.'list.html.twig', [
'useheader' => true,
'usemenu' => false,
'usesidebar' => ('user' != $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'];
$niveau01 = null;
$niveau02 = null;
$niveau03 = null;
$niveau04 = 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;
default: default:
$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=$em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity,'entity')->where('entity.isvisible=true'); $qb = $em->getManager()->createQueryBuilder()->select('COUNT(entity)')->from($this->entity, 'entity')->where('entity.isvisible=true');
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; break;
case 3:
$qb->andWhere('entity.niveau03 = :niveau03')->setParameter('niveau03', $niveau03);
break;
case 4:
$qb->andWhere('entity.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break;
} }
$total = $qb->getQuery()->getSingleScalarResult(); $total = $qb->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:Niveau01', 'niveau01') ->from('App:Niveau01', 'niveau01')
->where('entity.niveau01=niveau01.id') ->where('entity.niveau01=niveau01.id')
->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'].'%')
->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.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('userid', $this->getUser()->getId())
->getQuery() ->getQuery()
->getSingleScalarResult(); ->getSingleScalarResult();
break; break;
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.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'].'%');
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; break;
}
case 3:
$totalf=$qb->getQuery()->getSingleScalarResult(); $qb->andWhere('entity.niveau03 = :niveau03')->setParameter('niveau03', $niveau03);
break; break;
case 4:
$qb->andWhere('entity.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break;
}
$totalf = $qb->getQuery()->getSingleScalarResult();
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');
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->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');
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; break;
}
break; case 3:
} $qb->andWhere('entity.niveau03 = :niveau03')->setParameter('niveau03', $niveau03);
break;
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') case 4:
->setParameter("value", "%".$search["value"]."%"); $qb->andWhere('entity.niveau04 = :niveau04')->setParameter('niveau04', $niveau04);
break;
}
break;
} }
if($ordercolumn) { if ($search && '' != $search['value']) {
if($access=="admin"||$access=="modo") { $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')
$ordercolumn=$ordercolumn-1; ->setParameter('value', '%'.$search['value'].'%');
}
if ($ordercolumn) {
if ('admin' == $access || 'modo' == $access) {
$ordercolumn = $ordercolumn - 1;
} }
switch($ordercolumn) {
case 1 :
$qb->orderBy('entity.username',$orderdir);
break;
case 2 : switch ($ordercolumn) {
$qb->orderBy('entity.lastname',$orderdir); case 1:
break; $qb->orderBy('entity.username', $orderdir);
break;
case 3 : case 2:
$qb->orderBy('entity.firstname',$orderdir); $qb->orderBy('entity.lastname', $orderdir);
break; break;
case 4 : case 3:
$qb->orderBy('entity.email',$orderdir); $qb->orderBy('entity.firstname', $orderdir);
break; break;
case 5 : case 4:
$qb->orderBy('entity.telephonenumber',$orderdir); $qb->orderBy('entity.email', $orderdir);
break; break;
case 6 : case 5:
$qb->orderBy('niveau01.label',$orderdir); $qb->orderBy('entity.telephonenumber', $orderdir);
break; break;
case 8 : case 6:
$qb->orderBy('entity.visitedate',$orderdir); $qb->orderBy('niveau01.label', $orderdir);
break; break;
case 9 : case 8:
$qb->orderBy('entity.roles',$orderdir); $qb->orderBy('entity.visitedate', $orderdir);
break; break;
case 9:
$qb->orderBy('entity.roles', $orderdir);
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."%") ->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->getUsername()]);
} }
$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->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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$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 +401,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,100 +415,109 @@ 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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$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
else { else {
$data->setPassword($data->getPassword()); $data->setPassword($data->getPassword());
} }
// Sauvegarde // Sauvegarde
$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 +528,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,158 +556,184 @@ 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 ('user' == $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' => ('user' == $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));
}
protected function getListGroups($access,$em) return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]);
}
return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route));
}
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) { switch ($access) {
case "admin" : return true; break; case 'admin': return true;
case "modo" : return true; break; break;
case 'modo': return true;
break;
} }
throw $this->createAccessDeniedException('Permission denied'); throw $this->createAccessDeniedException('Permission denied');
} }
private function canupdate($access, $entity, $em)
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':
$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');
$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) {
$toupdate = true;
$preference[$key][$id] = $value;
} }
if($preference[$key][$id]!=$value) {
$toupdate=true;
$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();
} }
return new Response(); return new Response();
} }
} }

View File

@ -2,118 +2,121 @@
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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
// Sauvegarde // Sauvegarde
$em->getManager()->persist($data); $em->getManager()->persist($data);
$em->getManager()->flush(); $em->getManager()->flush();
@ -121,82 +124,87 @@ class WhitelistController extends AbstractController
// Retour à la liste // Retour à la liste
return $this->redirectToRoute($this->route); return $this->redirectToRoute($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',
"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);
// Sur validation // Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) { if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
$em->getManager()->flush(); $em->getManager()->flush();
// Retour à la liste // Retour à la liste
return $this->redirectToRoute($this->route); return $this->redirectToRoute($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,
$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) {
$request->getSession()->getFlashBag()->add('error', $e->getMessage());
return $this->redirectToRoute($this->route.'_update', ['id' => $id]);
} }
catch (\Exception $e) {
$request->getSession()->getFlashBag()->add("error", $e->getMessage()); return $this->redirectToRoute($this->route);
return $this->redirectToRoute($this->route."_update",["id"=>$id]);
}
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")
@ -33,8 +31,7 @@ class Audit
/** /**
* @ORM\Column(type="datetime") * @ORM\Column(type="datetime")
*/ */
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,8 +73,8 @@ 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
{ {
$this->id = $id; $this->id = $id;
@ -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,70 +27,72 @@ 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;
/** /**
* @ORM\Column(type="text", nullable=true) * @ORM\Column(type="text", nullable=true)
*/ */
private $description; private $description;
/** /**
* @ORM\Column(type="integer", nullable=true) * @ORM\Column(type="integer", nullable=true)
*/ */
private $statut; private $statut;
/** /**
* @ORM\Column(type="datetime", nullable=false) * @ORM\Column(type="datetime", nullable=false)
*/ */
private $submitdate; private $submitdate;
/** /**
* @ORM\Column(type="datetime", nullable=true) * @ORM\Column(type="datetime", nullable=true)
*/ */
private $startexecdate; private $startexecdate;
/** /**
* @ORM\Column(type="datetime", nullable=true) * @ORM\Column(type="datetime", nullable=true)
*/ */
private $endexecdate; private $endexecdate;
/** /**
* @ORM\Column(type="datetime", nullable=true) * @ORM\Column(type="datetime", nullable=true)
*/ */
private $nextexecdate; private $nextexecdate;
/** /**
* @ORM\Column(type="integer", nullable=true) * @ORM\Column(type="integer", nullable=true)
*/ */
private $repeatinterval; private $repeatinterval;
/** /**
* @ORM\Column(type="text", nullable=true) * @ORM\Column(type="text", nullable=true)
*/ */
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;
} }
public function __construct() public function __construct()
{ {
$this->submitdate = new \DateTime(); $this->submitdate = new \DateTime();
} }
// 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;
/** /**
@ -13,7 +12,7 @@ use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
* @ORM\Table(name="groupe") * @ORM\Table(name="groupe")
* @ORM\HasLifecycleCallbacks() * @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="App\Repository\GroupRepository") * @ORM\Entity(repositoryClass="App\Repository\GroupRepository")
* *
* @UniqueEntity(fields="label", message="Un group existe déjà avec ce label") * @UniqueEntity(fields="label", message="Un group existe déjà avec ce label")
*/ */
class Group class Group
@ -31,10 +30,10 @@ class Group
private $label; private $label;
/** /**
* @var string * @var string
* *
* @ORM\Column(name="description", type="text", nullable=true) * @ORM\Column(name="description", type="text", nullable=true)
*/ */
private $description; private $description;
/** /**
@ -46,12 +45,12 @@ class Group
* @ORM\Column(type="boolean", options={"default" : false}) * @ORM\Column(type="boolean", options={"default" : false})
*/ */
private $isopen; private $isopen;
/** /**
* @ORM\Column(type="boolean", options={"default" : false}) * @ORM\Column(type="boolean", options={"default" : false})
*/ */
private $isworkgroup; private $isworkgroup;
/** /**
* @ORM\Column(type="string") * @ORM\Column(type="string")
*/ */
@ -66,7 +65,7 @@ class Group
* @ORM\Column(type="text", nullable=true) * @ORM\Column(type="text", nullable=true)
*/ */
private $attributes; private $attributes;
/** /**
* @ORM\Column(type="text", nullable=true) * @ORM\Column(type="text", nullable=true)
*/ */
@ -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,20 +1,19 @@
<?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
* @ORM\Table(name="niveau01") * @ORM\Table(name="niveau01")
* @ORM\HasLifecycleCallbacks() * @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="App\Repository\Niveau01Repository") * @ORM\Entity(repositoryClass="App\Repository\Niveau01Repository")
* *
* @UniqueEntity(fields="label", message="Un Niveau de rang 01 existe déjà avec ce label") * @UniqueEntity(fields="label", message="Un Niveau de rang 01 existe déjà avec ce label")
*/ */
class Niveau01 class Niveau01
@ -30,9 +29,9 @@ class Niveau01
* @ORM\Column(type="string", length=250, unique=true) * @ORM\Column(type="string", length=250, unique=true)
* @Validator\Grouplabel() * @Validator\Grouplabel()
* @Validator\Niveau01unique() * @Validator\Niveau01unique()
*/ */
private $label; private $label;
/** /**
* @ORM\Column(type="string") * @ORM\Column(type="string")
*/ */
@ -54,7 +53,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 +61,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 +69,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 +92,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
{ {
@ -287,6 +285,4 @@ class Niveau01
return $this; 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
@ -31,7 +31,7 @@ class Niveau02
* @Validator\Niveau02unique() * @Validator\Niveau02unique()
*/ */
private $label; private $label;
/** /**
* @ORM\Column(type="string") * @ORM\Column(type="string")
*/ */
@ -42,17 +42,25 @@ class Niveau02
* @ORM\JoinColumn(nullable=false) * @ORM\JoinColumn(nullable=false)
*/ */
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)
*/ */
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 +69,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 +115,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 +156,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 +186,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);
} }
@ -165,5 +204,4 @@ class Niveau02
return $this; return $this;
} }
} }

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

@ -0,0 +1,223 @@
<?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="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;
}
}

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

@ -0,0 +1,199 @@
<?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="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;
}
}

View File

@ -1,22 +1,18 @@
<?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
* @ORM\HasLifecycleCallbacks() * @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="App\Repository\RegistrationRepository") * @ORM\Entity(repositoryClass="App\Repository\RegistrationRepository")
* *
* @UniqueEntity(fields="username", message="Un utilisateur existe déjà avec ce login.") * @UniqueEntity(fields="username", message="Un utilisateur existe déjà avec ce login.")
* @UniqueEntity(fields="email", message="Un utilisateur existe déjà avec ce mail.") * @UniqueEntity(fields="email", message="Un utilisateur existe déjà avec ce mail.")
*/ */
@ -49,7 +45,7 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
* @ORM\Column(type="string", length=250) * @ORM\Column(type="string", length=250)
*/ */
private $password; private $password;
/** /**
* @Validator\Password() * @Validator\Password()
*/ */
@ -74,7 +70,7 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
* @ORM\Column(type="string", length=250, nullable=true) * @ORM\Column(type="string", length=250, nullable=true)
*/ */
private $postaladress; private $postaladress;
/** /**
* @ORM\Column(type="string", length=60, nullable=true) * @ORM\Column(type="string", length=60, nullable=true)
*/ */
@ -84,11 +80,11 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
* @ORM\Column(type="string", length=250, nullable=true) * @ORM\Column(type="string", length=250, nullable=true)
*/ */
private $job; private $job;
/** /**
* @ORM\Column(type="string", length=250, nullable=true) * @ORM\Column(type="string", length=250, nullable=true)
*/ */
private $position; private $position;
/** /**
* @ORM\Column(name="motivation", type="text", nullable=true) * @ORM\Column(name="motivation", type="text", nullable=true)
@ -103,18 +99,18 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
/** /**
* @ORM\Column(type="datetime", nullable=true) * @ORM\Column(type="datetime", nullable=true)
*/ */
private $keyexpire; private $keyexpire;
/** /**
* @ORM\Column(type="string", length=60, nullable=true) * @ORM\Column(type="string", length=60, nullable=true)
*/ */
private $keyvalue; private $keyvalue;
/** /**
* @ORM\Column(type="integer", length=60, nullable=false) * @ORM\Column(type="integer", length=60, nullable=false)
*/ */
private $statut; private $statut;
/** /**
* @ORM\ManyToOne(targetEntity="Niveau01", inversedBy="registrations") * @ORM\ManyToOne(targetEntity="Niveau01", inversedBy="registrations")
* @ORM\JoinColumn(nullable=false) * @ORM\JoinColumn(nullable=false)
@ -124,45 +120,55 @@ class Registration implements UserInterface, LegacyPasswordAuthenticatedUserInte
/** /**
* @ORM\ManyToOne(targetEntity="Niveau02", inversedBy="registrations") * @ORM\ManyToOne(targetEntity="Niveau02", inversedBy="registrations")
*/ */
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
$this->password = $password; $this->password = $password;
return $this; return $this;
} }
/** /**
* @see PasswordAuthenticatedUserInterface * @see PasswordAuthenticatedUserInterface
*/ */
public function getPassword(): string public function getPassword(): string
{ {
return $this->password; return $this->password;
} }
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;
} }
return $this; return $this;
} }
@ -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,23 +1,21 @@
<?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
* @ORM\Table(name="useraccount") * @ORM\Table(name="useraccount")
* @ORM\HasLifecycleCallbacks() * @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="App\Repository\UserRepository") * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* *
* @UniqueEntity(fields="username", message="Un utilisateur existe déjà avec ce login.") * @UniqueEntity(fields="username", message="Un utilisateur existe déjà avec ce login.")
* @UniqueEntity(fields="email", message="Un utilisateur existe déjà avec ce mail.") * @UniqueEntity(fields="email", message="Un utilisateur existe déjà avec ce mail.")
*/ */
@ -56,8 +54,8 @@ 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)
*/ */
@ -79,7 +77,7 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
private $email; private $email;
/** /**
* @ORM\Column(type="string", length=250, nullable=true, options={"default" : 0}) * @ORM\Column(type="string", length=250, nullable=true, options={"default" : 0})
*/ */
private $avatar; private $avatar;
@ -87,12 +85,12 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
* @ORM\Column(type="boolean") * @ORM\Column(type="boolean")
*/ */
protected $isvisible; protected $isvisible;
/** /**
* @ORM\Column(type="text", nullable=true) * @ORM\Column(type="text", nullable=true)
*/ */
private $postaladress; private $postaladress;
/** /**
* @ORM\Column(type="string", length=60, nullable=true) * @ORM\Column(type="string", length=60, nullable=true)
*/ */
@ -102,11 +100,11 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
* @ORM\Column(type="string", length=250, nullable=true) * @ORM\Column(type="string", length=250, nullable=true)
*/ */
private $job; private $job;
/** /**
* @ORM\Column(type="string", length=250, nullable=true) * @ORM\Column(type="string", length=250, nullable=true)
*/ */
private $position; private $position;
/** /**
* @ORM\Column(type="text", nullable=true) * @ORM\Column(type="text", nullable=true)
@ -126,13 +124,13 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
/** /**
* @ORM\Column(type="datetime", nullable=true) * @ORM\Column(type="datetime", nullable=true)
*/ */
private $keyexpire; private $keyexpire;
/** /**
* @ORM\Column(type="string", length=60, nullable=true) * @ORM\Column(type="string", length=60, nullable=true)
*/ */
private $keyvalue; private $keyvalue;
/** /**
* @ORM\Column(type="datetime", nullable=true) * @ORM\Column(type="datetime", nullable=true)
*/ */
@ -152,10 +150,20 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
/** /**
* @ORM\ManyToOne(targetEntity="Niveau02", inversedBy="users") * @ORM\ManyToOne(targetEntity="Niveau02", inversedBy="users")
*/ */
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 +171,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 +179,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,49 +193,48 @@ 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
$this->password = $password; $this->password = $password;
return $this; return $this;
} }
/** /**
* @see PasswordAuthenticatedUserInterface * @see PasswordAuthenticatedUserInterface
*/ */
public function getPassword(): string public function getPassword(): string
{ {
return $this->password; return $this->password;
} }
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;
} }
return $this; return $this;
} }
@ -257,22 +264,24 @@ 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;
} }
//== FIN DU CODE A NE PAS REGENERER // == FIN DU CODE A NE PAS REGENERER
public function getId(): ?int public function getId(): ?int
{ {
@ -623,4 +632,27 @@ 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;
}
} }

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;
@ -10,7 +10,7 @@ use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
* @ORM\Table(name="usergroupe",uniqueConstraints={@ORM\UniqueConstraint(columns={"user_id", "group_id"})}) * @ORM\Table(name="usergroupe",uniqueConstraints={@ORM\UniqueConstraint(columns={"user_id", "group_id"})})
* @ORM\HasLifecycleCallbacks() * @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="App\Repository\UserGroupRepository") * @ORM\Entity(repositoryClass="App\Repository\UserGroupRepository")
* *
* @UniqueEntity(fields={"user", "group"}, message="Cette liaison existe déjà !") * @UniqueEntity(fields={"user", "group"}, message="Cette liaison existe déjà !")
*/ */
class UserGroup class UserGroup
@ -25,12 +25,12 @@ class UserGroup
/** /**
* @ORM\Column(type="integer", length=60) * @ORM\Column(type="integer", length=60)
*/ */
private $rolegroup; private $rolegroup;
/** /**
* @ORM\Column(type="string", length=60) * @ORM\Column(type="string", length=60)
*/ */
private $apikey; private $apikey;
/** /**
* @ORM\Column(type="datetime", nullable=true) * @ORM\Column(type="datetime", nullable=true)
@ -41,7 +41,7 @@ class UserGroup
* @ORM\Column(type="integer", nullable=true) * @ORM\Column(type="integer", nullable=true)
*/ */
private $visitecpt; private $visitecpt;
/** /**
* @ORM\ManyToOne(targetEntity="User", inversedBy="groups") * @ORM\ManyToOne(targetEntity="User", inversedBy="groups")
*/ */
@ -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,49 +38,58 @@ 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();
$uow->computeChangeSets(); $uow->computeChangeSets();
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":
unset($changeSet["visitecpt"]);
unset($changeSet["visitedate"]);
unset($changeSet["preference"]);
unset($changeSet["keyvalue"]);
unset($changeSet["keyexpire"]);
unset($changeSet["apikey"]);
unset($changeSet["password"]);
unset($changeSet["passwordplain"]);
unset($changeSet["salt"]);
break;
case 'User':
unset($changeSet['visitecpt']);
unset($changeSet['visitedate']);
unset($changeSet['preference']);
unset($changeSet['keyvalue']);
unset($changeSet['keyexpire']);
unset($changeSet['apikey']);
unset($changeSet['password']);
unset($changeSet['passwordplain']);
unset($changeSet['salt']);
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; $namenew = $value[1]->getId().$namenew;
} }
$mychange[$key]=[$nameold,$namenew]; $mychange[$key] = [$nameold, $namenew];
} else {
$mychange[$key] = $value;
} }
else $mychange[$key]=$value;
} }
$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("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,75 +73,79 @@ 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();
} }
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() {
if($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations();
// Ajout / Modification group dans annuaire
$filter="gidnumber=".$this->entity->getId();
$attributes=$this->ldap->listAttributesGroup();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("basegroup"));
if(empty($ldapentrys)) {
$this->ldap->addGroup($this->entity);
}
elseif($this->ldap->ismodifyGroup($this->entity,$ldapentrys[0])) {
$this->ldap->modifyGroup($this->entity,$ldapentrys[0]["cn"]);
}
} }
} }
private function nine2ldap()
{
if ($this->ldap->isNine2Ldap()) {
// On s'assure que la structure organisationnelle est présente
$this->ldap->addOrganisations();
private function nine2ldapremove() { // Ajout / Modification group dans annuaire
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->addGroup($this->entity);
} elseif ($this->ldap->ismodifyGroup($this->entity, $ldapentrys[0])) {
$this->ldap->modifyGroup($this->entity, $ldapentrys[0]['cn']);
}
}
}
private function nine2ldapremove()
{
if ($this->ldap->isNine2Ldap()) {
$filter = 'gidnumber='.$this->entity->getId();
$attributes = $this->ldap->listAttributesGroup();
$ldapentrys = $this->ldap->search($filter, $attributes, $this->ldap->getParameter('basegroup'));
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,79 +35,92 @@ 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();
} }
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();
} }
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();
} }
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
$filter="gidnumber=".$this->entity->getId();
$attributes=$this->ldap->listAttributesNiveau01();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("baseniveau01"));
if(empty($ldapentrys)) {
$this->ldap->addNiveau01($this->entity);
}
elseif($this->ldap->ismodifyNiveau01($this->entity,$ldapentrys[0])) {
$this->ldap->modifyNiveau01($this->entity,$ldapentrys[0]["cn"]);
}
}
}
private function nine2ldapremove() { // Ajout / Modification dans annuaire
if($this->ldap->isNine2Ldap()) { $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);
} elseif ($this->ldap->ismodifyNiveau01($this->entity, $ldapentrys[0])) {
$this->ldap->modifyNiveau01($this->entity, $ldapentrys[0]['cn']);
}
}
}
private function nine2ldapremove()
{
if ($this->ldap->isNine2Ldap()) {
$filter = 'gidnumber='.$this->entity->getId();
$attributes = $this->ldap->listAttributesNiveau01();
$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,40 +35,54 @@ 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();
} }
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();
} }
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
$filter="gidnumber=".$this->entity->getId();
$attributes=$this->ldap->listAttributesNiveau02();
$ldapentrys=$this->ldap->search($filter,$attributes,$this->ldap->getParameter("baseniveau02"));
if(empty($ldapentrys)) {
$this->ldap->addNiveau02($this->entity);
}
elseif($this->ldap->ismodifyNiveau02($this->entity,$ldapentrys[0])) {
$this->ldap->modifyNiveau02($this->entity,$ldapentrys[0]["cn"]);
}
}
}
private function nine2ldapremove() { // Ajout / Modification dans annuaire
if($this->ldap->isNine2Ldap()) { $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);
} elseif ($this->ldap->ismodifyNiveau02($this->entity, $ldapentrys[0])) {
$this->ldap->modifyNiveau02($this->entity, $ldapentrys[0]['cn']);
}
}
}
private function nine2ldapremove()
{
if ($this->ldap->isNine2Ldap()) {
$filter = 'gidnumber='.$this->entity->getId();
$attributes = $this->ldap->listAttributesNiveau02();
$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,34 +32,39 @@ 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();
} }
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();
// Ajout / Modification dans annuaire // Ajout / Modification dans annuaire
$this->ldap->addUserGroup($this->entity); $this->ldap->addUserGroup($this->entity);
} }
} }
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,20 +37,21 @@ 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());
$usergroup->setRolegroup(0); $usergroup->setRolegroup(0);
$this->em->persist($usergroup); $this->em->persist($usergroup);
$this->em->flush(); $this->em->flush();
} }
@ -60,67 +59,78 @@ 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 }
$this->nine2ldap();
if (!$this->entity instanceof Entity) return; // Synchronisation nine2ldap
$this->nine2ldap();
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();
} }
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)) {
$this->ldap->addUser($this->entity); $this->ldap->addUser($this->entity);
} elseif ($this->ldap->ismodifyUser($this->entity, $ldapentrys[0])) {
$this->ldap->modifyUser($this->entity, $ldapentrys[0]['cn']);
} }
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
$this->ldap->updateNiveauUser($this->entity); $this->ldap->updateNiveauUser($this->entity);
} }
} }
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, ]);
); break;
$builder->add("value", ChoiceType::class, case 'logo':
array("label" =>"Valeur", $builder->add('value', HiddenType::class);
"label_attr" => array("style" => 'margin-top:15px;'), break;
"attr" => array("class" => "form-control"),
'required' => ($options["required"]==0?false:true),
"choices" => $choices));
break;
case 'header':
$builder->add('value', HiddenType::class);
break;
case "scopeannu": case 'image':
$choices=array( $builder->add('value', HiddenType::class);
"ALL" => "ALL", break;
"SAME_NIVEAU01" => "SAME_NIVEAU01",
"SAME_NIVEAU02" => "SAME_NIVEAU02",
);
$builder->add("value", ChoiceType::class, case 'color':
array("label" =>"Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control"),
'required' => ($options["required"]==0?false:true),
"choices" => $choices));
break;
case "logo":
$builder->add('value',HiddenType::class);
break;
case "header":
$builder->add('value',HiddenType::class);
break;
case "image":
$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,142 +1,135 @@
<?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") {
$builder->add('owner',
Select2EntityType::class, [
"label" => "Propriétaire",
"required" => false,
"multiple" => false,
"remote_route" => 'app_'.$options["access"].'_user_selectlist',
"class" => 'App\Entity\User',
"primary_key" => 'id',
"text_property" => 'username',
"minimum_input_length" => 2,
"page_limit" => 10,
"allow_clear" => true,
"delay" => 250,
"cache" => false,
"cache_timeout" => 60000, // if 'cache' is true
"language" => 'fr',
"placeholder" => 'Selectionner un propriétaire',
] ]
); );
} }
if($options["access"]=="admin") { if ('admin' == $options['access'] || 'update' == $options['mode']) {
$builder->add('email', $builder->add('owner',
EmailType::class, [ Select2EntityType::class, [
"label" => "Mail", 'label' => 'Propriétaire',
"required" => false, 'required' => false,
'multiple' => false,
'remote_route' => 'app_'.$options['access'].'_user_selectlist',
'class' => 'App\Entity\User',
'primary_key' => 'id',
'text_property' => 'username',
'minimum_input_length' => 2,
'page_limit' => 10,
'allow_clear' => true,
'delay' => 250,
'cache' => false,
'cache_timeout' => 60000, // if 'cache' is true
'language' => 'fr',
'placeholder' => 'Selectionner un propriétaire',
] ]
); );
} }
$builder->add("description", if ('admin' == $options['access']) {
$builder->add('email',
EmailType::class, [
'label' => 'Mail',
'required' => false,
]
);
}
$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],
] ]
); );
} }
} }
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,79 @@
<?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\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',
] ]
); );
// 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,70 +1,71 @@
<?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\SubmitType;
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;
} }
}, },
] ]
); );
$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\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',
)); ]);
} }
} }

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

@ -0,0 +1,94 @@
<?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\SubmitType;
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',
]
);
}
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',
]);
}
}

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

@ -0,0 +1,116 @@
<?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\SubmitType;
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',
]
);
}
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',
Select2EntityType::class, [
'label' => $options['appNiveau02label'],
'required' => false,
'remote_route' => 'app_niveau02_selectlist',
'class' => "App\Entity\Niveau02",
'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('niveau02', if ($options['appNiveau03use']) {
Select2EntityType::class, [ $builder->add('niveau03',
"label" => $options["appNiveau02label"], Select2EntityType::class, [
"required" => false, 'label' => $options['appNiveau03label'],
"remote_route" => "app_niveau02_selectlist", 'required' => false,
"class" => "App\Entity\Niveau02", 'remote_route' => 'app_niveau03_selectlist',
//"req_params" => ["niveau01" => "parent.children[niveau01]"], 'class' => "App\Entity\Niveau03",
"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['appNiveau03label'].' ==',
] ]
); );
}
# Password if ($options['appNiveau04use']) {
if($options["mode"]=="submit") { $builder->add('niveau04',
Select2EntityType::class, [
'label' => $options['appNiveau04label'],
'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', $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),
"first_options" => array("label" => "Mot de Passe","attr" => array("class" => "form-control", "style" => "margin-bottom:15px", "autocomplete" => "new-password")), 'first_options' => ['label' => 'Mot de Passe', 'attr' => ['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")), 'second_options' => ['label' => 'Confirmer 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]);
$builder->add('captcha', $builder->add('captcha',
CaptchaType::class,array( CaptchaType::class, [
"width" => 200, 'width' => 200,
"height" => 50, 'height' => 50,
"length" => 6, 'length' => 6,
) ]
); );
} }
$choices = ['oui' => '1', 'non' => '0'];
$choices=array("oui" => "1","non" => "0"); $builder->add('isvisible',
$builder->add("isvisible", ChoiceType::class, [
ChoiceType::class,array( 'label' => 'Visible',
"label" =>"Visible", 'choices' => $choices,
"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,280 @@
<?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 ('SQL' == $options['appMasteridentity'] || 'submit' == $options['mode']) {
$builder->add('password', $builder->add('password',
RepeatedType::class, [ RepeatedType::class, [
"type" => PasswordType::class, 'type' => PasswordType::class,
"required" => ($options["mode"]=="submit"), 'required' => ('submit' == $options['mode']),
"options" => ["always_empty" => true], 'options' => ['always_empty' => true],
"first_options" => ["label" => "Mot de Passe","attr" => ["autocomplete" => "new-password"]], 'first_options' => ['label' => 'Mot de Passe', 'attr' => ['autocomplete' => 'new-password']],
"second_options" => ["label" => 'Confirmer Mot de Passe'], 'second_options' => ['label' => 'Confirmer Mot de Passe'],
"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]);
} }
$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;
} }
}, },
] ]
); );
$builder->add('niveau02', if ($options['appNiveau02use']) {
Select2EntityType::class, [ $builder->add('niveau02',
"label" => $options["appNiveau02label"], Select2EntityType::class, [
"required" => false, 'label' => $options['appNiveau02label'],
"remote_route" => "app_niveau02_selectlist", 'required' => false,
"class" => "App\Entity\Niveau02", 'disabled' => ('admin' != $access && 'modo' != $access && $options['appNiveauupdatable'] > 2),
//"req_params" => ["niveau01" => "parent.children[niveau01]"], 'remote_route' => 'app_niveau02_selectlist',
"primary_key" => "id", 'class' => "App\Entity\Niveau02",
"text_property" => "label", 'primary_key' => 'id',
"minimum_input_length" => 0, 'text_property' => 'label',
"page_limit" => 10, 'minimum_input_length' => 0,
"allow_clear" => true, 'page_limit' => 10,
"delay" => 250, 'allow_clear' => true,
"cache" => false, 'delay' => 250,
"cache_timeout" => 60000, 'cache' => false,
"language" => "fr", 'cache_timeout' => 60000,
"placeholder" => "== Choisir ".$options["appNiveau02label"]." ==", 'language' => 'fr',
] '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

@ -30,7 +30,7 @@ class CronRepository extends ServiceEntityRepository
$this->getEntityManager()->flush(); $this->getEntityManager()->flush();
} }
} }
public function toExec() public function toExec()
{ {
// Les commandes à executer // Les commandes à executer
@ -38,13 +38,12 @@ class CronRepository extends ServiceEntityRepository
// = statut = 2 (OK) et derniere execution + interval > now et nombre d'appel = 0 // = statut = 2 (OK) 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 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,29 +35,30 @@ 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);
}
} }
} }
} }
@ -65,34 +66,34 @@ class GroupRepository extends ServiceEntityRepository
} }
// 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);
} }
} }
} }
} }
// 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());
$usergroup->setRolegroup(0); $usergroup->setRolegroup(0);
$this->_em->persist($usergroup); $this->_em->persist($usergroup);
$this->_em->flush(); $this->_em->flush();
} }
} }
return $user; return $user;
} }
} }

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,25 +39,26 @@ 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;
}
} }
} }
} }
@ -65,19 +66,21 @@ class Niveau01Repository extends ServiceEntityRepository
} }
return false; return false;
} }
/* Déterminer le niveau01 d'un user LDAP */ /* Déterminer le niveau01 d'un user LDAP */
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;
}
} }
} }
return false; return false;
} }
} }

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

@ -3,44 +3,52 @@
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
{ {
private $params; private $params;
public function __construct(ParameterBagInterface $params) public function __construct(ParameterBagInterface $params)
{ {
$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) {
break; $query = \Unirest\Request\Body::json($query);
}
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) {
break; $query = \Unirest\Request\Body::form($query);
}
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,162 +1,169 @@
<?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;
class AppSession { use Doctrine\ORM\EntityManagerInterface;
private $container; use Symfony\Component\DependencyInjection\ContainerInterface;
protected $em; use Symfony\Component\HttpFoundation\RequestStack;
protected $requeststack; use Symfony\Component\HttpKernel\Event\RequestEvent;
protected $token; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
public function __construct(ContainerInterface $container, EntityManagerInterface $em, RequestStack $requeststack, TokenStorageInterface $token) class AppSession
{ {
$this->container = $container; private $container;
$this->requeststack = $requeststack; protected $em;
$this->em = $em; protected $requeststack;
$this->token = $token; protected $token;
}
public function onDomainParse(RequestEvent $event) { public function __construct(ContainerInterface $container, EntityManagerInterface $em, RequestStack $requeststack, TokenStorageInterface $token)
$session = $this->requeststack->getSession(); {
$this->container = $container;
$configs = $this->em->getRepository("App\Entity\Config")->findAll(); $this->requeststack = $requeststack;
foreach($configs as $config) { $this->em = $em;
$session->set($config->getId(), strval($config->getValue())); $this->token = $token;
}
$session->set("headerimage","header/".$session->get("headerimage"));
// Calcul couleur
$session->set("colorbgbodylight-darker", $this->adjustBrightness($session->get("colorbgbodylight"),-10));
$session->set("colorfttitlelight-darker", $this->adjustBrightness($session->get("colorfttitlelight"),-50));
$session->set("colorbgbodydark-darker", $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-darkrgb", $this->hexToRgb($session->get("colorbgbodydark-darker")));
$session->set("colorbgbodydark-lightrgb", $this->hexToRgb($session->get("colorbgbodydark-lighter")));
// Current user
$token = $this->token->getToken();
if(!$token) return;
$curentuser=$token->getUser();
// Préférence par défaut
$session->set("fgheader", true);
$session->set("fgaudit", false);
// Préférence
if($curentuser!="anon.") {
$preference=$curentuser->getPreference();
if(is_array($preference)) {
// Préférence header
if(array_key_exists("fgheader",$preference)) {
$fgheader=($preference["fgheader"][0]=="true");
$session->set("fgheader", $fgheader);
}
// Préférence audit
if(array_key_exists("fgaudit",$preference)) {
$fgaudit=($preference["fgaudit"][0]=="true");
$session->set("fgaudit", $fgaudit);
}
}
}
// Permissions
$showannuaire=false;
$submitgroup=false;
if($curentuser!="anon.") {
switch($session->get("permannu")) {
case "ROLE_USER" :
$showannuaire=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")||$curentuser->hasRole("ROLE_MASTER")||$curentuser->hasRole("ROLE_USER"));
break;
case "ROLE_MASTER" :
$showannuaire=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")||$curentuser->hasRole("ROLE_MASTER"));
break;
case "ROLE_MODO" :
$showannuaire=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO"));
break;
}
switch($session->get("permgroup")) {
case "ROLE_USER" :
$submitgroup=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")||$curentuser->hasRole("ROLE_MASTER")||$curentuser->hasRole("ROLE_USER"));
break;
case "ROLE_MASTER" :
$submitgroup=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO")||$curentuser->hasRole("ROLE_MASTER"));
break;
case "ROLE_MODO" :
$submitgroup=($curentuser->hasRole("ROLE_ADMIN")||$curentuser->hasRole("ROLE_MODO"));
break;
}
}
$session->set("showannuaire", $showannuaire);
$session->set("submitgroup", $submitgroup);
// Visite
if($curentuser!="anon.") {
$now=new \DateTime();
if(!$curentuser->getVisitedate()) {
$curentuser->setVisitedate($now);
$curentuser->setVisitecpt($curentuser->getVisitecpt()+1);
$this->em->persist($curentuser);
$this->em->flush();
}
else {
$visitedate=clone $curentuser->getVisitedate();
$visitedate->add(new \DateInterval("PT1H"));
if($visitedate<$now) {
$curentuser->setVisitedate($now);
$curentuser->setVisitecpt($curentuser->getVisitecpt()+1);
$this->em->persist($curentuser);
$this->em->flush();
}
}
}
}
private function adjustBrightness($hex, $steps) {
// Steps should be between -255 and 255. Negative = darker, positive = lighter
$steps = max(-255, min(255, $steps));
// Normalize into a six character long hex string
$hex = str_replace('#', '', $hex);
if (strlen($hex) == 3) {
$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
$color_parts = str_split($hex, 2);
$return = '';
foreach ($color_parts as $color) {
$color = hexdec($color); // Convert to decimal
$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 '#'.$return;
}
public function hexToRgb($hex) {
$hex = str_replace('#', '', $hex);
$length = strlen($hex);
$rgb['r'] = hexdec($length == 6 ? substr($hex, 0, 2) : ($length == 3 ? 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['b'] = hexdec($length == 6 ? substr($hex, 4, 2) : ($length == 3 ? str_repeat(substr($hex, 2, 1), 2) : 0));
return $rgb['r'].",".$rgb['g'].",".$rgb['b'];
}
} }
public function onDomainParse(RequestEvent $event)
{
$session = $this->requeststack->getSession();
$configs = $this->em->getRepository("App\Entity\Config")->findAll();
foreach ($configs as $config) {
$session->set($config->getId(), strval($config->getValue()));
}
$session->set('headerimage', 'header/'.$session->get('headerimage'));
// Calcul couleur
$session->set('colorbgbodylight-darker', $this->adjustBrightness($session->get('colorbgbodylight'), -10));
$session->set('colorfttitlelight-darker', $this->adjustBrightness($session->get('colorfttitlelight'), -50));
$session->set('colorbgbodydark-darker', $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-darkrgb', $this->hexToRgb($session->get('colorbgbodydark-darker')));
$session->set('colorbgbodydark-lightrgb', $this->hexToRgb($session->get('colorbgbodydark-lighter')));
// Current user
$token = $this->token->getToken();
if (!$token) {
return;
}
$curentuser = $token->getUser();
// Préférence par défaut
$session->set('fgheader', true);
$session->set('fgaudit', false);
// Préférence
if ('anon.' != $curentuser) {
$preference = $curentuser->getPreference();
if (is_array($preference)) {
// Préférence header
if (array_key_exists('fgheader', $preference)) {
$fgheader = ('true' == $preference['fgheader'][0]);
$session->set('fgheader', $fgheader);
}
// Préférence audit
if (array_key_exists('fgaudit', $preference)) {
$fgaudit = ('true' == $preference['fgaudit'][0]);
$session->set('fgaudit', $fgaudit);
}
}
}
// Permissions
$showannuaire = false;
$submitgroup = false;
if ('anon.' != $curentuser) {
if ($curentuser->hasRole('ROLE_ADMIN') && null != $this->container->getParameter('appAnnuscopeadmin')) {
$showannuaire = true;
$session->set('scopeannu', $this->container->getParameter('appAnnuscopeadmin'));
} elseif ($curentuser->hasRole('ROLE_MODO') && null != $this->container->getParameter('appAnnuscopemodo')) {
$showannuaire = true;
$session->set('scopeannu', $this->container->getParameter('appAnnuscopemodo'));
} elseif ($curentuser->hasRole('ROLE_MASTER') && null != $this->container->getParameter('appAnnuscopemaster')) {
$showannuaire = true;
$session->set('scopeannu', $this->container->getParameter('appAnnuscopemaster'));
} elseif ($curentuser->hasRole('ROLE_MANAGER') && null != $this->container->getParameter('appAnnuscopemanager')) {
$showannuaire = true;
$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'));
}
if (in_array('ALL', $this->container->getParameter('appGroupsubmiter'))) {
$submitgroup = true;
} elseif ($curentuser->hasRole('ROLE_ADMIN') && in_array('ROLE_ADMIN', $this->container->getParameter('appGroupsubmiter'))) {
$submitgroup = true;
} elseif ($curentuser->hasRole('ROLE_MODO') && in_array('ROLE_MODO', $this->container->getParameter('appGroupsubmiter'))) {
$submitgroup = true;
} elseif ($curentuser->hasRole('ROLE_MASTER') && in_array('ROLE_MASTER', $this->container->getParameter('appGroupsubmiter'))) {
$submitgroup = true;
} elseif ($curentuser->hasRole('ROLE_MANAGER') && in_array('ROLE_MANAGER', $this->container->getParameter('appGroupsubmiter'))) {
$submitgroup = true;
} elseif ($curentuser->hasRole('ROLE_USER') && in_array('ROLE_USER', $this->container->getParameter('appGroupsubmiter'))) {
$submitgroup = true;
}
}
$session->set('showannuaire', $showannuaire);
$session->set('submitgroup', $submitgroup);
// Visite
if ('anon.' != $curentuser) {
$now = new \DateTime();
if (!$curentuser->getVisitedate()) {
$curentuser->setVisitedate($now);
$curentuser->setVisitecpt($curentuser->getVisitecpt() + 1);
$this->em->persist($curentuser);
$this->em->flush();
} else {
$visitedate = clone $curentuser->getVisitedate();
$visitedate->add(new \DateInterval('PT1H'));
if ($visitedate < $now) {
$curentuser->setVisitedate($now);
$curentuser->setVisitecpt($curentuser->getVisitecpt() + 1);
$this->em->persist($curentuser);
$this->em->flush();
}
}
}
}
private function adjustBrightness($hex, $steps)
{
// Steps should be between -255 and 255. Negative = darker, positive = lighter
$steps = max(-255, min(255, $steps));
// Normalize into a six character long hex string
$hex = str_replace('#', '', $hex);
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);
}
// Split into three parts: R, G and B
$color_parts = str_split($hex, 2);
$return = '';
foreach ($color_parts as $color) {
$color = hexdec($color); // Convert to decimal
$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 '#'.$return;
}
public function hexToRgb($hex)
{
$hex = str_replace('#', '', $hex);
$length = strlen($hex);
$rgb['r'] = hexdec(6 == $length ? substr($hex, 0, 2) : (3 == $length ? str_repeat(substr($hex, 0, 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(6 == $length ? substr($hex, 4, 2) : (3 == $length ? str_repeat(substr($hex, 2, 1), 2) : 0));
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->appMasteridentity = $container->getParameter("appMasteridentity"); $this->synchro = $container->getParameter('appSynchro');
$this->synchro = $container->getParameter("appSynchro"); $this->host = $container->getParameter('ldapHost');
$this->host = $container->getParameter("ldapHost"); $this->port = $container->getParameter('ldapPort');
$this->port = $container->getParameter("ldapPort"); $this->usetls = $container->getParameter('ldapUsetls');
$this->usetls = $container->getParameter("ldapUsetls"); $this->userwriter = $container->getParameter('ldapUserwriter');
$this->userwriter = $container->getParameter("ldapUserwriter"); $this->user = $container->getParameter('ldapUser');
$this->user = $container->getParameter("ldapUser"); $this->password = $container->getParameter('ldapPassword');
$this->password = $container->getParameter("ldapPassword"); $this->basedn = $container->getParameter('ldapBasedn');
$this->basedn = $container->getParameter("ldapBasedn"); $this->baseorganisation = $container->getParameter('ldapBaseorganisation');
$this->baseorganisation = $container->getParameter("ldapBaseorganisation"); $this->baseniveau01 = $container->getParameter('ldapBaseniveau01');
$this->baseniveau01 = $container->getParameter("ldapBaseniveau01"); $this->baseniveau02 = $container->getParameter('ldapBaseniveau02');
$this->baseniveau02 = $container->getParameter("ldapBaseniveau02"); $this->baseniveau03 = $container->getParameter('ldapBaseniveau03');
$this->basegroup = $container->getParameter("ldapBasegroup"); $this->baseniveau04 = $container->getParameter('ldapBaseniveau04');
$this->baseuser = $container->getParameter("ldapBaseuser"); $this->basegroup = $container->getParameter('ldapBasegroup');
$this->username = $container->getParameter("ldapUsername"); $this->baseuser = $container->getParameter('ldapBaseuser');
$this->firstname = $container->getParameter("ldapFirstname"); $this->username = $container->getParameter('ldapUsername');
$this->lastname = $container->getParameter("ldapLastname"); $this->firstname = $container->getParameter('ldapFirstname');
$this->email = $container->getParameter("ldapEmail"); $this->lastname = $container->getParameter('ldapLastname');
$this->avatar = $container->getParameter("ldapAvatar"); $this->email = $container->getParameter('ldapEmail');
$this->memberof = $container->getParameter("ldapMemberof"); $this->avatar = $container->getParameter('ldapAvatar');
$this->groupgid = $container->getParameter("ldapGroupgid"); $this->memberof = $container->getParameter('ldapMemberof');
$this->groupname = $container->getParameter("ldapGroupname"); $this->groupgid = $container->getParameter('ldapGroupgid');
$this->groupmember = $container->getParameter("ldapGroupmember"); $this->groupname = $container->getParameter('ldapGroupname');
$this->groupmemberisdn = $container->getParameter("ldapGroupmemberisdn"); $this->groupmember = $container->getParameter('ldapGroupmember');
$this->filtergroup = $container->getParameter("ldapFiltergroup"); $this->groupmemberisdn = $container->getParameter('ldapGroupmemberisdn');
$this->filteruser = $container->getParameter("ldapFilteruser"); $this->filtergroup = $container->getParameter('ldapFiltergroup');
$this->filteruser = $container->getParameter('ldapFilteruser');
$this->userattributes = [$this->username,$this->firstname,$this->lastname,$this->email,$this->avatar,$this->memberof]; $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,661 +239,1101 @@ 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;
// 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
if(!$todel) {
if($user->getNiveau02()!==null) {
$criteria = '(cn='.$user->getNiveau02()->getLabel().')';
$subbranch=$this->baseniveau02;
$result = $this->search($criteria, array('memberuid'), $subbranch);
// S'il n'est pas membre du Niveau02 on le rattache
if(empty($result)||!$this->in_array_r($user->getUsername(),$result[0])) {
$dn = $this->getNiveau02DN($user->getNiveau02()->getLabel());
$entry['memberuid'] = $user->getUsername();
$result = ldap_mod_add($connection, $dn, $entry);
if(!$result) $this->ldapError();
} }
} }
} }
return $result; // On recherche le Niveau02 en cours
} if (!$todel) {
if (null !== $user->getNiveau02()) {
$criteria = '(cn='.$user->getNiveau02()->getLabel().')';
$subbranch = $this->baseniveau02;
$result = $this->search($criteria, ['memberuid'], $subbranch);
public function deleteUser(User $user){ // S'il n'est pas membre du Niveau02 on le rattache
if (empty($result) || !$this->in_array_r($user->getUsername(), $result[0])) {
$dn = $this->getNiveau02DN($user->getNiveau02()->getLabel());
$entry['memberuid'] = $user->getUsername();
$result = ldap_mod_add($connection, $dn, $entry);
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();
}
}
}
}
return $result;
}
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['cn'] = $user->getFirstname() . ' ' . $user->getLastname(); $attrs['uid'] = $user->getUsername();
$attrs['givenname'] = $user->getFirstname(); $attrs['cn'] = $user->getFirstname().' '.$user->getLastname();
$attrs['sn'] = $user->getLastname(); $attrs['givenname'] = $user->getFirstname();
$attrs['mail'] = $user->getEmail(); $attrs['sn'] = $user->getLastname();
$attrs['displayname'] = $user->getFirstname() . ' ' . $user->getLastname(); $attrs['mail'] = $user->getEmail();
$attrs['telephonenumber'] = $user->getTelephonenumber(); $attrs['displayname'] = $user->getFirstname().' '.$user->getLastname();
$attrs['postaladdress'] = $user->getPostaladress(); $attrs['telephonenumber'] = $user->getTelephonenumber();
$attrs['userpassword'] = $user->getPassword(); $attrs['postaladdress'] = $user->getPostaladress();
$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()); 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['gidnumber'] = $niveau02->getId(); $attrs['cn'] = $niveau02->getLabel();
$attrs['gidnumber'] = $niveau02->getId();
$attrs['memberuid'] = []; $attrs['memberuid'] = [];
foreach($niveau02->getUsers() as $user) { foreach ($niveau02->getUsers() as $user) {
array_push($attrs['memberuid'],$user->getUsername()); 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()); 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
$criteria = '(cn='.$usergroup->getGroup()->getLabel().')';
$subbranch=$this->basegroup;
$result = $this->search($criteria, array('memberuid'), $subbranch);
if(!$this->in_array_r($usergroup->getUser()->getUsername(),$result[0])) { $attrs = [];
$dn = $this->getGroupDN($usergroup->getGroup()->getLabel()); $attrs['objectclass'] = $this->getObjectClassesNiveau04();
$entry['memberuid'] = $usergroup->getUser()->getUsername(); $this->fillAttributesNiveau04($niveau04, $attrs);
$result = ldap_mod_add($connection, $dn, $entry);
if(!$result) $this->ldapError(); foreach ($attrs as $key => $value) {
if (empty($value)) {
unset($attrs[$key]);
}
}
$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; $dn = $this->basedn;
$connection = $this->connect(); $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) {
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) {
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;
$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])) {
$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_add($connection, $dn, $entry);
if(!$result) $this->ldapError(); 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());
$entry['memberuid'] = $usergroup->getUser()->getUsername();
$result = ldap_mod_del($connection, $dn, $entry);
if (!$result) {
$this->ldapError();
}
} }
return $result; return $result;

View File

@ -1,52 +1,54 @@
<?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
{ {
protected $mailer; protected $mailer;
protected $twig; protected $twig;
public function __construct(MailerInterface $mailer, \Twig\Environment $twig) public function __construct(MailerInterface $mailer, \Twig\Environment $twig)
{ {
$this->mailer = $mailer; $this->mailer = $mailer;
$this->twig = $twig; $this->twig = $twig;
} }
/** /**
* 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
* @param string $to to email address or array of email addresses * @param string $to to email address or array of email addresses
* @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];
$subject = $template->renderBlock('subject', $parameters);
$bodyHtml = $template->renderBlock('body', $parameters);
try {
if(!is_array($to)) $to=[$to];
foreach($to as $t) { $parameters = ['subject' => $subject, 'body' => $body];
$subject = $template->renderBlock('subject', $parameters);
$bodyHtml = $template->renderBlock('body', $parameters);
try {
if (!is_array($to)) {
$to = [$to];
}
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();
@ -54,4 +56,4 @@ class MailService
return true; return true;
} }
} }

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,12 +48,12 @@ 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);
throw new Exception(self::ERR_UNAVAILABLE); throw new Exception(self::ERR_UNAVAILABLE);
break; break;
} }
} catch (Exception $e) { } catch (Exception $e) {
\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,35 +1,36 @@
<?php <?php
namespace App\Service; namespace App\Service;
use Symfony\Component\PasswordHasher\Exception\InvalidPasswordException; use Symfony\Component\PasswordHasher\Exception\InvalidPasswordException;
use Symfony\Component\PasswordHasher\Hasher\CheckPasswordLengthTrait; use Symfony\Component\PasswordHasher\Hasher\CheckPasswordLengthTrait;
use Symfony\Component\PasswordHasher\LegacyPasswordHasherInterface; use Symfony\Component\PasswordHasher\LegacyPasswordHasherInterface;
class PasswordEncoder implements LegacyPasswordHasherInterface class PasswordEncoder implements LegacyPasswordHasherInterface
{ {
use CheckPasswordLengthTrait; use CheckPasswordLengthTrait;
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;
} }
public function verify(string $hashedPassword, string $plainPassword, string $salt = null): bool public function verify(string $hashedPassword, string $plainPassword, string $salt = null): bool
{ {
if ('' === $plainPassword || $this->isPasswordTooLong($plainPassword)) { if ('' === $plainPassword || $this->isPasswordTooLong($plainPassword)) {
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
{ {
return false; return false;
} }
} }

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,77 +16,85 @@ 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

@ -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,12 +17,13 @@ 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)
{ {
$this->container = $container; $this->container = $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,9 +22,8 @@ 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
@ -14,19 +15,19 @@ class Niveau01uniqueValidator extends ConstraintValidator
public function __construct(EntityManagerInterface $em) public function __construct(EntityManagerInterface $em)
{ {
$this->em = $em; $this->em = $em;
} }
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
@ -14,19 +15,19 @@ class Niveau02uniqueValidator extends ConstraintValidator
public function __construct(EntityManagerInterface $em) public function __construct(EntityManagerInterface $em)
{ {
$this->em = $em; $this->em = $em;
} }
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,19 +12,16 @@ 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);
} elseif (!preg_match('#[a-zA-Z]+#', $value)) {
$this->context->addViolation($constraint->message);
} elseif (!preg_match("/[|!@#$%&*\/=?,;.:\-_+~^\\\]/", $value)) {
$this->context->addViolation($constraint->message); $this->context->addViolation($constraint->message);
} }
elseif(!preg_match("#[a-zA-Z]+#",$value)) { }
$this->context->addViolation($constraint->message);
}
elseif(!preg_match("/[|!@#$%&*\/=?,;.:\-_+~^\\\]/",$value)) {
$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
@ -14,12 +15,12 @@ class UserusernameValidator extends ConstraintValidator
public function __construct(EntityManagerInterface $em) public function __construct(EntityManagerInterface $em)
{ {
$this->em = $em; $this->em = $em;
} }
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 // On s'assure que le username n'existe pas dans la table des registration
$registration = $this->em->getRepository("App\Entity\Registration")->findOneBy(["username"=>$value]); $registration = $this->em->getRepository("App\Entity\Registration")->findOneBy(['username' => $value]);
if($registration) { if ($registration) {
$this->context->addViolation($constraint->messagenotunique); $this->context->addViolation($constraint->messagenotunique);
} }
}
}
} }
} }

View File

@ -25,12 +25,22 @@
{ {
icon: 'fa fa-building', icon: 'fa fa-building',
route: 'app_admin_niveau01', route: 'app_admin_niveau01',
name: appNiveau01label~'s', name: appNiveau01labels,
}, },
{ {
icon: 'fa fa-sitemap', icon: 'fa fa-sitemap',
route: 'app_admin_niveau02', route: 'app_admin_niveau02',
name: appNiveau02label~'s', name: appNiveau02labels,
},
{
icon: 'fas fa-store-alt',
route: 'app_admin_niveau03',
name: appNiveau03labels,
},
{
icon: 'fas fa-monument',
route: 'app_admin_niveau04',
name: appNiveau04labels,
}, },
{ {
icon: 'fa fa-users', icon: 'fa fa-users',
@ -75,7 +85,6 @@
] ]
%} %}
<div id="sidebar" class="d-flex flex-column"> <div id="sidebar" class="d-flex flex-column">
<ul class="nav nav-pills flex-column mb-auto"> <ul class="nav nav-pills flex-column mb-auto">
{% for section in sidebar %} {% for section in sidebar %}
@ -96,6 +105,10 @@
{% set toshow=true %} {% set toshow=true %}
{% if item.route=="app_admin_registration" and (appMasteridentity!="SQL" or appModeregistration is empty) %} {% set toshow=false %} {% endif %} {% if item.route=="app_admin_registration" and (appMasteridentity!="SQL" or appModeregistration is empty) %} {% set toshow=false %} {% endif %}
{% if item.route=="app_admin_whitelist" and (appMasteridentity!="SQL" or appModeregistration is empty) %} {% set toshow=false %} {% endif %} {% if item.route=="app_admin_whitelist" and (appMasteridentity!="SQL" or appModeregistration is empty) %} {% set toshow=false %} {% endif %}
{% if item.route=="app_admin_niveau02" and not appNiveau02use %} {% set toshow=false %} {% endif %}
{% if item.route=="app_admin_niveau03" and not appNiveau03use %} {% set toshow=false %} {% endif %}
{% if item.route=="app_admin_niveau04" and not appNiveau04use %} {% set toshow=false %} {% endif %}
{% if item.route=="app_admin_group" and not appGroupuse %} {% set toshow=false %} {% endif %}
{%if toshow %} {%if toshow %}
<a class="nav-link nav-link-item {% if item.route in app.request.get('_route') %}active{%endif%}" href="{{path(item.route)}}" title="{{item.name}}"> <a class="nav-link nav-link-item {% if item.route in app.request.get('_route') %}active{%endif%}" href="{{path(item.route)}}" title="{{item.name}}">

View File

@ -7,8 +7,18 @@
{ {
icon: 'fa fa-sitemap', icon: 'fa fa-sitemap',
route: 'app_modo_niveau02', route: 'app_modo_niveau02',
name: appNiveau02label~'s', name: appNiveau02labels,
},
{
icon: 'fas fa-store-alt',
route: 'app_modo_niveau03',
name: appNiveau03labels,
}, },
{
icon: 'fas fa-monument',
route: 'app_modo_niveau04',
name: appNiveau04labels,
},
{ {
icon: 'fa fa-users', icon: 'fa fa-users',
route: 'app_modo_group', route: 'app_modo_group',
@ -49,6 +59,10 @@
{% for item in section.items %} {% for item in section.items %}
{% set toshow=true %} {% set toshow=true %}
{% if item.route=="app_modo_registration" and (appMasteridentity!="SQL" or appModeregistration is empty) %} {% set toshow=false %} {% endif %} {% if item.route=="app_modo_registration" and (appMasteridentity!="SQL" or appModeregistration is empty) %} {% set toshow=false %} {% endif %}
{% if item.route=="app_modo_niveau02" and not appNiveau02use %} {% set toshow=false %} {% endif %}
{% if item.route=="app_modo_niveau03" and not appNiveau03use %} {% set toshow=false %} {% endif %}
{% if item.route=="app_modo_niveau04" and not appNiveau04use %} {% set toshow=false %} {% endif %}
{% if item.route=="app_modo_group" and not appGroupuse %} {% set toshow=false %} {% endif %}
{%if toshow %} {%if toshow %}
<a class="nav-link nav-link-item {% if item.route in app.request.get('_route') %}active{%endif%}" href="{{path(item.route)}}" title="{{item.name}}"> <a class="nav-link nav-link-item {% if item.route in app.request.get('_route') %}active{%endif%}" href="{{path(item.route)}}" title="{{item.name}}">

View File

@ -1,7 +1,7 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block body %} {% block body %}
<h1 class="page-header">Gestion des {{ appNiveau01label }}s </h1> <h1 class="page-header">Gestion des {{ appNiveau01labels }} </h1>
<p> <p>
<a class="btn btn-success" href={{ path('app_admin_niveau01_submit') }}>Ajouter</a> <a class="btn btn-success" href={{ path('app_admin_niveau01_submit') }}>Ajouter</a>
@ -12,7 +12,7 @@
<div class="card mt-4"> <div class="card mt-4">
<div class="card-header"> <div class="card-header">
<i class="fa fa-table fa-fw"></i> Liste des {{ appNiveau01label }}s <i class="fa fa-table fa-fw"></i> Liste des {{ appNiveau01labels }}
</div> </div>
<div class="card-body"> <div class="card-body">

View File

@ -1,7 +1,7 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block body %} {% block body %}
<h1 class="page-header">Gestion des {{ appNiveau02label }}s </h1> <h1 class="page-header">Gestion des {{ appNiveau02labels }} </h1>
<p> <p>
<a class="btn btn-success" href={{ path('app_'~access~'_niveau02_submit') }}>Ajouter</a> <a class="btn btn-success" href={{ path('app_'~access~'_niveau02_submit') }}>Ajouter</a>
@ -12,7 +12,7 @@
<div class="card mt-4"> <div class="card mt-4">
<div class="card-header"> <div class="card-header">
<i class="fa fa-table fa-fw"></i> Liste des {{ appNiveau02label }}s <i class="fa fa-table fa-fw"></i> Liste des {{ appNiveau02labels }}
</div> </div>
<div class="card-body"> <div class="card-body">

View File

@ -0,0 +1,92 @@
{% extends 'base.html.twig' %}
{% block body %}
{{ form_start(form) }}
<h1 class="page-header">
{% if mode=="update" %}
Modification {{ appNiveau03label }} = {{niveau03.label}}
{% elseif mode=="submit" %}
Création {{ appNiveau02label }}
{% endif %}
</h1>
{{ form_widget(form.submit) }}
<a class="btn btn-secondary" href={{ path('app_'~access~'_niveau03') }}>Annuler</a>
{% if mode=="update" %}
<a class="btn btn-danger float-end" href={{ path('app_'~access~'_niveau03_delete',{id:niveau03.id}) }} data-method="delete" data-confirm="Êtes-vous sûr de vouloir supprimer cet enregistrement ?">Supprimer</a>
{% endif %}
{% if app.session.flashbag.has('error') %}
<div class='alert alert-danger' style='margin: 5px 0px'>
<strong>Erreur</strong><br>
{% for flashMessage in app.session.flashbag.get('error') %}
{{ flashMessage }}<br>
{% endfor %}
</div>
{% endif %}
{% if app.session.flashbag.has('notice') %}
<div class='alert alert-info' style='margin: 5px 0px'>
<strong>Information</strong><br>
{% for flashMessage in app.session.flashbag.get('notice') %}
{{ flashMessage }}<br>
{% endfor %}
</div>
{% endif %}
<div class="card mt-4">
<div class="card-header">
<i class="fa fa-pencil-alt fa-fw"></i> Informations
</div>
<div class="card-body">
{{ form_row(form.niveau01) }}
{{ form_row(form.niveau02) }}
{{ form_row(form.label) }}
<div class='alert alert-info' style='font-size: 80%;padding: 5px;margin-top:-2px; border-radius:0px 0px 0.25rem 0.25rem'>
Caractères interdits = caractères spéciaux sauf ' @ . - _<br>
</div>
{% if form.ldapfilter is defined %}
{{ form_row(form.ldapfilter) }}
{% endif %}
{% if form.attributes is defined %}
{{ form_row(form.attributes) }}
{% endif %}
</div>
</div>
{% if auditUse and mode=="update" and (access=="admin" or access=="modo" or access=="audit") %}
<div class="float-end" style="width:700px;max-width:100%">
{{ render(path("app_"~access~"_audit_renderid",{entityname:"Niveau02",entityid:niveau03.id})) }}
</div>
{% endif %}
{{ form_end(form) }}
{% endblock %}
{% block localscript %}
<script>
$(document.body).on("change","#niveau03_niveau01",function(){
$("#niveau03_niveau02").empty();
select2niveau02();
});
function select2niveau02() {
$('#niveau03_niveau02').select2({
theme: 'bootstrap4',
language: "fr",
ajax: {
data: function (params) {
var query = {
niveau01: $("#niveau03_niveau01").val(),
}
return query;
}
}
});
}
</script>
{% endblock %}

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