Skip to content

Commit

Permalink
Merge pull request #42 from rundeck-plugins/issue/username-with-speci…
Browse files Browse the repository at this point in the history
…al-characters

RUN-301 Encode user metadata to URL format to avoid error on upload request to S3 log storage
  • Loading branch information
ltamaster authored Aug 10, 2021
2 parents 512475b + c37c4c1 commit 12a4bc8
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 1 deletion.
25 changes: 24 additions & 1 deletion src/main/java/org/rundeck/plugins/S3LogFileStoragePlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import com.dtolabs.utils.Streams;

import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -62,6 +64,9 @@ public class S3LogFileStoragePlugin implements ExecutionFileStoragePlugin, AWSCr
@PluginProperty(title = "Bucket name", required = true, description = "Bucket to store files in")
private String bucket;

@PluginProperty(title = "Encode user metadata", required = false, description = "Encode user metadata to URL format", defaultValue = "false")
private boolean encodeUserMetadata = false;

@PluginProperty(
title = "Path",
required = true,
Expand Down Expand Up @@ -410,7 +415,7 @@ protected ObjectMetadata createObjectMetadata(long length, Date lastModified) {
for (String s : STORED_META) {
Object v = context.get(s);
if (null != v) {
metadata.addUserMetadata(metaKey(s), v.toString());
metadata.addUserMetadata(metaKey(s), isEncodeUserMetadata() ? encodeStringToURLRequest(v.toString()) : v.toString());
}
}
metadata.setLastModified(lastModified);
Expand All @@ -422,6 +427,16 @@ protected String metaKey(final String s) {
return _PREFIX_META + s;
}

private String encodeStringToURLRequest(String value){
try {
return URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
logger.log(Level.WARNING, e.getMessage(), e);
}

return value;
}


public boolean retrieve(final String filetype, OutputStream stream)
throws IOException, ExecutionFileStorageException
Expand Down Expand Up @@ -567,4 +582,12 @@ public String getExpandedPath() {
public AmazonS3 getAmazonS3() {
return amazonS3;
}

public boolean isEncodeUserMetadata() {
return encodeUserMetadata;
}

public void setEncodeUserMetadata(boolean encodeUserMetadata) {
this.encodeUserMetadata = encodeUserMetadata;
}
}
28 changes: 28 additions & 0 deletions src/test/java/org/rundeck/plugins/S3LogFileStoragePluginTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.junit.runners.JUnit4;

import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
Expand Down Expand Up @@ -728,6 +730,32 @@ public void storeMetadata() throws IOException, ExecutionFileStorageException {
Assert.assertEquals(testContext().get("serverUUID"), userMetadata.get("rundeck.serverUUID"));
}

@Test
public void storeEncodedMetadata() throws IOException, ExecutionFileStorageException {
testPlugin testPlugin = new S3LogFileStoragePluginTest.testPlugin();
testPlugin.setAWSAccessKeyId("blah");
testPlugin.setAWSSecretKey("blah");
testPlugin.setBucket("testBucket");
testPlugin.setEncodeUserMetadata(true);
testPlugin.initialize(testContext());

testPlugin.getTestS3().putObject = new PutObjectResult();
Date lastModified = new Date();
int length = 123;
boolean result = false;
result = testPlugin.store(DEFAULT_FILETYPE, null, length, lastModified);
Assert.assertTrue(result);
Assert.assertEquals(length, testPlugin.getTestS3().putObjectRequest.getMetadata().getContentLength());
Assert.assertEquals(lastModified, testPlugin.getTestS3().putObjectRequest.getMetadata().getLastModified());
Map<String, String> userMetadata = testPlugin.getTestS3().putObjectRequest.getMetadata().getUserMetadata();
Assert.assertEquals(5, userMetadata.size());
Assert.assertEquals(URLEncoder.encode((String)testContext().get("execid"), StandardCharsets.UTF_8.toString()), userMetadata.get("rundeck.execid"));
Assert.assertEquals(URLEncoder.encode((String)testContext().get("project"), StandardCharsets.UTF_8.toString()), userMetadata.get("rundeck.project"));
Assert.assertEquals(URLEncoder.encode((String)testContext().get("url"), StandardCharsets.UTF_8.toString()), userMetadata.get("rundeck.url"));
Assert.assertEquals(URLEncoder.encode((String)testContext().get("serverUrl"), StandardCharsets.UTF_8.toString()), userMetadata.get("rundeck.serverUrl"));
Assert.assertEquals(URLEncoder.encode((String)testContext().get("serverUUID"), StandardCharsets.UTF_8.toString()), userMetadata.get("rundeck.serverUUID"));
}

class testOutputStream extends OutputStream {
boolean wasWrite = false;
boolean writeIOException = false;
Expand Down

0 comments on commit 12a4bc8

Please sign in to comment.