diff --git a/src/main/java/com/webank/wecross/account/ChainAccountDetails.java b/src/main/java/com/webank/wecross/account/ChainAccountDetails.java index 476e91de5..c0e10c075 100644 --- a/src/main/java/com/webank/wecross/account/ChainAccountDetails.java +++ b/src/main/java/com/webank/wecross/account/ChainAccountDetails.java @@ -13,6 +13,7 @@ public class ChainAccountDetails { private String type; private Boolean isDefault; + private String chainDefault; private String pubKey; private String secKey; @@ -27,6 +28,7 @@ public Map toProperties() { properties.put("keyID", keyID); properties.put("type", type); properties.put("isDefault", isDefault); + properties.put("chainDefault", chainDefault); properties.put("pubKey", pubKey); properties.put("secKey", secKey); properties.put("ext0", ext0); @@ -91,6 +93,16 @@ public void setIsDefault(Boolean aDefault) { isDefault = aDefault; } + @JsonGetter("chainDefault") + public String getChainDefault() { + return chainDefault; + } + + @JsonSetter("chainDefault") + public void setChainDefault(String chainName) { + chainDefault = chainName; + } + public String getPubKey() { return pubKey; } diff --git a/src/main/java/com/webank/wecross/account/UniversalAccount.java b/src/main/java/com/webank/wecross/account/UniversalAccount.java index 23e314d8a..6392b06a9 100644 --- a/src/main/java/com/webank/wecross/account/UniversalAccount.java +++ b/src/main/java/com/webank/wecross/account/UniversalAccount.java @@ -9,6 +9,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,6 +33,45 @@ public class UniversalAccount { private Map type2DefaultAccount = new HashMap<>(); + // make every chain has a default account + private Map chain2DefaultChainAccount = new HashMap<>(); + + // chain name is like "payment.fabric-mychannel" + public Account getChainAccount(String type, String chainName) { + String typeChain = type + ":" + chainName; + return chain2DefaultChainAccount.get(typeChain); + } + + // chain name is like "payment.fabric-mychannel" + public void setDefaultChainAccount(String chainName, Account account) { + String typeChain = account.getType() + ":" + chainName; + chain2DefaultChainAccount.put(typeChain, account); + logger.info("setDefaultChainAccount {} {}", chainName, account); + } + + // this func should be added to utils + public static boolean checkChainName(String chainName) { + if (chainName.length() == 0) { + return false; + } + String regex = "[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_-]+"; + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(chainName); + return m.matches(); + } + + // only use in asyncSendTransaction, asyncCall. maybe asyncCustomCommand can use too. + // if not set default chain account, use the universal default type account. + public Account getSendAccount(String type, String chainName) { + + Account account = getChainAccount(type, chainName); + if (account != null) { + return account; + } + + return getAccount(type); + } + public Account getAccount(String type) { return type2DefaultAccount.get(type); } diff --git a/src/main/java/com/webank/wecross/account/UniversalAccountFactory.java b/src/main/java/com/webank/wecross/account/UniversalAccountFactory.java index 6abf9304a..8f357930b 100644 --- a/src/main/java/com/webank/wecross/account/UniversalAccountFactory.java +++ b/src/main/java/com/webank/wecross/account/UniversalAccountFactory.java @@ -53,6 +53,9 @@ public UniversalAccount buildUA(UADetails uaDetails) throws WeCrossException { if (details.getIsDefault().booleanValue()) { ua.setDefaultAccount(type, account); } + if (UniversalAccount.checkChainName(details.getChainDefault())) { + ua.setDefaultChainAccount(details.getChainDefault(), account); + } } } diff --git a/src/main/java/com/webank/wecross/config/AuthFilterConfig.java b/src/main/java/com/webank/wecross/config/AuthFilterConfig.java index b0ebede8f..b83885818 100644 --- a/src/main/java/com/webank/wecross/config/AuthFilterConfig.java +++ b/src/main/java/com/webank/wecross/config/AuthFilterConfig.java @@ -27,6 +27,7 @@ public AuthFilter newAuthFilter() { remoteAuthFilter.registerAuthUri("/auth/addChainAccount"); remoteAuthFilter.registerAuthUri("/auth/removeChainAccount"); remoteAuthFilter.registerAuthUri("/auth/setDefaultAccount"); + remoteAuthFilter.registerAuthUri("/auth/setDefaultChainAccount"); remoteAuthFilter.registerAuthUri("/auth/listAccount"); remoteAuthFilter.registerAuthUri("/auth/authCode"); remoteAuthFilter.registerAuthUri("/auth/pub"); diff --git a/src/main/java/com/webank/wecross/resource/Resource.java b/src/main/java/com/webank/wecross/resource/Resource.java index 917d5ae9e..7a5e485a8 100644 --- a/src/main/java/com/webank/wecross/resource/Resource.java +++ b/src/main/java/com/webank/wecross/resource/Resource.java @@ -87,7 +87,12 @@ public void asyncCall( return; } - Account account = ua.getAccount(stubType); + // Account account = ua.getAccount(stubType); + Account account = ua.getSendAccount(stubType, path.toChainName()); + logger.info( + "asynCall use account by key: {}, path: {}", + account.getKeyID(), + this.path); // this log only for test TransactionContext context = new TransactionContext(account, this.path, this.resourceInfo, this.blockManager); boolean isRawTransaction = @@ -134,7 +139,12 @@ public void asyncSendTransaction( return; } - Account account = ua.getAccount(stubType); + // Account account = ua.getAccount(stubType); + Account account = ua.getSendAccount(stubType, path.toChainName()); + logger.info( + "asynSendTransaction use account by key: {}, path: {}", + account.getKeyID(), + this.path); // this log only for test TransactionContext context = new TransactionContext(account, this.path, this.resourceInfo, this.blockManager); boolean isRawTransaction = diff --git a/src/main/java/com/webank/wecross/stub/Path.java b/src/main/java/com/webank/wecross/stub/Path.java index 569319c83..3dee80ebf 100644 --- a/src/main/java/com/webank/wecross/stub/Path.java +++ b/src/main/java/com/webank/wecross/stub/Path.java @@ -96,6 +96,16 @@ public String toString() { } } + // compact zone and chain as ChainName + public String toChainName() { + return zone + "." + chain; + } + + // whether in chain + public boolean isInChain(String chainName) { + return chainName.equals(toChainName()); + } + public String toURI() { if (Objects.nonNull(resource)) { return zone + "/" + chain + "/" + resource; diff --git a/src/test/java/com/webank/wecross/test/account/CheckChainNameTest.java b/src/test/java/com/webank/wecross/test/account/CheckChainNameTest.java new file mode 100644 index 000000000..114a44ec2 --- /dev/null +++ b/src/test/java/com/webank/wecross/test/account/CheckChainNameTest.java @@ -0,0 +1,19 @@ +package com.webank.wecross.test.account; + +import com.webank.wecross.account.UniversalAccount; +import org.junit.Assert; +import org.junit.Test; + +public class CheckChainNameTest { + @Test + public void isCheckRight() throws Exception { + Assert.assertTrue(UniversalAccount.checkChainName("") == false); + Assert.assertTrue(UniversalAccount.checkChainName("chainName") == false); + Assert.assertTrue(UniversalAccount.checkChainName("payment.fabric") == true); + Assert.assertTrue(UniversalAccount.checkChainName("payment.fabric-mychannel") == true); + Assert.assertTrue(UniversalAccount.checkChainName("payment.bcos-group1") == true); + Assert.assertTrue( + UniversalAccount.checkChainName("payment.bcos-group2.helloworld") == false); + Assert.assertTrue(UniversalAccount.checkChainName("testbcos-group2") == false); + } +}