From d13e21d201b0b227f39d17626f773be3786c8748 Mon Sep 17 00:00:00 2001
From: Patrick Fratczak
Date: Thu, 23 Nov 2017 09:52:15 +0100
Subject: [PATCH 001/125] Add French messages
---
.../resources/js/locale/fr/messages.json | 536 ++++++++++++++++++
1 file changed, 536 insertions(+)
create mode 100644 openid-connect-server-webapp/src/main/webapp/resources/js/locale/fr/messages.json
diff --git a/openid-connect-server-webapp/src/main/webapp/resources/js/locale/fr/messages.json b/openid-connect-server-webapp/src/main/webapp/resources/js/locale/fr/messages.json
new file mode 100644
index 0000000000..27c9271090
--- /dev/null
+++ b/openid-connect-server-webapp/src/main/webapp/resources/js/locale/fr/messages.json
@@ -0,0 +1,536 @@
+{
+ "admin": {
+ "blacklist": "Liste noire",
+ "blacklist-form": {
+ "blacklisted-uris": "URIs sur liste noire"
+ },
+ "home": "Accueil",
+ "list-widget": {
+ "empty": "Il n'y a aucun élément dans cette liste.",
+ "tooltip": "Cliquer pour afficher la valeur."
+ },
+ "manage-blacklist": "Gérer les Clients sur liste noire",
+ "self-service-client": "Enregistrement du Client en Libre-service",
+ "self-service-resource": "Enregistrement des Ressources Protégées en Libre-service",
+ "user-profile": {
+ "claim": "Nom revendiqué:",
+ "show": "Voir le profil utilisateur",
+ "text": "Votre profil utilisateur a les informations suivantes:",
+ "value": "Valeur revendiquée:"
+ }
+ },
+ "client": {
+ "client-form": {
+ "access": "Accès",
+ "access-token-no-timeout": "Les jetons d'accès n'expirent pas",
+ "access-token-timeout": "Délai d'expiration du jeton d'accès",
+ "access-token-timeout-help": "Entrer ce temps en secondes, minutes, ou heures.",
+ "acr-values": "Valeurs ACR par défaut",
+ "acr-values-placeholder": "nouvelle valeur ACR",
+ "acr-values-help": "Référence de contexte d'authentification par défaut à demander pour ce client",
+ "allow-introspection": "Autoriser les appels au point final du jeton d'introspection ?",
+ "authentication-method": "Méthode d'Identification du point final du Jeton d'Introspection",
+ "authorization-code": "code d'autorisation",
+ "client-credentials": "informations d'identification du client",
+ "client-description": "Description",
+ "client-description-help": "Texte descriptif lisible par l'homme",
+ "client-description-placeholder": "Tapez une description",
+ "client-id": "ID du client",
+ "client-id-help": "ID unique. Si vous laissez ce champ vide, il sera automatiquement généré.",
+ "client-id-placeholder": "L'ID du Client sera généré automatiquement",
+ "client-name": "Nom du client",
+ "client-name-help": "Nom d'application lisible par l'homme",
+ "client-name-placeholder": "Taper quelque chose",
+ "client-secret": "Mot de passe du client",
+ "client-secret-placeholder": "Taper un mot de passe",
+ "contacts": "Contacts",
+ "contacts-help": "Liste des contacts pour les administrateurs de ce client.",
+ "contacts-placeholder": "nouveau contact",
+ "credentials": "Informations d'identification",
+ "crypto": {
+ "a128cbc-hs256": "Algorithme de Chiffrement Authentifié Composite utilisant AES en mode CBC (Cipher Block Chaining) avec PKCS #5 incluant un calcul d'intégrité utilisant HMAC SHA-256, utilisant un CMK 256 bits (et un CEK 128 bits)",
+ "a256cbc-hs512": "Algorithme de Chiffrement Authentifié Composite utilisant AES en mode CBC avec PKCS #5 incluant un calcul d'intégrité utilisant HMAC SHA-512, utilisant un CMK 512 bits (et un CEK 256 bits)",
+ "a128gcm": "AES GCM utilisant des clés 128 bit",
+ "a256gcm": "AES GCM utilisant des clés 256 bit",
+ "a128kw": "Algorithme d'envoloppe de clé AES utilisant des clés 128 bit",
+ "a256kw": "Algorithme d'envoloppe de clé AES utilisant des clés 256 bit",
+ "default": "Utiliser la valeur par défaut du serveur",
+ "dir": "Utilisation directe d'une clé symétrique partagée en tant que Clé Maîtresse de Contenu (CMK) pour l'étape de chiffrement en bloc",
+ "ecdh-es": "Accord par Clé statique éphémère Diffie-Hellman basée sur les courbes elliptiques utilisant Concat KDF, avec la clé convenue étant utilisée directement comme Clé Maîtresse de Contenu",
+ "ecdh-es-a128kw": "Accord par Clé statique éphémère Diffie-Hellman basée sur les courbes elliptiques par ECDH-ES et Section 4.7, mais où la clé convenue est utilisée pour envolpper la Clé Maîtresse de Contenu (CMK) avec la fonction A128KW",
+ "ecdh-es-a256kw": "Accord par Clé statique éphémère Diffie-Hellman basée sur les courbes elliptiques par ECDH-ES et Section 4.7, mais où la clé convenue est utilisée pour envolpper la Clé Maîtresse de Contenu (CMK) avec la fonction A256KW",
+ "none": "Pas de chiffrement",
+ "rsa-oaep": "RSAES à l'aide du tampon de cryptage asymétrique optimal (OAEP)",
+ "rsa1-5": "RSAES-PKCS1-V1_5"
+ },
+ "cryptography": "Crypto",
+ "device": "appareil",
+ "device-code-timeout": "Délai d'expiration du code de l'appareil",
+ "display-secret": "Afficher/editer le mot de passe du client:",
+ "edit": "Editer le Client",
+ "generate-new-secret": "Generer un nouveau mot de passe pour le client ?",
+ "generate-new-secret-help": "Le nouveau mot de passe sera généré quand vous cliquerez sur 'Sauvergarder'",
+ "generate-on-save": "Générer en Sauvegardant",
+ "grant-types": "Types d'allocation",
+ "home": "Page d'Accueil",
+ "home-help": "L'URI pour la page d'accueil du client sera affichée à l'utilisateur",
+ "hours": "heures",
+ "id": "ID:",
+ "id-token-crypto-algorithm": "Algorithme de Cryptage du Jeton d'Identification",
+ "id-token-crypto-method": "Méthode de cryptage du Jeton d'Identification",
+ "id-token-signing-algorithm": "Algorithme de Signature du Jeton d'Identification",
+ "id-token-timeout": "Délai d'expiration du Jeton d'Identification",
+ "implicit": "implicite",
+ "initiate-login": "Lancer la connexion",
+ "initiate-login-help": "URI pour initier la connexion sur le client",
+ "introspection": "Introspection",
+ "jwk-set": "Jeu de Clés publique",
+ "jwk-set-help": "URI du jeu de clés Web JSON pour le client (doit être accessible par le serveur)",
+ "jwk-set-value-help": "URI du jeu de clés Web JSON pour le client (doit être accessible par le serveur)",
+ "logo": "Logo",
+ "logo-help": "L'URI qui pointe vers une image de logo sera affichée sur la page d'approbation",
+ "main": "Principal",
+ "max-age": "Age Maximum par Défaut",
+ "max-age-help": "Âge de session maximal par défaut avant une nouvelle invite",
+ "minutes": "minutes",
+ "new": "Nouveau Client",
+ "other": "Autre",
+ "pairwise": "Par paire",
+ "password": "mot de passe",
+ "policy": "Déclaration de Politique",
+ "policy-help": "L'URI la déclaration de polituque de ce client sera affichée à l'utilisateur",
+ "post-logout": "Redirection après déconnexion",
+ "post-logout-help": "URI pour rediriger le client après une opération de déconnexion",
+ "public": "Public",
+ "redelegation": "redélégation",
+ "redirect-uris": "URI(s) de Redirection",
+ "redirect-uris-help": "URI(s) de redirection pour le client après la page d'autorisation",
+ "claims-redirect-uris": "URI(s) de redirection des revendications",
+ "claims-redirect-uris-help": "URI(s) de redirection pour le client après le flux de collecte des revendications",
+ "refresh": "actualiser",
+ "refresh-tokens": "Jetons d'Actualisation",
+ "refresh-tokens-issued": "Les Jetons d'actualisation sont publiés pour ce client",
+ "refresh-tokens-issued-help": "Ceci ajoute le champ offline_access aux champs d'application du client.",
+ "refresh-tokens-reused": "Les Jetons d'Actualisation pour ce client sont réutilisés",
+ "clear-access-tokens": "Les jetons d'accès actifs sont automatiquement révoqués lorsque le jeton d'actualisation est utilisé",
+ "refresh-tokens-no-expire": "Les Jetons d'actualisation n'expirent pas",
+ "registered": "Enregistré à",
+ "registration-token": "Jeton d'enregistrement:",
+ "registration-access-token": "Jeton d'Accès à l'Enregistrement",
+ "registration-token-error": "Un problème est survenu lors du chargement du jeton d'accès d'enregistrement pour ce client.",
+ "request-object-signing-algorithm": "Demander un algorithme de signature d'objet",
+ "request-uri": "Demander des URIs",
+ "request-uri-help": "URIs contenant des objets de requête utilisés par ce client",
+ "require-auth-time": "Exiger l'heure d'authentification",
+ "require-auth-time-label": "Toujours exiger que la réclamation auth_time soit envoyée dans le jeton d'identification",
+ "response-types": "Types de Réponse",
+ "rotate-registration-token": "Faire pivoter le jeton d'enregistrement",
+ "rotate-registration-token-confirm": "Êtes-vous sûr de vouloir faire pivoter le jeton d'enregistrement du client ?",
+ "rotate-registration-token-error": "Il y a eu un problème en pivotant le jeton d'enregistrement pour ce client.",
+ "saved": {
+ "no-secret": "Aucun mot de passe client",
+ "saved": "Client Sauvegardé",
+ "secret": "Mot de passe:",
+ "show-secret": "Montrer le Mot de Passe",
+ "unchanged": "inchangé"
+ },
+ "scope-placeholder": "nouveau scope",
+ "scope-help": "Scopes OAuth que le client est autorisé à demander",
+ "seconds": "secondes",
+ "secret-asymmetric-jwt": "Affirmation Signée Asymétrique JWT",
+ "secret-http": "Mot de Passe Client via HTTP Basic",
+ "secret-none": "Pas d'identification",
+ "secret-post": "Mot de Passe Client via HTTP POST",
+ "secret-symmetric-jwt": "Mot de Passe Client via Affirmation Signée Asymétrique JWT",
+ "sector-identifier": "Identifcateur de Secteur URI",
+ "signing": {
+ "any": "Tout est autorisé",
+ "default": "Utiliser la valeur par défaut du serveur",
+ "es256": "Algorithme de Hachage ECDSA using P-256 curve and SHA-256",
+ "es384": "Algorithme de Hachage ECDSA using P-384 curve and SHA-384",
+ "es512": "Algorithme de Hachage ECDSA using P-512 curve and SHA-512",
+ "hs256": "Algorithme de Hachage HMAC using SHA-256",
+ "hs384": "Algorithme de Hachage HMAC using SHA-384",
+ "hs512": "Algorithme de Hachage HMAC using SHA-512",
+ "none": "Pas de signature digitale",
+ "rs256": "Algorithme de Hachage RSASSA using SHA-256",
+ "rs384": "Algorithme de Hachage RSASSA using SHA-384",
+ "rs512": "Algorithme de Hachage RSASSA using SHA-512",
+ "ps256": "RSASSA-PSS using SHA-256 and MGF1 with SHA-256",
+ "ps384": "RSASSA-PSS using SHA-384 and MGF1 with SHA-384",
+ "ps512": "RSASSA-PSS using SHA-512 and MGF1 with SHA-512"
+ },
+ "software-id": "ID du Logiciel",
+ "software-id-placeholder": "ID du logiciel...",
+ "software-id-help": "Identificateur du logiciel de ce client",
+ "software-statement": "Déclaration du Logiciel",
+ "software-statement-placeholder": "eyj0...",
+ "software-statement-help": "Une déclaration de logiciel est émise par un tiers de confiance et verrouille certains éléments de l'enregistrement d'un client.",
+ "software-version": "Version du Logiciel",
+ "software-version-placeholder": "1.0...",
+ "software-version-help": "Version du Logiciel pour ce client",
+ "subject-type": "Type de sujet",
+ "terms": "Conditions d'utilisation",
+ "terms-help": "L'URI pour les conditions d'utilisation de ce client sera affichée à l'utilisateur",
+ "token-signing-algorithm": "Algorithme de signature des points finaux de jeton d'identification",
+ "tokens": "Jetons",
+ "type": "Type d'Application ",
+ "type-native": "Native",
+ "type-web": "Web",
+ "unknown": "(Inconnu)",
+ "user-info-crypto-algorithm": "Algorithme de cryptage des points finaux d'information utilisateur",
+ "user-info-crypto-method": "Méthode de cryptage des points finaux d'information utilisateur",
+ "user-info-signing-algorithm": "Algorithme de signature des points finaux d'information utilisateur",
+ "error": {
+ "consistency": "Erreur de cohérence",
+ "pairwise-sector": "Les identificateurs par paires ne peuvent pas être utilisés avec des URI à redirection multiple, sauf si un URI d'identificateur de secteur est également enregistré.",
+ "jwk-set": "Erreur de réglage JWK",
+ "jwk-set-parse": "Il y a eu une erreur en analysant la clé publique du jeu de clés Web JSON. Vérifiez la valeur et réessayez."
+ }
+ },
+ "client-table": {
+ "allow-introspection-tooltip": "Ce client peut effectuer une introspection de jeton",
+ "confirm": "Êtes-vous sûr de vouloir supprimer ce client?",
+ "dynamically-registered-tooltip": "Ce client a été enregistré dynamiquement. Cliquez pour voir le jeton d'accès à l'enregistrement",
+ "match": {
+ "contacts": "contacts",
+ "description": "description",
+ "homepage": "page d'accueil",
+ "id": "id",
+ "logo": "logo",
+ "name": "nom",
+ "policy": "politique",
+ "redirect": "uri de redirection",
+ "scope": "scope",
+ "terms": "conditions d'utilisation",
+ "software-id": "ID logiciel",
+ "software-version": "version"
+ },
+ "matched-search": "Recherche de correspondances :",
+ "new": "Nouveau Client",
+ "no-clients": "Il n' y a aucun client enregistré sur ce serveur.",
+ "no-matches": "Il n'y a aucun client qui corresponde à vos critères de recherche.",
+ "no-redirect": "PAS D'URI DE REDIRECTION",
+ "registered": "Enregistré",
+ "search": "Rechercher...",
+ "whitelist": "Liste blanche",
+ "unknown": "à un moment inconnu"
+ },
+ "manage": "Gérer les Clients",
+ "more-info": {
+ "contacts": "Contacts Administratifs :",
+ "home": "Page d'Accueil :",
+ "more": "Plus d'informations",
+ "policy": "Politique:",
+ "terms": "Conditions d'Utilisation :"
+ },
+ "newClient": "Nouveau Client"
+ },
+ "common": {
+ "cancel": "Annuler",
+ "client": "Client",
+ "clients": "Clients",
+ "close": "Fermer",
+ "delete": "Supprimer",
+ "description": "Description",
+ "dynamically-registered": "Ce client a été enr dynamiquement",
+ "edit": "Editer",
+ "expires": "Expire :",
+ "information": "Information",
+ "new": "Nouveau",
+ "not-yet-implemented": "Pas encore mis en oeuvre",
+ "not-yet-implemented-content": "La valeur de ce champ sera sauvegardée avec le client, mais le serveur ne traite actuellement rien avec lui. Les versions futures de la bibliothèque du serveur en feront usage.",
+ "revoke": "Révoquer",
+ "save": "Sauvegarder",
+ "scopes": "Scopes",
+ "statistics": "Statistiques"
+ },
+ "dynreg": {
+ "client-id-placeholder": "Entrer l'ID du Client",
+ "configuration-URI": "URI de Configuration Client",
+ "edit-dynamically-registered": "Editer un Client Enregistré Dynamiquement",
+ "edit-existing": "Editer un client existant",
+ "edit-existing-help": "Utiliser ce formulaire pour éditer un client enregistré précédemment. Coller votre ID client and jeton d'accés d'enregistrement pour accéder au client.",
+ "edit-existing-button": "Editer le Client",
+ "invalid-access-token": "Client ou Jeton d'Accès à l'Enregistrement invalide.",
+ "new-client": "Enregister un nouveau client",
+ "new-client-help": "Utiliser ce formulaire pour enregistrer un nouveau client avec le server d'autorisation. Vous recevrez un ID client et un jeton d'accès à l'enregistrement pour gérer votre client.",
+ "new-client-button": "Nouveau Client",
+ "regtoken-placeholder": "Entrer le Jeton d'Accès à l'Enregistrement",
+ "warning": "Attention! Vous DEVEZ protéger votre ID Client, Mot de Passe Client (si fourni), et votre Jeton d'Accès à l'Enregistrement. Si vous perdez votre numéro de client ou votre jeton d'accès à l'enregistrement, vous n'aurez plus accès aux données d'enregistrement de votre client et vous devrez enregistrer un nouveau client.",
+ "will-be-generated": "Sera généré par le serveur lors de la sauvegarde du client"
+ },
+ "grant": {
+ "manage-approved-sites": "Gérr les Sites Approuvés",
+ "refresh": "Rafraîchir",
+ "grant-table": {
+ "active-tokens": "Nombre de jetons d'accès actuellement actifs",
+ "application": "Application",
+ "approved-sites": "Sites Approuvés",
+ "authorized": "Autorisé:",
+ "dynamically-registered": "Ce client a été enregistré dynamiquement",
+ "expires": "Expire:",
+ "last-accessed": "Dernier accès :",
+ "never": "Jamais",
+ "no-sites": "Vous n'avez approuvé aucun site.",
+ "no-whitelisted": "Vous n'avez accédé à aucun site inscrit sur une liste blanche.",
+ "pre-approved": "Ce sont des sites qui ont été pré-approuvés par un administrateur.",
+ "text": "Il s'agit de sites que vous avez approuvés manuellement. Si le même site demande le même accès à l'avenir, il sera accordé sans invitation.",
+ "unknown": "Inconnu",
+ "whitelist-note": "NOTE: Si vous les révoquez ici, ils seront automatiquement ré-approuvés lors de votre prochaine visite, sans invitation.",
+ "whitelisted-site": "Ce site a été placé sur liste blanche par un administrateur",
+ "whitelisted-sites": "Sites sur liste blanche"
+ }
+ },
+ "rsreg": {
+ "resource-id-placeholder": "Entrer l'ID de Ressource",
+ "configuration-URI": "URI de Configuration Client",
+ "edit": "Editer la Ressource Protégée",
+ "edit-existing": "Editer une ressource protégée existante",
+ "edit-existing-help": "Utiliser ce formulaire pour éditer une ressource précédemment enregistrée. Coller votre ID client et le jeton d'accès d'enregistrement pour accéder au client.",
+ "edit-existing-button": "Editer la Ressource",
+ "invalid-access-token": "Client ou Jeton d'Accès à l'Enregistrement invalide.",
+ "new-client": "Enregistrer une nouvelle ressource protégée",
+ "new-client-help": "Utiliser ce formulaire pour enregistrer une nouvelle ressource avec le serveur d'autorisation. Vous recevrez un numéro de client et un jeton d'accès à l'enregistrement pour gérer votre ressource.",
+ "new-client-button": "Nouvelle Ressource",
+ "regtoken-placeholder": "Entrer un Jeton d'Accès d'Enregistrement",
+ "will-be-generated": "Sera généré par le serveur lorsque la ressource est sauvegardée",
+ "warning": "Attention! Vous DEVEZ protéger votre ID Client, Mot de Passe Client (si fourni), et votre Jeton d'Accès à l'Enregistrement. Si vous perdez votre numéro de client ou votre jeton d'accès à l'enregistrement, vous n'aurez plus accès aux données d'enregistrement de votre client et vous devrez enregistrer un nouveau client.",
+ "client-form": {
+ "scope-help": "Scopes pour lesquels cette ressource sera capable d'introspecter des jetons."
+ }
+ },
+ "scope": {
+ "manage": "Gérer les Scopes du Système",
+ "scope-list": {
+ "no-scopes": "PAS DE SCOPES"
+ },
+ "system-scope-form": {
+ "default": "scope par défaut",
+ "default-help": "Les clients nouvellement créés obtiennent ce scope par défaut?",
+ "description-help": "Texte descriptif lisible par l'humain",
+ "description-placeholder": "Taper une description",
+ "restricted": "restreint",
+ "restricted-help": "Les scopes restreints ne sont utilisables que par les administrateurs système et ne sont pas disponibles pour les clients enregistrés dynamiquement et les ressources protégées.",
+ "edit": "Editer le Scope",
+ "icon": "Icône",
+ "new": "Nouveau Scope",
+ "select-icon": "Sélectionner un icône",
+ "subject-type": "Type de Sujet",
+ "value": "Valeur du Scope",
+ "value-help": "Chaîne seule sans espaces",
+ "value-placeholder": "scope"
+ },
+ "system-scope-table": {
+ "confirm": "Êtes-vous sûr de vouloir supprimer ce scope ? Les clients qui ont ce scope pourront toujours la demander.",
+ "new": "Nouveau Scope",
+ "text": "Aucun scope du système n'est défini. Les clients peuvent toujours avoir des scopes personnalisés.",
+ "tooltip-restricted": "Ce scope ne peut être utilisé que par les administrateurs. Ce n'est pas disponible pour l'enregistrement dynamique.",
+ "tooltip-default": "Ce scope est automatiquement assigné aux nouveaux clients enregitrés."
+ }
+ },
+ "token": {
+ "manage": "Gérer les Jetons Actifs",
+ "token-table": {
+ "access-tokens": "Jetons d'Accès",
+ "associated-id": "Ce jeton d'accès a été émis avec un jeton d'identification associé.",
+ "associated-refresh": "Ce jeton d'accès a été émis avec un jeton de rafraîchissement associé.",
+ "click-to-display": "Cliquez pour afficher la valeur complète du jeton",
+ "confirm": "Etes-vous sûr de vouloir révoquer ce jeton?",
+ "confirm-refresh": "Êtes-vous sûr de vouloir révoquer ce jeton de rafraîchissement et les jetons d'accès associés ?",
+ "expires": "Expire",
+ "no-access": "Il n'y a pas de jetons d'accès actif.",
+ "no-refresh": "Il n'y a pas de jetons de rafraîchissement actifs.",
+ "number-of-tokens": "Nombre de jetons d'accès associés",
+ "refresh-tokens": "Jetons de Rafraîchissement",
+ "text": "Les jetons d'accès sont habituellement de courte durée et permettent aux clients d'accéder à des ressources spécifiques. Les Jetons ID sont des jetons d'accès spécialisés pour faciliter la connexion en utilisant OpenID Connect.",
+ "text-refresh": "Les jetons de rafraîchissement ont généralement une longue durée de vie et offrent aux clients la possibilité d'obtenir de nouveaux jetons d'accès sans la participation de l'utilisateur final.",
+ "token-info": "Information sur le Jeton"
+ }
+ },
+ "whitelist": {
+ "confirm": "Êtes-vous sûr de vouloir supprimer cette entrée de la liste blanche ?",
+ "edit": "Editer la Liste Blanche",
+ "manage": "Gérer Les Sites sur liste blanche",
+ "new": "Nouvelle Liste Blanche",
+ "whitelist": "Liste Blanche",
+ "whitelist-form": {
+ "allowed-scopes": "Scopes Autorisés",
+ "edit": "Editer le Site sur Liste Blanche",
+ "new": "Nouveau Site sur Liste Blanche",
+ "scope-help": "Liste des scopes qui sera automatiquement approuvée quand ce client fera une requête",
+ "scope-placeholder": "nouveau scope"
+ },
+ "whitelist-table": {
+ "no-sites": "Il n' y a pas de sites sur la liste blanche. Utilisez le bouton liste blanche de la page de gestion du client pour en créer un."
+ }
+ },
+ "blacklist": {
+ "text": "Les URIs sur liste noire ne peuvent pas être utilisés en tant qu'URIs de redirection par des clients enregistrés, que ce soit dans l'interface d'administration ou dans l'enregistrement dynamique.",
+ "blacklist-uri-placeholder": "uri de la liste noire",
+ "add": "Ajouter une URI à la liste noire",
+ "empty": "Il n'y a pas d'URIs sur liste noire sur ce serveur.",
+ "uri": "URI"
+ },
+ "copyright": "Propulsé par MITREid Connect {0} © 2017 The MIT Internet Trust Consortium..",
+ "about": {
+ "title": "A Propos",
+ "body": "\nCe Service OpenID Connect est construit à partir du projet Open Source MITREid Connect, du \nMIT Internet Trust Consortium.\n
\n\nPour plus d'informations sur le projet, voir \nMITREid Connect sur GitHub. \nVous pouvez y soumettre des rapports de bogues, donner des retours d'informations ou même contribuer à des correctifs de code pour des fonctionnalités supplémentaires que vous aimeriez voir apparaître."
+ },
+ "statistics": {
+ "title": "Statistiques",
+ "number_users": "Nombre d'utilisateurs : {0}",
+ "number_clients": "Clients autorisés : {0}",
+ "number_approvals": "Sites approuvés : {0}"
+ },
+ "home": {
+ "title": "Accueil",
+ "welcome": {
+ "title": "Bienvenue !",
+ "body": "\nOpenID Connect est un protocole d'identité fédérée à l'échelle de l'Internet basé sur le framework d'autorisation OAuth2. \nOpenID Connect vous permet de vous connecter à un site distant en utilisant votre identité sans révéler vos identifiants, comme un nom d'utilisateur et un mot de passe.
\nEn savoir plus »"
+ },
+ "more": "Plus",
+ "about": {
+ "title": "A prppos",
+ "body": "Ce service OpenID Connect est construit à partir du projet Open Source MITREid Connect, du \nthe MIT Internet Trust Consortium."
+ },
+ "contact": {
+ "title": "Contact",
+ "body": "\nPour plus d'informations ou du support, contactez les administrateurs de ce système.
\nEmail »"
+ },
+ "statistics": {
+ "title": "Statistiques actuelles",
+ "loading": "Chargement en cours...",
+ "number_users": "Nombre d'utilisateurs : {0}",
+ "number_clients": "Clients autorisés : {0}",
+ "number_approvals": "Sites approuvés : {0}"
+ }
+ },
+ "contact": {
+ "title": "Contact",
+ "body": "Pour signaler des bogues avec le logiciel MITREid Connect lui-même, utilisez \nGitHub issue tracker. \nPour les problèmes relatifs à ce serveur, contactez l'administrateur du serveur."
+ },
+ "topbar": {
+ "about": "A propos",
+ "contact": "Contact",
+ "statistics": "Statistiques",
+ "home": "Accueil",
+ "login": "Se connecter",
+ "logout": "Se déconnecter"
+ },
+ "sidebar": {
+ "administrative": {
+ "title": "Administratif",
+ "manage_clients": "Gérer les Clients",
+ "whitelisted_clients": "Clients sur liste blanche",
+ "blacklisted_clients": "Clients sur liste noire",
+ "system_scopes": "Scopes Système"
+ },
+ "personal": {
+ "title": "Personnel",
+ "approved_sites": "Gérer les Sites Approuvés",
+ "active_tokens": "Gérer les Jetons Actifs",
+ "profile_information": "Voir les Informations du Profil"
+ },
+ "developer": {
+ "title": "Développeur",
+ "client_registration": "Inscription en libre-service de clients",
+ "resource_registration": "Enregistrement en libre-service de ressources protégées"
+ }
+ },
+ "manage": {
+ "ok": "OK",
+ "loading": "Chargement en cours",
+ "title": "Console de Gestion"
+ },
+ "approve": {
+ "dynamically-registered-unknown": "à un moment inconnu",
+ "title": "Autoriser l'accès",
+ "error": {
+ "not_granted": "L'accès ne pouvait pas être accordé."
+ },
+ "required_for": "Approbation requise pour",
+ "dynamically_registered": "Ce client a été enregistré dynamiquement {0}.",
+ "caution": {
+ "title": "Attention",
+ "message": {
+ "none": "Cela n'a jamais été approuvé préalablement.",
+ "singular": "Cela a été approuvé {0} fois préalablement.",
+ "plural": "Cela a été approuvé {0} fois préalablement."
+ }
+ },
+ "more_information": "Plus d'information",
+ "home_page": "Page d'Accueil",
+ "policy": "Politique",
+ "terms": "Conditions d'utilisation",
+ "contacts": "Contacts Administratifs",
+ "warning": "Avertissement",
+ "no_redirect_uri": "Ce client n' a pas d'URIs de redirection enregistrées et quelqu'un pourrait utiliser un URI malveillant ici.",
+ "redirect_uri": "Vous serez redirigé vers la page suivante si vous cliquez sur Approuver: {0}
",
+ "pairwise": "Ce client utilise un identificateur de pair, ce qui rend plus difficile la corrélation de votre identité entre les sites.",
+ "no_scopes": "Ce client n' a pas de scopes enregistrés et est donc autorisés à demander tous les scopes disponibles sur le système. Procédez avec prudence.",
+ "access_to": "Accéder à",
+ "remember": {
+ "title": "Se souvenir de cette décision",
+ "until_revoke": "Se souvenir de cette décision jusqu'à ce que je la révoque",
+ "one_hour": "Se souvenir de cette décision pour une heure",
+ "next_time": "Me le redemander la prochaine fois"
+ },
+ "do_authorize": "Autorisez-vous",
+ "label": {
+ "authorize": "Autoriser",
+ "deny": "Refuser"
+ }
+ },
+ "error": {
+ "title": "Erreur",
+ "header": "Erreur",
+ "header-with-message": "Erreur : ",
+ "reload": "De plus, on dirait que vous n'êtes pas connecté. Rechargez la page pour réessayer. Vous risquez de perdre tout travail non sauvegardé.",
+ "reload-button": "Recharger",
+ "message": "Il y a eu une erreur dans le traitement de votre demande.",
+ "server-message": "Le serveur a dit : "
+ },
+ "login": {
+ "login_with_username_and_password": "Se connecter avec nom d'utilisateur et mot de passe",
+ "username": "Nom d'utilisateur",
+ "password": "Mot de passe",
+ "login-button": "Se connecter",
+ "error": "Le système n'a pas pu vous identifier. Veuillez réessayer."
+ },
+ "device": {
+ "request_code": {
+ "title": "Entrez le Code",
+ "header": "Entrez le Code",
+ "description": "Entrez le code afficher sur votre appareil dans le champ ci-dessous et pressez Envoyer",
+ "submit": "Envoyer"
+ },
+ "error": {
+ "noUserCode": "Le code que vous avez entré n'a pas été trouvé.",
+ "expiredUserCode": "Le code que vous avez entré a expiré. Retournez sur votre appareil et demandez un nouveau code.",
+ "userCodeAlreadyApproved": "Le code que vous avez entré a déjà été utilisé.",
+ "userCodeMismatch": "Il y a eu une erreur dans le traitement du code que vous avez entré. Essayez de rafraîchir la page et revenez sur votre appareil pour demander un nouveau code.",
+ "error": "Il y a eu une erreur dans le traitement du code que vous avez entré. Retourner à votre appareil et demander un nouveau code."
+ },
+ "approve": {
+ "approved": "L'appareil a été approuvé.",
+ "notApproved": "L'appareil n'a pas été approuvé."
+ }
+ },
+ "logout": {
+ "confirmation": {
+ "title": "Déconnexion demandée",
+ "header": "Déconnexion demandée",
+ "requested": "La déconnexion a été demandée par ",
+ "explanation": "Voulez-vous vous déconnecter du fournisseur d'identité ? Cela n'affectera pas votre session sur d'autres systèmes.",
+ "submit": "Se déconnecter",
+ "deny": "Rester connecté"
+ },
+ "post": {
+ "title": "Se déconnecter",
+ "header": "Se déconnecter",
+ "notLoggedOut": "Vous n'avez pas été déconnecté du serveur d'identité. Vous pouvez fermer ce navigateur ou vous reconnecter.",
+ "loggedOut": "Vous avez été déconnecté du serveur d'identité."
+ }
+ }
+}
From d9d48cbea240779a66feb24edfe9863f38d33932 Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 30 May 2018 11:36:50 +0100
Subject: [PATCH 002/125] Upgraded libraries for mitigating known
vulnerabilities
---
.../impl/BlacklistAwareRedirectResolver.java | 44 +------------------
.../TestBlacklistAwareRedirectResolver.java | 17 +++----
pom.xml | 8 ++--
3 files changed, 12 insertions(+), 57 deletions(-)
diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/BlacklistAwareRedirectResolver.java b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/BlacklistAwareRedirectResolver.java
index 069fd78b40..21f0a277c7 100644
--- a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/BlacklistAwareRedirectResolver.java
+++ b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/BlacklistAwareRedirectResolver.java
@@ -32,7 +32,7 @@
/**
*
* A redirect resolver that knows how to check against the blacklisted URIs
- * for forbidden values. Can be configured to do strict string matching also.
+ * for forbidden values.
*
* @author jricher
*
@@ -46,8 +46,6 @@ public class BlacklistAwareRedirectResolver extends DefaultRedirectResolver {
@Autowired
private ConfigurationPropertiesBean config;
- private boolean strictMatch = true;
-
/* (non-Javadoc)
* @see org.springframework.security.oauth2.provider.endpoint.RedirectResolver#resolveRedirect(java.lang.String, org.springframework.security.oauth2.provider.ClientDetails)
*/
@@ -62,44 +60,4 @@ public String resolveRedirect(String requestedRedirect, ClientDetails client) th
return redirect;
}
}
-
- /* (non-Javadoc)
- * @see org.springframework.security.oauth2.provider.endpoint.DefaultRedirectResolver#redirectMatches(java.lang.String, java.lang.String)
- */
- @Override
- protected boolean redirectMatches(String requestedRedirect, String redirectUri) {
-
- if (isStrictMatch()) {
- // we're doing a strict string match for all clients
- return Strings.nullToEmpty(requestedRedirect).equals(redirectUri);
- } else {
- // otherwise do the prefix-match from the library
- return super.redirectMatches(requestedRedirect, redirectUri);
- }
-
- }
-
- /**
- * @return the strictMatch
- */
- public boolean isStrictMatch() {
- if (config.isHeartMode()) {
- // HEART mode enforces strict matching
- return true;
- } else {
- return strictMatch;
- }
- }
-
- /**
- * Set this to true to require exact string matches for all redirect URIs. (Default is false)
- *
- * @param strictMatch the strictMatch to set
- */
- public void setStrictMatch(boolean strictMatch) {
- this.strictMatch = strictMatch;
- }
-
-
-
}
diff --git a/openid-connect-server/src/test/java/org/mitre/oauth2/service/impl/TestBlacklistAwareRedirectResolver.java b/openid-connect-server/src/test/java/org/mitre/oauth2/service/impl/TestBlacklistAwareRedirectResolver.java
index 0639af6c26..c826c2df97 100644
--- a/openid-connect-server/src/test/java/org/mitre/oauth2/service/impl/TestBlacklistAwareRedirectResolver.java
+++ b/openid-connect-server/src/test/java/org/mitre/oauth2/service/impl/TestBlacklistAwareRedirectResolver.java
@@ -27,6 +27,7 @@
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.security.oauth2.common.exceptions.InvalidRequestException;
+import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException;
import org.springframework.security.oauth2.provider.ClientDetails;
import com.google.common.collect.ImmutableSet;
@@ -86,16 +87,12 @@ public void testResolveRedirect_safe() {
String res1 = resolver.resolveRedirect(goodUri, client);
assertThat(res1, is(equalTo(goodUri)));
-
- // set the resolver to non-strict and test the path-based redirect resolution
-
- resolver.setStrictMatch(false);
-
- String res2 = resolver.resolveRedirect(pathUri, client);
-
- assertThat(res2, is(equalTo(pathUri)));
+ }
+ @Test(expected=RedirectMismatchException.class)
+ public void testResovleRedirect_incorrect() {
+ resolver.resolveRedirect(pathUri, client);
}
@Test(expected = InvalidRequestException.class)
@@ -106,7 +103,7 @@ public void testResolveRedirect_blacklisted() {
}
- @Test
+ /*@Test
public void testRedirectMatches_default() {
// this is not an exact match
@@ -153,5 +150,5 @@ public void testHeartMode() {
assertThat(res2, is(true));
}
-
+*/
}
diff --git a/pom.xml b/pom.xml
index 06466d2ab0..dec35e50b8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -365,7 +365,7 @@
org.springframework
spring-framework-bom
- 4.3.7.RELEASE
+ 4.3.17.RELEASE
pom
import
@@ -386,14 +386,14 @@
org.springframework.security
spring-security-bom
- 4.2.4.RELEASE
+ 4.2.6.RELEASE
pom
import
org.springframework.security.oauth
spring-security-oauth2
- 2.1.0.RELEASE
+ 2.1.2.RELEASE
@@ -590,7 +590,7 @@
org.bouncycastle
bcprov-jdk15on
- [1.52,)
+ [1.59,)
org.eclipse.persistence
From 67f584fa08410ae2bccaec3a11a1dbe5a3b168d3 Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 30 May 2018 12:41:53 +0100
Subject: [PATCH 003/125] Added jenkins file
---
Jenkinsfile | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
create mode 100644 Jenkinsfile
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000000..ef98144e51
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,45 @@
+//
+// CTC Auth Jenkins Pipeline
+//
+pipeline {
+ agent any
+ tools {
+ maven 'Maven 3.3.9'
+ jdk 'Java 8'
+ }
+ options {
+ // Only keep 10 builds in total
+ buildDiscarder(logRotator(numToKeepStr:'10', daysToKeepStr:'2'))
+
+ // Display timestamps
+ timestamps()
+
+ // Prevent concurrent builds
+ disableConcurrentBuilds();
+ }
+ stages {
+ stage ('Build') {
+ steps {
+ timeout(time: 20, unit: 'MINUTES') {
+ sh 'mvn versions:set -DnewVersion=1.3.3-${env.BUILD_NUMBER}'
+ }
+ timeout(time: 20, unit: 'MINUTES') {
+ sh 'mvn -B -V -U -T4 clean deploy -DaltDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/thirdparty'
+ }
+ }
+ post {
+ always{
+ archiveArtifacts caseSensitive: false, onlyIfSuccessful: true, allowEmptyArchive: true, artifacts: 'openid-connect-server-webapp/target/*.war'
+ }
+ success {
+ junit '**/target/surefire-reports/**/*.xml'
+ }
+ }
+ }
+ }
+ post {
+ always {
+ deleteDir()
+ }
+ }
+}
From 98021f411a47265b80502fabfc5703f776b2999a Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 30 May 2018 12:51:38 +0100
Subject: [PATCH 004/125] Modified Jenkins file
---
Jenkinsfile | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index ef98144e51..dbf3de3de1 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -20,11 +20,9 @@ pipeline {
stages {
stage ('Build') {
steps {
- timeout(time: 20, unit: 'MINUTES') {
- sh 'mvn versions:set -DnewVersion=1.3.3-${env.BUILD_NUMBER}'
- }
- timeout(time: 20, unit: 'MINUTES') {
- sh 'mvn -B -V -U -T4 clean deploy -DaltDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/thirdparty'
+ sh "mvn versions:set -DnewVersion=1.3.3-${env.BUILD_NUMBER}"
+ timeout(time: 10, unit: 'MINUTES') {
+ sh "mvn -B -V -U -T4 clean deploy -DaltDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/thirdparty"
}
}
post {
From 7cab117e966e839960aa26c6d8fd844bc813e573 Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 30 May 2018 13:09:39 +0100
Subject: [PATCH 005/125] Modified Jenkins file
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index dbf3de3de1..f44fe35978 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -20,7 +20,7 @@ pipeline {
stages {
stage ('Build') {
steps {
- sh "mvn versions:set -DnewVersion=1.3.3-${env.BUILD_NUMBER}"
+ sh "mvn versions:set -DnewVersion=1.3.3.${env.BUILD_NUMBER}.RELEASE"
timeout(time: 10, unit: 'MINUTES') {
sh "mvn -B -V -U -T4 clean deploy -DaltDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/thirdparty"
}
From 2393a4d25259fd147e5eb763ba809b5b2549e6f4 Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 30 May 2018 13:15:38 +0100
Subject: [PATCH 006/125] Modified Jenkins file
---
Jenkinsfile | 1 +
1 file changed, 1 insertion(+)
diff --git a/Jenkinsfile b/Jenkinsfile
index f44fe35978..5ca7980a06 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -21,6 +21,7 @@ pipeline {
stage ('Build') {
steps {
sh "mvn versions:set -DnewVersion=1.3.3.${env.BUILD_NUMBER}.RELEASE"
+ sh "mvn -N versions:update-child-modules"
timeout(time: 10, unit: 'MINUTES') {
sh "mvn -B -V -U -T4 clean deploy -DaltDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/thirdparty"
}
From 65fbca88701dc2c4207ac5b3eff5fc653a37a490 Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 30 May 2018 14:29:14 +0100
Subject: [PATCH 007/125] Modified Jenkins file
---
Jenkinsfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 5ca7980a06..a3b72856b2 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -20,10 +20,10 @@ pipeline {
stages {
stage ('Build') {
steps {
- sh "mvn versions:set -DnewVersion=1.3.3.${env.BUILD_NUMBER}.RELEASE"
+ sh "mvn versions:set -DnewVersion=1.3.3.GRESHAM-SNAPSHOT"
sh "mvn -N versions:update-child-modules"
timeout(time: 10, unit: 'MINUTES') {
- sh "mvn -B -V -U -T4 clean deploy -DaltDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/thirdparty"
+ sh "mvn -B -V -U -T4 clean deploy -DaltSnapshotDeploymentRepository=snapshots::default::https://nexus.greshamtech.com/content/repositories/snapshots/"
}
}
post {
From 6ea19c724a00526e335d2bd6339d5c8a68274388 Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 30 May 2018 15:24:51 +0100
Subject: [PATCH 008/125] Modified Jenkins file
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index a3b72856b2..6d55172c81 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -23,7 +23,7 @@ pipeline {
sh "mvn versions:set -DnewVersion=1.3.3.GRESHAM-SNAPSHOT"
sh "mvn -N versions:update-child-modules"
timeout(time: 10, unit: 'MINUTES') {
- sh "mvn -B -V -U -T4 clean deploy -DaltSnapshotDeploymentRepository=snapshots::default::https://nexus.greshamtech.com/content/repositories/snapshots/"
+ sh "mvn -B -V -U -T4 clean deploy -DaltSnapshotDeploymentRepository=snapshots::default::https://nexus.greshamtech.com/content/repositories/third-party-snapshots/"
}
}
post {
From e6b816efc89f887a393269f0233781a98ac7664b Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 26 Sep 2018 12:11:08 +0100
Subject: [PATCH 009/125] Created internal release for MitreID Connect
---
Jenkinsfile | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 6d55172c81..59ecc0db86 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -18,9 +18,32 @@ pipeline {
disableConcurrentBuilds();
}
stages {
+ stage ('1.3.3 Build') {
+ when {
+ branch "1.3.x"
+ }
+ steps {
+ sh "mvn versions:set -DnewVersion=1.3.3.GRESHAM-${env.BUILD_NUMBER}"
+ sh "mvn -N versions:update-child-modules"
+
+ timeout(time: 10, unit: 'MINUTES') {
+ sh "mvn -B -V -U -T4 clean deploy -DaltReleaseDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/third-party/"
+ }
+ }
+ post {
+ always{
+ archiveArtifacts caseSensitive: false, onlyIfSuccessful: true, allowEmptyArchive: true, artifacts: 'db-scripts-generator/target/*.jar,**auth.war'
+ }
+ }
+ }
stage ('Build') {
+ when {
+ not {
+ branch "1.3.x"
+ }
+ }
steps {
- sh "mvn versions:set -DnewVersion=1.3.3.GRESHAM-SNAPSHOT"
+ sh "mvn versions:set -DnewVersion=${env.BRANCH_NAME}.GRESHAM-SNAPSHOT"
sh "mvn -N versions:update-child-modules"
timeout(time: 10, unit: 'MINUTES') {
sh "mvn -B -V -U -T4 clean deploy -DaltSnapshotDeploymentRepository=snapshots::default::https://nexus.greshamtech.com/content/repositories/third-party-snapshots/"
From 6e60beb6c39436d4be09d199504938db1103caa6 Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 26 Sep 2018 12:19:01 +0100
Subject: [PATCH 010/125] Jenkinsfile fix for repo address
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 59ecc0db86..a1293a7242 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -27,7 +27,7 @@ pipeline {
sh "mvn -N versions:update-child-modules"
timeout(time: 10, unit: 'MINUTES') {
- sh "mvn -B -V -U -T4 clean deploy -DaltReleaseDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/third-party/"
+ sh "mvn -B -V -U -T4 clean deploy -DaltReleaseDeploymentRepository=releases::default::https://nexus.greshamtech.com/content/repositories/thirdparty/"
}
}
post {
From 34d1425fc58c7c83723a8c238c55e6b955d5b805 Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 26 Sep 2018 13:51:28 +0100
Subject: [PATCH 011/125] Jenkinsfile and maven build fixes
---
Jenkinsfile | 2 +-
openid-connect-client/pom.xml | 6 +++---
openid-connect-common/pom.xml | 8 ++++----
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index a1293a7242..b39d30eab2 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -32,7 +32,7 @@ pipeline {
}
post {
always{
- archiveArtifacts caseSensitive: false, onlyIfSuccessful: true, allowEmptyArchive: true, artifacts: 'db-scripts-generator/target/*.jar,**auth.war'
+ archiveArtifacts caseSensitive: false, onlyIfSuccessful: true, allowEmptyArchive: true, artifacts: 'openid-connect-server-webapp/target/*.war'
}
}
}
diff --git a/openid-connect-client/pom.xml b/openid-connect-client/pom.xml
index d3bd77eb6b..d01d9a40e2 100644
--- a/openid-connect-client/pom.xml
+++ b/openid-connect-client/pom.xml
@@ -45,7 +45,7 @@
${java-version}
-
+
+ <!– BUILD JavaDoc FILES –>
org.apache.maven.plugins
maven-javadoc-plugin
@@ -70,7 +70,7 @@
-
+ -->
diff --git a/openid-connect-common/pom.xml b/openid-connect-common/pom.xml
index 6b7772cd40..bc910d1cdf 100644
--- a/openid-connect-common/pom.xml
+++ b/openid-connect-common/pom.xml
@@ -101,7 +101,7 @@
${java-version}
-
+
+ <!– BUILD JavaDoc FILES –>
org.apache.maven.plugins
maven-javadoc-plugin
- attach-sources
+ attach-javadocs
jar
-
+ -->
From b13874b5db440a56d83ccdc699cf352d3de9032e Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Thu, 1 Nov 2018 11:43:07 +0000
Subject: [PATCH 012/125] DWN-26583: Upgraded spring oauth to version 2.1.3 for
security
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index dec35e50b8..462a751517 100644
--- a/pom.xml
+++ b/pom.xml
@@ -393,7 +393,7 @@
org.springframework.security.oauth
spring-security-oauth2
- 2.1.2.RELEASE
+ 2.1.3.RELEASE
From b7b2c2d8176fd6b8c33f2481b8598190d74e364a Mon Sep 17 00:00:00 2001
From: Carling Knight
Date: Tue, 13 Nov 2018 08:03:53 +0000
Subject: [PATCH 013/125] DWN-25303: Bumps a couple versions
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 462a751517..d70fbc0478 100644
--- a/pom.xml
+++ b/pom.xml
@@ -365,7 +365,7 @@
org.springframework
spring-framework-bom
- 4.3.17.RELEASE
+ 4.3.20.RELEASE
pom
import
@@ -564,7 +564,7 @@
com.google.guava
guava
- 21.0
+ 26.0-jre
com.google.code.gson
From 028972c359356c80ed9c5d8a0b418cf6771afd6e Mon Sep 17 00:00:00 2001
From: Gaurav Katiyar
Date: Wed, 14 Nov 2018 09:53:46 +0000
Subject: [PATCH 014/125] DWN-26566: Added password encoded to the client
entity service and changed the Introspection token service to allow parsing
of client authorities for api level access
---
.../IntrospectingTokenService.java | 15 ++++++++-------
.../DefaultOAuth2ClientDetailsEntityService.java | 15 ++++++++++++++-
2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/openid-connect-client/src/main/java/org/mitre/oauth2/introspectingfilter/IntrospectingTokenService.java b/openid-connect-client/src/main/java/org/mitre/oauth2/introspectingfilter/IntrospectingTokenService.java
index 76eaf22257..06ec7f72e5 100644
--- a/openid-connect-client/src/main/java/org/mitre/oauth2/introspectingfilter/IntrospectingTokenService.java
+++ b/openid-connect-client/src/main/java/org/mitre/oauth2/introspectingfilter/IntrospectingTokenService.java
@@ -21,12 +21,7 @@
import java.io.IOException;
import java.net.URI;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
@@ -41,6 +36,7 @@
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.util.OAuth2Utils;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
@@ -237,10 +233,15 @@ private OAuth2Request createStoredRequest(final JsonObject token) {
Map parameters = new HashMap<>();
parameters.put("client_id", clientId);
parameters.put("scope", OAuth2Utils.formatParameterList(scopes));
- OAuth2Request storedRequest = new OAuth2Request(parameters, clientId, null, true, scopes, null, null, null, null);
+ OAuth2Request storedRequest = new OAuth2Request(parameters, clientId, parseClientAuthorities(token), true, scopes, null, null, null, null);
return storedRequest;
}
+ // Added the protected method to allow custom behaviour
+ protected Collection extends GrantedAuthority> parseClientAuthorities(JsonObject token) {
+ return null;
+ }
+
private Authentication createUserAuthentication(JsonObject token) {
JsonElement userId = token.get("user_id");
if(userId == null) {
diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
index 6ed98ee5db..f02e773979 100644
--- a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
+++ b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
@@ -50,6 +50,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.common.exceptions.InvalidClientException;
import org.springframework.security.oauth2.common.exceptions.OAuth2Exception;
import org.springframework.stereotype.Service;
@@ -100,7 +101,11 @@ public class DefaultOAuth2ClientDetailsEntityService implements ClientDetailsEnt
@Autowired
private ConfigurationPropertiesBean config;
- // map of sector URI -> list of redirect URIs
+ @Autowired
+ private PasswordEncoder passwordEncoder;
+
+
+ // map of sector URI -> list of redirect URIs
private LoadingCache> sectorRedirects = CacheBuilder.newBuilder()
.expireAfterAccess(1, TimeUnit.HOURS)
.maximumSize(100)
@@ -145,6 +150,10 @@ public ClientDetailsEntity saveNewClient(ClientDetailsEntity client) {
ensureNoReservedScopes(client);
+ if(!Strings.isNullOrEmpty(client.getClientSecret())) {
+ client.setClientSecret(this.passwordEncoder.encode(client.getClientSecret()));
+ }
+
ClientDetailsEntity c = clientRepository.saveClient(client);
statsService.resetCache();
@@ -423,6 +432,10 @@ public ClientDetailsEntity updateClient(ClientDetailsEntity oldClient, ClientDet
// make sure a client doesn't get any special system scopes
ensureNoReservedScopes(newClient);
+ if(!Strings.isNullOrEmpty(newClient.getClientSecret())) {
+ newClient.setClientSecret(this.passwordEncoder.encode(newClient.getClientSecret()));
+ }
+
return clientRepository.updateClient(oldClient.getId(), newClient);
}
throw new IllegalArgumentException("Neither old client or new client can be null!");
From 0ae12c2e5d5bbb1bb7b091e74a04d00307dce362 Mon Sep 17 00:00:00 2001
From: Carling Knight
Date: Wed, 28 Nov 2018 16:20:16 +0000
Subject: [PATCH 015/125] DWN-25861: Manually specifies the scope column name
---
.../java/org/mitre/oauth2/model/OAuth2AccessTokenEntity.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/openid-connect-common/src/main/java/org/mitre/oauth2/model/OAuth2AccessTokenEntity.java b/openid-connect-common/src/main/java/org/mitre/oauth2/model/OAuth2AccessTokenEntity.java
index 70924c3696..67f3834a27 100644
--- a/openid-connect-common/src/main/java/org/mitre/oauth2/model/OAuth2AccessTokenEntity.java
+++ b/openid-connect-common/src/main/java/org/mitre/oauth2/model/OAuth2AccessTokenEntity.java
@@ -242,6 +242,7 @@ public void setRefreshToken(OAuth2RefreshToken refreshToken) {
joinColumns=@JoinColumn(name="owner_id"),
name="token_scope"
)
+ @Column(name="scope")
public Set getScope() {
return scope;
}
From c12cb181978d21d1865db6ce91ebef1d202dbfcb Mon Sep 17 00:00:00 2001
From: Carling Knight
Date: Mon, 3 Dec 2018 16:18:48 +0000
Subject: [PATCH 016/125] DWN-27040: Changes when the client secret is given to
the UI
---
...faultOAuth2ClientDetailsEntityService.java | 6 ++++--
.../mitre/openid/connect/web/ClientAPI.java | 21 ++++++++++++++++---
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
index f02e773979..ddaa0435a0 100644
--- a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
+++ b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
@@ -432,9 +432,11 @@ public ClientDetailsEntity updateClient(ClientDetailsEntity oldClient, ClientDet
// make sure a client doesn't get any special system scopes
ensureNoReservedScopes(newClient);
- if(!Strings.isNullOrEmpty(newClient.getClientSecret())) {
+ if (Strings.isNullOrEmpty(newClient.getClientSecret())){
+ newClient.setClientSecret(oldClient.getClientSecret());
+ }else{
newClient.setClientSecret(this.passwordEncoder.encode(newClient.getClientSecret()));
- }
+ }
return clientRepository.updateClient(oldClient.getId(), newClient);
}
diff --git a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
index 01edb6b55f..86e359f8e6 100644
--- a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
+++ b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
@@ -278,6 +278,8 @@ public String apiAddClient(@RequestBody String jsonString, Model m, Authenticati
client = clientService.generateClientId(client);
}
+ String plaintextSecret = client.getClientSecret();
+
if (client.getTokenEndpointAuthMethod() == null ||
client.getTokenEndpointAuthMethod().equals(AuthMethod.NONE)) {
// we shouldn't have a secret for this client
@@ -292,6 +294,7 @@ public String apiAddClient(@RequestBody String jsonString, Model m, Authenticati
if (json.has("generateClientSecret") && json.get("generateClientSecret").getAsBoolean()
|| Strings.isNullOrEmpty(client.getClientSecret())) {
client = clientService.generateClientSecret(client);
+ plaintextSecret = client.getClientSecret();
}
} else if (client.getTokenEndpointAuthMethod().equals(AuthMethod.PRIVATE_KEY)) {
@@ -320,6 +323,10 @@ public String apiAddClient(@RequestBody String jsonString, Model m, Authenticati
try {
ClientDetailsEntity newClient = clientService.saveNewClient(client);
+
+ //Set the client secret to the plaintext from the request
+ newClient.setClientSecret(plaintextSecret);
+
m.addAttribute(JsonEntityView.ENTITY, newClient);
if (AuthenticationUtilities.isAdmin(auth)) {
@@ -385,6 +392,7 @@ public String apiUpdateClient(@PathVariable("id") Long id, @RequestBody String j
}
ClientDetailsEntity oldClient = clientService.getClientById(id);
+ String plaintextSecret = client.getClientSecret();
if (oldClient == null) {
logger.error("apiUpdateClient failed; client with id " + id + " could not be found.");
@@ -408,10 +416,10 @@ public String apiUpdateClient(@PathVariable("id") Long id, @RequestBody String j
|| client.getTokenEndpointAuthMethod().equals(AuthMethod.SECRET_POST)
|| client.getTokenEndpointAuthMethod().equals(AuthMethod.SECRET_JWT)) {
- // if they've asked for us to generate a client secret (or they left it blank but require one), do so here
- if (json.has("generateClientSecret") && json.get("generateClientSecret").getAsBoolean()
- || Strings.isNullOrEmpty(client.getClientSecret())) {
+ // Once a client has been created, we only update the secret when asked to
+ if (json.has("generateClientSecret") && json.get("generateClientSecret").getAsBoolean()) {
client = clientService.generateClientSecret(client);
+ plaintextSecret = client.getClientSecret();
}
} else if (client.getTokenEndpointAuthMethod().equals(AuthMethod.PRIVATE_KEY)) {
@@ -438,6 +446,10 @@ public String apiUpdateClient(@PathVariable("id") Long id, @RequestBody String j
try {
ClientDetailsEntity newClient = clientService.updateClient(oldClient, client);
+
+ //Set the client secret to the plaintext from the request
+ newClient.setClientSecret(plaintextSecret);
+
m.addAttribute(JsonEntityView.ENTITY, newClient);
if (AuthenticationUtilities.isAdmin(auth)) {
@@ -497,6 +509,9 @@ public String apiShowClient(@PathVariable("id") Long id, Model model, Authentica
return JsonErrorView.VIEWNAME;
}
+ //We don't want the UI to get the secret
+ client.setClientSecret(null);
+
model.addAttribute(JsonEntityView.ENTITY, client);
if (AuthenticationUtilities.isAdmin(auth)) {
From 5abebb7c3692dda14ba249365046b92cc8e8e1a4 Mon Sep 17 00:00:00 2001
From: Carling Knight
Date: Tue, 4 Dec 2018 15:33:50 +0000
Subject: [PATCH 017/125] DWN-27040: Adds the same secret key limiting to
client registration
Also removes the client secrets from the client listing
---
.../java/org/mitre/openid/connect/web/ClientAPI.java | 3 +++
.../connect/web/DynamicClientRegistrationEndpoint.java | 9 +++++++++
2 files changed, 12 insertions(+)
diff --git a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
index 86e359f8e6..94c3952867 100644
--- a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
+++ b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
@@ -229,6 +229,9 @@ public PKCEAlgorithm deserialize(JsonElement json, Type typeOfT, JsonDeserializa
public String apiGetAllClients(Model model, Authentication auth) {
Collection clients = clientService.getAllClients();
+
+ clients.forEach(client -> client.setClientSecret(null));
+
model.addAttribute(JsonEntityView.ENTITY, clients);
if (AuthenticationUtilities.isAdmin(auth)) {
diff --git a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/DynamicClientRegistrationEndpoint.java b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/DynamicClientRegistrationEndpoint.java
index 89e0418ad8..74c106b661 100644
--- a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/DynamicClientRegistrationEndpoint.java
+++ b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/DynamicClientRegistrationEndpoint.java
@@ -167,6 +167,8 @@ public String registerNewClient(@RequestBody String jsonString, Model m) {
if (newClient != null) {
// it parsed!
+ String plaintextSecret = newClient.getClientSecret();
+
//
// Now do some post-processing consistency checks on it
//
@@ -201,6 +203,7 @@ public String registerNewClient(@RequestBody String jsonString, Model m) {
// we need to generate a secret
newClient = clientService.generateClientSecret(newClient);
+ plaintextSecret = newClient.getClientSecret();
}
// set some defaults for token timeouts
@@ -242,6 +245,9 @@ public String registerNewClient(@RequestBody String jsonString, Model m) {
// send it all out to the view
RegisteredClient registered = new RegisteredClient(savedClient, token.getValue(), config.getIssuer() + "register/" + UriUtils.encodePathSegment(savedClient.getClientId(), "UTF-8"));
+
+ registered.setClientSecret(plaintextSecret);
+
m.addAttribute("client", registered);
m.addAttribute(HttpCodeView.CODE, HttpStatus.CREATED); // http 201
@@ -377,6 +383,9 @@ public String updateClient(@PathVariable("id") String clientId, @RequestBody Str
RegisteredClient registered = new RegisteredClient(savedClient, token.getValue(), config.getIssuer() + "register/" + UriUtils.encodePathSegment(savedClient.getClientId(), "UTF-8"));
+ // We don't want the UI to receive the client secret
+ registered.setClientSecret(null);
+
// send it all out to the view
m.addAttribute("client", registered);
m.addAttribute(HttpCodeView.CODE, HttpStatus.OK); // http 200
From 2008404afdcb99b781959d14b87fba3c5c12de5c Mon Sep 17 00:00:00 2001
From: Carling Knight
Date: Wed, 5 Dec 2018 14:36:38 +0000
Subject: [PATCH 018/125] DWN-27040: Bit of refactoring, Protected Resources
now protected
---
.../impl/DefaultOAuth2ClientDetailsEntityService.java | 4 ++++
.../main/java/org/mitre/openid/connect/web/ClientAPI.java | 5 -----
.../connect/web/DynamicClientRegistrationEndpoint.java | 5 -----
3 files changed, 4 insertions(+), 10 deletions(-)
diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
index ddaa0435a0..005db69b54 100644
--- a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
+++ b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java
@@ -150,12 +150,16 @@ public ClientDetailsEntity saveNewClient(ClientDetailsEntity client) {
ensureNoReservedScopes(client);
+ String plaintextSecret = client.getClientSecret();
+
if(!Strings.isNullOrEmpty(client.getClientSecret())) {
client.setClientSecret(this.passwordEncoder.encode(client.getClientSecret()));
}
ClientDetailsEntity c = clientRepository.saveClient(client);
+ c.setClientSecret(plaintextSecret);
+
statsService.resetCache();
return c;
diff --git a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
index 94c3952867..a3943fba5a 100644
--- a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
+++ b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/ClientAPI.java
@@ -281,8 +281,6 @@ public String apiAddClient(@RequestBody String jsonString, Model m, Authenticati
client = clientService.generateClientId(client);
}
- String plaintextSecret = client.getClientSecret();
-
if (client.getTokenEndpointAuthMethod() == null ||
client.getTokenEndpointAuthMethod().equals(AuthMethod.NONE)) {
// we shouldn't have a secret for this client
@@ -297,7 +295,6 @@ public String apiAddClient(@RequestBody String jsonString, Model m, Authenticati
if (json.has("generateClientSecret") && json.get("generateClientSecret").getAsBoolean()
|| Strings.isNullOrEmpty(client.getClientSecret())) {
client = clientService.generateClientSecret(client);
- plaintextSecret = client.getClientSecret();
}
} else if (client.getTokenEndpointAuthMethod().equals(AuthMethod.PRIVATE_KEY)) {
@@ -328,8 +325,6 @@ public String apiAddClient(@RequestBody String jsonString, Model m, Authenticati
ClientDetailsEntity newClient = clientService.saveNewClient(client);
//Set the client secret to the plaintext from the request
- newClient.setClientSecret(plaintextSecret);
-
m.addAttribute(JsonEntityView.ENTITY, newClient);
if (AuthenticationUtilities.isAdmin(auth)) {
diff --git a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/DynamicClientRegistrationEndpoint.java b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/DynamicClientRegistrationEndpoint.java
index 74c106b661..a36d539d01 100644
--- a/openid-connect-server/src/main/java/org/mitre/openid/connect/web/DynamicClientRegistrationEndpoint.java
+++ b/openid-connect-server/src/main/java/org/mitre/openid/connect/web/DynamicClientRegistrationEndpoint.java
@@ -167,8 +167,6 @@ public String registerNewClient(@RequestBody String jsonString, Model m) {
if (newClient != null) {
// it parsed!
- String plaintextSecret = newClient.getClientSecret();
-
//
// Now do some post-processing consistency checks on it
//
@@ -203,7 +201,6 @@ public String registerNewClient(@RequestBody String jsonString, Model m) {
// we need to generate a secret
newClient = clientService.generateClientSecret(newClient);
- plaintextSecret = newClient.getClientSecret();
}
// set some defaults for token timeouts
@@ -246,8 +243,6 @@ public String registerNewClient(@RequestBody String jsonString, Model m) {
RegisteredClient registered = new RegisteredClient(savedClient, token.getValue(), config.getIssuer() + "register/" + UriUtils.encodePathSegment(savedClient.getClientId(), "UTF-8"));
- registered.setClientSecret(plaintextSecret);
-
m.addAttribute("client", registered);
m.addAttribute(HttpCodeView.CODE, HttpStatus.CREATED); // http 201
From 3aa9cb90d3a321025061c519e4b231c18aae8cbf Mon Sep 17 00:00:00 2001
From: Dominic Murch
Date: Wed, 6 Mar 2019 09:45:36 +0000
Subject: [PATCH 019/125] DWN-27799 - update spring-security-oauth2 for
CVE-2019-3778
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index d70fbc0478..b0c04413d5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -393,7 +393,7 @@
org.springframework.security.oauth
spring-security-oauth2
- 2.1.3.RELEASE
+ 2.1.4.RELEASE
From a628162dca2905c5fb316fcb6e0e1b7920007dc0 Mon Sep 17 00:00:00 2001
From: Carling Knight
Date: Thu, 14 Mar 2019 11:49:24 +0000
Subject: [PATCH 020/125] Appends our changes to the CHANGELOG
---
CHANGELOG.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 159e487317..e2c0ffb3b3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
Unreleased:
+*1.3.3-GRESHAM:
+- Upgraded libraries with known vulnerabilities
+- Added a Gresham specific Jenkinsfile
+- Added a password encoder to the client entity service
+- Fixes a bug by specifying the name of the scope columnn
+- Removed functionality that passed the client secret down to the UI
+
*1.3.2:
- Added changelog
- Set default redirect URI resolver strict matching to true
From 18c7993e75eb1864bd24313a2f5210d8183d00f9 Mon Sep 17 00:00:00 2001
From: Harry Smith
Date: Fri, 25 Oct 2019 10:53:19 +0100
Subject: [PATCH 021/125] DWN-30296 : upgrade jackson to 2.10.0
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index b0c04413d5..62762c24a2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -374,12 +374,12 @@
com.fasterxml.jackson.core
jackson-databind
- 2.9.0.pr2
+ 2.10.0
com.fasterxml.jackson.core
jackson-annotations
- 2.9.0.pr2
+ 2.10.0
From e91a153f494f09c4b0a1aff7eb22bea3921120f0 Mon Sep 17 00:00:00 2001
From: Harry Smith
Date: Fri, 25 Oct 2019 10:53:52 +0100
Subject: [PATCH 022/125] DWN-30463 : update spring security bom
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 62762c24a2..6a55655a76 100644
--- a/pom.xml
+++ b/pom.xml
@@ -386,7 +386,7 @@
org.springframework.security
spring-security-bom
- 4.2.6.RELEASE
+ 4.2.13.RELEASE
pom
import
From df84942311a85ada97d8ea0dc49d03853859058e Mon Sep 17 00:00:00 2001
From: Harry Smith
Date: Tue, 29 Oct 2019 07:52:48 +0000
Subject: [PATCH 023/125] DWN-30574 : upgrade nimbus-jose-jwt to 7.9
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 6a55655a76..1347b72e29 100644
--- a/pom.xml
+++ b/pom.xml
@@ -585,7 +585,7 @@
com.nimbusds
nimbus-jose-jwt
- 5.4
+ 7.9
org.bouncycastle
From a30b999ea796273b94b1d7b8157ae4fa13a9efbc Mon Sep 17 00:00:00 2001
From: Harry Smith
Date: Wed, 4 Dec 2019 08:57:08 +0000
Subject: [PATCH 024/125] No Jira : alter building mechanism to be independent
on Jenkins build numbers
---
Jenkinsfile | 2 +-
README.md | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index b39d30eab2..098a130e65 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -23,7 +23,7 @@ pipeline {
branch "1.3.x"
}
steps {
- sh "mvn versions:set -DnewVersion=1.3.3.GRESHAM-${env.BUILD_NUMBER}"
+ sh "mvn versions:set -DnewVersion=1.3.3.GRESHAM-18"
sh "mvn -N versions:update-child-modules"
timeout(time: 10, unit: 'MINUTES') {
diff --git a/README.md b/README.md
index 7b9646814f..2c513b0a0f 100644
--- a/README.md
+++ b/README.md
@@ -29,3 +29,7 @@ The authors and key contributors of the project include:
Copyright ©2017, [MIT Internet Trust Consortium](http://www.trust.mit.edu/). Licensed under the Apache 2.0 license, for details see `LICENSE.txt`.
+
+## Note for releasing
+
+Releases are made off of branch 1.3.x - the version released used to depend on the Jenkins build number but this is ineffective as the Jenkins history can vanish leaving you back at build number 1. Therefore, in the Jenkinsfile, the version to be released needs altering on line 26 and incrementing by 1.
From 28e69c377ffb10fa5a013dec070d321669dc18d8 Mon Sep 17 00:00:00 2001
From: Harry Smith
Date: Mon, 17 Feb 2020 08:36:39 +0000
Subject: [PATCH 025/125] DWN-31929 : mitigate open id common XSS vulnerability
---
openid-connect-common/pom.xml | 44 +++++++++++++++
.../connect/web/UserInfoInterceptor.java | 55 ++++++++++++++++++-
.../web/UserInfoInterceptorSpec.groovy | 41 ++++++++++++++
pom.xml | 23 ++++++++
4 files changed, 160 insertions(+), 3 deletions(-)
create mode 100644 openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy
diff --git a/openid-connect-common/pom.xml b/openid-connect-common/pom.xml
index bc910d1cdf..79123a8542 100644
--- a/openid-connect-common/pom.xml
+++ b/openid-connect-common/pom.xml
@@ -87,6 +87,19 @@
org.bouncycastle
bcprov-jdk15on
+
+ org.jsoup
+ jsoup
+
+
+
+ org.codehaus.groovy
+ groovy-all
+
+
+ org.spockframework
+ spock-core
+
jar
@@ -101,6 +114,37 @@
${java-version}
+
+ org.codehaus.gmavenplus
+ gmavenplus-plugin
+ 1.7.0
+
+
+
+ addTestStubSources
+ compileTests
+ removeTestStubs
+
+
+
+
+ ${project.build.directory}/generated-groovy-stubs
+ ${project.build.directory}/generated-groovy-test-stubs
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.18.1
+
+
+ ${project.build.testOutputDirectory}
+
+ **/*Test.java
+ **/*Spec.java
+
+
+
org.mitre
@@ -607,6 +625,11 @@
wro4j-extensions
1.8.0
+
+ org.jsoup
+ jsoup
+ 1.10.3
+
From dd92d8473e682a2ee85aa18c35b1e8f25b67277e Mon Sep 17 00:00:00 2001
From: Harry Smith
Date: Mon, 17 Feb 2020 10:19:19 +0000
Subject: [PATCH 026/125] DWN-31929 : updated dependencies and made method void
---
openid-connect-common/pom.xml | 6 +--
.../connect/web/UserInfoInterceptor.java | 53 +++++++++----------
.../web/UserInfoInterceptorSpec.groovy | 14 ++---
pom.xml | 8 +--
4 files changed, 40 insertions(+), 41 deletions(-)
diff --git a/openid-connect-common/pom.xml b/openid-connect-common/pom.xml
index 79123a8542..54cc0ef557 100644
--- a/openid-connect-common/pom.xml
+++ b/openid-connect-common/pom.xml
@@ -94,7 +94,7 @@
org.codehaus.groovy
- groovy-all
+ groovy
org.spockframework
@@ -117,7 +117,7 @@
org.codehaus.gmavenplus
gmavenplus-plugin
- 1.7.0
+ 1.8.1
@@ -135,7 +135,7 @@
org.apache.maven.plugins
maven-surefire-plugin
- 2.18.1
+ 2.22.2
${project.build.testOutputDirectory}
diff --git a/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java b/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
index 43d9c85917..9fcfe795d4 100644
--- a/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
+++ b/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
@@ -83,7 +83,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
OIDCAuthenticationToken oidc = (OIDCAuthenticationToken) auth;
UserInfo userInfo = oidc.getUserInfo();
if (userInfo != null) {
- santiseUserInfo(userInfo);
+ sanitiseUserInfo(userInfo);
request.setAttribute("userInfo", userInfo);
request.setAttribute("userInfoJson", userInfo.toJson());
} else {
@@ -99,7 +99,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
// if we have one, inject it so views can use it
if (user != null) {
- santiseUserInfo(user);
+ sanitiseUserInfo(user);
request.setAttribute("userInfo", user);
request.setAttribute("userInfoJson", user.toJson());
}
@@ -110,39 +110,38 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
return true;
}
- private UserInfo santiseUserInfo(final UserInfo userInfo) {
- userInfo.setSub(nullCheckClean(userInfo.getSub()));
- userInfo.setPreferredUsername(nullCheckClean(userInfo.getPreferredUsername()));
- userInfo.setName(nullCheckClean(userInfo.getName()));
- userInfo.setGivenName(nullCheckClean(userInfo.getGivenName()));
- userInfo.setFamilyName(nullCheckClean(userInfo.getFamilyName()));
- userInfo.setMiddleName(nullCheckClean(userInfo.getMiddleName()));
- userInfo.setNickname(nullCheckClean(userInfo.getNickname()));
- userInfo.setProfile(nullCheckClean(userInfo.getProfile()));
- userInfo.setPicture(nullCheckClean(userInfo.getPicture()));
- userInfo.setWebsite(nullCheckClean(userInfo.getWebsite()));
- userInfo.setEmail(nullCheckClean(userInfo.getEmail()));
- userInfo.setGender(nullCheckClean(userInfo.getGender()));
- userInfo.setLocale(nullCheckClean(userInfo.getLocale()));
- userInfo.setPhoneNumber(nullCheckClean(userInfo.getPhoneNumber()));
- userInfo.setUpdatedTime(nullCheckClean(userInfo.getUpdatedTime()));
- userInfo.setBirthdate(nullCheckClean(userInfo.getBirthdate()));
+ private void sanitiseUserInfo(final UserInfo userInfo) {
+ userInfo.setSub(sanitise(userInfo.getSub()));
+ userInfo.setPreferredUsername(sanitise(userInfo.getPreferredUsername()));
+ userInfo.setName(sanitise(userInfo.getName()));
+ userInfo.setGivenName(sanitise(userInfo.getGivenName()));
+ userInfo.setFamilyName(sanitise(userInfo.getFamilyName()));
+ userInfo.setMiddleName(sanitise(userInfo.getMiddleName()));
+ userInfo.setNickname(sanitise(userInfo.getNickname()));
+ userInfo.setProfile(sanitise(userInfo.getProfile()));
+ userInfo.setPicture(sanitise(userInfo.getPicture()));
+ userInfo.setWebsite(sanitise(userInfo.getWebsite()));
+ userInfo.setEmail(sanitise(userInfo.getEmail()));
+ userInfo.setGender(sanitise(userInfo.getGender()));
+ userInfo.setLocale(sanitise(userInfo.getLocale()));
+ userInfo.setPhoneNumber(sanitise(userInfo.getPhoneNumber()));
+ userInfo.setUpdatedTime(sanitise(userInfo.getUpdatedTime()));
+ userInfo.setBirthdate(sanitise(userInfo.getBirthdate()));
Address userInfoAddress = userInfo.getAddress();
if (userInfoAddress != null) {
- userInfoAddress.setFormatted(nullCheckClean(userInfoAddress.getFormatted()));
- userInfoAddress.setStreetAddress(nullCheckClean(userInfoAddress.getStreetAddress()));
- userInfoAddress.setLocality(nullCheckClean(userInfoAddress.getLocality()));
- userInfoAddress.setRegion(nullCheckClean(userInfoAddress.getRegion()));
- userInfoAddress.setPostalCode(nullCheckClean(userInfoAddress.getPostalCode()));
- userInfoAddress.setCountry(nullCheckClean(userInfoAddress.getCountry()));
+ userInfoAddress.setFormatted(sanitise(userInfoAddress.getFormatted()));
+ userInfoAddress.setStreetAddress(sanitise(userInfoAddress.getStreetAddress()));
+ userInfoAddress.setLocality(sanitise(userInfoAddress.getLocality()));
+ userInfoAddress.setRegion(sanitise(userInfoAddress.getRegion()));
+ userInfoAddress.setPostalCode(sanitise(userInfoAddress.getPostalCode()));
+ userInfoAddress.setCountry(sanitise(userInfoAddress.getCountry()));
userInfo.setAddress(userInfoAddress);
}
- return userInfo;
}
- private String nullCheckClean(String elementToClean) {
+ private String sanitise(String elementToClean) {
final Whitelist whitelist = Whitelist.relaxed()
.removeTags("a")
.removeProtocols("img", "src", "http", "https");
diff --git a/openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy b/openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy
index 9bea3e7c0d..5dd47daa66 100644
--- a/openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy
+++ b/openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy
@@ -23,19 +23,19 @@ class UserInfoInterceptorSpec extends Specification {
when: 'The user info object is passed through the sanitise method'
- UserInfo sanitisedUserInfo = userInfoInterceptor.santiseUserInfo(userInfo)
+ userInfoInterceptor.sanitiseUserInfo(userInfo)
then: 'The malicious names have been sanitised'
- sanitisedUserInfo.getName() == 'Test Test'
- sanitisedUserInfo.getGivenName() == 'Test'
+ userInfo.getName() == 'Test Test'
+ userInfo.getGivenName() == 'Test'
and: 'The non malicious elements have been unaffected'
- sanitisedUserInfo.getSub() == '12318767'
- sanitisedUserInfo.getPreferredUsername() == 'Test'
- sanitisedUserInfo.getFamilyName() == 'Test'
- sanitisedUserInfo.getEmail() == 'test@test.com'
+ userInfo.getSub() == '12318767'
+ userInfo.getPreferredUsername() == 'Test'
+ userInfo.getFamilyName() == 'Test'
+ userInfo.getEmail() == 'test@test.com'
}
}
diff --git a/pom.xml b/pom.xml
index a11af7e5c2..98af967d3f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -522,19 +522,19 @@
org.codehaus.groovy
- groovy-all
- 2.4.13
+ groovy
+ 2.5.9
test
org.spockframework
spock-core
- 1.1-groovy-2.4
+ 1.3-groovy-2.5
test
org.codehaus.groovy
- groovy-all
+ *
From acaa64b4d5965502609cf36c6eb089c1df3a376e Mon Sep 17 00:00:00 2001
From: Harry Smith
Date: Mon, 17 Feb 2020 12:51:17 +0000
Subject: [PATCH 027/125] DWN-31929 : move whitelist to class level
---
.../org/mitre/openid/connect/web/UserInfoInterceptor.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java b/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
index 9fcfe795d4..3c4f764e4b 100644
--- a/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
+++ b/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
@@ -54,6 +54,10 @@
*/
public class UserInfoInterceptor extends HandlerInterceptorAdapter {
+ private final Whitelist whitelist = Whitelist.relaxed()
+ .removeTags("a")
+ .removeProtocols("img", "src", "http", "https");
+
private Gson gson = new GsonBuilder()
.registerTypeHierarchyAdapter(GrantedAuthority.class, new JsonSerializer() {
@Override
@@ -142,10 +146,6 @@ private void sanitiseUserInfo(final UserInfo userInfo) {
}
private String sanitise(String elementToClean) {
- final Whitelist whitelist = Whitelist.relaxed()
- .removeTags("a")
- .removeProtocols("img", "src", "http", "https");
-
if (elementToClean != null) {
return Jsoup.clean(elementToClean, whitelist);
}
From 2c8c545556c5a93a59d1271eb6dd4d818682a059 Mon Sep 17 00:00:00 2001
From: Harry Smith
Date: Mon, 17 Feb 2020 13:55:03 +0000
Subject: [PATCH 028/125] DWN-31929 : add further XSS attacks to test
---
.../connect/web/UserInfoInterceptor.java | 4 +-
.../web/UserInfoInterceptorSpec.groovy | 62 ++++++++++++++++++-
2 files changed, 60 insertions(+), 6 deletions(-)
diff --git a/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java b/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
index 3c4f764e4b..92aab1cd18 100644
--- a/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
+++ b/openid-connect-common/src/main/java/org/mitre/openid/connect/web/UserInfoInterceptor.java
@@ -54,9 +54,7 @@
*/
public class UserInfoInterceptor extends HandlerInterceptorAdapter {
- private final Whitelist whitelist = Whitelist.relaxed()
- .removeTags("a")
- .removeProtocols("img", "src", "http", "https");
+ private final Whitelist whitelist = Whitelist.none();
private Gson gson = new GsonBuilder()
.registerTypeHierarchyAdapter(GrantedAuthority.class, new JsonSerializer() {
diff --git a/openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy b/openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy
index 5dd47daa66..dd8933e62a 100644
--- a/openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy
+++ b/openid-connect-common/src/test/groovy/org/mitre/openid/connect/web/UserInfoInterceptorSpec.groovy
@@ -3,20 +3,22 @@ package org.mitre.openid.connect.web
import org.mitre.openid.connect.model.DefaultUserInfo
import org.mitre.openid.connect.model.UserInfo
import spock.lang.Specification
+import spock.lang.Unroll
class UserInfoInterceptorSpec extends Specification {
private def userInfoInterceptor = new UserInfoInterceptor()
// CVE-2020-5497 -> https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues/1521
- def 'User Info is sanitised before making it back to the webpage'() {
+ @Unroll
+ def 'User Info is sanitised before making it back to the webpage with payload #payload'() {
given: 'A user name with a malicious payload'
UserInfo userInfo = new DefaultUserInfo()
userInfo.setSub('12318767')
- userInfo.setName("Test Test")
+ userInfo.setName("Test" + payload + " Test")
userInfo.setPreferredUsername('Test')
- userInfo.setGivenName("Test")
+ userInfo.setGivenName("Test" + payload)
userInfo.setFamilyName('Test')
userInfo.setEmail('test@test.com')
userInfo.setEmailVerified(true)
@@ -36,6 +38,60 @@ class UserInfoInterceptorSpec extends Specification {
userInfo.getPreferredUsername() == 'Test'
userInfo.getFamilyName() == 'Test'
userInfo.getEmail() == 'test@test.com'
+
+ where:
+
+ payload | _
+ "" | _
+ "" | _
+ "" | _
+ "" | _
+ "" | _
+ "" | _
+ "
-
+
" referrerpolicy="no-referrer" />
">
diff --git a/openid-connect-server-webapp/src/main/webapp/WEB-INF/views/approveDevice.jsp b/openid-connect-server-webapp/src/main/webapp/WEB-INF/views/approveDevice.jsp
index c49e1e8741..4856f1923a 100644
--- a/openid-connect-server-webapp/src/main/webapp/WEB-INF/views/approveDevice.jsp
+++ b/openid-connect-server-webapp/src/main/webapp/WEB-INF/views/approveDevice.jsp
@@ -85,7 +85,9 @@
@@ -104,7 +106,7 @@
-
+
" referrerpolicy="no-referrer" />
">
diff --git a/openid-connect-server-webapp/src/main/webapp/resources/template/client.html b/openid-connect-server-webapp/src/main/webapp/resources/template/client.html
index c7ceb88d46..9d35166c1a 100644
--- a/openid-connect-server-webapp/src/main/webapp/resources/template/client.html
+++ b/openid-connect-server-webapp/src/main/webapp/resources/template/client.html
@@ -26,7 +26,9 @@