2012-07-03 4 views
4

Je voudrais utiliser le cryptage de mot de passe de Maven tel qu'il utilise pour les nœuds pour les propriétés d'un Mojo. J'ai essayé de simplement coller un mot de passe crypté dans la propriété correcte pour le mojo, mais il l'a traité comme du texte brut. J'étais en espérant il y avait un attribut que je pouvais définir sur l'annotation pour la propriété Mojo qui expliquerait qu'il pourrait être chiffré, et si oui, d'utiliser le mot de passe maître du système pour décrypter, mais je ne vois rien dans le documentation pour cela.Cryptage de mot de passe Maven pour d'autres propriétés

Est-ce que quelqu'un a réussi à utiliser le chiffrement de mot de passe de Maven pour autre chose que des nœuds de mot de passe de serveur? J'adorerais faire ce travail pour mon Mojo.

Répondre

3

Pas une réponse complète, mais nous espérons un pointeur dans la bonne direction ...

Le maven-scm-plugin, maven-release-plugin et tomcat6-maven-plugin tous les mots de passe permettent de lire de la section <servers> du fichier ${user.home}/.m2/settings.xml. Peut-être que si vous regardez le code source de ces plugins/objectifs, vous trouverez un noyau Maven ou un composant partagé qui vous permet de faire ce que vous voulez, et vous pouvez l'adapter à vos besoins.

+0

Wow! Merci @ user944849! Il a fallu creuser un peu, mais à partir de maven-scm-plugin a fait l'affaire.La source n'est pas si compliquée - si vous utilisez Maven 2, vous incluez un composant Plexus qui fait le déchiffrement pour vous. – Colselaw

1

Jetez un oeil à ce code en tant qu'échantillon SqlExecMojo. Si vous êtes dans un plugin, vous pouvez obtenir le mot de passe et le déchiffrer. Si vous voulez l'utiliser pour filtrer les propriétés dans le plugin de ressources, nous aurons probablement besoin d'écrire une version personnalisée du plugin de ressources. J'ai un problème similaire peut finir par le faire.

+0

Oui - ça fait la même chose. Désolé je suis arrivé à l'autre commentaire d'abord. – Colselaw

+0

@Usman ismail: Impossible d'accéder au lien, demandé le nom d'utilisateur et le mot de passe –

+0

@Vinayak a mis à jour le lien rompu –

1

@ user944849 m'a lancé dans la bonne direction, et voici la solution.

Si vous utilisez Maven 2, vous devez ajouter la dépendance suivante à votre mojo:

<dependency> 
    <groupId>org.sonatype.plexus</groupId> 
    <artifactId>plexus-sec-dispatcher</artifactId> 
    <version>1.4</version> 
    <scope>compile</scope> 
</dependency> 

Et mettre ce qui suit dans src/main/resources/META-INF/plexus/components.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<component-set> 
    <components> 
    <component> 
     <role>org.sonatype.plexus.components.sec.dispatcher.SecDispatcher</role> 
     <role-hint>mng-4384</role-hint> 
     <implementation>org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher</implementation> 
     <requirements> 
     <requirement> 
      <role>org.sonatype.plexus.components.cipher.PlexusCipher</role> 
      <role-hint>mng-4384</role-hint> 
      <field-name>_cipher</field-name> 
     </requirement> 
     </requirements> 
     <configuration> 
     <_configuration-file>~/.m2/settings-security.xml</_configuration-file> 
     </configuration> 
    </component> 
    <component> 
     <role>org.sonatype.plexus.components.cipher.PlexusCipher</role> 
     <role-hint>mng-4384</role-hint> 
     <implementation>org.sonatype.plexus.components.cipher.DefaultPlexusCipher</implementation> 
    </component> 
    </components> 
</component-set> 

Puis dans votre Mojo, obtenir le mot de passe en tant que propriété ordinaire, et un SecDispatcher en tant que composant avec le même roleHint. La méthode decrypt sur le String renvoie la chaîne elle-même si ce n'est pas une chaîne cryptée Maven.

import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher; 
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException; 

/** 
* @goal echopass 
* 
* @phase process-sources 
*/ 
public class MyMojo extends AbstractMojo { 
    /** 
    * The password 
    * @parameter expression="${password}" 
    */ 
    private String password; 

    /** 
    * Plexus component for the SecDispatcher 
    * @component roleHint="mng-4384" 
    */ 
    private SecDispatcher secDispatcher; 

    private String decrypt(String input) { 
    try { 
     return secDispatcher.decrypt(input); 
    } catch (SecDispatcherException sde) { 
     getLog().warn(sde.getMessage()); 
     return input; 
    } 
    } 

    public void execute() throws MojoExecutionException { 
    String s = decrypt(password); 
    getLog().info("The password is " + s); 
    } 
} 

La chaîne peut être dans une propriété en settings.xml, dans un profil, ou vous pouvez même passer une chaîne cryptée comme une propriété du système sur la ligne de commande.

Références:

+0

Je suis confronté à ce problème et je pourrais avoir besoin d'aide. J'obtiens une exception de pointeur null sur mon secDispatcher. Vous dites à "SecDispatcher en tant que composant avec le même roleHint". Est-ce que je le définis dans le pom du projet en utilisant mon plugin? Auriez-vous encore le pom de ce projet? Merci. – PandaBearSoup

0

en utilisant la solution Colselaws je devenais une exception de pointeur nul. Le composant SecDispatcher n'a pas été défini. Je avais besoin de changer l'annotation à ceci:

//Plexus component for the SecDispatcher 
@Component(role = SecDispatcher.class, hint = "mng-4384") 
private SecDispatcher secDispatcher; 

Notez que cela est en dehors de tout commentaire doc et des composants doit être importé des annotations de plugin Maven.

Questions connexes