diff --git a/.drone.yml b/.drone.yml
index de0f205..0f8da2b 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -1,22 +1,31 @@
---
global-variables:
+ release: &release ${DRONE_TAG}
environment: &environment
- CRE_PORT: 9103
- CRE_RELEASE: ${DRONE_BRANCH##**/}
+ DOCS_VERSION: dev-${DRONE_BUILD_NUMBER}
+ DOCS_REGISTRY_IMAGE: registry.fyloz.dev/colorrecipesexplorer/docs
+ DOCS_PORT: 9103
+ DOCS_RELEASE: *release
alpine-image: &alpine-image alpine:latest
- docker-registry-repo: &docker-registry-repo registry.fyloz.dev:5443/colorrecipesexplorer/docs
+ docker-registry: &docker-registry registry.fyloz.dev
+ docker-registry-repo: &docker-registry-repo registry.fyloz.dev/colorrecipesexplorer/docs
kind: pipeline
-name: build
+name: default
type: docker
steps:
- name: set-docker-tags-latest
image: *alpine-image
+ environment:
+ <<: *environment
commands:
- echo -n "latest" > .tags
when:
- branch: master
+ branch: develop
+ event:
+ exclude:
+ - pull_request
- name: set-docker-tags-release
image: *alpine-image
@@ -25,19 +34,26 @@ steps:
commands:
- echo -n "latest-release,$CRE_RELEASE" > .tags
when:
- branch: release/**
+ event:
+ - tag
- - name: containerize
+ - name: containerize-release
image: plugins/docker
+ environment:
+ <<: *environment
settings:
+ registry: *docker-registry
repo: *docker-registry-repo
+ username:
+ from_secret: docker_username
+ password:
+ from_secret: docker_password
when:
- branch:
- - master
- - release/**
+ event:
+ - tag
- name: deploy
- image: *alpine-image
+ image: alpine:latest
environment:
<<: *environment
CRE_REGISTRY_IMAGE: *docker-registry-repo
@@ -61,12 +77,8 @@ steps:
- ssh-keyscan -p $DEPLOY_SERVER_SSH_PORT -H $DEPLOY_SERVER >> ~/.ssh/known_hosts
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- ssh -p $DEPLOY_SERVER_SSH_PORT $DEPLOY_SERVER_USERNAME@$DEPLOY_SERVER "docker stop $DEPLOY_CONTAINER_NAME || true && docker rm $DEPLOY_CONTAINER_NAME || true"
- - ssh -p $DEPLOY_SERVER_SSH_PORT $DEPLOY_SERVER_USERNAME@$DEPLOY_SERVER "docker pull $CRE_REGISTRY_IMAGE:$CRE_RELEASE"
- - ssh -p $DEPLOY_SERVER_SSH_PORT $DEPLOY_SERVER_USERNAME@$DEPLOY_SERVER "docker run -d -p $CRE_PORT:80 --name=$DEPLOY_CONTAINER_NAME $CRE_REGISTRY_IMAGE:$CRE_RELEASE"
+ - ssh -p $DEPLOY_SERVER_SSH_PORT $DEPLOY_SERVER_USERNAME@$DEPLOY_SERVER "docker pull $CRE_REGISTRY_IMAGE:$DOCS_RELEASE"
+ - ssh -p $DEPLOY_SERVER_SSH_PORT $DEPLOY_SERVER_USERNAME@$DEPLOY_SERVER "docker run -d -p $DOCS_PORT:80 --name=$DEPLOY_CONTAINER_NAME $DOCS_REGISTRY_IMAGE:$DOCS_RELEASE"
when:
- branch: release/**
-
-trigger:
- branch:
- - master
- - release/**
+ event:
+ - tag
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..004f54c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,120 @@
+# Created by https://www.toptal.com/developers/gitignore/api/intellij
+# Edit at https://www.toptal.com/developers/gitignore?templates=intellij
+
+### Intellij ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+# https://plugins.jetbrains.com/plugin/7973-sonarlint
+.idea/**/sonarlint/
+
+# SonarQube Plugin
+# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
+.idea/**/sonarIssues.xml
+
+# Markdown Navigator plugin
+# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
+.idea/**/markdown-navigator.xml
+.idea/**/markdown-navigator-enh.xml
+.idea/**/markdown-navigator/
+
+# Cache file creation bug
+# See https://youtrack.jetbrains.com/issue/JBR-2257
+.idea/$CACHE_FILE$
+
+# CodeStream plugin
+# https://plugins.jetbrains.com/plugin/12206-codestream
+.idea/codestream.xml
+
+# Azure Toolkit for IntelliJ plugin
+# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
+.idea/**/azureSettings.xml
+
+# End of https://www.toptal.com/developers/gitignore/api/intellij
+
+# Mkdocs output
+site/
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..b58b603
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,5 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/documentation.iml b/.idea/documentation.iml
new file mode 100644
index 0000000..0c8867d
--- /dev/null
+++ b/.idea/documentation.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..2941e74
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/administration/group-tokens.md b/docs/administration/group-tokens.md
new file mode 100644
index 0000000..b73aad2
--- /dev/null
+++ b/docs/administration/group-tokens.md
@@ -0,0 +1,91 @@
+# Groupes par défaut
+
+Color Recipes Explorer permet de définir un groupe d'utilisateur par défaut dans un navigateur. Cette fonctionnalité
+permet aux utilisateurs utilisant ce navigateur d'être automatiquement connectés au système lors du chargement de l'
+application. Après la connexion, ces utilisateurs auront les mêmes permissions que le groupe par défaut.
+
+Lorsqu’aucun utilisateur n'est connecté, le navigateur tentera de se connecter au groupe par défaut au chargement de
+l'application. Si le navigateur a un jeton de connexion associé et que celui-ci est valide, l'utilisateur du navigateur
+sera connecté en tant que le groupe par défaut. Si ces deux critères ne sont pas respectés, la tentative de connexion
+échouera.
+
+## Définir un groupe par défaut
+
+Il est possible de définir le groupe par défaut du navigateur dans la liste des groupes (Administration > Groupes). Pour
+ce faire, il suffit d'appuyer sur le bouton «Définir par défaut» du groupe désiré et d'entrer un nom unique au
+navigateur dans la boite de dialogue qui s'affiche. En appuyant sur le bouton «Continuer», le nom est validé, puis un
+jeton de connexion unique est assigné au navigateur.
+
+### Critères de validation
+
+Pour être valide, le nom du navigateur doit être unique.
+
+## Gestion des jetons de connexion
+
+### Connaître le groupe par défaut d'un navigateur
+
+Après la connexion automatique au groupe, le nom du navigateur et le nom du groupe par défaut s'afficheront à la gauche
+du logo de l'application, en haut à droite.
+
+Si l'utilisateur s'est connecté manuellement au système (et non pas à un groupe par défaut), il est seulement possible
+de
+le savoir si cet utilisateur est un administrateur.
+Pour ce faire, le groupe par défaut sera affiché dans la liste des groupes d'utilisateurs (Administration > Groupes).
+Si un jeton de connexion est présent dans le navigateur, le bouton "Définir par défaut" ne sera pas présent et le
+texte "Groupe par défaut" sera affiché à sa place dans la ligne du groupe par défaut du navigateur.
+
+### Voir tous les jetons de connexion
+
+Tous les jetons de connexion enregistrés dans le système sont listés dans une table à: Administration > Ordinateurs.
+Seuls les administrateurs peuvent accéder à cette page.
+
+Chaque ligne de la table représente un seul jeton et ces informations sont listées:
+
+* Identifiant: L'UUID (Universal Unique Identifier) du jeton. C'est la seule information stockée dans les navigateurs.
+* Nom: Le nom unique du jeton.
+* Groupe: Le nom du groupe auquel les utilisateurs utilisant ce jeton seront connectés.
+* État: Si le jeton est activé ou désactivé.
+
+De plus, il est possible de désactiver (ou d'activer) ou de supprimer chaque jeton.
+Désactiver un jeton permet d'empêcher la connexion temporairement jusqu'à sa réactivation, tandis que la suppression
+l'empêche définitivement.
+
+### Suppression d'un jeton de connexion
+
+Supprimer un jeton de connexion permet d'empêcher toutes les connexions l'utilisant définitivement. Les jetons supprimés
+ne sont pas affichés dans la liste des jetons.
+
+Dans la liste des jetons de connexion (Administration > Ordinateurs), appuyer sur le bouton «Supprimer» de la ligne du
+jeton à supprimer.
+Une boite de confirmation s'affichera. Après confirmation, le jeton sera supprimé* du système et ne sera plus utilisable
+immédiatement.
+
+### Désactivation d'un jeton de connexion
+
+Désactiver un jeton de connexion permet d'empêcher toutes les connexions l'utilisant temporairement. Les jetons
+désactivés sont affichés dans la liste des jetons.
+
+Dans la liste des jetons de connexion (Administration > Ordinateurs), appuyer sur le bouton «Désactiver» de la ligne du
+jeton à désactiver. Le jeton sera immédiatement désactivé et ne sera plus utilisable.
+
+\* Le jeton sera toujours stocké dans la base de données, mais sera marqué comme étant supprimé. Cela permet d'assurer
+qu'aucun
+futur jeton ne soit créé en utilisant un identifiant supprimé, ce qui serait une faille de sécurité. Ces jetons ne sont
+pas accessibles depuis l'interface utilisateur.
+
+### Assignation d'un jeton de connexion
+
+Par souci de sécurité, les jetons de connexion peuvent seulement être assignés lors de leur création.
+Les jetons existants peuvent seulement être désactivés ou supprimés.
+Ainsi, si un des jetons est compromis, il suffit de le supprimer pour empêcher toutes les connexions avec celui-ci,
+et seulement un des navigateurs peut être impacté.
+
+## Stockage et format des jetons de connexion
+
+Les jetons de connexion utilisent le format [JWT](https://jwt.io/) signé (JWS). Ce format permet de garantir l'intégrité
+du jeton,
+c'est-à-dire que l'utilisation d'un jeton créé ou modifié par un tiers parti provoquera l'échec de la connexion.
+
+Ces jetons sont stockés dans les cookies du navigateur, sous le nom ```Group-Token```. Ainsi, ils ne seront pas
+supprimés à la fermeture du
+navigateur ou de l'ordinateur.