From 8c50c6e225bd80201f84c70614d07752ba70b31d Mon Sep 17 00:00:00 2001 From: shimingxy Date: Tue, 19 Nov 2024 10:38:39 +0800 Subject: [PATCH] mybatis-jpa-extra-3.3.2 --- ...-3.3.1.jar => mybatis-jpa-extra-3.3.2.jar} | Bin 178872 -> 180970 bytes ...s-jpa-extra-spring-boot-starter-3.3.2.jar} | Bin 29585 -> 29584 bytes .../persistence/service/AccessService.java | 22 +- .../persistence/service/AccountsService.java | 252 +---------- .../service/AccountsStrategyService.java | 98 +--- .../service/AppsAdaptersService.java | 20 +- .../service/AppsCasDetailsService.java | 48 +- .../service/AppsFormBasedDetailsService.java | 46 +- .../service/AppsJwtDetailsService.java | 46 +- .../service/AppsSaml20DetailsService.java | 46 +- .../persistence/service/AppsService.java | 69 +-- .../service/AppsTokenBasedDetailsService.java | 46 +- .../service/CnfEmailSendersService.java | 22 +- .../service/CnfLdapContextService.java | 22 +- .../service/CnfPasswordPolicyService.java | 21 +- .../service/CnfSmsProviderService.java | 20 +- .../service/ConnectorsService.java | 23 +- .../service/FileUploadService.java | 18 +- .../service/GroupMemberService.java | 67 +-- .../persistence/service/GroupsService.java | 101 +---- .../service/HistoryConnectorService.java | 18 +- .../service/HistoryLoginAppsService.java | 45 +- .../service/HistoryLoginService.java | 23 +- .../service/HistorySynchronizerService.java | 20 +- .../service/HistorySystemLogsService.java | 189 +------- .../service/InstitutionsService.java | 26 +- .../service/OrganizationsCastService.java | 29 +- .../service/OrganizationsService.java | 166 +------ .../service/PermissionRoleService.java | 32 +- .../service/PermissionService.java | 37 +- .../persistence/service/RegisterService.java | 29 +- .../persistence/service/ReportService.java | 57 +-- .../persistence/service/ResourcesService.java | 25 +- .../service/RoleMemberService.java | 59 +-- .../persistence/service/RolesService.java | 99 +---- .../service/SocialsAssociatesService.java | 24 +- .../service/SocialsProviderService.java | 24 +- .../service/SynchroRelatedService.java | 56 +-- .../service/SynchronizersService.java | 26 +- .../persistence/service/UserInfoService.java | 375 ++-------------- .../AccessServiceImpl.java} | 16 +- .../service/impl/AccountsServiceImpl.java | 255 +++++++++++ .../impl/AccountsStrategyServiceImpl.java | 99 +++++ .../service/impl/AppsAdaptersServiceImpl.java | 28 ++ .../impl/AppsCasDetailsServiceImpl.java | 54 +++ .../impl/AppsFormBasedDetailsServiceImpl.java | 52 +++ .../impl/AppsJwtDetailsServiceImpl.java | 53 +++ .../impl/AppsSaml20DetailsServiceImpl.java | 52 +++ .../service/impl/AppsServiceImpl.java | 79 ++++ .../AppsTokenBasedDetailsServiceImpl.java | 52 +++ .../impl/CnfEmailSendersServiceImpl.java | 30 ++ .../impl/CnfLdapContextServiceImpl.java | 29 ++ .../impl/CnfPasswordPolicyServiceImpl.java | 28 ++ .../impl/CnfSmsProviderServiceImpl.java | 29 ++ .../service/impl/ConnectorsServiceImpl.java | 28 ++ .../service/impl/FileUploadServiceImpl.java | 28 ++ .../service/impl/GroupMemberServiceImpl.java | 77 ++++ .../service/impl/GroupsServiceImpl.java | 111 +++++ .../impl/HistoryConnectorServiceImpl.java | 28 ++ .../impl/HistoryLoginAppsServiceImpl.java | 54 +++ .../service/impl/HistoryLoginServiceImpl.java | 32 ++ .../impl/HistorySynchronizerServiceImpl.java | 28 ++ .../impl/HistorySystemLogsServiceImpl.java | 199 +++++++++ .../service/impl/InstitutionsServiceImpl.java | 33 ++ .../impl/OrganizationsCastServiceImpl.java | 37 ++ .../impl/OrganizationsServiceImpl.java | 176 ++++++++ .../impl/PermissionRoleServiceImpl.java | 47 ++ .../service/impl/PermissionServiceImpl.java | 45 ++ .../service/impl/RegisterServiceImpl.java | 36 ++ .../service/impl/ReportServiceImpl.java | 64 +++ .../service/impl/ResourcesServiceImpl.java | 33 ++ .../service/impl/RoleMemberServiceImpl.java | 78 ++++ .../service/impl/RolesServiceImpl.java | 115 +++++ .../impl/SocialsAssociatesServiceImpl.java | 36 ++ .../impl/SocialsProviderServiceImpl.java | 31 ++ .../impl/SynchroRelatedServiceImpl.java | 65 +++ .../impl/SynchronizersServiceImpl.java | 31 ++ .../service/impl/UserInfoServiceImpl.java | 420 ++++++++++++++++++ .../service/SyncJobConfigFieldService.java | 36 +- .../impl/SyncJobConfigFieldServiceImpl.java | 37 ++ setEnvVars.bat | 2 +- 81 files changed, 2936 insertions(+), 2173 deletions(-) rename maxkey-lib/{mybatis-jpa-extra-3.3.1.jar => mybatis-jpa-extra-3.3.2.jar} (77%) rename maxkey-lib/{mybatis-jpa-extra-spring-boot-starter-3.3.1.jar => mybatis-jpa-extra-spring-boot-starter-3.3.2.jar} (81%) rename maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/{package-info.java => impl/AccessServiceImpl.java} (64%) create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AccountsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AccountsStrategyServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsAdaptersServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsCasDetailsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsFormBasedDetailsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsJwtDetailsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsSaml20DetailsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsTokenBasedDetailsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfEmailSendersServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfLdapContextServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfPasswordPolicyServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfSmsProviderServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ConnectorsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/FileUploadServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/GroupMemberServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/GroupsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryConnectorServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryLoginAppsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryLoginServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistorySynchronizerServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistorySystemLogsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/InstitutionsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/OrganizationsCastServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/OrganizationsServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/PermissionRoleServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/PermissionServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RegisterServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ReportServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ResourcesServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RoleMemberServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RolesServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SocialsAssociatesServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SocialsProviderServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SynchroRelatedServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SynchronizersServiceImpl.java create mode 100644 maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/UserInfoServiceImpl.java create mode 100644 maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/dromara/maxkey/synchronizer/service/impl/SyncJobConfigFieldServiceImpl.java diff --git a/maxkey-lib/mybatis-jpa-extra-3.3.1.jar b/maxkey-lib/mybatis-jpa-extra-3.3.2.jar similarity index 77% rename from maxkey-lib/mybatis-jpa-extra-3.3.1.jar rename to maxkey-lib/mybatis-jpa-extra-3.3.2.jar index 4c72c031593a9258a2d619aee16ff73bba110a9a..b91b50fe5269fb0c8b9855fb7145fae45ce9bde7 100644 GIT binary patch delta 25243 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 K4+&s#VEzXP$Y9w3 delta 23538 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 II@AdN1L|#-2><{9 diff --git a/maxkey-lib/mybatis-jpa-extra-spring-boot-starter-3.3.1.jar b/maxkey-lib/mybatis-jpa-extra-spring-boot-starter-3.3.2.jar similarity index 81% rename from maxkey-lib/mybatis-jpa-extra-spring-boot-starter-3.3.1.jar rename to maxkey-lib/mybatis-jpa-extra-spring-boot-starter-3.3.2.jar index 88e68e4cc61fcb09b5bee1aecd6545eebbc2b813..ffb4128adf60d8d77491a4d761415c649fee9ce2 100644 GIT binary patch delta 1899 zcmZWq2{=@17(Qo)lI2=^Yz@sMFP?uR!kCt zBp~SW?g*ZY7FGl%@z{_+7O##7;Pn;}AnV|8fCcbcY%u!#2-XBBfY$(2#~1>1#u$UV zM2r=-qHwUP5#xf9K?`^lmi5%PLl8tqR)|M&b1nM`1`Y)GHFi72r`$IiDvzlZnb=Ik z9T|PDcrq(5es*wv=9Uk0JwDN&p4T=R(7fk>Q)PbD*=!5>{1Y*6*!Gtxj&khtogT8q z)B9(4c@AyFJwJB)!zXW;%uUd#KVZD=VY_l{hrfU*U9;!yj!<<1f72-ODh2l>^z20Q z8DILTCH^e)Qc9xZiBlaauaAvfc{XbC6hArqIemwOU$f?FQnOt6`=r(o|7};Jyq+#p zaSy}7`N33Qjz>@UR0HL?XmU#E-#_~cIB@}4rLs#8Z2UpRCj-|%`)RAq+!LJm7Bv!mo) z+<~aV{9vB!m~Z*EoOheYVm97Lb9F7;nywo9d1gDTFuV1^XOfSp#gK? zZcLmDXK0X96|knJ7(pKXbUg*k$z=fBdUeW`k2fHM%%|oGJsV;p>MehY_M* zR14zTru*tvbV4@-G5201W%Z;E5qxuwnuw2SzrHi6 z;u-dV{DiS;@=We1Ki70Y#w5f%L`X5!75dcbjaMh{XK<}DCkOjYpXki5jqYJ_ThAJL zxEL+_~*dbB;nh<0v=RQ7b>T;_no^|abid=Ff>M`vs`a!QC$Ypf#%q|)|eG-ORDUPtyeQ! zC}?l(x}aKDV)VMN;_q`Zi2;$9W|fkyhH$T>&3%ZC3*D;I^3o+_g(JNgX#&OXX9aZx zq<2|?$RVnJlYA%*0%v7o7zBwb_FtHLTI;ZY`MhScA_z!UL=5l~mi0MtdC`&MmvW8| z$U%_61cICpo(d7U6G5nAkVfTzV5f(sq$oh5sV#u8^UIU~L1(BfEb=)-k!AvLE6o;U zX3#7Fw$XM0)C%JOEDEy%*7h>&i^VOcn}cUpx-CE+odoiF=w#6rk=2ZV9~=*1B&__& zCQvW@c3q5jTY})ly^u_%EGTiFsSZCt8kl~dutvB#W}hUIA*qiXVn~BZUHaAy{is|I zh9K*2Wl+2rZ>x;pNd$zWjMH-?!x$y(cbB^Ha=Ukv6a=Z^ASh^&Xuk?7(nW+?3dlnh z;!i@=Sc95N7zk<;hoG=U!s}XJg(PHQANY8P6iXd5x#lY^j|@a8fE`DkUU*!O?$!ad zNsmP}OszojO_l}deGb(JS_8^9Vgne!p$K)17zw4w|F0rIDMt^KGBz>@Vg#_+KQ`qt*fMWR38_lu>9~t}WqCU#ip+XgUZ4F<&)4kYd>Pf5tuks}Mk*X; z`u5+FPG?q~8@uLgIW#Y=@55`#&V<#4Y0k_M;~l&_>O5)KVlz>n`^g@oRF8@izl2|@ z=;s9Zndq$r87BHAP@0M28i-+H$=t@;4S0ChA-_)O}fZ z%F|>@#0?KfI@?23v`!0coid`>-9VT_C=Q1pR_X}C0Y-QZe|Jo@EMQ|?7ey;wUOJuS zGw#rubT@auG?y;Oe5jNm*uB$W8C%pSl)W=<uk1NE}OZ6{){*WV^R%lh{5jofdfZ4X1o|aQnuFvdR!5C*VP*R$>F&!e^KSRa*|4w0947+JaeIXNaTE$_EArWdK~5qPaNwR^9&=ruQgYQ+H`%h6G$2GdgP z>h0wgUoOE~656bP`{d5n6RK@XDC_P!v_$oTf0>;&U+9^;eq#E7-MFd5WorkauUIJ_q}4oqgY|r3>L*TrSSEW)+L zW4!RC@{>f#69;e~!TAG;F%PnXgIH^u?q-TE2s(H7_I@R6)B7LVPG7_BnX(smwwl#{ z>(T6~e|IX2r}HJN}oNEE?oY^Vj#YZ&u^IcW7n6)51T^@dpQ*Ezph@(|I#=` z)y~;+TFMcZrf+&Q(t6~Cg_G5A!TGL%k=Q#~Uz16rW>Lh6w{E`!V#Z^wA@>-5L_thu zZCB^2-mClT1kG=n7d|~_Hq3vWkFV{xk|T?25!R+uZ_^9s56boA#J7U0}*Ie^=B1ZHqspPJg1}(~9ya|7^ezE0^JuQ(u9GOMg4G#=iEbH`LMrtul$q~$1(gKwP^Cm6 z5f!O~wz<&o(6Ps;LyZ{n=G>ZtAbJJ}5(b1=GBAo`R(#NHn*;NjO(-~MOqs9KgathD zm-cE5f;gjB&kq(9(`SPku5HB`$0iIEpg4LF9u}!H8S2pR^D`tU43HGu3>{9JbCjXc zzTF9=aJvlPb+E}9D7E6ugi^M!f|gD zTd^2m5*_lB80JN182wK`P?`MklnT6OfkpTra5#ntDT-qBG50`q%w|Yz5UY>n5Z{g-kuR^qR+LxeeME`VSfuO9c!aAk;MmX*vd|dSS3yxc~GE45B{ - - public AccessService() { - super(AccessMapper.class); - } - - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AccessMapper getMapper() { - return (AccessMapper)super.getMapper(); - } +public interface AccessService extends IJpaService{ } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AccountsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AccountsService.java index 73412eba2..1371a87a1 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AccountsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AccountsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,246 +19,30 @@ package org.dromara.maxkey.persistence.service; import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.dromara.maxkey.constants.ConstsStatus; -import org.dromara.maxkey.crypto.password.PasswordReciprocal; import org.dromara.maxkey.entity.Accounts; import org.dromara.maxkey.entity.AccountsStrategy; -import org.dromara.maxkey.entity.OrganizationsCast; import org.dromara.maxkey.entity.idm.UserInfo; -import org.dromara.maxkey.persistence.mapper.AccountsMapper; -import org.dromara.maxkey.provision.ProvisionAct; -import org.dromara.maxkey.provision.ProvisionService; -import org.dromara.maxkey.provision.ProvisionTopic; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -import net.sourceforge.pinyin4j.PinyinHelper; -import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; -import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; -import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; -import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; -import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; +public interface AccountsService extends IJpaService{ -@Repository -public class AccountsService extends JpaService{ - - @Autowired - ProvisionService provisionService; - - @Autowired - UserInfoService userInfoService; - - @Autowired - AccountsStrategyService accountsStrategyService; - - @Autowired - OrganizationsCastService organizationsCastService; - - public AccountsService() { - super(AccountsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AccountsMapper getMapper() { - return (AccountsMapper)super.getMapper(); - } + public boolean updateStatus(Accounts accounts) ; + + public boolean remove(String id) ; + + public void refreshByStrategy(AccountsStrategy strategy) ; + + public void refreshAllByStrategy() ; + + public List queryUserNotInStrategy(AccountsStrategy strategy); + + public long deleteByStrategy(AccountsStrategy strategy) ; - @Override - public boolean insert(Accounts account) { - if (super.insert(account)) { - if(provisionService.getApplicationConfig().isProvisionSupport()) { - UserInfo loadUserInfo = userInfoService.findUserRelated(account.getUserId()); - account.setUserInfo(loadUserInfo); - OrganizationsCast cast = new OrganizationsCast(); - cast.setProvider(account.getAppId()); - cast.setOrgId(loadUserInfo.getDepartmentId()); - account.setOrgCast(organizationsCastService.query(cast)); - provisionService.send( - ProvisionTopic.ACCOUNT_TOPIC, - account, - ProvisionAct.CREATE); - } - - return true; - } - return false; - } - - @Override - public boolean update(Accounts account) { - if (super.update(account)) { - if(provisionService.getApplicationConfig().isProvisionSupport()) { - UserInfo loadUserInfo = userInfoService.findUserRelated(account.getUserId()); - account.setUserInfo(loadUserInfo); - OrganizationsCast cast = new OrganizationsCast(); - cast.setProvider(account.getAppId()); - cast.setOrgId(loadUserInfo.getDepartmentId()); - account.setOrgCast(organizationsCastService.query(cast)); - provisionService.send( - ProvisionTopic.ACCOUNT_TOPIC, - account, - ProvisionAct.UPDATE); - } - - return true; - } - return false; - } + public List queryByAppIdAndDate(Accounts account) ; - public boolean updateStatus(Accounts accounts) { - return this.getMapper().updateStatus(accounts) > 0; - } + public List queryByAppIdAndAccount(String appId,String relatedUsername); - public boolean remove(String id) { - Accounts account = this.get(id); - if (super.delete(id)) { - UserInfo loadUserInfo = null; - if(provisionService.getApplicationConfig().isProvisionSupport()) { - loadUserInfo = userInfoService.findUserRelated(account.getUserId()); - account.setUserInfo(loadUserInfo); - provisionService.send( - ProvisionTopic.ACCOUNT_TOPIC, - account, - ProvisionAct.DELETE); - } - - return true; - } - return false; - } - - public void refreshByStrategy(AccountsStrategy strategy) { - if(StringUtils.isNotBlank(strategy.getOrgIdsList())) { - strategy.setOrgIdsList("'"+strategy.getOrgIdsList().replace(",", "','")+"'"); - } - List userList = queryUserNotInStrategy(strategy); - for(UserInfo user : userList) { - Accounts account = new Accounts(); - account.setAppId(strategy.getAppId()); - account.setAppName(strategy.getAppName()); - - account.setUserId(user.getId()); - account.setUsername(user.getUsername()); - account.setDisplayName(user.getDisplayName()); - account.setRelatedUsername(generateAccount(user,strategy)); - account.setRelatedPassword(PasswordReciprocal.getInstance().encode(userInfoService.randomPassword())); - - account.setInstId(strategy.getInstId()); - account.setCreateType("automatic"); - account.setStatus(ConstsStatus.ACTIVE); - account.setStrategyId(strategy.getId()); - - insert(account); - } - deleteByStrategy(strategy); - } - public void refreshAllByStrategy() { - AccountsStrategy queryStrategy = new AccountsStrategy(); - queryStrategy.setCreateType("automatic"); - for( AccountsStrategy strategy : accountsStrategyService.query(queryStrategy)) { - refreshByStrategy(strategy); - } - } - - - public List queryUserNotInStrategy(AccountsStrategy strategy){ - return getMapper().queryUserNotInStrategy(strategy); - } - - public long deleteByStrategy(AccountsStrategy strategy) { - return getMapper().deleteByStrategy(strategy); - } - - - public List queryByAppIdAndDate(Accounts account) { - return getMapper().queryByAppIdAndDate(account); - } - - public List queryByAppIdAndAccount(String appId,String relatedUsername){ - return getMapper().queryByAppIdAndAccount(appId,relatedUsername); - } - - - public String generateAccount(UserInfo userInfo,AccountsStrategy accountsStrategy) { - String shortAccount = generateAccount(userInfo,accountsStrategy,true); - String account = generateAccount(userInfo,accountsStrategy,false); - String accountResult = shortAccount; - List accountsList =getMapper().queryByAppIdAndAccount(accountsStrategy.getAppId(),shortAccount +accountsStrategy.getSuffixes()); - if(!accountsList.isEmpty()) { - if(accountsStrategy.getMapping().equalsIgnoreCase("email")) { - accountResult = account; - accountsList =getMapper().queryByAppIdAndAccount(accountsStrategy.getAppId(),account + accountsStrategy.getSuffixes()); - } - if(!accountsList.isEmpty()) { - for(int i =1 ;i < 100 ;i++) { - accountResult = account + i; - accountsList =getMapper().queryByAppIdAndAccount(accountsStrategy.getAppId(),accountResult + accountsStrategy.getSuffixes()); - if(accountsList.isEmpty()) { - break; - } - } - } - } - if(StringUtils.isNotBlank(accountsStrategy.getSuffixes())){ - accountResult = accountResult + accountsStrategy.getSuffixes(); - } - return accountResult; - } - - - private String generateAccount(UserInfo userInfo,AccountsStrategy strategy,boolean isShort) { - String account = ""; - if(strategy.getMapping().equalsIgnoreCase("username")) { - account = userInfo.getUsername(); - }else if(strategy.getMapping().equalsIgnoreCase("mobile")) { - account = userInfo.getMobile(); - }else if(strategy.getMapping().equalsIgnoreCase("email")) { - try { - if(isShort) { - account = getPinYinShortName(userInfo.getDisplayName()); - }else { - account = getPinYinName(userInfo.getDisplayName()); - } - }catch(Exception e) { - e.printStackTrace(); - } - }else if(strategy.getMapping().equalsIgnoreCase("employeeNumber")) { - account = userInfo.getEmployeeNumber(); - }else if(strategy.getMapping().equalsIgnoreCase("windowsAccount")) { - account = userInfo.getWindowsAccount(); - }else if(strategy.getMapping().equalsIgnoreCase("idCardNo")) { - account = userInfo.getIdCardNo(); - }else { - account = userInfo.getUsername(); - } - - return account; - } - - public static String getPinYinName(String name) throws BadHanyuPinyinOutputFormatCombination { - HanyuPinyinOutputFormat pinyinFormat = new HanyuPinyinOutputFormat(); - pinyinFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); - pinyinFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); - pinyinFormat.setVCharType(HanyuPinyinVCharType.WITH_V); - return PinyinHelper.toHanYuPinyinString(name, pinyinFormat, "",false); - } - - public static String getPinYinShortName(String name) throws BadHanyuPinyinOutputFormatCombination { - char[] strs = name.toCharArray(); - String pinyinName = ""; - for(int i=0;i implements Serializable { - /** - * - */ - private static final long serialVersionUID = -921086134545225302L; - - static final Logger _logger = LoggerFactory.getLogger(AccountsStrategyService.class); - /* - @Autowired - @Qualifier("groupMemberService") - GroupMemberService accountsStrategyService; - */ - public AccountsStrategyService() { - super(AccountsStrategyMapper.class); - } +public interface AccountsStrategyService extends IJpaService { - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AccountsStrategyMapper getMapper() { - return (AccountsStrategyMapper)super.getMapper(); - } + public List queryDynamicGroups(Roles groups); - - public List queryDynamicGroups(Roles groups){ - return this.getMapper().queryDynamicGroups(groups); - } - - public boolean deleteById(String groupId) { - this.delete(groupId); - //groupMemberService.deleteByGroupId(groupId); - return true; - } - /* - public void refreshDynamicGroups(Groups dynamicGroup){ - if(dynamicGroup.getDynamic().equals("1")) { - boolean isDynamicTimeSupport = false; - boolean isBetweenEffectiveTime = false; - if(dynamicGroup.getResumeTime()!=null&&dynamicGroup.getResumeTime().equals("") - &&dynamicGroup.getSuspendTime()!=null&&dynamicGroup.getSuspendTime().equals("")) { - LocalTime currentTime = LocalDateTime.now().toLocalTime(); - LocalTime resumeTime = LocalTime.parse(dynamicGroup.getResumeTime()); - LocalTime suspendTime = LocalTime.parse(dynamicGroup.getSuspendTime()); - - _logger.info("currentTime: " + currentTime - + " , resumeTime : " + resumeTime - + " , suspendTime: " + suspendTime); - isDynamicTimeSupport = true; - - if(resumeTime.isBefore(currentTime) && currentTime.isBefore(suspendTime)) { - isBetweenEffectiveTime = true; - } - - } - - if(dynamicGroup.getOrgIdsList()!=null && !dynamicGroup.getOrgIdsList().equals("")) { - dynamicGroup.setOrgIdsList("'"+dynamicGroup.getOrgIdsList().replace(",", "','")+"'"); - } - String filters = dynamicGroup.getFilters(); - if(StringUtils.filtersSQLInjection(filters.toLowerCase())) { - _logger.info("filters include SQL Injection Attack Risk."); - return; - } - - filters = filters.replace("&", " AND "); - filters = filters.replace("|", " OR "); - - dynamicGroup.setFilters(filters); - - if(isDynamicTimeSupport) { - if(isBetweenEffectiveTime) { - groupMemberService.deleteDynamicGroupMember(dynamicGroup); - groupMemberService.addDynamicGroupMember(dynamicGroup); - }else { - groupMemberService.deleteDynamicGroupMember(dynamicGroup); - } - }else{ - groupMemberService.deleteDynamicGroupMember(dynamicGroup); - groupMemberService.addDynamicGroupMember(dynamicGroup); - } - } - }*/ - - - - + public boolean deleteById(String groupId) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsAdaptersService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsAdaptersService.java index 28145ba5b..7bb06daf4 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsAdaptersService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsAdaptersService.java @@ -1,5 +1,5 @@ /* - * Copyright [2021] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,22 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.apps.AppsAdapters; -import org.dromara.maxkey.persistence.mapper.AppsAdaptersMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class AppsAdaptersService extends JpaService{ +public interface AppsAdaptersService extends IJpaService{ - public AppsAdaptersService() { - super(AppsAdaptersMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AppsAdaptersMapper getMapper() { - return (AppsAdaptersMapper)super.getMapper(); - } } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsCasDetailsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsCasDetailsService.java index 57f5cf6f9..514f173b6 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsCasDetailsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsCasDetailsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,50 +17,10 @@ package org.dromara.maxkey.persistence.service; -import java.util.concurrent.TimeUnit; - import org.dromara.maxkey.entity.apps.AppsCasDetails; -import org.dromara.maxkey.persistence.mapper.AppsCasDetailsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +public interface AppsCasDetailsService extends IJpaService{ -@Repository -public class AppsCasDetailsService extends JpaService{ - - protected static final Cache detailsCache = - Caffeine.newBuilder() - .expireAfterWrite(30, TimeUnit.MINUTES) - .maximumSize(200000) - .build(); - - public AppsCasDetailsService() { - super(AppsCasDetailsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AppsCasDetailsMapper getMapper() { - return (AppsCasDetailsMapper)super.getMapper(); - } - - public AppsCasDetails getAppDetails(String id , boolean cached) { - AppsCasDetails details = null; - if(cached) { - details = detailsCache.getIfPresent(id); - if(details == null) { - details = getMapper().getAppDetails(id); - if(details != null) { - detailsCache.put(id, details); - } - } - }else { - details = getMapper().getAppDetails(id); - } - return details; - } + public AppsCasDetails getAppDetails(String id , boolean cached) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsFormBasedDetailsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsFormBasedDetailsService.java index 53636b2f1..0bcb8da5b 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsFormBasedDetailsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsFormBasedDetailsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,48 +17,10 @@ package org.dromara.maxkey.persistence.service; -import java.util.concurrent.TimeUnit; - import org.dromara.maxkey.entity.apps.AppsFormBasedDetails; -import org.dromara.maxkey.persistence.mapper.AppsFormBasedDetailsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +public interface AppsFormBasedDetailsService extends IJpaService{ -@Repository -public class AppsFormBasedDetailsService extends JpaService{ - - protected static final Cache detailsCache = - Caffeine.newBuilder() - .expireAfterWrite(30, TimeUnit.MINUTES) - .maximumSize(200000) - .build(); - - public AppsFormBasedDetailsService() { - super(AppsFormBasedDetailsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AppsFormBasedDetailsMapper getMapper() { - return (AppsFormBasedDetailsMapper)super.getMapper(); - } - - public AppsFormBasedDetails getAppDetails(String id,boolean cached) { - AppsFormBasedDetails details = null; - if(cached) { - details = detailsCache.getIfPresent(id); - if(details == null) { - details = getMapper().getAppDetails(id); - detailsCache.put(id, details); - } - }else { - details = getMapper().getAppDetails(id); - } - return details; - } + public AppsFormBasedDetails getAppDetails(String id,boolean cached) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsJwtDetailsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsJwtDetailsService.java index f6a511c72..c0c76d97c 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsJwtDetailsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsJwtDetailsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,48 +17,10 @@ package org.dromara.maxkey.persistence.service; -import java.util.concurrent.TimeUnit; - import org.dromara.maxkey.entity.apps.AppsJwtDetails; -import org.dromara.maxkey.persistence.mapper.AppsJwtDetailsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +public interface AppsJwtDetailsService extends IJpaService{ -@Repository -public class AppsJwtDetailsService extends JpaService{ - - protected static final Cache detailsCache = - Caffeine.newBuilder() - .expireAfterWrite(30, TimeUnit.MINUTES) - .maximumSize(200000) - .build(); - - public AppsJwtDetailsService() { - super(AppsJwtDetailsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AppsJwtDetailsMapper getMapper() { - return (AppsJwtDetailsMapper)super.getMapper(); - } - - public AppsJwtDetails getAppDetails(String id , boolean cached) { - AppsJwtDetails details = null; - if(cached) { - details = detailsCache.getIfPresent(id); - if(details == null) { - details = getMapper().getAppDetails(id); - detailsCache.put(id, details); - } - }else { - details = getMapper().getAppDetails(id); - } - return details; - } + public AppsJwtDetails getAppDetails(String id , boolean cached) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsSaml20DetailsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsSaml20DetailsService.java index 9691e0b32..282368e05 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsSaml20DetailsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsSaml20DetailsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,48 +17,10 @@ package org.dromara.maxkey.persistence.service; -import java.util.concurrent.TimeUnit; - import org.dromara.maxkey.entity.apps.AppsSAML20Details; -import org.dromara.maxkey.persistence.mapper.AppsSaml20DetailsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +public interface AppsSaml20DetailsService extends IJpaService{ -@Repository -public class AppsSaml20DetailsService extends JpaService{ - - protected static final Cache detailsCache = - Caffeine.newBuilder() - .expireAfterWrite(30, TimeUnit.MINUTES) - .maximumSize(200000) - .build(); - - public AppsSaml20DetailsService() { - super(AppsSaml20DetailsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AppsSaml20DetailsMapper getMapper() { - return (AppsSaml20DetailsMapper)super.getMapper(); - } - - public AppsSAML20Details getAppDetails(String id , boolean cached){ - AppsSAML20Details details = null; - if(cached) { - details = detailsCache.getIfPresent(id); - if(details == null) { - details = getMapper().getAppDetails(id); - detailsCache.put(id, details); - } - }else { - details = getMapper().getAppDetails(id); - } - return details; - } + public AppsSAML20Details getAppDetails(String id , boolean cached); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsService.java index af3f31a05..afcfde146 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,74 +18,23 @@ package org.dromara.maxkey.persistence.service; import java.util.List; -import java.util.concurrent.TimeUnit; - import org.dromara.maxkey.entity.apps.Apps; import org.dromara.maxkey.entity.apps.UserApps; -import org.dromara.maxkey.persistence.mapper.AppsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; - -@Repository -public class AppsService extends JpaService{ - //maxkey-mgt - public static final String MGT_APP_ID = "622076759805923328"; +public interface AppsService extends IJpaService{ - public static final String DETAIL_SUFFIX = "_detail"; + public boolean insertApp(Apps app) ; - protected static final Cache detailsCacheStore = - Caffeine.newBuilder() - .expireAfterWrite(30, TimeUnit.MINUTES) - .build(); + public boolean updateApp(Apps app) ; - public AppsService() { - super(AppsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AppsMapper getMapper() { - return (AppsMapper)super.getMapper(); - } + public boolean updateExtendAttr(Apps app) ; - public boolean insertApp(Apps app) { - return ((AppsMapper)super.getMapper()).insertApp(app)>0; - }; - public boolean updateApp(Apps app) { - return ((AppsMapper)super.getMapper()).updateApp(app)>0; - }; - - public boolean updateExtendAttr(Apps app) { - return ((AppsMapper)super.getMapper()).updateExtendAttr(app)>0; - } - - public List queryMyApps(UserApps userApplications){ - return getMapper().queryMyApps(userApplications); - } + public List queryMyApps(UserApps userApplications); //cache for running - public void put(String appId, Apps appDetails) { - detailsCacheStore.put(appId + DETAIL_SUFFIX, appDetails); - } + public void put(String appId, Apps appDetails) ; - public Apps get(String appId, boolean cached) { - appId = appId.equalsIgnoreCase("maxkey_mgt") ? MGT_APP_ID : appId; - Apps appDetails = null; - if(cached) { - appDetails = detailsCacheStore.getIfPresent(appId + DETAIL_SUFFIX); - if(appDetails == null) { - appDetails = this.get(appId); - detailsCacheStore.put(appId, appDetails); - } - }else { - appDetails = this.get(appId); - } - return appDetails; - } + public Apps get(String appId, boolean cached); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsTokenBasedDetailsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsTokenBasedDetailsService.java index 74531e772..703632c0d 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsTokenBasedDetailsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/AppsTokenBasedDetailsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,48 +17,10 @@ package org.dromara.maxkey.persistence.service; -import java.util.concurrent.TimeUnit; - import org.dromara.maxkey.entity.apps.AppsTokenBasedDetails; -import org.dromara.maxkey.persistence.mapper.AppsTokenBasedDetailsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +public interface AppsTokenBasedDetailsService extends IJpaService{ -@Repository -public class AppsTokenBasedDetailsService extends JpaService{ - - protected static final Cache detailsCache = - Caffeine.newBuilder() - .expireAfterWrite(30, TimeUnit.MINUTES) - .maximumSize(200000) - .build(); - - public AppsTokenBasedDetailsService() { - super(AppsTokenBasedDetailsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public AppsTokenBasedDetailsMapper getMapper() { - return (AppsTokenBasedDetailsMapper)super.getMapper(); - } - - public AppsTokenBasedDetails getAppDetails(String id , boolean cached) { - AppsTokenBasedDetails details = null; - if(cached) { - details = detailsCache.getIfPresent(id); - if(details == null) { - details = getMapper().getAppDetails(id); - detailsCache.put(id, details); - } - }else { - details = getMapper().getAppDetails(id); - } - return details; - } + public AppsTokenBasedDetails getAppDetails(String id , boolean cached) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfEmailSendersService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfEmailSendersService.java index 5b958bd79..f0d21048d 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfEmailSendersService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfEmailSendersService.java @@ -1,5 +1,5 @@ /* - * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,25 +19,9 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.cnf.CnfEmailSenders; -import org.dromara.maxkey.persistence.mapper.CnfEmailSendersMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; +public interface CnfEmailSendersService extends IJpaService{ -@Repository -public class CnfEmailSendersService extends JpaService{ - - public CnfEmailSendersService() { - super(CnfEmailSendersMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public CnfEmailSendersMapper getMapper() { - return (CnfEmailSendersMapper)super.getMapper(); - } - } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfLdapContextService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfLdapContextService.java index a2b01701d..7c51e708d 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfLdapContextService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfLdapContextService.java @@ -1,5 +1,5 @@ /* - * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,25 +18,9 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.cnf.CnfLdapContext; -import org.dromara.maxkey.persistence.mapper.CnfLdapContextMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class CnfLdapContextService extends JpaService{ - - public CnfLdapContextService() { - super(CnfLdapContextMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public CnfLdapContextMapper getMapper() { - return (CnfLdapContextMapper)super.getMapper(); - } +public interface CnfLdapContextService extends IJpaService{ - } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfPasswordPolicyService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfPasswordPolicyService.java index 120f567ad..756108dce 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfPasswordPolicyService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfPasswordPolicyService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,23 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.cnf.CnfPasswordPolicy; -import org.dromara.maxkey.persistence.mapper.CnfPasswordPolicyMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class CnfPasswordPolicyService extends JpaService{ - - public CnfPasswordPolicyService() { - super(CnfPasswordPolicyMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public CnfPasswordPolicyMapper getMapper() { - return (CnfPasswordPolicyMapper)super.getMapper(); - } +public interface CnfPasswordPolicyService extends IJpaService{ } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfSmsProviderService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfSmsProviderService.java index 5d12b5569..a2fac18f2 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfSmsProviderService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/CnfSmsProviderService.java @@ -18,25 +18,9 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.cnf.CnfSmsProvider; -import org.dromara.maxkey.persistence.mapper.CnfSmsProviderMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class CnfSmsProviderService extends JpaService{ +public interface CnfSmsProviderService extends IJpaService{ - public CnfSmsProviderService() { - super(CnfSmsProviderMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public CnfSmsProviderMapper getMapper() { - return (CnfSmsProviderMapper)super.getMapper(); - } - - } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ConnectorsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ConnectorsService.java index 9551a0db8..be89a0299 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ConnectorsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ConnectorsService.java @@ -18,25 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.Connectors; -import org.dromara.maxkey.persistence.mapper.ConnectorsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class ConnectorsService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(ConnectorsService.class); - - public ConnectorsService() { - super(ConnectorsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public ConnectorsMapper getMapper() { - return (ConnectorsMapper)super.getMapper(); - } +public interface ConnectorsService extends IJpaService{ + } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/FileUploadService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/FileUploadService.java index cb740cc09..535a671ad 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/FileUploadService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/FileUploadService.java @@ -18,22 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.FileUpload; -import org.dromara.maxkey.persistence.mapper.FileUploadMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class FileUploadService extends JpaService{ +public interface FileUploadService extends IJpaService{ - public FileUploadService() { - super(FileUploadMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public FileUploadMapper getMapper() { - return (FileUploadMapper)super.getMapper(); - } } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupMemberService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupMemberService.java index e52b8eb3d..6fd744d64 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupMemberService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupMemberService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,68 +22,19 @@ import java.util.List; import org.dromara.maxkey.entity.idm.GroupMember; import org.dromara.maxkey.entity.idm.Groups; import org.dromara.maxkey.entity.idm.UserInfo; -import org.dromara.maxkey.persistence.mapper.GroupMemberMapper; -import org.dromara.mybatis.jpa.JpaService; +import org.dromara.mybatis.jpa.IJpaService; import org.dromara.mybatis.jpa.entity.JpaPageResults; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; -@Repository -public class GroupMemberService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(GroupMemberService.class); +public interface GroupMemberService extends IJpaService{ + + public int addDynamicMember(Groups dynamicGroup) ; - public GroupMemberService() { - super(GroupMemberMapper.class); - } + public int deleteDynamicMember(Groups dynamicGroup) ; - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public GroupMemberMapper getMapper() { - return (GroupMemberMapper)super.getMapper(); - } + public int deleteByGroupId(String groupId); - public int addDynamicMember(Groups dynamicGroup) { - return getMapper().addDynamicMember(dynamicGroup); - } + public List queryMemberByGroupId(String groupId); - public int deleteDynamicMember(Groups dynamicGroup) { - return getMapper().deleteDynamicMember(dynamicGroup); - } - - public int deleteByGroupId(String groupId) { - return getMapper().deleteByGroupId(groupId); - } - - public List queryMemberByGroupId(String groupId){ - return getMapper().queryMemberByGroupId(groupId); - } - - - public JpaPageResults noMember(GroupMember entity) { - entity.setPageSelectId(entity.generateId()); - entity.setStartRow(calculateStartRow(entity.getPageNumber() ,entity.getPageSize())); - - entity.setPageable(true); - List resultslist = null; - try { - resultslist = getMapper().noMember(entity); - } catch (Exception e) { - _logger.error("queryPageResults Exception " , e); - } - entity.setPageable(false); - Integer totalPage = resultslist.size(); - - Integer totalCount = 0; - if(entity.getPageNumber() == 1 && totalPage < entity.getPageSize()) { - totalCount = totalPage; - }else { - totalCount = parseCount(getMapper().fetchCount(entity)); - } - - return new JpaPageResults(entity.getPageNumber(),entity.getPageSize(),totalPage,totalCount,resultslist); - } + public JpaPageResults noMember(GroupMember entity) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupsService.java index 1a11b1c4b..5bb6ffe62 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupsService.java @@ -17,108 +17,21 @@ package org.dromara.maxkey.persistence.service; -import java.sql.Types; import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.dromara.maxkey.constants.ConstsStatus; -import org.dromara.maxkey.entity.Institutions; import org.dromara.maxkey.entity.idm.Groups; -import org.dromara.maxkey.entity.permissions.Roles; -import org.dromara.maxkey.persistence.mapper.GroupsMapper; -import org.dromara.maxkey.util.StrUtils; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class GroupsService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(GroupsService.class); +public interface GroupsService extends IJpaService{ - @Autowired - GroupMemberService groupMemberService; - - @Autowired - InstitutionsService institutionsService; - - public GroupsService() { - super(GroupsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public GroupsMapper getMapper() { - return (GroupsMapper)super.getMapper(); - } + public List queryDynamicGroups(Groups groups); + public boolean deleteById(String groupId) ; - public List queryDynamicGroups(Groups groups){ - return this.getMapper().queryDynamic(groups); - } + public List queryByUserId(String userId); - public boolean deleteById(String groupId) { - this.delete(groupId); - groupMemberService.deleteByGroupId(groupId); - return true; - } + public void refreshDynamicGroups(Groups dynamicGroup); - public List queryByUserId(String userId){ - return this.getMapper().queryByUserId(userId); - } - - public void refreshDynamicGroups(Groups dynamicGroup){ - if(dynamicGroup.getCategory().equals(Roles.Category.DYNAMIC)) { - - if(StringUtils.isNotBlank(dynamicGroup.getOrgIdsList())) { - String []orgIds = dynamicGroup.getOrgIdsList().split(","); - StringBuffer orgIdFilters = new StringBuffer(); - for(String orgId : orgIds) { - if(StringUtils.isNotBlank(orgId)) { - if(orgIdFilters.length() > 0) { - orgIdFilters.append(","); - } - orgIdFilters.append("'").append(orgId).append("'"); - } - } - if(orgIdFilters.length() > 0) { - dynamicGroup.setOrgIdsList(orgIdFilters.toString()); - } - } - - String filters = dynamicGroup.getFilters(); - if(StringUtils.isNotBlank(filters)) { - if(StrUtils.filtersSQLInjection(filters.toLowerCase())) { - _logger.info("filters include SQL Injection Attack Risk."); - return; - } - //replace & with AND, | with OR - filters = filters.replace("&", " AND ").replace("|", " OR "); - - dynamicGroup.setFilters(filters); - } - - groupMemberService.deleteDynamicMember(dynamicGroup); - groupMemberService.addDynamicMember(dynamicGroup); - - } - } - - public void refreshAllDynamicGroups(){ - List instList = - institutionsService.find("where status = ? ", new Object[]{ConstsStatus.ACTIVE}, new int[]{Types.INTEGER}); - for(Institutions inst : instList) { - Groups group = new Groups(); - group.setInstId(inst.getId()); - List groupsList = queryDynamicGroups(group); - for(Groups g : groupsList) { - _logger.debug("role {}" , g); - refreshDynamicGroups(g); - } - } - } + public void refreshAllDynamicGroups(); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryConnectorService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryConnectorService.java index a7527093e..b0f91cc59 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryConnectorService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryConnectorService.java @@ -18,22 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.history.HistoryConnector; -import org.dromara.maxkey.persistence.mapper.HistoryConnectorMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class HistoryConnectorService extends JpaService{ +public interface HistoryConnectorService extends IJpaService{ - public HistoryConnectorService() { - super(HistoryConnectorMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public HistoryConnectorMapper getMapper() { - return (HistoryConnectorMapper)super.getMapper(); - } } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryLoginAppsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryLoginAppsService.java index 992e62710..ce71e54af 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryLoginAppsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryLoginAppsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,47 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.history.HistoryLoginApps; -import org.dromara.maxkey.persistence.mapper.HistoryLoginAppsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class HistoryLoginAppsService extends JpaService{ +public interface HistoryLoginAppsService extends IJpaService{ - public HistoryLoginAppsService() { - super(HistoryLoginAppsMapper.class); - } - - - @Override - public HistoryLoginAppsMapper getMapper() { - return (HistoryLoginAppsMapper)super.getMapper(); - } - - @Override - public boolean insert(HistoryLoginApps loginAppsHistory){ - //new Thread insert login app history - new Thread(new HistoryLoginAppsRunnable(getMapper(),loginAppsHistory)).start(); - return true; - } - - public class HistoryLoginAppsRunnable implements Runnable{ - - HistoryLoginAppsMapper historyLoginAppsMapper; - - HistoryLoginApps loginAppsHistory; - - public HistoryLoginAppsRunnable(HistoryLoginAppsMapper historyLoginAppsMapper, - HistoryLoginApps loginAppsHistory) { - super(); - this.historyLoginAppsMapper = historyLoginAppsMapper; - this.loginAppsHistory = loginAppsHistory; - } - - @Override - public void run() { - historyLoginAppsMapper.insert(loginAppsHistory); - } - - } } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryLoginService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryLoginService.java index 5d9b2483e..fc1022c4b 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryLoginService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistoryLoginService.java @@ -18,27 +18,10 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.history.HistoryLogin; -import org.dromara.maxkey.persistence.mapper.HistoryLoginMapper; -import org.dromara.mybatis.jpa.JpaService; +import org.dromara.mybatis.jpa.IJpaService; import org.dromara.mybatis.jpa.entity.JpaPageResults; -import org.springframework.stereotype.Repository; -@Repository -public class HistoryLoginService extends JpaService{ +public interface HistoryLoginService extends IJpaService{ - public HistoryLoginService() { - super(HistoryLoginMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public HistoryLoginMapper getMapper() { - return (HistoryLoginMapper)super.getMapper(); - } - - public JpaPageResults queryOnlineSession(HistoryLogin historyLogin) { - return this.fetchPageResults("queryOnlineSession",historyLogin); - } + public JpaPageResults queryOnlineSession(HistoryLogin historyLogin); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistorySynchronizerService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistorySynchronizerService.java index 329f8c8a3..acc1387aa 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistorySynchronizerService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistorySynchronizerService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,22 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.history.HistorySynchronizer; -import org.dromara.maxkey.persistence.mapper.HistorySynchronizerMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class HistorySynchronizerService extends JpaService{ +public interface HistorySynchronizerService extends IJpaService{ - public HistorySynchronizerService() { - super(HistorySynchronizerMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public HistorySynchronizerMapper getMapper() { - return (HistorySynchronizerMapper)super.getMapper(); - } } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistorySystemLogsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistorySystemLogsService.java index fcc574352..77c5cab2b 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistorySystemLogsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/HistorySystemLogsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,193 +17,14 @@ package org.dromara.maxkey.persistence.service; -import org.dromara.maxkey.entity.Accounts; -import org.dromara.maxkey.entity.ChangePassword; - -import java.util.Date; - -import org.dromara.maxkey.entity.Access; -import org.dromara.maxkey.entity.SocialsProvider; -import org.dromara.maxkey.entity.Synchronizers; import org.dromara.maxkey.entity.history.HistorySystemLogs; -import org.dromara.maxkey.entity.idm.Organizations; import org.dromara.maxkey.entity.idm.UserInfo; -import org.dromara.maxkey.entity.permissions.Permission; -import org.dromara.maxkey.entity.permissions.Resources; -import org.dromara.maxkey.entity.permissions.RoleMember; -import org.dromara.maxkey.entity.permissions.Roles; -import org.dromara.maxkey.persistence.mapper.HistorySystemLogsMapper; -import org.dromara.maxkey.util.JsonUtils; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class HistorySystemLogsService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(HistorySystemLogsService.class); +public interface HistorySystemLogsService extends IJpaService{ - public HistorySystemLogsService() { - super(HistorySystemLogsMapper.class); - - } - - @Override - public HistorySystemLogsMapper getMapper() { - return (HistorySystemLogsMapper)super.getMapper(); - } + public void insert(String topic,Object entity,String action,String result,UserInfo operator) ; - public void insert(String topic,Object entity,String action,String result,UserInfo operator) { - String message = ""; - if(entity != null) { - if(entity instanceof UserInfo userInfo) { - message = buildMsg(userInfo); - }else if(entity instanceof Organizations organization) { - message = buildMsg(organization); - }else if(entity instanceof ChangePassword changePassword) { - message = buildMsg(changePassword); - }else if(entity instanceof Accounts account) { - message = buildMsg(account); - }else if(entity instanceof Roles role) { - message = buildMsg(role); - }else if(entity instanceof RoleMember roleMember) { - message = buildMsg(roleMember); - }else if(entity instanceof Access access) { - message = buildMsg(access); - }else if(entity instanceof Resources resource) { - message = buildMsg(resource); - }else if(entity instanceof Synchronizers synchronizer) { - message = buildMsg(synchronizer); - }else if(entity instanceof SocialsProvider socialsProvider) { - message = buildMsg(socialsProvider); - }else if(entity instanceof Permission permission) { - message = buildMsg(permission); - }else if(entity instanceof String) { - message = entity.toString(); - } - - } - - insert(topic,message,action,result,operator, entity); - } - - public void insert(String topic,String message,String action,String result,UserInfo operator,Object entity) { - HistorySystemLogs systemLog = new HistorySystemLogs(); - systemLog.setId(systemLog.generateId()); - systemLog.setTopic(topic); - systemLog.setMessage(message); - systemLog.setMessageAction(action); - systemLog.setMessageResult(result); - systemLog.setUserId(operator.getId()); - systemLog.setUsername(operator.getUsername()); - systemLog.setDisplayName(operator.getDisplayName()); - systemLog.setInstId(operator.getInstId()); - systemLog.setJsonCotent(JsonUtils.gsonToString(entity)); - systemLog.setExecuteTime(new Date()); - _logger.trace("System Log {}" ,systemLog); - getMapper().insert(systemLog); - } - - public String buildMsg(UserInfo userInfo) { - return new StringBuilder() - .append(userInfo.getDisplayName()) - .append("[") - .append(userInfo.getUsername()) - .append("]") - .toString(); - } - - public String buildMsg(Organizations org) { - return new StringBuilder() - .append(org.getOrgName()) - .append("[") - .append(org.getOrgCode()) - .append("]") - .toString(); - } - - public String buildMsg(Accounts account) { - return new StringBuilder() - .append(account.getRelatedUsername()) - .append("[") - .append(account.getDisplayName()).append(",") - .append(account.getUsername()).append(",") - .append(account.getAppName()) - .append("]") - .toString(); - } - - public String buildMsg(ChangePassword changePassword) { - return new StringBuilder() - .append(changePassword.getDisplayName()) - .append("[") - .append(changePassword.getUsername()) - .append("]") - .toString(); - } - - public String buildMsg(Roles g) { - return new StringBuilder() - .append(g.getRoleName()) - .toString(); - } - - public String buildMsg(RoleMember rm) { - return new StringBuilder() - .append(rm.getRoleName()) - .append("[") - .append(rm.getUsername()).append(",") - .append(rm.getDisplayName()) - .append("]") - .toString(); - } - - public String buildMsg(Access permission) { - return new StringBuilder() - .append(permission.getGroupName()) - .append("[") - .append(permission.getAppName()) - .append("]") - .toString(); - } - - public String buildMsg(Permission privilege) { - return new StringBuilder() - .append(privilege.getGroupId()) - .append("[") - .append(privilege.getResourceId()) - .append("]") - .toString(); - } - - - public String buildMsg(Resources r) { - return new StringBuilder() - .append(r.getResourceName()) - .append("[") - .append(r.getResourceType()) - .append("]") - .toString(); - } - - - public String buildMsg(Synchronizers s) { - return new StringBuilder() - .append(s.getName()) - .append("[") - .append(s.getSourceType()).append(",") - .append(s.getScheduler()).append(",") - .append("]") - .toString(); - } - - public String buildMsg(SocialsProvider s) { - return new StringBuilder() - .append(s.getProviderName()) - .append("[") - .append(s.getProvider()) - .append("]") - .toString(); - } + public void insert(String topic,String message,String action,String result,UserInfo operator,Object entity) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/InstitutionsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/InstitutionsService.java index d8d3b0a33..57b098af2 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/InstitutionsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/InstitutionsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,28 +18,10 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.Institutions; -import org.dromara.maxkey.persistence.mapper.InstitutionsMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; +public interface InstitutionsService extends IJpaService{ -@Repository -public class InstitutionsService extends JpaService{ - - public InstitutionsService() { - super(InstitutionsMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public InstitutionsMapper getMapper() { - return (InstitutionsMapper)super.getMapper(); - } - - public Institutions findByDomain(String domain) { - return getMapper().findByDomain(domain); - } + public Institutions findByDomain(String domain) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/OrganizationsCastService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/OrganizationsCastService.java index 3d854b9bc..09d1bdacd 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/OrganizationsCastService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/OrganizationsCastService.java @@ -18,33 +18,10 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.OrganizationsCast; -import org.dromara.maxkey.persistence.mapper.OrganizationsCastMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; +public interface OrganizationsCastService extends IJpaService{ -@Repository -public class OrganizationsCastService extends JpaService{ - - static final Logger _logger = LoggerFactory.getLogger(OrganizationsCastService.class); - - - public OrganizationsCastService() { - super(OrganizationsCastMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public OrganizationsCastMapper getMapper() { - return (OrganizationsCastMapper)super.getMapper(); - } - - public boolean updateCast(OrganizationsCast organizationsCast) { - return getMapper().updateCast(organizationsCast) > 0; - } + public boolean updateCast(OrganizationsCast organizationsCast) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/OrganizationsService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/OrganizationsService.java index 063df3c27..c8c85c60b 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/OrganizationsService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/OrganizationsService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,172 +17,20 @@ package org.dromara.maxkey.persistence.service; -import java.sql.Types; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellType; import org.dromara.maxkey.entity.idm.Organizations; -import org.dromara.maxkey.persistence.mapper.OrganizationsMapper; -import org.dromara.maxkey.provision.ProvisionAct; -import org.dromara.maxkey.provision.ProvisionService; -import org.dromara.maxkey.provision.ProvisionTopic; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class OrganizationsService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(OrganizationsService.class); - - @Autowired - ProvisionService provisionService; - - public OrganizationsService() { - super(OrganizationsMapper.class); - } +public interface OrganizationsService extends IJpaService{ - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public OrganizationsMapper getMapper() { - return (OrganizationsMapper)super.getMapper(); - } - - @Override - public boolean insert(Organizations organization) { - if(super.insert(organization)){ - provisionService.send( - ProvisionTopic.ORG_TOPIC, organization, ProvisionAct.CREATE); - return true; - } - return false; - } + public void saveOrUpdate(Organizations organization) ; - @Override - public boolean update(Organizations organization) { - if(super.update(organization)){ - provisionService.send( - ProvisionTopic.ORG_TOPIC, organization, ProvisionAct.UPDATE); - return true; - } - return false; - } - - public void saveOrUpdate(Organizations organization) { - Organizations loadOrg =findOne(" id = ? and instid = ?", - new Object[] { organization.getId(), organization.getInstId() }, - new int[] { Types.VARCHAR, Types.VARCHAR }); - if( loadOrg == null) { - insert(organization); - }else { - organization.setId(organization.getId()); - update(organization); - } - } - public List queryOrgs(Organizations organization){ - return getMapper().queryOrgs(organization); - } + public List queryOrgs(Organizations organization); - public boolean delete(Organizations organization) { - if(super.delete(organization.getId())){ - provisionService.send( - ProvisionTopic.ORG_TOPIC, organization, ProvisionAct.DELETE); - return true; - } - return false; - } + public boolean delete(Organizations organization) ; + public void reorgNamePath(String instId) ; - public void reorgNamePath(String instId) { - _logger.debug("instId {}", instId); - if (StringUtils.isBlank(instId)) { - instId = "1"; - } - - HashMap reorgOrgMap = new HashMap<>(); - List orgList = find(" where instid ='" + instId + "'"); - List originOrgList = new ArrayList<>(); - Organizations rootOrg = null; - for (Organizations org : orgList) { - reorgOrgMap.put(org.getId(), org); - if (isRootOrg(org)) { - rootOrg = org; - } - Organizations cloneOrg = new Organizations(); - BeanUtils.copyProperties(org, cloneOrg); - originOrgList.add(cloneOrg); - } - try { - reorg(reorgOrgMap, orgList, rootOrg); - _logger.debug("reorged ."); - long reorgCount = 0; - for (Organizations originOrg : originOrgList) { - Organizations reorgOrg = reorgOrgMap.get(originOrg.getId()); - _logger.trace("reorged Organization {}", reorgOrg); - if (originOrg.getNamePath() == null || !originOrg.getNamePath().equals(reorgOrg.getNamePath())) { - _logger.debug("update reorgCount {} , Organization {}", ++reorgCount, reorgOrg); - getMapper().updateNamePath(reorgOrg); - } - } - _logger.debug("reorg finished ."); - } catch (Exception e) { - _logger.error("reorgNamePath Exception ", e); - } - } - - boolean isRootOrg(Organizations rootOrg) { - if (rootOrg.getParentId() == null || rootOrg.getParentId().equalsIgnoreCase("-1") - || rootOrg.getParentId().equalsIgnoreCase(rootOrg.getId()) - || rootOrg.getParentId().equalsIgnoreCase(rootOrg.getInstId())) { - return true; - } - return false; - } - - void reorg(HashMap orgMap, List orgList, Organizations rootOrg) { - if (isRootOrg(rootOrg)) { - rootOrg.setCodePath("/" + rootOrg.getId() + "/"); - rootOrg.setNamePath("/" + rootOrg.getOrgName() + "/"); - } else { - Organizations parent = orgMap.get(rootOrg.getParentId()); - rootOrg.setCodePath(parent.getCodePath() + rootOrg.getId() + "/"); - rootOrg.setNamePath(parent.getNamePath() + rootOrg.getOrgName() + "/"); - } - rootOrg.setReorgNamePath(true); - - for (Organizations org : orgList) { - if (org.isReorgNamePath()) - continue; - if (org.getParentId().equalsIgnoreCase(rootOrg.getId())) { - reorg(orgMap, orgList, org); - } - } - } - /** - * 根据数据格式返回数据 - * - * @param cell - * @return - */ - public static String getValue(Cell cell) { - if (cell == null) { - return ""; - } else if (cell.getCellType() == CellType.BOOLEAN) { - return String.valueOf(cell.getBooleanCellValue()); - } else if (cell.getCellType() == CellType.NUMERIC) { - cell.setBlank(); - return String.valueOf(cell.getStringCellValue().trim()); - } else { - return String.valueOf(cell.getStringCellValue().trim()); - } - } } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/PermissionRoleService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/PermissionRoleService.java index 168abcf1e..5aa4a0dbc 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/PermissionRoleService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/PermissionRoleService.java @@ -21,36 +21,14 @@ package org.dromara.maxkey.persistence.service; import java.util.List; import org.dromara.maxkey.entity.permissions.PermissionRole; -import org.dromara.maxkey.persistence.mapper.PermissionRoleMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class PermissionRoleService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(PermissionRoleService.class); - - - public PermissionRoleService() { - super(PermissionRoleMapper.class); - } +public interface PermissionRoleService extends IJpaService{ - @Override - public PermissionRoleMapper getMapper() { - return (PermissionRoleMapper)super.getMapper(); - } - - public boolean insertPermissionRoles(List permissionRolesList) { - return getMapper().insertPermissionRoles(permissionRolesList)>0; - } + public boolean insertPermissionRoles(List permissionRolesList); - public boolean deletePermissionRoles(List permissionRolesList) { - return getMapper().deletePermissionRoles(permissionRolesList)>=0; - } + public boolean deletePermissionRoles(List permissionRolesList) ; - public List queryPermissionRoles(PermissionRole permissionRole){ - return getMapper().queryPermissionRoles(permissionRole); - } + public List queryPermissionRoles(PermissionRole permissionRole); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/PermissionService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/PermissionService.java index 4638193f5..f95c7ac3d 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/PermissionService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/PermissionService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,39 +20,14 @@ package org.dromara.maxkey.persistence.service; import java.util.List; import org.dromara.maxkey.entity.permissions.Permission; -import org.dromara.maxkey.persistence.mapper.PermissionMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class PermissionService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(PermissionService.class); - - - public PermissionService() { - super(PermissionMapper.class); - } +public interface PermissionService extends IJpaService{ - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public PermissionMapper getMapper() { - return (PermissionMapper)super.getMapper(); - } - - public boolean insertGroupPrivileges(List rolePermissionsList) { - return getMapper().insertGroupPrivileges(rolePermissionsList)>0; - }; + public boolean insertGroupPrivileges(List rolePermissionsList) ; - public boolean deleteGroupPrivileges(List rolePermissionsList) { - return getMapper().deleteGroupPrivileges(rolePermissionsList)>=0; - } + public boolean deleteGroupPrivileges(List rolePermissionsList); - public List queryGroupPrivileges(Permission rolePermissions){ - return getMapper().queryGroupPrivileges(rolePermissions); - } + public List queryGroupPrivileges(Permission rolePermissions); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RegisterService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RegisterService.java index 4db770ef5..0a3268d7c 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RegisterService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RegisterService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,33 +17,12 @@ package org.dromara.maxkey.persistence.service; -import java.util.List; - import org.dromara.maxkey.entity.Register; import org.dromara.maxkey.entity.idm.UserInfo; -import org.dromara.maxkey.persistence.mapper.RegisterMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class RegisterService extends JpaService{ +public interface RegisterService extends IJpaService{ - public RegisterService() { - super(RegisterMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public RegisterMapper getMapper() { - return (RegisterMapper)super.getMapper(); - } - - - public UserInfo findByEmail(String email){ - List listUserInfo=getMapper().findByEmail(email); - return listUserInfo.size()>0?listUserInfo.get(0):null; - } + public UserInfo findByEmail(String email); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ReportService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ReportService.java index 39921f396..3fdd32d01 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ReportService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ReportService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,59 +20,26 @@ package org.dromara.maxkey.persistence.service; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.dromara.maxkey.persistence.mapper.ReportMapper; -import org.dromara.mybatis.jpa.JpaService; +import org.dromara.mybatis.jpa.IJpaService; import org.dromara.mybatis.jpa.entity.JpaEntity; -import org.springframework.stereotype.Repository; -@Repository -public class ReportService extends JpaService{ +public interface ReportService extends IJpaService{ - public Integer analysisDay(HashMap reportParameter) { - return getMapper().analysisDay(reportParameter); - }; + public Integer analysisDay(HashMap reportParameter) ; - public Integer analysisNewUsers(HashMap reportParameter) { - return getMapper().analysisNewUsers(reportParameter); - }; + public Integer analysisNewUsers(HashMap reportParameter) ; - public Integer analysisOnlineUsers(HashMap reportParameter) { - return getMapper().analysisOnlineUsers(reportParameter); - }; + public Integer analysisOnlineUsers(HashMap reportParameter) ; - public Integer analysisActiveUsers(HashMap reportParameter) { - return getMapper().analysisActiveUsers(reportParameter); - }; + public Integer analysisActiveUsers(HashMap reportParameter); - public List> analysisDayHour(HashMap reportParameter){ - return getMapper().analysisDayHour(reportParameter); - } + public List> analysisDayHour(HashMap reportParameter); - public List> analysisMonth(HashMap reportParameter){ - return getMapper().analysisMonth(reportParameter); - } + public List> analysisMonth(HashMap reportParameter); - public List> analysisBrowser(HashMap reportParameter){ - return getMapper().analysisBrowser(reportParameter); - } + public List> analysisBrowser(HashMap reportParameter); - public List> analysisApp(HashMap reportParameter){ - return getMapper().analysisApp(reportParameter); - } - - - - public ReportService() { - super(ReportMapper.class); - - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public ReportMapper getMapper() { - return (ReportMapper)super.getMapper(); - } + public List> analysisApp(HashMap reportParameter); + } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ResourcesService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ResourcesService.java index e67ff1822..936ee5dc6 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ResourcesService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/ResourcesService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,26 +20,9 @@ package org.dromara.maxkey.persistence.service; import java.util.List; import org.dromara.maxkey.entity.permissions.Resources; -import org.dromara.maxkey.persistence.mapper.ResourcesMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class ResourcesService extends JpaService{ +public interface ResourcesService extends IJpaService{ - public ResourcesService() { - super(ResourcesMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public ResourcesMapper getMapper() { - return (ResourcesMapper)super.getMapper(); - } - - public List queryResourcesTree(Resources resource){ - return getMapper().fetchPageResults(resource); - } + public List queryResourcesTree(Resources resource); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RoleMemberService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RoleMemberService.java index e32948ea3..f78ad2fc2 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RoleMemberService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RoleMemberService.java @@ -23,65 +23,20 @@ import java.util.List; import org.dromara.maxkey.entity.idm.UserInfo; import org.dromara.maxkey.entity.permissions.RoleMember; import org.dromara.maxkey.entity.permissions.Roles; -import org.dromara.maxkey.persistence.mapper.RoleMemberMapper; -import org.dromara.mybatis.jpa.JpaService; +import org.dromara.mybatis.jpa.IJpaService; import org.dromara.mybatis.jpa.entity.JpaPageResults; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; -@Repository -public class RoleMemberService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(RoleMemberService.class); - - public RoleMemberService() { - super(RoleMemberMapper.class); - } +public interface RoleMemberService extends IJpaService{ - @Override - public RoleMemberMapper getMapper() { - return (RoleMemberMapper)super.getMapper(); - } + public int addDynamicRoleMember(Roles dynamicGroup); - public int addDynamicRoleMember(Roles dynamicGroup) { - return getMapper().addDynamicRoleMember(dynamicGroup); - } + public int deleteDynamicRoleMember(Roles dynamicGroup) ; - public int deleteDynamicRoleMember(Roles dynamicGroup) { - return getMapper().deleteDynamicRoleMember(dynamicGroup); - } + public int deleteByRoleId(String groupId) ; - public int deleteByRoleId(String groupId) { - return getMapper().deleteByRoleId(groupId); - } - - public List queryMemberByRoleId(String groupId){ - return getMapper().queryMemberByRoleId(groupId); - } + public List queryMemberByRoleId(String groupId); - public JpaPageResults rolesNoMember(RoleMember entity) { - entity.setPageSelectId(entity.generateId()); - entity.setStartRow(calculateStartRow(entity.getPageNumber() ,entity.getPageSize())); - - entity.setPageable(true); - List resultslist = null; - try { - resultslist = getMapper().rolesNoMember(entity); - } catch (Exception e) { - _logger.error("fetchPageResults Exception " , e); - } - entity.setPageable(false); - Integer totalPage = resultslist.size(); - - Integer totalCount = 0; - if(entity.getPageNumber() == 1 && totalPage < entity.getPageSize()) { - totalCount = totalPage; - }else { - totalCount = parseCount(getMapper().fetchCount(entity)); - } - - return new JpaPageResults(entity.getPageNumber(),entity.getPageSize(),totalPage,totalCount,resultslist); - } + public JpaPageResults rolesNoMember(RoleMember entity) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RolesService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RolesService.java index 25e2a2124..8f419660e 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RolesService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/RolesService.java @@ -19,106 +19,21 @@ package org.dromara.maxkey.persistence.service; -import java.sql.Types; import java.util.List; -import org.apache.commons.lang3.StringUtils; -import org.dromara.maxkey.constants.ConstsStatus; -import org.dromara.maxkey.entity.Institutions; import org.dromara.maxkey.entity.permissions.Roles; -import org.dromara.maxkey.persistence.mapper.RolesMapper; -import org.dromara.maxkey.util.StrUtils; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class RolesService extends JpaService { - static final Logger _logger = LoggerFactory.getLogger(RolesService.class); - - @Autowired - RoleMemberService roleMemberService; - - @Autowired - InstitutionsService institutionsService; - - public RolesService() { - super(RolesMapper.class); - } +public interface RolesService extends IJpaService { - @Override - public RolesMapper getMapper() { - return (RolesMapper)super.getMapper(); - } + public List queryDynamicRoles(Roles groups); + public boolean deleteById(String groupId); - public List queryDynamicRoles(Roles groups){ - return this.getMapper().queryDynamicRoles(groups); - } + public List queryRolesByUserId(String userId); - public boolean deleteById(String groupId) { - this.delete(groupId); - roleMemberService.deleteByRoleId(groupId); - return true; - } + public void refreshDynamicRoles(Roles dynamicRole); - public List queryRolesByUserId(String userId){ - return this.getMapper().queryRolesByUserId(userId); - } - - public void refreshDynamicRoles(Roles dynamicRole){ - if(dynamicRole.getCategory().equals(Roles.Category.DYNAMIC)) { - - if(StringUtils.isNotBlank(dynamicRole.getOrgIdsList())) { - String []orgIds = dynamicRole.getOrgIdsList().split(","); - StringBuffer orgIdFilters = new StringBuffer(); - for(String orgId : orgIds) { - if(StringUtils.isNotBlank(orgId)) { - if(orgIdFilters.length() > 0) { - orgIdFilters.append(","); - } - orgIdFilters.append("'").append(orgId).append("'"); - } - } - if(orgIdFilters.length() > 0) { - dynamicRole.setOrgIdsList(orgIdFilters.toString()); - } - } - - String filters = dynamicRole.getFilters(); - _logger.debug("filters {}" , filters); - if(StringUtils.isNotBlank(filters)) { - if(StrUtils.filtersSQLInjection(filters.toLowerCase())) { - _logger.info("filters include SQL Injection Attack Risk."); - return; - } - //replace & with AND, | with OR - filters = filters.replace("&", " AND ").replace("\\|", " OR "); - - _logger.debug("set filters {}" , filters); - dynamicRole.setFilters(filters); - } - - roleMemberService.deleteDynamicRoleMember(dynamicRole); - roleMemberService.addDynamicRoleMember(dynamicRole); - - } - } - - public void refreshAllDynamicRoles(){ - List instList = - institutionsService.find("where status = ? ", new Object[]{ConstsStatus.ACTIVE}, new int[]{Types.INTEGER}); - for(Institutions inst : instList) { - Roles role = new Roles(); - role.setInstId(inst.getId()); - List rolesList = queryDynamicRoles(role); - for(Roles r : rolesList) { - _logger.debug("role {}" , r); - refreshDynamicRoles(r); - } - } - } + public void refreshAllDynamicRoles(); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SocialsAssociatesService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SocialsAssociatesService.java index b6a4f0701..6dd444623 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SocialsAssociatesService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SocialsAssociatesService.java @@ -21,29 +21,11 @@ import java.util.List; import org.dromara.maxkey.entity.SocialsAssociate; import org.dromara.maxkey.entity.idm.UserInfo; -import org.dromara.maxkey.persistence.mapper.SocialsAssociateMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class SocialsAssociatesService extends JpaService{ - - public SocialsAssociatesService() { - super(SocialsAssociateMapper.class); - } +public interface SocialsAssociatesService extends IJpaService{ - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public SocialsAssociateMapper getMapper() { - return (SocialsAssociateMapper)super.getMapper(); - } - - - public List queryByUser(UserInfo user) { - return getMapper().queryByUser(user); - } + public List queryByUser(UserInfo user); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SocialsProviderService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SocialsProviderService.java index 395fd941a..ed51f78a3 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SocialsProviderService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SocialsProviderService.java @@ -18,28 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.SocialsProvider; -import org.dromara.maxkey.persistence.mapper.SocialsProviderMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class SocialsProviderService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(SocialsProviderService.class); - - - public SocialsProviderService() { - super(SocialsProviderMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public SocialsProviderMapper getMapper() { - return (SocialsProviderMapper)super.getMapper(); - } - +public interface SocialsProviderService extends IJpaService{ } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SynchroRelatedService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SynchroRelatedService.java index bcd31b53d..523a00233 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SynchroRelatedService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SynchroRelatedService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,61 +17,19 @@ package org.dromara.maxkey.persistence.service; -import java.sql.Types; -import java.util.Date; import java.util.List; import org.dromara.maxkey.entity.SynchroRelated; import org.dromara.maxkey.entity.Synchronizers; -import org.dromara.maxkey.entity.idm.Organizations; -import org.dromara.maxkey.persistence.mapper.SynchroRelatedMapper; -import org.dromara.maxkey.util.DateUtils; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Repository; +import org.dromara.mybatis.jpa.IJpaService; -@Repository -public class SynchroRelatedService extends JpaService{ +public interface SynchroRelatedService extends IJpaService{ - public SynchroRelatedService() { - super(SynchroRelatedMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public SynchroRelatedMapper getMapper() { - return (SynchroRelatedMapper)super.getMapper(); - } + public int updateSyncTime(SynchroRelated synchroRelated); - public int updateSyncTime(SynchroRelated synchroRelated) { - return getMapper().updateSyncTime(synchroRelated); - } + public List findOrgs(Synchronizers synchronizer) ; - public List findOrgs(Synchronizers synchronizer) { - return find( - "instid = ? and syncid = ? and objecttype = ? ", - new Object[] { synchronizer.getInstId() ,synchronizer.getId(),Organizations.CLASS_TYPE}, - new int[] { Types.VARCHAR,Types.VARCHAR,Types.VARCHAR} - ); - } + public SynchroRelated findByOriginId(Synchronizers synchronizer,String originId,String classType) ; - public SynchroRelated findByOriginId(Synchronizers synchronizer,String originId,String classType) { - return findOne("instid = ? and syncId = ? and originid = ? and objecttype = ? ", - new Object[] { synchronizer.getInstId(),synchronizer.getId(),originId,classType }, - new int[] { Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,Types.VARCHAR}); - } - - public void updateSynchroRelated(Synchronizers synchronizer,SynchroRelated synchroRelated,String classType) { - SynchroRelated loadSynchroRelated = - findByOriginId( - synchronizer,synchroRelated.getOriginId(),classType ); - if(loadSynchroRelated == null) { - insert(synchroRelated); - }else { - synchroRelated.setId(loadSynchroRelated.getId()); - synchroRelated.setSyncTime(DateUtils.formatDateTime(new Date())); - updateSyncTime(synchroRelated); - } - } + public void updateSynchroRelated(Synchronizers synchronizer,SynchroRelated synchroRelated,String classType) ; } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SynchronizersService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SynchronizersService.java index 5ad0a6fed..faaddec13 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SynchronizersService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/SynchronizersService.java @@ -18,30 +18,8 @@ package org.dromara.maxkey.persistence.service; import org.dromara.maxkey.entity.Synchronizers; -import org.dromara.maxkey.persistence.mapper.SynchronizersMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; - -@Repository -public class SynchronizersService extends JpaService{ - static final Logger _logger = LoggerFactory.getLogger(SynchronizersService.class); - - public SynchronizersService() { - super(SynchronizersMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public SynchronizersMapper getMapper() { - return (SynchronizersMapper)super.getMapper(); - } - - - +import org.dromara.mybatis.jpa.IJpaService; +public interface SynchronizersService extends IJpaService{ } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/UserInfoService.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/UserInfoService.java index fa8d0092e..3440de4d5 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/UserInfoService.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/UserInfoService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,242 +18,42 @@ package org.dromara.maxkey.persistence.service; -import java.sql.Types; -import java.util.Date; - -import org.apache.commons.lang3.StringUtils; -import org.dromara.maxkey.constants.ConstsStatus; -import org.dromara.maxkey.crypto.password.PasswordReciprocal; -import org.dromara.maxkey.entity.Accounts; import org.dromara.maxkey.entity.ChangePassword; import org.dromara.maxkey.entity.idm.UserInfo; -import org.dromara.maxkey.persistence.mapper.UserInfoMapper; import org.dromara.maxkey.persistence.repository.PasswordPolicyValidator; -import org.dromara.maxkey.provision.ProvisionAct; -import org.dromara.maxkey.provision.ProvisionService; -import org.dromara.maxkey.provision.ProvisionTopic; -import org.dromara.maxkey.web.WebContext; -import org.dromara.mybatis.jpa.JpaService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Repository; - +import org.dromara.mybatis.jpa.IJpaService; /** * @author Crystal.Sea * */ -@Repository -public class UserInfoService extends JpaService { - static final Logger _logger = LoggerFactory.getLogger(UserInfoService.class); +public interface UserInfoService extends IJpaService { - @Autowired - private PasswordEncoder passwordEncoder; + public boolean insert(UserInfo userInfo,boolean passwordEncoder) ; - @Autowired - PasswordPolicyValidator passwordPolicyValidator; - - @Autowired - ProvisionService provisionService; - - AccountsService accountsService; - - public UserInfoService() { - super(UserInfoMapper.class); - } - - /* (non-Javadoc) - * @see com.connsec.db.service.BaseService#getMapper() - */ - @Override - public UserInfoMapper getMapper() { - return (UserInfoMapper)super.getMapper(); - } - - @Override - public boolean insert(UserInfo userInfo) { - this.passwordEncoder(userInfo); - if (super.insert(userInfo)) { - if(provisionService.getApplicationConfig().isProvisionSupport()) { - UserInfo loadUserInfo = findUserRelated(userInfo.getId()); - provisionService.send( - ProvisionTopic.USERINFO_TOPIC, - loadUserInfo, - ProvisionAct.CREATE); - } - - return true; - } - - return false; - } - - public boolean insert(UserInfo userInfo,boolean passwordEncoder) { - if(passwordEncoder) { - this.passwordEncoder(userInfo); - } - if (super.insert(userInfo)) { - if(provisionService.getApplicationConfig().isProvisionSupport()) { - UserInfo loadUserInfo = findUserRelated(userInfo.getId()); - provisionService.send( - ProvisionTopic.USERINFO_TOPIC, - loadUserInfo, - ProvisionAct.CREATE); - } - - return true; - } - - return false; - } - - @Override - public boolean update(UserInfo userInfo) { - ChangePassword changePassword = this.passwordEncoder(userInfo); - if (super.update(userInfo)) { - if(provisionService.getApplicationConfig().isProvisionSupport()) { - UserInfo loadUserInfo = findUserRelated(userInfo.getId()); - accountUpdate(loadUserInfo); - provisionService.send( - ProvisionTopic.USERINFO_TOPIC, - loadUserInfo, - ProvisionAct.UPDATE); - } - if(userInfo.getPassword() != null) { - changePasswordProvisioning(changePassword); - } - return true; - } - return false; - } - - public boolean delete(UserInfo userInfo) { - UserInfo loadUserInfo = null; - if(provisionService.getApplicationConfig().isProvisionSupport()) { - loadUserInfo = findUserRelated(userInfo.getId()); - } - - if( super.delete(userInfo.getId())){ - provisionService.send( - ProvisionTopic.USERINFO_TOPIC, - loadUserInfo, - ProvisionAct.DELETE); - accountUpdate(loadUserInfo); - return true; - } - return false; - } + public boolean delete(UserInfo userInfo) ; //更新账号状态 - public void accountUpdate(UserInfo userInfo) { - if(userInfo.getStatus() != ConstsStatus.ACTIVE) { - if(accountsService==null) { - accountsService = - WebContext.getBean("accountsService",AccountsService.class); - } - Accounts queryAcount =new Accounts(); - queryAcount.setUserId(userInfo.getId()); - for (Accounts acount : accountsService.query(queryAcount)) { - acount.setStatus(ConstsStatus.INACTIVE); - accountsService.update(acount); - } - } - } + public void accountUpdate(UserInfo userInfo) ; - public UserInfo findUserRelated(String userId) { - UserInfo loadUserInfo =this.get(userId); - loadUserInfo.setDepts(getMapper().findDeptsByUserId(userId)); - return loadUserInfo; - } + public UserInfo findUserRelated(String userId) ; - public boolean updateGridList(String gridList,UserInfo userInfo) { - try { - if (gridList != null && !gridList.equals("")) { - userInfo.setGridList(Integer.parseInt(gridList)); - getMapper().updateGridList(userInfo); - } - }catch(Exception e) { - e.printStackTrace(); - return false; - } - return true; - } + public boolean updateGridList(String gridList,UserInfo userInfo); - public void saveOrUpdate(UserInfo userInfo) { - UserInfo loadUserInfo = findOne(" username = ? and instid = ?", - new Object[] { userInfo.getUsername(),userInfo.getInstId() }, - new int[] { Types.VARCHAR,Types.VARCHAR}); - if(loadUserInfo == null) { - insert(userInfo); - }else { - userInfo.setId(loadUserInfo.getId()); - userInfo.setPassword(null); - update(userInfo); - } - } + public void saveOrUpdate(UserInfo userInfo) ; - public boolean updateProtectedApps(UserInfo userinfo) { - try { - userinfo.setModifiedDate(new Date()); - return getMapper().updateProtectedApps(userinfo) > 0; - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } + public boolean updateProtectedApps(UserInfo userinfo) ; - public UserInfo findByUsername(String username) { - return getMapper().findByUsername(username); - } + public UserInfo findByUsername(String username) ; - public UserInfo findByEmailMobile(String emailMobile) { - return getMapper().findByEmailMobile(emailMobile); - } + public UserInfo findByEmailMobile(String emailMobile) ; - public UserInfo findByAppIdAndUsername(String appId,String username){ - try { - UserInfo userinfo = new UserInfo(); - userinfo.setUsername(username); - return getMapper().findByAppIdAndUsername(userinfo) ; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } + public UserInfo findByAppIdAndUsername(String appId,String username); - public ChangePassword passwordEncoder(UserInfo userInfo) { - ChangePassword changePassword = null; - if(StringUtils.isNotBlank(userInfo.getPassword())) { - changePassword = new ChangePassword(userInfo); - passwordEncoder(changePassword); - userInfo.setPassword(changePassword.getPassword()); - userInfo.setDecipherable(changePassword.getDecipherable()); - userInfo.setPasswordLastSetTime(changePassword.getPasswordLastSetTime()); - }else { - userInfo.setPassword(null); - userInfo.setDecipherable(null); - } - return changePassword; - } + public ChangePassword passwordEncoder(UserInfo userInfo) ; - public ChangePassword passwordEncoder(ChangePassword changePassword) { - //密码不为空,则需要进行加密处理 - if(StringUtils.isNotBlank(changePassword.getPassword())) { - String password = passwordEncoder.encode(changePassword.getPassword()); - changePassword.setDecipherable(PasswordReciprocal.getInstance().encode(changePassword.getPassword())); - _logger.debug("decipherable : {}",changePassword.getDecipherable()); - changePassword.setPassword(password); - changePassword.setPasswordLastSetTime(new Date()); - - }else { - changePassword.setPassword(null); - changePassword.setDecipherable(null); - } - return changePassword; - } + public ChangePassword passwordEncoder(ChangePassword changePassword) ; /** * 认证密码修改 @@ -263,37 +63,7 @@ public class UserInfoService extends JpaService { * @param passwordSetType * @return */ - public boolean changePassword( ChangePassword changePassword) { - try { - WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, ""); - UserInfo userInfo = this.findByUsername(changePassword.getUsername()); - if(changePassword.getPassword().equals(changePassword.getConfirmPassword())){ - if(StringUtils.isNotBlank(changePassword.getOldPassword()) && - passwordEncoder.matches(changePassword.getOldPassword(), userInfo.getPassword())){ - if(changePassword(changePassword,true) ){ - return true; - } - return false; - }else { - if(StringUtils.isNotBlank(changePassword.getOldPassword())&& - passwordEncoder.matches(changePassword.getPassword(), userInfo.getPassword())) { - WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, - WebContext.getI18nValue("PasswordPolicy.OLD_PASSWORD_MATCH")); - }else { - WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, - WebContext.getI18nValue("PasswordPolicy.OLD_PASSWORD_NOT_MATCH")); - } - } - }else { - WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, - WebContext.getI18nValue("PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH")); - } - } catch (Exception e) { - e.printStackTrace(); - } - - return false; - } + public boolean changePassword( ChangePassword changePassword) ; /** * 后台密码修改 @@ -301,130 +71,47 @@ public class UserInfoService extends JpaService { * @param passwordPolicy * @return */ - public boolean changePassword(ChangePassword changePassword,boolean passwordPolicy) { - try { - _logger.debug("decipherable old : {}" , changePassword.getDecipherable()); - _logger.debug("decipherable new : {}" , PasswordReciprocal.getInstance().encode(changePassword.getDecipherable())); - - if (passwordPolicy && !passwordPolicyValidator.validator(changePassword)) { - return false; - } - - changePassword = passwordEncoder(changePassword); - - if (getMapper().changePassword(changePassword) > 0) { - changePasswordProvisioning(changePassword); - return true; - } - return false; - - } catch (Exception e) { - e.printStackTrace(); - } - - return false; - } + public boolean changePassword(ChangePassword changePassword,boolean passwordPolicy) ; - public String randomPassword() { - return passwordPolicyValidator.generateRandomPassword(); - } + public String randomPassword() ; - public void changePasswordProvisioning(ChangePassword changePassworded) { - if(changePassworded !=null && StringUtils.isNotBlank(changePassworded.getPassword())) { - UserInfo loadUserInfo = findByUsername(changePassworded.getUsername()); - ChangePassword changePassword = new ChangePassword(loadUserInfo); - provisionService.send(ProvisionTopic.PASSWORD_TOPIC, changePassword, ProvisionAct.PASSWORD); - } - } + public void changePasswordProvisioning(ChangePassword changePassworded) ; - public boolean updateAppLoginPassword(UserInfo userinfo) { - try { - userinfo.setModifiedDate(new Date()); - return getMapper().updateAppLoginPassword(userinfo) > 0; - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } + public boolean updateAppLoginPassword(UserInfo userinfo) ; /** * 锁定用户:islock:1 用户解锁 2 用户锁定 * @param userInfo */ - public void updateLocked(UserInfo userInfo) { - try { - if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) { - userInfo.setIsLocked(ConstsStatus.LOCK); - getMapper().updateLocked(userInfo); - } - } catch(Exception e) { - e.printStackTrace(); - } - } + public void updateLocked(UserInfo userInfo) ; /** * 用户登录成功后,重置错误密码次数和解锁用户 * @param userInfo */ - public void updateLockout(UserInfo userInfo) { - try { - if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) { - userInfo.setIsLocked(ConstsStatus.START); - userInfo.setBadPasswordCount(0); - getMapper().updateLockout(userInfo); - } - } catch(Exception e) { - e.printStackTrace(); - } - } + public void updateLockout(UserInfo userInfo) ; /** * 更新错误密码次数 * @param userInfo */ - public void updateBadPasswordCount(UserInfo userInfo) { - try { - if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) { - int updateBadPWDCount = userInfo.getBadPasswordCount() + 1; - userInfo.setBadPasswordCount(updateBadPWDCount); - getMapper().updateBadPWDCount(userInfo); - } - } catch(Exception e) { - e.printStackTrace(); - } - } + public void updateBadPasswordCount(UserInfo userInfo) ; - public boolean updateSharedSecret(UserInfo userInfo){ - return getMapper().updateSharedSecret(userInfo)>0; - } + public boolean updateSharedSecret(UserInfo userInfo); - public boolean updatePasswordQuestion(UserInfo userInfo){ - return getMapper().updatePasswordQuestion(userInfo)>0; - } + public boolean updatePasswordQuestion(UserInfo userInfo); - public boolean updateAuthnType(UserInfo userInfo){ - return getMapper().updateAuthnType(userInfo)>0; - } + public boolean updateAuthnType(UserInfo userInfo); - public boolean updateEmail(UserInfo userInfo){ - return getMapper().updateEmail(userInfo)>0; - } + public boolean updateEmail(UserInfo userInfo); - public boolean updateMobile(UserInfo userInfo){ - return getMapper().updateMobile(userInfo)>0; - } + public boolean updateMobile(UserInfo userInfo); - public int updateProfile(UserInfo userInfo){ - return getMapper().updateProfile(userInfo); - } + public int updateProfile(UserInfo userInfo); - public boolean updateStatus(UserInfo userInfo) { - return getMapper().updateStatus(userInfo) > 0; - } + public boolean updateStatus(UserInfo userInfo); - public void setPasswordPolicyValidator(PasswordPolicyValidator passwordPolicyValidator) { - this.passwordPolicyValidator = passwordPolicyValidator; - } + public void setPasswordPolicyValidator(PasswordPolicyValidator passwordPolicyValidator); } diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/package-info.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AccessServiceImpl.java similarity index 64% rename from maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/package-info.java rename to maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AccessServiceImpl.java index fac0df93d..7da278ba5 100644 --- a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/package-info.java +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AccessServiceImpl.java @@ -15,8 +15,14 @@ */ -/** - * - * Mysql DAO Mapper XML Configuration. -*/ -package org.dromara.maxkey.persistence.service; +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.Access; +import org.dromara.maxkey.persistence.mapper.AccessMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class AccessServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AccountsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AccountsServiceImpl.java new file mode 100644 index 000000000..f6c47e879 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AccountsServiceImpl.java @@ -0,0 +1,255 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.dromara.maxkey.constants.ConstsStatus; +import org.dromara.maxkey.crypto.password.PasswordReciprocal; +import org.dromara.maxkey.entity.Accounts; +import org.dromara.maxkey.entity.AccountsStrategy; +import org.dromara.maxkey.entity.OrganizationsCast; +import org.dromara.maxkey.entity.idm.UserInfo; +import org.dromara.maxkey.persistence.mapper.AccountsMapper; +import org.dromara.maxkey.persistence.service.AccountsStrategyService; +import org.dromara.maxkey.persistence.service.OrganizationsCastService; +import org.dromara.maxkey.persistence.service.UserInfoService; +import org.dromara.maxkey.provision.ProvisionAct; +import org.dromara.maxkey.provision.ProvisionService; +import org.dromara.maxkey.provision.ProvisionTopic; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; +import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; +import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; + +@Repository +public class AccountsServiceImpl extends JpaServiceImpl{ + + @Autowired + ProvisionService provisionService; + + @Autowired + UserInfoService userInfoService; + + @Autowired + AccountsStrategyService accountsStrategyService; + + @Autowired + OrganizationsCastService organizationsCastService; + + @Override + public boolean insert(Accounts account) { + if (super.insert(account)) { + if(provisionService.getApplicationConfig().isProvisionSupport()) { + UserInfo loadUserInfo = userInfoService.findUserRelated(account.getUserId()); + account.setUserInfo(loadUserInfo); + OrganizationsCast cast = new OrganizationsCast(); + cast.setProvider(account.getAppId()); + cast.setOrgId(loadUserInfo.getDepartmentId()); + account.setOrgCast(organizationsCastService.query(cast)); + provisionService.send( + ProvisionTopic.ACCOUNT_TOPIC, + account, + ProvisionAct.CREATE); + } + + return true; + } + return false; + } + + @Override + public boolean update(Accounts account) { + if (super.update(account)) { + if(provisionService.getApplicationConfig().isProvisionSupport()) { + UserInfo loadUserInfo = userInfoService.findUserRelated(account.getUserId()); + account.setUserInfo(loadUserInfo); + OrganizationsCast cast = new OrganizationsCast(); + cast.setProvider(account.getAppId()); + cast.setOrgId(loadUserInfo.getDepartmentId()); + account.setOrgCast(organizationsCastService.query(cast)); + provisionService.send( + ProvisionTopic.ACCOUNT_TOPIC, + account, + ProvisionAct.UPDATE); + } + + return true; + } + return false; + } + + public boolean updateStatus(Accounts accounts) { + return this.getMapper().updateStatus(accounts) > 0; + } + + public boolean remove(String id) { + Accounts account = this.get(id); + if (super.delete(id)) { + UserInfo loadUserInfo = null; + if(provisionService.getApplicationConfig().isProvisionSupport()) { + loadUserInfo = userInfoService.findUserRelated(account.getUserId()); + account.setUserInfo(loadUserInfo); + provisionService.send( + ProvisionTopic.ACCOUNT_TOPIC, + account, + ProvisionAct.DELETE); + } + + return true; + } + return false; + } + + public void refreshByStrategy(AccountsStrategy strategy) { + if(StringUtils.isNotBlank(strategy.getOrgIdsList())) { + strategy.setOrgIdsList("'"+strategy.getOrgIdsList().replace(",", "','")+"'"); + } + List userList = queryUserNotInStrategy(strategy); + for(UserInfo user : userList) { + Accounts account = new Accounts(); + account.setAppId(strategy.getAppId()); + account.setAppName(strategy.getAppName()); + + account.setUserId(user.getId()); + account.setUsername(user.getUsername()); + account.setDisplayName(user.getDisplayName()); + account.setRelatedUsername(generateAccount(user,strategy)); + account.setRelatedPassword(PasswordReciprocal.getInstance().encode(userInfoService.randomPassword())); + + account.setInstId(strategy.getInstId()); + account.setCreateType("automatic"); + account.setStatus(ConstsStatus.ACTIVE); + account.setStrategyId(strategy.getId()); + + insert(account); + } + deleteByStrategy(strategy); + } + public void refreshAllByStrategy() { + AccountsStrategy queryStrategy = new AccountsStrategy(); + queryStrategy.setCreateType("automatic"); + for( AccountsStrategy strategy : accountsStrategyService.query(queryStrategy)) { + refreshByStrategy(strategy); + } + } + + + public List queryUserNotInStrategy(AccountsStrategy strategy){ + return getMapper().queryUserNotInStrategy(strategy); + } + + public long deleteByStrategy(AccountsStrategy strategy) { + return getMapper().deleteByStrategy(strategy); + } + + + public List queryByAppIdAndDate(Accounts account) { + return getMapper().queryByAppIdAndDate(account); + } + + public List queryByAppIdAndAccount(String appId,String relatedUsername){ + return getMapper().queryByAppIdAndAccount(appId,relatedUsername); + } + + + public String generateAccount(UserInfo userInfo,AccountsStrategy accountsStrategy) { + String shortAccount = generateAccount(userInfo,accountsStrategy,true); + String account = generateAccount(userInfo,accountsStrategy,false); + String accountResult = shortAccount; + List accountsList =getMapper().queryByAppIdAndAccount(accountsStrategy.getAppId(),shortAccount +accountsStrategy.getSuffixes()); + if(!accountsList.isEmpty()) { + if(accountsStrategy.getMapping().equalsIgnoreCase("email")) { + accountResult = account; + accountsList =getMapper().queryByAppIdAndAccount(accountsStrategy.getAppId(),account + accountsStrategy.getSuffixes()); + } + if(!accountsList.isEmpty()) { + for(int i =1 ;i < 100 ;i++) { + accountResult = account + i; + accountsList =getMapper().queryByAppIdAndAccount(accountsStrategy.getAppId(),accountResult + accountsStrategy.getSuffixes()); + if(accountsList.isEmpty()) { + break; + } + } + } + } + if(StringUtils.isNotBlank(accountsStrategy.getSuffixes())){ + accountResult = accountResult + accountsStrategy.getSuffixes(); + } + return accountResult; + } + + + private String generateAccount(UserInfo userInfo,AccountsStrategy strategy,boolean isShort) { + String account = ""; + if(strategy.getMapping().equalsIgnoreCase("username")) { + account = userInfo.getUsername(); + }else if(strategy.getMapping().equalsIgnoreCase("mobile")) { + account = userInfo.getMobile(); + }else if(strategy.getMapping().equalsIgnoreCase("email")) { + try { + if(isShort) { + account = getPinYinShortName(userInfo.getDisplayName()); + }else { + account = getPinYinName(userInfo.getDisplayName()); + } + }catch(Exception e) { + e.printStackTrace(); + } + }else if(strategy.getMapping().equalsIgnoreCase("employeeNumber")) { + account = userInfo.getEmployeeNumber(); + }else if(strategy.getMapping().equalsIgnoreCase("windowsAccount")) { + account = userInfo.getWindowsAccount(); + }else if(strategy.getMapping().equalsIgnoreCase("idCardNo")) { + account = userInfo.getIdCardNo(); + }else { + account = userInfo.getUsername(); + } + + return account; + } + + public static String getPinYinName(String name) throws BadHanyuPinyinOutputFormatCombination { + HanyuPinyinOutputFormat pinyinFormat = new HanyuPinyinOutputFormat(); + pinyinFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); + pinyinFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + pinyinFormat.setVCharType(HanyuPinyinVCharType.WITH_V); + return PinyinHelper.toHanYuPinyinString(name, pinyinFormat, "",false); + } + + public static String getPinYinShortName(String name) throws BadHanyuPinyinOutputFormatCombination { + char[] strs = name.toCharArray(); + String pinyinName = ""; + for(int i=0;i { + static final Logger _logger = LoggerFactory.getLogger(AccountsStrategyServiceImpl.class); + + + + public List queryDynamicGroups(Roles groups){ + return this.getMapper().queryDynamicGroups(groups); + } + + public boolean deleteById(String groupId) { + this.delete(groupId); + //groupMemberService.deleteByGroupId(groupId); + return true; + } + /* + public void refreshDynamicGroups(Groups dynamicGroup){ + if(dynamicGroup.getDynamic().equals("1")) { + boolean isDynamicTimeSupport = false; + boolean isBetweenEffectiveTime = false; + if(dynamicGroup.getResumeTime()!=null&&dynamicGroup.getResumeTime().equals("") + &&dynamicGroup.getSuspendTime()!=null&&dynamicGroup.getSuspendTime().equals("")) { + LocalTime currentTime = LocalDateTime.now().toLocalTime(); + LocalTime resumeTime = LocalTime.parse(dynamicGroup.getResumeTime()); + LocalTime suspendTime = LocalTime.parse(dynamicGroup.getSuspendTime()); + + _logger.info("currentTime: " + currentTime + + " , resumeTime : " + resumeTime + + " , suspendTime: " + suspendTime); + isDynamicTimeSupport = true; + + if(resumeTime.isBefore(currentTime) && currentTime.isBefore(suspendTime)) { + isBetweenEffectiveTime = true; + } + + } + + if(dynamicGroup.getOrgIdsList()!=null && !dynamicGroup.getOrgIdsList().equals("")) { + dynamicGroup.setOrgIdsList("'"+dynamicGroup.getOrgIdsList().replace(",", "','")+"'"); + } + String filters = dynamicGroup.getFilters(); + if(StringUtils.filtersSQLInjection(filters.toLowerCase())) { + _logger.info("filters include SQL Injection Attack Risk."); + return; + } + + filters = filters.replace("&", " AND "); + filters = filters.replace("|", " OR "); + + dynamicGroup.setFilters(filters); + + if(isDynamicTimeSupport) { + if(isBetweenEffectiveTime) { + groupMemberService.deleteDynamicGroupMember(dynamicGroup); + groupMemberService.addDynamicGroupMember(dynamicGroup); + }else { + groupMemberService.deleteDynamicGroupMember(dynamicGroup); + } + }else{ + groupMemberService.deleteDynamicGroupMember(dynamicGroup); + groupMemberService.addDynamicGroupMember(dynamicGroup); + } + } + }*/ + + + + + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsAdaptersServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsAdaptersServiceImpl.java new file mode 100644 index 000000000..a72cb9836 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsAdaptersServiceImpl.java @@ -0,0 +1,28 @@ +/* + * Copyright [2021] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.apps.AppsAdapters; +import org.dromara.maxkey.persistence.mapper.AppsAdaptersMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class AppsAdaptersServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsCasDetailsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsCasDetailsServiceImpl.java new file mode 100644 index 000000000..42731a53b --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsCasDetailsServiceImpl.java @@ -0,0 +1,54 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.concurrent.TimeUnit; + +import org.dromara.maxkey.entity.apps.AppsCasDetails; +import org.dromara.maxkey.persistence.mapper.AppsCasDetailsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; + +@Repository +public class AppsCasDetailsServiceImpl extends JpaServiceImpl{ + + protected static final Cache detailsCache = + Caffeine.newBuilder() + .expireAfterWrite(30, TimeUnit.MINUTES) + .maximumSize(200000) + .build(); + + public AppsCasDetails getAppDetails(String id , boolean cached) { + AppsCasDetails details = null; + if(cached) { + details = detailsCache.getIfPresent(id); + if(details == null) { + details = getMapper().getAppDetails(id); + if(details != null) { + detailsCache.put(id, details); + } + } + }else { + details = getMapper().getAppDetails(id); + } + return details; + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsFormBasedDetailsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsFormBasedDetailsServiceImpl.java new file mode 100644 index 000000000..9752c8dac --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsFormBasedDetailsServiceImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.concurrent.TimeUnit; + +import org.dromara.maxkey.entity.apps.AppsFormBasedDetails; +import org.dromara.maxkey.persistence.mapper.AppsFormBasedDetailsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; + +@Repository +public class AppsFormBasedDetailsServiceImpl extends JpaServiceImpl{ + + protected static final Cache detailsCache = + Caffeine.newBuilder() + .expireAfterWrite(30, TimeUnit.MINUTES) + .maximumSize(200000) + .build(); + + public AppsFormBasedDetails getAppDetails(String id,boolean cached) { + AppsFormBasedDetails details = null; + if(cached) { + details = detailsCache.getIfPresent(id); + if(details == null) { + details = getMapper().getAppDetails(id); + detailsCache.put(id, details); + } + }else { + details = getMapper().getAppDetails(id); + } + return details; + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsJwtDetailsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsJwtDetailsServiceImpl.java new file mode 100644 index 000000000..37bc513fb --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsJwtDetailsServiceImpl.java @@ -0,0 +1,53 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.concurrent.TimeUnit; + +import org.dromara.maxkey.entity.apps.AppsJwtDetails; +import org.dromara.maxkey.persistence.mapper.AppsJwtDetailsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; + +@Repository +public class AppsJwtDetailsServiceImpl extends JpaServiceImpl{ + + protected static final Cache detailsCache = + Caffeine.newBuilder() + .expireAfterWrite(30, TimeUnit.MINUTES) + .maximumSize(200000) + .build(); + + + public AppsJwtDetails getAppDetails(String id , boolean cached) { + AppsJwtDetails details = null; + if(cached) { + details = detailsCache.getIfPresent(id); + if(details == null) { + details = getMapper().getAppDetails(id); + detailsCache.put(id, details); + } + }else { + details = getMapper().getAppDetails(id); + } + return details; + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsSaml20DetailsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsSaml20DetailsServiceImpl.java new file mode 100644 index 000000000..b091e0a31 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsSaml20DetailsServiceImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.concurrent.TimeUnit; + +import org.dromara.maxkey.entity.apps.AppsSAML20Details; +import org.dromara.maxkey.persistence.mapper.AppsSaml20DetailsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; + +@Repository +public class AppsSaml20DetailsServiceImpl extends JpaServiceImpl{ + + protected static final Cache detailsCache = + Caffeine.newBuilder() + .expireAfterWrite(30, TimeUnit.MINUTES) + .maximumSize(200000) + .build(); + + public AppsSAML20Details getAppDetails(String id , boolean cached){ + AppsSAML20Details details = null; + if(cached) { + details = detailsCache.getIfPresent(id); + if(details == null) { + details = getMapper().getAppDetails(id); + detailsCache.put(id, details); + } + }else { + details = getMapper().getAppDetails(id); + } + return details; + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsServiceImpl.java new file mode 100644 index 000000000..c2a718003 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsServiceImpl.java @@ -0,0 +1,79 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.dromara.maxkey.entity.apps.Apps; +import org.dromara.maxkey.entity.apps.UserApps; +import org.dromara.maxkey.persistence.mapper.AppsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; + +@Repository +public class AppsServiceImpl extends JpaServiceImpl{ + //maxkey-mgt + public static final String MGT_APP_ID = "622076759805923328"; + + public static final String DETAIL_SUFFIX = "_detail"; + + protected static final Cache detailsCacheStore = + Caffeine.newBuilder() + .expireAfterWrite(30, TimeUnit.MINUTES) + .build(); + + public boolean insertApp(Apps app) { + return ((AppsMapper)super.getMapper()).insertApp(app)>0; + }; + public boolean updateApp(Apps app) { + return ((AppsMapper)super.getMapper()).updateApp(app)>0; + }; + + public boolean updateExtendAttr(Apps app) { + return ((AppsMapper)super.getMapper()).updateExtendAttr(app)>0; + } + + public List queryMyApps(UserApps userApplications){ + return getMapper().queryMyApps(userApplications); + } + + //cache for running + public void put(String appId, Apps appDetails) { + detailsCacheStore.put(appId + DETAIL_SUFFIX, appDetails); + } + + public Apps get(String appId, boolean cached) { + appId = appId.equalsIgnoreCase("maxkey_mgt") ? MGT_APP_ID : appId; + Apps appDetails = null; + if(cached) { + appDetails = detailsCacheStore.getIfPresent(appId + DETAIL_SUFFIX); + if(appDetails == null) { + appDetails = this.get(appId); + detailsCacheStore.put(appId, appDetails); + } + }else { + appDetails = this.get(appId); + } + return appDetails; + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsTokenBasedDetailsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsTokenBasedDetailsServiceImpl.java new file mode 100644 index 000000000..78a2c058f --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/AppsTokenBasedDetailsServiceImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.concurrent.TimeUnit; + +import org.dromara.maxkey.entity.apps.AppsTokenBasedDetails; +import org.dromara.maxkey.persistence.mapper.AppsTokenBasedDetailsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; + +@Repository +public class AppsTokenBasedDetailsServiceImpl extends JpaServiceImpl{ + + protected static final Cache detailsCache = + Caffeine.newBuilder() + .expireAfterWrite(30, TimeUnit.MINUTES) + .maximumSize(200000) + .build(); + + public AppsTokenBasedDetails getAppDetails(String id , boolean cached) { + AppsTokenBasedDetails details = null; + if(cached) { + details = detailsCache.getIfPresent(id); + if(details == null) { + details = getMapper().getAppDetails(id); + detailsCache.put(id, details); + } + }else { + details = getMapper().getAppDetails(id); + } + return details; + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfEmailSendersServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfEmailSendersServiceImpl.java new file mode 100644 index 000000000..e847cf43c --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfEmailSendersServiceImpl.java @@ -0,0 +1,30 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + + +import org.dromara.maxkey.entity.cnf.CnfEmailSenders; +import org.dromara.maxkey.persistence.mapper.CnfEmailSendersMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + + +@Repository +public class CnfEmailSendersServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfLdapContextServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfLdapContextServiceImpl.java new file mode 100644 index 000000000..3c5ad1973 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfLdapContextServiceImpl.java @@ -0,0 +1,29 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.cnf.CnfLdapContext; +import org.dromara.maxkey.persistence.mapper.CnfLdapContextMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + + +@Repository +public class CnfLdapContextServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfPasswordPolicyServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfPasswordPolicyServiceImpl.java new file mode 100644 index 000000000..a4f3cf0bd --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfPasswordPolicyServiceImpl.java @@ -0,0 +1,28 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.cnf.CnfPasswordPolicy; +import org.dromara.maxkey.persistence.mapper.CnfPasswordPolicyMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class CnfPasswordPolicyServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfSmsProviderServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfSmsProviderServiceImpl.java new file mode 100644 index 000000000..a050fea70 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/CnfSmsProviderServiceImpl.java @@ -0,0 +1,29 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.cnf.CnfSmsProvider; +import org.dromara.maxkey.persistence.mapper.CnfSmsProviderMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + + +@Repository +public class CnfSmsProviderServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ConnectorsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ConnectorsServiceImpl.java new file mode 100644 index 000000000..2db6069f4 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ConnectorsServiceImpl.java @@ -0,0 +1,28 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.Connectors; +import org.dromara.maxkey.persistence.mapper.ConnectorsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class ConnectorsServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/FileUploadServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/FileUploadServiceImpl.java new file mode 100644 index 000000000..d14796110 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/FileUploadServiceImpl.java @@ -0,0 +1,28 @@ +/* + * Copyright [2021] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.FileUpload; +import org.dromara.maxkey.persistence.mapper.FileUploadMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class FileUploadServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/GroupMemberServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/GroupMemberServiceImpl.java new file mode 100644 index 000000000..6d15d7ab1 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/GroupMemberServiceImpl.java @@ -0,0 +1,77 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; + +import org.dromara.maxkey.entity.idm.GroupMember; +import org.dromara.maxkey.entity.idm.Groups; +import org.dromara.maxkey.entity.idm.UserInfo; +import org.dromara.maxkey.persistence.mapper.GroupMemberMapper; +import org.dromara.mybatis.jpa.entity.JpaPageResults; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +@Repository +public class GroupMemberServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(GroupMemberServiceImpl.class); + + public int addDynamicMember(Groups dynamicGroup) { + return getMapper().addDynamicMember(dynamicGroup); + } + + public int deleteDynamicMember(Groups dynamicGroup) { + return getMapper().deleteDynamicMember(dynamicGroup); + } + + public int deleteByGroupId(String groupId) { + return getMapper().deleteByGroupId(groupId); + } + + public List queryMemberByGroupId(String groupId){ + return getMapper().queryMemberByGroupId(groupId); + } + + + public JpaPageResults noMember(GroupMember entity) { + entity.setPageSelectId(entity.generateId()); + entity.setStartRow(calculateStartRow(entity.getPageNumber() ,entity.getPageSize())); + + entity.setPageable(true); + List resultslist = null; + try { + resultslist = getMapper().noMember(entity); + } catch (Exception e) { + _logger.error("queryPageResults Exception " , e); + } + entity.setPageable(false); + Integer totalPage = resultslist.size(); + + Integer totalCount = 0; + if(entity.getPageNumber() == 1 && totalPage < entity.getPageSize()) { + totalCount = totalPage; + }else { + totalCount = parseCount(getMapper().fetchCount(entity)); + } + + return new JpaPageResults(entity.getPageNumber(),entity.getPageSize(),totalPage,totalCount,resultslist); + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/GroupsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/GroupsServiceImpl.java new file mode 100644 index 000000000..738e23bd7 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/GroupsServiceImpl.java @@ -0,0 +1,111 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.sql.Types; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.dromara.maxkey.constants.ConstsStatus; +import org.dromara.maxkey.entity.Institutions; +import org.dromara.maxkey.entity.idm.Groups; +import org.dromara.maxkey.entity.permissions.Roles; +import org.dromara.maxkey.persistence.mapper.GroupsMapper; +import org.dromara.maxkey.util.StrUtils; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +public class GroupsServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(GroupsServiceImpl.class); + + @Autowired + GroupMemberServiceImpl groupMemberService; + + @Autowired + InstitutionsServiceImpl institutionsService; + + public List queryDynamicGroups(Groups groups){ + return this.getMapper().queryDynamic(groups); + } + + public boolean deleteById(String groupId) { + this.delete(groupId); + groupMemberService.deleteByGroupId(groupId); + return true; + } + + public List queryByUserId(String userId){ + return this.getMapper().queryByUserId(userId); + } + + public void refreshDynamicGroups(Groups dynamicGroup){ + if(dynamicGroup.getCategory().equals(Roles.Category.DYNAMIC)) { + + if(StringUtils.isNotBlank(dynamicGroup.getOrgIdsList())) { + String []orgIds = dynamicGroup.getOrgIdsList().split(","); + StringBuffer orgIdFilters = new StringBuffer(); + for(String orgId : orgIds) { + if(StringUtils.isNotBlank(orgId)) { + if(orgIdFilters.length() > 0) { + orgIdFilters.append(","); + } + orgIdFilters.append("'").append(orgId).append("'"); + } + } + if(orgIdFilters.length() > 0) { + dynamicGroup.setOrgIdsList(orgIdFilters.toString()); + } + } + + String filters = dynamicGroup.getFilters(); + if(StringUtils.isNotBlank(filters)) { + if(StrUtils.filtersSQLInjection(filters.toLowerCase())) { + _logger.info("filters include SQL Injection Attack Risk."); + return; + } + //replace & with AND, | with OR + filters = filters.replace("&", " AND ").replace("|", " OR "); + + dynamicGroup.setFilters(filters); + } + + groupMemberService.deleteDynamicMember(dynamicGroup); + groupMemberService.addDynamicMember(dynamicGroup); + + } + } + + public void refreshAllDynamicGroups(){ + List instList = + institutionsService.find("where status = ? ", new Object[]{ConstsStatus.ACTIVE}, new int[]{Types.INTEGER}); + for(Institutions inst : instList) { + Groups group = new Groups(); + group.setInstId(inst.getId()); + List groupsList = queryDynamicGroups(group); + for(Groups g : groupsList) { + _logger.debug("role {}" , g); + refreshDynamicGroups(g); + } + } + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryConnectorServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryConnectorServiceImpl.java new file mode 100644 index 000000000..0e9cbb880 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryConnectorServiceImpl.java @@ -0,0 +1,28 @@ +/* + * Copyright [2021] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.history.HistoryConnector; +import org.dromara.maxkey.persistence.mapper.HistoryConnectorMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class HistoryConnectorServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryLoginAppsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryLoginAppsServiceImpl.java new file mode 100644 index 000000000..2dfc60df7 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryLoginAppsServiceImpl.java @@ -0,0 +1,54 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.history.HistoryLoginApps; +import org.dromara.maxkey.persistence.mapper.HistoryLoginAppsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class HistoryLoginAppsServiceImpl extends JpaServiceImpl{ + + @Override + public boolean insert(HistoryLoginApps loginAppsHistory){ + //new Thread insert login app history + new Thread(new HistoryLoginAppsRunnable(getMapper(),loginAppsHistory)).start(); + return true; + } + + public class HistoryLoginAppsRunnable implements Runnable{ + + HistoryLoginAppsMapper historyLoginAppsMapper; + + HistoryLoginApps loginAppsHistory; + + public HistoryLoginAppsRunnable(HistoryLoginAppsMapper historyLoginAppsMapper, + HistoryLoginApps loginAppsHistory) { + super(); + this.historyLoginAppsMapper = historyLoginAppsMapper; + this.loginAppsHistory = loginAppsHistory; + } + + @Override + public void run() { + historyLoginAppsMapper.insert(loginAppsHistory); + } + + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryLoginServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryLoginServiceImpl.java new file mode 100644 index 000000000..74bd8c294 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistoryLoginServiceImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.history.HistoryLogin; +import org.dromara.maxkey.persistence.mapper.HistoryLoginMapper; +import org.dromara.mybatis.jpa.entity.JpaPageResults; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class HistoryLoginServiceImpl extends JpaServiceImpl{ + + public JpaPageResults queryOnlineSession(HistoryLogin historyLogin) { + return this.fetchPageResults("queryOnlineSession",historyLogin); + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistorySynchronizerServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistorySynchronizerServiceImpl.java new file mode 100644 index 000000000..43ac8f302 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistorySynchronizerServiceImpl.java @@ -0,0 +1,28 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.history.HistorySynchronizer; +import org.dromara.maxkey.persistence.mapper.HistorySynchronizerMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class HistorySynchronizerServiceImpl extends JpaServiceImpl{ + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistorySystemLogsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistorySystemLogsServiceImpl.java new file mode 100644 index 000000000..eba2d5019 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/HistorySystemLogsServiceImpl.java @@ -0,0 +1,199 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.Accounts; +import org.dromara.maxkey.entity.ChangePassword; + +import java.util.Date; + +import org.dromara.maxkey.entity.Access; +import org.dromara.maxkey.entity.SocialsProvider; +import org.dromara.maxkey.entity.Synchronizers; +import org.dromara.maxkey.entity.history.HistorySystemLogs; +import org.dromara.maxkey.entity.idm.Organizations; +import org.dromara.maxkey.entity.idm.UserInfo; +import org.dromara.maxkey.entity.permissions.Permission; +import org.dromara.maxkey.entity.permissions.Resources; +import org.dromara.maxkey.entity.permissions.RoleMember; +import org.dromara.maxkey.entity.permissions.Roles; +import org.dromara.maxkey.persistence.mapper.HistorySystemLogsMapper; +import org.dromara.maxkey.util.JsonUtils; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +@Repository +public class HistorySystemLogsServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(HistorySystemLogsServiceImpl.class); + + public void insert(String topic,Object entity,String action,String result,UserInfo operator) { + String message = ""; + if(entity != null) { + if(entity instanceof UserInfo userInfo) { + message = buildMsg(userInfo); + }else if(entity instanceof Organizations organization) { + message = buildMsg(organization); + }else if(entity instanceof ChangePassword changePassword) { + message = buildMsg(changePassword); + }else if(entity instanceof Accounts account) { + message = buildMsg(account); + }else if(entity instanceof Roles role) { + message = buildMsg(role); + }else if(entity instanceof RoleMember roleMember) { + message = buildMsg(roleMember); + }else if(entity instanceof Access access) { + message = buildMsg(access); + }else if(entity instanceof Resources resource) { + message = buildMsg(resource); + }else if(entity instanceof Synchronizers synchronizer) { + message = buildMsg(synchronizer); + }else if(entity instanceof SocialsProvider socialsProvider) { + message = buildMsg(socialsProvider); + }else if(entity instanceof Permission permission) { + message = buildMsg(permission); + }else if(entity instanceof String) { + message = entity.toString(); + } + + } + + insert(topic,message,action,result,operator, entity); + } + + public void insert(String topic,String message,String action,String result,UserInfo operator,Object entity) { + HistorySystemLogs systemLog = new HistorySystemLogs(); + systemLog.setId(systemLog.generateId()); + systemLog.setTopic(topic); + systemLog.setMessage(message); + systemLog.setMessageAction(action); + systemLog.setMessageResult(result); + systemLog.setUserId(operator.getId()); + systemLog.setUsername(operator.getUsername()); + systemLog.setDisplayName(operator.getDisplayName()); + systemLog.setInstId(operator.getInstId()); + systemLog.setJsonCotent(JsonUtils.gsonToString(entity)); + systemLog.setExecuteTime(new Date()); + _logger.trace("System Log {}" ,systemLog); + getMapper().insert(systemLog); + } + + public String buildMsg(UserInfo userInfo) { + return new StringBuilder() + .append(userInfo.getDisplayName()) + .append("[") + .append(userInfo.getUsername()) + .append("]") + .toString(); + } + + public String buildMsg(Organizations org) { + return new StringBuilder() + .append(org.getOrgName()) + .append("[") + .append(org.getOrgCode()) + .append("]") + .toString(); + } + + public String buildMsg(Accounts account) { + return new StringBuilder() + .append(account.getRelatedUsername()) + .append("[") + .append(account.getDisplayName()).append(",") + .append(account.getUsername()).append(",") + .append(account.getAppName()) + .append("]") + .toString(); + } + + public String buildMsg(ChangePassword changePassword) { + return new StringBuilder() + .append(changePassword.getDisplayName()) + .append("[") + .append(changePassword.getUsername()) + .append("]") + .toString(); + } + + public String buildMsg(Roles g) { + return new StringBuilder() + .append(g.getRoleName()) + .toString(); + } + + public String buildMsg(RoleMember rm) { + return new StringBuilder() + .append(rm.getRoleName()) + .append("[") + .append(rm.getUsername()).append(",") + .append(rm.getDisplayName()) + .append("]") + .toString(); + } + + public String buildMsg(Access permission) { + return new StringBuilder() + .append(permission.getGroupName()) + .append("[") + .append(permission.getAppName()) + .append("]") + .toString(); + } + + public String buildMsg(Permission privilege) { + return new StringBuilder() + .append(privilege.getGroupId()) + .append("[") + .append(privilege.getResourceId()) + .append("]") + .toString(); + } + + + public String buildMsg(Resources r) { + return new StringBuilder() + .append(r.getResourceName()) + .append("[") + .append(r.getResourceType()) + .append("]") + .toString(); + } + + + public String buildMsg(Synchronizers s) { + return new StringBuilder() + .append(s.getName()) + .append("[") + .append(s.getSourceType()).append(",") + .append(s.getScheduler()).append(",") + .append("]") + .toString(); + } + + public String buildMsg(SocialsProvider s) { + return new StringBuilder() + .append(s.getProviderName()) + .append("[") + .append(s.getProvider()) + .append("]") + .toString(); + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/InstitutionsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/InstitutionsServiceImpl.java new file mode 100644 index 000000000..052a84533 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/InstitutionsServiceImpl.java @@ -0,0 +1,33 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.Institutions; +import org.dromara.maxkey.persistence.mapper.InstitutionsMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + + +@Repository +public class InstitutionsServiceImpl extends JpaServiceImpl{ + + public Institutions findByDomain(String domain) { + return getMapper().findByDomain(domain); + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/OrganizationsCastServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/OrganizationsCastServiceImpl.java new file mode 100644 index 000000000..36b637d59 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/OrganizationsCastServiceImpl.java @@ -0,0 +1,37 @@ +/* + * Copyright [2021] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.OrganizationsCast; +import org.dromara.maxkey.persistence.mapper.OrganizationsCastMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + + +@Repository +public class OrganizationsCastServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(OrganizationsCastServiceImpl.class); + + + public boolean updateCast(OrganizationsCast organizationsCast) { + return getMapper().updateCast(organizationsCast) > 0; + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/OrganizationsServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/OrganizationsServiceImpl.java new file mode 100644 index 000000000..e669c7931 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/OrganizationsServiceImpl.java @@ -0,0 +1,176 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.sql.Types; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.dromara.maxkey.entity.idm.Organizations; +import org.dromara.maxkey.persistence.mapper.OrganizationsMapper; +import org.dromara.maxkey.provision.ProvisionAct; +import org.dromara.maxkey.provision.ProvisionService; +import org.dromara.maxkey.provision.ProvisionTopic; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + + +@Repository +public class OrganizationsServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(OrganizationsServiceImpl.class); + + @Autowired + ProvisionService provisionService; + + @Override + public boolean insert(Organizations organization) { + if(super.insert(organization)){ + provisionService.send( + ProvisionTopic.ORG_TOPIC, organization, ProvisionAct.CREATE); + return true; + } + return false; + } + + @Override + public boolean update(Organizations organization) { + if(super.update(organization)){ + provisionService.send( + ProvisionTopic.ORG_TOPIC, organization, ProvisionAct.UPDATE); + return true; + } + return false; + } + + public void saveOrUpdate(Organizations organization) { + Organizations loadOrg =findOne(" id = ? and instid = ?", + new Object[] { organization.getId(), organization.getInstId() }, + new int[] { Types.VARCHAR, Types.VARCHAR }); + if( loadOrg == null) { + insert(organization); + }else { + organization.setId(organization.getId()); + update(organization); + } + } + public List queryOrgs(Organizations organization){ + return getMapper().queryOrgs(organization); + } + + public boolean delete(Organizations organization) { + if(super.delete(organization.getId())){ + provisionService.send( + ProvisionTopic.ORG_TOPIC, organization, ProvisionAct.DELETE); + return true; + } + return false; + } + + + public void reorgNamePath(String instId) { + _logger.debug("instId {}", instId); + if (StringUtils.isBlank(instId)) { + instId = "1"; + } + + HashMap reorgOrgMap = new HashMap<>(); + List orgList = find(" where instid ='" + instId + "'"); + List originOrgList = new ArrayList<>(); + Organizations rootOrg = null; + for (Organizations org : orgList) { + reorgOrgMap.put(org.getId(), org); + if (isRootOrg(org)) { + rootOrg = org; + } + Organizations cloneOrg = new Organizations(); + BeanUtils.copyProperties(org, cloneOrg); + originOrgList.add(cloneOrg); + } + try { + reorg(reorgOrgMap, orgList, rootOrg); + _logger.debug("reorged ."); + long reorgCount = 0; + for (Organizations originOrg : originOrgList) { + Organizations reorgOrg = reorgOrgMap.get(originOrg.getId()); + _logger.trace("reorged Organization {}", reorgOrg); + if (originOrg.getNamePath() == null || !originOrg.getNamePath().equals(reorgOrg.getNamePath())) { + _logger.debug("update reorgCount {} , Organization {}", ++reorgCount, reorgOrg); + getMapper().updateNamePath(reorgOrg); + } + } + _logger.debug("reorg finished ."); + } catch (Exception e) { + _logger.error("reorgNamePath Exception ", e); + } + } + + boolean isRootOrg(Organizations rootOrg) { + if (rootOrg.getParentId() == null || rootOrg.getParentId().equalsIgnoreCase("-1") + || rootOrg.getParentId().equalsIgnoreCase(rootOrg.getId()) + || rootOrg.getParentId().equalsIgnoreCase(rootOrg.getInstId())) { + return true; + } + return false; + } + + void reorg(HashMap orgMap, List orgList, Organizations rootOrg) { + if (isRootOrg(rootOrg)) { + rootOrg.setCodePath("/" + rootOrg.getId() + "/"); + rootOrg.setNamePath("/" + rootOrg.getOrgName() + "/"); + } else { + Organizations parent = orgMap.get(rootOrg.getParentId()); + rootOrg.setCodePath(parent.getCodePath() + rootOrg.getId() + "/"); + rootOrg.setNamePath(parent.getNamePath() + rootOrg.getOrgName() + "/"); + } + rootOrg.setReorgNamePath(true); + + for (Organizations org : orgList) { + if (org.isReorgNamePath()) + continue; + if (org.getParentId().equalsIgnoreCase(rootOrg.getId())) { + reorg(orgMap, orgList, org); + } + } + } + /** + * 根据数据格式返回数据 + * + * @param cell + * @return + */ + public static String getValue(Cell cell) { + if (cell == null) { + return ""; + } else if (cell.getCellType() == CellType.BOOLEAN) { + return String.valueOf(cell.getBooleanCellValue()); + } else if (cell.getCellType() == CellType.NUMERIC) { + cell.setBlank(); + return String.valueOf(cell.getStringCellValue().trim()); + } else { + return String.valueOf(cell.getStringCellValue().trim()); + } + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/PermissionRoleServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/PermissionRoleServiceImpl.java new file mode 100644 index 000000000..c0b40e551 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/PermissionRoleServiceImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; + +import org.dromara.maxkey.entity.permissions.PermissionRole; +import org.dromara.maxkey.persistence.mapper.PermissionRoleMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +@Repository +public class PermissionRoleServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(PermissionRoleServiceImpl.class); + + + public boolean insertPermissionRoles(List permissionRolesList) { + return getMapper().insertPermissionRoles(permissionRolesList)>0; + } + + public boolean deletePermissionRoles(List permissionRolesList) { + return getMapper().deletePermissionRoles(permissionRolesList)>=0; + } + + public List queryPermissionRoles(PermissionRole permissionRole){ + return getMapper().queryPermissionRoles(permissionRole); + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/PermissionServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/PermissionServiceImpl.java new file mode 100644 index 000000000..9ed22487b --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/PermissionServiceImpl.java @@ -0,0 +1,45 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; + +import org.dromara.maxkey.entity.permissions.Permission; +import org.dromara.maxkey.persistence.mapper.PermissionMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +@Repository +public class PermissionServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(PermissionServiceImpl.class); + + public boolean insertGroupPrivileges(List rolePermissionsList) { + return getMapper().insertGroupPrivileges(rolePermissionsList)>0; + }; + + public boolean deleteGroupPrivileges(List rolePermissionsList) { + return getMapper().deleteGroupPrivileges(rolePermissionsList)>=0; + } + + public List queryGroupPrivileges(Permission rolePermissions){ + return getMapper().queryGroupPrivileges(rolePermissions); + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RegisterServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RegisterServiceImpl.java new file mode 100644 index 000000000..e3734a545 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RegisterServiceImpl.java @@ -0,0 +1,36 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; + +import org.dromara.maxkey.entity.Register; +import org.dromara.maxkey.entity.idm.UserInfo; +import org.dromara.maxkey.persistence.mapper.RegisterMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class RegisterServiceImpl extends JpaServiceImpl{ + + public UserInfo findByEmail(String email){ + List listUserInfo=getMapper().findByEmail(email); + return listUserInfo.size()>0?listUserInfo.get(0):null; + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ReportServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ReportServiceImpl.java new file mode 100644 index 000000000..6e2142ef4 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ReportServiceImpl.java @@ -0,0 +1,64 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.dromara.maxkey.persistence.mapper.ReportMapper; +import org.dromara.mybatis.jpa.entity.JpaEntity; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class ReportServiceImpl extends JpaServiceImpl{ + + public Integer analysisDay(HashMap reportParameter) { + return getMapper().analysisDay(reportParameter); + }; + + public Integer analysisNewUsers(HashMap reportParameter) { + return getMapper().analysisNewUsers(reportParameter); + }; + + public Integer analysisOnlineUsers(HashMap reportParameter) { + return getMapper().analysisOnlineUsers(reportParameter); + }; + + public Integer analysisActiveUsers(HashMap reportParameter) { + return getMapper().analysisActiveUsers(reportParameter); + }; + + public List> analysisDayHour(HashMap reportParameter){ + return getMapper().analysisDayHour(reportParameter); + } + + public List> analysisMonth(HashMap reportParameter){ + return getMapper().analysisMonth(reportParameter); + } + + + public List> analysisBrowser(HashMap reportParameter){ + return getMapper().analysisBrowser(reportParameter); + } + + public List> analysisApp(HashMap reportParameter){ + return getMapper().analysisApp(reportParameter); + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ResourcesServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ResourcesServiceImpl.java new file mode 100644 index 000000000..db7b6679f --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/ResourcesServiceImpl.java @@ -0,0 +1,33 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; + +import org.dromara.maxkey.entity.permissions.Resources; +import org.dromara.maxkey.persistence.mapper.ResourcesMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class ResourcesServiceImpl extends JpaServiceImpl{ + + public List queryResourcesTree(Resources resource){ + return getMapper().fetchPageResults(resource); + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RoleMemberServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RoleMemberServiceImpl.java new file mode 100644 index 000000000..5455350c1 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RoleMemberServiceImpl.java @@ -0,0 +1,78 @@ +/* + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; + +import org.dromara.maxkey.entity.idm.UserInfo; +import org.dromara.maxkey.entity.permissions.RoleMember; +import org.dromara.maxkey.entity.permissions.Roles; +import org.dromara.maxkey.persistence.mapper.RoleMemberMapper; +import org.dromara.mybatis.jpa.entity.JpaPageResults; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +@Repository +public class RoleMemberServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(RoleMemberServiceImpl.class); + + public int addDynamicRoleMember(Roles dynamicGroup) { + return getMapper().addDynamicRoleMember(dynamicGroup); + } + + public int deleteDynamicRoleMember(Roles dynamicGroup) { + return getMapper().deleteDynamicRoleMember(dynamicGroup); + } + + public int deleteByRoleId(String groupId) { + return getMapper().deleteByRoleId(groupId); + } + + public List queryMemberByRoleId(String groupId){ + return getMapper().queryMemberByRoleId(groupId); + } + + + public JpaPageResults rolesNoMember(RoleMember entity) { + entity.setPageSelectId(entity.generateId()); + entity.setStartRow(calculateStartRow(entity.getPageNumber() ,entity.getPageSize())); + + entity.setPageable(true); + List resultslist = null; + try { + resultslist = getMapper().rolesNoMember(entity); + } catch (Exception e) { + _logger.error("fetchPageResults Exception " , e); + } + entity.setPageable(false); + Integer totalPage = resultslist.size(); + + Integer totalCount = 0; + if(entity.getPageNumber() == 1 && totalPage < entity.getPageSize()) { + totalCount = totalPage; + }else { + totalCount = parseCount(getMapper().fetchCount(entity)); + } + + return new JpaPageResults(entity.getPageNumber(),entity.getPageSize(),totalPage,totalCount,resultslist); + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RolesServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RolesServiceImpl.java new file mode 100644 index 000000000..cd3edf110 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/RolesServiceImpl.java @@ -0,0 +1,115 @@ +/* + * Copyright [2024] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +package org.dromara.maxkey.persistence.service.impl; + +import java.sql.Types; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.dromara.maxkey.constants.ConstsStatus; +import org.dromara.maxkey.entity.Institutions; +import org.dromara.maxkey.entity.permissions.Roles; +import org.dromara.maxkey.persistence.mapper.RolesMapper; +import org.dromara.maxkey.util.StrUtils; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +public class RolesServiceImpl extends JpaServiceImpl { + static final Logger _logger = LoggerFactory.getLogger(RolesServiceImpl.class); + + @Autowired + RoleMemberServiceImpl roleMemberService; + + @Autowired + InstitutionsServiceImpl institutionsService; + + + public List queryDynamicRoles(Roles groups){ + return this.getMapper().queryDynamicRoles(groups); + } + + public boolean deleteById(String groupId) { + this.delete(groupId); + roleMemberService.deleteByRoleId(groupId); + return true; + } + + public List queryRolesByUserId(String userId){ + return this.getMapper().queryRolesByUserId(userId); + } + + public void refreshDynamicRoles(Roles dynamicRole){ + if(dynamicRole.getCategory().equals(Roles.Category.DYNAMIC)) { + + if(StringUtils.isNotBlank(dynamicRole.getOrgIdsList())) { + String []orgIds = dynamicRole.getOrgIdsList().split(","); + StringBuffer orgIdFilters = new StringBuffer(); + for(String orgId : orgIds) { + if(StringUtils.isNotBlank(orgId)) { + if(orgIdFilters.length() > 0) { + orgIdFilters.append(","); + } + orgIdFilters.append("'").append(orgId).append("'"); + } + } + if(orgIdFilters.length() > 0) { + dynamicRole.setOrgIdsList(orgIdFilters.toString()); + } + } + + String filters = dynamicRole.getFilters(); + _logger.debug("filters {}" , filters); + if(StringUtils.isNotBlank(filters)) { + if(StrUtils.filtersSQLInjection(filters.toLowerCase())) { + _logger.info("filters include SQL Injection Attack Risk."); + return; + } + //replace & with AND, | with OR + filters = filters.replace("&", " AND ").replace("\\|", " OR "); + + _logger.debug("set filters {}" , filters); + dynamicRole.setFilters(filters); + } + + roleMemberService.deleteDynamicRoleMember(dynamicRole); + roleMemberService.addDynamicRoleMember(dynamicRole); + + } + } + + public void refreshAllDynamicRoles(){ + List instList = + institutionsService.find("where status = ? ", new Object[]{ConstsStatus.ACTIVE}, new int[]{Types.INTEGER}); + for(Institutions inst : instList) { + Roles role = new Roles(); + role.setInstId(inst.getId()); + List rolesList = queryDynamicRoles(role); + for(Roles r : rolesList) { + _logger.debug("role {}" , r); + refreshDynamicRoles(r); + } + } + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SocialsAssociatesServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SocialsAssociatesServiceImpl.java new file mode 100644 index 000000000..b6daedff2 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SocialsAssociatesServiceImpl.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.util.List; + +import org.dromara.maxkey.entity.SocialsAssociate; +import org.dromara.maxkey.entity.idm.UserInfo; +import org.dromara.maxkey.persistence.mapper.SocialsAssociateMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + + +@Repository +public class SocialsAssociatesServiceImpl extends JpaServiceImpl{ + + public List queryByUser(UserInfo user) { + return getMapper().queryByUser(user); + } + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SocialsProviderServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SocialsProviderServiceImpl.java new file mode 100644 index 000000000..257b9561c --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SocialsProviderServiceImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright [2021] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.SocialsProvider; +import org.dromara.maxkey.persistence.mapper.SocialsProviderMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +@Repository +public class SocialsProviderServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(SocialsProviderServiceImpl.class); + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SynchroRelatedServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SynchroRelatedServiceImpl.java new file mode 100644 index 000000000..a30116665 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SynchroRelatedServiceImpl.java @@ -0,0 +1,65 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import java.sql.Types; +import java.util.Date; +import java.util.List; + +import org.dromara.maxkey.entity.SynchroRelated; +import org.dromara.maxkey.entity.Synchronizers; +import org.dromara.maxkey.entity.idm.Organizations; +import org.dromara.maxkey.persistence.mapper.SynchroRelatedMapper; +import org.dromara.maxkey.util.DateUtils; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Repository; + +@Repository +public class SynchroRelatedServiceImpl extends JpaServiceImpl{ + + public int updateSyncTime(SynchroRelated synchroRelated) { + return getMapper().updateSyncTime(synchroRelated); + } + + public List findOrgs(Synchronizers synchronizer) { + return find( + "instid = ? and syncid = ? and objecttype = ? ", + new Object[] { synchronizer.getInstId() ,synchronizer.getId(),Organizations.CLASS_TYPE}, + new int[] { Types.VARCHAR,Types.VARCHAR,Types.VARCHAR} + ); + } + + public SynchroRelated findByOriginId(Synchronizers synchronizer,String originId,String classType) { + return findOne("instid = ? and syncId = ? and originid = ? and objecttype = ? ", + new Object[] { synchronizer.getInstId(),synchronizer.getId(),originId,classType }, + new int[] { Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,Types.VARCHAR}); + } + + public void updateSynchroRelated(Synchronizers synchronizer,SynchroRelated synchroRelated,String classType) { + SynchroRelated loadSynchroRelated = + findByOriginId( + synchronizer,synchroRelated.getOriginId(),classType ); + if(loadSynchroRelated == null) { + insert(synchroRelated); + }else { + synchroRelated.setId(loadSynchroRelated.getId()); + synchroRelated.setSyncTime(DateUtils.formatDateTime(new Date())); + updateSyncTime(synchroRelated); + } + } +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SynchronizersServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SynchronizersServiceImpl.java new file mode 100644 index 000000000..6dc47626c --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/SynchronizersServiceImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright [2021] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + +import org.dromara.maxkey.entity.Synchronizers; +import org.dromara.maxkey.persistence.mapper.SynchronizersMapper; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +@Repository +public class SynchronizersServiceImpl extends JpaServiceImpl{ + static final Logger _logger = LoggerFactory.getLogger(SynchronizersServiceImpl.class); + +} diff --git a/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/UserInfoServiceImpl.java b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/UserInfoServiceImpl.java new file mode 100644 index 000000000..5bfb13045 --- /dev/null +++ b/maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/impl/UserInfoServiceImpl.java @@ -0,0 +1,420 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.dromara.maxkey.persistence.service.impl; + + +import java.sql.Types; +import java.util.Date; + +import org.apache.commons.lang3.StringUtils; +import org.dromara.maxkey.constants.ConstsStatus; +import org.dromara.maxkey.crypto.password.PasswordReciprocal; +import org.dromara.maxkey.entity.Accounts; +import org.dromara.maxkey.entity.ChangePassword; +import org.dromara.maxkey.entity.idm.UserInfo; +import org.dromara.maxkey.persistence.mapper.UserInfoMapper; +import org.dromara.maxkey.persistence.repository.PasswordPolicyValidator; +import org.dromara.maxkey.persistence.service.AccountsService; +import org.dromara.maxkey.provision.ProvisionAct; +import org.dromara.maxkey.provision.ProvisionService; +import org.dromara.maxkey.provision.ProvisionTopic; +import org.dromara.maxkey.web.WebContext; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Repository; + + +/** + * @author Crystal.Sea + * + */ +@Repository +public class UserInfoServiceImpl extends JpaServiceImpl { + static final Logger _logger = LoggerFactory.getLogger(UserInfoServiceImpl.class); + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + PasswordPolicyValidator passwordPolicyValidator; + + @Autowired + ProvisionService provisionService; + + AccountsService accountsService; + + + @Override + public boolean insert(UserInfo userInfo) { + this.passwordEncoder(userInfo); + if (super.insert(userInfo)) { + if(provisionService.getApplicationConfig().isProvisionSupport()) { + UserInfo loadUserInfo = findUserRelated(userInfo.getId()); + provisionService.send( + ProvisionTopic.USERINFO_TOPIC, + loadUserInfo, + ProvisionAct.CREATE); + } + + return true; + } + + return false; + } + + public boolean insert(UserInfo userInfo,boolean passwordEncoder) { + if(passwordEncoder) { + this.passwordEncoder(userInfo); + } + if (super.insert(userInfo)) { + if(provisionService.getApplicationConfig().isProvisionSupport()) { + UserInfo loadUserInfo = findUserRelated(userInfo.getId()); + provisionService.send( + ProvisionTopic.USERINFO_TOPIC, + loadUserInfo, + ProvisionAct.CREATE); + } + + return true; + } + + return false; + } + + @Override + public boolean update(UserInfo userInfo) { + ChangePassword changePassword = this.passwordEncoder(userInfo); + if (super.update(userInfo)) { + if(provisionService.getApplicationConfig().isProvisionSupport()) { + UserInfo loadUserInfo = findUserRelated(userInfo.getId()); + accountUpdate(loadUserInfo); + provisionService.send( + ProvisionTopic.USERINFO_TOPIC, + loadUserInfo, + ProvisionAct.UPDATE); + } + if(userInfo.getPassword() != null) { + changePasswordProvisioning(changePassword); + } + return true; + } + return false; + } + + public boolean delete(UserInfo userInfo) { + UserInfo loadUserInfo = null; + if(provisionService.getApplicationConfig().isProvisionSupport()) { + loadUserInfo = findUserRelated(userInfo.getId()); + } + + if( super.delete(userInfo.getId())){ + provisionService.send( + ProvisionTopic.USERINFO_TOPIC, + loadUserInfo, + ProvisionAct.DELETE); + accountUpdate(loadUserInfo); + return true; + } + return false; + } + + //更新账号状态 + public void accountUpdate(UserInfo userInfo) { + if(userInfo.getStatus() != ConstsStatus.ACTIVE) { + if(accountsService==null) { + accountsService = + WebContext.getBean("accountsService",AccountsService.class); + } + Accounts queryAcount =new Accounts(); + queryAcount.setUserId(userInfo.getId()); + for (Accounts acount : accountsService.query(queryAcount)) { + acount.setStatus(ConstsStatus.INACTIVE); + accountsService.update(acount); + } + } + } + + public UserInfo findUserRelated(String userId) { + UserInfo loadUserInfo =this.get(userId); + loadUserInfo.setDepts(getMapper().findDeptsByUserId(userId)); + return loadUserInfo; + } + + public boolean updateGridList(String gridList,UserInfo userInfo) { + try { + if (gridList != null && !gridList.equals("")) { + userInfo.setGridList(Integer.parseInt(gridList)); + getMapper().updateGridList(userInfo); + } + }catch(Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + + public void saveOrUpdate(UserInfo userInfo) { + UserInfo loadUserInfo = findOne(" username = ? and instid = ?", + new Object[] { userInfo.getUsername(),userInfo.getInstId() }, + new int[] { Types.VARCHAR,Types.VARCHAR}); + if(loadUserInfo == null) { + insert(userInfo); + }else { + userInfo.setId(loadUserInfo.getId()); + userInfo.setPassword(null); + update(userInfo); + } + } + + public boolean updateProtectedApps(UserInfo userinfo) { + try { + userinfo.setModifiedDate(new Date()); + return getMapper().updateProtectedApps(userinfo) > 0; + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + public UserInfo findByUsername(String username) { + return getMapper().findByUsername(username); + } + + public UserInfo findByEmailMobile(String emailMobile) { + return getMapper().findByEmailMobile(emailMobile); + } + + public UserInfo findByAppIdAndUsername(String appId,String username){ + try { + UserInfo userinfo = new UserInfo(); + userinfo.setUsername(username); + return getMapper().findByAppIdAndUsername(userinfo) ; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public ChangePassword passwordEncoder(UserInfo userInfo) { + ChangePassword changePassword = null; + if(StringUtils.isNotBlank(userInfo.getPassword())) { + changePassword = new ChangePassword(userInfo); + passwordEncoder(changePassword); + userInfo.setPassword(changePassword.getPassword()); + userInfo.setDecipherable(changePassword.getDecipherable()); + userInfo.setPasswordLastSetTime(changePassword.getPasswordLastSetTime()); + }else { + userInfo.setPassword(null); + userInfo.setDecipherable(null); + } + return changePassword; + } + + public ChangePassword passwordEncoder(ChangePassword changePassword) { + //密码不为空,则需要进行加密处理 + if(StringUtils.isNotBlank(changePassword.getPassword())) { + String password = passwordEncoder.encode(changePassword.getPassword()); + changePassword.setDecipherable(PasswordReciprocal.getInstance().encode(changePassword.getPassword())); + _logger.debug("decipherable : {}",changePassword.getDecipherable()); + changePassword.setPassword(password); + changePassword.setPasswordLastSetTime(new Date()); + + }else { + changePassword.setPassword(null); + changePassword.setDecipherable(null); + } + return changePassword; + } + + /** + * 认证密码修改 + * @param oldPassword + * @param newPassword + * @param confirmPassword + * @param passwordSetType + * @return + */ + public boolean changePassword( ChangePassword changePassword) { + try { + WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, ""); + UserInfo userInfo = this.findByUsername(changePassword.getUsername()); + if(changePassword.getPassword().equals(changePassword.getConfirmPassword())){ + if(StringUtils.isNotBlank(changePassword.getOldPassword()) && + passwordEncoder.matches(changePassword.getOldPassword(), userInfo.getPassword())){ + if(changePassword(changePassword,true) ){ + return true; + } + return false; + }else { + if(StringUtils.isNotBlank(changePassword.getOldPassword())&& + passwordEncoder.matches(changePassword.getPassword(), userInfo.getPassword())) { + WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, + WebContext.getI18nValue("PasswordPolicy.OLD_PASSWORD_MATCH")); + }else { + WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, + WebContext.getI18nValue("PasswordPolicy.OLD_PASSWORD_NOT_MATCH")); + } + } + }else { + WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, + WebContext.getI18nValue("PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH")); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + /** + * 后台密码修改 + * @param changeUserInfo + * @param passwordPolicy + * @return + */ + public boolean changePassword(ChangePassword changePassword,boolean passwordPolicy) { + try { + _logger.debug("decipherable old : {}" , changePassword.getDecipherable()); + _logger.debug("decipherable new : {}" , PasswordReciprocal.getInstance().encode(changePassword.getDecipherable())); + + if (passwordPolicy && !passwordPolicyValidator.validator(changePassword)) { + return false; + } + + changePassword = passwordEncoder(changePassword); + + if (getMapper().changePassword(changePassword) > 0) { + changePasswordProvisioning(changePassword); + return true; + } + return false; + + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + public String randomPassword() { + return passwordPolicyValidator.generateRandomPassword(); + } + + public void changePasswordProvisioning(ChangePassword changePassworded) { + if(changePassworded !=null && StringUtils.isNotBlank(changePassworded.getPassword())) { + UserInfo loadUserInfo = findByUsername(changePassworded.getUsername()); + ChangePassword changePassword = new ChangePassword(loadUserInfo); + provisionService.send(ProvisionTopic.PASSWORD_TOPIC, changePassword, ProvisionAct.PASSWORD); + } + } + + public boolean updateAppLoginPassword(UserInfo userinfo) { + try { + userinfo.setModifiedDate(new Date()); + return getMapper().updateAppLoginPassword(userinfo) > 0; + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + + /** + * 锁定用户:islock:1 用户解锁 2 用户锁定 + * @param userInfo + */ + public void updateLocked(UserInfo userInfo) { + try { + if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) { + userInfo.setIsLocked(ConstsStatus.LOCK); + getMapper().updateLocked(userInfo); + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + /** + * 用户登录成功后,重置错误密码次数和解锁用户 + * @param userInfo + */ + public void updateLockout(UserInfo userInfo) { + try { + if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) { + userInfo.setIsLocked(ConstsStatus.START); + userInfo.setBadPasswordCount(0); + getMapper().updateLockout(userInfo); + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + /** + * 更新错误密码次数 + * @param userInfo + */ + public void updateBadPasswordCount(UserInfo userInfo) { + try { + if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) { + int updateBadPWDCount = userInfo.getBadPasswordCount() + 1; + userInfo.setBadPasswordCount(updateBadPWDCount); + getMapper().updateBadPWDCount(userInfo); + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + public boolean updateSharedSecret(UserInfo userInfo){ + return getMapper().updateSharedSecret(userInfo)>0; + } + + public boolean updatePasswordQuestion(UserInfo userInfo){ + return getMapper().updatePasswordQuestion(userInfo)>0; + } + + public boolean updateAuthnType(UserInfo userInfo){ + return getMapper().updateAuthnType(userInfo)>0; + } + + public boolean updateEmail(UserInfo userInfo){ + return getMapper().updateEmail(userInfo)>0; + } + + public boolean updateMobile(UserInfo userInfo){ + return getMapper().updateMobile(userInfo)>0; + } + + public int updateProfile(UserInfo userInfo){ + return getMapper().updateProfile(userInfo); + } + + public boolean updateStatus(UserInfo userInfo) { + return getMapper().updateStatus(userInfo) > 0; + } + + public void setPasswordPolicyValidator(PasswordPolicyValidator passwordPolicyValidator) { + this.passwordPolicyValidator = passwordPolicyValidator; + } + +} diff --git a/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/dromara/maxkey/synchronizer/service/SyncJobConfigFieldService.java b/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/dromara/maxkey/synchronizer/service/SyncJobConfigFieldService.java index 136c9349f..bf70ae9a7 100644 --- a/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/dromara/maxkey/synchronizer/service/SyncJobConfigFieldService.java +++ b/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/dromara/maxkey/synchronizer/service/SyncJobConfigFieldService.java @@ -2,42 +2,16 @@ package org.dromara.maxkey.synchronizer.service; import org.dromara.maxkey.entity.SyncJobConfigField; -import org.dromara.maxkey.persistence.mapper.SyncJobConfigFieldMapper; -import org.dromara.mybatis.jpa.JpaService; -import org.springframework.stereotype.Service; - -import java.sql.Types; -import java.util.ArrayList; +import org.dromara.mybatis.jpa.IJpaService; import java.util.List; -@Service -public class SyncJobConfigFieldService extends JpaService { - public SyncJobConfigFieldService() { - super(SyncJobConfigFieldMapper.class); - } - @Override - public SyncJobConfigFieldMapper getMapper() { - return (SyncJobConfigFieldMapper)super.getMapper(); - } +public interface SyncJobConfigFieldService extends IJpaService { - public List findByJobIdAndObjectType(Long jobId, String objectType) { + public List findByJobIdAndObjectType(Long jobId, String objectType) ; - return getMapper().findByJobIdAndObjectType(jobId,objectType); - } + public void deleteFieldMapById(Long id); - public void deleteFieldMapById(Long id){ - ArrayList ids = new ArrayList<>(); - ids.add(String.valueOf(id)); - super.deleteBatch(ids); - } - - public List findByJobId(Long jobId) { - List list = find(" jobid = ?", - new Object[]{jobId}, - new int[]{Types.BIGINT}); - return list; - - } + public List findByJobId(Long jobId) ; } diff --git a/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/dromara/maxkey/synchronizer/service/impl/SyncJobConfigFieldServiceImpl.java b/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/dromara/maxkey/synchronizer/service/impl/SyncJobConfigFieldServiceImpl.java new file mode 100644 index 000000000..2fb9b7fa3 --- /dev/null +++ b/maxkey-synchronizers/maxkey-synchronizer/src/main/java/org/dromara/maxkey/synchronizer/service/impl/SyncJobConfigFieldServiceImpl.java @@ -0,0 +1,37 @@ +package org.dromara.maxkey.synchronizer.service.impl; + +import org.dromara.maxkey.entity.SyncJobConfigField; + +import org.dromara.maxkey.persistence.mapper.SyncJobConfigFieldMapper; +import org.dromara.maxkey.synchronizer.service.SyncJobConfigFieldService; +import org.dromara.mybatis.jpa.service.impl.JpaServiceImpl; +import org.springframework.stereotype.Service; + +import java.sql.Types; +import java.util.ArrayList; +import java.util.List; + +@Service +public class SyncJobConfigFieldServiceImpl extends JpaServiceImpl implements SyncJobConfigFieldService { + + public List findByJobIdAndObjectType(Long jobId, String objectType) { + + return getMapper().findByJobIdAndObjectType(jobId,objectType); + } + + public void deleteFieldMapById(Long id){ + ArrayList ids = new ArrayList<>(); + ids.add(String.valueOf(id)); + super.deleteBatch(ids); + } + + public List findByJobId(Long jobId) { + List list = find(" jobid = ?", + new Object[]{jobId}, + new int[]{Types.BIGINT}); + return list; + + } + + +} diff --git a/setEnvVars.bat b/setEnvVars.bat index f8ad70143..3769e08f2 100644 --- a/setEnvVars.bat +++ b/setEnvVars.bat @@ -1,6 +1,6 @@ echo off echo set env -set JAVA_HOME=C:\IDE\jdk-17.0.2.8 +set JAVA_HOME=C:\ide\jdk-17.0.9+9 set GRADLE_HOME=C:\ide\gradle-8.8 set MXK_VERSION=4.1.2