You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2020/07/09 09:21:09 UTC

[jackrabbit-filevault] branch master updated: JCRVLT-449 allow to set source credentials via servlet (#93)

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

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git


The following commit(s) were added to refs/heads/master by this push:
     new be57354  JCRVLT-449 allow to set source credentials via servlet (#93)
be57354 is described below

commit be57354e15beb2199e5175e7dcefafaaa7b37ce9
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Thu Jul 9 11:21:02 2020 +0200

    JCRVLT-449 allow to set source credentials via servlet (#93)
---
 vault-doc/src/site/markdown/rcp.md                 | 34 +++++++++++++++++-
 .../jackrabbit/vault/rcp/RcpTaskManager.java       |  2 ++
 .../jackrabbit/vault/rcp/impl/RcpServlet.java      | 42 ++++++++++++++++------
 .../jackrabbit/vault/rcp/impl/RcpTaskImpl.java     |  4 +--
 .../vault/rcp/impl/RcpTaskManagerImpl.java         | 23 ++++++++++--
 .../vault/rcp/impl/RcpTaskManagerImplTest.java     |  5 +--
 vault-rcp/src/test/resources/send_cmd.sh           |  2 +-
 vault-rcp/src/test/resources/set_credentials.json  |  5 +++
 8 files changed, 98 insertions(+), 19 deletions(-)

diff --git a/vault-doc/src/site/markdown/rcp.md b/vault-doc/src/site/markdown/rcp.md
index e264f78..a56c99c 100644
--- a/vault-doc/src/site/markdown/rcp.md
+++ b/vault-doc/src/site/markdown/rcp.md
@@ -139,6 +139,7 @@ Creates a new task.
 | cmd          | X  | Needs to be "**create**". |
 | id           | \- | Id for new task. if omitted a random id is used. |
 | src          | X  | URI of the remote source repository. |
+| srcCreds     | \- | Credentials to use for accessing the source repository in the format `<username>{:<password>}`. Alternatively put those in the URI given in `src`. |
 | dst          | X  | Destination path in the local repository. |
 | batchsize    | \- | Size of batch until intermediate size. Default is 1024. |
 | recursive    | \- | **true** to descend recursively. Default is _false_. |
@@ -173,13 +174,44 @@ Creates a new task.
 
     HTTP/1.1 201 Created
     Content-Type: application/json;charset=utf-8
-    Location: /libs/granite/packaging/rcp.tasks/test-id-1234
+    Location: /system/jackrabbit/filevault/rcp/test-id-1234
     
     {
         "status": "ok",
         "id": "test-id-1234"
     }
     
+#### Set Task Credentials (POST)
+Sets credentials (or overwrites those) for an already existing task.
+
+| Property     | Required | Comment |
+| ------------ | -------- | ------- |
+| cmd          | X | Needs to be "**set-credentials**". |
+| id           | X | Task ID whose credentials should be set. |
+| srcCreds     | /- | Credentials to use for accessing the source repository in the format `<username>{:<password>}`. Leave out to remove credentials |
+
+
+
+##### Example
+    POST /system/jackrabbit/filevault/rcp HTTP/1.1
+    Host: localhost:4502
+    Content-Type: application/json
+    
+	{
+        "cmd":"set-credentials",
+        "id":"test-id-1234",
+        "srcCreds":"myusername:mypassword"
+    }
+
+    HTTP/1.1 200 OK
+    Content-Type: application/json;charset=utf-8
+    
+    {
+        "status": "ok",
+        "id": "test-id-1234"
+    }
+
+
 #### Start Task (POST)
 Starts a previously created task.
 
diff --git a/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/RcpTaskManager.java b/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/RcpTaskManager.java
index 1e91987..7509276 100644
--- a/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/RcpTaskManager.java
+++ b/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/RcpTaskManager.java
@@ -41,4 +41,6 @@ public interface RcpTaskManager {
     RcpTask addTask(RepositoryAddress src, Credentials srcCreds, String dst, String id, List<String> excludes, boolean recursive)
             throws ConfigurationException;
 
+    void setSourceCredentials(String taskId, Credentials srcCreds);
+
 }
\ No newline at end of file
diff --git a/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpServlet.java b/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpServlet.java
index abb3009..fae03a1 100644
--- a/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpServlet.java
+++ b/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpServlet.java
@@ -53,11 +53,12 @@ import org.slf4j.LoggerFactory;
 @Component(service = Servlet.class,
         property = {
                 "service.vendor=The Apache Software Foundation",
-                "sling.servlet.paths=/system/jackrabbit/filevault/rcp"
+                "sling.servlet.paths=" + RcpServlet.SERVLET_PATH
         }
 )
 public class RcpServlet extends SlingAllMethodsServlet {
 
+    protected static final String SERVLET_PATH = "/system/jackrabbit/filevault/rcp";
     private static final long serialVersionUID = -4571680968447024900L;
     public static final String PARAM_SRC = "src";
     public static final String PARAM_SRC_CREDS = "srcCreds";
@@ -155,14 +156,7 @@ public class RcpServlet extends SlingAllMethodsServlet {
                     );
                 }
                 if (srcCreds != null && srcCreds.length() > 0) {
-                    int idx = srcCreds.indexOf(':');
-                    if (idx < 0) {
-                        creds = new SimpleCredentials(srcCreds, new char[0]);
-                    } else {
-                        creds = new SimpleCredentials(
-                                srcCreds.substring(0, idx),
-                                srcCreds.substring(idx+1).toCharArray());
-                    }
+                    creds = createCredentials(srcCreds);
                 }
                 boolean recursive = data.optBoolean(PARAM_RECURSIVE, false);
                 if (data.has(PARAM_EXCLUDES)) {
@@ -199,7 +193,7 @@ public class RcpServlet extends SlingAllMethodsServlet {
                     task.getRcp().setResumeFrom(data.getString(PARAM_RESUME_FROM));
                 }
                 response.setStatus(HttpServletResponse.SC_CREATED);
-                String path = "/libs/granite/packaging/rcp.tasks/" + task.getId();
+                String path = SERVLET_PATH + "/" + task.getId();
                 response.setHeader("Location", path);
 
             // ---------------------------------------------------------------------------------------------< start >---
@@ -232,7 +226,20 @@ public class RcpServlet extends SlingAllMethodsServlet {
                 if (!taskMgr.removeTask(id)) {
                     throw new IllegalArgumentException("No such task with id='" + id + "'");
                 }
-
+            // --------------------------------------------------------------------------------------------< remove >---
+            } else if ("set-credentials".equals(cmd)) {
+                // only add the credentials for a certain task id
+                if (id == null || id.length() == 0) {
+                    throw new IllegalArgumentException("Need task id.");
+                }
+                String srcCreds = data.optString(PARAM_SRC_CREDS, "");
+                final Credentials credentials;
+                if (srcCreds.isEmpty()) {
+                    credentials = null;
+                } else {
+                    credentials = createCredentials(srcCreds);
+                }
+                taskMgr.setSourceCredentials(id, credentials);
             } else {
                 throw new IllegalArgumentException("Invalid command.");
             }
@@ -264,6 +271,19 @@ public class RcpServlet extends SlingAllMethodsServlet {
         }
     }
 
+    Credentials createCredentials(String credentialsAsString) {
+        Credentials creds;
+        int idx = credentialsAsString.indexOf(':');
+        if (idx < 0) {
+            creds = new SimpleCredentials(credentialsAsString, new char[0]);
+        } else {
+            creds = new SimpleCredentials(
+                    credentialsAsString.substring(0, idx),
+                    credentialsAsString.substring(idx+1).toCharArray());
+        }
+        return creds;
+    }
+
     private static void write(JSONWriter w, RcpTask rcpTask) throws JSONException {
         w.object();
         w.key(RcpServlet.PARAM_ID).value(rcpTask.getId());
diff --git a/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskImpl.java b/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskImpl.java
index 0eb3f72..e8ac0e4 100644
--- a/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskImpl.java
+++ b/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskImpl.java
@@ -272,11 +272,11 @@ public class RcpTaskImpl implements Runnable, RcpTask {
         return src;
     }
 
-    Credentials getSrcCreds() {
+    Credentials getSourceCredentials() {
         return srcCreds;
     }
 
-    void setSrcCreds(Credentials srcCreds) {
+    public void setSourceCredentials(Credentials srcCreds) {
         this.srcCreds = srcCreds;
     }
 
diff --git a/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskManagerImpl.java b/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskManagerImpl.java
index 74caf67..56572b0 100644
--- a/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskManagerImpl.java
+++ b/vault-rcp/src/main/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskManagerImpl.java
@@ -184,7 +184,7 @@ public class RcpTaskManagerImpl implements RcpTaskManager {
             String serializedCredentials = props.getProperty(task.getId());
             if (serializedCredentials != null) {
                 Credentials credentials = mapper.readValue(serializedCredentials, SimpleCredentials.class);
-                task.setSrcCreds(credentials);
+                task.setSourceCredentials(credentials);
             }
         }
     }
@@ -211,12 +211,20 @@ public class RcpTaskManagerImpl implements RcpTaskManager {
         log.info("Persisted sensitive part of RCP tasks in '{}'", dataFile);
     }
 
+    private void persistTasksCredentials() {
+        try {
+            persistTasksCredentials(dataFile);
+        } catch (IOException e) {
+            throw new IllegalStateException("Could not persist tasks credentials", e);
+        }
+    }
+
     private void persistTasksCredentials(File dataFile) throws IOException {
         // persist credentials of tasks to data file
         Properties props = new Properties();
         for (RcpTaskImpl task : tasks.values()) {
             // include type information
-            String value = mapper.writeValueAsString(task.getSrcCreds());
+            String value = mapper.writeValueAsString(task.getSourceCredentials());
             props.setProperty(task.getId(), value);
         }
         try (FileOutputStream output = new FileOutputStream(dataFile)) {
@@ -256,6 +264,7 @@ public class RcpTaskManagerImpl implements RcpTaskManager {
         return task;
     }
 
+    @Override
     public boolean removeTask(String taskId) {
         RcpTask rcpTask = tasks.remove(taskId);
         if (rcpTask != null) {
@@ -266,6 +275,16 @@ public class RcpTaskManagerImpl implements RcpTaskManager {
         return false;
     }
 
+    @Override
+    public void setSourceCredentials(String taskId, Credentials srcCreds) {
+        RcpTaskImpl task = tasks.get(taskId);
+        if (task == null) {
+            throw new IllegalArgumentException("No such task with id='" + taskId + "'");
+        }
+        task.setSourceCredentials(srcCreds);
+        persistTasksCredentials();
+    }
+
     protected ClassLoader getDynamicClassLoader() {
         return dynLoaderMgr.getDynamicClassLoader();
     }
diff --git a/vault-rcp/src/test/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskManagerImplTest.java b/vault-rcp/src/test/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskManagerImplTest.java
index 68b919d..c9661c8 100644
--- a/vault-rcp/src/test/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskManagerImplTest.java
+++ b/vault-rcp/src/test/java/org/apache/jackrabbit/vault/rcp/impl/RcpTaskManagerImplTest.java
@@ -35,6 +35,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
 import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
 import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
+import org.apache.jackrabbit.vault.rcp.RcpTask;
 import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
@@ -136,14 +137,14 @@ public class RcpTaskManagerImplTest {
             mismatchDescription.appendText("was ").appendValue(taskToString(item));
         }
         
-        private static String taskToString(RcpTaskImpl task) {
+        private static String taskToString(RcpTask task) {
             ReflectionToStringBuilder builder = new ReflectionToStringBuilder(task, ToStringStyle.SHORT_PREFIX_STYLE);
             return builder.toString();
         }
 
         @Override
         protected boolean matchesSafely(RcpTaskImpl otherTask) {
-            if (!EqualsBuilder.reflectionEquals(task.getSrcCreds(), otherTask.getSrcCreds())) {
+            if (!EqualsBuilder.reflectionEquals(task.getSourceCredentials(), otherTask.getSourceCredentials())) {
                 return false;
             }
             if (!task.getSource().equals(otherTask.getSource())) {
diff --git a/vault-rcp/src/test/resources/send_cmd.sh b/vault-rcp/src/test/resources/send_cmd.sh
index a8f4e96..46b9ea6 100755
--- a/vault-rcp/src/test/resources/send_cmd.sh
+++ b/vault-rcp/src/test/resources/send_cmd.sh
@@ -20,5 +20,5 @@ if [ "$FILE" == "" ]; then
     echo "usage: $0 payload"
     exit 1;
 fi 
-curl -u admin:admin -X POST --data-binary @$FILE -H "Content-Type: application/json" http://localhost:4502/libs/granite/packaging/rcp
+curl -u admin:admin -X POST --data-binary @$FILE -H "Content-Type: application/json" http://localhost:4502/system/jackrabbit/filevault/rcp
 echo ""
diff --git a/vault-rcp/src/test/resources/set_credentials.json b/vault-rcp/src/test/resources/set_credentials.json
new file mode 100644
index 0000000..e9306c8
--- /dev/null
+++ b/vault-rcp/src/test/resources/set_credentials.json
@@ -0,0 +1,5 @@
+{
+    "cmd":"set-credentials",
+    "id":"copy-geometrixx",
+    "srcCreds":"admin:admin"
+}