Browse Source

Merge remote-tracking branch 'origin/master' into angular

# Conflicts:
#	src/main/resources/password/pwm/AppProperty.properties
James Albright 8 years ago
parent
commit
1483d25e36

+ 8 - 19
pom.xml

@@ -455,14 +455,13 @@
         <dependency>
         <dependency>
             <groupId>org.mockito</groupId>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <artifactId>mockito-core</artifactId>
-            <version>1.10.19</version>
+            <version>2.2.11</version>
             <scope>test</scope>
             <scope>test</scope>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.assertj</groupId>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
             <artifactId>assertj-core</artifactId>
-            <!-- use 3.3.0 for Java 8 projects -->
-            <version>2.3.0</version>
+            <version>3.5.2</version>
             <scope>test</scope>
             <scope>test</scope>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
@@ -563,28 +562,18 @@
         <dependency>
         <dependency>
             <groupId>org.glassfish.jersey.containers</groupId>
             <groupId>org.glassfish.jersey.containers</groupId>
             <artifactId>jersey-container-servlet</artifactId>
             <artifactId>jersey-container-servlet</artifactId>
-            <version>2.23.2</version>
+            <version>2.24</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.glassfish.jersey.media</groupId>
             <groupId>org.glassfish.jersey.media</groupId>
             <artifactId>jersey-media-json-jackson</artifactId>
             <artifactId>jersey-media-json-jackson</artifactId>
-            <version>2.23.2</version>
+            <version>2.24</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.jasig.cas.client</groupId>
             <groupId>org.jasig.cas.client</groupId>
             <artifactId>cas-client-core</artifactId>
             <artifactId>cas-client-core</artifactId>
             <version>3.4.1</version>
             <version>3.4.1</version>
         </dependency>
         </dependency>
-        <dependency>
-            <groupId>org.mapdb</groupId>
-            <artifactId>mapdb</artifactId>
-            <version>3.0.2</version>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <version>1.4.192</version>
-        </dependency>
         <dependency>
         <dependency>
             <groupId>net.glxn</groupId>
             <groupId>net.glxn</groupId>
             <artifactId>qrgen</artifactId>
             <artifactId>qrgen</artifactId>
@@ -618,7 +607,7 @@
         <dependency>
         <dependency>
             <groupId>org.apache.derby</groupId>
             <groupId>org.apache.derby</groupId>
             <artifactId>derby</artifactId>
             <artifactId>derby</artifactId>
-            <version>10.12.1.1</version>
+            <version>10.13.1.1</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.xeustechnologies</groupId>
             <groupId>org.xeustechnologies</groupId>
@@ -633,7 +622,7 @@
         <dependency>
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
             <artifactId>gson</artifactId>
-            <version>2.7</version>
+            <version>2.8.0</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>eu.bitwalker</groupId>
             <groupId>eu.bitwalker</groupId>
@@ -643,7 +632,7 @@
         <dependency>
         <dependency>
             <groupId>org.jetbrains.xodus</groupId>
             <groupId>org.jetbrains.xodus</groupId>
             <artifactId>xodus-environment</artifactId>
             <artifactId>xodus-environment</artifactId>
-            <version>1.0.1</version>
+            <version>1.0.2</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <groupId>org.slf4j</groupId>
@@ -683,7 +672,7 @@
         <dependency>
         <dependency>
             <groupId>org.webjars.bower</groupId>
             <groupId>org.webjars.bower</groupId>
             <artifactId>font-awesome</artifactId>
             <artifactId>font-awesome</artifactId>
-            <version>4.6.3</version>
+            <version>4.7.0</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.webjars.bower</groupId>
             <groupId>org.webjars.bower</groupId>

+ 40 - 4
src/main/java/password/pwm/config/Configuration.java

@@ -27,16 +27,35 @@ import password.pwm.AppProperty;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.EmailItemBean;
 import password.pwm.bean.EmailItemBean;
 import password.pwm.bean.PrivateKeyCertificate;
 import password.pwm.bean.PrivateKeyCertificate;
-import password.pwm.bean.UserIdentity;
 import password.pwm.config.option.ADPolicyComplexity;
 import password.pwm.config.option.ADPolicyComplexity;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.config.option.MessageSendMethod;
 import password.pwm.config.option.MessageSendMethod;
 import password.pwm.config.option.TokenStorageMethod;
 import password.pwm.config.option.TokenStorageMethod;
-import password.pwm.config.profile.*;
+import password.pwm.config.profile.ChallengeProfile;
+import password.pwm.config.profile.DeleteAccountProfile;
+import password.pwm.config.profile.ForgottenPasswordProfile;
+import password.pwm.config.profile.HelpdeskProfile;
+import password.pwm.config.profile.LdapProfile;
+import password.pwm.config.profile.NewUserProfile;
+import password.pwm.config.profile.Profile;
+import password.pwm.config.profile.ProfileType;
+import password.pwm.config.profile.ProfileUtility;
+import password.pwm.config.profile.PwmPasswordPolicy;
+import password.pwm.config.profile.PwmPasswordRule;
+import password.pwm.config.profile.UpdateAttributesProfile;
 import password.pwm.config.stored.ConfigurationProperty;
 import password.pwm.config.stored.ConfigurationProperty;
 import password.pwm.config.stored.StoredConfigurationImpl;
 import password.pwm.config.stored.StoredConfigurationImpl;
 import password.pwm.config.stored.StoredConfigurationUtil;
 import password.pwm.config.stored.StoredConfigurationUtil;
-import password.pwm.config.value.*;
+import password.pwm.config.value.BooleanValue;
+import password.pwm.config.value.FileValue;
+import password.pwm.config.value.FormValue;
+import password.pwm.config.value.LocalizedStringArrayValue;
+import password.pwm.config.value.LocalizedStringValue;
+import password.pwm.config.value.NumericValue;
+import password.pwm.config.value.PasswordValue;
+import password.pwm.config.value.StringArrayValue;
+import password.pwm.config.value.StringValue;
+import password.pwm.config.value.UserPermissionValue;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
@@ -52,7 +71,20 @@ import password.pwm.util.secure.PwmSecurityKey;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.InvocationTargetException;
 import java.security.cert.X509Certificate;
 import java.security.cert.X509Certificate;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
 
 
 /**
 /**
  * @author Jason D. Rivard
  * @author Jason D. Rivard
@@ -219,6 +251,10 @@ public class Configuration implements Serializable, SettingReader {
         }
         }
 
 
         public static List<UserPermission> valueToUserPermissions(final StoredValue value) {
         public static List<UserPermission> valueToUserPermissions(final StoredValue value) {
+            if (value == null) {
+                return Collections.emptyList();
+            }
+
             if (!(value instanceof UserPermissionValue)) {
             if (!(value instanceof UserPermissionValue)) {
                 throw new IllegalArgumentException("setting value is not readable as string array");
                 throw new IllegalArgumentException("setting value is not readable as string array");
             }
             }

+ 4 - 6
src/main/java/password/pwm/config/profile/ForgottenPasswordProfile.java

@@ -31,6 +31,8 @@ import java.util.*;
 
 
 public class ForgottenPasswordProfile extends AbstractProfile {
 public class ForgottenPasswordProfile extends AbstractProfile {
 
 
+    private static final ProfileType PROFILE_TYPE = ProfileType.ForgottenPassword;
+
     private Set<IdentityVerificationMethod> requiredRecoveryVerificationMethods;
     private Set<IdentityVerificationMethod> requiredRecoveryVerificationMethods;
     private Set<IdentityVerificationMethod> optionalRecoveryVerificationMethods;
     private Set<IdentityVerificationMethod> optionalRecoveryVerificationMethods;
 
 
@@ -45,18 +47,14 @@ public class ForgottenPasswordProfile extends AbstractProfile {
     }
     }
 
 
     public static ForgottenPasswordProfile makeFromStoredConfiguration(final StoredConfiguration storedConfiguration, final String identifier) {
     public static ForgottenPasswordProfile makeFromStoredConfiguration(final StoredConfiguration storedConfiguration, final String identifier) {
-        final Map<PwmSetting,StoredValue> valueMap = new LinkedHashMap<>();
-        for (final PwmSetting setting : PwmSettingCategory.RECOVERY_PROFILE.getSettings()) {
-            final StoredValue value = storedConfiguration.readSetting(setting, identifier);
-            valueMap.put(setting, value);
-        }
+        final Map<PwmSetting,StoredValue> valueMap = makeValueMap(storedConfiguration, identifier, PROFILE_TYPE.getCategory());
         return new ForgottenPasswordProfile(identifier, valueMap);
         return new ForgottenPasswordProfile(identifier, valueMap);
 
 
     }
     }
 
 
     @Override
     @Override
     public ProfileType profileType() {
     public ProfileType profileType() {
-        return ProfileType.ForgottenPassword;
+        return PROFILE_TYPE;
     }
     }
     
     
     public Set<IdentityVerificationMethod> requiredRecoveryAuthenticationMethods() {
     public Set<IdentityVerificationMethod> requiredRecoveryAuthenticationMethods() {

+ 7 - 5
src/main/java/password/pwm/util/localdb/H2MV_LocalDB.java

@@ -1,9 +1,10 @@
 package password.pwm.util.localdb;
 package password.pwm.util.localdb;
 
 
-import org.h2.mvstore.MVStore;
-import password.pwm.util.Helper;
-import password.pwm.util.TimeDuration;
-import password.pwm.util.logging.PwmLogger;
+public class H2MV_LocalDB {}
+
+
+// No longer used, commented in case it may be resurrected some day.
+/*
 
 
 import java.io.File;
 import java.io.File;
 import java.io.Serializable;
 import java.io.Serializable;
@@ -12,7 +13,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 
 
-public class H2MV_LocalDB implements LocalDBProvider {
+public class H2MV_LocalDB {} implements LocalDBProvider {
     private static final PwmLogger LOGGER = PwmLogger.forClass(H2MV_LocalDB.class);
     private static final PwmLogger LOGGER = PwmLogger.forClass(H2MV_LocalDB.class);
 
 
     private MVStore mvStore;
     private MVStore mvStore;
@@ -189,3 +190,4 @@ public class H2MV_LocalDB implements LocalDBProvider {
         return Collections.emptySet();
         return Collections.emptySet();
     }
     }
 }
 }
+*/

+ 10 - 0
src/main/java/password/pwm/util/localdb/H2_LocalDB.java

@@ -22,6 +22,14 @@
 
 
 package password.pwm.util.localdb;
 package password.pwm.util.localdb;
 
 
+
+public class H2_LocalDB {}
+
+
+
+// No longer used, commented in case it may be resurrected some day.
+/*
+
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.util.StringUtil;
 import password.pwm.util.StringUtil;
@@ -35,6 +43,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Properties;
 
 
+
 public class H2_LocalDB extends AbstractJDBC_LocalDB {
 public class H2_LocalDB extends AbstractJDBC_LocalDB {
 
 
     private static final PwmLogger LOGGER = PwmLogger.forClass(H2_LocalDB.class, true);
     private static final PwmLogger LOGGER = PwmLogger.forClass(H2_LocalDB.class, true);
@@ -126,3 +135,4 @@ public class H2_LocalDB extends AbstractJDBC_LocalDB {
         return StringUtil.mapToString(params,"=",";");
         return StringUtil.mapToString(params,"=",";");
     }
     }
 }
 }
+*/

+ 9 - 3
src/main/java/password/pwm/util/localdb/MapDB_LocalDB.java

@@ -22,6 +22,13 @@
 
 
 package password.pwm.util.localdb;
 package password.pwm.util.localdb;
 
 
+/**
+ * @author Jason D. Rivard
+ */
+public class MapDB_LocalDB {}
+
+// No longer used, commented in case it may be resurrected some day.
+/*
 import org.mapdb.DBMaker;
 import org.mapdb.DBMaker;
 import org.mapdb.Serializer;
 import org.mapdb.Serializer;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
@@ -38,10 +45,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 
 import static password.pwm.util.localdb.LocalDB.DB;
 import static password.pwm.util.localdb.LocalDB.DB;
 
 
-/**
- * @author Jason D. Rivard
- */
 public class MapDB_LocalDB implements LocalDBProvider {
 public class MapDB_LocalDB implements LocalDBProvider {
+
 // ------------------------------ FIELDS ------------------------------
 // ------------------------------ FIELDS ------------------------------
 
 
     private static final PwmLogger LOGGER = PwmLogger.forClass(MapDB_LocalDB.class, true);
     private static final PwmLogger LOGGER = PwmLogger.forClass(MapDB_LocalDB.class, true);
@@ -323,3 +328,4 @@ public class MapDB_LocalDB implements LocalDBProvider {
         return Collections.emptySet();
         return Collections.emptySet();
     }
     }
 }
 }
+*/

+ 4 - 6
src/main/java/password/pwm/util/reports/ReportUtils.java

@@ -1,20 +1,18 @@
 package password.pwm.util.reports;
 package password.pwm.util.reports;
 
 
+import password.pwm.svc.report.ReportColumnFilter;
+
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.Set;
 
 
-import org.h2.util.StringUtils;
-
-import password.pwm.svc.report.ReportColumnFilter;
-
 public class ReportUtils {
 public class ReportUtils {
     public static ReportColumnFilter toReportColumnFilter(String desiredColumnsStr) {
     public static ReportColumnFilter toReportColumnFilter(String desiredColumnsStr) {
         ReportColumnFilter reportColumnFilter = new ReportColumnFilter();
         ReportColumnFilter reportColumnFilter = new ReportColumnFilter();
 
 
         if (desiredColumnsStr != null) {
         if (desiredColumnsStr != null) {
-            String[] selectedColumnsArray = StringUtils.arraySplit(desiredColumnsStr, ',', true);
-            Set<String> desiredColumns = new HashSet<String>(Arrays.asList(selectedColumnsArray));
+            String[] selectedColumnsArray = desiredColumnsStr.split(",");
+            Set<String> desiredColumns = new HashSet<>(Arrays.asList(selectedColumnsArray));
 
 
             reportColumnFilter.setUserDnVisible(desiredColumns.contains("userDN"));
             reportColumnFilter.setUserDnVisible(desiredColumns.contains("userDN"));
             reportColumnFilter.setLdapProfileVisible(desiredColumns.contains("ldapProfile"));
             reportColumnFilter.setLdapProfileVisible(desiredColumns.contains("ldapProfile"));

+ 1 - 1
src/main/resources/password/pwm/AppProperty.properties

@@ -79,7 +79,7 @@ http.resources.expirationSeconds=3600
 http.resources.gzip.enable=true
 http.resources.gzip.enable=true
 http.resources.pathNonceEnable=true
 http.resources.pathNonceEnable=true
 http.resources.pathNoncePrefix=nonce-
 http.resources.pathNoncePrefix=nonce-
-http.resources.webjarMappings={"/public/resources/dojo/dgrid/":"/webjars/dgrid/1.1.0/","/public/resources/dojo/dojo/":"/webjars/dojo/1.11.2/","/public/resources/dojo/dijit/":"/webjars/dijit/1.11.2/","/public/resources/dojo/dojox/":"/webjars/dojox/1.11.2/","/public/resources/font/font-awesome/":"/webjars/font-awesome/4.6.3/","/public/resources/flags/":"/webjars/famfamfam-flags/1.0.0/dist/","/public/resources/angular/":"/webjars/angular/1.5.8/","/public/resources/angular-ui-router/":"/webjars/angular-ui-router/1.0.0-beta.3/","/public/resources/angular-translate/":"/webjars/angular-translate/2.13.0/"}
+http.resources.webjarMappings={"/public/resources/dojo/dgrid/":"/webjars/dgrid/1.1.0/","/public/resources/dojo/dojo/":"/webjars/dojo/1.11.2/","/public/resources/dojo/dijit/":"/webjars/dijit/1.11.2/","/public/resources/dojo/dojox/":"/webjars/dojox/1.11.2/","/public/resources/font/font-awesome/":"/webjars/font-awesome/4.7.0/","/public/resources/flags/":"/webjars/famfamfam-flags/1.0.0/dist/","/public/resources/angular/":"/webjars/angular/1.5.8/","/public/resources/angular-ui-router/":"/webjars/angular-ui-router/1.0.0-beta.3/","/public/resources/angular-translate/":"/webjars/angular-translate/2.13.0/"}
 http.resources.zipFiles=[]
 http.resources.zipFiles=[]
 http.gzip.enable=true
 http.gzip.enable=true
 http.errors.allowHtml=true
 http.errors.allowHtml=true

+ 2 - 2
src/main/resources/password/pwm/config/PwmSetting.xml

@@ -2128,7 +2128,7 @@
             <option value="TOKEN">SMS/Email Token Verification</option>
             <option value="TOKEN">SMS/Email Token Verification</option>
             <option value="OTP">OTP (Mobile Device) Verification</option>
             <option value="OTP">OTP (Mobile Device) Verification</option>
             <option value="REMOTE_RESPONSES">External Responses</option>
             <option value="REMOTE_RESPONSES">External Responses</option>
-            <!--<option value="OAUTH">OAuth</option>-->
+            <option value="OAUTH">OAuth2</option>
         </options>
         </options>
     </setting>
     </setting>
     <setting hidden="false" key="recovery.oauth.idserver.loginUrl" level="2">
     <setting hidden="false" key="recovery.oauth.idserver.loginUrl" level="2">
@@ -3724,7 +3724,7 @@
     </category>
     </category>
     <category hidden="false" key="RECOVERY_DEF">
     <category hidden="false" key="RECOVERY_DEF">
     </category>
     </category>
-    <category hidden="true" key="RECOVERY_OAUTH">
+    <category hidden="false" key="RECOVERY_OAUTH">
     </category>
     </category>
     <category hidden="false" key="ADMINISTRATION">
     <category hidden="false" key="ADMINISTRATION">
     </category>
     </category>

+ 1 - 0
src/main/webapp/WEB-INF/jsp/configeditor.jsp

@@ -113,6 +113,7 @@
         <div id="settingsPanel">
         <div id="settingsPanel">
             <%-- settings content goes here --%>
             <%-- settings content goes here --%>
         </div>
         </div>
+        <div id="config-infoPanel"></div>
     </div>
     </div>
     <br/><br/>
     <br/><br/>
     <div class="push"></div>
     <div class="push"></div>

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

@@ -145,7 +145,7 @@
                 });
                 });
             });
             });
         </script>
         </script>
-    </pwm:script>F
+    </pwm:script>
 </div>
 </div>
 <% } %>
 <% } %>
 
 

+ 12 - 11
src/test/java/password/pwm/config/profile/RuleHelperTest.java

@@ -1,22 +1,23 @@
 package password.pwm.config.profile;
 package password.pwm.config.profile;
 
 
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.Matchers.*;
-import static org.mockito.Mockito.*;
-import static password.pwm.config.profile.PwmPasswordRule.*;
-
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.Test;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.mockito.stubbing.Answer;
-
 import password.pwm.config.profile.PwmPasswordPolicy.RuleHelper;
 import password.pwm.config.profile.PwmPasswordPolicy.RuleHelper;
 import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.macro.MacroMachine;
 
 
+import java.util.List;
+import java.util.regex.Pattern;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static password.pwm.config.profile.PwmPasswordRule.RegExMatch;
+
 public class RuleHelperTest {
 public class RuleHelperTest {
     private static final String[][] MACRO_MAP = new String[][] {
     private static final String[][] MACRO_MAP = new String[][] {
         { "@User:ID@",        "fflintstone"         },
         { "@User:ID@",        "fflintstone"         },
@@ -69,7 +70,7 @@ public class RuleHelperTest {
                     macroValues[i] = macroMap[i][1];
                     macroValues[i] = macroMap[i][1];
                 }
                 }
 
 
-                final String stringWithMacros = invocation.getArgumentAt(0, String.class);
+                final String stringWithMacros = invocation.getArgument(0);
                 return StringUtils.replaceEach(stringWithMacros, macroNames, macroValues);
                 return StringUtils.replaceEach(stringWithMacros, macroNames, macroValues);
             }
             }
         };
         };

+ 1 - 1
src/test/java/password/pwm/svc/report/ReportServiceTest.java

@@ -2,11 +2,11 @@ package password.pwm.svc.report;
 
 
 import com.google.gson.reflect.TypeToken;
 import com.google.gson.reflect.TypeToken;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.output.WriterOutputStream;
 import org.junit.Before;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.Test;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.mockito.stubbing.Answer;
-import org.mortbay.io.WriterOutputStream;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.svc.report.ReportService.RecordIterator;
 import password.pwm.svc.report.ReportService.RecordIterator;
 import password.pwm.util.JsonUtil;
 import password.pwm.util.JsonUtil;