Jelajahi Sumber

admin log-viewer enhancements
added csp form-action directive
refactor build property reader
update depdendencies

Jason Rivard 7 tahun lalu
induk
melakukan
ffa38b0d21

+ 1 - 0
client/pom.xml

@@ -131,6 +131,7 @@
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
                             <Implementation-Build>${build.number}</Implementation-Build>
                             <Implementation-Build>${build.number}</Implementation-Build>
+                            <Implementation-Build-Timestamp>${timestamp.iso}</Implementation-Build-Timestamp>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                         </manifestEntries>
                         </manifestEntries>

+ 2 - 1
onejar/pom.xml

@@ -16,7 +16,7 @@
     <name>PWM Password Self Service: Executable Jar</name>
     <name>PWM Password Self Service: Executable Jar</name>
 
 
     <properties>
     <properties>
-        <tomcat.version>9.0.7</tomcat.version>
+        <tomcat.version>9.0.8</tomcat.version>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
         <maven.compiler.target>1.8</maven.compiler.target>
         <warArtifactID>pwm-${project.version}.war</warArtifactID>
         <warArtifactID>pwm-${project.version}.war</warArtifactID>
@@ -88,6 +88,7 @@
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
                             <Implementation-Build>${build.number}</Implementation-Build>
                             <Implementation-Build>${build.number}</Implementation-Build>
+                            <Implementation-Build-Timestamp>${timestamp.iso}</Implementation-Build-Timestamp>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                         </manifestEntries>
                         </manifestEntries>

+ 1 - 0
pom.xml

@@ -27,6 +27,7 @@
         <build.revision>0</build.revision>  <!-- default in case not set on command line -->
         <build.revision>0</build.revision>  <!-- default in case not set on command line -->
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <pwm.minimum.maven.version>3.2</pwm.minimum.maven.version>
         <pwm.minimum.maven.version>3.2</pwm.minimum.maven.version>
+        <timestamp.iso>${maven.build.timestamp}</timestamp.iso>
     </properties>
     </properties>
 
 
     <modules>
     <modules>

+ 22 - 7
server/pom.xml

@@ -19,7 +19,6 @@
         <maven.compiler.target>1.8</maven.compiler.target>
         <maven.compiler.target>1.8</maven.compiler.target>
         <skipTests>false</skipTests>
         <skipTests>false</skipTests>
         <skipSpotbugs>false</skipSpotbugs>
         <skipSpotbugs>false</skipSpotbugs>
-        <timestamp.iso>${maven.build.timestamp}</timestamp.iso>
     </properties>
     </properties>
 
 
     <profiles>
     <profiles>
@@ -82,7 +81,7 @@
             <plugin>
             <plugin>
                 <groupId>com.github.spotbugs</groupId>
                 <groupId>com.github.spotbugs</groupId>
                 <artifactId>spotbugs-maven-plugin</artifactId>
                 <artifactId>spotbugs-maven-plugin</artifactId>
-                <version>3.1.3</version>
+                <version>3.1.3.1</version>
                 <dependencies>
                 <dependencies>
                     <dependency>
                     <dependency>
                         <groupId>com.github.spotbugs</groupId>
                         <groupId>com.github.spotbugs</groupId>
@@ -206,11 +205,15 @@
                     <includePom>true</includePom>
                     <includePom>true</includePom>
                     <archive>
                     <archive>
                         <manifestEntries>
                         <manifestEntries>
+                            <Implementation-Archive-Name>pwm.source</Implementation-Archive-Name>
                             <Implementation-Title>${project.name}</Implementation-Title>
                             <Implementation-Title>${project.name}</Implementation-Title>
                             <Implementation-Version>${project.version}</Implementation-Version>
                             <Implementation-Version>${project.version}</Implementation-Version>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
+                            <Implementation-Build-Java-Vendor>${java.vendor}</Implementation-Build-Java-Vendor>
+                            <Implementation-Build-Java-Version>${java.version}</Implementation-Build-Java-Version>
                             <Implementation-Build>${build.number}</Implementation-Build>
                             <Implementation-Build>${build.number}</Implementation-Build>
+                            <Implementation-Build-Timestamp>${timestamp.iso}</Implementation-Build-Timestamp>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                         </manifestEntries>
                         </manifestEntries>
@@ -224,11 +227,15 @@
                 <configuration>
                 <configuration>
                     <archive>
                     <archive>
                         <manifestEntries>
                         <manifestEntries>
+                            <Implementation-Archive-Name>pwm.javadoc</Implementation-Archive-Name>
                             <Implementation-Title>${project.name}</Implementation-Title>
                             <Implementation-Title>${project.name}</Implementation-Title>
                             <Implementation-Version>${project.version}</Implementation-Version>
                             <Implementation-Version>${project.version}</Implementation-Version>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
+                            <Implementation-Build-Java-Vendor>${java.vendor}</Implementation-Build-Java-Vendor>
+                            <Implementation-Build-Java-Version>${java.version}</Implementation-Build-Java-Version>
                             <Implementation-Build>${build.number}</Implementation-Build>
                             <Implementation-Build>${build.number}</Implementation-Build>
+                            <Implementation-Build-Timestamp>${timestamp.iso}</Implementation-Build-Timestamp>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                         </manifestEntries>
                         </manifestEntries>
@@ -244,11 +251,15 @@
                     <packagingExcludes>WEB-INF/classes</packagingExcludes>
                     <packagingExcludes>WEB-INF/classes</packagingExcludes>
                     <archive>
                     <archive>
                         <manifestEntries>
                         <manifestEntries>
+                            <Implementation-Archive-Name>pwm.war</Implementation-Archive-Name>
                             <Implementation-Title>${project.name}</Implementation-Title>
                             <Implementation-Title>${project.name}</Implementation-Title>
                             <Implementation-Version>${project.version}</Implementation-Version>
                             <Implementation-Version>${project.version}</Implementation-Version>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
+                            <Implementation-Build-Java-Vendor>${java.vendor}</Implementation-Build-Java-Vendor>
+                            <Implementation-Build-Java-Version>${java.version}</Implementation-Build-Java-Version>
                             <Implementation-Build>${build.number}</Implementation-Build>
                             <Implementation-Build>${build.number}</Implementation-Build>
+                            <Implementation-Build-Timestamp>${timestamp.iso}</Implementation-Build-Timestamp>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                         </manifestEntries>
                         </manifestEntries>
@@ -263,7 +274,7 @@
                     <dependency>
                     <dependency>
                         <groupId>com.puppycrawl.tools</groupId>
                         <groupId>com.puppycrawl.tools</groupId>
                         <artifactId>checkstyle</artifactId>
                         <artifactId>checkstyle</artifactId>
-                        <version>8.9</version>
+                        <version>8.10</version>
                     </dependency>
                     </dependency>
                 </dependencies>
                 </dependencies>
                 <executions>
                 <executions>
@@ -456,11 +467,15 @@
                 <configuration>
                 <configuration>
                     <archive>
                     <archive>
                         <manifestEntries>
                         <manifestEntries>
+                            <Implementation-Archive-Name>pwm.jar</Implementation-Archive-Name>
                             <Implementation-Title>${project.name}</Implementation-Title>
                             <Implementation-Title>${project.name}</Implementation-Title>
                             <Implementation-Version>${project.version}</Implementation-Version>
                             <Implementation-Version>${project.version}</Implementation-Version>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
                             <Implementation-URL>${project.organization.url}</Implementation-URL>
+                            <Implementation-Build-Java-Vendor>${java.vendor}</Implementation-Build-Java-Vendor>
+                            <Implementation-Build-Java-Version>${java.version}</Implementation-Build-Java-Version>
                             <Implementation-Build>${build.number}</Implementation-Build>
                             <Implementation-Build>${build.number}</Implementation-Build>
+                            <Implementation-Build-Timestamp>${timestamp.iso}</Implementation-Build-Timestamp>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Revision>${build.revision}</Implementation-Revision>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                             <Implementation-Version-Display>v${project.version} b${build.number} r${build.revision}</Implementation-Version-Display>
                         </manifestEntries>
                         </manifestEntries>
@@ -529,7 +544,7 @@
             <plugin> <!-- checks owsp vulnerability database -->
             <plugin> <!-- checks owsp vulnerability database -->
                 <groupId>org.owasp</groupId>
                 <groupId>org.owasp</groupId>
                 <artifactId>dependency-check-maven</artifactId>
                 <artifactId>dependency-check-maven</artifactId>
-                <version>3.1.1</version>
+                <version>3.1.2</version>
                 <reportSets>
                 <reportSets>
                     <reportSet>
                     <reportSet>
                         <reports>
                         <reports>
@@ -592,7 +607,7 @@
         <dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <artifactId>javax.servlet-api</artifactId>
-            <version>4.0.0</version>
+            <version>4.0.1</version>
             <scope>provided</scope>
             <scope>provided</scope>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
@@ -734,7 +749,7 @@
         <dependency>
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
             <artifactId>gson</artifactId>
-            <version>2.8.2</version>
+            <version>2.8.4</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>com.blueconic</groupId>
             <groupId>com.blueconic</groupId>
@@ -744,7 +759,7 @@
         <dependency>
         <dependency>
             <groupId>org.jetbrains.xodus</groupId>
             <groupId>org.jetbrains.xodus</groupId>
             <artifactId>xodus-environment</artifactId>
             <artifactId>xodus-environment</artifactId>
-            <version>1.2.2</version>
+            <version>1.2.3</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <groupId>org.slf4j</groupId>

+ 93 - 180
server/src/main/java/password/pwm/PwmAboutProperty.java

@@ -31,84 +31,94 @@ import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.PwmRandom;
 import password.pwm.util.secure.PwmRandom;
 
 
+import java.lang.management.ManagementFactory;
 import java.nio.charset.Charset;
 import java.nio.charset.Charset;
 import java.time.Instant;
 import java.time.Instant;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.TreeMap;
 
 
 public enum PwmAboutProperty
 public enum PwmAboutProperty
 {
 {
 
 
-    app_version( null ),
-    app_chaiApiVersion( null ),
-    app_currentTime( null ),
-    app_startTime( null ),
-    app_installTime( null ),
-    app_currentPublishedVersion( null ),
-    app_currentPublishedVersionCheckTime( null ),
-    app_siteUrl( null ),
-    app_instanceID( null ),
-    app_trialMode( null ),
-    app_mode_appliance( null ),
-    app_mode_docker( null ),
-    app_mode_manageHttps( null ),
-    app_applicationPath( null ),
-    app_environmentFlags( null ),
-    app_wordlistSize( null ),
-    app_seedlistSize( null ),
-    app_sharedHistorySize( null ),
-    app_sharedHistoryOldestTime( null ),
-    app_emailQueueSize( null ),
-    app_emailQueueOldestTime( null ),
-    app_smsQueueSize( null ),
-    app_smsQueueOldestTime( null ),
-    app_syslogQueueSize( null ),
-    app_localDbLogSize( null ),
-    app_localDbLogOldestTime( null ),
-    app_localDbStorageSize( null ),
-    app_localDbFreeSpace( null ),
-    app_configurationRestartCounter( null ),
-    app_secureBlockAlgorithm( null ),
-    app_secureHashAlgorithm( null ),
-    app_ldapProfileCount( null ),
-
-    build_Time( null ),
-    build_Number( null ),
-    build_Type( null ),
-    build_User( null ),
-    build_Revision( null ),
-    build_JavaVendor( null ),
-    build_JavaVersion( null ),
-    build_Version( null ),
-
-    java_memoryFree( "Java Memory Free" ),
-    java_memoryAllocated( "Java Memory Allocated" ),
-    java_memoryMax( "Java Memory Max" ),
-    java_threadCount( "Java Thread Count" ),
-    java_vmVendor( "Java Vendor" ),
-    java_vmLocation( "Java VM Location" ),
-    java_vmVersion( "Java VM Version" ),
-    java_runtimeVersion( "Java Runtime Version" ),
-    java_vmName( "Java VM Name" ),
-    java_osName( "Java OS Name" ),
-    java_osVersion( "Java OS Version" ),
-    java_osArch( "Java OS Architecture" ),
-    java_randomAlgorithm( null ),
-    java_defaultCharset( null ),
-    java_appServerInfo( "Java AppServer Info" ),
-
-    database_driverName( null ),
-    database_driverVersion( null ),
-    database_databaseProductName( null ),
-    database_databaseProductVersion( null ),;
+    app_version( null, pwmApplication -> PwmConstants.SERVLET_VERSION ),
+    app_chaiApiVersion( null, pwmApplication -> PwmConstants.CHAI_API_VERSION ),
+    app_currentTime( null, pwmApplication -> format( Instant.now() ) ),
+    app_startTime( null, pwmApplication -> format( pwmApplication.getStartupTime() ) ),
+    app_installTime( null, pwmApplication -> format( pwmApplication.getInstallTime() ) ),
+    app_siteUrl( null, pwmApplication -> pwmApplication.getConfig().readSettingAsString( PwmSetting.PWM_SITE_URL ) ),
+    app_instanceID( null, PwmApplication::getInstanceID ),
+    app_trialMode( null, pwmApplication -> Boolean.toString( PwmConstants.TRIAL_MODE ) ),
+    app_mode_appliance( null, pwmApplication -> Boolean.toString( pwmApplication.getPwmEnvironment().getFlags().contains( PwmEnvironment.ApplicationFlag.Appliance ) ) ),
+    app_mode_docker( null, pwmApplication -> Boolean.toString( pwmApplication.getPwmEnvironment().getFlags().contains( PwmEnvironment.ApplicationFlag.Docker ) ) ),
+    app_mode_manageHttps( null, pwmApplication -> Boolean.toString( pwmApplication.getPwmEnvironment().getFlags().contains( PwmEnvironment.ApplicationFlag.ManageHttps ) ) ),
+    app_applicationPath( null, pwmApplication -> pwmApplication.getPwmEnvironment().getApplicationPath().getAbsolutePath() ),
+    app_environmentFlags( null, pwmApplication -> StringUtil.collectionToString( pwmApplication.getPwmEnvironment().getFlags() ) ),
+    app_wordlistSize( null, pwmApplication -> Integer.toString( pwmApplication.getWordlistManager().size() ) ),
+    app_seedlistSize( null, pwmApplication -> Integer.toString( pwmApplication.getSeedlistManager().size() ) ),
+    app_sharedHistorySize( null, pwmApplication -> Integer.toString( pwmApplication.getSharedHistoryManager().size() ) ),
+    app_sharedHistoryOldestTime( null, pwmApplication -> format( pwmApplication.getSharedHistoryManager().getOldestEntryTime() ) ),
+    app_emailQueueSize( null, pwmApplication -> Integer.toString( pwmApplication.getEmailQueue().queueSize() ) ),
+    app_emailQueueOldestTime( null, pwmApplication -> format( Date.from( pwmApplication.getEmailQueue().eldestItem() ) ) ),
+    app_smsQueueSize( null, pwmApplication -> Integer.toString( pwmApplication.getSmsQueue().queueSize() ) ),
+    app_smsQueueOldestTime( null, pwmApplication -> format( Date.from( pwmApplication.getSmsQueue().eldestItem() ) ) ),
+    app_syslogQueueSize( null, pwmApplication -> Integer.toString( pwmApplication.getAuditManager().syslogQueueSize() ) ),
+    app_localDbLogSize( null, pwmApplication -> Integer.toString( pwmApplication.getLocalDBLogger().getStoredEventCount() ) ),
+    app_localDbLogOldestTime( null, pwmApplication -> format( pwmApplication.getLocalDBLogger().getTailDate() ) ),
+    app_localDbStorageSize( null, pwmApplication -> StringUtil.formatDiskSize( FileSystemUtility.getFileDirectorySize( pwmApplication.getLocalDB().getFileLocation() ) ) ),
+    app_localDbFreeSpace( null, pwmApplication -> StringUtil.formatDiskSize( FileSystemUtility.diskSpaceRemaining( pwmApplication.getLocalDB().getFileLocation() ) ) ),
+    app_configurationRestartCounter( null, pwmApplication -> Integer.toString( pwmApplication.getPwmEnvironment().getContextManager().getRestartCount() ) ),
+    app_secureBlockAlgorithm( null, pwmApplication -> pwmApplication.getSecureService().getDefaultBlockAlgorithm().getLabel() ),
+    app_secureHashAlgorithm( null, pwmApplication -> pwmApplication.getSecureService().getDefaultHashAlgorithm().toString() ),
+    app_ldapProfileCount( null, pwmApplication -> Integer.toString( pwmApplication.getConfig().getLdapProfiles().size() ) ),
+
+    build_Time( "Build Time", pwmApplication -> PwmConstants.BUILD_TIME ),
+    build_Number( "Build Number", pwmApplication -> PwmConstants.BUILD_NUMBER ),
+    build_Revision( "Build Revision", pwmApplication -> PwmConstants.BUILD_REVISION ),
+    build_JavaVendor( "Build Java Vendor", pwmApplication -> PwmConstants.BUILD_JAVA_VENDOR ),
+    build_JavaVersion( "Build Java Version", pwmApplication -> PwmConstants.BUILD_JAVA_VERSION ),
+    build_Version( "Build Version", pwmApplication -> PwmConstants.BUILD_VERSION ),
+
+    java_memoryFree( "Java Memory Free", pwmApplication -> Long.toString( Runtime.getRuntime().freeMemory() ) ),
+    java_memoryAllocated( "Java Memory Allocated", pwmApplication -> Long.toString( Runtime.getRuntime().totalMemory() ) ),
+    java_memoryMax( "Java Memory Max", pwmApplication -> Long.toString( Runtime.getRuntime().maxMemory() ) ),
+    java_threadCount( "Java Thread Count", pwmApplication -> Integer.toString( Thread.activeCount() ) ),
+    java_runtimeVersion( "Java Runtime Version", pwmApplication -> System.getProperty( "java.runtime.version" ) ),
+    java_vmName( "Java VM Name", pwmApplication -> System.getProperty( "java.vm.name" ) ),
+    java_vmVendor( "Java VM Vendor", pwmApplication -> System.getProperty( "java.vm.vendor" ) ),
+    java_vmLocation( "Java VM Location", pwmApplication -> System.getProperty( "java.home" ) ),
+    java_vmVersion( "Java VM Version", pwmApplication -> System.getProperty( "java.vm.version" ) ),
+    java_vmCommandLine( "Java VM Command Line", pwmApplication -> StringUtil.collectionToString( ManagementFactory.getRuntimeMXBean().getInputArguments() ) ),
+    java_osName( "Java OS Name", pwmApplication -> System.getProperty( "os.name" ) ),
+    java_osVersion( "Java OS Version", pwmApplication -> System.getProperty( "os.version" ) ),
+    java_osArch( "Java OS Architecture", pwmApplication -> System.getProperty( "os.arch" ) ),
+    java_randomAlgorithm( null, pwmApplication -> PwmRandom.getInstance().getAlgorithm() ),
+    java_defaultCharset( null, pwmApplication -> Charset.defaultCharset().name() ),
+    java_appServerInfo( "Java AppServer Info", pwmApplication -> pwmApplication.getPwmEnvironment().getContextManager().getServerInfo() ),
+
+    database_driverName( null,
+            pwmApplication -> pwmApplication.getDatabaseService().getConnectionDebugProperties().get( DatabaseService.DatabaseAboutProperty.driverName ) ),
+    database_driverVersion( null,
+            pwmApplication -> pwmApplication.getDatabaseService().getConnectionDebugProperties().get( DatabaseService.DatabaseAboutProperty.driverVersion ) ),
+    database_databaseProductName( null,
+            pwmApplication -> pwmApplication.getDatabaseService().getConnectionDebugProperties().get( DatabaseService.DatabaseAboutProperty.databaseProductName ) ),
+    database_databaseProductVersion( null,
+            pwmApplication -> pwmApplication.getDatabaseService().getConnectionDebugProperties().get( DatabaseService.DatabaseAboutProperty.databaseProductVersion ) ),;
 
 
     private final String label;
     private final String label;
+    private final ValueProvider valueProvider;
 
 
-    PwmAboutProperty( final String label )
+    PwmAboutProperty( final String label, final ValueProvider valueProvider )
     {
     {
         this.label = label;
         this.label = label;
+        this.valueProvider = valueProvider;
+    }
+
+    private interface ValueProvider
+    {
+        String value( PwmApplication pwmApplication );
     }
     }
 
 
     private static final PwmLogger LOGGER = PwmLogger.forClass( PwmAboutProperty.class );
     private static final PwmLogger LOGGER = PwmLogger.forClass( PwmAboutProperty.class );
@@ -117,139 +127,42 @@ public enum PwmAboutProperty
             final PwmApplication pwmApplication
             final PwmApplication pwmApplication
     )
     )
     {
     {
-        final Map<PwmAboutProperty, String> aboutMap = new TreeMap<>();
-
-        // about page
-        aboutMap.put( app_version, PwmConstants.SERVLET_VERSION );
-        aboutMap.put( app_currentTime, dateFormatForInfoBean( new Date() ) );
-        aboutMap.put( app_startTime, dateFormatForInfoBean( pwmApplication.getStartupTime() ) );
-        aboutMap.put( app_installTime, dateFormatForInfoBean( pwmApplication.getInstallTime() ) );
-        aboutMap.put( app_siteUrl, pwmApplication.getConfig().readSettingAsString( PwmSetting.PWM_SITE_URL ) );
-        aboutMap.put( app_ldapProfileCount, Integer.toString( pwmApplication.getConfig().getLdapProfiles().size() ) );
-        aboutMap.put( app_instanceID, pwmApplication.getInstanceID() );
-        aboutMap.put( app_trialMode, Boolean.toString( PwmConstants.TRIAL_MODE ) );
-        if ( pwmApplication.getPwmEnvironment() != null )
-        {
-            aboutMap.put( app_mode_appliance, Boolean.toString( pwmApplication.getPwmEnvironment().getFlags().contains( PwmEnvironment.ApplicationFlag.Appliance ) ) );
-            aboutMap.put( app_mode_docker, Boolean.toString( pwmApplication.getPwmEnvironment().getFlags().contains( PwmEnvironment.ApplicationFlag.Docker ) ) );
-            aboutMap.put( app_mode_manageHttps, Boolean.toString( pwmApplication.getPwmEnvironment().getFlags().contains( PwmEnvironment.ApplicationFlag.ManageHttps ) ) );
-            aboutMap.put( app_applicationPath, pwmApplication.getPwmEnvironment().getApplicationPath().getAbsolutePath() );
-            aboutMap.put( app_environmentFlags, StringUtil.collectionToString( pwmApplication.getPwmEnvironment().getFlags(), "," ) );
-        }
-        aboutMap.put( app_chaiApiVersion, PwmConstants.CHAI_API_VERSION );
-
-        aboutMap.put( app_secureBlockAlgorithm, pwmApplication.getSecureService().getDefaultBlockAlgorithm().getLabel() );
-        aboutMap.put( app_secureHashAlgorithm, pwmApplication.getSecureService().getDefaultHashAlgorithm().toString() );
-
-        aboutMap.put( app_wordlistSize, Integer.toString( pwmApplication.getWordlistManager().size() ) );
-        aboutMap.put( app_seedlistSize, Integer.toString( pwmApplication.getSeedlistManager().size() ) );
-        if ( pwmApplication.getSharedHistoryManager() != null )
-        {
-            aboutMap.put( app_sharedHistorySize, Integer.toString( pwmApplication.getSharedHistoryManager().size() ) );
-            aboutMap.put( app_sharedHistoryOldestTime, dateFormatForInfoBean( pwmApplication.getSharedHistoryManager().getOldestEntryTime() ) );
-        }
-
-
-        if ( pwmApplication.getEmailQueue() != null )
-        {
-            aboutMap.put( app_emailQueueSize, Integer.toString( pwmApplication.getEmailQueue().queueSize() ) );
-            if ( pwmApplication.getEmailQueue().eldestItem() != null )
-            {
-                aboutMap.put( app_emailQueueOldestTime, dateFormatForInfoBean( Date.from( pwmApplication.getEmailQueue().eldestItem() ) ) );
-            }
-        }
+        final Map<String, String> aboutMap = new TreeMap<>();
 
 
-        if ( pwmApplication.getSmsQueue() != null )
+        for ( final PwmAboutProperty pwmAboutProperty : PwmAboutProperty.values() )
         {
         {
-            aboutMap.put( app_smsQueueSize, Integer.toString( pwmApplication.getSmsQueue().queueSize() ) );
-            if ( pwmApplication.getSmsQueue().eldestItem() != null )
+            final ValueProvider valueProvider = pwmAboutProperty.valueProvider;
+            if ( valueProvider != null )
             {
             {
-                aboutMap.put( app_smsQueueOldestTime, dateFormatForInfoBean( Date.from( pwmApplication.getSmsQueue().eldestItem() ) ) );
-            }
-        }
-
-        if ( pwmApplication.getAuditManager() != null )
-        {
-            aboutMap.put( app_syslogQueueSize, Integer.toString( pwmApplication.getAuditManager().syslogQueueSize() ) );
-        }
-
-        if ( pwmApplication.getLocalDB() != null )
-        {
-            aboutMap.put( app_localDbLogSize, Integer.toString( pwmApplication.getLocalDBLogger().getStoredEventCount() ) );
-            aboutMap.put( app_localDbLogOldestTime, dateFormatForInfoBean( pwmApplication.getLocalDBLogger().getTailDate() ) );
-
-            aboutMap.put( app_localDbStorageSize, StringUtil.formatDiskSize( FileSystemUtility.getFileDirectorySize( pwmApplication.getLocalDB().getFileLocation() ) ) );
-            aboutMap.put( app_localDbFreeSpace, StringUtil.formatDiskSize( FileSystemUtility.diskSpaceRemaining( pwmApplication.getLocalDB().getFileLocation() ) ) );
-        }
-
-
-        {
-            // java info
-            final Runtime runtime = Runtime.getRuntime();
-            aboutMap.put( java_memoryFree, Long.toString( runtime.freeMemory() ) );
-            aboutMap.put( java_memoryAllocated, Long.toString( runtime.totalMemory() ) );
-            aboutMap.put( java_memoryMax, Long.toString( runtime.maxMemory() ) );
-            aboutMap.put( java_threadCount, Integer.toString( Thread.activeCount() ) );
-
-            aboutMap.put( java_vmVendor, System.getProperty( "java.vm.vendor" ) );
-
-            aboutMap.put( java_runtimeVersion, System.getProperty( "java.runtime.version" ) );
-            aboutMap.put( java_vmVersion, System.getProperty( "java.vm.version" ) );
-            aboutMap.put( java_vmName, System.getProperty( "java.vm.name" ) );
-            aboutMap.put( java_vmLocation, System.getProperty( "java.home" ) );
-
-            aboutMap.put( java_osName, System.getProperty( "os.name" ) );
-            aboutMap.put( java_osVersion, System.getProperty( "os.version" ) );
-            aboutMap.put( java_osArch, System.getProperty( "os.arch" ) );
-
-            aboutMap.put( java_randomAlgorithm, PwmRandom.getInstance().getAlgorithm() );
-            aboutMap.put( java_defaultCharset, Charset.defaultCharset().name() );
-        }
-
-        {
-            // build info
-            aboutMap.put( build_Time, PwmConstants.BUILD_TIME );
-            aboutMap.put( build_Number, PwmConstants.BUILD_NUMBER );
-            aboutMap.put( build_Type, PwmConstants.BUILD_TYPE );
-            aboutMap.put( build_User, PwmConstants.BUILD_USER );
-            aboutMap.put( build_Revision, PwmConstants.BUILD_REVISION );
-            aboutMap.put( build_JavaVendor, PwmConstants.BUILD_JAVA_VENDOR );
-            aboutMap.put( build_JavaVersion, PwmConstants.BUILD_JAVA_VERSION );
-            aboutMap.put( build_Version, PwmConstants.BUILD_VERSION );
-        }
-
-        {
-            // database info
-            try
-            {
-                final DatabaseService databaseService = pwmApplication.getDatabaseService();
-                if ( databaseService != null )
+                try
                 {
                 {
-                    final Map<PwmAboutProperty, String> debugData = databaseService.getConnectionDebugProperties();
-                    aboutMap.putAll( debugData );
+                    final String value = valueProvider.value( pwmApplication );
+                    aboutMap.put( pwmAboutProperty.name(), value == null ? "" : value );
+                }
+                catch ( Throwable t )
+                {
+                    aboutMap.put( pwmAboutProperty.name(), LocaleHelper.getLocalizedMessage( null, Display.Value_NotApplicable, null ) );
+                    LOGGER.trace( "error generating about value for '" + pwmAboutProperty.name() + "', error: " + t.getMessage() );
                 }
                 }
-            }
-            catch ( Throwable t )
-            {
-                LOGGER.error( "error reading database debug properties" );
             }
             }
         }
         }
 
 
-        if ( pwmApplication.getPwmEnvironment().getContextManager() != null
-                && pwmApplication.getPwmEnvironment().getContextManager().getServerInfo() != null )
+        final Map<PwmAboutProperty, String> returnMap = new LinkedHashMap<>();
+        for ( final Map.Entry<String, String> entry : aboutMap.entrySet() )
         {
         {
-            aboutMap.put( java_appServerInfo, pwmApplication.getPwmEnvironment().getContextManager().getServerInfo() );
+            returnMap.put( PwmAboutProperty.valueOf( entry.getKey() ), entry.getValue() );
         }
         }
 
 
-        return Collections.unmodifiableMap( aboutMap );
+        return Collections.unmodifiableMap( returnMap );
     }
     }
 
 
-    private static String dateFormatForInfoBean( final Date date )
+    private static String format( final Date date )
     {
     {
-        return dateFormatForInfoBean( date == null ? null : date.toInstant() );
+        return format( date == null ? null : date.toInstant() );
     }
     }
 
 
-    private static String dateFormatForInfoBean( final Instant date )
+
+    private static String format( final Instant date )
     {
     {
         if ( date != null )
         if ( date != null )
         {
         {

+ 68 - 14
server/src/main/java/password/pwm/PwmConstants.java

@@ -24,18 +24,22 @@ package password.pwm;
 
 
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVFormat;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
+import password.pwm.util.java.StringUtil;
 import password.pwm.util.secure.PwmHashAlgorithm;
 import password.pwm.util.secure.PwmHashAlgorithm;
 
 
+import java.net.URL;
 import java.nio.charset.Charset;
 import java.nio.charset.Charset;
-import java.time.Instant;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Collections;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.List;
 import java.util.Locale;
 import java.util.Locale;
 import java.util.ResourceBundle;
 import java.util.ResourceBundle;
 import java.util.TimeZone;
 import java.util.TimeZone;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
 
 
 /**
 /**
  * Constant values used throughout the servlet.
  * Constant values used throughout the servlet.
@@ -45,14 +49,12 @@ import java.util.TimeZone;
 public abstract class PwmConstants
 public abstract class PwmConstants
 {
 {
 
 
-    public static final String BUILD_TIME = readBuildInfoBundle( "build.time", Instant.now().toString() );
-    public static final String BUILD_NUMBER = readBuildInfoBundle( "build.number", "0" );
-    public static final String BUILD_TYPE = readBuildInfoBundle( "build.type", "" );
-    public static final String BUILD_USER = readBuildInfoBundle( "build.user", System.getProperty( "user.name" ) );
-    public static final String BUILD_REVISION = readBuildInfoBundle( "build.revision", "0" );
-    public static final String BUILD_JAVA_VENDOR = readBuildInfoBundle( "build.java.vendor" );
-    public static final String BUILD_JAVA_VERSION = readBuildInfoBundle( "build.java.version" );
-    public static final String BUILD_VERSION = readBuildInfoBundle( "build.version", "" );
+    public static final String BUILD_TIME = readBuildInfoBundle( "Implementation-Build-Timestamp", "n/a" );
+    public static final String BUILD_NUMBER = readBuildInfoBundle( "Implementation-Build", "0" );
+    public static final String BUILD_REVISION = readBuildInfoBundle( "Implementation-Revision", "0" );
+    public static final String BUILD_JAVA_VENDOR = readBuildInfoBundle( "Implementation-Build-Java-Vendor" );
+    public static final String BUILD_JAVA_VERSION = readBuildInfoBundle( "Implementation-Build-Java-Version" );
+    public static final String BUILD_VERSION = readBuildInfoBundle( "Implementation-Version", "" );
 
 
     private static final String MISSING_VERSION_STRING = readPwmConstantsBundle( "missingVersionString" );
     private static final String MISSING_VERSION_STRING = readPwmConstantsBundle( "missingVersionString" );
     public static final String SERVLET_VERSION;
     public static final String SERVLET_VERSION;
@@ -62,8 +64,7 @@ public abstract class PwmConstants
         final String servletVersion =
         final String servletVersion =
                 ( BUILD_VERSION.length() > 0 ? "v" + BUILD_VERSION : "" )
                 ( BUILD_VERSION.length() > 0 ? "v" + BUILD_VERSION : "" )
                         + ( BUILD_NUMBER.length() > 0 ? " b" + BUILD_NUMBER : "" )
                         + ( BUILD_NUMBER.length() > 0 ? " b" + BUILD_NUMBER : "" )
-                        + ( BUILD_REVISION.length() > 0 ? " r" + BUILD_REVISION : "" )
-                        + ( BUILD_TYPE.length() > 0 ? " (" + BUILD_TYPE + ")" : "" ).trim();
+                        + ( BUILD_REVISION.length() > 0 ? " r" + BUILD_REVISION : "" ).trim();
 
 
         SERVLET_VERSION = servletVersion.isEmpty()
         SERVLET_VERSION = servletVersion.isEmpty()
                 ? MISSING_VERSION_STRING
                 ? MISSING_VERSION_STRING
@@ -243,13 +244,66 @@ public abstract class PwmConstants
 
 
     private static String readBuildInfoBundle( final String key, final String defaultValue )
     private static String readBuildInfoBundle( final String key, final String defaultValue )
     {
     {
-        final ResourceBundle resourceBundle = ResourceBundle.getBundle( "password.pwm.BuildInformation" );
-        if ( resourceBundle.containsKey( key ) )
+
+        try
+        {
+            final Enumeration<URL> resources = PwmConstants.class.getClassLoader().getResources( "META-INF/MANIFEST.MF" );
+            while ( resources.hasMoreElements() )
+            {
+                final Manifest manifest = new Manifest( resources.nextElement().openStream() );
+                final Attributes attributes = manifest.getMainAttributes();
+                final String archiveName = attributes.getValue( "Implementation-Archive-Name" );
+                try
+                {
+                    if ( "pwm.jar".equals( archiveName ) || "pwm.war".equals( archiveName ) )
+                    {
+                        final String value = attributes.getValue( key );
+                        if ( !StringUtil.isEmpty( value ) )
+                        {
+                            return value;
+                        }
+                    }
+                }
+                catch ( Throwable t )
+                {
+                    System.out.println( t );
+                }
+            }
+        }
+        catch ( Throwable t )
+        {
+            System.out.println( t );
+        }
+
+        return defaultValue;
+
+        /*
+        try
+        {
+            final Class clazz = PwmConstants.class;
+            final String className = clazz.getSimpleName() + ".class";
+            final String classPath = clazz.getResource( className ).toString();
+            if ( !classPath.startsWith( "jar" ) )
+            {
+                // Class not from JAR
+                return defaultValue;
+            }
+            final String manifestPath = classPath.substring( 0, classPath.lastIndexOf( "!" ) + 1 ) + "/META-INF/MANIFEST.MF";
+            final Manifest manifest = new Manifest( new URL( manifestPath ).openStream() );
+            final Attributes attributes = manifest.getMainAttributes();
+            final String value = attributes.getValue( key );
+            if ( !StringUtil.isEmpty( value ) )
+            {
+                return value;
+            }
+        }
+        catch ( Throwable t )
         {
         {
-            return resourceBundle.getString( key );
+            System.out.println( t );
         }
         }
 
 
         return defaultValue;
         return defaultValue;
+        */
     }
     }
 
 
     public enum AcceptValue
     public enum AcceptValue

+ 0 - 1
server/src/main/java/password/pwm/config/stored/StoredConfigurationImpl.java

@@ -1166,7 +1166,6 @@ public class StoredConfigurationImpl implements StoredConfiguration
 
 
             rootElement.setAttribute( "pwmVersion", PwmConstants.BUILD_VERSION );
             rootElement.setAttribute( "pwmVersion", PwmConstants.BUILD_VERSION );
             rootElement.setAttribute( "pwmBuild", PwmConstants.BUILD_NUMBER );
             rootElement.setAttribute( "pwmBuild", PwmConstants.BUILD_NUMBER );
-            rootElement.setAttribute( "pwmBuildType", PwmConstants.BUILD_TYPE );
             rootElement.setAttribute( "xmlVersion", XML_FORMAT_VERSION );
             rootElement.setAttribute( "xmlVersion", XML_FORMAT_VERSION );
 
 
             { // migrate old properties
             { // migrate old properties

+ 10 - 0
server/src/main/java/password/pwm/ldap/search/UserSearchEngine.java

@@ -888,10 +888,20 @@ public class UserSearchEngine implements PwmService
             final FormConfiguration formItem = entry.getKey();
             final FormConfiguration formItem = entry.getKey();
             final String attrName = "%" + formItem.getName() + "%";
             final String attrName = "%" + formItem.getName() + "%";
             String value = entry.getValue();
             String value = entry.getValue();
+
             if ( enableValueEscaping )
             if ( enableValueEscaping )
             {
             {
                 value = StringUtil.escapeLdapFilter( value );
                 value = StringUtil.escapeLdapFilter( value );
             }
             }
+
+            if ( !formItem.isRequired() )
+            {
+                if ( StringUtil.isEmpty( value ) )
+                {
+                    value = "*";
+                }
+            }
+
             newSearchFilter = newSearchFilter.replace( attrName, value );
             newSearchFilter = newSearchFilter.replace( attrName, value );
         }
         }
 
 

+ 3 - 1
server/src/main/java/password/pwm/util/CaptchaUtility.java

@@ -36,6 +36,7 @@ import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.HttpContentType;
 import password.pwm.http.HttpContentType;
 import password.pwm.http.HttpMethod;
 import password.pwm.http.HttpMethod;
+import password.pwm.http.PwmHttpResponseWrapper;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequestAttribute;
 import password.pwm.http.PwmRequestAttribute;
 import password.pwm.http.PwmURL;
 import password.pwm.http.PwmURL;
@@ -170,7 +171,8 @@ public class CaptchaUtility
             pwmRequest.getPwmResponse().writeCookie(
             pwmRequest.getPwmResponse().writeCookie(
                     captchaSkipCookieName,
                     captchaSkipCookieName,
                     cookieValue,
                     cookieValue,
-                    captchaSkipCookieLifetimeSeconds
+                    captchaSkipCookieLifetimeSeconds,
+                    PwmHttpResponseWrapper.CookiePath.Application
             );
             );
         }
         }
     }
     }

+ 1 - 3
server/src/main/java/password/pwm/util/JarMain.java

@@ -45,14 +45,12 @@ public class JarMain
     {
     {
         final StringBuilder sb = new StringBuilder();
         final StringBuilder sb = new StringBuilder();
 
 
-        sb.append( PwmConstants.PWM_APP_NAME + " v" + PwmConstants.BUILD_VERSION + " (" + PwmConstants.BUILD_TYPE + ")\n" );
+        sb.append( PwmConstants.PWM_APP_NAME + " v" + PwmConstants.BUILD_VERSION + "\n" );
         sb.append( "\n" );
         sb.append( "\n" );
         sb.append( "Build Information: \n" );
         sb.append( "Build Information: \n" );
 
 
         sb.append( "build.time=" + PwmConstants.BUILD_TIME + "\n" );
         sb.append( "build.time=" + PwmConstants.BUILD_TIME + "\n" );
         sb.append( "build.number=" + PwmConstants.BUILD_NUMBER + "\n" );
         sb.append( "build.number=" + PwmConstants.BUILD_NUMBER + "\n" );
-        sb.append( "build.type=" + PwmConstants.BUILD_TYPE + "\n" );
-        sb.append( "build.user=" + PwmConstants.BUILD_USER + "\n" );
         sb.append( "build.java.version=" + PwmConstants.BUILD_JAVA_VERSION + "\n" );
         sb.append( "build.java.version=" + PwmConstants.BUILD_JAVA_VERSION + "\n" );
         sb.append( "build.java.vendor=" + PwmConstants.BUILD_JAVA_VENDOR + "\n" );
         sb.append( "build.java.vendor=" + PwmConstants.BUILD_JAVA_VENDOR + "\n" );
 
 

+ 18 - 11
server/src/main/java/password/pwm/util/db/DatabaseService.java

@@ -23,7 +23,6 @@
 package password.pwm.util.db;
 package password.pwm.util.db;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
-import password.pwm.PwmAboutProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplicationMode;
 import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
@@ -87,10 +86,18 @@ public class DatabaseService implements PwmService
 
 
     private ScheduledExecutorService executorService;
     private ScheduledExecutorService executorService;
 
 
-    private final Map<PwmAboutProperty, String> debugInfo = new LinkedHashMap<>();
+    private final Map<DatabaseAboutProperty, String> debugInfo = new LinkedHashMap<>();
 
 
     private volatile boolean initialized = false;
     private volatile boolean initialized = false;
 
 
+    public enum DatabaseAboutProperty
+    {
+        driverName,
+        driverVersion,
+        databaseProductName,
+        databaseProductVersion,
+    }
+
 
 
     @Override
     @Override
     public STATUS status( )
     public STATUS status( )
@@ -296,10 +303,10 @@ public class DatabaseService implements PwmService
     public ServiceInfoBean serviceInfo( )
     public ServiceInfoBean serviceInfo( )
     {
     {
         final Map<String, String> debugProperties = new LinkedHashMap<>();
         final Map<String, String> debugProperties = new LinkedHashMap<>();
-        for ( final Map.Entry<PwmAboutProperty, String> entry : debugInfo.entrySet() )
+        for ( final Map.Entry<DatabaseAboutProperty, String> entry : debugInfo.entrySet() )
         {
         {
-            final PwmAboutProperty pwmAboutProperty = entry.getKey();
-            debugProperties.put( pwmAboutProperty.name(), entry.getValue() );
+            final DatabaseAboutProperty databaseAboutProperty = entry.getKey();
+            debugProperties.put( databaseAboutProperty.name(), entry.getValue() );
         }
         }
         if ( status() == STATUS.OPEN )
         if ( status() == STATUS.OPEN )
         {
         {
@@ -390,7 +397,7 @@ public class DatabaseService implements PwmService
         }
         }
     }
     }
 
 
-    public Map<PwmAboutProperty, String> getConnectionDebugProperties( )
+    public Map<DatabaseAboutProperty, String> getConnectionDebugProperties( )
     {
     {
         return Collections.unmodifiableMap( debugInfo );
         return Collections.unmodifiableMap( debugInfo );
     }
     }
@@ -401,12 +408,12 @@ public class DatabaseService implements PwmService
         {
         {
             try
             try
             {
             {
-                final Map<PwmAboutProperty, String> returnObj = new LinkedHashMap<>();
+                final Map<DatabaseAboutProperty, String> returnObj = new LinkedHashMap<>();
                 final DatabaseMetaData databaseMetaData = connection.getMetaData();
                 final DatabaseMetaData databaseMetaData = connection.getMetaData();
-                returnObj.put( PwmAboutProperty.database_driverName, databaseMetaData.getDriverName() );
-                returnObj.put( PwmAboutProperty.database_driverVersion, databaseMetaData.getDriverVersion() );
-                returnObj.put( PwmAboutProperty.database_databaseProductName, databaseMetaData.getDatabaseProductName() );
-                returnObj.put( PwmAboutProperty.database_databaseProductVersion, databaseMetaData.getDatabaseProductVersion() );
+                returnObj.put( DatabaseAboutProperty.driverName, databaseMetaData.getDriverName() );
+                returnObj.put( DatabaseAboutProperty.driverVersion, databaseMetaData.getDriverVersion() );
+                returnObj.put( DatabaseAboutProperty.databaseProductName, databaseMetaData.getDatabaseProductName() );
+                returnObj.put( DatabaseAboutProperty.databaseProductVersion, databaseMetaData.getDatabaseProductVersion() );
                 debugInfo.clear();
                 debugInfo.clear();
                 debugInfo.putAll( Collections.unmodifiableMap( returnObj ) );
                 debugInfo.putAll( Collections.unmodifiableMap( returnObj ) );
             }
             }

+ 8 - 1
server/src/main/java/password/pwm/util/queue/SmsQueueManager.java

@@ -75,6 +75,7 @@ public class SmsQueueManager implements PwmService
 
 
     public enum SmsNumberFormat
     public enum SmsNumberFormat
     {
     {
+        RAW,
         PLAIN,
         PLAIN,
         PLUS,
         PLUS,
         ZEROS
         ZEROS
@@ -406,6 +407,13 @@ public class SmsQueueManager implements PwmService
 
 
     static String formatSmsNumber( final Configuration config, final String smsNumber )
     static String formatSmsNumber( final Configuration config, final String smsNumber )
     {
     {
+        final SmsNumberFormat format = config.readSettingAsEnum( PwmSetting.SMS_PHONE_NUMBER_FORMAT, SmsNumberFormat.class );
+
+        if ( format == SmsNumberFormat.RAW )
+        {
+            return smsNumber;
+        }
+
         final long ccLong = config.readSettingAsLong( PwmSetting.SMS_DEFAULT_COUNTRY_CODE );
         final long ccLong = config.readSettingAsLong( PwmSetting.SMS_DEFAULT_COUNTRY_CODE );
         String countryCodeNumber = "";
         String countryCodeNumber = "";
         if ( ccLong > 0 )
         if ( ccLong > 0 )
@@ -413,7 +421,6 @@ public class SmsQueueManager implements PwmService
             countryCodeNumber = String.valueOf( ccLong );
             countryCodeNumber = String.valueOf( ccLong );
         }
         }
 
 
-        final SmsNumberFormat format = config.readSettingAsEnum( PwmSetting.SMS_PHONE_NUMBER_FORMAT, SmsNumberFormat.class );
         String returnValue = smsNumber;
         String returnValue = smsNumber;
 
 
         // Remove (0)
         // Remove (0)

+ 1 - 1
server/src/main/java/password/pwm/ws/server/rest/RestStatisticsServer.java

@@ -137,7 +137,7 @@ public class RestStatisticsServer extends RestServlet
         final Map<String, Object> outputValueMap = new TreeMap<>();
         final Map<String, Object> outputValueMap = new TreeMap<>();
         for ( final Statistic stat : Statistic.values() )
         for ( final Statistic stat : Statistic.values() )
         {
         {
-            outputValueMap.put( stat.getKey(), statisticsBundle.getStatistic( stat ) );
+            outputValueMap.put( stat.name(), statisticsBundle.getStatistic( stat ) );
         }
         }
 
 
         return outputValueMap;
         return outputValueMap;

+ 1 - 0
server/src/main/resources/password/pwm/config/PwmSetting.xml

@@ -1012,6 +1012,7 @@
             <value><![CDATA[ZEROS]]></value>
             <value><![CDATA[ZEROS]]></value>
         </default>
         </default>
         <options>
         <options>
+            <option value="RAW">Raw -  Use the raw value that is read from the directory with no changes</option>
             <option value="PLAIN">Plain - country code (e.g. 1 for USA) plus subscriber number (e.g. 12312345): 112312345</option>
             <option value="PLAIN">Plain - country code (e.g. 1 for USA) plus subscriber number (e.g. 12312345): 112312345</option>
             <option value="PLUS">Plus - Same as plain, but with a plus sign as a prefix: +112312345</option>
             <option value="PLUS">Plus - Same as plain, but with a plus sign as a prefix: +112312345</option>
             <option value="ZEROS">Zeros -  Same as plain, but prefixed with a double zero: 00112312345</option>
             <option value="ZEROS">Zeros -  Same as plain, but prefixed with a double zero: 00112312345</option>

+ 1 - 1
server/src/main/webapp/WEB-INF/jsp/fragment/header.jsp

@@ -39,7 +39,7 @@
     <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
     <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
     <meta name="robots" content="noindex,nofollow"/>
     <meta name="robots" content="noindex,nofollow"/>
     <meta id="application-info" name="application-name" content="<%=PwmConstants.PWM_APP_NAME%> Password Self Service"
     <meta id="application-info" name="application-name" content="<%=PwmConstants.PWM_APP_NAME%> Password Self Service"
-          <pwm:if test="<%=PwmIfTest.showVersionHeader%>">data-<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-version="<%=PwmConstants.BUILD_VERSION%> (<%=PwmConstants.BUILD_TYPE%>)" data-<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-build="<%=PwmConstants.BUILD_NUMBER%>"</pwm:if>
+          <pwm:if test="<%=PwmIfTest.showVersionHeader%>">data-<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-version="<%=PwmConstants.BUILD_VERSION%>" data-<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-build="<%=PwmConstants.BUILD_NUMBER%>"</pwm:if>
           data-<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-instance="<pwm:value name="<%=PwmValue.instanceID%>"/>"
           data-<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-instance="<pwm:value name="<%=PwmValue.instanceID%>"/>"
           data-jsp-name="<pwm:value name="<%=PwmValue.currentJspFilename%>"/>"
           data-jsp-name="<pwm:value name="<%=PwmValue.currentJspFilename%>"/>"
           data-url-context="<pwm:context/>"
           data-url-context="<pwm:context/>"