1919package org .apache .shiro .mgt ;
2020
2121import org .apache .shiro .lang .io .Serializer ;
22+ import org .apache .shiro .subject .ImmutablePrincipalCollection ;
2223import org .apache .shiro .subject .PrincipalCollection ;
23- import org .apache .shiro .subject .SimplePrincipalCollection ;
2424import org .apache .shiro .subject .Subject ;
2525import org .apache .shiro .subject .SubjectContext ;
2626import org .apache .shiro .subject .support .DefaultSubjectContext ;
2727import org .junit .jupiter .api .Test ;
2828
29+ import java .io .ByteArrayInputStream ;
2930import java .io .ByteArrayOutputStream ;
3031import java .io .IOException ;
3132import java .io .InvalidClassException ;
3233import java .io .ObjectInputFilter ;
34+ import java .io .ObjectInputStream ;
3335import java .io .ObjectOutputStream ;
36+ import java .io .Serial ;
3437import java .io .Serializable ;
3538import java .util .ArrayList ;
3639import java .util .List ;
@@ -51,7 +54,7 @@ class AbstractRememberMeManagerObjectInputFilterTest {
5154 @ Test
5255 void testLegitimatePrincipalsRoundTripUnderDefaultFilter () {
5356 InMemoryRememberMeManager rmm = new InMemoryRememberMeManager ();
54- PrincipalCollection principals = new SimplePrincipalCollection ("joecool" , "myRealm" );
57+ PrincipalCollection principals = ImmutablePrincipalCollection . ofSinglePrincipal ("joecool" , "myRealm" );
5558
5659 rmm .rememberIdentity (null , principals );
5760 PrincipalCollection remembered = rmm .getRememberedPrincipals (new DefaultSubjectContext ());
@@ -95,18 +98,18 @@ void testDefaultFilterRejectsOversizedPayloadBeforeFullConstruction() {
9598 @ Test
9699 void testCustomStricterAllowListFilterCanBeConfigured () {
97100 // Documented override path (see AbstractRememberMeManager#getSerializer javadoc): replace the default
98- // serializer's filter with a strict class allow-list. Only SimplePrincipalCollection ,
101+ // serializer's filter with a strict class allow-list. Only ImmutablePrincipalCollection ,
99102 // AbstractRememberMeManager.RememberedIdentity, and JDK collection/primitive/java.time plumbing are let
100103 // through. Note: java.time types (e.g. Instant) don't serialize themselves directly - they writeReplace()
101104 // to an internal java.time serialization proxy class, which is what actually appears in the stream.
102105 InMemoryRememberMeManager rmm = new InMemoryRememberMeManager ();
103106 rmm .getSerializer ()
104107 .setObjectInputFilter (ObjectInputFilter .Config .createFilter (
105- "org.apache.shiro.subject.SimplePrincipalCollection ;"
108+ "org.apache.shiro.subject.ImmutablePrincipalCollection ;"
106109 + "org.apache.shiro.mgt.AbstractRememberMeManager$RememberedIdentity;"
107110 + "java.time.*;java.util.*;java.lang.*;!*" ));
108111
109- PrincipalCollection principals = new SimplePrincipalCollection ("joecool" , "myRealm" );
112+ PrincipalCollection principals = ImmutablePrincipalCollection . ofSinglePrincipal ("joecool" , "myRealm" );
110113 rmm .rememberIdentity (null , principals );
111114 PrincipalCollection remembered = rmm .getRememberedPrincipals (new DefaultSubjectContext ());
112115 assertThat (remembered .getPrimaryPrincipal ()).isEqualTo ("joecool" );
@@ -126,25 +129,24 @@ void testCustomSerializerIsUnaffectedByDefaultFilterMachinery() {
126129 // A caller-supplied Serializer implementation (not a DefaultSerializer) must keep working exactly as
127130 // before this feature existed - AbstractRememberMeManager only touches the filter on its own default
128131 // DefaultSerializer instance, never on a replaced Serializer.
129- InMemoryRememberMeManager rmm = new InMemoryRememberMeManager ();
130- rmm .setSerializer (new Serializer <AbstractRememberMeManager . RememberedIdentity >() {
132+ var rmm = new InMemoryRememberMeManager ();
133+ rmm .setSerializer (new Serializer <>() {
131134 @ Override
132135 public byte [] serialize (AbstractRememberMeManager .RememberedIdentity o ) {
133136 return plainJdkSerialize (o );
134137 }
135138
136139 @ Override
137- @ SuppressWarnings ("unchecked" )
138140 public AbstractRememberMeManager .RememberedIdentity deserialize (byte [] serialized ) {
139- try (var ois = new java . io . ObjectInputStream (new java . io . ByteArrayInputStream (serialized ))) {
141+ try (var ois = new ObjectInputStream (new ByteArrayInputStream (serialized ))) {
140142 return (AbstractRememberMeManager .RememberedIdentity ) ois .readObject ();
141143 } catch (IOException | ClassNotFoundException e ) {
142144 throw new RuntimeException (e );
143145 }
144146 }
145147 });
146148
147- PrincipalCollection principals = new SimplePrincipalCollection ("joecool" , "myRealm" );
149+ PrincipalCollection principals = ImmutablePrincipalCollection . ofSinglePrincipal ("joecool" , "myRealm" );
148150 rmm .rememberIdentity (null , principals );
149151 PrincipalCollection remembered = rmm .getRememberedPrincipals (new DefaultSubjectContext ());
150152
@@ -164,6 +166,7 @@ private static byte[] plainJdkSerialize(Object o) {
164166 }
165167
166168 public static class NotAllowlisted implements Serializable {
169+ @ Serial
167170 private static final long serialVersionUID = 1L ;
168171 }
169172
0 commit comments