Commit 022b8f63 authored by Fabrice Gangler's avatar Fabrice Gangler 🎨
Browse files

Comptoir v2.9.3

parents 88f12d2e da1a05e1
Pipeline #13567 failed with stage
in 8 minutes and 55 seconds
......@@ -5,6 +5,17 @@ Tous les changements notables de ce projet sont documentés dans ce fichier.
Le format s'appuie sur [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
et le projet suit [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## 2.9.3 - 2021-04-06
### Fixed
- [#956](https://gitlab.adullact.net/Comptoir/Comptoir-srv/issues/956) UX - Ajout d'un bouton "Modifier votre profil" sur la page de l'utilisateur
- [#955](https://gitlab.adullact.net/Comptoir/Comptoir-srv/issues/955) UX - Empêcher l'utilisateur connecté d'afficher les formulaires de connexion et de création d'un compte
- [#954](https://gitlab.adullact.net/Comptoir/Comptoir-srv/issues/954) SEO - Les URLs `/fr/tags/<id>/` doivent rediriger vers `/fr/tags/<id>/software`
- [#953](https://gitlab.adullact.net/Comptoir/Comptoir-srv/issues/953) Compte utilisateur : vérifier le format de l'URL du site web (backend)
- [#952](https://gitlab.adullact.net/Comptoir/Comptoir-srv/issues/952) Formulaire inscription : renforcer l'anti-spam (interdire la réutilisation de token dès la 1er detection)
## [2.9.2](https://gitlab.adullact.net/Comptoir/Comptoir-srv/tags/v2.9.2) - 2021-03-23
### Fixed
......
......@@ -23,7 +23,7 @@ ID,nom,fonction,annees,statut,parent,public,similaire-a,wikidata,comptoir-du-lib
22,Chromium,Navigateurs,2018 ; 2019 ; 2020 ; 2021,R,,,,Q48524,193,BSD-3-Clause,Conception & Développement,Test & Intégration,Poste développeur,MIMDEV,Dernière
23,ClamAV,Antivirus : Orienté serveur,2018 ; 2019 ; 2020 ; 2021,R,,,,Q852000,211,GPL-2.0-only,Sécurité,Antivirus,Serveur Bureautique,MIMPROD,Distribution
24,CockroachDB,Base transactionnelle cluster,2019 ; 2020 ; 2021,O,,,,,303,,Données et contenu,BD Relationnelles,Base de production,MIMPROD,2
25,CodeceptJS,Framework de tests backend,2019 ; 2020 ; 2021,O,,,,,306,MIT,Conception & Développement,Test & Intégration,,MIMDEV,2.4.1
25,CodeceptJS,Cadriciel de tests backend,2019 ; 2020 ; 2021,O,,,,,306,MIT,Conception & Développement,Test & Intégration,,MIMDEV,2.4.1
26,Consul,Déploiement,2018 ; 2019 ; 2020 ; 2021,O,,,,Q28709844,226,MPL-2.0,Opérations,Outils système & virtualisation,Services déconcentrés,MIMPROD,Distribution
27,Corosync,Haute Disponibilté,2018 ; 2019 ; 2020 ; 2021,R,,,,,235,BSD-3-Clause,Logiciel Système et Virtualisation,Haute disponibilité (OS),Infra virtuelle,MIMPROD,Distribution
28,CUPS,Serveur d'impression,2018 ; 2019 ; 2020 ; 2021,R,,,,Q868171,217,,Intégration & Échanges,Serveur d'impression,Services déconcentrés,MIMPROD,Distribution
......@@ -95,7 +95,7 @@ ID,nom,fonction,annees,statut,parent,public,similaire-a,wikidata,comptoir-du-lib
94,Nexus,Dépôt d'artefacts,2018 ; 2019 ; 2020 ; 2021,R,,,,,178,EPL-1.0,Conception & Développement,"Installation, Packaging, Diffusion et Distribution",,MIMDEV,3.18.1-01
95,NGINX,Serveur web et reverse proxy,2018 ; 2019 ; 2020 ; 2021,R,,,,Q306144,213,BSD-2-Clause,Réseau,Serveur Web & Reverse Proxy,Services déconcentrés,MIMPROD,Distribution
96,NodeJS,Environnement de développement,2018 ; 2019 ; 2020 ; 2021,R,,,,Q756100,238,X11,Conception & Développement,Serveur d'application,,MIMDEV,8
97,Notepad++,Éditeur de textes,2018 ; 2019 ; 2020 ; 2021,R,,,174 ; 215 ; 38,Q2033,55,GPL-2.0-only,Espace utilisateur et canal,Consultation et édition de documents,,MIMO,7.8.2
97,Notepad++,Éditeur de textes,2018 ; 2019 ; 2020 ; 2021,R,,,174 ; 215 ; 38,Q2033,55,GPL-2.0-only,Espace utilisateur et canal,Consultation et édition de documents,,MIMO,7.9.5
98,Npm,Gestionnaire de paquets pour Node.js,2018 ; 2019 ; 2020 ; 2021,R,,,,Q7067518,179,Artistic-2.0,Conception & Développement,"Installation, Packaging, Diffusion et Distribution",,MIMDEV,Dernière
99,NVDA,Lecteur d'écran,2018 ; 2019 ; 2020 ; 2021,R,,,,Q1116614,63,GPL-2.0-only,Espace utilisateur et canal,Accessibilité,,MIMO,2020.4
100,OBS Studio,Régie video pour enregistrement et/ou streaming,2019 ; 2020 ; 2021,R,,,,Q21707789,285,GPL-2.0-only,Espace utilisateur et canal,Consultation et édition de documents,,MIMO,26.1.x
......@@ -128,7 +128,7 @@ ID,nom,fonction,annees,statut,parent,public,similaire-a,wikidata,comptoir-du-lib
128,Scribus,PAO,2018 ; 2019 ; 2020 ; 2021,R,,,,Q8295,76,GPL-2.0-only,Espace utilisateur et canal,Consultation et édition de documents,,MIMO,1.5
129,Selenium IDE,Automatisation des tests Web,2018 ; 2019,FR,,,,Q752522,311,Apache-2.0,Conception & Développement,Test & Intégration,,MIMDEV,3.14
130,Selenium Server,Automatisation des tests Web,2018 ; 2019 ; 2020 ; 2021,R,,,,,188,Apache-2.0,Conception & Développement,Test & Intégration,,MIMDEV,3.14
131,Shinken,Supervision Infrastructure et composants,2019 ; 2020 ; 2021,R,,,,Q3482264,302,AGPL-3.0-only,Opérations,Supervision / Hypervision,Infra virtuelle,MIMPROD,2.4.3
131,Shinken,Supervision Infrastructure et composants,2019 ; 2020 ;,FR,,,,Q3482264,302,AGPL-3.0-only,Opérations,Supervision / Hypervision,Infra virtuelle,MIMPROD,2.4.3
132,SOAP UI Open Source,Outil d'aide aux tests techniques,2018 ; 2019 ; 2020 ; 2021,R,,,,Q2296314,186,EUPL-1.1,Conception & Développement,Test & Intégration,Tests orientés Web Services,MIMDEV,5.6.x
133,SonarQube,Tableau de bord d'indicateurs de qualité,2018 ; 2019 ; 2020 ; 2021,R,,,,Q541691,181,LGPL-3.0-only,Conception & Développement,Qualité et sécurité du code source,,MIMDEV,7.9
134,SonarQube Plugins : FindBugs,Tableau de bord d'indicateurs de qualité,2018 ; 2019 ; 2020 ; 2021,R,SonarQube,,,,307,,Conception & Développement,Qualité et sécurité du code source,,MIMDEV,6.7 (à confirmer)
......@@ -194,7 +194,7 @@ ID,nom,fonction,annees,statut,parent,public,similaire-a,wikidata,comptoir-du-lib
194,VITAM,Solution d'archivage électronique,2020 ; 2021,R,,Oui,185,Q65130365,323,CECILL-2.1,Espace utilisateur et canal,Outil de productivité,[www.programmevitam.fr](https://www.programmevitam.fr),MIMO,2.1.18
195,Opale,Création de module de formation linéaire multi-support,2020 ; 2021,O,,,,Q91312803,380,"MPL-2.0, GPL-3.0, LGPL-3.0, CECILL-2.1",Espace utilisateur et canal,Outil de productivité,"Création de module de formation pour utilisation en ligne ou présentielle, avec des ressources interactives, cf. [support web](https://example.scenari.software/Opale@3.7/auroraW) et [support papier](https:// example.scenari.software/Opale@3.7/paper)",MIMO,3.7
196,BigBlueButton,Serveur de visioconférence pour navigateurs WEB en HTML5,2020 ; 2021,R,,,67,Q4904858,384,LGPL-3.0,Espace utilisateur et canal,Outil de productivité,"Cours en ligne, formation et présentation à distance à l'académie de Versailles",MIMO,2.2
197,Peertube,Plateforme d'hébergement décentralisée de vidéos,2020 ; 2021,O,,,210,Q50938515,140,AGPL-3.0-or-later,Espace utilisateur et canal,Outil de productivité,,MIMPROD,2.x
197,Peertube,Plateforme d'hébergement décentralisée de vidéos,2020 ; 2021,O,,,210,Q50938515,140,AGPL-3.0-or-later,Espace utilisateur et canal,Outil de productivité,,MIMPROD,3.x
198,Rancher,Outil d'orchestration de conteneurs,2020 ; 2021,O,,,75,,386,Apache-2.0,Opérations,Outils système & virtualisation,,MIMPROD,
199,exodus-privacy (standalone),Analyseur statique d'apk,2020 ; 2021,O,,,,Q60348651,385,AGPL-3.0,Conception & Développement,Test & Intégration,,MIMDEV,1.1.1
200,OpenFisca,Moteur de calcul socio-fiscal - [openfisca.org](https://openfisca.org),2020 ; 2021,R,,Oui,,Q64777688,387,AGPL-3.0,Opérations,Outil métier,Calculs socio-fiscaux / Évaluation des politiques publiques,MIMDEV,34.7.3
......@@ -208,7 +208,7 @@ ID,nom,fonction,annees,statut,parent,public,similaire-a,wikidata,comptoir-du-lib
208,Moodle,Plateforme d'apprentissage à distance,2020 ; 2021,R,,,"209, 216",Q190434,250,GPL-3.0,Données et contenu,Gestion de contenu web,,MIMO,3.9
209,Open EDX,Plateforme d'apprentissage à distance,2020 ; 2021,R,,,"208, 216",Q2106448,396,AGPL-3.0,Données et contenu,Gestion de contenu web,,MIMO,
210,Esup-Pod,Plateforme de gestion de fichiers vidéo,2020 ; 2021,R,,,197,,397,LGPL-3.0,Données et contenu,Gestion de contenu web,,MIMO,2.7.x
211,SPIP,Système de gestion de contenus web,2020 ; 2021,R,,,36 ; 162 ; 173 ; 203,Q1536426,36,GPL-3.0,Données et contenu,Gestion de contenu web,,MIMO,3.2.8
211,SPIP,Système de gestion de contenus web,2020 ; 2021,R,,,36 ; 162 ; 173 ; 203,Q1536426,36,GPL-3.0,Données et contenu,Gestion de contenu web,,MIMO,3.2.9
212,Pentaho CE,Plateforme BI,2020 ; 2021,O,,,,Q644841,105,"GPL-2.0, LGPL-2, MPL-1.1",Opérations,Outil métier,,MIMO,
213,Tracim,Outil de gestion des connaissances,2020 ; 2021,R,,,,,273,"MIT, LGPL-3, AGPL-3",Données et contenu,Gestion de contenu web,,MIMO,
214,XWiki,Moteur de wiki,2020 ; 2021,R,,,86,Q526699,11,LGPL-2.1,Orchestration et logique métier,Outil collaboratif,,MIMO,10.11.3
......@@ -219,3 +219,4 @@ ID,nom,fonction,annees,statut,parent,public,similaire-a,wikidata,comptoir-du-lib
219,Apache Superset,Logiciel de datavisualisation,2021,R,,,,Q68705831,418,Apache-2.0,Opérations,Outil métier,,MIMPROD,0.38
220,uPortal,Portail pour l'enseignement supérieur et le secondaire,2021,R,,,,Q3547301,419,Apache-2.0,Données et contenu,Gestion de contenu web,,MIMO,5.2.x
221,Tuleap,Gestionnaire de cycle applicatif,2021,R,,,,Q3541946,325,GPL-2.0,Conception & développement,Gestionnaire de cycle applicatif,,MIMPROD,12.2-1
222,Dash,"Cadriciel d'applications web basé sur Flask (Python), React et Plotly.js",2021,O,,,,Q106081011,424,MIT,Conception & développement,Gestionnaire de cycle applicatif,,MIMDEV,1.19.0
......@@ -148,7 +148,6 @@ INSERT INTO softwares_tags (software_id, tag_id) VALUES ('298', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('299', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('300', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('301', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('302', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('303', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('304', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('305', '474');
......@@ -195,3 +194,4 @@ INSERT INTO softwares_tags (software_id, tag_id) VALUES ('400', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('404', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('418', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('419', '474');
INSERT INTO softwares_tags (software_id, tag_id) VALUES ('424', '474');
-- Tag SILL-2020 ---> [ID 258]
UPDATE public.tags
SET description_i18n_fr = '<p>
Co-construit par des communautés d’agents publics informaticiens de
l’État (les référents « SILL »), le <a href="https://sill.etalab.gouv.fr">socle interministériel des
logiciels libres</a> est le catalogue de référence des logiciels libres
recommandés par l’État. Tous ces logiciels sont utilisés dans un
cadre de production dans au moins l’une des administrations
contributrices.
</p>
<p>
Son périmètre - ne couvrant pas la totalité du système d’information
de l’État - classe les logiciels par thématiques : poste de travail,
gestion de parc, exploitation de serveurs et de bases de données et
environnements de développement.
</p>
<p>
Sous forme de <a href="https://sill.etalab.gouv.fr/fr/software?year=2020">site web</a>,
il permet d’identifier rapidement le
logiciel et la version minimale recommandée (toute administration
est libre d’utiliser une version plus récente). Il est également
possible de consulter l’état d’avancement du statut d’un logiciel,
selon qu’il est en cours d’observation ou recommandé.
Le SILL, <a href="https://sill.etalab.gouv.fr" title="SILL : Socle Interministériel des
Logiciels Libres">Socle Interministériel des
Logiciels Libres</a>, est une liste de logiciels libres
significativement utilisés dans des organismes publics rattachés à la fonction publique
d''État ou hospitalière et qui forment un catalogue de référence pour l''administration.
</p>'
WHERE id = 258;
-- Tag SILL-2021 ---> [ID 258]
UPDATE public.tags
SET description_i18n_fr = '<p>
Co-construit par des communautés d’agents publics informaticiens de
l’État (les référents « SILL »), le <a href="https://sill.etalab.gouv.fr">socle interministériel des
logiciels libres</a> est le catalogue de référence des logiciels libres
recommandés par l’État. Tous ces logiciels sont utilisés dans un
cadre de production dans au moins l’une des administrations
contributrices.
</p>
<p>
Son périmètre - ne couvrant pas la totalité du système d’information
de l’État - classe les logiciels par thématiques : poste de travail,
gestion de parc, exploitation de serveurs et de bases de données et
environnements de développement.
</p>
<p>
Sous forme de <a href="https://sill.etalab.gouv.fr/fr/software?year=2021">site web</a>,
il permet d’identifier rapidement le
logiciel et la version minimale recommandée (toute administration
est libre d’utiliser une version plus récente). Il est également
possible de consulter l’état d’avancement du statut d’un logiciel,
selon qu’il est en cours d’observation ou recommandé.
</p>'
WHERE id = 474;
......@@ -14,7 +14,7 @@ Once the code in `develop` is ready, merge into `master` like follows:
```sh
git checkout master
MYTAG="vX.Y.Z"
git merge develop --no-ff --no-verify -m "Comptoir $MYTAG"
git merge develop --no-verify --no-ff -m "Comptoir $MYTAG"
git tag -a $MYTAG -m "$MYTAG"
git push origin master
git push origin $MYTAG
......
# How to upgrade from v2.9.2 to v2.9.3
## 1) First backup (DB + images files)
```bash
# (1) user comptoir
sudo su comptoir
# First backup (DB + images files)
/home/comptoir/Comptoir-srv/bin/COMPTOIR_export_DB_data_AND_images.sh
/home/comptoir/Comptoir-srv/bin/COMPTOIR_export_DB_structure_only.sh
ls -lh /home/comptoir/Comptoir-EXPORT/
```
## 2) Preloading vendor directory
```bash
# (1) use the user "comptoir"
sudo su comptoir
# Preloading vendor
mkdir /home/comptoir/tmp_migration
cd /home/comptoir/tmp_migration
git clone https://gitlab.adullact.net/Comptoir/Comptoir-srv.git
mv Comptoir-srv/ Comptoir_tmp_update_vendor
cd Comptoir_tmp_update_vendor/
git checkout origin/master
git log --decorate --oneline --graph --all
composer check-platform-reqs
composer validate
composer install
```
## 3) Activate maintenance site
see:
[www-maintenance-comptoir](https://gitlab.adullact.net/Adullact-prive/comptoir-prive/www-maintenance-comptoir)
(private repository)
```bash
# (1) use your user
# Activate maintenance site
sudo a2dissite 25-https_comptoir-du-libre.org.conf
sudo a2ensite 30-503-MAINTENANCE_https_comptoir-du-libre.org.conf
sudo service apache2 reload
# on your computer, the following command lines
# must retrun an HTTP 500 response
curl -v https://comptoir-du-libre.org/
curl -v https://comptoir-du-libre.org/notFoundPage
```
## 4) Backup before migration (DB + images files + main directory)
```bash
# (1) user comptoir
sudo su comptoir
# Second backup (DB + images files)
/home/comptoir/Comptoir-srv/bin/COMPTOIR_export_DB_data_AND_images.sh
/home/comptoir/Comptoir-srv/bin/COMPTOIR_export_DB_structure_only.sh
ls -lh /home/comptoir/Comptoir-EXPORT/
# Backup main directory
cd /home/comptoir/
DATE=$(date +"%Y.%m.%d_%Hh%M")
tar -czvf "Comptoir-srv_BACKUP_${DATE}.tar.gz" Comptoir-srv
```
## 5) Update source code
```bash
# (1) user comptoir
sudo su comptoir
# Update source code
cd /home/comptoir/Comptoir-srv
rm -rvf vendor/
git remote -v
git remote update -p
git checkout origin/master
git log --decorate --oneline --graph --all
```
## 6) Update vendor directory + clean cache
```bash
# (1) user comptoir
sudo su comptoir
# Update vendor directory (see step 2 "Preloading vendor directory")
cd /home/comptoir/Comptoir-srv
rm -rvf vendor/
mv -v ../tmp_migration/Comptoir_tmp_update_vendor/vendor ./
# Clean cache
cd /home/comptoir/Comptoir-srv
bin/cake cache clear_all
```
## 7) Apply migration of the database (new tables, adding fields, ...)
The following changes must be recorded in the [production version tracking](https://gitlab.adullact.net/Adullact-prive/comptoir-prive/Exploitation-Comptoir/-/blob/master/Suivi-versions-PROD.md) file.
```bash
# (1) user comptoir
sudo su comptoir
# Apply migration of the database (new tables, adding fields, ...)
cd /home/comptoir/Comptoir-srv
bin/cake migrations migrate
# Now you can apply additional changes in SQL with pgsl
# ---> nothing to do here for this version
```
## 8) Update config files
The following changes must be recorded in the [production version tracking](https://gitlab.adullact.net/Adullact-prive/comptoir-prive/Exploitation-Comptoir/-/blob/master/Suivi-versions-PROD.md) file.
nothing to do here for this version
```bash
# (1) user comptoir
sudo su comptoir
# Apply additional changes in config files
cd /home/comptoir/Comptoir-srv
vim config/comptoir.php # ---> nothing to do here for this version
vim config/app.php # ---> nothing to do here for this version
```
## 9) Enable the main website
see:
[www-maintenance-comptoir](https://gitlab.adullact.net/Adullact-prive/comptoir-prive/www-maintenance-comptoir)
(private repository)
```bash
# (1) use your user
# Enable the main website
sudo a2dissite 30-503-MAINTENANCE_https_comptoir-du-libre.org.conf
sudo a2ensite 25-https_comptoir-du-libre.org.conf
sudo service apache2 reload
# on your computer, the first following command line
# must return an HTTP 200 response code
# and the second return an HTTP 404 response code.
curl -v https://comptoir-du-libre.org/
curl -v https://comptoir-du-libre.org/notFoundPage
```
## 10) Backup after upgraded
```bash
# (1) user comptoir
sudo su comptoir
# Backup after upgraded (DB + images files)
/home/comptoir/Comptoir-srv/bin/COMPTOIR_export_DB_data_AND_images.sh
/home/comptoir/Comptoir-srv/bin/COMPTOIR_export_DB_structure_only.sh
ls -lh /home/comptoir/Comptoir-EXPORT/
```
## 11) Clean up
```bash
# (1) user comptoir
sudo su comptoir
# Clean up
cd /home/comptoir/
rm -rvf tmp_migration/
rm -v Comptoir-srv_BACKUP_*.tar.gz
```
......@@ -252,6 +252,15 @@ Configure::write('DATABASETEST', 'tests');
// Max number of elements (screenshots/review...) display
Configure::write('MAX_DISPLAY', 3);
// Min time to send sign up form (limit spam by bots)
Configure::write('DEFAULT_MIN_TIME_TO_SEND_SIGNUP_FORM', 5); // 5 secondes
if (defined('TEST_BYPASS_DEFAULT_MIN_TIME_TO_SEND_SIGNUP_FORM')) { // used by unit test and CI
Configure::write('MIN_TIME_TO_SEND_SIGNUP_FORM', TEST_BYPASS_DEFAULT_MIN_TIME_TO_SEND_SIGNUP_FORM);
} else {
Configure::write('MIN_TIME_TO_SEND_SIGNUP_FORM', Configure::read('DEFAULT_MIN_TIME_TO_SEND_SIGNUP_FORM'));
}
// Session duration
Configure::write('Session', [
'defaults' => 'php',
......@@ -277,11 +286,14 @@ Configure::write(
]
);
//
// Version of comptoir
Configure::write(
'VERSION',
[
"footer" => "v2.9.2"
"footer" => "v2.9.3"
]
);
......
......@@ -160,7 +160,11 @@ class TagsController extends AppController
}
/**
* View method of a given tag
* API view method of a given tag
*
* URL : API /$lang/tags/$idTag.json
* Webapp /$lang/tags/$idTag ---> redirect 301 to /$lang/tags/$idTag/software
* /$lang/tags/$idTag/ ---> redirect 301 to /$lang/tags/$idTag/software
*
* @param string|null $id Tag id.
* @return Response|null
......@@ -168,17 +172,23 @@ class TagsController extends AppController
*/
public function view($id = null)
{
if ($this->request->is('json')) {
$tag = $this->Tags->get(
$id,
['contain' => ['Softwares']]
);
$tag = $this->Tags->get(
$id,
['contain' => ['Softwares']]
);
$this->set('tag', $tag);
$this->set('_serialize', ['tag']);
return null;
$this->set('tag', $tag);
$this->set('_serialize', ['tag']);
return null;
} else {
$idTag = (int) $id;
$lang = $this->selectedLanguage;
return $this->redirect("/$lang/tags/$idTag/software", 301);
}
}
/**
* Returns a list of software associated to a given tag
*
......
......@@ -472,9 +472,10 @@ class UsersController extends AppController
* - save tokens in user session
* - return token for HTTP GET method
*
* @param false $cleanBeforeCreateTokens
* @return string token for HTTP GET method
*/
private function addUserCreateTokens()
private function addUserCreateTokens($cleanBeforeCreateTokens = false)
{
$prefixToken = bin2hex(openssl_random_pseudo_bytes(12));
$getSuffixToken = bin2hex(openssl_random_pseudo_bytes(12));
......@@ -482,7 +483,7 @@ class UsersController extends AppController
$formSuffixToken = bin2hex(openssl_random_pseudo_bytes(12));
$dataToken = $this->request->session()->read('CreateUserAntiSpam');
if (is_null($dataToken)) {
if (is_null($dataToken) | $cleanBeforeCreateTokens === true) {
$dataToken = [];
}
$dataToken["$prefixToken"] = [
......@@ -572,7 +573,7 @@ class UsersController extends AppController
if (isset($availableTokens["$prefixToken"])) {
$tokenTimestamp = $availableTokens["$prefixToken"]['date'];
$diffTimestamp = time() - $tokenTimestamp;
if ($diffTimestamp >= 4) { // @@@TODO magic number !!!
if ($diffTimestamp >= Configure::read('MIN_TIME_TO_SEND_SIGNUP_FORM')) {
return false;
}
}
......@@ -589,6 +590,12 @@ class UsersController extends AppController
{
$message = "";
$lang = $this->selectedLanguage;
// If user is already logged in, redirects them to their profile page
if (!is_null($this->Auth->user('id'))) {
return $this->redirect("/$lang/users/". $this->Auth->user('id'));
}
if (!empty($this->request->data)) {
$user = $this->Users->newEntity($this->request->data);
} else {
......@@ -596,8 +603,12 @@ class UsersController extends AppController
}
// Force token-based URL (HTTP GET and POST methods), expect for json API
if (!$this->request->is('json') && $this->addUserIsValidTokenInUrl() === false) {
return $this->redirect("/$lang/users/add?t1=". $this->addUserCreateTokens());
if (!$this->request->is('json')) {
if ($this->request->method() === 'GET' && count($this->request->query) === 0) { // default page: /users/add
return $this->redirect("/$lang/users/add?t1=". $this->addUserCreateTokens(false));
} elseif ($this->addUserIsValidTokenInUrl() === false) {
return $this->redirect("/$lang/users/add?t1=". $this->addUserCreateTokens(true));
}
}
// Process form data
......@@ -607,7 +618,7 @@ class UsersController extends AppController
$expectedFormToken = $this->addUserGetTokenByType('form');
$formToken = $this->request->data("formToken");
if ($expectedFormToken !== $formToken | $this->addUserIsFormSentTooQuickly()) {
return $this->redirect("/$lang/users/add?t1=". $this->addUserCreateTokens());
return $this->redirect("/$lang/users/add?t1=". $this->addUserCreateTokens(true));
}
}
......@@ -1266,13 +1277,19 @@ class UsersController extends AppController
*/
public function login()
{
$lang = $this->selectedLanguage;
// If user is already logged in, redirects them to their profile page
if (!is_null($this->Auth->user('id'))) {
return $this->redirect("/$lang/users/". $this->Auth->user('id'));
}
if ($this->request->is('post')) {
$user = $this->Auth->identify();
if ($user) {
$user["user_type"] = $this->Users->UserTypes->get($user["user_type_id"])->get("name");
$this->Auth->setUser($user);
$this->Flash->success(__d("Forms", "You are logged"));
$lang = $this->selectedLanguage;
return $this->redirect($this->Auth->redirectUrl("/$lang/"));
}
$this->Flash->error(__d("Forms", "You are not logged"));
......
......@@ -166,3 +166,20 @@ msgstr ""
msgid "User type : "
msgstr ""
#: Template/Api/V1/Users/view.ctp:95
msgid "userProfil.editLink"
msgstr "Edit your profile"
#: Template/Api/V1/Users/view.ctp:96
msgid "userProfil.editLink.title"
msgstr "Edit your profile: name, avatar, website and description"
#: Template/Api/V1/Users/view.ctp:100
msgid "admin.userProfil.editLink"
msgstr "Edit user profil"
#: Template/Api/V1/Users/view.ctp:101
msgid "admin.userProfil.editLink.title"
msgstr "Edit user profil {0}"
......@@ -168,3 +168,19 @@ msgstr ""
#: View/Helper/UserHelper.php:64;70;76;82
msgid "User type : "
msgstr ""
#: Template/Api/V1/Users/view.ctp:95
msgid "userProfil.editLink"
msgstr "Edit your profile"
#: Template/Api/V1/Users/view.ctp:96
msgid "userProfil.editLink.title"
msgstr "Edit your profile: name, avatar, website and description"
#: Template/Api/V1/Users/view.ctp:100
msgid "admin.userProfil.editLink"
msgstr "Edit user profil"
#: Template/Api/V1/Users/view.ctp:101
msgid "admin.userProfil.editLink.title"
msgstr "Edit user profil {0}"
......@@ -169,3 +169,19 @@ msgstr "Aller sur la page de {0}"
#: View/Helper/UserHelper.php:64;70;76;82
msgid "User type : "
msgstr "Type d'utilisateur : "
#: Template/Api/V1/Users/view.ctp:95
msgid "userProfil.editLink"
msgstr "Modifier votre profil"
#: Template/Api/V1/Users/view.ctp:96
msgid "userProfil.editLink.title"
msgstr "Modifier votre profil : nom, avatar, site web et description"
#: Template/Api/V1/Users/view.ctp:100
msgid "admin.userProfil.editLink"
msgstr "Modifier l'utilisateur"
#: Template/Api/V1/Users/view.ctp:101
msgid "admin.userProfil.editLink.title"
msgstr "Modifier l'utilisateur {0}"
......@@ -521,8 +521,20 @@ class UsersTable extends Table
$validator
->allowEmpty('logo_directory');
// URL field: allow only a valid URL with HTTP scheme ('https://' or 'http://')
$validator
->allowEmpty('url');
->allowEmpty('url')
->add('url', [
'validUrlFormat' => [
'rule' => array('url'),
'last' => true,
'message' => 'Please enter a valid URL'
],
'isHttpProtocol' => [
'rule' => array('custom', '/^(http|https)(:\/\/)/i'),
'message' => 'Please enter a valid URL'
]
]);
$validator
->allowEmpty('description');
......
......@@ -32,7 +32,6 @@ $this->assign('title', __d("Users", "User {0}", $user->username));
['escape' => false]) ?>
<?php endif; ?>
</div>
</div>
<div class="col-xs-12 col-sm-8 col-md-8 col-lg-8">
......@@ -82,6 +81,36 @@ $this->assign('title', __d("Users", "User {0}", $user->username));
'controller' => "Users",
'extraCssClass' => "contact-user inline-block",
]);
// Add link (edit user profil):
// - if ID of connected user is same as ID of the current page user
// - if connected user can edit all users (role = admin)
if ($this->request->session()->read('Auth.User.id') === $user->id
| $this->request->session()->read('Auth.User.role') === 'admin' ) {
$userId = $user->id;
$url = "/fr/users/edit/$userId";