[ 
https://issues.apache.org/jira/browse/MRESOLVER-301?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17819752#comment-17819752
 ] 

ASF GitHub Bot commented on MRESOLVER-301:
------------------------------------------

gnodet commented on code in PR #432:
URL: https://github.com/apache/maven-resolver/pull/432#discussion_r1499592777


##########
maven-resolver-generator-signer/src/main/java/org/eclipse/aether/generator/signer/SignerArtifactGenerator.java:
##########
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.eclipse.aether.generator.signer;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.spi.artifact.generator.ArtifactGenerator;
+
+import static java.util.Objects.requireNonNull;
+
+final class SignerArtifactGenerator implements ArtifactGenerator {

Review Comment:
   Why not `public` instead of `final` with a public constructor and protected 
fields ?  Why would not people be allowed to extend it ?
   



##########
maven-resolver-generator-signer/src/main/java/org/eclipse/aether/generator/signer/gpg/GpgSigner.java:
##########
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.eclipse.aether.generator.signer.gpg;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.bcpg.BCPGOutputStream;
+import org.bouncycastle.bcpg.HashAlgorithmTags;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPPrivateKey;
+import org.bouncycastle.openpgp.PGPSecretKey;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.bouncycastle.openpgp.PGPSignatureGenerator;
+import org.bouncycastle.openpgp.PGPSignatureSubpacketVector;
+import org.bouncycastle.openpgp.operator.bc.BcPGPContentSignerBuilder;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.generator.signer.Signer;
+import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
+import org.eclipse.aether.util.artifact.SubArtifact;
+
+/**
+ * GnuPG {@link Signer} implementation that is kept and reused across session.
+ */
+@SuppressWarnings("checkstyle:magicnumber")
+public final class GpgSigner implements Signer {
+    private static final String ARTIFACT_EXTENSION = "asc";
+    private final RepositoryLayout repositoryLayout;
+    private final PGPSecretKey secretKey;
+    private final PGPPrivateKey privateKey;
+    private final PGPSignatureSubpacketVector hashSubPackets;
+    private final ArrayList<Path> signatureTempFiles;
+
+    public GpgSigner(
+            RepositoryLayout repositoryLayout,
+            PGPSecretKey secretKey,
+            PGPPrivateKey privateKey,
+            PGPSignatureSubpacketVector hashSubPackets) {
+        this.repositoryLayout = repositoryLayout;
+        this.secretKey = secretKey;
+        this.privateKey = privateKey;
+        this.hashSubPackets = hashSubPackets;
+        this.signatureTempFiles = new ArrayList<>();
+    }
+
+    @Override
+    public String signerId() {
+        return GpgConfigurationKeys.NAME;
+    }
+
+    @Override
+    public Collection<Artifact> sign(Collection<Artifact> artifacts) throws 
IOException {
+        // back out if PGP signatures found among artifacts
+        if (artifacts.stream().anyMatch(a -> a.getExtension().endsWith("." + 
ARTIFACT_EXTENSION))) {
+            return Collections.emptyList();
+        }
+
+        // sign relevant artifacts
+        ArrayList<Artifact> result = new ArrayList<>();
+        for (Artifact artifact : artifacts) {
+            if (!repositoryLayout.hasChecksums(artifact)) {
+                continue;
+            }
+
+            Path signatureTempFile = Files.createTempFile("signer-pgp", "tmp");
+            signatureTempFiles.add(signatureTempFile);
+            try (InputStream artifactContent = 
Files.newInputStream(artifact.getPath());
+                    OutputStream signatureContent = 
Files.newOutputStream(signatureTempFile)) {
+                sign(artifactContent, signatureContent);
+            }
+            result.add(new SubArtifact(
+                    artifact, null, artifact.getExtension() + "." + 
ARTIFACT_EXTENSION, signatureTempFile.toFile()));
+        }
+        return result;
+    }
+
+    /**
+     * Clean up all temp files when install/deploy request is processed, files 
are copied/uploaded to their
+     * final place.
+     */
+    public void close() {
+        signatureTempFiles.forEach(p -> {
+            try {
+                Files.deleteIfExists(p);
+            } catch (IOException e) {
+                p.toFile().deleteOnExit();
+            }
+        });
+    }
+
+    private void sign(InputStream content, OutputStream signature) throws 
IOException {

Review Comment:
   `protected` ?



##########
maven-resolver-generator-signer/src/main/java/org/eclipse/aether/generator/signer/gpg/GpgEnvPasswordLoader.java:
##########
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.eclipse.aether.generator.signer.gpg;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.util.ConfigUtils;
+import org.eclipse.sisu.Priority;
+
+@Singleton
+@Named(GpgEnvPasswordLoader.NAME)
+@Priority(50)
+@SuppressWarnings("checkstyle:magicnumber")
+public final class GpgEnvPasswordLoader implements 
GpgSignerFactory.KeyPasswordLoader {

Review Comment:
   Is the `final` keyword needed ?



##########
maven-resolver-generator-signer/src/main/java/org/eclipse/aether/generator/signer/gpg/GpgSigner.java:
##########
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.eclipse.aether.generator.signer.gpg;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.bcpg.BCPGOutputStream;
+import org.bouncycastle.bcpg.HashAlgorithmTags;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPPrivateKey;
+import org.bouncycastle.openpgp.PGPSecretKey;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.bouncycastle.openpgp.PGPSignatureGenerator;
+import org.bouncycastle.openpgp.PGPSignatureSubpacketVector;
+import org.bouncycastle.openpgp.operator.bc.BcPGPContentSignerBuilder;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.generator.signer.Signer;
+import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
+import org.eclipse.aether.util.artifact.SubArtifact;
+
+/**
+ * GnuPG {@link Signer} implementation that is kept and reused across session.
+ */
+@SuppressWarnings("checkstyle:magicnumber")
+public final class GpgSigner implements Signer {

Review Comment:
   Same...



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java:
##########
@@ -151,7 +162,23 @@ private DeployResult deploy(SyncContext syncContext, 
RepositorySystemSession ses
             throw new DeploymentException("Failed to deploy 
artifacts/metadata: " + e.getMessage(), e);
         }
 
+        final List<Artifact> artifacts = new 
ArrayList<>(request.getArtifacts());

Review Comment:
   I don't see how `final` is useful.  The static analysis very well knows if a 
variable is final or not.



##########
maven-resolver-generator-signer/src/main/java/org/eclipse/aether/generator/signer/gpg/GpgFileRingMaterialLoader.java:
##########
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.eclipse.aether.generator.signer.gpg;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.util.ConfigUtils;
+import org.eclipse.sisu.Priority;
+
+@Singleton
+@Named(GpgFileRingMaterialLoader.NAME)
+@Priority(10)
+public final class GpgFileRingMaterialLoader implements 
GpgSignerFactory.KeyRingMaterialLoader {

Review Comment:
   Same here



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java:
##########
@@ -95,53 +106,96 @@ private InstallResult install(SyncContext syncContext, 
RepositorySystemSession s
 
         RequestTrace trace = RequestTrace.newChild(request.getTrace(), 
request);
 
-        List<? extends MetadataGenerator> generators = 
getMetadataGenerators(session, request);
+        final List<Artifact> artifacts = new 
ArrayList<>(request.getArtifacts());

Review Comment:
   Once again ?





> Artifact Generators
> -------------------
>
>                 Key: MRESOLVER-301
>                 URL: https://issues.apache.org/jira/browse/MRESOLVER-301
>             Project: Maven Resolver
>          Issue Type: New Feature
>          Components: Resolver
>            Reporter: Tamas Cservenak
>            Assignee: Tamas Cservenak
>            Priority: Major
>             Fix For: 2.0.0, 2.0.0-alpha-9
>
>
> Resolver should provide extension point for "generators". Typical use case 
> for these are for example "signing" of artifacts.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to