Browse Source

DomainID class

Jason Rivard 4 years ago
parent
commit
dd4bf15fce

+ 4 - 4
server/src/main/java/password/pwm/PwmApplication.java

@@ -23,6 +23,7 @@ package password.pwm;
 import com.novell.ldapchai.ChaiUser;
 import com.novell.ldapchai.ChaiUser;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.provider.ChaiProvider;
 import com.novell.ldapchai.provider.ChaiProvider;
+import password.pwm.bean.DomainID;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SmsItemBean;
 import password.pwm.bean.SmsItemBean;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
@@ -119,7 +120,7 @@ public class PwmApplication
 
 
     private final AtomicInteger activeServletRequests = new AtomicInteger( 0 );
     private final AtomicInteger activeServletRequests = new AtomicInteger( 0 );
 
 
-    private Map<String, PwmDomain> domains;
+    private Map<DomainID, PwmDomain> domains;
     private String runtimeNonce = PwmRandom.getInstance().randomUUID().toString();
     private String runtimeNonce = PwmRandom.getInstance().randomUUID().toString();
 
 
     private final PwmServiceManager pwmServiceManager = new PwmServiceManager();
     private final PwmServiceManager pwmServiceManager = new PwmServiceManager();
@@ -165,8 +166,7 @@ public class PwmApplication
         this.domains = this.pwmEnvironment.getConfig().getDomainIDs().stream()
         this.domains = this.pwmEnvironment.getConfig().getDomainIDs().stream()
                 .collect( Collectors.toUnmodifiableMap(
                 .collect( Collectors.toUnmodifiableMap(
                         ( domainID ) -> domainID,
                         ( domainID ) -> domainID,
-                        ( domainID ) -> new PwmDomain( this, domainID )
-                ) );
+                        ( domainID ) -> new PwmDomain( this, domainID ) ) );
 
 
 
 
         // initialize log4j
         // initialize log4j
@@ -379,7 +379,7 @@ public class PwmApplication
         return new PwmApplication( pwmEnvironment );
         return new PwmApplication( pwmEnvironment );
     }
     }
 
 
-    public Map<String, PwmDomain> getDomains()
+    public Map<DomainID, PwmDomain> getDomains()
     {
     {
         return domains;
         return domains;
     }
     }

+ 2 - 1
server/src/main/java/password/pwm/PwmConstants.java

@@ -22,6 +22,7 @@ package password.pwm;
 
 
 import com.novell.ldapchai.ChaiConstant;
 import com.novell.ldapchai.ChaiConstant;
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVFormat;
+import password.pwm.bean.DomainID;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 
 
 import java.io.InputStream;
 import java.io.InputStream;
@@ -94,7 +95,7 @@ public abstract class PwmConstants
     public static final String PROFILE_ID_DEFAULT = "default";
     public static final String PROFILE_ID_DEFAULT = "default";
 
 
     public static final String DOMAIN_ID_DEFAULT = "default";
     public static final String DOMAIN_ID_DEFAULT = "default";
-    public static final String DOMAIN_ID_PLACEHOLDER = "default";
+    public static final DomainID DOMAIN_ID_PLACEHOLDER = DomainID.create( "default" );
 
 
     public static final String TOKEN_KEY_PWD_CHG_DATE = "_lastPwdChange";
     public static final String TOKEN_KEY_PWD_CHG_DATE = "_lastPwdChange";
 
 

+ 3 - 2
server/src/main/java/password/pwm/PwmDomain.java

@@ -22,6 +22,7 @@ package password.pwm;
 
 
 import com.novell.ldapchai.ChaiUser;
 import com.novell.ldapchai.ChaiUser;
 import com.novell.ldapchai.provider.ChaiProvider;
 import com.novell.ldapchai.provider.ChaiProvider;
+import password.pwm.bean.DomainID;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.DomainConfig;
 import password.pwm.config.DomainConfig;
@@ -79,9 +80,9 @@ public class PwmDomain
     private static final PwmLogger LOGGER = PwmLogger.forClass( PwmDomain.class );
     private static final PwmLogger LOGGER = PwmLogger.forClass( PwmDomain.class );
 
 
     private final PwmApplication pwmApplication;
     private final PwmApplication pwmApplication;
-    private final String domainID;
+    private final DomainID domainID;
 
 
-    public PwmDomain( final PwmApplication pwmApplication, final String domainID )
+    public PwmDomain( final PwmApplication pwmApplication, final DomainID domainID )
     {
     {
         this.pwmApplication = Objects.requireNonNull( pwmApplication );
         this.pwmApplication = Objects.requireNonNull( pwmApplication );
         this.domainID = Objects.requireNonNull( domainID );
         this.domainID = Objects.requireNonNull( domainID );

+ 88 - 0
server/src/main/java/password/pwm/bean/DomainID.java

@@ -0,0 +1,88 @@
+/*
+ * Password Management Servlets (PWM)
+ * http://www.pwm-project.org
+ *
+ * Copyright (c) 2006-2009 Novell, Inc.
+ * Copyright (c) 2009-2020 The PWM Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package password.pwm.bean;
+
+import org.jetbrains.annotations.NotNull;
+import password.pwm.config.PwmSetting;
+
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.regex.Pattern;
+
+public class DomainID implements Comparable<DomainID>, Serializable
+{
+    private static final DomainID SYSTEM_DOMAIN_ID = new DomainID( "system" );
+    private static final Pattern REGEX_PATTERN = PwmSetting.DOMAIN_LIST.getRegExPattern();
+
+    private final String domainID;
+
+    private DomainID( final String domainID )
+    {
+        this.domainID = Objects.requireNonNull( domainID );
+    }
+
+    public static DomainID create( final String domainID )
+    {
+        if ( !REGEX_PATTERN.matcher( domainID ).matches() )
+        {
+            throw new IllegalArgumentException( "domainID value does not match required syntax pattern" );
+        }
+        return new DomainID( domainID );
+    }
+
+    @Override
+    public boolean equals( final Object o )
+    {
+        if ( this == o )
+        {
+            return true;
+        }
+        if ( o == null || getClass() != o.getClass() )
+        {
+            return false;
+        }
+        final DomainID domainID1 = ( DomainID ) o;
+        return Objects.equals( domainID, domainID1.domainID );
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash( domainID );
+    }
+
+    @Override
+    public int compareTo( @NotNull final DomainID o )
+    {
+        return this.domainID.compareTo( o.domainID );
+    }
+
+    @Override
+    public String toString()
+    {
+        return domainID;
+    }
+
+    public static DomainID systemId()
+    {
+        return SYSTEM_DOMAIN_ID;
+    }
+}

+ 23 - 28
server/src/main/java/password/pwm/bean/UserIdentity.java

@@ -52,35 +52,50 @@ public class UserIdentity implements Serializable, Comparable<UserIdentity>
     private static final String CRYPO_HEADER = "ui_C-";
     private static final String CRYPO_HEADER = "ui_C-";
     private static final String DELIM_SEPARATOR = "|";
     private static final String DELIM_SEPARATOR = "|";
 
 
+    private static final Comparator<UserIdentity> COMPARATOR = Comparator.comparing(
+            UserIdentity::getDomainID,
+            Comparator.nullsLast( Comparator.naturalOrder() ) )
+            .thenComparing(
+                    UserIdentity::getLdapProfileID,
+                    Comparator.nullsLast( Comparator.naturalOrder() ) )
+            .thenComparing(
+                    UserIdentity::getDomainID,
+                    Comparator.nullsLast( Comparator.naturalOrder() ) );
+
+
     private transient String obfuscatedValue;
     private transient String obfuscatedValue;
     private transient boolean canonical;
     private transient boolean canonical;
 
 
     private final String userDN;
     private final String userDN;
     private final String ldapProfile;
     private final String ldapProfile;
-    private final String domainID;
+    private final DomainID domainID;
 
 
     public enum Flag
     public enum Flag
     {
     {
         PreCanonicalized,
         PreCanonicalized,
     }
     }
 
 
-    private UserIdentity( final String userDN, final String ldapProfile, final String domainID )
+    private UserIdentity( final String userDN, final String ldapProfile, final DomainID domainID )
     {
     {
         this.userDN = JavaHelper.requireNonEmpty( userDN, "UserIdentity: userDN value cannot be empty" );
         this.userDN = JavaHelper.requireNonEmpty( userDN, "UserIdentity: userDN value cannot be empty" );
         this.ldapProfile = JavaHelper.requireNonEmpty( ldapProfile, "UserIdentity: ldapProfile value cannot be empty" );
         this.ldapProfile = JavaHelper.requireNonEmpty( ldapProfile, "UserIdentity: ldapProfile value cannot be empty" );
-        this.domainID = JavaHelper.requireNonEmpty( domainID, "UserIdentity: domain value cannot be empty" );
+        this.domainID = Objects.requireNonNull( domainID );
     }
     }
 
 
-    public UserIdentity( final String userDN, final String ldapProfile, final String domainID, final boolean canonical )
+    public UserIdentity( final String userDN, final String ldapProfile, final DomainID domainID, final boolean canonical )
     {
     {
         this( userDN, ldapProfile, domainID );
         this( userDN, ldapProfile, domainID );
         this.canonical = canonical;
         this.canonical = canonical;
     }
     }
 
 
-    public static UserIdentity createUserIdentity( final String userDN, final String ldapProfile, final Flag... flags )
+    public static UserIdentity createUserIdentity(
+            final String userDN,
+            final String ldapProfile,
+            final Flag... flags
+    )
     {
     {
         final boolean canonical = JavaHelper.enumArrayContainsValue( flags, Flag.PreCanonicalized );
         final boolean canonical = JavaHelper.enumArrayContainsValue( flags, Flag.PreCanonicalized );
-        return new UserIdentity( userDN, ldapProfile, PwmConstants.DOMAIN_ID_DEFAULT, canonical );
+        return new UserIdentity( userDN, ldapProfile, PwmConstants.DOMAIN_ID_PLACEHOLDER, canonical );
     }
     }
 
 
     public String getUserDN( )
     public String getUserDN( )
@@ -88,7 +103,7 @@ public class UserIdentity implements Serializable, Comparable<UserIdentity>
         return userDN;
         return userDN;
     }
     }
 
 
-    public String getDomainID()
+    public DomainID getDomainID()
     {
     {
         return domainID;
         return domainID;
     }
     }
@@ -253,29 +268,9 @@ public class UserIdentity implements Serializable, Comparable<UserIdentity>
     @Override
     @Override
     public int compareTo( @NotNull final UserIdentity otherIdentity )
     public int compareTo( @NotNull final UserIdentity otherIdentity )
     {
     {
-        return comparator().compare( this, otherIdentity );
+        return COMPARATOR.compare( this, otherIdentity );
     }
     }
 
 
-    private static Comparator<UserIdentity> comparator( )
-    {
-        final Comparator<UserIdentity> domainComparator = Comparator.comparing(
-                UserIdentity::getDomainID,
-                Comparator.nullsLast( Comparator.naturalOrder() ) );
-
-        final Comparator<UserIdentity> profileComparator = Comparator.comparing(
-                UserIdentity::getLdapProfileID,
-                Comparator.nullsLast( Comparator.naturalOrder() ) );
-
-        final Comparator<UserIdentity> userComparator = Comparator.comparing(
-                UserIdentity::getDomainID,
-                Comparator.nullsLast( Comparator.naturalOrder() ) );
-
-        return domainComparator
-                .thenComparing( profileComparator )
-                .thenComparing( userComparator );
-    }
-
-
     public UserIdentity canonicalized( final PwmDomain pwmDomain )
     public UserIdentity canonicalized( final PwmDomain pwmDomain )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {

+ 8 - 6
server/src/main/java/password/pwm/config/AppConfig.java

@@ -22,6 +22,7 @@ package password.pwm.config;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
+import password.pwm.bean.DomainID;
 import password.pwm.bean.PrivateKeyCertificate;
 import password.pwm.bean.PrivateKeyCertificate;
 import password.pwm.config.stored.StoredConfiguration;
 import password.pwm.config.stored.StoredConfiguration;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
@@ -54,7 +55,7 @@ public class AppConfig
 
 
     private final StoredConfiguration storedConfiguration;
     private final StoredConfiguration storedConfiguration;
     private final SettingReader settingReader;
     private final SettingReader settingReader;
-    private final Map<String, DomainConfig> domainConfigMap;
+    private final Map<DomainID, DomainConfig> domainConfigMap;
 
 
     private PwmSecurityKey tempInstanceKey = null;
     private PwmSecurityKey tempInstanceKey = null;
 
 
@@ -64,16 +65,17 @@ public class AppConfig
         this.settingReader = new SettingReader( storedConfiguration, null, null );
         this.settingReader = new SettingReader( storedConfiguration, null, null );
         domainConfigMap = getDomainIDs().stream()
         domainConfigMap = getDomainIDs().stream()
                 .collect( Collectors.toUnmodifiableMap(
                 .collect( Collectors.toUnmodifiableMap(
-                ( domainID ) -> domainID,
-                ( domainID ) -> new DomainConfig( this, domainID ) ) );
+                        ( domainID ) -> domainID,
+                        ( domainID ) -> new DomainConfig( this, domainID ) ) );
     }
     }
 
 
-    public List<String> getDomainIDs()
+    public List<DomainID> getDomainIDs()
     {
     {
-        return settingReader.readSettingAsStringArray( PwmSetting.DOMAIN_LIST );
+        final List<String> strings = settingReader.readSettingAsStringArray( PwmSetting.DOMAIN_LIST );
+        return strings.stream().map( DomainID::create ).collect( Collectors.toUnmodifiableList() );
     }
     }
 
 
-    public Map<String, DomainConfig> getDomainConfigs()
+    public Map<DomainID, DomainConfig> getDomainConfigs()
     {
     {
         return domainConfigMap;
         return domainConfigMap;
     }
     }

+ 4 - 3
server/src/main/java/password/pwm/config/DomainConfig.java

@@ -22,6 +22,7 @@ package password.pwm.config;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
+import password.pwm.bean.DomainID;
 import password.pwm.bean.EmailItemBean;
 import password.pwm.bean.EmailItemBean;
 import password.pwm.bean.PrivateKeyCertificate;
 import password.pwm.bean.PrivateKeyCertificate;
 import password.pwm.config.option.CertificateMatchingMode;
 import password.pwm.config.option.CertificateMatchingMode;
@@ -94,14 +95,14 @@ public class DomainConfig
 
 
     private final StoredConfiguration storedConfiguration;
     private final StoredConfiguration storedConfiguration;
     private final AppConfig appConfig;
     private final AppConfig appConfig;
-    private final String domainID;
+    private final DomainID domainID;
 
 
     private final ConfigurationSuppliers configurationSuppliers = new ConfigurationSuppliers();
     private final ConfigurationSuppliers configurationSuppliers = new ConfigurationSuppliers();
 
 
     private final DataCache dataCache = new DataCache();
     private final DataCache dataCache = new DataCache();
     private final SettingReader settingReader;
     private final SettingReader settingReader;
 
 
-    public DomainConfig( final AppConfig appConfig, final String domainID )
+    public DomainConfig( final AppConfig appConfig, final DomainID domainID )
     {
     {
         this.appConfig = Objects.requireNonNull( appConfig );
         this.appConfig = Objects.requireNonNull( appConfig );
         this.storedConfiguration = appConfig.getStoredConfiguration();
         this.storedConfiguration = appConfig.getStoredConfiguration();
@@ -383,7 +384,7 @@ public class DomainConfig
         return storedConfiguration.readSetting( setting, null );
         return storedConfiguration.readSetting( setting, null );
     }
     }
 
 
-    public String getDomainID()
+    public DomainID getDomainID()
     {
     {
         return domainID;
         return domainID;
     }
     }

+ 3 - 2
server/src/main/java/password/pwm/config/SettingReader.java

@@ -20,6 +20,7 @@
 
 
 package password.pwm.config;
 package password.pwm.config;
 
 
+import password.pwm.bean.DomainID;
 import password.pwm.bean.PrivateKeyCertificate;
 import password.pwm.bean.PrivateKeyCertificate;
 import password.pwm.config.stored.StoredConfigItemKey;
 import password.pwm.config.stored.StoredConfigItemKey;
 import password.pwm.config.stored.StoredConfiguration;
 import password.pwm.config.stored.StoredConfiguration;
@@ -48,9 +49,9 @@ public class SettingReader
 
 
     private final StoredConfiguration storedConfiguration;
     private final StoredConfiguration storedConfiguration;
     private final String profileID;
     private final String profileID;
-    private final String domainID;
+    private final DomainID domainID;
 
 
-    public SettingReader( final StoredConfiguration storedConfiguration, final String profileID, final String domainID )
+    public SettingReader( final StoredConfiguration storedConfiguration, final String profileID, final DomainID domainID )
     {
     {
         this.storedConfiguration = Objects.requireNonNull( storedConfiguration );
         this.storedConfiguration = Objects.requireNonNull( storedConfiguration );
         this.profileID = profileID;
         this.profileID = profileID;

+ 5 - 4
server/src/main/java/password/pwm/config/stored/StoredConfigItemKey.java

@@ -22,6 +22,7 @@ package password.pwm.config.stored;
 
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
+import password.pwm.bean.DomainID;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSettingSyntax;
 import password.pwm.config.PwmSettingSyntax;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
@@ -62,13 +63,13 @@ public class StoredConfigItemKey implements Serializable, Comparable<StoredConfi
     }
     }
 
 
     private final RecordType recordType;
     private final RecordType recordType;
-    private final String domainID;
+    private final DomainID domainID;
     private final String recordID;
     private final String recordID;
     private final String profileID;
     private final String profileID;
 
 
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
-    private StoredConfigItemKey( final RecordType recordType, final String domainID, final String recordID, final String profileID )
+    private StoredConfigItemKey( final RecordType recordType, final DomainID domainID, final String recordID, final String profileID )
     {
     {
         Objects.requireNonNull( recordType, "recordType can not be null" );
         Objects.requireNonNull( recordType, "recordType can not be null" );
         Objects.requireNonNull( recordID, "recordID can not be null" );
         Objects.requireNonNull( recordID, "recordID can not be null" );
@@ -84,7 +85,7 @@ public class StoredConfigItemKey implements Serializable, Comparable<StoredConfi
         return recordType;
         return recordType;
     }
     }
 
 
-    public String getDomainID()
+    public DomainID getDomainID()
     {
     {
         return domainID;
         return domainID;
     }
     }
@@ -104,7 +105,7 @@ public class StoredConfigItemKey implements Serializable, Comparable<StoredConfi
         return new StoredConfigItemKey( RecordType.SETTING, null, pwmSetting.getKey(), profileID );
         return new StoredConfigItemKey( RecordType.SETTING, null, pwmSetting.getKey(), profileID );
     }
     }
 
 
-    public static StoredConfigItemKey fromSetting( final PwmSetting pwmSetting, final String profileID, final String domainID )
+    public static StoredConfigItemKey fromSetting( final PwmSetting pwmSetting, final String profileID, final DomainID domainID )
     {
     {
         return new StoredConfigItemKey( RecordType.SETTING, domainID, pwmSetting.getKey(), profileID );
         return new StoredConfigItemKey( RecordType.SETTING, domainID, pwmSetting.getKey(), profileID );
     }
     }

+ 3 - 2
server/src/main/java/password/pwm/http/PwmRequest.java

@@ -30,6 +30,7 @@ import password.pwm.PwmApplication;
 import password.pwm.PwmDomain;
 import password.pwm.PwmDomain;
 import password.pwm.PwmApplicationMode;
 import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
+import password.pwm.bean.DomainID;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.bean.LoginInfoBean;
 import password.pwm.bean.LoginInfoBean;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
@@ -614,9 +615,9 @@ public class PwmRequest extends PwmHttpRequestWrapper
         return requestStartTime;
         return requestStartTime;
     }
     }
 
 
-    public String getDomainID()
+    public DomainID getDomainID()
     {
     {
-        return PwmConstants.DOMAIN_ID_DEFAULT;
+        return PwmConstants.DOMAIN_ID_PLACEHOLDER;
     }
     }
 
 
     public PwmApplication getPwmApplication()
     public PwmApplication getPwmApplication()

+ 22 - 0
server/src/main/java/password/pwm/util/java/JsonUtil.java

@@ -32,6 +32,7 @@ import com.google.gson.JsonSerializer;
 import com.google.gson.reflect.TypeToken;
 import com.google.gson.reflect.TypeToken;
 import com.novell.ldapchai.cr.ChallengeSet;
 import com.novell.ldapchai.cr.ChallengeSet;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
+import password.pwm.bean.DomainID;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.ldap.PwmLdapVendor;
 import password.pwm.ldap.PwmLdapVendor;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
@@ -373,6 +374,26 @@ public class JsonUtil
         }
         }
     }
     }
 
 
+    private static class DomainIDTypeAdaptor implements JsonSerializer<DomainID>, JsonDeserializer<DomainID>
+    {
+        @Override
+        public DomainID deserialize( final JsonElement json, final Type typeOfT, final JsonDeserializationContext context ) throws JsonParseException
+        {
+            final String sValue = json.getAsString();
+            if ( DomainID.systemId().toString().equals( sValue ) )
+            {
+                return DomainID.systemId();
+            }
+            return DomainID.create( json.getAsString() );
+        }
+
+        @Override
+        public JsonElement serialize( final DomainID src, final Type typeOfSrc, final JsonSerializationContext context )
+        {
+            return new JsonPrimitive( src.toString() );
+        }
+    }
+
     private static GsonBuilder registerTypeAdapters( final GsonBuilder gsonBuilder )
     private static GsonBuilder registerTypeAdapters( final GsonBuilder gsonBuilder )
     {
     {
         gsonBuilder.registerTypeAdapter( Date.class, new DateTypeAdapter() );
         gsonBuilder.registerTypeAdapter( Date.class, new DateTypeAdapter() );
@@ -381,6 +402,7 @@ public class JsonUtil
         gsonBuilder.registerTypeAdapter( byte[].class, new ByteArrayToBase64TypeAdapter() );
         gsonBuilder.registerTypeAdapter( byte[].class, new ByteArrayToBase64TypeAdapter() );
         gsonBuilder.registerTypeAdapter( PasswordData.class, new PasswordDataTypeAdapter() );
         gsonBuilder.registerTypeAdapter( PasswordData.class, new PasswordDataTypeAdapter() );
         gsonBuilder.registerTypeAdapter( PwmLdapVendorTypeAdaptor.class, new PwmLdapVendorTypeAdaptor() );
         gsonBuilder.registerTypeAdapter( PwmLdapVendorTypeAdaptor.class, new PwmLdapVendorTypeAdaptor() );
+        gsonBuilder.registerTypeAdapter( DomainID.class, new DomainIDTypeAdaptor() );
         return gsonBuilder;
         return gsonBuilder;
     }
     }