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.