Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MGPG-136] Windows passphrase corruption #120

Merged
merged 7 commits into from
Sep 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/main/java/org/apache/maven/plugins/gpg/AbstractGpgMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,22 @@ public abstract class AbstractGpgMojo extends AbstractMojo {
@Parameter(property = "gpg.bestPractices", defaultValue = "false")
private boolean bestPractices;

/**
* Whether to terminate the passphrase with LF character or not, as on some systems and some GPG executable combinations
* lack of trailing LF may cause GPG to not detect passphrase on STDIN. Since 3.2.0 it was always appended, unless
* passphrase itself ended with it. Note: before 3.2.7 the "line separator" was used for termination, that on
* other hand caused issues on Windows, where line separator is CRLF while GPG handles LF only.
* This parameter affects ONLY the GPG signer, not the BC signer.
* <p>
* By default, this parameter is {@code true}.
*
* @since 3.2.7
* @see <a href="https://issues.apache.org/jira/browse/MGPG-99">MGPG-99</a>
* @see <a href="https://issues.apache.org/jira/browse/MGPG-136">MGPG-136</a>
*/
@Parameter(property = "gpg.terminatePassphrase", defaultValue = "true")
private boolean terminatePassphrase;

/**
* Current user system settings for use in Maven.
*
Expand Down Expand Up @@ -345,6 +361,7 @@ protected AbstractGpgSigner newSigner(MavenProject mavenProject) throws MojoFail
signer.setPublicKeyring(publicKeyring);
signer.setLockMode(lockMode);
signer.setArgs(gpgArguments);
signer.setTerminatePassphrase(terminatePassphrase);

// "new way": env prevails
String passphrase =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ public abstract class AbstractGpgSigner {

protected String passphrase;

protected boolean terminatePassphrase;

private File outputDir;

private File buildDir;
Expand Down Expand Up @@ -98,6 +100,10 @@ public void setPassPhrase(String s) {
passphrase = s;
}

public void setTerminatePassphrase(boolean b) {
this.terminatePassphrase = b;
}

public void setOutputDirectory(File out) {
outputDir = out;
}
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/org/apache/maven/plugins/gpg/GpgSigner.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,10 @@ protected void generateSignatureForFile(File file, File signature) throws MojoEx
cmd.createArg().setValue("--passphrase-fd");
cmd.createArg().setValue("0");

// Prepare the input stream which will be used to pass the passphrase to the executable
if (!passphrase.endsWith(System.lineSeparator())) {
in = new ByteArrayInputStream((passphrase + System.lineSeparator()).getBytes());
// Prepare the STDIN stream which will be used to pass the passphrase to the executable
// but obey terminatePassphrase: append LF if asked for
if (terminatePassphrase && !passphrase.endsWith("\n")) {
in = new ByteArrayInputStream((passphrase + "\n").getBytes());
} else {
in = new ByteArrayInputStream(passphrase.getBytes());
}
Expand Down