You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2017/02/03 10:40:56 UTC

cxf-fediz git commit: FEDIZ-188 - Make "Reply" a CallbackType in the Fediz plugin configuration

Repository: cxf-fediz
Updated Branches:
  refs/heads/master 620b6b95b -> bf99b6245


FEDIZ-188 - Make "Reply" a CallbackType in the Fediz plugin configuration


Project: http://git-wip-us.apache.org/repos/asf/cxf-fediz/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf-fediz/commit/bf99b624
Tree: http://git-wip-us.apache.org/repos/asf/cxf-fediz/tree/bf99b624
Diff: http://git-wip-us.apache.org/repos/asf/cxf-fediz/diff/bf99b624

Branch: refs/heads/master
Commit: bf99b62458350e2523c480b4954b045d7804a446
Parents: 620b6b9
Author: Colm O hEigeartaigh <co...@apache.org>
Authored: Fri Feb 3 10:40:33 2017 +0000
Committer: Colm O hEigeartaigh <co...@apache.org>
Committed: Fri Feb 3 10:40:33 2017 +0000

----------------------------------------------------------------------
 .../fediz/core/config/FederationProtocol.java   | 22 +++++++++--
 .../core/processor/FederationProcessorImpl.java | 22 ++++++++++-
 .../cxf/fediz/core/spi/ReplyCallback.java       | 40 ++++++++++++++++++++
 .../src/main/resources/schemas/FedizConfig.xsd  |  3 +-
 .../fediz/core/config/CallbackHandlerTest.java  | 18 ++++++++-
 .../core/config/FedizConfigurationTest.java     |  4 +-
 .../config/FedizConfigurationWriterTest.java    |  4 +-
 .../fediz/core/config/TestCallbackHandler.java  |  5 +++
 .../core/federation/RequestedClaimsTest.java    |  4 +-
 9 files changed, 111 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/main/java/org/apache/cxf/fediz/core/config/FederationProtocol.java
----------------------------------------------------------------------
diff --git a/plugins/core/src/main/java/org/apache/cxf/fediz/core/config/FederationProtocol.java b/plugins/core/src/main/java/org/apache/cxf/fediz/core/config/FederationProtocol.java
index 6b37505..f6f096a 100644
--- a/plugins/core/src/main/java/org/apache/cxf/fediz/core/config/FederationProtocol.java
+++ b/plugins/core/src/main/java/org/apache/cxf/fediz/core/config/FederationProtocol.java
@@ -37,6 +37,7 @@ public class FederationProtocol extends Protocol {
     private Object homeRealm;
     private Object freshness;
     private Object signInQuery;
+    private Object reply;
     
     public FederationProtocol(ProtocolType protocolType) {
         super(protocolType);
@@ -161,12 +162,25 @@ public class FederationProtocol extends Protocol {
         }
     }
 
-    public String getReply() {
-        return getFederationProtocol().getReply();
+    public Object getReply() {
+        if (this.reply != null) {
+            return this.reply;
+        }
+        CallbackType cbt = getFederationProtocol().getRequest();
+        this.reply = loadCallbackType(cbt, "Reply");
+        return this.reply;
     }
 
-    public void setReply(String value) {
-        getFederationProtocol().setReply(value);
+    public void setReply(Object value) {
+        final boolean isString = value instanceof String;
+        final boolean isCallbackHandler = value instanceof CallbackHandler;
+        if (isString || isCallbackHandler) {
+            this.reply = value;
+        } else {
+            LOG.error("Unsupported 'Reply' object");
+            throw new IllegalArgumentException("Unsupported 'Reply' object. Type must be "
+                                               + "java.lang.String or javax.security.auth.callback.CallbackHandler.");
+        }
     }
 
     public String getVersion() {

http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/main/java/org/apache/cxf/fediz/core/processor/FederationProcessorImpl.java
----------------------------------------------------------------------
diff --git a/plugins/core/src/main/java/org/apache/cxf/fediz/core/processor/FederationProcessorImpl.java b/plugins/core/src/main/java/org/apache/cxf/fediz/core/processor/FederationProcessorImpl.java
index 5cb626e..aecee13 100644
--- a/plugins/core/src/main/java/org/apache/cxf/fediz/core/processor/FederationProcessorImpl.java
+++ b/plugins/core/src/main/java/org/apache/cxf/fediz/core/processor/FederationProcessorImpl.java
@@ -57,6 +57,7 @@ import org.apache.cxf.fediz.core.exception.ProcessingException.TYPE;
 import org.apache.cxf.fediz.core.metadata.MetadataWriter;
 import org.apache.cxf.fediz.core.spi.FreshnessCallback;
 import org.apache.cxf.fediz.core.spi.HomeRealmCallback;
+import org.apache.cxf.fediz.core.spi.ReplyCallback;
 import org.apache.cxf.fediz.core.spi.SignInQueryCallback;
 import org.apache.cxf.fediz.core.spi.WAuthCallback;
 import org.apache.cxf.fediz.core.spi.WReqCallback;
@@ -400,7 +401,7 @@ public class FederationProcessorImpl extends AbstractFedizProcessor {
             StringBuilder sb = new StringBuilder();
             sb.append(FederationConstants.PARAM_ACTION).append('=').append(FederationConstants.ACTION_SIGNIN);
 
-            String reply = ((FederationProtocol)config.getProtocol()).getReply();
+            String reply = resolveReply(request, config);
             if (reply == null || reply.length() == 0) {
                 reply = request.getRequestURL().toString();
             } else {
@@ -680,6 +681,25 @@ public class FederationProcessorImpl extends AbstractFedizProcessor {
         return wReq;
     }
     
+    private String resolveReply(HttpServletRequest request, FedizContext config) throws IOException,
+        UnsupportedCallbackException {
+        Object replyObj = ((FederationProtocol)config.getProtocol()).getReply();
+        String reply = null;
+        if (replyObj != null) {
+            if (replyObj instanceof String) {
+                reply = (String)replyObj;
+            } else if (replyObj instanceof CallbackHandler) {
+                CallbackHandler replyCB = (CallbackHandler)replyObj;
+                ReplyCallback callback = new ReplyCallback(request);
+                replyCB.handle(new Callback[] {
+                    callback
+                });
+                reply = callback.getReply();
+            }
+        }
+        return reply;
+    }
+    
     private void testForMandatoryClaims(String roleURI,
                                         List<org.apache.cxf.fediz.core.config.Claim> requestedClaims, 
                                         List<org.apache.cxf.fediz.core.Claim> receivedClaims,

http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/main/java/org/apache/cxf/fediz/core/spi/ReplyCallback.java
----------------------------------------------------------------------
diff --git a/plugins/core/src/main/java/org/apache/cxf/fediz/core/spi/ReplyCallback.java b/plugins/core/src/main/java/org/apache/cxf/fediz/core/spi/ReplyCallback.java
new file mode 100644
index 0000000..90dba1f
--- /dev/null
+++ b/plugins/core/src/main/java/org/apache/cxf/fediz/core/spi/ReplyCallback.java
@@ -0,0 +1,40 @@
+/**
+ * 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.cxf.fediz.core.spi;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class ReplyCallback extends AbstractServletCallback {
+
+    private String reply;
+
+    public ReplyCallback(HttpServletRequest request) {
+        super(request);
+    }
+
+    public String getReply() {
+        return reply;
+    }
+
+    public void setReply(String reply) {
+        this.reply = reply;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/main/resources/schemas/FedizConfig.xsd
----------------------------------------------------------------------
diff --git a/plugins/core/src/main/resources/schemas/FedizConfig.xsd b/plugins/core/src/main/resources/schemas/FedizConfig.xsd
index 47b3a98..879e08d 100644
--- a/plugins/core/src/main/resources/schemas/FedizConfig.xsd
+++ b/plugins/core/src/main/resources/schemas/FedizConfig.xsd
@@ -225,6 +225,7 @@
     <xs:element name="request" type="CallbackType" />
     <xs:element name="freshness" type="CallbackType" />
     <xs:element name="signInQuery" type="CallbackType" />
+    <xs:element name="reply" type="CallbackType" />
 
     <xs:simpleType name="argumentType">
         <xs:restriction base="xs:string">
@@ -233,8 +234,6 @@
         </xs:restriction>
     </xs:simpleType>
 
-    <xs:element name="reply" type="xs:string" />
-
     <xs:element name="claimTypesRequested">
         <xs:complexType>
             <xs:sequence minOccurs="1" maxOccurs="unbounded">

http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/CallbackHandlerTest.java
----------------------------------------------------------------------
diff --git a/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/CallbackHandlerTest.java b/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/CallbackHandlerTest.java
index 23b565b..1699691 100644
--- a/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/CallbackHandlerTest.java
+++ b/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/CallbackHandlerTest.java
@@ -49,6 +49,7 @@ import org.apache.cxf.fediz.core.config.jaxb.ValidationType;
 import org.apache.cxf.fediz.core.spi.HomeRealmCallback;
 import org.apache.cxf.fediz.core.spi.IDPCallback;
 import org.apache.cxf.fediz.core.spi.RealmCallback;
+import org.apache.cxf.fediz.core.spi.ReplyCallback;
 import org.apache.cxf.fediz.core.spi.SignInQueryCallback;
 import org.apache.cxf.fediz.core.spi.WAuthCallback;
 import org.apache.cxf.fediz.core.spi.WReqCallback;
@@ -125,7 +126,9 @@ public class CallbackHandlerTest {
             realm.setValue(TARGET_REALM);
             protocol.setRealm(freshness);
             
-            ((FederationProtocolType)protocol).setReply(REPLY);
+            CallbackType reply = new CallbackType();
+            reply.setValue(REPLY);
+            ((FederationProtocolType)protocol).setReply(reply);
             ((FederationProtocolType)protocol).setVersion(PROTOCOL_VERSION);
         } else {
             protocol = new SamlProtocolType();
@@ -215,6 +218,11 @@ public class CallbackHandlerTest {
             signInQueryType.setType(ArgumentType.CLASS);
             signInQueryType.setValue(CALLBACKHANDLER_CLASS);
             ((FederationProtocolType)protocol).setSignInQuery(signInQueryType);
+            
+            CallbackType replyType = new CallbackType();
+            replyType.setType(ArgumentType.CLASS);
+            replyType.setValue(CALLBACKHANDLER_CLASS);
+            ((FederationProtocolType)protocol).setReply(replyType);
         }
         
         return config;
@@ -286,6 +294,14 @@ public class CallbackHandlerTest {
         Assert.assertEquals("myid", signinQueryMap.get("pubid"));
         Assert.assertEquals("<=>", signinQueryMap.get("testenc"));
         
+        Object replyObj = fp.getReply();
+        Assert.assertTrue(replyObj instanceof CallbackHandler);
+        CallbackHandler replyCB = (CallbackHandler)replyObj;
+        ReplyCallback callbackReply = new ReplyCallback(null);
+        replyCB.handle(new Callback[] {callbackReply});
+        String reply = callbackReply.getReply();
+        Assert.assertEquals(TestCallbackHandler.TEST_REPLY, reply);
+        
     }
     
     @org.junit.Test

http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationTest.java
----------------------------------------------------------------------
diff --git a/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationTest.java b/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationTest.java
index f2b0381..7d05960 100644
--- a/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationTest.java
+++ b/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationTest.java
@@ -174,7 +174,9 @@ public class FedizConfigurationTest {
             homeRealm.setValue(HOME_REALM_CLASS);
             ((FederationProtocolType)protocol).setHomeRealm(homeRealm);
             
-            ((FederationProtocolType)protocol).setReply(REPLY);
+            CallbackType reply = new CallbackType();
+            reply.setValue(REPLY);
+            ((FederationProtocolType)protocol).setReply(reply);
             ((FederationProtocolType)protocol).setVersion(PROTOCOL_VERSION);
         } else {
             protocol = new SamlProtocolType();

http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationWriterTest.java
----------------------------------------------------------------------
diff --git a/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationWriterTest.java b/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationWriterTest.java
index e396398..4b60206 100644
--- a/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationWriterTest.java
+++ b/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/FedizConfigurationWriterTest.java
@@ -167,7 +167,9 @@ public class FedizConfigurationWriterTest {
             homeRealm.setValue(HOME_REALM_CLASS);
             ((FederationProtocolType)protocol).setHomeRealm(homeRealm);
             
-            ((FederationProtocolType)protocol).setReply(REPLY);
+            CallbackType reply = new CallbackType();
+            reply.setValue(REPLY);
+            ((FederationProtocolType)protocol).setReply(reply);
             ((FederationProtocolType)protocol).setVersion(PROTOCOL_VERSION);
         } else {
             protocol = new SamlProtocolType();

http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/TestCallbackHandler.java
----------------------------------------------------------------------
diff --git a/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/TestCallbackHandler.java b/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/TestCallbackHandler.java
index 5c73d00..4302c32 100644
--- a/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/TestCallbackHandler.java
+++ b/plugins/core/src/test/java/org/apache/cxf/fediz/core/config/TestCallbackHandler.java
@@ -31,6 +31,7 @@ import javax.security.auth.callback.UnsupportedCallbackException;
 import org.apache.cxf.fediz.core.spi.HomeRealmCallback;
 import org.apache.cxf.fediz.core.spi.IDPCallback;
 import org.apache.cxf.fediz.core.spi.RealmCallback;
+import org.apache.cxf.fediz.core.spi.ReplyCallback;
 import org.apache.cxf.fediz.core.spi.SignInQueryCallback;
 import org.apache.cxf.fediz.core.spi.WAuthCallback;
 import org.apache.cxf.fediz.core.spi.WReqCallback;
@@ -42,6 +43,7 @@ public class TestCallbackHandler implements CallbackHandler {
     static final String TEST_IDP = "http://rp.example.com/";
     static final String TEST_WAUTH = "up";
     static final String TEST_SIGNIN_QUERY = "pubid=myid";
+    static final String TEST_REPLY = "http://apache.org/reply";
     static final String TEST_WREQ = 
         "<RequestSecurityToken xmlns=\"http://docs.oasis-open.org/ws-sx/ws-trust/200512\">"
         + "<TokenType>http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1</TokenType>"
@@ -70,6 +72,9 @@ public class TestCallbackHandler implements CallbackHandler {
                 queryParamMap.put("pubid", "myid");
                 queryParamMap.put("testenc", "<=>");
                 callback.setSignInQueryParamMap(queryParamMap);
+            } else if (callbacks[i] instanceof ReplyCallback) {
+                ReplyCallback callback = (ReplyCallback) callbacks[i];
+                callback.setReply(TEST_REPLY);
             } else {
                 throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");
             }

http://git-wip-us.apache.org/repos/asf/cxf-fediz/blob/bf99b624/plugins/core/src/test/java/org/apache/cxf/fediz/core/federation/RequestedClaimsTest.java
----------------------------------------------------------------------
diff --git a/plugins/core/src/test/java/org/apache/cxf/fediz/core/federation/RequestedClaimsTest.java b/plugins/core/src/test/java/org/apache/cxf/fediz/core/federation/RequestedClaimsTest.java
index 2a2ba45..ef01936 100644
--- a/plugins/core/src/test/java/org/apache/cxf/fediz/core/federation/RequestedClaimsTest.java
+++ b/plugins/core/src/test/java/org/apache/cxf/fediz/core/federation/RequestedClaimsTest.java
@@ -168,7 +168,9 @@ public class RequestedClaimsTest {
         homeRealm.setValue(HOME_REALM_CLASS);
         ((FederationProtocolType)protocol).setHomeRealm(homeRealm);
 
-        ((FederationProtocolType)protocol).setReply(REPLY);
+        CallbackType reply = new CallbackType();
+        reply.setValue(REPLY);
+        ((FederationProtocolType)protocol).setReply(reply);
         ((FederationProtocolType)protocol).setVersion(PROTOCOL_VERSION);
         
         config.setProtocol(protocol);