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"
+}