Author: kwall
Date: Mon Feb 15 16:48:12 2016
New Revision: 1730565

URL: http://svn.apache.org/viewvc?rev=1730565&view=rev
Log:
QPID-7028, QPID-7029, QPID-7030, QPID-7031, QPID-7045: [Java Broker/Java 
Client] Add OAUTH2 authentication support for management and messaging
QPID-7055: Improve GroupProvider API

svn merge -c 
1729215,1729406,1729408,1729412,1729515,1729656,1729657,1729783,1730019,1730025,1730052,1730559
 ^/qpid/java/trunk

Added:
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/
      - copied from r1729215, 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java
      - copied, changed from r1729412, 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/facebook/
      - copied from r1729406, 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/facebook/
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/github/
      - copied from r1729406, 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/github/
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/microsoftlive/
      - copied from r1729515, 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/microsoftlive/
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/util/ConnectionBuilder.java
      - copied unchanged from r1729656, 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/util/ConnectionBuilder.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/util/ParameterizedTypes.java
      - copied unchanged from r1729783, 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/util/ParameterizedTypes.java
    
qpid/java/branches/6.0.x/broker-core/src/test/java/org/apache/qpid/server/security/auth/manager/oauth2/
      - copied from r1729215, 
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/auth/manager/oauth2/
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/auth/OAuth2InteractiveAuthenticator.java
      - copied, changed from r1729215, 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/auth/OAuth2InteractiveAuthenticator.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/auth/OAuth2PreemptiveAuthenticator.java
      - copied, changed from r1729215, 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/auth/OAuth2PreemptiveAuthenticator.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/resources/logout.html
      - copied unchanged from r1730052, 
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logout.html
    
qpid/java/branches/6.0.x/client/src/main/java/org/apache/qpid/client/security/oauth2/
      - copied from r1729215, 
qpid/java/trunk/client/src/main/java/org/apache/qpid/client/security/oauth2/
    
qpid/java/branches/6.0.x/client/src/test/java/org/apache/qpid/client/security/oauth2/
      - copied from r1729215, 
qpid/java/trunk/client/src/test/java/org/apache/qpid/client/security/oauth2/
Removed:
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2IdentityResolverServiceFactory.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverServiceFactory.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/google/GoogleOAuth2IdentityResolverServiceFactory.java
Modified:
    qpid/java/branches/6.0.x/   (props changed)
    
qpid/java/branches/6.0.x/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/connection/ConnectionVersionValidator.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SubjectCreator.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProvider.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2IdentityResolverService.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2Utils.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/facebook/FacebookIdentityResolverService.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/github/GitHubOAuth2IdentityResolverService.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/google/GoogleOAuth2IdentityResolverService.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/google/package-info.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/microsoftlive/MicrosoftLiveOAuth2IdentityResolverService.java
    
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
    
qpid/java/branches/6.0.x/broker-core/src/test/java/org/apache/qpid/server/security/SubjectCreatorTest.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpRequestInteractiveAuthenticator.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/auth/AnonymousPreemptiveAuthenticator.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/auth/BasicAuthPreemptiveAuthenticator.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/auth/UsernamePasswordInteractiveLogin.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogoutServlet.java
    
qpid/java/branches/6.0.x/broker-plugins/management-http/src/main/java/resources/index.html
    
qpid/java/branches/6.0.x/client/src/main/java/org/apache/qpid/client/security/CallbackHandlerRegistry.properties
    
qpid/java/branches/6.0.x/client/src/main/java/org/apache/qpid/client/security/DynamicSaslRegistrar.properties
    
qpid/java/branches/6.0.x/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java

Propchange: qpid/java/branches/6.0.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Feb 15 16:48:12 2016
@@ -9,5 +9,5 @@
 /qpid/branches/java-broker-vhost-refactor/java:1493674-1494547
 /qpid/branches/java-network-refactor/qpid/java:805429-821809
 /qpid/branches/qpid-2935/qpid/java:1061302-1072333
-/qpid/java/trunk:1715445-1715447,1715586,1715940,1716086-1716087,1716127-1716128,1716141,1716153,1716155,1716194,1716204,1716209,1716227,1716277,1716357,1716368,1716370,1716374,1716432,1716444-1716445,1716455,1716461,1716474,1716489,1716497,1716515,1716555,1716602,1716606-1716610,1716619,1716636,1717269,1717299,1717401,1717446,1717449,1717626,1717691,1717735,1717780,1718744,1718889,1718893,1718918,1718922,1719026,1719028,1719033,1719037,1719047,1719051,1720340,1720664,1721151,1721198,1722019-1722020,1722246,1722339,1722416,1722674,1722678,1722683,1722711,1723064,1723194,1723563,1724216,1724251,1724257,1724292,1724375,1724397,1724432,1724582,1724603,1724780,1724843-1724844,1725295,1725569,1725760,1726176,1726244-1726246,1726249,1726358,1726436,1726449,1726456,1726646,1726653,1726755,1726778,1727532,1727555,1727608,1727951,1728089,1728167,1728302,1728497,1728524,1728639,1728772,1729297,1729347,1729356,1729638,1729828,1729832,1729841,1729851,1729904,1729973,1730072,1730494,1730499
+/qpid/java/trunk:1715445-1715447,1715586,1715940,1716086-1716087,1716127-1716128,1716141,1716153,1716155,1716194,1716204,1716209,1716227,1716277,1716357,1716368,1716370,1716374,1716432,1716444-1716445,1716455,1716461,1716474,1716489,1716497,1716515,1716555,1716602,1716606-1716610,1716619,1716636,1717269,1717299,1717401,1717446,1717449,1717626,1717691,1717735,1717780,1718744,1718889,1718893,1718918,1718922,1719026,1719028,1719033,1719037,1719047,1719051,1720340,1720664,1721151,1721198,1722019-1722020,1722246,1722339,1722416,1722674,1722678,1722683,1722711,1723064,1723194,1723563,1724216,1724251,1724257,1724292,1724375,1724397,1724432,1724582,1724603,1724780,1724843-1724844,1725295,1725569,1725760,1726176,1726244-1726246,1726249,1726358,1726436,1726449,1726456,1726646,1726653,1726755,1726778,1727532,1727555,1727608,1727951,1728089,1728167,1728302,1728497,1728524,1728639,1728772,1729215,1729297,1729347,1729356,1729406,1729408,1729412,1729515,1729638,1729656-1729657,1729783,1729828,1729
 
832,1729841,1729851,1729904,1729973,1730019,1730025,1730052,1730072,1730494,1730499,1730559
 /qpid/trunk/qpid:796646-796653

Modified: 
qpid/java/branches/6.0.x/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/AttributeAnnotationValidator.java
 Mon Feb 15 16:48:12 2016
@@ -317,6 +317,10 @@ public class AttributeAnnotationValidato
             return true;
         }
 
+        
if(typeUtils.isSameType(type,elementUtils.getTypeElement("java.net.URI").asType()))
+        {
+            return true;
+        }
 
         
if(typeUtils.isSameType(type,elementUtils.getTypeElement("java.security.cert.Certificate").asType()))
         {

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/connection/ConnectionVersionValidator.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/connection/ConnectionVersionValidator.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/connection/ConnectionVersionValidator.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/connection/ConnectionVersionValidator.java
 Mon Feb 15 16:48:12 2016
@@ -20,8 +20,6 @@
  */
 package org.apache.qpid.server.connection;
 
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -35,6 +33,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.logging.messages.ConnectionMessages;
+import org.apache.qpid.server.util.ParameterizedTypes;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.plugin.ConnectionValidator;
 import org.apache.qpid.server.plugin.PluggableService;
@@ -128,28 +127,8 @@ public class ConnectionVersionValidator
         if (virtualHost.getContextKeys(false).contains(variableName))
         {
             return (List<String>) virtualHost.getContextValue(List.class,
-                                                              new 
ParameterizedType()
-                                                              {
-                                                                  @Override
-                                                                  public 
Type[] getActualTypeArguments()
-                                                                  {
-                                                                      return 
new Type[]{String.class};
-                                                                  }
-
-                                                                  @Override
-                                                                  public Type 
getRawType()
-                                                                  {
-                                                                      return 
List.class;
-                                                                  }
-
-                                                                  @Override
-                                                                  public Type 
getOwnerType()
-                                                                  {
-                                                                      return 
null;
-                                                                  }
-                                                              },
-                                                              variableName
-                                                             );
+                                                              
ParameterizedTypes.LIST_OF_STRINGS,
+                                                              variableName);
         }
         else
         {

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
 Mon Feb 15 16:48:12 2016
@@ -1084,6 +1084,13 @@ public abstract class AbstractConfigured
                                                                 + 
autoAttr.validValues());
                     }
                 }
+                if(autoAttr.isMandatory() && autoAttr.getValue(this) == null)
+                {
+                    throw new IllegalConfigurationException("Attribute '" + 
autoAttr.getName()
+                                                            + "' instance of 
"+ getClass().getName()
+                                                            + " named '" + 
getName() + "'"
+                                                            + " cannot be 
null, as it is mandatory");
+                }
 
             }
         }
@@ -2550,6 +2557,13 @@ public abstract class AbstractConfigured
                     }
                 }
 
+                if(autoAttr.isMandatory() && 
autoAttr.getValue(proxyForValidation) == null)
+                {
+                    throw new IllegalConfigurationException("Attribute '" + 
autoAttr.getName()
+                                                            + "' instance of 
"+ getClass().getName()
+                                                            + " named '" + 
getName() + "'"
+                                                            + " cannot be 
null, as it is mandatory");
+                }
 
             }
 

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
 Mon Feb 15 16:48:12 2016
@@ -29,6 +29,7 @@ import java.lang.reflect.ParameterizedTy
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
+import java.net.URI;
 import java.nio.charset.StandardCharsets;
 import java.security.cert.Certificate;
 import java.security.cert.CertificateException;
@@ -105,6 +106,30 @@ abstract class AttributeValueConverter<T
         }
     };
 
+    static final AttributeValueConverter<URI> URI_CONVERTER = new 
AttributeValueConverter<URI>()
+    {
+        @Override
+        URI convert(final Object value, final ConfiguredObject object)
+        {
+            if(value instanceof URI)
+            {
+                return (URI) value;
+            }
+            else if(value instanceof String)
+            {
+                return URI.create(AbstractConfiguredObject.interpolate(object, 
(String) value));
+            }
+            else if(value == null)
+            {
+                return null;
+            }
+            else
+            {
+                throw new IllegalArgumentException("Cannot convert type " + 
value.getClass() + " to a URI");
+            }
+        }
+    };
+
     static final AttributeValueConverter<byte[]> BINARY_CONVERTER = new 
AttributeValueConverter<byte[]>()
     {
         @Override
@@ -531,6 +556,10 @@ abstract class AttributeValueConverter<T
         {
             return (AttributeValueConverter<X>) UUID_CONVERTER;
         }
+        else if(type == URI.class)
+        {
+            return (AttributeValueConverter<X>) URI_CONVERTER;
+        }
         else if(type == byte[].class)
         {
             return (AttributeValueConverter<X>) BINARY_CONVERTER;

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java
 Mon Feb 15 16:48:12 2016
@@ -39,7 +39,7 @@ import org.apache.qpid.server.logging.me
 import org.apache.qpid.server.plugin.ConfiguredObjectAttributeInjector;
 import org.apache.qpid.server.plugin.PluggableService;
 import org.apache.qpid.server.security.access.Operation;
-import org.apache.qpid.server.util.ParameterizedTypeImpl;
+import org.apache.qpid.server.util.ParameterizedTypes;
 
 @PluggableService
 public class BrokerAttributeInjector implements 
ConfiguredObjectAttributeInjector
@@ -278,10 +278,7 @@ public class BrokerAttributeInjector imp
             final OperationParameter[] params =
                     new OperationParameter[]{new 
OperationParameterFromInjection("options",
                                                                                
  Map.class,
-                                                                               
  new ParameterizedTypeImpl(
-                                                                               
          Map.class,
-                                                                               
          String.class,
-                                                                               
          String.class),
+                                                                               
  ParameterizedTypes.MAP_OF_STRING_STRING,
                                                                                
  "",
                                                                                
  "JVM options map",
                                                                                
  new String[0])};

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
 Mon Feb 15 16:48:12 2016
@@ -25,5 +25,5 @@ import java.util.Set;
 @ManagedObject
 public interface GroupProvider<X extends GroupProvider<X>> extends 
ConfiguredObject<X>
 {
-    Set<Principal> getGroupPrincipalsForUser(String username);
+    Set<Principal> getGroupPrincipalsForUser(Principal userPrincipal);
 }

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
 Mon Feb 15 16:48:12 2016
@@ -33,7 +33,6 @@ import java.util.UUID;
 
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -313,9 +312,10 @@ public class FileBasedGroupProviderImpl
         return Futures.immediateFuture(null);
     }
 
-    public Set<Principal> getGroupPrincipalsForUser(String username)
+    @Override
+    public Set<Principal> getGroupPrincipalsForUser(Principal userPrincipal)
     {
-        Set<String> groups = _groupDatabase == null ? 
Collections.<String>emptySet(): _groupDatabase.getGroupsForUser(username);
+        Set<String> groups = _groupDatabase == null ? 
Collections.<String>emptySet() : 
_groupDatabase.getGroupsForUser(userPrincipal.getName());
         if (groups.isEmpty())
         {
             return Collections.emptySet();

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
 Mon Feb 15 16:48:12 2016
@@ -304,7 +304,7 @@ public class SecurityManager
             }
         }))
         {
-            throw new AccessControlException("User not authorised for 
management");
+            throw new AccessControlException("User is not authorised for 
management");
         }
     }
 

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SubjectCreator.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SubjectCreator.java?rev=1730565&r1=1730564&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SubjectCreator.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/SubjectCreator.java
 Mon Feb 15 16:48:12 2016
@@ -116,9 +116,7 @@ public class SubjectCreator
         AuthenticationResult authenticationResult = 
_authenticationProvider.authenticate(server, response);
         if(server.isComplete())
         {
-            String username = server.getAuthorizationID();
-
-            return createResultWithGroups(username, authenticationResult);
+            return createResultWithGroups(authenticationResult);
         }
         else
         {
@@ -131,19 +129,20 @@ public class SubjectCreator
         if (_authenticationProvider instanceof 
UsernamePasswordAuthenticationProvider)
         {
             final AuthenticationResult authenticationResult = 
((UsernamePasswordAuthenticationProvider)_authenticationProvider).authenticate(username,
 password);
-            return createResultWithGroups(username, authenticationResult);
+            return createResultWithGroups(authenticationResult);
         }
         return new SubjectAuthenticationResult(new 
AuthenticationResult(AuthenticationStatus.ERROR));
     }
 
-    public SubjectAuthenticationResult createResultWithGroups(String username, 
final AuthenticationResult authenticationResult)
+    public SubjectAuthenticationResult createResultWithGroups(final 
AuthenticationResult authenticationResult)
     {
         if(authenticationResult.getStatus() == AuthenticationStatus.SUCCESS)
         {
             final Subject authenticationSubject = new Subject();
 
             
authenticationSubject.getPrincipals().addAll(authenticationResult.getPrincipals());
-            
authenticationSubject.getPrincipals().addAll(getGroupPrincipals(username));
+            final Set<Principal> groupPrincipals = 
getGroupPrincipals(authenticationResult.getMainPrincipal());
+            authenticationSubject.getPrincipals().addAll(groupPrincipals);
 
             authenticationSubject.setReadOnly();
 
@@ -157,23 +156,23 @@ public class SubjectCreator
 
 
 
-    public Subject createSubjectWithGroups(Principal principal)
+    public Subject createSubjectWithGroups(Principal userPrincipal)
     {
         Subject authenticationSubject = new Subject();
 
-        authenticationSubject.getPrincipals().add(principal);
-        
authenticationSubject.getPrincipals().addAll(getGroupPrincipals(principal.getName()));
+        authenticationSubject.getPrincipals().add(userPrincipal);
+        
authenticationSubject.getPrincipals().addAll(getGroupPrincipals(userPrincipal));
         authenticationSubject.setReadOnly();
 
         return authenticationSubject;
     }
 
-    Set<Principal> getGroupPrincipals(String username)
+    Set<Principal> getGroupPrincipals(Principal userPrincipal)
     {
         Set<Principal> principals = new HashSet<Principal>();
         for (GroupProvider groupProvider : _groupProviders)
         {
-            Set<Principal> groups = 
groupProvider.getGroupPrincipalsForUser(username);
+            Set<Principal> groups = 
groupProvider.getGroupPrincipalsForUser(userPrincipal);
             if (groups != null)
             {
                 principals.addAll(groups);

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProvider.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProvider.java?rev=1730565&r1=1729215&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProvider.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProvider.java
 Mon Feb 15 16:48:12 2016
@@ -23,7 +23,9 @@ import java.net.URI;
 import java.util.List;
 
 import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.DerivedAttribute;
 import org.apache.qpid.server.model.ManagedAttribute;
+import org.apache.qpid.server.model.ManagedContextDefault;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.security.auth.AuthenticationResult;
@@ -31,20 +33,48 @@ import org.apache.qpid.server.security.a
 @ManagedObject( category = false, type = "OAuth2" )
 public interface OAuth2AuthenticationProvider<T extends 
OAuth2AuthenticationProvider<T>> extends AuthenticationProvider<T>
 {
-    @ManagedAttribute( description = "Redirect URI to obtain authorization 
code grant", mandatory = true )
+    String AUTHENTICATION_OAUTH2_CONNECT_TIMEOUT = 
"qpid.authentication.oauth2.connectTimeout";
+    @ManagedContextDefault(name = AUTHENTICATION_OAUTH2_CONNECT_TIMEOUT)
+    int DEFAULT_AUTHENTICATION_OAUTH2_CONNECT_TIMEOUT = 60000;
+
+    String AUTHENTICATION_OAUTH2_READ_TIMEOUT = 
"qpid.authentication.oauth2.readTimeout";
+    @ManagedContextDefault(name = AUTHENTICATION_OAUTH2_READ_TIMEOUT)
+    int DEFAULT_AUTHENTICATION_OAUTH2_READ_TIMEOUT = 60000;
+
+    String AUTHENTICATION_OAUTH2_ENABLED_TLS_PROTOCOLS = 
"qpid.authentication.oauth2.enabledTlsProtocols";
+    @ManagedContextDefault(name = AUTHENTICATION_OAUTH2_ENABLED_TLS_PROTOCOLS)
+    String DEFAULT_ENABLED_TLS_PROTOCOLS = "[]";
+
+    String AUTHENTICATION_OAUTH2_DISABLED_TLS_PROTOCOLS = 
"qpid.authentication.oauth2.disabledTlsProtocols";
+    @ManagedContextDefault(name = AUTHENTICATION_OAUTH2_DISABLED_TLS_PROTOCOLS)
+    String DEFAULT_DISABLED_TLS_PROTOCOLS = "[]";
+
+    String AUTHENTICATION_OAUTH2_ENABLED_CIPHER_SUITES = 
"qpid.authentication.oauth2.enabledCipherSuites";
+    @ManagedContextDefault(name = AUTHENTICATION_OAUTH2_ENABLED_CIPHER_SUITES)
+    String DEFAULT_ENABLED_CIPHER_SUITES = "[]";
+
+    String AUTHENTICATION_OAUTH2_DISABLED_CIPHER_SUITES = 
"qpid.authentication.oauth2.disabledCipherSuites";
+    @ManagedContextDefault(name = AUTHENTICATION_OAUTH2_DISABLED_CIPHER_SUITES)
+    String DEFAULT_DISABLED_CIPHER_SUITES = "[]";
+
+    @ManagedAttribute( description = "Redirect URI to obtain authorization 
code grant", mandatory = true, defaultValue = 
"${this:defaultAuthorizationEndpointURI}")
     URI getAuthorizationEndpointURI();
 
-    @ManagedAttribute( description = "Token endpoint URI", mandatory = true )
+    @ManagedAttribute( description = "Token endpoint URI", mandatory = true, 
defaultValue = "${this:defaultTokenEndpointURI}" )
     URI getTokenEndpointURI();
 
     @ManagedAttribute( description = "Whether to use basic authentication when 
accessing the token endpoint", defaultValue = "false" )
     boolean getTokenEndpointNeedsAuth();
 
-    @ManagedAttribute( description = "Identity resolver endpoint URI", 
mandatory = true )
+    @ManagedAttribute( description = "Identity resolver endpoint URI", 
mandatory = true, defaultValue = "${this:defaultIdentityResolverEndpointURI}"  )
     URI getIdentityResolverEndpointURI();
 
-    @ManagedAttribute( description = "The type of the 
IdentityResolverFactory", mandatory = true )
-    String getIdentityResolverFactoryType();
+    @ManagedAttribute( description = "The type of the IdentityResolver", 
mandatory = true,
+            validValues = 
{"org.apache.qpid.server.security.auth.manager.oauth2.OAuth2AuthenticationProviderImpl#validIdentityResolvers()"})
+    String getIdentityResolverType();
+
+    @ManagedAttribute( description = "Redirect URI used when the user leaves 
the Web Management Console. If not specified, an internal page is used 
instead.")
+    URI getPostLogoutURI();
 
     @ManagedAttribute( description = "Client ID to identify qpid to the OAuth 
endpoints", mandatory = true )
     String getClientId();
@@ -52,7 +82,7 @@ public interface OAuth2AuthenticationPro
     @ManagedAttribute( description = "Client secret to identify qpid to the 
OAuth endpoints", mandatory = true, secure = true )
     String getClientSecret();
 
-    @ManagedAttribute( description = "The OAuth access token scope passed to 
the authorization endpoint" )
+    @ManagedAttribute( description = "The OAuth access token scope passed to 
the authorization endpoint", defaultValue = "${this:defaultScope}")
     String getScope();
 
     @ManagedAttribute( description = "TrustStore to use when contacting OAuth 
endpoints" )
@@ -64,4 +94,16 @@ public interface OAuth2AuthenticationPro
     AuthenticationResult authenticateViaAuthorizationCode(String 
authorizationCode, final String redirectUri);
 
     AuthenticationResult authenticateViaAccessToken(String accessToken);
+
+    @DerivedAttribute( description = "Default redirect URI to obtain 
authorization code grant")
+    URI getDefaultAuthorizationEndpointURI();
+
+    @DerivedAttribute( description = "Default token endpoint URI")
+    URI getDefaultTokenEndpointURI();
+
+    @DerivedAttribute( description = "Default identity resolver endpoint URI")
+    URI getDefaultIdentityResolverEndpointURI();
+
+    @DerivedAttribute( description = "Default OAuth access token scope passed 
to the authorization endpoint")
+    String getDefaultScope();
 }

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java?rev=1730565&r1=1729215&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java
 Mon Feb 15 16:48:12 2016
@@ -19,19 +19,24 @@
 
 package org.apache.qpid.server.security.auth.manager.oauth2;
 
+import static org.apache.qpid.server.util.ParameterizedTypes.LIST_OF_STRINGS;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
+import java.security.GeneralSecurityException;
 import java.security.Principal;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
-import javax.net.ssl.HttpsURLConnection;
 import javax.security.sasl.SaslException;
 import javax.security.sasl.SaslServer;
 import javax.xml.bind.DatatypeConverter;
@@ -41,13 +46,17 @@ import com.fasterxml.jackson.databind.Ob
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ManagedAttributeField;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
 import org.apache.qpid.server.model.TrustStore;
-import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
 import org.apache.qpid.server.security.auth.AuthenticationResult;
 import 
org.apache.qpid.server.security.auth.manager.AbstractAuthenticationManager;
+import org.apache.qpid.server.util.ConnectionBuilder;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
 public class OAuth2AuthenticationProviderImpl
         extends AbstractAuthenticationManager<OAuth2AuthenticationProviderImpl>
@@ -72,6 +81,9 @@ public class OAuth2AuthenticationProvide
     private boolean _tokenEndpointNeedsAuth;
 
     @ManagedAttributeField
+    private URI _postLogoutURI;
+
+    @ManagedAttributeField
     private String _clientId;
 
     @ManagedAttributeField
@@ -84,9 +96,11 @@ public class OAuth2AuthenticationProvide
     private String _scope;
 
     @ManagedAttributeField
-    private String _identityResolverFactoryType;
+    private String _identityResolverType;
 
     private OAuth2IdentityResolverService _identityResolverService;
+    private int _connectTimeout;
+    private int _readTimeout;
 
     @ManagedObjectFactoryConstructor
     protected OAuth2AuthenticationProviderImpl(final Map<String, Object> 
attributes,
@@ -99,9 +113,72 @@ public class OAuth2AuthenticationProvide
     protected void onOpen()
     {
         super.onOpen();
-        String type = getIdentityResolverFactoryType();
-        OAuth2IdentityResolverServiceFactory factory = 
OAuth2IdentityResolverServiceFactory.FACTORIES.get(type);
-        _identityResolverService = factory.createIdentityResolverService(this);
+        String type = getIdentityResolverType();
+        _identityResolverService = new 
QpidServiceLoader().getInstancesByType(OAuth2IdentityResolverService.class).get(type);
+        _connectTimeout = getContextValue(Integer.class, 
AUTHENTICATION_OAUTH2_CONNECT_TIMEOUT);
+        _readTimeout = getContextValue(Integer.class, 
AUTHENTICATION_OAUTH2_READ_TIMEOUT);
+    }
+
+    @Override
+    protected void validateChange(final ConfiguredObject<?> 
proxyForValidation, final Set<String> changedAttributes)
+    {
+        super.validateChange(proxyForValidation, changedAttributes);
+        validateResolver((OAuth2AuthenticationProvider<?>)proxyForValidation);
+        
validateSecureEndpoints((OAuth2AuthenticationProvider<?>)proxyForValidation);
+        validatePostLogoutURI(this);
+    }
+
+
+    @Override
+    public void onValidate()
+    {
+        super.onValidate();
+        validateResolver(this);
+        validateSecureEndpoints(this);
+        validatePostLogoutURI(this);
+    }
+
+    private void validateSecureEndpoints(final OAuth2AuthenticationProvider<?> 
provider)
+    {
+        if 
(!"https".equals(provider.getAuthorizationEndpointURI().getScheme()))
+        {
+            throw new 
IllegalConfigurationException(String.format("Authorization endpoint is not 
secure: '%s'", provider.getAuthorizationEndpointURI()));
+        }
+        if (!"https".equals(provider.getTokenEndpointURI().getScheme()))
+        {
+            throw new IllegalConfigurationException(String.format("Token 
endpoint is not secure: '%s'", provider.getTokenEndpointURI()));
+        }
+        if 
(!"https".equals(provider.getIdentityResolverEndpointURI().getScheme()))
+        {
+            throw new IllegalConfigurationException(String.format("Identity 
resolver endpoint is not secure: '%s'", 
provider.getIdentityResolverEndpointURI()));
+        }
+    }
+
+    private void validatePostLogoutURI(final OAuth2AuthenticationProvider<?> 
provider)
+    {
+        if (provider.getPostLogoutURI() != null)
+        {
+            String scheme = provider.getPostLogoutURI().getScheme();
+            if (!"https".equals(scheme) && !"http".equals(scheme))
+            {
+                throw new IllegalConfigurationException(String.format("Post 
logout URI does not have a http or https scheme: '%s'", 
provider.getPostLogoutURI()));
+            }
+        }
+    }
+
+    private void validateResolver(final OAuth2AuthenticationProvider<?> 
provider)
+    {
+        final OAuth2IdentityResolverService identityResolverService =
+                new 
QpidServiceLoader().getInstancesByType(OAuth2IdentityResolverService.class).get(provider.getIdentityResolverType());
+
+        if(identityResolverService == null)
+        {
+            throw new IllegalConfigurationException("Unknown identity resolver 
" + provider.getType());
+        }
+        else
+        {
+            identityResolverService.validate(provider);
+        }
     }
 
     @Override
@@ -154,20 +231,32 @@ public class OAuth2AuthenticationProvide
     public AuthenticationResult authenticateViaAuthorizationCode(final String 
authorizationCode, final String redirectUri)
     {
         URL tokenEndpoint;
-        HttpsURLConnection connection;
+        HttpURLConnection connection;
         byte[] body;
         try
         {
             tokenEndpoint = getTokenEndpointURI().toURL();
 
-            LOGGER.debug("About to call token endpoint '{}'", tokenEndpoint);
-
-            connection = (HttpsURLConnection) tokenEndpoint.openConnection();
 
+            ConnectionBuilder connectionBuilder = new 
ConnectionBuilder(tokenEndpoint);
+            
connectionBuilder.setConnectTimeout(_connectTimeout).setReadTimeout(_readTimeout);
             if (getTrustStore() != null)
             {
-                OAuth2Utils.setTrustedCertificates(connection, 
getTrustStore());
+                try
+                {
+                    
connectionBuilder.setTrustMangers(getTrustStore().getTrustManagers());
+                }
+                catch (GeneralSecurityException e)
+                {
+                    throw new ServerScopedRuntimeException("Cannot initialise 
TLS", e);
+                }
             }
+            
connectionBuilder.setEnabledTlsProtocols(getContextValue(List.class, 
LIST_OF_STRINGS, AUTHENTICATION_OAUTH2_ENABLED_TLS_PROTOCOLS))
+                    .setDisabledTlsProtocols(getContextValue(List.class, 
LIST_OF_STRINGS, AUTHENTICATION_OAUTH2_DISABLED_TLS_PROTOCOLS))
+                    .setEnabledCipherSuites(getContextValue(List.class, 
LIST_OF_STRINGS, AUTHENTICATION_OAUTH2_ENABLED_CIPHER_SUITES))
+                    .setDisabledCipherSuites(getContextValue(List.class, 
LIST_OF_STRINGS, AUTHENTICATION_OAUTH2_DISABLED_CIPHER_SUITES));
+            LOGGER.debug("About to call token endpoint '{}'", tokenEndpoint);
+            connection = connectionBuilder.build();
 
             connection.setDoOutput(true); // makes sure to use POST
             connection.setRequestProperty("Accept-Charset", UTF8);
@@ -189,18 +278,13 @@ public class OAuth2AuthenticationProvide
             requestBody.put("response_type", "token");
             body = OAuth2Utils.buildRequestQuery(requestBody).getBytes(UTF8);
             connection.connect();
-        }
-        catch (IOException e)
-        {
-            return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
-        }
 
-        try (OutputStream output = connection.getOutputStream())
-        {
-            output.write(body);
-            output.close();
+            try (OutputStream output = connection.getOutputStream())
+            {
+                output.write(body);
+            }
 
-            try (InputStream input = connection.getInputStream())
+            try (InputStream input = OAuth2Utils.getResponseStream(connection))
             {
                 final int responseCode = connection.getResponseCode();
                 LOGGER.debug("Call to token endpoint '{}' complete, response 
code : {}", tokenEndpoint, responseCode);
@@ -212,20 +296,32 @@ public class OAuth2AuthenticationProvide
                                                                                
       responseCode,
                                                                                
       responseMap.get("error"),
                                                                                
       responseMap.get("error_description")));
+                    LOGGER.error("Call to token endpoint failed", e);
+                    return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
+                }
+
+                Object accessTokenObject = responseMap.get("access_token");
+                if (accessTokenObject == null)
+                {
+                    IllegalStateException e = new IllegalStateException("Token 
endpoint response did not include 'access_token'");
+                    LOGGER.error("Unexpected token endpoint response", e);
                     return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
                 }
-                return getAuthenticationResult(responseMap);
+                String accessToken = String.valueOf(accessTokenObject);
+
+                return authenticateViaAccessToken(accessToken);
             }
             catch (JsonProcessingException e)
             {
                 IllegalStateException ise = new 
IllegalStateException(String.format("Token endpoint '%s' did not return json",
-                                                                               
     tokenEndpoint),
-                                                                      e);
+                                                                               
     tokenEndpoint), e);
+                LOGGER.error("Unexpected token endpoint response", e);
                 return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, ise);
             }
         }
-        catch (IOException | IdentityResolverException e)
+        catch (IOException e)
         {
+            LOGGER.error("Call to token endpoint failed", e);
             return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
         }
     }
@@ -235,10 +331,13 @@ public class OAuth2AuthenticationProvide
     {
         try
         {
-            return new AuthenticationResult(new 
AuthenticatedPrincipal(_identityResolverService.getUserPrincipal(accessToken)));
+            final Principal userPrincipal = 
_identityResolverService.getUserPrincipal(this, accessToken);
+            OAuth2UserPrincipal oauthUserPrincipal = new 
OAuth2UserPrincipal(userPrincipal.getName(), accessToken);
+            return new AuthenticationResult(oauthUserPrincipal);
         }
         catch (IOException | IdentityResolverException e)
         {
+            LOGGER.error("Call to identity resolver failed", e);
             return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
         }
     }
@@ -262,15 +361,21 @@ public class OAuth2AuthenticationProvide
     }
 
     @Override
+    public URI getPostLogoutURI()
+    {
+        return _postLogoutURI;
+    }
+
+    @Override
     public boolean getTokenEndpointNeedsAuth()
     {
         return _tokenEndpointNeedsAuth;
     }
 
     @Override
-    public String getIdentityResolverFactoryType()
+    public String getIdentityResolverType()
     {
-        return _identityResolverFactoryType;
+        return _identityResolverType;
     }
 
     @Override
@@ -297,18 +402,40 @@ public class OAuth2AuthenticationProvide
         return _scope;
     }
 
-    private AuthenticationResult getAuthenticationResult(Map<String, Object> 
tokenEndpointResponse)
-            throws IOException, IdentityResolverException
+    @Override
+    public URI getDefaultAuthorizationEndpointURI()
     {
-        final Object accessTokenObject = 
tokenEndpointResponse.get("access_token");
-        if (accessTokenObject == null)
-        {
-            final IllegalStateException e = new IllegalStateException("Token 
endpoint response did not include 'access_token'");
-            return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
-        }
-        String accessToken = String.valueOf(accessTokenObject);
+        final OAuth2IdentityResolverService identityResolverService =
+                new 
QpidServiceLoader().getInstancesByType(OAuth2IdentityResolverService.class).get(getIdentityResolverType());
+        return identityResolverService == null ? null : 
identityResolverService.getDefaultAuthorizationEndpointURI(this);
+    }
+
+    @Override
+    public URI getDefaultTokenEndpointURI()
+    {
+        final OAuth2IdentityResolverService identityResolverService =
+                new 
QpidServiceLoader().getInstancesByType(OAuth2IdentityResolverService.class).get(getIdentityResolverType());
+        return identityResolverService == null ? null : 
identityResolverService.getDefaultTokenEndpointURI(this);
+    }
 
-        return new AuthenticationResult(new 
AuthenticatedPrincipal(_identityResolverService.getUserPrincipal(accessToken)));
+    @Override
+    public URI getDefaultIdentityResolverEndpointURI()
+    {
+        final OAuth2IdentityResolverService identityResolverService =
+                new 
QpidServiceLoader().getInstancesByType(OAuth2IdentityResolverService.class).get(getIdentityResolverType());
+        return identityResolverService == null ? null : 
identityResolverService.getDefaultIdentityResolverEndpointURI(this);
     }
 
+    @Override
+    public String getDefaultScope()
+    {
+        final OAuth2IdentityResolverService identityResolverService =
+                new 
QpidServiceLoader().getInstancesByType(OAuth2IdentityResolverService.class).get(getIdentityResolverType());
+        return identityResolverService == null ? null : 
identityResolverService.getDefaultScope(this);    }
+
+    @SuppressWarnings("unused")
+    public static Collection<String> validIdentityResolvers()
+    {
+        return new 
QpidServiceLoader().getInstancesByType(OAuth2IdentityResolverService.class).keySet();
+    }
 }

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2IdentityResolverService.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2IdentityResolverService.java?rev=1730565&r1=1729215&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2IdentityResolverService.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2IdentityResolverService.java
 Mon Feb 15 16:48:12 2016
@@ -22,9 +22,24 @@
 package org.apache.qpid.server.security.auth.manager.oauth2;
 
 import java.io.IOException;
+import java.net.URI;
 import java.security.Principal;
 
-public interface OAuth2IdentityResolverService
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.plugin.Pluggable;
+
+public interface OAuth2IdentityResolverService extends Pluggable
 {
-    Principal getUserPrincipal(String accessToken) throws IOException, 
IdentityResolverException;
+    void validate(final OAuth2AuthenticationProvider<?> authProvider) throws 
IllegalConfigurationException;
+
+    Principal getUserPrincipal(final OAuth2AuthenticationProvider<?> 
authProvider,
+                               String accessToken) throws IOException, 
IdentityResolverException;
+
+    URI getDefaultAuthorizationEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider);
+
+    URI getDefaultTokenEndpointURI(final OAuth2AuthenticationProvider<?> 
oAuth2AuthenticationProvider);
+
+    URI getDefaultIdentityResolverEndpointURI(OAuth2AuthenticationProvider<?> 
oAuth2AuthenticationProvider);
+
+    String getDefaultScope(OAuth2AuthenticationProvider<?> 
oAuth2AuthenticationProvider);
 }

Copied: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java
 (from r1729412, 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java)
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java?p2=qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java&r1=1729412&r2=1730565&rev=1730565&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2UserPrincipal.java
 Mon Feb 15 16:48:12 2016
@@ -82,4 +82,10 @@ public class OAuth2UserPrincipal impleme
         result = 31 * result + _name.hashCode();
         return result;
     }
+
+    @Override
+    public String toString()
+    {
+        return getName();
+    }
 }

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2Utils.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2Utils.java?rev=1730565&r1=1729215&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2Utils.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2Utils.java
 Mon Feb 15 16:48:12 2016
@@ -20,81 +20,24 @@
  */
 package org.apache.qpid.server.security.auth.manager.oauth2;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.security.GeneralSecurityException;
-import java.security.cert.Certificate;
-import java.security.cert.X509Certificate;
 import java.util.Iterator;
 import java.util.Map;
 
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLPeerUnverifiedException;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.SSLSocketFactory;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
-import org.apache.qpid.transport.TransportException;
-import org.apache.qpid.transport.network.security.ssl.SSLUtil;
 
 public class OAuth2Utils
 {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(OAuth2Utils.class);
 
-    public static void setTrustedCertificates(final HttpsURLConnection 
connection,
-                                              final TrustStore trustStore)
-    {
-        final SSLContext sslContext;
-        try
-        {
-            sslContext = SSLContext.getInstance("TLS");
-            sslContext.init(null, trustStore.getTrustManagers(), null);
-        }
-        catch (GeneralSecurityException e)
-        {
-            throw new ServerScopedRuntimeException("Cannot initialise TLS", e);
-        }
-
-        final SSLSocketFactory socketFactory = sslContext.getSocketFactory();
-        connection.setSSLSocketFactory(socketFactory);
-        connection.setHostnameVerifier(new HostnameVerifier()
-        {
-            @Override
-            public boolean verify(final String hostname, final SSLSession 
sslSession)
-            {
-                try
-                {
-                    final Certificate cert = 
sslSession.getPeerCertificates()[0];
-                    if (cert instanceof X509Certificate)
-                    {
-                        final X509Certificate x509Certificate = 
(X509Certificate) cert;
-                        SSLUtil.verifyHostname(hostname, x509Certificate);
-                        return true;
-                    }
-                    else
-                    {
-                        LOGGER.warn("Cannot verify peer's hostname as peer 
does not present a X509Certificate. "
-                                    + "Presented certificate : {}", cert);
-                    }
-                }
-                catch (SSLPeerUnverifiedException | TransportException e)
-                {
-                    LOGGER.warn("Failed to verify peer's hostname (connecting 
to host {})", hostname, e);
-                }
-
-                return false;
-            }
-        });
-        // TODO respect the tls protocols/cipher suite settings
-    }
-
     public static String buildRequestQuery(final Map<String, String> 
requestBodyParameters)
     {
         try
@@ -120,4 +63,21 @@ public class OAuth2Utils
             throw new ServerScopedRuntimeException("Failed to encode as 
UTF-8", e);
         }
     }
+
+    public static InputStream getResponseStream(final HttpURLConnection 
connection) throws IOException
+    {
+        try
+        {
+            return connection.getInputStream();
+        }
+        catch (IOException ioe)
+        {
+            InputStream errorStream = connection.getErrorStream();
+            if (errorStream != null)
+            {
+                return errorStream;
+            }
+            throw ioe;
+        }
+    }
 }

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java?rev=1730565&r1=1729215&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java
 Mon Feb 15 16:48:12 2016
@@ -20,17 +20,21 @@
  */
 package org.apache.qpid.server.security.auth.manager.oauth2.cloudfoundry;
 
+import static org.apache.qpid.server.util.ParameterizedTypes.LIST_OF_STRINGS;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
+import java.security.GeneralSecurityException;
 import java.security.Principal;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
-import javax.net.ssl.HttpsURLConnection;
 import javax.xml.bind.DatatypeConverter;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -38,54 +42,84 @@ import com.fasterxml.jackson.databind.Ob
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.model.TrustStore;
+import org.apache.qpid.server.plugin.PluggableService;
 import org.apache.qpid.server.security.auth.UsernamePrincipal;
 import 
org.apache.qpid.server.security.auth.manager.oauth2.IdentityResolverException;
 import 
org.apache.qpid.server.security.auth.manager.oauth2.OAuth2AuthenticationProvider;
 import 
org.apache.qpid.server.security.auth.manager.oauth2.OAuth2IdentityResolverService;
 import org.apache.qpid.server.security.auth.manager.oauth2.OAuth2Utils;
+import org.apache.qpid.server.util.ConnectionBuilder;
+import org.apache.qpid.server.util.ParameterizedTypes;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
+@PluggableService
 public class CloudFoundryOAuth2IdentityResolverService implements 
OAuth2IdentityResolverService
 {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(CloudFoundryOAuth2IdentityResolverService.class);
     private static final String UTF8 = StandardCharsets.UTF_8.name();
 
-    private final OAuth2AuthenticationProvider _authenticationProvider;
-    private final URI _checkTokenEndpointURI;
-    private final TrustStore _trustStore;
-    private final String _clientId;
-    private final String _clientSecret;
+    public static final String TYPE = "CloudFoundryIdentityResolver";
+
     private final ObjectMapper _objectMapper = new ObjectMapper();
 
-    public CloudFoundryOAuth2IdentityResolverService(final 
OAuth2AuthenticationProvider authenticationProvider)
+    @Override
+    public String getType()
     {
-        _authenticationProvider = authenticationProvider;
-        _checkTokenEndpointURI = 
_authenticationProvider.getIdentityResolverEndpointURI();
-        _trustStore = _authenticationProvider.getTrustStore();
-        _clientId = _authenticationProvider.getClientId();
-        _clientSecret = _authenticationProvider.getClientSecret();
+        return TYPE;
     }
 
     @Override
-    public Principal getUserPrincipal(final String accessToken) throws 
IOException, IdentityResolverException
+    public void validate(final OAuth2AuthenticationProvider<?> authProvider) 
throws IllegalConfigurationException
     {
-        URL checkTokenEndpoint;
-        HttpsURLConnection connection;
-        checkTokenEndpoint = _checkTokenEndpointURI.toURL();
-
-        LOGGER.debug("About to call identity service '{}'", 
checkTokenEndpoint);
+    }
 
-        connection = (HttpsURLConnection) checkTokenEndpoint.openConnection();
-        if (_trustStore != null)
+    @Override
+    public Principal getUserPrincipal(final OAuth2AuthenticationProvider<?> 
authenticationProvider,
+                                      final String accessToken) throws 
IOException, IdentityResolverException
+    {
+        URL checkTokenEndpoint = 
authenticationProvider.getIdentityResolverEndpointURI().toURL();
+        TrustStore trustStore = authenticationProvider.getTrustStore();
+        String clientId = authenticationProvider.getClientId();
+        String clientSecret = authenticationProvider.getClientSecret();
+        int connectTimeout = 
authenticationProvider.getContextValue(Integer.class, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_CONNECT_TIMEOUT);
+        int readTimeout = 
authenticationProvider.getContextValue(Integer.class, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_READ_TIMEOUT);
+        List<String> enabledTlsProtocols =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_ENABLED_TLS_PROTOCOLS);
+        List<String> disabledTlsProtocols =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_DISABLED_TLS_PROTOCOLS);
+        List<String> enabledCipherSuites =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_ENABLED_CIPHER_SUITES);
+        List<String> disabledCipherSuites =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_DISABLED_CIPHER_SUITES);
+
+        ConnectionBuilder connectionBuilder = new 
ConnectionBuilder(checkTokenEndpoint);
+        
connectionBuilder.setConnectTimeout(connectTimeout).setReadTimeout(readTimeout);
+        if (trustStore != null)
         {
-            OAuth2Utils.setTrustedCertificates(connection, _trustStore);
+            try
+            {
+                
connectionBuilder.setTrustMangers(trustStore.getTrustManagers());
+            }
+            catch (GeneralSecurityException e)
+            {
+                throw new ServerScopedRuntimeException("Cannot initialise 
TLS", e);
+            }
         }
+        connectionBuilder.setEnabledTlsProtocols(enabledTlsProtocols)
+                .setDisabledTlsProtocols(disabledTlsProtocols)
+                .setEnabledCipherSuites(enabledCipherSuites)
+                .setDisabledCipherSuites(disabledCipherSuites);
+
+        LOGGER.debug("About to call identity service '{}'", 
checkTokenEndpoint);
+        HttpURLConnection connection = connectionBuilder.build();
 
         connection.setDoOutput(true); // makes sure to use POST
         connection.setRequestProperty("Accept-Charset", UTF8);
         connection.setRequestProperty("Content-Type", 
"application/x-www-form-urlencoded;charset=" + UTF8);
         connection.setRequestProperty("Accept", "application/json");
-        String encoded = DatatypeConverter.printBase64Binary((_clientId + ":" 
+ _clientSecret).getBytes());
+        String encoded = DatatypeConverter.printBase64Binary((clientId + ":" + 
clientSecret).getBytes());
         connection.setRequestProperty("Authorization", "Basic " + encoded);
 
         final Map<String,String> requestParameters = 
Collections.singletonMap("token", accessToken);
@@ -97,7 +131,7 @@ public class CloudFoundryOAuth2IdentityR
             
output.write(OAuth2Utils.buildRequestQuery(requestParameters).getBytes(UTF8));
             output.close();
 
-            try (InputStream input = connection.getInputStream())
+            try (InputStream input = OAuth2Utils.getResponseStream(connection))
             {
                 int responseCode = connection.getResponseCode();
                 LOGGER.debug("Call to identity service '{}' complete, response 
code : {}", checkTokenEndpoint, responseCode);
@@ -129,4 +163,28 @@ public class CloudFoundryOAuth2IdentityR
             }
         }
     }
+
+    @Override
+    public URI getDefaultAuthorizationEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        return null;
+    }
+
+    @Override
+    public URI getDefaultTokenEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        return null;
+    }
+
+    @Override
+    public URI getDefaultIdentityResolverEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        return null;
+    }
+
+    @Override
+    public String getDefaultScope(final OAuth2AuthenticationProvider<?> 
oAuth2AuthenticationProvider)
+    {
+        return "";
+    }
 }

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/facebook/FacebookIdentityResolverService.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/facebook/FacebookIdentityResolverService.java?rev=1730565&r1=1729406&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/facebook/FacebookIdentityResolverService.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/facebook/FacebookIdentityResolverService.java
 Mon Feb 15 16:48:12 2016
@@ -21,16 +21,20 @@
 
 package org.apache.qpid.server.security.auth.manager.oauth2.facebook;
 
+import static org.apache.qpid.server.util.ParameterizedTypes.LIST_OF_STRINGS;
+
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URL;
 import java.nio.charset.StandardCharsets;
+import java.security.GeneralSecurityException;
 import java.security.Principal;
+import java.util.List;
 import java.util.Map;
 
-import javax.net.ssl.HttpsURLConnection;
-
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
@@ -44,6 +48,8 @@ import org.apache.qpid.server.security.a
 import 
org.apache.qpid.server.security.auth.manager.oauth2.OAuth2AuthenticationProvider;
 import 
org.apache.qpid.server.security.auth.manager.oauth2.OAuth2IdentityResolverService;
 import org.apache.qpid.server.security.auth.manager.oauth2.OAuth2Utils;
+import org.apache.qpid.server.util.ConnectionBuilder;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
 /**
  * An identity resolver that calls GitHubs's user API 
https://developer.github.com/v3/users/
@@ -76,25 +82,47 @@ public class FacebookIdentityResolverSer
     public Principal getUserPrincipal(final OAuth2AuthenticationProvider<?> 
authenticationProvider,
                                       String accessToken) throws IOException, 
IdentityResolverException
     {
-        URI userInfoEndpoint = 
authenticationProvider.getIdentityResolverEndpointURI();
+        URL userInfoEndpoint = 
authenticationProvider.getIdentityResolverEndpointURI().toURL();
+        TrustStore<?> trustStore = authenticationProvider.getTrustStore();
+        int connectTimeout = 
authenticationProvider.getContextValue(Integer.class, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_CONNECT_TIMEOUT);
+        int readTimeout = 
authenticationProvider.getContextValue(Integer.class, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_READ_TIMEOUT);
+        List<String> enabledTlsProtocols =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_ENABLED_TLS_PROTOCOLS);
+        List<String> disabledTlsProtocols =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_DISABLED_TLS_PROTOCOLS);
+        List<String> enabledCipherSuites =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_ENABLED_CIPHER_SUITES);
+        List<String> disabledCipherSuites =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_DISABLED_CIPHER_SUITES);
 
-        LOGGER.debug("About to call identity service '{}'", userInfoEndpoint);
-
-        TrustStore trustStore = authenticationProvider.getTrustStore();
-        HttpsURLConnection connection = (HttpsURLConnection) 
userInfoEndpoint.toURL().openConnection();
+        ConnectionBuilder connectionBuilder = new 
ConnectionBuilder(userInfoEndpoint);
+        
connectionBuilder.setConnectTimeout(connectTimeout).setReadTimeout(readTimeout);
         if (trustStore != null)
         {
-            OAuth2Utils.setTrustedCertificates(connection, trustStore);
+            try
+            {
+                
connectionBuilder.setTrustMangers(trustStore.getTrustManagers());
+            }
+            catch (GeneralSecurityException e)
+            {
+                throw new ServerScopedRuntimeException("Cannot initialise 
TLS", e);
+            }
         }
+        connectionBuilder.setEnabledTlsProtocols(enabledTlsProtocols)
+                .setDisabledTlsProtocols(disabledTlsProtocols)
+                .setEnabledCipherSuites(enabledCipherSuites)
+                .setDisabledCipherSuites(disabledCipherSuites);
+
+        LOGGER.debug("About to call identity service '{}'", userInfoEndpoint);
+        HttpURLConnection connection = connectionBuilder.build();
 
         connection.setRequestProperty("Accept-Charset", UTF8);
-        connection.setRequestProperty("Content-Type", 
"application/x-www-form-urlencoded;charset=" + UTF8);
         connection.setRequestProperty("Accept", "application/json");
         connection.setRequestProperty("Authorization", "Bearer " + 
accessToken);
 
         connection.connect();
 
-        try (InputStream input = connection.getInputStream())
+        try (InputStream input = OAuth2Utils.getResponseStream(connection))
         {
             int responseCode = connection.getResponseCode();
             LOGGER.debug("Call to identity service '{}' complete, response 
code : {}",
@@ -127,4 +155,49 @@ public class FacebookIdentityResolverSer
             return new UsernamePrincipal(facebookId);
         }
     }
+
+    @Override
+    public URI getDefaultAuthorizationEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        try
+        {
+            return new URI("https://www.facebook.com/dialog/oauth";);
+        }
+        catch (URISyntaxException e)
+        {
+            return null;
+        }
+    }
+
+    @Override
+    public URI getDefaultTokenEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        try
+        {
+            return new 
URI("https://graph.facebook.com/v2.5/oauth/access_token";);
+        }
+        catch (URISyntaxException e)
+        {
+            return null;
+        }
+    }
+
+    @Override
+    public URI getDefaultIdentityResolverEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        try
+        {
+            return new URI("https://graph.facebook.com/v2.5/me";);
+        }
+        catch (URISyntaxException e)
+        {
+            return null;
+        }
+    }
+
+    @Override
+    public String getDefaultScope(final OAuth2AuthenticationProvider<?> 
oAuth2AuthenticationProvider)
+    {
+        return "";
+    }
 }

Modified: 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/github/GitHubOAuth2IdentityResolverService.java
URL: 
http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/github/GitHubOAuth2IdentityResolverService.java?rev=1730565&r1=1729406&r2=1730565&view=diff
==============================================================================
--- 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/github/GitHubOAuth2IdentityResolverService.java
 (original)
+++ 
qpid/java/branches/6.0.x/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/github/GitHubOAuth2IdentityResolverService.java
 Mon Feb 15 16:48:12 2016
@@ -21,15 +21,20 @@
 
 package org.apache.qpid.server.security.auth.manager.oauth2.github;
 
+import static org.apache.qpid.server.util.ParameterizedTypes.LIST_OF_STRINGS;
+
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.HttpURLConnection;
 import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
 import java.nio.charset.StandardCharsets;
+import java.security.GeneralSecurityException;
 import java.security.Principal;
+import java.util.List;
 import java.util.Map;
 
-import javax.net.ssl.HttpsURLConnection;
-
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Sets;
@@ -44,6 +49,8 @@ import org.apache.qpid.server.security.a
 import 
org.apache.qpid.server.security.auth.manager.oauth2.OAuth2AuthenticationProvider;
 import 
org.apache.qpid.server.security.auth.manager.oauth2.OAuth2IdentityResolverService;
 import org.apache.qpid.server.security.auth.manager.oauth2.OAuth2Utils;
+import org.apache.qpid.server.util.ConnectionBuilder;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
 /**
  * An identity resolver that calls GitHubs's user API 
https://developer.github.com/v3/users/
@@ -58,7 +65,7 @@ public class GitHubOAuth2IdentityResolve
     private static final String UTF8 = StandardCharsets.UTF_8.name();
 
     public static final String TYPE = "GitHubUser";
-    
+
     private final ObjectMapper _objectMapper = new ObjectMapper();
 
     @Override
@@ -81,25 +88,47 @@ public class GitHubOAuth2IdentityResolve
     public Principal getUserPrincipal(final OAuth2AuthenticationProvider<?> 
authenticationProvider,
                                       String accessToken) throws IOException, 
IdentityResolverException
     {
-        URI userInfoEndpoint = 
authenticationProvider.getIdentityResolverEndpointURI();
+        URL userInfoEndpoint = 
authenticationProvider.getIdentityResolverEndpointURI().toURL();
         TrustStore trustStore = authenticationProvider.getTrustStore();
+        int connectTimeout = 
authenticationProvider.getContextValue(Integer.class, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_CONNECT_TIMEOUT);
+        int readTimeout = 
authenticationProvider.getContextValue(Integer.class, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_READ_TIMEOUT);
+        List<String> enabledTlsProtocols =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_ENABLED_TLS_PROTOCOLS);
+        List<String> disabledTlsProtocols =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_DISABLED_TLS_PROTOCOLS);
+        List<String> enabledCipherSuites =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_ENABLED_CIPHER_SUITES);
+        List<String> disabledCipherSuites =
+                authenticationProvider.getContextValue(List.class, 
LIST_OF_STRINGS, 
OAuth2AuthenticationProvider.AUTHENTICATION_OAUTH2_DISABLED_CIPHER_SUITES);
 
-        LOGGER.debug("About to call identity service '{}'", userInfoEndpoint);
-
-        HttpsURLConnection connection = (HttpsURLConnection) 
userInfoEndpoint.toURL().openConnection();
+        ConnectionBuilder connectionBuilder = new 
ConnectionBuilder(userInfoEndpoint);
+        
connectionBuilder.setConnectTimeout(connectTimeout).setReadTimeout(readTimeout);
         if (trustStore != null)
         {
-            OAuth2Utils.setTrustedCertificates(connection, trustStore);
+            try
+            {
+                
connectionBuilder.setTrustMangers(trustStore.getTrustManagers());
+            }
+            catch (GeneralSecurityException e)
+            {
+                throw new ServerScopedRuntimeException("Cannot initialise 
TLS", e);
+            }
         }
+        connectionBuilder.setEnabledTlsProtocols(enabledTlsProtocols)
+                .setDisabledTlsProtocols(disabledTlsProtocols)
+                .setEnabledCipherSuites(enabledCipherSuites)
+                .setDisabledCipherSuites(disabledCipherSuites);
+
+        LOGGER.debug("About to call identity service '{}'", userInfoEndpoint);
+        HttpURLConnection connection = connectionBuilder.build();
 
         connection.setRequestProperty("Accept-Charset", UTF8);
-        connection.setRequestProperty("Content-Type", 
"application/x-www-form-urlencoded;charset=" + UTF8);
         connection.setRequestProperty("Accept", 
"application/vnd.github.v3+json");
         connection.setRequestProperty("Authorization", "token " + accessToken);
 
         connection.connect();
 
-        try (InputStream input = connection.getInputStream())
+        try (InputStream input = OAuth2Utils.getResponseStream(connection))
         {
             int responseCode = connection.getResponseCode();
             LOGGER.debug("Call to identity service '{}' complete, response 
code : {}",
@@ -132,4 +161,50 @@ public class GitHubOAuth2IdentityResolve
             return new UsernamePrincipal(githubId);
         }
     }
+
+
+    @Override
+    public URI getDefaultAuthorizationEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        try
+        {
+            return new URI("https://github.com/login/oauth/authorize";);
+        }
+        catch (URISyntaxException e)
+        {
+            return null;
+        }
+    }
+
+    @Override
+    public URI getDefaultTokenEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        try
+        {
+            return new URI("https://github.com/login/oauth/access_token";);
+        }
+        catch (URISyntaxException e)
+        {
+            return null;
+        }
+    }
+
+    @Override
+    public URI getDefaultIdentityResolverEndpointURI(final 
OAuth2AuthenticationProvider<?> oAuth2AuthenticationProvider)
+    {
+        try
+        {
+            return new URI("https://api.github.com/user";);
+        }
+        catch (URISyntaxException e)
+        {
+            return null;
+        }
+    }
+
+    @Override
+    public String getDefaultScope(final OAuth2AuthenticationProvider<?> 
oAuth2AuthenticationProvider)
+    {
+        return "user";
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to