[java-identity-provider] branch master updated: IDP-1265 Conform CAS ticket IDs to protocol spec.

Marvin S. Addison marvin.addison at gmail.com
Wed Jun 13 16:11:05 EDT 2018


This is an automated email from the git hooks/post-receive script.

serac pushed a commit to branch master
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=83d4d88e84b21159d7f5cf8c28ea31ffb354d234

The following commit(s) were added to refs/heads/master by this push:
       new  83d4d88   IDP-1265 Conform CAS ticket IDs to protocol spec.
83d4d88 is described below

commit 83d4d88e84b21159d7f5cf8c28ea31ffb354d234
Author: Marvin S. Addison <serac at vt.edu>
AuthorDate: Wed Jun 13 16:07:00 2018 -0400

    IDP-1265 Conform CAS ticket IDs to protocol spec.
    
    Use base-32 encoding with '-' padding character to constrain ticket
    identifiers to the range [A-Za-z0-9-]+ per section 3.7 of the CAS 2.0
    protocol spec.
---
 .../idp/cas/ticket/impl/EncodingTicketService.java      |  4 ++--
 .../idp/cas/ticket/impl/EncodingTicketServiceTest.java  |  8 ++++++--
 .../main/resources/system/conf/cas-protocol-system.xml  | 17 +++++++++++------
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/ticket/impl/EncodingTicketService.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/ticket/impl/EncodingTicketService.java
index 36e1029..7c0627c 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/ticket/impl/EncodingTicketService.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/ticket/impl/EncodingTicketService.java
@@ -65,7 +65,7 @@ public class EncodingTicketService extends AbstractTicketService {
     /** Default proxy ticket prefix. */
     public static final String PROXY_TICKET_PREFIX = "PT";
 
-    /** Non-null marker value for unused ServiceTicket#id field. */
+    /** Non-null marker value for unused ServiceTicket#id field and storage context name. */
     private static final String NOT_USED = "na";
 
     /** Class logger. */
@@ -196,7 +196,7 @@ public class EncodingTicketService extends AbstractTicketService {
     private <T extends Ticket> T decode(final Class<T> ticketClass, final String id, final String prefix) {
         try {
             final String decrypted = dataSealer.unwrap(id.substring(prefix.length() + 1));
-            return serializer(ticketClass).deserialize(0, null, id, decrypted, 0L);
+            return serializer(ticketClass).deserialize(0, NOT_USED, id, decrypted, 0L);
         } catch (final Exception e) {
             log.warn("Ticket decoding failed with error: " + e.getMessage());
             log.debug("Ticket decoding failed", e);
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/ticket/impl/EncodingTicketServiceTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/ticket/impl/EncodingTicketServiceTest.java
index 6fa20ed..27316a0 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/ticket/impl/EncodingTicketServiceTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/ticket/impl/EncodingTicketServiceTest.java
@@ -29,6 +29,7 @@ import net.shibboleth.utilities.java.support.security.BasicKeystoreKeyStrategy;
 import net.shibboleth.utilities.java.support.security.DataSealer;
 import net.shibboleth.utilities.java.support.security.IdentifierGenerationStrategy;
 import net.shibboleth.utilities.java.support.security.RandomIdentifierGenerationStrategy;
+import org.apache.commons.codec.binary.Base32;
 import org.joda.time.Instant;
 import org.opensaml.storage.impl.MemoryStorageService;
 import org.springframework.core.io.ClassPathResource;
@@ -70,9 +71,12 @@ public class EncodingTicketServiceTest {
         strategy.setKeyAlias("secret");
         strategy.setKeyPassword("password");
         strategy.initialize();
+        final Base32 codec = new Base32(0, null, false, (byte) '-');
         final DataSealer sealer = new DataSealer();
         sealer.setKeyStrategy(strategy);
         sealer.setRandom(secureRandom);
+        sealer.setEncoder(codec);
+        sealer.setDecoder(codec);
         sealer.initialize();
         ticketService = new EncodingTicketService(new MemoryStorageService(), sealer);
     }
@@ -122,8 +126,8 @@ public class EncodingTicketServiceTest {
         final String id = String.valueOf(System.currentTimeMillis());
         final ServiceTicket st1 = ticketService.createServiceTicket(id, expiry, service, state, true);
         assertNotNull(st1);
-        assertTrue(st1.getId().startsWith("ST-"));
-        assertTrue(st1.getId().length() < 500);
+        assertTrue(st1.getId().matches("ST-[A-Za-z0-9]+-*"));
+        assertTrue(st1.getId().length() < 600);
     }
 
     @Test
diff --git a/idp-conf/src/main/resources/system/conf/cas-protocol-system.xml b/idp-conf/src/main/resources/system/conf/cas-protocol-system.xml
index 13523ef..30f21b7 100644
--- a/idp-conf/src/main/resources/system/conf/cas-protocol-system.xml
+++ b/idp-conf/src/main/resources/system/conf/cas-protocol-system.xml
@@ -21,13 +21,18 @@
     <bean id="encodedTicketSealer" lazy-init="true"
           class="net.shibboleth.utilities.java.support.security.DataSealer"
           p:keyStrategy-ref="shibboleth.DataSealerKeyStrategy"
-          p:encoder-ref="base64Codec"
-          p:decoder-ref="base64Codec" />
-
-    <bean id="base64Codec" class="org.apache.commons.codec.binary.Base64"
+          p:encoder-ref="codec"
+          p:decoder-ref="codec" />
+
+    <!--
+       | For EncodingTicketService use base-32 encoding with '-' as the padding character
+       |to get tickets in the required character set: [A-Za-z0-9-]+
+       -->
+    <bean id="codec" class="org.apache.commons.codec.binary.Base32"
           c:lineLength="0"
-          c:lineSeparator="#{new byte[] {10} }"
-          c:urlSafe="true" />
+          c:lineSeparator="#{null}"
+          c:useHex="false"
+          c:pad="#{ T(java.lang.Integer).valueOf(45).byteValue() }" />
 
     <alias name="simpleTicketService" alias="shibboleth.DefaultCASTicketService" />
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list