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

dlych pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit 95662c4bce6719f7a9156e21ab17bccd11c55e68
Author: Ian Maxon <[email protected]>
AuthorDate: Sat Apr 10 13:18:05 2021 -0700

    [NO ISSUE] Restrict UDF modification
    
    Change-Id: I2cc23138793ae562cfa42c841b3bc4202391d9a1
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/11003
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Ian Maxon <[email protected]>
    Reviewed-by: Till Westmann <[email protected]>
---
 .../asterix/api/http/server/NCUdfApiServlet.java   | 33 ++++++++++++++++++++--
 .../apache/asterix/test/common/TestExecutor.java   | 17 +++++++++++
 2 files changed, 47 insertions(+), 3 deletions(-)

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCUdfApiServlet.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCUdfApiServlet.java
index fec0b38..9efb6f8 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCUdfApiServlet.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCUdfApiServlet.java
@@ -20,13 +20,13 @@ package org.apache.asterix.api.http.server;
 
 import static 
org.apache.asterix.api.http.server.ServletConstants.SYS_AUTH_HEADER;
 import static org.apache.asterix.common.library.LibraryDescriptor.FIELD_HASH;
-import static org.apache.hyracks.api.exceptions.IFormattedException.getError;
 
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintWriter;
+import java.net.InetAddress;
 import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -295,14 +295,41 @@ public class NCUdfApiServlet extends AbstractNCUdfServlet 
{
         responseWriter.flush();
     }
 
+    protected boolean isRequestPermittedForWrite(IServletRequest request, 
IServletResponse response) {
+        if (!isRequestOnLoopback(request)) {
+            rejectForbidden(response);
+            return false;
+        }
+        return true;
+    }
+
+    protected boolean isRequestOnLoopback(IServletRequest request) {
+        if (request.getLocalAddress() != null && request.getRemoteAddress() != 
null) {
+            InetAddress local = request.getLocalAddress().getAddress();
+            InetAddress remote = request.getRemoteAddress().getAddress();
+            return remote.isLoopbackAddress() && local.isLoopbackAddress();
+        } else {
+            return false;
+        }
+    }
+
+    protected static void rejectForbidden(IServletResponse response) {
+        response.setStatus(HttpResponseStatus.FORBIDDEN);
+        response.writer().write("{ \"error\": \"Forbidden\" }");
+    }
+
     @Override
     protected void post(IServletRequest request, IServletResponse response) {
-        handleModification(request, response, LibraryOperation.UPSERT);
+        if (isRequestPermittedForWrite(request, response)) {
+            handleModification(request, response, LibraryOperation.UPSERT);
+        }
     }
 
     @Override
     protected void delete(IServletRequest request, IServletResponse response) {
-        handleModification(request, response, LibraryOperation.DELETE);
+        if (isRequestPermittedForWrite(request, response)) {
+            handleModification(request, response, LibraryOperation.DELETE);
+        }
     }
 
 }
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index f347b77..28b7fb3 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -2471,6 +2471,23 @@ public class TestExecutor {
                         + cUnit.getName() + "_qbc.adm");
     }
 
+    protected URI createLocalOnlyEndpointURI(String pathAndQuery) throws 
URISyntaxException {
+        InetSocketAddress endpoint;
+        if (!ncEndPointsList.isEmpty() && 
(pathAndQuery.equals(Servlets.QUERY_SERVICE)
+                || 
pathAndQuery.startsWith(Servlets.getAbsolutePath(Servlets.UDF)))) {
+            int endpointIdx = Math.abs(endpointSelector++ % 
ncEndPointsList.size());
+            endpoint = ncEndPointsList.get(endpointIdx);
+        } else if (isCcEndPointPath(pathAndQuery)) {
+            int endpointIdx = Math.abs(endpointSelector++ % endpoints.size());
+            endpoint = endpoints.get(endpointIdx);
+        } else {
+            throw new IllegalArgumentException("Invalid local endpoint 
format");
+        }
+        URI uri = URI.create("http://"; + toHostPort("localhost", 
endpoint.getPort()) + pathAndQuery);
+        LOGGER.debug("Created endpoint URI: " + uri);
+        return uri;
+    }
+
     protected URI createEndpointURI(String pathAndQuery) throws 
URISyntaxException {
         InetSocketAddress endpoint;
         if (!ncEndPointsList.isEmpty() && 
(pathAndQuery.equals(Servlets.QUERY_SERVICE)

Reply via email to