You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2026/07/29 17:25:23 UTC

(maven) 01/01: Fix #12583: Inverted file existence check in DefaultTransport.put()

This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch backport/12612-to-maven-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 1616d40bb544f9f89709acadc12d24c713c6be66
Author: Elliotte Rusty Harold <el...@users.noreply.github.com>
AuthorDate: Wed Jul 29 16:45:47 2026 +0000

    Fix #12583: Inverted file existence check in DefaultTransport.put()
    
    The condition Files.isRegularFile(source) in DefaultTransport.put() was
    inverted — it threw when the file existed and silently accepted non-existent
    files, breaking putBytes() and putString() transitively. Added the missing
    negation and a new DefaultTransportTest covering non-existent file rejection,
    valid file acceptance, and the putBytes() delegation chain.
    
    Closes #12612
---
 .../org/apache/maven/impl/DefaultTransport.java    |  2 +-
 .../apache/maven/impl/DefaultTransportTest.java    | 65 ++++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultTransport.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultTransport.java
index f93e5f8d5d..68490fa40c 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultTransport.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultTransport.java
@@ -98,7 +98,7 @@ public Optional<String> getString(URI relativeSource, Charset charset) {
     public void put(Path source, URI relativeTarget) {
         requireNonNull(source, "source is null");
         requireNonNull(relativeTarget, "relativeTarget is null");
-        if (Files.isRegularFile(source)) {
+        if (!Files.isRegularFile(source)) {
             throw new IllegalArgumentException("source file does not exist or is not a file");
         }
         if (relativeTarget.isAbsolute()) {
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultTransportTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultTransportTest.java
new file mode 100644
index 0000000000..1e96072a79
--- /dev/null
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultTransportTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.apache.maven.impl;
+
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.aether.spi.connector.transport.PutTask;
+import org.eclipse.aether.spi.connector.transport.Transporter;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+class DefaultTransportTest {
+
+    @Test
+    void testPutWithNonExistentFileThrows(@TempDir Path tempDir) {
+        Transporter transporter = mock(Transporter.class);
+        DefaultTransport transport = new DefaultTransport(URI.create("http://example.com/test/"), transporter);
+        Path nonExistentFile = tempDir.resolve("missing.txt");
+        assertThrows(IllegalArgumentException.class, () -> transport.put(nonExistentFile, URI.create("dest.txt")));
+    }
+
+    @Test
+    void testPutWithExistingFileSucceeds(@TempDir Path tempDir) throws Exception {
+        Path sourceFile = tempDir.resolve("source.txt");
+        Files.writeString(sourceFile, "test content");
+
+        Transporter transporter = mock(Transporter.class);
+        DefaultTransport transport = new DefaultTransport(URI.create("http://example.com/test/"), transporter);
+        URI dest = URI.create("dest.txt");
+        transport.put(sourceFile, dest);
+        verify(transporter).put(any(PutTask.class));
+    }
+
+    @Test
+    void testPutBytesSucceeds() throws Exception {
+        Transporter transporter = mock(Transporter.class);
+        DefaultTransport transport = new DefaultTransport(URI.create("http://example.com/test/"), transporter);
+        URI dest = URI.create("dest.txt");
+        transport.putBytes("test content".getBytes(), dest);
+        verify(transporter).put(any(PutTask.class));
+    }
+}