Skip to content

Commit

Permalink
Merge pull request quarkusio#20060 from geoand/2.2.3-backports1
Browse files Browse the repository at this point in the history
2.2.3 backports1
  • Loading branch information
geoand authored Sep 11, 2021
2 parents 4ff9b61 + c936638 commit 09b2598
Show file tree
Hide file tree
Showing 9 changed files with 182 additions and 12 deletions.
4 changes: 2 additions & 2 deletions bom/application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@
<azure-functions-java-library.version>1.4.2</azure-functions-java-library.version>
<kotlin.version>1.5.21</kotlin.version>
<kotlin.coroutine.version>1.5.0</kotlin.coroutine.version>
<dekorate.version>2.3.0</dekorate.version>
<dekorate.version>2.5.0</dekorate.version>
<maven-artifact-transfer.version>0.10.0</maven-artifact-transfer.version>
<maven-invoker.version>3.0.1</maven-invoker.version>
<awaitility.version>4.1.0</awaitility.version>
Expand All @@ -170,7 +170,7 @@
<okhttp.version>3.14.9</okhttp.version>
<sentry.version>5.0.1</sentry.version>
<hibernate-quarkus-local-cache.version>0.1.0</hibernate-quarkus-local-cache.version>
<kubernetes-client.version>5.7.2</kubernetes-client.version>
<kubernetes-client.version>5.7.3</kubernetes-client.version>
<flapdoodle.mongo.version>2.2.0</flapdoodle.mongo.version>
<quarkus-spring-api.version>5.2.SP4</quarkus-spring-api.version>
<quarkus-spring-data-api.version>2.1.SP2</quarkus-spring-data-api.version>
Expand Down
2 changes: 1 addition & 1 deletion docs/src/main/asciidoc/micrometer.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ To use the Micrometer StackDriver MeterRegistry, for example, you would use the
[source,xml]
----
<dependency>
<groupId>io.quarkiverse</groupId>
<groupId>io.quarkiverse.micrometer.registry</groupId>
<artifactId>quarkus-micrometer-registry-stackdriver</artifactId>
</dependency>
----
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package io.quarkus.resteasy.reactive.server.test.security;

import static org.hamcrest.CoreMatchers.is;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;

import org.jboss.resteasy.reactive.server.providers.serialisers.ServerDefaultTextPlainBodyHandler;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.security.Authenticated;
import io.quarkus.security.test.utils.TestIdentityController;
import io.quarkus.security.test.utils.TestIdentityProvider;
import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;
import io.restassured.specification.RequestSpecification;

public class SecurityWithMethodGenericsTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(TestIdentityProvider.class,
TestIdentityController.class,
BaseResource.class, AuthenticatedResource.class,
CustomServerDefaultTextPlainBodyHandler.class));

@BeforeAll
public static void setupUsers() {
TestIdentityController.resetRoles()
.add("admin", "admin", "admin")
.add("user", "user", "user");
}

@Test
public void test() {
requestWithBasicAuth().get("/auth/allow").then().statusCode(200)
.body(is("allow"));
requestWithBasicAuth().contentType(MediaType.TEXT_PLAIN).body("12345")
.post("/auth/generic").then()
.statusCode(200);
requestWithBasicAuth().contentType(MediaType.TEXT_PLAIN).body("54321").post("/auth/specific").then()
.statusCode(200);
}

private RequestSpecification requestWithBasicAuth() {
return RestAssured.given().auth().preemptive().basic("admin", "admin");
}

public static abstract class BaseResource<T> {

@Path("generic")
@POST
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.TEXT_PLAIN)
public String generic(T body) {
return "generic";
}

@Path("specific")
@POST
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.TEXT_PLAIN)
public String specific(String body) {
return "specific";
}
}

@Path("auth")
@Authenticated
public static class AuthenticatedResource extends BaseResource<String> {

@Path("allow")
@GET
public String allow() {
return "allow";
}
}

@Provider
@Consumes("text/plain")
public static class CustomServerDefaultTextPlainBodyHandler extends ServerDefaultTextPlainBodyHandler {

@Override
public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return true;
}

@Override
public Object readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
return "dummy";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,10 @@ protected InjectableBean scanInjectableBean(ClassInfo currentClassInfo, ClassInf
protected MethodParameter createMethodParameter(ClassInfo currentClassInfo, ClassInfo actualEndpointInfo, boolean encoded,
Type paramType, ClientIndexedParam parameterResult, String name, String defaultValue, ParameterType type,
String elementType, boolean single, String signature) {
DeclaredTypes declaredTypes = getDeclaredTypes(paramType, currentClassInfo, actualEndpointInfo);
return new MethodParameter(name,
elementType, toClassName(paramType, currentClassInfo, actualEndpointInfo, index), signature, type, single,
elementType, declaredTypes.getDeclaredType(), declaredTypes.getDeclaredUnresolvedType(), signature, type,
single,
defaultValue, parameterResult.isObtainedAsCollection(), parameterResult.isOptional(), encoded);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1080,6 +1080,26 @@ protected void handlePathSegmentParam(PARAM builder) {
protected void handleLocalDateParam(PARAM builder) {
}

protected DeclaredTypes getDeclaredTypes(Type paramType, ClassInfo currentClassInfo, ClassInfo actualEndpointInfo) {
String declaredType = toClassName(paramType, currentClassInfo, actualEndpointInfo, index);
String declaredUnresolvedType;
if (paramType.kind() == Kind.TYPE_VARIABLE) {
// we need to handle this specially since we want the actual declared type here and not the resolved type
// that toClassName(...) gives us
TypeVariable typeVariable = paramType.asTypeVariable();
if (typeVariable.bounds().isEmpty()) {
declaredUnresolvedType = Object.class.getName();
} else {
declaredUnresolvedType = typeVariable.bounds().get(0).name().toString();
}

} else {
declaredUnresolvedType = declaredType;
}

return new DeclaredTypes(declaredType, declaredUnresolvedType);
}

protected void handleOtherParam(Map<String, String> existingConverters, String errorLocation, boolean hasRuntimeConverters,
PARAM builder, String elementType) {
}
Expand Down Expand Up @@ -1227,4 +1247,22 @@ public ResourceMethod getResourceMethod() {
}
}

public static class DeclaredTypes {
private final String declaredType;
private final String declaredUnresolvedType;

public DeclaredTypes(String declaredType, String declaredUnresolvedType) {
this.declaredType = declaredType;
this.declaredUnresolvedType = declaredUnresolvedType;
}

public String getDeclaredType() {
return declaredType;
}

public String getDeclaredUnresolvedType() {
return declaredUnresolvedType;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ public class MethodParameter {
* will be the collection type
*/
public String declaredType;
/**
* This will only be different from the declaredType if a TypeVariable was used.
* It is needed for proper reflection method lookups
*/
public String declaredUnresolvedType;
public String signature;
public ParameterType parameterType;
public boolean encoded;
Expand All @@ -20,12 +25,14 @@ public class MethodParameter {
public MethodParameter() {
}

public MethodParameter(String name, String type, String declaredType, String signature, ParameterType parameterType,
public MethodParameter(String name, String type, String declaredType, String declaredUnresolvedType, String signature,
ParameterType parameterType,
boolean single,
String defaultValue, boolean isObtainedAsCollection, boolean optional, boolean encoded) {
this.name = name;
this.type = type;
this.declaredType = declaredType;
this.declaredUnresolvedType = declaredUnresolvedType;
this.signature = signature;
this.parameterType = parameterType;
this.single = single;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,8 +260,9 @@ protected MethodParameter createMethodParameter(ClassInfo currentClassInfo, Clas
Type paramType, ServerIndexedParameter parameterResult, String name, String defaultValue, ParameterType type,
String elementType, boolean single, String signature) {
ParameterConverterSupplier converter = parameterResult.getConverter();
DeclaredTypes declaredTypes = getDeclaredTypes(paramType, currentClassInfo, actualEndpointInfo);
return new ServerMethodParameter(name,
elementType, toClassName(paramType, currentClassInfo, actualEndpointInfo, index),
elementType, declaredTypes.getDeclaredType(), declaredTypes.getDeclaredUnresolvedType(),
type, single, signature,
converter, defaultValue, parameterResult.isObtainedAsCollection(), parameterResult.isOptional(), encoded,
parameterResult.getCustomerParameterExtractor());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,16 +142,25 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz,
}

Class<Object> resourceClass = loadClass(clazz.getClassName());
Class<?>[] parameterClasses = new Class[method.getParameters().length];
Class<?>[] parameterDeclaredTypes = new Class[method.getParameters().length];
Class<?>[] parameterDeclaredUnresolvedTypes = new Class[method.getParameters().length];
for (int i = 0; i < method.getParameters().length; ++i) {
parameterClasses[i] = loadClass(method.getParameters()[i].declaredType);
MethodParameter parameter = method.getParameters()[i];
String declaredType = parameter.declaredType;
String declaredUnresolvedType = parameter.declaredUnresolvedType;
parameterDeclaredTypes[i] = loadClass(declaredType);
parameterDeclaredUnresolvedTypes[i] = parameterDeclaredTypes[i];
if (!declaredType.equals(declaredUnresolvedType)) {
parameterDeclaredUnresolvedTypes[i] = loadClass(declaredUnresolvedType);
}
}

Set<String> classAnnotationNames = new HashSet<>();
for (Annotation annotation : resourceClass.getAnnotations()) {
classAnnotationNames.add(annotation.annotationType().getName());
}
ResteasyReactiveResourceInfo lazyMethod = new ResteasyReactiveResourceInfo(method.getName(), resourceClass,
parameterClasses, classAnnotationNames, method.getMethodAnnotationNames());
parameterDeclaredUnresolvedTypes, classAnnotationNames, method.getMethodAnnotationNames());

RuntimeInterceptorDeployment.MethodInterceptorContext interceptorDeployment = runtimeInterceptorDeployment
.forMethod(method, lazyMethod);
Expand Down Expand Up @@ -417,7 +426,7 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz,
classPathTemplate,
method.getProduces() == null ? null : serverMediaType,
consumesMediaTypes, invoker,
clazz.getFactory(), handlers.toArray(EMPTY_REST_HANDLER_ARRAY), method.getName(), parameterClasses,
clazz.getFactory(), handlers.toArray(EMPTY_REST_HANDLER_ARRAY), method.getName(), parameterDeclaredTypes,
nonAsyncReturnType, method.isBlocking(), resourceClass,
lazyMethod,
pathParameterIndexes, score, sseElementType, clazz.resourceExceptionMapper());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ public class ServerMethodParameter extends MethodParameter {
public ServerMethodParameter() {
}

public ServerMethodParameter(String name, String type, String declaredType, ParameterType parameterType, boolean single,
public ServerMethodParameter(String name, String type, String declaredType, String declaredUnresolvedType,
ParameterType parameterType, boolean single,
String signature,
ParameterConverterSupplier converter, String defaultValue, boolean isObtainedAsCollection, boolean isOptional,
boolean encoded,
ParameterExtractor customerParameterExtractor) {
super(name, type, declaredType, signature, parameterType, single, defaultValue, isObtainedAsCollection, isOptional,
super(name, type, declaredType, declaredUnresolvedType, signature, parameterType, single, defaultValue,
isObtainedAsCollection, isOptional,
encoded);
this.converter = converter;
this.customerParameterExtractor = customerParameterExtractor;
Expand Down

0 comments on commit 09b2598

Please sign in to comment.