Compare commits

...

8 commits
main ... 7.0.2

6 changed files with 34 additions and 23 deletions

View file

@ -6,6 +6,13 @@ SPDX-License-Identifier: Apache-2.0
# Changelog # Changelog
## 7.0.2-SNAPSHOT
- CLI `change-key-password`: Fix indirect parameter passing for new and old passwords (thanks to @dkg for the report)
- Backport: revoke-key command: Allow for multiple '--with-key-password' options
## 7.0.1
- `decrypt`: Do not throw `NoSignature` exception (exit code 3) if `--verify-with` is provided, but `VERIFICATIONS` is empty.
## 7.0.0 ## 7.0.0
- Update implementation to [SOP Specification revision 07](https://www.ietf.org/archive/id/draft-dkg-openpgp-stateless-cli-07.html). - Update implementation to [SOP Specification revision 07](https://www.ietf.org/archive/id/draft-dkg-openpgp-stateless-cli-07.html).
- Add support for new `revoke-key` subcommand - Add support for new `revoke-key` subcommand

View file

@ -39,15 +39,17 @@ public class ChangeKeyPasswordCmd extends AbstractSopCmd {
changeKeyPassword.noArmor(); changeKeyPassword.noArmor();
} }
for (String oldKeyPassword : oldKeyPasswords) {
changeKeyPassword.oldKeyPassphrase(oldKeyPassword);
}
if (newKeyPassword != null) {
changeKeyPassword.newKeyPassphrase(newKeyPassword);
}
try { try {
for (String oldKeyPassword : oldKeyPasswords) {
String password = stringFromInputStream(getInput(oldKeyPassword));
changeKeyPassword.oldKeyPassphrase(password);
}
if (newKeyPassword != null) {
String password = stringFromInputStream(getInput(newKeyPassword));
changeKeyPassword.newKeyPassphrase(password);
}
changeKeyPassword.keys(System.in).writeTo(System.out); changeKeyPassword.keys(System.in).writeTo(System.out);
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);

View file

@ -115,11 +115,6 @@ public class DecryptCmd extends AbstractSopCmd {
private void writeVerifyOut(DecryptionResult result) throws IOException { private void writeVerifyOut(DecryptionResult result) throws IOException {
if (verifyOut != null) { if (verifyOut != null) {
if (result.getVerifications().isEmpty()) {
String errorMsg = getMsg("sop.error.runtime.no_verifiable_signature_found");
throw new SOPGPException.NoSignature(errorMsg);
}
try (OutputStream fileOut = getOutput(verifyOut)) { try (OutputStream fileOut = getOutput(verifyOut)) {
PrintWriter writer = new PrintWriter(fileOut); PrintWriter writer = new PrintWriter(fileOut);
for (Verification verification : result.getVerifications()) { for (Verification verification : result.getVerifications()) {

View file

@ -11,6 +11,8 @@ import sop.exception.SOPGPException;
import sop.operation.RevokeKey; import sop.operation.RevokeKey;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@CommandLine.Command(name = "revoke-key", @CommandLine.Command(name = "revoke-key",
resourceBundle = "msg_revoke-key", resourceBundle = "msg_revoke-key",
@ -23,7 +25,7 @@ public class RevokeKeyCmd extends AbstractSopCmd {
@CommandLine.Option(names = "--with-key-password", @CommandLine.Option(names = "--with-key-password",
paramLabel = "PASSWORD") paramLabel = "PASSWORD")
String withKeyPassword; List<String> withKeyPassword = new ArrayList<>();
@Override @Override
public void run() { public void run() {
@ -36,8 +38,10 @@ public class RevokeKeyCmd extends AbstractSopCmd {
if (withKeyPassword != null) { if (withKeyPassword != null) {
try { try {
String password = stringFromInputStream(getInput(withKeyPassword)); for (String passwordFile : withKeyPassword) {
revokeKey.withKeyPassword(password); String password = stringFromInputStream(getInput(passwordFile));
revokeKey.withKeyPassword(password);
}
} catch (SOPGPException.UnsupportedOption e) { } catch (SOPGPException.UnsupportedOption e) {
String errorMsg = getMsg("sop.error.feature_support.option_not_supported", "--with-key-password"); String errorMsg = getMsg("sop.error.feature_support.option_not_supported", "--with-key-password");
throw new SOPGPException.UnsupportedOption(errorMsg, e); throw new SOPGPException.UnsupportedOption(errorMsg, e);

View file

@ -21,6 +21,7 @@ import sop.operation.Decrypt;
import sop.util.HexUtil; import sop.util.HexUtil;
import sop.util.UTCUtil; import sop.util.UTCUtil;
import javax.annotation.Nonnull;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
@ -247,15 +248,17 @@ public class DecryptCmdTest {
} }
@Test @Test
@ExpectSystemExitWithStatus(SOPGPException.NoSignature.EXIT_CODE) public void assertNoVerificationsIsOkay() throws SOPGPException.CannotDecrypt, SOPGPException.MissingArg, SOPGPException.BadData, IOException {
public void assertNoSignatureExceptionCausesExit3() throws SOPGPException.CannotDecrypt, SOPGPException.MissingArg, SOPGPException.BadData, IOException { File tempFile = File.createTempFile("verify-with-", ".tmp");
File verifyOut = new File(tempFile.getParent(), "verifications.out");
verifyOut.deleteOnExit();
when(decrypt.ciphertext((InputStream) any())).thenReturn(new ReadyWithResult<DecryptionResult>() { when(decrypt.ciphertext((InputStream) any())).thenReturn(new ReadyWithResult<DecryptionResult>() {
@Override @Override
public DecryptionResult writeTo(OutputStream outputStream) throws SOPGPException.NoSignature { public DecryptionResult writeTo(@Nonnull OutputStream outputStream) throws SOPGPException.NoSignature {
throw new SOPGPException.NoSignature(); return new DecryptionResult(null, Collections.emptyList());
} }
}); });
SopCLI.main(new String[] {"decrypt"}); SopCLI.main(new String[] {"decrypt", "--verify-with", tempFile.getAbsolutePath(), "--verifications-out", verifyOut.getAbsolutePath()});
} }
@Test @Test

View file

@ -4,8 +4,8 @@
allprojects { allprojects {
ext { ext {
shortVersion = '7.0.1' shortVersion = '7.0.2'
isSnapshot = true isSnapshot = false
minAndroidSdk = 10 minAndroidSdk = 10
javaSourceCompatibility = 1.8 javaSourceCompatibility = 1.8
gsonVersion = '2.10.1' gsonVersion = '2.10.1'