Author: rgodfrey Date: Fri May 15 10:13:35 2015 New Revision: 1679532 URL: http://svn.apache.org/r1679532 Log: QPID-6382 : Allow / character in object names (Work by Lorenz Quack and Rob Godfrey)
Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java Fri May 15 10:13:35 2015 @@ -22,7 +22,9 @@ package org.apache.qpid.server.managemen import java.io.IOException; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; import java.io.Writer; +import java.net.URLDecoder; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; @@ -284,7 +286,20 @@ public abstract class AbstractServlet ex String pathInfo = request.getPathInfo(); if (pathInfo != null && pathInfo.length() > 0) { - return pathInfo.substring(1).split("/"); + String[] pathInfoElements = pathInfo.substring(1).split("/"); + for (int i = 0; i < pathInfoElements.length; i++) + { + try + { + // double decode to allow slashes in object names. first decoding happens in request.getPathInfo(). + pathInfoElements[i] = URLDecoder.decode(pathInfoElements[i], "UTF-8"); + } + catch (UnsupportedEncodingException e) + { + throw new IllegalArgumentException("REST servlet " + getServletName() + " could not decode path element: " + pathInfoElements[i], e); + } + } + return pathInfoElements; } return null; } Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java Fri May 15 10:13:35 2015 @@ -22,6 +22,7 @@ package org.apache.qpid.server.management.plugin.servlet.rest; import java.io.IOException; +import java.net.URLDecoder; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -166,17 +167,17 @@ public class UserPreferencesServlet exte Collection<AuthenticationProvider> authenticationProviders = broker.getAuthenticationProviders(); Map<String, Set<String>> providerUsers = new HashMap<String, Set<String>>(); Map<String, AuthenticationProvider> requestProviders = new HashMap<String, AuthenticationProvider>(); - for (String path : request.getParameterValues("user")) + for (String value : request.getParameterValues("user")) { - String[] elements = path.split("/"); + String[] elements = value.split("/"); if (elements.length != 2) { - throw new IllegalArgumentException("Illegal user parameter " + path); + throw new IllegalArgumentException("Illegal user parameter " + value); } - String userId = elements[1]; + String userId = URLDecoder.decode(elements[1], "UTF-8"); - String providerName = elements[0]; + String providerName = URLDecoder.decode(elements[0], "UTF-8"); Set<String> users = providerUsers.get(providerName); if (users == null) Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/addQueue.html Fri May 15 10:13:35 2015 @@ -33,7 +33,7 @@ required: true, promptMessage: 'Name of queue', title: 'Enter a queue name', - regExp:'^[\x20-\x2e\x30-\x7F]{1,255}$'"/> + regExp:'^[\x20-\x7F]{1,255}$'"/> </div> </div> <div class="clear"> Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js Fri May 15 10:13:35 2015 @@ -321,7 +321,8 @@ define(["dojo/_base/lang", { url = url + "/"; } - url = url + encodeURIComponent(modelObj.name) + // Double encode the object name in case it contains slashes + url = url + encodeURIComponent(encodeURIComponent(modelObj.name)) } } return "api/latest/" + url; @@ -335,11 +336,11 @@ define(["dojo/_base/lang", { if (path) { - path = encodeURIComponent(parent.name) + "/" + path; + path = encodeURIComponent(encodeURIComponent(parent.name)) + "/" + path; } else { - path = encodeURIComponent(parent.name); + path = encodeURIComponent(encodeURIComponent(parent.name)); } parent = parent.parent; } Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Preferences.js Fri May 15 10:13:35 2015 @@ -240,7 +240,9 @@ function (declare, event, connect, dom, { for(var i=0; i<users.length; i++) { - users[i].id = users[i].authenticationProvider + "/" + users[i].name; + users[i].id = encodeURIComponent(users[i].authenticationProvider) + + "/" + + encodeURIComponent(users[i].name); } that.users = users; var usersStore = new Memory({data: users, idProperty: "id"}); @@ -280,4 +282,4 @@ function (declare, event, connect, dom, } }); -}); \ No newline at end of file +}); Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js Fri May 15 10:13:35 2015 @@ -84,8 +84,10 @@ define(["dojo/parser", that.queueUpdater = new QueueUpdater(that); - var myStore = new JsonRest({target: that.management.getFullUrl("service/message/"+ encodeURIComponent(that.getVirtualHostName()) + - "/" + encodeURIComponent(that.getQueueName()))}); + // double encode to allow slashes in object names. + var myStore = new JsonRest({target: that.management.getFullUrl("service/message/" + + encodeURIComponent(encodeURIComponent(that.getVirtualHostName())) + + "/" + encodeURIComponent(encodeURIComponent(that.getQueueName())))}); var messageGridDiv = query(".messages",contentPane.containerNode)[0]; that.dataStore = new ObjectStore({objectStore: myStore}); var userPreferences = this.management.userPreferences; @@ -185,7 +187,7 @@ define(["dojo/parser", if(data.length) { var that = this; if(confirm("Delete " + data.length + " messages?")) { - var query = util.buildDeleteQuery(data, "service/message/" + encodeURIComponent(this.getVirtualHostName()) + "/" + encodeURIComponent(this.getQueueName())); + var query = util.buildDeleteQuery(data, "service/message/" + encodeURIComponent(encodeURIComponent(this.getVirtualHostName())) + "/" + encodeURIComponent(encodeURIComponent(this.getQueueName()))); management.del({url: query}).then( function(result) { @@ -200,8 +202,8 @@ define(["dojo/parser", Queue.prototype.clearQueue = function() { var that = this; if(confirm("Clear all messages from queue?")) { - var query = "service/message/"+ encodeURIComponent(that.getVirtualHostName()) - + "/" + encodeURIComponent(that.getQueueName()) + "?clear=true"; + var query = "service/message/"+ encodeURIComponent(encodeURIComponent(that.getVirtualHostName())) + + "/" + encodeURIComponent(encodeURIComponent(that.getQueueName())) + "?clear=true"; that.success = true this.management.del({url: query}).then( function(data) { Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/moveCopyMessages.js Fri May 15 10:13:35 2015 @@ -61,8 +61,8 @@ define(["dojo/dom", moveMessages.data.destinationQueue = theForm.getValues()["queue"]; var that = this; - moveMessages.management.post({url: "service/message/"+encodeURIComponent(moveMessages.vhost) - +"/"+encodeURIComponent(moveMessages.queue), + moveMessages.management.post({url: "service/message/"+encodeURIComponent(encodeURIComponent(moveMessages.vhost)) + +"/"+encodeURIComponent(encodeURIComponent(moveMessages.queue)), headers: { "Content-Type": "application/json"}}, moveMessages.data, function(x) { Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/showMessage.js Fri May 15 10:13:35 2015 @@ -100,16 +100,17 @@ define(["dojo/dom", var contentField = query(".message-content", this.dialogNode)[0]; if(data.mimeType && data.mimeType.match(/text\/.*/)) { - showMessage.management.get({url: "service/message-content/" + encodeURIComponent(showMessage.virtualhost) - + "/" + encodeURIComponent(showMessage.queue) - + "/" + encodeURIComponent(showMessage.messageNumber), + showMessage.management.get({url: "service/message-content/" + encodeURIComponent(encodeURIComponent(showMessage.virtualhost)) + + "/" + encodeURIComponent(encodeURIComponent(showMessage.queue)) + + "/" + encodeURIComponent(encodeURIComponent(showMessage.messageNumber)), headers: { "Content-Type": "text/html"}, handleAs: "text" }).then(function(obj) { contentField.innerHTML = encode(obj); }, util.xhrErrorHandler); } else { - contentField.innerHTML = "<a href=\"" + showMessage.management.getFullUrl("service/message-content/" + encodeURIComponent(showMessage.virtualhost) - + "/" + encodeURIComponent(showMessage.queue) - + "/" + encodeURIComponent(showMessage.messageNumber)) + contentField.innerHTML = "<a href=\"" + showMessage.management.getFullUrl("service/message-content/" + + encodeURIComponent(encodeURIComponent(showMessage.virtualhost)) + + "/" + encodeURIComponent(encodeURIComponent(showMessage.queue)) + + "/" + encodeURIComponent(encodeURIComponent(showMessage.messageNumber))) + "\" target=\"_blank\">Download</a>"; } populatedFields.push(contentField); @@ -123,9 +124,9 @@ define(["dojo/dom", showMessage.queue = obj.queue; showMessage.messageNumber = obj.messageNumber; - showMessage.management.get({url: "service/message/" + encodeURIComponent(obj.virtualhost) - + "/" + encodeURIComponent(obj.queue) - + "/" + encodeURIComponent(obj.messageNumber)}, + showMessage.management.get({url: "service/message/" + encodeURIComponent(encodeURIComponent(obj.virtualhost)) + + "/" + encodeURIComponent(encodeURIComponent(obj.queue)) + + "/" + encodeURIComponent(encodeURIComponent(obj.messageNumber))}, showMessage.populateShowMessage, util.xhrErrorHandler ); }; Modified: qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java?rev=1679532&r1=1679531&r2=1679532&view=diff ============================================================================== --- qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java (original) +++ qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java Fri May 15 10:13:35 2015 @@ -23,6 +23,7 @@ package org.apache.qpid.systest.rest; import static org.apache.qpid.server.management.plugin.servlet.rest.RestServlet.SC_UNPROCESSABLE_ENTITY; import java.io.IOException; +import java.net.URLEncoder; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -576,6 +577,26 @@ public class VirtualHostRestTest extends Asserts.assertQueue(queueName, "standard", queue, null); } + public void testObjectsWithSlashes() throws Exception + { + String queueName = "testQueue/with/slashes"; + String queueNameEncoded = URLEncoder.encode(queueName, "UTF-8"); + String queueNameDoubleEncoded = URLEncoder.encode(queueNameEncoded, "UTF-8"); + String queueUrl = "queue/test/test/" + queueNameDoubleEncoded; + + // Test creation + createQueue(queueNameDoubleEncoded, "standard", null); + Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList("virtualhost/test"); + List<Map<String, Object>> queues = (List<Map<String, Object>>) hostDetails.get(VirtualHostRestTest.VIRTUALHOST_QUEUES_ATTRIBUTE); + Map<String, Object> queue = getRestTestHelper().find(Queue.NAME, queueName , queues); + Asserts.assertQueue(queueName, "standard", queue); + + // Test deletion + int statusCode = getRestTestHelper().submitRequest(queueUrl, "DELETE"); + assertEquals("Unexpected response code", 200, statusCode); + getRestTestHelper().submitRequest(queueUrl, "GET", HttpServletResponse.SC_NOT_FOUND); + } + private void createExchange(String exchangeName, String exchangeType) throws IOException { Map<String, Object> queueData = new HashMap<String, Object>(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org