From bc8fbe3a47e4f038df8d6bdbd3ba64bd72177517 Mon Sep 17 00:00:00 2001 From: shimingxy Date: Fri, 24 Apr 2020 15:35:28 +0800 Subject: [PATCH] v1.3.1 FIX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、验证增强,增加算术验证码支持 2、修复新增用户时报错 3、修复操作日志报错 4、mybatis-jpa-extra升级到v2.0 --- .../java/org/maxkey/config/LoginConfig.java | 18 + .../java/org/maxkey/domain/HistoryLogs.java | 319 +-- .../main/java/org/maxkey/domain/UserInfo.java | 2186 ++++++++--------- .../persistence/db/UserInfoRowMapper.java | 215 +- .../java/org/maxkey/web/ImageEndpoint.java | 244 +- .../java/org/maxkey/web/message/Message.java | 376 +-- .../maxkey/dao/service/UserInfoService.java | 38 +- maxkey-lib/mybatis-jpa-extra-1.0.jar | Bin 67799 -> 0 bytes maxkey-lib/mybatis-jpa-extra-2.0.jar | Bin 0 -> 65213 bytes maxkey-lib/mybatis-jpa-extra-2.1-api-1.0.jar | Bin 6939 -> 0 bytes maxkey-lib/mybatis-jpa-extra-2.1-api-2.0.jar | Bin 0 -> 6903 bytes .../web/contorller/UserInfoController.java | 2 +- .../config/applicationConfig.properties | 2 + .../spring/maxkey-mgt-persistence.xml | 21 +- .../resources/spring/maxkey-mgt-security.xml | 35 +- .../templates/views/orgs/orgsAdd.ftl | 4 +- .../templates/views/userinfo/userAdd.ftl | 6 +- .../config/applicationConfig.properties | 14 +- .../resources/spring/maxkey-persistence.xml | 20 +- .../main/resources/spring/maxkey-security.xml | 36 +- 20 files changed, 1786 insertions(+), 1750 deletions(-) delete mode 100644 maxkey-lib/mybatis-jpa-extra-1.0.jar create mode 100644 maxkey-lib/mybatis-jpa-extra-2.0.jar delete mode 100644 maxkey-lib/mybatis-jpa-extra-2.1-api-1.0.jar create mode 100644 maxkey-lib/mybatis-jpa-extra-2.1-api-2.0.jar diff --git a/maxkey-core/src/main/java/org/maxkey/config/LoginConfig.java b/maxkey-core/src/main/java/org/maxkey/config/LoginConfig.java index d2d8057cc..dbe642891 100644 --- a/maxkey-core/src/main/java/org/maxkey/config/LoginConfig.java +++ b/maxkey-core/src/main/java/org/maxkey/config/LoginConfig.java @@ -9,16 +9,26 @@ import org.springframework.context.annotation.PropertySource; public class LoginConfig { @Value("${config.login.captcha}") boolean captcha; + + //验证码类型 text 文本 , arithmetic算术验证码 + @Value("${config.login.captcha.type}") + String captchaType; + @Value("${config.login.onetimepwd}") boolean oneTimePwd; + @Value("${config.login.socialsignon}") boolean socialSignOn; + @Value("${config.login.kerberos}") boolean kerberos; + @Value("${config.login.remeberme}") boolean remeberMe; + @Value("${config.login.wsfederation}") boolean wsFederation; + @Value("${config.login.default.uri}") String defaultUri; @@ -84,6 +94,14 @@ public class LoginConfig { public void setWsFederation(boolean wsFederation) { this.wsFederation = wsFederation; } + + public String getCaptchaType() { + return captchaType; + } + + public void setCaptchaType(String captchaType) { + this.captchaType = captchaType; + } @Override public String toString() { diff --git a/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogs.java b/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogs.java index cb14b9f5e..6c198adb5 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogs.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogs.java @@ -1,184 +1,195 @@ package org.maxkey.domain; import java.io.Serializable; - +import javax.persistence.Column; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; import javax.persistence.Table; - import org.apache.mybatis.jpa.persistence.JpaBaseDomain; - /** + * . * @author Crystal.Sea * */ -@Table(name = "HISTORY_LOGS") +@Table(name = "HISTORY_LOGS") public class HistoryLogs extends JpaBaseDomain implements Serializable { + private static final long serialVersionUID = 6560201093784960493L; + @Id + @Column + @GeneratedValue(strategy = GenerationType.AUTO, generator = "uuid") + String id; + @Column + String serviceName; + @Column + String message; + @Column + String content; + @Column + String messageType; + @Column + String operateType; + @Column + String username; + @Column + String code; + @Column + String createdBy; + @Column + String createdDate; + @Column + String modifiedBy; + @Column + String modifiedDate; - /** - * - */ - private static final long serialVersionUID = 6560201093784960493L; - String id; - String serviceName; - String message; - String content; - String messageType; - String operateType; - String username; - String code; - String createdBy; - String createdDate; - String modifiedBy; - String modifiedDate; - - String startDate; - String endDate; - - public HistoryLogs() { - super(); - } + String startDate; + String endDate; - public HistoryLogs(String serviceName, String code, String message, - String content, String messageType, String operateType, - String createdBy, String username, String cname) { - super(); - this.serviceName = serviceName; - this.code = code; - this.message = message; - this.content = content; - this.messageType = messageType; - this.operateType = operateType; - this.createdBy = createdBy; - this.username = username; + public HistoryLogs() { + super(); + } - } + /** + * HistoryLogs. + * @param serviceName String + * @param code String + * @param message String + * @param content String + * @param messageType String + * @param operateType String + * @param createdBy String + * @param username String + * @param cname String + */ + public HistoryLogs(String serviceName, String code, + String message, String content, + String messageType,String operateType, + String createdBy, String username, String cname) { + super(); + this.serviceName = serviceName; + this.code = code; + this.message = message; + this.content = content; + this.messageType = messageType; + this.operateType = operateType; + this.createdBy = createdBy; + this.username = username; - public String getServiceName() { - return serviceName; - } + } - public void setServiceName(String serviceName) { - this.serviceName = serviceName; - } + public String getServiceName() { + return serviceName; + } - public String getMessage() { - return message; - } + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } - public void setMessage(String message) { - this.message = message; - } + public String getMessage() { + return message; + } - public String getContent() { - return content; - } + public void setMessage(String message) { + this.message = message; + } - public void setContent(String content) { - this.content = content; - } + public String getContent() { + return content; + } - public String getMessageType() { - return messageType; - } + public void setContent(String content) { + this.content = content; + } - public void setMessageType(String messageType) { - this.messageType = messageType; - } + public String getMessageType() { + return messageType; + } - public String getOperateType() { - return operateType; - } + public void setMessageType(String messageType) { + this.messageType = messageType; + } - public void setOperateType(String operateType) { - this.operateType = operateType; - } + public String getOperateType() { + return operateType; + } - /** - * @return the username - */ - public String getUsername() { - return username; - } + public void setOperateType(String operateType) { + this.operateType = operateType; + } - /** - * @param username - * the username to set - */ - public void setUsername(String username) { - this.username = username; - } - - /** - * @return the code - */ - public String getCode() { - return code; - } - - /** - * @param code - * the code to set - */ - public void setCode(String code) { - this.code = code; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - public String getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(String createdDate) { - this.createdDate = createdDate; - } - - public String getModifiedBy() { - return modifiedBy; - } - - public void setModifiedBy(String modifiedBy) { - this.modifiedBy = modifiedBy; - } - - public String getModifiedDate() { - return modifiedDate; - } - - public void setModifiedDate(String modifiedDate) { - this.modifiedDate = modifiedDate; - } - - public String getStartDate() { - return startDate; - } - - public void setStartDate(String startDate) { - this.startDate = startDate; - } - - public String getEndDate() { - return endDate; - } - - public void setEndDate(String endDate) { - this.endDate = endDate; - } + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(String createdDate) { + this.createdDate = createdDate; + } + + public String getModifiedBy() { + return modifiedBy; + } + + public void setModifiedBy(String modifiedBy) { + this.modifiedBy = modifiedBy; + } + + public String getModifiedDate() { + return modifiedDate; + } + + public void setModifiedDate(String modifiedDate) { + this.modifiedDate = modifiedDate; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/UserInfo.java b/maxkey-core/src/main/java/org/maxkey/domain/UserInfo.java index a5a89ab00..fb0da8086 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/UserInfo.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/UserInfo.java @@ -1,1249 +1,1241 @@ package org.maxkey.domain; +import com.fasterxml.jackson.annotation.JsonIgnore; import java.io.IOException; import java.util.HashMap; - import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; - import org.apache.mybatis.jpa.persistence.JpaBaseDomain; import org.maxkey.util.StringUtils; import org.springframework.web.multipart.MultipartFile; -import com.fasterxml.jackson.annotation.JsonIgnore; - /** + * . * @author Crystal.Sea * */ -@Table(name = "USERINFO") +@Table(name = "USERINFO") public class UserInfo extends JpaBaseDomain { + private static final long serialVersionUID = 6402443942083382236L; + // + @Id + @Column + @GeneratedValue(strategy = GenerationType.AUTO, generator = "uuid") + String id; + @Column + protected String username; + @Column + protected String password; + @Column + protected String decipherable; + @Column + protected String sharedSecret; + @Column + protected String sharedCounter; + /** + * "Employee", "Supplier","Dealer","Contractor",Partner,Customer "Intern", + * "Temp", "External", and "Unknown" . + */ + @Column + protected String userType; + @Column + protected String windowsAccount; + + // for user name + @Column + protected String displayName; + @Column + protected String nickName; + @Column + protected String nameZhSpell; + @Column + protected String nameZhShortSpell; + @Column + protected String givenName; + @Column + protected String middleName; + @Column + protected String familyName; + @Column + protected String honorificPrefix; + @Column + protected String honorificSuffix; + @Column + protected String formattedName; + + @Column + protected int married; + @Column + protected int gender; + @Column + protected String birthDate; + @JsonIgnore + @Column + protected byte[] picture; + @JsonIgnore + protected MultipartFile pictureFile; + @Column + protected int idType; + @Column + protected String idCardNo; + @Column + protected String webSite; + @Column + protected String startWorkDate; + + // for security + @Column + protected int authnType; + @Column + protected String email; + + protected int emailVerified; + @Column + protected String mobile; + + protected int mobileVerified; + + protected String passwordQuestion; + + protected String passwordAnswer; + @Column + // for apps login protected + protected int appLoginAuthnType; + protected String appLoginPassword; + protected String protectedApps; + @JsonIgnore + protected HashMap protectedAppsMap; + + protected String passwordLastSetTime; + protected int badPasswordCount; + protected String unLockTime; + protected int isLocked; + protected String lastLoginTime; + protected String lastLoginIp; + protected String lastLogoffTime; + protected int passwordSetType; + protected Integer loginCount; + + @Column + protected String locale; + @Column + protected String timeZone; + @Column + protected String preferredLanguage; + + // for work + @Column + protected String workCountry; + @Column + protected String workRegion;// province; + @Column + protected String workLocality;// city; + @Column + protected String workStreetAddress; + @Column + protected String workAddressFormatted; + @Column + protected String workEmail; + @Column + protected String workPhoneNumber; + @Column + protected String workPostalCode; + @Column + protected String workFax; + // for home + @Column + protected String homeCountry; + @Column + protected String homeRegion;// province; + @Column + protected String homeLocality;// city; + @Column + protected String homeStreetAddress; + @Column + protected String homeAddressFormatted; + @Column + protected String homeEmail; + @Column + protected String homePhoneNumber; + @Column + protected String homePostalCode; + @Column + protected String homeFax; + // for company + @Column + protected String employeeNumber; + @Column + protected String costCenter; + @Column + protected String organization; + @Column + protected String division; + @Column + protected String departmentId; + @Column + protected String department; + @Column + protected String jobTitle; + @Column + protected String jobLevel; + @Column + protected String managerId; + @Column + protected String manager; + @Column + protected String assistantId; + @Column + protected String assistant; + @Column + protected String entryDate; + @Column + protected String quitDate; + + // for social contact + @Column + protected String defineIm; + protected int weixinFollow; + + /* + * for extended Attribute from userType extraAttribute for database + * extraAttributeName & extraAttributeValue for page submit + */ + protected String extraAttribute; + protected String extraAttributeName; + protected String extraAttributeValue; + @JsonIgnore + protected HashMap extraAttributeMap; + + protected int online; + + protected String ldapDn; + + protected int gridList; + + @Column + String createdBy; + @Column + String createdDate; + @Column + String modifiedBy; + @Column + String modifiedDate; + @Column + int status; + @Column + String description; + + public static class ONLINE { + // 在线 + public static final int ONLINE = 1; + // 下线 + public static final int OFFLINE = 0; + } + + public static class MARRIED { + // 未知 + public static final int UNKNOWN = 0; + // 单身 + public static final int SINGLE = 1; + // 结婚 + public static final int MARRIED = 2; + // 离异 + public static final int DIVORCE = 3; + // 丧偶 + public static final int WIDOWED = 4; + + } + + public static class GENDER { + // 未知 + public static final int UNKNOWN = 0; + // 女性 + public static final int FEMALE = 1; + // 男性 + public static final int MALE = 2; + } + + public static class IDTYPE { + // 未知 + public static final int UNKNOWN = 0; + // 身份证 + public static final int IDCARD = 1; + // 护照 + public static final int PASSPORT = 2; + // 学生证 + public static final int STUDENTCARD = 3; + // 军人证 + public static final int MILITARYCARD = 4; + } + + public static class AUTHNTYPE { + // 用户名密码 + public static final int NORMAL = 1; + // 手机 + public static final int MOBILE = 2; + // 短信 + public static final int SMS = 3; + // 邮箱 + public static final int EMAIL = 4; + + public static final int TIMEBASED_OPT = 5; + + public static final int COUNTERBASED_OPT = 6; + + public static final int HOTP_OPT = 7; + + public static final int RSA_OPT = 8; + // 证书 + public static final int CERTIFICATE = 9; + // usb证书 + public static final int USBKEY = 10; + + } + + public static class EMPLOYMENTSTATUS { + // 在册人员 + public static final int ACTIVE = 1; + // 离职人员 + public static final int WITHDRAWN = 2; + // 停薪留职人员 + public static final int INACTIVE = 3; + // 退休人员 + public static final int RETIREE = 4; + + } + + /** + * + */ + public UserInfo() { + super(); + } + + /** + * @return the id + */ + public String getId() { + return id; + } + + /** + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * @param username + */ + public UserInfo(String username) { + super(); + this.username = username; + } + + /** + * @param username + * @param password + */ + public UserInfo(String username, String password) { + super(); + this.username = username; + this.password = password; + } + + public byte[] getPicture() { + if (pictureFile != null && !pictureFile.isEmpty()) { + try { + picture = pictureFile.getBytes(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return picture; + } + + /** + * @return the protectedAppsMap + */ + public HashMap getProtectedAppsMap() { + if (protectedAppsMap == null) { + protectedAppsMap = new HashMap(); + } + if (StringUtils.isNotEmpty(protectedApps)) { + String[] apps = protectedApps.split(","); + + for (String appid : apps) { + protectedAppsMap.put(appid, appid); + } + } + return protectedAppsMap; + } + + // auto gen setter and getter + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getDecipherable() { + return decipherable; + } + + public void setDecipherable(String decipherable) { + this.decipherable = decipherable; + } + + public String getSharedSecret() { + return sharedSecret; + } + + public void setSharedSecret(String sharedSecret) { + this.sharedSecret = sharedSecret; + } + + public String getSharedCounter() { + return sharedCounter; + } + + public void setSharedCounter(String sharedCounter) { + this.sharedCounter = sharedCounter; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getWindowsAccount() { + return windowsAccount; + } + + public void setWindowsAccount(String windowsAccount) { + this.windowsAccount = windowsAccount; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + + + public String getNameZhSpell() { + return nameZhSpell; + } + + public void setNameZhSpell(String nameZhSpell) { + this.nameZhSpell = nameZhSpell; + } + + public String getNameZhShortSpell() { + return nameZhShortSpell; + } - /** - * - */ - private static final long serialVersionUID = 6402443942083382236L; - // - @Id - @Column - @GeneratedValue(strategy=GenerationType.AUTO,generator="uuid") - String id; - @Column - protected String username; - @Column - protected String password; - @Column - protected String decipherable; - @Column - protected String sharedSecret; - @Column - protected String sharedCounter; - /** - * "Employee", "Supplier","Dealer","Contractor",Partner,Customer "Intern", - "Temp", "External", and "Unknown" - */ - @Column - protected String userType; - @Column - protected String windowsAccount; - - //for user name - @Column - protected String displayName; - @Column - protected String nickName; - @Column - protected String nameZHSpell; - @Column - protected String nameZHShortSpell; - @Column - protected String givenName; - @Column - protected String middleName; - @Column - protected String familyName; - @Column - protected String honorificPrefix; - @Column - protected String honorificSuffix; - @Column - protected String formattedName; - - @Column - protected int married; - @Column - protected int gender; - @Column - protected String birthDate; - @JsonIgnore - @Column - protected byte[] picture; - @JsonIgnore - protected MultipartFile pictureFile; - @Column - protected int idType; - @Column - protected String idCardNo; - @Column - protected String webSite; - @Column - protected String startWorkDate; - - //for security - @Column - protected int authnType; - @Column - protected String email; - - protected int emailVerified; - @Column - protected String mobile; - - protected int mobileVerified; - - protected String passwordQuestion; - - protected String passwordAnswer; - @Column - //for apps login protected - protected int appLoginAuthnType; - protected String appLoginPassword; - protected String protectedApps; - @JsonIgnore - protected HashMap protectedAppsMap; - - - protected String passwordLastSetTime; - protected int badPasswordCount; - protected String unLockTime; - protected int isLocked; - protected String lastLoginTime; - protected String lastLoginIp; - protected String lastLogoffTime; - protected int passwordSetType; - protected Integer loginCount; - - @Column - protected String locale; - @Column - protected String timeZone; - @Column - protected String preferredLanguage; - - //for work - @Column - protected String workCountry; - @Column - protected String workRegion;//province; - @Column - protected String workLocality;//city; - @Column - protected String workStreetAddress; - @Column - protected String workAddressFormatted; - @Column - protected String workEmail; - @Column - protected String workPhoneNumber; - @Column - protected String workPostalCode; - @Column - protected String workFax; - //for home - @Column - protected String homeCountry; - @Column - protected String homeRegion;//province; - @Column - protected String homeLocality;//city; - @Column - protected String homeStreetAddress; - @Column - protected String homeAddressFormatted; - @Column - protected String homeEmail; - @Column - protected String homePhoneNumber; - @Column - protected String homePostalCode; - @Column - protected String homeFax; - //for company - @Column - protected String employeeNumber; - @Column - protected String costCenter; - @Column - protected String organization; - @Column - protected String division; - @Column - protected String departmentId; - @Column - protected String department; - @Column - protected String jobTitle; - @Column - protected String jobLevel; - @Column - protected String managerId; - @Column - protected String manager; - @Column - protected String assistantId; - @Column - protected String assistant; - @Column - protected String entryDate; - @Column - protected String quitDate; - - //for social contact - @Column - protected String defineIm; - protected int weixinFollow; - - /* - * for extended Attribute from userType - * extraAttribute for database - * extraAttributeName & extraAttributeValue for page submit - */ - protected String extraAttribute; - protected String extraAttributeName; - protected String extraAttributeValue; - @JsonIgnore - protected HashMap extraAttributeMap; - - protected int online; - - protected String ldapDn; - - protected int gridList; - - @Column - String createdBy; - @Column - String createdDate; - @Column - String modifiedBy; - @Column - String modifiedDate; - @Column - int status; - @Column - String description ; - - - public static class ONLINE{ - //在线 - public static final int ONLINE=1; - //下线 - public static final int OFFLINE=0; - } - public static class MARRIED{ - //未知 - public static final int UNKNOWN=0; - //单身 - public static final int SINGLE=1; - //结婚 - public static final int MARRIED=2; - //离异 - public static final int DIVORCE =3; - //丧偶 - public static final int WIDOWED=4; - - } - - public static class GENDER{ - //未知 - public static final int UNKNOWN=0; - //女性 - public static final int FEMALE=1; - //男性 - public static final int MALE=2; - } - - public static class IDTYPE{ - //未知 - public static final int UNKNOWN=0; - //身份证 - public static final int IDCARD=1; - //护照 - public static final int PASSPORT=2; - //学生证 - public static final int STUDENTCARD=3; - //军人证 - public static final int MILITARYCARD=4; - } - - public static class AUTHNTYPE{ - //用户名密码 - public static final int NORMAL =1; - //手机 - public static final int MOBILE = 2; - //短信 - public static final int SMS=3; - //邮箱 - public static final int EMAIL = 4; - - public static final int TIMEBASED_OPT=5; - - public static final int COUNTERBASED_OPT=6; - - public static final int HOTP_OPT=7; - - public static final int RSA_OPT=8; - //证书 - public static final int CERTIFICATE = 9; - //usb证书 - public static final int USBKEY=10; - - } - - - public static class EMPLOYMENTSTATUS{ - //在册人员 - public static final int ACTIVE = 1; - //离职人员 - public static final int WITHDRAWN = 2; - //停薪留职人员 - public static final int INACTIVE = 3; - //退休人员 - public static final int RETIREE = 4; - - } - - /** - * - */ - public UserInfo() { - super(); - } - - /** - * @return the id - */ - public String getId() { - return id; - } - - /** - * @param id the id to set - */ - public void setId(String id) { - this.id = id; - } - - /** - * @param username - */ - public UserInfo(String username) { - super(); - this.username = username; - } - - /** - * @param username - * @param password - */ - public UserInfo(String username, String password) { - super(); - this.username = username; - this.password = password; - } - - public byte[] getPicture() { - if(pictureFile!=null&&!pictureFile.isEmpty()){ - try { - picture=pictureFile.getBytes(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return picture; - } - - /** - * @return the protectedAppsMap - */ - public HashMap getProtectedAppsMap() { - if(protectedAppsMap==null){ - protectedAppsMap=new HashMap(); - } - if(StringUtils.isNotEmpty(protectedApps)){ - String []apps=protectedApps.split(","); - - for(String appid:apps){ - protectedAppsMap.put(appid, appid); - } - } - return protectedAppsMap; - } - - //auto gen setter and getter - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getDecipherable() { - return decipherable; - } - - public void setDecipherable(String decipherable) { - this.decipherable = decipherable; - } - - public String getSharedSecret() { - return sharedSecret; - } - - public void setSharedSecret(String sharedSecret) { - this.sharedSecret = sharedSecret; - } - - public String getSharedCounter() { - return sharedCounter; - } - - public void setSharedCounter(String sharedCounter) { - this.sharedCounter = sharedCounter; - } - - public String getUserType() { - return userType; - } - - public void setUserType(String userType) { - this.userType = userType; - } - - public String getWindowsAccount() { - return windowsAccount; - } - - public void setWindowsAccount(String windowsAccount) { - this.windowsAccount = windowsAccount; - } - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getNickName() { - return nickName; - } - - public void setNickName(String nickName) { - this.nickName = nickName; - } - - public String getNameZHSpell() { - return nameZHSpell; - } - - public void setNameZHSpell(String nameZHSpell) { - this.nameZHSpell = nameZHSpell; - } - - public String getNameZHShortSpell() { - return nameZHShortSpell; - } - - public void setNameZHShortSpell(String nameZHShortSpell) { - this.nameZHShortSpell = nameZHShortSpell; - } - - public String getGivenName() { - return givenName; - } - - public void setGivenName(String givenName) { - this.givenName = givenName; - } + public void setNameZhShortSpell(String nameZhShortSpell) { + this.nameZhShortSpell = nameZhShortSpell; + } - public String getMiddleName() { - return middleName; - } + public String getGivenName() { + return givenName; + } - public void setMiddleName(String middleName) { - this.middleName = middleName; - } + public void setGivenName(String givenName) { + this.givenName = givenName; + } - public String getFamilyName() { - return familyName; - } + public String getMiddleName() { + return middleName; + } - public void setFamilyName(String familyName) { - this.familyName = familyName; - } + public void setMiddleName(String middleName) { + this.middleName = middleName; + } - public String getHonorificPrefix() { - return honorificPrefix; - } + public String getFamilyName() { + return familyName; + } - public void setHonorificPrefix(String honorificPrefix) { - this.honorificPrefix = honorificPrefix; - } + public void setFamilyName(String familyName) { + this.familyName = familyName; + } - public String getHonorificSuffix() { - return honorificSuffix; - } + public String getHonorificPrefix() { + return honorificPrefix; + } - public void setHonorificSuffix(String honorificSuffix) { - this.honorificSuffix = honorificSuffix; - } + public void setHonorificPrefix(String honorificPrefix) { + this.honorificPrefix = honorificPrefix; + } - public String getFormattedName() { - return formattedName; - } + public String getHonorificSuffix() { + return honorificSuffix; + } - public void setFormattedName(String formattedName) { - this.formattedName = formattedName; - } + public void setHonorificSuffix(String honorificSuffix) { + this.honorificSuffix = honorificSuffix; + } - public int getMarried() { - return married; - } + public String getFormattedName() { + return formattedName; + } - public void setMarried(int married) { - this.married = married; - } + public void setFormattedName(String formattedName) { + this.formattedName = formattedName; + } - public int getGender() { - return gender; - } + public int getMarried() { + return married; + } - public void setGender(int gender) { - this.gender = gender; - } + public void setMarried(int married) { + this.married = married; + } - public String getBirthDate() { - return birthDate; - } + public int getGender() { + return gender; + } - public void setBirthDate(String birthDate) { - this.birthDate = birthDate; - } + public void setGender(int gender) { + this.gender = gender; + } - public MultipartFile getPictureFile() { - return pictureFile; - } + public String getBirthDate() { + return birthDate; + } - public void setPictureFile(MultipartFile pictureFile) { - this.pictureFile = pictureFile; - } + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } - public int getIdType() { - return idType; - } + public MultipartFile getPictureFile() { + return pictureFile; + } - public void setIdType(int idType) { - this.idType = idType; - } + public void setPictureFile(MultipartFile pictureFile) { + this.pictureFile = pictureFile; + } - public String getIdCardNo() { - return idCardNo; - } + public int getIdType() { + return idType; + } - public void setIdCardNo(String idCardNo) { - this.idCardNo = idCardNo; - } + public void setIdType(int idType) { + this.idType = idType; + } - public String getWebSite() { - return webSite; - } + public String getIdCardNo() { + return idCardNo; + } - public void setWebSite(String webSite) { - this.webSite = webSite; - } + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } - public String getStartWorkDate() { - return startWorkDate; - } + public String getWebSite() { + return webSite; + } - public void setStartWorkDate(String startWorkDate) { - this.startWorkDate = startWorkDate; - } + public void setWebSite(String webSite) { + this.webSite = webSite; + } - public int getAuthnType() { - return authnType; - } + public String getStartWorkDate() { + return startWorkDate; + } - public void setAuthnType(int authnType) { - this.authnType = authnType; - } + public void setStartWorkDate(String startWorkDate) { + this.startWorkDate = startWorkDate; + } - public String getEmail() { - return email; - } + public int getAuthnType() { + return authnType; + } - public void setEmail(String email) { - this.email = email; - } + public void setAuthnType(int authnType) { + this.authnType = authnType; + } - public int getEmailVerified() { - return emailVerified; - } + public String getEmail() { + return email; + } - public void setEmailVerified(int emailVerified) { - this.emailVerified = emailVerified; - } + public void setEmail(String email) { + this.email = email; + } - public String getMobile() { - return mobile; - } + public int getEmailVerified() { + return emailVerified; + } - public void setMobile(String mobile) { - this.mobile = mobile; - } + public void setEmailVerified(int emailVerified) { + this.emailVerified = emailVerified; + } - public int getMobileVerified() { - return mobileVerified; - } + public String getMobile() { + return mobile; + } - public void setMobileVerified(int mobileVerified) { - this.mobileVerified = mobileVerified; - } + public void setMobile(String mobile) { + this.mobile = mobile; + } - public String getPasswordQuestion() { - return passwordQuestion; - } + public int getMobileVerified() { + return mobileVerified; + } - public void setPasswordQuestion(String passwordQuestion) { - this.passwordQuestion = passwordQuestion; - } + public void setMobileVerified(int mobileVerified) { + this.mobileVerified = mobileVerified; + } - public String getPasswordAnswer() { - return passwordAnswer; - } + public String getPasswordQuestion() { + return passwordQuestion; + } - public void setPasswordAnswer(String passwordAnswer) { - this.passwordAnswer = passwordAnswer; - } + public void setPasswordQuestion(String passwordQuestion) { + this.passwordQuestion = passwordQuestion; + } - public int getAppLoginAuthnType() { - return appLoginAuthnType; - } + public String getPasswordAnswer() { + return passwordAnswer; + } - public void setAppLoginAuthnType(int appLoginAuthnType) { - this.appLoginAuthnType = appLoginAuthnType; - } + public void setPasswordAnswer(String passwordAnswer) { + this.passwordAnswer = passwordAnswer; + } - public String getAppLoginPassword() { - return appLoginPassword; - } + public int getAppLoginAuthnType() { + return appLoginAuthnType; + } - public void setAppLoginPassword(String appLoginPassword) { - this.appLoginPassword = appLoginPassword; - } + public void setAppLoginAuthnType(int appLoginAuthnType) { + this.appLoginAuthnType = appLoginAuthnType; + } - public String getProtectedApps() { - return protectedApps; - } + public String getAppLoginPassword() { + return appLoginPassword; + } - public void setProtectedApps(String protectedApps) { - this.protectedApps = protectedApps; - } + public void setAppLoginPassword(String appLoginPassword) { + this.appLoginPassword = appLoginPassword; + } - public String getPasswordLastSetTime() { - return passwordLastSetTime; - } + public String getProtectedApps() { + return protectedApps; + } - public void setPasswordLastSetTime(String passwordLastSetTime) { - this.passwordLastSetTime = passwordLastSetTime; - } + public void setProtectedApps(String protectedApps) { + this.protectedApps = protectedApps; + } - public int getBadPasswordCount() { - return badPasswordCount; - } + public String getPasswordLastSetTime() { + return passwordLastSetTime; + } - public void setBadPasswordCount(int badPasswordCount) { - this.badPasswordCount = badPasswordCount; - } + public void setPasswordLastSetTime(String passwordLastSetTime) { + this.passwordLastSetTime = passwordLastSetTime; + } - public String getUnLockTime() { - return unLockTime; - } + public int getBadPasswordCount() { + return badPasswordCount; + } - public void setUnLockTime(String unLockTime) { - this.unLockTime = unLockTime; - } + public void setBadPasswordCount(int badPasswordCount) { + this.badPasswordCount = badPasswordCount; + } - public int getIsLocked() { - return isLocked; - } + public String getUnLockTime() { + return unLockTime; + } - public void setIsLocked(int isLocked) { - this.isLocked = isLocked; - } + public void setUnLockTime(String unLockTime) { + this.unLockTime = unLockTime; + } - public String getLastLoginTime() { - return lastLoginTime; - } + public int getIsLocked() { + return isLocked; + } - public void setLastLoginTime(String lastLoginTime) { - this.lastLoginTime = lastLoginTime; - } + public void setIsLocked(int isLocked) { + this.isLocked = isLocked; + } - public String getLastLogoffTime() { - return lastLogoffTime; - } + public String getLastLoginTime() { + return lastLoginTime; + } - public void setLastLogoffTime(String lastLogoffTime) { - this.lastLogoffTime = lastLogoffTime; - } + public void setLastLoginTime(String lastLoginTime) { + this.lastLoginTime = lastLoginTime; + } - public int getPasswordSetType() { - return passwordSetType; - } + public String getLastLogoffTime() { + return lastLogoffTime; + } - public void setPasswordSetType(int passwordSetType) { - this.passwordSetType = passwordSetType; - } + public void setLastLogoffTime(String lastLogoffTime) { + this.lastLogoffTime = lastLogoffTime; + } - public String getLocale() { - return locale; - } + public int getPasswordSetType() { + return passwordSetType; + } - public void setLocale(String locale) { - this.locale = locale; - } + public void setPasswordSetType(int passwordSetType) { + this.passwordSetType = passwordSetType; + } - public String getTimeZone() { - return timeZone; - } + public String getLocale() { + return locale; + } - public void setTimeZone(String timeZone) { - this.timeZone = timeZone; - } + public void setLocale(String locale) { + this.locale = locale; + } - public String getPreferredLanguage() { - return preferredLanguage; - } + public String getTimeZone() { + return timeZone; + } - public void setPreferredLanguage(String preferredLanguage) { - this.preferredLanguage = preferredLanguage; - } + public void setTimeZone(String timeZone) { + this.timeZone = timeZone; + } - public String getWorkCountry() { - return workCountry; - } + public String getPreferredLanguage() { + return preferredLanguage; + } - public void setWorkCountry(String workCountry) { - this.workCountry = workCountry; - } + public void setPreferredLanguage(String preferredLanguage) { + this.preferredLanguage = preferredLanguage; + } - public String getWorkRegion() { - return workRegion; - } + public String getWorkCountry() { + return workCountry; + } - public void setWorkRegion(String workRegion) { - this.workRegion = workRegion; - } + public void setWorkCountry(String workCountry) { + this.workCountry = workCountry; + } - public String getWorkLocality() { - return workLocality; - } + public String getWorkRegion() { + return workRegion; + } - public void setWorkLocality(String workLocality) { - this.workLocality = workLocality; - } + public void setWorkRegion(String workRegion) { + this.workRegion = workRegion; + } - public String getWorkStreetAddress() { - return workStreetAddress; - } + public String getWorkLocality() { + return workLocality; + } - public void setWorkStreetAddress(String workStreetAddress) { - this.workStreetAddress = workStreetAddress; - } + public void setWorkLocality(String workLocality) { + this.workLocality = workLocality; + } - public String getWorkAddressFormatted() { - return workAddressFormatted; - } + public String getWorkStreetAddress() { + return workStreetAddress; + } - public void setWorkAddressFormatted(String workAddressFormatted) { - this.workAddressFormatted = workAddressFormatted; - } + public void setWorkStreetAddress(String workStreetAddress) { + this.workStreetAddress = workStreetAddress; + } - public String getWorkEmail() { - return workEmail; - } + public String getWorkAddressFormatted() { + return workAddressFormatted; + } - public void setWorkEmail(String workEmail) { - this.workEmail = workEmail; - } + public void setWorkAddressFormatted(String workAddressFormatted) { + this.workAddressFormatted = workAddressFormatted; + } - public String getWorkPhoneNumber() { - return workPhoneNumber; - } + public String getWorkEmail() { + return workEmail; + } - public void setWorkPhoneNumber(String workPhoneNumber) { - this.workPhoneNumber = workPhoneNumber; - } + public void setWorkEmail(String workEmail) { + this.workEmail = workEmail; + } - public String getWorkPostalCode() { - return workPostalCode; - } + public String getWorkPhoneNumber() { + return workPhoneNumber; + } - public void setWorkPostalCode(String workPostalCode) { - this.workPostalCode = workPostalCode; - } + public void setWorkPhoneNumber(String workPhoneNumber) { + this.workPhoneNumber = workPhoneNumber; + } - public String getWorkFax() { - return workFax; - } + public String getWorkPostalCode() { + return workPostalCode; + } - public void setWorkFax(String workFax) { - this.workFax = workFax; - } + public void setWorkPostalCode(String workPostalCode) { + this.workPostalCode = workPostalCode; + } - public String getHomeCountry() { - return homeCountry; - } + public String getWorkFax() { + return workFax; + } - public void setHomeCountry(String homeCountry) { - this.homeCountry = homeCountry; - } + public void setWorkFax(String workFax) { + this.workFax = workFax; + } - public String getHomeRegion() { - return homeRegion; - } + public String getHomeCountry() { + return homeCountry; + } - public void setHomeRegion(String homeRegion) { - this.homeRegion = homeRegion; - } + public void setHomeCountry(String homeCountry) { + this.homeCountry = homeCountry; + } - public String getHomeLocality() { - return homeLocality; - } + public String getHomeRegion() { + return homeRegion; + } - public void setHomeLocality(String homeLocality) { - this.homeLocality = homeLocality; - } + public void setHomeRegion(String homeRegion) { + this.homeRegion = homeRegion; + } - public String getHomeStreetAddress() { - return homeStreetAddress; - } + public String getHomeLocality() { + return homeLocality; + } - public void setHomeStreetAddress(String homeStreetAddress) { - this.homeStreetAddress = homeStreetAddress; - } + public void setHomeLocality(String homeLocality) { + this.homeLocality = homeLocality; + } - public String getHomeAddressFormatted() { - return homeAddressFormatted; - } + public String getHomeStreetAddress() { + return homeStreetAddress; + } - public void setHomeAddressFormatted(String homeAddressFormatted) { - this.homeAddressFormatted = homeAddressFormatted; - } + public void setHomeStreetAddress(String homeStreetAddress) { + this.homeStreetAddress = homeStreetAddress; + } - public String getHomeEmail() { - return homeEmail; - } + public String getHomeAddressFormatted() { + return homeAddressFormatted; + } - public void setHomeEmail(String homeEmail) { - this.homeEmail = homeEmail; - } + public void setHomeAddressFormatted(String homeAddressFormatted) { + this.homeAddressFormatted = homeAddressFormatted; + } - public String getHomePhoneNumber() { - return homePhoneNumber; - } + public String getHomeEmail() { + return homeEmail; + } - public void setHomePhoneNumber(String homePhoneNumber) { - this.homePhoneNumber = homePhoneNumber; - } + public void setHomeEmail(String homeEmail) { + this.homeEmail = homeEmail; + } - public String getHomePostalCode() { - return homePostalCode; - } + public String getHomePhoneNumber() { + return homePhoneNumber; + } - public void setHomePostalCode(String homePostalCode) { - this.homePostalCode = homePostalCode; - } + public void setHomePhoneNumber(String homePhoneNumber) { + this.homePhoneNumber = homePhoneNumber; + } - public String getHomeFax() { - return homeFax; - } + public String getHomePostalCode() { + return homePostalCode; + } - public void setHomeFax(String homeFax) { - this.homeFax = homeFax; - } + public void setHomePostalCode(String homePostalCode) { + this.homePostalCode = homePostalCode; + } - public String getEmployeeNumber() { - return employeeNumber; - } + public String getHomeFax() { + return homeFax; + } - public void setEmployeeNumber(String employeeNumber) { - this.employeeNumber = employeeNumber; - } + public void setHomeFax(String homeFax) { + this.homeFax = homeFax; + } - public String getCostCenter() { - return costCenter; - } + public String getEmployeeNumber() { + return employeeNumber; + } - public void setCostCenter(String costCenter) { - this.costCenter = costCenter; - } + public void setEmployeeNumber(String employeeNumber) { + this.employeeNumber = employeeNumber; + } - public String getOrganization() { - return organization; - } + public String getCostCenter() { + return costCenter; + } - public void setOrganization(String organization) { - this.organization = organization; - } + public void setCostCenter(String costCenter) { + this.costCenter = costCenter; + } - public String getDivision() { - return division; - } + public String getOrganization() { + return organization; + } - public void setDivision(String division) { - this.division = division; - } + public void setOrganization(String organization) { + this.organization = organization; + } - public String getDepartmentId() { - return departmentId; - } + public String getDivision() { + return division; + } - public void setDepartmentId(String departmentId) { - this.departmentId = departmentId; - } + public void setDivision(String division) { + this.division = division; + } - public String getDepartment() { - return department; - } + public String getDepartmentId() { + return departmentId; + } - public void setDepartment(String department) { - this.department = department; - } + public void setDepartmentId(String departmentId) { + this.departmentId = departmentId; + } - public String getJobTitle() { - return jobTitle; - } + public String getDepartment() { + return department; + } - public void setJobTitle(String jobTitle) { - this.jobTitle = jobTitle; - } + public void setDepartment(String department) { + this.department = department; + } - public String getJobLevel() { - return jobLevel; - } + public String getJobTitle() { + return jobTitle; + } - public void setJobLevel(String jobLevel) { - this.jobLevel = jobLevel; - } + public void setJobTitle(String jobTitle) { + this.jobTitle = jobTitle; + } - public String getManagerId() { - return managerId; - } + public String getJobLevel() { + return jobLevel; + } - public void setManagerId(String managerId) { - this.managerId = managerId; - } + public void setJobLevel(String jobLevel) { + this.jobLevel = jobLevel; + } - public String getManager() { - return manager; - } + public String getManagerId() { + return managerId; + } - public void setManager(String manager) { - this.manager = manager; - } + public void setManagerId(String managerId) { + this.managerId = managerId; + } - public String getAssistantId() { - return assistantId; - } + public String getManager() { + return manager; + } - public void setAssistantId(String assistantId) { - this.assistantId = assistantId; - } + public void setManager(String manager) { + this.manager = manager; + } - public String getAssistant() { - return assistant; - } + public String getAssistantId() { + return assistantId; + } - public void setAssistant(String assistant) { - this.assistant = assistant; - } + public void setAssistantId(String assistantId) { + this.assistantId = assistantId; + } - public String getEntryDate() { - return entryDate; - } - - public void setEntryDate(String entryDate) { - this.entryDate = entryDate; - } - - public String getQuitDate() { - return quitDate; - } - - public void setQuitDate(String quitDate) { - this.quitDate = quitDate; - } - - public String getExtraAttribute() { - return extraAttribute; - } + public String getAssistant() { + return assistant; + } - public void setExtraAttribute(String extraAttribute) { - this.extraAttribute = extraAttribute; - } + public void setAssistant(String assistant) { + this.assistant = assistant; + } - public String getExtraAttributeName() { - return extraAttributeName; - } + public String getEntryDate() { + return entryDate; + } - public void setExtraAttributeName(String extraAttributeName) { - this.extraAttributeName = extraAttributeName; - } - - public String getExtraAttributeValue() { - return extraAttributeValue; - } - - public void setExtraAttributeValue(String extraAttributeValue) { - this.extraAttributeValue = extraAttributeValue; - } - - public HashMap getExtraAttributeMap() { - return extraAttributeMap; - } - - public void setExtraAttributeMap(HashMap extraAttributeMap) { - this.extraAttributeMap = extraAttributeMap; - } - - - - public int getOnline() { - return online; - } - - public void setOnline(int online) { - this.online = online; - } - - public String getLdapDn() { - return ldapDn; - } - - public void setLdapDn(String ldapDn) { - this.ldapDn = ldapDn; - } - - public void setPicture(byte[] picture) { - this.picture = picture; - } - - public void setProtectedAppsMap(HashMap protectedAppsMap) { - this.protectedAppsMap = protectedAppsMap; - } - - - public String getLastLoginIp() { - return lastLoginIp; - } - - public void setLastLoginIp(String lastLoginIp) { - this.lastLoginIp = lastLoginIp; - } - - public Integer getLoginCount() { - return loginCount; - } - - public void setLoginCount(Integer loginCount) { - this.loginCount = loginCount; - } - - - public int getGridList() { - return gridList; - } - - public void setGridList(int gridList) { - this.gridList = gridList; - } - - - public String getDefineIm() { - return defineIm; - } - - public void setDefineIm(String defineIm) { - this.defineIm = defineIm; - } - - public int getWeixinFollow() { - return weixinFollow; - } - - public void setWeixinFollow(int weixinFollow) { - this.weixinFollow = weixinFollow; - } - - - - /** - * @return the status - */ - public int getStatus() { - return status; - } - - /** - * @param status the status to set - */ - public void setStatus(int status) { - this.status = status; - } - - /** - * @return the description - */ - public String getDescription() { - return description; - } - - /** - * @param description the description to set - */ - public void setDescription(String description) { - this.description = description; - } - - @Override - public String toString() { - return "UserInfo [username=" + username + ", password=" + password - + ", decipherable=" + decipherable + ", sharedSecret=" - + sharedSecret + ", sharedCounter=" + sharedCounter - + ", userType=" + userType + ", windowsAccount=" - + windowsAccount + ", displayName=" + displayName - + ", nickName=" + nickName + ", nameZHSpell=" + nameZHSpell - + ", nameZHShortSpell=" + nameZHShortSpell + ", givenName=" - + givenName + ", middleName=" + middleName + ", familyName=" - + familyName + ", honorificPrefix=" + honorificPrefix - + ", honorificSuffix=" + honorificSuffix + ", formattedName=" - + formattedName + ", married=" + married + ", gender=" + gender - + ", birthDate=" + birthDate + ", pictureFile=" + pictureFile - + ", idType=" + idType + ", idCardNo=" + idCardNo - + ", webSite=" + webSite + ", startWorkDate=" + startWorkDate - + ", authnType=" + authnType + ", email=" + email - + ", emailVerified=" + emailVerified + ", mobile=" + mobile - + ", mobileVerified=" + mobileVerified + ", passwordQuestion=" - + passwordQuestion + ", passwordAnswer=" + passwordAnswer - + ", appLoginAuthnType=" + appLoginAuthnType - + ", appLoginPassword=" + appLoginPassword + ", protectedApps=" - + protectedApps + ", protectedAppsMap=" + protectedAppsMap - + ", passwordLastSetTime=" + passwordLastSetTime - + ", badPasswordCount=" + badPasswordCount + ", unLockTime=" - + unLockTime + ", isLocked=" + isLocked + ", lastLoginTime=" - + lastLoginTime + ", lastLoginIp=" + lastLoginIp - + ", lastLogoffTime=" + lastLogoffTime + ", passwordSetType=" - + passwordSetType + ", loginCount=" + loginCount + ", locale=" - + locale + ", timeZone=" + timeZone + ", preferredLanguage=" - + preferredLanguage + ", workCountry=" + workCountry - + ", workRegion=" + workRegion + ", workLocality=" - + workLocality + ", workStreetAddress=" + workStreetAddress - + ", workAddressFormatted=" + workAddressFormatted - + ", workEmail=" + workEmail + ", workPhoneNumber=" - + workPhoneNumber + ", workPostalCode=" + workPostalCode - + ", workFax=" + workFax + ", homeCountry=" + homeCountry - + ", homeRegion=" + homeRegion + ", homeLocality=" - + homeLocality + ", homeStreetAddress=" + homeStreetAddress - + ", homeAddressFormatted=" + homeAddressFormatted - + ", homeEmail=" + homeEmail + ", homePhoneNumber=" - + homePhoneNumber + ", homePostalCode=" + homePostalCode - + ", homeFax=" + homeFax + ", employeeNumber=" + employeeNumber - + ", costCenter=" + costCenter + ", organization=" - + organization + ", division=" + division + ", departmentId=" - + departmentId + ", department=" + department + ", jobTitle=" - + jobTitle + ", jobLevel=" + jobLevel + ", managerId=" - + managerId + ", manager=" + manager + ", assistantId=" - + assistantId + ", assistant=" + assistant + ", entryDate=" - + entryDate + ", quitDate=" + quitDate - + ", extraAttribute=" + extraAttribute - + ", extraAttributeName=" + extraAttributeName - + ", extraAttributeValue=" + extraAttributeValue - + ", extraAttributeMap=" + extraAttributeMap + ", online=" - + online + ", ldapDn=" + ldapDn + "]"; - } - - /** - * @return the createdBy - */ - public String getCreatedBy() { - return createdBy; - } - - /** - * @param createdBy the createdBy to set - */ - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - /** - * @return the createdDate - */ - public String getCreatedDate() { - return createdDate; - } - - /** - * @param createdDate the createdDate to set - */ - public void setCreatedDate(String createdDate) { - this.createdDate = createdDate; - } - - /** - * @return the modifiedBy - */ - public String getModifiedBy() { - return modifiedBy; - } - - /** - * @param modifiedBy the modifiedBy to set - */ - public void setModifiedBy(String modifiedBy) { - this.modifiedBy = modifiedBy; - } - - /** - * @return the modifiedDate - */ - public String getModifiedDate() { - return modifiedDate; - } - - /** - * @param modifiedDate the modifiedDate to set - */ - public void setModifiedDate(String modifiedDate) { - this.modifiedDate = modifiedDate; - } + public void setEntryDate(String entryDate) { + this.entryDate = entryDate; + } + public String getQuitDate() { + return quitDate; + } + + public void setQuitDate(String quitDate) { + this.quitDate = quitDate; + } + + public String getExtraAttribute() { + return extraAttribute; + } + + public void setExtraAttribute(String extraAttribute) { + this.extraAttribute = extraAttribute; + } + + public String getExtraAttributeName() { + return extraAttributeName; + } + + public void setExtraAttributeName(String extraAttributeName) { + this.extraAttributeName = extraAttributeName; + } + + public String getExtraAttributeValue() { + return extraAttributeValue; + } + + public void setExtraAttributeValue(String extraAttributeValue) { + this.extraAttributeValue = extraAttributeValue; + } + + public HashMap getExtraAttributeMap() { + return extraAttributeMap; + } + + public void setExtraAttributeMap(HashMap extraAttributeMap) { + this.extraAttributeMap = extraAttributeMap; + } + + public int getOnline() { + return online; + } + + public void setOnline(int online) { + this.online = online; + } + + public String getLdapDn() { + return ldapDn; + } + + public void setLdapDn(String ldapDn) { + this.ldapDn = ldapDn; + } + + public void setPicture(byte[] picture) { + this.picture = picture; + } + + public void setProtectedAppsMap(HashMap protectedAppsMap) { + this.protectedAppsMap = protectedAppsMap; + } + + public String getLastLoginIp() { + return lastLoginIp; + } + + public void setLastLoginIp(String lastLoginIp) { + this.lastLoginIp = lastLoginIp; + } + + public Integer getLoginCount() { + return loginCount; + } + + public void setLoginCount(Integer loginCount) { + this.loginCount = loginCount; + } + + public int getGridList() { + return gridList; + } + + public void setGridList(int gridList) { + this.gridList = gridList; + } + + public String getDefineIm() { + return defineIm; + } + + public void setDefineIm(String defineIm) { + this.defineIm = defineIm; + } + + public int getWeixinFollow() { + return weixinFollow; + } + + public void setWeixinFollow(int weixinFollow) { + this.weixinFollow = weixinFollow; + } + + /** + * @return the status + */ + public int getStatus() { + return status; + } + + /** + * @param status the status to set + */ + public void setStatus(int status) { + this.status = status; + } + + /** + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * @param description the description to set + */ + public void setDescription(String description) { + this.description = description; + } + + @Override + public String toString() { + return "UserInfo [username=" + username + + ", password=" + password + ", decipherable=" + decipherable + + ", sharedSecret=" + sharedSecret + + ", sharedCounter=" + sharedCounter + ", userType=" + userType + + ", windowsAccount=" + windowsAccount + + ", displayName=" + displayName + ", nickName=" + nickName + + ", nameZHSpell=" + nameZhSpell + + ", nameZHShortSpell=" + nameZhShortSpell + + ", givenName=" + givenName + + ", middleName=" + middleName + ", familyName=" + familyName + + ", honorificPrefix=" + honorificPrefix + + ", honorificSuffix=" + honorificSuffix + + ", formattedName=" + formattedName + ", married=" + married + + ", gender=" + gender + ", birthDate=" + birthDate + + ", pictureFile=" + pictureFile + ", idType=" + + idType + ", idCardNo=" + idCardNo + ", webSite=" + webSite + + ", startWorkDate=" + startWorkDate + + ", authnType=" + authnType + ", email=" + email + + ", emailVerified=" + emailVerified + ", mobile=" + + mobile + ", mobileVerified=" + mobileVerified + + ", passwordQuestion=" + passwordQuestion + + ", passwordAnswer=" + passwordAnswer + ", appLoginAuthnType=" + appLoginAuthnType + + ", appLoginPassword=" + appLoginPassword + + ", protectedApps=" + protectedApps + ", protectedAppsMap=" + + protectedAppsMap + ", passwordLastSetTime=" + passwordLastSetTime + + ", badPasswordCount=" + + badPasswordCount + ", unLockTime=" + unLockTime + + ", isLocked=" + isLocked + ", lastLoginTime=" + + lastLoginTime + ", lastLoginIp=" + lastLoginIp + + ", lastLogoffTime=" + lastLogoffTime + + ", passwordSetType=" + passwordSetType + + ", loginCount=" + loginCount + ", locale=" + locale + + ", timeZone=" + timeZone + ", preferredLanguage=" + preferredLanguage + + ", workCountry=" + workCountry + + ", workRegion=" + workRegion + ", workLocality=" + workLocality + + ", workStreetAddress=" + + workStreetAddress + ", workAddressFormatted=" + workAddressFormatted + + ", workEmail=" + workEmail + + ", workPhoneNumber=" + workPhoneNumber + ", workPostalCode=" + workPostalCode + + ", workFax=" + workFax + + ", homeCountry=" + homeCountry + ", homeRegion=" + homeRegion + + ", homeLocality=" + homeLocality + + ", homeStreetAddress=" + homeStreetAddress + + ", homeAddressFormatted=" + homeAddressFormatted + + ", homeEmail=" + homeEmail + + ", homePhoneNumber=" + homePhoneNumber + ", homePostalCode=" + + homePostalCode + ", homeFax=" + homeFax + + ", employeeNumber=" + employeeNumber + ", costCenter=" + + costCenter + ", organization=" + organization + + ", division=" + division + ", departmentId=" + + departmentId + ", department=" + department + + ", jobTitle=" + jobTitle + ", jobLevel=" + jobLevel + + ", managerId=" + managerId + ", manager=" + manager + + ", assistantId=" + assistantId + ", assistant=" + + assistant + ", entryDate=" + entryDate + + ", quitDate=" + quitDate + ", extraAttribute=" + extraAttribute + + ", extraAttributeName=" + extraAttributeName + ", extraAttributeValue=" + + extraAttributeValue + ", extraAttributeMap=" + extraAttributeMap + + ", online=" + online + ", ldapDn=" + + ldapDn + "]"; + } + + /** + * @return the createdBy + */ + public String getCreatedBy() { + return createdBy; + } + + /** + * @param createdBy the createdBy to set + */ + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + /** + * @return the createdDate + */ + public String getCreatedDate() { + return createdDate; + } + + /** + * @param createdDate the createdDate to set + */ + public void setCreatedDate(String createdDate) { + this.createdDate = createdDate; + } + + /** + * @return the modifiedBy + */ + public String getModifiedBy() { + return modifiedBy; + } + + /** + * @param modifiedBy the modifiedBy to set + */ + public void setModifiedBy(String modifiedBy) { + this.modifiedBy = modifiedBy; + } + + /** + * @return the modifiedDate + */ + public String getModifiedDate() { + return modifiedDate; + } + + /** + * @param modifiedDate the modifiedDate to set + */ + public void setModifiedDate(String modifiedDate) { + this.modifiedDate = modifiedDate; + } } diff --git a/maxkey-core/src/main/java/org/maxkey/persistence/db/UserInfoRowMapper.java b/maxkey-core/src/main/java/org/maxkey/persistence/db/UserInfoRowMapper.java index fd217a728..81320afbf 100644 --- a/maxkey-core/src/main/java/org/maxkey/persistence/db/UserInfoRowMapper.java +++ b/maxkey-core/src/main/java/org/maxkey/persistence/db/UserInfoRowMapper.java @@ -6,114 +6,113 @@ import java.sql.SQLException; import org.maxkey.domain.UserInfo; import org.springframework.jdbc.core.RowMapper; -public class UserInfoRowMapper implements RowMapper { +public class UserInfoRowMapper implements RowMapper { - @Override - public UserInfo mapRow(ResultSet rs, int rowNum)throws SQLException { - - UserInfo userInfo=new UserInfo(); - userInfo.setId(rs.getString("ID")); - userInfo.setUsername(rs.getString("USERNAME")); - userInfo.setPassword(rs.getString("PASSWORD")); - userInfo.setSharedSecret(rs.getString("SHAREDSECRET")); - userInfo.setSharedCounter(rs.getString("SHAREDCOUNTER")); - userInfo.setDecipherable(rs.getString("DECIPHERABLE")); - userInfo.setWindowsAccount(rs.getString("WINDOWSACCOUNT")); - userInfo.setUserType(rs.getString("USERTYPE")); - - userInfo.setDisplayName(rs.getString("DISPLAYNAME")); - userInfo.setNickName(rs.getString("NICKNAME")); - userInfo.setNameZHSpell(rs.getString("NAMEZHSPELL"));//nameZHSpell - userInfo.setNameZHShortSpell(rs.getString("NAMEZHSHORTSPELL"));//nameZHSpell - userInfo.setGivenName(rs.getString("GIVENNAME")); - userInfo.setMiddleName(rs.getString("MIDDLENAME")); - userInfo.setFamilyName(rs.getString("FAMILYNAME")); - userInfo.setHonorificPrefix(rs.getString("HONORIFICPREFIX")); - userInfo.setHonorificSuffix(rs.getString("HONORIFICSUFFIX")); - userInfo.setFormattedName(rs.getString("FORMATTEDNAME")); - - userInfo.setGender(rs.getInt("GENDER")); - userInfo.setBirthDate(rs.getString("BIRTHDATE")); - userInfo.setPicture(rs.getBytes("PICTURE")); - userInfo.setMarried(rs.getInt("MARRIED")); - userInfo.setIdType(rs.getInt("IDTYPE")); - userInfo.setIdCardNo(rs.getString("IDCARDNO")); - userInfo.setWebSite(rs.getString("WEBSITE")); - - userInfo.setAuthnType(rs.getInt("AUTHNTYPE")); - userInfo.setMobile(rs.getString("MOBILE")); - userInfo.setMobileVerified(rs.getInt("MOBILEVERIFIED")); - userInfo.setEmail(rs.getString("EMAIL")); - userInfo.setEmailVerified(rs.getInt("EMAILVERIFIED")); - userInfo.setPasswordQuestion(rs.getString("PASSWORDQUESTION")); - userInfo.setPasswordAnswer(rs.getString("PASSWORDANSWER")); - - userInfo.setAppLoginAuthnType(rs.getInt("APPLOGINAUTHNTYPE")); - userInfo.setAppLoginPassword(rs.getString("APPLOGINPASSWORD")); - userInfo.setProtectedApps(rs.getString("PROTECTEDAPPS")); - - userInfo.setPasswordLastSetTime(rs.getString("PASSWORDLASTSETTIME")); - userInfo.setPasswordSetType(rs.getInt("PASSWORDSETTYPE")); - userInfo.setBadPasswordCount(rs.getInt("BADPASSWORDCOUNT")); - userInfo.setUnLockTime(rs.getString("UNLOCKTIME")); - userInfo.setIsLocked(rs.getInt("ISLOCKED")); - userInfo.setLastLoginTime(rs.getString("LASTLOGINTIME")); - userInfo.setLastLoginIp(rs.getString("LASTLOGINIP")); - userInfo.setLastLogoffTime(rs.getString("LASTLOGOFFTIME")); - userInfo.setLoginCount(rs.getInt("LOGINCOUNT")); - - userInfo.setTimeZone(rs.getString("TIMEZONE")); - userInfo.setLocale(rs.getString("LOCALE")); - userInfo.setPreferredLanguage(rs.getString("PREFERREDLANGUAGE")); - + @Override + public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException { - userInfo.setWorkEmail(rs.getString("WORKEMAIL")); - userInfo.setWorkPhoneNumber(rs.getString("WORKPHONENUMBER")); - userInfo.setWorkCountry(rs.getString("WORKCOUNTRY")); - userInfo.setWorkRegion(rs.getString("WORKREGION")); - userInfo.setWorkLocality(rs.getString("WORKLOCALITY")); - userInfo.setWorkStreetAddress(rs.getString("WORKSTREETADDRESS")); - userInfo.setWorkAddressFormatted(rs.getString("WORKADDRESSFORMATTED")); - userInfo.setWorkPostalCode(rs.getString("WORKPOSTALCODE")); - userInfo.setWorkFax(rs.getString("WORKFAX")); - - userInfo.setHomeEmail(rs.getString("HOMEEMAIL")); - userInfo.setHomePhoneNumber(rs.getString("HOMEPHONENUMBER")); - userInfo.setHomeCountry(rs.getString("HOMECOUNTRY")); - userInfo.setHomeRegion(rs.getString("HOMEREGION")); - userInfo.setHomeLocality(rs.getString("HOMELOCALITY")); - userInfo.setHomeStreetAddress(rs.getString("HOMESTREETADDRESS")); - userInfo.setHomeAddressFormatted(rs.getString("HOMEADDRESSFORMATTED")); - userInfo.setHomePostalCode(rs.getString("HOMEPOSTALCODE")); - userInfo.setHomeFax(rs.getString("HOMEFAX")); - - userInfo.setEmployeeNumber(rs.getString("EMPLOYEENUMBER")); - userInfo.setDivision(rs.getString("DIVISION")); - userInfo.setCostCenter(rs.getString("COSTCENTER")); - userInfo.setOrganization(rs.getString("ORGANIZATION")); - userInfo.setDepartmentId(rs.getString("DEPARTMENTID")); - userInfo.setDepartment(rs.getString("DEPARTMENT")); - userInfo.setJobTitle(rs.getString("JOBTITLE")); - userInfo.setJobLevel(rs.getString("JOBLEVEL")); - userInfo.setManagerId(rs.getString("MANAGERID")); - userInfo.setManager(rs.getString("MANAGER")); - userInfo.setAssistantId(rs.getString("ASSISTANTID")); - userInfo.setAssistant(rs.getString("ASSISTANT")); - userInfo.setEntryDate(rs.getString("ENTRYDATE"));// - userInfo.setQuitDate(rs.getString("QUITDATE")); - userInfo.setStartWorkDate(rs.getString("STARTWORKDATE"));//STARTWORKDATE - - userInfo.setExtraAttribute(rs.getString("EXTRAATTRIBUTE")); - - userInfo.setCreatedBy(rs.getString("CREATEDBY")); - userInfo.setCreatedDate(rs.getString("CREATEDDATE")); - userInfo.setModifiedBy(rs.getString("MODIFIEDBY")); - userInfo.setModifiedDate(rs.getString("MODIFIEDDATE")); - - userInfo.setStatus(rs.getInt("STATUS")); - userInfo.setGridList(rs.getInt("GRIDLIST")); - userInfo.setDescription(rs.getString("DESCRIPTION")); - - return userInfo; - } + UserInfo userInfo = new UserInfo(); + userInfo.setId(rs.getString("ID")); + userInfo.setUsername(rs.getString("USERNAME")); + userInfo.setPassword(rs.getString("PASSWORD")); + userInfo.setSharedSecret(rs.getString("SHAREDSECRET")); + userInfo.setSharedCounter(rs.getString("SHAREDCOUNTER")); + userInfo.setDecipherable(rs.getString("DECIPHERABLE")); + userInfo.setWindowsAccount(rs.getString("WINDOWSACCOUNT")); + userInfo.setUserType(rs.getString("USERTYPE")); + + userInfo.setDisplayName(rs.getString("DISPLAYNAME")); + userInfo.setNickName(rs.getString("NICKNAME")); + userInfo.setNameZhSpell(rs.getString("NAMEZHSPELL"));// nameZHSpell + userInfo.setNameZhShortSpell(rs.getString("NAMEZHSHORTSPELL"));// nameZHSpell + userInfo.setGivenName(rs.getString("GIVENNAME")); + userInfo.setMiddleName(rs.getString("MIDDLENAME")); + userInfo.setFamilyName(rs.getString("FAMILYNAME")); + userInfo.setHonorificPrefix(rs.getString("HONORIFICPREFIX")); + userInfo.setHonorificSuffix(rs.getString("HONORIFICSUFFIX")); + userInfo.setFormattedName(rs.getString("FORMATTEDNAME")); + + userInfo.setGender(rs.getInt("GENDER")); + userInfo.setBirthDate(rs.getString("BIRTHDATE")); + userInfo.setPicture(rs.getBytes("PICTURE")); + userInfo.setMarried(rs.getInt("MARRIED")); + userInfo.setIdType(rs.getInt("IDTYPE")); + userInfo.setIdCardNo(rs.getString("IDCARDNO")); + userInfo.setWebSite(rs.getString("WEBSITE")); + + userInfo.setAuthnType(rs.getInt("AUTHNTYPE")); + userInfo.setMobile(rs.getString("MOBILE")); + userInfo.setMobileVerified(rs.getInt("MOBILEVERIFIED")); + userInfo.setEmail(rs.getString("EMAIL")); + userInfo.setEmailVerified(rs.getInt("EMAILVERIFIED")); + userInfo.setPasswordQuestion(rs.getString("PASSWORDQUESTION")); + userInfo.setPasswordAnswer(rs.getString("PASSWORDANSWER")); + + userInfo.setAppLoginAuthnType(rs.getInt("APPLOGINAUTHNTYPE")); + userInfo.setAppLoginPassword(rs.getString("APPLOGINPASSWORD")); + userInfo.setProtectedApps(rs.getString("PROTECTEDAPPS")); + + userInfo.setPasswordLastSetTime(rs.getString("PASSWORDLASTSETTIME")); + userInfo.setPasswordSetType(rs.getInt("PASSWORDSETTYPE")); + userInfo.setBadPasswordCount(rs.getInt("BADPASSWORDCOUNT")); + userInfo.setUnLockTime(rs.getString("UNLOCKTIME")); + userInfo.setIsLocked(rs.getInt("ISLOCKED")); + userInfo.setLastLoginTime(rs.getString("LASTLOGINTIME")); + userInfo.setLastLoginIp(rs.getString("LASTLOGINIP")); + userInfo.setLastLogoffTime(rs.getString("LASTLOGOFFTIME")); + userInfo.setLoginCount(rs.getInt("LOGINCOUNT")); + + userInfo.setTimeZone(rs.getString("TIMEZONE")); + userInfo.setLocale(rs.getString("LOCALE")); + userInfo.setPreferredLanguage(rs.getString("PREFERREDLANGUAGE")); + + userInfo.setWorkEmail(rs.getString("WORKEMAIL")); + userInfo.setWorkPhoneNumber(rs.getString("WORKPHONENUMBER")); + userInfo.setWorkCountry(rs.getString("WORKCOUNTRY")); + userInfo.setWorkRegion(rs.getString("WORKREGION")); + userInfo.setWorkLocality(rs.getString("WORKLOCALITY")); + userInfo.setWorkStreetAddress(rs.getString("WORKSTREETADDRESS")); + userInfo.setWorkAddressFormatted(rs.getString("WORKADDRESSFORMATTED")); + userInfo.setWorkPostalCode(rs.getString("WORKPOSTALCODE")); + userInfo.setWorkFax(rs.getString("WORKFAX")); + + userInfo.setHomeEmail(rs.getString("HOMEEMAIL")); + userInfo.setHomePhoneNumber(rs.getString("HOMEPHONENUMBER")); + userInfo.setHomeCountry(rs.getString("HOMECOUNTRY")); + userInfo.setHomeRegion(rs.getString("HOMEREGION")); + userInfo.setHomeLocality(rs.getString("HOMELOCALITY")); + userInfo.setHomeStreetAddress(rs.getString("HOMESTREETADDRESS")); + userInfo.setHomeAddressFormatted(rs.getString("HOMEADDRESSFORMATTED")); + userInfo.setHomePostalCode(rs.getString("HOMEPOSTALCODE")); + userInfo.setHomeFax(rs.getString("HOMEFAX")); + + userInfo.setEmployeeNumber(rs.getString("EMPLOYEENUMBER")); + userInfo.setDivision(rs.getString("DIVISION")); + userInfo.setCostCenter(rs.getString("COSTCENTER")); + userInfo.setOrganization(rs.getString("ORGANIZATION")); + userInfo.setDepartmentId(rs.getString("DEPARTMENTID")); + userInfo.setDepartment(rs.getString("DEPARTMENT")); + userInfo.setJobTitle(rs.getString("JOBTITLE")); + userInfo.setJobLevel(rs.getString("JOBLEVEL")); + userInfo.setManagerId(rs.getString("MANAGERID")); + userInfo.setManager(rs.getString("MANAGER")); + userInfo.setAssistantId(rs.getString("ASSISTANTID")); + userInfo.setAssistant(rs.getString("ASSISTANT")); + userInfo.setEntryDate(rs.getString("ENTRYDATE"));// + userInfo.setQuitDate(rs.getString("QUITDATE")); + userInfo.setStartWorkDate(rs.getString("STARTWORKDATE"));// STARTWORKDATE + + userInfo.setExtraAttribute(rs.getString("EXTRAATTRIBUTE")); + + userInfo.setCreatedBy(rs.getString("CREATEDBY")); + userInfo.setCreatedDate(rs.getString("CREATEDDATE")); + userInfo.setModifiedBy(rs.getString("MODIFIEDBY")); + userInfo.setModifiedDate(rs.getString("MODIFIEDDATE")); + + userInfo.setStatus(rs.getInt("STATUS")); + userInfo.setGridList(rs.getInt("GRIDLIST")); + userInfo.setDescription(rs.getString("DESCRIPTION")); + + return userInfo; + } } diff --git a/maxkey-core/src/main/java/org/maxkey/web/ImageEndpoint.java b/maxkey-core/src/main/java/org/maxkey/web/ImageEndpoint.java index b31c8cd33..d71090e70 100644 --- a/maxkey-core/src/main/java/org/maxkey/web/ImageEndpoint.java +++ b/maxkey-core/src/main/java/org/maxkey/web/ImageEndpoint.java @@ -1,138 +1,174 @@ package org.maxkey.web; +import com.google.code.kaptcha.Producer; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; - import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - -import org.maxkey.web.WebConstants; +import org.maxkey.config.ApplicationConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import com.google.code.kaptcha.Producer; /** + * ImageEndpoint Producer Image and captcha. * @author Crystal.Sea * */ @Controller public class ImageEndpoint { - private static final Logger _logger = LoggerFactory.getLogger(ImageEndpoint.class); - - @Autowired - private Producer captchaProducer; + private static final Logger _logger = LoggerFactory.getLogger(ImageEndpoint.class); - /** - * captcha image Producer - * @param request - * @param response - */ - @RequestMapping(value = "/captcha") - public void captchaHandleRequest(HttpServletRequest request,HttpServletResponse response){ - try{ - // Set to expire far in the past. - response.setDateHeader("Expires", 0); - // Set standard HTTP/1.1 no-cache headers. - response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); - // Set IE extended HTTP/1.1 no-cache headers (use addHeader). - response.addHeader("Cache-Control", "post-check=0, pre-check=0"); - // Set standard HTTP/1.0 no-cache header. - response.setHeader("Pragma", "no-cache"); - // return a jpeg - response.setContentType("image/jpeg"); - // create the text for the image - String capText = captchaProducer.createText(); - _logger.trace("Sesssion id " + request.getSession().getId() + " , Captcha Text is " + capText); - // store the text in the session - request.getSession().setAttribute(WebConstants.KAPTCHA_SESSION_KEY, capText); - // create the image with the text - BufferedImage bi = captchaProducer.createImage(capText); - ServletOutputStream out = response.getOutputStream(); - // write the data out - ImageIO.write(bi, "jpg", out); + @Autowired + private Producer captchaProducer; - out.flush(); - out.close(); - }catch(Exception e) { - _logger.error("captcha Producer Error " + e.getMessage()); + @Autowired + @Qualifier("applicationConfig") + ApplicationConfig applicationConfig; + + /** + * captcha image Producer. + * + * @param request HttpServletRequest + * @param response HttpServletResponse + */ + @RequestMapping(value = "/captcha") + public void captchaHandleRequest(HttpServletRequest request, HttpServletResponse response) { + try { + + String kaptchaText = captchaProducer.createText(); + if (applicationConfig.getLoginConfig().getCaptchaType() + .equalsIgnoreCase("Arithmetic")) { + Integer intParamA = Integer.valueOf(kaptchaText.substring(0, 1)); + Integer intParamB = Integer.valueOf(kaptchaText.substring(1, 2)); + Integer calculateValue = 0; + if ((intParamA > intParamB) && ((intParamA + intParamB) % 5 > 3)) { + calculateValue = intParamA - intParamB; + kaptchaText = intParamA + "-" + intParamB + "=?"; + } else { + calculateValue = intParamA + intParamB; + kaptchaText = intParamA + "+" + intParamB + "=?"; + } + _logger.trace("Sesssion id " + request.getSession().getId() + + " , Arithmetic calculate Value is " + calculateValue); + request.getSession().setAttribute( + WebConstants.KAPTCHA_SESSION_KEY, calculateValue + ""); + } else { + // store the text in the session + request.getSession().setAttribute(WebConstants.KAPTCHA_SESSION_KEY, kaptchaText); + } + _logger.trace("Sesssion id " + request.getSession().getId() + + " , Captcha Text is " + kaptchaText); + + // create the image with the text + BufferedImage bufferedImage = captchaProducer.createImage(kaptchaText); + producerImage(request,response,bufferedImage); + } catch (Exception e) { + _logger.error("captcha Producer Error " + e.getMessage()); } } - - /** - * image Producer - * @param request - * @param response - * @return - * @throws Exception - */ - @RequestMapping("/image/{id}") - public void imageHandleRequest(HttpServletRequest request,HttpServletResponse response,@PathVariable("id") String id) throws Exception { - // Set to expire far in the past. - response.setDateHeader("Expires", 0); - // Set standard HTTP/1.1 no-cache headers. - response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); - // Set IE extended HTTP/1.1 no-cache headers (use addHeader). - response.addHeader("Cache-Control", "post-check=0, pre-check=0"); - // Set standard HTTP/1.0 no-cache header. - response.setHeader("Pragma", "no-cache"); - // return a jpeg/gif - response.setContentType("image/gif"); - // create the text for the image - byte[]image=(byte[]) request.getSession().getAttribute(id); - //request.getSession().removeAttribute(id); - // create the image with the text - if(image!=null){ - ServletOutputStream out = response.getOutputStream(); - // write the data out - ImageIO.write(byte2BufferedImage(image), "gif", out); - try{ - out.flush(); - }finally{ - out.close(); - } - } + /** + * Session Image Producer. + * + * @param request HttpServletRequest + * @param response HttpServletResponse + */ + + @RequestMapping("/image/{id}") + public void imageHandleRequest(HttpServletRequest request, HttpServletResponse response, + @PathVariable("id") String id) { + try { + // get session image bytes + byte[] image = (byte[]) request.getSession().getAttribute(id); + producerImage(request,response,byte2BufferedImage(image)); + } catch (Exception e) { + _logger.error("captcha Producer Error " + e.getMessage()); + } } - - public static BufferedImage byte2BufferedImage(byte[]imageByte){ - try { - InputStream in = new ByteArrayInputStream(imageByte); - BufferedImage bufferedImage = ImageIO.read(in); - return bufferedImage; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - public static byte[] bufferedImage2Byte(BufferedImage bufferedImage ){ - try { - ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); - ImageIO.write(bufferedImage,"gif",byteArrayOutputStream); - return byteArrayOutputStream.toByteArray(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - public Producer getCaptchaProducer() { - return captchaProducer; - } + /** + * producerImage. + * @param request HttpServletRequest + * @param response HttpServletResponse + * @param bufferedImage BufferedImage + * @throws IOException error + */ + public static void producerImage(HttpServletRequest request, + HttpServletResponse response, + BufferedImage bufferedImage) throws IOException { + // Set to expire far in the past. + response.setDateHeader("Expires", 0); + // Set standard HTTP/1.1 no-cache headers. + response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); + // Set IE extended HTTP/1.1 no-cache headers (use addHeader). + response.addHeader("Cache-Control", "post-check=0, pre-check=0"); + // Set standard HTTP/1.0 no-cache header. + response.setHeader("Pragma", "no-cache"); + // return a jpeg/gif + response.setContentType("image/gif"); + + // create the image + if (bufferedImage != null) { + ServletOutputStream out = response.getOutputStream(); + // write the data out + ImageIO.write(bufferedImage, "gif", out); + try { + out.flush(); + } finally { + out.close(); + } + } + } + + /** + * byte2BufferedImage. + * @param imageByte bytes + * @return + */ + public static BufferedImage byte2BufferedImage(byte[] imageByte) { + try { + InputStream in = new ByteArrayInputStream(imageByte); + BufferedImage bufferedImage = ImageIO.read(in); + return bufferedImage; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * bufferedImage2Byte. + * @param bufferedImage BufferedImage + * @return + */ + public static byte[] bufferedImage2Byte(BufferedImage bufferedImage) { + try { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageIO.write(bufferedImage, "gif", byteArrayOutputStream); + return byteArrayOutputStream.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public void setCaptchaProducer(Producer captchaProducer) { + this.captchaProducer = captchaProducer; + } + + public void setApplicationConfig(ApplicationConfig applicationConfig) { + this.applicationConfig = applicationConfig; + } - public void setCaptchaProducer(Producer captchaProducer) { - this.captchaProducer = captchaProducer; - } - - } diff --git a/maxkey-core/src/main/java/org/maxkey/web/message/Message.java b/maxkey-core/src/main/java/org/maxkey/web/message/Message.java index 84bad5c4a..7feb51184 100644 --- a/maxkey-core/src/main/java/org/maxkey/web/message/Message.java +++ b/maxkey-core/src/main/java/org/maxkey/web/message/Message.java @@ -15,211 +15,213 @@ import org.springframework.validation.FieldError; /** * message类定义 + * * @author Crystal.Sea * */ public class Message { - final static Logger _logger = LoggerFactory.getLogger(Message.class); - //服务名称 - private String serviceName; - //信息内容 - private String message; - //信息代码 - private String code; - //信息对象 - private Object messageObject; - //错误信息 - private ArrayList> errors; - //类型 - private MessageType messageType=MessageType.info; - //操作类型 - private OperateType operateType=OperateType.unknown; - //范围 - MessageScope messageScope=MessageScope.JSON; - - public Message() { - - } - - public Message(String message) { - this.message = message; - this.messageType = MessageType.info; - } - - - public Message(BindingResult result) { - setFieldErrors(result); - } + static final Logger _logger = LoggerFactory.getLogger(Message.class); + // 服务名称 + private String serviceName; + // 信息内容 + private String message; + // 信息代码 + private String code; + // 信息对象 + private Object messageObject; + // 错误信息 + private ArrayList> errors; + // 类型 + private MessageType messageType = MessageType.info; + // 操作类型 + private OperateType operateType = OperateType.unknown; + // 范围 + MessageScope messageScope = MessageScope.JSON; - public Message(String message, String code) { - this.message = message; - this.code = code; - this.messageType = MessageType.info; - } - - public Message(String message, MessageType messageType) { - this.message = message; - this.messageType = messageType; - } - - public Message(String message,BindingResult result) { - this.message = message; - setFieldErrors(result); - } - - public Message(String message, String code, MessageType messageType) { - this.message = message; - this.code = code; - this.messageType = messageType; - } - - public Message(String message,Object messageObject, MessageType messageType, - OperateType operateType) { - this.message = message; - this.messageType = messageType; - this.operateType = operateType; - this.messageObject = messageObject; - WebContext.setMessage(this); - } - - - public Message(String message,Object messageObject, MessageType messageType, - OperateType operateType,MessageScope messageScope) { - this.message = message; - this.messageObject = messageObject; - this.messageType = messageType; - this.operateType = operateType; - this.messageScope= messageScope; - WebContext.setMessage(this); - } - - public Message(String message,Object messageObject,BindingResult result, MessageType messageType, - OperateType operateType,MessageScope messageScope) { - this.message = message; - this.messageObject = messageObject; - this.operateType = operateType; - this.messageScope= messageScope; - setFieldErrors(result); - this.messageType = messageType; - WebContext.setMessage(this); - } - - public Message(String serviceName,String message,Object messageObject,BindingResult result, MessageType messageType, - OperateType operateType,MessageScope messageScope) { - this.serviceName = serviceName; - this.message = message; - this.messageObject = messageObject; - this.operateType = operateType; - this.messageScope= messageScope; - setFieldErrors(result); - this.messageType = messageType; - WebContext.setMessage(this); - } + public Message() { - public Message(String serviceName,String message,Object messageObject,BindingResult result, MessageType messageType, - OperateType operateType,MessageScope messageScope,String code) { - this(serviceName, message, messageObject, result, messageType, operateType, messageScope); - this.code = code; - } + } - /** - * 验证错误组装 - * @param result - */ - public void setFieldErrors(BindingResult result) { - if(result==null) - return; - this.messageType = MessageType.error; - this.errors=new ArrayList>(); - List listFieldError=result.getFieldErrors(); - - for(FieldError fieldError : listFieldError){ - HashMap error=new HashMap(); - error.put("field", fieldError.getField()); - error.put("type", fieldError.getCode()); - error.put("objectName", fieldError.getObjectName()); - String defaultMessageSourceResolvable=fieldError.getCodes()[0]; - String errorMessage=WebContext.getI18nValue(defaultMessageSourceResolvable); - if(errorMessage==null){ - error.put("message", /*fieldError.getField()+" "+*/fieldError.getDefaultMessage()); - }else{ - error.put("message", errorMessage); - } - _logger.debug(""+error); - this.errors.add(error); - } - _logger.debug(""+this.errors); - } - - public void setApplication(){ - WebContext.setMessage(this); - } - /** - * @return the code - */ - public String getCode() { - return code; - } + public Message(String message) { + this.message = message; + this.messageType = MessageType.info; + } - /** - * @param code the code to set - */ - public void setCode(String code) { - this.code = code; - } + public Message(BindingResult result) { + setFieldErrors(result); + } - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } + public Message(String message, String code) { + this.message = message; + this.code = code; + this.messageType = MessageType.info; + } - public MessageType getMessageType() { - return messageType; - } - public void setMessageType(MessageType messageType) { - this.messageType = messageType; - } + public Message(String message, MessageType messageType) { + this.message = message; + this.messageType = messageType; + } - public ArrayList> getErrors() { - return errors; - } + public Message(String message, BindingResult result) { + this.message = message; + setFieldErrors(result); + } - public void setErrors(ArrayList> errors) { - this.errors = errors; - } + public Message(String message, String code, MessageType messageType) { + this.message = message; + this.code = code; + this.messageType = messageType; + } - public OperateType getOperateType() { - return operateType; - } + public Message(String message, Object messageObject, MessageType messageType, OperateType operateType) { + this.message = message; + this.messageType = messageType; + this.operateType = operateType; + this.messageObject = messageObject; + WebContext.setMessage(this); + } - public void setOperateType(OperateType operateType) { - this.operateType = operateType; - } + public Message(String message, Object messageObject, MessageType messageType, OperateType operateType, + MessageScope messageScope) { + this.message = message; + this.messageObject = messageObject; + this.messageType = messageType; + this.operateType = operateType; + this.messageScope = messageScope; + WebContext.setMessage(this); + } - public Object getMessageObject() { - return messageObject; - } + public Message(String message, Object messageObject, BindingResult result, MessageType messageType, + OperateType operateType, MessageScope messageScope) { + this.message = message; + this.messageObject = messageObject; + this.operateType = operateType; + this.messageScope = messageScope; + setFieldErrors(result); + this.messageType = messageType; + WebContext.setMessage(this); + } - public void setMessageObject(Object messageObject) { - this.messageObject = messageObject; - } + public Message(String serviceName, String message, Object messageObject, BindingResult result, + MessageType messageType, OperateType operateType, MessageScope messageScope) { + this.serviceName = serviceName; + this.message = message; + this.messageObject = messageObject; + this.operateType = operateType; + this.messageScope = messageScope; + setFieldErrors(result); + this.messageType = messageType; + WebContext.setMessage(this); + } - public MessageScope getMessageScope() { - return messageScope; - } + public Message(String serviceName, String message, Object messageObject, BindingResult result, + MessageType messageType, OperateType operateType, MessageScope messageScope, String code) { + this(serviceName, message, messageObject, result, messageType, operateType, messageScope); + this.code = code; + } - public void setMessageScope(MessageScope messageScope) { - this.messageScope = messageScope; - } + /** + * 验证错误组装 + * + * @param result + */ + public void setFieldErrors(BindingResult result) { + if (result == null) + return; + this.messageType = MessageType.error; + this.errors = new ArrayList>(); + List listFieldError = result.getFieldErrors(); - public String getServiceName() { - return serviceName; - } + for (FieldError fieldError : listFieldError) { + HashMap error = new HashMap(); + error.put("field", fieldError.getField()); + error.put("type", fieldError.getCode()); + error.put("objectName", fieldError.getObjectName()); + String defaultMessageSourceResolvable = fieldError.getCodes()[0]; + String errorMessage = WebContext.getI18nValue(defaultMessageSourceResolvable); + if (errorMessage == null) { + error.put("message", /* fieldError.getField()+" "+ */fieldError.getDefaultMessage()); + } else { + error.put("message", errorMessage); + } + _logger.debug("" + error); + this.errors.add(error); + } + _logger.debug("" + this.errors); + } + + public void setApplication() { + WebContext.setMessage(this); + } + + /** + * @return the code + */ + public String getCode() { + return code; + } + + /** + * @param code the code to set + */ + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public MessageType getMessageType() { + return messageType; + } + + public void setMessageType(MessageType messageType) { + this.messageType = messageType; + } + + public ArrayList> getErrors() { + return errors; + } + + public void setErrors(ArrayList> errors) { + this.errors = errors; + } + + public OperateType getOperateType() { + return operateType; + } + + public void setOperateType(OperateType operateType) { + this.operateType = operateType; + } + + public Object getMessageObject() { + return messageObject; + } + + public void setMessageObject(Object messageObject) { + this.messageObject = messageObject; + } + + public MessageScope getMessageScope() { + return messageScope; + } + + public void setMessageScope(MessageScope messageScope) { + this.messageScope = messageScope; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } - public void setServiceName(String serviceName) { - this.serviceName = serviceName; - } - } diff --git a/maxkey-dao/src/main/java/org/maxkey/dao/service/UserInfoService.java b/maxkey-dao/src/main/java/org/maxkey/dao/service/UserInfoService.java index c27d7a784..59ae71034 100644 --- a/maxkey-dao/src/main/java/org/maxkey/dao/service/UserInfoService.java +++ b/maxkey-dao/src/main/java/org/maxkey/dao/service/UserInfoService.java @@ -43,14 +43,15 @@ public class UserInfoService extends JpaBaseService { return (UserInfoMapper)super.getMapper(); } - public boolean insert(UserInfo userinfo) { - if(super.insert(userinfo)){ - - return true; - } - - return false; - } + public boolean insert(UserInfo userInfo) { + userInfo = passwordEncoder(userInfo); + if (super.insert(userInfo)) { + + return true; + } + + return false; + } public boolean update(UserInfo userinfo) { if(super.update(userinfo)){ @@ -102,20 +103,25 @@ public class UserInfoService extends JpaBaseService { e.printStackTrace(); } } - + + public UserInfo passwordEncoder(UserInfo userInfo) { + String password = passwordEncoder.encode(PasswordReciprocal.getInstance().rawPassword(userInfo.getUsername(), userInfo.getPassword())); + userInfo.setDecipherable(ReciprocalUtils.encode(PasswordReciprocal.getInstance().rawPassword(userInfo.getUsername(), userInfo.getPassword()))); + _logger.debug("decipherable : "+userInfo.getDecipherable()); + userInfo.setPassword(password); + userInfo.setPasswordLastSetTime(DateUtils.getCurrentDateTimeAsString()); + + userInfo.setModifiedDate(DateUtils.getCurrentDateTimeAsString()); + + return userInfo; + } public boolean changePassword(UserInfo userInfo) { try { if(WebContext.getUserInfo() != null) { userInfo.setModifiedBy(WebContext.getUserInfo().getId()); } - String password = passwordEncoder.encode(PasswordReciprocal.getInstance().rawPassword(userInfo.getUsername(), userInfo.getPassword())); - userInfo.setDecipherable(ReciprocalUtils.encode(PasswordReciprocal.getInstance().rawPassword(userInfo.getUsername(), userInfo.getPassword()))); - _logger.debug("decipherable : "+userInfo.getDecipherable()); - userInfo.setPassword(password); - userInfo.setPasswordLastSetTime(DateUtils.getCurrentDateTimeAsString()); - - userInfo.setModifiedDate(DateUtils.getCurrentDateTimeAsString()); + userInfo = passwordEncoder(userInfo); if(getMapper().changePassword(userInfo) > 0){ ChangePassword changePassword=new ChangePassword(); diff --git a/maxkey-lib/mybatis-jpa-extra-1.0.jar b/maxkey-lib/mybatis-jpa-extra-1.0.jar deleted file mode 100644 index 9d0a3867eed342e95bf931dfc1567691ba9e2c20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67799 zcmbTe1$5k8k_PG+V`gS%X680C#!PKywqs^yrkI%_W@ct)JEk~h=I7bj-81v=o7sJ@ zkJReZs=B(mlD_(?>XsB`z`$WZ{`NVl`>yaGKmPLz`g1EMt}09~B@bX!{77=Jd z=w#?czC!&fR8PX7?ICk-&5~wyl6KCfsY1h3ab&$=iIj;zk-7FqnG!DxCoiK$Dhn9+ z6{QNXJy5^E2Vu<5$}bu=gr-}QWF4oA;R$(_A|$NG0P;Fal-!<4;`_GpF{IfwjN3(x8Q?V&vE!SN`(Jf$;86Y8ffhNZ49c=Wk;#m*@B+!#kb?ghjT=y!m+Eo$cF2SXH{v1lUu!+EK z|BXC=5ENG6O$Ux=>xMMzdhwmKE?aPvBg(7B@QuYI`BsHH(|QIQ?)VJLy9N^tX9=I$ zZ7?TAGM8dzWZvi9`Le?Mt|AB$VO zT5NVm5D;x@5D=dK|6}29W4)-QWVg!(5cG>O{&Y<^YkY%OgR7T~70;p#t5oBIzn7 z7B2AVBT^#8QZRr`+=ah#sE@n55F#cdCw8py>vT!%a)?b5dN~OM@F;ikTS8>gRd-d2 z3aeHCe>!BcSbhGS?{q>sn#+?m&!h%tZd1e|dH70w0$Hz3VlVPHU~`bV_sj@FngNsv z5Bp)xP{vT7p&u{IGd0`&VJ?oojKHShAowYOmrmAZG?!H+MUHjxxOmDvBB_)dr~!d) zp*~UU`}SmYOL_@oI6-xDOHg$ez);;oq)Po|bCh8g{BU=CakxUix(20V*3wfk{wQBj z$y0P(YMD)#IRbTK`}mGFc*nMz)4cxth%>|IN&0P^lqMn{1Q_hxGIT7`KEdFp7B>oE zrY1I4Y1JZRn(&fQx%#zJBi~-KOB~an1HP_AokAyj35VMe5pjN?l$Bess{K)}7!$LB z(`k7H)y78Oa`B)!h6->o175tDdVhjt1w*y9#Bv_2zy{S|(2VmZ!C~{83>j_kn1L$~ z;sqJ)jaQ1v2^u8HV!4S@Z%R`Hk>*6t2TE2Ed@&JsrXFYM>;(>co2^pu?B1GMiNPv# zks@y`w6y0I>sXIhlKn;pcuD0iBOvApc(WDiP#>=B_jHvoqy&4D<(6+70w)AQi2Awh z5PT`hT~teZay+=vZ>oGqpbrD`BWp&xe4L3{esbU9>jPXHwxqQ3ZFV5V_v@I z)lCsW$S5`G2M(tcnMik^C*gI+=Ff(Q|Nf)4#656Sio#8{MY+ctk$+TsnsIJ_~Z<6*MK#1)c$U0Oqms#dJ4BiVP)qJh^bAq#a6apnn{h%1m%=s zBh&TxM$k;HJ%-4(+gUo0U-<<8;0`Y@Iy*GhGltKKrPlqtWk0^_yMqD5>NZo7z8Hnw zpJzgjI?F%75^HrMpmhO zS4uv}L(B|>7CYbXCO)hrdQ7&PMww6&VWW(!Qo(0LUvqi1_fmG&gq$JDzqe`*r79$& ziXqfyb=ZthJiolkk~-FX)xJ0@h(`3ao=VQbvq_?&k>*gNRbyVES)+{0IGQeO1KW3n z(h;j;OVnqcwypKX%|M0jTsl6Cj;*Pvsi7lN%K2*8hdN-krBdeo#3`aRQm&E z{$N>G`*znkDVkB@aWu=Pq8y)DDX9;tp^TQ#Vs^TVGh=*m?k4H|>Ly{i$RglpEkBkp z8diE1tLA5gclb;v+jOTeanq`K{cXDW!{U(7I?#B^7jb2mt)<76mO#*>SsdaBDe#Pk z%P%1iAxOr_%e(QyMVl{k0lyyGI{u3>{tq=S4+^o2LrojX5_YnTO;*xdKz(^0p2lAY>6sQURF;;2o1|- z=y0!hj{Tu>6qM6RIXn<&}P07Ka*q9 z6Fs)%T`h4P$pJB`iDt{@@EUMKaXLT*HA#0E!MBdJfpRFgZShrS}K^5b% zVv|niHOtBFeH5G01ZHM@WW%qITe-NvR!ww{7gx>SRD<(kSP)j4?JcplXF6Vf`2H8| z`wH?mx-&N`BcK0ij9@=GpU|f<`WtilPhRw2bmwpEMcByclg1f4t2i4v18sn|&XR_< zCe}blDO+ctqcPCl+0K!{*xJy^DO>%_4ONZ6#}+q@ElOx!Ig&)RDz1>e3?={#83xTh zF`zL80wSBN`6OvnHcQssK||?bFjemf0pL`ZY>6b?OLiy0Xx09N?)? zz1IrZ%DjYANGUwSXZsUCzA5^XaU(6JmQ#Aax%b;+Mes?bD zD8p5Wn9&`pQpx;Dex9RK7xXOrSCWuPjY=GIV}Z&ry=IxIE>Bw>fJiH8OK-eX6}$~) zR9y3YPZF-#s47IyU;7jc%lIDep(AG9zFi2)fyJ=)fegn!A^OTqXa@lwCm*zerI>!W zqA1ImGCGU=E$9H=YRq2lj(`Esft?t0u0x|ukCr?du2$G=CvXEsUn0O=v`cW9C$L$d zHcunT86gL{nWwznc$)O=I9L1PdOJ81TPW=%Z6KFlr!z`T&RlBzHS-%!fli96uz`7< zc~57&NuaB_x0o>8X$$5o6G3&xFl8wb?qk*49cQr^Wp8nLr*M zq=H`}bD(H<4ka<@GsY{yn>Ylf*r#LF#)yE?8;fClPU-p>?3-Oq;!TD>^L2#AptRN= z_i?&caJ-DC{m_Z|ySY6>OXXODq@etqYSi|ml_~%=V(rvdikKzJ4<>>|d$C+QVY16L z){_Y13&E1(;qaIO%~9FpvKsdcL4K*BdTvVeK4VT&%@jJEr5rCkbsF{{tQhK9!7Z}i zl(rjJLs{jzrQtANDbA`V?6}#LDHj%OvlX2pEd#F$#&8a5E!taH7dQ)h$}*p;eGvKk z4$QElbz)4P^G;&8~Javbtfz%mEBcH#ip$J`L+-PwS&0S6=KZ?S0 zDRRh2;^Hv&tQXn9z(QrPaMv}c>Ym7{?>mq>YHXY|Q%PYB=tc z!-zWgeS`L8Vfewt%MYXN%TAAy#7_3{yBn+)1CE_pF_tYzFrDd9}0Mg%=_YyhtcaPR6FNL z7Y<`h4jXaLpr>8JA6Jh#dPK83_Zt@^vsg^<bYRSV<7K_HxA8vUsIDwxxkXt;2pBKhTkwY;P& za00<6b`R=h|5NHz21DaTr4w$kolJt;@|MuSly3{Hl+Xda#qa z_mg1#+dF$#{#Nd!6)mptb_wdbqJ{I?CL48mkL{K_r`-Y_SMx~NEsC*s)*?ir>SiZ> zTn*pT@a=;<2q~*#7^H{nCyNYU*C`dDICcde!w}q*&rt*@4yC%u*L{SWLn3jWHI&X# z1s8w36aKUP%N<^W7x|3bWT1n9@ctY7XKnqzn?4N-chqHc{^=Cuf%?6he(lI zx8qt@sgqrh1TU^av$tbH30b69Twmj$+xaaQ^ILBrUpN>vwrA0hH1EM|kJQsMl>=oS z!fV$=EE3+zLe%FdjKOMx3BndekTFyg^bYW@V&HA%4!Mu0(g`F(&HH&td{&DQW)W^~ za5O^9Z=@9CcB(`j*nBhCmmqygO)samoG0FE{Y;WNgr>p>$Wvs%i`_*vU}%@e+3L(_L` zETw2;!3?v(yq-_1UqrY_ip_(=bfXMbbS(*v3F8XwoH9Oofb9(jhtJv?3thtPUWzqD;OZAR+9;Y!jP7IuC{wv!A-RWcM5AFc z+xiXK`|WV>ONUr*B!v2ua%}{!eTiQv2%=S8l%6tbtGY5VK5i~?zCq#RKn8yY4M5li zUUegJf(#HkWUTB~6gJSL8let;eVUe`gatDMp2GKFi5_aw;5?2-5WC1)Ar%q0ShImG z11Mlg^!};N>S}+MC$v(`{G!=&BSSiy$ZS;LxdvuyImZ4cB_%$qJjEaqQ%duiXd=mZ z(TgnfAcB-8W)CYmzsfV-pdo9vth?+$UUW}h|LvVe_VlXSlj z{hKts6so5944lFy{X3jhCD7c;-Rgp2{T}FE6|pQ;2e0nPX(RJsS)Rl7N3ac0+7kWZL1uoNrqef*5A{LgL8*5gqOE)al5K)b(;+;JU?qOe z)BIP8i4H3Y%9dNXJJJP7M?nZigG^1+T2#C?^2#0`_KJ#oY=9dps#&w>;CBbD9U2Oa zl`!0t{lK0rm?;g`{DJf@(Qgf2I@EZ-OD+Y_FH*HIC4j?>7CQ42mpg%cO*f;hYk0Av z@0W(?guU1lG2f`3l9Max?bP|We#1iOvb4StdS`o}Fy0dSuRaLHq>#VG=tZGr4A-wV zBFI-2>-?d8(CjS`FHr6(;@D?K{~^4D-NI2)aNo1wn#(5wGo?~5SDZjSjm|d(T_nWV zFH6w$L+y&2PpYHTn8{;+W2Mq@Xo_MixzF-q;9&$zIJa zE=*SrVRPgvO;@OP57omlc0mzFQvy$@(!sSujhSrHfeP}b@clxi{lZ<&itS6kG6>+i%n?EhOdz7`5YpM^;-5D?e3exsATVv#M%YTnDuQdlAW5@oena3mc1A zxBsZi=;G-^u|kiBo%V-V%!Eybi_O)OY7f555o>wsyRDqqCG&{dzQrMv8>BZ9B$(mq z9`<5PZ?5WOsGO=u-cg`JmoPd!ZCFrKF9OcCIE*!9*B?lW^>gi2#+GSooP#1iTtJ4Q zh%e?|tBy4M6nf2cU%1_;uZtjQd^b7jAey3gRogyxgv=s_74n3m2|i zEz~e>p1l~4M~sv(WGEH4yME)XQFvEGP-iE02{9i8CvJH5lK~gjFzE8acb@b^4;Gq1 zZ#=4WBGenN?C{r+_ulMdYznG4&9c4Pp*h#9Luv_x*U(88BiCrtYIfR&0M{G_##7#- zHSzD&mV&Y8qbMKk*6@>45dn~#KMgAIe`;UlXJxtE%L7W-f~-oyksy#k*K4!8*{?x$ zaAX}aE?}rr*Rd1uz423Ld|~tiASo^-hdto#-Jb7F>jaN~xA>*PfS12+4X>cd%E)5g#hxb_~&&ul2vgiTN zpx(##Y2J20rff+2+BR+AZ#=(2G9@bPR&oKRyc8ONeD*WDJKg_VECpZ-F+B}8><9p8 z!{v2Hl}G7*sZA%q&Jm!Hl(8Sq7*V0%Q`U>t8#Sb z{`CiuGJ~Z%(vN|XG*n%8kXVC+Q&A4fYFcyUT>i+HyjmtSwi}t=FA!$vV(5p289$1q z)|B9R2Pd`N4mFO=kBQ1QhAkGeDja4r0FDed9Z;>GrdO-8fD*aGtt(M#qgN zJY=?)>(7n7n^C}YWnqS@{o33x1nB^FQ6T)sXu<8qv?~|wn0q68$3@;K z&T)gzz@8=4KUL+m-#x_N;t=j#q%OvKi*Z4w}v*F}I! zjL80TN8^!Q)HCbaH*j0|{K8RpWcMwHFPuPo1wBjAJ_e_q=C<(8)xXZ^K$NMIA=<*_ zn}&T6!;v)nyFtwd>HEMD61DH)hdx5CE9$#+^E*bKf-mQ{&JQlXjIZz5z1wK{<4eF{)|`+9fCXjU&^lhSCzs>xMUE&Z zJJI-(rmFgg(bRkgM1D))Qf1zJd#2xhND0|~e?GwkF?K%-3?;VI3~sS3Z^b9r<{c~l zsUC5WVaZohCZ5x~) z)nPEyH6;GQ1#>_x2s;Cs7TQDWB|+v@ijW7pk5Y8<+-i`o8MGzjRKS^4ho=mA0REQg z5n*9ZK!2+kW~o7M>O3MTdo&M>Q@qL(yE-er^f-jDnQC#2quGgf?5An6wK&!$!X5(2 z0!X=qBmXoK@Az}l2#~~y6KTMJ9M(d+=@0w9VoMD4azET={I4g3S1iM?R4ERc%5a_T zWN;FJEuqYi-8QNb+XUQ+x9l5;d!oo4Wg~Y1oum_lVSKWRtjaq1{G)NS4zpHce)Trk z-=)PIrZcLYtemaf4J1KkfZrwZBOHVx4UzfCzZY`h8n@@;t1T$Yc~|VsA!g)U;UJ6u zZsl+ZZPy;#MQC>Kj0`n-3zMW-%x#kST{3qh&TLomsIoUu6v_8k34;P`E6oSu$r+cfQzC&c{2_AS z)MfMi3s_Rh5)ifFm;!ty!W9|C8Y;2fBM$Q(sCr|V^M&9mEc&M@83iUy>6BnI)~~3n zW6jj{J=E}1^L+`oGFDtJrsf&Ncn9tGZ8VI7LiWsI>y&_(jpjm*bY3(%(M4(87xfsy zS+PNFtEtdna@znNw7rsW*XZlhf_Z)|?5b$6;mhu#Xs9pGkme9tJL0q%7MRXS<~DiB zIo=7p2q8L91Q%{DuaR;8{NcJQ3UTf7w8A(l6ostB$yc14EUDx-T!}?D8fr0GkuXU+qmr}YtGqNv zr%X$XgEOf=fvjjRANg-;&$<8szJ7WyX&&rb84552t<><9NdxuzaibVI{=(I;VRw-_ zfdu4L{I>TN=|^ppaGXk*T048u9j`!p{)@u##aZ{G-xl6DI;;7#71!<3UxhAS#mi+F zjlztuRIuV7(J9^0KP=Hd$|Lo2@B8N0#pi%y{$MW(^{9HR%+NGAiM8LMy02?(iJy@x z;N2f?;Q{yu_legG)aF)?{rpfA9obtfIi1NuOXf+Ox-?+dyz;69ivASGS-BrI6wudb zDZ+Y^&1Ny^ytq@k=)qy-@nm6biQF+Y{AkC-y&1C+_* zg9IKlZi#EsCvNjRnBUSYwqIm;-r%$4FRIaozsw^v4X3g)^(zNDc|GIt3)}`ml6Y@XxZaPnMeU8Q&LX(%JI1?K>9q zu|}r+ELU?0GKAm~4KyTf=BB;0hJP>V(^r;5Tx|^d{4b##M8Z*qaj1 z+v!lW@%trts4Q;Sg4Iu6`m5|42Io)7JPg$sup4BP0<3}WhB}5=g7lkMTbM|^lH&mt ztLJS`YypUpjxL$)$@nhX&G;J8M1x35lV>)e?d3vzBuKF=a7e+Z4&qEhNE$XbW&5G5 zkE{+pNc+rQkIzOT{jkrRd;t}3O4FNcmQZ^+u||(rKV}Z9pLizuM=_{L9I|Vy^8aXA zi&sJFhlJ0kf-g2lDbm|3#X~qKZHHG%@g>w>FD95i0ez+78e5B2y&`|=bPY!z&Y_dD z;r821FbDlGZ}RS{mz!MG0i!+8orR@OgH6T|6W%oBS}wPaK=v9#Qn_g@+6dt(h$&}9 zrh_TshfOCLiF|z~NMaqft5Ta>y4OJoG2D!mV=;?~A3c1RC_v|}jksf4!g^Lfz!&|3 zyMO~uZKinBOzu=~712UCMB!kIM_+k>nWNTnuy_adq*pHqrcrF%zeJN1+2V2wO0(x{ z3^-{Fg2^&LQXA`Wye(jkxAS06?gZGC9J-}FOPZ9CcpjQN{YYEkloM;}kxr@!XtmRL z#Mezy?cjb*U4c zj*$Hc`IUOPoK<8N6ca9Rv=)YP^E9ODsE%sGzYx(FshHtNM5e)a{}e#-#D00!>xF=e zpIEkdVCY;2?=nOTj8&MZo)t)Jpf-W_z_c~U@Dbi1JH-Zn?^DEz5RqqvXJNF^K5nNV z;vW|Gzu`tnSc`3O3G+B$@JB=9k8S?x_^#e?#=5;^upsjcMq2nrwW~lH%q+sr@U3*~ z03O5Ya}j{`=MU;J5d4-}`=|dsaVosDs1ZC_T4p7XbQ^NTkLfKanP^L|vnS|i!)alQ z5&mk2@STST{Wt8Q!$mT9ea!cT6oO>Krw)K>wTf1;d3MoY*Vu8-p@cKJ4B&S8RN%ECJN@(m-zI0w&4Zo;j#_6bH zgSRSU>if3CwsgiK<%+V*lN{AN&tCsR{p@vl8y7!ujrVh^4&DC&*Zz_B6{%Tiqe`Ip zglea>=!NAr-Jx_)eEkMtv#3a`F$fR}q*_XmPhh6o{KL?WYx(B@^C_=t8qCH!=l;8| z>W`fC&4Dz<-W0??6Qds6H&d+>uXhg@z920DgvQ4PTo>-Z!1j(7iYV!-9mH~D85*-WzQ4-2@uhZ3J7t#{zZ!GfD6Y_i$ z^i}fmbaI>DCa3w+<8$oXul>!|fY%#>2P-~3X9nroYI%l)qQeIjaBHt3UzhCt{B@1O zB<9W?Qg`h~)Zk^uTl(MFSx~;&ZPBgsm3jv3dbSU{xBIz{%k9k$MW$F}_R57!sd}d8 zS&dPLbH(gw!Vxmz+3;V}F+#>@%wG`;kYEFmf92n1$*>2f)wf)j&7WbPLi9u9Zyty5 zqKWEf-g3zsDGpoQvff6~+Mqb84-4bX+2;hMz!cyp!&w+j2PIF6B~K~>S(Tny<`WB) z9LP`NVj{69TC|Jm^{mu!mw47~rJ6I@Ot9Ky`e+x}6zdqyDMUO0ENoFIKb3Dd>EJb7 zhqo#YE{N8q_x@$+c zz~U=hky95dsj5h53~5L7D@7Tj^M%w%DUK`fz+4Y7_f6lxobVEbu2rT9^Ml2@jXZWs z6$U&N6Mk){ifU)j{{>7ur=G8Kll0;UF@wY0N+VqJS#-f?L@I(HQEo{;65kyQ4q*>b z5u=hGjV`~G-KDgll;j{96``lLYGGL4$xQjZjC+8;h?!PYFZDYkD>=k5WcERjUaE+V z!L#omhw1=~AS|MGd&=quA-QM#_YM>!%>F=0Hu&_}kg2J+(8l?qt)rhT%y_;Uc%D@{ zWm0ja9Zvxn0h96c(oHpD6`1?b-%hgTKu||2!2_HJEkn*LzgM{Mg zh-{^X>l$WQfB)AQM?#JLA!e3TmWbViEDC$o>aixQEYl*R1-w-BE-l7 zS6mIk);ps}mu}iyA4$z$vyL)g9CGh%JAJ;oA?=ix$`-LvuL0X8jI*3yCVD0rdBkQc znDdi=t+ zC{Tm5{&jFH2XQkA@rW;BG4iKv7+hPV{(+eK)KfvOxVYaRY|Vtc!FW0q796D6SkV0==H+dezJgnuPDRChlIN3+heYo4Ne~@hyH0gi5y_$i`T0EUZs)A>-TYg{Sv)I?n5JOTV3 zIMXs%w)tOx6r5+0b|;cxbwCy-0|r)G{^&TmcZ!-VeTgv55Z7Pw|W^R zu)7d!SauJ^w!4UFXd=_tn`fS7W~OyMcP?;J$QQg`tW^X{PTPNRvIh#S-rh}beML~Z zPxRi=nBShAqqi14lR4X7d_nJJXTBToBge-R?2G$Mm}hH(^sQ|!C$dnYBU3J33!k8B zrBxA`D)2-(MSzX8l&+gx2y||;i$x^w6zD8FvIwsw=j!U>1EudYZ?(X-EP!6UIpMgRRn@{EDu%~-oR{pkC2#$mT9VekLy8u2i}DG+Wh*{nJrV;Dx5^ujY_^XA>gA^m zvq}iFIxB=tIA^wlem-M$jQ;F1I8yNb<8oFzDwtv{4P}qzP$Y6H7IG%Bh_={q&|~~qm1Z~^Q>(P$H{^#Nc8W3I?!Jrf zgLZPg&MmG3u zpp&jCYKi{-<)58o#Zd{1txvQh|3pic|D8-Ke9m*S2L1&u{~k)j`Gm{b=%`5}>mh?$ zGBPoyzl9PxC`pXaiMRe9Nz6!(f<$$ksu}5BPO5MWV!F6%hQHmM^Q zFEwg=ap^vI*#iB9%bOaIA%o|c9wgREBN6t+R|JJ5M91LXnV^7KUGdfRJb7Vht`j zPF;$*O|LGCb{)B?8!hL|B&8@0|ux60eK|Lwcqw0?{Y# zLCtF=WLuBGh%bqZI~z(w#U-{R`z>l^dftbdL3K1z0^q6-n3Z~O53|FOX$g0@B?{O3 zTTBu8j{3Pa!iT1Z*In4I9xF~VU%rt6rS5xFEO{HAfN%tpX?ULa+yfCke|@`irz+TM ziWmu$73d}I1`2bxumt}(5VPWDZ)MSvAHLdpGkNh+x8$pk@jJ>v5u$?_QxtX7$Rql& z2mO1K)~l86D~Tl|&U2eooB#Ai?FR|JAv*sJr8g~a zg&o>3YkaggA0~1}DIoMa#GT$^)ERkb zlTz-+@^S3$-%69PDBL{IOoYwI6%kL^1B^3!U`8e{hj`V!Mk3mZy3HBRvEx5OiWnl| zy_^*yu*qAAdiv*)E(cpmv~IdxEPqAIN*Fm4;!m_h_zWp>{O@R~Xy@c?<_P>(1hWca zR75Y188pf!ctsOs1Pm){UbGASa8b zTr+wCC7c;epL$4#%?TiQSBcN5N8i3`EIQ&4O9L{QHF$9b_a~FI$ajNle7#wCo=RNW z@GUaptl?k~0Mvu0LEC4H4~RukX@chQhMRX;0-OqGqKK8h;b{J&^EM7rjFrEMw3O-D zL|2K#K#I|W9^$k~VAv6C5z+&zXA^NYZPAmxxw0h~SM_K7jHG%@Nzb@tro=y71ZkPt zjxKRa`eLZ?J4qCosTB4GTd!(s|8EgjpSqgac^J~FifvA&bi{--t;8f4JwG3Ku7#fbW(o>ph zDKsVDe#ChjVm(|bfe^CDBFN(da1hOJ!KrO#)NY68PsE6W;0PdV#ZfFn=is+q%gJPq zFsv&Sf~DYV)w*5j_3}-l(>5U_QSFQXZyZ2O@TT5YSvt9oMgXg~Od`QO*3^TSx{*Rr zDS-^Wz=`r@&$uJqgqdoCr0Do^rn=O|^1;rqr{zW*^s!z7DDg*#`H{vnNato@^6YPg zF2E(a4d2&URxw(n5JWSkO4qUQrTNA=GeomZa3@>P*o#ot+qil$9uoeu5hpAMQeR3T zl(}6U*!Wb;Cli06rhI2dQg`e zG*H(XAJ5l|!YK`7y)BK1o@q)H8jZScB#;y*0`$p8po<%5-Ue|L@cg(A8p%0R&`Y%T!T4 z=%1xwp43yZy5$EdNeaEG5w=iq@ok0E&Eqc&+++6a!IHxFnN62e*S9Sv*^XPsaZZi& zNBP&!w||+1*DRCt((?&A_n)A{{=b9HC)%h09bJKre_?5VcWVEJIX{IVQNQ{#hvR=T zHez|}AYxEhZ7~sA16dHne0oIWITN zHBDS{rST}nE}Dy1r4(RbojPYuMYpMQdNd6b(6(i$jcX-ySS@NEcc3CxGs89ZMM`J^ zf8grfvi5|6K#B=%86Mm9lQy3BBZct0ryBmw&w6!7B!$}~OB2$Y={jKfD#eHv02{7q zR91?{`b~TW>t^5EOUOgTC0pYGJ0x)QCg1v=nbDT{G06eQ{X>dY_=K2>F9?g|EXetm zjE?g4D{0>jyOmx29Hup@5@S9bEytCYsj-_2eP`MTl&G|+F2hxTA3a;vmQECAV({jM z7D;!jwrpWT`{1Jy4fCqO*`Q5Gy8Ka6+?**bu5X&6n7Zlff|RQlY_Vn9)0&2!*Mz;z zz7oj~#i=x^8#Ft!xABP5E2n&_7*A3&xOvPPeoKmzJe{5VTiCt)-k2{XLqu&wjC19- z4=bgmNP(y2y$=@Szd}3KHb@1$BE%8*;P|WL-!%KcAgAlJxcAb{*a$Ncf2{H%RjqI& zj>GwoC(BYsjs>8oV|2Ka(Ts_Fy*3Jl*_(t8*=pNt{*+8f ziDo=2JWXq#2eo;7*o-jinXaC(+hWQ4bsYh(nhz)h;t~rv1`pF4Xavwn_T^Hh zg;Jj6))cRXdP^kgPj-vKF*(SsaqD@jqYE5@^s)uR|hqM8&7niCfxtuy9FkSqrV#d=s)S z+wkKHMUbVwTkr8g;bP1vNb+9YFU!bkhrVcC5kuedeAIS(H&hERQ^VAd#q%wd`er6N zrxtD$piR!XMVY?gVT79o~WRpzw)rD z!$gnQPbl>IteE{_gN!*;Wr0^ zfyDU?2EgROb*scthK7vv9~w|&O{$YuDK^29ePqY*@*@O#m4+|Y@;z+6IBtLcSh4=H zv9}-`yxYb^jR_myAuXV<5UeJXLl3UODv%~+vly9B%-F=%hcVRqMU)rSF5pO{#EWgx z#0VQl7z;lCi0hURG-T>>nYr#Wi#NV=2h-UovQ8OaQy57qeRjX@QaPx@(s)kz*3vjU z$Q-^v{%&k_AIOCDGHd?2e~qQZxmSEdk=EcGjUjN0Yr(Nd;v=}?bi zk*}IVjOaobUOtS@o@Y4jfL?f}!EHIlniw3VzSa@yKZgLu0uy>cAV5IW;r?E7`~PV$ z0iShGc8(r@pH)<)eyWbEhW3sCPC+KB4H}}{C?}H%+w7hY7}}9es;s(D){u_j_b7tWyC>Q6e&P%|0!YsXq;j+wb=RFB3m}Kkj+` z1YUDJ$VdYDm zP#THEAc@~2 z6tjd_aEZb-&92}DnsH?w3S@~T2B^SQLEX5NDI*K9epzl!bZ%`$+YB}5Dp++TQJ2>M z!_re$3iX7jg4_L_a7P@*fo_(|vVbVv(>FU#gXWGcPXV8(aHNje;v%CxV*lyMq@>T& ziFU~3AvT%c?C~9>jbmFt;KRlDV`pY(<54>v^g}d0Q5k89gDdS#?zI{6l3c_ee^iTE zPesZ*(%9cIT)9AO!exKN*aXyE1TF`2jE#R|u?~4J5O<@Mo}7_h#H(2u&z{x1+w9P4 zy1u%#ukgnDQ(ZotYwq2kb++$^pNY!PpSuTBt$ZLgI5usM!y!lhC!T6o0@RKg%fy^+ zRgpQUd34DhMh`oH{AXfy7G6iBA;iUO9o4oPbAZxs{KOiS+Z0{I7f1t!FRsgQ#1_xS}JoBoHb?NG&fTfg2QvPwaGTfu5>7_XL)!Y9zj@loIvsIp&QXNm_Crl zB0*;Ze0Xj`!i8aW?N9zCEvygowTRSIgbn?aPIn{Ft3>h<3wz?^#hbd*GlLxW=I` z9@vA-D|yR=6YPAn5^dX-*=N(54I%KnFVGeFI*J06JfH&NCXp$2T8FNn zk=W6K#=t`?sLqD3s<#&=7?>ooCpSnXXPboMMSj;k#96M_wpR#`7{9OM{p8nHFeZFeL%Fql*Z((a{_je@ay|Y^ufP{oZg>-d=qyRuRz2-Z=4gAN8 zOWrod3I`G57L$ii9wrSDL4IZ(P#ARrF#|8{!m zXWu`4jn4@Ne=)An>ZeYh)jl7(GS>{(kk*E{S&Hj3{|{&H7@S#{wT*Viwr!hF+_7!j zwv!Gzwr$&X(s_c8ZQD*dI+>dJ>dZS;XU==hzkS!P{cEkgbY1JZ4Q$564B)=oKn){S zsWnKO$iR`C(N`a^S3-8u2EIy3C$@ObQc_d@n*JfV#t5c_eH!qGE!(Yx^&-^oJk*aS z-~%?h<$k@>dUV7HVq&@TY2A71C40+r{r&FK&mHpzryps4U_QMug|L-c^pr*Z{Cbkr znVJPhWyrk72fo0M)@kXa$st{ml|Jj2poGhT(sPTm7}&0x$x0mbTF#c>SC$u z1Ra)A;p9OZPSM`U20&YCQ7dRUdTlzF7vQCR-$Q4d1idJPcNn#*B2&tw3OrA8Y^ zbl1xL3(ODO8jFUTr@cr}5Zz<|X=ZL!f`Pp_-S{*q-?1#c%_^#L2(DV!(6rWJKNK<= zX3>zmb*Ada4oBBxlpQk|sk{suI3r~?IJUiIbduBNTuT;{K)a1%9dz|ROLcY&ww3ny zG4g5@(=F9SjiFt!upnh?14sGFJJ(#%+wVg`a7vupoXl<;;>ohv!4sQ;$ zQL@AguA*V;pIqR&%foenbO5K2Xz9UYPL=TjDyi6~k!86U!Y)?-tMm3(PRvV2oxkTB zmASfYE>~mXi2OZTzmDpp2jpl5XA@!Ef{gAgOGaU>TOAuZBJ0!SLJ z!NK+SH9aB#`>Gcz#E@7A3Su5n2i>eblKp~yYCEn-b8?4GE;@U4Mli$AAvWelc1V@G zauJw`<8`x6@&E>E!q`E{W1|)v0c6$20#rZ;DNM}nI2sqWB77wodgOz*$bhs8|Mu!xPapEg))P#xyP#z~!=`aN@s zptQ7s4Zby8nItGIO?iRM%s;dx|R5iB03 ztcyNNsU)7TU`pf^(^#4npj&S4Swh~$u!k=-HcY<(EzlE7DE0hZSoX#SU~64);2%tw z_}wv!vixHv#9_h9L*@vrD>64B_9QA@DSS}Z6u|peBuH(*8%`d!UiJb#;-tJP|K<@J zrNvYyk07H^pDjZI4zW}zo*h|>2sO|WCZjfV&%9xqO*+&Qn}d% zve}$!LHCjcMn)L3njM-RIaL%I!KStoo>kpC`O_t`?ybg6A}*!q$Y!>~R+VD!PK4U95G;-XfhL~qV2@P7A8W3w z+<81Y@w$4q?9pvdq=Z+78G42f{>0>OEzEOKd*ohieTdM$XIB_Zg$4Zq&HmjDHWPHC zwLYj$Pyff&5bvWHPhgG}SM1Rp7Vo+s!{9FYh$*r-N37ya0uUB2M!e4w^AAVDnHh;G z-zn4>j*SSaAQVcNUEn>hCH!23u$^09TbwVMfQSs!>{gT`Udc~AG`#vxgJ_Wr#lcz} zN;J0sp&idxAbb`4{1LMwfj??L-S)DGffIq%E6`$$GzWNZOGew58nD6}6+sK|gk6zP z;@-`v=_JHOTwRu?wSZnZ9Ay;faap=X!yAL@WOxfGp;#3hqYHD1{w z^6V^A(tBv&w$Hx09qiQ!!h7bHjJVVzb`SOn7q0)Ca)q*xIRdmMAta-B;t`n%;mBm1OC>$-^Q!n0_yqvu<;Lje+JbZ^8fwqL#}n2bvJVr znC|Sk^^2^B)bCeto&(Ywn`*)^qgZf%q2TE;`d4c6Sa^*Yf=^;MKSR)Hsq z!7`Ep^Ah4?;V7d=?wcp{g-JXvl#Gaf@6S8bfZU0_BiJ^H!%QQ$}eDsC6Smsn;|jaS)BLi5qyoC8^e_4(AOysNQ% z2upPSehDCHg*-GwDn{{O8Dll|)Wp+EpApAGL#W@?m8{19TBW0aBUI$@9~)#dE9+2X zrXAF{S<-UWaA5j0ovNQ2G#Z+=SIM&r-rU2-AuhC8oAL6C63Wi5sHuqnwZwcjMb%aW zz~o`(%}MtXi%N7-rjt)lngn;_#yVV8uaTyQM`ID4kUt6TLzNrDQI2*7Qwu#olOm@1 z^qp^ThE$o302QHyU1$wPG4xt)Xs`aK8JUj;`}x0`aM~{%p6UP9j1s0E|6$2w)vt<6 z7436_ZM0-OC1o0f9!f<|auo^9C;ryTlP#@9LaJURK-MYKZpCcR3{*wLXIwqB)^Cx~ z2WfhG20J_6{zEoukBig#uar3(>q_@mb>(;DuIK*w_jPIOJKkU`4hRS|kiPg&gl1Y| z`LEwyCz=cMKEGu&f6ph=rZ*PeUV>|;)SPhDgyj8L>hfHZSutx*${3j%4=g37i(AJc zS57jW%4jZH14FT>9EzsA2HK|M zJd%MLK2k)0U9{pDst$G=^kcQ3rYFTL_W)(Ojs`9E=^$GWF-b4YQiIh(xdqf^lH9Y}=Qp0)%=s(Ev91SwEpR=%=mi@#OW;k zxH%g`!_b}bPJ_)Y-f1+17MKgINX)Z9O_+IJiITy%(`cr#nLFJ2Z<6G}Wb`#U1rVir znZwWh6dw&!`-n=(c8jK8l;t9}FRN8Qu0lePdGkWd?OcAT9O1QoFW7;_88j_KUaL}L z_i45=qCC<$k~6Nl&r)`Vz3uv)nbSPym}WaI|I4z_A4(9+WA@nYYR~)ECifPN)z;1x z>2j3Z>}A1*y9s9AQxCaKx$!HCTZz92U@hg+JLIFqoK9dGz5VkV8zLtTI@6s#9dn3ssh7)zB)xZCSvI(B*DH9q43bjb=o8iHvMVWD!jNn-!;6V62&k0oL z6TY+*HJm%-4A2`KImI0Rj14?%`!hg|a_gkYq6-YIB8%Biu<;>T!f}&P+k@9`+nV*+~-QsuFqX z`fBBryjR8&uEc6n%4Up0C(G%Y>t3)Yd?lhUcCaBQ!13^cDWBIf=~6>5?UsA0_=FoaTF+E#|+wey0e zU7105Mf^J=*i-1U=Is}H6&`VNo-1E}xPcA=azp7LL>PZY8}m3%Y?u#eq>$zF!3KLRjJ?6gW)R{|NJ7@ z{}+^B)>G&oLY~T|&d!$hcK;fL3Yi+({j-HnR$FoUqT2J>N)wR68{jf6gOU897>$H- zgc3x6<^U*?tdW6G#{Ft4s^>Lp%ESIX*>g26ym^}us!~jYUN!(isano^B!7!aTq+*f zjFswH_eCVVaK7Sua%ug1xr*)m7PSWnj}HR8{VgMcVPZ8CW|EpX%X~4SBq(NX=82ZLyh8Y ztN4B650@CTDO%eg#&I~~=oyQWlMF2ir)?;KHi{VqWwz1`5@4l)7ujB7tEx!3P70e9 zGrW37OdeIt`A=0mBNqq>#WcI&q0CX!4|66q#_ja6Qg}k{nMz~YmX|uvPPTKj<&6xd zW)A%K<%xBc5Y*ZfcYucEWCEG-SV9Xve6xBNI0z_r*YT|(E`i-g!l$*_^az+r}?-*ol&ulV{-ZW9{CQwEzMA}bE>#o6~ z!gJx+5koe?kN2aFgeZ5-b}*d%!A`u6olDfVX`$mJr+njm!jciws{9q}L#Vni$Ka2v zT#5|sMu~8M1XGioLg(%RgO1t}kGt|g{@=VEfVH-@t*_{bsSXf}#4oE)5?&q#PCx_; zUw#LTTpnKbz!}!8L?sC(l?wN8Z69xeNie;pIMrd^GD}4U>$jc4F6h}D3IP3@IKn)6 zcS<2R`nLLK9VoxdPF6^xjI*sPL%T@yY1*(e$c9|cE`41i#grHvI%&xsc-M$BB`i2; zDh8G=qef=ARxqsNWUOY^5))8H3o$t+RRw&rDW1;sO=7zs1Quj1!?o0ypq5EL5hs!C zr`HlmDP^B8eQGPP`m~TZ#8PfH%`J*0tRoxq|>!X z@WDRu#050w2UT0UGJ1ykf~gDLzp!%vx$8=t46T4lNhg@~TMuEjbt3YeKa;$UxPg#|G-ata{Ynu@11 zk(HZ&^qx9yZrE{-_%cRPkGX9tlHU=1kdp3e3Ar)@E}k^EoVvDXg;5sAI( z6YbxLjzTRLXqfMa8P>$;49?S5qIfV#*odbhIJr@*}3cfY2nDwu^MIRCB=#tSi zzu=Y%sUk@v4ZsQ)gyfcHo;VJ41PO`$Zi7z0GgOH4iRti&Wrp4X(JIm$PQd&q`C@^g z>NmlCGS3K)Z{f$qJ*8K>>G3QS;~qUx&opKlr}$uMH($%IQ;f^Z+nT>CLHze7R^n$^ zHkF)n8gnl{wSgKH1{$VlR#>DucpZ?PQ3oAs-WPVw&7IFbX$d*1;I=9fd4_L)`qGi~ zu^`sb3j>0JeEdU}<4Efy2H~~*O*;LI3(-UkF(wi!(L8Tx`G1=ii2$db@$}=0SeyL9 zYq9pMz0SpezCF8o@Ir&o(c#aY?WM))6s#s7@G(Mq!NYd?^DGr=HH zgfrND&|tvJtrF1|Fd3kRz8B??lx5JM09`fGqw#o_<%&Nl)o3b)0towJh5l4k|Ll{f zKe)M^?BcY~@pboihBZLsF+~I8Hr(fOqJvBw!+v)&Eig6*q)fV>loQhAJWH;3-pT{? z#U!^U6h0DS7(u7FoI|bRpwRYc_48(Y|J)}?KyC)~b>YedMiLwexaGRcS{BCR#grWf%Tx`^8|G>^{#85qm1vRIV@cpiZ(dScg~GG1AODdL!e>JHOu{-L7q^2Rp}Lx_ z48F9${b}glqcdmpg!9k~@i)Z?lsrN;;w>AaUc^07u0N4Mcsn2~L=l0$QKbu%aZYQ&;d0kPs< zD1B8MJUB>X{SD)bAgU#*?A!Mbs=YreuJNYY(ZnmP-foB4M}N|HfK#K zleH8VDzrYTYX}G~tVu7 zUv&2c%2!CQO|)ar!5r_^d(#V9Aoht|QnLK?2%JEfUh1Z+2u?>9<$y=AEn z8D^)yvec}mpQy_pd*H20Cqm~zt;JTDIKh0vSF(NzC{rIBJ~I{NA-?k=0ZQ{A4Fdvn z3#+c!5x&-Uoo#!`9BDnPljf`-de<`j?y40rHCEqqNsyUaiX_$+f&Jwq+bFOE-&!shtSALvCx3USvjXOL9R66?Ev>+W+RJ(Nj z0@D`~hcO@TX)i5V)>3r9UH3g#XMif|9$T+BE!BoM%$CZD;7P0} z7@$z)LbsoQwB0DKDB0~T6(KPJ-0+@TVfA2C1Sk(u%<_d)QxJ@1El{{b_LTZmPdoIGq>3?cerneC92 z;4JGU&5kTvk{Q+3{9c^OnkF3TYq52@6T)2FpR`&ZzvSNd>F93$N`bJmm-wmh2Rw z{S=zz0v^RR=#QezDOy|}Jj)(5igQp|4v~77ppji1c!VY|IGIV1j_3d=+3gH?!#OmI zwC^@Vcnf2f1@GC{(SMUX|HqORWa7S_>DR<+^GjWo^Z$9=@$Y}Kq?Ci9kfF2bzyHR` zDi?Mrf@s}A;B+e5+Sby|YA2Ys&A6z_(MSoa!(hUs)W=^TOech{b1hvHMQ?(T|0kkp z7abae8+EeD;AFP*WR~}#+2`B)1MauY!8JBAsII$UTZP;VdNUU<*@`x{Rep9K3bNFQ zb_!M+ec!+7Qf{KYbfty?eNvfjqOA`&2tW!+I3Rry!3#!daon7-Bhu11p4Fx$8`Fq zf6sd0%qbEYOHizN0|Bx62ovCj~r6$3CKDtx*)LSEQgA*vv(B z8xg8EN#*_?l4V*}?zOW6Mz9Rm_>A4x3BIh|$SSN2%I#y*b$XY~k&>-}Uv5F`c^e!{%P-GDkLUVF-oK znz-d7Xnc0Ay>#Hq>9W8)!1kiHd%y-`ab-lJcpboRYUOxQ<-TBrMw5z`pE;oxm!<{* zBu;;tUVEnmqmdCsSAy{di@xdizr)ouP|)?0LQ9J9iJ`TN?s#D`gO*89&>&Xt?`OOD=@YB9WRCqrXB^-T@sJ@8bFo{C%XBc+t+WO`gDa~rAgzL z_x_jW@ZUZ6UydtcZ)<4zf0{!jS$kAwB;PrTl?EFD3F&}a)gEmGto+RgKpaf@0t|8S zsBeOXwmL4)Ew{>bBp@&tX15PLJa_0jv!gILU%#Q*{!JIBpZv$i-MIQUZI3vEkn80a zp_{N*NG_eo(}i_2=kAft2|lNZG3xvW_Co}$@xd%~g`fu4{!&$x zvh4+Y>LLA;l&nU@Zaq&w_u9$^@ic*9&w&m4atK4Jv9ABq4Y2jS&{f)kmwhqVJa{E~ zf+2s=2{hXXLmHdq4=RSU@x%B{UFrMBXo%V6--e&2(OIPvS^y^W9m$Vg1RK;@A?*vU zf;Y z$rs}c@L46uEp|)y!B42l$(lc|Q85ID;$ahT>(leGo$>lu)QV6Tj9g(hGXm$P z+FYW}fExb(A%-uAA@@l;dRZNxu>Z3nMd`8%V@Lk>&H4+;|6c~If0_LsWL!(*e-)

|-QvBzO}!{_VrTGoo= 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 diff --git a/maxkey-lib/mybatis-jpa-extra-2.0.jar b/maxkey-lib/mybatis-jpa-extra-2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6f675e41f0b8cab32569e0fd04e4612f571a142 GIT binary patch literal 65213 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∈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 literal 0 HcmV?d00001 diff --git a/maxkey-lib/mybatis-jpa-extra-2.1-api-1.0.jar b/maxkey-lib/mybatis-jpa-extra-2.1-api-1.0.jar deleted file mode 100644 index 9bf9165576e205ada0e2120d9ba45fa36008dadc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6939 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 diff --git a/maxkey-lib/mybatis-jpa-extra-2.1-api-2.0.jar b/maxkey-lib/mybatis-jpa-extra-2.1-api-2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..c7e3f78d16468641d4a9523e3efaab1d2c541b97 GIT binary patch literal 6903 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 CoPcfs literal 0 HcmV?d00001 diff --git a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java index 43c59e672..8d05ee135 100644 --- a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java +++ b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java @@ -199,7 +199,7 @@ public class UserInfoController { * @return */ @ResponseBody - @RequestMapping(value="/delete",method=RequestMethod.DELETE) + @RequestMapping(value="/delete") public Message deleteUsersById(@RequestParam("id") String id) { _logger.debug(id); if(userInfoService.batchDelete(StringUtils.string2List(id, ","))) { diff --git a/maxkey-web-manage/src/main/resources/config/applicationConfig.properties b/maxkey-web-manage/src/main/resources/config/applicationConfig.properties index 93accc6e0..fa2fcec8c 100644 --- a/maxkey-web-manage/src/main/resources/config/applicationConfig.properties +++ b/maxkey-web-manage/src/main/resources/config/applicationConfig.properties @@ -51,6 +51,8 @@ config.characterencoding.tocharset=UTF-8 ############################################################################ # Login config.login.captcha=false +#text or arithmetic +config.login.captcha.type=text config.login.socialAuth=true config.login.msad.kerberos=false # End Login diff --git a/maxkey-web-manage/src/main/resources/spring/maxkey-mgt-persistence.xml b/maxkey-web-manage/src/main/resources/spring/maxkey-mgt-persistence.xml index bb7fbf9c1..e271d1203 100644 --- a/maxkey-web-manage/src/main/resources/spring/maxkey-mgt-persistence.xml +++ b/maxkey-web-manage/src/main/resources/spring/maxkey-mgt-persistence.xml @@ -62,6 +62,8 @@ + + @@ -70,32 +72,13 @@ org.maxkey.domain, org.maxkey.domain.apps, " /> - - - - - - - - - - - - - - - - - - - - 70 - 25 - no - com.google.code.kaptcha.impl.ShadowGimpy - 23 - 0123456789 - 4 - com.google.code.kaptcha.impl.NoNoise - - - - - + + + + + 80 + 25 + no + com.google.code.kaptcha.impl.ShadowGimpy + 23 + 0123456789 + 4 + com.google.code.kaptcha.impl.NoNoise + + + + + diff --git a/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsAdd.ftl b/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsAdd.ftl index c9bdd46f9..23bd61248 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsAdd.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsAdd.ftl @@ -51,11 +51,11 @@ $(function () { <@locale code="org.name" />: - + <@locale code="org.fullname" />: - + <@locale code="org.xpath" /> : diff --git a/maxkey-web-manage/src/main/resources/templates/views/userinfo/userAdd.ftl b/maxkey-web-manage/src/main/resources/templates/views/userinfo/userAdd.ftl index 9dabe675f..07584cbc0 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/userinfo/userAdd.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/userinfo/userAdd.ftl @@ -51,11 +51,11 @@ <@locale code="userinfo.username" />: - + <@locale code="login.text.password" />: - + @@ -88,7 +88,7 @@ <@locale code="userinfo.displayName" />: - + <@locale code="userinfo.picture" />: diff --git a/maxkey-web-maxkey/src/main/resources/config/applicationConfig.properties b/maxkey-web-maxkey/src/main/resources/config/applicationConfig.properties index dc844e65b..e3d21aa03 100644 --- a/maxkey-web-maxkey/src/main/resources/config/applicationConfig.properties +++ b/maxkey-web-maxkey/src/main/resources/config/applicationConfig.properties @@ -40,12 +40,12 @@ config.datasource.password.encrypt=false ############################################################################ # EMAIL configuration ############################################################################ -config.email.username=test@maxkey.org -config.email.password=3&8Ujbnm5hkjhFD -config.email.smtpHost=smtp.exmail.qq.com -config.email.port=25 -config.email.senderMail=test@maxkey.org -config.email.ssl=false +config.email.username=shimingxy@163.com +config.email.password=seamingxy99 +config.email.smtpHost=smtp.163.com +config.email.port=465 +config.email.senderMail=shimingxy@163.com +config.email.ssl=true ############################################################################ # CharacterEncoding configuration @@ -79,6 +79,8 @@ config.redis.pool.testonborrow=true # Login configuration #enable captcha config.login.captcha=true +#text or arithmetic +config.login.captcha.type=text #enable two factor,use one time password config.login.onetimepwd=true #enable social sign on diff --git a/maxkey-web-maxkey/src/main/resources/spring/maxkey-persistence.xml b/maxkey-web-maxkey/src/main/resources/spring/maxkey-persistence.xml index 921758466..b17e13055 100644 --- a/maxkey-web-maxkey/src/main/resources/spring/maxkey-persistence.xml +++ b/maxkey-web-maxkey/src/main/resources/spring/maxkey-persistence.xml @@ -60,6 +60,8 @@ + + @@ -68,27 +70,9 @@ org.maxkey.domain, org.maxkey.domain.apps, " /> - - - - - - - - - - - - - - diff --git a/maxkey-web-maxkey/src/main/resources/spring/maxkey-security.xml b/maxkey-web-maxkey/src/main/resources/spring/maxkey-security.xml index fb0f3af5a..592e12667 100644 --- a/maxkey-web-maxkey/src/main/resources/spring/maxkey-security.xml +++ b/maxkey-web-maxkey/src/main/resources/spring/maxkey-security.xml @@ -127,26 +127,28 @@ + - - - - 70 - 25 - no - com.google.code.kaptcha.impl.ShadowGimpy - 23 - 0123456789 - 4 - com.google.code.kaptcha.impl.NoNoise - - - - - + + + + 80 + 25 + no + com.google.code.kaptcha.impl.ShadowGimpy + 23 + 0123456789 + 4 + com.google.code.kaptcha.impl.NoNoise + + + + +