diff --git a/cadc-access-control/build.gradle b/cadc-access-control/build.gradle index d519622d02792714286ebb2eebc5e489c59beb0f..890bada7a6623e263eb9125b451a7c2988dceca6 100644 --- a/cadc-access-control/build.gradle +++ b/cadc-access-control/build.gradle @@ -15,7 +15,7 @@ sourceCompatibility = 1.7 group = 'org.opencadc' -version = '1.1.5' +version = '1.1.6' mainClassName = 'ca.nrc.cadc.ac.client.Main' diff --git a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java index 55c56c125935c9a07e9ba8b7da06b7769994d935..bc5bd3df594630e34b86e93ef04422d8cacb1d17 100755 --- a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java +++ b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java @@ -1104,37 +1104,63 @@ public class GMSClient implements TransferListener private URL lookupServiceURL(final URI standard) throws AccessControlException { - final URL serviceURL = getRegistryClient() - .getServiceURL(this.serviceID, standard, getAuthMethod()); - + Subject subject = AuthenticationUtil.getCurrentSubject(); + AuthMethod am = getAuthMethod(subject); + + URL serviceURL = getRegistryClient().getServiceURL(this.serviceID, standard, am); + + // now that we have a URL we can check if the cookie will actually be sent to it + if (AuthMethod.COOKIE.equals(am)) + { + try + { + boolean domainMatch = false; + String domain = NetUtil.getDomainName(serviceURL); + for (SSOCookieCredential cc : subject.getPublicCredentials(SSOCookieCredential.class)) + { + if (cc.getDomain().equals(domain)) + domainMatch = true; + } + if (!domainMatch) + { + throw new AccessControlException("no SSOCookieCredential for domain " + domain); + } + } + catch(IOException ex) + { + throw new RuntimeException("failure checking domain for cookie use", ex); + } + } + if (serviceURL == null) { throw new RuntimeException( String.format("Unable to get Service URL for '%s', '%s', '%s'", - serviceID.toString(), Standards.GMS_GROUPS_01, - getAuthMethod())); - } - else - { - return serviceURL; + serviceID.toString(), standard, am)); } + + return serviceURL; } - - private AuthMethod getAuthMethod() + + private AuthMethod getAuthMethod(Subject subject) { - Subject subject = AuthenticationUtil.getCurrentSubject(); if (subject != null) { - for (Object o : subject.getPublicCredentials()) + // web services use CDP to load a proxy cert so prefer that + X509CertificateChain privateKeyChain = X509CertificateChain.findPrivateKeyChain( + subject.getPublicCredentials()); + if (privateKeyChain != null) + return AuthMethod.CERT; + + // ui applications pass cookie(s) along + Set sso = subject.getPublicCredentials(SSOCookieCredential.class); + if ( !sso.isEmpty() ) { - if (o instanceof X509CertificateChain) - return AuthMethod.CERT; - if (o instanceof SSOCookieCredential) - return AuthMethod.COOKIE; - // AuthMethod.PASSWORD not supported - // AuthMethod.TOKEN not supported + return AuthMethod.COOKIE; } - + + // AuthMethod.PASSWORD not supported + // AuthMethod.TOKEN not supported throw new AccessControlException("No valid public credentials."); } else