diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java index 935fc1cfba..5ffbf3aad7 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java @@ -101,7 +101,7 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl public void reset() { this.setBranchToMerge(null); this.setTargetBranch(null); - this.setSign(false); + this.setSign(true); } @Override diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/ModifyCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/ModifyCommandRequest.java index a13ee52b31..e82df8c15a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/ModifyCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/ModifyCommandRequest.java @@ -58,7 +58,7 @@ public class ModifyCommandRequest implements Resetable, Validateable, CommandWit commitMessage = null; branch = null; defaultPath = false; - sign = false; + sign = true; } public void addRequest(PartialRequest request) { diff --git a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap index aeb29fe8a0..cfed07e60d 100644 --- a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap +++ b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap @@ -1716,7 +1716,7 @@ exports[`Storyshots CardColumnSmall Minimal 1`] = ` exports[`Storyshots Changesets Co-Authors with avatar 1`] = `
{ @@ -49,7 +49,7 @@ const withAvatarFactory = (factory: (person: Person) => string, changeset: Chang binder.bind("avatar.factory", factory); return ( - + ); }; @@ -62,22 +62,22 @@ const withReplacements = ( replacements.forEach(replacement => binder.bind("changeset.description.tokens", replacement)); return ( - + ); }; function copy(input: T): T { return JSON.parse(JSON.stringify(input)); -}; +} storiesOf("Changesets", module) .addDecorator(story => {story()}) .addDecorator(storyFn => {storyFn()}) - .add("Default", () => ) - .add("With Committer", () => ) - .add("With Committer and Co-Author", () => ) - .add("With multiple Co-Authors", () => ) + .add("Default", () => ) + .add("With Committer", () => ) + .add("With Committer and Co-Author", () => ) + .add("With multiple Co-Authors", () => ) .add("With avatar", () => { return withAvatarFactory(() => hitchhiker, three); }) @@ -92,8 +92,8 @@ storiesOf("Changesets", module) const mail = Arthur; return withReplacements( [ - () => [{ textToReplace: "HOG-42", replacement: link }], - () => [{ textToReplace: "arthur@guide.galaxy", replacement: mail }] + () => [{textToReplace: "HOG-42", replacement: link}], + () => [{textToReplace: "arthur@guide.galaxy", replacement: mail}] ], five ); @@ -105,7 +105,7 @@ storiesOf("Changesets", module) type: "gpg", status: "NOT_FOUND" }]; - return ; + return ; }) .add("With valid signature", () => { const changeset = copy(three); @@ -119,7 +119,7 @@ storiesOf("Changesets", module) mail: "trillian@hitchhiker.com" }] }]; - return ; + return ; }) .add("With unowned signature", () => { const changeset = copy(three); @@ -132,7 +132,7 @@ storiesOf("Changesets", module) mail: "trillian@hitchhiker.com" }] }]; - return ; + return ; }) .add("With contactless signature", () => { const changeset = copy(three); @@ -142,7 +142,7 @@ storiesOf("Changesets", module) status: "VERIFIED", owner: "trillian" }]; - return ; + return ; }) .add("With invalid signature", () => { const changeset = copy(three); @@ -156,7 +156,7 @@ storiesOf("Changesets", module) mail: "trillian@hitchhiker.com" }] }]; - return ; + return ; }) .add("With multiple signatures and invalid status", () => { const changeset = copy(three); @@ -188,7 +188,7 @@ storiesOf("Changesets", module) mail: "trillian@hitchhiker.com" }] }]; - return ; + return ; }) .add("With multiple signatures and valid status", () => { const changeset = copy(three); @@ -220,7 +220,7 @@ storiesOf("Changesets", module) mail: "trillian@hitchhiker.com" }] }]; - return ; + return ; }) .add("With multiple signatures and not found status", () => { const changeset = copy(three); @@ -243,5 +243,5 @@ storiesOf("Changesets", module) mail: "trillian@hitchhiker.com" }] }]; - return ; + return ; }); diff --git a/scm-ui/ui-components/src/repos/changesets/SignatureIcon.tsx b/scm-ui/ui-components/src/repos/changesets/SignatureIcon.tsx index 5c096fc9a6..937e19bace 100644 --- a/scm-ui/ui-components/src/repos/changesets/SignatureIcon.tsx +++ b/scm-ui/ui-components/src/repos/changesets/SignatureIcon.tsx @@ -57,12 +57,12 @@ const SignatureIcon: FC = ({signatures, className}) => { return null; } - const getColor = (signatures: Signature[]) => { - const invalid = signatures.some(sig => sig.status === "INVALID"); + const getColor = (signaturesToVerify: Signature[]) => { + const invalid = signaturesToVerify.some(sig => sig.status === "INVALID"); if (invalid) { return "danger"; } - const verified = signatures.some(sig => sig.status === "VERIFIED"); + const verified = signaturesToVerify.some(sig => sig.status === "VERIFIED"); if (verified) { return "success"; } @@ -104,7 +104,7 @@ const SignatureIcon: FC = ({signatures, className}) => { return ( <> - {t("changeset.signatures")}} width={500} {...popoverProps}> + {t("changeset.signatures")}} width={500} {...popoverProps}> {signatureElements} diff --git a/scm-webapp/src/main/java/sonia/scm/security/gpg/DefaultGPG.java b/scm-webapp/src/main/java/sonia/scm/security/gpg/DefaultGPG.java index e470636c4a..9799eac57e 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/gpg/DefaultGPG.java +++ b/scm-webapp/src/main/java/sonia/scm/security/gpg/DefaultGPG.java @@ -77,7 +77,7 @@ public class DefaultGPG implements GPG { public Optional findPublicKey(String id) { Optional key = publicKeyStore.findById(id); - return key.map(rawGpgKey -> new DefaultPublicKey(rawGpgKey.getId(), rawGpgKey.getOwner(), rawGpgKey.getRaw(), rawGpgKey.getContacts())); + return key.map(RawGpgKeyToDefaultPublicKeyMapper::map); } @Override @@ -109,12 +109,12 @@ public class DefaultGPG implements GPG { privateKeyStore.setForUserId(userId, rawPrivateKey); publicKeyStore.add("Default SCM-Manager Signing Key", userId, rawPublicKey, true); - return new DefaultPrivateKey(rawPrivateKey); + return DefaultPrivateKey.parseRaw(rawPrivateKey); } catch (PGPException | NoSuchAlgorithmException | NoSuchProviderException | IOException e) { throw new GPGException("Private key could not be generated", e); } } else { - return new DefaultPrivateKey(privateRawKey.get()); + return DefaultPrivateKey.parseRaw(privateRawKey.get()); } } diff --git a/scm-webapp/src/main/java/sonia/scm/security/gpg/DefaultPrivateKey.java b/scm-webapp/src/main/java/sonia/scm/security/gpg/DefaultPrivateKey.java index bee5df16f3..f925dee108 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/gpg/DefaultPrivateKey.java +++ b/scm-webapp/src/main/java/sonia/scm/security/gpg/DefaultPrivateKey.java @@ -37,22 +37,26 @@ import org.bouncycastle.openpgp.PGPSignatureGenerator; import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder; import sonia.scm.security.PrivateKey; +import javax.validation.constraints.NotNull; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Optional; class DefaultPrivateKey implements PrivateKey { - final Optional privateKey; + static DefaultPrivateKey parseRaw(String rawPrivateKey) { + return new DefaultPrivateKey(KeysExtractor.extractPrivateKey(rawPrivateKey)); + } - DefaultPrivateKey(String rawPrivateKey) { - privateKey = KeysExtractor.extractPrivateKey(rawPrivateKey); + private final PGPPrivateKey privateKey; + + private DefaultPrivateKey(@NotNull PGPPrivateKey privateKey) { + this.privateKey = privateKey; } @Override public String getId() { - return privateKey.map(Keys::createId).orElse(null); + return Keys.createId(privateKey); } @Override @@ -64,14 +68,10 @@ class DefaultPrivateKey implements PrivateKey { HashAlgorithmTags.SHA1).setProvider(BouncyCastleProvider.PROVIDER_NAME) ); - if (privateKey.isPresent()) { - try { - signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, privateKey.get()); - } catch (PGPException e) { - throw new GPGException("Could not initialize signature generator", e); - } - } else { - throw new GPGException("Missing private key"); + try { + signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, privateKey); + } catch (PGPException e) { + throw new GPGException("Could not initialize signature generator", e); } ByteArrayOutputStream buffer = new ByteArrayOutputStream(); diff --git a/scm-webapp/src/main/java/sonia/scm/security/gpg/GPGKeyPairGenerator.java b/scm-webapp/src/main/java/sonia/scm/security/gpg/GPGKeyPairGenerator.java index 575c12a96e..9532ca3fae 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/gpg/GPGKeyPairGenerator.java +++ b/scm-webapp/src/main/java/sonia/scm/security/gpg/GPGKeyPairGenerator.java @@ -45,7 +45,9 @@ import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.util.Date; -class GPGKeyPairGenerator { +final class GPGKeyPairGenerator { + private GPGKeyPairGenerator() {} + static PGPKeyRingGenerator generateKeyPair() throws PGPException, NoSuchProviderException, NoSuchAlgorithmException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); keyPairGenerator.initialize(2048); diff --git a/scm-webapp/src/main/java/sonia/scm/security/gpg/KeysExtractor.java b/scm-webapp/src/main/java/sonia/scm/security/gpg/KeysExtractor.java index 0b3c502f79..aee1aa371e 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/gpg/KeysExtractor.java +++ b/scm-webapp/src/main/java/sonia/scm/security/gpg/KeysExtractor.java @@ -33,41 +33,31 @@ import org.bouncycastle.openpgp.PGPUtil; import org.bouncycastle.openpgp.jcajce.JcaPGPSecretKeyRingCollection; import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator; import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Optional; -public class KeysExtractor { +final class KeysExtractor { private KeysExtractor() {} - private static final Logger LOG = LoggerFactory.getLogger(KeysExtractor.class); - - static Optional extractPrivateKey(String rawKey) { + static PGPPrivateKey extractPrivateKey(String rawKey) { try (final InputStream decoderStream = PGPUtil.getDecoderStream(new ByteArrayInputStream(rawKey.getBytes()))) { JcaPGPSecretKeyRingCollection secretKeyRingCollection = new JcaPGPSecretKeyRingCollection(decoderStream); - final PGPPrivateKey privateKey = secretKeyRingCollection.getKeyRings().next().getSecretKey().extractPrivateKey(new JcePBESecretKeyDecryptorBuilder().build(new char[]{})); - return Optional.of(privateKey); + return secretKeyRingCollection.getKeyRings().next().getSecretKey().extractPrivateKey(new JcePBESecretKeyDecryptorBuilder().build(new char[]{})); } catch (Exception e) { - LOG.error("Invalid PGP key", e); - return Optional.empty(); + throw new GPGException("Invalid PGP key", e); } } - static Optional extractPublicKey(String rawKey) { + static PGPPublicKey extractPublicKey(String rawKey) { try { ArmoredInputStream armoredInputStream = new ArmoredInputStream(new ByteArrayInputStream(rawKey.getBytes())); PGPObjectFactory pgpObjectFactory = new PGPObjectFactory(armoredInputStream, new JcaKeyFingerprintCalculator()); - PGPPublicKey publicKey = ((PGPPublicKeyRing) pgpObjectFactory.nextObject()).getPublicKey(); - return Optional.of(publicKey); - + return ((PGPPublicKeyRing) pgpObjectFactory.nextObject()).getPublicKey(); } catch (IOException e) { - LOG.error("Invalid PGP key", e); + throw new GPGException("Invalid PGP key", e); } - return Optional.empty(); } } diff --git a/scm-webapp/src/main/java/sonia/scm/security/gpg/PublicKeyStore.java b/scm-webapp/src/main/java/sonia/scm/security/gpg/PublicKeyStore.java index 1099a9de76..d271f41769 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/gpg/PublicKeyStore.java +++ b/scm-webapp/src/main/java/sonia/scm/security/gpg/PublicKeyStore.java @@ -84,7 +84,7 @@ public class PublicKeyStore { RawGpgKey key = new RawGpgKey(master, displayName, username, rawKey, getContactsFromPublicKey(rawKey), Instant.now(), readonly); store.put(master, key); - eventBus.post(new PublicKeyCreatedEvent(new DefaultPublicKey(key.getId(), key.getOwner(), key.getRaw(), key.getContacts()))); + eventBus.post(new PublicKeyCreatedEvent(RawGpgKeyToDefaultPublicKeyMapper.map(key))); return key; @@ -92,8 +92,8 @@ public class PublicKeyStore { private Set getContactsFromPublicKey(String rawKey) { List userIds = new ArrayList<>(); - Optional publicKeyFromRawKey = extractPublicKey(rawKey); - publicKeyFromRawKey.ifPresent(pgpPublicKey -> pgpPublicKey.getUserIDs().forEachRemaining(userIds::add)); + PGPPublicKey publicKeyFromRawKey = extractPublicKey(rawKey); + publicKeyFromRawKey.getUserIDs().forEachRemaining(userIds::add); return userIds.stream().map(Person::toPerson).collect(Collectors.toSet()); } @@ -104,7 +104,7 @@ public class PublicKeyStore { if (!rawGpgKey.isReadonly()) { UserPermissions.changePublicKeys(rawGpgKey.getOwner()).check(); store.remove(id); - eventBus.post(new PublicKeyDeletedEvent(new DefaultPublicKey(rawGpgKey.getId(), rawGpgKey.getOwner(), rawGpgKey.getRaw(), rawGpgKey.getContacts()))); + eventBus.post(new PublicKeyDeletedEvent(RawGpgKeyToDefaultPublicKeyMapper.map(rawGpgKey))); } else { throw new DeletingReadonlyKeyNotAllowedException(id); } diff --git a/scm-webapp/src/main/java/sonia/scm/security/gpg/RawGpgKey.java b/scm-webapp/src/main/java/sonia/scm/security/gpg/RawGpgKey.java index 9b724320fa..1e02222310 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/gpg/RawGpgKey.java +++ b/scm-webapp/src/main/java/sonia/scm/security/gpg/RawGpgKey.java @@ -27,7 +27,6 @@ package sonia.scm.security.gpg; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import sonia.scm.repository.Person; import sonia.scm.xml.XmlInstantAdapter; diff --git a/scm-webapp/src/main/java/sonia/scm/security/gpg/RawGpgKeyToDefaultPublicKeyMapper.java b/scm-webapp/src/main/java/sonia/scm/security/gpg/RawGpgKeyToDefaultPublicKeyMapper.java new file mode 100644 index 0000000000..7b07092857 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/security/gpg/RawGpgKeyToDefaultPublicKeyMapper.java @@ -0,0 +1,37 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.security.gpg; + +import sonia.scm.security.PublicKey; + +final class RawGpgKeyToDefaultPublicKeyMapper { + + private RawGpgKeyToDefaultPublicKeyMapper() {} + + static PublicKey map(RawGpgKey key) { + return new DefaultPublicKey(key.getId(), key.getOwner(), key.getRaw(), key.getContacts()); + } + +} diff --git a/scm-webapp/src/test/java/sonia/scm/security/gpg/DefaultGPGTest.java b/scm-webapp/src/test/java/sonia/scm/security/gpg/DefaultGPGTest.java index e44d62af2a..c8817a4d81 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/gpg/DefaultGPGTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/gpg/DefaultGPGTest.java @@ -144,8 +144,8 @@ class DefaultGPGTest { void shouldImportExportedGeneratedPrivateKey() throws NoSuchProviderException, NoSuchAlgorithmException, PGPException, IOException { final PGPKeyRingGenerator keyRingGenerator = GPGKeyPairGenerator.generateKeyPair(); final String exportedPrivateKey = GPGKeyExporter.exportKeyRing(keyRingGenerator.generateSecretKeyRing()); - final Optional privateKey = KeysExtractor.extractPrivateKey(exportedPrivateKey); - assertThat(privateKey).isPresent(); + final PGPPrivateKey privateKey = KeysExtractor.extractPrivateKey(exportedPrivateKey); + assertThat(privateKey).isNotNull(); } @Test @@ -155,12 +155,13 @@ class DefaultGPGTest { ThreadContext.bind(subjectUnderTest); String raw = GPGTestHelper.readResourceAsString("private-key.asc"); - final DefaultPrivateKey privateKey = new DefaultPrivateKey(raw); + final DefaultPrivateKey privateKey = DefaultPrivateKey.parseRaw(raw); final byte[] signature = privateKey.sign("This is a test commit".getBytes()); final String signatureString = new String(signature); assertThat(signature).isNotEmpty(); - assertThat(signatureString).startsWith("-----BEGIN PGP SIGNATURE-----"); - assertThat(signatureString).contains("-----END PGP SIGNATURE-----"); + assertThat(signatureString) + .startsWith("-----BEGIN PGP SIGNATURE-----") + .contains("-----END PGP SIGNATURE-----"); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/security/gpg/GPGKeyExporterTest.java b/scm-webapp/src/test/java/sonia/scm/security/gpg/GPGKeyExporterTest.java index f53c45d10c..dccf40bd07 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/gpg/GPGKeyExporterTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/gpg/GPGKeyExporterTest.java @@ -70,14 +70,16 @@ class GPGKeyExporterTest { final PGPKeyRingGenerator keyRingGenerator = GPGKeyPairGenerator.generateKeyPair(); final String exportedPublicKey = GPGKeyExporter.exportKeyRing(keyRingGenerator.generatePublicKeyRing()); - assertThat(exportedPublicKey).isNotBlank(); - assertThat(exportedPublicKey).startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----"); - assertThat(exportedPublicKey).contains("-----END PGP PUBLIC KEY BLOCK-----"); + assertThat(exportedPublicKey) + .isNotBlank() + .startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----") + .contains("-----END PGP PUBLIC KEY BLOCK-----"); final String exportedPrivateKey = GPGKeyExporter.exportKeyRing(keyRingGenerator.generateSecretKeyRing()); - assertThat(exportedPrivateKey).isNotBlank(); - assertThat(exportedPrivateKey).startsWith("-----BEGIN PGP PRIVATE KEY BLOCK-----"); - assertThat(exportedPrivateKey).contains("-----END PGP PRIVATE KEY BLOCK-----"); + assertThat(exportedPrivateKey) + .isNotBlank() + .startsWith("-----BEGIN PGP PRIVATE KEY BLOCK-----") + .contains("-----END PGP PRIVATE KEY BLOCK-----"); } } diff --git a/scm-webapp/src/test/java/sonia/scm/security/gpg/KeysExtractorTest.java b/scm-webapp/src/test/java/sonia/scm/security/gpg/KeysExtractorTest.java index 9bf5f4a4de..dcd38a9b88 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/gpg/KeysExtractorTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/gpg/KeysExtractorTest.java @@ -29,7 +29,6 @@ import org.bouncycastle.openpgp.PGPPublicKey; import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; @@ -39,17 +38,17 @@ class KeysExtractorTest { void shouldExtractPublicKeyFromRawKey() throws IOException { String raw = GPGTestHelper.readResourceAsString("single.asc"); - Optional publicKey = KeysExtractor.extractPublicKey(raw); + PGPPublicKey publicKey = KeysExtractor.extractPublicKey(raw); - assertThat(publicKey).isPresent(); - assertThat(Long.toHexString(publicKey.get().getKeyID())).isEqualTo("975922f193b07d6e"); + assertThat(publicKey).isNotNull(); + assertThat(Long.toHexString(publicKey.getKeyID())).isEqualTo("975922f193b07d6e"); } @Test void shouldExtractPrivateKeyFromRawKey() throws IOException { String raw = GPGTestHelper.readResourceAsString("private-key.asc"); - final Optional privateKey = KeysExtractor.extractPrivateKey(raw); - assertThat(privateKey).isPresent(); + final PGPPrivateKey privateKey = KeysExtractor.extractPrivateKey(raw); + assertThat(privateKey).isNotNull(); } } diff --git a/scm-webapp/src/test/java/sonia/scm/security/gpg/PrivateKeyStoreTest.java b/scm-webapp/src/test/java/sonia/scm/security/gpg/PrivateKeyStoreTest.java index e4a42abe8f..d9744024e1 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/gpg/PrivateKeyStoreTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/gpg/PrivateKeyStoreTest.java @@ -24,11 +24,9 @@ package sonia.scm.security.gpg; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.store.DataStoreFactory; import sonia.scm.store.InMemoryDataStoreFactory; @@ -36,7 +34,6 @@ import sonia.scm.store.InMemoryDataStoreFactory; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; @ExtendWith(MockitoExtension.class) class PrivateKeyStoreTest { @@ -61,7 +58,6 @@ class PrivateKeyStoreTest { void setForUserId() { keyStore.setForUserId("testId", "Test Key"); final Optional rawKey = keyStore.getForUserId("testId"); - assertThat(rawKey).isNotEmpty(); - assertThat(rawKey.get()).isEqualTo("Test Key"); + assertThat(rawKey).contains("Test Key"); } }