You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2018/04/16 22:45:24 UTC
[20/38] tomee git commit: some refactoring
some refactoring
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/1ad96bbd
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/1ad96bbd
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/1ad96bbd
Branch: refs/heads/master
Commit: 1ad96bbdf1239c4d57cb5b0bc9fa857fa028f427
Parents: 812cfed
Author: Jean-Louis Monteiro <je...@gmail.com>
Authored: Tue Feb 27 11:03:11 2018 +0100
Committer: Jean-Louis Monteiro <je...@gmail.com>
Committed: Tue Feb 27 11:03:11 2018 +0100
----------------------------------------------------------------------
tck/mp-jwt-embedded/pom.xml | 16 ++--
.../apache/tomee/microprofile/jwt/KeyUtils.java | 85 -------------------
.../tomee/microprofile/jwt/MPJWTFilter.java | 2 +-
.../microprofile/jwt/MPJWTInitializer.java | 1 +
.../tomee/microprofile/jwt/ParseException.java | 4 +-
.../tomee/microprofile/jwt/TCKTokenParser.java | 2 +-
.../microprofile/jwt/cdi/ClaimLiteral.java | 32 --------
.../jwt/cdi/ClaimProviderBeanAttributes.java | 23 ++----
.../jwt/cdi/ClaimValueProducer.java | 16 ++--
.../microprofile/jwt/cdi/ClaimValueWrapper.java | 13 ++-
.../microprofile/jwt/cdi/JsonValueProducer.java | 37 ++++-----
.../microprofile/jwt/cdi/JsonbProducer.java | 45 ++++++++++
.../microprofile/jwt/cdi/MPJWTCDIExtension.java | 15 +---
.../microprofile/jwt/cdi/MPJWTProducer.java | 86 +++-----------------
.../jwt/cdi/RawClaimTypeProducer.java | 21 ++---
.../jwt/config/JWTAuthContextInfoProvider.java | 42 +++++-----
.../principal/DefaultJWTCallerPrincipal.java | 6 +-
tck/mp-jwt-embedded/src/test/resources/dev.xml | 6 +-
18 files changed, 148 insertions(+), 304 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/pom.xml
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/pom.xml b/tck/mp-jwt-embedded/pom.xml
index 272f4ad..5055ac4 100644
--- a/tck/mp-jwt-embedded/pom.xml
+++ b/tck/mp-jwt-embedded/pom.xml
@@ -96,15 +96,21 @@
<artifactId>jose4j</artifactId>
<version>0.6.0</version>
</dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-json_1.1_spec</artifactId>
+ <version>1.0</version>
+ </dependency>
<dependency>
- <groupId>javax.json.bind</groupId>
- <artifactId>javax.json.bind-api</artifactId>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jsonb_1.0_spec</artifactId>
<version>1.0</version>
</dependency>
<dependency>
- <groupId>org.glassfish</groupId>
- <artifactId>javax.json</artifactId>
- <version>1.0.4</version>
+ <groupId>org.apache.johnzon</groupId>
+ <artifactId>johnzon-jsonb</artifactId>
+ <version>1.1.2</version>
</dependency>
</dependencies>
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/KeyUtils.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/KeyUtils.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/KeyUtils.java
deleted file mode 100644
index c65ea98..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/KeyUtils.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.apache.tomee.microprofile.jwt;
-
-import java.io.InputStream;
-import java.security.KeyFactory;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-import java.util.Base64;
-
-public class KeyUtils {
- private KeyUtils() {
- }
-
- public static PrivateKey readPrivateKey(String pemResName) throws Exception {
- InputStream contentIS = KeyUtils.class.getResourceAsStream(pemResName);
- byte[] tmp = new byte[4096];
- int length = contentIS.read(tmp);
- PrivateKey privateKey = decodePrivateKey(new String(tmp, 0, length));
- return privateKey;
- }
-
- public static PublicKey readPublicKey(String pemResName) throws Exception {
- InputStream contentIS = KeyUtils.class.getResourceAsStream(pemResName);
- byte[] tmp = new byte[4096];
- int length = contentIS.read(tmp);
- PublicKey publicKey = decodePublicKey(new String(tmp, 0, length));
- return publicKey;
- }
-
- public static KeyPair generateKeyPair(int keySize) throws NoSuchAlgorithmException {
- KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
- keyPairGenerator.initialize(keySize);
- KeyPair keyPair = keyPairGenerator.genKeyPair();
- return keyPair;
- }
-
- public static PrivateKey decodePrivateKey(String pemEncoded) throws Exception {
- pemEncoded = removeBeginEnd(pemEncoded);
- byte[] pkcs8EncodedBytes = Base64.getDecoder().decode(pemEncoded);
-
- // extract the private key
-
- PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes);
- KeyFactory kf = KeyFactory.getInstance("RSA");
- PrivateKey privKey = kf.generatePrivate(keySpec);
- return privKey;
- }
-
- public static PublicKey decodePublicKey(String pemEncoded) throws Exception {
- pemEncoded = removeBeginEnd(pemEncoded);
- byte[] encodedBytes = Base64.getDecoder().decode(pemEncoded);
-
- X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedBytes);
- KeyFactory kf = KeyFactory.getInstance("RSA");
- return kf.generatePublic(spec);
- }
-
- private static String removeBeginEnd(String pem) {
- pem = pem.replaceAll("-----BEGIN(.*)KEY-----", "");
- pem = pem.replaceAll("-----END(.*)KEY-----", "");
- pem = pem.replaceAll("\r\n", "");
- pem = pem.replaceAll("\n", "");
- return pem.trim();
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java
index 0c80696..752bcda 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java
@@ -69,7 +69,7 @@ public class MPJWTFilter implements Filter {
final String token = authorizationHeader.substring("bearer ".length());
final JsonWebToken jsonWebToken;
try {
- jsonWebToken = DefaultJWTCallerPrincipalFactory.instance().parse(token, authContextInfo);
+ jsonWebToken = validate(token);
} catch (final ParseException e) {
// todo properly handle the exception as required per spec
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTInitializer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTInitializer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTInitializer.java
index 8fa9259..28a1735 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTInitializer.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTInitializer.java
@@ -60,6 +60,7 @@ public class MPJWTInitializer implements ServletContainerInitializer {
MPJWTContext.addMapping(
new MPJWTContext.MPJWTConfigKey(
ctx.getContextPath(),
+ // todo instead of empty path, we need to look for default value
applicationPath == null ? "" : applicationPath.value()),
new MPJWTContext.MPJWTConfigValue(
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ParseException.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ParseException.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ParseException.java
index 60269b0..d9572d5 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ParseException.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ParseException.java
@@ -22,11 +22,11 @@ package org.apache.tomee.microprofile.jwt;
public class ParseException extends Exception {
private static final long serialVersionUID = 1L;
- public ParseException(String message) {
+ public ParseException(final String message) {
super(message);
}
- public ParseException(String message, Throwable cause) {
+ public ParseException(final String message, final Throwable cause) {
super(message, cause);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java
index aeea598..ae563ec 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java
@@ -31,7 +31,7 @@ import java.security.interfaces.RSAPublicKey;
public class TCKTokenParser implements ITokenParser {
@Override
- public JsonWebToken parse(String bearerToken, String issuer, PublicKey publicKey) throws Exception {
+ public JsonWebToken parse(final String bearerToken, final String issuer, final PublicKey publicKey) throws Exception {
final JWTAuthContextInfo authContextInfo = new JWTAuthContextInfo((RSAPublicKey) publicKey, issuer);
final JWTCallerPrincipalFactory factory = DefaultJWTCallerPrincipalFactory.instance();
return factory.parse(bearerToken, authContextInfo);
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimLiteral.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimLiteral.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimLiteral.java
deleted file mode 100644
index 319f122..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimLiteral.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.apache.tomee.microprofile.jwt.cdi;
-
-import org.eclipse.microprofile.jwt.Claim;
-import org.eclipse.microprofile.jwt.Claims;
-
-import javax.enterprise.util.AnnotationLiteral;
-
-public class ClaimLiteral extends AnnotationLiteral<Claim> implements Claim {
- public String value() {
- return "";
- }
-
- public Claims standard() {
- return Claims.UNKNOWN;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java
index 88e7724..f15a3fe 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java
@@ -21,29 +21,16 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Set;
-/**
- * An implementation of BeanAttributes<Object> that wraps the generic producer BeanAttributes
- * to allow the MPJWTExtension to collect the types of all corresponding injection sites
- */
public class ClaimProviderBeanAttributes implements BeanAttributes<Object> {
- private BeanAttributes<Object> delegate;
- private Set<Type> types;
- private Set<Annotation> qualifiers;
- /**
- * Decorate the ConfigPropertyProducer BeanAttributes to set the types the producer applies to. This set is collected
- * from all injection points annotated with @ConfigProperty.
- *
- * @param delegate - the original producer method BeanAttributes
- * @param types - the full set of @Claim injection point types
- */
- public ClaimProviderBeanAttributes(BeanAttributes<Object> delegate, Set<Type> types, Set<Annotation> qualifiers) {
+ private final BeanAttributes<Object> delegate;
+ private final Set<Type> types;
+ private final Set<Annotation> qualifiers;
+
+ public ClaimProviderBeanAttributes(final BeanAttributes<Object> delegate, final Set<Type> types, final Set<Annotation> qualifiers) {
this.delegate = delegate;
this.types = types;
this.qualifiers = qualifiers;
- if (types.size() == 0) {
- Thread.dumpStack();
- }
}
@Override
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueProducer.java
index 1881401..aeed7c8 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueProducer.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueProducer.java
@@ -22,25 +22,25 @@ import org.eclipse.microprofile.jwt.Claims;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Inject;
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Optional;
-/**
- * A producer for the ClaimValue<T> wrapper injection sites.
- *
- * @param <T> the raw claim type
- */
public class ClaimValueProducer<T> {
+ @Inject
+ private MPJWTProducer producer;
+
@Produces
@Claim("")
- ClaimValue<T> produce(InjectionPoint ip) {
+ ClaimValue<T> produce(final InjectionPoint ip) {
String name = getName(ip);
- ClaimValue<Optional<T>> cv = MPJWTProducer.generalClaimValueProducer(name);
+ ClaimValue<Optional<T>> cv = producer.generalClaimValueProducer(name);
ClaimValue<T> returnValue = (ClaimValue<T>) cv;
Optional<T> value = cv.getValue();
+
// Pull out the ClaimValue<T> T type,
Type matchType = ip.getType();
Type actualType = Object.class;
@@ -62,7 +62,7 @@ public class ClaimValueProducer<T> {
return returnValue;
}
- String getName(InjectionPoint ip) {
+ String getName(final InjectionPoint ip) {
String name = null;
for (Annotation ann : ip.getQualifiers()) {
if (ann instanceof Claim) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueWrapper.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueWrapper.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueWrapper.java
index 6776191..e0aa68f 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueWrapper.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimValueWrapper.java
@@ -18,14 +18,9 @@ package org.apache.tomee.microprofile.jwt.cdi;
import org.eclipse.microprofile.jwt.ClaimValue;
-/**
- * An implementation of the ClaimValue interface
- *
- * @param <T> the claim value type
- */
public class ClaimValueWrapper<T> implements ClaimValue<T> {
- private String name;
+ private final String name;
private T value;
public ClaimValueWrapper(String name) {
@@ -48,7 +43,9 @@ public class ClaimValueWrapper<T> implements ClaimValue<T> {
@Override
public String toString() {
- return String.format("ClaimValueWrapper[@%s], name=%s, value[%s]=%s", Integer.toHexString(hashCode()),
- name, value.getClass(), value);
+ return "ClaimValueWrapper{" +
+ "name='" + name + '\'' +
+ ", value=" + value +
+ '}';
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonValueProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonValueProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonValueProducer.java
index 2f991b2..af15b89 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonValueProducer.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonValueProducer.java
@@ -21,6 +21,7 @@ import org.eclipse.microprofile.jwt.Claims;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Inject;
import javax.json.JsonArray;
import javax.json.JsonNumber;
import javax.json.JsonObject;
@@ -28,77 +29,73 @@ import javax.json.JsonString;
import javax.json.JsonValue;
import java.lang.annotation.Annotation;
import java.util.Optional;
-import java.util.logging.Logger;
-/**
- * A producer for JsonValue injection types
- */
public class JsonValueProducer {
- private static Logger log = Logger.getLogger(JsonValueProducer.class.getName());
+
+ @Inject
+ private MPJWTProducer producer;
@Produces
@Claim("")
- public JsonString getJsonString(InjectionPoint ip) {
+ public JsonString getJsonString(final InjectionPoint ip) {
return getValue(ip);
}
@Produces
@Claim("")
- public Optional<JsonString> getOptionalJsonString(InjectionPoint ip) {
+ public Optional<JsonString> getOptionalJsonString(final InjectionPoint ip) {
return getOptionalValue(ip);
}
@Produces
@Claim("")
- public JsonNumber getJsonNumber(InjectionPoint ip) {
+ public JsonNumber getJsonNumber(final InjectionPoint ip) {
return getValue(ip);
}
@Produces
@Claim("")
- public Optional<JsonNumber> getOptionalJsonNumber(InjectionPoint ip) {
+ public Optional<JsonNumber> getOptionalJsonNumber(final InjectionPoint ip) {
return getOptionalValue(ip);
}
@Produces
@Claim("")
- public JsonArray getJsonArray(InjectionPoint ip) {
+ public JsonArray getJsonArray(final InjectionPoint ip) {
return getValue(ip);
}
@Produces
@Claim("")
- public Optional<JsonArray> getOptionalJsonArray(InjectionPoint ip) {
+ public Optional<JsonArray> getOptionalJsonArray(final InjectionPoint ip) {
return getOptionalValue(ip);
}
@Produces
@Claim("")
- public JsonObject getJsonObject(InjectionPoint ip) {
+ public JsonObject getJsonObject(final InjectionPoint ip) {
return getValue(ip);
}
@Produces
@Claim("")
- public Optional<JsonObject> getOptionalJsonObject(InjectionPoint ip) {
+ public Optional<JsonObject> getOptionalJsonObject(final InjectionPoint ip) {
return getOptionalValue(ip);
}
- public <T extends JsonValue> T getValue(InjectionPoint ip) {
- log.fine(String.format("JsonValueProducer(%s).produce", ip));
+ public <T extends JsonValue> T getValue(final InjectionPoint ip) {
String name = getName(ip);
- T jsonValue = (T) MPJWTProducer.generalJsonValueProducer(name);
+ T jsonValue = (T) producer.generalJsonValueProducer(name);
return jsonValue;
}
- public <T extends JsonValue> Optional<T> getOptionalValue(InjectionPoint ip) {
- log.fine(String.format("JsonValueProducer(%s).produce", ip));
+ public <T extends JsonValue> Optional<T> getOptionalValue(final InjectionPoint ip) {
String name = getName(ip);
- T jsonValue = (T) MPJWTProducer.generalJsonValueProducer(name);
+ T jsonValue = (T) producer.generalJsonValueProducer(name);
return Optional.ofNullable(jsonValue);
}
- String getName(InjectionPoint ip) {
+ String getName(final InjectionPoint ip) {
String name = null;
for (Annotation ann : ip.getQualifiers()) {
if (ann instanceof Claim) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonbProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonbProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonbProducer.java
new file mode 100644
index 0000000..7774cbf
--- /dev/null
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/JsonbProducer.java
@@ -0,0 +1,45 @@
+/*
+ * 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.apache.tomee.microprofile.jwt.cdi;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Produces;
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+@ApplicationScoped
+public class JsonbProducer {
+
+ private static Logger log = Logger.getLogger(MPJWTCDIExtension.class.getName());
+
+ @Produces
+ public Jsonb jsonb() {
+ return JsonbBuilder.create();
+ }
+
+ public void close(@Disposes final Jsonb jsonb) {
+ try {
+ jsonb.close();
+
+ } catch (final Exception e) {
+ log.log(Level.WARNING, e.getMessage(), e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTCDIExtension.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTCDIExtension.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTCDIExtension.java
index 3700494..7375d65 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTCDIExtension.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTCDIExtension.java
@@ -48,20 +48,6 @@ import java.util.Optional;
import java.util.Set;
import java.util.logging.Logger;
-/**
- * A CDI extension that provides a producer for the current authenticated JsonWebToken based on a thread
- * local value that is managed by the {@link JWTAuthMechanism} request
- * authentication handler.
- * <p>
- * This also installs the producer methods for the discovered:
- * <ul>
- * <li>@Claim ClaimValue<T> injection sites.</li>
- * <li>@Claim raw type<T> injection sites.</li>
- * <li>@Claim JsonValue injection sites.</li>
- * </ul>
- *
- * @see JWTAuthMechanism
- */
public class MPJWTCDIExtension implements Extension {
private static Logger log = Logger.getLogger(MPJWTCDIExtension.class.getName());
/**
@@ -83,6 +69,7 @@ public class MPJWTCDIExtension implements Extension {
public void observeBeforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd, BeanManager beanManager) {
log.fine("MPJWTExtension(), added JWTPrincipalProducer");
bbd.addAnnotatedType(beanManager.createAnnotatedType(TCKTokenParser.class));
+ bbd.addAnnotatedType(beanManager.createAnnotatedType(JsonbProducer.class));
bbd.addAnnotatedType(beanManager.createAnnotatedType(MPJWTFilter.class));
bbd.addAnnotatedType(beanManager.createAnnotatedType(MPJWTInitializer.class));
bbd.addAnnotatedType(beanManager.createAnnotatedType(JWTAuthContextInfoProvider.class));
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTProducer.java
index 42cc8ac..16876fb 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTProducer.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/MPJWTProducer.java
@@ -19,33 +19,26 @@ package org.apache.tomee.microprofile.jwt.cdi;
import org.eclipse.microprofile.jwt.ClaimValue;
import org.eclipse.microprofile.jwt.JsonWebToken;
-import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.context.Destroyed;
-import javax.enterprise.context.Initialized;
import javax.enterprise.context.RequestScoped;
-import javax.enterprise.event.Observes;
import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
import javax.json.Json;
-import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
-import javax.json.JsonObjectBuilder;
import javax.json.JsonValue;
+import javax.json.bind.Jsonb;
import java.util.Collection;
-import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.logging.Logger;
-/**
- * A class that tracks the current validated MP-JWT and associated JsonWebToken via a thread
- * local to provide a @RequestScoped JsonWebToken producer method.
- * <p>
- * It also provides utility methods for access the current JsonWebToken claim values.
- */
@ApplicationScoped
public class MPJWTProducer {
+
+ @Inject
+ private Jsonb jsonb;
+
private static final String TMP = "tmp";
private static Logger log = Logger.getLogger(MPJWTProducer.class.getName());
private static ThreadLocal<JsonWebToken> currentPrincipal = new ThreadLocal<>();
@@ -58,14 +51,7 @@ public class MPJWTProducer {
return currentPrincipal.get();
}
- /**
- * A utility method for accessing a claim from the current JsonWebToken as a ClaimValue<Optional<T>> object.
- *
- * @param name - name of the claim
- * @param <T> expected actual type of the claim
- * @return the claim value wrapper object
- */
- static <T> ClaimValue<Optional<T>> generalClaimValueProducer(String name) {
+ <T> ClaimValue<Optional<T>> generalClaimValueProducer(String name) {
ClaimValueWrapper<Optional<T>> wrapper = new ClaimValueWrapper<>(name);
T value = getValue(name, false);
Optional<T> optValue = Optional.ofNullable(value);
@@ -73,19 +59,13 @@ public class MPJWTProducer {
return wrapper;
}
- /**
- * Return the indicated claim value as a JsonValue
- *
- * @param name - name of the claim
- * @return a JsonValue wrapper
- */
- static JsonValue generalJsonValueProducer(String name) {
+ JsonValue generalJsonValueProducer(String name) {
Object value = getValue(name, false);
JsonValue jsonValue = wrapValue(value);
return jsonValue;
}
- public static <T> T getValue(String name, boolean isOptional) {
+ public <T> T getValue(String name, boolean isOptional) {
JsonWebToken jwt = getJWTPrincpal();
if (jwt == null) {
log.fine(String.format("getValue(%s), null JsonWebToken", name));
@@ -100,33 +80,11 @@ public class MPJWTProducer {
return claimValue.orElse(null);
}
- static JsonObject replaceMap(Map<String, Object> map) {
- JsonObjectBuilder builder = Json.createObjectBuilder();
- for (Map.Entry<String, Object> entry : map.entrySet()) {
- Object entryValue = entry.getValue();
- if (entryValue instanceof Map) {
- JsonObject entryJsonObject = replaceMap((Map<String, Object>) entryValue);
- builder.add(entry.getKey(), entryJsonObject);
- } else if (entryValue instanceof List) {
- JsonArray array = (JsonArray) wrapValue(entryValue);
- builder.add(entry.getKey(), array);
- } else if (entryValue instanceof Long || entryValue instanceof Integer) {
- long lvalue = ((Number) entryValue).longValue();
- builder.add(entry.getKey(), lvalue);
- } else if (entryValue instanceof Double || entryValue instanceof Float) {
- double dvalue = ((Number) entryValue).doubleValue();
- builder.add(entry.getKey(), dvalue);
- } else if (entryValue instanceof Boolean) {
- boolean flag = ((Boolean) entryValue).booleanValue();
- builder.add(entry.getKey(), flag);
- } else if (entryValue instanceof String) {
- builder.add(entry.getKey(), entryValue.toString());
- }
- }
- return builder.build();
+ JsonObject replaceMap(final Map<String, Object> map) {
+ return jsonb.fromJson(jsonb.toJson(map), JsonObject.class);
}
- static JsonValue wrapValue(Object value) {
+ JsonValue wrapValue(Object value) {
JsonValue jsonValue = null;
if (value instanceof JsonValue) {
// This may already be a JsonValue
@@ -170,27 +128,9 @@ public class MPJWTProducer {
return jsonValue;
}
- @PostConstruct
- void init() {
- log.fine("MPJWTProducer initialized");
- }
-
- void observeRequestInitialized(@Observes @Initialized(RequestScoped.class) Object event) {
- log.finest(String.format("observeRequestInitialized, event=%s", event));
- }
-
- void observeRequestDestroyed(@Observes @Destroyed(RequestScoped.class) Object event) {
- log.finest(String.format("observeRequestDestroyed, event=%s", event));
- }
-
- /**
- * The @RequestScoped producer method for the current JsonWebToken
- *
- * @return
- */
@Produces
@RequestScoped
- JsonWebToken currentPrincipalOrNull() {
+ JsonWebToken currentPrincipal() {
return currentPrincipal.get();
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/RawClaimTypeProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/RawClaimTypeProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/RawClaimTypeProducer.java
index 1ab817e..55b6324 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/RawClaimTypeProducer.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/RawClaimTypeProducer.java
@@ -22,24 +22,22 @@ import org.eclipse.microprofile.jwt.Claims;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Inject;
import javax.inject.Named;
import java.lang.annotation.Annotation;
import java.util.Optional;
-import java.util.logging.Logger;
-/**
- *
- */
public class RawClaimTypeProducer {
- private static Logger log = Logger.getLogger(RawClaimTypeProducer.class.getName());
+
+ @Inject
+ private MPJWTProducer producer;
@Produces
@Claim("")
@Named("RawClaimTypeProducer#getValue")
- public Object getValue(InjectionPoint ip) {
- log.fine(String.format("getValue(%s)", ip));
+ public Object getValue(final InjectionPoint ip) {
String name = getName(ip);
- ClaimValue<Optional<Object>> cv = MPJWTProducer.generalClaimValueProducer(name);
+ ClaimValue<Optional<Object>> cv = producer.generalClaimValueProducer(name);
Optional<Object> value = cv.getValue();
Object returnValue = value.orElse(null);
return returnValue;
@@ -48,15 +46,14 @@ public class RawClaimTypeProducer {
@Produces
@Claim("")
@Named("RawClaimTypeProducer#getOptionalValue")
- public Optional getOptionalValue(InjectionPoint ip) {
- log.fine(String.format("getOptionalValue(%s)", ip));
+ public Optional getOptionalValue(final InjectionPoint ip) {
String name = getName(ip);
- ClaimValue<Optional<Object>> cv = MPJWTProducer.generalClaimValueProducer(name);
+ ClaimValue<Optional<Object>> cv = producer.generalClaimValueProducer(name);
Optional<Object> value = cv.getValue();
return value;
}
- String getName(InjectionPoint ip) {
+ String getName(final InjectionPoint ip) {
String name = null;
for (Annotation ann : ip.getQualifiers()) {
if (ann instanceof Claim) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/config/JWTAuthContextInfoProvider.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/config/JWTAuthContextInfoProvider.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/config/JWTAuthContextInfoProvider.java
index b810fcf..9247e04 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/config/JWTAuthContextInfoProvider.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/config/JWTAuthContextInfoProvider.java
@@ -16,46 +16,46 @@
*/
package org.apache.tomee.microprofile.jwt.config;
-import org.apache.tomee.microprofile.jwt.KeyUtils;
-
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Produces;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
import java.util.Optional;
@Dependent
public class JWTAuthContextInfoProvider {
@Produces
- Optional<JWTAuthContextInfo> getOptionalContextInfo() {
+ Optional<JWTAuthContextInfo> getOptionalContextInfo() throws NoSuchAlgorithmException, InvalidKeySpecException {
JWTAuthContextInfo contextInfo = new JWTAuthContextInfo();
// todo use MP Config to load the configuration
contextInfo.setIssuedBy("https://server.example.com");
- RSAPublicKey pk = null;
- try {
- pk = (RSAPublicKey) KeyUtils.decodePublicKey("-----BEGIN RSA PUBLIC KEY-----\n" +
- "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEq\n" +
- "Fyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwR\n" +
- "TYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5e\n" +
- "UF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9\n" +
- "AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYn\n" +
- "sIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9x\n" +
- "nQIDAQAB\n" +
- "-----END RSA PUBLIC KEY-----\n");
-
- } catch (final Exception e) {
- e.printStackTrace();
- // todo better handling
- throw new RuntimeException(e);
- }
+
+ final String pemEncoded = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEq" +
+ "Fyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwR" +
+ "TYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5e" +
+ "UF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9" +
+ "AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYn" +
+ "sIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9x" +
+ "nQIDAQAB";
+ byte[] encodedBytes = Base64.getDecoder().decode(pemEncoded);
+
+ final X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedBytes);
+ final KeyFactory kf = KeyFactory.getInstance("RSA");
+ final RSAPublicKey pk = (RSAPublicKey) kf.generatePublic(spec);
+
contextInfo.setSignerKey(pk);
return Optional.of(contextInfo);
}
@Produces
- JWTAuthContextInfo getContextInfo() {
+ JWTAuthContextInfo getContextInfo() throws InvalidKeySpecException, NoSuchAlgorithmException {
return getOptionalContextInfo().get();
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/principal/DefaultJWTCallerPrincipal.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/principal/DefaultJWTCallerPrincipal.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/principal/DefaultJWTCallerPrincipal.java
index 120058d..47c6ad3 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/principal/DefaultJWTCallerPrincipal.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/principal/DefaultJWTCallerPrincipal.java
@@ -53,7 +53,7 @@ public class DefaultJWTCallerPrincipal extends JWTCallerPrincipal {
* @param jwt - the parsed JWT token representation
* @param name - the extracted unqiue name to use as the principal name; from "upn", "preferred_username" or "sub" claim
*/
- public DefaultJWTCallerPrincipal(String jwt, String type, JwtClaims claimsSet, String name) {
+ public DefaultJWTCallerPrincipal(final String jwt, final String type, final JwtClaims claimsSet, final String name) {
super(name);
this.jwt = jwt;
this.type = type;
@@ -100,7 +100,7 @@ public class DefaultJWTCallerPrincipal extends JWTCallerPrincipal {
}
@Override
- public Object getClaim(String claimName) {
+ public Object getClaim(final String claimName) {
Claims claimType = Claims.UNKNOWN;
Object claim = null;
try {
@@ -138,7 +138,7 @@ public class DefaultJWTCallerPrincipal extends JWTCallerPrincipal {
}
@Override
- public boolean implies(Subject subject) {
+ public boolean implies(final Subject subject) {
return false;
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/1ad96bbd/tck/mp-jwt-embedded/src/test/resources/dev.xml
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/test/resources/dev.xml b/tck/mp-jwt-embedded/src/test/resources/dev.xml
index f6c4fbd..88932f9 100644
--- a/tck/mp-jwt-embedded/src/test/resources/dev.xml
+++ b/tck/mp-jwt-embedded/src/test/resources/dev.xml
@@ -76,9 +76,13 @@
</run>
</groups>
<classes>
+ <!-- OK
+ -->
<class name="org.eclipse.microprofile.jwt.tck.container.ejb.EjbTest" />
- <class name="org.eclipse.microprofile.jwt.tck.container.jacc.SubjectTest" />
<class name="org.eclipse.microprofile.jwt.tck.container.servlet.ServletTest" />
+ <class name="org.eclipse.microprofile.jwt.tck.container.jacc.SubjectTest" />
+ <!-- KO
+ -->
</classes>
</test>