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": [ {
