Updated Branches:
  refs/heads/master 7eaf69a59 -> c2524d07a

Fixes encoding of "." when listing a single user
Only affects users with restricted hostnames


Project: 
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/commit/83513ad4
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/tree/83513ad4
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/diff/83513ad4

Branch: refs/heads/master
Commit: 83513ad4f22aecf46720d17b5c77bff924b45494
Parents: 7eaf69a
Author: zack-shoylev <[email protected]>
Authored: Mon Jul 8 16:25:05 2013 -0500
Committer: Ignasi Barrera <[email protected]>
Committed: Fri Jul 12 23:36:56 2013 +0200

----------------------------------------------------------------------
 .../openstack/trove/v1/features/UserApi.java    |  3 ++
 .../trove/v1/filters/EncodeDotsForUserGet.java  | 49 ++++++++++++++++++++
 .../trove/v1/features/UserApiExpectTest.java    | 12 ++---
 .../src/test/resources/user_get_withhost.json   |  2 +-
 4 files changed, 59 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/83513ad4/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/features/UserApi.java
----------------------------------------------------------------------
diff --git 
a/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/features/UserApi.java
 
b/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/features/UserApi.java
index 59c8e08..3736660 100644
--- 
a/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/features/UserApi.java
+++ 
b/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/features/UserApi.java
@@ -35,6 +35,7 @@ import 
org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.trove.v1.binders.BindCreateUserToJson;
 import org.jclouds.openstack.trove.v1.binders.BindGrantUserToJson;
 import org.jclouds.openstack.trove.v1.domain.User;
+import org.jclouds.openstack.trove.v1.filters.EncodeDotsForUserGet;
 import org.jclouds.openstack.trove.v1.functions.ParseDatabaseListForUser;
 import org.jclouds.rest.annotations.Fallback;
 import org.jclouds.rest.annotations.MapBinder;
@@ -208,6 +209,7 @@ public interface UserApi {
    @Named("user:get/{name}")
    @GET
    @Path("/users/{name}")
+   @RequestFilters(EncodeDotsForUserGet.class)
    @SelectJson("user")
    @Consumes(MediaType.APPLICATION_JSON)
    @Fallback(NullOnNotFoundOr404.class)
@@ -224,6 +226,7 @@ public interface UserApi {
    @Named("user:get/{name}@{hostname}")
    @GET
    @Path("/users/{name}@{hostname}")
+   @RequestFilters(EncodeDotsForUserGet.class)
    @SelectJson("user")
    @Consumes(MediaType.APPLICATION_JSON)
    @Fallback(NullOnNotFoundOr404.class)

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/83513ad4/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/filters/EncodeDotsForUserGet.java
----------------------------------------------------------------------
diff --git 
a/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/filters/EncodeDotsForUserGet.java
 
b/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/filters/EncodeDotsForUserGet.java
new file mode 100644
index 0000000..4be330f
--- /dev/null
+++ 
b/openstack-trove/src/main/java/org/jclouds/openstack/trove/v1/filters/EncodeDotsForUserGet.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.trove.v1.filters;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpException;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpRequestFilter;
+
+/**
+ * Encodes "." as %2e when getting a user with restricted hostname
+ * 
+ * @author Zack Shoylev
+ * 
+ */
+@Singleton
+public class EncodeDotsForUserGet implements HttpRequestFilter {
+   private final Pattern pattern = Pattern.compile("/[^/]*$"); // From last / 
to the end of the line 
+   
+   @Override
+   public HttpRequest filter(HttpRequest request) throws HttpException {
+      String endpoint = request.getEndpoint().toString();      
+      Matcher matcher = pattern.matcher(endpoint);
+      if(!matcher.find())
+         return request; // do not modify if not found. This however is not 
expected to happen.
+      String encodable = matcher.group();
+      String encoded = encodable.replace(".", "%2e");
+      String newEndpoint = matcher.replaceFirst(encoded);
+      return request.toBuilder().endpoint(newEndpoint).build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/83513ad4/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiExpectTest.java
----------------------------------------------------------------------
diff --git 
a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiExpectTest.java
 
b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiExpectTest.java
index 1bb99ae..a711d11 100644
--- 
a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiExpectTest.java
+++ 
b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiExpectTest.java
@@ -402,7 +402,7 @@ public class UserApiExpectTest extends 
BaseTroveApiExpectTest {
    }
    
    public void testGetUserWithHostname() {
-      URI endpoint = 
URI.create("http://172.16.0.1:8776/v1/3456/instances/instanceId-1234-5678/users/exampleuser%40192.168.64.64";);
+      URI endpoint = 
URI.create("http://172.16.0.1:8776/v1/3456/instances/instanceId-1234-5678/users/example%2euser%40192%2e168%2e64%2e64";);
       UserApi api = requestsSendResponses(
             keystoneAuthWithUsernameAndPasswordAndTenantName,
             responseWithKeystoneAccess,
@@ -410,16 +410,16 @@ public class UserApiExpectTest extends 
BaseTroveApiExpectTest {
             
HttpResponse.builder().statusCode(200).payload(payloadFromResource("/user_get_withhost.json")).build()
       ).getUserApiForInstanceInZone("instanceId-1234-5678","RegionOne");
 
-      User user = api.get("exampleuser", "192.168.64.64");
-      assertEquals(user.getName(), "exampleuser");
+      User user = api.get("example.user", "192.168.64.64");
+      assertEquals(user.getName(), "example.user");
       assertEquals(user.getHost(), "192.168.64.64");
-      assertEquals(user.getIdentifier(), "[email protected]");
+      assertEquals(user.getIdentifier(), "[email protected]");
       assertEquals(user.getDatabases().size(), 2);
       assertEquals(user.getDatabases().iterator().next(), "databaseA");
    }
    
    public void testGetUserWithHostnameFail() {
-      URI endpoint = 
URI.create("http://172.16.0.1:8776/v1/3456/instances/instanceId-1234-5678/users/exampleuser%40192.168.64.64";);
+      URI endpoint = 
URI.create("http://172.16.0.1:8776/v1/3456/instances/instanceId-1234-5678/users/example%2euser%40192%2e168%2e64%2e64";);
       UserApi api = requestsSendResponses(
             keystoneAuthWithUsernameAndPasswordAndTenantName,
             responseWithKeystoneAccess,
@@ -427,7 +427,7 @@ public class UserApiExpectTest extends 
BaseTroveApiExpectTest {
             
HttpResponse.builder().statusCode(404).payload(payloadFromResource("/user_get_withhost.json")).build()
       ).getUserApiForInstanceInZone("instanceId-1234-5678","RegionOne");
 
-      User user = api.get("exampleuser", "192.168.64.64");
+      User user = api.get("example.user", "192.168.64.64");
       assertNull(user);
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/83513ad4/openstack-trove/src/test/resources/user_get_withhost.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_get_withhost.json 
b/openstack-trove/src/test/resources/user_get_withhost.json
index 03274b6..2827568 100644
--- a/openstack-trove/src/test/resources/user_get_withhost.json
+++ b/openstack-trove/src/test/resources/user_get_withhost.json
@@ -1,6 +1,6 @@
 {
    "user": {
-      "name": "exampleuser",
+      "name": "example.user",
       "host": "192.168.64.64",
       "databases": [
          {

Reply via email to