Débogue et contribue, un esprit Open Source!

Gregory EVE
Smile with WSO2
Published in
6 min readAug 2, 2019

Un bug, une fonctionnalité manquante, rejoignez la communauté et contribuez!

WSO2 est l’un des premiers éditeurs mondiaux Open Source. Il fait parti du top 5 des contributeurs à la Fondation Apache et édite l’ensemble de ses produits sous licence Apache 2.0. Plus qu’une notion marketing l’ensemble du fonctionnement opérationnel de la société est basé sur l’esprit Open Source avec une forte volonté de transmettre, d échanger et d’apprendre. Mais une communauté cela ne se construit et cela ne vit que si les interlocuteurs font le même effort, et ça c’est notre travail!

Mais venons en aux faits. Imaginons que nous souhaitons utiliser une fonctionnalité d’un produit et qu’une anomalie se présente. Comment faire?

Localisation et analyse du problème

La première chose à faire est d’isoler le problème:

  • mauvais usage?
  • erreur de paramétrage?
  • bug?
  • cas d’usage non implémenté?

comment ?

  • premier ami, le message d’erreur ou autres retours réalisés par le produit à l’utilisateur
  • second ami, les logs.
  • troisième ami, les fonctionnalités de débogage du JRE
  • le tout demandant une certaine connaissance de l’architecture générale des produits WSO2

Reproduction de l’erreur

Prenons un cas concret, nous souhaitons utiliser le standard SCIM 2.0 sur WSO2 Identity Server 5.8.0.

Nous ajoutons un utilisateur avec la requête suivante:

curl -v -k — user admin:admin — data ‘{“schemas”:[],”name”:{“familyName”:”jackson”,”givenName”:”kim”},”userName”:”kim”,”password”:”kimwso2",”emails”:[{“primary”:true,”value”:”kim.jackson@gmail.com”,”type”:”home”},{“value”:”kim_j@wso2.com”,”type”:”work”}],”urn:ietf:params:scim:schemas:extension:enterprise:2.0:User”:{“manager”:{“displayName”: “tom”}}}’ — header “Content-Type:application/json” https://localhost:9443/scim2/Users

L’opération s’est bien déroulée mais le retour semble étrange. Si nous faisons un GET sur l’utilisateur créé nous avons le même comportement.

curl -k --user admin:admin https://localhost:9443/scim2/Users/caa91fce-8ccf-48c8-b6d3-6a119a8ecf31
{"emails":[{"type":"work","value":"kim_j@wso2.com"},{"type":"home","value":"kim.jackson@gmail.com"}],"manager":{"manager":{"displayName":"tom"}},"meta":{"created":"2019-08-02T11:50:56.698Z","location":"https://localhost:9443/scim2/Users/caa91fce-8ccf-48c8-b6d3-6a119a8ecf31","lastModified":"2019-08-02T11:50:56.698Z","resourceType":"User"},"schemas":["urn:ietf:params:scim:schemas:core:2.0:User","urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],"roles":[{"type":"default","value":"Internal/everyone"}],"name":{"givenName":"kim","familyName":"jackson"},"id":"caa91fce-8ccf-48c8-b6d3-6a119a8ecf31","userName":"kim"}%

L’arborescence du JSON ne respecte pas ce qui a été envoyé et le standard, il y a un bug!

{
...
"manager":{
"manager":{
"displayName":"tom"
}
}
...
}

Analyse des logs

Les logs par défaut ne donne aucune information utile :

[2019-08-02 13:50:56,719]  INFO {org.wso2.carbon.identity.scim2.common.impl.SCIMUserManager} -  User: kim is created through SCIM.
[2019-08-02 13:57:21,796] INFO {org.wso2.carbon.identity.scim2.common.impl.SCIMUserManager} - User: kim is retrieved through SCIM.

Il nous faut augmenter le niveau des logs pour comprendre un peu mieux ce qu’il se passe.

Mais comment savoir lesquels augmenter? cela n’est malheureusement pas toujours trivial il faut identifier les composants impliquer dans le problème. Dans notre cas l’erreur semble être purement un souci de formatage lié à l’usage de SCIM 2.0. Ce standard est intégré comme ceci dans le produit:

Si nous nous rendons dans la console d’administration Carbon > Configure > logging, nous pouvons rechercher les loggers ayant “scim2” et “charon3” dans leur nom et augmenter leur niveau.

Si nous ré-exécutons l’opération GET nous obtenons les logs suivants:

[2019-08-02 14:10:24,295] DEBUG {org.wso2.carbon.identity.scim2.common.impl.SCIMUserManager} -  Retrieving user: caa91fce-8ccf-48c8-b6d3-6a119a8ecf31
[2019-08-02 14:10:24,345] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - Building User Object
[2019-08-02 14:10:24,345] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:meta.created AttributeValue:2019-08-02T11:50:56.698Z
[2019-08-02 14:10:24,346] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:id AttributeValue:caa91fce-8ccf-48c8-b6d3-6a119a8ecf31
[2019-08-02 14:10:24,346] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:meta.lastModified AttributeValue:2019-08-02T11:50:56.698Z
[2019-08-02 14:10:24,346] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:meta.location AttributeValue:https://localhost:9443/scim2/Users/caa91fce-8ccf-48c8-b6d3-6a119a8ecf31
[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:manager.displayName AttributeValue:tom
[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:User:name.givenName AttributeValue:kim
[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:meta.resourceType AttributeValue:User
[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:User:emails.work AttributeValue:kim_j@wso2.com
[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:User:emails.home AttributeValue:kim.jackson@gmail.com
[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:User:userName AttributeValue:kim
[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:User:name.familyName AttributeValue:jackson
[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} - AttributeKey: urn:ietf:params:scim:schemas:core:2.0:User:roles.default AttributeValue:Internal/everyone
[2019-08-02 14:10:24,347] INFO {org.wso2.carbon.identity.scim2.common.impl.SCIMUserManager} - User: kim is retrieved through SCIM.

En lisant ces logs nous pouvons voir que l’attribut manager.displayName est correctement récupéré.

[2019-08-02 14:10:24,347] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} -  AttributeKey: urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:manager.displayName AttributeValue:tom

Les logs nous donnent également une piste dans le code à explorer:

[2019-08-02 14:10:24,345] DEBUG {org.wso2.carbon.identity.scim2.common.utils.AttributeMapper} -  Building User Object

Débogage interactif

La 3éme étape est de cloner en local les sources concernés. Pour cela ce n’est pas compliqué tout est sur Github! Vous avez une page d’information générale pour vous guider qui se trouve ici : http://wso2.github.io/github-repositories.html

L’un des principes à retenir c’est que vous avez 2 groupes github:

Mais quelle branche ou tag sur lequel se brancher? Vous pouvez fouiller dans les méandres des dépendances maven du produit pour cela. Mais il y a beaucoup plus rapide et facile! Il suffit en général d’aller consulter dans l’arborescence du produit le répertoire repository/components/plugins et de retrouver le numéro de version de la librairie concernée:

  • org.wso2.charon3.core_3.1.21.jar
  • org.wso2.carbon.identity.scim2.common_1.2.45.jar

Une fois les sources clonés vous lancez votre IDE favori et utilisez ses fonctionnalités de débogue classiques pour java:

Vous relancer votre instance WSO2 en ajoutant le port de debug

./bin/wso2server.sh -debug 8000
Please start the remote debugging client to continue...
JAVA_HOME environment variable is set to /usr/lib/jvm/java-8-openjdk-amd64/jre/
CARBON_HOME environment variable is set to /home/greve/.wum3/products/wso2is/5.8.0/full/wso2is-5.8.0+1564542478263.full/wso2is-5.8.0
Using Java memory options: -Xms256m -Xmx1024m
Listening for transport dt_socket at address: 8000

Vous configurez votre outil de débogage en écoute de ce port:

En suivant pas à pas les requêtes et en positionnant de manière réfléchie nos points d'arrêt nous trouvons le coupable :

La séparation entre le schéma et un attribut et le “:” et pas le “.”.

Et après quelques investigations supplémentaires avec la commande git blame nous nous apercevons qu’une régression s’était glissée dans un commit d’un développeur!

Corrections et tests

Pour tester il vous suffit de recompiler la librairie concernée avec votre fixe et de remplacer le fichier correspondant dans l’arborescence de votre instance WSO2.

Dans notre cas : repository/components/plugins/org.wso2.carbon.identity.scim2.common_1.2.45.jar

Contribution à la communauté

Trouvez un fixe c’est bien, mais contribuer c’est mieux!

Pour contribuer rien de compliqué.

  1. Vous pouvez ajouter une issue sur le projet concerné (ou le produit), mais ce n’est pas obligatoire.
  2. vous devez faire un fork du dépôt concerné
  3. faire les corrections nécessaires
  4. bien valider en local que toutes les bonnes pratiques sont respectées
  5. faire une pull request en utilisant le template suivant https://github.com/wso2/carbon-kernel/blob/master/pull_request_template.md (il est en général pré-configuré)
  6. cela donne ceci : https://github.com/wso2-extensions/identity-inbound-provisioning-scim2/pull/184

Et voila!

Conseil, si vous avez souscrit un contrat de support avec l’éditeur ,faites un ticket auprès de celui-ci via la plate-forme de support pour qu’il intègre votre correction dans un patch WUM officiel.

  • Cela vous évitera d’avoir à rebuilder votre correction à chaque modification de cette librairie par l’éditeur tant qu’il n’aura pas pris en compte votre pull request.
  • cela permettra à tous les autres souscripteurs de bénéficier rapidement de votre contribution (comme vous, vous bénéficiez des leurs)

Dans notre cas le patch sera distribué dans un patch WUM officiel entre le 12 et 14 août.

EDIT: le patch WUM a été publié sous le numéro 5072.

Smile, en tant que Premier Certified Integration Partners, réalise ce type de tâches quotidiennement pour ces clients. N’hésitez pas à faire appel à nous pour vous y aider : https://www.smile.eu/

--

--

Gregory EVE
Smile with WSO2

Solution Architect at Smile, french lover and open source supporter. Integrate, Search, Leverage and Secure your data what else?