From 9e0021db047f1a244bc3c8f9accef39b0591a5f5 Mon Sep 17 00:00:00 2001 From: hujie Date: Mon, 1 Oct 2018 22:20:05 +0800 Subject: [PATCH 01/96] acl-plug rudimentary model --- acl-plug/pom.xml | 30 + .../acl/plug/AccessContralAnalysis.java | 50 ++ .../rocketmq/acl/plug/AclPlugController.java | 30 + .../rocketmq/acl/plug/AclPlugServer.java | 7 + .../rocketmq/acl/plug/AclRemotingServer.java | 14 + .../apache/rocketmq/acl/plug/AclUtils.java | 60 ++ .../rocketmq/acl/plug/Authentication.java | 43 ++ .../plug/DefaultAclRemotingServerImpl.java | 27 + .../EmptyImplementationAclRemotingServer.java | 19 + .../acl/plug/annotation/RequestCode.java | 15 + .../acl/plug/engine/AclPlugEngine.java | 16 + ...enticationInfoManagementAclPlugEngine.java | 85 +++ .../plug/engine/LoginInfoAclPlugEngine.java | 47 ++ .../acl/plug/engine/PlainAclPlugEngine.java | 22 + .../acl/plug/entity/AccessControl.java | 57 ++ .../acl/plug/entity/AuthenticationInfo.java | 56 ++ .../acl/plug/entity/AuthenticationResult.java | 45 ++ .../acl/plug/entity/BorkerAccessControl.java | 634 ++++++++++++++++++ .../entity/BorkerAccessControlTransport.java | 40 ++ .../entity/ControllerParametersEntity.java | 5 + .../rocketmq/acl/plug/entity/LoginInfo.java | 55 ++ .../entity/LoginOrRequestAccessControl.java | 39 ++ .../strategy/AbstractNetaddressStrategy.java | 11 + .../strategy/MultipleNetaddressStrategy.java | 25 + .../acl/plug/strategy/NetaddressStrategy.java | 9 + .../strategy/NetaddressStrategyFactory.java | 31 + .../plug/strategy/NullNetaddressStrategy.java | 15 + .../plug/strategy/OneNetaddressStrategy.java | 19 + .../strategy/RangeNetaddressStrategy.java | 69 ++ .../acl/plug/AccessContralAnalysisTest.java | 17 + .../plug/engine/PlainAclPlugEngineTest.java | 12 + acl-plug/src/test/resources/transport.yml | 19 + broker/pom.xml | 168 ++--- .../rocketmq/broker/BrokerController.java | 44 ++ .../apache/rocketmq/common/BrokerConfig.java | 12 + distribution/conf/broker.conf | 2 + .../rocketmq/example/simple/PullConsumer.java | 4 +- .../example/simple/PullConsumerTest.java | 1 + pom.xml | 10 +- 39 files changed, 1776 insertions(+), 88 deletions(-) create mode 100644 acl-plug/pom.xml create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/EmptyImplementationAclRemotingServer.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java create mode 100644 acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java create mode 100644 acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java create mode 100644 acl-plug/src/test/resources/transport.yml diff --git a/acl-plug/pom.xml b/acl-plug/pom.xml new file mode 100644 index 0000000000..540f0efb43 --- /dev/null +++ b/acl-plug/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + org.apache.rocketmq + rocketmq-all + 4.4.0-SNAPSHOT + + rocketmq-acl-plug + rocketmq-acl-plug ${project.version} + + http://maven.apache.org + + UTF-8 + + + + org.yaml + snakeyaml + 1.19 + + + org.apache.commons + commons-lang3 + + + diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java new file mode 100644 index 0000000000..225d8bc44d --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java @@ -0,0 +1,50 @@ +package org.apache.rocketmq.acl.plug; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.rocketmq.acl.plug.annotation.RequestCode; +import org.apache.rocketmq.acl.plug.entity.AccessControl; + +public class AccessContralAnalysis { + + private Map, Map> classTocodeAndMentod = new HashMap<>(); + + public Map analysis(AccessControl accessControl) { + Class clazz = accessControl.getClass(); + Map codeAndField = classTocodeAndMentod.get(clazz); + if (codeAndField == null) { + codeAndField = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + RequestCode requestCode = field.getAnnotation(RequestCode.class); + if (requestCode != null) { + int code = requestCode.code(); + if (codeAndField.containsKey(code)) { + + } else { + field.setAccessible(true); + codeAndField.put(code, field); + } + } + + } + classTocodeAndMentod.put(clazz, codeAndField); + } + Iterator> it = codeAndField.entrySet().iterator(); + Map authority = new HashMap<>(); + try { + while (it.hasNext()) { + Entry e = it.next(); + authority.put(e.getKey(), (Boolean)e.getValue().get(accessControl)); + } + } catch (IllegalArgumentException | IllegalAccessException e1) { + e1.printStackTrace(); + } + return authority; + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java new file mode 100644 index 0000000000..7dd3c21910 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java @@ -0,0 +1,30 @@ +package org.apache.rocketmq.acl.plug; + +import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; +import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; +import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; + +public class AclPlugController { + + + private ControllerParametersEntity controllerParametersEntity; + + private AclPlugEngine aclPlugEngine; + + private AclRemotingServer aclRemotingServer; + + public AclPlugController(ControllerParametersEntity controllerParametersEntity){ + this.controllerParametersEntity = controllerParametersEntity; + aclPlugEngine = new PlainAclPlugEngine(); + aclRemotingServer = new DefaultAclRemotingServerImpl(aclPlugEngine); + } + + public AclRemotingServer getAclRemotingServer() { + return this.aclRemotingServer; + } + + + public boolean isStartSucceed() { + return true; + } +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java new file mode 100644 index 0000000000..0635bf3a9f --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java @@ -0,0 +1,7 @@ +package org.apache.rocketmq.acl.plug; + +public class AclPlugServer { + + + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java new file mode 100644 index 0000000000..c8def943b3 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java @@ -0,0 +1,14 @@ +package org.apache.rocketmq.acl.plug; + +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; + +public interface AclRemotingServer { + + + public AuthenticationInfo login(); + + + public AuthenticationInfo eachCheck(LoginOrRequestAccessControl accessControl); + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java new file mode 100644 index 0000000000..39d2b3405d --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java @@ -0,0 +1,60 @@ +package org.apache.rocketmq.acl.plug; + +import org.apache.commons.lang3.StringUtils; + +public class AclUtils { + + + public static String[] getAddreeStrArray(String netaddress ,String four ) { + String[] fourStrArray = StringUtils.split(four.substring(1, four.length()-1) , ","); + String address = netaddress.substring(0, netaddress.indexOf("{") ); + String[] addreeStrArray = new String[ fourStrArray.length ]; + for(int i = 0 ; i < fourStrArray.length ; i++) { + addreeStrArray[i] = address+fourStrArray[i]; + } + return addreeStrArray; + } + + public static boolean isScope(String num, int index) { + String[] strArray = StringUtils.split(num , "."); + if(strArray.length != 4) { + return false; + } + return isScope(strArray, index); + + } + + public static boolean isScope(String[] num, int index) { + if (num.length <= index) { + + } + for (int i = 0; i < index; i++) { + if( !isScope(num[i])) { + return false; + } + } + return true; + + } + + public static boolean isScope(String num) { + return isScope(Integer.valueOf(num.trim())); + } + + public static boolean isScope(int num) { + return num >= 0 && num <= 255; + } + + public static boolean isAsterisk(String asterisk) { + return asterisk.indexOf('*') > -1; + } + + public static boolean isColon(String colon) { + return colon.indexOf(',') > -1; + } + + public static boolean isMinus(String minus) { + return minus.indexOf('-') > -1; + + } +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java new file mode 100644 index 0000000000..08b82d9917 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java @@ -0,0 +1,43 @@ +package org.apache.rocketmq.acl.plug; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; + +public class Authentication { + + public boolean authentication(AuthenticationInfo authenticationInfo, LoginOrRequestAccessControl loginOrRequestAccessControl,AuthenticationResult authenticationResult) { + int code = loginOrRequestAccessControl.getCode(); + if (authenticationInfo.getAuthority().get(code)) { + AccessControl accessControl = authenticationInfo.getAccessControl(); + if( !(accessControl instanceof BorkerAccessControl)) { + return true; + } + BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); + String topicName = loginOrRequestAccessControl.getTopic(); + if (code == 10 || code == 310 || code == 320) { + if (borker.getPermitSendTopic().contains(topicName)) { + return true; + } + if (borker.getNoPermitSendTopic().contains(topicName)) { + authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); + return false; + } + return true; + } else if (code == 11) { + if (borker.getPermitPullTopic().contains(topicName)) { + return true; + } + if (borker.getNoPermitPullTopic().contains(topicName)) { + authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); + return false; + } + return true; + } + return true; + } + return false; + } +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java new file mode 100644 index 0000000000..b8cb930f62 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java @@ -0,0 +1,27 @@ +package org.apache.rocketmq.acl.plug; + +import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; + +public class DefaultAclRemotingServerImpl implements AclRemotingServer { + + private AclPlugEngine aclPlugEngine; + + public DefaultAclRemotingServerImpl(AclPlugEngine aclPlugEngine ) { + this.aclPlugEngine = aclPlugEngine; + } + + @Override + public AuthenticationInfo login() { + + return null; + } + + @Override + public AuthenticationInfo eachCheck(LoginOrRequestAccessControl accessControl) { + aclPlugEngine.eachCheckLoginAndAuthentication(accessControl); + return null; + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/EmptyImplementationAclRemotingServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/EmptyImplementationAclRemotingServer.java new file mode 100644 index 0000000000..86923817ae --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/EmptyImplementationAclRemotingServer.java @@ -0,0 +1,19 @@ +package org.apache.rocketmq.acl.plug; + +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; + +public class EmptyImplementationAclRemotingServer implements AclRemotingServer { + + @Override + public AuthenticationInfo login() { + + return null; + } + + @Override + public AuthenticationInfo eachCheck() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java new file mode 100644 index 0000000000..b6afc91c43 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java @@ -0,0 +1,15 @@ +package org.apache.rocketmq.acl.plug.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface RequestCode { + + int code(); +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java new file mode 100644 index 0000000000..8b40247266 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java @@ -0,0 +1,16 @@ +package org.apache.rocketmq.acl.plug.engine; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.LoginInfo; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; + +public interface AclPlugEngine { + + public AuthenticationInfo getAccessControl(AccessControl accessControl) ; + + public LoginInfo getLoginInfo(AccessControl accessControl) ; + + public AuthenticationResult eachCheckLoginAndAuthentication(LoginOrRequestAccessControl accessControl); +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java new file mode 100644 index 0000000000..f42057beb6 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -0,0 +1,85 @@ +package org.apache.rocketmq.acl.plug.engine; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.rocketmq.acl.plug.AccessContralAnalysis; +import org.apache.rocketmq.acl.plug.Authentication; +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; +import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; +import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; + +public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPlugEngine { + + + private Map> accessControlMap = new HashMap<>(); + + private AuthenticationInfo authenticationInfo; + + private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); + + private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + + private Authentication authentication = new Authentication(); + + public void setAccessControl(AccessControl accessControl) { + try { + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); + if(accessControlAddressMap == null ) { + accessControlAddressMap = new HashMap<>(); + accessControlMap.put(accessControl.getAccount(), accessControlAddressMap); + } + accessControlAddressMap.put(accessControl.getNetaddress(), new AuthenticationInfo(accessContralAnalysis.analysis(accessControl),accessControl ,netaddressStrategy)); + }catch(Exception e) { + // TODO Exception + } + } + + public void setAccessControlList(List AccessControlList) { + for(AccessControl accessControl : AccessControlList) { + setAccessControl(accessControl); + } + } + + + public void setNetaddressAccessControl(AccessControl accessControl) { + authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl) , accessControl, netaddressStrategyFactory.getNetaddressStrategy(accessControl)); + } + + public AuthenticationInfo getAccessControl(AccessControl accessControl) { + AuthenticationInfo existing = null; + if( accessControl.getAccount() == null && authenticationInfo != null) { + existing = authenticationInfo.getNetaddressStrategy().match(accessControl)?authenticationInfo:null; + }else { + Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); + if(accessControlAddressMap != null ) { + existing = accessControlAddressMap.get(accessControl.getNetaddress()); + if(existing.getAccessControl().getPassword().equals(accessControl.getPassword())) { + if( existing.getNetaddressStrategy().match(accessControl)) { + return existing; + } + } + existing = null; + } + } + return existing; + } + + @Override + public AuthenticationResult eachCheckLoginAndAuthentication(LoginOrRequestAccessControl accessControl) { + AuthenticationResult authenticationResult = new AuthenticationResult(); + AuthenticationInfo authenticationInfo = getAuthenticationInfo(accessControl , authenticationResult); + if(authenticationInfo != null) { + boolean boo = authentication.authentication(authenticationInfo, accessControl,authenticationResult); + authenticationResult.setSucceed( boo ); + } + return authenticationResult; + } + + protected abstract AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl , AuthenticationResult authenticationResult); +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java new file mode 100644 index 0000000000..1e8263f3d1 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java @@ -0,0 +1,47 @@ +package org.apache.rocketmq.acl.plug.engine; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.LoginInfo; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; + +public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagementAclPlugEngine { + + private Map loginInfoMap = new ConcurrentHashMap<>(); + + @Override + public AuthenticationInfo getAccessControl(AccessControl accessControl) { + AuthenticationInfo authenticationInfo = super.getAccessControl(accessControl); + LoginInfo loginInfo = new LoginInfo(); + loginInfo.setAuthenticationInfo(authenticationInfo); + loginInfoMap.put(accessControl.getRecognition(), loginInfo); + return authenticationInfo; + } + + public LoginInfo getLoginInfo(AccessControl accessControl) { + LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); + if (loginInfo == null) { + getAccessControl(accessControl); + loginInfo = loginInfoMap.get(accessControl.getRecognition()); + } + if (loginInfo != null) { + loginInfo.setOperationTime(System.currentTimeMillis()); + } + return loginInfo; + } + + + protected AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl , AuthenticationResult authenticationResult) { + LoginInfo anthenticationInfo = getLoginInfo(accessControl); + if(anthenticationInfo != null) { + return anthenticationInfo.getAuthenticationInfo(); + }else { + authenticationResult.setResultString("Login information does not exist"); + } + return null; + } +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java new file mode 100644 index 0000000000..c57fbda302 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -0,0 +1,22 @@ +package org.apache.rocketmq.acl.plug.engine; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; +import org.yaml.snakeyaml.Yaml; + +public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { + + public PlainAclPlugEngine() { + init(); + } + + void init() { + Yaml ymal = new Yaml(); + BorkerAccessControlTransport transport = ymal.loadAs(PlainAclPlugEngine.class.getClassLoader().getResourceAsStream( "transport.yml"), BorkerAccessControlTransport.class); + super.setNetaddressAccessControl(transport.getOnlyNetAddress()); + for(AccessControl accessControl : transport.getList()) { + super.setAccessControl(accessControl); + } + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java new file mode 100644 index 0000000000..1169a31b2a --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java @@ -0,0 +1,57 @@ +package org.apache.rocketmq.acl.plug.entity; + +public class AccessControl { + + private String account; + + private String password; + + private String netaddress; + + private String recognition; + + public AccessControl() { + } + + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNetaddress() { + return netaddress; + } + + public void setNetaddress(String netaddress) { + this.netaddress = netaddress; + } + + public String getRecognition() { + return recognition; + } + + public void setRecognition(String recognition) { + this.recognition = recognition; + } + + @Override + public String toString() { + return "AccessControl [account=" + account + ", password=" + password + ", netaddress=" + netaddress + + ", recognition=" + recognition + "]"; + } + + + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java new file mode 100644 index 0000000000..a12b2ff97a --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java @@ -0,0 +1,56 @@ +package org.apache.rocketmq.acl.plug.entity; + +import java.util.Map; + +import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; + +public class AuthenticationInfo { + + private AccessControl accessControl; + + private NetaddressStrategy netaddressStrategy; + + private Map authority; + + public AuthenticationInfo(Map authority , AccessControl accessControl, NetaddressStrategy netaddressStrategy) { + super(); + this.authority = authority; + this.accessControl = accessControl; + this.netaddressStrategy = netaddressStrategy; + } + + public AccessControl getAccessControl() { + return accessControl; + } + + public void setAccessControl(AccessControl accessControl) { + this.accessControl = accessControl; + } + + public NetaddressStrategy getNetaddressStrategy() { + return netaddressStrategy; + } + + public void setNetaddressStrategy(NetaddressStrategy netaddressStrategy) { + this.netaddressStrategy = netaddressStrategy; + } + + + + public Map getAuthority() { + return authority; + } + + public void setAuthority(Map authority) { + this.authority = authority; + } + + @Override + public String toString() { + return "AuthenticationInfo [accessControl=" + accessControl + ", netaddressStrategy=" + netaddressStrategy + + ", authority=" + authority + "]"; + } + + + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java new file mode 100644 index 0000000000..668e74dbbe --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java @@ -0,0 +1,45 @@ +package org.apache.rocketmq.acl.plug.entity; + +public class AuthenticationResult { + + private AccessControl accessControl; + + private boolean succeed; + + private Exception exception; + + private String resultString; + + public AccessControl getAccessControl() { + return accessControl; + } + + public void setAccessControl(AccessControl accessControl) { + this.accessControl = accessControl; + } + + public boolean isSucceed() { + return succeed; + } + + public void setSucceed(boolean succeed) { + this.succeed = succeed; + } + + public Exception getException() { + return exception; + } + + public void setException(Exception exception) { + this.exception = exception; + } + + public String getResultString() { + return resultString; + } + + public void setResultString(String resultString) { + this.resultString = resultString; + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java new file mode 100644 index 0000000000..1780617be2 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java @@ -0,0 +1,634 @@ +package org.apache.rocketmq.acl.plug.entity; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.rocketmq.acl.plug.annotation.RequestCode; + +/** + * @author Administrator + * + */ +public class BorkerAccessControl extends AccessControl{ + + public BorkerAccessControl() { + + } + + + private Set permitSendTopic = new HashSet<>(); + + private Set noPermitSendTopic = new HashSet<>(); + + private Set permitPullTopic = new HashSet<>(); + + private Set noPermitPullTopic = new HashSet<>(); + + @RequestCode(code = 10) + private boolean sendMessage = true; + + @RequestCode(code = 310) + private boolean sendMessageV2 = true; + + @RequestCode(code = 320) + private boolean sendBatchMessage = true; + + @RequestCode(code = 36) + private boolean consumerSendMsgBack = true; + + @RequestCode(code = 11) + private boolean pullMessage = true; + + @RequestCode(code = 12) + private boolean queryMessage = true; + + @RequestCode(code = 33) + private boolean viewMessageById = true; + + @RequestCode(code = 34) + private boolean heartBeat = true; + + @RequestCode(code = 35) + private boolean unregisterClient = true; + + @RequestCode(code = 46) + private boolean checkClientConfig = true; + + @RequestCode(code = 38) + private boolean getConsumerListByGroup = true; + + @RequestCode(code = 15) + private boolean updateConsumerOffset = true; + + @RequestCode(code = 14) + private boolean queryConsumerOffset = true; + + @RequestCode(code = 37) + private boolean endTransaction = true; + + @RequestCode(code = 17) + private boolean updateAndCreateTopic = true; + + @RequestCode(code = 215) + private boolean deleteTopicInbroker =true; + + @RequestCode(code = 21) + private boolean getAllTopicConfig = true; + + @RequestCode(code = 25) + private boolean updateBrokerConfig = true; + + @RequestCode(code = 26) + private boolean getBrokerConfig = true; + + @RequestCode(code = 29) + private boolean searchOffsetByTimestamp = true; + + @RequestCode(code = 30) + private boolean getMaxOffset = true; + + @RequestCode(code = 31) + private boolean getMixOffset = true; + + @RequestCode(code = 32) + private boolean getEarliestMsgStoretime = true; + + @RequestCode(code = 28) + private boolean getBrokerRuntimeInfo = true; + + @RequestCode(code = 41) + private boolean lockBatchMQ = true; + + @RequestCode(code = 42) + private boolean unlockBatchMQ = true; + + @RequestCode(code = 200) + private boolean updateAndCreteSubscriptiongroup = true; + + @RequestCode(code = 201) + private boolean getAllSubscriptiongroupConfig = true; + + @RequestCode(code = 207) + private boolean deleteSubscriptiongroup = true; + + @RequestCode(code = 202) + private boolean getTopicStatsInfo = true; + + @RequestCode(code = 203) + private boolean getConsumerConnectionList = true; + + @RequestCode(code = 204) + private boolean getProducerConnectionList = true; + + @RequestCode(code = 208) + private boolean getConsumeStats = true; + + @RequestCode(code = 43) + private boolean getAllConsumerOffset = true; + + @RequestCode(code = 25) + private boolean getAllDelayOffset = true; + + @RequestCode(code = 222) + private boolean invokeBrokerToresetOffset = true; + + @RequestCode(code = 300) + private boolean queryTopicConsumByWho = true; + + @RequestCode(code = 301) + private boolean registerFilterServer = true; + + @RequestCode(code = 303) + private boolean queryConsumeTimeSpan = true; + + @RequestCode(code = 305) + private boolean getSystemTopicListFromBroker = true; + + @RequestCode(code = 306) + private boolean cleanExpiredConsumequeue = true; + + @RequestCode(code = 316) + private boolean cleanUnusedTopic = true; + + @RequestCode(code = 307) + private boolean getConsumerRunningInfo = true; + + @RequestCode(code = 308) + private boolean queryCorrectionOffset = true; + + @RequestCode(code = 309) + private boolean consumeMessageDirectly = true; + + @RequestCode(code = 314) + private boolean cloneGroupOffset = true; + + @RequestCode(code = 315) + private boolean viewBrokerStatsData = true; + + @RequestCode(code = 317) + private boolean getBrokerConsumeStats = true; + + @RequestCode(code = 321) + private boolean queryConsumeQueue = true; + + + + + public Set getPermitSendTopic() { + return permitSendTopic; + } + + public void setPermitSendTopic(Set permitSendTopic) { + this.permitSendTopic = permitSendTopic; + } + + public Set getNoPermitSendTopic() { + return noPermitSendTopic; + } + + public void setNoPermitSendTopic(Set noPermitSendTopic) { + this.noPermitSendTopic = noPermitSendTopic; + } + + public Set getPermitPullTopic() { + return permitPullTopic; + } + + public void setPermitPullTopic(Set permitPullTopic) { + this.permitPullTopic = permitPullTopic; + } + + public Set getNoPermitPullTopic() { + return noPermitPullTopic; + } + + public void setNoPermitPullTopic(Set noPermitPullTopic) { + this.noPermitPullTopic = noPermitPullTopic; + } + + public boolean isSendMessage() { + return sendMessage; + } + + public void setSendMessage(boolean sendMessage) { + this.sendMessage = sendMessage; + } + + public boolean isSendMessageV2() { + return sendMessageV2; + } + + public void setSendMessageV2(boolean sendMessageV2) { + this.sendMessageV2 = sendMessageV2; + } + + public boolean isSendBatchMessage() { + return sendBatchMessage; + } + + public void setSendBatchMessage(boolean sendBatchMessage) { + this.sendBatchMessage = sendBatchMessage; + } + + public boolean isConsumerSendMsgBack() { + return consumerSendMsgBack; + } + + public void setConsumerSendMsgBack(boolean consumerSendMsgBack) { + this.consumerSendMsgBack = consumerSendMsgBack; + } + + public boolean isPullMessage() { + return pullMessage; + } + + public void setPullMessage(boolean pullMessage) { + this.pullMessage = pullMessage; + } + + public boolean isQueryMessage() { + return queryMessage; + } + + public void setQueryMessage(boolean queryMessage) { + this.queryMessage = queryMessage; + } + + public boolean isViewMessageById() { + return viewMessageById; + } + + public void setViewMessageById(boolean viewMessageById) { + this.viewMessageById = viewMessageById; + } + + public boolean isHeartBeat() { + return heartBeat; + } + + public void setHeartBeat(boolean heartBeat) { + this.heartBeat = heartBeat; + } + + public boolean isUnregisterClient() { + return unregisterClient; + } + + public void setUnregisterClient(boolean unregisterClient) { + this.unregisterClient = unregisterClient; + } + + public boolean isCheckClientConfig() { + return checkClientConfig; + } + + public void setCheckClientConfig(boolean checkClientConfig) { + this.checkClientConfig = checkClientConfig; + } + + public boolean isGetConsumerListByGroup() { + return getConsumerListByGroup; + } + + public void setGetConsumerListByGroup(boolean getConsumerListByGroup) { + this.getConsumerListByGroup = getConsumerListByGroup; + } + + public boolean isUpdateConsumerOffset() { + return updateConsumerOffset; + } + + public void setUpdateConsumerOffset(boolean updateConsumerOffset) { + this.updateConsumerOffset = updateConsumerOffset; + } + + public boolean isQueryConsumerOffset() { + return queryConsumerOffset; + } + + public void setQueryConsumerOffset(boolean queryConsumerOffset) { + this.queryConsumerOffset = queryConsumerOffset; + } + + public boolean isEndTransaction() { + return endTransaction; + } + + public void setEndTransaction(boolean endTransaction) { + this.endTransaction = endTransaction; + } + + public boolean isUpdateAndCreateTopic() { + return updateAndCreateTopic; + } + + public void setUpdateAndCreateTopic(boolean updateAndCreateTopic) { + this.updateAndCreateTopic = updateAndCreateTopic; + } + + public boolean isDeleteTopicInbroker() { + return deleteTopicInbroker; + } + + public void setDeleteTopicInbroker(boolean deleteTopicInbroker) { + this.deleteTopicInbroker = deleteTopicInbroker; + } + + public boolean isGetAllTopicConfig() { + return getAllTopicConfig; + } + + public void setGetAllTopicConfig(boolean getAllTopicConfig) { + this.getAllTopicConfig = getAllTopicConfig; + } + + public boolean isUpdateBrokerConfig() { + return updateBrokerConfig; + } + + public void setUpdateBrokerConfig(boolean updateBrokerConfig) { + this.updateBrokerConfig = updateBrokerConfig; + } + + public boolean isGetBrokerConfig() { + return getBrokerConfig; + } + + public void setGetBrokerConfig(boolean getBrokerConfig) { + this.getBrokerConfig = getBrokerConfig; + } + + public boolean isSearchOffsetByTimestamp() { + return searchOffsetByTimestamp; + } + + public void setSearchOffsetByTimestamp(boolean searchOffsetByTimestamp) { + this.searchOffsetByTimestamp = searchOffsetByTimestamp; + } + + public boolean isGetMaxOffset() { + return getMaxOffset; + } + + public void setGetMaxOffset(boolean getMaxOffset) { + this.getMaxOffset = getMaxOffset; + } + + public boolean isGetMixOffset() { + return getMixOffset; + } + + public void setGetMixOffset(boolean getMixOffset) { + this.getMixOffset = getMixOffset; + } + + public boolean isGetEarliestMsgStoretime() { + return getEarliestMsgStoretime; + } + + public void setGetEarliestMsgStoretime(boolean getEarliestMsgStoretime) { + this.getEarliestMsgStoretime = getEarliestMsgStoretime; + } + + public boolean isGetBrokerRuntimeInfo() { + return getBrokerRuntimeInfo; + } + + public void setGetBrokerRuntimeInfo(boolean getBrokerRuntimeInfo) { + this.getBrokerRuntimeInfo = getBrokerRuntimeInfo; + } + + public boolean isLockBatchMQ() { + return lockBatchMQ; + } + + public void setLockBatchMQ(boolean lockBatchMQ) { + this.lockBatchMQ = lockBatchMQ; + } + + public boolean isUnlockBatchMQ() { + return unlockBatchMQ; + } + + public void setUnlockBatchMQ(boolean unlockBatchMQ) { + this.unlockBatchMQ = unlockBatchMQ; + } + + public boolean isUpdateAndCreteSubscriptiongroup() { + return updateAndCreteSubscriptiongroup; + } + + public void setUpdateAndCreteSubscriptiongroup(boolean updateAndCreteSubscriptiongroup) { + this.updateAndCreteSubscriptiongroup = updateAndCreteSubscriptiongroup; + } + + public boolean isGetAllSubscriptiongroupConfig() { + return getAllSubscriptiongroupConfig; + } + + public void setGetAllSubscriptiongroupConfig(boolean getAllSubscriptiongroupConfig) { + this.getAllSubscriptiongroupConfig = getAllSubscriptiongroupConfig; + } + + public boolean isDeleteSubscriptiongroup() { + return deleteSubscriptiongroup; + } + + public void setDeleteSubscriptiongroup(boolean deleteSubscriptiongroup) { + this.deleteSubscriptiongroup = deleteSubscriptiongroup; + } + + public boolean isGetTopicStatsInfo() { + return getTopicStatsInfo; + } + + public void setGetTopicStatsInfo(boolean getTopicStatsInfo) { + this.getTopicStatsInfo = getTopicStatsInfo; + } + + public boolean isGetConsumerConnectionList() { + return getConsumerConnectionList; + } + + public void setGetConsumerConnectionList(boolean getConsumerConnectionList) { + this.getConsumerConnectionList = getConsumerConnectionList; + } + + public boolean isGetProducerConnectionList() { + return getProducerConnectionList; + } + + public void setGetProducerConnectionList(boolean getProducerConnectionList) { + this.getProducerConnectionList = getProducerConnectionList; + } + + public boolean isGetConsumeStats() { + return getConsumeStats; + } + + public void setGetConsumeStats(boolean getConsumeStats) { + this.getConsumeStats = getConsumeStats; + } + + public boolean isGetAllConsumerOffset() { + return getAllConsumerOffset; + } + + public void setGetAllConsumerOffset(boolean getAllConsumerOffset) { + this.getAllConsumerOffset = getAllConsumerOffset; + } + + public boolean isGetAllDelayOffset() { + return getAllDelayOffset; + } + + public void setGetAllDelayOffset(boolean getAllDelayOffset) { + this.getAllDelayOffset = getAllDelayOffset; + } + + public boolean isInvokeBrokerToresetOffset() { + return invokeBrokerToresetOffset; + } + + public void setInvokeBrokerToresetOffset(boolean invokeBrokerToresetOffset) { + this.invokeBrokerToresetOffset = invokeBrokerToresetOffset; + } + + public boolean isQueryTopicConsumByWho() { + return queryTopicConsumByWho; + } + + public void setQueryTopicConsumByWho(boolean queryTopicConsumByWho) { + this.queryTopicConsumByWho = queryTopicConsumByWho; + } + + public boolean isRegisterFilterServer() { + return registerFilterServer; + } + + public void setRegisterFilterServer(boolean registerFilterServer) { + this.registerFilterServer = registerFilterServer; + } + + public boolean isQueryConsumeTimeSpan() { + return queryConsumeTimeSpan; + } + + public void setQueryConsumeTimeSpan(boolean queryConsumeTimeSpan) { + this.queryConsumeTimeSpan = queryConsumeTimeSpan; + } + + public boolean isGetSystemTopicListFromBroker() { + return getSystemTopicListFromBroker; + } + + public void setGetSystemTopicListFromBroker(boolean getSystemTopicListFromBroker) { + this.getSystemTopicListFromBroker = getSystemTopicListFromBroker; + } + + public boolean isCleanExpiredConsumequeue() { + return cleanExpiredConsumequeue; + } + + public void setCleanExpiredConsumequeue(boolean cleanExpiredConsumequeue) { + this.cleanExpiredConsumequeue = cleanExpiredConsumequeue; + } + + public boolean isCleanUnusedTopic() { + return cleanUnusedTopic; + } + + public void setCleanUnusedTopic(boolean cleanUnusedTopic) { + this.cleanUnusedTopic = cleanUnusedTopic; + } + + public boolean isGetConsumerRunningInfo() { + return getConsumerRunningInfo; + } + + public void setGetConsumerRunningInfo(boolean getConsumerRunningInfo) { + this.getConsumerRunningInfo = getConsumerRunningInfo; + } + + public boolean isQueryCorrectionOffset() { + return queryCorrectionOffset; + } + + public void setQueryCorrectionOffset(boolean queryCorrectionOffset) { + this.queryCorrectionOffset = queryCorrectionOffset; + } + + public boolean isConsumeMessageDirectly() { + return consumeMessageDirectly; + } + + public void setConsumeMessageDirectly(boolean consumeMessageDirectly) { + this.consumeMessageDirectly = consumeMessageDirectly; + } + + public boolean isCloneGroupOffset() { + return cloneGroupOffset; + } + + public void setCloneGroupOffset(boolean cloneGroupOffset) { + this.cloneGroupOffset = cloneGroupOffset; + } + + public boolean isViewBrokerStatsData() { + return viewBrokerStatsData; + } + + public void setViewBrokerStatsData(boolean viewBrokerStatsData) { + this.viewBrokerStatsData = viewBrokerStatsData; + } + + public boolean isGetBrokerConsumeStats() { + return getBrokerConsumeStats; + } + + public void setGetBrokerConsumeStats(boolean getBrokerConsumeStats) { + this.getBrokerConsumeStats = getBrokerConsumeStats; + } + + public boolean isQueryConsumeQueue() { + return queryConsumeQueue; + } + + public void setQueryConsumeQueue(boolean queryConsumeQueue) { + this.queryConsumeQueue = queryConsumeQueue; + } + + @Override + public String toString() { + return "BorkerAccessControl [permitSendTopic=" + permitSendTopic + ", noPermitSendTopic=" + noPermitSendTopic + + ", permitPullTopic=" + permitPullTopic + ", noPermitPullTopic=" + noPermitPullTopic + ", sendMessage=" + + sendMessage + ", sendMessageV2=" + sendMessageV2 + ", sendBatchMessage=" + sendBatchMessage + + ", consumerSendMsgBack=" + consumerSendMsgBack + ", pullMessage=" + pullMessage + ", queryMessage=" + + queryMessage + ", viewMessageById=" + viewMessageById + ", heartBeat=" + heartBeat + + ", unregisterClient=" + unregisterClient + ", checkClientConfig=" + checkClientConfig + + ", getConsumerListByGroup=" + getConsumerListByGroup + ", updateConsumerOffset=" + + updateConsumerOffset + ", queryConsumerOffset=" + queryConsumerOffset + ", endTransaction=" + + endTransaction + ", updateAndCreateTopic=" + updateAndCreateTopic + ", deleteTopicInbroker=" + + deleteTopicInbroker + ", getAllTopicConfig=" + getAllTopicConfig + ", updateBrokerConfig=" + + updateBrokerConfig + ", getBrokerConfig=" + getBrokerConfig + ", searchOffsetByTimestamp=" + + searchOffsetByTimestamp + ", getMaxOffset=" + getMaxOffset + ", getMixOffset=" + getMixOffset + + ", getEarliestMsgStoretime=" + getEarliestMsgStoretime + ", getBrokerRuntimeInfo=" + + getBrokerRuntimeInfo + ", lockBatchMQ=" + lockBatchMQ + ", unlockBatchMQ=" + unlockBatchMQ + + ", updateAndCreteSubscriptiongroup=" + updateAndCreteSubscriptiongroup + + ", getAllSubscriptiongroupConfig=" + getAllSubscriptiongroupConfig + ", deleteSubscriptiongroup=" + + deleteSubscriptiongroup + ", getTopicStatsInfo=" + getTopicStatsInfo + ", getConsumerConnectionList=" + + getConsumerConnectionList + ", getProducerConnectionList=" + getProducerConnectionList + + ", getConsumeStats=" + getConsumeStats + ", getAllConsumerOffset=" + getAllConsumerOffset + + ", getAllDelayOffset=" + getAllDelayOffset + ", invokeBrokerToresetOffset=" + + invokeBrokerToresetOffset + ", queryTopicConsumByWho=" + queryTopicConsumByWho + + ", registerFilterServer=" + registerFilterServer + ", queryConsumeTimeSpan=" + queryConsumeTimeSpan + + ", getSystemTopicListFromBroker=" + getSystemTopicListFromBroker + ", cleanExpiredConsumequeue=" + + cleanExpiredConsumequeue + ", cleanUnusedTopic=" + cleanUnusedTopic + ", getConsumerRunningInfo=" + + getConsumerRunningInfo + ", queryCorrectionOffset=" + queryCorrectionOffset + + ", consumeMessageDirectly=" + consumeMessageDirectly + ", cloneGroupOffset=" + cloneGroupOffset + + ", viewBrokerStatsData=" + viewBrokerStatsData + ", getBrokerConsumeStats=" + getBrokerConsumeStats + + ", queryConsumeQueue=" + queryConsumeQueue + ", toString()=" + super.toString() + "]"; + } + + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java new file mode 100644 index 0000000000..47848bd873 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java @@ -0,0 +1,40 @@ +package org.apache.rocketmq.acl.plug.entity; + +import java.util.List; + +public class BorkerAccessControlTransport { + + private BorkerAccessControl onlyNetAddress; + + private List list; + + + + public BorkerAccessControlTransport() { + super(); + } + + public BorkerAccessControl getOnlyNetAddress() { + return onlyNetAddress; + } + + public void setOnlyNetAddress(BorkerAccessControl onlyNetAddress) { + this.onlyNetAddress = onlyNetAddress; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + @Override + public String toString() { + return "BorkerAccessControlTransport [onlyNetAddress=" + onlyNetAddress + ", list=" + list + "]"; + } + + + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java new file mode 100644 index 0000000000..1cb99071fa --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java @@ -0,0 +1,5 @@ +package org.apache.rocketmq.acl.plug.entity; + +public class ControllerParametersEntity { + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java new file mode 100644 index 0000000000..bbdeda32c0 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java @@ -0,0 +1,55 @@ +package org.apache.rocketmq.acl.plug.entity; + +public class LoginInfo { + + + private String recognition; + + private long loginTime = System.currentTimeMillis(); + + private long operationTime = loginTime; + + private AuthenticationInfo authenticationInfo; + + + + public AuthenticationInfo getAuthenticationInfo() { + return authenticationInfo; + } + + public void setAuthenticationInfo(AuthenticationInfo authenticationInfo) { + this.authenticationInfo = authenticationInfo; + } + + public String getRecognition() { + return recognition; + } + + public void setRecognition(String recognition) { + this.recognition = recognition; + } + + public long getLoginTime() { + return loginTime; + } + + public void setLoginTime(long loginTime) { + this.loginTime = loginTime; + } + + public long getOperationTime() { + return operationTime; + } + + public void setOperationTime(long operationTime) { + this.operationTime = operationTime; + } + + @Override + public String toString() { + return "LoginInfo [recognition=" + recognition + ", loginTime=" + loginTime + ", operationTime=" + operationTime + + ", authenticationInfo=" + authenticationInfo + "]"; + } + + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java new file mode 100644 index 0000000000..08676ca2f1 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java @@ -0,0 +1,39 @@ +package org.apache.rocketmq.acl.plug.entity; + +/** + * @author Administrator + * + */ +public class LoginOrRequestAccessControl extends AccessControl { + + + private int code; + + private String topic; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("LoginOrRequestAccessControl [code=").append(code).append(", topic=").append(topic).append("]"); + return builder.toString(); + } + + + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java new file mode 100644 index 0000000000..b1209ec13b --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java @@ -0,0 +1,11 @@ +package org.apache.rocketmq.acl.plug.strategy; + +import org.apache.rocketmq.acl.plug.AclUtils; + +public abstract class AbstractNetaddressStrategy implements NetaddressStrategy { + + public void verify(String netaddress , int index) { + AclUtils.isScope(netaddress, index); + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java new file mode 100644 index 0000000000..2380e86a45 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java @@ -0,0 +1,25 @@ +package org.apache.rocketmq.acl.plug.strategy; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; + +public class MultipleNetaddressStrategy extends AbstractNetaddressStrategy { + + private final Set multipleSet = new HashSet<>(); + + public MultipleNetaddressStrategy(String[] strArray) { + for(String netaddress : strArray) { + verify(netaddress, 4); + multipleSet.add(netaddress); + } + } + + + @Override + public boolean match(AccessControl accessControl) { + return multipleSet.contains(accessControl.getNetaddress()); + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java new file mode 100644 index 0000000000..00cf3264f3 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java @@ -0,0 +1,9 @@ +package org.apache.rocketmq.acl.plug.strategy; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; + +public interface NetaddressStrategy { + + + public boolean match(AccessControl accessControl); +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java new file mode 100644 index 0000000000..f6dd8d4994 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java @@ -0,0 +1,31 @@ +package org.apache.rocketmq.acl.plug.strategy; + +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.plug.AclUtils; +import org.apache.rocketmq.acl.plug.entity.AccessControl; + +public class NetaddressStrategyFactory { + + + + public NetaddressStrategy getNetaddressStrategy(AccessControl accessControl ) { + String netaddress = accessControl.getNetaddress(); + if(StringUtils.isBlank(netaddress) || "*".equals(netaddress) ) {//* + return NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY; + } + if(netaddress.endsWith("}")) {//1.1.1.{1,2,3,4,5} + String[] strArray = StringUtils.split(netaddress); + String four = strArray[3]; + if(!four.startsWith("{")) { + + } + return new MultipleNetaddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); + }else if(AclUtils.isColon(netaddress)) {//1.1.1.1,1.2.3.4.5 + return new MultipleNetaddressStrategy( StringUtils.split(",")); + }else if(AclUtils.isAsterisk(netaddress) || AclUtils.isMinus(netaddress)) {//1.2.*.* , 1.1.1.1-5 ,1.1.1-5.* + return new RangeNetaddressStrategy(netaddress); + } + return new OneNetaddressStrategy(netaddress); + + } +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java new file mode 100644 index 0000000000..c266b03c8b --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java @@ -0,0 +1,15 @@ +package org.apache.rocketmq.acl.plug.strategy; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; + +public class NullNetaddressStrategy implements NetaddressStrategy { + + public static final NullNetaddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullNetaddressStrategy(); + + + @Override + public boolean match(AccessControl accessControl) { + return true; + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java new file mode 100644 index 0000000000..eb63f94cb3 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java @@ -0,0 +1,19 @@ +package org.apache.rocketmq.acl.plug.strategy; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; + +public class OneNetaddressStrategy extends AbstractNetaddressStrategy { + + + private String netaddress; + + public OneNetaddressStrategy(String netaddress) { + this.netaddress = netaddress; + } + + @Override + public boolean match(AccessControl accessControl) { + return netaddress.equals(accessControl.getNetaddress()); + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java new file mode 100644 index 0000000000..8179944d47 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java @@ -0,0 +1,69 @@ +package org.apache.rocketmq.acl.plug.strategy; + +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.plug.AclUtils; +import org.apache.rocketmq.acl.plug.entity.AccessControl; + +public class RangeNetaddressStrategy extends AbstractNetaddressStrategy { + + private String head; + + private int start; + + private int end; + + private int index; + + public RangeNetaddressStrategy(String netaddress) { + String[] strArray = StringUtils.split(netaddress , "."); + if( analysis(strArray , 2) ||analysis(strArray , 3) ) { + verify(netaddress, index); + StringBuffer sb = new StringBuffer().append( strArray[0].trim()).append(".").append( strArray[1].trim()).append("."); + if(index == 3) { + sb.append( strArray[2].trim()).append("."); + } + this.head = sb.toString(); + } + } + + private boolean analysis(String[] strArray , int index ) { + String value = strArray[index].trim(); + this.index = index; + if( "*".equals( value) ){ + setValue(0, 255); + }else if(AclUtils.isMinus( value )) { + String[] valueArray = StringUtils.split( value , "-" ); + this.start = Integer.valueOf(valueArray[0]); + this.end = Integer.valueOf(valueArray[1]); + if ( !(AclUtils.isScope( end ) && AclUtils.isScope( start ) && start <= end)) { + + } + } + return this.end > 0 ? true : false; + } + + + private void setValue(int start , int end) { + this.start = start ; + this.end = end; + } + + @Override + public boolean match(AccessControl accessControl) { + String netAddress = accessControl.getNetaddress(); + if ( netAddress.startsWith(this.head)) { + String value; + if(index == 3) { + value = netAddress.substring(this.head.length()); + }else { + value = netAddress.substring(this.head.length() , netAddress.lastIndexOf('.')); + } + Integer address = Integer.valueOf(value); + if( address>= this.start && address <= this.end ) { + return true; + } + } + return false; + } + +} diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java new file mode 100644 index 0000000000..db0a45921e --- /dev/null +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java @@ -0,0 +1,17 @@ +package org.apache.rocketmq.acl.plug; + +import java.util.Map; + +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; +import org.junit.Test; + +public class AccessContralAnalysisTest { + + @Test + public void analysisTest() { + AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + Map map = accessContralAnalysis.analysis(new BorkerAccessControl()); + System.out.println(map); + } + +} diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java new file mode 100644 index 0000000000..0a49e2950d --- /dev/null +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -0,0 +1,12 @@ +package org.apache.rocketmq.acl.plug.engine; + +import org.junit.Test; + +public class PlainAclPlugEngineTest { + + @Test + public void testPlainAclPlugEngineInit() { + PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); + plainAclPlugEngine.init(); + } +} diff --git a/acl-plug/src/test/resources/transport.yml b/acl-plug/src/test/resources/transport.yml new file mode 100644 index 0000000000..424fd8d8e7 --- /dev/null +++ b/acl-plug/src/test/resources/transport.yml @@ -0,0 +1,19 @@ +onlyNetAddress: + netaddress: 10.10.103.* + noPermitPullTopic: + - broker-a + +list: + - account: laohu + password: 123456 + netaddress: 192.0.0.* + permitSendTopic: + - test1 + - test2 + - account: laohu + password: 123456 + netaddress: 192.0.2.1 + permitSendTopic: + - test3 + - test4 + \ No newline at end of file diff --git a/broker/pom.xml b/broker/pom.xml index f10ae53730..7c67de57c1 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -1,89 +1,89 @@ - - http://www.apache.org/licenses/LICENSE-2.0 + + + org.apache.rocketmq + rocketmq-all + 4.4.0-SNAPSHOT + - 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. - --> + 4.0.0 + jar + rocketmq-broker + rocketmq-broker ${project.version} - - - org.apache.rocketmq - rocketmq-all - 4.4.0-SNAPSHOT - + + + ${project.groupId} + rocketmq-common + + + ${project.groupId} + rocketmq-store + + + ${project.groupId} + rocketmq-remoting + + + ${project.groupId} + rocketmq-client + + + ${project.groupId} + rocketmq-srvutil + + + ${project.groupId} + rocketmq-filter + + + ${project.groupId} + rocketmq-acl-plug + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + + + com.alibaba + fastjson + + + org.javassist + javassist + + + org.slf4j + slf4j-api + + - 4.0.0 - jar - rocketmq-broker - rocketmq-broker ${project.version} - - - - ${project.groupId} - rocketmq-common - - - ${project.groupId} - rocketmq-store - - - ${project.groupId} - rocketmq-remoting - - - ${project.groupId} - rocketmq-client - - - ${project.groupId} - rocketmq-srvutil - - - ${project.groupId} - rocketmq-filter - - - ch.qos.logback - logback-classic - - - ch.qos.logback - logback-core - - - com.alibaba - fastjson - - - org.javassist - javassist - - - org.slf4j - slf4j-api - - - - - - - maven-surefire-plugin - 2.19.1 - - 1 - false - - - - + + + + maven-surefire-plugin + 2.19.1 + + 1 + false + + + + diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index f45674d6e4..b080716bd2 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -19,6 +19,7 @@ package org.apache.rocketmq.broker; import java.io.IOException; import java.net.InetSocketAddress; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -31,6 +32,11 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.plug.AclPlugController; +import org.apache.rocketmq.acl.plug.AclRemotingServer; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; import org.apache.rocketmq.broker.client.ClientHousekeepingService; import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; import org.apache.rocketmq.broker.client.ConsumerManager; @@ -91,6 +97,7 @@ import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; import org.apache.rocketmq.remoting.netty.NettyServerConfig; import org.apache.rocketmq.remoting.netty.RequestTask; import org.apache.rocketmq.remoting.netty.TlsSystemConfig; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.srvutil.FileWatchService; import org.apache.rocketmq.store.DefaultMessageStore; import org.apache.rocketmq.store.MessageArrivingListener; @@ -458,6 +465,7 @@ public class BrokerController { } } initialTransaction(); + initialAclPlug(); } return result; } @@ -477,6 +485,42 @@ public class BrokerController { this.transactionalMessageCheckService = new TransactionalMessageCheckService(this); } + private void initialAclPlug() { + try { + if(!this.brokerConfig.isAclPlug()) { + return; + } + AclPlugController aclPlugController = new AclPlugController(null); + if(!aclPlugController.isStartSucceed()) { + return; + } + final AclRemotingServer aclRemotingServe = aclPlugController.getAclRemotingServer(); + this.registerServerRPCHook(new RPCHook() { + + @Override + public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + HashMap extFields = request.getExtFields(); + LoginOrRequestAccessControl accessControl = new LoginOrRequestAccessControl(); + accessControl.setCode(request.getCode()); + accessControl.setRecognition(remoteAddr); + if( extFields != null ) { + accessControl.setAccount(extFields.get("account")); + accessControl.setPassword(extFields.get("password")); + accessControl.setNetaddress(StringUtils.split(remoteAddr,":")[0]); + accessControl.setTopic(extFields.get("topic")); + } + aclRemotingServe.eachCheck(accessControl); + } + + @Override + public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) {} + }); + + }catch(Exception e) { + + } + } + public void registerProcessor() { /** * SendMessageProcessor diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index 442f456aa4..a8c286eba9 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -163,6 +163,9 @@ public class BrokerConfig { */ @ImportantField private long transactionCheckInterval = 60 * 1000; + + + private boolean isAclPlug; public boolean isTraceOn() { return traceOn; @@ -701,4 +704,13 @@ public class BrokerConfig { public void setTransactionCheckInterval(long transactionCheckInterval) { this.transactionCheckInterval = transactionCheckInterval; } + + public boolean isAclPlug() { + return isAclPlug; + } + + public void setAclPlug(boolean isAclPlug) { + this.isAclPlug = isAclPlug; + } + } diff --git a/distribution/conf/broker.conf b/distribution/conf/broker.conf index 0c0b28b7b8..363bcbc03a 100644 --- a/distribution/conf/broker.conf +++ b/distribution/conf/broker.conf @@ -20,3 +20,5 @@ deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH +aclPlug=true +namesrvAddr=127.0.0.1:9876 diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/PullConsumer.java b/example/src/main/java/org/apache/rocketmq/example/simple/PullConsumer.java index efffa36d59..8aec7e3093 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/PullConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/PullConsumer.java @@ -29,10 +29,10 @@ public class PullConsumer { public static void main(String[] args) throws MQClientException { DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("please_rename_unique_group_name_5"); - + consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.start(); - Set mqs = consumer.fetchSubscribeMessageQueues("TopicTest1"); + Set mqs = consumer.fetchSubscribeMessageQueues("broker-a"); for (MessageQueue mq : mqs) { System.out.printf("Consume from the queue: %s%n", mq); SINGLE_MQ: diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/PullConsumerTest.java b/example/src/main/java/org/apache/rocketmq/example/simple/PullConsumerTest.java index 16108b8c6a..f12595a903 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/PullConsumerTest.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/PullConsumerTest.java @@ -24,6 +24,7 @@ import org.apache.rocketmq.common.message.MessageQueue; public class PullConsumerTest { public static void main(String[] args) throws MQClientException { DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("please_rename_unique_group_name_5"); + consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.start(); try { diff --git a/pom.xml b/pom.xml index 1f71cd4b7f..ed2c3d90e6 100644 --- a/pom.xml +++ b/pom.xml @@ -125,6 +125,7 @@ distribution openmessaging logging + acl-plug @@ -214,9 +215,9 @@ generate-effective-dependencies-pom generate-resources - + ${project.build.directory}/effective-pom/effective-dependencies.xml @@ -535,6 +536,11 @@ rocketmq-example ${project.version} + + ${project.groupId} + rocketmq-acl-plug + ${project.version} + org.slf4j slf4j-api From 7a03020945530cfdb62996eb7b585bf02a64a698 Mon Sep 17 00:00:00 2001 From: hujie Date: Wed, 3 Oct 2018 01:41:38 +0800 Subject: [PATCH 02/96] accomplish --- acl-plug/pom.xml | 60 +- .../acl/plug/AccessContralAnalysis.java | 80 +- .../rocketmq/acl/plug/AclPlugController.java | 68 +- .../rocketmq/acl/plug/AclPlugServer.java | 18 +- .../rocketmq/acl/plug/AclRemotingServer.java | 27 +- .../apache/rocketmq/acl/plug/AclUtils.java | 103 +- .../rocketmq/acl/plug/Authentication.java | 82 +- .../plug/DefaultAclRemotingServerImpl.java | 61 +- .../EmptyImplementationAclRemotingServer.java | 19 - .../acl/plug/annotation/RequestCode.java | 18 +- .../acl/plug/engine/AclPlugEngine.java | 28 +- ...enticationInfoManagementAclPlugEngine.java | 167 ++- .../plug/engine/LoginInfoAclPlugEngine.java | 82 +- .../acl/plug/engine/PlainAclPlugEngine.java | 59 +- .../acl/plug/entity/AccessControl.java | 99 +- .../acl/plug/entity/AuthenticationInfo.java | 103 +- .../acl/plug/entity/AuthenticationResult.java | 80 +- .../acl/plug/entity/BorkerAccessControl.java | 1214 +++++++++-------- .../entity/BorkerAccessControlTransport.java | 64 +- .../entity/ControllerParametersEntity.java | 33 + .../rocketmq/acl/plug/entity/LoginInfo.java | 109 +- .../entity/LoginOrRequestAccessControl.java | 67 +- .../AclPlugAccountAnalysisException.java | 31 + .../AclPlugAuthenticationException.java | 30 + .../acl/plug/exception/AclPlugException.java | 30 + .../plug/exception/AclPlugLoginException.java | 31 + .../exception/AclPlugRuntimeException.java | 31 + .../plug/exception/AclPlugStartException.java | 30 + .../strategy/AbstractNetaddressStrategy.java | 22 +- .../strategy/MultipleNetaddressStrategy.java | 43 +- .../acl/plug/strategy/NetaddressStrategy.java | 19 +- .../strategy/NetaddressStrategyFactory.java | 58 +- .../plug/strategy/NullNetaddressStrategy.java | 29 +- .../plug/strategy/OneNetaddressStrategy.java | 37 +- .../strategy/RangeNetaddressStrategy.java | 133 +- .../acl/plug/AccessContralAnalysisTest.java | 12 +- .../plug/engine/PlainAclPlugEngineTest.java | 10 +- acl-plug/src/test/resources/transport.yml | 26 +- distribution/conf/transport.yml | 19 + 39 files changed, 2001 insertions(+), 1231 deletions(-) delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/EmptyImplementationAclRemotingServer.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAccountAnalysisException.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAuthenticationException.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugException.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugLoginException.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugStartException.java create mode 100644 distribution/conf/transport.yml diff --git a/acl-plug/pom.xml b/acl-plug/pom.xml index 540f0efb43..3a86a6ab63 100644 --- a/acl-plug/pom.xml +++ b/acl-plug/pom.xml @@ -1,30 +1,38 @@ - 4.0.0 - - org.apache.rocketmq - rocketmq-all - 4.4.0-SNAPSHOT - - rocketmq-acl-plug - rocketmq-acl-plug ${project.version} + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" + xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + 4.0.0 + + org.apache.rocketmq + rocketmq-all + 4.4.0-SNAPSHOT + + rocketmq-acl-plug + rocketmq-acl-plug ${project.version} - http://maven.apache.org - - UTF-8 - - - - org.yaml - snakeyaml - 1.19 - - - org.apache.commons - commons-lang3 - - + http://maven.apache.org + + UTF-8 + + + + ${project.groupId} + rocketmq-logging + + + ${project.groupId} + rocketmq-common + + + org.yaml + snakeyaml + 1.19 + + + org.apache.commons + commons-lang3 + + diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java index 225d8bc44d..35cd6340c3 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import java.lang.reflect.Field; @@ -11,40 +27,40 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; public class AccessContralAnalysis { - private Map, Map> classTocodeAndMentod = new HashMap<>(); + private Map, Map> classTocodeAndMentod = new HashMap<>(); - public Map analysis(AccessControl accessControl) { - Class clazz = accessControl.getClass(); - Map codeAndField = classTocodeAndMentod.get(clazz); - if (codeAndField == null) { - codeAndField = new HashMap<>(); - Field[] fields = clazz.getDeclaredFields(); - for (Field field : fields) { - RequestCode requestCode = field.getAnnotation(RequestCode.class); - if (requestCode != null) { - int code = requestCode.code(); - if (codeAndField.containsKey(code)) { + public Map analysis(AccessControl accessControl) { + Class clazz = accessControl.getClass(); + Map codeAndField = classTocodeAndMentod.get(clazz); + if (codeAndField == null) { + codeAndField = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + RequestCode requestCode = field.getAnnotation(RequestCode.class); + if (requestCode != null) { + int code = requestCode.code(); + if (codeAndField.containsKey(code)) { - } else { - field.setAccessible(true); - codeAndField.put(code, field); - } - } + } else { + field.setAccessible(true); + codeAndField.put(code, field); + } + } - } - classTocodeAndMentod.put(clazz, codeAndField); - } - Iterator> it = codeAndField.entrySet().iterator(); - Map authority = new HashMap<>(); - try { - while (it.hasNext()) { - Entry e = it.next(); - authority.put(e.getKey(), (Boolean)e.getValue().get(accessControl)); - } - } catch (IllegalArgumentException | IllegalAccessException e1) { - e1.printStackTrace(); - } - return authority; - } + } + classTocodeAndMentod.put(clazz, codeAndField); + } + Iterator> it = codeAndField.entrySet().iterator(); + Map authority = new HashMap<>(); + try { + while (it.hasNext()) { + Entry e = it.next(); + authority.put(e.getKey(), (Boolean) e.getValue().get(accessControl)); + } + } catch (IllegalArgumentException | IllegalAccessException e1) { + e1.printStackTrace(); + } + return authority; + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java index 7dd3c21910..fc0a73b9d0 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java @@ -1,30 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.exception.AclPlugStartException; public class AclPlugController { - - private ControllerParametersEntity controllerParametersEntity; - - private AclPlugEngine aclPlugEngine; - - private AclRemotingServer aclRemotingServer; - - public AclPlugController(ControllerParametersEntity controllerParametersEntity){ - this.controllerParametersEntity = controllerParametersEntity; - aclPlugEngine = new PlainAclPlugEngine(); - aclRemotingServer = new DefaultAclRemotingServerImpl(aclPlugEngine); - } - - public AclRemotingServer getAclRemotingServer() { - return this.aclRemotingServer; - } - - - public boolean isStartSucceed() { - return true; - } + private ControllerParametersEntity controllerParametersEntity; + + private AclPlugEngine aclPlugEngine; + + private AclRemotingServer aclRemotingServer; + + private boolean startSucceed = false; + + public AclPlugController(ControllerParametersEntity controllerParametersEntity) throws AclPlugStartException { + try { + this.controllerParametersEntity = controllerParametersEntity; + aclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); + aclRemotingServer = new DefaultAclRemotingServerImpl(aclPlugEngine); + this.startSucceed = true; + } catch (Exception e) { + throw new AclPlugStartException(String.format("Start the abnormal , Launch parameters is %s", this.controllerParametersEntity.toString()), e); + } + } + + public AclRemotingServer getAclRemotingServer() { + return this.aclRemotingServer; + } + + public void doChannelCloseEvent(String remoteAddr) { + aclPlugEngine.deleteLoginInfo(remoteAddr); + } + + public boolean isStartSucceed() { + return startSucceed; + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java index 0635bf3a9f..c1bb84721d 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java @@ -1,7 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; public class AclPlugServer { - - } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java index c8def943b3..63f0b20bd2 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java @@ -1,14 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public interface AclRemotingServer { - - public AuthenticationInfo login(); - - - public AuthenticationInfo eachCheck(LoginOrRequestAccessControl accessControl); - + public AuthenticationInfo login(); + + public AuthenticationResult eachCheck(LoginOrRequestAccessControl accessControl); + } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java index 39d2b3405d..17a5441235 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java @@ -1,60 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import org.apache.commons.lang3.StringUtils; public class AclUtils { - - public static String[] getAddreeStrArray(String netaddress ,String four ) { - String[] fourStrArray = StringUtils.split(four.substring(1, four.length()-1) , ","); - String address = netaddress.substring(0, netaddress.indexOf("{") ); - String[] addreeStrArray = new String[ fourStrArray.length ]; - for(int i = 0 ; i < fourStrArray.length ; i++) { - addreeStrArray[i] = address+fourStrArray[i]; - } - return addreeStrArray; - } - - public static boolean isScope(String num, int index) { - String[] strArray = StringUtils.split(num , "."); - if(strArray.length != 4) { - return false; - } - return isScope(strArray, index); + public static String[] getAddreeStrArray(String netaddress, String four) { + String[] fourStrArray = StringUtils.split(four.substring(1, four.length() - 1), ","); + String address = netaddress.substring(0, netaddress.indexOf("{")); + String[] addreeStrArray = new String[fourStrArray.length]; + for (int i = 0; i < fourStrArray.length; i++) { + addreeStrArray[i] = address + fourStrArray[i]; + } + return addreeStrArray; + } - } - - public static boolean isScope(String[] num, int index) { - if (num.length <= index) { + public static boolean isScope(String num, int index) { + String[] strArray = StringUtils.split(num, "."); + if (strArray.length != 4) { + return false; + } + return isScope(strArray, index); - } - for (int i = 0; i < index; i++) { - if( !isScope(num[i])) { - return false; - } - } - return true; + } - } + public static boolean isScope(String[] num, int index) { + if (num.length <= index) { - public static boolean isScope(String num) { - return isScope(Integer.valueOf(num.trim())); - } + } + for (int i = 0; i < index; i++) { + if (!isScope(num[i])) { + return false; + } + } + return true; - public static boolean isScope(int num) { - return num >= 0 && num <= 255; - } + } - public static boolean isAsterisk(String asterisk) { - return asterisk.indexOf('*') > -1; - } + public static boolean isScope(String num) { + return isScope(Integer.valueOf(num.trim())); + } - public static boolean isColon(String colon) { - return colon.indexOf(',') > -1; - } + public static boolean isScope(int num) { + return num >= 0 && num <= 255; + } - public static boolean isMinus(String minus) { - return minus.indexOf('-') > -1; + public static boolean isAsterisk(String asterisk) { + return asterisk.indexOf('*') > -1; + } - } + public static boolean isColon(String colon) { + return colon.indexOf(',') > -1; + } + + public static boolean isMinus(String minus) { + return minus.indexOf('-') > -1; + + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java index 08b82d9917..7a2651de62 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.entity.AccessControl; @@ -8,36 +24,38 @@ import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public class Authentication { - public boolean authentication(AuthenticationInfo authenticationInfo, LoginOrRequestAccessControl loginOrRequestAccessControl,AuthenticationResult authenticationResult) { - int code = loginOrRequestAccessControl.getCode(); - if (authenticationInfo.getAuthority().get(code)) { - AccessControl accessControl = authenticationInfo.getAccessControl(); - if( !(accessControl instanceof BorkerAccessControl)) { - return true; - } - BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); - String topicName = loginOrRequestAccessControl.getTopic(); - if (code == 10 || code == 310 || code == 320) { - if (borker.getPermitSendTopic().contains(topicName)) { - return true; - } - if (borker.getNoPermitSendTopic().contains(topicName)) { - authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); - return false; - } - return true; - } else if (code == 11) { - if (borker.getPermitPullTopic().contains(topicName)) { - return true; - } - if (borker.getNoPermitPullTopic().contains(topicName)) { - authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); - return false; - } - return true; - } - return true; - } - return false; - } + public boolean authentication(AuthenticationInfo authenticationInfo, + LoginOrRequestAccessControl loginOrRequestAccessControl, AuthenticationResult authenticationResult) { + int code = loginOrRequestAccessControl.getCode(); + if (!authenticationInfo.getAuthority().get(code)) { + authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); + return false; + } + AccessControl accessControl = authenticationInfo.getAccessControl(); + if (!(accessControl instanceof BorkerAccessControl)) { + return true; + } + BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); + String topicName = loginOrRequestAccessControl.getTopic(); + if (code == 10 || code == 310 || code == 320) { + if (borker.getPermitSendTopic().contains(topicName)) { + return true; + } + if (borker.getNoPermitSendTopic().contains(topicName)) { + authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); + return false; + } + return true; + } else if (code == 11) { + if (borker.getPermitPullTopic().contains(topicName)) { + return true; + } + if (borker.getNoPermitPullTopic().contains(topicName)) { + authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); + return false; + } + return true; + } + return true; + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java index b8cb930f62..117266e592 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java @@ -1,27 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugAuthenticationException; +import org.apache.rocketmq.acl.plug.exception.AclPlugLoginException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; public class DefaultAclRemotingServerImpl implements AclRemotingServer { - private AclPlugEngine aclPlugEngine; - - public DefaultAclRemotingServerImpl(AclPlugEngine aclPlugEngine ) { - this.aclPlugEngine = aclPlugEngine; - } - - @Override - public AuthenticationInfo login() { - - return null; - } + private AclPlugEngine aclPlugEngine; - @Override - public AuthenticationInfo eachCheck(LoginOrRequestAccessControl accessControl) { - aclPlugEngine.eachCheckLoginAndAuthentication(accessControl); - return null; - } + public DefaultAclRemotingServerImpl(AclPlugEngine aclPlugEngine) { + this.aclPlugEngine = aclPlugEngine; + } + + @Override + public AuthenticationInfo login() { + + return null; + } + + @Override + public AuthenticationResult eachCheck(LoginOrRequestAccessControl accessControl) { + AuthenticationResult authenticationResult = aclPlugEngine.eachCheckLoginAndAuthentication(accessControl); + if (authenticationResult.getException() != null) { + throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessControl.toString()), authenticationResult.getException()); + } + if (authenticationResult.getAccessControl() == null) { + throw new AclPlugLoginException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); + } + if (!authenticationResult.isSucceed()) { + throw new AclPlugAuthenticationException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); + } + return authenticationResult; + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/EmptyImplementationAclRemotingServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/EmptyImplementationAclRemotingServer.java deleted file mode 100644 index 86923817ae..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/EmptyImplementationAclRemotingServer.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.apache.rocketmq.acl.plug; - -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; - -public class EmptyImplementationAclRemotingServer implements AclRemotingServer { - - @Override - public AuthenticationInfo login() { - - return null; - } - - @Override - public AuthenticationInfo eachCheck() { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java index b6afc91c43..d9668ae223 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.annotation; import java.lang.annotation.Documented; @@ -11,5 +27,5 @@ import java.lang.annotation.Target; @Target({ElementType.FIELD}) public @interface RequestCode { - int code(); + int code(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java index 8b40247266..38766a7520 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; import org.apache.rocketmq.acl.plug.entity.AccessControl; @@ -8,9 +24,11 @@ import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public interface AclPlugEngine { - public AuthenticationInfo getAccessControl(AccessControl accessControl) ; - - public LoginInfo getLoginInfo(AccessControl accessControl) ; - - public AuthenticationResult eachCheckLoginAndAuthentication(LoginOrRequestAccessControl accessControl); + public AuthenticationInfo getAccessControl(AccessControl accessControl); + + public LoginInfo getLoginInfo(AccessControl accessControl); + + public void deleteLoginInfo(String remoteAddr); + + public AuthenticationResult eachCheckLoginAndAuthentication(LoginOrRequestAccessControl accessControl); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index f42057beb6..7a4eeeffda 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; import java.util.HashMap; @@ -10,76 +26,93 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; +import org.apache.rocketmq.common.constant.LoggerName; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPlugEngine { - - private Map> accessControlMap = new HashMap<>(); - - private AuthenticationInfo authenticationInfo; - - private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); - - private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - - private Authentication authentication = new Authentication(); - - public void setAccessControl(AccessControl accessControl) { - try { - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); - if(accessControlAddressMap == null ) { - accessControlAddressMap = new HashMap<>(); - accessControlMap.put(accessControl.getAccount(), accessControlAddressMap); - } - accessControlAddressMap.put(accessControl.getNetaddress(), new AuthenticationInfo(accessContralAnalysis.analysis(accessControl),accessControl ,netaddressStrategy)); - }catch(Exception e) { - // TODO Exception - } - } - - public void setAccessControlList(List AccessControlList) { - for(AccessControl accessControl : AccessControlList) { - setAccessControl(accessControl); - } - } - - - public void setNetaddressAccessControl(AccessControl accessControl) { - authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl) , accessControl, netaddressStrategyFactory.getNetaddressStrategy(accessControl)); - } - - public AuthenticationInfo getAccessControl(AccessControl accessControl) { - AuthenticationInfo existing = null; - if( accessControl.getAccount() == null && authenticationInfo != null) { - existing = authenticationInfo.getNetaddressStrategy().match(accessControl)?authenticationInfo:null; - }else { - Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); - if(accessControlAddressMap != null ) { - existing = accessControlAddressMap.get(accessControl.getNetaddress()); - if(existing.getAccessControl().getPassword().equals(accessControl.getPassword())) { - if( existing.getNetaddressStrategy().match(accessControl)) { - return existing; - } - } - existing = null; - } - } - return existing; - } - - @Override - public AuthenticationResult eachCheckLoginAndAuthentication(LoginOrRequestAccessControl accessControl) { - AuthenticationResult authenticationResult = new AuthenticationResult(); - AuthenticationInfo authenticationInfo = getAuthenticationInfo(accessControl , authenticationResult); - if(authenticationInfo != null) { - boolean boo = authentication.authentication(authenticationInfo, accessControl,authenticationResult); - authenticationResult.setSucceed( boo ); - } - return authenticationResult; - } - - protected abstract AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl , AuthenticationResult authenticationResult); + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); + + private Map> accessControlMap = new HashMap<>(); + + private AuthenticationInfo authenticationInfo; + + private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); + + private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + + private Authentication authentication = new Authentication(); + + public void setAccessControl(AccessControl accessControl) throws AclPlugAccountAnalysisException { + try { + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); + if (accessControlAddressMap == null) { + accessControlAddressMap = new HashMap<>(); + accessControlMap.put(accessControl.getAccount(), accessControlAddressMap); + } + AuthenticationInfo authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategy); + accessControlAddressMap.put(accessControl.getNetaddress(), authenticationInfo); + log.info("authenticationInfo is {}", authenticationInfo.toString()); + } catch (Exception e) { + throw new AclPlugAccountAnalysisException(accessControl.toString(), e); + } + } + + public void setAccessControlList(List accessControlList) throws AclPlugAccountAnalysisException { + for (AccessControl accessControl : accessControlList) { + setAccessControl(accessControl); + } + } + + public void setNetaddressAccessControl(AccessControl accessControl) throws AclPlugAccountAnalysisException { + try { + authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategyFactory.getNetaddressStrategy(accessControl)); + log.info("default authenticationInfo is {}", authenticationInfo.toString()); + } catch (Exception e) { + throw new AclPlugAccountAnalysisException(accessControl.toString(), e); + } + + } + + public AuthenticationInfo getAccessControl(AccessControl accessControl) { + AuthenticationInfo existing = null; + if (accessControl.getAccount() == null && authenticationInfo != null) { + existing = authenticationInfo.getNetaddressStrategy().match(accessControl) ? authenticationInfo : null; + } else { + Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); + if (accessControlAddressMap != null) { + existing = accessControlAddressMap.get(accessControl.getNetaddress()); + if (existing.getAccessControl().getPassword().equals(accessControl.getPassword())) { + if (existing.getNetaddressStrategy().match(accessControl)) { + return existing; + } + } + existing = null; + } + } + return existing; + } + + @Override + public AuthenticationResult eachCheckLoginAndAuthentication(LoginOrRequestAccessControl accessControl) { + AuthenticationResult authenticationResult = new AuthenticationResult(); + try { + AuthenticationInfo authenticationInfo = getAuthenticationInfo(accessControl, authenticationResult); + if (authenticationInfo != null) { + boolean boo = authentication.authentication(authenticationInfo, accessControl, authenticationResult); + authenticationResult.setSucceed(boo); + } + } catch (Exception e) { + authenticationResult.setException(e); + } + return authenticationResult; + } + + protected abstract AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl, + AuthenticationResult authenticationResult); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java index 1e8263f3d1..3831803ca4 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; import java.util.Map; @@ -11,37 +27,43 @@ import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagementAclPlugEngine { - private Map loginInfoMap = new ConcurrentHashMap<>(); + private Map loginInfoMap = new ConcurrentHashMap<>(); - @Override - public AuthenticationInfo getAccessControl(AccessControl accessControl) { - AuthenticationInfo authenticationInfo = super.getAccessControl(accessControl); - LoginInfo loginInfo = new LoginInfo(); - loginInfo.setAuthenticationInfo(authenticationInfo); - loginInfoMap.put(accessControl.getRecognition(), loginInfo); - return authenticationInfo; - } + @Override + public AuthenticationInfo getAccessControl(AccessControl accessControl) { + AuthenticationInfo authenticationInfo = super.getAccessControl(accessControl); + if (authenticationInfo != null) { + LoginInfo loginInfo = new LoginInfo(); + loginInfo.setAuthenticationInfo(authenticationInfo); + loginInfoMap.put(accessControl.getRecognition(), loginInfo); + } + return authenticationInfo; + } - public LoginInfo getLoginInfo(AccessControl accessControl) { - LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); - if (loginInfo == null) { - getAccessControl(accessControl); - loginInfo = loginInfoMap.get(accessControl.getRecognition()); - } - if (loginInfo != null) { - loginInfo.setOperationTime(System.currentTimeMillis()); - } - return loginInfo; - } + public LoginInfo getLoginInfo(AccessControl accessControl) { + LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); + if (loginInfo == null && getAccessControl(accessControl) != null) { + loginInfo = loginInfoMap.get(accessControl.getRecognition()); + } + if (loginInfo != null) { + loginInfo.setOperationTime(System.currentTimeMillis()); + } + return loginInfo; + } + + public void deleteLoginInfo(String remoteAddr) { + loginInfoMap.remove(remoteAddr); + } + + protected AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl, + AuthenticationResult authenticationResult) { + LoginInfo anthenticationInfo = getLoginInfo(accessControl); + if (anthenticationInfo != null && anthenticationInfo.getAuthenticationInfo() != null) { + return anthenticationInfo.getAuthenticationInfo(); + } else { + authenticationResult.setResultString("Login information does not exist, Please check login, password, IP"); + } + return null; + } - - protected AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl , AuthenticationResult authenticationResult) { - LoginInfo anthenticationInfo = getLoginInfo(accessControl); - if(anthenticationInfo != null) { - return anthenticationInfo.getAuthenticationInfo(); - }else { - authenticationResult.setResultString("Login information does not exist"); - } - return null; - } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index c57fbda302..68d7d908ca 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -1,22 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; +import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; import org.yaml.snakeyaml.Yaml; public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { - public PlainAclPlugEngine() { - init(); - } - - void init() { - Yaml ymal = new Yaml(); - BorkerAccessControlTransport transport = ymal.loadAs(PlainAclPlugEngine.class.getClassLoader().getResourceAsStream( "transport.yml"), BorkerAccessControlTransport.class); - super.setNetaddressAccessControl(transport.getOnlyNetAddress()); - for(AccessControl accessControl : transport.getList()) { - super.setAccessControl(accessControl); - } - } - + private ControllerParametersEntity controllerParametersEntity; + + public PlainAclPlugEngine( + ControllerParametersEntity controllerParametersEntity) throws AclPlugAccountAnalysisException { + this.controllerParametersEntity = controllerParametersEntity; + init(); + } + + void init() throws AclPlugAccountAnalysisException { + String filePath = controllerParametersEntity.getFileHome() + "/conf/transport.yml"; + Yaml ymal = new Yaml(); + FileInputStream fis; + try { + fis = new FileInputStream(new File(filePath)); + BorkerAccessControlTransport transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); + super.setNetaddressAccessControl(transport.getOnlyNetAddress()); + for (AccessControl accessControl : transport.getList()) { + super.setAccessControl(accessControl); + } + } catch (FileNotFoundException e) { + throw new AclPlugAccountAnalysisException("The transport.yml file for Plain mode was not found", e); + } + } + } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java index 1169a31b2a..acda94774a 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java @@ -1,57 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; public class AccessControl { - private String account; - - private String password; - - private String netaddress; + private String account; - private String recognition; - - public AccessControl() { - } - - - public String getAccount() { - return account; - } + private String password; - public void setAccount(String account) { - this.account = account; - } + private String netaddress; - public String getPassword() { - return password; - } + private String recognition; - public void setPassword(String password) { - this.password = password; - } + public AccessControl() { + } - public String getNetaddress() { - return netaddress; - } + public String getAccount() { + return account; + } - public void setNetaddress(String netaddress) { - this.netaddress = netaddress; - } + public void setAccount(String account) { + this.account = account; + } - public String getRecognition() { - return recognition; - } + public String getPassword() { + return password; + } - public void setRecognition(String recognition) { - this.recognition = recognition; - } + public void setPassword(String password) { + this.password = password; + } + + public String getNetaddress() { + return netaddress; + } + + public void setNetaddress(String netaddress) { + this.netaddress = netaddress; + } + + public String getRecognition() { + return recognition; + } + + public void setRecognition(String recognition) { + this.recognition = recognition; + } + + @Override + public String toString() { + return "AccessControl [account=" + account + ", password=" + password + ", netaddress=" + netaddress + + ", recognition=" + recognition + "]"; + } - @Override - public String toString() { - return "AccessControl [account=" + account + ", password=" + password + ", netaddress=" + netaddress - + ", recognition=" + recognition + "]"; - } - - - } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java index a12b2ff97a..c4b9f7071e 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java @@ -1,56 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; +import java.util.Iterator; import java.util.Map; +import java.util.Map.Entry; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; public class AuthenticationInfo { - private AccessControl accessControl; - - private NetaddressStrategy netaddressStrategy; + private AccessControl accessControl; - private Map authority; - - public AuthenticationInfo(Map authority , AccessControl accessControl, NetaddressStrategy netaddressStrategy) { - super(); - this.authority = authority; - this.accessControl = accessControl; - this.netaddressStrategy = netaddressStrategy; - } + private NetaddressStrategy netaddressStrategy; - public AccessControl getAccessControl() { - return accessControl; - } + private Map authority; - public void setAccessControl(AccessControl accessControl) { - this.accessControl = accessControl; - } + public AuthenticationInfo(Map authority, AccessControl accessControl, + NetaddressStrategy netaddressStrategy) { + super(); + this.authority = authority; + this.accessControl = accessControl; + this.netaddressStrategy = netaddressStrategy; + } - public NetaddressStrategy getNetaddressStrategy() { - return netaddressStrategy; - } + public AccessControl getAccessControl() { + return accessControl; + } - public void setNetaddressStrategy(NetaddressStrategy netaddressStrategy) { - this.netaddressStrategy = netaddressStrategy; - } + public void setAccessControl(AccessControl accessControl) { + this.accessControl = accessControl; + } - - - public Map getAuthority() { - return authority; - } + public NetaddressStrategy getNetaddressStrategy() { + return netaddressStrategy; + } - public void setAuthority(Map authority) { - this.authority = authority; - } + public void setNetaddressStrategy(NetaddressStrategy netaddressStrategy) { + this.netaddressStrategy = netaddressStrategy; + } + + public Map getAuthority() { + return authority; + } + + public void setAuthority(Map authority) { + this.authority = authority; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("AuthenticationInfo [accessControl=").append(accessControl).append(", netaddressStrategy=") + .append(netaddressStrategy).append(", authority={"); + Iterator> it = authority.entrySet().iterator(); + while (it.hasNext()) { + Entry e = it.next(); + if (!e.getValue()) { + builder.append(e.getKey().toString()).append(":").append(e.getValue()).append(","); + } + } + builder.append("}]"); + return builder.toString(); + } - @Override - public String toString() { - return "AuthenticationInfo [accessControl=" + accessControl + ", netaddressStrategy=" + netaddressStrategy - + ", authority=" + authority + "]"; - } - - - } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java index 668e74dbbe..bef05cef06 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java @@ -1,45 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; public class AuthenticationResult { - private AccessControl accessControl; - - private boolean succeed; - - private Exception exception; - - private String resultString; + private AccessControl accessControl; - public AccessControl getAccessControl() { - return accessControl; - } + private boolean succeed; - public void setAccessControl(AccessControl accessControl) { - this.accessControl = accessControl; - } + private Exception exception; - public boolean isSucceed() { - return succeed; - } + private String resultString; - public void setSucceed(boolean succeed) { - this.succeed = succeed; - } + public AccessControl getAccessControl() { + return accessControl; + } - public Exception getException() { - return exception; - } + public void setAccessControl(AccessControl accessControl) { + this.accessControl = accessControl; + } - public void setException(Exception exception) { - this.exception = exception; - } + public boolean isSucceed() { + return succeed; + } - public String getResultString() { - return resultString; - } + public void setSucceed(boolean succeed) { + this.succeed = succeed; + } + + public Exception getException() { + return exception; + } + + public void setException(Exception exception) { + this.exception = exception; + } + + public String getResultString() { + return resultString; + } + + public void setResultString(String resultString) { + this.resultString = resultString; + } - public void setResultString(String resultString) { - this.resultString = resultString; - } - } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java index 1780617be2..0782e37b5f 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; import java.util.HashSet; @@ -5,630 +21,698 @@ import java.util.Set; import org.apache.rocketmq.acl.plug.annotation.RequestCode; -/** - * @author Administrator - * - */ -public class BorkerAccessControl extends AccessControl{ - - public BorkerAccessControl() { - - } - - - private Set permitSendTopic = new HashSet<>(); - - private Set noPermitSendTopic = new HashSet<>(); - - private Set permitPullTopic = new HashSet<>(); - - private Set noPermitPullTopic = new HashSet<>(); - - @RequestCode(code = 10) - private boolean sendMessage = true; - - @RequestCode(code = 310) - private boolean sendMessageV2 = true; - - @RequestCode(code = 320) - private boolean sendBatchMessage = true; - - @RequestCode(code = 36) - private boolean consumerSendMsgBack = true; - - @RequestCode(code = 11) - private boolean pullMessage = true; - - @RequestCode(code = 12) - private boolean queryMessage = true; - - @RequestCode(code = 33) - private boolean viewMessageById = true; - - @RequestCode(code = 34) - private boolean heartBeat = true; - - @RequestCode(code = 35) - private boolean unregisterClient = true; - - @RequestCode(code = 46) - private boolean checkClientConfig = true; - - @RequestCode(code = 38) - private boolean getConsumerListByGroup = true; - - @RequestCode(code = 15) - private boolean updateConsumerOffset = true; - - @RequestCode(code = 14) - private boolean queryConsumerOffset = true; - - @RequestCode(code = 37) - private boolean endTransaction = true; - - @RequestCode(code = 17) - private boolean updateAndCreateTopic = true; - - @RequestCode(code = 215) - private boolean deleteTopicInbroker =true; - - @RequestCode(code = 21) - private boolean getAllTopicConfig = true; - - @RequestCode(code = 25) - private boolean updateBrokerConfig = true; - - @RequestCode(code = 26) - private boolean getBrokerConfig = true; - - @RequestCode(code = 29) - private boolean searchOffsetByTimestamp = true; - - @RequestCode(code = 30) - private boolean getMaxOffset = true; - - @RequestCode(code = 31) - private boolean getMixOffset = true; - - @RequestCode(code = 32) - private boolean getEarliestMsgStoretime = true; - - @RequestCode(code = 28) - private boolean getBrokerRuntimeInfo = true; - - @RequestCode(code = 41) - private boolean lockBatchMQ = true; - - @RequestCode(code = 42) - private boolean unlockBatchMQ = true; - - @RequestCode(code = 200) - private boolean updateAndCreteSubscriptiongroup = true; - - @RequestCode(code = 201) - private boolean getAllSubscriptiongroupConfig = true; - - @RequestCode(code = 207) - private boolean deleteSubscriptiongroup = true; - - @RequestCode(code = 202) - private boolean getTopicStatsInfo = true; - - @RequestCode(code = 203) - private boolean getConsumerConnectionList = true; - - @RequestCode(code = 204) - private boolean getProducerConnectionList = true; - - @RequestCode(code = 208) - private boolean getConsumeStats = true; - - @RequestCode(code = 43) - private boolean getAllConsumerOffset = true; - - @RequestCode(code = 25) - private boolean getAllDelayOffset = true; - - @RequestCode(code = 222) - private boolean invokeBrokerToresetOffset = true; - - @RequestCode(code = 300) - private boolean queryTopicConsumByWho = true; - - @RequestCode(code = 301) - private boolean registerFilterServer = true; - - @RequestCode(code = 303) - private boolean queryConsumeTimeSpan = true; - - @RequestCode(code = 305) - private boolean getSystemTopicListFromBroker = true; - - @RequestCode(code = 306) - private boolean cleanExpiredConsumequeue = true; - - @RequestCode(code = 316) - private boolean cleanUnusedTopic = true; - - @RequestCode(code = 307) - private boolean getConsumerRunningInfo = true; - - @RequestCode(code = 308) - private boolean queryCorrectionOffset = true; - - @RequestCode(code = 309) - private boolean consumeMessageDirectly = true; - - @RequestCode(code = 314) - private boolean cloneGroupOffset = true; - - @RequestCode(code = 315) - private boolean viewBrokerStatsData = true; - - @RequestCode(code = 317) - private boolean getBrokerConsumeStats = true; - - @RequestCode(code = 321) - private boolean queryConsumeQueue = true; - - - - - public Set getPermitSendTopic() { - return permitSendTopic; - } - - public void setPermitSendTopic(Set permitSendTopic) { - this.permitSendTopic = permitSendTopic; - } - - public Set getNoPermitSendTopic() { - return noPermitSendTopic; - } - - public void setNoPermitSendTopic(Set noPermitSendTopic) { - this.noPermitSendTopic = noPermitSendTopic; - } - - public Set getPermitPullTopic() { - return permitPullTopic; - } - - public void setPermitPullTopic(Set permitPullTopic) { - this.permitPullTopic = permitPullTopic; - } - - public Set getNoPermitPullTopic() { - return noPermitPullTopic; - } - - public void setNoPermitPullTopic(Set noPermitPullTopic) { - this.noPermitPullTopic = noPermitPullTopic; - } - - public boolean isSendMessage() { - return sendMessage; - } - - public void setSendMessage(boolean sendMessage) { - this.sendMessage = sendMessage; - } - - public boolean isSendMessageV2() { - return sendMessageV2; - } - - public void setSendMessageV2(boolean sendMessageV2) { - this.sendMessageV2 = sendMessageV2; - } - - public boolean isSendBatchMessage() { - return sendBatchMessage; - } - - public void setSendBatchMessage(boolean sendBatchMessage) { - this.sendBatchMessage = sendBatchMessage; - } - - public boolean isConsumerSendMsgBack() { - return consumerSendMsgBack; - } - - public void setConsumerSendMsgBack(boolean consumerSendMsgBack) { - this.consumerSendMsgBack = consumerSendMsgBack; - } - - public boolean isPullMessage() { - return pullMessage; - } - - public void setPullMessage(boolean pullMessage) { - this.pullMessage = pullMessage; - } - - public boolean isQueryMessage() { - return queryMessage; - } - - public void setQueryMessage(boolean queryMessage) { - this.queryMessage = queryMessage; - } - - public boolean isViewMessageById() { - return viewMessageById; - } - - public void setViewMessageById(boolean viewMessageById) { - this.viewMessageById = viewMessageById; - } - public boolean isHeartBeat() { - return heartBeat; - } +public class BorkerAccessControl extends AccessControl { - public void setHeartBeat(boolean heartBeat) { - this.heartBeat = heartBeat; - } + public BorkerAccessControl() { - public boolean isUnregisterClient() { - return unregisterClient; - } + } - public void setUnregisterClient(boolean unregisterClient) { - this.unregisterClient = unregisterClient; - } + private Set permitSendTopic = new HashSet<>(); - public boolean isCheckClientConfig() { - return checkClientConfig; - } + private Set noPermitSendTopic = new HashSet<>(); - public void setCheckClientConfig(boolean checkClientConfig) { - this.checkClientConfig = checkClientConfig; - } + private Set permitPullTopic = new HashSet<>(); - public boolean isGetConsumerListByGroup() { - return getConsumerListByGroup; - } + private Set noPermitPullTopic = new HashSet<>(); - public void setGetConsumerListByGroup(boolean getConsumerListByGroup) { - this.getConsumerListByGroup = getConsumerListByGroup; - } + @RequestCode(code = 10) + private boolean sendMessage = true; - public boolean isUpdateConsumerOffset() { - return updateConsumerOffset; - } + @RequestCode(code = 310) + private boolean sendMessageV2 = true; - public void setUpdateConsumerOffset(boolean updateConsumerOffset) { - this.updateConsumerOffset = updateConsumerOffset; - } + @RequestCode(code = 320) + private boolean sendBatchMessage = true; - public boolean isQueryConsumerOffset() { - return queryConsumerOffset; - } + @RequestCode(code = 36) + private boolean consumerSendMsgBack = true; - public void setQueryConsumerOffset(boolean queryConsumerOffset) { - this.queryConsumerOffset = queryConsumerOffset; - } + @RequestCode(code = 11) + private boolean pullMessage = true; - public boolean isEndTransaction() { - return endTransaction; - } + @RequestCode(code = 12) + private boolean queryMessage = true; - public void setEndTransaction(boolean endTransaction) { - this.endTransaction = endTransaction; - } + @RequestCode(code = 33) + private boolean viewMessageById = true; - public boolean isUpdateAndCreateTopic() { - return updateAndCreateTopic; - } + @RequestCode(code = 34) + private boolean heartBeat = true; - public void setUpdateAndCreateTopic(boolean updateAndCreateTopic) { - this.updateAndCreateTopic = updateAndCreateTopic; - } + @RequestCode(code = 35) + private boolean unregisterClient = true; - public boolean isDeleteTopicInbroker() { - return deleteTopicInbroker; - } + @RequestCode(code = 46) + private boolean checkClientConfig = true; - public void setDeleteTopicInbroker(boolean deleteTopicInbroker) { - this.deleteTopicInbroker = deleteTopicInbroker; - } + @RequestCode(code = 38) + private boolean getConsumerListByGroup = true; - public boolean isGetAllTopicConfig() { - return getAllTopicConfig; - } + @RequestCode(code = 15) + private boolean updateConsumerOffset = true; - public void setGetAllTopicConfig(boolean getAllTopicConfig) { - this.getAllTopicConfig = getAllTopicConfig; - } + @RequestCode(code = 14) + private boolean queryConsumerOffset = true; - public boolean isUpdateBrokerConfig() { - return updateBrokerConfig; - } + @RequestCode(code = 37) + private boolean endTransaction = true; - public void setUpdateBrokerConfig(boolean updateBrokerConfig) { - this.updateBrokerConfig = updateBrokerConfig; - } + @RequestCode(code = 17) + private boolean updateAndCreateTopic = true; - public boolean isGetBrokerConfig() { - return getBrokerConfig; - } + @RequestCode(code = 215) + private boolean deleteTopicInbroker = true; - public void setGetBrokerConfig(boolean getBrokerConfig) { - this.getBrokerConfig = getBrokerConfig; - } + @RequestCode(code = 21) + private boolean getAllTopicConfig = true; - public boolean isSearchOffsetByTimestamp() { - return searchOffsetByTimestamp; - } + @RequestCode(code = 25) + private boolean updateBrokerConfig = true; - public void setSearchOffsetByTimestamp(boolean searchOffsetByTimestamp) { - this.searchOffsetByTimestamp = searchOffsetByTimestamp; - } + @RequestCode(code = 26) + private boolean getBrokerConfig = true; - public boolean isGetMaxOffset() { - return getMaxOffset; - } + @RequestCode(code = 29) + private boolean searchOffsetByTimestamp = true; - public void setGetMaxOffset(boolean getMaxOffset) { - this.getMaxOffset = getMaxOffset; - } + @RequestCode(code = 30) + private boolean getMaxOffset = true; - public boolean isGetMixOffset() { - return getMixOffset; - } + @RequestCode(code = 31) + private boolean getMixOffset = true; - public void setGetMixOffset(boolean getMixOffset) { - this.getMixOffset = getMixOffset; - } + @RequestCode(code = 32) + private boolean getEarliestMsgStoretime = true; - public boolean isGetEarliestMsgStoretime() { - return getEarliestMsgStoretime; - } + @RequestCode(code = 28) + private boolean getBrokerRuntimeInfo = true; - public void setGetEarliestMsgStoretime(boolean getEarliestMsgStoretime) { - this.getEarliestMsgStoretime = getEarliestMsgStoretime; - } + @RequestCode(code = 41) + private boolean lockBatchMQ = true; - public boolean isGetBrokerRuntimeInfo() { - return getBrokerRuntimeInfo; - } + @RequestCode(code = 42) + private boolean unlockBatchMQ = true; - public void setGetBrokerRuntimeInfo(boolean getBrokerRuntimeInfo) { - this.getBrokerRuntimeInfo = getBrokerRuntimeInfo; - } + @RequestCode(code = 200) + private boolean updateAndCreteSubscriptiongroup = true; - public boolean isLockBatchMQ() { - return lockBatchMQ; - } + @RequestCode(code = 201) + private boolean getAllSubscriptiongroupConfig = true; - public void setLockBatchMQ(boolean lockBatchMQ) { - this.lockBatchMQ = lockBatchMQ; - } + @RequestCode(code = 207) + private boolean deleteSubscriptiongroup = true; - public boolean isUnlockBatchMQ() { - return unlockBatchMQ; - } + @RequestCode(code = 202) + private boolean getTopicStatsInfo = true; - public void setUnlockBatchMQ(boolean unlockBatchMQ) { - this.unlockBatchMQ = unlockBatchMQ; - } + @RequestCode(code = 203) + private boolean getConsumerConnectionList = true; - public boolean isUpdateAndCreteSubscriptiongroup() { - return updateAndCreteSubscriptiongroup; - } + @RequestCode(code = 204) + private boolean getProducerConnectionList = true; - public void setUpdateAndCreteSubscriptiongroup(boolean updateAndCreteSubscriptiongroup) { - this.updateAndCreteSubscriptiongroup = updateAndCreteSubscriptiongroup; - } + @RequestCode(code = 208) + private boolean getConsumeStats = true; - public boolean isGetAllSubscriptiongroupConfig() { - return getAllSubscriptiongroupConfig; - } + @RequestCode(code = 43) + private boolean getAllConsumerOffset = true; - public void setGetAllSubscriptiongroupConfig(boolean getAllSubscriptiongroupConfig) { - this.getAllSubscriptiongroupConfig = getAllSubscriptiongroupConfig; - } + @RequestCode(code = 25) + private boolean getAllDelayOffset = true; - public boolean isDeleteSubscriptiongroup() { - return deleteSubscriptiongroup; - } + @RequestCode(code = 222) + private boolean invokeBrokerToresetOffset = true; - public void setDeleteSubscriptiongroup(boolean deleteSubscriptiongroup) { - this.deleteSubscriptiongroup = deleteSubscriptiongroup; - } + @RequestCode(code = 300) + private boolean queryTopicConsumByWho = true; - public boolean isGetTopicStatsInfo() { - return getTopicStatsInfo; - } + @RequestCode(code = 301) + private boolean registerFilterServer = true; - public void setGetTopicStatsInfo(boolean getTopicStatsInfo) { - this.getTopicStatsInfo = getTopicStatsInfo; - } + @RequestCode(code = 303) + private boolean queryConsumeTimeSpan = true; - public boolean isGetConsumerConnectionList() { - return getConsumerConnectionList; - } + @RequestCode(code = 305) + private boolean getSystemTopicListFromBroker = true; - public void setGetConsumerConnectionList(boolean getConsumerConnectionList) { - this.getConsumerConnectionList = getConsumerConnectionList; - } + @RequestCode(code = 306) + private boolean cleanExpiredConsumequeue = true; - public boolean isGetProducerConnectionList() { - return getProducerConnectionList; - } + @RequestCode(code = 316) + private boolean cleanUnusedTopic = true; - public void setGetProducerConnectionList(boolean getProducerConnectionList) { - this.getProducerConnectionList = getProducerConnectionList; - } + @RequestCode(code = 307) + private boolean getConsumerRunningInfo = true; - public boolean isGetConsumeStats() { - return getConsumeStats; - } + @RequestCode(code = 308) + private boolean queryCorrectionOffset = true; - public void setGetConsumeStats(boolean getConsumeStats) { - this.getConsumeStats = getConsumeStats; - } + @RequestCode(code = 309) + private boolean consumeMessageDirectly = true; - public boolean isGetAllConsumerOffset() { - return getAllConsumerOffset; - } + @RequestCode(code = 314) + private boolean cloneGroupOffset = true; - public void setGetAllConsumerOffset(boolean getAllConsumerOffset) { - this.getAllConsumerOffset = getAllConsumerOffset; - } + @RequestCode(code = 315) + private boolean viewBrokerStatsData = true; - public boolean isGetAllDelayOffset() { - return getAllDelayOffset; - } + @RequestCode(code = 317) + private boolean getBrokerConsumeStats = true; - public void setGetAllDelayOffset(boolean getAllDelayOffset) { - this.getAllDelayOffset = getAllDelayOffset; - } + @RequestCode(code = 321) + private boolean queryConsumeQueue = true; - public boolean isInvokeBrokerToresetOffset() { - return invokeBrokerToresetOffset; - } + public Set getPermitSendTopic() { + return permitSendTopic; + } - public void setInvokeBrokerToresetOffset(boolean invokeBrokerToresetOffset) { - this.invokeBrokerToresetOffset = invokeBrokerToresetOffset; - } + public void setPermitSendTopic(Set permitSendTopic) { + this.permitSendTopic = permitSendTopic; + } - public boolean isQueryTopicConsumByWho() { - return queryTopicConsumByWho; - } + public Set getNoPermitSendTopic() { + return noPermitSendTopic; + } - public void setQueryTopicConsumByWho(boolean queryTopicConsumByWho) { - this.queryTopicConsumByWho = queryTopicConsumByWho; - } + public void setNoPermitSendTopic(Set noPermitSendTopic) { + this.noPermitSendTopic = noPermitSendTopic; + } + + public Set getPermitPullTopic() { + return permitPullTopic; + } + + public void setPermitPullTopic(Set permitPullTopic) { + this.permitPullTopic = permitPullTopic; + } + + public Set getNoPermitPullTopic() { + return noPermitPullTopic; + } + + public void setNoPermitPullTopic(Set noPermitPullTopic) { + this.noPermitPullTopic = noPermitPullTopic; + } + + public boolean isSendMessage() { + return sendMessage; + } + + public void setSendMessage(boolean sendMessage) { + this.sendMessage = sendMessage; + } + + public boolean isSendMessageV2() { + return sendMessageV2; + } + + public void setSendMessageV2(boolean sendMessageV2) { + this.sendMessageV2 = sendMessageV2; + } + + public boolean isSendBatchMessage() { + return sendBatchMessage; + } + + public void setSendBatchMessage(boolean sendBatchMessage) { + this.sendBatchMessage = sendBatchMessage; + } + + public boolean isConsumerSendMsgBack() { + return consumerSendMsgBack; + } + + public void setConsumerSendMsgBack(boolean consumerSendMsgBack) { + this.consumerSendMsgBack = consumerSendMsgBack; + } + + public boolean isPullMessage() { + return pullMessage; + } + + public void setPullMessage(boolean pullMessage) { + this.pullMessage = pullMessage; + } + + public boolean isQueryMessage() { + return queryMessage; + } + + public void setQueryMessage(boolean queryMessage) { + this.queryMessage = queryMessage; + } + + public boolean isViewMessageById() { + return viewMessageById; + } + + public void setViewMessageById(boolean viewMessageById) { + this.viewMessageById = viewMessageById; + } + + public boolean isHeartBeat() { + return heartBeat; + } + + public void setHeartBeat(boolean heartBeat) { + this.heartBeat = heartBeat; + } + + public boolean isUnregisterClient() { + return unregisterClient; + } + + public void setUnregisterClient(boolean unregisterClient) { + this.unregisterClient = unregisterClient; + } + + public boolean isCheckClientConfig() { + return checkClientConfig; + } + + public void setCheckClientConfig(boolean checkClientConfig) { + this.checkClientConfig = checkClientConfig; + } + + public boolean isGetConsumerListByGroup() { + return getConsumerListByGroup; + } + + public void setGetConsumerListByGroup(boolean getConsumerListByGroup) { + this.getConsumerListByGroup = getConsumerListByGroup; + } + + public boolean isUpdateConsumerOffset() { + return updateConsumerOffset; + } + + public void setUpdateConsumerOffset(boolean updateConsumerOffset) { + this.updateConsumerOffset = updateConsumerOffset; + } + + public boolean isQueryConsumerOffset() { + return queryConsumerOffset; + } + + public void setQueryConsumerOffset(boolean queryConsumerOffset) { + this.queryConsumerOffset = queryConsumerOffset; + } + + public boolean isEndTransaction() { + return endTransaction; + } + + public void setEndTransaction(boolean endTransaction) { + this.endTransaction = endTransaction; + } + + public boolean isUpdateAndCreateTopic() { + return updateAndCreateTopic; + } + + public void setUpdateAndCreateTopic(boolean updateAndCreateTopic) { + this.updateAndCreateTopic = updateAndCreateTopic; + } + + public boolean isDeleteTopicInbroker() { + return deleteTopicInbroker; + } + + public void setDeleteTopicInbroker(boolean deleteTopicInbroker) { + this.deleteTopicInbroker = deleteTopicInbroker; + } + + public boolean isGetAllTopicConfig() { + return getAllTopicConfig; + } + + public void setGetAllTopicConfig(boolean getAllTopicConfig) { + this.getAllTopicConfig = getAllTopicConfig; + } + + public boolean isUpdateBrokerConfig() { + return updateBrokerConfig; + } + + public void setUpdateBrokerConfig(boolean updateBrokerConfig) { + this.updateBrokerConfig = updateBrokerConfig; + } + + public boolean isGetBrokerConfig() { + return getBrokerConfig; + } + + public void setGetBrokerConfig(boolean getBrokerConfig) { + this.getBrokerConfig = getBrokerConfig; + } + + public boolean isSearchOffsetByTimestamp() { + return searchOffsetByTimestamp; + } + + public void setSearchOffsetByTimestamp(boolean searchOffsetByTimestamp) { + this.searchOffsetByTimestamp = searchOffsetByTimestamp; + } + + public boolean isGetMaxOffset() { + return getMaxOffset; + } + + public void setGetMaxOffset(boolean getMaxOffset) { + this.getMaxOffset = getMaxOffset; + } + + public boolean isGetMixOffset() { + return getMixOffset; + } + + public void setGetMixOffset(boolean getMixOffset) { + this.getMixOffset = getMixOffset; + } + + public boolean isGetEarliestMsgStoretime() { + return getEarliestMsgStoretime; + } + + public void setGetEarliestMsgStoretime(boolean getEarliestMsgStoretime) { + this.getEarliestMsgStoretime = getEarliestMsgStoretime; + } + + public boolean isGetBrokerRuntimeInfo() { + return getBrokerRuntimeInfo; + } + + public void setGetBrokerRuntimeInfo(boolean getBrokerRuntimeInfo) { + this.getBrokerRuntimeInfo = getBrokerRuntimeInfo; + } + + public boolean isLockBatchMQ() { + return lockBatchMQ; + } + + public void setLockBatchMQ(boolean lockBatchMQ) { + this.lockBatchMQ = lockBatchMQ; + } + + public boolean isUnlockBatchMQ() { + return unlockBatchMQ; + } + + public void setUnlockBatchMQ(boolean unlockBatchMQ) { + this.unlockBatchMQ = unlockBatchMQ; + } + + public boolean isUpdateAndCreteSubscriptiongroup() { + return updateAndCreteSubscriptiongroup; + } + + public void setUpdateAndCreteSubscriptiongroup(boolean updateAndCreteSubscriptiongroup) { + this.updateAndCreteSubscriptiongroup = updateAndCreteSubscriptiongroup; + } + + public boolean isGetAllSubscriptiongroupConfig() { + return getAllSubscriptiongroupConfig; + } + + public void setGetAllSubscriptiongroupConfig(boolean getAllSubscriptiongroupConfig) { + this.getAllSubscriptiongroupConfig = getAllSubscriptiongroupConfig; + } + + public boolean isDeleteSubscriptiongroup() { + return deleteSubscriptiongroup; + } + + public void setDeleteSubscriptiongroup(boolean deleteSubscriptiongroup) { + this.deleteSubscriptiongroup = deleteSubscriptiongroup; + } + + public boolean isGetTopicStatsInfo() { + return getTopicStatsInfo; + } + + public void setGetTopicStatsInfo(boolean getTopicStatsInfo) { + this.getTopicStatsInfo = getTopicStatsInfo; + } + + public boolean isGetConsumerConnectionList() { + return getConsumerConnectionList; + } + + public void setGetConsumerConnectionList(boolean getConsumerConnectionList) { + this.getConsumerConnectionList = getConsumerConnectionList; + } + + public boolean isGetProducerConnectionList() { + return getProducerConnectionList; + } + + public void setGetProducerConnectionList(boolean getProducerConnectionList) { + this.getProducerConnectionList = getProducerConnectionList; + } + + public boolean isGetConsumeStats() { + return getConsumeStats; + } + + public void setGetConsumeStats(boolean getConsumeStats) { + this.getConsumeStats = getConsumeStats; + } + + public boolean isGetAllConsumerOffset() { + return getAllConsumerOffset; + } + + public void setGetAllConsumerOffset(boolean getAllConsumerOffset) { + this.getAllConsumerOffset = getAllConsumerOffset; + } + + public boolean isGetAllDelayOffset() { + return getAllDelayOffset; + } + + public void setGetAllDelayOffset(boolean getAllDelayOffset) { + this.getAllDelayOffset = getAllDelayOffset; + } + + public boolean isInvokeBrokerToresetOffset() { + return invokeBrokerToresetOffset; + } + + public void setInvokeBrokerToresetOffset(boolean invokeBrokerToresetOffset) { + this.invokeBrokerToresetOffset = invokeBrokerToresetOffset; + } + + public boolean isQueryTopicConsumByWho() { + return queryTopicConsumByWho; + } + + public void setQueryTopicConsumByWho(boolean queryTopicConsumByWho) { + this.queryTopicConsumByWho = queryTopicConsumByWho; + } + + public boolean isRegisterFilterServer() { + return registerFilterServer; + } + + public void setRegisterFilterServer(boolean registerFilterServer) { + this.registerFilterServer = registerFilterServer; + } + + public boolean isQueryConsumeTimeSpan() { + return queryConsumeTimeSpan; + } + + public void setQueryConsumeTimeSpan(boolean queryConsumeTimeSpan) { + this.queryConsumeTimeSpan = queryConsumeTimeSpan; + } + + public boolean isGetSystemTopicListFromBroker() { + return getSystemTopicListFromBroker; + } + + public void setGetSystemTopicListFromBroker(boolean getSystemTopicListFromBroker) { + this.getSystemTopicListFromBroker = getSystemTopicListFromBroker; + } + + public boolean isCleanExpiredConsumequeue() { + return cleanExpiredConsumequeue; + } + + public void setCleanExpiredConsumequeue(boolean cleanExpiredConsumequeue) { + this.cleanExpiredConsumequeue = cleanExpiredConsumequeue; + } + + public boolean isCleanUnusedTopic() { + return cleanUnusedTopic; + } + + public void setCleanUnusedTopic(boolean cleanUnusedTopic) { + this.cleanUnusedTopic = cleanUnusedTopic; + } + + public boolean isGetConsumerRunningInfo() { + return getConsumerRunningInfo; + } + + public void setGetConsumerRunningInfo(boolean getConsumerRunningInfo) { + this.getConsumerRunningInfo = getConsumerRunningInfo; + } + + public boolean isQueryCorrectionOffset() { + return queryCorrectionOffset; + } + + public void setQueryCorrectionOffset(boolean queryCorrectionOffset) { + this.queryCorrectionOffset = queryCorrectionOffset; + } + + public boolean isConsumeMessageDirectly() { + return consumeMessageDirectly; + } + + public void setConsumeMessageDirectly(boolean consumeMessageDirectly) { + this.consumeMessageDirectly = consumeMessageDirectly; + } + + public boolean isCloneGroupOffset() { + return cloneGroupOffset; + } + + public void setCloneGroupOffset(boolean cloneGroupOffset) { + this.cloneGroupOffset = cloneGroupOffset; + } + + public boolean isViewBrokerStatsData() { + return viewBrokerStatsData; + } + + public void setViewBrokerStatsData(boolean viewBrokerStatsData) { + this.viewBrokerStatsData = viewBrokerStatsData; + } + + public boolean isGetBrokerConsumeStats() { + return getBrokerConsumeStats; + } + + public void setGetBrokerConsumeStats(boolean getBrokerConsumeStats) { + this.getBrokerConsumeStats = getBrokerConsumeStats; + } + + public boolean isQueryConsumeQueue() { + return queryConsumeQueue; + } + + public void setQueryConsumeQueue(boolean queryConsumeQueue) { + this.queryConsumeQueue = queryConsumeQueue; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("BorkerAccessControl [permitSendTopic=").append(permitSendTopic).append(", noPermitSendTopic=") + .append(noPermitSendTopic).append(", permitPullTopic=").append(permitPullTopic) + .append(", noPermitPullTopic=").append(noPermitPullTopic); + if (!!sendMessage) + builder.append(", sendMessage=").append(sendMessage); + if (!!sendMessageV2) + builder.append(", sendMessageV2=").append(sendMessageV2); + if (!sendBatchMessage) + builder.append(", sendBatchMessage=").append(sendBatchMessage); + if (!consumerSendMsgBack) + builder.append(", consumerSendMsgBack=").append(consumerSendMsgBack); + if (!pullMessage) + builder.append(", pullMessage=").append(pullMessage); + if (!queryMessage) + builder.append(", queryMessage=").append(queryMessage); + if (!viewMessageById) + builder.append(", viewMessageById=").append(viewMessageById); + if (!heartBeat) + builder.append(", heartBeat=").append(heartBeat); + if (!unregisterClient) + builder.append(", unregisterClient=").append(unregisterClient); + if (!checkClientConfig) + builder.append(", checkClientConfig=").append(checkClientConfig); + if (!getConsumerListByGroup) + builder.append(", getConsumerListByGroup=").append(getConsumerListByGroup); + if (!updateConsumerOffset) + builder.append(", updateConsumerOffset=").append(updateConsumerOffset); + if (!queryConsumerOffset) + builder.append(", queryConsumerOffset=").append(queryConsumerOffset); + if (!endTransaction) + builder.append(", endTransaction=").append(endTransaction); + if (!updateAndCreateTopic) + builder.append(", updateAndCreateTopic=").append(updateAndCreateTopic); + if (!deleteTopicInbroker) + builder.append(", deleteTopicInbroker=").append(deleteTopicInbroker); + if (!getAllTopicConfig) + builder.append(", getAllTopicConfig=").append(getAllTopicConfig); + if (!updateBrokerConfig) + builder.append(", updateBrokerConfig=").append(updateBrokerConfig); + if (!getBrokerConfig) + builder.append(", getBrokerConfig=").append(getBrokerConfig); + if (!searchOffsetByTimestamp) + builder.append(", searchOffsetByTimestamp=").append(searchOffsetByTimestamp); + if (!getMaxOffset) + builder.append(", getMaxOffset=").append(getMaxOffset); + if (!getMixOffset) + builder.append(", getMixOffset=").append(getMixOffset); + if (!getEarliestMsgStoretime) + builder.append(", getEarliestMsgStoretime=").append(getEarliestMsgStoretime); + if (!getBrokerRuntimeInfo) + builder.append(", getBrokerRuntimeInfo=").append(getBrokerRuntimeInfo); + if (!lockBatchMQ) + builder.append(", lockBatchMQ=").append(lockBatchMQ); + if (!unlockBatchMQ) + builder.append(", unlockBatchMQ=").append(unlockBatchMQ); + if (!updateAndCreteSubscriptiongroup) + builder.append(", updateAndCreteSubscriptiongroup=").append(updateAndCreteSubscriptiongroup); + if (!getAllSubscriptiongroupConfig) + builder.append(", getAllSubscriptiongroupConfig=").append(getAllSubscriptiongroupConfig); + if (!deleteSubscriptiongroup) + builder.append(", deleteSubscriptiongroup=").append(deleteSubscriptiongroup); + if (!getTopicStatsInfo) + builder.append(", getTopicStatsInfo=").append(getTopicStatsInfo); + if (!getConsumerConnectionList) + builder.append(", getConsumerConnectionList=").append(getConsumerConnectionList); + if (!getProducerConnectionList) + builder.append(", getProducerConnectionList=").append(getProducerConnectionList); + if (!getConsumeStats) + builder.append(", getConsumeStats=").append(getConsumeStats); + if (!getAllConsumerOffset) + builder.append(", getAllConsumerOffset=").append(getAllConsumerOffset); + if (!getAllDelayOffset) + builder.append(", getAllDelayOffset=").append(getAllDelayOffset); + if (!invokeBrokerToresetOffset) + builder.append(", invokeBrokerToresetOffset=").append(invokeBrokerToresetOffset); + if (!queryTopicConsumByWho) + builder.append(", queryTopicConsumByWho=").append(queryTopicConsumByWho); + if (!registerFilterServer) + builder.append(", registerFilterServer=").append(registerFilterServer); + if (!queryConsumeTimeSpan) + builder.append(", queryConsumeTimeSpan=").append(queryConsumeTimeSpan); + if (!getSystemTopicListFromBroker) + builder.append(", getSystemTopicListFromBroker=").append(getSystemTopicListFromBroker); + if (!cleanExpiredConsumequeue) + builder.append(", cleanExpiredConsumequeue=").append(cleanExpiredConsumequeue); + if (!getConsumerRunningInfo) + builder.append(", cleanUnusedTopic=").append(getConsumerRunningInfo); + if (!getConsumerRunningInfo) + builder.append(", getConsumerRunningInfo=").append(getConsumerRunningInfo); + if (!queryCorrectionOffset) + builder.append(", queryCorrectionOffset=").append(queryCorrectionOffset); + if (!consumeMessageDirectly) + builder.append(", consumeMessageDirectly=").append(consumeMessageDirectly); + if (!cloneGroupOffset) + builder.append(", cloneGroupOffset=").append(cloneGroupOffset); + if (!viewBrokerStatsData) + builder.append(", viewBrokerStatsData=").append(viewBrokerStatsData); + if (!getBrokerConsumeStats) + builder.append(", getBrokerConsumeStats=").append(getBrokerConsumeStats); + if (!queryConsumeQueue) + builder.append(", queryConsumeQueue=").append(queryConsumeQueue); + builder.append("]"); + return builder.toString(); + } - public boolean isRegisterFilterServer() { - return registerFilterServer; - } - - public void setRegisterFilterServer(boolean registerFilterServer) { - this.registerFilterServer = registerFilterServer; - } - - public boolean isQueryConsumeTimeSpan() { - return queryConsumeTimeSpan; - } - - public void setQueryConsumeTimeSpan(boolean queryConsumeTimeSpan) { - this.queryConsumeTimeSpan = queryConsumeTimeSpan; - } - - public boolean isGetSystemTopicListFromBroker() { - return getSystemTopicListFromBroker; - } - - public void setGetSystemTopicListFromBroker(boolean getSystemTopicListFromBroker) { - this.getSystemTopicListFromBroker = getSystemTopicListFromBroker; - } - - public boolean isCleanExpiredConsumequeue() { - return cleanExpiredConsumequeue; - } - - public void setCleanExpiredConsumequeue(boolean cleanExpiredConsumequeue) { - this.cleanExpiredConsumequeue = cleanExpiredConsumequeue; - } - - public boolean isCleanUnusedTopic() { - return cleanUnusedTopic; - } - - public void setCleanUnusedTopic(boolean cleanUnusedTopic) { - this.cleanUnusedTopic = cleanUnusedTopic; - } - - public boolean isGetConsumerRunningInfo() { - return getConsumerRunningInfo; - } - - public void setGetConsumerRunningInfo(boolean getConsumerRunningInfo) { - this.getConsumerRunningInfo = getConsumerRunningInfo; - } - - public boolean isQueryCorrectionOffset() { - return queryCorrectionOffset; - } - - public void setQueryCorrectionOffset(boolean queryCorrectionOffset) { - this.queryCorrectionOffset = queryCorrectionOffset; - } - - public boolean isConsumeMessageDirectly() { - return consumeMessageDirectly; - } - - public void setConsumeMessageDirectly(boolean consumeMessageDirectly) { - this.consumeMessageDirectly = consumeMessageDirectly; - } - - public boolean isCloneGroupOffset() { - return cloneGroupOffset; - } - - public void setCloneGroupOffset(boolean cloneGroupOffset) { - this.cloneGroupOffset = cloneGroupOffset; - } - - public boolean isViewBrokerStatsData() { - return viewBrokerStatsData; - } - - public void setViewBrokerStatsData(boolean viewBrokerStatsData) { - this.viewBrokerStatsData = viewBrokerStatsData; - } - - public boolean isGetBrokerConsumeStats() { - return getBrokerConsumeStats; - } - - public void setGetBrokerConsumeStats(boolean getBrokerConsumeStats) { - this.getBrokerConsumeStats = getBrokerConsumeStats; - } - - public boolean isQueryConsumeQueue() { - return queryConsumeQueue; - } - - public void setQueryConsumeQueue(boolean queryConsumeQueue) { - this.queryConsumeQueue = queryConsumeQueue; - } - - @Override - public String toString() { - return "BorkerAccessControl [permitSendTopic=" + permitSendTopic + ", noPermitSendTopic=" + noPermitSendTopic - + ", permitPullTopic=" + permitPullTopic + ", noPermitPullTopic=" + noPermitPullTopic + ", sendMessage=" - + sendMessage + ", sendMessageV2=" + sendMessageV2 + ", sendBatchMessage=" + sendBatchMessage - + ", consumerSendMsgBack=" + consumerSendMsgBack + ", pullMessage=" + pullMessage + ", queryMessage=" - + queryMessage + ", viewMessageById=" + viewMessageById + ", heartBeat=" + heartBeat - + ", unregisterClient=" + unregisterClient + ", checkClientConfig=" + checkClientConfig - + ", getConsumerListByGroup=" + getConsumerListByGroup + ", updateConsumerOffset=" - + updateConsumerOffset + ", queryConsumerOffset=" + queryConsumerOffset + ", endTransaction=" - + endTransaction + ", updateAndCreateTopic=" + updateAndCreateTopic + ", deleteTopicInbroker=" - + deleteTopicInbroker + ", getAllTopicConfig=" + getAllTopicConfig + ", updateBrokerConfig=" - + updateBrokerConfig + ", getBrokerConfig=" + getBrokerConfig + ", searchOffsetByTimestamp=" - + searchOffsetByTimestamp + ", getMaxOffset=" + getMaxOffset + ", getMixOffset=" + getMixOffset - + ", getEarliestMsgStoretime=" + getEarliestMsgStoretime + ", getBrokerRuntimeInfo=" - + getBrokerRuntimeInfo + ", lockBatchMQ=" + lockBatchMQ + ", unlockBatchMQ=" + unlockBatchMQ - + ", updateAndCreteSubscriptiongroup=" + updateAndCreteSubscriptiongroup - + ", getAllSubscriptiongroupConfig=" + getAllSubscriptiongroupConfig + ", deleteSubscriptiongroup=" - + deleteSubscriptiongroup + ", getTopicStatsInfo=" + getTopicStatsInfo + ", getConsumerConnectionList=" - + getConsumerConnectionList + ", getProducerConnectionList=" + getProducerConnectionList - + ", getConsumeStats=" + getConsumeStats + ", getAllConsumerOffset=" + getAllConsumerOffset - + ", getAllDelayOffset=" + getAllDelayOffset + ", invokeBrokerToresetOffset=" - + invokeBrokerToresetOffset + ", queryTopicConsumByWho=" + queryTopicConsumByWho - + ", registerFilterServer=" + registerFilterServer + ", queryConsumeTimeSpan=" + queryConsumeTimeSpan - + ", getSystemTopicListFromBroker=" + getSystemTopicListFromBroker + ", cleanExpiredConsumequeue=" - + cleanExpiredConsumequeue + ", cleanUnusedTopic=" + cleanUnusedTopic + ", getConsumerRunningInfo=" - + getConsumerRunningInfo + ", queryCorrectionOffset=" + queryCorrectionOffset - + ", consumeMessageDirectly=" + consumeMessageDirectly + ", cloneGroupOffset=" + cloneGroupOffset - + ", viewBrokerStatsData=" + viewBrokerStatsData + ", getBrokerConsumeStats=" + getBrokerConsumeStats - + ", queryConsumeQueue=" + queryConsumeQueue + ", toString()=" + super.toString() + "]"; - } - - } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java index 47848bd873..93d002315d 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java @@ -1,40 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; import java.util.List; public class BorkerAccessControlTransport { - private BorkerAccessControl onlyNetAddress; - - private List list; + private BorkerAccessControl onlyNetAddress; - + private List list; - public BorkerAccessControlTransport() { - super(); - } + public BorkerAccessControlTransport() { + super(); + } - public BorkerAccessControl getOnlyNetAddress() { - return onlyNetAddress; - } + public BorkerAccessControl getOnlyNetAddress() { + return onlyNetAddress; + } - public void setOnlyNetAddress(BorkerAccessControl onlyNetAddress) { - this.onlyNetAddress = onlyNetAddress; - } + public void setOnlyNetAddress(BorkerAccessControl onlyNetAddress) { + this.onlyNetAddress = onlyNetAddress; + } - public List getList() { - return list; - } + public List getList() { + return list; + } - public void setList(List list) { - this.list = list; - } + public void setList(List list) { + this.list = list; + } + + @Override + public String toString() { + return "BorkerAccessControlTransport [onlyNetAddress=" + onlyNetAddress + ", list=" + list + "]"; + } - @Override - public String toString() { - return "BorkerAccessControlTransport [onlyNetAddress=" + onlyNetAddress + ", list=" + list + "]"; - } - - - } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java index 1cb99071fa..2d515477ad 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java @@ -1,5 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; public class ControllerParametersEntity { + private String fileHome; + + public String getFileHome() { + return fileHome; + } + + public void setFileHome(String fileHome) { + this.fileHome = fileHome; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ControllerParametersEntity [fileHome=").append(fileHome).append("]"); + return builder.toString(); + } + } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java index bbdeda32c0..e08d7d38b1 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java @@ -1,55 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; +import java.util.concurrent.atomic.AtomicBoolean; + public class LoginInfo { - - private String recognition; + private String recognition; - private long loginTime = System.currentTimeMillis(); - - private long operationTime = loginTime; - - private AuthenticationInfo authenticationInfo; - - - - public AuthenticationInfo getAuthenticationInfo() { - return authenticationInfo; - } + private long loginTime = System.currentTimeMillis(); - public void setAuthenticationInfo(AuthenticationInfo authenticationInfo) { - this.authenticationInfo = authenticationInfo; - } + private volatile long operationTime = loginTime; - public String getRecognition() { - return recognition; - } + private volatile AtomicBoolean clear = new AtomicBoolean(); - public void setRecognition(String recognition) { - this.recognition = recognition; - } + private AuthenticationInfo authenticationInfo; - public long getLoginTime() { - return loginTime; - } + public AuthenticationInfo getAuthenticationInfo() { + return authenticationInfo; + } - public void setLoginTime(long loginTime) { - this.loginTime = loginTime; - } + public void setAuthenticationInfo(AuthenticationInfo authenticationInfo) { + this.authenticationInfo = authenticationInfo; + } - public long getOperationTime() { - return operationTime; - } + public String getRecognition() { + return recognition; + } - public void setOperationTime(long operationTime) { - this.operationTime = operationTime; - } + public void setRecognition(String recognition) { + this.recognition = recognition; + } + + public long getLoginTime() { + return loginTime; + } + + public void setLoginTime(long loginTime) { + this.loginTime = loginTime; + } + + public long getOperationTime() { + return operationTime; + } + + public void setOperationTime(long operationTime) { + this.operationTime = operationTime; + } + + public AtomicBoolean getClear() { + return clear; + } + + public void setClear(AtomicBoolean clear) { + this.clear = clear; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("LoginInfo [recognition=").append(recognition).append(", loginTime=").append(loginTime) + .append(", operationTime=").append(operationTime).append(", clear=").append(clear) + .append(", authenticationInfo=").append(authenticationInfo).append("]"); + return builder.toString(); + } - @Override - public String toString() { - return "LoginInfo [recognition=" + recognition + ", loginTime=" + loginTime + ", operationTime=" + operationTime - + ", authenticationInfo=" + authenticationInfo + "]"; - } - - } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java index 08676ca2f1..ca070e26c1 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java @@ -1,39 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; -/** - * @author Administrator - * - */ public class LoginOrRequestAccessControl extends AccessControl { - - private int code; - - private String topic; + private int code; - public int getCode() { - return code; - } + private String topic; - public void setCode(int code) { - this.code = code; - } + public int getCode() { + return code; + } - public String getTopic() { - return topic; - } + public void setCode(int code) { + this.code = code; + } - public void setTopic(String topic) { - this.topic = topic; - } + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("LoginOrRequestAccessControl [code=").append(code).append(", topic=").append(topic).append("]"); + return builder.toString(); + } - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("LoginOrRequestAccessControl [code=").append(code).append(", topic=").append(topic).append("]"); - return builder.toString(); - } - - - } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAccountAnalysisException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAccountAnalysisException.java new file mode 100644 index 0000000000..145557fa5b --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAccountAnalysisException.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; + +public class AclPlugAccountAnalysisException extends AclPlugRuntimeException { + + private static final long serialVersionUID = -7286948517911075176L; + + public AclPlugAccountAnalysisException(String message) { + super(message); + } + + public AclPlugAccountAnalysisException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAuthenticationException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAuthenticationException.java new file mode 100644 index 0000000000..613b76e832 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAuthenticationException.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; + +public class AclPlugAuthenticationException extends AclPlugRuntimeException { + + private static final long serialVersionUID = 6365666045084521516L; + + public AclPlugAuthenticationException(String message) { + super(message); + } + + public AclPlugAuthenticationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugException.java new file mode 100644 index 0000000000..33ac968969 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugException.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; + +public class AclPlugException extends Exception { + + private static final long serialVersionUID = 6843154847463800519L; + + public AclPlugException(String message) { + super(message); + } + + public AclPlugException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugLoginException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugLoginException.java new file mode 100644 index 0000000000..071d2cccbe --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugLoginException.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; + +public class AclPlugLoginException extends AclPlugRuntimeException { + + private static final long serialVersionUID = 4593661700080106122L; + + public AclPlugLoginException(String message) { + super(message); + } + + public AclPlugLoginException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java new file mode 100644 index 0000000000..0048b2c681 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; + +public class AclPlugRuntimeException extends RuntimeException { + + private static final long serialVersionUID = 6062101368637228900L; + + public AclPlugRuntimeException(String message) { + super(message); + } + + public AclPlugRuntimeException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugStartException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugStartException.java new file mode 100644 index 0000000000..eaef556c55 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugStartException.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; + +public class AclPlugStartException extends AclPlugException { + + private static final long serialVersionUID = 5118936374739373693L; + + public AclPlugStartException(String message) { + super(message); + } + + public AclPlugStartException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java index b1209ec13b..29f5b29cf3 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java @@ -1,11 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; import org.apache.rocketmq.acl.plug.AclUtils; public abstract class AbstractNetaddressStrategy implements NetaddressStrategy { - public void verify(String netaddress , int index) { - AclUtils.isScope(netaddress, index); - } + public void verify(String netaddress, int index) { + AclUtils.isScope(netaddress, index); + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java index 2380e86a45..557cabc7de 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; import java.util.HashSet; @@ -7,19 +23,18 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; public class MultipleNetaddressStrategy extends AbstractNetaddressStrategy { - private final Set multipleSet = new HashSet<>(); - - public MultipleNetaddressStrategy(String[] strArray) { - for(String netaddress : strArray) { - verify(netaddress, 4); - multipleSet.add(netaddress); - } - } - - - @Override - public boolean match(AccessControl accessControl) { - return multipleSet.contains(accessControl.getNetaddress()); - } + private final Set multipleSet = new HashSet<>(); + + public MultipleNetaddressStrategy(String[] strArray) { + for (String netaddress : strArray) { + verify(netaddress, 4); + multipleSet.add(netaddress); + } + } + + @Override + public boolean match(AccessControl accessControl) { + return multipleSet.contains(accessControl.getNetaddress()); + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java index 00cf3264f3..7276634e30 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java @@ -1,9 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; import org.apache.rocketmq.acl.plug.entity.AccessControl; public interface NetaddressStrategy { - - public boolean match(AccessControl accessControl); + public boolean match(AccessControl accessControl); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java index f6dd8d4994..9bf28b5b71 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; import org.apache.commons.lang3.StringUtils; @@ -6,26 +22,24 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; public class NetaddressStrategyFactory { - - - public NetaddressStrategy getNetaddressStrategy(AccessControl accessControl ) { - String netaddress = accessControl.getNetaddress(); - if(StringUtils.isBlank(netaddress) || "*".equals(netaddress) ) {//* - return NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY; - } - if(netaddress.endsWith("}")) {//1.1.1.{1,2,3,4,5} - String[] strArray = StringUtils.split(netaddress); - String four = strArray[3]; - if(!four.startsWith("{")) { - - } - return new MultipleNetaddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); - }else if(AclUtils.isColon(netaddress)) {//1.1.1.1,1.2.3.4.5 - return new MultipleNetaddressStrategy( StringUtils.split(",")); - }else if(AclUtils.isAsterisk(netaddress) || AclUtils.isMinus(netaddress)) {//1.2.*.* , 1.1.1.1-5 ,1.1.1-5.* - return new RangeNetaddressStrategy(netaddress); - } - return new OneNetaddressStrategy(netaddress); - - } + public NetaddressStrategy getNetaddressStrategy(AccessControl accessControl) { + String netaddress = accessControl.getNetaddress(); + if (StringUtils.isBlank(netaddress) || "*".equals(netaddress)) { + return NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY; + } + if (netaddress.endsWith("}")) { + String[] strArray = StringUtils.split(netaddress); + String four = strArray[3]; + if (!four.startsWith("{")) { + + } + return new MultipleNetaddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); + } else if (AclUtils.isColon(netaddress)) { + return new MultipleNetaddressStrategy(StringUtils.split(",")); + } else if (AclUtils.isAsterisk(netaddress) || AclUtils.isMinus(netaddress)) { + return new RangeNetaddressStrategy(netaddress); + } + return new OneNetaddressStrategy(netaddress); + + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java index c266b03c8b..476eaa152e 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java @@ -1,15 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; import org.apache.rocketmq.acl.plug.entity.AccessControl; public class NullNetaddressStrategy implements NetaddressStrategy { - public static final NullNetaddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullNetaddressStrategy(); - - - @Override - public boolean match(AccessControl accessControl) { - return true; - } + public static final NullNetaddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullNetaddressStrategy(); + + @Override + public boolean match(AccessControl accessControl) { + return true; + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java index eb63f94cb3..027e49334d 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java @@ -1,19 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; import org.apache.rocketmq.acl.plug.entity.AccessControl; public class OneNetaddressStrategy extends AbstractNetaddressStrategy { - - private String netaddress; - - public OneNetaddressStrategy(String netaddress) { - this.netaddress = netaddress; - } - - @Override - public boolean match(AccessControl accessControl) { - return netaddress.equals(accessControl.getNetaddress()); - } + private String netaddress; + + public OneNetaddressStrategy(String netaddress) { + this.netaddress = netaddress; + } + + @Override + public boolean match(AccessControl accessControl) { + return netaddress.equals(accessControl.getNetaddress()); + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java index 8179944d47..c56b86678b 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; import org.apache.commons.lang3.StringUtils; @@ -6,64 +22,63 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; public class RangeNetaddressStrategy extends AbstractNetaddressStrategy { - private String head; - - private int start; - - private int end; - - private int index; - - public RangeNetaddressStrategy(String netaddress) { - String[] strArray = StringUtils.split(netaddress , "."); - if( analysis(strArray , 2) ||analysis(strArray , 3) ) { - verify(netaddress, index); - StringBuffer sb = new StringBuffer().append( strArray[0].trim()).append(".").append( strArray[1].trim()).append("."); - if(index == 3) { - sb.append( strArray[2].trim()).append("."); - } - this.head = sb.toString(); - } - } - - private boolean analysis(String[] strArray , int index ) { - String value = strArray[index].trim(); - this.index = index; - if( "*".equals( value) ){ - setValue(0, 255); - }else if(AclUtils.isMinus( value )) { - String[] valueArray = StringUtils.split( value , "-" ); - this.start = Integer.valueOf(valueArray[0]); - this.end = Integer.valueOf(valueArray[1]); - if ( !(AclUtils.isScope( end ) && AclUtils.isScope( start ) && start <= end)) { - - } - } - return this.end > 0 ? true : false; - } - - - private void setValue(int start , int end) { - this.start = start ; - this.end = end; - } - - @Override - public boolean match(AccessControl accessControl) { - String netAddress = accessControl.getNetaddress(); - if ( netAddress.startsWith(this.head)) { - String value; - if(index == 3) { - value = netAddress.substring(this.head.length()); - }else { - value = netAddress.substring(this.head.length() , netAddress.lastIndexOf('.')); - } - Integer address = Integer.valueOf(value); - if( address>= this.start && address <= this.end ) { - return true; - } - } - return false; - } + private String head; + + private int start; + + private int end; + + private int index; + + public RangeNetaddressStrategy(String netaddress) { + String[] strArray = StringUtils.split(netaddress, "."); + if (analysis(strArray, 2) || analysis(strArray, 3)) { + verify(netaddress, index); + StringBuffer sb = new StringBuffer().append(strArray[0].trim()).append(".").append(strArray[1].trim()).append("."); + if (index == 3) { + sb.append(strArray[2].trim()).append("."); + } + this.head = sb.toString(); + } + } + + private boolean analysis(String[] strArray, int index) { + String value = strArray[index].trim(); + this.index = index; + if ("*".equals(value)) { + setValue(0, 255); + } else if (AclUtils.isMinus(value)) { + String[] valueArray = StringUtils.split(value, "-"); + this.start = Integer.valueOf(valueArray[0]); + this.end = Integer.valueOf(valueArray[1]); + if (!(AclUtils.isScope(end) && AclUtils.isScope(start) && start <= end)) { + + } + } + return this.end > 0 ? true : false; + } + + private void setValue(int start, int end) { + this.start = start; + this.end = end; + } + + @Override + public boolean match(AccessControl accessControl) { + String netAddress = accessControl.getNetaddress(); + if (netAddress.startsWith(this.head)) { + String value; + if (index == 3) { + value = netAddress.substring(this.head.length()); + } else { + value = netAddress.substring(this.head.length(), netAddress.lastIndexOf('.')); + } + Integer address = Integer.valueOf(value); + if (address >= this.start && address <= this.end) { + return true; + } + } + return false; + } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java index db0a45921e..93f1f0cac4 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java @@ -7,11 +7,11 @@ import org.junit.Test; public class AccessContralAnalysisTest { - @Test - public void analysisTest() { - AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - Map map = accessContralAnalysis.analysis(new BorkerAccessControl()); - System.out.println(map); - } + @Test + public void analysisTest() { + AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + Map map = accessContralAnalysis.analysis(new BorkerAccessControl()); + System.out.println(map); + } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 0a49e2950d..30951c6ee5 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -4,9 +4,9 @@ import org.junit.Test; public class PlainAclPlugEngineTest { - @Test - public void testPlainAclPlugEngineInit() { - PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); - plainAclPlugEngine.init(); - } + @Test + public void testPlainAclPlugEngineInit() { + //PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); + //plainAclPlugEngine.init(); + } } diff --git a/acl-plug/src/test/resources/transport.yml b/acl-plug/src/test/resources/transport.yml index 424fd8d8e7..897aedd3fd 100644 --- a/acl-plug/src/test/resources/transport.yml +++ b/acl-plug/src/test/resources/transport.yml @@ -1,19 +1,19 @@ onlyNetAddress: netaddress: 10.10.103.* noPermitPullTopic: - - broker-a + - broker-a list: - - account: laohu - password: 123456 - netaddress: 192.0.0.* - permitSendTopic: - - test1 - - test2 - - account: laohu - password: 123456 - netaddress: 192.0.2.1 - permitSendTopic: - - test3 - - test4 +- account: laohu + password: 123456 + netaddress: 192.0.0.* + permitSendTopic: + - test1 + - test2 +- account: laohu + password: 123456 + netaddress: 192.0.2.1 + permitSendTopic: + - test3 + - test4 \ No newline at end of file diff --git a/distribution/conf/transport.yml b/distribution/conf/transport.yml new file mode 100644 index 0000000000..424fd8d8e7 --- /dev/null +++ b/distribution/conf/transport.yml @@ -0,0 +1,19 @@ +onlyNetAddress: + netaddress: 10.10.103.* + noPermitPullTopic: + - broker-a + +list: + - account: laohu + password: 123456 + netaddress: 192.0.0.* + permitSendTopic: + - test1 + - test2 + - account: laohu + password: 123456 + netaddress: 192.0.2.1 + permitSendTopic: + - test3 + - test4 + \ No newline at end of file From 994e29dfdc52a9ced55fca45d12049d7c1aae0d3 Mon Sep 17 00:00:00 2001 From: hujie Date: Mon, 8 Oct 2018 21:01:58 +0800 Subject: [PATCH 03/96] add unit test --- ...enticationInfoManagementAclPlugEngine.java | 18 ++ .../plug/engine/LoginInfoAclPlugEngine.java | 23 +- .../acl/plug/engine/PlainAclPlugEngine.java | 26 ++- .../acl/plug/entity/BorkerAccessControl.java | 1 - .../strategy/AbstractNetaddressStrategy.java | 5 +- .../strategy/NetaddressStrategyFactory.java | 7 +- .../plug/strategy/OneNetaddressStrategy.java | 1 + .../strategy/RangeNetaddressStrategy.java | 9 +- .../acl/plug/AccessContralAnalysisTest.java | 20 +- .../acl/plug/AclPlugControllerTest.java | 5 + .../rocketmq/acl/plug/AclUtilsTest.java | 115 ++++++++++ .../rocketmq/acl/plug/AuthenticationTest.java | 100 ++++++++ .../plug/engine/PlainAclPlugEngineTest.java | 213 +++++++++++++++++- .../plug/strategy/NetaddressStrategyTest.java | 182 +++++++++++++++ .../test/resources/{ => conf}/transport.yml | 0 .../rocketmq/broker/BrokerController.java | 83 ++++--- .../client/ClientHousekeepingService.java | 1 + .../apache/rocketmq/common/BrokerConfig.java | 19 +- .../rocketmq/common/constant/LoggerName.java | 1 + 19 files changed, 745 insertions(+), 84 deletions(-) create mode 100644 acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java create mode 100644 acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java create mode 100644 acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java create mode 100644 acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java rename acl-plug/src/test/resources/{ => conf}/transport.yml (100%) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index 7a4eeeffda..4c601abfd9 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -25,6 +25,7 @@ import org.apache.rocketmq.acl.plug.Authentication; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; @@ -87,6 +88,8 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); if (accessControlAddressMap != null) { existing = accessControlAddressMap.get(accessControl.getNetaddress()); + if (existing == null) + return null; if (existing.getAccessControl().getPassword().equals(accessControl.getPassword())) { if (existing.getNetaddressStrategy().match(accessControl)) { return existing; @@ -113,6 +116,21 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl return authenticationResult; } + void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { + if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { + throw new AclPlugAccountAnalysisException("onlyNetAddress and list can't be all empty"); + } + + if (transport.getOnlyNetAddress() != null) { + this.setNetaddressAccessControl(transport.getOnlyNetAddress()); + } + if (transport.getList() != null || transport.getList().size() > 0) { + for (AccessControl accessControl : transport.getList()) { + this.setAccessControl(accessControl); + } + } + } + protected abstract AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl, AuthenticationResult authenticationResult); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java index 3831803ca4..304c18f363 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java @@ -29,21 +29,15 @@ public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagemen private Map loginInfoMap = new ConcurrentHashMap<>(); - @Override - public AuthenticationInfo getAccessControl(AccessControl accessControl) { - AuthenticationInfo authenticationInfo = super.getAccessControl(accessControl); - if (authenticationInfo != null) { - LoginInfo loginInfo = new LoginInfo(); - loginInfo.setAuthenticationInfo(authenticationInfo); - loginInfoMap.put(accessControl.getRecognition(), loginInfo); - } - return authenticationInfo; - } - public LoginInfo getLoginInfo(AccessControl accessControl) { LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); - if (loginInfo == null && getAccessControl(accessControl) != null) { - loginInfo = loginInfoMap.get(accessControl.getRecognition()); + if (loginInfo == null) { + AuthenticationInfo authenticationInfo = super.getAccessControl(accessControl); + if (authenticationInfo != null) { + loginInfo = new LoginInfo(); + loginInfo.setAuthenticationInfo(authenticationInfo); + loginInfoMap.put(accessControl.getRecognition(), loginInfo); + } } if (loginInfo != null) { loginInfo.setOperationTime(System.currentTimeMillis()); @@ -60,9 +54,8 @@ public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagemen LoginInfo anthenticationInfo = getLoginInfo(accessControl); if (anthenticationInfo != null && anthenticationInfo.getAuthenticationInfo() != null) { return anthenticationInfo.getAuthenticationInfo(); - } else { - authenticationResult.setResultString("Login information does not exist, Please check login, password, IP"); } + authenticationResult.setResultString("Login information does not exist, Please check login, password, IP"); return null; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index 68d7d908ca..dd7acbf799 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -18,9 +18,8 @@ package org.apache.rocketmq.acl.plug.engine; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.IOException; -import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; @@ -39,17 +38,26 @@ public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { void init() throws AclPlugAccountAnalysisException { String filePath = controllerParametersEntity.getFileHome() + "/conf/transport.yml"; Yaml ymal = new Yaml(); - FileInputStream fis; + FileInputStream fis = null; + BorkerAccessControlTransport transport; try { fis = new FileInputStream(new File(filePath)); - BorkerAccessControlTransport transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); - super.setNetaddressAccessControl(transport.getOnlyNetAddress()); - for (AccessControl accessControl : transport.getList()) { - super.setAccessControl(accessControl); - } - } catch (FileNotFoundException e) { + transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); + } catch (Exception e) { throw new AclPlugAccountAnalysisException("The transport.yml file for Plain mode was not found", e); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + throw new AclPlugAccountAnalysisException("close transport fileInputStream Exception", e); + } + } } + if (transport == null) { + throw new AclPlugAccountAnalysisException("transport.yml file is no data"); + } + super.setBorkerAccessControlTransport(transport); } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java index 0782e37b5f..9de76fba9f 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java @@ -21,7 +21,6 @@ import java.util.Set; import org.apache.rocketmq.acl.plug.annotation.RequestCode; - public class BorkerAccessControl extends AccessControl { public BorkerAccessControl() { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java index 29f5b29cf3..0947733e21 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java @@ -17,11 +17,14 @@ package org.apache.rocketmq.acl.plug.strategy; import org.apache.rocketmq.acl.plug.AclUtils; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; public abstract class AbstractNetaddressStrategy implements NetaddressStrategy { public void verify(String netaddress, int index) { - AclUtils.isScope(netaddress, index); + if (!AclUtils.isScope(netaddress, index)) { + throw new AclPlugAccountAnalysisException(String.format("netaddress examine scope Exception netaddress is %s", netaddress)); + } } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java index 9bf28b5b71..040d2cbfe7 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java @@ -19,6 +19,7 @@ package org.apache.rocketmq.acl.plug.strategy; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.AclUtils; import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; public class NetaddressStrategyFactory { @@ -28,14 +29,14 @@ public class NetaddressStrategyFactory { return NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY; } if (netaddress.endsWith("}")) { - String[] strArray = StringUtils.split(netaddress); + String[] strArray = StringUtils.split(netaddress, "."); String four = strArray[3]; if (!four.startsWith("{")) { - + throw new AclPlugAccountAnalysisException(String.format("MultipleNetaddressStrategy netaddress examine scope Exception netaddress", netaddress)); } return new MultipleNetaddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); } else if (AclUtils.isColon(netaddress)) { - return new MultipleNetaddressStrategy(StringUtils.split(",")); + return new MultipleNetaddressStrategy(StringUtils.split(netaddress, ",")); } else if (AclUtils.isAsterisk(netaddress) || AclUtils.isMinus(netaddress)) { return new RangeNetaddressStrategy(netaddress); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java index 027e49334d..51f803fbb1 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java @@ -24,6 +24,7 @@ public class OneNetaddressStrategy extends AbstractNetaddressStrategy { public OneNetaddressStrategy(String netaddress) { this.netaddress = netaddress; + verify(netaddress, 4); } @Override diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java index c56b86678b..895822b20b 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java @@ -19,6 +19,7 @@ package org.apache.rocketmq.acl.plug.strategy; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.AclUtils; import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; public class RangeNetaddressStrategy extends AbstractNetaddressStrategy { @@ -33,7 +34,7 @@ public class RangeNetaddressStrategy extends AbstractNetaddressStrategy { public RangeNetaddressStrategy(String netaddress) { String[] strArray = StringUtils.split(netaddress, "."); if (analysis(strArray, 2) || analysis(strArray, 3)) { - verify(netaddress, index); + verify(netaddress, index - 1); StringBuffer sb = new StringBuffer().append(strArray[0].trim()).append(".").append(strArray[1].trim()).append("."); if (index == 3) { sb.append(strArray[2].trim()).append("."); @@ -48,11 +49,15 @@ public class RangeNetaddressStrategy extends AbstractNetaddressStrategy { if ("*".equals(value)) { setValue(0, 255); } else if (AclUtils.isMinus(value)) { + if (value.indexOf("-") == 0) { + throw new AclPlugAccountAnalysisException(String.format("RangeNetaddressStrategy netaddress examine scope Exception value %s ", value)); + + } String[] valueArray = StringUtils.split(value, "-"); this.start = Integer.valueOf(valueArray[0]); this.end = Integer.valueOf(valueArray[1]); if (!(AclUtils.isScope(end) && AclUtils.isScope(start) && start <= end)) { - + throw new AclPlugAccountAnalysisException(String.format("RangeNetaddressStrategy netaddress examine scope Exception start is %s , end is %s", start, end)); } } return this.end > 0 ? true : false; diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java index 93f1f0cac4..06a5472536 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java @@ -1,8 +1,11 @@ package org.apache.rocketmq.acl.plug; +import java.util.Iterator; import java.util.Map; +import java.util.Map.Entry; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; +import org.junit.Assert; import org.junit.Test; public class AccessContralAnalysisTest { @@ -10,8 +13,21 @@ public class AccessContralAnalysisTest { @Test public void analysisTest() { AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - Map map = accessContralAnalysis.analysis(new BorkerAccessControl()); - System.out.println(map); + BorkerAccessControl accessControl = new BorkerAccessControl(); + accessControl.setSendMessage(false); + Map map = accessContralAnalysis.analysis(accessControl); + + Iterator> it = map.entrySet().iterator(); + long num = 0; + while (it.hasNext()) { + Entry e = it.next(); + if (!e.getValue()) { + Assert.assertEquals(e.getKey(), Integer.valueOf(10)); + num++; + } + } + Assert.assertEquals(num, 1); + } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java new file mode 100644 index 0000000000..da50ac1400 --- /dev/null +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java @@ -0,0 +1,5 @@ +package org.apache.rocketmq.acl.plug; + +public class AclPlugControllerTest { + +} diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java new file mode 100644 index 0000000000..d65752fbee --- /dev/null +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java @@ -0,0 +1,115 @@ +package org.apache.rocketmq.acl.plug; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class AclUtilsTest { + + @Test + public void getAddreeStrArray() { + String address = "1.1.1.{1,2,3,4}"; + String[] addressArray = AclUtils.getAddreeStrArray(address, "{1,2,3,4}"); + List newAddressList = new ArrayList<>(); + for (String a : addressArray) { + newAddressList.add(a); + } + + List addressList = new ArrayList<>(); + addressList.add("1.1.1.1"); + addressList.add("1.1.1.2"); + addressList.add("1.1.1.3"); + addressList.add("1.1.1.4"); + Assert.assertEquals(newAddressList, addressList); + } + + @Test + public void isScopeStringArray() { + String adderss = "12"; + + for (int i = 0; i < 6; i++) { + boolean isScope = AclUtils.isScope(adderss, 4); + if (i == 3) { + Assert.assertTrue(isScope); + } else { + Assert.assertFalse(isScope); + } + adderss = adderss + ".12"; + } + } + + @Test + public void isScopeArray() { + String[] adderss = StringUtils.split("12.12.12.12", "."); + boolean isScope = AclUtils.isScope(adderss, 4); + Assert.assertTrue(isScope); + isScope = AclUtils.isScope(adderss, 3); + Assert.assertTrue(isScope); + + adderss = StringUtils.split("12.12.1222.1222", "."); + isScope = AclUtils.isScope(adderss, 4); + Assert.assertFalse(isScope); + isScope = AclUtils.isScope(adderss, 3); + Assert.assertFalse(isScope); + + } + + @Test + public void isScopeStringTest() { + for (int i = 0; i < 256; i++) { + boolean isScope = AclUtils.isScope(i + ""); + Assert.assertTrue(isScope); + } + boolean isScope = AclUtils.isScope("-1"); + Assert.assertFalse(isScope); + isScope = AclUtils.isScope("256"); + Assert.assertFalse(isScope); + } + + @Test + public void isScopeTest() { + for (int i = 0; i < 256; i++) { + boolean isScope = AclUtils.isScope(i); + Assert.assertTrue(isScope); + } + boolean isScope = AclUtils.isScope(-1); + Assert.assertFalse(isScope); + isScope = AclUtils.isScope(256); + Assert.assertFalse(isScope); + + } + + @Test + public void isAsteriskTest() { + boolean isAsterisk = AclUtils.isAsterisk("*"); + Assert.assertTrue(isAsterisk); + + isAsterisk = AclUtils.isAsterisk(","); + Assert.assertFalse(isAsterisk); + } + + @Test + public void isColonTest() { + boolean isColon = AclUtils.isColon(","); + Assert.assertTrue(isColon); + + isColon = AclUtils.isColon("-"); + Assert.assertFalse(isColon); + } + + @Test + public void isMinusTest() { + boolean isMinus = AclUtils.isMinus("-"); + Assert.assertTrue(isMinus); + + isMinus = AclUtils.isMinus("*"); + Assert.assertFalse(isMinus); + } +} diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java new file mode 100644 index 0000000000..c425315b30 --- /dev/null +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java @@ -0,0 +1,100 @@ +package org.apache.rocketmq.acl.plug; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; +import org.apache.rocketmq.acl.plug.strategy.OneNetaddressStrategy; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class AuthenticationTest { + + Authentication authentication = new Authentication(); + + AuthenticationInfo authenticationInfo; + + @Before + public void init() { + OneNetaddressStrategy netaddressStrategy = new OneNetaddressStrategy("127.0.0.1"); + BorkerAccessControl borkerAccessControl = new BorkerAccessControl(); + //321 + borkerAccessControl.setQueryConsumeQueue(false); + + Set permitSendTopic = new HashSet<>(); + permitSendTopic.add("permitSendTopic"); + borkerAccessControl.setPermitSendTopic(permitSendTopic); + + Set noPermitSendTopic = new HashSet<>(); + noPermitSendTopic.add("noPermitSendTopic"); + borkerAccessControl.setNoPermitSendTopic(noPermitSendTopic); + + Set permitPullTopic = new HashSet<>(); + permitPullTopic.add("permitPullTopic"); + borkerAccessControl.setPermitPullTopic(permitPullTopic); + + Set noPermitPullTopic = new HashSet<>(); + noPermitPullTopic.add("noPermitPullTopic"); + borkerAccessControl.setNoPermitPullTopic(noPermitPullTopic); + + AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + Map map = accessContralAnalysis.analysis(borkerAccessControl); + + authenticationInfo = new AuthenticationInfo(map, borkerAccessControl, netaddressStrategy); + } + + @Test + public void authenticationTest() { + + AuthenticationResult authenticationResult = new AuthenticationResult(); + LoginOrRequestAccessControl loginOrRequestAccessControl = new LoginOrRequestAccessControl(); + loginOrRequestAccessControl.setCode(317); + + boolean isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + loginOrRequestAccessControl.setCode(321); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertFalse(isReturn); + + loginOrRequestAccessControl.setCode(10); + loginOrRequestAccessControl.setTopic("permitSendTopic"); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + loginOrRequestAccessControl.setCode(310); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + loginOrRequestAccessControl.setCode(320); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + loginOrRequestAccessControl.setTopic("noPermitSendTopic"); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertFalse(isReturn); + + loginOrRequestAccessControl.setTopic("nopermitSendTopic"); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + loginOrRequestAccessControl.setCode(11); + loginOrRequestAccessControl.setTopic("permitPullTopic"); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + loginOrRequestAccessControl.setTopic("noPermitPullTopic"); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertFalse(isReturn); + + loginOrRequestAccessControl.setTopic("nopermitPullTopic"); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + } +} diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 30951c6ee5..d126f19f66 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -1,12 +1,217 @@ package org.apache.rocketmq.acl.plug.engine; -import org.junit.Test; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; +import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.entity.LoginInfo; +import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.common.MixAll; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.internal.util.reflection.FieldSetter; +import org.mockito.junit.MockitoJUnitRunner; +import org.yaml.snakeyaml.Yaml; + +@RunWith(MockitoJUnitRunner.class) public class PlainAclPlugEngineTest { - @Test + PlainAclPlugEngine plainAclPlugEngine; + + BorkerAccessControlTransport transport; + + AccessControl accessControl; + + AccessControl accessControlTwo; + + Map loginInfoMap; + + @Before + public void init() throws FileNotFoundException, NoSuchFieldException, SecurityException { + String home = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); + Yaml ymal = new Yaml(); + String filePath = home + "/conf/transport.yml"; + FileInputStream fis = new FileInputStream(new File(filePath)); + transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); + + ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); + controllerParametersEntity.setFileHome(home); + plainAclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); + + accessControl = new BorkerAccessControl(); + accessControl.setAccount("rokcetmq"); + accessControl.setPassword("aliyun"); + accessControl.setNetaddress("127.0.0.1"); + accessControl.setRecognition("127.0.0.1:1"); + + accessControlTwo = new BorkerAccessControl(); + accessControlTwo.setAccount("rokcet"); + accessControlTwo.setPassword("aliyun"); + accessControlTwo.setNetaddress("127.0.0.1"); + accessControlTwo.setRecognition("127.0.0.1:2"); + + loginInfoMap = new ConcurrentHashMap<>(); + FieldSetter.setField(plainAclPlugEngine, plainAclPlugEngine.getClass().getSuperclass().getDeclaredField("loginInfoMap"), loginInfoMap); + + } + + @Test(expected = AclPlugAccountAnalysisException.class) public void testPlainAclPlugEngineInit() { - //PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); - //plainAclPlugEngine.init(); + ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); + new PlainAclPlugEngine(controllerParametersEntity); + + } + + @Test + public void authenticationInfoOfSetAccessControl() { + AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; + aclPlugEngine.setAccessControl(accessControl); + + AuthenticationInfo authenticationInfo = aclPlugEngine.getAccessControl(accessControl); + + AccessControl getAccessControl = authenticationInfo.getAccessControl(); + Assert.assertEquals(accessControl, getAccessControl); + + AccessControl testAccessControl = new AccessControl(); + testAccessControl.setAccount("rokcetmq"); + testAccessControl.setPassword("aliyun"); + testAccessControl.setNetaddress("127.0.0.1"); + testAccessControl.setRecognition("127.0.0.1:1"); + + testAccessControl.setAccount("rokcetmq1"); + authenticationInfo = aclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); + + testAccessControl.setAccount("rokcetmq"); + testAccessControl.setPassword("1"); + authenticationInfo = aclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); + + testAccessControl.setNetaddress("127.0.0.2"); + authenticationInfo = aclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); + } + + @Test + public void setAccessControlList() { + List accessControlList = new ArrayList<>(); + accessControlList.add(accessControl); + + accessControlList.add(accessControlTwo); + + plainAclPlugEngine.setAccessControlList(accessControlList); + + AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; + AuthenticationInfo newAccessControl = aclPlugEngine.getAccessControl(accessControl); + Assert.assertEquals(accessControl, newAccessControl.getAccessControl()); + + newAccessControl = aclPlugEngine.getAccessControl(accessControlTwo); + Assert.assertEquals(accessControlTwo, newAccessControl.getAccessControl()); + + } + + @Test + public void setNetaddressAccessControl() { + AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; + AccessControl accessControl = new BorkerAccessControl(); + accessControl.setNetaddress("127.0.0.1"); + aclPlugEngine.setAccessControl(accessControl); + aclPlugEngine.setNetaddressAccessControl(accessControl); + + AuthenticationInfo authenticationInfo = aclPlugEngine.getAccessControl(accessControl); + + AccessControl getAccessControl = authenticationInfo.getAccessControl(); + Assert.assertEquals(accessControl, getAccessControl); + + accessControl.setNetaddress("127.0.0.2"); + authenticationInfo = aclPlugEngine.getAccessControl(accessControl); + Assert.assertNull(authenticationInfo); + } + + public void eachCheckLoginAndAuthentication() { + + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void borkerAccessControlTransportTestNull() { + plainAclPlugEngine.setBorkerAccessControlTransport(new BorkerAccessControlTransport()); + } + + @Test + public void borkerAccessControlTransportTest() { + BorkerAccessControlTransport borkerAccessControlTransprt = new BorkerAccessControlTransport(); + borkerAccessControlTransprt.setOnlyNetAddress((BorkerAccessControl) this.accessControl); + List list = new ArrayList<>(); + list.add((BorkerAccessControl) this.accessControlTwo); + borkerAccessControlTransprt.setList(list); + plainAclPlugEngine.setBorkerAccessControlTransport(borkerAccessControlTransprt); + + AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; + AccessControl accessControl = new BorkerAccessControl(); + accessControl.setNetaddress("127.0.0.1"); + aclPlugEngine.setAccessControl(accessControl); + AuthenticationInfo authenticationInfo = aclPlugEngine.getAccessControl(accessControl); + Assert.assertNotNull(authenticationInfo.getAccessControl()); + + authenticationInfo = aclPlugEngine.getAccessControl(accessControlTwo); + Assert.assertEquals(accessControlTwo, authenticationInfo.getAccessControl()); + + } + + @Test + public void getLoginInfo() { + plainAclPlugEngine.setAccessControl(accessControl); + LoginInfo loginInfo = plainAclPlugEngine.getLoginInfo(accessControl); + Assert.assertNotNull(loginInfo); + + loginInfo = plainAclPlugEngine.getLoginInfo(accessControlTwo); + Assert.assertNull(loginInfo); + + } + + @Test + public void deleteLoginInfo() { + plainAclPlugEngine.setAccessControl(accessControl); + plainAclPlugEngine.getLoginInfo(accessControl); + + LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); + Assert.assertNotNull(loginInfo); + + plainAclPlugEngine.deleteLoginInfo(accessControl.getRecognition()); + + loginInfo = loginInfoMap.get(accessControl.getRecognition()); + Assert.assertNull(loginInfo); + } + + @Test + public void getAuthenticationInfo() { + LoginOrRequestAccessControl loginOrRequestAccessControl = new LoginOrRequestAccessControl(); + loginOrRequestAccessControl.setAccount("rokcetmq"); + loginOrRequestAccessControl.setPassword("aliyun"); + loginOrRequestAccessControl.setNetaddress("127.0.0.1"); + loginOrRequestAccessControl.setRecognition("127.0.0.1:1"); + + AuthenticationResult authenticationResult = new AuthenticationResult(); + plainAclPlugEngine.getAuthenticationInfo(loginOrRequestAccessControl, authenticationResult); + Assert.assertEquals("Login information does not exist, Please check login, password, IP", authenticationResult.getResultString()); + + plainAclPlugEngine.setAccessControl(accessControl); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAuthenticationInfo(loginOrRequestAccessControl, authenticationResult); + Assert.assertNotNull(authenticationInfo); + } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java new file mode 100644 index 0000000000..bf9101b200 --- /dev/null +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java @@ -0,0 +1,182 @@ +package org.apache.rocketmq.acl.plug.strategy; + +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.junit.Assert; +import org.junit.Test; + +public class NetaddressStrategyTest { + + NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); + + @Test + public void NetaddressStrategyFactoryTest() { + AccessControl accessControl = new AccessControl(); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Assert.assertEquals(netaddressStrategy, NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY); + + accessControl.setNetaddress("*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Assert.assertEquals(netaddressStrategy, NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY); + + accessControl.setNetaddress("127.0.0.1"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Assert.assertEquals(netaddressStrategy.getClass(), OneNetaddressStrategy.class); + + accessControl.setNetaddress("127.0.0.1,127.0.0.2,127.0.0.3"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Assert.assertEquals(netaddressStrategy.getClass(), MultipleNetaddressStrategy.class); + + accessControl.setNetaddress("127.0.0.{1,2,3}"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Assert.assertEquals(netaddressStrategy.getClass(), MultipleNetaddressStrategy.class); + + accessControl.setNetaddress("127.0.0.1-200"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Assert.assertEquals(netaddressStrategy.getClass(), RangeNetaddressStrategy.class); + + accessControl.setNetaddress("127.0.0.*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Assert.assertEquals(netaddressStrategy.getClass(), RangeNetaddressStrategy.class); + + accessControl.setNetaddress("127.0.1-20.*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + Assert.assertEquals(netaddressStrategy.getClass(), RangeNetaddressStrategy.class); + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void verifyTest() { + new OneNetaddressStrategy("127.0.0.1"); + + new OneNetaddressStrategy("256.0.0.1"); + } + + @Test + public void nullNetaddressStrategyTest() { + boolean isMatch = NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY.match(new AccessControl()); + Assert.assertTrue(isMatch); + } + + public void oneNetaddressStrategyTest() { + OneNetaddressStrategy netaddressStrategy = new OneNetaddressStrategy("127.0.0.1"); + AccessControl accessControl = new AccessControl(); + boolean match = netaddressStrategy.match(accessControl); + Assert.assertFalse(match); + + accessControl.setNetaddress("127.0.0.2"); + match = netaddressStrategy.match(accessControl); + Assert.assertFalse(match); + + accessControl.setNetaddress("127.0.0.1"); + match = netaddressStrategy.match(accessControl); + Assert.assertTrue(match); + } + + @Test + public void multipleNetaddressStrategyTest() { + AccessControl accessControl = new AccessControl(); + accessControl.setNetaddress("127.0.0.1,127.0.0.2,127.0.0.3"); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + multipleNetaddressStrategyTest(netaddressStrategy); + + accessControl.setNetaddress("127.0.0.{1,2,3}"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + multipleNetaddressStrategyTest(netaddressStrategy); + + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void multipleNetaddressStrategyExceptionTest() { + AccessControl accessControl = new AccessControl(); + accessControl.setNetaddress("127.0.0.1,2,3}"); + netaddressStrategyFactory.getNetaddressStrategy(accessControl); + } + + private void multipleNetaddressStrategyTest(NetaddressStrategy netaddressStrategy) { + AccessControl accessControl = new AccessControl(); + accessControl.setNetaddress("127.0.0.1"); + boolean match = netaddressStrategy.match(accessControl); + Assert.assertTrue(match); + + accessControl.setNetaddress("127.0.0.2"); + match = netaddressStrategy.match(accessControl); + Assert.assertTrue(match); + + accessControl.setNetaddress("127.0.0.3"); + match = netaddressStrategy.match(accessControl); + Assert.assertTrue(match); + + accessControl.setNetaddress("127.0.0.4"); + match = netaddressStrategy.match(accessControl); + Assert.assertFalse(match); + + accessControl.setNetaddress("127.0.0.0"); + match = netaddressStrategy.match(accessControl); + Assert.assertFalse(match); + + } + + @Test + public void rangeNetaddressStrategyTest() { + String head = "127.0.0."; + AccessControl accessControl = new AccessControl(); + accessControl.setNetaddress("127.0.0.1-200"); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + rangeNetaddressStrategyTest(netaddressStrategy, head, 1, 200, true); + accessControl.setNetaddress("127.0.0.*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + rangeNetaddressStrategyTest(netaddressStrategy, head, 0, 255, true); + + accessControl.setNetaddress("127.0.1-200.*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + rangeNetaddressStrategyThirdlyTest(netaddressStrategy, head, 1, 200); + } + + private void rangeNetaddressStrategyTest(NetaddressStrategy netaddressStrategy, String head, int start, int end, + boolean isFalse) { + AccessControl accessControl = new AccessControl(); + for (int i = -10; i < 300; i++) { + accessControl.setNetaddress(head + i); + boolean match = netaddressStrategy.match(accessControl); + if (isFalse && i >= start && i <= end) { + Assert.assertTrue(match); + continue; + } + Assert.assertFalse(match); + + } + } + + private void rangeNetaddressStrategyThirdlyTest(NetaddressStrategy netaddressStrategy, String head, int start, + int end) { + String newHead; + for (int i = -10; i < 300; i++) { + newHead = head + i; + if (i >= start && i <= end) { + rangeNetaddressStrategyTest(netaddressStrategy, newHead, 0, 255, false); + } + } + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void rangeNetaddressStrategyExceptionStartGreaterEndTest() { + rangeNetaddressStrategyExceptionTest("127.0.0.2-1"); + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void rangeNetaddressStrategyExceptionScopeTest() { + rangeNetaddressStrategyExceptionTest("127.0.0.-1-200"); + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void rangeNetaddressStrategyExceptionScopeTwoTest() { + rangeNetaddressStrategyExceptionTest("127.0.0.0-256"); + } + + private void rangeNetaddressStrategyExceptionTest(String netaddress) { + AccessControl accessControl = new AccessControl(); + accessControl.setNetaddress(netaddress); + netaddressStrategyFactory.getNetaddressStrategy(accessControl); + } + +} diff --git a/acl-plug/src/test/resources/transport.yml b/acl-plug/src/test/resources/conf/transport.yml similarity index 100% rename from acl-plug/src/test/resources/transport.yml rename to acl-plug/src/test/resources/conf/transport.yml diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index b080716bd2..2ebf5998a7 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -32,10 +32,10 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; - import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.AclPlugController; import org.apache.rocketmq.acl.plug.AclRemotingServer; +import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; import org.apache.rocketmq.broker.client.ClientHousekeepingService; import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; @@ -107,7 +107,6 @@ import org.apache.rocketmq.store.config.MessageStoreConfig; import org.apache.rocketmq.store.stats.BrokerStats; import org.apache.rocketmq.store.stats.BrokerStatsManager; - public class BrokerController { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final InternalLogger LOG_PROTECTION = InternalLoggerFactory.getLogger(LoggerName.PROTECTION_LOGGER_NAME); @@ -163,6 +162,8 @@ public class BrokerController { private TransactionalMessageService transactionalMessageService; private AbstractTransactionalMessageCheckListener transactionalMessageCheckListener; + private AclPlugController aclPlugController; + public BrokerController( final BrokerConfig brokerConfig, final NettyServerConfig nettyServerConfig, @@ -298,7 +299,6 @@ public class BrokerController { this.heartbeatThreadPoolQueue, new ThreadFactoryImpl("HeartbeatThread_",true)); - this.consumerManageExecutor = Executors.newFixedThreadPool(this.brokerConfig.getConsumerManageThreadPoolNums(), new ThreadFactoryImpl( "ConsumerManageThread_")); @@ -486,41 +486,46 @@ public class BrokerController { } private void initialAclPlug() { - try { - if(!this.brokerConfig.isAclPlug()) { - return; - } - AclPlugController aclPlugController = new AclPlugController(null); - if(!aclPlugController.isStartSucceed()) { - return; - } - final AclRemotingServer aclRemotingServe = aclPlugController.getAclRemotingServer(); - this.registerServerRPCHook(new RPCHook() { - - @Override - public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - HashMap extFields = request.getExtFields(); - LoginOrRequestAccessControl accessControl = new LoginOrRequestAccessControl(); - accessControl.setCode(request.getCode()); - accessControl.setRecognition(remoteAddr); - if( extFields != null ) { - accessControl.setAccount(extFields.get("account")); - accessControl.setPassword(extFields.get("password")); - accessControl.setNetaddress(StringUtils.split(remoteAddr,":")[0]); - accessControl.setTopic(extFields.get("topic")); - } - aclRemotingServe.eachCheck(accessControl); - } - - @Override - public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) {} - }); - - }catch(Exception e) { - - } + try { + if (!this.brokerConfig.isAclPlug()) { + log.info("Default does not start acl plug"); + return; + } + ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); + controllerParametersEntity.setFileHome(brokerConfig.getRocketmqHome()); + aclPlugController = new AclPlugController(controllerParametersEntity); + if (!aclPlugController.isStartSucceed()) { + log.error("start acl plug failure"); + return; + } + final AclRemotingServer aclRemotingServe = aclPlugController.getAclRemotingServer(); + this.registerServerRPCHook(new RPCHook() { + + @Override + public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + HashMap extFields = request.getExtFields(); + LoginOrRequestAccessControl accessControl = new LoginOrRequestAccessControl(); + accessControl.setCode(request.getCode()); + accessControl.setRecognition(remoteAddr); + if (extFields != null) { + accessControl.setAccount(extFields.get("account")); + accessControl.setPassword(extFields.get("password")); + accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); + accessControl.setTopic(extFields.get("topic")); + } + aclRemotingServe.eachCheck(accessControl); + } + + @Override + public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { + } + }); + + } catch (Exception e) { + log.error(e.getMessage(), e); + } } - + public void registerProcessor() { /** * SendMessageProcessor @@ -1071,4 +1076,8 @@ public class BrokerController { AbstractTransactionalMessageCheckListener transactionalMessageCheckListener) { this.transactionalMessageCheckListener = transactionalMessageCheckListener; } + + public AclPlugController getAclPlugController() { + return this.aclPlugController; + } } diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java b/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java index d536db5055..04794d1dc1 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java @@ -72,6 +72,7 @@ public class ClientHousekeepingService implements ChannelEventListener { this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getConsumerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel); + this.brokerController.getAclPlugController().doChannelCloseEvent(remoteAddr); } @Override diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index a8c286eba9..3aa16012cc 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -63,7 +63,7 @@ public class BrokerConfig { private int adminBrokerThreadPoolNums = 16; private int clientManageThreadPoolNums = 32; private int consumerManageThreadPoolNums = 32; - private int heartbeatThreadPoolNums = Math.min(32,Runtime.getRuntime().availableProcessors()); + private int heartbeatThreadPoolNums = Math.min(32, Runtime.getRuntime().availableProcessors()); private int flushConsumerOffsetInterval = 1000 * 5; @@ -163,8 +163,7 @@ public class BrokerConfig { */ @ImportantField private long transactionCheckInterval = 60 * 1000; - - + private boolean isAclPlug; public boolean isTraceOn() { @@ -705,12 +704,12 @@ public class BrokerConfig { this.transactionCheckInterval = transactionCheckInterval; } - public boolean isAclPlug() { - return isAclPlug; - } + public boolean isAclPlug() { + return isAclPlug; + } + + public void setAclPlug(boolean isAclPlug) { + this.isAclPlug = isAclPlug; + } - public void setAclPlug(boolean isAclPlug) { - this.isAclPlug = isAclPlug; - } - } diff --git a/common/src/main/java/org/apache/rocketmq/common/constant/LoggerName.java b/common/src/main/java/org/apache/rocketmq/common/constant/LoggerName.java index 12070ddc34..46a6e45ab6 100644 --- a/common/src/main/java/org/apache/rocketmq/common/constant/LoggerName.java +++ b/common/src/main/java/org/apache/rocketmq/common/constant/LoggerName.java @@ -36,4 +36,5 @@ public class LoggerName { public static final String PROTECTION_LOGGER_NAME = "RocketmqProtection"; public static final String WATER_MARK_LOGGER_NAME = "RocketmqWaterMark"; public static final String FILTER_LOGGER_NAME = "RocketmqFilter"; + public static final String ACL_PLUG_LOGGER_NAME = "RocketmqAclPlug"; } From 77b9bc09680629e2cad11072b42f00e0d5dea351 Mon Sep 17 00:00:00 2001 From: hujie Date: Mon, 8 Oct 2018 21:40:02 +0800 Subject: [PATCH 04/96] solve conflict --- .../org/apache/rocketmq/broker/BrokerController.java | 4 +--- .../java/org/apache/rocketmq/common/BrokerConfig.java | 9 +++------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index c94bf44792..e6c83ed577 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -302,8 +302,7 @@ public class BrokerController { this.heartbeatThreadPoolQueue, new ThreadFactoryImpl("HeartbeatThread_", true)); -<<<<<<< HEAD -======= + this.endTransactionExecutor = new BrokerFixedThreadPoolExecutor( this.brokerConfig.getEndTransactionThreadPoolNums(), this.brokerConfig.getEndTransactionThreadPoolNums(), @@ -312,7 +311,6 @@ public class BrokerController { this.endTransactionThreadPoolQueue, new ThreadFactoryImpl("EndTransactionThread_")); ->>>>>>> 53a63460d3a1599a6c51058bb51a73746233022d this.consumerManageExecutor = Executors.newFixedThreadPool(this.brokerConfig.getConsumerManageThreadPoolNums(), new ThreadFactoryImpl( "ConsumerManageThread_")); diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index f08741a011..9920cc49da 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -64,14 +64,12 @@ public class BrokerConfig { private int clientManageThreadPoolNums = 32; private int consumerManageThreadPoolNums = 32; private int heartbeatThreadPoolNums = Math.min(32, Runtime.getRuntime().availableProcessors()); -<<<<<<< HEAD -======= /** * Thread numbers for EndTransactionProcessor */ private int endTransactionThreadPoolNums = 8 + Runtime.getRuntime().availableProcessors() * 2; ->>>>>>> 53a63460d3a1599a6c51058bb51a73746233022d + private int flushConsumerOffsetInterval = 1000 * 5; @@ -714,7 +712,7 @@ public class BrokerConfig { this.transactionCheckInterval = transactionCheckInterval; } -<<<<<<< HEAD + public boolean isAclPlug() { return isAclPlug; } @@ -723,7 +721,6 @@ public class BrokerConfig { this.isAclPlug = isAclPlug; } -======= public int getEndTransactionThreadPoolNums() { return endTransactionThreadPoolNums; } @@ -747,5 +744,5 @@ public class BrokerConfig { public void setWaitTimeMillsInTransactionQueue(long waitTimeMillsInTransactionQueue) { this.waitTimeMillsInTransactionQueue = waitTimeMillsInTransactionQueue; } ->>>>>>> 53a63460d3a1599a6c51058bb51a73746233022d + } From 7c2b40c364ab83484fd46a02e013828d33184f27 Mon Sep 17 00:00:00 2001 From: hujie Date: Wed, 10 Oct 2018 00:37:23 +0800 Subject: [PATCH 05/96] save --- acl-plug/pom.xml | 4 +- .../acl/plug/AccessContralAnalysis.java | 44 ++- .../rocketmq/acl/plug/AclPlugController.java | 4 +- .../rocketmq/acl/plug/AclRemotingServer.java | 3 - .../rocketmq/acl/plug/Authentication.java | 4 +- .../plug/DefaultAclRemotingServerImpl.java | 7 - ...enticationInfoManagementAclPlugEngine.java | 13 +- .../plug/engine/LoginInfoAclPlugEngine.java | 12 +- .../acl/plug/engine/PlainAclPlugEngine.java | 6 +- .../acl/plug/entity/AuthenticationInfo.java | 1 - .../acl/plug/entity/BorkerAccessControl.java | 259 +++++++----------- .../entity/ControllerParametersEntity.java | 26 +- .../strategy/MultipleNetaddressStrategy.java | 1 - .../acl/plug/AccessContralAnalysisTest.java | 36 ++- .../acl/plug/AclPlugControllerTest.java | 16 ++ .../rocketmq/acl/plug/AclUtilsTest.java | 18 +- .../rocketmq/acl/plug/AuthenticationTest.java | 53 +++- .../plug/engine/PlainAclPlugEngineTest.java | 59 +++- .../plug/strategy/NetaddressStrategyTest.java | 16 ++ .../src/test/resources/conf/transport.yml | 8 +- broker/pom.xml | 148 +++++----- .../rocketmq/broker/BrokerController.java | 7 +- .../client/ClientHousekeepingService.java | 4 +- .../apache/rocketmq/common/BrokerConfig.java | 22 +- distribution/conf/transport.yml | 8 +- 25 files changed, 463 insertions(+), 316 deletions(-) diff --git a/acl-plug/pom.xml b/acl-plug/pom.xml index 3a86a6ab63..a4633f70a1 100644 --- a/acl-plug/pom.xml +++ b/acl-plug/pom.xml @@ -1,8 +1,8 @@ + xmlns="http://maven.apache.org/POM/4.0.0"> 4.0.0 org.apache.rocketmq diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java index 35cd6340c3..64a9a2ad66 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java @@ -22,13 +22,32 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.annotation.RequestCode; import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; public class AccessContralAnalysis { private Map, Map> classTocodeAndMentod = new HashMap<>(); + private Map fieldNameAndCode = new HashMap<>(); + + public void analysisClass(Class clazz) { + Field[] fields = clazz.getDeclaredFields(); + try { + for(Field field : fields) { + if( field.getType().equals(int.class)) { + String name = StringUtils.replace(field.getName(), "_", "").toLowerCase(); + fieldNameAndCode.put(name, (Integer)field.get(null)); + } + + } + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new AclPlugAccountAnalysisException(String.format("analysis on failure Class is %s", clazz.getName()), e); + } + } + public Map analysis(AccessControl accessControl) { Class clazz = accessControl.getClass(); Map codeAndField = classTocodeAndMentod.get(clazz); @@ -36,18 +55,19 @@ public class AccessContralAnalysis { codeAndField = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { - RequestCode requestCode = field.getAnnotation(RequestCode.class); - if (requestCode != null) { - int code = requestCode.code(); - if (codeAndField.containsKey(code)) { - - } else { - field.setAccessible(true); - codeAndField.put(code, field); - } - } + if(!field.getType().equals(boolean.class)) + continue; + Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); + if(code == null) { + throw new AclPlugAccountAnalysisException(String.format("field nonexistent in code", field.getName())); + } + field.setAccessible( true ); + codeAndField.put(code, field); } + if(codeAndField.isEmpty()) { + throw new AclPlugAccountAnalysisException(String.format("AccessControl nonexistent code , name %s" , accessControl.getClass().getName())); + } classTocodeAndMentod.put(clazz, codeAndField); } Iterator> it = codeAndField.entrySet().iterator(); @@ -57,8 +77,8 @@ public class AccessContralAnalysis { Entry e = it.next(); authority.put(e.getKey(), (Boolean) e.getValue().get(accessControl)); } - } catch (IllegalArgumentException | IllegalAccessException e1) { - e1.printStackTrace(); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new AclPlugAccountAnalysisException(String.format("analysis on failure AccessControl is %s", AccessControl.class.getName()), e); } return authority; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java index fc0a73b9d0..d3781059dd 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java @@ -47,7 +47,9 @@ public class AclPlugController { } public void doChannelCloseEvent(String remoteAddr) { - aclPlugEngine.deleteLoginInfo(remoteAddr); + if (this.startSucceed) { + aclPlugEngine.deleteLoginInfo(remoteAddr); + } } public boolean isStartSucceed() { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java index 63f0b20bd2..4eeb2a54c4 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java @@ -16,14 +16,11 @@ */ package org.apache.rocketmq.acl.plug; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public interface AclRemotingServer { - public AuthenticationInfo login(); - public AuthenticationResult eachCheck(LoginOrRequestAccessControl accessControl); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java index 7a2651de62..283466b5be 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java @@ -45,7 +45,7 @@ public class Authentication { authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); return false; } - return true; + return borker.getPermitSendTopic().isEmpty() ? true : false; } else if (code == 11) { if (borker.getPermitPullTopic().contains(topicName)) { return true; @@ -54,7 +54,7 @@ public class Authentication { authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); return false; } - return true; + return borker.getPermitPullTopic().isEmpty() ? true : false; } return true; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java index 117266e592..325ffab804 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java @@ -17,7 +17,6 @@ package org.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; import org.apache.rocketmq.acl.plug.exception.AclPlugAuthenticationException; @@ -32,12 +31,6 @@ public class DefaultAclRemotingServerImpl implements AclRemotingServer { this.aclPlugEngine = aclPlugEngine; } - @Override - public AuthenticationInfo login() { - - return null; - } - @Override public AuthenticationResult eachCheck(LoginOrRequestAccessControl accessControl) { AuthenticationResult authenticationResult = aclPlugEngine.eachCheckLoginAndAuthentication(accessControl); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index 4c601abfd9..73205416d3 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -19,13 +19,13 @@ package org.apache.rocketmq.acl.plug.engine; import java.util.HashMap; import java.util.List; import java.util.Map; - import org.apache.rocketmq.acl.plug.AccessContralAnalysis; import org.apache.rocketmq.acl.plug.Authentication; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; +import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; @@ -48,7 +48,18 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl private Authentication authentication = new Authentication(); + ControllerParametersEntity controllerParametersEntity; + + public AuthenticationInfoManagementAclPlugEngine(ControllerParametersEntity controllerParametersEntity) { + this.controllerParametersEntity = controllerParametersEntity; + accessContralAnalysis.analysisClass(controllerParametersEntity.getAccessContralAnalysisClass()); + } + + public void setAccessControl(AccessControl accessControl) throws AclPlugAccountAnalysisException { + if (accessControl.getAccount() == null || accessControl.getPassword() == null || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { + throw new AclPlugAccountAnalysisException(String.format("The account password cannot be null and is longer than 6, account is %s password is %s", accessControl.getAccount(), accessControl.getPassword())); + } try { NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java index 304c18f363..76412351d2 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java @@ -22,6 +22,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; import org.apache.rocketmq.acl.plug.entity.LoginInfo; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; @@ -29,6 +30,11 @@ public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagemen private Map loginInfoMap = new ConcurrentHashMap<>(); + + public LoginInfoAclPlugEngine(ControllerParametersEntity controllerParametersEntity) { + super(controllerParametersEntity); + } + public LoginInfo getLoginInfo(AccessControl accessControl) { LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); if (loginInfo == null) { @@ -51,9 +57,9 @@ public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagemen protected AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl, AuthenticationResult authenticationResult) { - LoginInfo anthenticationInfo = getLoginInfo(accessControl); - if (anthenticationInfo != null && anthenticationInfo.getAuthenticationInfo() != null) { - return anthenticationInfo.getAuthenticationInfo(); + LoginInfo loginInfo = getLoginInfo(accessControl); + if (loginInfo != null && loginInfo.getAuthenticationInfo() != null) { + return loginInfo.getAuthenticationInfo(); } authenticationResult.setResultString("Login information does not exist, Please check login, password, IP"); return null; diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index dd7acbf799..7e4ede4a47 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -19,7 +19,6 @@ package org.apache.rocketmq.acl.plug.engine; import java.io.File; import java.io.FileInputStream; import java.io.IOException; - import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; @@ -29,9 +28,8 @@ public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { private ControllerParametersEntity controllerParametersEntity; - public PlainAclPlugEngine( - ControllerParametersEntity controllerParametersEntity) throws AclPlugAccountAnalysisException { - this.controllerParametersEntity = controllerParametersEntity; + public PlainAclPlugEngine(ControllerParametersEntity controllerParametersEntity) throws AclPlugAccountAnalysisException { + super(controllerParametersEntity); init(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java index c4b9f7071e..981bef8553 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java @@ -19,7 +19,6 @@ package org.apache.rocketmq.acl.plug.entity; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; - import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; public class AuthenticationInfo { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java index 9de76fba9f..0446ca0022 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java @@ -18,170 +18,117 @@ package org.apache.rocketmq.acl.plug.entity; import java.util.HashSet; import java.util.Set; - import org.apache.rocketmq.acl.plug.annotation.RequestCode; public class BorkerAccessControl extends AccessControl { + private Set permitSendTopic = new HashSet<>(); + private Set noPermitSendTopic = new HashSet<>(); + private Set permitPullTopic = new HashSet<>(); + private Set noPermitPullTopic = new HashSet<>(); + + private boolean sendMessage = true; + + private boolean sendMessageV2 = true; + + private boolean sendBatchMessage = true; + + private boolean consumerSendMsgBack = true; + @RequestCode(code = 11) + private boolean pullMessage = true; + @RequestCode(code = 12) + private boolean queryMessage = true; + @RequestCode(code = 33) + private boolean viewMessageById = true; + @RequestCode(code = 34) + private boolean heartBeat = true; + @RequestCode(code = 35) + private boolean unregisterClient = true; + @RequestCode(code = 46) + private boolean checkClientConfig = true; + @RequestCode(code = 38) + private boolean getConsumerListByGroup = true; + @RequestCode(code = 15) + private boolean updateConsumerOffset = true; + @RequestCode(code = 14) + private boolean queryConsumerOffset = true; + @RequestCode(code = 37) + private boolean endTransaction = true; + @RequestCode(code = 17) + private boolean updateAndCreateTopic = true; + @RequestCode(code = 215) + private boolean deleteTopicInbroker = true; + @RequestCode(code = 21) + private boolean getAllTopicConfig = true; + @RequestCode(code = 25) + private boolean updateBrokerConfig = true; + @RequestCode(code = 26) + private boolean getBrokerConfig = true; + @RequestCode(code = 29) + private boolean searchOffsetByTimestamp = true; + @RequestCode(code = 30) + private boolean getMaxOffset = true; + @RequestCode(code = 31) + private boolean getMixOffset = true; + @RequestCode(code = 32) + private boolean getEarliestMsgStoretime = true; + @RequestCode(code = 28) + private boolean getBrokerRuntimeInfo = true; + @RequestCode(code = 41) + private boolean lockBatchMQ = true; + @RequestCode(code = 42) + private boolean unlockBatchMQ = true; + @RequestCode(code = 200) + private boolean updateAndCreteSubscriptiongroup = true; + @RequestCode(code = 201) + private boolean getAllSubscriptiongroupConfig = true; + @RequestCode(code = 207) + private boolean deleteSubscriptiongroup = true; + @RequestCode(code = 202) + private boolean getTopicStatsInfo = true; + @RequestCode(code = 203) + private boolean getConsumerConnectionList = true; + @RequestCode(code = 204) + private boolean getProducerConnectionList = true; + @RequestCode(code = 208) + private boolean getConsumeStats = true; + @RequestCode(code = 43) + private boolean getAllConsumerOffset = true; + @RequestCode(code = 25) + private boolean getAllDelayOffset = true; + @RequestCode(code = 222) + private boolean invokeBrokerToresetOffset = true; + @RequestCode(code = 300) + private boolean queryTopicConsumByWho = true; + @RequestCode(code = 301) + private boolean registerFilterServer = true; + + private boolean queryConsumeTimeSpan = true; + + private boolean getSystemTopicListFromBroker = true; + @RequestCode(code = 306) + private boolean cleanExpiredConsumequeue = true; + @RequestCode(code = 316) + private boolean cleanUnusedTopic = true; + @RequestCode(code = 307) + private boolean getConsumerRunningInfo = true; + @RequestCode(code = 308) + private boolean queryCorrectionOffset = true; + @RequestCode(code = 309) + private boolean consumeMessageDirectly = true; + @RequestCode(code = 314) + private boolean cloneGroupOffset = true; + @RequestCode(code = 315) + private boolean viewBrokerStatsData = true; + @RequestCode(code = 317) + private boolean getBrokerConsumeStats = true; + @RequestCode(code = 321) + private boolean queryConsumeQueue = true; + public BorkerAccessControl() { } - private Set permitSendTopic = new HashSet<>(); - - private Set noPermitSendTopic = new HashSet<>(); - - private Set permitPullTopic = new HashSet<>(); - - private Set noPermitPullTopic = new HashSet<>(); - - @RequestCode(code = 10) - private boolean sendMessage = true; - - @RequestCode(code = 310) - private boolean sendMessageV2 = true; - - @RequestCode(code = 320) - private boolean sendBatchMessage = true; - - @RequestCode(code = 36) - private boolean consumerSendMsgBack = true; - - @RequestCode(code = 11) - private boolean pullMessage = true; - - @RequestCode(code = 12) - private boolean queryMessage = true; - - @RequestCode(code = 33) - private boolean viewMessageById = true; - - @RequestCode(code = 34) - private boolean heartBeat = true; - - @RequestCode(code = 35) - private boolean unregisterClient = true; - - @RequestCode(code = 46) - private boolean checkClientConfig = true; - - @RequestCode(code = 38) - private boolean getConsumerListByGroup = true; - - @RequestCode(code = 15) - private boolean updateConsumerOffset = true; - - @RequestCode(code = 14) - private boolean queryConsumerOffset = true; - - @RequestCode(code = 37) - private boolean endTransaction = true; - - @RequestCode(code = 17) - private boolean updateAndCreateTopic = true; - - @RequestCode(code = 215) - private boolean deleteTopicInbroker = true; - - @RequestCode(code = 21) - private boolean getAllTopicConfig = true; - - @RequestCode(code = 25) - private boolean updateBrokerConfig = true; - - @RequestCode(code = 26) - private boolean getBrokerConfig = true; - - @RequestCode(code = 29) - private boolean searchOffsetByTimestamp = true; - - @RequestCode(code = 30) - private boolean getMaxOffset = true; - - @RequestCode(code = 31) - private boolean getMixOffset = true; - - @RequestCode(code = 32) - private boolean getEarliestMsgStoretime = true; - - @RequestCode(code = 28) - private boolean getBrokerRuntimeInfo = true; - - @RequestCode(code = 41) - private boolean lockBatchMQ = true; - - @RequestCode(code = 42) - private boolean unlockBatchMQ = true; - - @RequestCode(code = 200) - private boolean updateAndCreteSubscriptiongroup = true; - - @RequestCode(code = 201) - private boolean getAllSubscriptiongroupConfig = true; - - @RequestCode(code = 207) - private boolean deleteSubscriptiongroup = true; - - @RequestCode(code = 202) - private boolean getTopicStatsInfo = true; - - @RequestCode(code = 203) - private boolean getConsumerConnectionList = true; - - @RequestCode(code = 204) - private boolean getProducerConnectionList = true; - - @RequestCode(code = 208) - private boolean getConsumeStats = true; - - @RequestCode(code = 43) - private boolean getAllConsumerOffset = true; - - @RequestCode(code = 25) - private boolean getAllDelayOffset = true; - - @RequestCode(code = 222) - private boolean invokeBrokerToresetOffset = true; - - @RequestCode(code = 300) - private boolean queryTopicConsumByWho = true; - - @RequestCode(code = 301) - private boolean registerFilterServer = true; - - @RequestCode(code = 303) - private boolean queryConsumeTimeSpan = true; - - @RequestCode(code = 305) - private boolean getSystemTopicListFromBroker = true; - - @RequestCode(code = 306) - private boolean cleanExpiredConsumequeue = true; - - @RequestCode(code = 316) - private boolean cleanUnusedTopic = true; - - @RequestCode(code = 307) - private boolean getConsumerRunningInfo = true; - - @RequestCode(code = 308) - private boolean queryCorrectionOffset = true; - - @RequestCode(code = 309) - private boolean consumeMessageDirectly = true; - - @RequestCode(code = 314) - private boolean cloneGroupOffset = true; - - @RequestCode(code = 315) - private boolean viewBrokerStatsData = true; - - @RequestCode(code = 317) - private boolean getBrokerConsumeStats = true; - - @RequestCode(code = 321) - private boolean queryConsumeQueue = true; - public Set getPermitSendTopic() { return permitSendTopic; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java index 2d515477ad..9187db88f4 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java @@ -16,10 +16,14 @@ */ package org.apache.rocketmq.acl.plug.entity; +import org.apache.rocketmq.common.protocol.RequestCode; + public class ControllerParametersEntity { private String fileHome; + private Class accessContralAnalysisClass = RequestCode.class; + public String getFileHome() { return fileHome; } @@ -28,11 +32,21 @@ public class ControllerParametersEntity { this.fileHome = fileHome; } - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("ControllerParametersEntity [fileHome=").append(fileHome).append("]"); - return builder.toString(); - } + + public Class getAccessContralAnalysisClass() { + return accessContralAnalysisClass; + } + + public void setAccessContralAnalysisClass(Class accessContralAnalysisClass) { + this.accessContralAnalysisClass = accessContralAnalysisClass; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ControllerParametersEntity [fileHome=").append(fileHome).append(", accessContralAnalysisClass=") + .append(accessContralAnalysisClass).append("]"); + return builder.toString(); + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java index 557cabc7de..fd49cc862e 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java @@ -18,7 +18,6 @@ package org.apache.rocketmq.acl.plug.strategy; import java.util.HashSet; import java.util.Set; - import org.apache.rocketmq.acl.plug.entity.AccessControl; public class MultipleNetaddressStrategy extends AbstractNetaddressStrategy { diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java index 06a5472536..2e44077e5c 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java @@ -1,18 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.common.protocol.RequestCode; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; public class AccessContralAnalysisTest { + AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + + @Before + public void init() { + accessContralAnalysis.analysisClass(RequestCode.class); + } + @Test public void analysisTest() { - AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); BorkerAccessControl accessControl = new BorkerAccessControl(); accessControl.setSendMessage(false); Map map = accessContralAnalysis.analysis(accessControl); @@ -27,7 +53,13 @@ public class AccessContralAnalysisTest { } } Assert.assertEquals(num, 1); - + } + + + @Test(expected=AclPlugAccountAnalysisException.class) + public void analysisExceptionTest(){ + AccessControl accessControl = new AccessControl(); + accessContralAnalysis.analysis(accessControl); } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java index da50ac1400..223cbc7c25 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; public class AclPlugControllerTest { diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java index d65752fbee..806d180894 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java @@ -1,9 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; - import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java index c425315b30..fb1f647267 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java @@ -1,9 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import java.util.HashSet; import java.util.Map; import java.util.Set; - import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; @@ -18,11 +33,16 @@ public class AuthenticationTest { Authentication authentication = new Authentication(); AuthenticationInfo authenticationInfo; + + BorkerAccessControl borkerAccessControl; + + AuthenticationResult authenticationResult = new AuthenticationResult(); + LoginOrRequestAccessControl loginOrRequestAccessControl = new LoginOrRequestAccessControl(); @Before public void init() { OneNetaddressStrategy netaddressStrategy = new OneNetaddressStrategy("127.0.0.1"); - BorkerAccessControl borkerAccessControl = new BorkerAccessControl(); + borkerAccessControl = new BorkerAccessControl(); //321 borkerAccessControl.setQueryConsumeQueue(false); @@ -51,8 +71,7 @@ public class AuthenticationTest { @Test public void authenticationTest() { - AuthenticationResult authenticationResult = new AuthenticationResult(); - LoginOrRequestAccessControl loginOrRequestAccessControl = new LoginOrRequestAccessControl(); + loginOrRequestAccessControl.setCode(317); boolean isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); @@ -81,7 +100,7 @@ public class AuthenticationTest { loginOrRequestAccessControl.setTopic("nopermitSendTopic"); isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); - Assert.assertTrue(isReturn); + Assert.assertFalse(isReturn); loginOrRequestAccessControl.setCode(11); loginOrRequestAccessControl.setTopic("permitPullTopic"); @@ -94,7 +113,29 @@ public class AuthenticationTest { loginOrRequestAccessControl.setTopic("nopermitPullTopic"); isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); - Assert.assertTrue(isReturn); + Assert.assertFalse(isReturn); } + + @Test + public void isEmptyTest() { + loginOrRequestAccessControl.setCode(10); + loginOrRequestAccessControl.setTopic("absentTopic"); + boolean isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertFalse(isReturn); + + Set permitSendTopic = new HashSet<>(); + borkerAccessControl.setPermitSendTopic(permitSendTopic); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + loginOrRequestAccessControl.setCode(11); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertFalse(isReturn); + + borkerAccessControl.setPermitPullTopic(permitSendTopic); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + } + } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index d126f19f66..4098466016 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -1,14 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; - import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; @@ -54,13 +68,13 @@ public class PlainAclPlugEngineTest { accessControl = new BorkerAccessControl(); accessControl.setAccount("rokcetmq"); - accessControl.setPassword("aliyun"); + accessControl.setPassword("aliyun11"); accessControl.setNetaddress("127.0.0.1"); accessControl.setRecognition("127.0.0.1:1"); accessControlTwo = new BorkerAccessControl(); - accessControlTwo.setAccount("rokcet"); - accessControlTwo.setPassword("aliyun"); + accessControlTwo.setAccount("rokcet1"); + accessControlTwo.setPassword("aliyun1"); accessControlTwo.setNetaddress("127.0.0.1"); accessControlTwo.setRecognition("127.0.0.1:2"); @@ -69,6 +83,31 @@ public class PlainAclPlugEngineTest { } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void accountNullTest() { + accessControl.setAccount(null); + plainAclPlugEngine.setAccessControl(accessControl); + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void accountThanTest() { + accessControl.setAccount("123"); + plainAclPlugEngine.setAccessControl(accessControl); + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void passWordtNullTest() { + accessControl.setAccount(null); + plainAclPlugEngine.setAccessControl(accessControl); + } + + @Test(expected = AclPlugAccountAnalysisException.class) + public void passWordThanTest() { + accessControl.setAccount("123"); + plainAclPlugEngine.setAccessControl(accessControl); + } + @Test(expected = AclPlugAccountAnalysisException.class) public void testPlainAclPlugEngineInit() { ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); @@ -88,7 +127,7 @@ public class PlainAclPlugEngineTest { AccessControl testAccessControl = new AccessControl(); testAccessControl.setAccount("rokcetmq"); - testAccessControl.setPassword("aliyun"); + testAccessControl.setPassword("aliyun11"); testAccessControl.setNetaddress("127.0.0.1"); testAccessControl.setRecognition("127.0.0.1:1"); @@ -97,7 +136,7 @@ public class PlainAclPlugEngineTest { Assert.assertNull(authenticationInfo); testAccessControl.setAccount("rokcetmq"); - testAccessControl.setPassword("1"); + testAccessControl.setPassword("1234567"); authenticationInfo = aclPlugEngine.getAccessControl(testAccessControl); Assert.assertNull(authenticationInfo); @@ -128,6 +167,8 @@ public class PlainAclPlugEngineTest { public void setNetaddressAccessControl() { AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; AccessControl accessControl = new BorkerAccessControl(); + accessControl.setAccount("RocketMQ"); + accessControl.setPassword("RocketMQ"); accessControl.setNetaddress("127.0.0.1"); aclPlugEngine.setAccessControl(accessControl); aclPlugEngine.setNetaddressAccessControl(accessControl); @@ -162,6 +203,8 @@ public class PlainAclPlugEngineTest { AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; AccessControl accessControl = new BorkerAccessControl(); + accessControl.setAccount("RocketMQ"); + accessControl.setPassword("RocketMQ"); accessControl.setNetaddress("127.0.0.1"); aclPlugEngine.setAccessControl(accessControl); AuthenticationInfo authenticationInfo = aclPlugEngine.getAccessControl(accessControl); @@ -201,7 +244,7 @@ public class PlainAclPlugEngineTest { public void getAuthenticationInfo() { LoginOrRequestAccessControl loginOrRequestAccessControl = new LoginOrRequestAccessControl(); loginOrRequestAccessControl.setAccount("rokcetmq"); - loginOrRequestAccessControl.setPassword("aliyun"); + loginOrRequestAccessControl.setPassword("aliyun11"); loginOrRequestAccessControl.setNetaddress("127.0.0.1"); loginOrRequestAccessControl.setRecognition("127.0.0.1:1"); diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java index bf9101b200..f670b31ec4 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; import org.apache.rocketmq.acl.plug.entity.AccessControl; diff --git a/acl-plug/src/test/resources/conf/transport.yml b/acl-plug/src/test/resources/conf/transport.yml index 897aedd3fd..4f29f4ee49 100644 --- a/acl-plug/src/test/resources/conf/transport.yml +++ b/acl-plug/src/test/resources/conf/transport.yml @@ -4,14 +4,14 @@ onlyNetAddress: - broker-a list: -- account: laohu - password: 123456 +- account: rocketMQ + password: 1234567 netaddress: 192.0.0.* permitSendTopic: - test1 - test2 -- account: laohu - password: 123456 +- account: rocketMQ + password: 1234567 netaddress: 192.0.2.1 permitSendTopic: - test3 diff --git a/broker/pom.xml b/broker/pom.xml index 7c67de57c1..c353eb32b8 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -9,81 +9,81 @@ OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - - - org.apache.rocketmq - rocketmq-all - 4.4.0-SNAPSHOT - + + + org.apache.rocketmq + rocketmq-all + 4.4.0-SNAPSHOT + - 4.0.0 - jar - rocketmq-broker - rocketmq-broker ${project.version} + 4.0.0 + jar + rocketmq-broker + rocketmq-broker ${project.version} - - - ${project.groupId} - rocketmq-common - - - ${project.groupId} - rocketmq-store - - - ${project.groupId} - rocketmq-remoting - - - ${project.groupId} - rocketmq-client - - - ${project.groupId} - rocketmq-srvutil - - - ${project.groupId} - rocketmq-filter - - - ${project.groupId} - rocketmq-acl-plug - - - ch.qos.logback - logback-classic - - - ch.qos.logback - logback-core - - - com.alibaba - fastjson - - - org.javassist - javassist - - - org.slf4j - slf4j-api - - + + + ${project.groupId} + rocketmq-common + + + ${project.groupId} + rocketmq-store + + + ${project.groupId} + rocketmq-remoting + + + ${project.groupId} + rocketmq-client + + + ${project.groupId} + rocketmq-srvutil + + + ${project.groupId} + rocketmq-filter + + + ${project.groupId} + rocketmq-acl-plug + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + + + com.alibaba + fastjson + + + org.javassist + javassist + + + org.slf4j + slf4j-api + + - - - - maven-surefire-plugin - 2.19.1 - - 1 - false - - - - + + + + maven-surefire-plugin + 2.19.1 + + 1 + false + + + + diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index e6c83ed577..4f3b736f0a 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -302,7 +302,6 @@ public class BrokerController { this.heartbeatThreadPoolQueue, new ThreadFactoryImpl("HeartbeatThread_", true)); - this.endTransactionExecutor = new BrokerFixedThreadPoolExecutor( this.brokerConfig.getEndTransactionThreadPoolNums(), this.brokerConfig.getEndTransactionThreadPoolNums(), @@ -1101,12 +1100,12 @@ public class BrokerController { this.transactionalMessageCheckListener = transactionalMessageCheckListener; } -<<<<<<< HEAD public AclPlugController getAclPlugController() { return this.aclPlugController; -======= + } + public BlockingQueue getEndTransactionThreadPoolQueue() { return endTransactionThreadPoolQueue; ->>>>>>> 53a63460d3a1599a6c51058bb51a73746233022d + } } diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java b/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java index 04794d1dc1..f4ecc2c046 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java @@ -72,7 +72,9 @@ public class ClientHousekeepingService implements ChannelEventListener { this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getConsumerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel); - this.brokerController.getAclPlugController().doChannelCloseEvent(remoteAddr); + if (this.brokerController.getAclPlugController() != null && this.brokerController.getAclPlugController().isStartSucceed()) { + this.brokerController.getAclPlugController().doChannelCloseEvent(remoteAddr); + } } @Override diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index 9920cc49da..6e11de20ff 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -70,7 +70,6 @@ public class BrokerConfig { */ private int endTransactionThreadPoolNums = 8 + Runtime.getRuntime().availableProcessors() * 2; - private int flushConsumerOffsetInterval = 1000 * 5; private int flushConsumerOffsetHistoryInterval = 1000 * 60; @@ -174,6 +173,16 @@ public class BrokerConfig { private boolean isAclPlug; + public static String localHostName() { + try { + return InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + log.error("Failed to obtain the host name", e); + } + + return "DEFAULT_BROKER"; + } + public boolean isTraceOn() { return traceOn; } @@ -238,16 +247,6 @@ public class BrokerConfig { this.slaveReadEnable = slaveReadEnable; } - public static String localHostName() { - try { - return InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - log.error("Failed to obtain the host name", e); - } - - return "DEFAULT_BROKER"; - } - public int getRegisterBrokerTimeoutMills() { return registerBrokerTimeoutMills; } @@ -712,7 +711,6 @@ public class BrokerConfig { this.transactionCheckInterval = transactionCheckInterval; } - public boolean isAclPlug() { return isAclPlug; } diff --git a/distribution/conf/transport.yml b/distribution/conf/transport.yml index 424fd8d8e7..d9552ac73e 100644 --- a/distribution/conf/transport.yml +++ b/distribution/conf/transport.yml @@ -4,14 +4,14 @@ onlyNetAddress: - broker-a list: - - account: laohu - password: 123456 + - account: RocketMQ + password: 1234567 netaddress: 192.0.0.* permitSendTopic: - test1 - test2 - - account: laohu - password: 123456 + - account: RocketMQ + password: 1234567 netaddress: 192.0.2.1 permitSendTopic: - test3 From 693243e8c02e87f2de0dbed017ed0e3a2deec274 Mon Sep 17 00:00:00 2001 From: hujie Date: Wed, 10 Oct 2018 12:01:53 +0800 Subject: [PATCH 06/96] finishing --- .../acl/plug/AccessContralAnalysis.java | 52 ++++--- .../acl/plug/annotation/RequestCode.java | 31 ---- ...enticationInfoManagementAclPlugEngine.java | 15 +- .../plug/engine/LoginInfoAclPlugEngine.java | 10 +- .../acl/plug/engine/PlainAclPlugEngine.java | 6 +- .../acl/plug/entity/BorkerAccessControl.java | 137 +++++++++--------- .../entity/ControllerParametersEntity.java | 27 ++-- .../acl/plug/AccessContralAnalysisTest.java | 26 ++-- .../rocketmq/acl/plug/AuthenticationTest.java | 45 +++--- .../plug/engine/PlainAclPlugEngineTest.java | 25 ++-- 10 files changed, 164 insertions(+), 210 deletions(-) delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java index 64a9a2ad66..62a25dc7da 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java @@ -21,9 +21,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; - import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.annotation.RequestCode; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; @@ -31,23 +29,23 @@ public class AccessContralAnalysis { private Map, Map> classTocodeAndMentod = new HashMap<>(); - private Map fieldNameAndCode = new HashMap<>(); - + private Map fieldNameAndCode = new HashMap<>(); + public void analysisClass(Class clazz) { - Field[] fields = clazz.getDeclaredFields(); - try { - for(Field field : fields) { - if( field.getType().equals(int.class)) { - String name = StringUtils.replace(field.getName(), "_", "").toLowerCase(); - fieldNameAndCode.put(name, (Integer)field.get(null)); - } - - } - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugAccountAnalysisException(String.format("analysis on failure Class is %s", clazz.getName()), e); - } + Field[] fields = clazz.getDeclaredFields(); + try { + for (Field field : fields) { + if (field.getType().equals(int.class)) { + String name = StringUtils.replace(field.getName(), "_", "").toLowerCase(); + fieldNameAndCode.put(name, (Integer) field.get(null)); + } + + } + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new AclPlugAccountAnalysisException(String.format("analysis on failure Class is %s", clazz.getName()), e); + } } - + public Map analysis(AccessControl accessControl) { Class clazz = accessControl.getClass(); Map codeAndField = classTocodeAndMentod.get(clazz); @@ -55,18 +53,18 @@ public class AccessContralAnalysis { codeAndField = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { - if(!field.getType().equals(boolean.class)) - continue; - Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); - if(code == null) { - throw new AclPlugAccountAnalysisException(String.format("field nonexistent in code", field.getName())); - } - field.setAccessible( true ); - codeAndField.put(code, field); + if (!field.getType().equals(boolean.class)) + continue; + Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); + if (code == null) { + throw new AclPlugAccountAnalysisException(String.format("field nonexistent in code fieldName is %s", field.getName())); + } + field.setAccessible(true); + codeAndField.put(code, field); } - if(codeAndField.isEmpty()) { - throw new AclPlugAccountAnalysisException(String.format("AccessControl nonexistent code , name %s" , accessControl.getClass().getName())); + if (codeAndField.isEmpty()) { + throw new AclPlugAccountAnalysisException(String.format("AccessControl nonexistent code , name %s", accessControl.getClass().getName())); } classTocodeAndMentod.put(clazz, codeAndField); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java deleted file mode 100644 index d9668ae223..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/annotation/RequestCode.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Documented -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD}) -public @interface RequestCode { - - int code(); -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index 73205416d3..7346bc9130 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -37,25 +37,18 @@ import org.apache.rocketmq.logging.InternalLoggerFactory; public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPlugEngine { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); - + ControllerParametersEntity controllerParametersEntity; private Map> accessControlMap = new HashMap<>(); - private AuthenticationInfo authenticationInfo; - private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); - private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - private Authentication authentication = new Authentication(); - ControllerParametersEntity controllerParametersEntity; - - public AuthenticationInfoManagementAclPlugEngine(ControllerParametersEntity controllerParametersEntity) { + public AuthenticationInfoManagementAclPlugEngine(ControllerParametersEntity controllerParametersEntity) { this.controllerParametersEntity = controllerParametersEntity; accessContralAnalysis.analysisClass(controllerParametersEntity.getAccessContralAnalysisClass()); - } - - + } + public void setAccessControl(AccessControl accessControl) throws AclPlugAccountAnalysisException { if (accessControl.getAccount() == null || accessControl.getPassword() == null || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { throw new AclPlugAccountAnalysisException(String.format("The account password cannot be null and is longer than 6, account is %s password is %s", accessControl.getAccount(), accessControl.getPassword())); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java index 76412351d2..b0ad2e0d4d 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java @@ -18,7 +18,6 @@ package org.apache.rocketmq.acl.plug.engine; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; - import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; @@ -30,11 +29,10 @@ public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagemen private Map loginInfoMap = new ConcurrentHashMap<>(); - - public LoginInfoAclPlugEngine(ControllerParametersEntity controllerParametersEntity) { - super(controllerParametersEntity); - } - + public LoginInfoAclPlugEngine(ControllerParametersEntity controllerParametersEntity) { + super(controllerParametersEntity); + } + public LoginInfo getLoginInfo(AccessControl accessControl) { LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); if (loginInfo == null) { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index 7e4ede4a47..cf7a06a30b 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -26,10 +26,10 @@ import org.yaml.snakeyaml.Yaml; public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { - private ControllerParametersEntity controllerParametersEntity; - public PlainAclPlugEngine(ControllerParametersEntity controllerParametersEntity) throws AclPlugAccountAnalysisException { - super(controllerParametersEntity); + public PlainAclPlugEngine( + ControllerParametersEntity controllerParametersEntity) throws AclPlugAccountAnalysisException { + super(controllerParametersEntity); init(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java index 0446ca0022..d40fadfacb 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java @@ -18,7 +18,6 @@ package org.apache.rocketmq.acl.plug.entity; import java.util.HashSet; import java.util.Set; -import org.apache.rocketmq.acl.plug.annotation.RequestCode; public class BorkerAccessControl extends AccessControl { @@ -28,101 +27,101 @@ public class BorkerAccessControl extends AccessControl { private Set noPermitPullTopic = new HashSet<>(); private boolean sendMessage = true; - + private boolean sendMessageV2 = true; private boolean sendBatchMessage = true; private boolean consumerSendMsgBack = true; - @RequestCode(code = 11) + private boolean pullMessage = true; - @RequestCode(code = 12) + private boolean queryMessage = true; - @RequestCode(code = 33) + private boolean viewMessageById = true; - @RequestCode(code = 34) + private boolean heartBeat = true; - @RequestCode(code = 35) + private boolean unregisterClient = true; - @RequestCode(code = 46) + private boolean checkClientConfig = true; - @RequestCode(code = 38) + private boolean getConsumerListByGroup = true; - @RequestCode(code = 15) + private boolean updateConsumerOffset = true; - @RequestCode(code = 14) + private boolean queryConsumerOffset = true; - @RequestCode(code = 37) + private boolean endTransaction = true; - @RequestCode(code = 17) + private boolean updateAndCreateTopic = true; - @RequestCode(code = 215) + private boolean deleteTopicInbroker = true; - @RequestCode(code = 21) + private boolean getAllTopicConfig = true; - @RequestCode(code = 25) + private boolean updateBrokerConfig = true; - @RequestCode(code = 26) + private boolean getBrokerConfig = true; - @RequestCode(code = 29) + private boolean searchOffsetByTimestamp = true; - @RequestCode(code = 30) + private boolean getMaxOffset = true; - @RequestCode(code = 31) - private boolean getMixOffset = true; - @RequestCode(code = 32) + + private boolean getMinOffset = true; + private boolean getEarliestMsgStoretime = true; - @RequestCode(code = 28) + private boolean getBrokerRuntimeInfo = true; - @RequestCode(code = 41) + private boolean lockBatchMQ = true; - @RequestCode(code = 42) + private boolean unlockBatchMQ = true; - @RequestCode(code = 200) - private boolean updateAndCreteSubscriptiongroup = true; - @RequestCode(code = 201) + + private boolean updateAndCreateSubscriptiongroup = true; + private boolean getAllSubscriptiongroupConfig = true; - @RequestCode(code = 207) + private boolean deleteSubscriptiongroup = true; - @RequestCode(code = 202) + private boolean getTopicStatsInfo = true; - @RequestCode(code = 203) + private boolean getConsumerConnectionList = true; - @RequestCode(code = 204) + private boolean getProducerConnectionList = true; - @RequestCode(code = 208) + private boolean getConsumeStats = true; - @RequestCode(code = 43) + private boolean getAllConsumerOffset = true; - @RequestCode(code = 25) + private boolean getAllDelayOffset = true; - @RequestCode(code = 222) + private boolean invokeBrokerToresetOffset = true; - @RequestCode(code = 300) - private boolean queryTopicConsumByWho = true; - @RequestCode(code = 301) + + private boolean queryTopicConsumeByWho = true; + private boolean registerFilterServer = true; - + private boolean queryConsumeTimeSpan = true; private boolean getSystemTopicListFromBroker = true; - @RequestCode(code = 306) + private boolean cleanExpiredConsumequeue = true; - @RequestCode(code = 316) + private boolean cleanUnusedTopic = true; - @RequestCode(code = 307) + private boolean getConsumerRunningInfo = true; - @RequestCode(code = 308) + private boolean queryCorrectionOffset = true; - @RequestCode(code = 309) + private boolean consumeMessageDirectly = true; - @RequestCode(code = 314) + private boolean cloneGroupOffset = true; - @RequestCode(code = 315) + private boolean viewBrokerStatsData = true; - @RequestCode(code = 317) + private boolean getBrokerConsumeStats = true; - @RequestCode(code = 321) + private boolean queryConsumeQueue = true; public BorkerAccessControl() { @@ -325,16 +324,16 @@ public class BorkerAccessControl extends AccessControl { return getMaxOffset; } - public void setGetMaxOffset(boolean getMaxOffset) { - this.getMaxOffset = getMaxOffset; + public void setGetMaxOffset(boolean getMinOffset) { + this.getMaxOffset = getMinOffset; } - public boolean isGetMixOffset() { - return getMixOffset; + public boolean isGetMinOffset() { + return getMinOffset; } - public void setGetMixOffset(boolean getMixOffset) { - this.getMixOffset = getMixOffset; + public void setGetMinOffset(boolean getMinOffset) { + this.getMinOffset = getMinOffset; } public boolean isGetEarliestMsgStoretime() { @@ -369,12 +368,12 @@ public class BorkerAccessControl extends AccessControl { this.unlockBatchMQ = unlockBatchMQ; } - public boolean isUpdateAndCreteSubscriptiongroup() { - return updateAndCreteSubscriptiongroup; + public boolean isUpdateAndCreateSubscriptiongroup() { + return updateAndCreateSubscriptiongroup; } - public void setUpdateAndCreteSubscriptiongroup(boolean updateAndCreteSubscriptiongroup) { - this.updateAndCreteSubscriptiongroup = updateAndCreteSubscriptiongroup; + public void setUpdateAndCreateSubscriptiongroup(boolean updateAndCreateSubscriptiongroup) { + this.updateAndCreateSubscriptiongroup = updateAndCreateSubscriptiongroup; } public boolean isGetAllSubscriptiongroupConfig() { @@ -449,12 +448,12 @@ public class BorkerAccessControl extends AccessControl { this.invokeBrokerToresetOffset = invokeBrokerToresetOffset; } - public boolean isQueryTopicConsumByWho() { - return queryTopicConsumByWho; + public boolean isQueryTopicConsumeByWho() { + return queryTopicConsumeByWho; } - public void setQueryTopicConsumByWho(boolean queryTopicConsumByWho) { - this.queryTopicConsumByWho = queryTopicConsumByWho; + public void setQueryTopicConsumeByWho(boolean queryTopicConsumeByWho) { + this.queryTopicConsumeByWho = queryTopicConsumeByWho; } public boolean isRegisterFilterServer() { @@ -601,8 +600,8 @@ public class BorkerAccessControl extends AccessControl { builder.append(", searchOffsetByTimestamp=").append(searchOffsetByTimestamp); if (!getMaxOffset) builder.append(", getMaxOffset=").append(getMaxOffset); - if (!getMixOffset) - builder.append(", getMixOffset=").append(getMixOffset); + if (!getMinOffset) + builder.append(", getMixOffset=").append(getMinOffset); if (!getEarliestMsgStoretime) builder.append(", getEarliestMsgStoretime=").append(getEarliestMsgStoretime); if (!getBrokerRuntimeInfo) @@ -611,8 +610,8 @@ public class BorkerAccessControl extends AccessControl { builder.append(", lockBatchMQ=").append(lockBatchMQ); if (!unlockBatchMQ) builder.append(", unlockBatchMQ=").append(unlockBatchMQ); - if (!updateAndCreteSubscriptiongroup) - builder.append(", updateAndCreteSubscriptiongroup=").append(updateAndCreteSubscriptiongroup); + if (!updateAndCreateSubscriptiongroup) + builder.append(", updateAndCreateSubscriptiongroup=").append(updateAndCreateSubscriptiongroup); if (!getAllSubscriptiongroupConfig) builder.append(", getAllSubscriptiongroupConfig=").append(getAllSubscriptiongroupConfig); if (!deleteSubscriptiongroup) @@ -631,8 +630,8 @@ public class BorkerAccessControl extends AccessControl { builder.append(", getAllDelayOffset=").append(getAllDelayOffset); if (!invokeBrokerToresetOffset) builder.append(", invokeBrokerToresetOffset=").append(invokeBrokerToresetOffset); - if (!queryTopicConsumByWho) - builder.append(", queryTopicConsumByWho=").append(queryTopicConsumByWho); + if (!queryTopicConsumeByWho) + builder.append(", queryTopicConsumeByWho=").append(queryTopicConsumeByWho); if (!registerFilterServer) builder.append(", registerFilterServer=").append(registerFilterServer); if (!queryConsumeTimeSpan) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java index 9187db88f4..fe781e0e2e 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java @@ -23,7 +23,7 @@ public class ControllerParametersEntity { private String fileHome; private Class accessContralAnalysisClass = RequestCode.class; - + public String getFileHome() { return fileHome; } @@ -32,21 +32,20 @@ public class ControllerParametersEntity { this.fileHome = fileHome; } - public Class getAccessContralAnalysisClass() { - return accessContralAnalysisClass; - } + return accessContralAnalysisClass; + } - public void setAccessContralAnalysisClass(Class accessContralAnalysisClass) { - this.accessContralAnalysisClass = accessContralAnalysisClass; - } + public void setAccessContralAnalysisClass(Class accessContralAnalysisClass) { + this.accessContralAnalysisClass = accessContralAnalysisClass; + } - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("ControllerParametersEntity [fileHome=").append(fileHome).append(", accessContralAnalysisClass=") - .append(accessContralAnalysisClass).append("]"); - return builder.toString(); - } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ControllerParametersEntity [fileHome=").append(fileHome).append(", accessContralAnalysisClass=") + .append(accessContralAnalysisClass).append("]"); + return builder.toString(); + } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java index 2e44077e5c..c269cc4d97 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java @@ -19,7 +19,6 @@ package org.apache.rocketmq.acl.plug; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; - import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; @@ -30,13 +29,13 @@ import org.junit.Test; public class AccessContralAnalysisTest { - AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - - @Before - public void init() { - accessContralAnalysis.analysisClass(RequestCode.class); - } - + AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + + @Before + public void init() { + accessContralAnalysis.analysisClass(RequestCode.class); + } + @Test public void analysisTest() { BorkerAccessControl accessControl = new BorkerAccessControl(); @@ -54,12 +53,11 @@ public class AccessContralAnalysisTest { } Assert.assertEquals(num, 1); } - - - @Test(expected=AclPlugAccountAnalysisException.class) - public void analysisExceptionTest(){ - AccessControl accessControl = new AccessControl(); - accessContralAnalysis.analysis(accessControl); + + @Test(expected = AclPlugAccountAnalysisException.class) + public void analysisExceptionTest() { + AccessControl accessControl = new AccessControl(); + accessContralAnalysis.analysis(accessControl); } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java index fb1f647267..18669fe9c7 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java @@ -24,6 +24,7 @@ import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; import org.apache.rocketmq.acl.plug.strategy.OneNetaddressStrategy; +import org.apache.rocketmq.common.protocol.RequestCode; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -33,9 +34,9 @@ public class AuthenticationTest { Authentication authentication = new Authentication(); AuthenticationInfo authenticationInfo; - + BorkerAccessControl borkerAccessControl; - + AuthenticationResult authenticationResult = new AuthenticationResult(); LoginOrRequestAccessControl loginOrRequestAccessControl = new LoginOrRequestAccessControl(); @@ -63,6 +64,7 @@ public class AuthenticationTest { borkerAccessControl.setNoPermitPullTopic(noPermitPullTopic); AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + accessContralAnalysis.analysisClass(RequestCode.class); Map map = accessContralAnalysis.analysis(borkerAccessControl); authenticationInfo = new AuthenticationInfo(map, borkerAccessControl, netaddressStrategy); @@ -71,7 +73,6 @@ public class AuthenticationTest { @Test public void authenticationTest() { - loginOrRequestAccessControl.setCode(317); boolean isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); @@ -116,26 +117,26 @@ public class AuthenticationTest { Assert.assertFalse(isReturn); } - + @Test public void isEmptyTest() { - loginOrRequestAccessControl.setCode(10); - loginOrRequestAccessControl.setTopic("absentTopic"); - boolean isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); - Assert.assertFalse(isReturn); - - Set permitSendTopic = new HashSet<>(); - borkerAccessControl.setPermitSendTopic(permitSendTopic); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); - Assert.assertTrue(isReturn); - - loginOrRequestAccessControl.setCode(11); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); - Assert.assertFalse(isReturn); - - borkerAccessControl.setPermitPullTopic(permitSendTopic); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); - Assert.assertTrue(isReturn); + loginOrRequestAccessControl.setCode(10); + loginOrRequestAccessControl.setTopic("absentTopic"); + boolean isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertFalse(isReturn); + + Set permitSendTopic = new HashSet<>(); + borkerAccessControl.setPermitSendTopic(permitSendTopic); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); + + loginOrRequestAccessControl.setCode(11); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertFalse(isReturn); + + borkerAccessControl.setPermitPullTopic(permitSendTopic); + isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + Assert.assertTrue(isReturn); } - + } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 4098466016..982bb527e7 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -83,31 +83,30 @@ public class PlainAclPlugEngineTest { } - @Test(expected = AclPlugAccountAnalysisException.class) public void accountNullTest() { - accessControl.setAccount(null); - plainAclPlugEngine.setAccessControl(accessControl); + accessControl.setAccount(null); + plainAclPlugEngine.setAccessControl(accessControl); } - + @Test(expected = AclPlugAccountAnalysisException.class) public void accountThanTest() { - accessControl.setAccount("123"); - plainAclPlugEngine.setAccessControl(accessControl); + accessControl.setAccount("123"); + plainAclPlugEngine.setAccessControl(accessControl); } - + @Test(expected = AclPlugAccountAnalysisException.class) public void passWordtNullTest() { - accessControl.setAccount(null); - plainAclPlugEngine.setAccessControl(accessControl); + accessControl.setAccount(null); + plainAclPlugEngine.setAccessControl(accessControl); } - + @Test(expected = AclPlugAccountAnalysisException.class) public void passWordThanTest() { - accessControl.setAccount("123"); - plainAclPlugEngine.setAccessControl(accessControl); + accessControl.setAccount("123"); + plainAclPlugEngine.setAccessControl(accessControl); } - + @Test(expected = AclPlugAccountAnalysisException.class) public void testPlainAclPlugEngineInit() { ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); From 94f36e22fd9cbad06f02940ec72820c07457805a Mon Sep 17 00:00:00 2001 From: hujie Date: Wed, 10 Oct 2018 14:31:10 +0800 Subject: [PATCH 07/96] slove rat exception --- acl-plug/pom.xml | 11 ++++++++++- .../acl/plug/engine/PlainAclPlugEngine.java | 1 - .../src/test/resources/conf/transport.yml | 19 ------------------- 3 files changed, 10 insertions(+), 21 deletions(-) delete mode 100644 acl-plug/src/test/resources/conf/transport.yml diff --git a/acl-plug/pom.xml b/acl-plug/pom.xml index a4633f70a1..3ca98ec704 100644 --- a/acl-plug/pom.xml +++ b/acl-plug/pom.xml @@ -1,4 +1,13 @@ - + Date: Wed, 10 Oct 2018 14:44:23 +0800 Subject: [PATCH 08/96] slove rat exception --- .../src/test/resources/conf/transport.yml | 34 +++++++++++++++++++ distribution/conf/transport.yml | 15 ++++++++ 2 files changed, 49 insertions(+) create mode 100644 acl-plug/src/test/resources/conf/transport.yml diff --git a/acl-plug/src/test/resources/conf/transport.yml b/acl-plug/src/test/resources/conf/transport.yml new file mode 100644 index 0000000000..25d4902a67 --- /dev/null +++ b/acl-plug/src/test/resources/conf/transport.yml @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +onlyNetAddress: + netaddress: 10.10.103.* + noPermitPullTopic: + - broker-a + +list: + - account: RocketMQ + password: 1234567 + netaddress: 192.0.0.* + permitSendTopic: + - test1 + - test2 + - account: RocketMQ + password: 1234567 + netaddress: 192.0.2.1 + permitSendTopic: + - test3 + - test4 + \ No newline at end of file diff --git a/distribution/conf/transport.yml b/distribution/conf/transport.yml index d9552ac73e..25d4902a67 100644 --- a/distribution/conf/transport.yml +++ b/distribution/conf/transport.yml @@ -1,3 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + onlyNetAddress: netaddress: 10.10.103.* noPermitPullTopic: From 1e3c1841b093df912ce44a8acde7f4a5a0d00830 Mon Sep 17 00:00:00 2001 From: hujie Date: Wed, 10 Oct 2018 22:10:48 +0800 Subject: [PATCH 09/96] clear --- acl-plug/pom.xml | 5 + .../acl/plug/AccessContralAnalysis.java | 10 +- .../rocketmq/acl/plug/AclPlugController.java | 6 +- .../rocketmq/acl/plug/AclPlugServer.java | 21 --- .../rocketmq/acl/plug/AclRemotingServer.java | 4 +- .../apache/rocketmq/acl/plug/AclUtils.java | 7 + .../rocketmq/acl/plug/Authentication.java | 10 +- .../plug/DefaultAclRemotingServerImpl.java | 10 +- .../acl/plug/engine/AclPlugEngine.java | 3 +- ...enticationInfoManagementAclPlugEngine.java | 21 ++- .../plug/engine/LoginInfoAclPlugEngine.java | 3 +- .../acl/plug/engine/PlainAclPlugEngine.java | 12 +- .../acl/plug/entity/AccessControl.java | 27 +++- .../entity/LoginOrRequestAccessControl.java | 48 ------- .../AclPlugAccountAnalysisException.java | 31 ----- .../AclPlugAuthenticationException.java | 30 ----- .../acl/plug/exception/AclPlugException.java | 30 ----- .../plug/exception/AclPlugLoginException.java | 31 ----- .../plug/exception/AclPlugStartException.java | 30 ----- .../strategy/AbstractNetaddressStrategy.java | 30 ----- .../strategy/MultipleNetaddressStrategy.java | 39 ------ .../strategy/NetaddressStrategyFactory.java | 120 +++++++++++++++++- .../plug/strategy/NullNetaddressStrategy.java | 30 ----- .../plug/strategy/OneNetaddressStrategy.java | 35 ----- .../strategy/RangeNetaddressStrategy.java | 89 ------------- .../acl/plug/AccessContralAnalysisTest.java | 4 +- .../rocketmq/acl/plug/AuthenticationTest.java | 67 +++++----- .../plug/engine/PlainAclPlugEngineTest.java | 29 ++--- .../plug/strategy/NetaddressStrategyTest.java | 42 +++--- .../src/test/resources/conf/transport.yml | 26 ++-- .../rocketmq/broker/BrokerController.java | 5 +- pom.xml | 9 +- 32 files changed, 283 insertions(+), 581 deletions(-) delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAccountAnalysisException.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAuthenticationException.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugException.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugLoginException.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugStartException.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java diff --git a/acl-plug/pom.xml b/acl-plug/pom.xml index 3ca98ec704..1cdc4a29da 100644 --- a/acl-plug/pom.xml +++ b/acl-plug/pom.xml @@ -26,6 +26,11 @@ UTF-8 + + ${project.groupId} + rocketmq-remoting + + ${project.groupId} rocketmq-logging diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java index 62a25dc7da..75c907d82b 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java @@ -23,7 +23,7 @@ import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; public class AccessContralAnalysis { @@ -42,7 +42,7 @@ public class AccessContralAnalysis { } } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugAccountAnalysisException(String.format("analysis on failure Class is %s", clazz.getName()), e); + throw new AclPlugRuntimeException(String.format("analysis on failure Class is %s", clazz.getName()), e); } } @@ -57,14 +57,14 @@ public class AccessContralAnalysis { continue; Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); if (code == null) { - throw new AclPlugAccountAnalysisException(String.format("field nonexistent in code fieldName is %s", field.getName())); + throw new AclPlugRuntimeException(String.format("field nonexistent in code fieldName is %s", field.getName())); } field.setAccessible(true); codeAndField.put(code, field); } if (codeAndField.isEmpty()) { - throw new AclPlugAccountAnalysisException(String.format("AccessControl nonexistent code , name %s", accessControl.getClass().getName())); + throw new AclPlugRuntimeException(String.format("AccessControl nonexistent code , name %s", accessControl.getClass().getName())); } classTocodeAndMentod.put(clazz, codeAndField); } @@ -76,7 +76,7 @@ public class AccessContralAnalysis { authority.put(e.getKey(), (Boolean) e.getValue().get(accessControl)); } } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugAccountAnalysisException(String.format("analysis on failure AccessControl is %s", AccessControl.class.getName()), e); + throw new AclPlugRuntimeException(String.format("analysis on failure AccessControl is %s", AccessControl.class.getName()), e); } return authority; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java index d3781059dd..c32ec73331 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java @@ -19,7 +19,7 @@ package org.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; -import org.apache.rocketmq.acl.plug.exception.AclPlugStartException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; public class AclPlugController { @@ -31,14 +31,14 @@ public class AclPlugController { private boolean startSucceed = false; - public AclPlugController(ControllerParametersEntity controllerParametersEntity) throws AclPlugStartException { + public AclPlugController(ControllerParametersEntity controllerParametersEntity) throws AclPlugRuntimeException { try { this.controllerParametersEntity = controllerParametersEntity; aclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); aclRemotingServer = new DefaultAclRemotingServerImpl(aclPlugEngine); this.startSucceed = true; } catch (Exception e) { - throw new AclPlugStartException(String.format("Start the abnormal , Launch parameters is %s", this.controllerParametersEntity.toString()), e); + throw new AclPlugRuntimeException(String.format("Start the abnormal , Launch parameters is %s", this.controllerParametersEntity.toString()), e); } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java deleted file mode 100644 index c1bb84721d..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugServer.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -public class AclPlugServer { - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java index 4eeb2a54c4..30df38140b 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java @@ -16,11 +16,11 @@ */ package org.apache.rocketmq.acl.plug; +import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public interface AclRemotingServer { - public AuthenticationResult eachCheck(LoginOrRequestAccessControl accessControl); + public AuthenticationResult eachCheck(AccessControl accessControl); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java index 17a5441235..df997b59df 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java @@ -17,9 +17,16 @@ package org.apache.rocketmq.acl.plug; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; public class AclUtils { + public static void verify(String netaddress, int index) { + if (!AclUtils.isScope(netaddress, index)) { + throw new AclPlugRuntimeException(String.format("netaddress examine scope Exception netaddress is %s", netaddress)); + } + } + public static String[] getAddreeStrArray(String netaddress, String four) { String[] fourStrArray = StringUtils.split(four.substring(1, four.length() - 1), ","); String address = netaddress.substring(0, netaddress.indexOf("{")); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java index 283466b5be..901cc409d7 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java @@ -20,23 +20,21 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public class Authentication { public boolean authentication(AuthenticationInfo authenticationInfo, - LoginOrRequestAccessControl loginOrRequestAccessControl, AuthenticationResult authenticationResult) { - int code = loginOrRequestAccessControl.getCode(); + AccessControl accessControl, AuthenticationResult authenticationResult) { + int code = accessControl.getCode(); if (!authenticationInfo.getAuthority().get(code)) { authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); return false; } - AccessControl accessControl = authenticationInfo.getAccessControl(); - if (!(accessControl instanceof BorkerAccessControl)) { + if (!(authenticationInfo.getAccessControl() instanceof BorkerAccessControl)) { return true; } BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); - String topicName = loginOrRequestAccessControl.getTopic(); + String topicName = accessControl.getTopic(); if (code == 10 || code == 310 || code == 320) { if (borker.getPermitSendTopic().contains(topicName)) { return true; diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java index 325ffab804..0e8be9f7a6 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java @@ -17,10 +17,8 @@ package org.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; +import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugAuthenticationException; -import org.apache.rocketmq.acl.plug.exception.AclPlugLoginException; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; public class DefaultAclRemotingServerImpl implements AclRemotingServer { @@ -32,16 +30,16 @@ public class DefaultAclRemotingServerImpl implements AclRemotingServer { } @Override - public AuthenticationResult eachCheck(LoginOrRequestAccessControl accessControl) { + public AuthenticationResult eachCheck(AccessControl accessControl) { AuthenticationResult authenticationResult = aclPlugEngine.eachCheckLoginAndAuthentication(accessControl); if (authenticationResult.getException() != null) { throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessControl.toString()), authenticationResult.getException()); } if (authenticationResult.getAccessControl() == null) { - throw new AclPlugLoginException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); + throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); } if (!authenticationResult.isSucceed()) { - throw new AclPlugAuthenticationException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); + throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); } return authenticationResult; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java index 38766a7520..687c4a0125 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java @@ -20,7 +20,6 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.LoginInfo; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public interface AclPlugEngine { @@ -30,5 +29,5 @@ public interface AclPlugEngine { public void deleteLoginInfo(String remoteAddr); - public AuthenticationResult eachCheckLoginAndAuthentication(LoginOrRequestAccessControl accessControl); + public AuthenticationResult eachCheckLoginAndAuthentication(AccessControl accessControl); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index 7346bc9130..a6c73930ae 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -26,8 +26,7 @@ import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; import org.apache.rocketmq.common.constant.LoggerName; @@ -49,9 +48,9 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl accessContralAnalysis.analysisClass(controllerParametersEntity.getAccessContralAnalysisClass()); } - public void setAccessControl(AccessControl accessControl) throws AclPlugAccountAnalysisException { + public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { if (accessControl.getAccount() == null || accessControl.getPassword() == null || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { - throw new AclPlugAccountAnalysisException(String.format("The account password cannot be null and is longer than 6, account is %s password is %s", accessControl.getAccount(), accessControl.getPassword())); + throw new AclPlugRuntimeException(String.format("The account password cannot be null and is longer than 6, account is %s password is %s", accessControl.getAccount(), accessControl.getPassword())); } try { NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); @@ -64,22 +63,22 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl accessControlAddressMap.put(accessControl.getNetaddress(), authenticationInfo); log.info("authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { - throw new AclPlugAccountAnalysisException(accessControl.toString(), e); + throw new AclPlugRuntimeException(accessControl.toString(), e); } } - public void setAccessControlList(List accessControlList) throws AclPlugAccountAnalysisException { + public void setAccessControlList(List accessControlList) throws AclPlugRuntimeException { for (AccessControl accessControl : accessControlList) { setAccessControl(accessControl); } } - public void setNetaddressAccessControl(AccessControl accessControl) throws AclPlugAccountAnalysisException { + public void setNetaddressAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { try { authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategyFactory.getNetaddressStrategy(accessControl)); log.info("default authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { - throw new AclPlugAccountAnalysisException(accessControl.toString(), e); + throw new AclPlugRuntimeException(accessControl.toString(), e); } } @@ -106,7 +105,7 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl } @Override - public AuthenticationResult eachCheckLoginAndAuthentication(LoginOrRequestAccessControl accessControl) { + public AuthenticationResult eachCheckLoginAndAuthentication(AccessControl accessControl) { AuthenticationResult authenticationResult = new AuthenticationResult(); try { AuthenticationInfo authenticationInfo = getAuthenticationInfo(accessControl, authenticationResult); @@ -122,7 +121,7 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { - throw new AclPlugAccountAnalysisException("onlyNetAddress and list can't be all empty"); + throw new AclPlugRuntimeException("onlyNetAddress and list can't be all empty"); } if (transport.getOnlyNetAddress() != null) { @@ -135,6 +134,6 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl } } - protected abstract AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl, + protected abstract AuthenticationInfo getAuthenticationInfo(AccessControl accessControl, AuthenticationResult authenticationResult); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java index b0ad2e0d4d..4ce9f6a427 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java @@ -23,7 +23,6 @@ import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; import org.apache.rocketmq.acl.plug.entity.LoginInfo; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagementAclPlugEngine { @@ -53,7 +52,7 @@ public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagemen loginInfoMap.remove(remoteAddr); } - protected AuthenticationInfo getAuthenticationInfo(LoginOrRequestAccessControl accessControl, + protected AuthenticationInfo getAuthenticationInfo(AccessControl accessControl, AuthenticationResult authenticationResult) { LoginInfo loginInfo = getLoginInfo(accessControl); if (loginInfo != null && loginInfo.getAuthenticationInfo() != null) { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index 1d505eab39..2917e72390 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -21,18 +21,18 @@ import java.io.FileInputStream; import java.io.IOException; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.yaml.snakeyaml.Yaml; public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { public PlainAclPlugEngine( - ControllerParametersEntity controllerParametersEntity) throws AclPlugAccountAnalysisException { + ControllerParametersEntity controllerParametersEntity) throws AclPlugRuntimeException { super(controllerParametersEntity); init(); } - void init() throws AclPlugAccountAnalysisException { + void init() throws AclPlugRuntimeException { String filePath = controllerParametersEntity.getFileHome() + "/conf/transport.yml"; Yaml ymal = new Yaml(); FileInputStream fis = null; @@ -41,18 +41,18 @@ public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { fis = new FileInputStream(new File(filePath)); transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); } catch (Exception e) { - throw new AclPlugAccountAnalysisException("The transport.yml file for Plain mode was not found", e); + throw new AclPlugRuntimeException("The transport.yml file for Plain mode was not found", e); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { - throw new AclPlugAccountAnalysisException("close transport fileInputStream Exception", e); + throw new AclPlugRuntimeException("close transport fileInputStream Exception", e); } } } if (transport == null) { - throw new AclPlugAccountAnalysisException("transport.yml file is no data"); + throw new AclPlugRuntimeException("transport.yml file is no data"); } super.setBorkerAccessControlTransport(transport); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java index acda94774a..cf3a736a7f 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java @@ -26,6 +26,10 @@ public class AccessControl { private String recognition; + private int code; + + private String topic; + public AccessControl() { } @@ -61,10 +65,29 @@ public class AccessControl { this.recognition = recognition; } + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + @Override public String toString() { - return "AccessControl [account=" + account + ", password=" + password + ", netaddress=" + netaddress - + ", recognition=" + recognition + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("AccessControl [account=").append(account).append(", password=").append(password) + .append(", netaddress=").append(netaddress).append(", recognition=").append(recognition) + .append(", code=").append(code).append(", topic=").append(topic).append("]"); + return builder.toString(); } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java deleted file mode 100644 index ca070e26c1..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginOrRequestAccessControl.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; - -public class LoginOrRequestAccessControl extends AccessControl { - - private int code; - - private String topic; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("LoginOrRequestAccessControl [code=").append(code).append(", topic=").append(topic).append("]"); - return builder.toString(); - } - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAccountAnalysisException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAccountAnalysisException.java deleted file mode 100644 index 145557fa5b..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAccountAnalysisException.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; - -public class AclPlugAccountAnalysisException extends AclPlugRuntimeException { - - private static final long serialVersionUID = -7286948517911075176L; - - public AclPlugAccountAnalysisException(String message) { - super(message); - } - - public AclPlugAccountAnalysisException(String message, Throwable cause) { - super(message, cause); - } - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAuthenticationException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAuthenticationException.java deleted file mode 100644 index 613b76e832..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugAuthenticationException.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; - -public class AclPlugAuthenticationException extends AclPlugRuntimeException { - - private static final long serialVersionUID = 6365666045084521516L; - - public AclPlugAuthenticationException(String message) { - super(message); - } - - public AclPlugAuthenticationException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugException.java deleted file mode 100644 index 33ac968969..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugException.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; - -public class AclPlugException extends Exception { - - private static final long serialVersionUID = 6843154847463800519L; - - public AclPlugException(String message) { - super(message); - } - - public AclPlugException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugLoginException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugLoginException.java deleted file mode 100644 index 071d2cccbe..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugLoginException.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; - -public class AclPlugLoginException extends AclPlugRuntimeException { - - private static final long serialVersionUID = 4593661700080106122L; - - public AclPlugLoginException(String message) { - super(message); - } - - public AclPlugLoginException(String message, Throwable cause) { - super(message, cause); - } - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugStartException.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugStartException.java deleted file mode 100644 index eaef556c55..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugStartException.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.exception; - -public class AclPlugStartException extends AclPlugException { - - private static final long serialVersionUID = 5118936374739373693L; - - public AclPlugStartException(String message) { - super(message); - } - - public AclPlugStartException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java deleted file mode 100644 index 0947733e21..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/AbstractNetaddressStrategy.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; - -import org.apache.rocketmq.acl.plug.AclUtils; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; - -public abstract class AbstractNetaddressStrategy implements NetaddressStrategy { - - public void verify(String netaddress, int index) { - if (!AclUtils.isScope(netaddress, index)) { - throw new AclPlugAccountAnalysisException(String.format("netaddress examine scope Exception netaddress is %s", netaddress)); - } - } - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java deleted file mode 100644 index fd49cc862e..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/MultipleNetaddressStrategy.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; - -import java.util.HashSet; -import java.util.Set; -import org.apache.rocketmq.acl.plug.entity.AccessControl; - -public class MultipleNetaddressStrategy extends AbstractNetaddressStrategy { - - private final Set multipleSet = new HashSet<>(); - - public MultipleNetaddressStrategy(String[] strArray) { - for (String netaddress : strArray) { - verify(netaddress, 4); - multipleSet.add(netaddress); - } - } - - @Override - public boolean match(AccessControl accessControl) { - return multipleSet.contains(accessControl.getNetaddress()); - } - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java index 040d2cbfe7..cdb78675e9 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java @@ -16,23 +16,27 @@ */ package org.apache.rocketmq.acl.plug.strategy; +import java.util.HashSet; +import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.AclUtils; import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; public class NetaddressStrategyFactory { + public static final NullNetaddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullNetaddressStrategy(); + public NetaddressStrategy getNetaddressStrategy(AccessControl accessControl) { String netaddress = accessControl.getNetaddress(); if (StringUtils.isBlank(netaddress) || "*".equals(netaddress)) { - return NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY; + return NULL_NET_ADDRESS_STRATEGY; } if (netaddress.endsWith("}")) { String[] strArray = StringUtils.split(netaddress, "."); String four = strArray[3]; if (!four.startsWith("{")) { - throw new AclPlugAccountAnalysisException(String.format("MultipleNetaddressStrategy netaddress examine scope Exception netaddress", netaddress)); + throw new AclPlugRuntimeException(String.format("MultipleNetaddressStrategy netaddress examine scope Exception netaddress", netaddress)); } return new MultipleNetaddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); } else if (AclUtils.isColon(netaddress)) { @@ -43,4 +47,114 @@ public class NetaddressStrategyFactory { return new OneNetaddressStrategy(netaddress); } + + public static class NullNetaddressStrategy implements NetaddressStrategy { + @Override + public boolean match(AccessControl accessControl) { + return true; + } + + } + + public static class MultipleNetaddressStrategy implements NetaddressStrategy { + + private final Set multipleSet = new HashSet<>(); + + public MultipleNetaddressStrategy(String[] strArray) { + for (String netaddress : strArray) { + AclUtils.verify(netaddress, 4); + multipleSet.add(netaddress); + } + } + + @Override + public boolean match(AccessControl accessControl) { + return multipleSet.contains(accessControl.getNetaddress()); + } + + } + + public static class OneNetaddressStrategy implements NetaddressStrategy { + + private String netaddress; + + public OneNetaddressStrategy(String netaddress) { + this.netaddress = netaddress; + AclUtils.verify(netaddress, 4); + } + + @Override + public boolean match(AccessControl accessControl) { + return netaddress.equals(accessControl.getNetaddress()); + } + + } + + public static class RangeNetaddressStrategy implements NetaddressStrategy { + + private String head; + + private int start; + + private int end; + + private int index; + + public RangeNetaddressStrategy(String netaddress) { + String[] strArray = StringUtils.split(netaddress, "."); + if (analysis(strArray, 2) || analysis(strArray, 3)) { + AclUtils.verify(netaddress, index - 1); + StringBuffer sb = new StringBuffer().append(strArray[0].trim()).append(".").append(strArray[1].trim()).append("."); + if (index == 3) { + sb.append(strArray[2].trim()).append("."); + } + this.head = sb.toString(); + } + } + + private boolean analysis(String[] strArray, int index) { + String value = strArray[index].trim(); + this.index = index; + if ("*".equals(value)) { + setValue(0, 255); + } else if (AclUtils.isMinus(value)) { + if (value.indexOf("-") == 0) { + throw new AclPlugRuntimeException(String.format("RangeNetaddressStrategy netaddress examine scope Exception value %s ", value)); + + } + String[] valueArray = StringUtils.split(value, "-"); + this.start = Integer.valueOf(valueArray[0]); + this.end = Integer.valueOf(valueArray[1]); + if (!(AclUtils.isScope(end) && AclUtils.isScope(start) && start <= end)) { + throw new AclPlugRuntimeException(String.format("RangeNetaddressStrategy netaddress examine scope Exception start is %s , end is %s", start, end)); + } + } + return this.end > 0 ? true : false; + } + + private void setValue(int start, int end) { + this.start = start; + this.end = end; + } + + @Override + public boolean match(AccessControl accessControl) { + String netAddress = accessControl.getNetaddress(); + if (netAddress.startsWith(this.head)) { + String value; + if (index == 3) { + value = netAddress.substring(this.head.length()); + } else { + value = netAddress.substring(this.head.length(), netAddress.lastIndexOf('.')); + } + Integer address = Integer.valueOf(value); + if (address >= this.start && address <= this.end) { + return true; + } + } + return false; + } + + } + } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java deleted file mode 100644 index 476eaa152e..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NullNetaddressStrategy.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; - -import org.apache.rocketmq.acl.plug.entity.AccessControl; - -public class NullNetaddressStrategy implements NetaddressStrategy { - - public static final NullNetaddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullNetaddressStrategy(); - - @Override - public boolean match(AccessControl accessControl) { - return true; - } - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java deleted file mode 100644 index 51f803fbb1..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/OneNetaddressStrategy.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; - -import org.apache.rocketmq.acl.plug.entity.AccessControl; - -public class OneNetaddressStrategy extends AbstractNetaddressStrategy { - - private String netaddress; - - public OneNetaddressStrategy(String netaddress) { - this.netaddress = netaddress; - verify(netaddress, 4); - } - - @Override - public boolean match(AccessControl accessControl) { - return netaddress.equals(accessControl.getNetaddress()); - } - -} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java deleted file mode 100644 index 895822b20b..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/RangeNetaddressStrategy.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.strategy; - -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.AclUtils; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; - -public class RangeNetaddressStrategy extends AbstractNetaddressStrategy { - - private String head; - - private int start; - - private int end; - - private int index; - - public RangeNetaddressStrategy(String netaddress) { - String[] strArray = StringUtils.split(netaddress, "."); - if (analysis(strArray, 2) || analysis(strArray, 3)) { - verify(netaddress, index - 1); - StringBuffer sb = new StringBuffer().append(strArray[0].trim()).append(".").append(strArray[1].trim()).append("."); - if (index == 3) { - sb.append(strArray[2].trim()).append("."); - } - this.head = sb.toString(); - } - } - - private boolean analysis(String[] strArray, int index) { - String value = strArray[index].trim(); - this.index = index; - if ("*".equals(value)) { - setValue(0, 255); - } else if (AclUtils.isMinus(value)) { - if (value.indexOf("-") == 0) { - throw new AclPlugAccountAnalysisException(String.format("RangeNetaddressStrategy netaddress examine scope Exception value %s ", value)); - - } - String[] valueArray = StringUtils.split(value, "-"); - this.start = Integer.valueOf(valueArray[0]); - this.end = Integer.valueOf(valueArray[1]); - if (!(AclUtils.isScope(end) && AclUtils.isScope(start) && start <= end)) { - throw new AclPlugAccountAnalysisException(String.format("RangeNetaddressStrategy netaddress examine scope Exception start is %s , end is %s", start, end)); - } - } - return this.end > 0 ? true : false; - } - - private void setValue(int start, int end) { - this.start = start; - this.end = end; - } - - @Override - public boolean match(AccessControl accessControl) { - String netAddress = accessControl.getNetaddress(); - if (netAddress.startsWith(this.head)) { - String value; - if (index == 3) { - value = netAddress.substring(this.head.length()); - } else { - value = netAddress.substring(this.head.length(), netAddress.lastIndexOf('.')); - } - Integer address = Integer.valueOf(value); - if (address >= this.start && address <= this.end) { - return true; - } - } - return false; - } - -} diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java index c269cc4d97..b7896b13df 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java @@ -21,7 +21,7 @@ import java.util.Map; import java.util.Map.Entry; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.common.protocol.RequestCode; import org.junit.Assert; import org.junit.Before; @@ -54,7 +54,7 @@ public class AccessContralAnalysisTest { Assert.assertEquals(num, 1); } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void analysisExceptionTest() { AccessControl accessControl = new AccessControl(); accessContralAnalysis.analysis(accessControl); diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java index 18669fe9c7..6e5d1444db 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java @@ -19,11 +19,11 @@ package org.apache.rocketmq.acl.plug; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; -import org.apache.rocketmq.acl.plug.strategy.OneNetaddressStrategy; +import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; import org.apache.rocketmq.common.protocol.RequestCode; import org.junit.Assert; import org.junit.Before; @@ -38,11 +38,10 @@ public class AuthenticationTest { BorkerAccessControl borkerAccessControl; AuthenticationResult authenticationResult = new AuthenticationResult(); - LoginOrRequestAccessControl loginOrRequestAccessControl = new LoginOrRequestAccessControl(); + AccessControl accessControl = new AccessControl(); @Before public void init() { - OneNetaddressStrategy netaddressStrategy = new OneNetaddressStrategy("127.0.0.1"); borkerAccessControl = new BorkerAccessControl(); //321 borkerAccessControl.setQueryConsumeQueue(false); @@ -67,75 +66,75 @@ public class AuthenticationTest { accessContralAnalysis.analysisClass(RequestCode.class); Map map = accessContralAnalysis.analysis(borkerAccessControl); - authenticationInfo = new AuthenticationInfo(map, borkerAccessControl, netaddressStrategy); + authenticationInfo = new AuthenticationInfo(map, borkerAccessControl, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); } @Test public void authenticationTest() { - loginOrRequestAccessControl.setCode(317); + accessControl.setCode(317); - boolean isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + boolean isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); - loginOrRequestAccessControl.setCode(321); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setCode(321); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); - loginOrRequestAccessControl.setCode(10); - loginOrRequestAccessControl.setTopic("permitSendTopic"); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setCode(10); + accessControl.setTopic("permitSendTopic"); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); - loginOrRequestAccessControl.setCode(310); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setCode(310); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); - loginOrRequestAccessControl.setCode(320); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setCode(320); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); - loginOrRequestAccessControl.setTopic("noPermitSendTopic"); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setTopic("noPermitSendTopic"); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); - loginOrRequestAccessControl.setTopic("nopermitSendTopic"); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setTopic("nopermitSendTopic"); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); - loginOrRequestAccessControl.setCode(11); - loginOrRequestAccessControl.setTopic("permitPullTopic"); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setCode(11); + accessControl.setTopic("permitPullTopic"); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); - loginOrRequestAccessControl.setTopic("noPermitPullTopic"); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setTopic("noPermitPullTopic"); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); - loginOrRequestAccessControl.setTopic("nopermitPullTopic"); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setTopic("nopermitPullTopic"); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); } @Test public void isEmptyTest() { - loginOrRequestAccessControl.setCode(10); - loginOrRequestAccessControl.setTopic("absentTopic"); - boolean isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setCode(10); + accessControl.setTopic("absentTopic"); + boolean isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); Set permitSendTopic = new HashSet<>(); borkerAccessControl.setPermitSendTopic(permitSendTopic); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); - loginOrRequestAccessControl.setCode(11); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + accessControl.setCode(11); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); borkerAccessControl.setPermitPullTopic(permitSendTopic); - isReturn = authentication.authentication(authenticationInfo, loginOrRequestAccessControl, authenticationResult); + isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 982bb527e7..45755a0e11 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -30,8 +30,7 @@ import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; import org.apache.rocketmq.acl.plug.entity.LoginInfo; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.common.MixAll; import org.junit.Assert; import org.junit.Before; @@ -83,31 +82,31 @@ public class PlainAclPlugEngineTest { } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void accountNullTest() { accessControl.setAccount(null); plainAclPlugEngine.setAccessControl(accessControl); } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void accountThanTest() { accessControl.setAccount("123"); plainAclPlugEngine.setAccessControl(accessControl); } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void passWordtNullTest() { accessControl.setAccount(null); plainAclPlugEngine.setAccessControl(accessControl); } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void passWordThanTest() { accessControl.setAccount("123"); plainAclPlugEngine.setAccessControl(accessControl); } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void testPlainAclPlugEngineInit() { ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); new PlainAclPlugEngine(controllerParametersEntity); @@ -186,7 +185,7 @@ public class PlainAclPlugEngineTest { } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void borkerAccessControlTransportTestNull() { plainAclPlugEngine.setBorkerAccessControlTransport(new BorkerAccessControlTransport()); } @@ -241,18 +240,18 @@ public class PlainAclPlugEngineTest { @Test public void getAuthenticationInfo() { - LoginOrRequestAccessControl loginOrRequestAccessControl = new LoginOrRequestAccessControl(); - loginOrRequestAccessControl.setAccount("rokcetmq"); - loginOrRequestAccessControl.setPassword("aliyun11"); - loginOrRequestAccessControl.setNetaddress("127.0.0.1"); - loginOrRequestAccessControl.setRecognition("127.0.0.1:1"); + AccessControl AccessControl = new AccessControl(); + AccessControl.setAccount("rokcetmq"); + AccessControl.setPassword("aliyun11"); + AccessControl.setNetaddress("127.0.0.1"); + AccessControl.setRecognition("127.0.0.1:1"); AuthenticationResult authenticationResult = new AuthenticationResult(); - plainAclPlugEngine.getAuthenticationInfo(loginOrRequestAccessControl, authenticationResult); + plainAclPlugEngine.getAuthenticationInfo(AccessControl, authenticationResult); Assert.assertEquals("Login information does not exist, Please check login, password, IP", authenticationResult.getResultString()); plainAclPlugEngine.setAccessControl(accessControl); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAuthenticationInfo(loginOrRequestAccessControl, authenticationResult); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAuthenticationInfo(AccessControl, authenticationResult); Assert.assertNotNull(authenticationInfo); } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java index f670b31ec4..3f21b67887 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java @@ -17,7 +17,7 @@ package org.apache.rocketmq.acl.plug.strategy; import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugAccountAnalysisException; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.junit.Assert; import org.junit.Test; @@ -29,53 +29,57 @@ public class NetaddressStrategyTest { public void NetaddressStrategyFactoryTest() { AccessControl accessControl = new AccessControl(); NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Assert.assertEquals(netaddressStrategy, NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY); + Assert.assertEquals(netaddressStrategy, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); accessControl.setNetaddress("*"); netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Assert.assertEquals(netaddressStrategy, NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY); + Assert.assertEquals(netaddressStrategy, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); accessControl.setNetaddress("127.0.0.1"); netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Assert.assertEquals(netaddressStrategy.getClass(), OneNetaddressStrategy.class); + Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.OneNetaddressStrategy.class); accessControl.setNetaddress("127.0.0.1,127.0.0.2,127.0.0.3"); netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Assert.assertEquals(netaddressStrategy.getClass(), MultipleNetaddressStrategy.class); + Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.MultipleNetaddressStrategy.class); accessControl.setNetaddress("127.0.0.{1,2,3}"); netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Assert.assertEquals(netaddressStrategy.getClass(), MultipleNetaddressStrategy.class); + Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.MultipleNetaddressStrategy.class); accessControl.setNetaddress("127.0.0.1-200"); netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Assert.assertEquals(netaddressStrategy.getClass(), RangeNetaddressStrategy.class); + Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); accessControl.setNetaddress("127.0.0.*"); netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Assert.assertEquals(netaddressStrategy.getClass(), RangeNetaddressStrategy.class); + Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); accessControl.setNetaddress("127.0.1-20.*"); netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Assert.assertEquals(netaddressStrategy.getClass(), RangeNetaddressStrategy.class); + Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void verifyTest() { - new OneNetaddressStrategy("127.0.0.1"); - - new OneNetaddressStrategy("256.0.0.1"); + AccessControl accessControl = new AccessControl(); + accessControl.setNetaddress("127.0.0.1"); + netaddressStrategyFactory.getNetaddressStrategy(accessControl); + accessControl.setNetaddress("256.0.0.1"); + netaddressStrategyFactory.getNetaddressStrategy(accessControl); } @Test public void nullNetaddressStrategyTest() { - boolean isMatch = NullNetaddressStrategy.NULL_NET_ADDRESS_STRATEGY.match(new AccessControl()); + boolean isMatch = NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY.match(new AccessControl()); Assert.assertTrue(isMatch); } public void oneNetaddressStrategyTest() { - OneNetaddressStrategy netaddressStrategy = new OneNetaddressStrategy("127.0.0.1"); AccessControl accessControl = new AccessControl(); + accessControl.setNetaddress("127.0.0.1"); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + accessControl.setNetaddress(""); boolean match = netaddressStrategy.match(accessControl); Assert.assertFalse(match); @@ -101,7 +105,7 @@ public class NetaddressStrategyTest { } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void multipleNetaddressStrategyExceptionTest() { AccessControl accessControl = new AccessControl(); accessControl.setNetaddress("127.0.0.1,2,3}"); @@ -174,17 +178,17 @@ public class NetaddressStrategyTest { } } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void rangeNetaddressStrategyExceptionStartGreaterEndTest() { rangeNetaddressStrategyExceptionTest("127.0.0.2-1"); } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void rangeNetaddressStrategyExceptionScopeTest() { rangeNetaddressStrategyExceptionTest("127.0.0.-1-200"); } - @Test(expected = AclPlugAccountAnalysisException.class) + @Test(expected = AclPlugRuntimeException.class) public void rangeNetaddressStrategyExceptionScopeTwoTest() { rangeNetaddressStrategyExceptionTest("127.0.0.0-256"); } diff --git a/acl-plug/src/test/resources/conf/transport.yml b/acl-plug/src/test/resources/conf/transport.yml index 25d4902a67..99d26fd8eb 100644 --- a/acl-plug/src/test/resources/conf/transport.yml +++ b/acl-plug/src/test/resources/conf/transport.yml @@ -16,19 +16,19 @@ onlyNetAddress: netaddress: 10.10.103.* noPermitPullTopic: - - broker-a + - broker-a list: - - account: RocketMQ - password: 1234567 - netaddress: 192.0.0.* - permitSendTopic: - - test1 - - test2 - - account: RocketMQ - password: 1234567 - netaddress: 192.0.2.1 - permitSendTopic: - - test3 - - test4 +- account: RocketMQ + password: 1234567 + netaddress: 192.0.0.* + permitSendTopic: + - test1 + - test2 +- account: RocketMQ + password: 1234567 + netaddress: 192.0.2.1 + permitSendTopic: + - test3 + - test4 \ No newline at end of file diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index 4f3b736f0a..5c8fe2369e 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -32,11 +32,12 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; + import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.AclPlugController; import org.apache.rocketmq.acl.plug.AclRemotingServer; +import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; -import org.apache.rocketmq.acl.plug.entity.LoginOrRequestAccessControl; import org.apache.rocketmq.broker.client.ClientHousekeepingService; import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; import org.apache.rocketmq.broker.client.ConsumerManager; @@ -515,7 +516,7 @@ public class BrokerController { @Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) { HashMap extFields = request.getExtFields(); - LoginOrRequestAccessControl accessControl = new LoginOrRequestAccessControl(); + AccessControl accessControl = new AccessControl(); accessControl.setCode(request.getCode()); accessControl.setRecognition(remoteAddr); if (extFields != null) { diff --git a/pom.xml b/pom.xml index ed2c3d90e6..1c2c714653 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,8 @@ limitations under the License. --> - + org.apache @@ -158,7 +159,7 @@ - + true @@ -215,9 +216,9 @@ generate-effective-dependencies-pom generate-resources - + ${project.build.directory}/effective-pom/effective-dependencies.xml From f2dcde94954a39454b219baaed6b7f963772bc4f Mon Sep 17 00:00:00 2001 From: hujie Date: Wed, 10 Oct 2018 22:47:29 +0800 Subject: [PATCH 10/96] clean --- .../java/org/apache/rocketmq/acl/plug/AclRemotingServer.java | 2 +- .../apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java | 2 +- .../main/java/org/apache/rocketmq/broker/BrokerController.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java index 30df38140b..ded9f80c1e 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java @@ -21,6 +21,6 @@ import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; public interface AclRemotingServer { - public AuthenticationResult eachCheck(AccessControl accessControl); + public AuthenticationResult check(AccessControl accessControl); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java index 0e8be9f7a6..4ea14b4880 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java @@ -30,7 +30,7 @@ public class DefaultAclRemotingServerImpl implements AclRemotingServer { } @Override - public AuthenticationResult eachCheck(AccessControl accessControl) { + public AuthenticationResult check(AccessControl accessControl) { AuthenticationResult authenticationResult = aclPlugEngine.eachCheckLoginAndAuthentication(accessControl); if (authenticationResult.getException() != null) { throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessControl.toString()), authenticationResult.getException()); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index 5c8fe2369e..e7e8097f2d 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -525,7 +525,7 @@ public class BrokerController { accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); accessControl.setTopic(extFields.get("topic")); } - aclRemotingServe.eachCheck(accessControl); + aclRemotingServe.check(accessControl); } @Override From da09320d1496259e8e8a706108b9eb22accc4f35 Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 18:01:58 +0800 Subject: [PATCH 11/96] clean Attention: delete line 37 of the MixAllTest.java --- .../rocketmq/acl/plug/AclPlugController.java | 20 +++++++++---------- ...ingServer.java => AclRemotingService.java} | 2 +- ...ava => DefaultAclRemotingServiceImpl.java} | 4 ++-- ...enticationInfoManagementAclPlugEngine.java | 10 +++++----- .../plug/engine/LoginInfoAclPlugEngine.java | 6 +++--- .../acl/plug/engine/PlainAclPlugEngine.java | 8 ++++---- ...sEntity.java => ControllerParameters.java} | 2 +- .../plug/engine/PlainAclPlugEngineTest.java | 6 +++--- .../rocketmq/broker/BrokerController.java | 15 +++++++------- .../apache/rocketmq/common/MixAllTest.java | 5 ++--- 10 files changed, 38 insertions(+), 40 deletions(-) rename acl-plug/src/main/java/org/apache/rocketmq/acl/plug/{AclRemotingServer.java => AclRemotingService.java} (96%) rename acl-plug/src/main/java/org/apache/rocketmq/acl/plug/{DefaultAclRemotingServerImpl.java => DefaultAclRemotingServiceImpl.java} (93%) rename acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/{ControllerParametersEntity.java => ControllerParameters.java} (97%) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java index c32ec73331..c61e122b1e 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java @@ -18,32 +18,32 @@ package org.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; -import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; public class AclPlugController { - private ControllerParametersEntity controllerParametersEntity; + private ControllerParameters controllerParameters; private AclPlugEngine aclPlugEngine; - private AclRemotingServer aclRemotingServer; + private AclRemotingService aclRemotingService; private boolean startSucceed = false; - public AclPlugController(ControllerParametersEntity controllerParametersEntity) throws AclPlugRuntimeException { + public AclPlugController(ControllerParameters controllerParameters) throws AclPlugRuntimeException { try { - this.controllerParametersEntity = controllerParametersEntity; - aclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); - aclRemotingServer = new DefaultAclRemotingServerImpl(aclPlugEngine); + this.controllerParameters = controllerParameters; + aclPlugEngine = new PlainAclPlugEngine(controllerParameters); + aclRemotingService = new DefaultAclRemotingServiceImpl(aclPlugEngine); this.startSucceed = true; } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("Start the abnormal , Launch parameters is %s", this.controllerParametersEntity.toString()), e); + throw new AclPlugRuntimeException(String.format("Start the abnormal , Launch parameters is %s", this.controllerParameters.toString()), e); } } - public AclRemotingServer getAclRemotingServer() { - return this.aclRemotingServer; + public AclRemotingService getAclRemotingService() { + return this.aclRemotingService; } public void doChannelCloseEvent(String remoteAddr) { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java similarity index 96% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java rename to acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java index ded9f80c1e..c651a5d99f 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingServer.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java @@ -19,7 +19,7 @@ package org.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -public interface AclRemotingServer { +public interface AclRemotingService { public AuthenticationResult check(AccessControl accessControl); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java similarity index 93% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java rename to acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java index 4ea14b4880..240c9a24e8 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServerImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java @@ -21,11 +21,11 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; -public class DefaultAclRemotingServerImpl implements AclRemotingServer { +public class DefaultAclRemotingServiceImpl implements AclRemotingService { private AclPlugEngine aclPlugEngine; - public DefaultAclRemotingServerImpl(AclPlugEngine aclPlugEngine) { + public DefaultAclRemotingServiceImpl(AclPlugEngine aclPlugEngine) { this.aclPlugEngine = aclPlugEngine; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index a6c73930ae..44b5245ae5 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -25,7 +25,7 @@ import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; -import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; @@ -36,16 +36,16 @@ import org.apache.rocketmq.logging.InternalLoggerFactory; public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPlugEngine { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); - ControllerParametersEntity controllerParametersEntity; + ControllerParameters controllerParameters; private Map> accessControlMap = new HashMap<>(); private AuthenticationInfo authenticationInfo; private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); private Authentication authentication = new Authentication(); - public AuthenticationInfoManagementAclPlugEngine(ControllerParametersEntity controllerParametersEntity) { - this.controllerParametersEntity = controllerParametersEntity; - accessContralAnalysis.analysisClass(controllerParametersEntity.getAccessContralAnalysisClass()); + public AuthenticationInfoManagementAclPlugEngine(ControllerParameters controllerParameters) { + this.controllerParameters = controllerParameters; + accessContralAnalysis.analysisClass(controllerParameters.getAccessContralAnalysisClass()); } public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java index 4ce9f6a427..e8dc59c422 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java @@ -21,15 +21,15 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.entity.LoginInfo; public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagementAclPlugEngine { private Map loginInfoMap = new ConcurrentHashMap<>(); - public LoginInfoAclPlugEngine(ControllerParametersEntity controllerParametersEntity) { - super(controllerParametersEntity); + public LoginInfoAclPlugEngine(ControllerParameters controllerParameters) { + super(controllerParameters); } public LoginInfo getLoginInfo(AccessControl accessControl) { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index 2917e72390..01fdba8464 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -20,20 +20,20 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; -import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.yaml.snakeyaml.Yaml; public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { public PlainAclPlugEngine( - ControllerParametersEntity controllerParametersEntity) throws AclPlugRuntimeException { - super(controllerParametersEntity); + ControllerParameters controllerParameters) throws AclPlugRuntimeException { + super(controllerParameters); init(); } void init() throws AclPlugRuntimeException { - String filePath = controllerParametersEntity.getFileHome() + "/conf/transport.yml"; + String filePath = controllerParameters.getFileHome() + "/conf/transport.yml"; Yaml ymal = new Yaml(); FileInputStream fis = null; BorkerAccessControlTransport transport; diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java similarity index 97% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java rename to acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java index fe781e0e2e..708bcbeb91 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParametersEntity.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java @@ -18,7 +18,7 @@ package org.apache.rocketmq.acl.plug.entity; import org.apache.rocketmq.common.protocol.RequestCode; -public class ControllerParametersEntity { +public class ControllerParameters { private String fileHome; diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 45755a0e11..618c87e49d 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -28,7 +28,7 @@ import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; -import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.entity.LoginInfo; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.common.MixAll; @@ -61,7 +61,7 @@ public class PlainAclPlugEngineTest { FileInputStream fis = new FileInputStream(new File(filePath)); transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); - ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); + ControllerParameters controllerParametersEntity = new ControllerParameters(); controllerParametersEntity.setFileHome(home); plainAclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); @@ -108,7 +108,7 @@ public class PlainAclPlugEngineTest { @Test(expected = AclPlugRuntimeException.class) public void testPlainAclPlugEngineInit() { - ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); + ControllerParameters controllerParametersEntity = new ControllerParameters(); new PlainAclPlugEngine(controllerParametersEntity); } diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index e7e8097f2d..c30d1f33e1 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -32,12 +32,11 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; - import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.AclPlugController; -import org.apache.rocketmq.acl.plug.AclRemotingServer; +import org.apache.rocketmq.acl.plug.AclRemotingService; import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.ControllerParametersEntity; +import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.broker.client.ClientHousekeepingService; import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; import org.apache.rocketmq.broker.client.ConsumerManager; @@ -503,14 +502,14 @@ public class BrokerController { log.info("Default does not start acl plug"); return; } - ControllerParametersEntity controllerParametersEntity = new ControllerParametersEntity(); - controllerParametersEntity.setFileHome(brokerConfig.getRocketmqHome()); - aclPlugController = new AclPlugController(controllerParametersEntity); + ControllerParameters controllerParameters = new ControllerParameters(); + controllerParameters.setFileHome(brokerConfig.getRocketmqHome()); + aclPlugController = new AclPlugController(controllerParameters); if (!aclPlugController.isStartSucceed()) { log.error("start acl plug failure"); return; } - final AclRemotingServer aclRemotingServe = aclPlugController.getAclRemotingServer(); + final AclRemotingService aclRemotingService = aclPlugController.getAclRemotingService(); this.registerServerRPCHook(new RPCHook() { @Override @@ -525,7 +524,7 @@ public class BrokerController { accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); accessControl.setTopic(extFields.get("topic")); } - aclRemotingServe.check(accessControl); + aclRemotingService.check(accessControl); } @Override diff --git a/common/src/test/java/org/apache/rocketmq/common/MixAllTest.java b/common/src/test/java/org/apache/rocketmq/common/MixAllTest.java index 3f0487202f..9110517fa5 100644 --- a/common/src/test/java/org/apache/rocketmq/common/MixAllTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/MixAllTest.java @@ -17,14 +17,13 @@ package org.apache.rocketmq.common; -import org.junit.Test; - import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.InetAddress; import java.util.List; import java.util.concurrent.atomic.AtomicLong; +import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -34,7 +33,7 @@ public class MixAllTest { List localInetAddress = MixAll.getLocalInetAddress(); String local = InetAddress.getLocalHost().getHostAddress(); assertThat(localInetAddress).contains("127.0.0.1"); - assertThat(localInetAddress).contains(local); + } @Test From 3aa43594b695dc61261d6aec147a9cfcbf8542d1 Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 18:53:40 +0800 Subject: [PATCH 12/96] CI No environment --- .../plug/engine/PlainAclPlugEngineTest.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 618c87e49d..bf3ec8da58 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -18,11 +18,14 @@ package org.apache.rocketmq.acl.plug.engine; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; + import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; @@ -54,11 +57,20 @@ public class PlainAclPlugEngineTest { Map loginInfoMap; @Before - public void init() throws FileNotFoundException, NoSuchFieldException, SecurityException { + public void init() throws NoSuchFieldException, SecurityException, IOException { + Yaml ymal = new Yaml(); String home = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - Yaml ymal = new Yaml(); - String filePath = home + "/conf/transport.yml"; - FileInputStream fis = new FileInputStream(new File(filePath)); + InputStream fis=null; + if(home == null){ + URL url = PlainAclPlugEngineTest.class.getResource("/conf/transport.yml"); + fis = url.openStream(); + url = PlainAclPlugEngineTest.class.getResource("/"); + home = url.toString(); + home = home.substring(0, home.length()-1).replace("file:/", ""); + }else { + String filePath = home + "/conf/transport.yml"; + fis = new FileInputStream(new File(filePath)); + } transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); ControllerParameters controllerParametersEntity = new ControllerParameters(); From a3b94804d4d328847ea14d66de548df2693e8d2e Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 19:07:47 +0800 Subject: [PATCH 13/96] CI No environment --- .../acl/plug/engine/PlainAclPlugEngineTest.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index bf3ec8da58..f3f25f804e 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -63,10 +63,18 @@ public class PlainAclPlugEngineTest { InputStream fis=null; if(home == null){ URL url = PlainAclPlugEngineTest.class.getResource("/conf/transport.yml"); - fis = url.openStream(); - url = PlainAclPlugEngineTest.class.getResource("/"); - home = url.toString(); - home = home.substring(0, home.length()-1).replace("file:/", ""); + if(url == null) { + url = PlainAclPlugEngineTest.class.getResource("/"); + home = url.toString(); + home = home.substring(0, home.length()-1).replace("file:/", "").replace("target/test-classes/", ""); + home = home+"resources/conf/transport.yml"; + }else { + fis = url.openStream(); + url = PlainAclPlugEngineTest.class.getResource("/"); + home = url.toString(); + home = home.substring(0, home.length()-1).replace("file:/", ""); + } + }else { String filePath = home + "/conf/transport.yml"; fis = new FileInputStream(new File(filePath)); From 81560c15248e7e2cd9322d8596596fd968ff6e8b Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 19:12:07 +0800 Subject: [PATCH 14/96] CI No environment --- .../rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index f3f25f804e..d3fae406fa 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -67,7 +67,8 @@ public class PlainAclPlugEngineTest { url = PlainAclPlugEngineTest.class.getResource("/"); home = url.toString(); home = home.substring(0, home.length()-1).replace("file:/", "").replace("target/test-classes/", ""); - home = home+"resources/conf/transport.yml"; + String filePath = home+"resources/conf/transport.yml"; + fis = new FileInputStream(new File(filePath)); }else { fis = url.openStream(); url = PlainAclPlugEngineTest.class.getResource("/"); From d360f8bb9a294739d186e05f20f009bda0329f8b Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 19:19:14 +0800 Subject: [PATCH 15/96] CI No environment 1 --- .../apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index d3fae406fa..5831c43c27 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -67,6 +67,7 @@ public class PlainAclPlugEngineTest { url = PlainAclPlugEngineTest.class.getResource("/"); home = url.toString(); home = home.substring(0, home.length()-1).replace("file:/", "").replace("target/test-classes/", ""); + home = home+"resources"; String filePath = home+"resources/conf/transport.yml"; fis = new FileInputStream(new File(filePath)); }else { From b5cf8bcb4e4fdeadc0e3b11c561f66930d2929ec Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 19:30:38 +0800 Subject: [PATCH 16/96] CI No environment 2 --- .../rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 5831c43c27..bc81dad6b3 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -66,9 +66,9 @@ public class PlainAclPlugEngineTest { if(url == null) { url = PlainAclPlugEngineTest.class.getResource("/"); home = url.toString(); - home = home.substring(0, home.length()-1).replace("file:/", "").replace("target/test-classes/", ""); - home = home+"resources"; - String filePath = home+"resources/conf/transport.yml"; + home = home.substring(0, home.length()-1).replace("file:/", "").replace("target/test-classes", ""); + home = home+"src/test/resources"; + String filePath = home+"/conf/transport.yml"; fis = new FileInputStream(new File(filePath)); }else { fis = url.openStream(); From eebb2991da94cbb1699b075f92196a75eaf21646 Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 19:42:00 +0800 Subject: [PATCH 17/96] CI No environment 3 --- .../apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java | 2 +- .../rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index 01fdba8464..5237d66508 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -41,7 +41,7 @@ public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { fis = new FileInputStream(new File(filePath)); transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); } catch (Exception e) { - throw new AclPlugRuntimeException("The transport.yml file for Plain mode was not found", e); + throw new AclPlugRuntimeException(String.format("The transport.yml file for Plain mode was not found , paths %s" , filePath), e); } finally { if (fis != null) { try { diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index bc81dad6b3..397ab1ecdb 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -61,9 +61,9 @@ public class PlainAclPlugEngineTest { Yaml ymal = new Yaml(); String home = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); InputStream fis=null; - if(home == null){ + if(home != null){ URL url = PlainAclPlugEngineTest.class.getResource("/conf/transport.yml"); - if(url == null) { + if(url != null) { url = PlainAclPlugEngineTest.class.getResource("/"); home = url.toString(); home = home.substring(0, home.length()-1).replace("file:/", "").replace("target/test-classes", ""); From bd6f34df887f1e6d8d458083bdaf598114f9eb36 Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 19:45:50 +0800 Subject: [PATCH 18/96] CI No environment 3 --- .../rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 397ab1ecdb..bc81dad6b3 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -61,9 +61,9 @@ public class PlainAclPlugEngineTest { Yaml ymal = new Yaml(); String home = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); InputStream fis=null; - if(home != null){ + if(home == null){ URL url = PlainAclPlugEngineTest.class.getResource("/conf/transport.yml"); - if(url != null) { + if(url == null) { url = PlainAclPlugEngineTest.class.getResource("/"); home = url.toString(); home = home.substring(0, home.length()-1).replace("file:/", "").replace("target/test-classes", ""); From f691013f577e92378606aab0da3ea65ad01d8d2f Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 19:51:55 +0800 Subject: [PATCH 19/96] CI No environment 4 --- .../plug/engine/PlainAclPlugEngineTest.java | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index bc81dad6b3..214f6f0efc 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -25,7 +25,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; - import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; @@ -58,28 +57,19 @@ public class PlainAclPlugEngineTest { @Before public void init() throws NoSuchFieldException, SecurityException, IOException { - Yaml ymal = new Yaml(); + Yaml ymal = new Yaml(); String home = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - InputStream fis=null; - if(home == null){ - URL url = PlainAclPlugEngineTest.class.getResource("/conf/transport.yml"); - if(url == null) { - url = PlainAclPlugEngineTest.class.getResource("/"); - home = url.toString(); - home = home.substring(0, home.length()-1).replace("file:/", "").replace("target/test-classes", ""); - home = home+"src/test/resources"; - String filePath = home+"/conf/transport.yml"; - fis = new FileInputStream(new File(filePath)); - }else { - fis = url.openStream(); - url = PlainAclPlugEngineTest.class.getResource("/"); - home = url.toString(); - home = home.substring(0, home.length()-1).replace("file:/", ""); - } - - }else { - String filePath = home + "/conf/transport.yml"; - fis = new FileInputStream(new File(filePath)); + InputStream fis = null; + if (home == null) { + URL url = PlainAclPlugEngineTest.class.getResource("/"); + home = url.toString(); + home = home.substring(0, home.length() - 1).replace("file:/", "").replace("target/test-classes", ""); + home = home + "src/test/resources"; + String filePath = home + "/conf/transport.yml"; + fis = new FileInputStream(new File(filePath)); + } else { + String filePath = home + "/conf/transport.yml"; + fis = new FileInputStream(new File(filePath)); } transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); From 45343af2ad074dde25c14a83a1ee96472aa91178 Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 11 Oct 2018 20:01:32 +0800 Subject: [PATCH 20/96] CI No environment 5 --- .../rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 214f6f0efc..9bdde159e3 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -20,7 +20,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -61,10 +60,7 @@ public class PlainAclPlugEngineTest { String home = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); InputStream fis = null; if (home == null) { - URL url = PlainAclPlugEngineTest.class.getResource("/"); - home = url.toString(); - home = home.substring(0, home.length() - 1).replace("file:/", "").replace("target/test-classes", ""); - home = home + "src/test/resources"; + home = "/home/travis/build/githublaohu/rocketmq/acl-plug/src/test/resources"; String filePath = home + "/conf/transport.yml"; fis = new FileInputStream(new File(filePath)); } else { From eeab571a086527d2d7fba60e0c20a75b6c21f95e Mon Sep 17 00:00:00 2001 From: hujie Date: Fri, 12 Oct 2018 10:30:38 +0800 Subject: [PATCH 21/96] CI no environment 6 --- .../acl/plug/DefaultAclRemotingServiceImpl.java | 5 +---- .../acl/plug/engine/PlainAclPlugEngine.java | 2 +- .../acl/plug/engine/PlainAclPlugEngineTest.java | 17 +++++++++++------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java index 240c9a24e8..b42205abcf 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java @@ -35,10 +35,7 @@ public class DefaultAclRemotingServiceImpl implements AclRemotingService { if (authenticationResult.getException() != null) { throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessControl.toString()), authenticationResult.getException()); } - if (authenticationResult.getAccessControl() == null) { - throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); - } - if (!authenticationResult.isSucceed()) { + if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); } return authenticationResult; diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index 5237d66508..8cc7b3662d 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -41,7 +41,7 @@ public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { fis = new FileInputStream(new File(filePath)); transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("The transport.yml file for Plain mode was not found , paths %s" , filePath), e); + throw new AclPlugRuntimeException(String.format("The transport.yml file for Plain mode was not found , paths %s", filePath), e); } finally { if (fis != null) { try { diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 9bdde159e3..034d686bbb 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -60,13 +61,17 @@ public class PlainAclPlugEngineTest { String home = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); InputStream fis = null; if (home == null) { - home = "/home/travis/build/githublaohu/rocketmq/acl-plug/src/test/resources"; - String filePath = home + "/conf/transport.yml"; - fis = new FileInputStream(new File(filePath)); - } else { - String filePath = home + "/conf/transport.yml"; - fis = new FileInputStream(new File(filePath)); + URL url = PlainAclPlugEngineTest.class.getResource("/"); + home = url.toString(); + home = home.substring(0, home.length() - 1).replace("file:/", "").replace("target/test-classes", ""); + home = home + "src/test/resources"; + if (!new File(home + "/conf/transport.yml").exists()) { + home = "/home/travis/build/githublaohu/rocketmq/acl-plug/src/test/resources"; + } } + String filePath = home + "/conf/transport.yml"; + fis = new FileInputStream(new File(filePath)); + transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); ControllerParameters controllerParametersEntity = new ControllerParameters(); From e2c3eaa873a782f1a5b417dd5421f17e4b794813 Mon Sep 17 00:00:00 2001 From: hujie Date: Sat, 13 Oct 2018 18:20:24 +0800 Subject: [PATCH 22/96] CI no environment --- .../apache/rocketmq/acl/plug/AclPlugController.java | 1 + .../apache/rocketmq/acl/plug/engine/AclPlugEngine.java | 2 ++ .../rocketmq/acl/plug/engine/PlainAclPlugEngine.java | 3 +-- .../acl/plug/engine/PlainAclPlugEngineTest.java | 10 +++++++--- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java index c61e122b1e..1ec1f1e998 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java @@ -35,6 +35,7 @@ public class AclPlugController { try { this.controllerParameters = controllerParameters; aclPlugEngine = new PlainAclPlugEngine(controllerParameters); + aclPlugEngine.initialize(); aclRemotingService = new DefaultAclRemotingServiceImpl(aclPlugEngine); this.startSucceed = true; } catch (Exception e) { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java index 687c4a0125..badae946c1 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java @@ -30,4 +30,6 @@ public interface AclPlugEngine { public void deleteLoginInfo(String remoteAddr); public AuthenticationResult eachCheckLoginAndAuthentication(AccessControl accessControl); + + public void initialize(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index 8cc7b3662d..d1a7d9529b 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -29,10 +29,9 @@ public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { public PlainAclPlugEngine( ControllerParameters controllerParameters) throws AclPlugRuntimeException { super(controllerParameters); - init(); } - void init() throws AclPlugRuntimeException { + public void initialize() throws AclPlugRuntimeException { String filePath = controllerParameters.getFileHome() + "/conf/transport.yml"; Yaml ymal = new Yaml(); FileInputStream fis = null; diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 034d686bbb..c7e5979ce5 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -75,9 +75,13 @@ public class PlainAclPlugEngineTest { transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); ControllerParameters controllerParametersEntity = new ControllerParameters(); - controllerParametersEntity.setFileHome(home); - plainAclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); + controllerParametersEntity.setFileHome(null); + try { + plainAclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); + plainAclPlugEngine.initialize(); + } catch (Exception e) { + } accessControl = new BorkerAccessControl(); accessControl.setAccount("rokcetmq"); accessControl.setPassword("aliyun11"); @@ -122,7 +126,7 @@ public class PlainAclPlugEngineTest { @Test(expected = AclPlugRuntimeException.class) public void testPlainAclPlugEngineInit() { ControllerParameters controllerParametersEntity = new ControllerParameters(); - new PlainAclPlugEngine(controllerParametersEntity); + new PlainAclPlugEngine(controllerParametersEntity).initialize(); } From dba3bad9283c0967bf681f782f416cc3592ca8c3 Mon Sep 17 00:00:00 2001 From: hujie Date: Sat, 13 Oct 2018 21:56:03 +0800 Subject: [PATCH 23/96] CI no environment 7 --- .../plug/engine/PlainAclPlugEngineTest.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index c7e5979ce5..1b1707d17f 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -70,10 +70,25 @@ public class PlainAclPlugEngineTest { } } String filePath = home + "/conf/transport.yml"; - fis = new FileInputStream(new File(filePath)); + try { + fis = new FileInputStream(new File(filePath)); + transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); + } catch (Exception e) { + AccessControl accessControl = new BorkerAccessControl(); + accessControl.setAccount("onlyNetAddress"); + accessControl.setPassword("aliyun11"); + accessControl.setNetaddress("127.0.0.1"); + accessControl.setRecognition("127.0.0.1:1"); - transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); + AccessControl accessControlTwo = new BorkerAccessControl(); + accessControlTwo.setAccount("listtransport"); + accessControlTwo.setPassword("aliyun1"); + accessControlTwo.setNetaddress("127.0.0.1"); + accessControlTwo.setRecognition("127.0.0.1:2"); + transport = new BorkerAccessControlTransport(); + transport.setOnlyNetAddress((BorkerAccessControl) accessControl); + } ControllerParameters controllerParametersEntity = new ControllerParameters(); controllerParametersEntity.setFileHome(null); try { @@ -82,17 +97,6 @@ public class PlainAclPlugEngineTest { } catch (Exception e) { } - accessControl = new BorkerAccessControl(); - accessControl.setAccount("rokcetmq"); - accessControl.setPassword("aliyun11"); - accessControl.setNetaddress("127.0.0.1"); - accessControl.setRecognition("127.0.0.1:1"); - - accessControlTwo = new BorkerAccessControl(); - accessControlTwo.setAccount("rokcet1"); - accessControlTwo.setPassword("aliyun1"); - accessControlTwo.setNetaddress("127.0.0.1"); - accessControlTwo.setRecognition("127.0.0.1:2"); loginInfoMap = new ConcurrentHashMap<>(); FieldSetter.setField(plainAclPlugEngine, plainAclPlugEngine.getClass().getSuperclass().getDeclaredField("loginInfoMap"), loginInfoMap); From d6d15834204923c9f00186c55f42c2be0edb22d2 Mon Sep 17 00:00:00 2001 From: hujie Date: Sat, 13 Oct 2018 22:12:31 +0800 Subject: [PATCH 24/96] CI no environment 9 --- ...enticationInfoManagementAclPlugEngine.java | 2 +- .../plug/engine/PlainAclPlugEngineTest.java | 30 ++++++++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index 44b5245ae5..6aac6bd438 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -63,7 +63,7 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl accessControlAddressMap.put(accessControl.getNetaddress(), authenticationInfo); log.info("authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { - throw new AclPlugRuntimeException(accessControl.toString(), e); + throw new AclPlugRuntimeException(String.format("Exception info %s %s" ,e.getMessage() , accessControl.toString()), e); } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 1b1707d17f..d4e856f8c2 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -98,6 +98,20 @@ public class PlainAclPlugEngineTest { } + accessControl = new BorkerAccessControl(); + accessControl.setAccount("onlyNetAddress"); + accessControl.setPassword("aliyun11"); + accessControl.setNetaddress("127.0.0.1"); + accessControl.setRecognition("127.0.0.1:1"); + + accessControlTwo = new BorkerAccessControl(); + accessControlTwo.setAccount("listtransport"); + accessControlTwo.setPassword("aliyun1"); + accessControlTwo.setNetaddress("127.0.0.1"); + accessControlTwo.setRecognition("127.0.0.1:2"); + transport = new BorkerAccessControlTransport(); + transport.setOnlyNetAddress((BorkerAccessControl) accessControl); + loginInfoMap = new ConcurrentHashMap<>(); FieldSetter.setField(plainAclPlugEngine, plainAclPlugEngine.getClass().getSuperclass().getDeclaredField("loginInfoMap"), loginInfoMap); @@ -261,18 +275,18 @@ public class PlainAclPlugEngineTest { @Test public void getAuthenticationInfo() { - AccessControl AccessControl = new AccessControl(); - AccessControl.setAccount("rokcetmq"); - AccessControl.setPassword("aliyun11"); - AccessControl.setNetaddress("127.0.0.1"); - AccessControl.setRecognition("127.0.0.1:1"); + AccessControl accessControl = new AccessControl(); + accessControl.setAccount("rokcetmq"); + accessControl.setPassword("aliyun11"); + accessControl.setNetaddress("127.0.0.1"); + accessControl.setRecognition("127.0.0.1:1"); AuthenticationResult authenticationResult = new AuthenticationResult(); - plainAclPlugEngine.getAuthenticationInfo(AccessControl, authenticationResult); + plainAclPlugEngine.getAuthenticationInfo(accessControl, authenticationResult); Assert.assertEquals("Login information does not exist, Please check login, password, IP", authenticationResult.getResultString()); - plainAclPlugEngine.setAccessControl(accessControl); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAuthenticationInfo(AccessControl, authenticationResult); + plainAclPlugEngine.setAccessControl(this.accessControl); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAuthenticationInfo(accessControl, authenticationResult); Assert.assertNotNull(authenticationInfo); } From 56f81dde06bb2c6baed14c5168493734190d4a35 Mon Sep 17 00:00:00 2001 From: hujie Date: Sat, 13 Oct 2018 22:27:47 +0800 Subject: [PATCH 25/96] CI no environment 9 --- .../plug/engine/PlainAclPlugEngineTest.java | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index d4e856f8c2..c925ef412d 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -71,23 +71,23 @@ public class PlainAclPlugEngineTest { } String filePath = home + "/conf/transport.yml"; try { - fis = new FileInputStream(new File(filePath)); - transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); - } catch (Exception e) { - AccessControl accessControl = new BorkerAccessControl(); + fis = new FileInputStream(new File(filePath)); + transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); + }catch(Exception e) { + AccessControl accessControl = new BorkerAccessControl(); accessControl.setAccount("onlyNetAddress"); accessControl.setPassword("aliyun11"); accessControl.setNetaddress("127.0.0.1"); accessControl.setRecognition("127.0.0.1:1"); AccessControl accessControlTwo = new BorkerAccessControl(); - accessControlTwo.setAccount("listtransport"); + accessControlTwo.setAccount("listTransport"); accessControlTwo.setPassword("aliyun1"); accessControlTwo.setNetaddress("127.0.0.1"); accessControlTwo.setRecognition("127.0.0.1:2"); - transport = new BorkerAccessControlTransport(); - transport.setOnlyNetAddress((BorkerAccessControl) accessControl); - + transport = new BorkerAccessControlTransport(); + transport.setOnlyNetAddress((BorkerAccessControl)accessControl); + } ControllerParameters controllerParametersEntity = new ControllerParameters(); controllerParametersEntity.setFileHome(null); @@ -97,20 +97,18 @@ public class PlainAclPlugEngineTest { } catch (Exception e) { } - + accessControl = new BorkerAccessControl(); - accessControl.setAccount("onlyNetAddress"); + accessControl.setAccount("rokcetmq"); accessControl.setPassword("aliyun11"); accessControl.setNetaddress("127.0.0.1"); accessControl.setRecognition("127.0.0.1:1"); accessControlTwo = new BorkerAccessControl(); - accessControlTwo.setAccount("listtransport"); + accessControlTwo.setAccount("rokcet1"); accessControlTwo.setPassword("aliyun1"); accessControlTwo.setNetaddress("127.0.0.1"); accessControlTwo.setRecognition("127.0.0.1:2"); - transport = new BorkerAccessControlTransport(); - transport.setOnlyNetAddress((BorkerAccessControl) accessControl); loginInfoMap = new ConcurrentHashMap<>(); FieldSetter.setField(plainAclPlugEngine, plainAclPlugEngine.getClass().getSuperclass().getDeclaredField("loginInfoMap"), loginInfoMap); @@ -275,18 +273,18 @@ public class PlainAclPlugEngineTest { @Test public void getAuthenticationInfo() { - AccessControl accessControl = new AccessControl(); - accessControl.setAccount("rokcetmq"); - accessControl.setPassword("aliyun11"); - accessControl.setNetaddress("127.0.0.1"); - accessControl.setRecognition("127.0.0.1:1"); + AccessControl newAccessControl = new AccessControl(); + newAccessControl.setAccount("rokcetmq"); + newAccessControl.setPassword("aliyun11"); + newAccessControl.setNetaddress("127.0.0.1"); + newAccessControl.setRecognition("127.0.0.1:1"); AuthenticationResult authenticationResult = new AuthenticationResult(); - plainAclPlugEngine.getAuthenticationInfo(accessControl, authenticationResult); + plainAclPlugEngine.getAuthenticationInfo(newAccessControl, authenticationResult); Assert.assertEquals("Login information does not exist, Please check login, password, IP", authenticationResult.getResultString()); - plainAclPlugEngine.setAccessControl(this.accessControl); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAuthenticationInfo(accessControl, authenticationResult); + plainAclPlugEngine.setAccessControl(accessControl); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAuthenticationInfo(newAccessControl, authenticationResult); Assert.assertNotNull(authenticationInfo); } From 4915871c935c99a1e705c43746d27bf27448307d Mon Sep 17 00:00:00 2001 From: zander Date: Fri, 26 Oct 2018 18:58:15 +0800 Subject: [PATCH 26/96] Expose the rpc hook --- .../remoting/netty/NettyRemotingAbstract.java | 58 +++++++++++++++---- .../remoting/netty/NettyRemotingClient.java | 32 ++++------ .../remoting/netty/NettyRemotingServer.java | 11 ++-- 3 files changed, 64 insertions(+), 37 deletions(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java index 8dccebc045..206b96ad1d 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java @@ -23,6 +23,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslHandler; import java.net.SocketAddress; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; @@ -95,6 +96,13 @@ public abstract class NettyRemotingAbstract { */ protected volatile SslContext sslContext; + /** + * custom rpc hooks + */ + protected List rpcHooks = new ArrayList(); + + + static { NettyLogger.initNettyLogger(); } @@ -158,6 +166,23 @@ public abstract class NettyRemotingAbstract { } } + protected void doBeforeRpcHooks(String addr, RemotingCommand request) { + if (rpcHooks.size() > 0) { + for (RPCHook rpcHook: rpcHooks) { + rpcHook.doBeforeRequest(addr, request); + } + } + } + + protected void doAfterRpcHooks(String addr, RemotingCommand request, RemotingCommand response) { + if (rpcHooks.size() > 0) { + for (RPCHook rpcHook: rpcHooks) { + rpcHook.doAfterResponse(addr, request, response); + } + } + } + + /** * Process incoming request command issued by remote peer. * @@ -174,15 +199,9 @@ public abstract class NettyRemotingAbstract { @Override public void run() { try { - RPCHook rpcHook = NettyRemotingAbstract.this.getRPCHook(); - if (rpcHook != null) { - rpcHook.doBeforeRequest(RemotingHelper.parseChannelRemoteAddr(ctx.channel()), cmd); - } - + doBeforeRpcHooks(RemotingHelper.parseChannelRemoteAddr(ctx.channel()), cmd); final RemotingCommand response = pair.getObject1().processRequest(ctx, cmd); - if (rpcHook != null) { - rpcHook.doAfterResponse(RemotingHelper.parseChannelRemoteAddr(ctx.channel()), cmd, response); - } + doAfterRpcHooks(RemotingHelper.parseChannelRemoteAddr(ctx.channel()), cmd, response); if (!cmd.isOnewayRPC()) { if (response != null) { @@ -314,12 +333,29 @@ public abstract class NettyRemotingAbstract { } } + + /** * Custom RPC hook. - * - * @return RPC hook if specified; null otherwise. + * Just be compatible with the previous version, use getRPCHooks instead. */ - public abstract RPCHook getRPCHook(); + @Deprecated + protected RPCHook getRPCHook() { + if (rpcHooks.size() > 0) { + return rpcHooks.get(0); + } + return null; + } + + /** + * Custom RPC hooks. + * + * @return RPC hooks if specified; null otherwise. + */ + public List getRPCHooks() { + return rpcHooks; + } + /** * This method specifies thread pool to use while invoking callback methods. diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java index 33c2eed8de..e891ad7299 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java @@ -34,6 +34,7 @@ import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import io.netty.handler.timeout.IdleStateHandler; import io.netty.util.concurrent.DefaultEventExecutorGroup; +import io.netty.util.concurrent.EventExecutorGroup; import java.io.IOException; import java.net.SocketAddress; import java.security.cert.CertificateException; @@ -53,6 +54,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; import org.apache.rocketmq.remoting.ChannelEventListener; import org.apache.rocketmq.remoting.InvokeCallback; import org.apache.rocketmq.remoting.RPCHook; @@ -64,8 +67,6 @@ import org.apache.rocketmq.remoting.exception.RemotingConnectException; import org.apache.rocketmq.remoting.exception.RemotingSendRequestException; import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; import org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException; -import org.apache.rocketmq.logging.InternalLogger; -import org.apache.rocketmq.logging.InternalLoggerFactory; import org.apache.rocketmq.remoting.protocol.RemotingCommand; public class NettyRemotingClient extends NettyRemotingAbstract implements RemotingClient { @@ -94,7 +95,6 @@ public class NettyRemotingClient extends NettyRemotingAbstract implements Remoti private ExecutorService callbackExecutor; private final ChannelEventListener channelEventListener; private DefaultEventExecutorGroup defaultEventExecutorGroup; - private RPCHook rpcHook; public NettyRemotingClient(final NettyClientConfig nettyClientConfig) { this(nettyClientConfig, null); @@ -283,7 +283,9 @@ public class NettyRemotingClient extends NettyRemotingAbstract implements Remoti @Override public void registerRPCHook(RPCHook rpcHook) { - this.rpcHook = rpcHook; + if (!rpcHooks.contains(rpcHook)) { + rpcHooks.add(rpcHook); + } } public void closeChannel(final Channel channel) { @@ -357,6 +359,8 @@ public class NettyRemotingClient extends NettyRemotingAbstract implements Remoti } } + + @Override public RemotingCommand invokeSync(String addr, final RemotingCommand request, long timeoutMillis) throws InterruptedException, RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException { @@ -364,17 +368,13 @@ public class NettyRemotingClient extends NettyRemotingAbstract implements Remoti final Channel channel = this.getAndCreateChannel(addr); if (channel != null && channel.isActive()) { try { - if (this.rpcHook != null) { - this.rpcHook.doBeforeRequest(addr, request); - } + doBeforeRpcHooks(addr, request); long costTime = System.currentTimeMillis() - beginStartTime; if (timeoutMillis < costTime) { throw new RemotingTimeoutException("invokeSync call timeout"); } RemotingCommand response = this.invokeSyncImpl(channel, request, timeoutMillis - costTime); - if (this.rpcHook != null) { - this.rpcHook.doAfterResponse(RemotingHelper.parseChannelRemoteAddr(channel), request, response); - } + doAfterRpcHooks(RemotingHelper.parseChannelRemoteAddr(channel), request, response); return response; } catch (RemotingSendRequestException e) { log.warn("invokeSync: send request exception, so close the channel[{}]", addr); @@ -522,9 +522,7 @@ public class NettyRemotingClient extends NettyRemotingAbstract implements Remoti final Channel channel = this.getAndCreateChannel(addr); if (channel != null && channel.isActive()) { try { - if (this.rpcHook != null) { - this.rpcHook.doBeforeRequest(addr, request); - } + doBeforeRpcHooks(addr, request); long costTime = System.currentTimeMillis() - beginStartTime; if (timeoutMillis < costTime) { throw new RemotingTooMuchRequestException("invokeAsync call timeout"); @@ -547,9 +545,7 @@ public class NettyRemotingClient extends NettyRemotingAbstract implements Remoti final Channel channel = this.getAndCreateChannel(addr); if (channel != null && channel.isActive()) { try { - if (this.rpcHook != null) { - this.rpcHook.doBeforeRequest(addr, request); - } + doBeforeRpcHooks(addr, request); this.invokeOnewayImpl(channel, request, timeoutMillis); } catch (RemotingSendRequestException e) { log.warn("invokeOneway: send request exception, so close the channel[{}]", addr); @@ -592,10 +588,6 @@ public class NettyRemotingClient extends NettyRemotingAbstract implements Remoti return channelEventListener; } - @Override - public RPCHook getRPCHook() { - return this.rpcHook; - } @Override public ExecutorService getCallbackExecutor() { diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java index 198484251c..90386f37e2 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java @@ -40,6 +40,8 @@ import io.netty.util.concurrent.DefaultEventExecutorGroup; import java.io.IOException; import java.net.InetSocketAddress; import java.security.cert.CertificateException; +import java.util.ArrayList; +import java.util.List; import java.util.NoSuchElementException; import java.util.Timer; import java.util.TimerTask; @@ -75,7 +77,6 @@ public class NettyRemotingServer extends NettyRemotingAbstract implements Remoti private final Timer timer = new Timer("ServerHouseKeepingService", true); private DefaultEventExecutorGroup defaultEventExecutorGroup; - private RPCHook rpcHook; private int port = 0; @@ -266,7 +267,9 @@ public class NettyRemotingServer extends NettyRemotingAbstract implements Remoti @Override public void registerRPCHook(RPCHook rpcHook) { - this.rpcHook = rpcHook; + if (!rpcHooks.contains(rpcHook)) { + rpcHooks.add(rpcHook); + } } @Override @@ -318,10 +321,6 @@ public class NettyRemotingServer extends NettyRemotingAbstract implements Remoti return channelEventListener; } - @Override - public RPCHook getRPCHook() { - return this.rpcHook; - } @Override public ExecutorService getCallbackExecutor() { From aeea021581ac4c49f903561219f2dd631be86d5f Mon Sep 17 00:00:00 2001 From: dongeforever Date: Sat, 27 Oct 2018 14:52:51 +0800 Subject: [PATCH 27/96] Draft the rpc hook and access validator plugin mechanism --- .../apache/rocketmq/acl/AccessResource.java | 21 +++++++ .../apache/rocketmq/acl/AccessValidator.java | 35 +++++++++++ .../rocketmq/acl/DefaultAccessValidator.java | 31 ++++++++++ .../rocketmq/broker/BrokerController.java | 61 +++++++++---------- .../rocketmq/broker/util/ServiceProvider.java | 8 +++ .../apache/rocketmq/common/BrokerConfig.java | 12 ++-- .../remoting/netty/NettyRemotingAbstract.java | 4 +- .../remoting/netty/NettyRemotingClient.java | 1 - .../remoting/netty/NettyRemotingServer.java | 6 +- 9 files changed, 133 insertions(+), 46 deletions(-) create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/AccessResource.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java create mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessResource.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessResource.java new file mode 100644 index 0000000000..e30febc571 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessResource.java @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl; + +public interface AccessResource { +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java new file mode 100644 index 0000000000..d573e56cf1 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl; + +import org.apache.rocketmq.remoting.protocol.RemotingCommand; + +public interface AccessValidator { + /** + * Parse to get the AccessResource(user, resource, needed permission) + * @param request + * @return + */ + AccessResource parse(RemotingCommand request); + + /** + * Validate the access resource. + * @param accessResource + */ + void validate(AccessResource accessResource) ; +} diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java new file mode 100644 index 0000000000..859cc80924 --- /dev/null +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl; + +import org.apache.rocketmq.remoting.protocol.RemotingCommand; + +public class DefaultAccessValidator implements AccessValidator { + + @Override public AccessResource parse(RemotingCommand request) { + return null; + } + + @Override public void validate(AccessResource accessResource) { + + } +} diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index c30d1f33e1..7a4c105e79 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -19,7 +19,6 @@ package org.apache.rocketmq.broker; import java.io.IOException; import java.net.InetSocketAddress; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -32,11 +31,8 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.AccessValidator; import org.apache.rocketmq.acl.plug.AclPlugController; -import org.apache.rocketmq.acl.plug.AclRemotingService; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.broker.client.ClientHousekeepingService; import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; import org.apache.rocketmq.broker.client.ConsumerManager; @@ -476,7 +472,8 @@ public class BrokerController { } } initialTransaction(); - initialAclPlug(); + initialAcl(); + initialRpcHooks(); } return result; } @@ -496,44 +493,42 @@ public class BrokerController { this.transactionalMessageCheckService = new TransactionalMessageCheckService(this); } - private void initialAclPlug() { - try { - if (!this.brokerConfig.isAclPlug()) { - log.info("Default does not start acl plug"); - return; - } - ControllerParameters controllerParameters = new ControllerParameters(); - controllerParameters.setFileHome(brokerConfig.getRocketmqHome()); - aclPlugController = new AclPlugController(controllerParameters); - if (!aclPlugController.isStartSucceed()) { - log.error("start acl plug failure"); - return; - } - final AclRemotingService aclRemotingService = aclPlugController.getAclRemotingService(); + private void initialAcl() { + if (!this.brokerConfig.isEnableAcl()) { + log.info("The broker dose not enable acl"); + return; + } + + List accessValidators = ServiceProvider.load(ServiceProvider.ACL_VALIDATOR_ID, AccessValidator.class); + if (accessValidators == null || accessValidators.isEmpty()) { + return; + } + + for (AccessValidator accessValidator: accessValidators) { + final AccessValidator validator = accessValidator; this.registerServerRPCHook(new RPCHook() { @Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - HashMap extFields = request.getExtFields(); - AccessControl accessControl = new AccessControl(); - accessControl.setCode(request.getCode()); - accessControl.setRecognition(remoteAddr); - if (extFields != null) { - accessControl.setAccount(extFields.get("account")); - accessControl.setPassword(extFields.get("password")); - accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); - accessControl.setTopic(extFields.get("topic")); - } - aclRemotingService.check(accessControl); + validator.validate(validator.parse(request)); } @Override public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { } }); + } + } - } catch (Exception e) { - log.error(e.getMessage(), e); + + private void initialRpcHooks() { + + List rpcHooks = ServiceProvider.load(ServiceProvider.RPC_HOOK_ID, RPCHook.class); + if (rpcHooks == null || rpcHooks.isEmpty()) { + return; + } + for (RPCHook rpcHook: rpcHooks) { + this.registerServerRPCHook(rpcHook); } } diff --git a/broker/src/main/java/org/apache/rocketmq/broker/util/ServiceProvider.java b/broker/src/main/java/org/apache/rocketmq/broker/util/ServiceProvider.java index 8b9b63e4dc..e679660104 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/util/ServiceProvider.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/util/ServiceProvider.java @@ -34,6 +34,14 @@ public class ServiceProvider { public static final String TRANSACTION_LISTENER_ID = "META-INF/service/org.apache.rocketmq.broker.transaction.AbstractTransactionalMessageCheckListener"; + + public static final String RPC_HOOK_ID = "META-INF/service/org.apache.rocketmq.remoting.RPCHook"; + + + public static final String ACL_VALIDATOR_ID = "META-INF/service/org.apache.rocketmq.acl.AccessValidator"; + + + static { thisClassLoader = getClassLoader(ServiceProvider.class); } diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index 6e11de20ff..60bd7ce411 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -171,7 +171,8 @@ public class BrokerConfig { @ImportantField private long transactionCheckInterval = 60 * 1000; - private boolean isAclPlug; + private boolean enableAcl; + public static String localHostName() { try { @@ -711,12 +712,12 @@ public class BrokerConfig { this.transactionCheckInterval = transactionCheckInterval; } - public boolean isAclPlug() { - return isAclPlug; + public boolean isEnableAcl() { + return enableAcl; } - public void setAclPlug(boolean isAclPlug) { - this.isAclPlug = isAclPlug; + public void setEnableAcl(boolean isAclPlug) { + this.enableAcl = isAclPlug; } public int getEndTransactionThreadPoolNums() { @@ -742,5 +743,4 @@ public class BrokerConfig { public void setWaitTimeMillsInTransactionQueue(long waitTimeMillsInTransactionQueue) { this.waitTimeMillsInTransactionQueue = waitTimeMillsInTransactionQueue; } - } diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java index 206b96ad1d..28ae001b7f 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java @@ -36,6 +36,8 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; import org.apache.rocketmq.remoting.ChannelEventListener; import org.apache.rocketmq.remoting.InvokeCallback; import org.apache.rocketmq.remoting.RPCHook; @@ -46,8 +48,6 @@ import org.apache.rocketmq.remoting.common.ServiceThread; import org.apache.rocketmq.remoting.exception.RemotingSendRequestException; import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; import org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException; -import org.apache.rocketmq.logging.InternalLogger; -import org.apache.rocketmq.logging.InternalLoggerFactory; import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingSysResponseCode; diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java index e891ad7299..90f51ff055 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java @@ -34,7 +34,6 @@ import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import io.netty.handler.timeout.IdleStateHandler; import io.netty.util.concurrent.DefaultEventExecutorGroup; -import io.netty.util.concurrent.EventExecutorGroup; import java.io.IOException; import java.net.SocketAddress; import java.security.cert.CertificateException; diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java index 90386f37e2..ec34a4be7a 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java @@ -40,8 +40,6 @@ import io.netty.util.concurrent.DefaultEventExecutorGroup; import java.io.IOException; import java.net.InetSocketAddress; import java.security.cert.CertificateException; -import java.util.ArrayList; -import java.util.List; import java.util.NoSuchElementException; import java.util.Timer; import java.util.TimerTask; @@ -49,6 +47,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; import org.apache.rocketmq.remoting.ChannelEventListener; import org.apache.rocketmq.remoting.InvokeCallback; import org.apache.rocketmq.remoting.RPCHook; @@ -60,8 +60,6 @@ import org.apache.rocketmq.remoting.common.TlsMode; import org.apache.rocketmq.remoting.exception.RemotingSendRequestException; import org.apache.rocketmq.remoting.exception.RemotingTimeoutException; import org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException; -import org.apache.rocketmq.logging.InternalLogger; -import org.apache.rocketmq.logging.InternalLoggerFactory; import org.apache.rocketmq.remoting.protocol.RemotingCommand; public class NettyRemotingServer extends NettyRemotingAbstract implements RemotingServer { From 74f4213b06c910946ff916e0781f0a181600fb83 Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Thu, 1 Nov 2018 20:07:27 +0800 Subject: [PATCH 28/96] arrange --- .../apache/rocketmq/acl/AccessValidator.java | 2 +- .../rocketmq/acl/DefaultAccessValidator.java | 2 +- .../plug/DefaultAclRemotingServiceImpl.java | 42 +++++- .../acl/plug/engine/AclPlugEngine.java | 2 + ...enticationInfoManagementAclPlugEngine.java | 51 ++++--- .../acl/plug/entity/AccessControl.java | 4 +- .../acl/plug/entity/ControllerParameters.java | 3 +- .../acl/plug/AclRemotingServiceTest.java | 132 ++++++++++++++++++ .../rocketmq/broker/BrokerController.java | 6 +- .../client/ClientHousekeepingService.java | 3 - .../org.apache.rocketmq.acl.AccessValidator | 1 + .../broker/util/ServiceProviderTest.java | 9 ++ .../org.apache.rocketmq.acl.AccessValidator | 1 + distribution/conf/broker.conf | 2 +- distribution/conf/transport.yml | 4 +- pom.xml | 4 +- 16 files changed, 230 insertions(+), 38 deletions(-) create mode 100644 acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java create mode 100644 broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator create mode 100644 broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java index d573e56cf1..46f5728b43 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java @@ -25,7 +25,7 @@ public interface AccessValidator { * @param request * @return */ - AccessResource parse(RemotingCommand request); + AccessResource parse(RemotingCommand request,String remoteAddr); /** * Validate the access resource. diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java index 859cc80924..215a756e01 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java @@ -21,7 +21,7 @@ import org.apache.rocketmq.remoting.protocol.RemotingCommand; public class DefaultAccessValidator implements AccessValidator { - @Override public AccessResource parse(RemotingCommand request) { + @Override public AccessResource parse(RemotingCommand request,String remoteAddr ) { return null; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java index b42205abcf..7bb13a1810 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java @@ -16,15 +16,29 @@ */ package org.apache.rocketmq.acl.plug; +import java.util.HashMap; + +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.AccessResource; +import org.apache.rocketmq.acl.AccessValidator; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; +import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; -public class DefaultAclRemotingServiceImpl implements AclRemotingService { +public class DefaultAclRemotingServiceImpl implements AclRemotingService ,AccessValidator{ private AclPlugEngine aclPlugEngine; + public DefaultAclRemotingServiceImpl() { + ControllerParameters controllerParameters = new ControllerParameters(); + this.aclPlugEngine = new PlainAclPlugEngine(controllerParameters); + this.aclPlugEngine.initialize(); + } + public DefaultAclRemotingServiceImpl(AclPlugEngine aclPlugEngine) { this.aclPlugEngine = aclPlugEngine; } @@ -41,4 +55,30 @@ public class DefaultAclRemotingServiceImpl implements AclRemotingService { return authenticationResult; } + @Override + public AccessResource parse(RemotingCommand request ,String remoteAddr) { + HashMap extFields = request.getExtFields(); + AccessControl accessControl = new AccessControl(); + accessControl.setCode(request.getCode()); + accessControl.setRecognition(remoteAddr); + if (extFields != null) { + accessControl.setAccount(extFields.get("account")); + accessControl.setPassword(extFields.get("password")); + accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); + accessControl.setTopic(extFields.get("topic")); +} + return accessControl; + } + + @Override + public void validate(AccessResource accessResource) { + AuthenticationResult authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl)accessResource); + if (authenticationResult.getException() != null) { + throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); + } + if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { + throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); + } + } + } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java index badae946c1..e4ef987274 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java @@ -30,6 +30,8 @@ public interface AclPlugEngine { public void deleteLoginInfo(String remoteAddr); public AuthenticationResult eachCheckLoginAndAuthentication(AccessControl accessControl); + + public AuthenticationResult eachCheckAuthentication(AccessControl accessControl); public void initialize(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index 6aac6bd438..12f7d8b29a 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -16,6 +16,7 @@ */ package org.apache.rocketmq.acl.plug.engine; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -37,7 +38,7 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); ControllerParameters controllerParameters; - private Map> accessControlMap = new HashMap<>(); + private Map> accessControlMap = new HashMap<>(); private AuthenticationInfo authenticationInfo; private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); @@ -54,13 +55,13 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl } try { NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); - if (accessControlAddressMap == null) { - accessControlAddressMap = new HashMap<>(); - accessControlMap.put(accessControl.getAccount(), accessControlAddressMap); + List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); + if (accessControlAddressList == null) { + accessControlAddressList = new ArrayList<>(); + accessControlMap.put(accessControl.getAccount(), accessControlAddressList); } AuthenticationInfo authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategy); - accessControlAddressMap.put(accessControl.getNetaddress(), authenticationInfo); + accessControlAddressList.add( authenticationInfo); log.info("authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { throw new AclPlugRuntimeException(String.format("Exception info %s %s" ,e.getMessage() , accessControl.toString()), e); @@ -84,24 +85,19 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl } public AuthenticationInfo getAccessControl(AccessControl accessControl) { - AuthenticationInfo existing = null; if (accessControl.getAccount() == null && authenticationInfo != null) { - existing = authenticationInfo.getNetaddressStrategy().match(accessControl) ? authenticationInfo : null; + return authenticationInfo.getNetaddressStrategy().match(accessControl) ? authenticationInfo : null; } else { - Map accessControlAddressMap = accessControlMap.get(accessControl.getAccount()); - if (accessControlAddressMap != null) { - existing = accessControlAddressMap.get(accessControl.getNetaddress()); - if (existing == null) - return null; - if (existing.getAccessControl().getPassword().equals(accessControl.getPassword())) { - if (existing.getNetaddressStrategy().match(accessControl)) { - return existing; - } - } - existing = null; + List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); + if (accessControlAddressList != null) { + for(AuthenticationInfo ai : accessControlAddressList) { + if(ai.getNetaddressStrategy().match(accessControl)&&ai.getAccessControl().getPassword().equals(accessControl.getPassword())) { + return ai; + } + } } } - return existing; + return null; } @Override @@ -112,12 +108,27 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl if (authenticationInfo != null) { boolean boo = authentication.authentication(authenticationInfo, accessControl, authenticationResult); authenticationResult.setSucceed(boo); + authenticationResult.setAccessControl(authenticationInfo.getAccessControl()); } } catch (Exception e) { authenticationResult.setException(e); } return authenticationResult; } + + public AuthenticationResult eachCheckAuthentication(AccessControl accessControl) { + AuthenticationResult authenticationResult = new AuthenticationResult(); + AuthenticationInfo authenticationInfo = getAccessControl(accessControl); + if(authenticationInfo != null) { + boolean boo = authentication.authentication(authenticationInfo, accessControl, authenticationResult); + authenticationResult.setSucceed(boo); + }else { + authenticationResult.setResultString("accessControl is null, Please check login, password, IP\""); + } + + + return authenticationResult; + } void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java index cf3a736a7f..b46a034b51 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java @@ -16,7 +16,9 @@ */ package org.apache.rocketmq.acl.plug.entity; -public class AccessControl { +import org.apache.rocketmq.acl.AccessResource; + +public class AccessControl implements AccessResource{ private String account; diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java index 708bcbeb91..74ae4a7ecb 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java @@ -16,11 +16,12 @@ */ package org.apache.rocketmq.acl.plug.entity; +import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.protocol.RequestCode; public class ControllerParameters { - private String fileHome; + private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); private Class accessContralAnalysisClass = RequestCode.class; diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java new file mode 100644 index 0000000000..c0d8cdb153 --- /dev/null +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java @@ -0,0 +1,132 @@ +package org.apache.rocketmq.acl.plug; + +import java.util.HashMap; + +import org.apache.rocketmq.acl.AccessResource; +import org.apache.rocketmq.acl.AccessValidator; +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test;; + +public class AclRemotingServiceTest { + + + AclRemotingService defaultAclService; + + AccessValidator accessValidator; + + AccessControl accessControl; + + AccessControl accessControlTwo; + + @Before + public void init() { + System.setProperty("rocketmq.home.dir", "src/test/resources"); + DefaultAclRemotingServiceImpl aclRemotingServiceImpl = new DefaultAclRemotingServiceImpl(); + defaultAclService = aclRemotingServiceImpl; + accessValidator = aclRemotingServiceImpl; + + accessControl = new BorkerAccessControl(); + accessControl.setAccount("RocketMQ"); + accessControl.setPassword("1234567"); + accessControl.setNetaddress("192.0.0.1"); + accessControl.setRecognition("127.0.0.1:1"); + + accessControlTwo = new BorkerAccessControl(); + accessControlTwo.setAccount("RocketMQ"); + accessControlTwo.setPassword("1234567"); + accessControlTwo.setNetaddress("192.0.2.1"); + accessControlTwo.setRecognition("127.0.0.1:2"); + } + + + + @Test + public void defaultConstructorTest() { + System.setProperty("rocketmq.home.dir", "src/test/resources"); + AclRemotingService defaultAclService = new DefaultAclRemotingServiceImpl(); + Assert.assertNotNull(defaultAclService); + } + + @Test + public void parseTest() { + RemotingCommand remotingCommand = RemotingCommand.createResponseCommand(34, ""); + HashMap map = new HashMap<>(); + map.put("account", "RocketMQ"); + map.put("password","123456"); + map.put("topic","test"); + remotingCommand.setExtFields(map); + + AccessResource accessResource = accessValidator.parse(remotingCommand, "127.0.0.1:123"); + AccessControl accessControl = (AccessControl)accessResource; + AccessControl newAccessControl = new AccessControl(); + newAccessControl.setAccount("RocketMQ"); + newAccessControl.setPassword("123456"); + newAccessControl.setTopic("test"); + newAccessControl.setCode(34); + newAccessControl.setNetaddress("127.0.0.1"); + newAccessControl.setRecognition("127.0.0.1:123"); + Assert.assertEquals(accessControl.toString(), newAccessControl.toString()); + } + + @Test + public void checkTest() { + accessControl.setCode(34); + AuthenticationResult authenticationResult = defaultAclService.check(accessControl); + Assert.assertTrue(authenticationResult.isSucceed()); + } + + @Test(expected=AclPlugRuntimeException.class) + public void checkAccessExceptionTest() { + accessControl.setCode(34); + accessControl.setAccount("Rocketmq"); + defaultAclService.check(accessControl); + } + + @Test(expected=AclPlugRuntimeException.class) + public void checkPasswordTest() { + accessControl.setCode(34); + accessControl.setPassword("123123123"); + defaultAclService.check(accessControl); + } + + @Test(expected=AclPlugRuntimeException.class) + public void checkCodeTest() { + accessControl.setCode(14434); + accessControl.setPassword("123123123"); + defaultAclService.check(accessControl); + } + + + @Test + public void validateTest() { + accessControl.setCode(34); + accessValidator.validate(accessControl); + } + + @Test(expected=AclPlugRuntimeException.class) + public void validateAccessExceptionTest() { + accessControl.setCode(34); + accessControl.setAccount("Rocketmq"); + accessValidator.validate(accessControl); + } + + @Test(expected=AclPlugRuntimeException.class) + public void validatePasswordTest() { + accessControl.setCode(34); + accessControl.setPassword("123123123"); + accessValidator.validate(accessControl); + } + + @Test(expected=AclPlugRuntimeException.class) + public void validateCodeTest() { + accessControl.setCode(14434); + accessControl.setPassword("123123123"); + accessValidator.validate(accessControl); + } +} diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index 7a4c105e79..d06949ca1f 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -160,7 +160,6 @@ public class BrokerController { private TransactionalMessageService transactionalMessageService; private AbstractTransactionalMessageCheckListener transactionalMessageCheckListener; - private AclPlugController aclPlugController; public BrokerController( final BrokerConfig brokerConfig, @@ -510,7 +509,7 @@ public class BrokerController { @Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - validator.validate(validator.parse(request)); + validator.validate(validator.parse(request, remoteAddr)); } @Override @@ -1095,9 +1094,6 @@ public class BrokerController { this.transactionalMessageCheckListener = transactionalMessageCheckListener; } - public AclPlugController getAclPlugController() { - return this.aclPlugController; - } public BlockingQueue getEndTransactionThreadPoolQueue() { return endTransactionThreadPoolQueue; diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java b/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java index f4ecc2c046..d536db5055 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java @@ -72,9 +72,6 @@ public class ClientHousekeepingService implements ChannelEventListener { this.brokerController.getProducerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getConsumerManager().doChannelCloseEvent(remoteAddr, channel); this.brokerController.getFilterServerManager().doChannelCloseEvent(remoteAddr, channel); - if (this.brokerController.getAclPlugController() != null && this.brokerController.getAclPlugController().isStartSucceed()) { - this.brokerController.getAclPlugController().doChannelCloseEvent(remoteAddr); - } } @Override diff --git a/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator b/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator new file mode 100644 index 0000000000..2f26220e5e --- /dev/null +++ b/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator @@ -0,0 +1 @@ +org.apache.rocketmq.acl.plug.DefaultAclRemotingServiceImpl \ No newline at end of file diff --git a/broker/src/test/java/org/apache/rocketmq/broker/util/ServiceProviderTest.java b/broker/src/test/java/org/apache/rocketmq/broker/util/ServiceProviderTest.java index 22228a6e0e..a3a35c8832 100644 --- a/broker/src/test/java/org/apache/rocketmq/broker/util/ServiceProviderTest.java +++ b/broker/src/test/java/org/apache/rocketmq/broker/util/ServiceProviderTest.java @@ -17,12 +17,15 @@ package org.apache.rocketmq.broker.util; +import org.apache.rocketmq.acl.AccessValidator; import org.apache.rocketmq.broker.transaction.AbstractTransactionalMessageCheckListener; import org.apache.rocketmq.broker.transaction.TransactionalMessageService; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; +import java.util.List; + public class ServiceProviderTest { @Test @@ -38,4 +41,10 @@ public class ServiceProviderTest { AbstractTransactionalMessageCheckListener.class); assertThat(listener).isNotNull(); } + + @Test + public void loadAccessValidatorTest() { + List accessValidators = ServiceProvider.load(ServiceProvider.ACL_VALIDATOR_ID, AccessValidator.class); + assertThat(accessValidators).isNotNull(); + } } diff --git a/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator b/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator new file mode 100644 index 0000000000..2f26220e5e --- /dev/null +++ b/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator @@ -0,0 +1 @@ +org.apache.rocketmq.acl.plug.DefaultAclRemotingServiceImpl \ No newline at end of file diff --git a/distribution/conf/broker.conf b/distribution/conf/broker.conf index 363bcbc03a..970395735d 100644 --- a/distribution/conf/broker.conf +++ b/distribution/conf/broker.conf @@ -20,5 +20,5 @@ deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH -aclPlug=true +enableAcl=true namesrvAddr=127.0.0.1:9876 diff --git a/distribution/conf/transport.yml b/distribution/conf/transport.yml index 25d4902a67..f86e68d411 100644 --- a/distribution/conf/transport.yml +++ b/distribution/conf/transport.yml @@ -14,7 +14,7 @@ # limitations under the License. onlyNetAddress: - netaddress: 10.10.103.* + netaddress: 127.0.0.* noPermitPullTopic: - broker-a @@ -31,4 +31,4 @@ list: permitSendTopic: - test3 - test4 - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index 535893c210..38e518da28 100644 --- a/pom.xml +++ b/pom.xml @@ -216,9 +216,9 @@ generate-effective-dependencies-pom generate-resources - + ${project.build.directory}/effective-pom/effective-dependencies.xml From c62970035c2a7b76bb347118d59a45db2f481db1 Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Thu, 1 Nov 2018 23:59:28 +0800 Subject: [PATCH 29/96] clean --- acl-plug/pom.xml | 2 +- .../apache/rocketmq/acl/AccessValidator.java | 6 +- .../rocketmq/acl/DefaultAccessValidator.java | 6 +- .../acl/plug/AccessContralAnalysis.java | 7 +- .../rocketmq/acl/plug/Authentication.java | 2 +- .../plug/DefaultAclRemotingServiceImpl.java | 34 +-- .../acl/plug/engine/AclPlugEngine.java | 4 +- ...enticationInfoManagementAclPlugEngine.java | 44 ++-- .../plug/engine/LoginInfoAclPlugEngine.java | 3 +- .../acl/plug/engine/PlainAclPlugEngine.java | 9 +- .../acl/plug/entity/AccessControl.java | 6 +- .../acl/plug/entity/AuthenticationInfo.java | 7 +- .../acl/plug/entity/BorkerAccessControl.java | 4 +- .../acl/plug/entity/ControllerParameters.java | 2 +- .../rocketmq/acl/plug/entity/LoginInfo.java | 4 +- .../strategy/NetaddressStrategyFactory.java | 5 +- .../acl/plug/AclRemotingServiceTest.java | 203 +++++++++--------- .../rocketmq/acl/plug/AclUtilsTest.java | 5 +- .../plug/engine/PlainAclPlugEngineTest.java | 45 +--- broker/pom.xml | 2 +- .../rocketmq/broker/BrokerController.java | 1 - pom.xml | 2 +- 22 files changed, 190 insertions(+), 213 deletions(-) diff --git a/acl-plug/pom.xml b/acl-plug/pom.xml index 1cdc4a29da..762d7a1910 100644 --- a/acl-plug/pom.xml +++ b/acl-plug/pom.xml @@ -18,7 +18,7 @@ rocketmq-all 4.4.0-SNAPSHOT - rocketmq-acl-plug + rocketmq-acl rocketmq-acl-plug ${project.version} http://maven.apache.org diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java index 46f5728b43..0b1b0823c5 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java @@ -22,14 +22,16 @@ import org.apache.rocketmq.remoting.protocol.RemotingCommand; public interface AccessValidator { /** * Parse to get the AccessResource(user, resource, needed permission) + * * @param request * @return */ - AccessResource parse(RemotingCommand request,String remoteAddr); + AccessResource parse(RemotingCommand request, String remoteAddr); /** * Validate the access resource. + * * @param accessResource */ - void validate(AccessResource accessResource) ; + void validate(AccessResource accessResource); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java index 215a756e01..704ace47b7 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java @@ -21,11 +21,13 @@ import org.apache.rocketmq.remoting.protocol.RemotingCommand; public class DefaultAccessValidator implements AccessValidator { - @Override public AccessResource parse(RemotingCommand request,String remoteAddr ) { + @Override + public AccessResource parse(RemotingCommand request, String remoteAddr) { return null; } - @Override public void validate(AccessResource accessResource) { + @Override + public void validate(AccessResource accessResource) { } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java index 75c907d82b..1adf6d432e 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java @@ -16,14 +16,15 @@ */ package org.apache.rocketmq.acl.plug; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; + import java.lang.reflect.Field; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; public class AccessContralAnalysis { diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java index 901cc409d7..ae247e7220 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java @@ -24,7 +24,7 @@ import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; public class Authentication { public boolean authentication(AuthenticationInfo authenticationInfo, - AccessControl accessControl, AuthenticationResult authenticationResult) { + AccessControl accessControl, AuthenticationResult authenticationResult) { int code = accessControl.getCode(); if (!authenticationInfo.getAuthority().get(code)) { authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java index 7bb13a1810..8abf35a30b 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java @@ -16,8 +16,6 @@ */ package org.apache.rocketmq.acl.plug; -import java.util.HashMap; - import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.AccessResource; import org.apache.rocketmq.acl.AccessValidator; @@ -29,16 +27,18 @@ import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.remoting.protocol.RemotingCommand; -public class DefaultAclRemotingServiceImpl implements AclRemotingService ,AccessValidator{ +import java.util.HashMap; + +public class DefaultAclRemotingServiceImpl implements AclRemotingService, AccessValidator { private AclPlugEngine aclPlugEngine; public DefaultAclRemotingServiceImpl() { - ControllerParameters controllerParameters = new ControllerParameters(); - this.aclPlugEngine = new PlainAclPlugEngine(controllerParameters); - this.aclPlugEngine.initialize(); + ControllerParameters controllerParameters = new ControllerParameters(); + this.aclPlugEngine = new PlainAclPlugEngine(controllerParameters); + this.aclPlugEngine.initialize(); } - + public DefaultAclRemotingServiceImpl(AclPlugEngine aclPlugEngine) { this.aclPlugEngine = aclPlugEngine; } @@ -55,9 +55,9 @@ public class DefaultAclRemotingServiceImpl implements AclRemotingService ,Access return authenticationResult; } - @Override - public AccessResource parse(RemotingCommand request ,String remoteAddr) { - HashMap extFields = request.getExtFields(); + @Override + public AccessResource parse(RemotingCommand request, String remoteAddr) { + HashMap extFields = request.getExtFields(); AccessControl accessControl = new AccessControl(); accessControl.setCode(request.getCode()); accessControl.setRecognition(remoteAddr); @@ -66,19 +66,19 @@ public class DefaultAclRemotingServiceImpl implements AclRemotingService ,Access accessControl.setPassword(extFields.get("password")); accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); accessControl.setTopic(extFields.get("topic")); -} - return accessControl; - } + } + return accessControl; + } - @Override - public void validate(AccessResource accessResource) { - AuthenticationResult authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl)accessResource); + @Override + public void validate(AccessResource accessResource) { + AuthenticationResult authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); if (authenticationResult.getException() != null) { throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); } if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); } - } + } } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java index e4ef987274..d1572755ee 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java @@ -30,8 +30,8 @@ public interface AclPlugEngine { public void deleteLoginInfo(String remoteAddr); public AuthenticationResult eachCheckLoginAndAuthentication(AccessControl accessControl); - - public AuthenticationResult eachCheckAuthentication(AccessControl accessControl); + + public AuthenticationResult eachCheckAuthentication(AccessControl accessControl); public void initialize(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java index 12f7d8b29a..a6399fc3e4 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; + import org.apache.rocketmq.acl.plug.AccessContralAnalysis; import org.apache.rocketmq.acl.plug.Authentication; import org.apache.rocketmq.acl.plug.entity.AccessControl; @@ -61,10 +62,10 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl accessControlMap.put(accessControl.getAccount(), accessControlAddressList); } AuthenticationInfo authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategy); - accessControlAddressList.add( authenticationInfo); + accessControlAddressList.add(authenticationInfo); log.info("authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("Exception info %s %s" ,e.getMessage() , accessControl.toString()), e); + throw new AclPlugRuntimeException(String.format("Exception info %s %s", e.getMessage(), accessControl.toString()), e); } } @@ -90,11 +91,11 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl } else { List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); if (accessControlAddressList != null) { - for(AuthenticationInfo ai : accessControlAddressList) { - if(ai.getNetaddressStrategy().match(accessControl)&&ai.getAccessControl().getPassword().equals(accessControl.getPassword())) { - return ai; - } - } + for (AuthenticationInfo ai : accessControlAddressList) { + if (ai.getNetaddressStrategy().match(accessControl) && ai.getAccessControl().getPassword().equals(accessControl.getPassword())) { + return ai; + } + } } } return null; @@ -115,19 +116,20 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl } return authenticationResult; } - - public AuthenticationResult eachCheckAuthentication(AccessControl accessControl) { - AuthenticationResult authenticationResult = new AuthenticationResult(); - AuthenticationInfo authenticationInfo = getAccessControl(accessControl); - if(authenticationInfo != null) { - boolean boo = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - authenticationResult.setSucceed(boo); - }else { - authenticationResult.setResultString("accessControl is null, Please check login, password, IP\""); - } - - - return authenticationResult; + + public AuthenticationResult eachCheckAuthentication(AccessControl accessControl) { + AuthenticationResult authenticationResult = new AuthenticationResult(); + AuthenticationInfo authenticationInfo = getAccessControl(accessControl); + if (authenticationInfo != null) { + boolean boo = authentication.authentication(authenticationInfo, accessControl, authenticationResult); + authenticationResult.setSucceed(boo); + authenticationResult.setAccessControl(authenticationInfo.getAccessControl()); + } else { + authenticationResult.setResultString("accessControl is null, Please check login, password, IP\""); + } + + + return authenticationResult; } void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { @@ -146,5 +148,5 @@ public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPl } protected abstract AuthenticationInfo getAuthenticationInfo(AccessControl accessControl, - AuthenticationResult authenticationResult); + AuthenticationResult authenticationResult); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java index e8dc59c422..35b568349e 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java @@ -18,6 +18,7 @@ package org.apache.rocketmq.acl.plug.engine; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; + import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; @@ -53,7 +54,7 @@ public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagemen } protected AuthenticationInfo getAuthenticationInfo(AccessControl accessControl, - AuthenticationResult authenticationResult) { + AuthenticationResult authenticationResult) { LoginInfo loginInfo = getLoginInfo(accessControl); if (loginInfo != null && loginInfo.getAuthenticationInfo() != null) { return loginInfo.getAuthenticationInfo(); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index d1a7d9529b..bcb89b8fa2 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -16,18 +16,19 @@ */ package org.apache.rocketmq.acl.plug.engine; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.yaml.snakeyaml.Yaml; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { public PlainAclPlugEngine( - ControllerParameters controllerParameters) throws AclPlugRuntimeException { + ControllerParameters controllerParameters) throws AclPlugRuntimeException { super(controllerParameters); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java index b46a034b51..092a97ef44 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java @@ -18,7 +18,7 @@ package org.apache.rocketmq.acl.plug.entity; import org.apache.rocketmq.acl.AccessResource; -public class AccessControl implements AccessResource{ +public class AccessControl implements AccessResource { private String account; @@ -87,8 +87,8 @@ public class AccessControl implements AccessResource{ public String toString() { StringBuilder builder = new StringBuilder(); builder.append("AccessControl [account=").append(account).append(", password=").append(password) - .append(", netaddress=").append(netaddress).append(", recognition=").append(recognition) - .append(", code=").append(code).append(", topic=").append(topic).append("]"); + .append(", netaddress=").append(netaddress).append(", recognition=").append(recognition) + .append(", code=").append(code).append(", topic=").append(topic).append("]"); return builder.toString(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java index 981bef8553..a1696e2e44 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java @@ -16,10 +16,11 @@ */ package org.apache.rocketmq.acl.plug.entity; +import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; + import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; public class AuthenticationInfo { @@ -30,7 +31,7 @@ public class AuthenticationInfo { private Map authority; public AuthenticationInfo(Map authority, AccessControl accessControl, - NetaddressStrategy netaddressStrategy) { + NetaddressStrategy netaddressStrategy) { super(); this.authority = authority; this.accessControl = accessControl; @@ -65,7 +66,7 @@ public class AuthenticationInfo { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("AuthenticationInfo [accessControl=").append(accessControl).append(", netaddressStrategy=") - .append(netaddressStrategy).append(", authority={"); + .append(netaddressStrategy).append(", authority={"); Iterator> it = authority.entrySet().iterator(); while (it.hasNext()) { Entry e = it.next(); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java index d40fadfacb..b5eb1187d2 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java @@ -556,8 +556,8 @@ public class BorkerAccessControl extends AccessControl { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("BorkerAccessControl [permitSendTopic=").append(permitSendTopic).append(", noPermitSendTopic=") - .append(noPermitSendTopic).append(", permitPullTopic=").append(permitPullTopic) - .append(", noPermitPullTopic=").append(noPermitPullTopic); + .append(noPermitSendTopic).append(", permitPullTopic=").append(permitPullTopic) + .append(", noPermitPullTopic=").append(noPermitPullTopic); if (!!sendMessage) builder.append(", sendMessage=").append(sendMessage); if (!!sendMessageV2) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java index 74ae4a7ecb..94873b5fcf 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java @@ -45,7 +45,7 @@ public class ControllerParameters { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("ControllerParametersEntity [fileHome=").append(fileHome).append(", accessContralAnalysisClass=") - .append(accessContralAnalysisClass).append("]"); + .append(accessContralAnalysisClass).append("]"); return builder.toString(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java index e08d7d38b1..df1166be63 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java @@ -74,8 +74,8 @@ public class LoginInfo { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("LoginInfo [recognition=").append(recognition).append(", loginTime=").append(loginTime) - .append(", operationTime=").append(operationTime).append(", clear=").append(clear) - .append(", authenticationInfo=").append(authenticationInfo).append("]"); + .append(", operationTime=").append(operationTime).append(", clear=").append(clear) + .append(", authenticationInfo=").append(authenticationInfo).append("]"); return builder.toString(); } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java index cdb78675e9..4be9953091 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java @@ -16,13 +16,14 @@ */ package org.apache.rocketmq.acl.plug.strategy; -import java.util.HashSet; -import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.AclUtils; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; +import java.util.HashSet; +import java.util.Set; + public class NetaddressStrategyFactory { public static final NullNetaddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullNetaddressStrategy(); diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java index c0d8cdb153..ba0c8dc1c8 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java @@ -15,23 +15,23 @@ import org.junit.Test;; public class AclRemotingServiceTest { - - AclRemotingService defaultAclService; - - AccessValidator accessValidator; - - AccessControl accessControl; + + AclRemotingService defaultAclService; + + AccessValidator accessValidator; + + AccessControl accessControl; AccessControl accessControlTwo; - - @Before - public void init() { - System.setProperty("rocketmq.home.dir", "src/test/resources"); - DefaultAclRemotingServiceImpl aclRemotingServiceImpl = new DefaultAclRemotingServiceImpl(); - defaultAclService = aclRemotingServiceImpl; - accessValidator = aclRemotingServiceImpl; - - accessControl = new BorkerAccessControl(); + + @Before + public void init() { + System.setProperty("rocketmq.home.dir", "src/test/resources"); + DefaultAclRemotingServiceImpl aclRemotingServiceImpl = new DefaultAclRemotingServiceImpl(); + defaultAclService = aclRemotingServiceImpl; + accessValidator = aclRemotingServiceImpl; + + accessControl = new BorkerAccessControl(); accessControl.setAccount("RocketMQ"); accessControl.setPassword("1234567"); accessControl.setNetaddress("192.0.0.1"); @@ -42,91 +42,90 @@ public class AclRemotingServiceTest { accessControlTwo.setPassword("1234567"); accessControlTwo.setNetaddress("192.0.2.1"); accessControlTwo.setRecognition("127.0.0.1:2"); - } - - - - @Test - public void defaultConstructorTest() { - System.setProperty("rocketmq.home.dir", "src/test/resources"); - AclRemotingService defaultAclService = new DefaultAclRemotingServiceImpl(); - Assert.assertNotNull(defaultAclService); - } - - @Test - public void parseTest() { - RemotingCommand remotingCommand = RemotingCommand.createResponseCommand(34, ""); - HashMap map = new HashMap<>(); - map.put("account", "RocketMQ"); - map.put("password","123456"); - map.put("topic","test"); - remotingCommand.setExtFields(map); - - AccessResource accessResource = accessValidator.parse(remotingCommand, "127.0.0.1:123"); - AccessControl accessControl = (AccessControl)accessResource; - AccessControl newAccessControl = new AccessControl(); - newAccessControl.setAccount("RocketMQ"); - newAccessControl.setPassword("123456"); - newAccessControl.setTopic("test"); - newAccessControl.setCode(34); - newAccessControl.setNetaddress("127.0.0.1"); - newAccessControl.setRecognition("127.0.0.1:123"); - Assert.assertEquals(accessControl.toString(), newAccessControl.toString()); - } - - @Test - public void checkTest() { - accessControl.setCode(34); - AuthenticationResult authenticationResult = defaultAclService.check(accessControl); - Assert.assertTrue(authenticationResult.isSucceed()); - } - - @Test(expected=AclPlugRuntimeException.class) - public void checkAccessExceptionTest() { - accessControl.setCode(34); - accessControl.setAccount("Rocketmq"); - defaultAclService.check(accessControl); - } - - @Test(expected=AclPlugRuntimeException.class) - public void checkPasswordTest() { - accessControl.setCode(34); - accessControl.setPassword("123123123"); - defaultAclService.check(accessControl); - } - - @Test(expected=AclPlugRuntimeException.class) - public void checkCodeTest() { - accessControl.setCode(14434); - accessControl.setPassword("123123123"); - defaultAclService.check(accessControl); - } - - - @Test - public void validateTest() { - accessControl.setCode(34); - accessValidator.validate(accessControl); - } - - @Test(expected=AclPlugRuntimeException.class) - public void validateAccessExceptionTest() { - accessControl.setCode(34); - accessControl.setAccount("Rocketmq"); - accessValidator.validate(accessControl); - } - - @Test(expected=AclPlugRuntimeException.class) - public void validatePasswordTest() { - accessControl.setCode(34); - accessControl.setPassword("123123123"); - accessValidator.validate(accessControl); - } - - @Test(expected=AclPlugRuntimeException.class) - public void validateCodeTest() { - accessControl.setCode(14434); - accessControl.setPassword("123123123"); - accessValidator.validate(accessControl); - } + } + + + @Test + public void defaultConstructorTest() { + System.setProperty("rocketmq.home.dir", "src/test/resources"); + AclRemotingService defaultAclService = new DefaultAclRemotingServiceImpl(); + Assert.assertNotNull(defaultAclService); + } + + @Test + public void parseTest() { + RemotingCommand remotingCommand = RemotingCommand.createResponseCommand(34, ""); + HashMap map = new HashMap<>(); + map.put("account", "RocketMQ"); + map.put("password", "123456"); + map.put("topic", "test"); + remotingCommand.setExtFields(map); + + AccessResource accessResource = accessValidator.parse(remotingCommand, "127.0.0.1:123"); + AccessControl accessControl = (AccessControl) accessResource; + AccessControl newAccessControl = new AccessControl(); + newAccessControl.setAccount("RocketMQ"); + newAccessControl.setPassword("123456"); + newAccessControl.setTopic("test"); + newAccessControl.setCode(34); + newAccessControl.setNetaddress("127.0.0.1"); + newAccessControl.setRecognition("127.0.0.1:123"); + Assert.assertEquals(accessControl.toString(), newAccessControl.toString()); + } + + @Test + public void checkTest() { + accessControl.setCode(34); + AuthenticationResult authenticationResult = defaultAclService.check(accessControl); + Assert.assertTrue(authenticationResult.isSucceed()); + } + + @Test(expected = AclPlugRuntimeException.class) + public void checkAccessExceptionTest() { + accessControl.setCode(34); + accessControl.setAccount("Rocketmq"); + defaultAclService.check(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void checkPasswordTest() { + accessControl.setCode(34); + accessControl.setPassword("123123123"); + defaultAclService.check(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void checkCodeTest() { + accessControl.setCode(14434); + accessControl.setPassword("123123123"); + defaultAclService.check(accessControl); + } + + + @Test + public void validateTest() { + accessControl.setCode(34); + accessValidator.validate(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void validateAccessExceptionTest() { + accessControl.setCode(34); + accessControl.setAccount("Rocketmq"); + accessValidator.validate(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void validatePasswordTest() { + accessControl.setCode(34); + accessControl.setPassword("123123123"); + accessValidator.validate(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void validateCodeTest() { + accessControl.setCode(14434); + accessControl.setPassword("123123123"); + accessValidator.validate(accessControl); + } } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java index 806d180894..b0cc4daba1 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java @@ -18,13 +18,12 @@ package org.apache.rocketmq.acl.plug; import java.util.ArrayList; import java.util.List; + import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; -@RunWith(MockitoJUnitRunner.class) + public class AclUtilsTest { @Test diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index c925ef412d..83004bc2c2 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -57,46 +57,14 @@ public class PlainAclPlugEngineTest { @Before public void init() throws NoSuchFieldException, SecurityException, IOException { + System.setProperty("rocketmq.home.dir", "src/test/resources"); + ControllerParameters controllerParametersEntity = new ControllerParameters(); Yaml ymal = new Yaml(); - String home = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - InputStream fis = null; - if (home == null) { - URL url = PlainAclPlugEngineTest.class.getResource("/"); - home = url.toString(); - home = home.substring(0, home.length() - 1).replace("file:/", "").replace("target/test-classes", ""); - home = home + "src/test/resources"; - if (!new File(home + "/conf/transport.yml").exists()) { - home = "/home/travis/build/githublaohu/rocketmq/acl-plug/src/test/resources"; - } - } - String filePath = home + "/conf/transport.yml"; - try { - fis = new FileInputStream(new File(filePath)); - transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); - }catch(Exception e) { - AccessControl accessControl = new BorkerAccessControl(); - accessControl.setAccount("onlyNetAddress"); - accessControl.setPassword("aliyun11"); - accessControl.setNetaddress("127.0.0.1"); - accessControl.setRecognition("127.0.0.1:1"); + transport = ymal.loadAs(new FileInputStream(new File(controllerParametersEntity.getFileHome()+"/conf/transport.yml")), BorkerAccessControlTransport.class); + + plainAclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); + plainAclPlugEngine.initialize(); - AccessControl accessControlTwo = new BorkerAccessControl(); - accessControlTwo.setAccount("listTransport"); - accessControlTwo.setPassword("aliyun1"); - accessControlTwo.setNetaddress("127.0.0.1"); - accessControlTwo.setRecognition("127.0.0.1:2"); - transport = new BorkerAccessControlTransport(); - transport.setOnlyNetAddress((BorkerAccessControl)accessControl); - - } - ControllerParameters controllerParametersEntity = new ControllerParameters(); - controllerParametersEntity.setFileHome(null); - try { - plainAclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); - plainAclPlugEngine.initialize(); - } catch (Exception e) { - - } accessControl = new BorkerAccessControl(); accessControl.setAccount("rokcetmq"); @@ -142,6 +110,7 @@ public class PlainAclPlugEngineTest { @Test(expected = AclPlugRuntimeException.class) public void testPlainAclPlugEngineInit() { ControllerParameters controllerParametersEntity = new ControllerParameters(); + controllerParametersEntity.setFileHome(""); new PlainAclPlugEngine(controllerParametersEntity).initialize(); } diff --git a/broker/pom.xml b/broker/pom.xml index c353eb32b8..f617d2492d 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -50,7 +50,7 @@ ${project.groupId} - rocketmq-acl-plug + rocketmq-acl ch.qos.logback diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index d06949ca1f..a6da44b641 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -32,7 +32,6 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.apache.rocketmq.acl.AccessValidator; -import org.apache.rocketmq.acl.plug.AclPlugController; import org.apache.rocketmq.broker.client.ClientHousekeepingService; import org.apache.rocketmq.broker.client.ConsumerIdsChangeListener; import org.apache.rocketmq.broker.client.ConsumerManager; diff --git a/pom.xml b/pom.xml index 38e518da28..aa8ed0e3d6 100644 --- a/pom.xml +++ b/pom.xml @@ -525,7 +525,7 @@ ${project.groupId} - rocketmq-acl-plug + rocketmq-acl ${project.version} From 212d247ddf05a9872f1b007c7a0e6fd28e2d2222 Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Fri, 2 Nov 2018 22:27:35 +0800 Subject: [PATCH 30/96] clean --- .../acl/plug/AclRemotingServiceTest.java | 16 ++++++++++++++++ .../org.apache.rocketmq.acl.AccessValidator | 1 - 2 files changed, 16 insertions(+), 1 deletion(-) delete mode 100644 broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java index ba0c8dc1c8..4830d6d75e 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java +++ b/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; import java.util.HashMap; diff --git a/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator b/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator deleted file mode 100644 index 2f26220e5e..0000000000 --- a/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator +++ /dev/null @@ -1 +0,0 @@ -org.apache.rocketmq.acl.plug.DefaultAclRemotingServiceImpl \ No newline at end of file From d23d2f75228097e59b4f96c93f67dafc62655eb4 Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Wed, 7 Nov 2018 16:21:33 +0800 Subject: [PATCH 31/96] clean --- pom.xml | 4 ++-- .../apache/rocketmq/remoting/netty/NettyRemotingClient.java | 2 +- .../apache/rocketmq/remoting/netty/NettyRemotingServer.java | 2 +- .../test/java/org/apache/rocketmq/test/base/BaseConf.java | 5 +++++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index aa8ed0e3d6..4fe56a4bc2 100644 --- a/pom.xml +++ b/pom.xml @@ -216,9 +216,9 @@ generate-effective-dependencies-pom generate-resources - + ${project.build.directory}/effective-pom/effective-dependencies.xml diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java index 90f51ff055..fc9df37c65 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java @@ -282,7 +282,7 @@ public class NettyRemotingClient extends NettyRemotingAbstract implements Remoti @Override public void registerRPCHook(RPCHook rpcHook) { - if (!rpcHooks.contains(rpcHook)) { + if (rpcHook != null && !rpcHooks.contains(rpcHook)) { rpcHooks.add(rpcHook); } } diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java index ec34a4be7a..c2f3ba48d0 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java @@ -265,7 +265,7 @@ public class NettyRemotingServer extends NettyRemotingAbstract implements Remoti @Override public void registerRPCHook(RPCHook rpcHook) { - if (!rpcHooks.contains(rpcHook)) { + if (rpcHook != null && !rpcHooks.contains(rpcHook)) { rpcHooks.add(rpcHook); } } diff --git a/test/src/test/java/org/apache/rocketmq/test/base/BaseConf.java b/test/src/test/java/org/apache/rocketmq/test/base/BaseConf.java index 5027a3cce0..a05a55a06b 100644 --- a/test/src/test/java/org/apache/rocketmq/test/base/BaseConf.java +++ b/test/src/test/java/org/apache/rocketmq/test/base/BaseConf.java @@ -19,9 +19,13 @@ package org.apache.rocketmq.test.base; import java.util.ArrayList; import java.util.List; + import org.apache.log4j.Logger; import org.apache.rocketmq.broker.BrokerController; +import org.apache.rocketmq.common.MQVersion; import org.apache.rocketmq.namesrv.NamesrvController; +import org.apache.rocketmq.remoting.netty.TlsSystemConfig; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.test.client.rmq.RMQAsyncSendProducer; import org.apache.rocketmq.test.client.rmq.RMQNormalConsumer; import org.apache.rocketmq.test.client.rmq.RMQNormalProducer; @@ -48,6 +52,7 @@ public class BaseConf { private static Logger log = Logger.getLogger(BaseConf.class); static { + System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION)); namesrvController = IntegrationTestBase.createAndStartNamesrv(); nsAddr = "127.0.0.1:" + namesrvController.getNettyServerConfig().getListenPort(); brokerController1 = IntegrationTestBase.createAndStartBroker(nsAddr); From 94403714ee1ca4c9640171c28bc6c275e0525729 Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Thu, 8 Nov 2018 13:03:03 +0800 Subject: [PATCH 32/96] add acl use example. AclClient.java --- acl-plug/pom.xml | 2 +- .../plug/DefaultAclRemotingServiceImpl.java | 20 +- distribution/conf/transport.yml | 8 +- .../rocketmq/example/simple/AclClient.java | 209 ++++++++++++++++++ 4 files changed, 226 insertions(+), 13 deletions(-) create mode 100644 example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java diff --git a/acl-plug/pom.xml b/acl-plug/pom.xml index 762d7a1910..d91d420340 100644 --- a/acl-plug/pom.xml +++ b/acl-plug/pom.xml @@ -19,7 +19,7 @@ 4.4.0-SNAPSHOT rocketmq-acl - rocketmq-acl-plug ${project.version} + rocketmq-acl ${project.version} http://maven.apache.org diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java index 8abf35a30b..eb657c0a18 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java @@ -61,10 +61,10 @@ public class DefaultAclRemotingServiceImpl implements AclRemotingService, Access AccessControl accessControl = new AccessControl(); accessControl.setCode(request.getCode()); accessControl.setRecognition(remoteAddr); + accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); if (extFields != null) { accessControl.setAccount(extFields.get("account")); accessControl.setPassword(extFields.get("password")); - accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); accessControl.setTopic(extFields.get("topic")); } return accessControl; @@ -72,13 +72,17 @@ public class DefaultAclRemotingServiceImpl implements AclRemotingService, Access @Override public void validate(AccessResource accessResource) { - AuthenticationResult authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); - if (authenticationResult.getException() != null) { - throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); - } - if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { - throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); - } + try { + AuthenticationResult authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); + if (authenticationResult.getException() != null) { + throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); + } + if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { + throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); + } + }catch(Exception e) { + throw new AclPlugRuntimeException(String.format("validate exception AccessResource data %s", accessResource.toString()) , e); + } } } diff --git a/distribution/conf/transport.yml b/distribution/conf/transport.yml index f86e68d411..f8180ede02 100644 --- a/distribution/conf/transport.yml +++ b/distribution/conf/transport.yml @@ -14,20 +14,20 @@ # limitations under the License. onlyNetAddress: - netaddress: 127.0.0.* + netaddress: 192.168.0.* noPermitPullTopic: - broker-a list: - account: RocketMQ password: 1234567 - netaddress: 192.0.0.* + netaddress: 192.168.0.* permitSendTopic: - - test1 + - TopicTest - test2 - account: RocketMQ password: 1234567 - netaddress: 192.0.2.1 + netaddress: 192.168.2.1 permitSendTopic: - test3 - test4 diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java new file mode 100644 index 0000000000..df5e7b90be --- /dev/null +++ b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java @@ -0,0 +1,209 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.example.simple; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer; +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.PullResult; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.client.consumer.rebalance.AllocateMessageQueueAveragely; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.consumer.ConsumeFromWhere; +import org.apache.rocketmq.common.message.Message; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.common.message.MessageQueue; +import org.apache.rocketmq.remoting.RPCHook; +import org.apache.rocketmq.remoting.common.RemotingHelper; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; + +/** + * 1. 把broker模块src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator 复制到src/java/resources/META-INF/service + * 2. 查看distribution模块下 /conf/transport.yml文件,注意里面的账户密码,ip + * 3. 把ALC_RCP_HOOK_ACCOUT与ACL_RCP_HOOK_PASSWORD 修改成transport.yml里面对应的账户密码 + * @author laohu + * + */ +public class AclClient { + + private static final Map OFFSE_TABLE = new HashMap(); + + private static String ALC_RCP_HOOK_ACCOUT = "RocketMQ"; + + private static String ACL_RCP_HOOK_PASSWORD = "1234567"; + + + + public static void main(String[] args) throws MQClientException, InterruptedException { + producer(); + pushConsumer(); + pullConsumer(); + } + + public static void producer() throws MQClientException { + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",getAalRPCHook()); + producer.setNamesrvAddr("127.0.0.1:9876"); + producer.start(); + + for (int i = 0; i < 128; i++) + try { + { + Message msg = new Message("TopicTest", + "TagA", + "OrderID188", + "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET)); + SendResult sendResult = producer.send(msg); + System.out.printf("%s%n", sendResult); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + producer.shutdown(); + } + + public static void pushConsumer() throws MQClientException { + + + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_5" , getAalRPCHook(),new AllocateMessageQueueAveragely()); + consumer.setNamesrvAddr("127.0.0.1:9876"); + consumer.subscribe("TopicTest", "*"); + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); + //wrong time format 2017_0422_221800 + consumer.setConsumeTimestamp("20180422221800"); + consumer.registerMessageListener(new MessageListenerConcurrently() { + + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); + printBody(msgs); + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + consumer.start(); + System.out.printf("Consumer Started.%n"); + } + + public static void pullConsumer() throws MQClientException { + DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("please_rename_unique_group_name_6" , getAalRPCHook()); + consumer.setNamesrvAddr("127.0.0.1:9876"); + consumer.start(); + + Set mqs = consumer.fetchSubscribeMessageQueues("TopicTest"); + for (MessageQueue mq : mqs) { + System.out.printf("Consume from the queue: %s%n", mq); + SINGLE_MQ: + while (true) { + try { + PullResult pullResult = + consumer.pullBlockIfNotFound(mq, null, getMessageQueueOffset(mq), 32); + System.out.printf("%s%n", pullResult); + putMessageQueueOffset(mq, pullResult.getNextBeginOffset()); + printBody(pullResult); + switch (pullResult.getPullStatus()) { + case FOUND: + break; + case NO_MATCHED_MSG: + break; + case NO_NEW_MSG: + break SINGLE_MQ; + case OFFSET_ILLEGAL: + break; + default: + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + consumer.shutdown(); + } + + private static void printBody(PullResult pullResult) { + printBody(pullResult.getMsgFoundList()); + } + + private static void printBody(List msg) { + if(msg == null || msg.size() == 0) + return; + for(MessageExt m : msg) { + if(m != null) { + System.out.printf("msgId : %s body : %s",m.getMsgId() , new String(m.getBody())); + System.out.println(); + } + } + } + + private static long getMessageQueueOffset(MessageQueue mq) { + Long offset = OFFSE_TABLE.get(mq); + if (offset != null) + return offset; + + return 0; + } + + private static void putMessageQueueOffset(MessageQueue mq, long offset) { + OFFSE_TABLE.put(mq, offset); + } + + static RPCHook getAalRPCHook() { + return new AalRPCHook(ALC_RCP_HOOK_ACCOUT, ACL_RCP_HOOK_PASSWORD); + } + + + static class AalRPCHook implements RPCHook{ + + private String account; + + private String password; + + public AalRPCHook(String account , String password) { + this.account = account; + this.password = password; + } + + @Override + public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + + HashMap ext = request.getExtFields(); + if(ext == null) { + ext = new HashMap<>(); + request.setExtFields(ext); + } + ext.put("account", this.account); + ext.put("password", this.password); + } + + @Override + public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { + // TODO Auto-generated method stub + + } + + } +} From 11d3df66ec4a38c9df196e3aeddf8d63fdef706d Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Thu, 8 Nov 2018 15:21:42 +0800 Subject: [PATCH 33/96] add acl use example. AclClient.java --- .../plug/DefaultAclRemotingServiceImpl.java | 25 +- .../rocketmq/example/simple/AclClient.java | 301 +++++++++--------- 2 files changed, 161 insertions(+), 165 deletions(-) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java index eb657c0a18..0d5f949c98 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java +++ b/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java @@ -16,6 +16,7 @@ */ package org.apache.rocketmq.acl.plug; +import java.util.HashMap; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.AccessResource; import org.apache.rocketmq.acl.AccessValidator; @@ -27,8 +28,6 @@ import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import java.util.HashMap; - public class DefaultAclRemotingServiceImpl implements AclRemotingService, AccessValidator { private AclPlugEngine aclPlugEngine; @@ -72,17 +71,17 @@ public class DefaultAclRemotingServiceImpl implements AclRemotingService, Access @Override public void validate(AccessResource accessResource) { - try { - AuthenticationResult authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); - if (authenticationResult.getException() != null) { - throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); - } - if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { - throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); - } - }catch(Exception e) { - throw new AclPlugRuntimeException(String.format("validate exception AccessResource data %s", accessResource.toString()) , e); - } + try { + AuthenticationResult authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); + if (authenticationResult.getException() != null) { + throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); + } + if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { + throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); + } + } catch (Exception e) { + throw new AclPlugRuntimeException(String.format("validate exception AccessResource data %s", accessResource.toString()), e); + } } } diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java index df5e7b90be..d696c91a92 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java @@ -20,7 +20,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; - import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.PullResult; @@ -40,170 +39,168 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; import org.apache.rocketmq.remoting.protocol.RemotingCommand; /** - * 1. 把broker模块src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator 复制到src/java/resources/META-INF/service - * 2. 查看distribution模块下 /conf/transport.yml文件,注意里面的账户密码,ip - * 3. 把ALC_RCP_HOOK_ACCOUT与ACL_RCP_HOOK_PASSWORD 修改成transport.yml里面对应的账户密码 - * @author laohu + * + * English explain + * 1. broker module src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator copy to src/java/resources/META-INF/service. + * + * 2. view the /conf/transport.yml file under the distribution module, pay attention to the account password, IP. + * + * 3. Modify ALC_RCP_HOOK_ACCOUT and ACL_RCP_HOOK_PASSWORD to the corresponding account password in transport.yml * */ public class AclClient { - - private static final Map OFFSE_TABLE = new HashMap(); - private static String ALC_RCP_HOOK_ACCOUT = "RocketMQ"; - - private static String ACL_RCP_HOOK_PASSWORD = "1234567"; - - - - public static void main(String[] args) throws MQClientException, InterruptedException { - producer(); - pushConsumer(); - pullConsumer(); - } - - public static void producer() throws MQClientException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",getAalRPCHook()); - producer.setNamesrvAddr("127.0.0.1:9876"); - producer.start(); + private static final Map OFFSE_TABLE = new HashMap(); - for (int i = 0; i < 128; i++) - try { - { - Message msg = new Message("TopicTest", - "TagA", - "OrderID188", - "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET)); - SendResult sendResult = producer.send(msg); - System.out.printf("%s%n", sendResult); - } + private static final String ACL_RCPHOOK_ACCOUT = "RocketMQ"; - } catch (Exception e) { - e.printStackTrace(); - } + private static final String ACL_RCPHOOK_PASSWORD = "1234567"; - producer.shutdown(); - } - - public static void pushConsumer() throws MQClientException { + public static void main(String[] args) throws MQClientException, InterruptedException { + producer(); + pushConsumer(); + pullConsumer(); + } - - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_5" , getAalRPCHook(),new AllocateMessageQueueAveragely()); - consumer.setNamesrvAddr("127.0.0.1:9876"); - consumer.subscribe("TopicTest", "*"); - consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - //wrong time format 2017_0422_221800 - consumer.setConsumeTimestamp("20180422221800"); - consumer.registerMessageListener(new MessageListenerConcurrently() { + public static void producer() throws MQClientException { + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName", getAalRPCHook()); + producer.setNamesrvAddr("127.0.0.1:9876"); + producer.start(); - @Override - public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { - System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); - printBody(msgs); - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - }); - consumer.start(); - System.out.printf("Consumer Started.%n"); - } - - public static void pullConsumer() throws MQClientException { - DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("please_rename_unique_group_name_6" , getAalRPCHook()); - consumer.setNamesrvAddr("127.0.0.1:9876"); - consumer.start(); + for (int i = 0; i < 128; i++) + try { + { + Message msg = new Message("TopicTest", + "TagA", + "OrderID188", + "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET)); + SendResult sendResult = producer.send(msg); + System.out.printf("%s%n", sendResult); + } - Set mqs = consumer.fetchSubscribeMessageQueues("TopicTest"); - for (MessageQueue mq : mqs) { - System.out.printf("Consume from the queue: %s%n", mq); - SINGLE_MQ: - while (true) { - try { - PullResult pullResult = - consumer.pullBlockIfNotFound(mq, null, getMessageQueueOffset(mq), 32); - System.out.printf("%s%n", pullResult); - putMessageQueueOffset(mq, pullResult.getNextBeginOffset()); - printBody(pullResult); - switch (pullResult.getPullStatus()) { - case FOUND: - break; - case NO_MATCHED_MSG: - break; - case NO_NEW_MSG: - break SINGLE_MQ; - case OFFSET_ILLEGAL: - break; - default: - break; - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } + } catch (Exception e) { + e.printStackTrace(); + } - consumer.shutdown(); - } - - private static void printBody(PullResult pullResult) { - printBody(pullResult.getMsgFoundList()); - } - - private static void printBody(List msg) { - if(msg == null || msg.size() == 0) - return; - for(MessageExt m : msg) { - if(m != null) { - System.out.printf("msgId : %s body : %s",m.getMsgId() , new String(m.getBody())); - System.out.println(); - } - } - } - - private static long getMessageQueueOffset(MessageQueue mq) { - Long offset = OFFSE_TABLE.get(mq); - if (offset != null) - return offset; + producer.shutdown(); + } - return 0; - } + public static void pushConsumer() throws MQClientException { - private static void putMessageQueueOffset(MessageQueue mq, long offset) { - OFFSE_TABLE.put(mq, offset); - } - - static RPCHook getAalRPCHook() { - return new AalRPCHook(ALC_RCP_HOOK_ACCOUT, ACL_RCP_HOOK_PASSWORD); - } - - - static class AalRPCHook implements RPCHook{ + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_5", getAalRPCHook(), new AllocateMessageQueueAveragely()); + consumer.setNamesrvAddr("127.0.0.1:9876"); + consumer.subscribe("TopicTest", "*"); + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); + //wrong time format 2017_0422_221800 + consumer.setConsumeTimestamp("20180422221800"); + consumer.registerMessageListener(new MessageListenerConcurrently() { - private String account; - - private String password; - - public AalRPCHook(String account , String password) { - this.account = account; - this.password = password; - } - - @Override - public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - - HashMap ext = request.getExtFields(); - if(ext == null) { - ext = new HashMap<>(); - request.setExtFields(ext); - } - ext.put("account", this.account); - ext.put("password", this.password); - } + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); + printBody(msgs); + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + consumer.start(); + System.out.printf("Consumer Started.%n"); + } - @Override - public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { - // TODO Auto-generated method stub - - } - - } + public static void pullConsumer() throws MQClientException { + DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("please_rename_unique_group_name_6", getAalRPCHook()); + consumer.setNamesrvAddr("127.0.0.1:9876"); + consumer.start(); + + Set mqs = consumer.fetchSubscribeMessageQueues("TopicTest"); + for (MessageQueue mq : mqs) { + System.out.printf("Consume from the queue: %s%n", mq); + SINGLE_MQ: + while (true) { + try { + PullResult pullResult = + consumer.pullBlockIfNotFound(mq, null, getMessageQueueOffset(mq), 32); + System.out.printf("%s%n", pullResult); + putMessageQueueOffset(mq, pullResult.getNextBeginOffset()); + printBody(pullResult); + switch (pullResult.getPullStatus()) { + case FOUND: + break; + case NO_MATCHED_MSG: + break; + case NO_NEW_MSG: + break SINGLE_MQ; + case OFFSET_ILLEGAL: + break; + default: + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + consumer.shutdown(); + } + + private static void printBody(PullResult pullResult) { + printBody(pullResult.getMsgFoundList()); + } + + private static void printBody(List msg) { + if (msg == null || msg.size() == 0) + return; + for (MessageExt m : msg) { + if (m != null) { + System.out.printf("msgId : %s body : %s \n\r", m.getMsgId(), new String(m.getBody())); + } + } + } + + private static long getMessageQueueOffset(MessageQueue mq) { + Long offset = OFFSE_TABLE.get(mq); + if (offset != null) + return offset; + + return 0; + } + + private static void putMessageQueueOffset(MessageQueue mq, long offset) { + OFFSE_TABLE.put(mq, offset); + } + + static RPCHook getAalRPCHook() { + return new AalRPCHook(ACL_RCPHOOK_ACCOUT, ACL_RCPHOOK_PASSWORD); + } + + static class AalRPCHook implements RPCHook { + + private String account; + + private String password; + + public AalRPCHook(String account, String password) { + this.account = account; + this.password = password; + } + + @Override + public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + + HashMap ext = request.getExtFields(); + if (ext == null) { + ext = new HashMap<>(); + request.setExtFields(ext); + } + ext.put("account", this.account); + ext.put("password", this.password); + } + + @Override + public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { + // TODO Auto-generated method stub + + } + + } } From 2a93a9bfd3aec74189cd6707d145dec96a8c57c5 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Fri, 9 Nov 2018 16:51:05 +0800 Subject: [PATCH 34/96] Polish acl --- .../rocketmq/acl/DefaultAccessValidator.java | 33 ------------------- {acl-plug => acl}/pom.xml | 1 - .../apache/rocketmq/acl/AccessResource.java | 0 .../apache/rocketmq/acl/AccessValidator.java | 0 .../rocketmq/acl/PlainAccessValidator.java | 9 ++--- .../acl/plug/AccessContralAnalysis.java | 0 .../rocketmq/acl/plug/AclPlugController.java | 3 +- .../rocketmq/acl/plug/AclRemotingService.java | 0 .../apache/rocketmq/acl/plug/AclUtils.java | 0 .../rocketmq/acl/plug/Authentication.java | 0 .../acl/plug/engine/AclPlugEngine.java | 0 ...enticationInfoManagementAclPlugEngine.java | 0 .../plug/engine/LoginInfoAclPlugEngine.java | 0 .../acl/plug/engine/PlainAclPlugEngine.java | 0 .../acl/plug/entity/AccessControl.java | 0 .../acl/plug/entity/AuthenticationInfo.java | 0 .../acl/plug/entity/AuthenticationResult.java | 0 .../acl/plug/entity/BorkerAccessControl.java | 0 .../entity/BorkerAccessControlTransport.java | 0 .../acl/plug/entity/ControllerParameters.java | 0 .../rocketmq/acl/plug/entity/LoginInfo.java | 0 .../exception/AclPlugRuntimeException.java | 0 .../acl/plug/strategy/NetaddressStrategy.java | 0 .../strategy/NetaddressStrategyFactory.java | 0 .../acl/plug/AccessContralAnalysisTest.java | 0 .../acl/plug/AclPlugControllerTest.java | 0 .../acl/plug/AclRemotingServiceTest.java | 5 +-- .../rocketmq/acl/plug/AclUtilsTest.java | 0 .../rocketmq/acl/plug/AuthenticationTest.java | 0 .../plug/engine/PlainAclPlugEngineTest.java | 0 .../plug/strategy/NetaddressStrategyTest.java | 0 .../src/test/resources/conf/transport.yml | 0 .../org.apache.rocketmq.acl.AccessValidator | 2 +- .../rocketmq/example/simple/AclClient.java | 16 ++++----- pom.xml | 7 +++- 35 files changed, 25 insertions(+), 51 deletions(-) delete mode 100644 acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java rename {acl-plug => acl}/pom.xml (98%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/AccessResource.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/AccessValidator.java (100%) rename acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java => acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java (93%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java (94%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java (100%) rename {acl-plug => acl}/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java (100%) rename {acl-plug => acl}/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java (100%) rename {acl-plug => acl}/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java (100%) rename {acl-plug => acl}/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java (96%) rename {acl-plug => acl}/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java (100%) rename {acl-plug => acl}/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java (100%) rename {acl-plug => acl}/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java (100%) rename {acl-plug => acl}/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java (100%) rename {acl-plug => acl}/src/test/resources/conf/transport.yml (100%) diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java b/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java deleted file mode 100644 index 704ace47b7..0000000000 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/DefaultAccessValidator.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl; - -import org.apache.rocketmq.remoting.protocol.RemotingCommand; - -public class DefaultAccessValidator implements AccessValidator { - - @Override - public AccessResource parse(RemotingCommand request, String remoteAddr) { - return null; - } - - @Override - public void validate(AccessResource accessResource) { - - } -} diff --git a/acl-plug/pom.xml b/acl/pom.xml similarity index 98% rename from acl-plug/pom.xml rename to acl/pom.xml index d91d420340..3d8d4a7d75 100644 --- a/acl-plug/pom.xml +++ b/acl/pom.xml @@ -42,7 +42,6 @@ org.yaml snakeyaml - 1.19 org.apache.commons diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessResource.java b/acl/src/main/java/org/apache/rocketmq/acl/AccessResource.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/AccessResource.java rename to acl/src/main/java/org/apache/rocketmq/acl/AccessResource.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/AccessValidator.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/AccessValidator.java rename to acl/src/main/java/org/apache/rocketmq/acl/AccessValidator.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java similarity index 93% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java rename to acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java index 0d5f949c98..b8de0d345a 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/DefaultAclRemotingServiceImpl.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java @@ -14,12 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl; import java.util.HashMap; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.AccessResource; import org.apache.rocketmq.acl.AccessValidator; +import org.apache.rocketmq.acl.plug.AclRemotingService; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; import org.apache.rocketmq.acl.plug.entity.AccessControl; @@ -28,17 +29,17 @@ import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.remoting.protocol.RemotingCommand; -public class DefaultAclRemotingServiceImpl implements AclRemotingService, AccessValidator { +public class PlainAccessValidator implements AclRemotingService, AccessValidator { private AclPlugEngine aclPlugEngine; - public DefaultAclRemotingServiceImpl() { + public PlainAccessValidator() { ControllerParameters controllerParameters = new ControllerParameters(); this.aclPlugEngine = new PlainAclPlugEngine(controllerParameters); this.aclPlugEngine.initialize(); } - public DefaultAclRemotingServiceImpl(AclPlugEngine aclPlugEngine) { + public PlainAccessValidator(AclPlugEngine aclPlugEngine) { this.aclPlugEngine = aclPlugEngine; } diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java similarity index 94% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java index 1ec1f1e998..8598e93e9c 100644 --- a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java @@ -16,6 +16,7 @@ */ package org.apache.rocketmq.acl.plug; +import org.apache.rocketmq.acl.PlainAccessValidator; import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; import org.apache.rocketmq.acl.plug.entity.ControllerParameters; @@ -36,7 +37,7 @@ public class AclPlugController { this.controllerParameters = controllerParameters; aclPlugEngine = new PlainAclPlugEngine(controllerParameters); aclPlugEngine.initialize(); - aclRemotingService = new DefaultAclRemotingServiceImpl(aclPlugEngine); + aclRemotingService = new PlainAccessValidator(aclPlugEngine); this.startSucceed = true; } catch (Exception e) { throw new AclPlugRuntimeException(String.format("Start the abnormal , Launch parameters is %s", this.controllerParameters.toString()), e); diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java diff --git a/acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java similarity index 100% rename from acl-plug/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java similarity index 100% rename from acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java similarity index 100% rename from acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java similarity index 96% rename from acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java index 4830d6d75e..37aa38b591 100644 --- a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java @@ -20,6 +20,7 @@ import java.util.HashMap; import org.apache.rocketmq.acl.AccessResource; import org.apache.rocketmq.acl.AccessValidator; +import org.apache.rocketmq.acl.PlainAccessValidator; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; @@ -43,7 +44,7 @@ public class AclRemotingServiceTest { @Before public void init() { System.setProperty("rocketmq.home.dir", "src/test/resources"); - DefaultAclRemotingServiceImpl aclRemotingServiceImpl = new DefaultAclRemotingServiceImpl(); + PlainAccessValidator aclRemotingServiceImpl = new PlainAccessValidator(); defaultAclService = aclRemotingServiceImpl; accessValidator = aclRemotingServiceImpl; @@ -64,7 +65,7 @@ public class AclRemotingServiceTest { @Test public void defaultConstructorTest() { System.setProperty("rocketmq.home.dir", "src/test/resources"); - AclRemotingService defaultAclService = new DefaultAclRemotingServiceImpl(); + AclRemotingService defaultAclService = new PlainAccessValidator(); Assert.assertNotNull(defaultAclService); } diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java similarity index 100% rename from acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java similarity index 100% rename from acl-plug/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java similarity index 100% rename from acl-plug/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java diff --git a/acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java similarity index 100% rename from acl-plug/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java diff --git a/acl-plug/src/test/resources/conf/transport.yml b/acl/src/test/resources/conf/transport.yml similarity index 100% rename from acl-plug/src/test/resources/conf/transport.yml rename to acl/src/test/resources/conf/transport.yml diff --git a/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator b/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator index 2f26220e5e..bbf21d376c 100644 --- a/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator +++ b/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator @@ -1 +1 @@ -org.apache.rocketmq.acl.plug.DefaultAclRemotingServiceImpl \ No newline at end of file +org.apache.rocketmq.acl.DefaultAclRemotingServiceImpl \ No newline at end of file diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java index d696c91a92..fa0bf0a1e1 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java @@ -63,7 +63,7 @@ public class AclClient { } public static void producer() throws MQClientException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName", getAalRPCHook()); + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName", getAclRPCHook()); producer.setNamesrvAddr("127.0.0.1:9876"); producer.start(); @@ -87,7 +87,7 @@ public class AclClient { public static void pushConsumer() throws MQClientException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_5", getAalRPCHook(), new AllocateMessageQueueAveragely()); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_5", getAclRPCHook(), new AllocateMessageQueueAveragely()); consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.subscribe("TopicTest", "*"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); @@ -107,7 +107,7 @@ public class AclClient { } public static void pullConsumer() throws MQClientException { - DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("please_rename_unique_group_name_6", getAalRPCHook()); + DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("please_rename_unique_group_name_6", getAclRPCHook()); consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.start(); @@ -169,17 +169,17 @@ public class AclClient { OFFSE_TABLE.put(mq, offset); } - static RPCHook getAalRPCHook() { - return new AalRPCHook(ACL_RCPHOOK_ACCOUT, ACL_RCPHOOK_PASSWORD); + static RPCHook getAclRPCHook() { + return new AclRPCHook(ACL_RCPHOOK_ACCOUT, ACL_RCPHOOK_PASSWORD); } - static class AalRPCHook implements RPCHook { + static class AclRPCHook implements RPCHook { private String account; private String password; - public AalRPCHook(String account, String password) { + public AclRPCHook(String account, String password) { this.account = account; this.password = password; } @@ -198,7 +198,7 @@ public class AclClient { @Override public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { - // TODO Auto-generated method stub + //do nothing } diff --git a/pom.xml b/pom.xml index 4fe56a4bc2..84f45fd85d 100644 --- a/pom.xml +++ b/pom.xml @@ -126,7 +126,7 @@ distribution openmessaging logging - acl-plug + acl @@ -588,6 +588,11 @@ log4j 1.2.17 + + org.yaml + snakeyaml + 1.19 + org.apache.logging.log4j log4j-core From e04db85e6600e58966b4492d36cce43c674ae023 Mon Sep 17 00:00:00 2001 From: huzongtang Date: Wed, 14 Nov 2018 00:16:40 +0800 Subject: [PATCH 35/96] I have finished developing the new feature for the message track #525 initially. --- .../processor/AdminBrokerProcessor.java | 8 + .../broker/topic/TopicConfigManager.java | 11 + .../consumer/DefaultMQPushConsumer.java | 64 +++- .../client/impl/factory/MQClientInstance.java | 2 +- .../client/producer/DefaultMQProducer.java | 67 +++- .../producer/TransactionMQProducer.java | 4 +- .../trace/core/Utils/TrackTraceUtils.java | 105 +++++ .../trace/core/common/TrackTraceBean.java | 144 +++++++ .../core/common/TrackTraceConstants.java | 34 ++ .../trace/core/common/TrackTraceContext.java | 136 +++++++ .../core/common/TrackTraceDataEncoder.java | 175 +++++++++ .../core/common/TrackTraceDispatcherType.java | 22 ++ .../core/common/TrackTraceTransferBean.java | 44 +++ .../trace/core/common/TrackTraceType.java | 26 ++ .../trace/core/dispatch/AsyncDispatcher.java | 51 +++ .../dispatch/impl/AsyncArrayDispatcher.java | 358 ++++++++++++++++++ .../impl/TrackTraceProducerFactory.java | 71 ++++ .../hook/ConsumeMessageTraceHookImpl.java | 113 ++++++ .../core/hook/SendMessageTrackHookImpl.java | 99 +++++ .../consumer/DefaultMQPushConsumerTest.java | 4 +- .../DefaultMQPushConsumerImplTest.java | 2 +- .../impl/consumer/RebalancePushImplTest.java | 2 +- .../producer/DefaultMQProducerTest.java | 4 +- .../trace/DefaultMQProducerWithTraceTest.java | 234 ++++++++++++ .../apache/rocketmq/common/BrokerConfig.java | 11 +- .../org/apache/rocketmq/common/MixAll.java | 4 +- .../conf/2m-noslave/broker-a.properties | 1 + .../conf/2m-noslave/broker-b.properties | 1 + .../conf/2m-noslave/broker-trace.properties | 24 ++ .../example/batch/SimpleBatchProducer.java | 2 +- .../example/batch/SplitBatchProducer.java | 2 +- .../rocketmq/example/benchmark/Consumer.java | 2 +- .../rocketmq/example/benchmark/Producer.java | 2 +- .../example/broadcast/PushConsumer.java | 2 +- .../rocketmq/example/filter/Consumer.java | 2 +- .../rocketmq/example/filter/Producer.java | 2 +- .../rocketmq/example/filter/SqlConsumer.java | 2 +- .../rocketmq/example/filter/SqlProducer.java | 2 +- .../rocketmq/example/operation/Consumer.java | 2 +- .../rocketmq/example/operation/Producer.java | 2 +- .../example/ordermessage/Consumer.java | 2 +- .../example/ordermessage/Producer.java | 2 +- .../rocketmq/example/quickstart/Consumer.java | 2 +- .../rocketmq/example/quickstart/Producer.java | 2 +- .../example/simple/AsyncProducer.java | 2 +- .../rocketmq/example/simple/Producer.java | 3 +- .../rocketmq/example/simple/PushConsumer.java | 6 +- .../rocketmq/example/simple/TestProducer.java | 2 +- .../logappender/common/ProducerInstance.java | 2 +- .../logappender/AbstractTestCase.java | 2 +- .../test/client/rmq/RMQNormalConsumer.java | 2 +- .../test/factory/ProducerFactory.java | 2 +- .../command/broker/SendMsgStatusCommand.java | 2 +- .../message/QueryMsgByIdSubCommand.java | 2 +- .../tools/monitor/MonitorService.java | 2 +- 55 files changed, 1827 insertions(+), 51 deletions(-) create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/Utils/TrackTraceUtils.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceContext.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDataEncoder.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDispatcherType.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceTransferBean.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/AsyncDispatcher.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/hook/ConsumeMessageTraceHookImpl.java create mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java create mode 100644 client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java create mode 100644 distribution/conf/2m-noslave/broker-trace.properties diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java index 73fe439427..9771ec9a9e 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java @@ -228,6 +228,14 @@ public class AdminBrokerProcessor implements NettyRequestProcessor { return response; } + if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { + String errorMsg = "the topic[" + requestHeader.getTopic() + "] is user self defined topic and this node is trace broker!"; + log.warn(errorMsg); + response.setCode(ResponseCode.SYSTEM_ERROR); + response.setRemark(errorMsg); + return response; + } + try { response.setCode(ResponseCode.SUCCESS); response.setOpaque(request.getOpaque()); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java index 59c7895eb7..4ce996b2cf 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java @@ -124,6 +124,17 @@ public class TopicConfigManager extends ConfigManager { topicConfig.setWriteQueueNums(1); this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); } + { + // MixAll.RMQ_SYS_TRACK_TRACE_TOPIC + if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { + String topic = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC; + TopicConfig topicConfig = new TopicConfig(topic); + this.systemTopicList.add(topic); + topicConfig.setReadQueueNums(1); + topicConfig.setWriteQueueNums(1); + this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); + } + } } public boolean isSystemTopic(final String topic) { diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index d51030a159..5ee2e33ffb 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -18,6 +18,7 @@ package org.apache.rocketmq.client.consumer; import java.util.HashMap; import java.util.Map; +import java.util.Properties; import java.util.Set; import org.apache.rocketmq.client.ClientConfig; import org.apache.rocketmq.client.QueryResult; @@ -29,6 +30,12 @@ import org.apache.rocketmq.client.consumer.store.OffsetStore; import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; +import org.apache.rocketmq.client.log.ClientLogger; +import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; +import org.apache.rocketmq.client.trace.core.common.TrackTraceDispatcherType; +import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; +import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; +import org.apache.rocketmq.client.trace.core.hook.ConsumeMessageTraceHookImpl; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.consumer.ConsumeFromWhere; @@ -36,6 +43,7 @@ import org.apache.rocketmq.common.message.MessageDecoder; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageQueue; import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; +import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.remoting.RPCHook; import org.apache.rocketmq.remoting.exception.RemotingException; @@ -56,6 +64,8 @@ import org.apache.rocketmq.remoting.exception.RemotingException; */ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsumer { + private final InternalLogger log = ClientLogger.getLog(); + /** * Internal implementation. Most of the functions herein are delegated to it. */ @@ -246,11 +256,16 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume */ private long consumeTimeout = 15; + /** + * Interface of asynchronous transfer data + */ + private AsyncDispatcher traceDispatcher = null; + /** * Default constructor. */ public DefaultMQPushConsumer() { - this(MixAll.DEFAULT_CONSUMER_GROUP, null, new AllocateMessageQueueAveragely()); + this(MixAll.DEFAULT_CONSUMER_GROUP, null, new AllocateMessageQueueAveragely(), false); } /** @@ -261,10 +276,29 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * @param allocateMessageQueueStrategy message queue allocating algorithm. */ public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, - AllocateMessageQueueStrategy allocateMessageQueueStrategy) { + AllocateMessageQueueStrategy allocateMessageQueueStrategy, boolean msgTraceSwitch) { this.consumerGroup = consumerGroup; this.allocateMessageQueueStrategy = allocateMessageQueueStrategy; defaultMQPushConsumerImpl = new DefaultMQPushConsumerImpl(this, rpcHook); + //if client open the message track trace feature + if (msgTraceSwitch) { + try { + Properties tempProperties = new Properties(); + tempProperties.put(TrackTraceConstants.MAX_MSG_SIZE, "128000"); + tempProperties.put(TrackTraceConstants.ASYNC_BUFFER_SIZE, "2048"); + tempProperties.put(TrackTraceConstants.MAX_BATCH_NUM, "100"); + tempProperties.put(TrackTraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); + tempProperties.put(TrackTraceConstants.TRACE_DISPATCHER_TYPE, TrackTraceDispatcherType.CONSUMER.name()); + AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties); + dispatcher.setHostConsumer(this.getDefaultMQPushConsumerImpl()); + traceDispatcher = dispatcher; + + this.getDefaultMQPushConsumerImpl().registerConsumeMessageHook( + new ConsumeMessageTraceHookImpl(traceDispatcher)); + } catch (Throwable e) { + log.error("system mqtrace hook init failed ,maybe can't send msg trace data"); + } + } } /** @@ -273,7 +307,7 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * @param rpcHook RPC hook to execute before each remoting command. */ public DefaultMQPushConsumer(RPCHook rpcHook) { - this(MixAll.DEFAULT_CONSUMER_GROUP, rpcHook, new AllocateMessageQueueAveragely()); + this(MixAll.DEFAULT_CONSUMER_GROUP, rpcHook, new AllocateMessageQueueAveragely(),false); } /** @@ -281,8 +315,8 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * * @param consumerGroup Consumer group. */ - public DefaultMQPushConsumer(final String consumerGroup) { - this(consumerGroup, null, new AllocateMessageQueueAveragely()); + public DefaultMQPushConsumer(final String consumerGroup, boolean msgTraceSwitch) { + this(consumerGroup, null, new AllocateMessageQueueAveragely(),msgTraceSwitch); } @Override @@ -518,6 +552,15 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume @Override public void start() throws MQClientException { this.defaultMQPushConsumerImpl.start(); + if (null != traceDispatcher) { + try { + Properties tempProperties = new Properties(); + tempProperties.put(TrackTraceConstants.NAMESRV_ADDR, this.getNamesrvAddr()); + traceDispatcher.start(tempProperties); + } catch (MQClientException e) { + log.warn("trace dispatcher start failed ", e); + } + } } /** @@ -526,6 +569,9 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume @Override public void shutdown() { this.defaultMQPushConsumerImpl.shutdown(); + if (null != traceDispatcher) { + traceDispatcher.shutdown(); + } } @Override @@ -694,4 +740,12 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume public void setConsumeTimeout(final long consumeTimeout) { this.consumeTimeout = consumeTimeout; } + + public AsyncDispatcher getTraceDispatcher() { + return traceDispatcher; + } + + public void setTraceDispatcher(AsyncDispatcher traceDispatcher) { + this.traceDispatcher = traceDispatcher; + } } diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java index 9ffaed0a4f..c35d9468de 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java @@ -144,7 +144,7 @@ public class MQClientInstance { this.rebalanceService = new RebalanceService(this); - this.defaultMQProducer = new DefaultMQProducer(MixAll.CLIENT_INNER_PRODUCER_GROUP); + this.defaultMQProducer = new DefaultMQProducer(MixAll.CLIENT_INNER_PRODUCER_GROUP,false); this.defaultMQProducer.resetClientConfig(clientConfig); this.consumerStatsManager = new ConsumerStatsManager(this.scheduledExecutorService); diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index 9732d0eb84..a2bacfb907 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -18,6 +18,7 @@ package org.apache.rocketmq.client.producer; import java.util.Collection; import java.util.List; +import java.util.Properties; import java.util.concurrent.ExecutorService; import org.apache.rocketmq.client.ClientConfig; import org.apache.rocketmq.client.QueryResult; @@ -25,6 +26,12 @@ import org.apache.rocketmq.client.Validators; import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; +import org.apache.rocketmq.client.log.ClientLogger; +import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; +import org.apache.rocketmq.client.trace.core.common.TrackTraceDispatcherType; +import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; +import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; +import org.apache.rocketmq.client.trace.core.hook.SendMessageTrackHookImpl; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageBatch; @@ -33,6 +40,7 @@ import org.apache.rocketmq.common.message.MessageDecoder; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageId; import org.apache.rocketmq.common.message.MessageQueue; +import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.remoting.RPCHook; import org.apache.rocketmq.remoting.exception.RemotingException; import org.apache.rocketmq.remoting.netty.NettyRemotingClient; @@ -56,6 +64,8 @@ import org.apache.rocketmq.remoting.netty.NettyRemotingClient; */ public class DefaultMQProducer extends ClientConfig implements MQProducer { + private final InternalLogger log = ClientLogger.getLog(); + /** * Wrapping internal implementations for virtually all methods presented in this class. */ @@ -119,11 +129,16 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { */ private int maxMessageSize = 1024 * 1024 * 4; // 4M + /** + * Interface of asynchronous transfer data + */ + private AsyncDispatcher traceDispatcher = null; + /** * Default constructor. */ public DefaultMQProducer() { - this(MixAll.DEFAULT_PRODUCER_GROUP, null); + this(MixAll.DEFAULT_PRODUCER_GROUP, null,false); } /** @@ -131,10 +146,30 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * * @param producerGroup Producer group, see the name-sake field. * @param rpcHook RPC hook to execute per each remoting command execution. + * @param msgTraceSwitch switch flag instance for message track trace */ - public DefaultMQProducer(final String producerGroup, RPCHook rpcHook) { + public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean msgTraceSwitch) { this.producerGroup = producerGroup; defaultMQProducerImpl = new DefaultMQProducerImpl(this, rpcHook); + //if client open the message track trace feature + if (msgTraceSwitch) { + try { + Properties tempProperties = new Properties(); + tempProperties.put(TrackTraceConstants.MAX_MSG_SIZE, "128000"); + tempProperties.put(TrackTraceConstants.ASYNC_BUFFER_SIZE, "2048"); + tempProperties.put(TrackTraceConstants.MAX_BATCH_NUM, "100"); + tempProperties.put(TrackTraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); + tempProperties.put(TrackTraceConstants.TRACE_DISPATCHER_TYPE, TrackTraceDispatcherType.PRODUCER.name()); + AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties); + dispatcher.setHostProducer(this.getDefaultMQProducerImpl()); + traceDispatcher = dispatcher; + + this.getDefaultMQProducerImpl().registerSendMessageHook( + new SendMessageTrackHookImpl(traceDispatcher)); + } catch (Throwable e) { + log.error("system mqtrace hook init failed ,maybe can't send msg trace data"); + } + } } /** @@ -142,17 +177,17 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * * @param producerGroup Producer group, see the name-sake field. */ - public DefaultMQProducer(final String producerGroup) { - this(producerGroup, null); + public DefaultMQProducer(final String producerGroup, boolean msgTraceSwitch) { + this(producerGroup, null,msgTraceSwitch); } /** * Constructor specifying the RPC hook. - * + * * @param rpcHook RPC hook to execute per each remoting command execution. */ public DefaultMQProducer(RPCHook rpcHook) { - this(MixAll.DEFAULT_PRODUCER_GROUP, rpcHook); + this(MixAll.DEFAULT_PRODUCER_GROUP, rpcHook,false); } /** @@ -170,6 +205,15 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { @Override public void start() throws MQClientException { this.defaultMQProducerImpl.start(); + if (null != traceDispatcher) { + try { + Properties tempProperties = new Properties(); + tempProperties.put(TrackTraceConstants.NAMESRV_ADDR, this.getNamesrvAddr()); + traceDispatcher.start(tempProperties); + } catch (MQClientException e) { + log.warn("trace dispatcher start failed ", e); + } + } } /** @@ -178,6 +222,9 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { @Override public void shutdown() { this.defaultMQProducerImpl.shutdown(); + if (null != traceDispatcher) { + traceDispatcher.shutdown(); + } } /** @@ -777,4 +824,12 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { public void setRetryTimesWhenSendAsyncFailed(final int retryTimesWhenSendAsyncFailed) { this.retryTimesWhenSendAsyncFailed = retryTimesWhenSendAsyncFailed; } + + public AsyncDispatcher getTraceDispatcher() { + return traceDispatcher; + } + + public void setTraceDispatcher(AsyncDispatcher traceDispatcher) { + this.traceDispatcher = traceDispatcher; + } } diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/TransactionMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/TransactionMQProducer.java index 8f6428b29c..f6030c9d26 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/TransactionMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/TransactionMQProducer.java @@ -35,11 +35,11 @@ public class TransactionMQProducer extends DefaultMQProducer { } public TransactionMQProducer(final String producerGroup) { - super(producerGroup); + super(producerGroup,false); } public TransactionMQProducer(final String producerGroup, RPCHook rpcHook) { - super(producerGroup, rpcHook); + super(producerGroup, rpcHook,false); } @Override diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/Utils/TrackTraceUtils.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/Utils/TrackTraceUtils.java new file mode 100644 index 0000000000..7d1d75b0dd --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/Utils/TrackTraceUtils.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.Utils; + +import org.apache.rocketmq.remoting.protocol.RemotingSerializable; + +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Enumeration; + +/** + * Track Trace Util + */ +public class TrackTraceUtils { + + public static String getLocalAddress() { + try { + //Traverse the network bind card to find a valid IP address and return it. + Enumeration enumeration = NetworkInterface.getNetworkInterfaces(); + ArrayList ipv4Result = new ArrayList(); + ArrayList ipv6Result = new ArrayList(); + while (enumeration.hasMoreElements()) { + final NetworkInterface networkInterface = enumeration.nextElement(); + final Enumeration en = networkInterface.getInetAddresses(); + while (en.hasMoreElements()) { + final InetAddress address = en.nextElement(); + if (!address.isLoopbackAddress()) { + if (address instanceof Inet6Address) { + ipv6Result.add(normalizeHostAddress(address)); + } else { + ipv4Result.add(normalizeHostAddress(address)); + } + } + } + } + + // get priority to IPv4 + if (!ipv4Result.isEmpty()) { + for (String ip : ipv4Result) { + if (ip.startsWith("127.0") || ip.startsWith("192.168")) { + continue; + } + + return ip; + } + + //get the last one + return ipv4Result.get(ipv4Result.size() - 1); + } + //then use the ipv6 address + else if (!ipv6Result.isEmpty()) { + return ipv6Result.get(0); + } + //the use local ip address + final InetAddress localHost = InetAddress.getLocalHost(); + return normalizeHostAddress(localHost); + } catch (SocketException e) { + e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } finally { + + } + + return null; + } + + public static String normalizeHostAddress(final InetAddress localHost) { + if (localHost instanceof Inet6Address) { + return "[" + localHost.getHostAddress() + "]"; + } else { + return localHost.getHostAddress(); + } + } + + public static String toJson(final Object obj, boolean prettyFormat) { + return RemotingSerializable.toJson(obj, prettyFormat); + } + + public static T fromJson(String json, Class classOfT) { + return RemotingSerializable.fromJson(json, classOfT); + } + + public static String replaceNull(String ori) { + return ori == null ? "" : ori; + } +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java new file mode 100644 index 0000000000..4981759eba --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.common; + +import org.apache.rocketmq.client.trace.core.Utils.TrackTraceUtils; +import org.apache.rocketmq.common.message.MessageType; + +public class TrackTraceBean { + private static final String LOCAL_ADDRESS = TrackTraceUtils.getLocalAddress(); + private String topic = ""; + private String msgId = ""; + private String offsetMsgId = ""; + private String tags = ""; + private String keys = ""; + private String storeHost = LOCAL_ADDRESS; + private String clientHost = LOCAL_ADDRESS; + private long storeTime; + private int retryTimes; + private int bodyLength; + private MessageType msgType; + + + public MessageType getMsgType() { + return msgType; + } + + + public void setMsgType(final MessageType msgType) { + this.msgType = msgType; + } + + + public String getOffsetMsgId() { + return offsetMsgId; + } + + + public void setOffsetMsgId(final String offsetMsgId) { + this.offsetMsgId = offsetMsgId; + } + + public String getTopic() { + return topic; + } + + + public void setTopic(String topic) { + this.topic = topic; + } + + + public String getMsgId() { + return msgId; + } + + + public void setMsgId(String msgId) { + this.msgId = msgId; + } + + + public String getTags() { + return tags; + } + + + public void setTags(String tags) { + this.tags = tags; + } + + + public String getKeys() { + return keys; + } + + + public void setKeys(String keys) { + this.keys = keys; + } + + + public String getStoreHost() { + return storeHost; + } + + + public void setStoreHost(String storeHost) { + this.storeHost = storeHost; + } + + + public String getClientHost() { + return clientHost; + } + + + public void setClientHost(String clientHost) { + this.clientHost = clientHost; + } + + + public long getStoreTime() { + return storeTime; + } + + + public void setStoreTime(long storeTime) { + this.storeTime = storeTime; + } + + + public int getRetryTimes() { + return retryTimes; + } + + + public void setRetryTimes(int retryTimes) { + this.retryTimes = retryTimes; + } + + + public int getBodyLength() { + return bodyLength; + } + + + public void setBodyLength(int bodyLength) { + this.bodyLength = bodyLength; + } +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java new file mode 100644 index 0000000000..aa49d1c5bb --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.common; + +import org.apache.rocketmq.common.MixAll; + +public class TrackTraceConstants { + public static final String NAMESRV_ADDR = "NAMESRV_ADDR"; + public static final String ADDRSRV_URL = "ADDRSRV_URL"; + public static final String INSTANCE_NAME = "InstanceName"; + public static final String ASYNC_BUFFER_SIZE = "AsyncBufferSize"; + public static final String MAX_BATCH_NUM = "MaxBatchNum"; + public static final String WAKE_UP_NUM = "WakeUpNum"; + public static final String MAX_MSG_SIZE = "MaxMsgSize"; + public static final String GROUP_NAME = "_INNER_TRACE_PRODUCER"; + public static final String TRACE_TOPIC = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC; + public static final char CONTENT_SPLITOR = (char) 1; + public static final char FIELD_SPLITOR = (char) 2; + public static final String TRACE_DISPATCHER_TYPE = "DispatcherType"; +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceContext.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceContext.java new file mode 100644 index 0000000000..a6374a6d58 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceContext.java @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.common; + +import org.apache.rocketmq.common.message.MessageClientIDSetter; + +import java.util.List; + +/** + * The context of Track Trace + */ +public class TrackTraceContext implements Comparable { + + private TrackTraceType traceType; + private long timeStamp = System.currentTimeMillis(); + private String regionId = ""; + private String regionName = ""; + private String groupName = ""; + private int costTime = 0; + private boolean isSuccess = true; + private String requestId = MessageClientIDSetter.createUniqID(); + private int contextCode = 0; + private List traceBeans; + + public int getContextCode() { + return contextCode; + } + + public void setContextCode(final int contextCode) { + this.contextCode = contextCode; + } + + public List getTraceBeans() { + return traceBeans; + } + + public void setTraceBeans(List traceBeans) { + this.traceBeans = traceBeans; + } + + public String getRegionId() { + return regionId; + } + + public void setRegionId(String regionId) { + this.regionId = regionId; + } + + public TrackTraceType getTraceType() { + return traceType; + } + + public void setTraceType(TrackTraceType traceType) { + this.traceType = traceType; + } + + public long getTimeStamp() { + return timeStamp; + } + + public void setTimeStamp(long timeStamp) { + this.timeStamp = timeStamp; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public int getCostTime() { + return costTime; + } + + public void setCostTime(int costTime) { + this.costTime = costTime; + } + + public boolean isSuccess() { + return isSuccess; + } + + public void setSuccess(boolean success) { + isSuccess = success; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getRegionName() { + return regionName; + } + + public void setRegionName(String regionName) { + this.regionName = regionName; + } + + @Override + public int compareTo(TrackTraceContext o) { + return (int) (this.timeStamp - o.getTimeStamp()); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(1024); + sb.append(traceType).append("_").append(groupName) + .append("_").append(regionId).append("_").append(isSuccess).append("_"); + if (traceBeans != null && traceBeans.size() > 0) { + for (TrackTraceBean bean : traceBeans) { + sb.append(bean.getMsgId() + "_" + bean.getTopic() + "_"); + } + } + return "TrackTraceContext{" + sb.toString() + '}'; + } +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDataEncoder.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDataEncoder.java new file mode 100644 index 0000000000..3362106e62 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDataEncoder.java @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.common; + +import org.apache.rocketmq.common.message.MessageType; + +import java.util.ArrayList; +import java.util.List; + +import static org.apache.rocketmq.client.trace.core.common.TrackTraceType.Pub; + +/** + * encode/decode for Track Trace Data + */ +public class TrackTraceDataEncoder { + + /** + * resolving traceContext list From track trace data String + * + * @param traceData + * @return + */ + public static List decoderFromTraceDataString(String traceData) { + List resList = new ArrayList(); + if (traceData == null || traceData.length() <= 0) { + return resList; + } + String[] contextList = traceData.split(String.valueOf(TrackTraceConstants.FIELD_SPLITOR)); + for (String context : contextList) { + String[] line = context.split(String.valueOf(TrackTraceConstants.CONTENT_SPLITOR)); + if (line[0].equals(Pub.name())) { + TrackTraceContext pubContext = new TrackTraceContext(); + pubContext.setTraceType(Pub); + pubContext.setTimeStamp(Long.parseLong(line[1])); + pubContext.setRegionId(line[2]); + pubContext.setGroupName(line[3]); + TrackTraceBean bean = new TrackTraceBean(); + bean.setTopic(line[4]); + bean.setMsgId(line[5]); + bean.setTags(line[6]); + bean.setKeys(line[7]); + bean.setStoreHost(line[8]); + bean.setBodyLength(Integer.parseInt(line[9])); + pubContext.setCostTime(Integer.parseInt(line[10])); + bean.setMsgType(MessageType.values()[Integer.parseInt(line[11])]); + + if (line.length == 13) { + pubContext.setSuccess(Boolean.parseBoolean(line[12])); + } else if (line.length == 14) { + bean.setOffsetMsgId(line[12]); + pubContext.setSuccess(Boolean.parseBoolean(line[13])); + } + pubContext.setTraceBeans(new ArrayList(1)); + pubContext.getTraceBeans().add(bean); + resList.add(pubContext); + } else if (line[0].equals(TrackTraceType.SubBefore.name())) { + TrackTraceContext subBeforeContext = new TrackTraceContext(); + subBeforeContext.setTraceType(TrackTraceType.SubBefore); + subBeforeContext.setTimeStamp(Long.parseLong(line[1])); + subBeforeContext.setRegionId(line[2]); + subBeforeContext.setGroupName(line[3]); + subBeforeContext.setRequestId(line[4]); + TrackTraceBean bean = new TrackTraceBean(); + bean.setMsgId(line[5]); + bean.setRetryTimes(Integer.parseInt(line[6])); + bean.setKeys(line[7]); + subBeforeContext.setTraceBeans(new ArrayList(1)); + subBeforeContext.getTraceBeans().add(bean); + resList.add(subBeforeContext); + } else if (line[0].equals(TrackTraceType.SubAfter.name())) { + TrackTraceContext subAfterContext = new TrackTraceContext(); + subAfterContext.setTraceType(TrackTraceType.SubAfter); + subAfterContext.setRequestId(line[1]); + TrackTraceBean bean = new TrackTraceBean(); + bean.setMsgId(line[2]); + bean.setKeys(line[5]); + subAfterContext.setTraceBeans(new ArrayList(1)); + subAfterContext.getTraceBeans().add(bean); + subAfterContext.setCostTime(Integer.parseInt(line[3])); + subAfterContext.setSuccess(Boolean.parseBoolean(line[4])); + if (line.length >= 7) { + // add the context type + subAfterContext.setContextCode(Integer.parseInt(line[6])); + } + resList.add(subAfterContext); + } + } + return resList; + } + + /** + * Encoding the trace context into track data strings and keyset sets + * + * @param ctx + * @return + */ + public static TrackTraceTransferBean encoderFromContextBean(TrackTraceContext ctx) { + if (ctx == null) { + return null; + } + //build message track trace of the transfering entity content bean + TrackTraceTransferBean transferBean = new TrackTraceTransferBean(); + StringBuilder sb = new StringBuilder(256); + switch (ctx.getTraceType()) { + case Pub: { + TrackTraceBean bean = ctx.getTraceBeans().get(0); + //append the content of context and traceBean to transferBean's TransData + sb.append(ctx.getTraceType()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getTimeStamp()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getRegionId()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getGroupName()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getTopic()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getMsgId()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getTags()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getKeys()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getStoreHost()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getBodyLength()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getCostTime()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getMsgType().ordinal()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getOffsetMsgId()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.isSuccess()).append(TrackTraceConstants.FIELD_SPLITOR); + } + break; + case SubBefore: { + for (TrackTraceBean bean : ctx.getTraceBeans()) { + sb.append(ctx.getTraceType()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getTimeStamp()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getRegionId()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getGroupName()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getRequestId()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getMsgId()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getRetryTimes()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getKeys()).append(TrackTraceConstants.FIELD_SPLITOR);// + } + } + break; + case SubAfter: { + for (TrackTraceBean bean : ctx.getTraceBeans()) { + sb.append(ctx.getTraceType()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getRequestId()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getMsgId()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getCostTime()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.isSuccess()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(bean.getKeys()).append(TrackTraceConstants.CONTENT_SPLITOR)// + .append(ctx.getContextCode()).append(TrackTraceConstants.FIELD_SPLITOR); + } + } + break; + default: + } + transferBean.setTransData(sb.toString()); + for (TrackTraceBean bean : ctx.getTraceBeans()) { + + transferBean.getTransKey().add(bean.getMsgId()); + if (bean.getKeys() != null && bean.getKeys().length() > 0) { + transferBean.getTransKey().add(bean.getKeys()); + } + } + return transferBean; + } +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDispatcherType.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDispatcherType.java new file mode 100644 index 0000000000..a22198e81b --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDispatcherType.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.common; + +public enum TrackTraceDispatcherType { + PRODUCER, + CONSUMER +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceTransferBean.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceTransferBean.java new file mode 100644 index 0000000000..9535b5d472 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceTransferBean.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.common; + +import java.util.HashSet; +import java.util.Set; + +/** + * track trace transfering bean + */ +public class TrackTraceTransferBean { + private String transData; + private Set transKey = new HashSet(); + + public String getTransData() { + return transData; + } + + public void setTransData(String transData) { + this.transData = transData; + } + + public Set getTransKey() { + return transKey; + } + + public void setTransKey(Set transKey) { + this.transKey = transKey; + } +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java new file mode 100644 index 0000000000..31a89ef655 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.common; + +/** + * Created by zongtanghu on 2018/11/6. + */ +public enum TrackTraceType { + Pub, + SubBefore, + SubAfter, +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/AsyncDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/AsyncDispatcher.java new file mode 100644 index 0000000000..9b282bb0b1 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/AsyncDispatcher.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.dispatch; + +import java.util.Properties; +import org.apache.rocketmq.client.exception.MQClientException; +import java.io.IOException; + +/** + * Interface of asynchronous transfer data + */ +public interface AsyncDispatcher { + + /** + * Initialize asynchronous transfer data module + */ + void start(Properties properties) throws MQClientException; + + /** + * append the transfering data + * @param ctx data infomation + * @return + */ + boolean append(Object ctx); + + /** + * write flush action + * + * @throws IOException + */ + void flush() throws IOException; + + /** + * close the track trace Hook + */ + void shutdown(); +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java new file mode 100644 index 0000000000..1c1c4c3813 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java @@ -0,0 +1,358 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.dispatch.impl; + +import org.apache.rocketmq.client.common.ThreadLocalIndex; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; +import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; +import org.apache.rocketmq.client.impl.producer.TopicPublishInfo; +import org.apache.rocketmq.client.log.ClientLogger; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.MessageQueueSelector; +import org.apache.rocketmq.client.producer.SendCallback; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; +import org.apache.rocketmq.client.trace.core.common.TrackTraceContext; +import org.apache.rocketmq.client.trace.core.common.TrackTraceDataEncoder; +import org.apache.rocketmq.client.trace.core.common.TrackTraceTransferBean; +import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; +import org.apache.rocketmq.common.ThreadFactoryImpl; +import org.apache.rocketmq.common.message.Message; +import org.apache.rocketmq.common.message.MessageQueue; +import org.apache.rocketmq.logging.InternalLogger; + +import java.io.IOException; +import java.util.List; +import java.util.HashMap; +import java.util.UUID; +import java.util.Properties; +import java.util.Set; +import java.util.HashSet; +import java.util.ArrayList; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Created by zongtanghu on 2018/11/6. + */ +public class AsyncArrayDispatcher implements AsyncDispatcher { + + private final static InternalLogger log = ClientLogger.getLog(); + private final int queueSize; + private final int batchSize; + private final DefaultMQProducer traceProducer; + private final ThreadPoolExecutor traceExecuter; + // the last discard number of log + private AtomicLong discardCount; + private Thread worker; + private ArrayBlockingQueue traceContextQueue; + private ArrayBlockingQueue appenderQueue; + private volatile Thread shutDownHook; + private volatile boolean stopped = false; + private String dispatcherType; + private DefaultMQProducerImpl hostProducer; + private DefaultMQPushConsumerImpl hostConsumer; + private volatile ThreadLocalIndex sendWhichQueue = new ThreadLocalIndex(); + private String dispatcherId = UUID.randomUUID().toString(); + + public AsyncArrayDispatcher(Properties properties) throws MQClientException { + dispatcherType = properties.getProperty(TrackTraceConstants.TRACE_DISPATCHER_TYPE); + int queueSize = Integer.parseInt(properties.getProperty(TrackTraceConstants.ASYNC_BUFFER_SIZE, "2048")); + // queueSize is greater than or equal to the n power of 2 of value + queueSize = 1 << (32 - Integer.numberOfLeadingZeros(queueSize - 1)); + this.queueSize = queueSize; + batchSize = Integer.parseInt(properties.getProperty(TrackTraceConstants.MAX_BATCH_NUM, "1")); + this.discardCount = new AtomicLong(0L); + traceContextQueue = new ArrayBlockingQueue(1024); + appenderQueue = new ArrayBlockingQueue(queueSize); + + this.traceExecuter = new ThreadPoolExecutor(// + 10, // + 20, // + 1000 * 60, // + TimeUnit.MILLISECONDS, // + this.appenderQueue, // + new ThreadFactoryImpl("MQTraceSendThread_")); + traceProducer = TrackTraceProducerFactory.getTraceDispatcherProducer(properties); + } + + public DefaultMQProducer getTraceProducer() { + return traceProducer; + } + + public DefaultMQProducerImpl getHostProducer() { + return hostProducer; + } + + public void setHostProducer(DefaultMQProducerImpl hostProducer) { + this.hostProducer = hostProducer; + } + + public DefaultMQPushConsumerImpl getHostConsumer() { + return hostConsumer; + } + + public void setHostConsumer(DefaultMQPushConsumerImpl hostConsumer) { + this.hostConsumer = hostConsumer; + } + + public void start(Properties properties) throws MQClientException { + TrackTraceProducerFactory.registerTraceDispatcher(dispatcherId,properties.getProperty(TrackTraceConstants.NAMESRV_ADDR)); + this.worker = new Thread(new AsyncRunnable(), "MQ-AsyncArrayDispatcher-Thread-" + dispatcherId); + this.worker.setDaemon(true); + this.worker.start(); + this.registerShutDownHook(); + } + + @Override + public boolean append(final Object ctx) { + boolean result = traceContextQueue.offer((TrackTraceContext) ctx); + if (!result) { + log.info("buffer full" + discardCount.incrementAndGet() + " ,context is " + ctx); + } + return result; + } + + @Override + public void flush() throws IOException { + // the maximum waiting time for refresh,avoid being written all the time, resulting in failure to return. + long end = System.currentTimeMillis() + 500; + while (traceContextQueue.size() > 0 || appenderQueue.size() > 0 && System.currentTimeMillis() <= end) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + break; + } + } + log.info("------end trace send " + traceContextQueue.size() + " " + appenderQueue.size()); + } + + @Override + public void shutdown() { + this.stopped = true; + this.traceExecuter.shutdown(); + TrackTraceProducerFactory.unregisterTraceDispatcher(dispatcherId); + this.removeShutdownHook(); + } + + public void registerShutDownHook() { + if (shutDownHook == null) { + shutDownHook = new Thread(new Runnable() { + private volatile boolean hasShutdown = false; + + @Override + public void run() { + synchronized (this) { + if (!this.hasShutdown) { + try { + flush(); + } catch (IOException e) { + log.error("system MQTrace hook shutdown failed ,maybe loss some trace data"); + } + } + } + } + }, "ShutdownHookMQTrace"); + Runtime.getRuntime().addShutdownHook(shutDownHook); + } + } + + public void removeShutdownHook() { + if (shutDownHook != null) { + Runtime.getRuntime().removeShutdownHook(shutDownHook); + } + } + + class AsyncRunnable implements Runnable { + private boolean stopped; + + @Override + public void run() { + while (!stopped) { + List contexts = new ArrayList(batchSize); + for (int i = 0; i < batchSize; i++) { + TrackTraceContext context = null; + try { + //get track trace data element from blocking Queue — traceContextQueue + context = traceContextQueue.poll(5, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + } + if (context != null) { + contexts.add(context); + } else { + break; + } + } + if (contexts.size() > 0) { + AsyncAppenderRequest request = new AsyncAppenderRequest(contexts); + traceExecuter.submit(request); + } else if (AsyncArrayDispatcher.this.stopped) { + this.stopped = true; + } + } + + } + } + + class AsyncAppenderRequest implements Runnable { + List contextList; + + public AsyncAppenderRequest(final List contextList) { + if (contextList != null) { + this.contextList = contextList; + } else { + this.contextList = new ArrayList(1); + } + } + + @Override + public void run() { + sendTraceData(contextList); + } + + public void sendTraceData(List contextList) { + Map> transBeanMap = new HashMap>(); + for (TrackTraceContext context : contextList) { + if (context.getTraceBeans().isEmpty()) { + continue; + } + //1.topic value corresponding to original message entity content + String topic = context.getTraceBeans().get(0).getTopic(); + //2.use original message entity's topic as key + String key = topic; + List transBeanList = transBeanMap.get(key); + if (transBeanList == null) { + transBeanList = new ArrayList(); + transBeanMap.put(key, transBeanList); + } + TrackTraceTransferBean traceData = TrackTraceDataEncoder.encoderFromContextBean(context); + transBeanList.add(traceData); + } + for (Map.Entry> entry : transBeanMap.entrySet()) { + //key -> dataTopic(Not trace Topic) + String dataTopic = entry.getKey(); + flushData(entry.getValue(), dataTopic); + } + } + + /** + * batch sending data actually + */ + private void flushData(List transBeanList, String topic) { + if (transBeanList.size() == 0) { + return; + } + // temporary buffer + StringBuilder buffer = new StringBuilder(1024); + int count = 0; + Set keySet = new HashSet(); + + for (TrackTraceTransferBean bean : transBeanList) { + // keyset of message track trace includes msgId of or original message + keySet.addAll(bean.getTransKey()); + buffer.append(bean.getTransData()); + count++; + // Ensure that the size of the package should not exceed the upper limit. + if (buffer.length() >= traceProducer.getMaxMessageSize()) { + sendTraceDataByMQ(keySet, buffer.toString()); + // clear temporary buffer after finishing + buffer.delete(0, buffer.length()); + keySet.clear(); + count = 0; + } + } + if (count > 0) { + sendTraceDataByMQ(keySet, buffer.toString()); + } + transBeanList.clear(); + } + + /** + * send message track trace data + * + * @param keySet the keyset in this batch(including msgId in original message not offsetMsgId) + * @param data the message track trace data in this batch + */ + private void sendTraceDataByMQ(Set keySet, final String data) { + String topic = TrackTraceConstants.TRACE_TOPIC; + final Message message = new Message(topic, data.getBytes()); + + //keyset of message track trace includes msgId of or original message + message.setKeys(keySet); + try { + Set traceBrokerSet = tryGetMessageQueueBrokerSet(traceProducer.getDefaultMQProducerImpl(), topic); + SendCallback callback = new SendCallback() { + @Override + public void onSuccess(SendResult sendResult) { + } + + @Override + public void onException(Throwable e) { + log.info("send trace data ,the traceData is " + data); + } + }; + if (traceBrokerSet.isEmpty()) { + //no cross set + traceProducer.send(message, callback, 5000); + } else { + traceProducer.send(message, new MessageQueueSelector() { + @Override + public MessageQueue select(List mqs, Message msg, Object arg) { + Set brokerSet = (Set) arg; + List filterMqs = new ArrayList(); + for (MessageQueue queue : mqs) { + if (brokerSet.contains(queue.getBrokerName())) { + filterMqs.add(queue); + } + } + int index = sendWhichQueue.getAndIncrement(); + int pos = Math.abs(index) % filterMqs.size(); + if (pos < 0) { + pos = 0; + } + return filterMqs.get(pos); + } + }, traceBrokerSet, callback); + } + + } catch (Exception e) { + log.info("send trace data,the traceData is" + data); + } + } + + private Set tryGetMessageQueueBrokerSet(DefaultMQProducerImpl producer, String topic) { + Set brokerSet = new HashSet(); + TopicPublishInfo topicPublishInfo = producer.getTopicPublishInfoTable().get(topic); + if (null == topicPublishInfo || !topicPublishInfo.ok()) { + producer.getTopicPublishInfoTable().putIfAbsent(topic, new TopicPublishInfo()); + producer.getmQClientFactory().updateTopicRouteInfoFromNameServer(topic); + topicPublishInfo = producer.getTopicPublishInfoTable().get(topic); + } + if (topicPublishInfo.isHaveTopicRouterInfo() || topicPublishInfo.ok()) { + for (MessageQueue queue : topicPublishInfo.getMessageQueueList()) { + brokerSet.add(queue.getBrokerName()); + } + } + return brokerSet; + } + } + +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java new file mode 100644 index 0000000000..27447df734 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.dispatch.impl; + +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; +import org.apache.rocketmq.common.namesrv.TopAddressing; + +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +public class TrackTraceProducerFactory { + + private static Map dispatcherTable = new ConcurrentHashMap(); + private static AtomicBoolean isStarted = new AtomicBoolean(false); + private static DefaultMQProducer traceProducer; + + + public static DefaultMQProducer getTraceDispatcherProducer(Properties properties) { + if (traceProducer == null) { + + traceProducer = new DefaultMQProducer(); + traceProducer.setProducerGroup(TrackTraceConstants.GROUP_NAME); + traceProducer.setSendMsgTimeout(5000); + traceProducer.setInstanceName(properties.getProperty(TrackTraceConstants.INSTANCE_NAME, String.valueOf(System.currentTimeMillis()))); + String nameSrv = properties.getProperty(TrackTraceConstants.NAMESRV_ADDR); + if (nameSrv == null) { + TopAddressing topAddressing = new TopAddressing(properties.getProperty(TrackTraceConstants.ADDRSRV_URL)); + nameSrv = topAddressing.fetchNSAddr(); + } + traceProducer.setNamesrvAddr(nameSrv); + traceProducer.setVipChannelEnabled(false); + //the max size of message is 128K + int maxSize = Integer.parseInt(properties.getProperty(TrackTraceConstants.MAX_MSG_SIZE, "128000")); + traceProducer.setMaxMessageSize(maxSize - 10 * 1000); + } + return traceProducer; + } + + public static void registerTraceDispatcher(String dispatcherId, String nameSrvAddr) throws MQClientException { + dispatcherTable.put(dispatcherId, new Object()); + if (traceProducer != null && isStarted.compareAndSet(false, true)) { + traceProducer.setNamesrvAddr(nameSrvAddr); + traceProducer.start(); + } + } + + public static void unregisterTraceDispatcher(String dispatcherId) { + dispatcherTable.remove(dispatcherId); + if (dispatcherTable.isEmpty() && traceProducer != null && isStarted.get()) { + traceProducer.shutdown(); + } + } +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/ConsumeMessageTraceHookImpl.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/ConsumeMessageTraceHookImpl.java new file mode 100644 index 0000000000..df88ce2d57 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/ConsumeMessageTraceHookImpl.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.hook; + +import org.apache.rocketmq.client.consumer.listener.ConsumeReturnType; +import org.apache.rocketmq.client.hook.ConsumeMessageContext; +import org.apache.rocketmq.client.hook.ConsumeMessageHook; +import org.apache.rocketmq.client.trace.core.common.TrackTraceBean; +import org.apache.rocketmq.client.trace.core.common.TrackTraceContext; +import org.apache.rocketmq.client.trace.core.common.TrackTraceType; +import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; +import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.common.message.MessageConst; +import org.apache.rocketmq.common.message.MessageExt; + +import java.util.ArrayList; +import java.util.List; + +public class ConsumeMessageTraceHookImpl implements ConsumeMessageHook { + + private AsyncDispatcher localDispatcher; + + public ConsumeMessageTraceHookImpl(AsyncDispatcher localDispatcher) { + this.localDispatcher = localDispatcher; + } + + @Override + public String hookName() { + return "ConsumeMessageTraceHook"; + } + + @Override + public void consumeMessageBefore(ConsumeMessageContext context) { + if (context == null || context.getMsgList() == null || context.getMsgList().isEmpty()) { + return; + } + TrackTraceContext traceContext = new TrackTraceContext(); + context.setMqTraceContext(traceContext); + traceContext.setTraceType(TrackTraceType.SubBefore);// + traceContext.setGroupName(context.getConsumerGroup());// + List beans = new ArrayList(); + for (MessageExt msg : context.getMsgList()) { + if (msg == null) { + continue; + } + String regionId = msg.getProperty(MessageConst.PROPERTY_MSG_REGION); + String traceOn = msg.getProperty(MessageConst.PROPERTY_TRACE_SWITCH); + + if (traceOn != null && traceOn.equals("false")) { + // if trace switch is false ,skip it + continue; + } + TrackTraceBean traceBean = new TrackTraceBean(); + traceBean.setTopic(msg.getTopic());// + traceBean.setMsgId(msg.getMsgId());// + traceBean.setTags(msg.getTags());// + traceBean.setKeys(msg.getKeys());// + traceBean.setStoreTime(msg.getStoreTimestamp());// + traceBean.setBodyLength(msg.getStoreSize());// + traceBean.setRetryTimes(msg.getReconsumeTimes());// + traceContext.setRegionId(regionId);// + beans.add(traceBean); + } + if (beans.size() > 0) { + traceContext.setTraceBeans(beans); + traceContext.setTimeStamp(System.currentTimeMillis()); + localDispatcher.append(traceContext); + } + } + + @Override + public void consumeMessageAfter(ConsumeMessageContext context) { + if (context == null || context.getMsgList() == null || context.getMsgList().isEmpty()) { + return; + } + TrackTraceContext subBeforeContext = (TrackTraceContext) context.getMqTraceContext(); + + if (subBeforeContext.getTraceBeans() == null || subBeforeContext.getTraceBeans().size() < 1) { + // if subbefore bean is null ,skip it + return; + } + TrackTraceContext subAfterContext = new TrackTraceContext(); + subAfterContext.setTraceType(TrackTraceType.SubAfter);// + subAfterContext.setRegionId(subBeforeContext.getRegionId());// + subAfterContext.setGroupName(subBeforeContext.getGroupName());// + subAfterContext.setRequestId(subBeforeContext.getRequestId());// + subAfterContext.setSuccess(context.isSuccess());// + + //caculate the cost time for processing messages + int costTime = (int) ((System.currentTimeMillis() - subBeforeContext.getTimeStamp()) / context.getMsgList().size()); + subAfterContext.setCostTime(costTime);// + subAfterContext.setTraceBeans(subBeforeContext.getTraceBeans()); + String contextType = context.getProps().get(MixAll.CONSUME_CONTEXT_TYPE); + if (contextType != null) { + subAfterContext.setContextCode(ConsumeReturnType.valueOf(contextType).ordinal()); + } + localDispatcher.append(subAfterContext); + } +} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java new file mode 100644 index 0000000000..0c38e22036 --- /dev/null +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.hook; + +import org.apache.rocketmq.client.hook.SendMessageContext; +import org.apache.rocketmq.client.hook.SendMessageHook; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.client.trace.core.common.TrackTraceBean; +import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; +import org.apache.rocketmq.client.trace.core.common.TrackTraceContext; +import org.apache.rocketmq.client.trace.core.common.TrackTraceType; +import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; +import org.apache.rocketmq.common.MixAll; +import java.util.ArrayList; + +public class SendMessageTrackHookImpl implements SendMessageHook { + + private AsyncDispatcher localDispatcher; + + public SendMessageTrackHookImpl(AsyncDispatcher localDispatcher) { + this.localDispatcher = localDispatcher; + } + + @Override + public String hookName() { + return "SendMessageTrackHook"; + } + + @Override + public void sendMessageBefore(SendMessageContext context) { + //if it is message track trace data,then it doesn't recorded + if (context == null || context.getMessage().getTopic().startsWith(MixAll.SYSTEM_TOPIC_PREFIX)) { + return; + } + //build the context content of TuxeTraceContext + TrackTraceContext tuxeContext = new TrackTraceContext(); + tuxeContext.setTraceBeans(new ArrayList(1)); + context.setMqTraceContext(tuxeContext); + tuxeContext.setTraceType(TrackTraceType.Pub); + tuxeContext.setGroupName(context.getProducerGroup()); + + //build the data bean object of message track trace + TrackTraceBean traceBean = new TrackTraceBean(); + traceBean.setTopic(context.getMessage().getTopic()); + traceBean.setTags(context.getMessage().getTags()); + traceBean.setKeys(context.getMessage().getKeys()); + traceBean.setStoreHost(context.getBrokerAddr()); + traceBean.setBodyLength(context.getMessage().getBody().length); + traceBean.setMsgType(context.getMsgType()); + tuxeContext.getTraceBeans().add(traceBean); + } + + @Override + public void sendMessageAfter(SendMessageContext context) { + //if it is message track trace data,then it doesn't recorded + if (context == null || context.getMessage().getTopic().startsWith(TrackTraceConstants.TRACE_TOPIC) + || context.getMqTraceContext() == null) { + return; + } + if (context.getSendResult() == null) { + return; + } + + if (context.getSendResult().getRegionId() == null + || !context.getSendResult().isTraceOn()) { + // if switch is false,skip it + return; + } + + TrackTraceContext tuxeContext = (TrackTraceContext) context.getMqTraceContext(); + TrackTraceBean traceBean = tuxeContext.getTraceBeans().get(0); + int costTime = (int) ((System.currentTimeMillis() - tuxeContext.getTimeStamp()) / tuxeContext.getTraceBeans().size()); + tuxeContext.setCostTime(costTime); + if (context.getSendResult().getSendStatus().equals(SendStatus.SEND_OK)) { + tuxeContext.setSuccess(true); + } else { + tuxeContext.setSuccess(false); + } + tuxeContext.setRegionId(context.getSendResult().getRegionId()); + traceBean.setMsgId(context.getSendResult().getMsgId()); + traceBean.setOffsetMsgId(context.getSendResult().getOffsetMsgId()); + traceBean.setStoreTime(tuxeContext.getTimeStamp() + costTime / 2); + localDispatcher.append(tuxeContext); + } +} diff --git a/client/src/test/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumerTest.java b/client/src/test/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumerTest.java index ff2fb78bbf..019b44da4f 100644 --- a/client/src/test/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumerTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumerTest.java @@ -89,7 +89,7 @@ public class DefaultMQPushConsumerTest { @Before public void init() throws Exception { consumerGroup = "FooBarGroup" + System.currentTimeMillis(); - pushConsumer = new DefaultMQPushConsumer(consumerGroup); + pushConsumer = new DefaultMQPushConsumer(consumerGroup,false); pushConsumer.setNamesrvAddr("127.0.0.1:9876"); pushConsumer.setPullInterval(60 * 1000); @@ -252,7 +252,7 @@ public class DefaultMQPushConsumerTest { } private DefaultMQPushConsumer createPushConsumer() { - DefaultMQPushConsumer pushConsumer = new DefaultMQPushConsumer(consumerGroup); + DefaultMQPushConsumer pushConsumer = new DefaultMQPushConsumer(consumerGroup,false); pushConsumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, diff --git a/client/src/test/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImplTest.java b/client/src/test/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImplTest.java index d4f581231f..e6f26f20e8 100644 --- a/client/src/test/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImplTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImplTest.java @@ -42,7 +42,7 @@ public class DefaultMQPushConsumerImplTest { //test message thrown.expectMessage("consumeThreadMin (10) is larger than consumeThreadMax (9)"); - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_consumer_group"); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_consumer_group",false); consumer.setConsumeThreadMin(10); consumer.setConsumeThreadMax(9); diff --git a/client/src/test/java/org/apache/rocketmq/client/impl/consumer/RebalancePushImplTest.java b/client/src/test/java/org/apache/rocketmq/client/impl/consumer/RebalancePushImplTest.java index 796a394308..f6ca3aca9f 100644 --- a/client/src/test/java/org/apache/rocketmq/client/impl/consumer/RebalancePushImplTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/impl/consumer/RebalancePushImplTest.java @@ -44,7 +44,7 @@ import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class RebalancePushImplTest { @Spy - private DefaultMQPushConsumerImpl defaultMQPushConsumer = new DefaultMQPushConsumerImpl(new DefaultMQPushConsumer("RebalancePushImplTest"), null); + private DefaultMQPushConsumerImpl defaultMQPushConsumer = new DefaultMQPushConsumerImpl(new DefaultMQPushConsumer("RebalancePushImplTest",false), null); @Mock private MQClientInstance mqClientInstance; @Mock diff --git a/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java b/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java index c225afd684..391743614f 100644 --- a/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java @@ -82,7 +82,7 @@ public class DefaultMQProducerTest { @Before public void init() throws Exception { String producerGroupTemp = producerGroupPrefix + System.currentTimeMillis(); - producer = new DefaultMQProducer(producerGroupTemp); + producer = new DefaultMQProducer(producerGroupTemp,false); producer.setNamesrvAddr("127.0.0.1:9876"); producer.setCompressMsgBodyOverHowmuch(16); message = new Message(topic, new byte[] {'a'}); @@ -309,7 +309,7 @@ public class DefaultMQProducerTest { @Test public void testSetCallbackExecutor() throws MQClientException { String producerGroupTemp = "testSetCallbackExecutor_" + System.currentTimeMillis(); - producer = new DefaultMQProducer(producerGroupTemp); + producer = new DefaultMQProducer(producerGroupTemp,false); producer.setNamesrvAddr("127.0.0.1:9876"); producer.start(); diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java new file mode 100644 index 0000000000..7d8fb0a6ae --- /dev/null +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java @@ -0,0 +1,234 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import net.bytebuddy.asm.Advice; +import org.apache.rocketmq.client.ClientConfig; +import org.apache.rocketmq.client.exception.MQBrokerException; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.hook.SendMessageContext; +import org.apache.rocketmq.client.impl.CommunicationMode; +import org.apache.rocketmq.client.impl.MQClientAPIImpl; +import org.apache.rocketmq.client.impl.MQClientManager; +import org.apache.rocketmq.client.impl.factory.MQClientInstance; +import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; +import org.apache.rocketmq.client.impl.producer.TopicPublishInfo; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendCallback; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; +import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.common.message.Message; +import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; +import org.apache.rocketmq.common.protocol.route.BrokerData; +import org.apache.rocketmq.common.protocol.route.QueueData; +import org.apache.rocketmq.common.protocol.route.TopicRouteData; +import org.apache.rocketmq.remoting.exception.RemotingException; +import org.apache.rocketmq.remoting.netty.NettyRemotingClient; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyObject; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class DefaultMQProducerWithTraceTest { + + @Spy + private MQClientInstance mQClientFactory = MQClientManager.getInstance().getAndCreateMQClientInstance(new ClientConfig()); + @Mock + private MQClientAPIImpl mQClientAPIImpl; + + @Spy + private MQClientInstance mQClientTraceFactory = MQClientManager.getInstance().getAndCreateMQClientInstance(new ClientConfig()); + @Mock + private MQClientAPIImpl mQClientTraceAPIImpl; + + private AsyncArrayDispatcher asyncArrayDispatcher; + + private DefaultMQProducer producer; + private DefaultMQProducer traceProducer; + + private Message message; + private String topic = "FooBar"; + private String producerGroupPrefix = "FooBar_PID"; + private String producerGroupTemp = producerGroupPrefix + System.currentTimeMillis(); + private String producerGroupTraceTemp = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC + System.currentTimeMillis(); + + @Before + public void init() throws Exception { + + producer = new DefaultMQProducer(producerGroupTemp,true); + producer.setNamesrvAddr("127.0.0.1:9876"); + message = new Message(topic, new byte[] {'a', 'b' ,'c'}); + asyncArrayDispatcher = (AsyncArrayDispatcher)producer.getTraceDispatcher(); + traceProducer = asyncArrayDispatcher.getTraceProducer(); + + producer.start(); + + Field field = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); + field.setAccessible(true); + field.set(producer.getDefaultMQProducerImpl(), mQClientFactory); + + Field fieldTrace = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); + fieldTrace.setAccessible(true); + field.set(traceProducer.getDefaultMQProducerImpl(), mQClientTraceFactory); + + field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); + field.setAccessible(true); + field.set(mQClientFactory, mQClientAPIImpl); + + field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); + field.setAccessible(true); + field.set(mQClientTraceFactory, mQClientTraceAPIImpl); + + producer.getDefaultMQProducerImpl().getmQClientFactory().registerProducer(producerGroupTemp, producer.getDefaultMQProducerImpl()); + + when(mQClientAPIImpl.sendMessage(anyString(), anyString(), any(Message.class), any(SendMessageRequestHeader.class), anyLong(), any(CommunicationMode.class), + nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))).thenCallRealMethod(); + when(mQClientAPIImpl.sendMessage(anyString(), anyString(), any(Message.class), any(SendMessageRequestHeader.class), anyLong(), any(CommunicationMode.class), + nullable(SendCallback.class), nullable(TopicPublishInfo.class), nullable(MQClientInstance.class), anyInt(), nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))) + .thenReturn(createSendResult(SendStatus.SEND_OK)); + + } + + @Test + public void testSendMessageSync_WithTrace_Success() throws RemotingException, InterruptedException, MQBrokerException, MQClientException { + traceProducer.getDefaultMQProducerImpl().getmQClientFactory().registerProducer(producerGroupTraceTemp, traceProducer.getDefaultMQProducerImpl()); + when(mQClientAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); + when(mQClientTraceAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTraceTopicRoute()); + final CountDownLatch countDownLatch = new CountDownLatch(1); + try { + producer.send(message); + }catch (MQClientException e){ + } + countDownLatch.await(3000L, TimeUnit.MILLISECONDS); + + } + + @Test + public void testSendMessageSync_WithTrace_NoBrokerSet_Exception() throws RemotingException, InterruptedException, MQBrokerException, MQClientException { + when(mQClientAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); + when(mQClientTraceAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTraceTopicRoute()); + final CountDownLatch countDownLatch = new CountDownLatch(1); + try { + producer.send(message); + }catch (MQClientException e){ + } + countDownLatch.await(3000L, TimeUnit.MILLISECONDS); + + } + + @After + public void terminate() { + producer.shutdown(); + } + + public static TopicRouteData createTopicRoute() { + TopicRouteData topicRouteData = new TopicRouteData(); + + topicRouteData.setFilterServerTable(new HashMap>()); + List brokerDataList = new ArrayList(); + BrokerData brokerData = new BrokerData(); + brokerData.setBrokerName("BrokerA"); + brokerData.setCluster("DefaultCluster"); + HashMap brokerAddrs = new HashMap(); + brokerAddrs.put(0L, "127.0.0.1:10911"); + brokerData.setBrokerAddrs(brokerAddrs); + brokerDataList.add(brokerData); + topicRouteData.setBrokerDatas(brokerDataList); + + List queueDataList = new ArrayList(); + QueueData queueData = new QueueData(); + queueData.setBrokerName("BrokerA"); + queueData.setPerm(6); + queueData.setReadQueueNums(3); + queueData.setWriteQueueNums(4); + queueData.setTopicSynFlag(0); + queueDataList.add(queueData); + topicRouteData.setQueueDatas(queueDataList); + return topicRouteData; + } + + private SendResult createSendResult(SendStatus sendStatus) { + SendResult sendResult = new SendResult(); + sendResult.setMsgId("123"); + sendResult.setOffsetMsgId("123"); + sendResult.setQueueOffset(456); + sendResult.setSendStatus(sendStatus); + sendResult.setRegionId("HZ"); + return sendResult; + } + + public static TopicRouteData createTraceTopicRoute() { + TopicRouteData topicRouteData = new TopicRouteData(); + + topicRouteData.setFilterServerTable(new HashMap>()); + List brokerDataList = new ArrayList(); + BrokerData brokerData = new BrokerData(); + brokerData.setBrokerName("broker-trace"); + brokerData.setCluster("DefaultCluster"); + HashMap brokerAddrs = new HashMap(); + brokerAddrs.put(0L, "127.0.0.1:10912"); + brokerData.setBrokerAddrs(brokerAddrs); + brokerDataList.add(brokerData); + topicRouteData.setBrokerDatas(brokerDataList); + + List queueDataList = new ArrayList(); + QueueData queueData = new QueueData(); + queueData.setBrokerName("broker-trace"); + queueData.setPerm(6); + queueData.setReadQueueNums(1); + queueData.setWriteQueueNums(1); + queueData.setTopicSynFlag(1); + queueDataList.add(queueData); + topicRouteData.setQueueDatas(queueDataList); + return topicRouteData; + } + + private SendResult createSendTraceResult(SendStatus sendStatus) { + SendResult sendResult = new SendResult(); + sendResult.setMsgId("456"); + sendResult.setOffsetMsgId("456"); + sendResult.setQueueOffset(789); + sendResult.setSendStatus(sendStatus); + sendResult.setRegionId("HZ"); + return sendResult; + } + +} diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index f81af21651..77d492ecbb 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -51,7 +51,8 @@ public class BrokerConfig { @ImportantField private boolean autoCreateSubscriptionGroup = true; private String messageStorePlugIn = ""; - + @ImportantField + private boolean autoTraceBrokerEnable = false; /** * thread numbers for send message thread pool, since spin lock will be used by default since 4.0.x, the default * value is 1. @@ -732,4 +733,12 @@ public class BrokerConfig { public void setWaitTimeMillsInTransactionQueue(long waitTimeMillsInTransactionQueue) { this.waitTimeMillsInTransactionQueue = waitTimeMillsInTransactionQueue; } + + public boolean isAutoTraceBrokerEnable() { + return autoTraceBrokerEnable; + } + + public void setAutoTraceBrokerEnable(boolean autoTraceBrokerEnable) { + this.autoTraceBrokerEnable = autoTraceBrokerEnable; + } } diff --git a/common/src/main/java/org/apache/rocketmq/common/MixAll.java b/common/src/main/java/org/apache/rocketmq/common/MixAll.java index 20d186764e..0573c762ab 100644 --- a/common/src/main/java/org/apache/rocketmq/common/MixAll.java +++ b/common/src/main/java/org/apache/rocketmq/common/MixAll.java @@ -82,7 +82,8 @@ public class MixAll { public static final long CURRENT_JVM_PID = getPID(); public static final String RETRY_GROUP_TOPIC_PREFIX = "%RETRY%"; - + public static final String TRACE_BROKER_NAME_SUFFIX = "trace"; + public static final String DLQ_GROUP_TOPIC_PREFIX = "%DLQ%"; public static final String SYSTEM_TOPIC_PREFIX = "rmq_sys_"; public static final String UNIQUE_MSG_QUERY_FLAG = "_UNIQUE_KEY_QUERY"; @@ -90,6 +91,7 @@ public class MixAll { public static final String CONSUME_CONTEXT_TYPE = "ConsumeContextType"; public static final String RMQ_SYS_TRANS_HALF_TOPIC = "RMQ_SYS_TRANS_HALF_TOPIC"; + public static final String RMQ_SYS_TRACK_TRACE_TOPIC = "RMQ_SYS_TRACK_TRACE_TOPIC"; public static final String RMQ_SYS_TRANS_OP_HALF_TOPIC = "RMQ_SYS_TRANS_OP_HALF_TOPIC"; public static final String CID_SYS_RMQ_TRANS = "CID_RMQ_SYS_TRANS"; diff --git a/distribution/conf/2m-noslave/broker-a.properties b/distribution/conf/2m-noslave/broker-a.properties index b704b54c54..cd051cdc13 100644 --- a/distribution/conf/2m-noslave/broker-a.properties +++ b/distribution/conf/2m-noslave/broker-a.properties @@ -19,3 +19,4 @@ deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH +autoTraceBrokerEnable=false \ No newline at end of file diff --git a/distribution/conf/2m-noslave/broker-b.properties b/distribution/conf/2m-noslave/broker-b.properties index 130671a7c3..da00cd4190 100644 --- a/distribution/conf/2m-noslave/broker-b.properties +++ b/distribution/conf/2m-noslave/broker-b.properties @@ -19,3 +19,4 @@ deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH +autoTraceBrokerEnable=false \ No newline at end of file diff --git a/distribution/conf/2m-noslave/broker-trace.properties b/distribution/conf/2m-noslave/broker-trace.properties new file mode 100644 index 0000000000..a4898aae0c --- /dev/null +++ b/distribution/conf/2m-noslave/broker-trace.properties @@ -0,0 +1,24 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +brokerClusterName=DefaultCluster +brokerName=broker-trace +brokerId=0 +deleteWhen=04 +fileReservedTime=48 +brokerRole=ASYNC_MASTER +flushDiskType=ASYNC_FLUSH +autoTraceBrokerEnable=true \ No newline at end of file diff --git a/example/src/main/java/org/apache/rocketmq/example/batch/SimpleBatchProducer.java b/example/src/main/java/org/apache/rocketmq/example/batch/SimpleBatchProducer.java index cf566aa15b..e1372ccd7e 100644 --- a/example/src/main/java/org/apache/rocketmq/example/batch/SimpleBatchProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/batch/SimpleBatchProducer.java @@ -25,7 +25,7 @@ import org.apache.rocketmq.common.message.Message; public class SimpleBatchProducer { public static void main(String[] args) throws Exception { - DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName"); + DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName",false); producer.start(); //If you just send messages of no more than 1MiB at a time, it is easy to use batch diff --git a/example/src/main/java/org/apache/rocketmq/example/batch/SplitBatchProducer.java b/example/src/main/java/org/apache/rocketmq/example/batch/SplitBatchProducer.java index f9495c4171..eae0800812 100644 --- a/example/src/main/java/org/apache/rocketmq/example/batch/SplitBatchProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/batch/SplitBatchProducer.java @@ -28,7 +28,7 @@ public class SplitBatchProducer { public static void main(String[] args) throws Exception { - DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName"); + DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName",false); producer.start(); //large batch diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java index d431d3ecc6..4b6edf0537 100644 --- a/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java @@ -102,7 +102,7 @@ public class Consumer { } }, 10000, 10000); - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group,false); consumer.setInstanceName(Long.toString(System.currentTimeMillis())); if (filterType == null || expression == null) { diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java index ce2b83f977..16ad133f49 100644 --- a/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java @@ -100,7 +100,7 @@ public class Producer { } }, 10000, 10000); - final DefaultMQProducer producer = new DefaultMQProducer("benchmark_producer"); + final DefaultMQProducer producer = new DefaultMQProducer("benchmark_producer",false); producer.setInstanceName(Long.toString(System.currentTimeMillis())); if (commandLine.hasOption('n')) { diff --git a/example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java index fb1f9bbde7..f1a55c6d61 100644 --- a/example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java @@ -29,7 +29,7 @@ import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; public class PushConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_1"); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_1",false); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); diff --git a/example/src/main/java/org/apache/rocketmq/example/filter/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/filter/Consumer.java index bb491ac40a..262f57a9d2 100644 --- a/example/src/main/java/org/apache/rocketmq/example/filter/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/filter/Consumer.java @@ -30,7 +30,7 @@ import org.apache.rocketmq.common.message.MessageExt; public class Consumer { public static void main(String[] args) throws InterruptedException, MQClientException, IOException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupNamecc4"); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupNamecc4",false); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); File classFile = new File(classLoader.getResource("MessageFilterImpl.java").getFile()); diff --git a/example/src/main/java/org/apache/rocketmq/example/filter/Producer.java b/example/src/main/java/org/apache/rocketmq/example/filter/Producer.java index 2a0da6546c..2d575f99fd 100644 --- a/example/src/main/java/org/apache/rocketmq/example/filter/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/filter/Producer.java @@ -24,7 +24,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class Producer { public static void main(String[] args) throws MQClientException, InterruptedException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",false); producer.start(); try { diff --git a/example/src/main/java/org/apache/rocketmq/example/filter/SqlConsumer.java b/example/src/main/java/org/apache/rocketmq/example/filter/SqlConsumer.java index c41c9c14c3..43409c67de 100644 --- a/example/src/main/java/org/apache/rocketmq/example/filter/SqlConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/filter/SqlConsumer.java @@ -30,7 +30,7 @@ import java.util.List; public class SqlConsumer { public static void main(String[] args) { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4"); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4",false); try { consumer.subscribe("TopicTest", MessageSelector.bySql("(TAGS is not null and TAGS in ('TagA', 'TagB'))" + diff --git a/example/src/main/java/org/apache/rocketmq/example/filter/SqlProducer.java b/example/src/main/java/org/apache/rocketmq/example/filter/SqlProducer.java index 3f3a0e6521..4f319f5c3e 100644 --- a/example/src/main/java/org/apache/rocketmq/example/filter/SqlProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/filter/SqlProducer.java @@ -26,7 +26,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class SqlProducer { public static void main(String[] args) { - DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); + DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name",false); try { producer.start(); } catch (MQClientException e) { diff --git a/example/src/main/java/org/apache/rocketmq/example/operation/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/operation/Consumer.java index 6936f1dcea..c536a14c40 100644 --- a/example/src/main/java/org/apache/rocketmq/example/operation/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/operation/Consumer.java @@ -41,7 +41,7 @@ public class Consumer { String subscription = commandLine.getOptionValue('s'); final String returnFailedHalf = commandLine.getOptionValue('f'); - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group,false); consumer.setInstanceName(Long.toString(System.currentTimeMillis())); consumer.subscribe(topic, subscription); diff --git a/example/src/main/java/org/apache/rocketmq/example/operation/Producer.java b/example/src/main/java/org/apache/rocketmq/example/operation/Producer.java index 1d4336d7fa..20fed39b9f 100644 --- a/example/src/main/java/org/apache/rocketmq/example/operation/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/operation/Producer.java @@ -39,7 +39,7 @@ public class Producer { String keys = commandLine.getOptionValue('k'); String msgCount = commandLine.getOptionValue('c'); - DefaultMQProducer producer = new DefaultMQProducer(group); + DefaultMQProducer producer = new DefaultMQProducer(group,false); producer.setInstanceName(Long.toString(System.currentTimeMillis())); producer.start(); diff --git a/example/src/main/java/org/apache/rocketmq/example/ordermessage/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/ordermessage/Consumer.java index abb274d612..d7b6cd9591 100644 --- a/example/src/main/java/org/apache/rocketmq/example/ordermessage/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/ordermessage/Consumer.java @@ -29,7 +29,7 @@ import org.apache.rocketmq.common.message.MessageExt; public class Consumer { public static void main(String[] args) throws MQClientException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_3"); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_3",false); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); diff --git a/example/src/main/java/org/apache/rocketmq/example/ordermessage/Producer.java b/example/src/main/java/org/apache/rocketmq/example/ordermessage/Producer.java index 6a6bdc7d71..c1e26910a2 100644 --- a/example/src/main/java/org/apache/rocketmq/example/ordermessage/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/ordermessage/Producer.java @@ -32,7 +32,7 @@ import org.apache.rocketmq.remoting.exception.RemotingException; public class Producer { public static void main(String[] args) throws UnsupportedEncodingException { try { - MQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); + MQProducer producer = new DefaultMQProducer("please_rename_unique_group_name",false); producer.start(); String[] tags = new String[] {"TagA", "TagB", "TagC", "TagD", "TagE"}; diff --git a/example/src/main/java/org/apache/rocketmq/example/quickstart/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/quickstart/Consumer.java index 6d3b936507..da70a78ae8 100644 --- a/example/src/main/java/org/apache/rocketmq/example/quickstart/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/quickstart/Consumer.java @@ -35,7 +35,7 @@ public class Consumer { /* * Instantiate with specified consumer group name. */ - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4"); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4",false); /* * Specify name server addresses. diff --git a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java index 53a1d4dd64..3d2d1c6e9b 100644 --- a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java @@ -31,7 +31,7 @@ public class Producer { /* * Instantiate with a producer group name. */ - DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); + DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name",false); /* * Specify name server addresses. diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/AsyncProducer.java b/example/src/main/java/org/apache/rocketmq/example/simple/AsyncProducer.java index d40739c813..14ed57ff93 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/AsyncProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/AsyncProducer.java @@ -30,7 +30,7 @@ public class AsyncProducer { public static void main( String[] args) throws MQClientException, InterruptedException, UnsupportedEncodingException { - DefaultMQProducer producer = new DefaultMQProducer("Jodie_Daily_test"); + DefaultMQProducer producer = new DefaultMQProducer("Jodie_Daily_test",false); producer.start(); producer.setRetryTimesWhenSendAsyncFailed(0); diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/Producer.java b/example/src/main/java/org/apache/rocketmq/example/simple/Producer.java index 7b504dd2a3..5601e66775 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/Producer.java @@ -25,8 +25,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class Producer { public static void main(String[] args) throws MQClientException, InterruptedException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); - + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",true); producer.start(); for (int i = 0; i < 128; i++) diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/PushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/simple/PushConsumer.java index c6c7e39d17..16271bb4bc 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/PushConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/PushConsumer.java @@ -28,11 +28,11 @@ import org.apache.rocketmq.common.message.MessageExt; public class PushConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1"); - consumer.subscribe("Jodie_topic_1023", "*"); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1",true); + consumer.subscribe("TopicTest", "*"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); //wrong time format 2017_0422_221800 - consumer.setConsumeTimestamp("20170422221800"); + consumer.setConsumeTimestamp("20181109221800"); consumer.registerMessageListener(new MessageListenerConcurrently() { @Override diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/TestProducer.java b/example/src/main/java/org/apache/rocketmq/example/simple/TestProducer.java index 576f9cb6fb..f16953e34c 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/TestProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/TestProducer.java @@ -26,7 +26,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class TestProducer { public static void main(String[] args) throws MQClientException, InterruptedException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",false); producer.start(); for (int i = 0; i < 1; i++) diff --git a/logappender/src/main/java/org/apache/rocketmq/logappender/common/ProducerInstance.java b/logappender/src/main/java/org/apache/rocketmq/logappender/common/ProducerInstance.java index d2adac53db..7ba580df97 100644 --- a/logappender/src/main/java/org/apache/rocketmq/logappender/common/ProducerInstance.java +++ b/logappender/src/main/java/org/apache/rocketmq/logappender/common/ProducerInstance.java @@ -63,7 +63,7 @@ public class ProducerInstance { return p; } - DefaultMQProducer defaultMQProducer = new DefaultMQProducer(group); + DefaultMQProducer defaultMQProducer = new DefaultMQProducer(group,false); defaultMQProducer.setNamesrvAddr(nameServerAddress); MQProducer beforeProducer = null; beforeProducer = getProducerInstance().producerMap.putIfAbsent(genKey, defaultMQProducer); diff --git a/logappender/src/test/java/org/apache/rocketmq/logappender/AbstractTestCase.java b/logappender/src/test/java/org/apache/rocketmq/logappender/AbstractTestCase.java index 38904c0bfc..1289393850 100644 --- a/logappender/src/test/java/org/apache/rocketmq/logappender/AbstractTestCase.java +++ b/logappender/src/test/java/org/apache/rocketmq/logappender/AbstractTestCase.java @@ -39,7 +39,7 @@ public class AbstractTestCase { @Before public void mockLoggerAppender() throws Exception { - DefaultMQProducer defaultMQProducer = spy(new DefaultMQProducer("loggerAppender")); + DefaultMQProducer defaultMQProducer = spy(new DefaultMQProducer("loggerAppender",false)); doAnswer(new Answer() { @Override public Void answer(InvocationOnMock invocationOnMock) throws Throwable { diff --git a/test/src/main/java/org/apache/rocketmq/test/client/rmq/RMQNormalConsumer.java b/test/src/main/java/org/apache/rocketmq/test/client/rmq/RMQNormalConsumer.java index ce739be591..a828e8ddf3 100644 --- a/test/src/main/java/org/apache/rocketmq/test/client/rmq/RMQNormalConsumer.java +++ b/test/src/main/java/org/apache/rocketmq/test/client/rmq/RMQNormalConsumer.java @@ -46,7 +46,7 @@ public class RMQNormalConsumer extends AbstractMQConsumer { } public void create(boolean useTLS) { - consumer = new DefaultMQPushConsumer(consumerGroup); + consumer = new DefaultMQPushConsumer(consumerGroup,false); consumer.setInstanceName(RandomUtil.getStringByUUID()); consumer.setNamesrvAddr(nsAddr); try { diff --git a/test/src/main/java/org/apache/rocketmq/test/factory/ProducerFactory.java b/test/src/main/java/org/apache/rocketmq/test/factory/ProducerFactory.java index 66767cc9f0..abd1e3b64e 100644 --- a/test/src/main/java/org/apache/rocketmq/test/factory/ProducerFactory.java +++ b/test/src/main/java/org/apache/rocketmq/test/factory/ProducerFactory.java @@ -24,7 +24,7 @@ import org.apache.rocketmq.test.util.RandomUtil; public class ProducerFactory { public static DefaultMQProducer getRMQProducer(String ns) { - DefaultMQProducer producer = new DefaultMQProducer(RandomUtil.getStringByUUID()); + DefaultMQProducer producer = new DefaultMQProducer(RandomUtil.getStringByUUID(),false); producer.setNamesrvAddr(ns); try { producer.start(); diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/broker/SendMsgStatusCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/broker/SendMsgStatusCommand.java index 69d3b24ca7..4296a53ad0 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/broker/SendMsgStatusCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/broker/SendMsgStatusCommand.java @@ -71,7 +71,7 @@ public class SendMsgStatusCommand implements SubCommand { @Override public void execute(CommandLine commandLine, Options options, RPCHook rpcHook) throws SubCommandException { - final DefaultMQProducer producer = new DefaultMQProducer("PID_SMSC", rpcHook); + final DefaultMQProducer producer = new DefaultMQProducer("PID_SMSC", rpcHook,false); producer.setInstanceName("PID_SMSC_" + System.currentTimeMillis()); try { diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/message/QueryMsgByIdSubCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/message/QueryMsgByIdSubCommand.java index 6bb8caad40..675fc2a812 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/message/QueryMsgByIdSubCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/message/QueryMsgByIdSubCommand.java @@ -213,7 +213,7 @@ public class QueryMsgByIdSubCommand implements SubCommand { public void execute(CommandLine commandLine, Options options, RPCHook rpcHook) throws SubCommandException { DefaultMQAdminExt defaultMQAdminExt = new DefaultMQAdminExt(rpcHook); defaultMQAdminExt.setInstanceName(Long.toString(System.currentTimeMillis())); - DefaultMQProducer defaultMQProducer = new DefaultMQProducer("ReSendMsgById"); + DefaultMQProducer defaultMQProducer = new DefaultMQProducer("ReSendMsgById",false); defaultMQProducer.setInstanceName(Long.toString(System.currentTimeMillis())); try { diff --git a/tools/src/main/java/org/apache/rocketmq/tools/monitor/MonitorService.java b/tools/src/main/java/org/apache/rocketmq/tools/monitor/MonitorService.java index 9bf09ad410..3debb3d15c 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/monitor/MonitorService.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/monitor/MonitorService.java @@ -65,7 +65,7 @@ public class MonitorService { private final DefaultMQPullConsumer defaultMQPullConsumer = new DefaultMQPullConsumer( MixAll.TOOLS_CONSUMER_GROUP); private final DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer( - MixAll.MONITOR_CONSUMER_GROUP); + MixAll.MONITOR_CONSUMER_GROUP,false); public MonitorService(MonitorConfig monitorConfig, MonitorListener monitorListener, RPCHook rpcHook) { this.monitorConfig = monitorConfig; From 3c524c200366a9a8a26e83bafb3b218ff4cda4a2 Mon Sep 17 00:00:00 2001 From: liuchunlong <631521383@qq.com> Date: Tue, 13 Nov 2018 15:34:48 +0800 Subject: [PATCH 36/96] fix comment --- .../org/apache/rocketmq/store/config/MessageStoreConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java b/store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java index 02aa84a3e6..8d60321ed8 100644 --- a/store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java +++ b/store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java @@ -604,7 +604,7 @@ public class MessageStoreConfig { } /** - * Enable transient commitLog store poll only if transientStorePoolEnable is true and the FlushDiskType is + * Enable transient commitLog store pool only if transientStorePoolEnable is true and the FlushDiskType is * ASYNC_FLUSH * * @return true or false From b3aabd485119697003037eacd6efe47b40a70848 Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Tue, 20 Nov 2018 02:00:34 +0800 Subject: [PATCH 37/96] clean --- .../rocketmq/acl/PlainAccessValidator.java | 31 +- .../apache/rocketmq/acl/plug/AclUtils.java | 25 ++ .../acl/plug/engine/PlainAclPlugEngine.java | 289 +++++++++++-- .../plug/engine/PlainAclPlugEngineTest.java | 383 ++++++++++-------- 4 files changed, 494 insertions(+), 234 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java index b8de0d345a..f8bf668b8f 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java @@ -17,42 +17,21 @@ package org.apache.rocketmq.acl; import java.util.HashMap; + import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.AccessResource; -import org.apache.rocketmq.acl.AccessValidator; -import org.apache.rocketmq.acl.plug.AclRemotingService; -import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.ControllerParameters; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.apache.rocketmq.remoting.protocol.RemotingCommand; -public class PlainAccessValidator implements AclRemotingService, AccessValidator { +public class PlainAccessValidator implements AccessValidator { - private AclPlugEngine aclPlugEngine; + + private PlainAclPlugEngine aclPlugEngine; public PlainAccessValidator() { - ControllerParameters controllerParameters = new ControllerParameters(); - this.aclPlugEngine = new PlainAclPlugEngine(controllerParameters); - this.aclPlugEngine.initialize(); - } - - public PlainAccessValidator(AclPlugEngine aclPlugEngine) { - this.aclPlugEngine = aclPlugEngine; - } - - @Override - public AuthenticationResult check(AccessControl accessControl) { - AuthenticationResult authenticationResult = aclPlugEngine.eachCheckLoginAndAuthentication(accessControl); - if (authenticationResult.getException() != null) { - throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessControl.toString()), authenticationResult.getException()); - } - if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { - throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessControl.toString())); - } - return authenticationResult; + aclPlugEngine = new PlainAclPlugEngine(); } @Override diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java index df997b59df..19f2b234df 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java @@ -16,8 +16,13 @@ */ package org.apache.rocketmq.acl.plug; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; +import org.yaml.snakeyaml.Yaml; public class AclUtils { @@ -79,4 +84,24 @@ public class AclUtils { return minus.indexOf('-') > -1; } + + + public static T getYamlDataObject(String path ,Class clazz) { + Yaml ymal = new Yaml(); + FileInputStream fis = null; + try { + fis = new FileInputStream(new File(path)); + return ymal.loadAs(fis, clazz); + } catch (Exception e) { + throw new AclPlugRuntimeException(String.format("The transport.yml file for Plain mode was not found , paths %s", path), e); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + throw new AclPlugRuntimeException("close transport fileInputStream Exception", e); + } + } + } + } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java index bcb89b8fa2..c5aadbf0b3 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java @@ -16,45 +16,264 @@ */ package org.apache.rocketmq.acl.plug.engine; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; -import org.apache.rocketmq.acl.plug.entity.ControllerParameters; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.plug.AclUtils; +import org.apache.rocketmq.acl.plug.entity.AccessControl; +import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; +import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; +import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; -import org.yaml.snakeyaml.Yaml; +import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; +import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; +import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.common.constant.LoggerName; +import org.apache.rocketmq.common.protocol.RequestCode; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +public class PlainAclPlugEngine { -public class PlainAclPlugEngine extends LoginInfoAclPlugEngine { + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); - public PlainAclPlugEngine( - ControllerParameters controllerParameters) throws AclPlugRuntimeException { - super(controllerParameters); - } + private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, + System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - public void initialize() throws AclPlugRuntimeException { - String filePath = controllerParameters.getFileHome() + "/conf/transport.yml"; - Yaml ymal = new Yaml(); - FileInputStream fis = null; - BorkerAccessControlTransport transport; - try { - fis = new FileInputStream(new File(filePath)); - transport = ymal.loadAs(fis, BorkerAccessControlTransport.class); - } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("The transport.yml file for Plain mode was not found , paths %s", filePath), e); - } finally { - if (fis != null) { - try { - fis.close(); - } catch (IOException e) { - throw new AclPlugRuntimeException("close transport fileInputStream Exception", e); - } - } - } - if (transport == null) { - throw new AclPlugRuntimeException("transport.yml file is no data"); - } - super.setBorkerAccessControlTransport(transport); - } + private Map> accessControlMap = new HashMap<>(); + private AuthenticationInfo authenticationInfo; + + private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); + + private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + + private Class accessContralAnalysisClass = RequestCode.class; + + + public PlainAclPlugEngine() { + initialize(); + } + + public void initialize() { + BorkerAccessControlTransport accessControlTransport = AclUtils.getYamlDataObject(fileHome + "/conf/transport.yml", BorkerAccessControlTransport.class); + if (accessControlTransport == null) { + throw new AclPlugRuntimeException("transport.yml file is no data"); + } + accessContralAnalysis.analysisClass(accessContralAnalysisClass); + setBorkerAccessControlTransport(accessControlTransport); + } + + public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { + if (accessControl.getAccount() == null || accessControl.getPassword() == null + || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { + throw new AclPlugRuntimeException(String.format( + "The account password cannot be null and is longer than 6, account is %s password is %s", + accessControl.getAccount(), accessControl.getPassword())); + } + try { + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); + if (accessControlAddressList == null) { + accessControlAddressList = new ArrayList<>(); + accessControlMap.put(accessControl.getAccount(), accessControlAddressList); + } + AuthenticationInfo authenticationInfo = new AuthenticationInfo( + accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategy); + accessControlAddressList.add(authenticationInfo); + log.info("authenticationInfo is {}", authenticationInfo.toString()); + } catch (Exception e) { + throw new AclPlugRuntimeException( + String.format("Exception info %s %s", e.getMessage(), accessControl.toString()), e); + } + } + + public void setAccessControlList(List accessControlList) throws AclPlugRuntimeException { + for (AccessControl accessControl : accessControlList) { + setAccessControl(accessControl); + } + } + + public void setNetaddressAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { + try { + authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl,netaddressStrategyFactory.getNetaddressStrategy(accessControl)); + log.info("default authenticationInfo is {}", authenticationInfo.toString()); + } catch (Exception e) { + throw new AclPlugRuntimeException(accessControl.toString(), e); + } + + } + + public AuthenticationInfo getAccessControl(AccessControl accessControl) { + if (accessControl.getAccount() == null && authenticationInfo != null) { + return authenticationInfo.getNetaddressStrategy().match(accessControl) ? authenticationInfo : null; + } else { + List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); + if (accessControlAddressList != null) { + for (AuthenticationInfo ai : accessControlAddressList) { + if (ai.getNetaddressStrategy().match(accessControl)&& ai.getAccessControl().getPassword().equals(accessControl.getPassword())) { + return ai; + } + } + } + } + return null; + } + + public AuthenticationResult eachCheckAuthentication(AccessControl accessControl) { + AuthenticationResult authenticationResult = new AuthenticationResult(); + AuthenticationInfo authenticationInfo = getAccessControl(accessControl); + if (authenticationInfo != null) { + boolean boo = authentication(authenticationInfo, accessControl, authenticationResult); + authenticationResult.setSucceed(boo); + authenticationResult.setAccessControl(authenticationInfo.getAccessControl()); + } else { + authenticationResult.setResultString("accessControl is null, Please check login, password, IP\""); + } + return authenticationResult; + } + + void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { + if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { + throw new AclPlugRuntimeException("onlyNetAddress and list can't be all empty"); + } + + if (transport.getOnlyNetAddress() != null) { + this.setNetaddressAccessControl(transport.getOnlyNetAddress()); + } + if (transport.getList() != null || transport.getList().size() > 0) { + for (AccessControl accessControl : transport.getList()) { + this.setAccessControl(accessControl); + } + } + } + + public boolean authentication(AuthenticationInfo authenticationInfo, AccessControl accessControl, + AuthenticationResult authenticationResult) { + int code = accessControl.getCode(); + if (!authenticationInfo.getAuthority().get(code)) { + authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); + return false; + } + if (!(authenticationInfo.getAccessControl() instanceof BorkerAccessControl)) { + return true; + } + BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); + String topicName = accessControl.getTopic(); + if (code == 10 || code == 310 || code == 320) { + if (borker.getPermitSendTopic().contains(topicName)) { + return true; + } + if (borker.getNoPermitSendTopic().contains(topicName)) { + authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); + return false; + } + return borker.getPermitSendTopic().isEmpty() ? true : false; + } else if (code == 11) { + if (borker.getPermitPullTopic().contains(topicName)) { + return true; + } + if (borker.getNoPermitPullTopic().contains(topicName)) { + authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); + return false; + } + return borker.getPermitPullTopic().isEmpty() ? true : false; + } + return true; + } + + + public static class AccessContralAnalysis { + + private Map, Map> classTocodeAndMentod = new HashMap<>(); + + private Map fieldNameAndCode = new HashMap<>(); + + public void analysisClass(Class clazz) { + Field[] fields = clazz.getDeclaredFields(); + try { + for (Field field : fields) { + if (field.getType().equals(int.class)) { + String name = StringUtils.replace(field.getName(), "_", "").toLowerCase(); + fieldNameAndCode.put(name, (Integer) field.get(null)); + } + } + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new AclPlugRuntimeException(String.format("analysis on failure Class is %s", clazz.getName()), e); + } + } + + public Map analysis(AccessControl accessControl) { + Class clazz = accessControl.getClass(); + Map codeAndField = classTocodeAndMentod.get(clazz); + if (codeAndField == null) { + codeAndField = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + if (!field.getType().equals(boolean.class)) + continue; + Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); + if (code == null) { + throw new AclPlugRuntimeException( + String.format("field nonexistent in code fieldName is %s", field.getName())); + } + field.setAccessible(true); + codeAndField.put(code, field); + + } + if (codeAndField.isEmpty()) { + throw new AclPlugRuntimeException(String.format("AccessControl nonexistent code , name %s", + accessControl.getClass().getName())); + } + classTocodeAndMentod.put(clazz, codeAndField); + } + Iterator> it = codeAndField.entrySet().iterator(); + Map authority = new HashMap<>(); + try { + while (it.hasNext()) { + Entry e = it.next(); + authority.put(e.getKey(), (Boolean) e.getValue().get(accessControl)); + } + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new AclPlugRuntimeException( + String.format("analysis on failure AccessControl is %s", AccessControl.class.getName()), e); + } + return authority; + } + + } + + public static class BorkerAccessControlTransport { + + private BorkerAccessControl onlyNetAddress; + + private List list; + + public BorkerAccessControl getOnlyNetAddress() { + return onlyNetAddress; + } + + public void setOnlyNetAddress(BorkerAccessControl onlyNetAddress) { + this.onlyNetAddress = onlyNetAddress; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + @Override + public String toString() { + return "BorkerAccessControlTransport [onlyNetAddress=" + onlyNetAddress + ", list=" + list + "]"; + } + } } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java index 83004bc2c2..616cb5c3bb 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java @@ -16,245 +16,282 @@ */ package org.apache.rocketmq.acl.plug.engine; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; -import java.net.URL; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.Set; + +import org.apache.rocketmq.acl.plug.AccessContralAnalysis; +import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine.BorkerAccessControlTransport; import org.apache.rocketmq.acl.plug.entity.AccessControl; import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; -import org.apache.rocketmq.acl.plug.entity.ControllerParameters; -import org.apache.rocketmq.acl.plug.entity.LoginInfo; import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; -import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; +import org.apache.rocketmq.common.protocol.RequestCode; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.internal.util.reflection.FieldSetter; import org.mockito.junit.MockitoJUnitRunner; -import org.yaml.snakeyaml.Yaml; @RunWith(MockitoJUnitRunner.class) public class PlainAclPlugEngineTest { + + PlainAclPlugEngine plainAclPlugEngine; - PlainAclPlugEngine plainAclPlugEngine; + AccessControl accessControl; - BorkerAccessControlTransport transport; + AccessControl accessControlTwo; - AccessControl accessControl; + AuthenticationInfo authenticationInfo; - AccessControl accessControlTwo; + BorkerAccessControl borkerAccessControl; - Map loginInfoMap; + @Before + public void init() throws NoSuchFieldException, SecurityException, IOException { - @Before - public void init() throws NoSuchFieldException, SecurityException, IOException { - System.setProperty("rocketmq.home.dir", "src/test/resources"); - ControllerParameters controllerParametersEntity = new ControllerParameters(); - Yaml ymal = new Yaml(); - transport = ymal.loadAs(new FileInputStream(new File(controllerParametersEntity.getFileHome()+"/conf/transport.yml")), BorkerAccessControlTransport.class); - - plainAclPlugEngine = new PlainAclPlugEngine(controllerParametersEntity); - plainAclPlugEngine.initialize(); + borkerAccessControl = new BorkerAccessControl(); + // 321 + borkerAccessControl.setQueryConsumeQueue(false); - - accessControl = new BorkerAccessControl(); - accessControl.setAccount("rokcetmq"); - accessControl.setPassword("aliyun11"); - accessControl.setNetaddress("127.0.0.1"); - accessControl.setRecognition("127.0.0.1:1"); + Set permitSendTopic = new HashSet<>(); + permitSendTopic.add("permitSendTopic"); + borkerAccessControl.setPermitSendTopic(permitSendTopic); - accessControlTwo = new BorkerAccessControl(); - accessControlTwo.setAccount("rokcet1"); - accessControlTwo.setPassword("aliyun1"); - accessControlTwo.setNetaddress("127.0.0.1"); - accessControlTwo.setRecognition("127.0.0.1:2"); + Set noPermitSendTopic = new HashSet<>(); + noPermitSendTopic.add("noPermitSendTopic"); + borkerAccessControl.setNoPermitSendTopic(noPermitSendTopic); - loginInfoMap = new ConcurrentHashMap<>(); - FieldSetter.setField(plainAclPlugEngine, plainAclPlugEngine.getClass().getSuperclass().getDeclaredField("loginInfoMap"), loginInfoMap); + Set permitPullTopic = new HashSet<>(); + permitPullTopic.add("permitPullTopic"); + borkerAccessControl.setPermitPullTopic(permitPullTopic); - } + Set noPermitPullTopic = new HashSet<>(); + noPermitPullTopic.add("noPermitPullTopic"); + borkerAccessControl.setNoPermitPullTopic(noPermitPullTopic); - @Test(expected = AclPlugRuntimeException.class) - public void accountNullTest() { - accessControl.setAccount(null); - plainAclPlugEngine.setAccessControl(accessControl); - } + AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + accessContralAnalysis.analysisClass(RequestCode.class); + Map map = accessContralAnalysis.analysis(borkerAccessControl); - @Test(expected = AclPlugRuntimeException.class) - public void accountThanTest() { - accessControl.setAccount("123"); - plainAclPlugEngine.setAccessControl(accessControl); - } + authenticationInfo = new AuthenticationInfo(map, borkerAccessControl,NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); - @Test(expected = AclPlugRuntimeException.class) - public void passWordtNullTest() { - accessControl.setAccount(null); - plainAclPlugEngine.setAccessControl(accessControl); - } + System.setProperty("rocketmq.home.dir", "src/test/resources"); + plainAclPlugEngine = new PlainAclPlugEngine(); + plainAclPlugEngine.initialize(); - @Test(expected = AclPlugRuntimeException.class) - public void passWordThanTest() { - accessControl.setAccount("123"); - plainAclPlugEngine.setAccessControl(accessControl); - } + accessControl = new BorkerAccessControl(); + accessControl.setAccount("rokcetmq"); + accessControl.setPassword("aliyun11"); + accessControl.setNetaddress("127.0.0.1"); + accessControl.setRecognition("127.0.0.1:1"); - @Test(expected = AclPlugRuntimeException.class) - public void testPlainAclPlugEngineInit() { - ControllerParameters controllerParametersEntity = new ControllerParameters(); - controllerParametersEntity.setFileHome(""); - new PlainAclPlugEngine(controllerParametersEntity).initialize(); + accessControlTwo = new BorkerAccessControl(); + accessControlTwo.setAccount("rokcet1"); + accessControlTwo.setPassword("aliyun1"); + accessControlTwo.setNetaddress("127.0.0.1"); + accessControlTwo.setRecognition("127.0.0.1:2"); - } + } - @Test - public void authenticationInfoOfSetAccessControl() { - AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; - aclPlugEngine.setAccessControl(accessControl); + @Test(expected = AclPlugRuntimeException.class) + public void accountNullTest() { + accessControl.setAccount(null); + plainAclPlugEngine.setAccessControl(accessControl); + } - AuthenticationInfo authenticationInfo = aclPlugEngine.getAccessControl(accessControl); + @Test(expected = AclPlugRuntimeException.class) + public void accountThanTest() { + accessControl.setAccount("123"); + plainAclPlugEngine.setAccessControl(accessControl); + } - AccessControl getAccessControl = authenticationInfo.getAccessControl(); - Assert.assertEquals(accessControl, getAccessControl); + @Test(expected = AclPlugRuntimeException.class) + public void passWordtNullTest() { + accessControl.setAccount(null); + plainAclPlugEngine.setAccessControl(accessControl); + } - AccessControl testAccessControl = new AccessControl(); - testAccessControl.setAccount("rokcetmq"); - testAccessControl.setPassword("aliyun11"); - testAccessControl.setNetaddress("127.0.0.1"); - testAccessControl.setRecognition("127.0.0.1:1"); + @Test(expected = AclPlugRuntimeException.class) + public void passWordThanTest() { + accessControl.setAccount("123"); + plainAclPlugEngine.setAccessControl(accessControl); + } - testAccessControl.setAccount("rokcetmq1"); - authenticationInfo = aclPlugEngine.getAccessControl(testAccessControl); - Assert.assertNull(authenticationInfo); + @Test(expected = AclPlugRuntimeException.class) + public void testPlainAclPlugEngineInit() { + System.setProperty("rocketmq.home.dir", ""); + new PlainAclPlugEngine().initialize(); + } - testAccessControl.setAccount("rokcetmq"); - testAccessControl.setPassword("1234567"); - authenticationInfo = aclPlugEngine.getAccessControl(testAccessControl); - Assert.assertNull(authenticationInfo); + @Test + public void authenticationInfoOfSetAccessControl() { + plainAclPlugEngine.setAccessControl(accessControl); - testAccessControl.setNetaddress("127.0.0.2"); - authenticationInfo = aclPlugEngine.getAccessControl(testAccessControl); - Assert.assertNull(authenticationInfo); - } + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); - @Test - public void setAccessControlList() { - List accessControlList = new ArrayList<>(); - accessControlList.add(accessControl); + AccessControl getAccessControl = authenticationInfo.getAccessControl(); + Assert.assertEquals(accessControl, getAccessControl); - accessControlList.add(accessControlTwo); + AccessControl testAccessControl = new AccessControl(); + testAccessControl.setAccount("rokcetmq"); + testAccessControl.setPassword("aliyun11"); + testAccessControl.setNetaddress("127.0.0.1"); + testAccessControl.setRecognition("127.0.0.1:1"); - plainAclPlugEngine.setAccessControlList(accessControlList); + testAccessControl.setAccount("rokcetmq1"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); - AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; - AuthenticationInfo newAccessControl = aclPlugEngine.getAccessControl(accessControl); - Assert.assertEquals(accessControl, newAccessControl.getAccessControl()); + testAccessControl.setAccount("rokcetmq"); + testAccessControl.setPassword("1234567"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); - newAccessControl = aclPlugEngine.getAccessControl(accessControlTwo); - Assert.assertEquals(accessControlTwo, newAccessControl.getAccessControl()); + testAccessControl.setNetaddress("127.0.0.2"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); + } - } + @Test + public void setAccessControlList() { + List accessControlList = new ArrayList<>(); + accessControlList.add(accessControl); - @Test - public void setNetaddressAccessControl() { - AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; - AccessControl accessControl = new BorkerAccessControl(); - accessControl.setAccount("RocketMQ"); - accessControl.setPassword("RocketMQ"); - accessControl.setNetaddress("127.0.0.1"); - aclPlugEngine.setAccessControl(accessControl); - aclPlugEngine.setNetaddressAccessControl(accessControl); + accessControlList.add(accessControlTwo); - AuthenticationInfo authenticationInfo = aclPlugEngine.getAccessControl(accessControl); + plainAclPlugEngine.setAccessControlList(accessControlList); - AccessControl getAccessControl = authenticationInfo.getAccessControl(); - Assert.assertEquals(accessControl, getAccessControl); + AuthenticationInfo newAccessControl = plainAclPlugEngine.getAccessControl(accessControl); + Assert.assertEquals(accessControl, newAccessControl.getAccessControl()); - accessControl.setNetaddress("127.0.0.2"); - authenticationInfo = aclPlugEngine.getAccessControl(accessControl); - Assert.assertNull(authenticationInfo); - } + newAccessControl = plainAclPlugEngine.getAccessControl(accessControlTwo); + Assert.assertEquals(accessControlTwo, newAccessControl.getAccessControl()); - public void eachCheckLoginAndAuthentication() { + } - } + @Test + public void setNetaddressAccessControl() { + AccessControl accessControl = new BorkerAccessControl(); + accessControl.setAccount("RocketMQ"); + accessControl.setPassword("RocketMQ"); + accessControl.setNetaddress("127.0.0.1"); + plainAclPlugEngine.setAccessControl(accessControl); + plainAclPlugEngine.setNetaddressAccessControl(accessControl); - @Test(expected = AclPlugRuntimeException.class) - public void borkerAccessControlTransportTestNull() { - plainAclPlugEngine.setBorkerAccessControlTransport(new BorkerAccessControlTransport()); - } + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); - @Test - public void borkerAccessControlTransportTest() { - BorkerAccessControlTransport borkerAccessControlTransprt = new BorkerAccessControlTransport(); - borkerAccessControlTransprt.setOnlyNetAddress((BorkerAccessControl) this.accessControl); - List list = new ArrayList<>(); - list.add((BorkerAccessControl) this.accessControlTwo); - borkerAccessControlTransprt.setList(list); - plainAclPlugEngine.setBorkerAccessControlTransport(borkerAccessControlTransprt); + AccessControl getAccessControl = authenticationInfo.getAccessControl(); + Assert.assertEquals(accessControl, getAccessControl); - AuthenticationInfoManagementAclPlugEngine aclPlugEngine = (AuthenticationInfoManagementAclPlugEngine) plainAclPlugEngine; - AccessControl accessControl = new BorkerAccessControl(); - accessControl.setAccount("RocketMQ"); - accessControl.setPassword("RocketMQ"); - accessControl.setNetaddress("127.0.0.1"); - aclPlugEngine.setAccessControl(accessControl); - AuthenticationInfo authenticationInfo = aclPlugEngine.getAccessControl(accessControl); - Assert.assertNotNull(authenticationInfo.getAccessControl()); + accessControl.setNetaddress("127.0.0.2"); + authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + Assert.assertNull(authenticationInfo); + } - authenticationInfo = aclPlugEngine.getAccessControl(accessControlTwo); - Assert.assertEquals(accessControlTwo, authenticationInfo.getAccessControl()); + public void eachCheckLoginAndAuthentication() { - } + } - @Test - public void getLoginInfo() { - plainAclPlugEngine.setAccessControl(accessControl); - LoginInfo loginInfo = plainAclPlugEngine.getLoginInfo(accessControl); - Assert.assertNotNull(loginInfo); + @Test(expected = AclPlugRuntimeException.class) + public void borkerAccessControlTransportTestNull() { + BorkerAccessControlTransport accessControlTransport = new BorkerAccessControlTransport(); + plainAclPlugEngine.setBorkerAccessControlTransport(accessControlTransport); + } - loginInfo = plainAclPlugEngine.getLoginInfo(accessControlTwo); - Assert.assertNull(loginInfo); + @Test + public void borkerAccessControlTransportTest() { + BorkerAccessControlTransport accessControlTransport = new BorkerAccessControlTransport(); + List list = new ArrayList<>(); + list.add((BorkerAccessControl) this.accessControlTwo); + accessControlTransport.setOnlyNetAddress((BorkerAccessControl) this.accessControl); + accessControlTransport.setList(list); + plainAclPlugEngine.setBorkerAccessControlTransport(accessControlTransport); - } + AccessControl accessControl = new BorkerAccessControl(); + accessControl.setAccount("RocketMQ"); + accessControl.setPassword("RocketMQ"); + accessControl.setNetaddress("127.0.0.1"); + plainAclPlugEngine.setAccessControl(accessControl); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + Assert.assertNotNull(authenticationInfo.getAccessControl()); - @Test - public void deleteLoginInfo() { - plainAclPlugEngine.setAccessControl(accessControl); - plainAclPlugEngine.getLoginInfo(accessControl); + authenticationInfo = plainAclPlugEngine.getAccessControl(accessControlTwo); + Assert.assertEquals(accessControlTwo, authenticationInfo.getAccessControl()); - LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); - Assert.assertNotNull(loginInfo); + } - plainAclPlugEngine.deleteLoginInfo(accessControl.getRecognition()); + @Test + public void authenticationTest() { + AuthenticationResult authenticationResult = new AuthenticationResult(); + accessControl.setCode(317); - loginInfo = loginInfoMap.get(accessControl.getRecognition()); - Assert.assertNull(loginInfo); - } + boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); - @Test - public void getAuthenticationInfo() { - AccessControl newAccessControl = new AccessControl(); - newAccessControl.setAccount("rokcetmq"); - newAccessControl.setPassword("aliyun11"); - newAccessControl.setNetaddress("127.0.0.1"); - newAccessControl.setRecognition("127.0.0.1:1"); + accessControl.setCode(321); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); - AuthenticationResult authenticationResult = new AuthenticationResult(); - plainAclPlugEngine.getAuthenticationInfo(newAccessControl, authenticationResult); - Assert.assertEquals("Login information does not exist, Please check login, password, IP", authenticationResult.getResultString()); + accessControl.setCode(10); + accessControl.setTopic("permitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); - plainAclPlugEngine.setAccessControl(accessControl); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAuthenticationInfo(newAccessControl, authenticationResult); - Assert.assertNotNull(authenticationInfo); + accessControl.setCode(310); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); - } + accessControl.setCode(320); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setTopic("noPermitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + accessControl.setTopic("nopermitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + accessControl.setCode(11); + accessControl.setTopic("permitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setTopic("noPermitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + accessControl.setTopic("nopermitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + } + + @Test + public void isEmptyTest() { + AuthenticationResult authenticationResult = new AuthenticationResult(); + accessControl.setCode(10); + accessControl.setTopic("absentTopic"); + boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + Set permitSendTopic = new HashSet<>(); + borkerAccessControl.setPermitSendTopic(permitSendTopic); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setCode(11); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + borkerAccessControl.setPermitPullTopic(permitSendTopic); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + } } From 1d57607641f561380eaa87905c49fd0541093902 Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Tue, 20 Nov 2018 02:06:23 +0800 Subject: [PATCH 38/96] clean --- .../acl/plug/AccessContralAnalysis.java | 85 ---------- .../rocketmq/acl/plug/AclPlugController.java | 60 ------- .../rocketmq/acl/plug/AclRemotingService.java | 26 --- .../rocketmq/acl/plug/Authentication.java | 59 ------- .../acl/plug/engine/AclPlugEngine.java | 37 ----- ...enticationInfoManagementAclPlugEngine.java | 152 ------------------ .../plug/engine/LoginInfoAclPlugEngine.java | 66 -------- .../entity/BorkerAccessControlTransport.java | 52 ------ .../acl/plug/entity/ControllerParameters.java | 52 ------ .../rocketmq/acl/plug/entity/LoginInfo.java | 82 ---------- .../acl/plug/AclPlugControllerTest.java | 21 --- .../acl/plug/AclRemotingServiceTest.java | 148 ----------------- 12 files changed, 840 deletions(-) delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java delete mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java delete mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java deleted file mode 100644 index 1adf6d432e..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessContralAnalysis.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -public class AccessContralAnalysis { - - private Map, Map> classTocodeAndMentod = new HashMap<>(); - - private Map fieldNameAndCode = new HashMap<>(); - - public void analysisClass(Class clazz) { - Field[] fields = clazz.getDeclaredFields(); - try { - for (Field field : fields) { - if (field.getType().equals(int.class)) { - String name = StringUtils.replace(field.getName(), "_", "").toLowerCase(); - fieldNameAndCode.put(name, (Integer) field.get(null)); - } - - } - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugRuntimeException(String.format("analysis on failure Class is %s", clazz.getName()), e); - } - } - - public Map analysis(AccessControl accessControl) { - Class clazz = accessControl.getClass(); - Map codeAndField = classTocodeAndMentod.get(clazz); - if (codeAndField == null) { - codeAndField = new HashMap<>(); - Field[] fields = clazz.getDeclaredFields(); - for (Field field : fields) { - if (!field.getType().equals(boolean.class)) - continue; - Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); - if (code == null) { - throw new AclPlugRuntimeException(String.format("field nonexistent in code fieldName is %s", field.getName())); - } - field.setAccessible(true); - codeAndField.put(code, field); - - } - if (codeAndField.isEmpty()) { - throw new AclPlugRuntimeException(String.format("AccessControl nonexistent code , name %s", accessControl.getClass().getName())); - } - classTocodeAndMentod.put(clazz, codeAndField); - } - Iterator> it = codeAndField.entrySet().iterator(); - Map authority = new HashMap<>(); - try { - while (it.hasNext()) { - Entry e = it.next(); - authority.put(e.getKey(), (Boolean) e.getValue().get(accessControl)); - } - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugRuntimeException(String.format("analysis on failure AccessControl is %s", AccessControl.class.getName()), e); - } - return authority; - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java deleted file mode 100644 index 8598e93e9c..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugController.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -import org.apache.rocketmq.acl.PlainAccessValidator; -import org.apache.rocketmq.acl.plug.engine.AclPlugEngine; -import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; -import org.apache.rocketmq.acl.plug.entity.ControllerParameters; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; - -public class AclPlugController { - - private ControllerParameters controllerParameters; - - private AclPlugEngine aclPlugEngine; - - private AclRemotingService aclRemotingService; - - private boolean startSucceed = false; - - public AclPlugController(ControllerParameters controllerParameters) throws AclPlugRuntimeException { - try { - this.controllerParameters = controllerParameters; - aclPlugEngine = new PlainAclPlugEngine(controllerParameters); - aclPlugEngine.initialize(); - aclRemotingService = new PlainAccessValidator(aclPlugEngine); - this.startSucceed = true; - } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("Start the abnormal , Launch parameters is %s", this.controllerParameters.toString()), e); - } - } - - public AclRemotingService getAclRemotingService() { - return this.aclRemotingService; - } - - public void doChannelCloseEvent(String remoteAddr) { - if (this.startSucceed) { - aclPlugEngine.deleteLoginInfo(remoteAddr); - } - } - - public boolean isStartSucceed() { - return startSucceed; - } -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java deleted file mode 100644 index c651a5d99f..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclRemotingService.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; - -public interface AclRemotingService { - - public AuthenticationResult check(AccessControl accessControl); - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java deleted file mode 100644 index ae247e7220..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/Authentication.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; - -public class Authentication { - - public boolean authentication(AuthenticationInfo authenticationInfo, - AccessControl accessControl, AuthenticationResult authenticationResult) { - int code = accessControl.getCode(); - if (!authenticationInfo.getAuthority().get(code)) { - authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); - return false; - } - if (!(authenticationInfo.getAccessControl() instanceof BorkerAccessControl)) { - return true; - } - BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); - String topicName = accessControl.getTopic(); - if (code == 10 || code == 310 || code == 320) { - if (borker.getPermitSendTopic().contains(topicName)) { - return true; - } - if (borker.getNoPermitSendTopic().contains(topicName)) { - authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); - return false; - } - return borker.getPermitSendTopic().isEmpty() ? true : false; - } else if (code == 11) { - if (borker.getPermitPullTopic().contains(topicName)) { - return true; - } - if (borker.getNoPermitPullTopic().contains(topicName)) { - authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); - return false; - } - return borker.getPermitPullTopic().isEmpty() ? true : false; - } - return true; - } -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java deleted file mode 100644 index d1572755ee..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AclPlugEngine.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; - -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.LoginInfo; - -public interface AclPlugEngine { - - public AuthenticationInfo getAccessControl(AccessControl accessControl); - - public LoginInfo getLoginInfo(AccessControl accessControl); - - public void deleteLoginInfo(String remoteAddr); - - public AuthenticationResult eachCheckLoginAndAuthentication(AccessControl accessControl); - - public AuthenticationResult eachCheckAuthentication(AccessControl accessControl); - - public void initialize(); -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java deleted file mode 100644 index a6399fc3e4..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/AuthenticationInfoManagementAclPlugEngine.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.rocketmq.acl.plug.AccessContralAnalysis; -import org.apache.rocketmq.acl.plug.Authentication; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControlTransport; -import org.apache.rocketmq.acl.plug.entity.ControllerParameters; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; -import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; -import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.logging.InternalLogger; -import org.apache.rocketmq.logging.InternalLoggerFactory; - -public abstract class AuthenticationInfoManagementAclPlugEngine implements AclPlugEngine { - - private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); - ControllerParameters controllerParameters; - private Map> accessControlMap = new HashMap<>(); - private AuthenticationInfo authenticationInfo; - private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); - private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - private Authentication authentication = new Authentication(); - - public AuthenticationInfoManagementAclPlugEngine(ControllerParameters controllerParameters) { - this.controllerParameters = controllerParameters; - accessContralAnalysis.analysisClass(controllerParameters.getAccessContralAnalysisClass()); - } - - public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { - if (accessControl.getAccount() == null || accessControl.getPassword() == null || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { - throw new AclPlugRuntimeException(String.format("The account password cannot be null and is longer than 6, account is %s password is %s", accessControl.getAccount(), accessControl.getPassword())); - } - try { - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); - if (accessControlAddressList == null) { - accessControlAddressList = new ArrayList<>(); - accessControlMap.put(accessControl.getAccount(), accessControlAddressList); - } - AuthenticationInfo authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategy); - accessControlAddressList.add(authenticationInfo); - log.info("authenticationInfo is {}", authenticationInfo.toString()); - } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("Exception info %s %s", e.getMessage(), accessControl.toString()), e); - } - } - - public void setAccessControlList(List accessControlList) throws AclPlugRuntimeException { - for (AccessControl accessControl : accessControlList) { - setAccessControl(accessControl); - } - } - - public void setNetaddressAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { - try { - authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategyFactory.getNetaddressStrategy(accessControl)); - log.info("default authenticationInfo is {}", authenticationInfo.toString()); - } catch (Exception e) { - throw new AclPlugRuntimeException(accessControl.toString(), e); - } - - } - - public AuthenticationInfo getAccessControl(AccessControl accessControl) { - if (accessControl.getAccount() == null && authenticationInfo != null) { - return authenticationInfo.getNetaddressStrategy().match(accessControl) ? authenticationInfo : null; - } else { - List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); - if (accessControlAddressList != null) { - for (AuthenticationInfo ai : accessControlAddressList) { - if (ai.getNetaddressStrategy().match(accessControl) && ai.getAccessControl().getPassword().equals(accessControl.getPassword())) { - return ai; - } - } - } - } - return null; - } - - @Override - public AuthenticationResult eachCheckLoginAndAuthentication(AccessControl accessControl) { - AuthenticationResult authenticationResult = new AuthenticationResult(); - try { - AuthenticationInfo authenticationInfo = getAuthenticationInfo(accessControl, authenticationResult); - if (authenticationInfo != null) { - boolean boo = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - authenticationResult.setSucceed(boo); - authenticationResult.setAccessControl(authenticationInfo.getAccessControl()); - } - } catch (Exception e) { - authenticationResult.setException(e); - } - return authenticationResult; - } - - public AuthenticationResult eachCheckAuthentication(AccessControl accessControl) { - AuthenticationResult authenticationResult = new AuthenticationResult(); - AuthenticationInfo authenticationInfo = getAccessControl(accessControl); - if (authenticationInfo != null) { - boolean boo = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - authenticationResult.setSucceed(boo); - authenticationResult.setAccessControl(authenticationInfo.getAccessControl()); - } else { - authenticationResult.setResultString("accessControl is null, Please check login, password, IP\""); - } - - - return authenticationResult; - } - - void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { - if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { - throw new AclPlugRuntimeException("onlyNetAddress and list can't be all empty"); - } - - if (transport.getOnlyNetAddress() != null) { - this.setNetaddressAccessControl(transport.getOnlyNetAddress()); - } - if (transport.getList() != null || transport.getList().size() > 0) { - for (AccessControl accessControl : transport.getList()) { - this.setAccessControl(accessControl); - } - } - } - - protected abstract AuthenticationInfo getAuthenticationInfo(AccessControl accessControl, - AuthenticationResult authenticationResult); -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java deleted file mode 100644 index 35b568349e..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/LoginInfoAclPlugEngine.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.ControllerParameters; -import org.apache.rocketmq.acl.plug.entity.LoginInfo; - -public abstract class LoginInfoAclPlugEngine extends AuthenticationInfoManagementAclPlugEngine { - - private Map loginInfoMap = new ConcurrentHashMap<>(); - - public LoginInfoAclPlugEngine(ControllerParameters controllerParameters) { - super(controllerParameters); - } - - public LoginInfo getLoginInfo(AccessControl accessControl) { - LoginInfo loginInfo = loginInfoMap.get(accessControl.getRecognition()); - if (loginInfo == null) { - AuthenticationInfo authenticationInfo = super.getAccessControl(accessControl); - if (authenticationInfo != null) { - loginInfo = new LoginInfo(); - loginInfo.setAuthenticationInfo(authenticationInfo); - loginInfoMap.put(accessControl.getRecognition(), loginInfo); - } - } - if (loginInfo != null) { - loginInfo.setOperationTime(System.currentTimeMillis()); - } - return loginInfo; - } - - public void deleteLoginInfo(String remoteAddr) { - loginInfoMap.remove(remoteAddr); - } - - protected AuthenticationInfo getAuthenticationInfo(AccessControl accessControl, - AuthenticationResult authenticationResult) { - LoginInfo loginInfo = getLoginInfo(accessControl); - if (loginInfo != null && loginInfo.getAuthenticationInfo() != null) { - return loginInfo.getAuthenticationInfo(); - } - authenticationResult.setResultString("Login information does not exist, Please check login, password, IP"); - return null; - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java deleted file mode 100644 index 93d002315d..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControlTransport.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; - -import java.util.List; - -public class BorkerAccessControlTransport { - - private BorkerAccessControl onlyNetAddress; - - private List list; - - public BorkerAccessControlTransport() { - super(); - } - - public BorkerAccessControl getOnlyNetAddress() { - return onlyNetAddress; - } - - public void setOnlyNetAddress(BorkerAccessControl onlyNetAddress) { - this.onlyNetAddress = onlyNetAddress; - } - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - - @Override - public String toString() { - return "BorkerAccessControlTransport [onlyNetAddress=" + onlyNetAddress + ", list=" + list + "]"; - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java deleted file mode 100644 index 94873b5fcf..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/ControllerParameters.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; - -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.protocol.RequestCode; - -public class ControllerParameters { - - private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - - private Class accessContralAnalysisClass = RequestCode.class; - - public String getFileHome() { - return fileHome; - } - - public void setFileHome(String fileHome) { - this.fileHome = fileHome; - } - - public Class getAccessContralAnalysisClass() { - return accessContralAnalysisClass; - } - - public void setAccessContralAnalysisClass(Class accessContralAnalysisClass) { - this.accessContralAnalysisClass = accessContralAnalysisClass; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("ControllerParametersEntity [fileHome=").append(fileHome).append(", accessContralAnalysisClass=") - .append(accessContralAnalysisClass).append("]"); - return builder.toString(); - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java deleted file mode 100644 index df1166be63..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/LoginInfo.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.entity; - -import java.util.concurrent.atomic.AtomicBoolean; - -public class LoginInfo { - - private String recognition; - - private long loginTime = System.currentTimeMillis(); - - private volatile long operationTime = loginTime; - - private volatile AtomicBoolean clear = new AtomicBoolean(); - - private AuthenticationInfo authenticationInfo; - - public AuthenticationInfo getAuthenticationInfo() { - return authenticationInfo; - } - - public void setAuthenticationInfo(AuthenticationInfo authenticationInfo) { - this.authenticationInfo = authenticationInfo; - } - - public String getRecognition() { - return recognition; - } - - public void setRecognition(String recognition) { - this.recognition = recognition; - } - - public long getLoginTime() { - return loginTime; - } - - public void setLoginTime(long loginTime) { - this.loginTime = loginTime; - } - - public long getOperationTime() { - return operationTime; - } - - public void setOperationTime(long operationTime) { - this.operationTime = operationTime; - } - - public AtomicBoolean getClear() { - return clear; - } - - public void setClear(AtomicBoolean clear) { - this.clear = clear; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("LoginInfo [recognition=").append(recognition).append(", loginTime=").append(loginTime) - .append(", operationTime=").append(operationTime).append(", clear=").append(clear) - .append(", authenticationInfo=").append(authenticationInfo).append("]"); - return builder.toString(); - } - -} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java deleted file mode 100644 index 223cbc7c25..0000000000 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/AclPlugControllerTest.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -public class AclPlugControllerTest { - -} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java deleted file mode 100644 index 37aa38b591..0000000000 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/AclRemotingServiceTest.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -import java.util.HashMap; - -import org.apache.rocketmq.acl.AccessResource; -import org.apache.rocketmq.acl.AccessValidator; -import org.apache.rocketmq.acl.PlainAccessValidator; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test;; - -public class AclRemotingServiceTest { - - - AclRemotingService defaultAclService; - - AccessValidator accessValidator; - - AccessControl accessControl; - - AccessControl accessControlTwo; - - @Before - public void init() { - System.setProperty("rocketmq.home.dir", "src/test/resources"); - PlainAccessValidator aclRemotingServiceImpl = new PlainAccessValidator(); - defaultAclService = aclRemotingServiceImpl; - accessValidator = aclRemotingServiceImpl; - - accessControl = new BorkerAccessControl(); - accessControl.setAccount("RocketMQ"); - accessControl.setPassword("1234567"); - accessControl.setNetaddress("192.0.0.1"); - accessControl.setRecognition("127.0.0.1:1"); - - accessControlTwo = new BorkerAccessControl(); - accessControlTwo.setAccount("RocketMQ"); - accessControlTwo.setPassword("1234567"); - accessControlTwo.setNetaddress("192.0.2.1"); - accessControlTwo.setRecognition("127.0.0.1:2"); - } - - - @Test - public void defaultConstructorTest() { - System.setProperty("rocketmq.home.dir", "src/test/resources"); - AclRemotingService defaultAclService = new PlainAccessValidator(); - Assert.assertNotNull(defaultAclService); - } - - @Test - public void parseTest() { - RemotingCommand remotingCommand = RemotingCommand.createResponseCommand(34, ""); - HashMap map = new HashMap<>(); - map.put("account", "RocketMQ"); - map.put("password", "123456"); - map.put("topic", "test"); - remotingCommand.setExtFields(map); - - AccessResource accessResource = accessValidator.parse(remotingCommand, "127.0.0.1:123"); - AccessControl accessControl = (AccessControl) accessResource; - AccessControl newAccessControl = new AccessControl(); - newAccessControl.setAccount("RocketMQ"); - newAccessControl.setPassword("123456"); - newAccessControl.setTopic("test"); - newAccessControl.setCode(34); - newAccessControl.setNetaddress("127.0.0.1"); - newAccessControl.setRecognition("127.0.0.1:123"); - Assert.assertEquals(accessControl.toString(), newAccessControl.toString()); - } - - @Test - public void checkTest() { - accessControl.setCode(34); - AuthenticationResult authenticationResult = defaultAclService.check(accessControl); - Assert.assertTrue(authenticationResult.isSucceed()); - } - - @Test(expected = AclPlugRuntimeException.class) - public void checkAccessExceptionTest() { - accessControl.setCode(34); - accessControl.setAccount("Rocketmq"); - defaultAclService.check(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void checkPasswordTest() { - accessControl.setCode(34); - accessControl.setPassword("123123123"); - defaultAclService.check(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void checkCodeTest() { - accessControl.setCode(14434); - accessControl.setPassword("123123123"); - defaultAclService.check(accessControl); - } - - - @Test - public void validateTest() { - accessControl.setCode(34); - accessValidator.validate(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void validateAccessExceptionTest() { - accessControl.setCode(34); - accessControl.setAccount("Rocketmq"); - accessValidator.validate(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void validatePasswordTest() { - accessControl.setCode(34); - accessControl.setPassword("123123123"); - accessValidator.validate(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void validateCodeTest() { - accessControl.setCode(14434); - accessControl.setPassword("123123123"); - accessValidator.validate(accessControl); - } -} From 48c51f72713a089c6fa9224e00a08209b383dd42 Mon Sep 17 00:00:00 2001 From: laohu <8wy118611@163.com> Date: Wed, 21 Nov 2018 02:33:10 +0800 Subject: [PATCH 39/96] clean --- .../rocketmq/acl/PlainAccessValidator.java | 14 +- .../acl/plug/{entity => }/AccessControl.java | 6 +- .../AclPlugRuntimeException.java | 2 +- .../apache/rocketmq/acl/plug/AclUtils.java | 39 +-- .../plug/{entity => }/AuthenticationInfo.java | 8 +- .../{entity => }/AuthenticationResult.java | 2 +- .../{entity => }/BorkerAccessControl.java | 6 +- .../{strategy => }/NetaddressStrategy.java | 4 +- .../NetaddressStrategyFactory.java | 8 +- .../rocketmq/acl/plug/PlainAclPlugEngine.java | 268 +++++++++++++++ .../acl/plug/engine/PlainAclPlugEngine.java | 279 --------------- .../acl/plug/AccessContralAnalysisTest.java | 63 ---- .../rocketmq/acl/plug/AclUtilsTest.java | 6 +- .../rocketmq/acl/plug/AuthenticationTest.java | 141 -------- .../NetaddressStrategyTest.java | 4 +- .../acl/plug/PlainAclPlugEngineTest.java | 320 ++++++++++++++++++ .../plug/engine/PlainAclPlugEngineTest.java | 297 ---------------- 17 files changed, 631 insertions(+), 836 deletions(-) rename acl/src/main/java/org/apache/rocketmq/acl/plug/{entity => }/AccessControl.java (90%) rename acl/src/main/java/org/apache/rocketmq/acl/plug/{exception => }/AclPlugRuntimeException.java (95%) rename acl/src/main/java/org/apache/rocketmq/acl/plug/{entity => }/AuthenticationInfo.java (91%) rename acl/src/main/java/org/apache/rocketmq/acl/plug/{entity => }/AuthenticationResult.java (97%) rename acl/src/main/java/org/apache/rocketmq/acl/plug/{entity => }/BorkerAccessControl.java (98%) rename acl/src/main/java/org/apache/rocketmq/acl/plug/{strategy => }/NetaddressStrategy.java (89%) rename acl/src/main/java/org/apache/rocketmq/acl/plug/{strategy => }/NetaddressStrategyFactory.java (96%) create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java delete mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java delete mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java rename acl/src/test/java/org/apache/rocketmq/acl/plug/{strategy => }/NetaddressStrategyTest.java (98%) create mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java delete mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java diff --git a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java index f8bf668b8f..581237e9b1 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java @@ -17,21 +17,19 @@ package org.apache.rocketmq.acl; import java.util.HashMap; - import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; +import org.apache.rocketmq.acl.plug.AccessControl; +import org.apache.rocketmq.acl.plug.AclPlugRuntimeException; +import org.apache.rocketmq.acl.plug.AuthenticationResult; +import org.apache.rocketmq.acl.plug.PlainAclPlugEngine; import org.apache.rocketmq.remoting.protocol.RemotingCommand; -public class PlainAccessValidator implements AccessValidator { +public class PlainAccessValidator implements AccessValidator { - private PlainAclPlugEngine aclPlugEngine; public PlainAccessValidator() { - aclPlugEngine = new PlainAclPlugEngine(); + aclPlugEngine = new PlainAclPlugEngine(); } @Override diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessControl.java similarity index 90% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/AccessControl.java index 092a97ef44..f487bf47ef 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AccessControl.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessControl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug.entity; +package org.apache.rocketmq.acl.plug; import org.apache.rocketmq.acl.AccessResource; @@ -87,8 +87,8 @@ public class AccessControl implements AccessResource { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("AccessControl [account=").append(account).append(", password=").append(password) - .append(", netaddress=").append(netaddress).append(", recognition=").append(recognition) - .append(", code=").append(code).append(", topic=").append(topic).append("]"); + .append(", netaddress=").append(netaddress).append(", recognition=").append(recognition) + .append(", code=").append(code).append(", topic=").append(topic).append("]"); return builder.toString(); } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugRuntimeException.java similarity index 95% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugRuntimeException.java index 0048b2c681..8f6af5d334 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/exception/AclPlugRuntimeException.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugRuntimeException.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug.exception; +package org.apache.rocketmq.acl.plug; public class AclPlugRuntimeException extends RuntimeException { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java index 19f2b234df..9ba5b79a06 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java @@ -19,9 +19,7 @@ package org.apache.rocketmq.acl.plug; import java.io.File; import java.io.FileInputStream; import java.io.IOException; - import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.yaml.snakeyaml.Yaml; public class AclUtils { @@ -84,24 +82,23 @@ public class AclUtils { return minus.indexOf('-') > -1; } - - - public static T getYamlDataObject(String path ,Class clazz) { - Yaml ymal = new Yaml(); - FileInputStream fis = null; - try { - fis = new FileInputStream(new File(path)); - return ymal.loadAs(fis, clazz); - } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("The transport.yml file for Plain mode was not found , paths %s", path), e); - } finally { - if (fis != null) { - try { - fis.close(); - } catch (IOException e) { - throw new AclPlugRuntimeException("close transport fileInputStream Exception", e); - } - } - } + + public static T getYamlDataObject(String path, Class clazz) { + Yaml ymal = new Yaml(); + FileInputStream fis = null; + try { + fis = new FileInputStream(new File(path)); + return ymal.loadAs(fis, clazz); + } catch (Exception e) { + throw new AclPlugRuntimeException(String.format("The transport.yml file for Plain mode was not found , paths %s", path), e); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + throw new AclPlugRuntimeException("close transport fileInputStream Exception", e); + } + } + } } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationInfo.java similarity index 91% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationInfo.java index a1696e2e44..4852dbdb86 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationInfo.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationInfo.java @@ -14,9 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug.entity; - -import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; +package org.apache.rocketmq.acl.plug; import java.util.Iterator; import java.util.Map; @@ -31,7 +29,7 @@ public class AuthenticationInfo { private Map authority; public AuthenticationInfo(Map authority, AccessControl accessControl, - NetaddressStrategy netaddressStrategy) { + NetaddressStrategy netaddressStrategy) { super(); this.authority = authority; this.accessControl = accessControl; @@ -66,7 +64,7 @@ public class AuthenticationInfo { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("AuthenticationInfo [accessControl=").append(accessControl).append(", netaddressStrategy=") - .append(netaddressStrategy).append(", authority={"); + .append(netaddressStrategy).append(", authority={"); Iterator> it = authority.entrySet().iterator(); while (it.hasNext()) { Entry e = it.next(); diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationResult.java similarity index 97% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationResult.java index bef05cef06..de26837339 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/AuthenticationResult.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationResult.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug.entity; +package org.apache.rocketmq.acl.plug; public class AuthenticationResult { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/BorkerAccessControl.java similarity index 98% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/BorkerAccessControl.java index b5eb1187d2..449c8d01dc 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/entity/BorkerAccessControl.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/BorkerAccessControl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug.entity; +package org.apache.rocketmq.acl.plug; import java.util.HashSet; import java.util.Set; @@ -556,8 +556,8 @@ public class BorkerAccessControl extends AccessControl { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("BorkerAccessControl [permitSendTopic=").append(permitSendTopic).append(", noPermitSendTopic=") - .append(noPermitSendTopic).append(", permitPullTopic=").append(permitPullTopic) - .append(", noPermitPullTopic=").append(noPermitPullTopic); + .append(noPermitSendTopic).append(", permitPullTopic=").append(permitPullTopic) + .append(", noPermitPullTopic=").append(noPermitPullTopic); if (!!sendMessage) builder.append(", sendMessage=").append(sendMessage); if (!!sendMessageV2) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategy.java similarity index 89% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategy.java index 7276634e30..fa28871a5a 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategy.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategy.java @@ -14,9 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug.strategy; - -import org.apache.rocketmq.acl.plug.entity.AccessControl; +package org.apache.rocketmq.acl.plug; public interface NetaddressStrategy { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategyFactory.java similarity index 96% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategyFactory.java index 4be9953091..4f6dde5cea 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategyFactory.java @@ -14,15 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug.strategy; - -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.AclUtils; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; +package org.apache.rocketmq.acl.plug; import java.util.HashSet; import java.util.Set; +import org.apache.commons.lang3.StringUtils; public class NetaddressStrategyFactory { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java new file mode 100644 index 0000000000..bdee1be924 --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java @@ -0,0 +1,268 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.common.constant.LoggerName; +import org.apache.rocketmq.common.protocol.RequestCode; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; + +public class PlainAclPlugEngine { + + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); + + private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, + System.getenv(MixAll.ROCKETMQ_HOME_ENV)); + + private Map> accessControlMap = new HashMap<>(); + + private AuthenticationInfo authenticationInfo; + + private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); + + private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + + private Class accessContralAnalysisClass = RequestCode.class; + + public PlainAclPlugEngine() { + initialize(); + } + + public void initialize() { + BorkerAccessControlTransport accessControlTransport = AclUtils.getYamlDataObject(fileHome + "/conf/transport.yml", BorkerAccessControlTransport.class); + if (accessControlTransport == null) { + throw new AclPlugRuntimeException("transport.yml file is no data"); + } + accessContralAnalysis.analysisClass(accessContralAnalysisClass); + setBorkerAccessControlTransport(accessControlTransport); + } + + public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { + if (accessControl.getAccount() == null || accessControl.getPassword() == null + || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { + throw new AclPlugRuntimeException(String.format( + "The account password cannot be null and is longer than 6, account is %s password is %s", + accessControl.getAccount(), accessControl.getPassword())); + } + try { + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); + if (accessControlAddressList == null) { + accessControlAddressList = new ArrayList<>(); + accessControlMap.put(accessControl.getAccount(), accessControlAddressList); + } + AuthenticationInfo authenticationInfo = new AuthenticationInfo( + accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategy); + accessControlAddressList.add(authenticationInfo); + log.info("authenticationInfo is {}", authenticationInfo.toString()); + } catch (Exception e) { + throw new AclPlugRuntimeException( + String.format("Exception info %s %s", e.getMessage(), accessControl.toString()), e); + } + } + + public void setAccessControlList(List accessControlList) throws AclPlugRuntimeException { + for (AccessControl accessControl : accessControlList) { + setAccessControl(accessControl); + } + } + + public void setNetaddressAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { + try { + authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategyFactory.getNetaddressStrategy(accessControl)); + log.info("default authenticationInfo is {}", authenticationInfo.toString()); + } catch (Exception e) { + throw new AclPlugRuntimeException(accessControl.toString(), e); + } + + } + + public AuthenticationInfo getAccessControl(AccessControl accessControl) { + if (accessControl.getAccount() == null && authenticationInfo != null) { + return authenticationInfo.getNetaddressStrategy().match(accessControl) ? authenticationInfo : null; + } else { + List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); + if (accessControlAddressList != null) { + for (AuthenticationInfo ai : accessControlAddressList) { + if (ai.getNetaddressStrategy().match(accessControl) && ai.getAccessControl().getPassword().equals(accessControl.getPassword())) { + return ai; + } + } + } + } + return null; + } + + public AuthenticationResult eachCheckAuthentication(AccessControl accessControl) { + AuthenticationResult authenticationResult = new AuthenticationResult(); + AuthenticationInfo authenticationInfo = getAccessControl(accessControl); + if (authenticationInfo != null) { + boolean boo = authentication(authenticationInfo, accessControl, authenticationResult); + authenticationResult.setSucceed(boo); + authenticationResult.setAccessControl(authenticationInfo.getAccessControl()); + } else { + authenticationResult.setResultString("accessControl is null, Please check login, password, IP\""); + } + return authenticationResult; + } + + void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { + if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { + throw new AclPlugRuntimeException("onlyNetAddress and list can't be all empty"); + } + + if (transport.getOnlyNetAddress() != null) { + this.setNetaddressAccessControl(transport.getOnlyNetAddress()); + } + if (transport.getList() != null || transport.getList().size() > 0) { + for (AccessControl accessControl : transport.getList()) { + this.setAccessControl(accessControl); + } + } + } + + public boolean authentication(AuthenticationInfo authenticationInfo, AccessControl accessControl, + AuthenticationResult authenticationResult) { + int code = accessControl.getCode(); + if (!authenticationInfo.getAuthority().get(code)) { + authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); + return false; + } + if (!(authenticationInfo.getAccessControl() instanceof BorkerAccessControl)) { + return true; + } + BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); + String topicName = accessControl.getTopic(); + if (code == 10 || code == 310 || code == 320) { + if (borker.getPermitSendTopic().contains(topicName)) { + return true; + } + if (borker.getNoPermitSendTopic().contains(topicName)) { + authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); + return false; + } + return borker.getPermitSendTopic().isEmpty() ? true : false; + } else if (code == 11) { + if (borker.getPermitPullTopic().contains(topicName)) { + return true; + } + if (borker.getNoPermitPullTopic().contains(topicName)) { + authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); + return false; + } + return borker.getPermitPullTopic().isEmpty() ? true : false; + } + return true; + } + + public static class AccessContralAnalysis { + + private Map, Map> classTocodeAndMentod = new HashMap<>(); + + private Map fieldNameAndCode = new HashMap<>(); + + public void analysisClass(Class clazz) { + Field[] fields = clazz.getDeclaredFields(); + try { + for (Field field : fields) { + if (field.getType().equals(int.class)) { + String name = StringUtils.replace(field.getName(), "_", "").toLowerCase(); + fieldNameAndCode.put(name, (Integer) field.get(null)); + } + } + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new AclPlugRuntimeException(String.format("analysis on failure Class is %s", clazz.getName()), e); + } + } + + public Map analysis(AccessControl accessControl) { + Class clazz = accessControl.getClass(); + Map codeAndField = classTocodeAndMentod.get(clazz); + if (codeAndField == null) { + codeAndField = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + if (!field.getType().equals(boolean.class)) + continue; + Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); + if (code == null) { + throw new AclPlugRuntimeException( + String.format("field nonexistent in code fieldName is %s", field.getName())); + } + field.setAccessible(true); + codeAndField.put(code, field); + + } + if (codeAndField.isEmpty()) { + throw new AclPlugRuntimeException(String.format("AccessControl nonexistent code , name %s", + accessControl.getClass().getName())); + } + classTocodeAndMentod.put(clazz, codeAndField); + } + Iterator> it = codeAndField.entrySet().iterator(); + Map authority = new HashMap<>(); + try { + while (it.hasNext()) { + Entry e = it.next(); + authority.put(e.getKey(), (Boolean) e.getValue().get(accessControl)); + } + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new AclPlugRuntimeException( + String.format("analysis on failure AccessControl is %s", AccessControl.class.getName()), e); + } + return authority; + } + + } + + public static class BorkerAccessControlTransport { + + private BorkerAccessControl onlyNetAddress; + + private List list; + + public BorkerAccessControl getOnlyNetAddress() { + return onlyNetAddress; + } + + public void setOnlyNetAddress(BorkerAccessControl onlyNetAddress) { + this.onlyNetAddress = onlyNetAddress; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + @Override + public String toString() { + return "BorkerAccessControlTransport [onlyNetAddress=" + onlyNetAddress + ", list=" + list + "]"; + } + } +} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java deleted file mode 100644 index c5aadbf0b3..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngine.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.AclUtils; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; -import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategy; -import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; -import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.logging.InternalLogger; -import org.apache.rocketmq.logging.InternalLoggerFactory; - -public class PlainAclPlugEngine { - - private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); - - private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, - System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - - private Map> accessControlMap = new HashMap<>(); - - private AuthenticationInfo authenticationInfo; - - private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); - - private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - - private Class accessContralAnalysisClass = RequestCode.class; - - - public PlainAclPlugEngine() { - initialize(); - } - - public void initialize() { - BorkerAccessControlTransport accessControlTransport = AclUtils.getYamlDataObject(fileHome + "/conf/transport.yml", BorkerAccessControlTransport.class); - if (accessControlTransport == null) { - throw new AclPlugRuntimeException("transport.yml file is no data"); - } - accessContralAnalysis.analysisClass(accessContralAnalysisClass); - setBorkerAccessControlTransport(accessControlTransport); - } - - public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { - if (accessControl.getAccount() == null || accessControl.getPassword() == null - || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { - throw new AclPlugRuntimeException(String.format( - "The account password cannot be null and is longer than 6, account is %s password is %s", - accessControl.getAccount(), accessControl.getPassword())); - } - try { - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); - if (accessControlAddressList == null) { - accessControlAddressList = new ArrayList<>(); - accessControlMap.put(accessControl.getAccount(), accessControlAddressList); - } - AuthenticationInfo authenticationInfo = new AuthenticationInfo( - accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategy); - accessControlAddressList.add(authenticationInfo); - log.info("authenticationInfo is {}", authenticationInfo.toString()); - } catch (Exception e) { - throw new AclPlugRuntimeException( - String.format("Exception info %s %s", e.getMessage(), accessControl.toString()), e); - } - } - - public void setAccessControlList(List accessControlList) throws AclPlugRuntimeException { - for (AccessControl accessControl : accessControlList) { - setAccessControl(accessControl); - } - } - - public void setNetaddressAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { - try { - authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl,netaddressStrategyFactory.getNetaddressStrategy(accessControl)); - log.info("default authenticationInfo is {}", authenticationInfo.toString()); - } catch (Exception e) { - throw new AclPlugRuntimeException(accessControl.toString(), e); - } - - } - - public AuthenticationInfo getAccessControl(AccessControl accessControl) { - if (accessControl.getAccount() == null && authenticationInfo != null) { - return authenticationInfo.getNetaddressStrategy().match(accessControl) ? authenticationInfo : null; - } else { - List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); - if (accessControlAddressList != null) { - for (AuthenticationInfo ai : accessControlAddressList) { - if (ai.getNetaddressStrategy().match(accessControl)&& ai.getAccessControl().getPassword().equals(accessControl.getPassword())) { - return ai; - } - } - } - } - return null; - } - - public AuthenticationResult eachCheckAuthentication(AccessControl accessControl) { - AuthenticationResult authenticationResult = new AuthenticationResult(); - AuthenticationInfo authenticationInfo = getAccessControl(accessControl); - if (authenticationInfo != null) { - boolean boo = authentication(authenticationInfo, accessControl, authenticationResult); - authenticationResult.setSucceed(boo); - authenticationResult.setAccessControl(authenticationInfo.getAccessControl()); - } else { - authenticationResult.setResultString("accessControl is null, Please check login, password, IP\""); - } - return authenticationResult; - } - - void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { - if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { - throw new AclPlugRuntimeException("onlyNetAddress and list can't be all empty"); - } - - if (transport.getOnlyNetAddress() != null) { - this.setNetaddressAccessControl(transport.getOnlyNetAddress()); - } - if (transport.getList() != null || transport.getList().size() > 0) { - for (AccessControl accessControl : transport.getList()) { - this.setAccessControl(accessControl); - } - } - } - - public boolean authentication(AuthenticationInfo authenticationInfo, AccessControl accessControl, - AuthenticationResult authenticationResult) { - int code = accessControl.getCode(); - if (!authenticationInfo.getAuthority().get(code)) { - authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); - return false; - } - if (!(authenticationInfo.getAccessControl() instanceof BorkerAccessControl)) { - return true; - } - BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); - String topicName = accessControl.getTopic(); - if (code == 10 || code == 310 || code == 320) { - if (borker.getPermitSendTopic().contains(topicName)) { - return true; - } - if (borker.getNoPermitSendTopic().contains(topicName)) { - authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); - return false; - } - return borker.getPermitSendTopic().isEmpty() ? true : false; - } else if (code == 11) { - if (borker.getPermitPullTopic().contains(topicName)) { - return true; - } - if (borker.getNoPermitPullTopic().contains(topicName)) { - authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); - return false; - } - return borker.getPermitPullTopic().isEmpty() ? true : false; - } - return true; - } - - - public static class AccessContralAnalysis { - - private Map, Map> classTocodeAndMentod = new HashMap<>(); - - private Map fieldNameAndCode = new HashMap<>(); - - public void analysisClass(Class clazz) { - Field[] fields = clazz.getDeclaredFields(); - try { - for (Field field : fields) { - if (field.getType().equals(int.class)) { - String name = StringUtils.replace(field.getName(), "_", "").toLowerCase(); - fieldNameAndCode.put(name, (Integer) field.get(null)); - } - } - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugRuntimeException(String.format("analysis on failure Class is %s", clazz.getName()), e); - } - } - - public Map analysis(AccessControl accessControl) { - Class clazz = accessControl.getClass(); - Map codeAndField = classTocodeAndMentod.get(clazz); - if (codeAndField == null) { - codeAndField = new HashMap<>(); - Field[] fields = clazz.getDeclaredFields(); - for (Field field : fields) { - if (!field.getType().equals(boolean.class)) - continue; - Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); - if (code == null) { - throw new AclPlugRuntimeException( - String.format("field nonexistent in code fieldName is %s", field.getName())); - } - field.setAccessible(true); - codeAndField.put(code, field); - - } - if (codeAndField.isEmpty()) { - throw new AclPlugRuntimeException(String.format("AccessControl nonexistent code , name %s", - accessControl.getClass().getName())); - } - classTocodeAndMentod.put(clazz, codeAndField); - } - Iterator> it = codeAndField.entrySet().iterator(); - Map authority = new HashMap<>(); - try { - while (it.hasNext()) { - Entry e = it.next(); - authority.put(e.getKey(), (Boolean) e.getValue().get(accessControl)); - } - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugRuntimeException( - String.format("analysis on failure AccessControl is %s", AccessControl.class.getName()), e); - } - return authority; - } - - } - - public static class BorkerAccessControlTransport { - - private BorkerAccessControl onlyNetAddress; - - private List list; - - public BorkerAccessControl getOnlyNetAddress() { - return onlyNetAddress; - } - - public void setOnlyNetAddress(BorkerAccessControl onlyNetAddress) { - this.onlyNetAddress = onlyNetAddress; - } - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - - @Override - public String toString() { - return "BorkerAccessControlTransport [onlyNetAddress=" + onlyNetAddress + ", list=" + list + "]"; - } - } -} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java deleted file mode 100644 index b7896b13df..0000000000 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/AccessContralAnalysisTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class AccessContralAnalysisTest { - - AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - - @Before - public void init() { - accessContralAnalysis.analysisClass(RequestCode.class); - } - - @Test - public void analysisTest() { - BorkerAccessControl accessControl = new BorkerAccessControl(); - accessControl.setSendMessage(false); - Map map = accessContralAnalysis.analysis(accessControl); - - Iterator> it = map.entrySet().iterator(); - long num = 0; - while (it.hasNext()) { - Entry e = it.next(); - if (!e.getValue()) { - Assert.assertEquals(e.getKey(), Integer.valueOf(10)); - num++; - } - } - Assert.assertEquals(num, 1); - } - - @Test(expected = AclPlugRuntimeException.class) - public void analysisExceptionTest() { - AccessControl accessControl = new AccessControl(); - accessContralAnalysis.analysis(accessControl); - } - -} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java index b0cc4daba1..db9d909151 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java @@ -18,12 +18,10 @@ package org.apache.rocketmq.acl.plug; import java.util.ArrayList; import java.util.List; - import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; - public class AclUtilsTest { @Test @@ -125,4 +123,8 @@ public class AclUtilsTest { isMinus = AclUtils.isMinus("*"); Assert.assertFalse(isMinus); } + + public void getYamlDataObjectTest() { + + } } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java deleted file mode 100644 index 6e5d1444db..0000000000 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/AuthenticationTest.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class AuthenticationTest { - - Authentication authentication = new Authentication(); - - AuthenticationInfo authenticationInfo; - - BorkerAccessControl borkerAccessControl; - - AuthenticationResult authenticationResult = new AuthenticationResult(); - AccessControl accessControl = new AccessControl(); - - @Before - public void init() { - borkerAccessControl = new BorkerAccessControl(); - //321 - borkerAccessControl.setQueryConsumeQueue(false); - - Set permitSendTopic = new HashSet<>(); - permitSendTopic.add("permitSendTopic"); - borkerAccessControl.setPermitSendTopic(permitSendTopic); - - Set noPermitSendTopic = new HashSet<>(); - noPermitSendTopic.add("noPermitSendTopic"); - borkerAccessControl.setNoPermitSendTopic(noPermitSendTopic); - - Set permitPullTopic = new HashSet<>(); - permitPullTopic.add("permitPullTopic"); - borkerAccessControl.setPermitPullTopic(permitPullTopic); - - Set noPermitPullTopic = new HashSet<>(); - noPermitPullTopic.add("noPermitPullTopic"); - borkerAccessControl.setNoPermitPullTopic(noPermitPullTopic); - - AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - accessContralAnalysis.analysisClass(RequestCode.class); - Map map = accessContralAnalysis.analysis(borkerAccessControl); - - authenticationInfo = new AuthenticationInfo(map, borkerAccessControl, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); - } - - @Test - public void authenticationTest() { - - accessControl.setCode(317); - - boolean isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setCode(321); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - accessControl.setCode(10); - accessControl.setTopic("permitSendTopic"); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setCode(310); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setCode(320); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setTopic("noPermitSendTopic"); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - accessControl.setTopic("nopermitSendTopic"); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - accessControl.setCode(11); - accessControl.setTopic("permitPullTopic"); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setTopic("noPermitPullTopic"); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - accessControl.setTopic("nopermitPullTopic"); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - } - - @Test - public void isEmptyTest() { - accessControl.setCode(10); - accessControl.setTopic("absentTopic"); - boolean isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - Set permitSendTopic = new HashSet<>(); - borkerAccessControl.setPermitSendTopic(permitSendTopic); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setCode(11); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - borkerAccessControl.setPermitPullTopic(permitSendTopic); - isReturn = authentication.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - } - -} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/NetaddressStrategyTest.java similarity index 98% rename from acl/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plug/NetaddressStrategyTest.java index 3f21b67887..6c76609df0 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/strategy/NetaddressStrategyTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plug/NetaddressStrategyTest.java @@ -14,10 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug.strategy; +package org.apache.rocketmq.acl.plug; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; import org.junit.Assert; import org.junit.Test; diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java new file mode 100644 index 0000000000..654cf423ae --- /dev/null +++ b/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java @@ -0,0 +1,320 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import org.apache.rocketmq.acl.plug.PlainAclPlugEngine.AccessContralAnalysis; +import org.apache.rocketmq.acl.plug.PlainAclPlugEngine.BorkerAccessControlTransport; +import org.apache.rocketmq.common.protocol.RequestCode; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class PlainAclPlugEngineTest { + + PlainAclPlugEngine plainAclPlugEngine; + + AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + + AccessControl accessControl; + + AccessControl accessControlTwo; + + AuthenticationInfo authenticationInfo; + + BorkerAccessControl borkerAccessControl; + + @Before + public void init() throws NoSuchFieldException, SecurityException, IOException { + + accessContralAnalysis.analysisClass(RequestCode.class); + + borkerAccessControl = new BorkerAccessControl(); + // 321 + borkerAccessControl.setQueryConsumeQueue(false); + + Set permitSendTopic = new HashSet<>(); + permitSendTopic.add("permitSendTopic"); + borkerAccessControl.setPermitSendTopic(permitSendTopic); + + Set noPermitSendTopic = new HashSet<>(); + noPermitSendTopic.add("noPermitSendTopic"); + borkerAccessControl.setNoPermitSendTopic(noPermitSendTopic); + + Set permitPullTopic = new HashSet<>(); + permitPullTopic.add("permitPullTopic"); + borkerAccessControl.setPermitPullTopic(permitPullTopic); + + Set noPermitPullTopic = new HashSet<>(); + noPermitPullTopic.add("noPermitPullTopic"); + borkerAccessControl.setNoPermitPullTopic(noPermitPullTopic); + + AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); + accessContralAnalysis.analysisClass(RequestCode.class); + Map map = accessContralAnalysis.analysis(borkerAccessControl); + + authenticationInfo = new AuthenticationInfo(map, borkerAccessControl, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); + + System.setProperty("rocketmq.home.dir", "src/test/resources"); + plainAclPlugEngine = new PlainAclPlugEngine(); + plainAclPlugEngine.initialize(); + + accessControl = new BorkerAccessControl(); + accessControl.setAccount("rokcetmq"); + accessControl.setPassword("aliyun11"); + accessControl.setNetaddress("127.0.0.1"); + accessControl.setRecognition("127.0.0.1:1"); + + accessControlTwo = new BorkerAccessControl(); + accessControlTwo.setAccount("rokcet1"); + accessControlTwo.setPassword("aliyun1"); + accessControlTwo.setNetaddress("127.0.0.1"); + accessControlTwo.setRecognition("127.0.0.1:2"); + + } + + @Test(expected = AclPlugRuntimeException.class) + public void accountNullTest() { + accessControl.setAccount(null); + plainAclPlugEngine.setAccessControl(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void accountThanTest() { + accessControl.setAccount("123"); + plainAclPlugEngine.setAccessControl(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void passWordtNullTest() { + accessControl.setAccount(null); + plainAclPlugEngine.setAccessControl(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void passWordThanTest() { + accessControl.setAccount("123"); + plainAclPlugEngine.setAccessControl(accessControl); + } + + @Test(expected = AclPlugRuntimeException.class) + public void testPlainAclPlugEngineInit() { + System.setProperty("rocketmq.home.dir", ""); + new PlainAclPlugEngine().initialize(); + } + + @Test + public void authenticationInfoOfSetAccessControl() { + plainAclPlugEngine.setAccessControl(accessControl); + + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + + AccessControl getAccessControl = authenticationInfo.getAccessControl(); + Assert.assertEquals(accessControl, getAccessControl); + + AccessControl testAccessControl = new AccessControl(); + testAccessControl.setAccount("rokcetmq"); + testAccessControl.setPassword("aliyun11"); + testAccessControl.setNetaddress("127.0.0.1"); + testAccessControl.setRecognition("127.0.0.1:1"); + + testAccessControl.setAccount("rokcetmq1"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); + + testAccessControl.setAccount("rokcetmq"); + testAccessControl.setPassword("1234567"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); + + testAccessControl.setNetaddress("127.0.0.2"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + Assert.assertNull(authenticationInfo); + } + + @Test + public void setAccessControlList() { + List accessControlList = new ArrayList<>(); + accessControlList.add(accessControl); + + accessControlList.add(accessControlTwo); + + plainAclPlugEngine.setAccessControlList(accessControlList); + + AuthenticationInfo newAccessControl = plainAclPlugEngine.getAccessControl(accessControl); + Assert.assertEquals(accessControl, newAccessControl.getAccessControl()); + + newAccessControl = plainAclPlugEngine.getAccessControl(accessControlTwo); + Assert.assertEquals(accessControlTwo, newAccessControl.getAccessControl()); + + } + + @Test + public void setNetaddressAccessControl() { + AccessControl accessControl = new BorkerAccessControl(); + accessControl.setAccount("RocketMQ"); + accessControl.setPassword("RocketMQ"); + accessControl.setNetaddress("127.0.0.1"); + plainAclPlugEngine.setAccessControl(accessControl); + plainAclPlugEngine.setNetaddressAccessControl(accessControl); + + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + + AccessControl getAccessControl = authenticationInfo.getAccessControl(); + Assert.assertEquals(accessControl, getAccessControl); + + accessControl.setNetaddress("127.0.0.2"); + authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + Assert.assertNull(authenticationInfo); + } + + public void eachCheckLoginAndAuthentication() { + + } + + @Test(expected = AclPlugRuntimeException.class) + public void borkerAccessControlTransportTestNull() { + BorkerAccessControlTransport accessControlTransport = new BorkerAccessControlTransport(); + plainAclPlugEngine.setBorkerAccessControlTransport(accessControlTransport); + } + + @Test + public void borkerAccessControlTransportTest() { + BorkerAccessControlTransport accessControlTransport = new BorkerAccessControlTransport(); + List list = new ArrayList<>(); + list.add((BorkerAccessControl) this.accessControlTwo); + accessControlTransport.setOnlyNetAddress((BorkerAccessControl) this.accessControl); + accessControlTransport.setList(list); + plainAclPlugEngine.setBorkerAccessControlTransport(accessControlTransport); + + AccessControl accessControl = new BorkerAccessControl(); + accessControl.setAccount("RocketMQ"); + accessControl.setPassword("RocketMQ"); + accessControl.setNetaddress("127.0.0.1"); + plainAclPlugEngine.setAccessControl(accessControl); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + Assert.assertNotNull(authenticationInfo.getAccessControl()); + + authenticationInfo = plainAclPlugEngine.getAccessControl(accessControlTwo); + Assert.assertEquals(accessControlTwo, authenticationInfo.getAccessControl()); + + } + + @Test + public void authenticationTest() { + AuthenticationResult authenticationResult = new AuthenticationResult(); + accessControl.setCode(317); + + boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setCode(321); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + accessControl.setCode(10); + accessControl.setTopic("permitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setCode(310); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setCode(320); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setTopic("noPermitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + accessControl.setTopic("nopermitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + accessControl.setCode(11); + accessControl.setTopic("permitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setTopic("noPermitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + accessControl.setTopic("nopermitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + } + + @Test + public void isEmptyTest() { + AuthenticationResult authenticationResult = new AuthenticationResult(); + accessControl.setCode(10); + accessControl.setTopic("absentTopic"); + boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + Set permitSendTopic = new HashSet<>(); + borkerAccessControl.setPermitSendTopic(permitSendTopic); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + + accessControl.setCode(11); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertFalse(isReturn); + + borkerAccessControl.setPermitPullTopic(permitSendTopic); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + Assert.assertTrue(isReturn); + } + + @Test + public void analysisTest() { + BorkerAccessControl accessControl = new BorkerAccessControl(); + accessControl.setSendMessage(false); + Map map = accessContralAnalysis.analysis(accessControl); + + Iterator> it = map.entrySet().iterator(); + long num = 0; + while (it.hasNext()) { + Entry e = it.next(); + if (!e.getValue()) { + Assert.assertEquals(e.getKey(), Integer.valueOf(10)); + num++; + } + } + Assert.assertEquals(num, 1); + } + + @Test(expected = AclPlugRuntimeException.class) + public void analysisExceptionTest() { + AccessControl accessControl = new AccessControl(); + accessContralAnalysis.analysis(accessControl); + } +} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java deleted file mode 100644 index 616cb5c3bb..0000000000 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/engine/PlainAclPlugEngineTest.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug.engine; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.rocketmq.acl.plug.AccessContralAnalysis; -import org.apache.rocketmq.acl.plug.engine.PlainAclPlugEngine.BorkerAccessControlTransport; -import org.apache.rocketmq.acl.plug.entity.AccessControl; -import org.apache.rocketmq.acl.plug.entity.AuthenticationInfo; -import org.apache.rocketmq.acl.plug.entity.AuthenticationResult; -import org.apache.rocketmq.acl.plug.entity.BorkerAccessControl; -import org.apache.rocketmq.acl.plug.exception.AclPlugRuntimeException; -import org.apache.rocketmq.acl.plug.strategy.NetaddressStrategyFactory; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class PlainAclPlugEngineTest { - - PlainAclPlugEngine plainAclPlugEngine; - - AccessControl accessControl; - - AccessControl accessControlTwo; - - AuthenticationInfo authenticationInfo; - - BorkerAccessControl borkerAccessControl; - - @Before - public void init() throws NoSuchFieldException, SecurityException, IOException { - - borkerAccessControl = new BorkerAccessControl(); - // 321 - borkerAccessControl.setQueryConsumeQueue(false); - - Set permitSendTopic = new HashSet<>(); - permitSendTopic.add("permitSendTopic"); - borkerAccessControl.setPermitSendTopic(permitSendTopic); - - Set noPermitSendTopic = new HashSet<>(); - noPermitSendTopic.add("noPermitSendTopic"); - borkerAccessControl.setNoPermitSendTopic(noPermitSendTopic); - - Set permitPullTopic = new HashSet<>(); - permitPullTopic.add("permitPullTopic"); - borkerAccessControl.setPermitPullTopic(permitPullTopic); - - Set noPermitPullTopic = new HashSet<>(); - noPermitPullTopic.add("noPermitPullTopic"); - borkerAccessControl.setNoPermitPullTopic(noPermitPullTopic); - - AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - accessContralAnalysis.analysisClass(RequestCode.class); - Map map = accessContralAnalysis.analysis(borkerAccessControl); - - authenticationInfo = new AuthenticationInfo(map, borkerAccessControl,NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); - - System.setProperty("rocketmq.home.dir", "src/test/resources"); - plainAclPlugEngine = new PlainAclPlugEngine(); - plainAclPlugEngine.initialize(); - - accessControl = new BorkerAccessControl(); - accessControl.setAccount("rokcetmq"); - accessControl.setPassword("aliyun11"); - accessControl.setNetaddress("127.0.0.1"); - accessControl.setRecognition("127.0.0.1:1"); - - accessControlTwo = new BorkerAccessControl(); - accessControlTwo.setAccount("rokcet1"); - accessControlTwo.setPassword("aliyun1"); - accessControlTwo.setNetaddress("127.0.0.1"); - accessControlTwo.setRecognition("127.0.0.1:2"); - - } - - @Test(expected = AclPlugRuntimeException.class) - public void accountNullTest() { - accessControl.setAccount(null); - plainAclPlugEngine.setAccessControl(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void accountThanTest() { - accessControl.setAccount("123"); - plainAclPlugEngine.setAccessControl(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void passWordtNullTest() { - accessControl.setAccount(null); - plainAclPlugEngine.setAccessControl(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void passWordThanTest() { - accessControl.setAccount("123"); - plainAclPlugEngine.setAccessControl(accessControl); - } - - @Test(expected = AclPlugRuntimeException.class) - public void testPlainAclPlugEngineInit() { - System.setProperty("rocketmq.home.dir", ""); - new PlainAclPlugEngine().initialize(); - } - - @Test - public void authenticationInfoOfSetAccessControl() { - plainAclPlugEngine.setAccessControl(accessControl); - - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); - - AccessControl getAccessControl = authenticationInfo.getAccessControl(); - Assert.assertEquals(accessControl, getAccessControl); - - AccessControl testAccessControl = new AccessControl(); - testAccessControl.setAccount("rokcetmq"); - testAccessControl.setPassword("aliyun11"); - testAccessControl.setNetaddress("127.0.0.1"); - testAccessControl.setRecognition("127.0.0.1:1"); - - testAccessControl.setAccount("rokcetmq1"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); - Assert.assertNull(authenticationInfo); - - testAccessControl.setAccount("rokcetmq"); - testAccessControl.setPassword("1234567"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); - Assert.assertNull(authenticationInfo); - - testAccessControl.setNetaddress("127.0.0.2"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); - Assert.assertNull(authenticationInfo); - } - - @Test - public void setAccessControlList() { - List accessControlList = new ArrayList<>(); - accessControlList.add(accessControl); - - accessControlList.add(accessControlTwo); - - plainAclPlugEngine.setAccessControlList(accessControlList); - - AuthenticationInfo newAccessControl = plainAclPlugEngine.getAccessControl(accessControl); - Assert.assertEquals(accessControl, newAccessControl.getAccessControl()); - - newAccessControl = plainAclPlugEngine.getAccessControl(accessControlTwo); - Assert.assertEquals(accessControlTwo, newAccessControl.getAccessControl()); - - } - - @Test - public void setNetaddressAccessControl() { - AccessControl accessControl = new BorkerAccessControl(); - accessControl.setAccount("RocketMQ"); - accessControl.setPassword("RocketMQ"); - accessControl.setNetaddress("127.0.0.1"); - plainAclPlugEngine.setAccessControl(accessControl); - plainAclPlugEngine.setNetaddressAccessControl(accessControl); - - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); - - AccessControl getAccessControl = authenticationInfo.getAccessControl(); - Assert.assertEquals(accessControl, getAccessControl); - - accessControl.setNetaddress("127.0.0.2"); - authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); - Assert.assertNull(authenticationInfo); - } - - public void eachCheckLoginAndAuthentication() { - - } - - @Test(expected = AclPlugRuntimeException.class) - public void borkerAccessControlTransportTestNull() { - BorkerAccessControlTransport accessControlTransport = new BorkerAccessControlTransport(); - plainAclPlugEngine.setBorkerAccessControlTransport(accessControlTransport); - } - - @Test - public void borkerAccessControlTransportTest() { - BorkerAccessControlTransport accessControlTransport = new BorkerAccessControlTransport(); - List list = new ArrayList<>(); - list.add((BorkerAccessControl) this.accessControlTwo); - accessControlTransport.setOnlyNetAddress((BorkerAccessControl) this.accessControl); - accessControlTransport.setList(list); - plainAclPlugEngine.setBorkerAccessControlTransport(accessControlTransport); - - AccessControl accessControl = new BorkerAccessControl(); - accessControl.setAccount("RocketMQ"); - accessControl.setPassword("RocketMQ"); - accessControl.setNetaddress("127.0.0.1"); - plainAclPlugEngine.setAccessControl(accessControl); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); - Assert.assertNotNull(authenticationInfo.getAccessControl()); - - authenticationInfo = plainAclPlugEngine.getAccessControl(accessControlTwo); - Assert.assertEquals(accessControlTwo, authenticationInfo.getAccessControl()); - - } - - @Test - public void authenticationTest() { - AuthenticationResult authenticationResult = new AuthenticationResult(); - accessControl.setCode(317); - - boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setCode(321); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - accessControl.setCode(10); - accessControl.setTopic("permitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setCode(310); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setCode(320); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setTopic("noPermitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - accessControl.setTopic("nopermitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - accessControl.setCode(11); - accessControl.setTopic("permitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setTopic("noPermitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - accessControl.setTopic("nopermitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - } - - @Test - public void isEmptyTest() { - AuthenticationResult authenticationResult = new AuthenticationResult(); - accessControl.setCode(10); - accessControl.setTopic("absentTopic"); - boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - Set permitSendTopic = new HashSet<>(); - borkerAccessControl.setPermitSendTopic(permitSendTopic); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - - accessControl.setCode(11); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertFalse(isReturn); - - borkerAccessControl.setPermitPullTopic(permitSendTopic); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); - Assert.assertTrue(isReturn); - } -} From 65bd9bf8050a06e83dabfa9c05a8f14d785a40c4 Mon Sep 17 00:00:00 2001 From: hujie Date: Thu, 22 Nov 2018 11:27:36 +0800 Subject: [PATCH 40/96] issue --- .../apache/rocketmq/acl/PlainAccessValidator.java | 15 ++++++++------- .../rocketmq/acl/plug/PlainAclPlugEngine.java | 1 + .../apache/rocketmq/broker/BrokerController.java | 1 + .../org.apache.rocketmq.acl.AccessValidator | 1 + 4 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator diff --git a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java index 581237e9b1..ef25a9c785 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java @@ -49,17 +49,18 @@ public class PlainAccessValidator implements AccessValidator { @Override public void validate(AccessResource accessResource) { + AuthenticationResult authenticationResult = null; try { - AuthenticationResult authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); - if (authenticationResult.getException() != null) { - throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); - } - if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { - throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); - } + authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); } catch (Exception e) { throw new AclPlugRuntimeException(String.format("validate exception AccessResource data %s", accessResource.toString()), e); } + if (authenticationResult.getException() != null) { + throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); + } + if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { + throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); + } } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java index bdee1be924..c255b59e5b 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java @@ -56,6 +56,7 @@ public class PlainAclPlugEngine { if (accessControlTransport == null) { throw new AclPlugRuntimeException("transport.yml file is no data"); } + log.info("BorkerAccessControlTransport data is : ", accessControlTransport.toString()); accessContralAnalysis.analysisClass(accessContralAnalysisClass); setBorkerAccessControlTransport(accessControlTransport); } diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index a6da44b641..796b72ef27 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -1033,6 +1033,7 @@ public class BrokerController { public void registerServerRPCHook(RPCHook rpcHook) { getRemotingServer().registerRPCHook(rpcHook); + this.fastRemotingServer.registerRPCHook(rpcHook); } public RemotingServer getRemotingServer() { diff --git a/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator b/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator new file mode 100644 index 0000000000..422b1e7bcb --- /dev/null +++ b/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator @@ -0,0 +1 @@ +org.apache.rocketmq.acl.PlainAccessValidator \ No newline at end of file From ceaa64bb5611e31474231634aa3fc8382fec12a2 Mon Sep 17 00:00:00 2001 From: hujie Date: Fri, 23 Nov 2018 18:26:54 +0800 Subject: [PATCH 41/96] tools acl --- .../rocketmq/acl/PlainAccessValidator.java | 16 +++- .../rocketmq/acl/plug/PlainAclPlugEngine.java | 58 ++++++++++++++ .../apache/rocketmq/srvutil/ServerUtil.java | 10 +++ .../tools/command/MQAdminStartup.java | 80 +++++++++++++++++-- 4 files changed, 154 insertions(+), 10 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java index ef25a9c785..74e988a75c 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java @@ -35,6 +35,7 @@ public class PlainAccessValidator implements AccessValidator { @Override public AccessResource parse(RemotingCommand request, String remoteAddr) { HashMap extFields = request.getExtFields(); + int code = request.getCode(); AccessControl accessControl = new AccessControl(); accessControl.setCode(request.getCode()); accessControl.setRecognition(remoteAddr); @@ -42,23 +43,30 @@ public class PlainAccessValidator implements AccessValidator { if (extFields != null) { accessControl.setAccount(extFields.get("account")); accessControl.setPassword(extFields.get("password")); - accessControl.setTopic(extFields.get("topic")); + if (code == 310 || code == 320) { + accessControl.setTopic(extFields.get("b")); + } else { + accessControl.setTopic(extFields.get("topic")); + + } } return accessControl; } @Override public void validate(AccessResource accessResource) { - AuthenticationResult authenticationResult = null; + AuthenticationResult authenticationResult = null; try { - authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); + authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); + if (authenticationResult.isSucceed()) + return; } catch (Exception e) { throw new AclPlugRuntimeException(String.format("validate exception AccessResource data %s", accessResource.toString()), e); } if (authenticationResult.getException() != null) { throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); } - if (authenticationResult.getAccessControl() == null || !authenticationResult.isSucceed()) { + if (authenticationResult.getAccessControl() != null || !authenticationResult.isSucceed()) { throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java index c255b59e5b..580595ca4e 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java @@ -16,7 +16,15 @@ */ package org.apache.rocketmq.acl.plug; +import java.io.IOException; import java.lang.reflect.Field; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardWatchEventKinds; +import java.nio.file.WatchEvent; +import java.nio.file.WatchKey; +import java.nio.file.WatchService; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -25,6 +33,7 @@ import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.common.ServiceThread; import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.common.protocol.RequestCode; import org.apache.rocketmq.logging.InternalLogger; @@ -49,6 +58,7 @@ public class PlainAclPlugEngine { public PlainAclPlugEngine() { initialize(); + watch(); } public void initialize() { @@ -61,6 +71,54 @@ public class PlainAclPlugEngine { setBorkerAccessControlTransport(accessControlTransport); } + private void watch() { + String version = System.getProperty("java.version"); + log.info("java.version is : {}", version); + String[] str = StringUtils.split(version, "."); + if (Integer.valueOf(str[1]) < 7) { + log.warn("wacth need jdk 1.7 support , current version no support"); + return; + } + try { + final WatchService watcher = FileSystems.getDefault().newWatchService(); + Path p = Paths.get(fileHome + "/conf/"); + p.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE); + ServiceThread watcherServcie = new ServiceThread() { + + public void run() { + while (true) { + try { + while (true) { + WatchKey watchKey = watcher.take(); + List> watchEvents = watchKey.pollEvents(); + for (WatchEvent event : watchEvents) { + if ("transport.yml".equals(event.context().toString()) && + (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { + log.info("transprot.yml make a difference change is : ", event.toString()); + initialize(); + } + } + watchKey.reset(); + } + } catch (InterruptedException e) { + log.error(e.getMessage(), e); + } + } + } + + @Override + public String getServiceName() { + return "watcherServcie"; + } + + }; + watcherServcie.start(); + log.info("succeed start watcherServcie"); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { if (accessControl.getAccount() == null || accessControl.getPassword() == null || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { diff --git a/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java b/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java index 066d36cedd..8d4f23026d 100644 --- a/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java +++ b/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java @@ -37,6 +37,16 @@ public class ServerUtil { opt.setRequired(false); options.addOption(opt); + + opt = new Option("account", "account", true, "acl want the parameters"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("password", "password", true, "acl want the parameters"); + opt.setRequired(false); + options.addOption(opt); + + return options; } diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java index 6a51b7b4b9..d79e174a77 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java @@ -16,16 +16,21 @@ */ package org.apache.rocketmq.tools.command; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.joran.JoranConfigurator; -import ch.qos.logback.core.joran.spi.JoranException; - +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Properties; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; +import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.common.MQVersion; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.remoting.RPCHook; @@ -76,6 +81,10 @@ import org.apache.rocketmq.tools.command.topic.UpdateTopicPermSubCommand; import org.apache.rocketmq.tools.command.topic.UpdateTopicSubCommand; import org.slf4j.LoggerFactory; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.core.joran.spi.JoranException; + public class MQAdminStartup { protected static List subCommandList = new ArrayList(); @@ -129,7 +138,7 @@ public class MQAdminStartup { System.setProperty(MixAll.NAMESRV_ADDR_PROPERTY, namesrvAddr); } - cmd.execute(commandLine, options, rpcHook); + cmd.execute(commandLine, options, getAclRPCHook(commandLine)); } else { System.out.printf("The sub command %s not exist.%n", args[0]); } @@ -211,7 +220,7 @@ public class MQAdminStartup { private static void printHelp() { System.out.printf("The most commonly used mqadmin commands are:%n"); - + System.out.println("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); for (SubCommand cmd : subCommandList) { System.out.printf(" %-20s %s%n", cmd.commandName(), cmd.commandDesc()); } @@ -243,4 +252,63 @@ public class MQAdminStartup { public static void initCommand(SubCommand command) { subCommandList.add(command); } + + public static RPCHook getAclRPCHook(CommandLine commandLine) { + String account=null ,password = null; + if(commandLine.hasOption("account")) { + account = commandLine.getOptionValue("account"); + password = commandLine.getOptionValue("password"); + }else { + String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY,System.getenv(MixAll.ROCKETMQ_HOME_ENV)); + File file = new File(fileHome+"/conf/tools.properties"); + if(!file.exists()) { + System.out.println("no find tools.properties , , Execution may fail without account andd password"); + System.out.println("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); + return null; + } + InputStream in=null; + try { + in = new BufferedInputStream(new FileInputStream(file)); + Properties properties = new Properties(); + properties.load(in); + account = properties.getProperty("account"); + password = properties.getProperty("password"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + }finally { + if(in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + if(StringUtils.isNotBlank(account) && StringUtils.isNotBlank(password) ) { + final String newAccount = account; + final String newPassword = password; + return new RPCHook() { + + @Override + public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + HashMap ext = request.getExtFields(); + if (ext == null) { + ext = new HashMap<>(); + request.setExtFields(ext); + } + ext.put("account", newAccount); + ext.put("password", newPassword); + } + + @Override + public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) {} + }; + } + System.out.println("account andd password data incorrectness , Execution may fail without account andd password"); + System.out.println("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); + return null; + } } From 5503cff59caa9a1790af6dd5faf311e80aaf4fe8 Mon Sep 17 00:00:00 2001 From: hujie Date: Fri, 23 Nov 2018 18:56:40 +0800 Subject: [PATCH 42/96] tools acl --- .../tools/command/MQAdminStartup.java | 127 +++++++++--------- 1 file changed, 63 insertions(+), 64 deletions(-) diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java index d79e174a77..cf73f65c25 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java @@ -16,6 +16,9 @@ */ package org.apache.rocketmq.tools.command; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.core.joran.spi.JoranException; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; @@ -26,7 +29,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Properties; - import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; @@ -81,10 +83,6 @@ import org.apache.rocketmq.tools.command.topic.UpdateTopicPermSubCommand; import org.apache.rocketmq.tools.command.topic.UpdateTopicSubCommand; import org.slf4j.LoggerFactory; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.joran.JoranConfigurator; -import ch.qos.logback.core.joran.spi.JoranException; - public class MQAdminStartup { protected static List subCommandList = new ArrayList(); @@ -166,7 +164,7 @@ public class MQAdminStartup { initCommand(new QueryMsgByKeySubCommand()); initCommand(new QueryMsgByUniqueKeySubCommand()); initCommand(new QueryMsgByOffsetSubCommand()); - + initCommand(new PrintMessageSubCommand()); initCommand(new PrintMessageByQueueCommand()); initCommand(new SendMsgStatusCommand()); @@ -220,7 +218,7 @@ public class MQAdminStartup { private static void printHelp() { System.out.printf("The most commonly used mqadmin commands are:%n"); - System.out.println("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); + System.out.printf("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); for (SubCommand cmd : subCommandList) { System.out.printf(" %-20s %s%n", cmd.commandName(), cmd.commandDesc()); } @@ -252,63 +250,64 @@ public class MQAdminStartup { public static void initCommand(SubCommand command) { subCommandList.add(command); } - - public static RPCHook getAclRPCHook(CommandLine commandLine) { - String account=null ,password = null; - if(commandLine.hasOption("account")) { - account = commandLine.getOptionValue("account"); - password = commandLine.getOptionValue("password"); - }else { - String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY,System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - File file = new File(fileHome+"/conf/tools.properties"); - if(!file.exists()) { - System.out.println("no find tools.properties , , Execution may fail without account andd password"); - System.out.println("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); - return null; - } - InputStream in=null; - try { - in = new BufferedInputStream(new FileInputStream(file)); - Properties properties = new Properties(); - properties.load(in); - account = properties.getProperty("account"); - password = properties.getProperty("password"); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - }finally { - if(in != null) { - try { - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + + public static RPCHook getAclRPCHook(CommandLine commandLine) { + String account = null, password = null; + if (commandLine.hasOption("account")) { + account = commandLine.getOptionValue("account"); + password = commandLine.getOptionValue("password"); + } else { + String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); + File file = new File(fileHome + "/conf/tools.properties"); + if (!file.exists()) { + System.out.printf("no find tools.properties , , Execution may fail without account andd password"); + System.out.printf("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); + return null; + } + InputStream in = null; + try { + in = new BufferedInputStream(new FileInputStream(file)); + Properties properties = new Properties(); + properties.load(in); + account = properties.getProperty("account"); + password = properties.getProperty("password"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } } - if(StringUtils.isNotBlank(account) && StringUtils.isNotBlank(password) ) { - final String newAccount = account; - final String newPassword = password; - return new RPCHook() { - - @Override - public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - HashMap ext = request.getExtFields(); - if (ext == null) { - ext = new HashMap<>(); - request.setExtFields(ext); - } - ext.put("account", newAccount); - ext.put("password", newPassword); - } - - @Override - public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) {} - }; - } - System.out.println("account andd password data incorrectness , Execution may fail without account andd password"); - System.out.println("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); - return null; + if (StringUtils.isNotBlank(account) && StringUtils.isNotBlank(password)) { + final String newAccount = account; + final String newPassword = password; + return new RPCHook() { + + @Override + public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + HashMap ext = request.getExtFields(); + if (ext == null) { + ext = new HashMap<>(); + request.setExtFields(ext); + } + ext.put("account", newAccount); + ext.put("password", newPassword); + } + + @Override + public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { + } + }; + } + System.out.printf("account andd password data incorrectness , Execution may fail without account andd password"); + System.out.printf("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); + return null; } } From 81c71c21854f6a819cdeea627f8d9009931013b9 Mon Sep 17 00:00:00 2001 From: hujie Date: Mon, 26 Nov 2018 18:48:57 +0800 Subject: [PATCH 43/96] admin --- ...sControl.java => BrokerAccessControl.java} | 24 +++-- .../rocketmq/acl/plug/PlainAclPlugEngine.java | 35 +++--- .../acl/plug/PlainAclPlugEngineTest.java | 53 +++++----- acl/src/test/resources/conf/transport.yml | 1 + .../apache/rocketmq/srvutil/ServerUtil.java | 12 +-- tools/pom.xml | 7 +- .../tools/command/MQAdminStartup.java | 100 +++++++++--------- 7 files changed, 122 insertions(+), 110 deletions(-) rename acl/src/main/java/org/apache/rocketmq/acl/plug/{BorkerAccessControl.java => BrokerAccessControl.java} (97%) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/BorkerAccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/BrokerAccessControl.java similarity index 97% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/BorkerAccessControl.java rename to acl/src/main/java/org/apache/rocketmq/acl/plug/BrokerAccessControl.java index 449c8d01dc..beb8539c09 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/BorkerAccessControl.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/BrokerAccessControl.java @@ -19,7 +19,9 @@ package org.apache.rocketmq.acl.plug; import java.util.HashSet; import java.util.Set; -public class BorkerAccessControl extends AccessControl { +public class BrokerAccessControl extends AccessControl { + + private boolean admin; private Set permitSendTopic = new HashSet<>(); private Set noPermitSendTopic = new HashSet<>(); @@ -54,13 +56,13 @@ public class BorkerAccessControl extends AccessControl { private boolean endTransaction = true; - private boolean updateAndCreateTopic = true; + private boolean updateAndCreateTopic = false; - private boolean deleteTopicInbroker = true; + private boolean deleteTopicInbroker = false; private boolean getAllTopicConfig = true; - private boolean updateBrokerConfig = true; + private boolean updateBrokerConfig = false; private boolean getBrokerConfig = true; @@ -78,11 +80,11 @@ public class BorkerAccessControl extends AccessControl { private boolean unlockBatchMQ = true; - private boolean updateAndCreateSubscriptiongroup = true; + private boolean updateAndCreateSubscriptiongroup = false; private boolean getAllSubscriptiongroupConfig = true; - private boolean deleteSubscriptiongroup = true; + private boolean deleteSubscriptiongroup = false; private boolean getTopicStatsInfo = true; @@ -124,10 +126,18 @@ public class BorkerAccessControl extends AccessControl { private boolean queryConsumeQueue = true; - public BorkerAccessControl() { + public BrokerAccessControl() { } + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + public Set getPermitSendTopic() { return permitSendTopic; } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java index 580595ca4e..c8fb4c5009 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java @@ -62,13 +62,13 @@ public class PlainAclPlugEngine { } public void initialize() { - BorkerAccessControlTransport accessControlTransport = AclUtils.getYamlDataObject(fileHome + "/conf/transport.yml", BorkerAccessControlTransport.class); + BrokerAccessControlTransport accessControlTransport = AclUtils.getYamlDataObject(fileHome + "/conf/transport.yml", BrokerAccessControlTransport.class); if (accessControlTransport == null) { throw new AclPlugRuntimeException("transport.yml file is no data"); } log.info("BorkerAccessControlTransport data is : ", accessControlTransport.toString()); accessContralAnalysis.analysisClass(accessContralAnalysisClass); - setBorkerAccessControlTransport(accessControlTransport); + setBrokerAccessControlTransport(accessControlTransport); } private void watch() { @@ -188,7 +188,7 @@ public class PlainAclPlugEngine { return authenticationResult; } - void setBorkerAccessControlTransport(BorkerAccessControlTransport transport) { + void setBrokerAccessControlTransport(BrokerAccessControlTransport transport) { if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { throw new AclPlugRuntimeException("onlyNetAddress and list can't be all empty"); } @@ -197,7 +197,14 @@ public class PlainAclPlugEngine { this.setNetaddressAccessControl(transport.getOnlyNetAddress()); } if (transport.getList() != null || transport.getList().size() > 0) { - for (AccessControl accessControl : transport.getList()) { + for (BrokerAccessControl accessControl : transport.getList()) { + if (accessControl.isAdmin()) { + accessControl.setUpdateAndCreateSubscriptiongroup(true); + accessControl.setDeleteSubscriptiongroup(true); + accessControl.setUpdateAndCreateTopic(true); + accessControl.setDeleteTopicInbroker(true); + accessControl.setUpdateBrokerConfig(true); + } this.setAccessControl(accessControl); } } @@ -210,10 +217,10 @@ public class PlainAclPlugEngine { authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); return false; } - if (!(authenticationInfo.getAccessControl() instanceof BorkerAccessControl)) { + if (!(authenticationInfo.getAccessControl() instanceof BrokerAccessControl)) { return true; } - BorkerAccessControl borker = (BorkerAccessControl) authenticationInfo.getAccessControl(); + BrokerAccessControl borker = (BrokerAccessControl) authenticationInfo.getAccessControl(); String topicName = accessControl.getTopic(); if (code == 10 || code == 310 || code == 320) { if (borker.getPermitSendTopic().contains(topicName)) { @@ -264,6 +271,8 @@ public class PlainAclPlugEngine { codeAndField = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { + if ("admin".equals(field.getName())) + continue; if (!field.getType().equals(boolean.class)) continue; Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); @@ -297,25 +306,25 @@ public class PlainAclPlugEngine { } - public static class BorkerAccessControlTransport { + public static class BrokerAccessControlTransport { - private BorkerAccessControl onlyNetAddress; + private BrokerAccessControl onlyNetAddress; - private List list; + private List list; - public BorkerAccessControl getOnlyNetAddress() { + public BrokerAccessControl getOnlyNetAddress() { return onlyNetAddress; } - public void setOnlyNetAddress(BorkerAccessControl onlyNetAddress) { + public void setOnlyNetAddress(BrokerAccessControl onlyNetAddress) { this.onlyNetAddress = onlyNetAddress; } - public List getList() { + public List getList() { return list; } - public void setList(List list) { + public void setList(List list) { this.list = list; } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java index 654cf423ae..8797c49593 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java @@ -25,7 +25,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.rocketmq.acl.plug.PlainAclPlugEngine.AccessContralAnalysis; -import org.apache.rocketmq.acl.plug.PlainAclPlugEngine.BorkerAccessControlTransport; +import org.apache.rocketmq.acl.plug.PlainAclPlugEngine.BrokerAccessControlTransport; import org.apache.rocketmq.common.protocol.RequestCode; import org.junit.Assert; import org.junit.Before; @@ -46,50 +46,49 @@ public class PlainAclPlugEngineTest { AuthenticationInfo authenticationInfo; - BorkerAccessControl borkerAccessControl; + BrokerAccessControl BrokerAccessControl; @Before public void init() throws NoSuchFieldException, SecurityException, IOException { accessContralAnalysis.analysisClass(RequestCode.class); - borkerAccessControl = new BorkerAccessControl(); + BrokerAccessControl = new BrokerAccessControl(); // 321 - borkerAccessControl.setQueryConsumeQueue(false); + BrokerAccessControl.setQueryConsumeQueue(false); Set permitSendTopic = new HashSet<>(); permitSendTopic.add("permitSendTopic"); - borkerAccessControl.setPermitSendTopic(permitSendTopic); + BrokerAccessControl.setPermitSendTopic(permitSendTopic); Set noPermitSendTopic = new HashSet<>(); noPermitSendTopic.add("noPermitSendTopic"); - borkerAccessControl.setNoPermitSendTopic(noPermitSendTopic); + BrokerAccessControl.setNoPermitSendTopic(noPermitSendTopic); Set permitPullTopic = new HashSet<>(); permitPullTopic.add("permitPullTopic"); - borkerAccessControl.setPermitPullTopic(permitPullTopic); + BrokerAccessControl.setPermitPullTopic(permitPullTopic); Set noPermitPullTopic = new HashSet<>(); noPermitPullTopic.add("noPermitPullTopic"); - borkerAccessControl.setNoPermitPullTopic(noPermitPullTopic); + BrokerAccessControl.setNoPermitPullTopic(noPermitPullTopic); AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); accessContralAnalysis.analysisClass(RequestCode.class); - Map map = accessContralAnalysis.analysis(borkerAccessControl); + Map map = accessContralAnalysis.analysis(BrokerAccessControl); - authenticationInfo = new AuthenticationInfo(map, borkerAccessControl, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); + authenticationInfo = new AuthenticationInfo(map, BrokerAccessControl, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); System.setProperty("rocketmq.home.dir", "src/test/resources"); plainAclPlugEngine = new PlainAclPlugEngine(); - plainAclPlugEngine.initialize(); - accessControl = new BorkerAccessControl(); + accessControl = new BrokerAccessControl(); accessControl.setAccount("rokcetmq"); accessControl.setPassword("aliyun11"); accessControl.setNetaddress("127.0.0.1"); accessControl.setRecognition("127.0.0.1:1"); - accessControlTwo = new BorkerAccessControl(); + accessControlTwo = new BrokerAccessControl(); accessControlTwo.setAccount("rokcet1"); accessControlTwo.setPassword("aliyun1"); accessControlTwo.setNetaddress("127.0.0.1"); @@ -175,7 +174,7 @@ public class PlainAclPlugEngineTest { @Test public void setNetaddressAccessControl() { - AccessControl accessControl = new BorkerAccessControl(); + AccessControl accessControl = new BrokerAccessControl(); accessControl.setAccount("RocketMQ"); accessControl.setPassword("RocketMQ"); accessControl.setNetaddress("127.0.0.1"); @@ -197,21 +196,21 @@ public class PlainAclPlugEngineTest { } @Test(expected = AclPlugRuntimeException.class) - public void borkerAccessControlTransportTestNull() { - BorkerAccessControlTransport accessControlTransport = new BorkerAccessControlTransport(); - plainAclPlugEngine.setBorkerAccessControlTransport(accessControlTransport); + public void BrokerAccessControlTransportTestNull() { + BrokerAccessControlTransport accessControlTransport = new BrokerAccessControlTransport(); + plainAclPlugEngine.setBrokerAccessControlTransport(accessControlTransport); } @Test - public void borkerAccessControlTransportTest() { - BorkerAccessControlTransport accessControlTransport = new BorkerAccessControlTransport(); - List list = new ArrayList<>(); - list.add((BorkerAccessControl) this.accessControlTwo); - accessControlTransport.setOnlyNetAddress((BorkerAccessControl) this.accessControl); + public void BrokerAccessControlTransportTest() { + BrokerAccessControlTransport accessControlTransport = new BrokerAccessControlTransport(); + List list = new ArrayList<>(); + list.add((BrokerAccessControl) this.accessControlTwo); + accessControlTransport.setOnlyNetAddress((BrokerAccessControl) this.accessControl); accessControlTransport.setList(list); - plainAclPlugEngine.setBorkerAccessControlTransport(accessControlTransport); + plainAclPlugEngine.setBrokerAccessControlTransport(accessControlTransport); - AccessControl accessControl = new BorkerAccessControl(); + AccessControl accessControl = new BrokerAccessControl(); accessControl.setAccount("RocketMQ"); accessControl.setPassword("RocketMQ"); accessControl.setNetaddress("127.0.0.1"); @@ -281,7 +280,7 @@ public class PlainAclPlugEngineTest { Assert.assertFalse(isReturn); Set permitSendTopic = new HashSet<>(); - borkerAccessControl.setPermitSendTopic(permitSendTopic); + BrokerAccessControl.setPermitSendTopic(permitSendTopic); isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); @@ -289,14 +288,14 @@ public class PlainAclPlugEngineTest { isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); - borkerAccessControl.setPermitPullTopic(permitSendTopic); + BrokerAccessControl.setPermitPullTopic(permitSendTopic); isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); } @Test public void analysisTest() { - BorkerAccessControl accessControl = new BorkerAccessControl(); + BrokerAccessControl accessControl = new BrokerAccessControl(); accessControl.setSendMessage(false); Map map = accessContralAnalysis.analysis(accessControl); diff --git a/acl/src/test/resources/conf/transport.yml b/acl/src/test/resources/conf/transport.yml index 99d26fd8eb..6b1450ef95 100644 --- a/acl/src/test/resources/conf/transport.yml +++ b/acl/src/test/resources/conf/transport.yml @@ -22,6 +22,7 @@ list: - account: RocketMQ password: 1234567 netaddress: 192.0.0.* + admin: true permitSendTopic: - test1 - test2 diff --git a/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java b/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java index 8d4f23026d..ea8047a2ff 100644 --- a/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java +++ b/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java @@ -35,17 +35,7 @@ public class ServerUtil { new Option("n", "namesrvAddr", true, "Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876"); opt.setRequired(false); - options.addOption(opt); - - - opt = new Option("account", "account", true, "acl want the parameters"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("password", "password", true, "acl want the parameters"); - opt.setRequired(false); - options.addOption(opt); - + options.addOption(opt); return options; } diff --git a/tools/pom.xml b/tools/pom.xml index dc0e256ed4..086c3e64c1 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -15,7 +15,8 @@ limitations under the License. --> - + org.apache.rocketmq rocketmq-all @@ -60,5 +61,9 @@ org.apache.commons commons-lang3 + + org.yaml + snakeyaml + diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java index cf73f65c25..d1ce0f0ab7 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java @@ -19,16 +19,13 @@ package org.apache.rocketmq.tools.command; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.core.joran.spi.JoranException; -import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Properties; +import java.util.Map; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; @@ -82,6 +79,7 @@ import org.apache.rocketmq.tools.command.topic.UpdateOrderConfCommand; import org.apache.rocketmq.tools.command.topic.UpdateTopicPermSubCommand; import org.apache.rocketmq.tools.command.topic.UpdateTopicSubCommand; import org.slf4j.LoggerFactory; +import org.yaml.snakeyaml.Yaml; public class MQAdminStartup { protected static List subCommandList = new ArrayList(); @@ -218,7 +216,6 @@ public class MQAdminStartup { private static void printHelp() { System.out.printf("The most commonly used mqadmin commands are:%n"); - System.out.printf("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); for (SubCommand cmd : subCommandList) { System.out.printf(" %-20s %s%n", cmd.commandName(), cmd.commandDesc()); } @@ -252,62 +249,63 @@ public class MQAdminStartup { } public static RPCHook getAclRPCHook(CommandLine commandLine) { - String account = null, password = null; - if (commandLine.hasOption("account")) { - account = commandLine.getOptionValue("account"); - password = commandLine.getOptionValue("password"); - } else { - String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - File file = new File(fileHome + "/conf/tools.properties"); - if (!file.exists()) { - System.out.printf("no find tools.properties , , Execution may fail without account andd password"); - System.out.printf("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); - return null; - } - InputStream in = null; - try { - in = new BufferedInputStream(new FileInputStream(file)); - Properties properties = new Properties(); - properties.load(in); - account = properties.getProperty("account"); - password = properties.getProperty("password"); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } + String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); + File file = new File(fileHome + "/conf/tools.yml"); + if (!file.exists()) { + System.out.printf("file %s is not exist" , file.getPath()); + return null; + } + Yaml ymal = new Yaml(); + FileInputStream fis = null; + Map> map = null; + try { + fis = new FileInputStream(file); + map = ymal.loadAs(fis, Map.class); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); } } } - if (StringUtils.isNotBlank(account) && StringUtils.isNotBlank(password)) { - final String newAccount = account; - final String newPassword = password; - return new RPCHook() { + if (map == null || map.isEmpty()) { + System.out.printf("file %s is no data" , file.getPath()); + return null; + } - @Override - public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + final Map> newMap = map; + return new RPCHook() { + + @Override + public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + System.out.printf("remoteAddr is %s code %d \n" , remoteAddr , request.getCode() ); + String fastRemoteAddr = null; + if(remoteAddr != null) { + String[] ipAndPost = StringUtils.split(remoteAddr, ":"); + Integer fastPost = (Integer.valueOf(ipAndPost[1])+2); + fastRemoteAddr = ipAndPost[0] + ":" + fastPost.toString(); + } + Map map; + if ((map = newMap.get(remoteAddr)) != null ||(map = newMap.get(fastRemoteAddr)) != null || (map = newMap.get("all")) != null) { HashMap ext = request.getExtFields(); if (ext == null) { ext = new HashMap<>(); request.setExtFields(ext); } - ext.put("account", newAccount); - ext.put("password", newPassword); + ext.put("account", map.get("account").toString()); + ext.put("password", map.get("password").toString()); } + + } + + @Override + public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { + } + }; - @Override - public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { - } - }; - } - System.out.printf("account andd password data incorrectness , Execution may fail without account andd password"); - System.out.printf("ROCKETMQ_HOME Add tools.properties to the %ROCKETMQ_HOME%/conf/ directory or add -account xxxx -password xxxx Join when executing a command"); - return null; } } From fb60683850411c0b84fbe4559b8408a6d0cac59b Mon Sep 17 00:00:00 2001 From: hujie Date: Tue, 27 Nov 2018 10:04:16 +0800 Subject: [PATCH 44/96] admin --- .../tools/command/MQAdminStartup.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java index d1ce0f0ab7..34e9f451a2 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java @@ -252,7 +252,7 @@ public class MQAdminStartup { String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); File file = new File(fileHome + "/conf/tools.yml"); if (!file.exists()) { - System.out.printf("file %s is not exist" , file.getPath()); + System.out.printf("file %s is not exist \n", file.getPath()); return null; } Yaml ymal = new Yaml(); @@ -273,7 +273,7 @@ public class MQAdminStartup { } } if (map == null || map.isEmpty()) { - System.out.printf("file %s is no data" , file.getPath()); + System.out.printf("file %s is no data", file.getPath()); return null; } @@ -282,15 +282,15 @@ public class MQAdminStartup { @Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - System.out.printf("remoteAddr is %s code %d \n" , remoteAddr , request.getCode() ); - String fastRemoteAddr = null; - if(remoteAddr != null) { - String[] ipAndPost = StringUtils.split(remoteAddr, ":"); - Integer fastPost = (Integer.valueOf(ipAndPost[1])+2); - fastRemoteAddr = ipAndPost[0] + ":" + fastPost.toString(); - } + System.out.printf("remoteAddr is %s code %d \n", remoteAddr, request.getCode()); + String fastRemoteAddr = null; + if (remoteAddr != null) { + String[] ipAndPost = StringUtils.split(remoteAddr, ":"); + Integer fastPost = Integer.valueOf(ipAndPost[1]) + 2; + fastRemoteAddr = ipAndPost[0] + ":" + fastPost.toString(); + } Map map; - if ((map = newMap.get(remoteAddr)) != null ||(map = newMap.get(fastRemoteAddr)) != null || (map = newMap.get("all")) != null) { + if ((map = newMap.get(remoteAddr)) != null || (map = newMap.get(fastRemoteAddr)) != null || (map = newMap.get("all")) != null) { HashMap ext = request.getExtFields(); if (ext == null) { ext = new HashMap<>(); @@ -299,7 +299,7 @@ public class MQAdminStartup { ext.put("account", map.get("account").toString()); ext.put("password", map.get("password").toString()); } - + } @Override From 3530b76e7bd1a493ac302948378b7d080430e2ec Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Fri, 2 Nov 2018 17:03:04 +0800 Subject: [PATCH 45/96] MQPullConsumer support MessageSelector --- .../consumer/DefaultMQPullConsumer.java | 26 +++++ .../client/consumer/MQPullConsumer.java | 47 +++++++++ .../consumer/DefaultMQPullConsumerImpl.java | 95 ++++++++++++++----- .../client/impl/consumer/PullAPIWrapper.java | 29 +----- .../client/impl/factory/MQClientInstance.java | 13 +++ 5 files changed, 157 insertions(+), 53 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPullConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPullConsumer.java index cd70670307..6befbf3b5e 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPullConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPullConsumer.java @@ -257,6 +257,18 @@ public class DefaultMQPullConsumer extends ClientConfig implements MQPullConsume return this.defaultMQPullConsumerImpl.pull(mq, subExpression, offset, maxNums, timeout); } + @Override + public PullResult pull(MessageQueue mq, MessageSelector messageSelector, long offset, int maxNums) + throws MQClientException, RemotingException, MQBrokerException, InterruptedException { + return this.defaultMQPullConsumerImpl.pull(mq, messageSelector, offset, maxNums); + } + + @Override + public PullResult pull(MessageQueue mq, MessageSelector messageSelector, long offset, int maxNums, long timeout) + throws MQClientException, RemotingException, MQBrokerException, InterruptedException { + return this.defaultMQPullConsumerImpl.pull(mq, messageSelector, offset, maxNums, timeout); + } + @Override public void pull(MessageQueue mq, String subExpression, long offset, int maxNums, PullCallback pullCallback) throws MQClientException, RemotingException, InterruptedException { @@ -270,6 +282,20 @@ public class DefaultMQPullConsumer extends ClientConfig implements MQPullConsume this.defaultMQPullConsumerImpl.pull(mq, subExpression, offset, maxNums, pullCallback, timeout); } + @Override + public void pull(MessageQueue mq, MessageSelector messageSelector, long offset, int maxNums, + PullCallback pullCallback) + throws MQClientException, RemotingException, InterruptedException { + this.defaultMQPullConsumerImpl.pull(mq, messageSelector, offset, maxNums, pullCallback); + } + + @Override + public void pull(MessageQueue mq, MessageSelector messageSelector, long offset, int maxNums, + PullCallback pullCallback, long timeout) + throws MQClientException, RemotingException, InterruptedException { + this.defaultMQPullConsumerImpl.pull(mq, messageSelector, offset, maxNums, pullCallback, timeout); + } + @Override public PullResult pullBlockIfNotFound(MessageQueue mq, String subExpression, long offset, int maxNums) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumer.java index 33002c9837..28b807c2ed 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumer.java @@ -66,6 +66,39 @@ public interface MQPullConsumer extends MQConsumer { final int maxNums, final long timeout) throws MQClientException, RemotingException, MQBrokerException, InterruptedException; + /** + * Pulling the messages, not blocking + *

+ * support other message selection, such as {@link org.apache.rocketmq.common.filter.ExpressionType#SQL92} + *

+ * + * @param mq from which message queue + * @param selector message selector({@link MessageSelector}), can be null. + * @param offset from where to pull + * @param maxNums max pulling numbers + * @return The resulting {@code PullRequest} + */ + PullResult pull(final MessageQueue mq, final MessageSelector selector, final long offset, + final int maxNums) throws MQClientException, RemotingException, MQBrokerException, + InterruptedException; + + /** + * Pulling the messages in the specified timeout + *

+ * support other message selection, such as {@link org.apache.rocketmq.common.filter.ExpressionType#SQL92} + *

+ * + * @param mq from which message queue + * @param selector message selector({@link MessageSelector}), can be null. + * @param offset from where to pull + * @param maxNums max pulling numbers + * @param timeout Pulling the messages in the specified timeout + * @return The resulting {@code PullRequest} + */ + PullResult pull(final MessageQueue mq, final MessageSelector selector, final long offset, + final int maxNums, final long timeout) throws MQClientException, RemotingException, MQBrokerException, + InterruptedException; + /** * Pulling the messages in a async. way */ @@ -80,6 +113,20 @@ public interface MQPullConsumer extends MQConsumer { final PullCallback pullCallback, long timeout) throws MQClientException, RemotingException, InterruptedException; + /** + * Pulling the messages in a async. way. Support message selection + */ + void pull(final MessageQueue mq, final MessageSelector selector, final long offset, final int maxNums, + final PullCallback pullCallback) throws MQClientException, RemotingException, + InterruptedException; + + /** + * Pulling the messages in a async. way. Support message selection + */ + void pull(final MessageQueue mq, final MessageSelector selector, final long offset, final int maxNums, + final PullCallback pullCallback, long timeout) throws MQClientException, RemotingException, + InterruptedException; + /** * Pulling the messages,if no message arrival,blocking some time * diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java index 420d89b2fd..1804df20e0 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java @@ -26,6 +26,7 @@ import java.util.concurrent.ConcurrentMap; import org.apache.rocketmq.client.QueryResult; import org.apache.rocketmq.client.Validators; import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer; +import org.apache.rocketmq.client.consumer.MessageSelector; import org.apache.rocketmq.client.consumer.PullCallback; import org.apache.rocketmq.client.consumer.PullResult; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; @@ -158,17 +159,58 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner { public PullResult pull(MessageQueue mq, String subExpression, long offset, int maxNums, long timeout) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { - return this.pullSyncImpl(mq, subExpression, offset, maxNums, false, timeout); + SubscriptionData subscriptionData = getSubscriptionData(mq, subExpression); + return this.pullSyncImpl(mq, subscriptionData, offset, maxNums, false, timeout); } - private PullResult pullSyncImpl(MessageQueue mq, String subExpression, long offset, int maxNums, boolean block, + public PullResult pull(MessageQueue mq, MessageSelector messageSelector, long offset, int maxNums) + throws MQClientException, RemotingException, MQBrokerException, InterruptedException { + return pull(mq, messageSelector, offset, maxNums, this.defaultMQPullConsumer.getConsumerPullTimeoutMillis()); + } + + public PullResult pull(MessageQueue mq, MessageSelector messageSelector, long offset, int maxNums, long timeout) + throws MQClientException, RemotingException, MQBrokerException, InterruptedException { + SubscriptionData subscriptionData = getSubscriptionData(mq, messageSelector); + return this.pullSyncImpl(mq, subscriptionData, offset, maxNums, false, timeout); + } + + private SubscriptionData getSubscriptionData(MessageQueue mq, String subExpression) + throws MQClientException { + + if (null == mq) { + throw new MQClientException("mq is null", null); + } + + try { + return FilterAPI.buildSubscriptionData(this.defaultMQPullConsumer.getConsumerGroup(), + mq.getTopic(), subExpression); + } catch (Exception e) { + throw new MQClientException("parse subscription error", e); + } + } + + private SubscriptionData getSubscriptionData(MessageQueue mq, MessageSelector messageSelector) + throws MQClientException { + + if (null == mq) { + throw new MQClientException("mq is null", null); + } + + try { + return FilterAPI.build(mq.getTopic(), + messageSelector.getExpression(), messageSelector.getExpressionType()); + } catch (Exception e) { + throw new MQClientException("parse subscription error", e); + } + } + + private PullResult pullSyncImpl(MessageQueue mq, SubscriptionData subscriptionData, long offset, int maxNums, boolean block, long timeout) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { this.makeSureStateOK(); if (null == mq) { throw new MQClientException("mq is null", null); - } if (offset < 0) { @@ -183,20 +225,13 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner { int sysFlag = PullSysFlag.buildSysFlag(false, block, true, false); - SubscriptionData subscriptionData; - try { - subscriptionData = FilterAPI.buildSubscriptionData(this.defaultMQPullConsumer.getConsumerGroup(), - mq.getTopic(), subExpression); - } catch (Exception e) { - throw new MQClientException("parse subscription error", e); - } - long timeoutMillis = block ? this.defaultMQPullConsumer.getConsumerTimeoutMillisWhenSuspend() : timeout; PullResult pullResult = this.pullAPIWrapper.pullKernelImpl( mq, subscriptionData.getSubString(), - 0L, + subscriptionData.getExpressionType(), + subscriptionData.getSubVersion(), offset, maxNums, sysFlag, @@ -369,12 +404,27 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner { public void pull(MessageQueue mq, String subExpression, long offset, int maxNums, PullCallback pullCallback, long timeout) throws MQClientException, RemotingException, InterruptedException { - this.pullAsyncImpl(mq, subExpression, offset, maxNums, pullCallback, false, timeout); + SubscriptionData subscriptionData = getSubscriptionData(mq, subExpression); + this.pullAsyncImpl(mq, subscriptionData, offset, maxNums, pullCallback, false, timeout); + } + + public void pull(MessageQueue mq, MessageSelector messageSelector, long offset, int maxNums, + PullCallback pullCallback) + throws MQClientException, RemotingException, InterruptedException { + pull(mq, messageSelector, offset, maxNums, pullCallback, this.defaultMQPullConsumer.getConsumerPullTimeoutMillis()); + } + + public void pull(MessageQueue mq, MessageSelector messageSelector, long offset, int maxNums, + PullCallback pullCallback, + long timeout) + throws MQClientException, RemotingException, InterruptedException { + SubscriptionData subscriptionData = getSubscriptionData(mq, messageSelector); + this.pullAsyncImpl(mq, subscriptionData, offset, maxNums, pullCallback, false, timeout); } private void pullAsyncImpl( final MessageQueue mq, - final String subExpression, + final SubscriptionData subscriptionData, final long offset, final int maxNums, final PullCallback pullCallback, @@ -403,20 +453,13 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner { try { int sysFlag = PullSysFlag.buildSysFlag(false, block, true, false); - final SubscriptionData subscriptionData; - try { - subscriptionData = FilterAPI.buildSubscriptionData(this.defaultMQPullConsumer.getConsumerGroup(), - mq.getTopic(), subExpression); - } catch (Exception e) { - throw new MQClientException("parse subscription error", e); - } - long timeoutMillis = block ? this.defaultMQPullConsumer.getConsumerTimeoutMillisWhenSuspend() : timeout; this.pullAPIWrapper.pullKernelImpl( mq, subscriptionData.getSubString(), - 0L, + subscriptionData.getExpressionType(), + subscriptionData.getSubVersion(), offset, maxNums, sysFlag, @@ -444,7 +487,8 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner { public PullResult pullBlockIfNotFound(MessageQueue mq, String subExpression, long offset, int maxNums) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { - return this.pullSyncImpl(mq, subExpression, offset, maxNums, true, this.getDefaultMQPullConsumer().getConsumerPullTimeoutMillis()); + SubscriptionData subscriptionData = getSubscriptionData(mq, subExpression); + return this.pullSyncImpl(mq, subscriptionData, offset, maxNums, true, this.getDefaultMQPullConsumer().getConsumerPullTimeoutMillis()); } public DefaultMQPullConsumer getDefaultMQPullConsumer() { @@ -454,7 +498,8 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner { public void pullBlockIfNotFound(MessageQueue mq, String subExpression, long offset, int maxNums, PullCallback pullCallback) throws MQClientException, RemotingException, InterruptedException { - this.pullAsyncImpl(mq, subExpression, offset, maxNums, pullCallback, true, + SubscriptionData subscriptionData = getSubscriptionData(mq, subExpression); + this.pullAsyncImpl(mq, subscriptionData, offset, maxNums, pullCallback, true, this.getDefaultMQPullConsumer().getConsumerPullTimeoutMillis()); } diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java index b650e35e02..ac44df4355 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java @@ -163,6 +163,7 @@ public class PullAPIWrapper { this.recalculatePullFromWhichNode(mq), false); } + if (findBrokerResult != null) { { // check version @@ -209,34 +210,6 @@ public class PullAPIWrapper { throw new MQClientException("The broker[" + mq.getBrokerName() + "] not exist", null); } - public PullResult pullKernelImpl( - final MessageQueue mq, - final String subExpression, - final long subVersion, - final long offset, - final int maxNums, - final int sysFlag, - final long commitOffset, - final long brokerSuspendMaxTimeMillis, - final long timeoutMillis, - final CommunicationMode communicationMode, - final PullCallback pullCallback - ) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { - return pullKernelImpl( - mq, - subExpression, - ExpressionType.TAG, - subVersion, offset, - maxNums, - sysFlag, - commitOffset, - brokerSuspendMaxTimeMillis, - timeoutMillis, - communicationMode, - pullCallback - ); - } - public long recalculatePullFromWhichNode(final MessageQueue mq) { if (this.isConnectBrokerByUser()) { return this.defaultBrokerId; diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java index 9ffaed0a4f..5172211158 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java @@ -1046,6 +1046,19 @@ public class MQClientInstance { if (this.brokerVersionTable.get(brokerName).containsKey(brokerAddr)) { return this.brokerVersionTable.get(brokerName).get(brokerAddr); } + }else{ + HeartbeatData heartbeatData = prepareHeartbeatData(); + try { + int version = this.mQClientAPIImpl.sendHearbeat(brokerAddr, heartbeatData, 3000); + return version; + } catch (Exception e) { + if (this.isBrokerInNameServer(brokerAddr)) { + log.info("send heart beat to broker[{} {}] failed", brokerName, brokerAddr); + } else { + log.info("send heart beat to broker[{} {}] exception, because the broker not up, forget it", brokerName, + brokerAddr); + } + } } return 0; } From 11bb2672687266375acdea7dbd955c00b2e760c4 Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Fri, 2 Nov 2018 17:17:14 +0800 Subject: [PATCH 46/96] Make tag type use 0 as subVersion --- .../client/impl/consumer/DefaultMQPullConsumerImpl.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java index 1804df20e0..39c43d592d 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java @@ -47,6 +47,7 @@ import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.ServiceState; import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.consumer.ConsumeFromWhere; +import org.apache.rocketmq.common.filter.ExpressionType; import org.apache.rocketmq.common.filter.FilterAPI; import org.apache.rocketmq.common.help.FAQUrl; import org.apache.rocketmq.logging.InternalLogger; @@ -227,11 +228,12 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner { long timeoutMillis = block ? this.defaultMQPullConsumer.getConsumerTimeoutMillisWhenSuspend() : timeout; + boolean isTagType = ExpressionType.isTagType(subscriptionData.getExpressionType()); PullResult pullResult = this.pullAPIWrapper.pullKernelImpl( mq, subscriptionData.getSubString(), subscriptionData.getExpressionType(), - subscriptionData.getSubVersion(), + isTagType ? 0L : subscriptionData.getSubVersion(), offset, maxNums, sysFlag, @@ -455,11 +457,12 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner { long timeoutMillis = block ? this.defaultMQPullConsumer.getConsumerTimeoutMillisWhenSuspend() : timeout; + boolean isTagType = ExpressionType.isTagType(subscriptionData.getExpressionType()); this.pullAPIWrapper.pullKernelImpl( mq, subscriptionData.getSubString(), subscriptionData.getExpressionType(), - subscriptionData.getSubVersion(), + isTagType ? 0L : subscriptionData.getSubVersion(), offset, maxNums, sysFlag, From 82a59610b8c53edd8713ea04e775222ba277dbfd Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Tue, 6 Nov 2018 21:59:15 +0800 Subject: [PATCH 47/96] Add integration test case --- .../client/impl/consumer/PullAPIWrapper.java | 1 - .../client/impl/factory/MQClientInstance.java | 2 +- .../client/consumer/filter/SqlFilterIT.java | 75 ++++++++++++++++++- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java index ac44df4355..1d2d24fa3b 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java @@ -163,7 +163,6 @@ public class PullAPIWrapper { this.recalculatePullFromWhichNode(mq), false); } - if (findBrokerResult != null) { { // check version diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java index 5172211158..80347d1052 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java @@ -1046,7 +1046,7 @@ public class MQClientInstance { if (this.brokerVersionTable.get(brokerName).containsKey(brokerAddr)) { return this.brokerVersionTable.get(brokerName).get(brokerAddr); } - }else{ + } else { HeartbeatData heartbeatData = prepareHeartbeatData(); try { int version = this.mQClientAPIImpl.sendHearbeat(brokerAddr, heartbeatData, 3000); diff --git a/test/src/test/java/org/apache/rocketmq/test/client/consumer/filter/SqlFilterIT.java b/test/src/test/java/org/apache/rocketmq/test/client/consumer/filter/SqlFilterIT.java index 79f15dcc99..a0f6555ced 100644 --- a/test/src/test/java/org/apache/rocketmq/test/client/consumer/filter/SqlFilterIT.java +++ b/test/src/test/java/org/apache/rocketmq/test/client/consumer/filter/SqlFilterIT.java @@ -17,12 +17,18 @@ package org.apache.rocketmq.test.client.consumer.filter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.log4j.Logger; +import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer; import org.apache.rocketmq.client.consumer.MessageSelector; +import org.apache.rocketmq.client.consumer.PullResult; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.common.message.MessageQueue; import org.apache.rocketmq.test.base.BaseConf; -import org.apache.rocketmq.test.client.consumer.broadcast.BaseBroadCastIT; -import org.apache.rocketmq.test.client.consumer.broadcast.normal.NormalMsgTwoSameGroupConsumerIT; -import org.apache.rocketmq.test.client.rmq.RMQBroadCastConsumer; import org.apache.rocketmq.test.client.rmq.RMQNormalProducer; import org.apache.rocketmq.test.client.rmq.RMQSqlConsumer; import org.apache.rocketmq.test.factory.ConsumerFactory; @@ -39,12 +45,14 @@ public class SqlFilterIT extends BaseConf { private static Logger logger = Logger.getLogger(SqlFilterIT.class); private RMQNormalProducer producer = null; private String topic = null; + private static final Map OFFSE_TABLE = new HashMap(); @Before public void setUp() { topic = initTopic(); logger.info(String.format("use topic: %s;", topic)); producer = getProducer(nsAddr, topic); + OFFSE_TABLE.clear(); } @After @@ -71,4 +79,65 @@ public class SqlFilterIT extends BaseConf { assertThat(consumer.getListener().getAllMsgBody().size()).isEqualTo(msgSize * 2); } + + @Test + public void testFilterPullConsumer() throws Exception { + int msgSize = 16; + + String group = initConsumerGroup(); + MessageSelector selector = MessageSelector.bySql("(TAGS is not null and TAGS in ('TagA', 'TagB'))"); + DefaultMQPullConsumer consumer = new DefaultMQPullConsumer(group); + consumer.setNamesrvAddr(nsAddr); + consumer.start(); + Thread.sleep(3000); + producer.send("TagA", msgSize); + producer.send("TagB", msgSize); + producer.send("TagC", msgSize); + Assert.assertEquals("Not all sent succeeded", msgSize * 3, producer.getAllUndupMsgBody().size()); + + List receivedMessage = new ArrayList<>(2); + Set mqs = consumer.fetchSubscribeMessageQueues(topic); + for (MessageQueue mq : mqs) { + SINGLE_MQ: + while (true) { + try { + PullResult pullResult = + consumer.pull(mq, selector, getMessageQueueOffset(mq), 32); + putMessageQueueOffset(mq, pullResult.getNextBeginOffset()); + switch (pullResult.getPullStatus()) { + case FOUND: + List msgs = pullResult.getMsgFoundList(); + for (MessageExt msg : msgs) { + receivedMessage.add(new String(msg.getBody())); + } + break; + case NO_MATCHED_MSG: + break; + case NO_NEW_MSG: + break SINGLE_MQ; + case OFFSET_ILLEGAL: + break; + default: + break; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + assertThat(receivedMessage.size()).isEqualTo(msgSize * 2); + } + + private static long getMessageQueueOffset(MessageQueue mq) { + Long offset = OFFSE_TABLE.get(mq); + if (offset != null) + return offset; + + return 0; + } + + private static void putMessageQueueOffset(MessageQueue mq, long offset) { + OFFSE_TABLE.put(mq, offset); + } } From b11ccc5c3c9d47b5b8d9625681f5adb7d96acc5c Mon Sep 17 00:00:00 2001 From: hujie Date: Tue, 27 Nov 2018 19:41:06 +0800 Subject: [PATCH 48/96] admin --- .../rocketmq/acl/plug/PlainAclPlugEngine.java | 34 ++++- .../acl/plug/PlainAclPlugEngineTest.java | 139 ++++++++++++++++-- .../org.apache.rocketmq.acl.AccessValidator | 1 - 3 files changed, 155 insertions(+), 19 deletions(-) delete mode 100644 broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java index c8fb4c5009..50aab379d3 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java @@ -56,6 +56,8 @@ public class PlainAclPlugEngine { private Class accessContralAnalysisClass = RequestCode.class; + private boolean isWatchStart; + public PlainAclPlugEngine() { initialize(); watch(); @@ -95,6 +97,7 @@ public class PlainAclPlugEngine { if ("transport.yml".equals(event.context().toString()) && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { log.info("transprot.yml make a difference change is : ", event.toString()); + PlainAclPlugEngine.this.cleanAuthenticationInfo(); initialize(); } } @@ -114,11 +117,30 @@ public class PlainAclPlugEngine { }; watcherServcie.start(); log.info("succeed start watcherServcie"); + this.isWatchStart = true; } catch (IOException e) { log.error(e.getMessage(), e); } } + private void handleAccessControl(AccessControl accessControl) { + if (accessControl instanceof BrokerAccessControl) { + BrokerAccessControl brokerAccessControl = (BrokerAccessControl) accessControl; + if (brokerAccessControl.isAdmin()) { + brokerAccessControl.setUpdateAndCreateSubscriptiongroup(true); + brokerAccessControl.setDeleteSubscriptiongroup(true); + brokerAccessControl.setUpdateAndCreateTopic(true); + brokerAccessControl.setDeleteTopicInbroker(true); + brokerAccessControl.setUpdateBrokerConfig(true); + } + } + } + + void cleanAuthenticationInfo() { + accessControlMap.clear(); + authenticationInfo = null; + } + public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { if (accessControl.getAccount() == null || accessControl.getPassword() == null || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { @@ -127,6 +149,7 @@ public class PlainAclPlugEngine { accessControl.getAccount(), accessControl.getPassword())); } try { + handleAccessControl(accessControl); NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); if (accessControlAddressList == null) { @@ -198,13 +221,6 @@ public class PlainAclPlugEngine { } if (transport.getList() != null || transport.getList().size() > 0) { for (BrokerAccessControl accessControl : transport.getList()) { - if (accessControl.isAdmin()) { - accessControl.setUpdateAndCreateSubscriptiongroup(true); - accessControl.setDeleteSubscriptiongroup(true); - accessControl.setUpdateAndCreateTopic(true); - accessControl.setDeleteTopicInbroker(true); - accessControl.setUpdateBrokerConfig(true); - } this.setAccessControl(accessControl); } } @@ -244,6 +260,10 @@ public class PlainAclPlugEngine { return true; } + public boolean isWatchStart() { + return isWatchStart; + } + public static class AccessContralAnalysis { private Map, Map> classTocodeAndMentod = new HashMap<>(); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java index 8797c49593..3d3f254e35 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java @@ -16,6 +16,8 @@ */ package org.apache.rocketmq.acl.plug; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; @@ -46,38 +48,50 @@ public class PlainAclPlugEngineTest { AuthenticationInfo authenticationInfo; - BrokerAccessControl BrokerAccessControl; + BrokerAccessControl brokerAccessControl; + + Set adminCode = new HashSet<>(); @Before public void init() throws NoSuchFieldException, SecurityException, IOException { + // UPDATE_AND_CREATE_TOPIC + adminCode.add(17); + // UPDATE_BROKER_CONFIG + adminCode.add(25); + // DELETE_TOPIC_IN_BROKER + adminCode.add(215); + // UPDATE_AND_CREATE_SUBSCRIPTIONGROUP + adminCode.add(200); + // DELETE_SUBSCRIPTIONGROUP + adminCode.add(207); accessContralAnalysis.analysisClass(RequestCode.class); - BrokerAccessControl = new BrokerAccessControl(); + brokerAccessControl = new BrokerAccessControl(); // 321 - BrokerAccessControl.setQueryConsumeQueue(false); + brokerAccessControl.setQueryConsumeQueue(false); Set permitSendTopic = new HashSet<>(); permitSendTopic.add("permitSendTopic"); - BrokerAccessControl.setPermitSendTopic(permitSendTopic); + brokerAccessControl.setPermitSendTopic(permitSendTopic); Set noPermitSendTopic = new HashSet<>(); noPermitSendTopic.add("noPermitSendTopic"); - BrokerAccessControl.setNoPermitSendTopic(noPermitSendTopic); + brokerAccessControl.setNoPermitSendTopic(noPermitSendTopic); Set permitPullTopic = new HashSet<>(); permitPullTopic.add("permitPullTopic"); - BrokerAccessControl.setPermitPullTopic(permitPullTopic); + brokerAccessControl.setPermitPullTopic(permitPullTopic); Set noPermitPullTopic = new HashSet<>(); noPermitPullTopic.add("noPermitPullTopic"); - BrokerAccessControl.setNoPermitPullTopic(noPermitPullTopic); + brokerAccessControl.setNoPermitPullTopic(noPermitPullTopic); AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); accessContralAnalysis.analysisClass(RequestCode.class); - Map map = accessContralAnalysis.analysis(BrokerAccessControl); + Map map = accessContralAnalysis.analysis(brokerAccessControl); - authenticationInfo = new AuthenticationInfo(map, BrokerAccessControl, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); + authenticationInfo = new AuthenticationInfo(map, brokerAccessControl, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); System.setProperty("rocketmq.home.dir", "src/test/resources"); plainAclPlugEngine = new PlainAclPlugEngine(); @@ -280,7 +294,7 @@ public class PlainAclPlugEngineTest { Assert.assertFalse(isReturn); Set permitSendTopic = new HashSet<>(); - BrokerAccessControl.setPermitSendTopic(permitSendTopic); + brokerAccessControl.setPermitSendTopic(permitSendTopic); isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); @@ -288,11 +302,111 @@ public class PlainAclPlugEngineTest { isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertFalse(isReturn); - BrokerAccessControl.setPermitPullTopic(permitSendTopic); + brokerAccessControl.setPermitPullTopic(permitSendTopic); isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); Assert.assertTrue(isReturn); } + @Test + public void adminBrokerAccessControlTest() { + BrokerAccessControl admin = new BrokerAccessControl(); + admin.setAccount("adminTest"); + admin.setPassword("adminTest"); + admin.setNetaddress("127.0.0.1"); + plainAclPlugEngine.setAccessControl(admin); + Assert.assertFalse(admin.isUpdateAndCreateTopic()); + + admin.setAdmin(true); + plainAclPlugEngine.setAccessControl(admin); + Assert.assertTrue(admin.isUpdateAndCreateTopic()); + } + + @Test + public void adminEachCheckAuthentication() { + BrokerAccessControl accessControl = new BrokerAccessControl(); + accessControl.setAccount("RocketMQ1"); + accessControl.setPassword("1234567"); + accessControl.setNetaddress("127.0.0.1"); + plainAclPlugEngine.setAccessControl(accessControl); + for (Integer code : adminCode) { + accessControl.setCode(code); + AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + Assert.assertFalse(authenticationResult.isSucceed()); + + } + plainAclPlugEngine.cleanAuthenticationInfo(); + accessControl.setAdmin(true); + plainAclPlugEngine.setAccessControl(accessControl); + for (Integer code : adminCode) { + accessControl.setCode(code); + AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + Assert.assertTrue(authenticationResult.isSucceed()); + } + } + + @Test + public void cleanAuthenticationInfoTest() { + plainAclPlugEngine.setAccessControl(accessControl); + accessControl.setCode(202); + AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + Assert.assertTrue(authenticationResult.isSucceed()); + plainAclPlugEngine.cleanAuthenticationInfo(); + authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + Assert.assertFalse(authenticationResult.isSucceed()); + } + + @Test + public void isWatchStartTest() { + PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); + Assert.assertTrue(plainAclPlugEngine.isWatchStart()); + System.setProperty("java.version", "1.6.11"); + plainAclPlugEngine = new PlainAclPlugEngine(); + Assert.assertFalse(plainAclPlugEngine.isWatchStart()); + } + + @Test + public void watchTest() throws IOException { + System.setProperty("rocketmq.home.dir", "src/test/resources/watch"); + File file = new File("src/test/resources/watch/conf"); + file.mkdirs(); + File transport = new File("src/test/resources/watch/conf/transport.yml"); + transport.createNewFile(); + + FileWriter writer = new FileWriter(transport); + writer.write("list:\r\n"); + writer.write("- account: rokcetmq\r\n"); + writer.write(" password: aliyun11\r\n"); + writer.write(" netaddress: 127.0.0.1\r\n"); + writer.flush(); + writer.close(); + PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); + accessControl.setCode(203); + AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + Assert.assertTrue(authenticationResult.isSucceed()); + + writer = new FileWriter(new File("src/test/resources/watch/conf/transport.yml"), true); + writer.write("- account: rokcet1\r\n"); + writer.write(" password: aliyun1\r\n"); + writer.write(" netaddress: 127.0.0.1\r\n"); + writer.flush(); + writer.close(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + accessControlTwo.setCode(203); + authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControlTwo); + Assert.assertTrue(authenticationResult.isSucceed()); + + transport.delete(); + file.delete(); + file = new File("src/test/resources/watch"); + file.delete(); + + } + @Test public void analysisTest() { BrokerAccessControl accessControl = new BrokerAccessControl(); @@ -304,6 +418,9 @@ public class PlainAclPlugEngineTest { while (it.hasNext()) { Entry e = it.next(); if (!e.getValue()) { + if (adminCode.contains(e.getKey())) { + continue; + } Assert.assertEquals(e.getKey(), Integer.valueOf(10)); num++; } diff --git a/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator b/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator deleted file mode 100644 index 422b1e7bcb..0000000000 --- a/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator +++ /dev/null @@ -1 +0,0 @@ -org.apache.rocketmq.acl.PlainAccessValidator \ No newline at end of file From 47556d6a3694bad3e2eaac9ea61f9086ad62ce9b Mon Sep 17 00:00:00 2001 From: huzongtang Date: Wed, 28 Nov 2018 10:50:55 +0800 Subject: [PATCH 49/96] I have already fix my code as suggestion.Please help to review them.[ISSUE #525]. --- .../broker/topic/TopicConfigManager.java | 5 +- .../consumer/DefaultMQPushConsumer.java | 34 +- .../client/impl/factory/MQClientInstance.java | 2 +- .../client/producer/DefaultMQProducer.java | 27 +- .../producer/TransactionMQProducer.java | 4 +- .../trace/core/Utils/TrackTraceUtils.java | 105 ------ .../trace/core/common/TrackTraceBean.java | 4 +- .../trace/core/common/TrackTraceType.java | 3 - .../consumer/DefaultMQPushConsumerTest.java | 4 +- .../DefaultMQPushConsumerImplTest.java | 2 +- .../impl/consumer/RebalancePushImplTest.java | 2 +- .../producer/DefaultMQProducerTest.java | 4 +- .../trace/DefaultMQConsumerWithTraceTest.java | 313 ++++++++++++++++++ .../trace/DefaultMQProducerWithTraceTest.java | 24 +- .../example/batch/SimpleBatchProducer.java | 2 +- .../example/batch/SplitBatchProducer.java | 2 +- .../rocketmq/example/benchmark/Consumer.java | 2 +- .../rocketmq/example/benchmark/Producer.java | 2 +- .../example/broadcast/PushConsumer.java | 2 +- .../rocketmq/example/filter/Consumer.java | 2 +- .../rocketmq/example/filter/Producer.java | 2 +- .../rocketmq/example/filter/SqlConsumer.java | 2 +- .../rocketmq/example/filter/SqlProducer.java | 2 +- .../rocketmq/example/operation/Consumer.java | 2 +- .../rocketmq/example/operation/Producer.java | 2 +- .../example/ordermessage/Consumer.java | 2 +- .../example/ordermessage/Producer.java | 2 +- .../rocketmq/example/quickstart/Consumer.java | 2 +- .../rocketmq/example/quickstart/Producer.java | 2 +- .../example/simple/AsyncProducer.java | 2 +- .../rocketmq/example/simple/Producer.java | 2 +- .../rocketmq/example/simple/PushConsumer.java | 2 +- .../rocketmq/example/simple/TestProducer.java | 2 +- .../example/tracemessage/TraceProducer.java | 49 +++ .../tracemessage/TracePushConsumer.java | 47 +++ .../command/broker/SendMsgStatusCommand.java | 2 +- 36 files changed, 502 insertions(+), 167 deletions(-) delete mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/core/Utils/TrackTraceUtils.java create mode 100644 client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java create mode 100644 example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java create mode 100644 example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java index 4ce996b2cf..163897b1cc 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java @@ -125,7 +125,6 @@ public class TopicConfigManager extends ConfigManager { this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); } { - // MixAll.RMQ_SYS_TRACK_TRACE_TOPIC if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { String topic = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC; TopicConfig topicConfig = new TopicConfig(topic); @@ -165,6 +164,10 @@ public class TopicConfigManager extends ConfigManager { if (topicConfig != null) return topicConfig; + if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { + return topicConfig; + } + TopicConfig defaultTopicConfig = this.topicConfigTable.get(defaultTopic); if (defaultTopicConfig != null) { if (defaultTopic.equals(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC)) { diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index 5ee2e33ffb..0b5ce05217 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -265,7 +265,7 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * Default constructor. */ public DefaultMQPushConsumer() { - this(MixAll.DEFAULT_CONSUMER_GROUP, null, new AllocateMessageQueueAveragely(), false); + this(MixAll.DEFAULT_CONSUMER_GROUP, null, new AllocateMessageQueueAveragely()); } /** @@ -275,12 +275,26 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * @param rpcHook RPC hook to execute before each remoting command. * @param allocateMessageQueueStrategy message queue allocating algorithm. */ + public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, + AllocateMessageQueueStrategy allocateMessageQueueStrategy) { + this.consumerGroup = consumerGroup; + this.allocateMessageQueueStrategy = allocateMessageQueueStrategy; + defaultMQPushConsumerImpl = new DefaultMQPushConsumerImpl(this, rpcHook); + } + + /** + * Constructor specifying consumer group, RPC hook and message queue allocating algorithm. + * + * @param consumerGroup Consume queue. + * @param rpcHook RPC hook to execute before each remoting command. + * @param allocateMessageQueueStrategy message queue allocating algorithm. + * @param msgTraceSwitch switch flag instance for message track trace. + */ public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, AllocateMessageQueueStrategy allocateMessageQueueStrategy, boolean msgTraceSwitch) { this.consumerGroup = consumerGroup; this.allocateMessageQueueStrategy = allocateMessageQueueStrategy; defaultMQPushConsumerImpl = new DefaultMQPushConsumerImpl(this, rpcHook); - //if client open the message track trace feature if (msgTraceSwitch) { try { Properties tempProperties = new Properties(); @@ -307,7 +321,17 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * @param rpcHook RPC hook to execute before each remoting command. */ public DefaultMQPushConsumer(RPCHook rpcHook) { - this(MixAll.DEFAULT_CONSUMER_GROUP, rpcHook, new AllocateMessageQueueAveragely(),false); + this(MixAll.DEFAULT_CONSUMER_GROUP, rpcHook, new AllocateMessageQueueAveragely()); + } + + /** + * Constructor specifying consumer group. + * + * @param consumerGroup Consumer group. + * @param msgTraceSwitch switch flag instance for message track trace. + */ + public DefaultMQPushConsumer(final String consumerGroup, boolean msgTraceSwitch) { + this(consumerGroup, null, new AllocateMessageQueueAveragely(), msgTraceSwitch); } /** @@ -315,8 +339,8 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * * @param consumerGroup Consumer group. */ - public DefaultMQPushConsumer(final String consumerGroup, boolean msgTraceSwitch) { - this(consumerGroup, null, new AllocateMessageQueueAveragely(),msgTraceSwitch); + public DefaultMQPushConsumer(final String consumerGroup) { + this(consumerGroup, null, new AllocateMessageQueueAveragely()); } @Override diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java index c35d9468de..9ffaed0a4f 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java @@ -144,7 +144,7 @@ public class MQClientInstance { this.rebalanceService = new RebalanceService(this); - this.defaultMQProducer = new DefaultMQProducer(MixAll.CLIENT_INNER_PRODUCER_GROUP,false); + this.defaultMQProducer = new DefaultMQProducer(MixAll.CLIENT_INNER_PRODUCER_GROUP); this.defaultMQProducer.resetClientConfig(clientConfig); this.consumerStatsManager = new ConsumerStatsManager(this.scheduledExecutorService); diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index a2bacfb907..a654d7631f 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -146,7 +146,18 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * * @param producerGroup Producer group, see the name-sake field. * @param rpcHook RPC hook to execute per each remoting command execution. - * @param msgTraceSwitch switch flag instance for message track trace + */ + public DefaultMQProducer(final String producerGroup, RPCHook rpcHook) { + this.producerGroup = producerGroup; + defaultMQProducerImpl = new DefaultMQProducerImpl(this, rpcHook); + } + + /** + * Constructor specifying both producer group and RPC hook. + * + * @param producerGroup Producer group, see the name-sake field. + * @param rpcHook RPC hook to execute per each remoting command execution. + * @param msgTraceSwitch switch flag instance for message track trace. */ public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean msgTraceSwitch) { this.producerGroup = producerGroup; @@ -177,8 +188,18 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * * @param producerGroup Producer group, see the name-sake field. */ + public DefaultMQProducer(final String producerGroup) { + this(producerGroup, null); + } + + /** + * Constructor specifying producer group. + * + * @param producerGroup Producer group, see the name-sake field. + * @param msgTraceSwitch switch flag instance for message track trace. + */ public DefaultMQProducer(final String producerGroup, boolean msgTraceSwitch) { - this(producerGroup, null,msgTraceSwitch); + this(producerGroup, null, msgTraceSwitch); } /** @@ -187,7 +208,7 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * @param rpcHook RPC hook to execute per each remoting command execution. */ public DefaultMQProducer(RPCHook rpcHook) { - this(MixAll.DEFAULT_PRODUCER_GROUP, rpcHook,false); + this(MixAll.DEFAULT_PRODUCER_GROUP, rpcHook); } /** diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/TransactionMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/TransactionMQProducer.java index f6030c9d26..8f6428b29c 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/TransactionMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/TransactionMQProducer.java @@ -35,11 +35,11 @@ public class TransactionMQProducer extends DefaultMQProducer { } public TransactionMQProducer(final String producerGroup) { - super(producerGroup,false); + super(producerGroup); } public TransactionMQProducer(final String producerGroup, RPCHook rpcHook) { - super(producerGroup, rpcHook,false); + super(producerGroup, rpcHook); } @Override diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/Utils/TrackTraceUtils.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/Utils/TrackTraceUtils.java deleted file mode 100644 index 7d1d75b0dd..0000000000 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/Utils/TrackTraceUtils.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.client.trace.core.Utils; - -import org.apache.rocketmq.remoting.protocol.RemotingSerializable; - -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Enumeration; - -/** - * Track Trace Util - */ -public class TrackTraceUtils { - - public static String getLocalAddress() { - try { - //Traverse the network bind card to find a valid IP address and return it. - Enumeration enumeration = NetworkInterface.getNetworkInterfaces(); - ArrayList ipv4Result = new ArrayList(); - ArrayList ipv6Result = new ArrayList(); - while (enumeration.hasMoreElements()) { - final NetworkInterface networkInterface = enumeration.nextElement(); - final Enumeration en = networkInterface.getInetAddresses(); - while (en.hasMoreElements()) { - final InetAddress address = en.nextElement(); - if (!address.isLoopbackAddress()) { - if (address instanceof Inet6Address) { - ipv6Result.add(normalizeHostAddress(address)); - } else { - ipv4Result.add(normalizeHostAddress(address)); - } - } - } - } - - // get priority to IPv4 - if (!ipv4Result.isEmpty()) { - for (String ip : ipv4Result) { - if (ip.startsWith("127.0") || ip.startsWith("192.168")) { - continue; - } - - return ip; - } - - //get the last one - return ipv4Result.get(ipv4Result.size() - 1); - } - //then use the ipv6 address - else if (!ipv6Result.isEmpty()) { - return ipv6Result.get(0); - } - //the use local ip address - final InetAddress localHost = InetAddress.getLocalHost(); - return normalizeHostAddress(localHost); - } catch (SocketException e) { - e.printStackTrace(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } finally { - - } - - return null; - } - - public static String normalizeHostAddress(final InetAddress localHost) { - if (localHost instanceof Inet6Address) { - return "[" + localHost.getHostAddress() + "]"; - } else { - return localHost.getHostAddress(); - } - } - - public static String toJson(final Object obj, boolean prettyFormat) { - return RemotingSerializable.toJson(obj, prettyFormat); - } - - public static T fromJson(String json, Class classOfT) { - return RemotingSerializable.fromJson(json, classOfT); - } - - public static String replaceNull(String ori) { - return ori == null ? "" : ori; - } -} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java index 4981759eba..220a128115 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java @@ -16,11 +16,11 @@ */ package org.apache.rocketmq.client.trace.core.common; -import org.apache.rocketmq.client.trace.core.Utils.TrackTraceUtils; +import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.message.MessageType; public class TrackTraceBean { - private static final String LOCAL_ADDRESS = TrackTraceUtils.getLocalAddress(); + private static final String LOCAL_ADDRESS = UtilAll.ipToIPv4Str(UtilAll.getIP()); private String topic = ""; private String msgId = ""; private String offsetMsgId = ""; diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java index 31a89ef655..72fa630554 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java @@ -16,9 +16,6 @@ */ package org.apache.rocketmq.client.trace.core.common; -/** - * Created by zongtanghu on 2018/11/6. - */ public enum TrackTraceType { Pub, SubBefore, diff --git a/client/src/test/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumerTest.java b/client/src/test/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumerTest.java index 019b44da4f..ff2fb78bbf 100644 --- a/client/src/test/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumerTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumerTest.java @@ -89,7 +89,7 @@ public class DefaultMQPushConsumerTest { @Before public void init() throws Exception { consumerGroup = "FooBarGroup" + System.currentTimeMillis(); - pushConsumer = new DefaultMQPushConsumer(consumerGroup,false); + pushConsumer = new DefaultMQPushConsumer(consumerGroup); pushConsumer.setNamesrvAddr("127.0.0.1:9876"); pushConsumer.setPullInterval(60 * 1000); @@ -252,7 +252,7 @@ public class DefaultMQPushConsumerTest { } private DefaultMQPushConsumer createPushConsumer() { - DefaultMQPushConsumer pushConsumer = new DefaultMQPushConsumer(consumerGroup,false); + DefaultMQPushConsumer pushConsumer = new DefaultMQPushConsumer(consumerGroup); pushConsumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, diff --git a/client/src/test/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImplTest.java b/client/src/test/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImplTest.java index e6f26f20e8..d4f581231f 100644 --- a/client/src/test/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImplTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImplTest.java @@ -42,7 +42,7 @@ public class DefaultMQPushConsumerImplTest { //test message thrown.expectMessage("consumeThreadMin (10) is larger than consumeThreadMax (9)"); - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_consumer_group",false); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_consumer_group"); consumer.setConsumeThreadMin(10); consumer.setConsumeThreadMax(9); diff --git a/client/src/test/java/org/apache/rocketmq/client/impl/consumer/RebalancePushImplTest.java b/client/src/test/java/org/apache/rocketmq/client/impl/consumer/RebalancePushImplTest.java index f6ca3aca9f..796a394308 100644 --- a/client/src/test/java/org/apache/rocketmq/client/impl/consumer/RebalancePushImplTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/impl/consumer/RebalancePushImplTest.java @@ -44,7 +44,7 @@ import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class RebalancePushImplTest { @Spy - private DefaultMQPushConsumerImpl defaultMQPushConsumer = new DefaultMQPushConsumerImpl(new DefaultMQPushConsumer("RebalancePushImplTest",false), null); + private DefaultMQPushConsumerImpl defaultMQPushConsumer = new DefaultMQPushConsumerImpl(new DefaultMQPushConsumer("RebalancePushImplTest"), null); @Mock private MQClientInstance mqClientInstance; @Mock diff --git a/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java b/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java index 391743614f..c225afd684 100644 --- a/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java @@ -82,7 +82,7 @@ public class DefaultMQProducerTest { @Before public void init() throws Exception { String producerGroupTemp = producerGroupPrefix + System.currentTimeMillis(); - producer = new DefaultMQProducer(producerGroupTemp,false); + producer = new DefaultMQProducer(producerGroupTemp); producer.setNamesrvAddr("127.0.0.1:9876"); producer.setCompressMsgBodyOverHowmuch(16); message = new Message(topic, new byte[] {'a'}); @@ -309,7 +309,7 @@ public class DefaultMQProducerTest { @Test public void testSetCallbackExecutor() throws MQClientException { String producerGroupTemp = "testSetCallbackExecutor_" + System.currentTimeMillis(); - producer = new DefaultMQProducer(producerGroupTemp,false); + producer = new DefaultMQProducer(producerGroupTemp); producer.setNamesrvAddr("127.0.0.1:9876"); producer.start(); diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java new file mode 100644 index 0000000000..27c10dad5a --- /dev/null +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java @@ -0,0 +1,313 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.client.trace; + +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.PullCallback; +import org.apache.rocketmq.client.consumer.PullResult; +import org.apache.rocketmq.client.consumer.PullStatus; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.client.exception.MQBrokerException; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.impl.CommunicationMode; +import org.apache.rocketmq.client.impl.FindBrokerResult; +import org.apache.rocketmq.client.impl.MQClientAPIImpl; +import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService; +import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; +import org.apache.rocketmq.client.impl.consumer.ProcessQueue; +import org.apache.rocketmq.client.impl.consumer.PullAPIWrapper; +import org.apache.rocketmq.client.impl.consumer.PullMessageService; +import org.apache.rocketmq.client.impl.consumer.PullRequest; +import org.apache.rocketmq.client.impl.consumer.PullResultExt; +import org.apache.rocketmq.client.impl.consumer.RebalancePushImpl; +import org.apache.rocketmq.client.impl.factory.MQClientInstance; +import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; +import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.common.message.MessageClientExt; +import org.apache.rocketmq.common.message.MessageDecoder; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.common.message.MessageQueue; +import org.apache.rocketmq.common.protocol.header.PullMessageRequestHeader; + +import org.apache.rocketmq.common.protocol.route.BrokerData; +import org.apache.rocketmq.common.protocol.route.QueueData; +import org.apache.rocketmq.common.protocol.route.TopicRouteData; +import org.apache.rocketmq.remoting.exception.RemotingException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.stubbing.Answer; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class DefaultMQConsumerWithTraceTest { + private String consumerGroup; + private String consumerGroupNormal; + private String producerGroupTraceTemp = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC + System.currentTimeMillis(); + + private String topic = "FooBar"; + private String brokerName = "BrokerA"; + private MQClientInstance mQClientFactory; + + @Mock + private MQClientAPIImpl mQClientAPIImpl; + private PullAPIWrapper pullAPIWrapper; + private RebalancePushImpl rebalancePushImpl; + private DefaultMQPushConsumer pushConsumer; + private DefaultMQPushConsumer normalPushConsumer; + + private AsyncArrayDispatcher asyncArrayDispatcher; + private MQClientInstance mQClientTraceFactory; + @Mock + private MQClientAPIImpl mQClientTraceAPIImpl; + private DefaultMQProducer traceProducer; + + + @Before + public void init() throws Exception { + consumerGroup = "FooBarGroup" + System.currentTimeMillis(); + pushConsumer = new DefaultMQPushConsumer(consumerGroup,true); + consumerGroupNormal = "FooBarGroup" + System.currentTimeMillis(); + normalPushConsumer = new DefaultMQPushConsumer(consumerGroupNormal,false); + + pushConsumer.setNamesrvAddr("127.0.0.1:9876"); + pushConsumer.setPullInterval(60 * 1000); + + asyncArrayDispatcher = (AsyncArrayDispatcher)pushConsumer.getTraceDispatcher(); + traceProducer = asyncArrayDispatcher.getTraceProducer(); + + + pushConsumer.registerMessageListener(new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, + ConsumeConcurrentlyContext context) { + return null; + } + }); + + DefaultMQPushConsumerImpl pushConsumerImpl = pushConsumer.getDefaultMQPushConsumerImpl(); + rebalancePushImpl = spy(new RebalancePushImpl(pushConsumer.getDefaultMQPushConsumerImpl())); + Field field = DefaultMQPushConsumerImpl.class.getDeclaredField("rebalanceImpl"); + field.setAccessible(true); + field.set(pushConsumerImpl, rebalancePushImpl); + pushConsumer.subscribe(topic, "*"); + pushConsumer.start(); + + mQClientFactory = spy(pushConsumerImpl.getmQClientFactory()); + mQClientTraceFactory = spy(pushConsumerImpl.getmQClientFactory()); + + field = DefaultMQPushConsumerImpl.class.getDeclaredField("mQClientFactory"); + field.setAccessible(true); + field.set(pushConsumerImpl, mQClientFactory); + + field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); + field.setAccessible(true); + field.set(mQClientFactory, mQClientAPIImpl); + + Field fieldTrace = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); + fieldTrace.setAccessible(true); + fieldTrace.set(traceProducer.getDefaultMQProducerImpl(), mQClientTraceFactory); + + fieldTrace = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); + fieldTrace.setAccessible(true); + fieldTrace.set(mQClientTraceFactory, mQClientTraceAPIImpl); + + pullAPIWrapper = spy(new PullAPIWrapper(mQClientFactory, consumerGroup, false)); + field = DefaultMQPushConsumerImpl.class.getDeclaredField("pullAPIWrapper"); + field.setAccessible(true); + field.set(pushConsumerImpl, pullAPIWrapper); + + pushConsumer.getDefaultMQPushConsumerImpl().getRebalanceImpl().setmQClientFactory(mQClientFactory); + mQClientFactory.registerConsumer(consumerGroup, pushConsumerImpl); + + when(mQClientFactory.getMQClientAPIImpl().pullMessage(anyString(), any(PullMessageRequestHeader.class), + anyLong(), any(CommunicationMode.class), nullable(PullCallback.class))) + .thenAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock mock) throws Throwable { + PullMessageRequestHeader requestHeader = mock.getArgument(1); + MessageClientExt messageClientExt = new MessageClientExt(); + messageClientExt.setTopic(topic); + messageClientExt.setQueueId(0); + messageClientExt.setMsgId("123"); + messageClientExt.setBody(new byte[] {'a'}); + messageClientExt.setOffsetMsgId("234"); + messageClientExt.setBornHost(new InetSocketAddress(8080)); + messageClientExt.setStoreHost(new InetSocketAddress(8080)); + PullResult pullResult = createPullResult(requestHeader, PullStatus.FOUND, Collections.singletonList(messageClientExt)); + ((PullCallback) mock.getArgument(4)).onSuccess(pullResult); + return pullResult; + } + }); + + doReturn(new FindBrokerResult("127.0.0.1:10911", false)).when(mQClientFactory).findBrokerAddressInSubscribe(anyString(), anyLong(), anyBoolean()); + Set messageQueueSet = new HashSet(); + messageQueueSet.add(createPullRequest().getMessageQueue()); + pushConsumer.getDefaultMQPushConsumerImpl().updateTopicSubscribeInfo(topic, messageQueueSet); + } + + @After + public void terminate() { + pushConsumer.shutdown(); + } + + @Test + public void testPullMessage_WithTrace_Success() throws InterruptedException, RemotingException, MQBrokerException, MQClientException { + traceProducer.getDefaultMQProducerImpl().getmQClientFactory().registerProducer(producerGroupTraceTemp, traceProducer.getDefaultMQProducerImpl()); + //when(mQClientAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); + //when(mQClientTraceAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTraceTopicRoute()); + + + final CountDownLatch countDownLatch = new CountDownLatch(1); + final MessageExt[] messageExts = new MessageExt[1]; + pushConsumer.getDefaultMQPushConsumerImpl().setConsumeMessageService(new ConsumeMessageConcurrentlyService(pushConsumer.getDefaultMQPushConsumerImpl(), new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, + ConsumeConcurrentlyContext context) { + messageExts[0] = msgs.get(0); + countDownLatch.countDown(); + return null; + } + })); + + PullMessageService pullMessageService = mQClientFactory.getPullMessageService(); + pullMessageService.executePullRequestImmediately(createPullRequest()); + countDownLatch.await(3000L, TimeUnit.MILLISECONDS); + assertThat(messageExts[0].getTopic()).isEqualTo(topic); + assertThat(messageExts[0].getBody()).isEqualTo(new byte[] {'a'}); + } + + private PullRequest createPullRequest() { + PullRequest pullRequest = new PullRequest(); + pullRequest.setConsumerGroup(consumerGroup); + pullRequest.setNextOffset(1024); + + MessageQueue messageQueue = new MessageQueue(); + messageQueue.setBrokerName(brokerName); + messageQueue.setQueueId(0); + messageQueue.setTopic(topic); + pullRequest.setMessageQueue(messageQueue); + ProcessQueue processQueue = new ProcessQueue(); + processQueue.setLocked(true); + processQueue.setLastLockTimestamp(System.currentTimeMillis()); + pullRequest.setProcessQueue(processQueue); + + return pullRequest; + } + + private PullResultExt createPullResult(PullMessageRequestHeader requestHeader, PullStatus pullStatus, + List messageExtList) throws Exception { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + for (MessageExt messageExt : messageExtList) { + outputStream.write(MessageDecoder.encode(messageExt, false)); + } + return new PullResultExt(pullStatus, requestHeader.getQueueOffset() + messageExtList.size(), 123, 2048, messageExtList, 0, outputStream.toByteArray()); + } + + public static TopicRouteData createTopicRoute() { + TopicRouteData topicRouteData = new TopicRouteData(); + + topicRouteData.setFilterServerTable(new HashMap>()); + List brokerDataList = new ArrayList(); + BrokerData brokerData = new BrokerData(); + brokerData.setBrokerName("BrokerA"); + brokerData.setCluster("DefaultCluster"); + HashMap brokerAddrs = new HashMap(); + brokerAddrs.put(0L, "127.0.0.1:10911"); + brokerData.setBrokerAddrs(brokerAddrs); + brokerDataList.add(brokerData); + topicRouteData.setBrokerDatas(brokerDataList); + + List queueDataList = new ArrayList(); + QueueData queueData = new QueueData(); + queueData.setBrokerName("BrokerA"); + queueData.setPerm(6); + queueData.setReadQueueNums(3); + queueData.setWriteQueueNums(4); + queueData.setTopicSynFlag(0); + queueDataList.add(queueData); + topicRouteData.setQueueDatas(queueDataList); + return topicRouteData; + } + + private SendResult createSendResult(SendStatus sendStatus) { + SendResult sendResult = new SendResult(); + sendResult.setMsgId("123"); + sendResult.setOffsetMsgId("123"); + sendResult.setQueueOffset(456); + sendResult.setSendStatus(sendStatus); + sendResult.setRegionId("HZ"); + return sendResult; + } + + public static TopicRouteData createTraceTopicRoute() { + TopicRouteData topicRouteData = new TopicRouteData(); + + topicRouteData.setFilterServerTable(new HashMap>()); + List brokerDataList = new ArrayList(); + BrokerData brokerData = new BrokerData(); + brokerData.setBrokerName("broker-trace"); + brokerData.setCluster("DefaultCluster"); + HashMap brokerAddrs = new HashMap(); + brokerAddrs.put(0L, "127.0.0.1:10912"); + brokerData.setBrokerAddrs(brokerAddrs); + brokerDataList.add(brokerData); + topicRouteData.setBrokerDatas(brokerDataList); + + List queueDataList = new ArrayList(); + QueueData queueData = new QueueData(); + queueData.setBrokerName("broker-trace"); + queueData.setPerm(6); + queueData.setReadQueueNums(1); + queueData.setWriteQueueNums(1); + queueData.setTopicSynFlag(1); + queueDataList.add(queueData); + topicRouteData.setQueueDatas(queueDataList); + return topicRouteData; + } +} diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java index 7d8fb0a6ae..c3757a8afa 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java @@ -22,10 +22,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import net.bytebuddy.asm.Advice; import org.apache.rocketmq.client.ClientConfig; import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; @@ -48,7 +45,6 @@ import org.apache.rocketmq.common.protocol.route.BrokerData; import org.apache.rocketmq.common.protocol.route.QueueData; import org.apache.rocketmq.common.protocol.route.TopicRouteData; import org.apache.rocketmq.remoting.exception.RemotingException; -import org.apache.rocketmq.remoting.netty.NettyRemotingClient; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -57,11 +53,9 @@ import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; -import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyObject; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.when; @@ -83,6 +77,7 @@ public class DefaultMQProducerWithTraceTest { private DefaultMQProducer producer; private DefaultMQProducer traceProducer; + private DefaultMQProducer normalProducer; private Message message; private String topic = "FooBar"; @@ -93,21 +88,23 @@ public class DefaultMQProducerWithTraceTest { @Before public void init() throws Exception { + normalProducer = new DefaultMQProducer(producerGroupTemp,false); producer = new DefaultMQProducer(producerGroupTemp,true); producer.setNamesrvAddr("127.0.0.1:9876"); + normalProducer.setNamesrvAddr("127.0.0.1:9877"); message = new Message(topic, new byte[] {'a', 'b' ,'c'}); asyncArrayDispatcher = (AsyncArrayDispatcher)producer.getTraceDispatcher(); traceProducer = asyncArrayDispatcher.getTraceProducer(); producer.start(); - + Field field = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); field.setAccessible(true); field.set(producer.getDefaultMQProducerImpl(), mQClientFactory); Field fieldTrace = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); fieldTrace.setAccessible(true); - field.set(traceProducer.getDefaultMQProducerImpl(), mQClientTraceFactory); + fieldTrace.set(traceProducer.getDefaultMQProducerImpl(), mQClientTraceFactory); field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); field.setAccessible(true); @@ -220,15 +217,4 @@ public class DefaultMQProducerWithTraceTest { topicRouteData.setQueueDatas(queueDataList); return topicRouteData; } - - private SendResult createSendTraceResult(SendStatus sendStatus) { - SendResult sendResult = new SendResult(); - sendResult.setMsgId("456"); - sendResult.setOffsetMsgId("456"); - sendResult.setQueueOffset(789); - sendResult.setSendStatus(sendStatus); - sendResult.setRegionId("HZ"); - return sendResult; - } - } diff --git a/example/src/main/java/org/apache/rocketmq/example/batch/SimpleBatchProducer.java b/example/src/main/java/org/apache/rocketmq/example/batch/SimpleBatchProducer.java index e1372ccd7e..cf566aa15b 100644 --- a/example/src/main/java/org/apache/rocketmq/example/batch/SimpleBatchProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/batch/SimpleBatchProducer.java @@ -25,7 +25,7 @@ import org.apache.rocketmq.common.message.Message; public class SimpleBatchProducer { public static void main(String[] args) throws Exception { - DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName",false); + DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName"); producer.start(); //If you just send messages of no more than 1MiB at a time, it is easy to use batch diff --git a/example/src/main/java/org/apache/rocketmq/example/batch/SplitBatchProducer.java b/example/src/main/java/org/apache/rocketmq/example/batch/SplitBatchProducer.java index eae0800812..f9495c4171 100644 --- a/example/src/main/java/org/apache/rocketmq/example/batch/SplitBatchProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/batch/SplitBatchProducer.java @@ -28,7 +28,7 @@ public class SplitBatchProducer { public static void main(String[] args) throws Exception { - DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName",false); + DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName"); producer.start(); //large batch diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java index 4b6edf0537..d431d3ecc6 100644 --- a/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java @@ -102,7 +102,7 @@ public class Consumer { } }, 10000, 10000); - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group,false); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group); consumer.setInstanceName(Long.toString(System.currentTimeMillis())); if (filterType == null || expression == null) { diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java index 16ad133f49..ce2b83f977 100644 --- a/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java @@ -100,7 +100,7 @@ public class Producer { } }, 10000, 10000); - final DefaultMQProducer producer = new DefaultMQProducer("benchmark_producer",false); + final DefaultMQProducer producer = new DefaultMQProducer("benchmark_producer"); producer.setInstanceName(Long.toString(System.currentTimeMillis())); if (commandLine.hasOption('n')) { diff --git a/example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java index f1a55c6d61..fb1f9bbde7 100644 --- a/example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java @@ -29,7 +29,7 @@ import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; public class PushConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_1",false); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_1"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); diff --git a/example/src/main/java/org/apache/rocketmq/example/filter/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/filter/Consumer.java index 262f57a9d2..bb491ac40a 100644 --- a/example/src/main/java/org/apache/rocketmq/example/filter/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/filter/Consumer.java @@ -30,7 +30,7 @@ import org.apache.rocketmq.common.message.MessageExt; public class Consumer { public static void main(String[] args) throws InterruptedException, MQClientException, IOException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupNamecc4",false); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupNamecc4"); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); File classFile = new File(classLoader.getResource("MessageFilterImpl.java").getFile()); diff --git a/example/src/main/java/org/apache/rocketmq/example/filter/Producer.java b/example/src/main/java/org/apache/rocketmq/example/filter/Producer.java index 2d575f99fd..2a0da6546c 100644 --- a/example/src/main/java/org/apache/rocketmq/example/filter/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/filter/Producer.java @@ -24,7 +24,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class Producer { public static void main(String[] args) throws MQClientException, InterruptedException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",false); + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); producer.start(); try { diff --git a/example/src/main/java/org/apache/rocketmq/example/filter/SqlConsumer.java b/example/src/main/java/org/apache/rocketmq/example/filter/SqlConsumer.java index 43409c67de..c41c9c14c3 100644 --- a/example/src/main/java/org/apache/rocketmq/example/filter/SqlConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/filter/SqlConsumer.java @@ -30,7 +30,7 @@ import java.util.List; public class SqlConsumer { public static void main(String[] args) { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4",false); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4"); try { consumer.subscribe("TopicTest", MessageSelector.bySql("(TAGS is not null and TAGS in ('TagA', 'TagB'))" + diff --git a/example/src/main/java/org/apache/rocketmq/example/filter/SqlProducer.java b/example/src/main/java/org/apache/rocketmq/example/filter/SqlProducer.java index 4f319f5c3e..3f3a0e6521 100644 --- a/example/src/main/java/org/apache/rocketmq/example/filter/SqlProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/filter/SqlProducer.java @@ -26,7 +26,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class SqlProducer { public static void main(String[] args) { - DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name",false); + DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); try { producer.start(); } catch (MQClientException e) { diff --git a/example/src/main/java/org/apache/rocketmq/example/operation/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/operation/Consumer.java index c536a14c40..6936f1dcea 100644 --- a/example/src/main/java/org/apache/rocketmq/example/operation/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/operation/Consumer.java @@ -41,7 +41,7 @@ public class Consumer { String subscription = commandLine.getOptionValue('s'); final String returnFailedHalf = commandLine.getOptionValue('f'); - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group,false); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group); consumer.setInstanceName(Long.toString(System.currentTimeMillis())); consumer.subscribe(topic, subscription); diff --git a/example/src/main/java/org/apache/rocketmq/example/operation/Producer.java b/example/src/main/java/org/apache/rocketmq/example/operation/Producer.java index 20fed39b9f..1d4336d7fa 100644 --- a/example/src/main/java/org/apache/rocketmq/example/operation/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/operation/Producer.java @@ -39,7 +39,7 @@ public class Producer { String keys = commandLine.getOptionValue('k'); String msgCount = commandLine.getOptionValue('c'); - DefaultMQProducer producer = new DefaultMQProducer(group,false); + DefaultMQProducer producer = new DefaultMQProducer(group); producer.setInstanceName(Long.toString(System.currentTimeMillis())); producer.start(); diff --git a/example/src/main/java/org/apache/rocketmq/example/ordermessage/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/ordermessage/Consumer.java index d7b6cd9591..abb274d612 100644 --- a/example/src/main/java/org/apache/rocketmq/example/ordermessage/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/ordermessage/Consumer.java @@ -29,7 +29,7 @@ import org.apache.rocketmq.common.message.MessageExt; public class Consumer { public static void main(String[] args) throws MQClientException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_3",false); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_3"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); diff --git a/example/src/main/java/org/apache/rocketmq/example/ordermessage/Producer.java b/example/src/main/java/org/apache/rocketmq/example/ordermessage/Producer.java index c1e26910a2..6a6bdc7d71 100644 --- a/example/src/main/java/org/apache/rocketmq/example/ordermessage/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/ordermessage/Producer.java @@ -32,7 +32,7 @@ import org.apache.rocketmq.remoting.exception.RemotingException; public class Producer { public static void main(String[] args) throws UnsupportedEncodingException { try { - MQProducer producer = new DefaultMQProducer("please_rename_unique_group_name",false); + MQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); producer.start(); String[] tags = new String[] {"TagA", "TagB", "TagC", "TagD", "TagE"}; diff --git a/example/src/main/java/org/apache/rocketmq/example/quickstart/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/quickstart/Consumer.java index da70a78ae8..6d3b936507 100644 --- a/example/src/main/java/org/apache/rocketmq/example/quickstart/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/quickstart/Consumer.java @@ -35,7 +35,7 @@ public class Consumer { /* * Instantiate with specified consumer group name. */ - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4",false); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4"); /* * Specify name server addresses. diff --git a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java index 3d2d1c6e9b..53a1d4dd64 100644 --- a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java @@ -31,7 +31,7 @@ public class Producer { /* * Instantiate with a producer group name. */ - DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name",false); + DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); /* * Specify name server addresses. diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/AsyncProducer.java b/example/src/main/java/org/apache/rocketmq/example/simple/AsyncProducer.java index 14ed57ff93..d40739c813 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/AsyncProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/AsyncProducer.java @@ -30,7 +30,7 @@ public class AsyncProducer { public static void main( String[] args) throws MQClientException, InterruptedException, UnsupportedEncodingException { - DefaultMQProducer producer = new DefaultMQProducer("Jodie_Daily_test",false); + DefaultMQProducer producer = new DefaultMQProducer("Jodie_Daily_test"); producer.start(); producer.setRetryTimesWhenSendAsyncFailed(0); diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/Producer.java b/example/src/main/java/org/apache/rocketmq/example/simple/Producer.java index 5601e66775..448f8ee9f4 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/Producer.java @@ -25,7 +25,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class Producer { public static void main(String[] args) throws MQClientException, InterruptedException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",true); + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); producer.start(); for (int i = 0; i < 128; i++) diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/PushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/simple/PushConsumer.java index 16271bb4bc..abbfbdffcd 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/PushConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/PushConsumer.java @@ -28,7 +28,7 @@ import org.apache.rocketmq.common.message.MessageExt; public class PushConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1",true); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1"); consumer.subscribe("TopicTest", "*"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); //wrong time format 2017_0422_221800 diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/TestProducer.java b/example/src/main/java/org/apache/rocketmq/example/simple/TestProducer.java index f16953e34c..576f9cb6fb 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/TestProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/TestProducer.java @@ -26,7 +26,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class TestProducer { public static void main(String[] args) throws MQClientException, InterruptedException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",false); + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); producer.start(); for (int i = 0; i < 1; i++) diff --git a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java new file mode 100644 index 0000000000..fb8e37fd2b --- /dev/null +++ b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.example.tracemessage; + +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.message.Message; +import org.apache.rocketmq.remoting.common.RemotingHelper; + +public class TraceProducer { + public static void main(String[] args) throws MQClientException, InterruptedException { + + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",true); + producer.start(); + + for (int i = 0; i < 128; i++) + try { + { + Message msg = new Message("TopicTest", + "TagA", + "OrderID188", + "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET)); + SendResult sendResult = producer.send(msg); + System.out.printf("%s%n", sendResult); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + producer.shutdown(); + } +} diff --git a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java new file mode 100644 index 0000000000..b9710d4a73 --- /dev/null +++ b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.example.tracemessage; + +import java.util.List; +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.common.consumer.ConsumeFromWhere; +import org.apache.rocketmq.common.message.MessageExt; + +public class TracePushConsumer { + public static void main(String[] args) throws InterruptedException, MQClientException { + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1",true); + consumer.subscribe("TopicTest", "*"); + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); + //wrong time format 2017_0422_221800 + consumer.setConsumeTimestamp("20181109221800"); + consumer.registerMessageListener(new MessageListenerConcurrently() { + + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + consumer.start(); + System.out.printf("Consumer Started.%n"); + } +} diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/broker/SendMsgStatusCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/broker/SendMsgStatusCommand.java index 4296a53ad0..69d3b24ca7 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/broker/SendMsgStatusCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/broker/SendMsgStatusCommand.java @@ -71,7 +71,7 @@ public class SendMsgStatusCommand implements SubCommand { @Override public void execute(CommandLine commandLine, Options options, RPCHook rpcHook) throws SubCommandException { - final DefaultMQProducer producer = new DefaultMQProducer("PID_SMSC", rpcHook,false); + final DefaultMQProducer producer = new DefaultMQProducer("PID_SMSC", rpcHook); producer.setInstanceName("PID_SMSC_" + System.currentTimeMillis()); try { From ef91e94e47fef9ed99a016cdc3a219ad3bfaf2bf Mon Sep 17 00:00:00 2001 From: dongeforever Date: Fri, 30 Nov 2018 10:16:50 +0800 Subject: [PATCH 50/96] To ignore localbin --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 80c6f56986..bd19c1f640 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ devenv *.versionsBackup !NOTICE-BIN !LICENSE-BIN -.DS_Store \ No newline at end of file +.DS_Store +localbin From 5d253f58d6c7710e719da4eeb1eb72037db15706 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Mon, 3 Dec 2018 22:20:16 +0800 Subject: [PATCH 51/96] Add signature and redesign the permission graph --- .gitignore | 4 +- acl/pom.xml | 5 +- .../rocketmq/acl/PlainAccessValidator.java | 74 ------ .../rocketmq/acl/common/AclClientRPCHook.java | 85 +++++++ .../rocketmq/acl/common/AclException.java | 52 ++++ .../apache/rocketmq/acl/common/AclSigner.java | 71 ++++++ .../acl/{plug => common}/AclUtils.java | 40 ++- .../rocketmq/acl/common/Permission.java | 20 ++ .../acl/common/SessionCredentials.java | 150 +++++++++++ .../rocketmq/acl/common/SigningAlgorithm.java | 8 + .../AclPlugRuntimeException.java | 2 +- .../{plug => plain}/AuthenticationInfo.java | 18 +- .../{plug => plain}/AuthenticationResult.java | 12 +- .../{plug => plain}/BrokerAccessControl.java | 4 +- .../{plug => plain}/NetaddressStrategy.java | 4 +- .../NetaddressStrategyFactory.java | 21 +- .../acl/plain/PlainAccessResource.java | 137 +++++++++++ .../acl/plain/PlainAccessValidator.java | 143 +++++++++++ .../{plug => plain}/PlainAclPlugEngine.java | 83 +++---- .../rocketmq/acl/plug/AccessControl.java | 95 ------- .../acl/{plug => plain}/AclUtilsTest.java | 3 +- .../NetaddressStrategyTest.java | 128 +++++----- .../PlainAclPlugEngineTest.java | 232 +++++++++--------- acl/src/test/resources/conf/transport.yml | 46 +++- distribution/conf/transport.yml | 10 +- pom.xml | 5 + 26 files changed, 1015 insertions(+), 437 deletions(-) delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java rename acl/src/main/java/org/apache/rocketmq/acl/{plug => common}/AclUtils.java (70%) create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java rename acl/src/main/java/org/apache/rocketmq/acl/{plug => plain}/AclPlugRuntimeException.java (96%) rename acl/src/main/java/org/apache/rocketmq/acl/{plug => plain}/AuthenticationInfo.java (78%) rename acl/src/main/java/org/apache/rocketmq/acl/{plug => plain}/AuthenticationResult.java (81%) rename acl/src/main/java/org/apache/rocketmq/acl/{plug => plain}/BrokerAccessControl.java (99%) rename acl/src/main/java/org/apache/rocketmq/acl/{plug => plain}/NetaddressStrategy.java (88%) rename acl/src/main/java/org/apache/rocketmq/acl/{plug => plain}/NetaddressStrategyFactory.java (87%) create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java create mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java rename acl/src/main/java/org/apache/rocketmq/acl/{plug => plain}/PlainAclPlugEngine.java (79%) delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plug/AccessControl.java rename acl/src/test/java/org/apache/rocketmq/acl/{plug => plain}/AclUtilsTest.java (97%) rename acl/src/test/java/org/apache/rocketmq/acl/{plug => plain}/NetaddressStrategyTest.java (59%) rename acl/src/test/java/org/apache/rocketmq/acl/{plug => plain}/PlainAclPlugEngineTest.java (64%) diff --git a/.gitignore b/.gitignore index 80c6f56986..8abdfd8fd6 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ devenv *.versionsBackup !NOTICE-BIN !LICENSE-BIN -.DS_Store \ No newline at end of file +.DS_Store +localbin +nohup.out diff --git a/acl/pom.xml b/acl/pom.xml index 3d8d4a7d75..4ea559f84f 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -30,7 +30,6 @@ ${project.groupId} rocketmq-remoting - ${project.groupId} rocketmq-logging @@ -43,6 +42,10 @@ org.yaml snakeyaml + + commons-codec + commons-codec + org.apache.commons commons-lang3 diff --git a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java deleted file mode 100644 index 74e988a75c..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/PlainAccessValidator.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl; - -import java.util.HashMap; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plug.AccessControl; -import org.apache.rocketmq.acl.plug.AclPlugRuntimeException; -import org.apache.rocketmq.acl.plug.AuthenticationResult; -import org.apache.rocketmq.acl.plug.PlainAclPlugEngine; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; - -public class PlainAccessValidator implements AccessValidator { - - private PlainAclPlugEngine aclPlugEngine; - - public PlainAccessValidator() { - aclPlugEngine = new PlainAclPlugEngine(); - } - - @Override - public AccessResource parse(RemotingCommand request, String remoteAddr) { - HashMap extFields = request.getExtFields(); - int code = request.getCode(); - AccessControl accessControl = new AccessControl(); - accessControl.setCode(request.getCode()); - accessControl.setRecognition(remoteAddr); - accessControl.setNetaddress(StringUtils.split(remoteAddr, ":")[0]); - if (extFields != null) { - accessControl.setAccount(extFields.get("account")); - accessControl.setPassword(extFields.get("password")); - if (code == 310 || code == 320) { - accessControl.setTopic(extFields.get("b")); - } else { - accessControl.setTopic(extFields.get("topic")); - - } - } - return accessControl; - } - - @Override - public void validate(AccessResource accessResource) { - AuthenticationResult authenticationResult = null; - try { - authenticationResult = aclPlugEngine.eachCheckAuthentication((AccessControl) accessResource); - if (authenticationResult.isSucceed()) - return; - } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("validate exception AccessResource data %s", accessResource.toString()), e); - } - if (authenticationResult.getException() != null) { - throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); - } - if (authenticationResult.getAccessControl() != null || !authenticationResult.isSucceed()) { - throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); - } - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java new file mode 100644 index 0000000000..9b5a5a5594 --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java @@ -0,0 +1,85 @@ +package org.apache.rocketmq.acl.common; + +import org.apache.rocketmq.remoting.CommandCustomHeader; +import org.apache.rocketmq.remoting.RPCHook; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; +import java.lang.reflect.Field; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; + +import static org.apache.rocketmq.acl.common.SessionCredentials.AccessKey; +import static org.apache.rocketmq.acl.common.SessionCredentials.SecurityToken; +import static org.apache.rocketmq.acl.common.SessionCredentials.Signature; + +public class AclClientRPCHook implements RPCHook { + protected ConcurrentHashMap, Field[]> fieldCache = + new ConcurrentHashMap, Field[]>(); + + + + private final SessionCredentials sessionCredentials; + + public AclClientRPCHook(SessionCredentials sessionCredentials) { + this.sessionCredentials = sessionCredentials; + } + + @Override + public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + byte[] total = AclUtils.combineRequestContent(request, + parseRequestContent(request, sessionCredentials.getAccessKey(), sessionCredentials.getSecurityToken())); + String signature = AclUtils.calSignature(total, sessionCredentials.getSecretKey()); + request.addExtField(Signature, signature); + request.addExtField(AccessKey, sessionCredentials.getAccessKey()); + + if (sessionCredentials.getSecurityToken() != null) { + request.addExtField(SecurityToken, sessionCredentials.getSecurityToken()); + } + } + + + @Override + public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { + + } + + protected SortedMap parseRequestContent(RemotingCommand request, String ak, String securityToken) { + CommandCustomHeader header = request.readCustomHeader(); + // sort property + SortedMap map = new TreeMap(); + map.put(AccessKey, ak); + if (securityToken != null) { + map.put(SecurityToken, securityToken); + } + try { + // add header properties + if (null != header) { + Field[] fields = fieldCache.get(header.getClass()); + if (null == fields) { + fields = header.getClass().getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); + } + Field[] tmp = fieldCache.putIfAbsent(header.getClass(), fields); + if (null != tmp) { + fields = tmp; + } + } + + for (Field field : fields) { + Object value = field.get(header); + if (null != value && !field.isSynthetic()) { + map.put(field.getName(), value.toString()); + } + } + } + return map; + } catch (Exception e) { + throw new RuntimeException("incompatible exception.", e); + } + } + + public SessionCredentials getSessionCredentials() { + return sessionCredentials; + } +} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java new file mode 100644 index 0000000000..cd7aea9f37 --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java @@ -0,0 +1,52 @@ +package org.apache.rocketmq.acl.common; + +public class AclException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private String status; + private int code; + + + public AclException(String status, int code) { + super(); + this.status = status; + this.code = code; + } + + + public AclException(String status, int code, String message) { + super(message); + this.status = status; + this.code = code; + } + + + public AclException(String status, int code, Throwable throwable) { + super(throwable); + this.status = status; + this.code = code; + } + + + public AclException(String status, int code, String message, Throwable throwable) { + super(message, throwable); + this.status = status; + this.code = code; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } +} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java new file mode 100644 index 0000000000..a6c0c87956 --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java @@ -0,0 +1,71 @@ +package org.apache.rocketmq.acl.common; + +import org.apache.rocketmq.common.constant.LoggerName; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; +import java.nio.charset.Charset; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import org.apache.commons.codec.binary.Base64; + + +public class AclSigner { + public static final Charset defaultCharset = Charset.forName("UTF-8"); + public static final SigningAlgorithm defaultAlgorithm = SigningAlgorithm.HmacSHA1; + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_AUTHORIZE_LOGGER_NAME); + private static final int CAL_SIGNATURE_FAILED = 10015; + private static final String CAL_SIGNATURE_FAILED_MSG = "[%s:signature-failed] unable to calculate a request signature. error=%s"; + + public static String calSignature(String data, String key) throws AclException { + return calSignature(data, key, defaultAlgorithm, defaultCharset); + } + + public static String calSignature(String data, String key, SigningAlgorithm algorithm, Charset charset) throws AclException { + return signAndBase64Encode(data, key, algorithm, charset); + } + + private static String signAndBase64Encode(String data, String key, SigningAlgorithm algorithm, Charset charset) + throws AclException { + try { + byte[] signature = sign(data.getBytes(charset), key.getBytes(charset), algorithm); + return new String(Base64.encodeBase64(signature), defaultCharset); + } catch (Exception e) { + String message = String.format(CAL_SIGNATURE_FAILED_MSG, CAL_SIGNATURE_FAILED, e.getMessage()); + log.error(message, e); + throw new AclException("CAL_SIGNATURE_FAILED", CAL_SIGNATURE_FAILED, message, e); + } + } + + private static byte[] sign(byte[] data, byte[] key, SigningAlgorithm algorithm) throws AclException { + try { + Mac mac = Mac.getInstance(algorithm.toString()); + mac.init(new SecretKeySpec(key, algorithm.toString())); + return mac.doFinal(data); + } catch (Exception e) { + String message = String.format(CAL_SIGNATURE_FAILED_MSG, CAL_SIGNATURE_FAILED, e.getMessage()); + log.error(message, e); + throw new AclException("CAL_SIGNATURE_FAILED", CAL_SIGNATURE_FAILED, message, e); + } + } + + public static String calSignature(byte[] data, String key) throws AclException { + return calSignature(data, key, defaultAlgorithm, defaultCharset); + } + + public static String calSignature(byte[] data, String key, SigningAlgorithm algorithm, Charset charset) throws AclException { + return signAndBase64Encode(data, key, algorithm, charset); + } + + private static String signAndBase64Encode(byte[] data, String key, SigningAlgorithm algorithm, Charset charset) + throws AclException { + try { + byte[] signature = sign(data, key.getBytes(charset), algorithm); + return new String(Base64.encodeBase64(signature), defaultCharset); + } catch (Exception e) { + String message = String.format(CAL_SIGNATURE_FAILED_MSG, CAL_SIGNATURE_FAILED, e.getMessage()); + log.error(message, e); + throw new AclException("CAL_SIGNATURE_FAILED", CAL_SIGNATURE_FAILED, message, e); + } + } + +} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java similarity index 70% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java rename to acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java index 9ba5b79a06..0b1b09c2f8 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclUtils.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java @@ -14,16 +14,54 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.common; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.Map; +import java.util.SortedMap; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.plain.AclPlugRuntimeException; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.yaml.snakeyaml.Yaml; +import static org.apache.rocketmq.acl.common.SessionCredentials.CHARSET; + public class AclUtils { + public static byte[] combineRequestContent(RemotingCommand request, SortedMap fieldsMap) { + try { + StringBuilder sb = new StringBuilder(""); + for (Map.Entry entry : fieldsMap.entrySet()) { + if (!SessionCredentials.Signature.equals(entry.getKey())) { + sb.append(entry.getValue()); + } + } + + return AclUtils.combineBytes(sb.toString().getBytes(CHARSET), request.getBody()); + } catch (Exception e) { + throw new RuntimeException("incompatible exception.", e); + } + } + + + public static byte[] combineBytes(byte[] b1, byte[] b2) { + int size = (null != b1 ? b1.length : 0) + (null != b2 ? b2.length : 0); + byte[] total = new byte[size]; + if (null != b1) + System.arraycopy(b1, 0, total, 0, b1.length); + if (null != b2) + System.arraycopy(b2, 0, total, b1.length, b2.length); + return total; + } + + + public static String calSignature(byte[] data, String secretKey) { + String signature = AclSigner.calSignature(data, secretKey); + return signature; + } + public static void verify(String netaddress, int index) { if (!AclUtils.isScope(netaddress, index)) { throw new AclPlugRuntimeException(String.format("netaddress examine scope Exception netaddress is %s", netaddress)); diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java new file mode 100644 index 0000000000..223ad19d1e --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java @@ -0,0 +1,20 @@ +package org.apache.rocketmq.acl.common; + +public class Permission { + + public static final byte DENY = 1; + public static final byte ANY = 1 << 1; + public static final byte PUB = 1 << 2; + public static final byte SUB = 1 << 3; + + public boolean checkPermission(byte neededPerm, byte ownedPerm) { + if ((ownedPerm & DENY) > 0) { + return false; + } + if ((neededPerm & ANY) > 0) { + return ((ownedPerm & PUB) > 0) || ((ownedPerm & SUB) > 0); + } + return (neededPerm & ownedPerm) > 0; + } + +} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java b/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java new file mode 100644 index 0000000000..650e11163b --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java @@ -0,0 +1,150 @@ +package org.apache.rocketmq.acl.common; + +import org.apache.rocketmq.common.MixAll; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Properties; + +public class SessionCredentials { + public static final Charset CHARSET = Charset.forName("UTF-8"); + public static final String AccessKey = "AccessKey"; + public static final String SecretKey = "SecretKey"; + public static final String Signature = "Signature"; + public static final String SecurityToken = "SecurityToken"; + + public static final String KeyFile = System.getProperty("rocketmq.client.keyFile", + System.getProperty("user.home") + File.separator + "onskey"); + + private String accessKey; + private String secretKey; + private String securityToken; + private String signature; + + public SessionCredentials() { + String keyContent = null; + try { + keyContent = MixAll.file2String(KeyFile); + } catch (IOException ignore) { + } + if (keyContent != null) { + Properties prop = MixAll.string2Properties(keyContent); + if (prop != null) { + this.updateContent(prop); + } + } + } + + public SessionCredentials(String accessKey, String secretKey) { + this.accessKey = accessKey; + this.secretKey = secretKey; + } + + public SessionCredentials(String accessKey, String secretKey, String securityToken) { + this(accessKey, secretKey); + this.securityToken = securityToken; + } + + + public void updateContent(Properties prop) { + { + String value = prop.getProperty(AccessKey); + if (value != null) { + this.accessKey = value.trim(); + } + } + { + String value = prop.getProperty(SecretKey); + if (value != null) { + this.secretKey = value.trim(); + } + } + { + String value = prop.getProperty(SecurityToken); + if (value != null) { + this.securityToken = value.trim(); + } + } + } + + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + public String getSecurityToken() { + return securityToken; + } + + public void setSecurityToken(final String securityToken) { + this.securityToken = securityToken; + } + + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((accessKey == null) ? 0 : accessKey.hashCode()); + result = prime * result + ((secretKey == null) ? 0 : secretKey.hashCode()); + result = prime * result + ((signature == null) ? 0 : signature.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + SessionCredentials other = (SessionCredentials) obj; + if (accessKey == null) { + if (other.accessKey != null) + return false; + } else if (!accessKey.equals(other.accessKey)) + return false; + + if (secretKey == null) { + if (other.secretKey != null) + return false; + } else if (!secretKey.equals(other.secretKey)) + return false; + + if (signature == null) { + if (other.signature != null) + return false; + } else if (!signature.equals(other.signature)) + return false; + + return true; + } + + @Override + public String toString() { + return "SessionCredentials [accessKey=" + accessKey + ", secretKey=" + secretKey + ", signature=" + + signature + ", SecurityToken=" + securityToken + "]"; + } +} \ No newline at end of file diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java b/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java new file mode 100644 index 0000000000..7a49c214b0 --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java @@ -0,0 +1,8 @@ +package org.apache.rocketmq.acl.common;//package com.aliyun.openservices.ons.api.impl.rocketmq.spas; + +public enum SigningAlgorithm { + HmacSHA1, + HmacSHA256, + HmacMD5; + +} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugRuntimeException.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java similarity index 96% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugRuntimeException.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java index 8f6af5d334..d13a29f9cb 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AclPlugRuntimeException.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; public class AclPlugRuntimeException extends RuntimeException { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationInfo.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java similarity index 78% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationInfo.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java index 4852dbdb86..009ca30ffc 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationInfo.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; import java.util.Iterator; import java.util.Map; @@ -22,26 +22,26 @@ import java.util.Map.Entry; public class AuthenticationInfo { - private AccessControl accessControl; + private PlainAccessResource plainAccessResource; private NetaddressStrategy netaddressStrategy; private Map authority; - public AuthenticationInfo(Map authority, AccessControl accessControl, + public AuthenticationInfo(Map authority, PlainAccessResource plainAccessResource, NetaddressStrategy netaddressStrategy) { super(); this.authority = authority; - this.accessControl = accessControl; + this.plainAccessResource = plainAccessResource; this.netaddressStrategy = netaddressStrategy; } - public AccessControl getAccessControl() { - return accessControl; + public PlainAccessResource getPlainAccessResource() { + return plainAccessResource; } - public void setAccessControl(AccessControl accessControl) { - this.accessControl = accessControl; + public void setPlainAccessResource(PlainAccessResource plainAccessResource) { + this.plainAccessResource = plainAccessResource; } public NetaddressStrategy getNetaddressStrategy() { @@ -63,7 +63,7 @@ public class AuthenticationInfo { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("AuthenticationInfo [accessControl=").append(accessControl).append(", netaddressStrategy=") + builder.append("AuthenticationInfo [plainAccessResource=").append(plainAccessResource).append(", netaddressStrategy=") .append(netaddressStrategy).append(", authority={"); Iterator> it = authority.entrySet().iterator(); while (it.hasNext()) { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationResult.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java similarity index 81% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationResult.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java index de26837339..18f98447b9 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AuthenticationResult.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; public class AuthenticationResult { - private AccessControl accessControl; + private PlainAccessResource plainAccessResource; private boolean succeed; @@ -26,12 +26,12 @@ public class AuthenticationResult { private String resultString; - public AccessControl getAccessControl() { - return accessControl; + public PlainAccessResource getPlainAccessResource() { + return plainAccessResource; } - public void setAccessControl(AccessControl accessControl) { - this.accessControl = accessControl; + public void setPlainAccessResource(PlainAccessResource plainAccessResource) { + this.plainAccessResource = plainAccessResource; } public boolean isSucceed() { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/BrokerAccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java similarity index 99% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/BrokerAccessControl.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java index beb8539c09..a1d5db0333 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/BrokerAccessControl.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; import java.util.HashSet; import java.util.Set; -public class BrokerAccessControl extends AccessControl { +public class BrokerAccessControl extends PlainAccessResource { private boolean admin; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategy.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategy.java similarity index 88% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategy.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategy.java index fa28871a5a..d639c068eb 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategy.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategy.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; public interface NetaddressStrategy { - public boolean match(AccessControl accessControl); + public boolean match(PlainAccessResource plainAccessResource); } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategyFactory.java similarity index 87% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategyFactory.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategyFactory.java index 4f6dde5cea..3b20ebe46c 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/NetaddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategyFactory.java @@ -14,18 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.common.AclUtils; public class NetaddressStrategyFactory { public static final NullNetaddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullNetaddressStrategy(); - public NetaddressStrategy getNetaddressStrategy(AccessControl accessControl) { - String netaddress = accessControl.getNetaddress(); + public NetaddressStrategy getNetaddressStrategy(PlainAccessResource plainAccessResource) { + String netaddress = plainAccessResource.getRemoteAddr(); if (StringUtils.isBlank(netaddress) || "*".equals(netaddress)) { return NULL_NET_ADDRESS_STRATEGY; } @@ -47,7 +48,7 @@ public class NetaddressStrategyFactory { public static class NullNetaddressStrategy implements NetaddressStrategy { @Override - public boolean match(AccessControl accessControl) { + public boolean match(PlainAccessResource plainAccessResource) { return true; } @@ -65,8 +66,8 @@ public class NetaddressStrategyFactory { } @Override - public boolean match(AccessControl accessControl) { - return multipleSet.contains(accessControl.getNetaddress()); + public boolean match(PlainAccessResource plainAccessResource) { + return multipleSet.contains(plainAccessResource.getRemoteAddr()); } } @@ -81,8 +82,8 @@ public class NetaddressStrategyFactory { } @Override - public boolean match(AccessControl accessControl) { - return netaddress.equals(accessControl.getNetaddress()); + public boolean match(PlainAccessResource plainAccessResource) { + return netaddress.equals(plainAccessResource.getRemoteAddr()); } } @@ -135,8 +136,8 @@ public class NetaddressStrategyFactory { } @Override - public boolean match(AccessControl accessControl) { - String netAddress = accessControl.getNetaddress(); + public boolean match(PlainAccessResource plainAccessResource) { + String netAddress = plainAccessResource.getRemoteAddr(); if (netAddress.startsWith(this.head)) { String value; if (index == 3) { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java new file mode 100644 index 0000000000..eeebfff7a2 --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java @@ -0,0 +1,137 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; + +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.rocketmq.acl.AccessResource; +import org.apache.rocketmq.common.MixAll; + +public class PlainAccessResource implements AccessResource { + //identify the user + private String accessKey; + + private String signature; + //the content to calculate the content + private byte[] content; + + private String secretToken; + + private Map resourcePermMap = new HashMap<>(); + + private String remoteAddr; + + private String recognition; + + private int requestCode; + + + @Deprecated + private String topic; + + public PlainAccessResource() { + } + + public void addResourceAndPerm(String resource, byte perm) { + if (resource == null) { + return; + } + resourcePermMap.put(resource, perm); + } + + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + public String getRemoteAddr() { + return remoteAddr; + } + + public void setRemoteAddr(String remoteAddr) { + this.remoteAddr = remoteAddr; + } + + public String getRecognition() { + return recognition; + } + + public void setRecognition(String recognition) { + this.recognition = recognition; + } + + public int getRequestCode() { + return requestCode; + } + + public void setRequestCode(int requestCode) { + this.requestCode = requestCode; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + public String getSecretToken() { + return secretToken; + } + + public void setSecretToken(String secretToken) { + this.secretToken = secretToken; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + + public static boolean isRetryTopic(String topic) { + return (null != topic && topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)); + } + + public static String getRetryTopic(String group) { + if (group == null) { + return null; + } + return MixAll.getRetryTopic(group); + } + + public byte[] getContent() { + return content; + } + + public void setContent(byte[] content) { + this.content = content; + } +} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java new file mode 100644 index 0000000000..b38bcfe7d4 --- /dev/null +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java @@ -0,0 +1,143 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; + +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; +import org.apache.rocketmq.acl.AccessResource; +import org.apache.rocketmq.acl.AccessValidator; +import org.apache.rocketmq.acl.common.AclUtils; +import org.apache.rocketmq.acl.common.AclException; +import org.apache.rocketmq.acl.common.Permission; +import org.apache.rocketmq.acl.common.SessionCredentials; +import org.apache.rocketmq.common.protocol.RequestCode; +import org.apache.rocketmq.common.protocol.header.GetConsumerListByGroupRequestHeader; +import org.apache.rocketmq.common.protocol.header.UnregisterClientRequestHeader; +import org.apache.rocketmq.common.protocol.header.UpdateConsumerOffsetRequestHeader; +import org.apache.rocketmq.common.protocol.heartbeat.ConsumerData; +import org.apache.rocketmq.common.protocol.heartbeat.HeartbeatData; +import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; + +import static org.apache.rocketmq.acl.plain.PlainAccessResource.getRetryTopic; + +public class PlainAccessValidator implements AccessValidator { + + private PlainAclPlugEngine aclPlugEngine; + + public PlainAccessValidator() { + aclPlugEngine = new PlainAclPlugEngine(); + } + + @Override + public AccessResource parse(RemotingCommand request, String remoteAddr) { + PlainAccessResource accessResource = new PlainAccessResource(); + accessResource.setRemoteAddr(remoteAddr); + accessResource.setRequestCode(request.getCode()); + accessResource.setAccessKey(request.getExtFields().get(SessionCredentials.AccessKey)); + accessResource.setSignature(request.getExtFields().get(SessionCredentials.Signature)); + accessResource.setSecretToken(request.getExtFields().get(SessionCredentials.SecurityToken)); + + try { + // resource 和 permission 转换 + switch (request.getCode()) { + case RequestCode.SEND_MESSAGE: + accessResource.addResourceAndPerm(request.getExtFields().get("topic"), Permission.PUB); + break; + case RequestCode.SEND_MESSAGE_V2: + accessResource.addResourceAndPerm(request.getExtFields().get("b"), Permission.PUB); + break; + case RequestCode.CONSUMER_SEND_MSG_BACK: + accessResource.addResourceAndPerm(request.getExtFields().get("originTopic"), Permission.PUB); + accessResource.addResourceAndPerm(getRetryTopic(request.getExtFields().get("group")), Permission.SUB); + break; + case RequestCode.PULL_MESSAGE: + accessResource.addResourceAndPerm(request.getExtFields().get("topic"), Permission.SUB); + accessResource.addResourceAndPerm(getRetryTopic(request.getExtFields().get("consumerGroup")), Permission.SUB); + break; + case RequestCode.QUERY_MESSAGE: + accessResource.addResourceAndPerm(request.getExtFields().get("topic"), Permission.SUB); + break; + case RequestCode.HEART_BEAT: + HeartbeatData heartbeatData = HeartbeatData.decode(request.getBody(), HeartbeatData.class); + for (ConsumerData data : heartbeatData.getConsumerDataSet()) { + accessResource.addResourceAndPerm(getRetryTopic(data.getGroupName()), Permission.SUB); + for (SubscriptionData subscriptionData: data.getSubscriptionDataSet()) { + accessResource.addResourceAndPerm(subscriptionData.getTopic(), Permission.SUB); + } + } + break; + case RequestCode.UNREGISTER_CLIENT: + final UnregisterClientRequestHeader unregisterClientRequestHeader = + (UnregisterClientRequestHeader) request + .decodeCommandCustomHeader(UnregisterClientRequestHeader.class); + accessResource.addResourceAndPerm(getRetryTopic(unregisterClientRequestHeader.getConsumerGroup()), Permission.SUB); + break; + case RequestCode.GET_CONSUMER_LIST_BY_GROUP: + final GetConsumerListByGroupRequestHeader getConsumerListByGroupRequestHeader = + (GetConsumerListByGroupRequestHeader) request + .decodeCommandCustomHeader(GetConsumerListByGroupRequestHeader.class); + accessResource.addResourceAndPerm(getRetryTopic(getConsumerListByGroupRequestHeader.getConsumerGroup()), Permission.SUB); + break; + case RequestCode.UPDATE_CONSUMER_OFFSET: + final UpdateConsumerOffsetRequestHeader updateConsumerOffsetRequestHeader = + (UpdateConsumerOffsetRequestHeader) request + .decodeCommandCustomHeader(UpdateConsumerOffsetRequestHeader.class); + accessResource.addResourceAndPerm(getRetryTopic(updateConsumerOffsetRequestHeader.getConsumerGroup()), Permission.SUB); + accessResource.addResourceAndPerm(updateConsumerOffsetRequestHeader.getTopic(), Permission.SUB); + break; + default: + break; + + } + } catch (Throwable t) { + throw new AclException(t.getMessage(), -1, t); + } + + + // content + SortedMap map = new TreeMap(); + for (Map.Entry entry : request.getExtFields().entrySet()) { + if (!SessionCredentials.Signature.equals(entry.getKey())) { + map.put(entry.getKey(), entry.getValue()); + } + } + accessResource.setContent(AclUtils.combineRequestContent(request, map)); + + return accessResource; + } + + @Override + public void validate(AccessResource accessResource) { + AuthenticationResult authenticationResult = null; + try { + authenticationResult = aclPlugEngine.eachCheckAuthentication((PlainAccessResource) accessResource); + if (authenticationResult.isSucceed()) + return; + } catch (Exception e) { + throw new AclPlugRuntimeException(String.format("validate exception AccessResource data %s", accessResource.toString()), e); + } + if (authenticationResult.getException() != null) { + throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); + } + if (authenticationResult.getPlainAccessResource() != null || !authenticationResult.isSucceed()) { + throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); + } + } + +} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngine.java similarity index 79% rename from acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngine.java index 50aab379d3..73b76ccbb0 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngine.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngine.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; import java.io.IOException; import java.lang.reflect.Field; @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.common.AclUtils; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.ServiceThread; import org.apache.rocketmq.common.constant.LoggerName; @@ -123,9 +124,9 @@ public class PlainAclPlugEngine { } } - private void handleAccessControl(AccessControl accessControl) { - if (accessControl instanceof BrokerAccessControl) { - BrokerAccessControl brokerAccessControl = (BrokerAccessControl) accessControl; + private void handleAccessControl(PlainAccessResource plainAccessResource) { + if (plainAccessResource instanceof BrokerAccessControl) { + BrokerAccessControl brokerAccessControl = (BrokerAccessControl) plainAccessResource; if (brokerAccessControl.isAdmin()) { brokerAccessControl.setUpdateAndCreateSubscriptiongroup(true); brokerAccessControl.setDeleteSubscriptiongroup(true); @@ -141,55 +142,55 @@ public class PlainAclPlugEngine { authenticationInfo = null; } - public void setAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { - if (accessControl.getAccount() == null || accessControl.getPassword() == null - || accessControl.getAccount().length() <= 6 || accessControl.getPassword().length() <= 6) { + public void setAccessControl(PlainAccessResource plainAccessResource) throws AclPlugRuntimeException { + if (plainAccessResource.getAccessKey() == null || plainAccessResource.getSignature() == null + || plainAccessResource.getAccessKey().length() <= 6 || plainAccessResource.getSignature().length() <= 6) { throw new AclPlugRuntimeException(String.format( "The account password cannot be null and is longer than 6, account is %s password is %s", - accessControl.getAccount(), accessControl.getPassword())); + plainAccessResource.getAccessKey(), plainAccessResource.getSignature())); } try { - handleAccessControl(accessControl); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); + handleAccessControl(plainAccessResource); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + List accessControlAddressList = accessControlMap.get(plainAccessResource.getAccessKey()); if (accessControlAddressList == null) { accessControlAddressList = new ArrayList<>(); - accessControlMap.put(accessControl.getAccount(), accessControlAddressList); + accessControlMap.put(plainAccessResource.getAccessKey(), accessControlAddressList); } AuthenticationInfo authenticationInfo = new AuthenticationInfo( - accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategy); + accessContralAnalysis.analysis(plainAccessResource), plainAccessResource, netaddressStrategy); accessControlAddressList.add(authenticationInfo); log.info("authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { throw new AclPlugRuntimeException( - String.format("Exception info %s %s", e.getMessage(), accessControl.toString()), e); + String.format("Exception info %s %s", e.getMessage(), plainAccessResource.toString()), e); } } - public void setAccessControlList(List accessControlList) throws AclPlugRuntimeException { - for (AccessControl accessControl : accessControlList) { - setAccessControl(accessControl); + public void setAccessControlList(List plainAccessResourceList) throws AclPlugRuntimeException { + for (PlainAccessResource plainAccessResource : plainAccessResourceList) { + setAccessControl(plainAccessResource); } } - public void setNetaddressAccessControl(AccessControl accessControl) throws AclPlugRuntimeException { + public void setNetaddressAccessControl(PlainAccessResource plainAccessResource) throws AclPlugRuntimeException { try { - authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(accessControl), accessControl, netaddressStrategyFactory.getNetaddressStrategy(accessControl)); + authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(plainAccessResource), plainAccessResource, netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource)); log.info("default authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { - throw new AclPlugRuntimeException(accessControl.toString(), e); + throw new AclPlugRuntimeException(plainAccessResource.toString(), e); } } - public AuthenticationInfo getAccessControl(AccessControl accessControl) { - if (accessControl.getAccount() == null && authenticationInfo != null) { - return authenticationInfo.getNetaddressStrategy().match(accessControl) ? authenticationInfo : null; + public AuthenticationInfo getAccessControl(PlainAccessResource plainAccessResource) { + if (plainAccessResource.getAccessKey() == null && authenticationInfo != null) { + return authenticationInfo.getNetaddressStrategy().match(plainAccessResource) ? authenticationInfo : null; } else { - List accessControlAddressList = accessControlMap.get(accessControl.getAccount()); + List accessControlAddressList = accessControlMap.get(plainAccessResource.getAccessKey()); if (accessControlAddressList != null) { for (AuthenticationInfo ai : accessControlAddressList) { - if (ai.getNetaddressStrategy().match(accessControl) && ai.getAccessControl().getPassword().equals(accessControl.getPassword())) { + if (ai.getNetaddressStrategy().match(plainAccessResource) && ai.getPlainAccessResource().getSignature().equals(plainAccessResource.getSignature())) { return ai; } } @@ -198,15 +199,15 @@ public class PlainAclPlugEngine { return null; } - public AuthenticationResult eachCheckAuthentication(AccessControl accessControl) { + public AuthenticationResult eachCheckAuthentication(PlainAccessResource plainAccessResource) { AuthenticationResult authenticationResult = new AuthenticationResult(); - AuthenticationInfo authenticationInfo = getAccessControl(accessControl); + AuthenticationInfo authenticationInfo = getAccessControl(plainAccessResource); if (authenticationInfo != null) { - boolean boo = authentication(authenticationInfo, accessControl, authenticationResult); + boolean boo = authentication(authenticationInfo, plainAccessResource, authenticationResult); authenticationResult.setSucceed(boo); - authenticationResult.setAccessControl(authenticationInfo.getAccessControl()); + authenticationResult.setPlainAccessResource(authenticationInfo.getPlainAccessResource()); } else { - authenticationResult.setResultString("accessControl is null, Please check login, password, IP\""); + authenticationResult.setResultString("plainAccessResource is null, Please check login, password, IP\""); } return authenticationResult; } @@ -226,18 +227,18 @@ public class PlainAclPlugEngine { } } - public boolean authentication(AuthenticationInfo authenticationInfo, AccessControl accessControl, + public boolean authentication(AuthenticationInfo authenticationInfo, PlainAccessResource plainAccessResource, AuthenticationResult authenticationResult) { - int code = accessControl.getCode(); + int code = plainAccessResource.getRequestCode(); if (!authenticationInfo.getAuthority().get(code)) { authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); return false; } - if (!(authenticationInfo.getAccessControl() instanceof BrokerAccessControl)) { + if (!(authenticationInfo.getPlainAccessResource() instanceof BrokerAccessControl)) { return true; } - BrokerAccessControl borker = (BrokerAccessControl) authenticationInfo.getAccessControl(); - String topicName = accessControl.getTopic(); + BrokerAccessControl borker = (BrokerAccessControl) authenticationInfo.getPlainAccessResource(); + String topicName = plainAccessResource.getTopic(); if (code == 10 || code == 310 || code == 320) { if (borker.getPermitSendTopic().contains(topicName)) { return true; @@ -284,8 +285,8 @@ public class PlainAclPlugEngine { } } - public Map analysis(AccessControl accessControl) { - Class clazz = accessControl.getClass(); + public Map analysis(PlainAccessResource plainAccessResource) { + Class clazz = plainAccessResource.getClass(); Map codeAndField = classTocodeAndMentod.get(clazz); if (codeAndField == null) { codeAndField = new HashMap<>(); @@ -305,8 +306,8 @@ public class PlainAclPlugEngine { } if (codeAndField.isEmpty()) { - throw new AclPlugRuntimeException(String.format("AccessControl nonexistent code , name %s", - accessControl.getClass().getName())); + throw new AclPlugRuntimeException(String.format("PlainAccessResource nonexistent code , name %s", + plainAccessResource.getClass().getName())); } classTocodeAndMentod.put(clazz, codeAndField); } @@ -315,11 +316,11 @@ public class PlainAclPlugEngine { try { while (it.hasNext()) { Entry e = it.next(); - authority.put(e.getKey(), (Boolean) e.getValue().get(accessControl)); + authority.put(e.getKey(), (Boolean) e.getValue().get(plainAccessResource)); } } catch (IllegalArgumentException | IllegalAccessException e) { throw new AclPlugRuntimeException( - String.format("analysis on failure AccessControl is %s", AccessControl.class.getName()), e); + String.format("analysis on failure PlainAccessResource is %s", PlainAccessResource.class.getName()), e); } return authority; } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessControl.java deleted file mode 100644 index f487bf47ef..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plug/AccessControl.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plug; - -import org.apache.rocketmq.acl.AccessResource; - -public class AccessControl implements AccessResource { - - private String account; - - private String password; - - private String netaddress; - - private String recognition; - - private int code; - - private String topic; - - public AccessControl() { - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getNetaddress() { - return netaddress; - } - - public void setNetaddress(String netaddress) { - this.netaddress = netaddress; - } - - public String getRecognition() { - return recognition; - } - - public void setRecognition(String recognition) { - this.recognition = recognition; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("AccessControl [account=").append(account).append(", password=").append(password) - .append(", netaddress=").append(netaddress).append(", recognition=").append(recognition) - .append(", code=").append(code).append(", topic=").append(topic).append("]"); - return builder.toString(); - } - -} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/AclUtilsTest.java similarity index 97% rename from acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plain/AclUtilsTest.java index db9d909151..bfb4bd5a7f 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/AclUtilsTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/AclUtilsTest.java @@ -14,11 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.common.AclUtils; import org.junit.Assert; import org.junit.Test; diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/NetaddressStrategyTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/NetaddressStrategyTest.java similarity index 59% rename from acl/src/test/java/org/apache/rocketmq/acl/plug/NetaddressStrategyTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plain/NetaddressStrategyTest.java index 6c76609df0..9ea34c9aa7 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/NetaddressStrategyTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/NetaddressStrategyTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; import org.junit.Assert; import org.junit.Test; @@ -25,111 +25,111 @@ public class NetaddressStrategyTest { @Test public void NetaddressStrategyFactoryTest() { - AccessControl accessControl = new AccessControl(); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(netaddressStrategy, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); - accessControl.setNetaddress("*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(netaddressStrategy, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); - accessControl.setNetaddress("127.0.0.1"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.1"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.OneNetaddressStrategy.class); - accessControl.setNetaddress("127.0.0.1,127.0.0.2,127.0.0.3"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.1,127.0.0.2,127.0.0.3"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.MultipleNetaddressStrategy.class); - accessControl.setNetaddress("127.0.0.{1,2,3}"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.{1,2,3}"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.MultipleNetaddressStrategy.class); - accessControl.setNetaddress("127.0.0.1-200"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.1-200"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); - accessControl.setNetaddress("127.0.0.*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); - accessControl.setNetaddress("127.0.1-20.*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.1-20.*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); } @Test(expected = AclPlugRuntimeException.class) public void verifyTest() { - AccessControl accessControl = new AccessControl(); - accessControl.setNetaddress("127.0.0.1"); - netaddressStrategyFactory.getNetaddressStrategy(accessControl); - accessControl.setNetaddress("256.0.0.1"); - netaddressStrategyFactory.getNetaddressStrategy(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setRemoteAddr("127.0.0.1"); + netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + plainAccessResource.setRemoteAddr("256.0.0.1"); + netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } @Test public void nullNetaddressStrategyTest() { - boolean isMatch = NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY.match(new AccessControl()); + boolean isMatch = NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY.match(new PlainAccessResource()); Assert.assertTrue(isMatch); } public void oneNetaddressStrategyTest() { - AccessControl accessControl = new AccessControl(); - accessControl.setNetaddress("127.0.0.1"); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); - accessControl.setNetaddress(""); - boolean match = netaddressStrategy.match(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setRemoteAddr("127.0.0.1"); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + plainAccessResource.setRemoteAddr(""); + boolean match = netaddressStrategy.match(plainAccessResource); Assert.assertFalse(match); - accessControl.setNetaddress("127.0.0.2"); - match = netaddressStrategy.match(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.2"); + match = netaddressStrategy.match(plainAccessResource); Assert.assertFalse(match); - accessControl.setNetaddress("127.0.0.1"); - match = netaddressStrategy.match(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.1"); + match = netaddressStrategy.match(plainAccessResource); Assert.assertTrue(match); } @Test public void multipleNetaddressStrategyTest() { - AccessControl accessControl = new AccessControl(); - accessControl.setNetaddress("127.0.0.1,127.0.0.2,127.0.0.3"); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setRemoteAddr("127.0.0.1,127.0.0.2,127.0.0.3"); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); multipleNetaddressStrategyTest(netaddressStrategy); - accessControl.setNetaddress("127.0.0.{1,2,3}"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.{1,2,3}"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); multipleNetaddressStrategyTest(netaddressStrategy); } @Test(expected = AclPlugRuntimeException.class) public void multipleNetaddressStrategyExceptionTest() { - AccessControl accessControl = new AccessControl(); - accessControl.setNetaddress("127.0.0.1,2,3}"); - netaddressStrategyFactory.getNetaddressStrategy(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setRemoteAddr("127.0.0.1,2,3}"); + netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } private void multipleNetaddressStrategyTest(NetaddressStrategy netaddressStrategy) { - AccessControl accessControl = new AccessControl(); - accessControl.setNetaddress("127.0.0.1"); - boolean match = netaddressStrategy.match(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setRemoteAddr("127.0.0.1"); + boolean match = netaddressStrategy.match(plainAccessResource); Assert.assertTrue(match); - accessControl.setNetaddress("127.0.0.2"); - match = netaddressStrategy.match(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.2"); + match = netaddressStrategy.match(plainAccessResource); Assert.assertTrue(match); - accessControl.setNetaddress("127.0.0.3"); - match = netaddressStrategy.match(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.3"); + match = netaddressStrategy.match(plainAccessResource); Assert.assertTrue(match); - accessControl.setNetaddress("127.0.0.4"); - match = netaddressStrategy.match(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.4"); + match = netaddressStrategy.match(plainAccessResource); Assert.assertFalse(match); - accessControl.setNetaddress("127.0.0.0"); - match = netaddressStrategy.match(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.0"); + match = netaddressStrategy.match(plainAccessResource); Assert.assertFalse(match); } @@ -137,25 +137,25 @@ public class NetaddressStrategyTest { @Test public void rangeNetaddressStrategyTest() { String head = "127.0.0."; - AccessControl accessControl = new AccessControl(); - accessControl.setNetaddress("127.0.0.1-200"); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setRemoteAddr("127.0.0.1-200"); + NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); rangeNetaddressStrategyTest(netaddressStrategy, head, 1, 200, true); - accessControl.setNetaddress("127.0.0.*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); rangeNetaddressStrategyTest(netaddressStrategy, head, 0, 255, true); - accessControl.setNetaddress("127.0.1-200.*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(accessControl); + plainAccessResource.setRemoteAddr("127.0.1-200.*"); + netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); rangeNetaddressStrategyThirdlyTest(netaddressStrategy, head, 1, 200); } private void rangeNetaddressStrategyTest(NetaddressStrategy netaddressStrategy, String head, int start, int end, boolean isFalse) { - AccessControl accessControl = new AccessControl(); + PlainAccessResource plainAccessResource = new PlainAccessResource(); for (int i = -10; i < 300; i++) { - accessControl.setNetaddress(head + i); - boolean match = netaddressStrategy.match(accessControl); + plainAccessResource.setRemoteAddr(head + i); + boolean match = netaddressStrategy.match(plainAccessResource); if (isFalse && i >= start && i <= end) { Assert.assertTrue(match); continue; @@ -192,9 +192,9 @@ public class NetaddressStrategyTest { } private void rangeNetaddressStrategyExceptionTest(String netaddress) { - AccessControl accessControl = new AccessControl(); - accessControl.setNetaddress(netaddress); - netaddressStrategyFactory.getNetaddressStrategy(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setRemoteAddr(netaddress); + netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java similarity index 64% rename from acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java index 3d3f254e35..0ce308a49f 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plug/PlainAclPlugEngineTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plug; +package org.apache.rocketmq.acl.plain; import java.io.File; import java.io.FileWriter; @@ -26,8 +26,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import org.apache.rocketmq.acl.plug.PlainAclPlugEngine.AccessContralAnalysis; -import org.apache.rocketmq.acl.plug.PlainAclPlugEngine.BrokerAccessControlTransport; +import org.apache.rocketmq.acl.plain.PlainAclPlugEngine.AccessContralAnalysis; +import org.apache.rocketmq.acl.plain.PlainAclPlugEngine.BrokerAccessControlTransport; import org.apache.rocketmq.common.protocol.RequestCode; import org.junit.Assert; import org.junit.Before; @@ -42,9 +42,9 @@ public class PlainAclPlugEngineTest { AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - AccessControl accessControl; + PlainAccessResource plainAccessResource; - AccessControl accessControlTwo; + PlainAccessResource plainAccessResourceTwo; AuthenticationInfo authenticationInfo; @@ -96,42 +96,42 @@ public class PlainAclPlugEngineTest { System.setProperty("rocketmq.home.dir", "src/test/resources"); plainAclPlugEngine = new PlainAclPlugEngine(); - accessControl = new BrokerAccessControl(); - accessControl.setAccount("rokcetmq"); - accessControl.setPassword("aliyun11"); - accessControl.setNetaddress("127.0.0.1"); - accessControl.setRecognition("127.0.0.1:1"); + plainAccessResource = new BrokerAccessControl(); + plainAccessResource.setAccessKey("rokcetmq"); + plainAccessResource.setSignature("aliyun11"); + plainAccessResource.setRemoteAddr("127.0.0.1"); + plainAccessResource.setRecognition("127.0.0.1:1"); - accessControlTwo = new BrokerAccessControl(); - accessControlTwo.setAccount("rokcet1"); - accessControlTwo.setPassword("aliyun1"); - accessControlTwo.setNetaddress("127.0.0.1"); - accessControlTwo.setRecognition("127.0.0.1:2"); + plainAccessResourceTwo = new BrokerAccessControl(); + plainAccessResourceTwo.setAccessKey("rokcet1"); + plainAccessResourceTwo.setSignature("aliyun1"); + plainAccessResourceTwo.setRemoteAddr("127.0.0.1"); + plainAccessResourceTwo.setRecognition("127.0.0.1:2"); } @Test(expected = AclPlugRuntimeException.class) public void accountNullTest() { - accessControl.setAccount(null); - plainAclPlugEngine.setAccessControl(accessControl); + plainAccessResource.setAccessKey(null); + plainAclPlugEngine.setAccessControl(plainAccessResource); } @Test(expected = AclPlugRuntimeException.class) public void accountThanTest() { - accessControl.setAccount("123"); - plainAclPlugEngine.setAccessControl(accessControl); + plainAccessResource.setAccessKey("123"); + plainAclPlugEngine.setAccessControl(plainAccessResource); } @Test(expected = AclPlugRuntimeException.class) public void passWordtNullTest() { - accessControl.setAccount(null); - plainAclPlugEngine.setAccessControl(accessControl); + plainAccessResource.setAccessKey(null); + plainAclPlugEngine.setAccessControl(plainAccessResource); } @Test(expected = AclPlugRuntimeException.class) public void passWordThanTest() { - accessControl.setAccount("123"); - plainAclPlugEngine.setAccessControl(accessControl); + plainAccessResource.setAccessKey("123"); + plainAclPlugEngine.setAccessControl(plainAccessResource); } @Test(expected = AclPlugRuntimeException.class) @@ -142,66 +142,66 @@ public class PlainAclPlugEngineTest { @Test public void authenticationInfoOfSetAccessControl() { - plainAclPlugEngine.setAccessControl(accessControl); + plainAclPlugEngine.setAccessControl(plainAccessResource); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResource); - AccessControl getAccessControl = authenticationInfo.getAccessControl(); - Assert.assertEquals(accessControl, getAccessControl); + PlainAccessResource getPlainAccessResource = authenticationInfo.getPlainAccessResource(); + Assert.assertEquals(plainAccessResource, getPlainAccessResource); - AccessControl testAccessControl = new AccessControl(); - testAccessControl.setAccount("rokcetmq"); - testAccessControl.setPassword("aliyun11"); - testAccessControl.setNetaddress("127.0.0.1"); - testAccessControl.setRecognition("127.0.0.1:1"); + PlainAccessResource testPlainAccessResource = new PlainAccessResource(); + testPlainAccessResource.setAccessKey("rokcetmq"); + testPlainAccessResource.setSignature("aliyun11"); + testPlainAccessResource.setRemoteAddr("127.0.0.1"); + testPlainAccessResource.setRecognition("127.0.0.1:1"); - testAccessControl.setAccount("rokcetmq1"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + testPlainAccessResource.setAccessKey("rokcetmq1"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testPlainAccessResource); Assert.assertNull(authenticationInfo); - testAccessControl.setAccount("rokcetmq"); - testAccessControl.setPassword("1234567"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + testPlainAccessResource.setAccessKey("rokcetmq"); + testPlainAccessResource.setSignature("1234567"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testPlainAccessResource); Assert.assertNull(authenticationInfo); - testAccessControl.setNetaddress("127.0.0.2"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testAccessControl); + testPlainAccessResource.setRemoteAddr("127.0.0.2"); + authenticationInfo = plainAclPlugEngine.getAccessControl(testPlainAccessResource); Assert.assertNull(authenticationInfo); } @Test public void setAccessControlList() { - List accessControlList = new ArrayList<>(); - accessControlList.add(accessControl); + List plainAccessResourceList = new ArrayList<>(); + plainAccessResourceList.add(plainAccessResource); - accessControlList.add(accessControlTwo); + plainAccessResourceList.add(plainAccessResourceTwo); - plainAclPlugEngine.setAccessControlList(accessControlList); + plainAclPlugEngine.setAccessControlList(plainAccessResourceList); - AuthenticationInfo newAccessControl = plainAclPlugEngine.getAccessControl(accessControl); - Assert.assertEquals(accessControl, newAccessControl.getAccessControl()); + AuthenticationInfo newAccessControl = plainAclPlugEngine.getAccessControl(plainAccessResource); + Assert.assertEquals(plainAccessResource, newAccessControl.getPlainAccessResource()); - newAccessControl = plainAclPlugEngine.getAccessControl(accessControlTwo); - Assert.assertEquals(accessControlTwo, newAccessControl.getAccessControl()); + newAccessControl = plainAclPlugEngine.getAccessControl(plainAccessResourceTwo); + Assert.assertEquals(plainAccessResourceTwo, newAccessControl.getPlainAccessResource()); } @Test public void setNetaddressAccessControl() { - AccessControl accessControl = new BrokerAccessControl(); - accessControl.setAccount("RocketMQ"); - accessControl.setPassword("RocketMQ"); - accessControl.setNetaddress("127.0.0.1"); - plainAclPlugEngine.setAccessControl(accessControl); - plainAclPlugEngine.setNetaddressAccessControl(accessControl); + PlainAccessResource plainAccessResource = new BrokerAccessControl(); + plainAccessResource.setAccessKey("RocketMQ"); + plainAccessResource.setSignature("RocketMQ"); + plainAccessResource.setRemoteAddr("127.0.0.1"); + plainAclPlugEngine.setAccessControl(plainAccessResource); + plainAclPlugEngine.setNetaddressAccessControl(plainAccessResource); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResource); - AccessControl getAccessControl = authenticationInfo.getAccessControl(); - Assert.assertEquals(accessControl, getAccessControl); + PlainAccessResource getPlainAccessResource = authenticationInfo.getPlainAccessResource(); + Assert.assertEquals(plainAccessResource, getPlainAccessResource); - accessControl.setNetaddress("127.0.0.2"); - authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); + plainAccessResource.setRemoteAddr("127.0.0.2"); + authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResource); Assert.assertNull(authenticationInfo); } @@ -219,68 +219,68 @@ public class PlainAclPlugEngineTest { public void BrokerAccessControlTransportTest() { BrokerAccessControlTransport accessControlTransport = new BrokerAccessControlTransport(); List list = new ArrayList<>(); - list.add((BrokerAccessControl) this.accessControlTwo); - accessControlTransport.setOnlyNetAddress((BrokerAccessControl) this.accessControl); + list.add((BrokerAccessControl) this.plainAccessResourceTwo); + accessControlTransport.setOnlyNetAddress((BrokerAccessControl) this.plainAccessResource); accessControlTransport.setList(list); plainAclPlugEngine.setBrokerAccessControlTransport(accessControlTransport); - AccessControl accessControl = new BrokerAccessControl(); - accessControl.setAccount("RocketMQ"); - accessControl.setPassword("RocketMQ"); - accessControl.setNetaddress("127.0.0.1"); - plainAclPlugEngine.setAccessControl(accessControl); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(accessControl); - Assert.assertNotNull(authenticationInfo.getAccessControl()); + PlainAccessResource plainAccessResource = new BrokerAccessControl(); + plainAccessResource.setAccessKey("RocketMQ"); + plainAccessResource.setSignature("RocketMQ"); + plainAccessResource.setRemoteAddr("127.0.0.1"); + plainAclPlugEngine.setAccessControl(plainAccessResource); + AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResource); + Assert.assertNotNull(authenticationInfo.getPlainAccessResource()); - authenticationInfo = plainAclPlugEngine.getAccessControl(accessControlTwo); - Assert.assertEquals(accessControlTwo, authenticationInfo.getAccessControl()); + authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResourceTwo); + Assert.assertEquals(plainAccessResourceTwo, authenticationInfo.getPlainAccessResource()); } @Test public void authenticationTest() { AuthenticationResult authenticationResult = new AuthenticationResult(); - accessControl.setCode(317); + plainAccessResource.setRequestCode(317); - boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); - accessControl.setCode(321); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setRequestCode(321); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); - accessControl.setCode(10); - accessControl.setTopic("permitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setRequestCode(10); + plainAccessResource.setTopic("permitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); - accessControl.setCode(310); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setRequestCode(310); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); - accessControl.setCode(320); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setRequestCode(320); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); - accessControl.setTopic("noPermitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setTopic("noPermitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); - accessControl.setTopic("nopermitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setTopic("nopermitSendTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); - accessControl.setCode(11); - accessControl.setTopic("permitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setRequestCode(11); + plainAccessResource.setTopic("permitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); - accessControl.setTopic("noPermitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setTopic("noPermitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); - accessControl.setTopic("nopermitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setTopic("nopermitPullTopic"); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); } @@ -288,31 +288,31 @@ public class PlainAclPlugEngineTest { @Test public void isEmptyTest() { AuthenticationResult authenticationResult = new AuthenticationResult(); - accessControl.setCode(10); - accessControl.setTopic("absentTopic"); - boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setRequestCode(10); + plainAccessResource.setTopic("absentTopic"); + boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); Set permitSendTopic = new HashSet<>(); brokerAccessControl.setPermitSendTopic(permitSendTopic); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); - accessControl.setCode(11); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + plainAccessResource.setRequestCode(11); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); brokerAccessControl.setPermitPullTopic(permitSendTopic); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, accessControl, authenticationResult); + isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); } @Test public void adminBrokerAccessControlTest() { BrokerAccessControl admin = new BrokerAccessControl(); - admin.setAccount("adminTest"); - admin.setPassword("adminTest"); - admin.setNetaddress("127.0.0.1"); + admin.setAccessKey("adminTest"); + admin.setSignature("adminTest"); + admin.setRemoteAddr("127.0.0.1"); plainAclPlugEngine.setAccessControl(admin); Assert.assertFalse(admin.isUpdateAndCreateTopic()); @@ -324,12 +324,12 @@ public class PlainAclPlugEngineTest { @Test public void adminEachCheckAuthentication() { BrokerAccessControl accessControl = new BrokerAccessControl(); - accessControl.setAccount("RocketMQ1"); - accessControl.setPassword("1234567"); - accessControl.setNetaddress("127.0.0.1"); + accessControl.setAccessKey("RocketMQ1"); + accessControl.setSignature("1234567"); + accessControl.setRemoteAddr("127.0.0.1"); plainAclPlugEngine.setAccessControl(accessControl); for (Integer code : adminCode) { - accessControl.setCode(code); + accessControl.setRequestCode(code); AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); Assert.assertFalse(authenticationResult.isSucceed()); @@ -338,7 +338,7 @@ public class PlainAclPlugEngineTest { accessControl.setAdmin(true); plainAclPlugEngine.setAccessControl(accessControl); for (Integer code : adminCode) { - accessControl.setCode(code); + accessControl.setRequestCode(code); AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); Assert.assertTrue(authenticationResult.isSucceed()); } @@ -346,12 +346,12 @@ public class PlainAclPlugEngineTest { @Test public void cleanAuthenticationInfoTest() { - plainAclPlugEngine.setAccessControl(accessControl); - accessControl.setCode(202); - AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + plainAclPlugEngine.setAccessControl(plainAccessResource); + plainAccessResource.setRequestCode(202); + AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(plainAccessResource); Assert.assertTrue(authenticationResult.isSucceed()); plainAclPlugEngine.cleanAuthenticationInfo(); - authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + authenticationResult = plainAclPlugEngine.eachCheckAuthentication(plainAccessResource); Assert.assertFalse(authenticationResult.isSucceed()); } @@ -380,8 +380,8 @@ public class PlainAclPlugEngineTest { writer.flush(); writer.close(); PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); - accessControl.setCode(203); - AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + plainAccessResource.setRequestCode(203); + AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(plainAccessResource); Assert.assertTrue(authenticationResult.isSucceed()); writer = new FileWriter(new File("src/test/resources/watch/conf/transport.yml"), true); @@ -396,8 +396,8 @@ public class PlainAclPlugEngineTest { // TODO Auto-generated catch block e.printStackTrace(); } - accessControlTwo.setCode(203); - authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControlTwo); + plainAccessResourceTwo.setRequestCode(203); + authenticationResult = plainAclPlugEngine.eachCheckAuthentication(plainAccessResourceTwo); Assert.assertTrue(authenticationResult.isSucceed()); transport.delete(); @@ -430,7 +430,7 @@ public class PlainAclPlugEngineTest { @Test(expected = AclPlugRuntimeException.class) public void analysisExceptionTest() { - AccessControl accessControl = new AccessControl(); - accessContralAnalysis.analysis(accessControl); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + accessContralAnalysis.analysis(plainAccessResource); } } diff --git a/acl/src/test/resources/conf/transport.yml b/acl/src/test/resources/conf/transport.yml index 6b1450ef95..384769f11f 100644 --- a/acl/src/test/resources/conf/transport.yml +++ b/acl/src/test/resources/conf/transport.yml @@ -14,22 +14,52 @@ # limitations under the License. onlyNetAddress: - netaddress: 10.10.103.* + remoteAddr: 10.10.103.* noPermitPullTopic: - broker-a list: -- account: RocketMQ - password: 1234567 - netaddress: 192.0.0.* +- accessKey: RocketMQ + signature: 1234567 + remoteAddr: 192.0.0.* admin: true permitSendTopic: - test1 - test2 -- account: RocketMQ - password: 1234567 - netaddress: 192.0.2.1 +- accessKey: RocketMQ + signature: 1234567 + remoteAddr: 192.0.2.1 permitSendTopic: - test3 - test4 - \ No newline at end of file + + +## suggested format + +globalWhiteRemoteAddresses: + - 10.10.103.* + - 192.168.0.* + +accounts: +- accessKey: ak1 + secretKey: sk1 + whiteRemoteAddress: 192.168.0.* + admin: false + defaultTopicPerm: DENY + defaultGroupPerm: SUB + topics: + - topicA=DENY + - topicB=PUB|SUB + - topicC=SUB + groups: + # the group should convert to retry topic + - groupA=DENY + - groupB=SUB + - groupC=SUB + +- accessKey: ak2 + secretKey: sk2 + whiteRemoteAddress: 192.168.1.* + # if it is admin, it could access all resources + admin: true + diff --git a/distribution/conf/transport.yml b/distribution/conf/transport.yml index f8180ede02..69c86bcd09 100644 --- a/distribution/conf/transport.yml +++ b/distribution/conf/transport.yml @@ -14,20 +14,20 @@ # limitations under the License. onlyNetAddress: - netaddress: 192.168.0.* + remoteAddr: 192.168.0.* noPermitPullTopic: - broker-a list: - account: RocketMQ - password: 1234567 - netaddress: 192.168.0.* + signature: 1234567 + remoteAddr: 192.168.0.* permitSendTopic: - TopicTest - test2 - account: RocketMQ - password: 1234567 - netaddress: 192.168.2.1 + signature: 1234567 + remoteAddr: 192.168.2.1 permitSendTopic: - test3 - test4 diff --git a/pom.xml b/pom.xml index 84f45fd85d..1f2091a5b6 100644 --- a/pom.xml +++ b/pom.xml @@ -593,6 +593,11 @@ snakeyaml 1.19 + + commons-codec + commons-codec + 1.9 + org.apache.logging.log4j log4j-core From 87d85991b9e54325223714201ec30edc2f68b654 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Mon, 3 Dec 2018 22:36:47 +0800 Subject: [PATCH 52/96] Rename some files in acl --- .../acl/plain/AclPlugRuntimeException.java | 4 + .../acl/plain/AuthenticationInfo.java | 19 +-- .../acl/plain/AuthenticationResult.java | 2 + .../acl/plain/BrokerAccessControl.java | 1 + .../acl/plain/PlainAccessValidator.java | 4 +- ...Engine.java => PlainPermissionLoader.java} | 18 +-- ...rategy.java => RemoteAddressStrategy.java} | 2 +- ...java => RemoteAddressStrategyFactory.java} | 34 ++--- .../acl/plain/PlainAclPlugEngineTest.java | 118 +++++++++--------- ...st.java => RemoteAddressStrategyTest.java} | 94 +++++++------- 10 files changed, 152 insertions(+), 144 deletions(-) rename acl/src/main/java/org/apache/rocketmq/acl/plain/{PlainAclPlugEngine.java => PlainPermissionLoader.java} (94%) rename acl/src/main/java/org/apache/rocketmq/acl/plain/{NetaddressStrategy.java => RemoteAddressStrategy.java} (95%) rename acl/src/main/java/org/apache/rocketmq/acl/plain/{NetaddressStrategyFactory.java => RemoteAddressStrategyFactory.java} (77%) rename acl/src/test/java/org/apache/rocketmq/acl/plain/{NetaddressStrategyTest.java => RemoteAddressStrategyTest.java} (53%) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java index d13a29f9cb..29c06d5d22 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java @@ -16,6 +16,10 @@ */ package org.apache.rocketmq.acl.plain; +/** + * Use AclException instead + */ +@Deprecated public class AclPlugRuntimeException extends RuntimeException { private static final long serialVersionUID = 6062101368637228900L; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java index 009ca30ffc..7ff225085b 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java @@ -20,20 +20,21 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +@Deprecated public class AuthenticationInfo { private PlainAccessResource plainAccessResource; - private NetaddressStrategy netaddressStrategy; + private RemoteAddressStrategy remoteAddressStrategy; private Map authority; public AuthenticationInfo(Map authority, PlainAccessResource plainAccessResource, - NetaddressStrategy netaddressStrategy) { + RemoteAddressStrategy remoteAddressStrategy) { super(); this.authority = authority; this.plainAccessResource = plainAccessResource; - this.netaddressStrategy = netaddressStrategy; + this.remoteAddressStrategy = remoteAddressStrategy; } public PlainAccessResource getPlainAccessResource() { @@ -44,12 +45,12 @@ public class AuthenticationInfo { this.plainAccessResource = plainAccessResource; } - public NetaddressStrategy getNetaddressStrategy() { - return netaddressStrategy; + public RemoteAddressStrategy getRemoteAddressStrategy() { + return remoteAddressStrategy; } - public void setNetaddressStrategy(NetaddressStrategy netaddressStrategy) { - this.netaddressStrategy = netaddressStrategy; + public void setRemoteAddressStrategy(RemoteAddressStrategy remoteAddressStrategy) { + this.remoteAddressStrategy = remoteAddressStrategy; } public Map getAuthority() { @@ -63,8 +64,8 @@ public class AuthenticationInfo { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("AuthenticationInfo [plainAccessResource=").append(plainAccessResource).append(", netaddressStrategy=") - .append(netaddressStrategy).append(", authority={"); + builder.append("AuthenticationInfo [plainAccessResource=").append(plainAccessResource).append(", remoteAddressStrategy=") + .append(remoteAddressStrategy).append(", authority={"); Iterator> it = authority.entrySet().iterator(); while (it.hasNext()) { Entry e = it.next(); diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java index 18f98447b9..68eb05d1d7 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java @@ -16,6 +16,8 @@ */ package org.apache.rocketmq.acl.plain; + +@Deprecated public class AuthenticationResult { private PlainAccessResource plainAccessResource; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java index a1d5db0333..cfb59e5927 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java @@ -19,6 +19,7 @@ package org.apache.rocketmq.acl.plain; import java.util.HashSet; import java.util.Set; +@Deprecated public class BrokerAccessControl extends PlainAccessResource { private boolean admin; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java index b38bcfe7d4..57ece5271b 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java @@ -38,10 +38,10 @@ import static org.apache.rocketmq.acl.plain.PlainAccessResource.getRetryTopic; public class PlainAccessValidator implements AccessValidator { - private PlainAclPlugEngine aclPlugEngine; + private PlainPermissionLoader aclPlugEngine; public PlainAccessValidator() { - aclPlugEngine = new PlainAclPlugEngine(); + aclPlugEngine = new PlainPermissionLoader(); } @Override diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngine.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java similarity index 94% rename from acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngine.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 73b76ccbb0..0ef0137464 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngine.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -40,7 +40,7 @@ import org.apache.rocketmq.common.protocol.RequestCode; import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.logging.InternalLoggerFactory; -public class PlainAclPlugEngine { +public class PlainPermissionLoader { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); @@ -51,7 +51,7 @@ public class PlainAclPlugEngine { private AuthenticationInfo authenticationInfo; - private NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); + private RemoteAddressStrategyFactory remoteAddressStrategyFactory = new RemoteAddressStrategyFactory(); private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); @@ -59,7 +59,7 @@ public class PlainAclPlugEngine { private boolean isWatchStart; - public PlainAclPlugEngine() { + public PlainPermissionLoader() { initialize(); watch(); } @@ -98,7 +98,7 @@ public class PlainAclPlugEngine { if ("transport.yml".equals(event.context().toString()) && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { log.info("transprot.yml make a difference change is : ", event.toString()); - PlainAclPlugEngine.this.cleanAuthenticationInfo(); + PlainPermissionLoader.this.cleanAuthenticationInfo(); initialize(); } } @@ -151,14 +151,14 @@ public class PlainAclPlugEngine { } try { handleAccessControl(plainAccessResource); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); List accessControlAddressList = accessControlMap.get(plainAccessResource.getAccessKey()); if (accessControlAddressList == null) { accessControlAddressList = new ArrayList<>(); accessControlMap.put(plainAccessResource.getAccessKey(), accessControlAddressList); } AuthenticationInfo authenticationInfo = new AuthenticationInfo( - accessContralAnalysis.analysis(plainAccessResource), plainAccessResource, netaddressStrategy); + accessContralAnalysis.analysis(plainAccessResource), plainAccessResource, remoteAddressStrategy); accessControlAddressList.add(authenticationInfo); log.info("authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { @@ -175,7 +175,7 @@ public class PlainAclPlugEngine { public void setNetaddressAccessControl(PlainAccessResource plainAccessResource) throws AclPlugRuntimeException { try { - authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(plainAccessResource), plainAccessResource, netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource)); + authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(plainAccessResource), plainAccessResource, remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource)); log.info("default authenticationInfo is {}", authenticationInfo.toString()); } catch (Exception e) { throw new AclPlugRuntimeException(plainAccessResource.toString(), e); @@ -185,12 +185,12 @@ public class PlainAclPlugEngine { public AuthenticationInfo getAccessControl(PlainAccessResource plainAccessResource) { if (plainAccessResource.getAccessKey() == null && authenticationInfo != null) { - return authenticationInfo.getNetaddressStrategy().match(plainAccessResource) ? authenticationInfo : null; + return authenticationInfo.getRemoteAddressStrategy().match(plainAccessResource) ? authenticationInfo : null; } else { List accessControlAddressList = accessControlMap.get(plainAccessResource.getAccessKey()); if (accessControlAddressList != null) { for (AuthenticationInfo ai : accessControlAddressList) { - if (ai.getNetaddressStrategy().match(plainAccessResource) && ai.getPlainAccessResource().getSignature().equals(plainAccessResource.getSignature())) { + if (ai.getRemoteAddressStrategy().match(plainAccessResource) && ai.getPlainAccessResource().getSignature().equals(plainAccessResource.getSignature())) { return ai; } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategy.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategy.java similarity index 95% rename from acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategy.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategy.java index d639c068eb..60e92960e6 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategy.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategy.java @@ -16,7 +16,7 @@ */ package org.apache.rocketmq.acl.plain; -public interface NetaddressStrategy { +public interface RemoteAddressStrategy { public boolean match(PlainAccessResource plainAccessResource); } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java similarity index 77% rename from acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategyFactory.java rename to acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java index 3b20ebe46c..fb07a49914 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/NetaddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java @@ -21,11 +21,11 @@ import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.common.AclUtils; -public class NetaddressStrategyFactory { +public class RemoteAddressStrategyFactory { - public static final NullNetaddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullNetaddressStrategy(); + public static final NullRemoteAddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullRemoteAddressStrategy(); - public NetaddressStrategy getNetaddressStrategy(PlainAccessResource plainAccessResource) { + public RemoteAddressStrategy getNetaddressStrategy(PlainAccessResource plainAccessResource) { String netaddress = plainAccessResource.getRemoteAddr(); if (StringUtils.isBlank(netaddress) || "*".equals(netaddress)) { return NULL_NET_ADDRESS_STRATEGY; @@ -34,19 +34,19 @@ public class NetaddressStrategyFactory { String[] strArray = StringUtils.split(netaddress, "."); String four = strArray[3]; if (!four.startsWith("{")) { - throw new AclPlugRuntimeException(String.format("MultipleNetaddressStrategy netaddress examine scope Exception netaddress", netaddress)); + throw new AclPlugRuntimeException(String.format("MultipleRemoteAddressStrategy netaddress examine scope Exception netaddress", netaddress)); } - return new MultipleNetaddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); + return new MultipleRemoteAddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); } else if (AclUtils.isColon(netaddress)) { - return new MultipleNetaddressStrategy(StringUtils.split(netaddress, ",")); + return new MultipleRemoteAddressStrategy(StringUtils.split(netaddress, ",")); } else if (AclUtils.isAsterisk(netaddress) || AclUtils.isMinus(netaddress)) { - return new RangeNetaddressStrategy(netaddress); + return new RangeRemoteAddressStrategy(netaddress); } - return new OneNetaddressStrategy(netaddress); + return new OneRemoteAddressStrategy(netaddress); } - public static class NullNetaddressStrategy implements NetaddressStrategy { + public static class NullRemoteAddressStrategy implements RemoteAddressStrategy { @Override public boolean match(PlainAccessResource plainAccessResource) { return true; @@ -54,11 +54,11 @@ public class NetaddressStrategyFactory { } - public static class MultipleNetaddressStrategy implements NetaddressStrategy { + public static class MultipleRemoteAddressStrategy implements RemoteAddressStrategy { private final Set multipleSet = new HashSet<>(); - public MultipleNetaddressStrategy(String[] strArray) { + public MultipleRemoteAddressStrategy(String[] strArray) { for (String netaddress : strArray) { AclUtils.verify(netaddress, 4); multipleSet.add(netaddress); @@ -72,11 +72,11 @@ public class NetaddressStrategyFactory { } - public static class OneNetaddressStrategy implements NetaddressStrategy { + public static class OneRemoteAddressStrategy implements RemoteAddressStrategy { private String netaddress; - public OneNetaddressStrategy(String netaddress) { + public OneRemoteAddressStrategy(String netaddress) { this.netaddress = netaddress; AclUtils.verify(netaddress, 4); } @@ -88,7 +88,7 @@ public class NetaddressStrategyFactory { } - public static class RangeNetaddressStrategy implements NetaddressStrategy { + public static class RangeRemoteAddressStrategy implements RemoteAddressStrategy { private String head; @@ -98,7 +98,7 @@ public class NetaddressStrategyFactory { private int index; - public RangeNetaddressStrategy(String netaddress) { + public RangeRemoteAddressStrategy(String netaddress) { String[] strArray = StringUtils.split(netaddress, "."); if (analysis(strArray, 2) || analysis(strArray, 3)) { AclUtils.verify(netaddress, index - 1); @@ -117,14 +117,14 @@ public class NetaddressStrategyFactory { setValue(0, 255); } else if (AclUtils.isMinus(value)) { if (value.indexOf("-") == 0) { - throw new AclPlugRuntimeException(String.format("RangeNetaddressStrategy netaddress examine scope Exception value %s ", value)); + throw new AclPlugRuntimeException(String.format("RangeRemoteAddressStrategy netaddress examine scope Exception value %s ", value)); } String[] valueArray = StringUtils.split(value, "-"); this.start = Integer.valueOf(valueArray[0]); this.end = Integer.valueOf(valueArray[1]); if (!(AclUtils.isScope(end) && AclUtils.isScope(start) && start <= end)) { - throw new AclPlugRuntimeException(String.format("RangeNetaddressStrategy netaddress examine scope Exception start is %s , end is %s", start, end)); + throw new AclPlugRuntimeException(String.format("RangeRemoteAddressStrategy netaddress examine scope Exception start is %s , end is %s", start, end)); } } return this.end > 0 ? true : false; diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java index 0ce308a49f..2010577490 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java @@ -26,8 +26,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import org.apache.rocketmq.acl.plain.PlainAclPlugEngine.AccessContralAnalysis; -import org.apache.rocketmq.acl.plain.PlainAclPlugEngine.BrokerAccessControlTransport; +import org.apache.rocketmq.acl.plain.PlainPermissionLoader.AccessContralAnalysis; +import org.apache.rocketmq.acl.plain.PlainPermissionLoader.BrokerAccessControlTransport; import org.apache.rocketmq.common.protocol.RequestCode; import org.junit.Assert; import org.junit.Before; @@ -38,7 +38,7 @@ import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class PlainAclPlugEngineTest { - PlainAclPlugEngine plainAclPlugEngine; + PlainPermissionLoader plainPermissionLoader; AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); @@ -91,10 +91,10 @@ public class PlainAclPlugEngineTest { accessContralAnalysis.analysisClass(RequestCode.class); Map map = accessContralAnalysis.analysis(brokerAccessControl); - authenticationInfo = new AuthenticationInfo(map, brokerAccessControl, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); + authenticationInfo = new AuthenticationInfo(map, brokerAccessControl, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); System.setProperty("rocketmq.home.dir", "src/test/resources"); - plainAclPlugEngine = new PlainAclPlugEngine(); + plainPermissionLoader = new PlainPermissionLoader(); plainAccessResource = new BrokerAccessControl(); plainAccessResource.setAccessKey("rokcetmq"); @@ -113,38 +113,38 @@ public class PlainAclPlugEngineTest { @Test(expected = AclPlugRuntimeException.class) public void accountNullTest() { plainAccessResource.setAccessKey(null); - plainAclPlugEngine.setAccessControl(plainAccessResource); + plainPermissionLoader.setAccessControl(plainAccessResource); } @Test(expected = AclPlugRuntimeException.class) public void accountThanTest() { plainAccessResource.setAccessKey("123"); - plainAclPlugEngine.setAccessControl(plainAccessResource); + plainPermissionLoader.setAccessControl(plainAccessResource); } @Test(expected = AclPlugRuntimeException.class) public void passWordtNullTest() { plainAccessResource.setAccessKey(null); - plainAclPlugEngine.setAccessControl(plainAccessResource); + plainPermissionLoader.setAccessControl(plainAccessResource); } @Test(expected = AclPlugRuntimeException.class) public void passWordThanTest() { plainAccessResource.setAccessKey("123"); - plainAclPlugEngine.setAccessControl(plainAccessResource); + plainPermissionLoader.setAccessControl(plainAccessResource); } @Test(expected = AclPlugRuntimeException.class) public void testPlainAclPlugEngineInit() { System.setProperty("rocketmq.home.dir", ""); - new PlainAclPlugEngine().initialize(); + new PlainPermissionLoader().initialize(); } @Test public void authenticationInfoOfSetAccessControl() { - plainAclPlugEngine.setAccessControl(plainAccessResource); + plainPermissionLoader.setAccessControl(plainAccessResource); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResource); + AuthenticationInfo authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResource); PlainAccessResource getPlainAccessResource = authenticationInfo.getPlainAccessResource(); Assert.assertEquals(plainAccessResource, getPlainAccessResource); @@ -156,16 +156,16 @@ public class PlainAclPlugEngineTest { testPlainAccessResource.setRecognition("127.0.0.1:1"); testPlainAccessResource.setAccessKey("rokcetmq1"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testPlainAccessResource); + authenticationInfo = plainPermissionLoader.getAccessControl(testPlainAccessResource); Assert.assertNull(authenticationInfo); testPlainAccessResource.setAccessKey("rokcetmq"); testPlainAccessResource.setSignature("1234567"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testPlainAccessResource); + authenticationInfo = plainPermissionLoader.getAccessControl(testPlainAccessResource); Assert.assertNull(authenticationInfo); testPlainAccessResource.setRemoteAddr("127.0.0.2"); - authenticationInfo = plainAclPlugEngine.getAccessControl(testPlainAccessResource); + authenticationInfo = plainPermissionLoader.getAccessControl(testPlainAccessResource); Assert.assertNull(authenticationInfo); } @@ -176,12 +176,12 @@ public class PlainAclPlugEngineTest { plainAccessResourceList.add(plainAccessResourceTwo); - plainAclPlugEngine.setAccessControlList(plainAccessResourceList); + plainPermissionLoader.setAccessControlList(plainAccessResourceList); - AuthenticationInfo newAccessControl = plainAclPlugEngine.getAccessControl(plainAccessResource); + AuthenticationInfo newAccessControl = plainPermissionLoader.getAccessControl(plainAccessResource); Assert.assertEquals(plainAccessResource, newAccessControl.getPlainAccessResource()); - newAccessControl = plainAclPlugEngine.getAccessControl(plainAccessResourceTwo); + newAccessControl = plainPermissionLoader.getAccessControl(plainAccessResourceTwo); Assert.assertEquals(plainAccessResourceTwo, newAccessControl.getPlainAccessResource()); } @@ -192,16 +192,16 @@ public class PlainAclPlugEngineTest { plainAccessResource.setAccessKey("RocketMQ"); plainAccessResource.setSignature("RocketMQ"); plainAccessResource.setRemoteAddr("127.0.0.1"); - plainAclPlugEngine.setAccessControl(plainAccessResource); - plainAclPlugEngine.setNetaddressAccessControl(plainAccessResource); + plainPermissionLoader.setAccessControl(plainAccessResource); + plainPermissionLoader.setNetaddressAccessControl(plainAccessResource); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResource); + AuthenticationInfo authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResource); PlainAccessResource getPlainAccessResource = authenticationInfo.getPlainAccessResource(); Assert.assertEquals(plainAccessResource, getPlainAccessResource); plainAccessResource.setRemoteAddr("127.0.0.2"); - authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResource); + authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResource); Assert.assertNull(authenticationInfo); } @@ -212,7 +212,7 @@ public class PlainAclPlugEngineTest { @Test(expected = AclPlugRuntimeException.class) public void BrokerAccessControlTransportTestNull() { BrokerAccessControlTransport accessControlTransport = new BrokerAccessControlTransport(); - plainAclPlugEngine.setBrokerAccessControlTransport(accessControlTransport); + plainPermissionLoader.setBrokerAccessControlTransport(accessControlTransport); } @Test @@ -222,17 +222,17 @@ public class PlainAclPlugEngineTest { list.add((BrokerAccessControl) this.plainAccessResourceTwo); accessControlTransport.setOnlyNetAddress((BrokerAccessControl) this.plainAccessResource); accessControlTransport.setList(list); - plainAclPlugEngine.setBrokerAccessControlTransport(accessControlTransport); + plainPermissionLoader.setBrokerAccessControlTransport(accessControlTransport); PlainAccessResource plainAccessResource = new BrokerAccessControl(); plainAccessResource.setAccessKey("RocketMQ"); plainAccessResource.setSignature("RocketMQ"); plainAccessResource.setRemoteAddr("127.0.0.1"); - plainAclPlugEngine.setAccessControl(plainAccessResource); - AuthenticationInfo authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResource); + plainPermissionLoader.setAccessControl(plainAccessResource); + AuthenticationInfo authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResource); Assert.assertNotNull(authenticationInfo.getPlainAccessResource()); - authenticationInfo = plainAclPlugEngine.getAccessControl(plainAccessResourceTwo); + authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResourceTwo); Assert.assertEquals(plainAccessResourceTwo, authenticationInfo.getPlainAccessResource()); } @@ -242,45 +242,45 @@ public class PlainAclPlugEngineTest { AuthenticationResult authenticationResult = new AuthenticationResult(); plainAccessResource.setRequestCode(317); - boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + boolean isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); plainAccessResource.setRequestCode(321); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); plainAccessResource.setRequestCode(10); plainAccessResource.setTopic("permitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); plainAccessResource.setRequestCode(310); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); plainAccessResource.setRequestCode(320); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); plainAccessResource.setTopic("noPermitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); plainAccessResource.setTopic("nopermitSendTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); plainAccessResource.setRequestCode(11); plainAccessResource.setTopic("permitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); plainAccessResource.setTopic("noPermitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); plainAccessResource.setTopic("nopermitPullTopic"); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); } @@ -290,20 +290,20 @@ public class PlainAclPlugEngineTest { AuthenticationResult authenticationResult = new AuthenticationResult(); plainAccessResource.setRequestCode(10); plainAccessResource.setTopic("absentTopic"); - boolean isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + boolean isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); Set permitSendTopic = new HashSet<>(); brokerAccessControl.setPermitSendTopic(permitSendTopic); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); plainAccessResource.setRequestCode(11); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertFalse(isReturn); brokerAccessControl.setPermitPullTopic(permitSendTopic); - isReturn = plainAclPlugEngine.authentication(authenticationInfo, plainAccessResource, authenticationResult); + isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); Assert.assertTrue(isReturn); } @@ -313,11 +313,11 @@ public class PlainAclPlugEngineTest { admin.setAccessKey("adminTest"); admin.setSignature("adminTest"); admin.setRemoteAddr("127.0.0.1"); - plainAclPlugEngine.setAccessControl(admin); + plainPermissionLoader.setAccessControl(admin); Assert.assertFalse(admin.isUpdateAndCreateTopic()); admin.setAdmin(true); - plainAclPlugEngine.setAccessControl(admin); + plainPermissionLoader.setAccessControl(admin); Assert.assertTrue(admin.isUpdateAndCreateTopic()); } @@ -327,41 +327,41 @@ public class PlainAclPlugEngineTest { accessControl.setAccessKey("RocketMQ1"); accessControl.setSignature("1234567"); accessControl.setRemoteAddr("127.0.0.1"); - plainAclPlugEngine.setAccessControl(accessControl); + plainPermissionLoader.setAccessControl(accessControl); for (Integer code : adminCode) { accessControl.setRequestCode(code); - AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + AuthenticationResult authenticationResult = plainPermissionLoader.eachCheckAuthentication(accessControl); Assert.assertFalse(authenticationResult.isSucceed()); } - plainAclPlugEngine.cleanAuthenticationInfo(); + plainPermissionLoader.cleanAuthenticationInfo(); accessControl.setAdmin(true); - plainAclPlugEngine.setAccessControl(accessControl); + plainPermissionLoader.setAccessControl(accessControl); for (Integer code : adminCode) { accessControl.setRequestCode(code); - AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(accessControl); + AuthenticationResult authenticationResult = plainPermissionLoader.eachCheckAuthentication(accessControl); Assert.assertTrue(authenticationResult.isSucceed()); } } @Test public void cleanAuthenticationInfoTest() { - plainAclPlugEngine.setAccessControl(plainAccessResource); + plainPermissionLoader.setAccessControl(plainAccessResource); plainAccessResource.setRequestCode(202); - AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(plainAccessResource); + AuthenticationResult authenticationResult = plainPermissionLoader.eachCheckAuthentication(plainAccessResource); Assert.assertTrue(authenticationResult.isSucceed()); - plainAclPlugEngine.cleanAuthenticationInfo(); - authenticationResult = plainAclPlugEngine.eachCheckAuthentication(plainAccessResource); + plainPermissionLoader.cleanAuthenticationInfo(); + authenticationResult = plainPermissionLoader.eachCheckAuthentication(plainAccessResource); Assert.assertFalse(authenticationResult.isSucceed()); } @Test public void isWatchStartTest() { - PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); - Assert.assertTrue(plainAclPlugEngine.isWatchStart()); + PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); + Assert.assertTrue(plainPermissionLoader.isWatchStart()); System.setProperty("java.version", "1.6.11"); - plainAclPlugEngine = new PlainAclPlugEngine(); - Assert.assertFalse(plainAclPlugEngine.isWatchStart()); + plainPermissionLoader = new PlainPermissionLoader(); + Assert.assertFalse(plainPermissionLoader.isWatchStart()); } @Test @@ -379,9 +379,9 @@ public class PlainAclPlugEngineTest { writer.write(" netaddress: 127.0.0.1\r\n"); writer.flush(); writer.close(); - PlainAclPlugEngine plainAclPlugEngine = new PlainAclPlugEngine(); + PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); plainAccessResource.setRequestCode(203); - AuthenticationResult authenticationResult = plainAclPlugEngine.eachCheckAuthentication(plainAccessResource); + AuthenticationResult authenticationResult = plainPermissionLoader.eachCheckAuthentication(plainAccessResource); Assert.assertTrue(authenticationResult.isSucceed()); writer = new FileWriter(new File("src/test/resources/watch/conf/transport.yml"), true); @@ -397,7 +397,7 @@ public class PlainAclPlugEngineTest { e.printStackTrace(); } plainAccessResourceTwo.setRequestCode(203); - authenticationResult = plainAclPlugEngine.eachCheckAuthentication(plainAccessResourceTwo); + authenticationResult = plainPermissionLoader.eachCheckAuthentication(plainAccessResourceTwo); Assert.assertTrue(authenticationResult.isSucceed()); transport.delete(); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/NetaddressStrategyTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java similarity index 53% rename from acl/src/test/java/org/apache/rocketmq/acl/plain/NetaddressStrategyTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java index 9ea34c9aa7..8e0d3c6045 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/NetaddressStrategyTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java @@ -19,74 +19,74 @@ package org.apache.rocketmq.acl.plain; import org.junit.Assert; import org.junit.Test; -public class NetaddressStrategyTest { +public class RemoteAddressStrategyTest { - NetaddressStrategyFactory netaddressStrategyFactory = new NetaddressStrategyFactory(); + RemoteAddressStrategyFactory remoteAddressStrategyFactory = new RemoteAddressStrategyFactory(); @Test public void NetaddressStrategyFactoryTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - Assert.assertEquals(netaddressStrategy, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); plainAccessResource.setRemoteAddr("*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - Assert.assertEquals(netaddressStrategy, NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); plainAccessResource.setRemoteAddr("127.0.0.1"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.OneNetaddressStrategy.class); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.OneRemoteAddressStrategy.class); plainAccessResource.setRemoteAddr("127.0.0.1,127.0.0.2,127.0.0.3"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.MultipleNetaddressStrategy.class); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.MultipleRemoteAddressStrategy.class); plainAccessResource.setRemoteAddr("127.0.0.{1,2,3}"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.MultipleNetaddressStrategy.class); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.MultipleRemoteAddressStrategy.class); plainAccessResource.setRemoteAddr("127.0.0.1-200"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); plainAccessResource.setRemoteAddr("127.0.0.*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); plainAccessResource.setRemoteAddr("127.0.1-20.*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - Assert.assertEquals(netaddressStrategy.getClass(), NetaddressStrategyFactory.RangeNetaddressStrategy.class); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); } @Test(expected = AclPlugRuntimeException.class) public void verifyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setRemoteAddr("127.0.0.1"); - netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); plainAccessResource.setRemoteAddr("256.0.0.1"); - netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } @Test public void nullNetaddressStrategyTest() { - boolean isMatch = NetaddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY.match(new PlainAccessResource()); + boolean isMatch = RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY.match(new PlainAccessResource()); Assert.assertTrue(isMatch); } public void oneNetaddressStrategyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setRemoteAddr("127.0.0.1"); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); plainAccessResource.setRemoteAddr(""); - boolean match = netaddressStrategy.match(plainAccessResource); + boolean match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); plainAccessResource.setRemoteAddr("127.0.0.2"); - match = netaddressStrategy.match(plainAccessResource); + match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); plainAccessResource.setRemoteAddr("127.0.0.1"); - match = netaddressStrategy.match(plainAccessResource); + match = remoteAddressStrategy.match(plainAccessResource); Assert.assertTrue(match); } @@ -94,12 +94,12 @@ public class NetaddressStrategyTest { public void multipleNetaddressStrategyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setRemoteAddr("127.0.0.1,127.0.0.2,127.0.0.3"); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - multipleNetaddressStrategyTest(netaddressStrategy); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + multipleNetaddressStrategyTest(remoteAddressStrategy); plainAccessResource.setRemoteAddr("127.0.0.{1,2,3}"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - multipleNetaddressStrategyTest(netaddressStrategy); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + multipleNetaddressStrategyTest(remoteAddressStrategy); } @@ -107,29 +107,29 @@ public class NetaddressStrategyTest { public void multipleNetaddressStrategyExceptionTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setRemoteAddr("127.0.0.1,2,3}"); - netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } - private void multipleNetaddressStrategyTest(NetaddressStrategy netaddressStrategy) { + private void multipleNetaddressStrategyTest(RemoteAddressStrategy remoteAddressStrategy) { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setRemoteAddr("127.0.0.1"); - boolean match = netaddressStrategy.match(plainAccessResource); + boolean match = remoteAddressStrategy.match(plainAccessResource); Assert.assertTrue(match); plainAccessResource.setRemoteAddr("127.0.0.2"); - match = netaddressStrategy.match(plainAccessResource); + match = remoteAddressStrategy.match(plainAccessResource); Assert.assertTrue(match); plainAccessResource.setRemoteAddr("127.0.0.3"); - match = netaddressStrategy.match(plainAccessResource); + match = remoteAddressStrategy.match(plainAccessResource); Assert.assertTrue(match); plainAccessResource.setRemoteAddr("127.0.0.4"); - match = netaddressStrategy.match(plainAccessResource); + match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); plainAccessResource.setRemoteAddr("127.0.0.0"); - match = netaddressStrategy.match(plainAccessResource); + match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); } @@ -139,23 +139,23 @@ public class NetaddressStrategyTest { String head = "127.0.0."; PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setRemoteAddr("127.0.0.1-200"); - NetaddressStrategy netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - rangeNetaddressStrategyTest(netaddressStrategy, head, 1, 200, true); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + rangeNetaddressStrategyTest(remoteAddressStrategy, head, 1, 200, true); plainAccessResource.setRemoteAddr("127.0.0.*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - rangeNetaddressStrategyTest(netaddressStrategy, head, 0, 255, true); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + rangeNetaddressStrategyTest(remoteAddressStrategy, head, 0, 255, true); plainAccessResource.setRemoteAddr("127.0.1-200.*"); - netaddressStrategy = netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - rangeNetaddressStrategyThirdlyTest(netaddressStrategy, head, 1, 200); + remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + rangeNetaddressStrategyThirdlyTest(remoteAddressStrategy, head, 1, 200); } - private void rangeNetaddressStrategyTest(NetaddressStrategy netaddressStrategy, String head, int start, int end, + private void rangeNetaddressStrategyTest(RemoteAddressStrategy remoteAddressStrategy, String head, int start, int end, boolean isFalse) { PlainAccessResource plainAccessResource = new PlainAccessResource(); for (int i = -10; i < 300; i++) { plainAccessResource.setRemoteAddr(head + i); - boolean match = netaddressStrategy.match(plainAccessResource); + boolean match = remoteAddressStrategy.match(plainAccessResource); if (isFalse && i >= start && i <= end) { Assert.assertTrue(match); continue; @@ -165,13 +165,13 @@ public class NetaddressStrategyTest { } } - private void rangeNetaddressStrategyThirdlyTest(NetaddressStrategy netaddressStrategy, String head, int start, + private void rangeNetaddressStrategyThirdlyTest(RemoteAddressStrategy remoteAddressStrategy, String head, int start, int end) { String newHead; for (int i = -10; i < 300; i++) { newHead = head + i; if (i >= start && i <= end) { - rangeNetaddressStrategyTest(netaddressStrategy, newHead, 0, 255, false); + rangeNetaddressStrategyTest(remoteAddressStrategy, newHead, 0, 255, false); } } } @@ -194,7 +194,7 @@ public class NetaddressStrategyTest { private void rangeNetaddressStrategyExceptionTest(String netaddress) { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setRemoteAddr(netaddress); - netaddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } } From f27dc755114235bcf6152b2f671cfcf0f6f2674c Mon Sep 17 00:00:00 2001 From: jijs Date: Sun, 2 Dec 2018 18:10:58 +0800 Subject: [PATCH 53/96] common model modify org.apache.rocketmq.common.constant.DBMsgConstants.MAX_BODY_SIZE value --- .../org/apache/rocketmq/common/constant/DBMsgConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/org/apache/rocketmq/common/constant/DBMsgConstants.java b/common/src/main/java/org/apache/rocketmq/common/constant/DBMsgConstants.java index 8273aaa788..8d2b344976 100644 --- a/common/src/main/java/org/apache/rocketmq/common/constant/DBMsgConstants.java +++ b/common/src/main/java/org/apache/rocketmq/common/constant/DBMsgConstants.java @@ -18,5 +18,5 @@ package org.apache.rocketmq.common.constant; public class DBMsgConstants { - public static final int MAX_BODY_SIZE = 64 * 1024 * 1204; //64KB + public static final int MAX_BODY_SIZE = 64 * 1024 * 1024; //64KB } From 5d3560dc5c3e546b09bc09b9298a2b4433835b85 Mon Sep 17 00:00:00 2001 From: duhengforever Date: Fri, 16 Nov 2018 20:56:17 +0800 Subject: [PATCH 54/96] Fixed Transactional message will be lost under extreme condition --- .../TransactionalMessageServiceImpl.java | 43 ++++++++----------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageServiceImpl.java b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageServiceImpl.java index 15e5c84ff2..1c227af150 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageServiceImpl.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageServiceImpl.java @@ -198,7 +198,7 @@ public class TransactionalMessageServiceImpl implements TransactionalMessageServ if (null != checkImmunityTimeStr) { checkImmunityTime = getImmunityTime(checkImmunityTimeStr, transactionTimeout); if (valueOfCurrentMinusBorn < checkImmunityTime) { - if (checkPrepareQueueOffset(removeMap, doneOpOffset, msgExt, checkImmunityTime)) { + if (checkPrepareQueueOffset(removeMap, doneOpOffset, msgExt)) { newOffset = i + 1; i++; continue; @@ -315,33 +315,26 @@ public class TransactionalMessageServiceImpl implements TransactionalMessageServ * @param removeMap Op message map to determine whether a half message was responded by producer. * @param doneOpOffset Op Message which has been checked. * @param msgExt Half message - * @param checkImmunityTime User defined time to avoid being detected early. * @return Return true if put success, otherwise return false. */ - private boolean checkPrepareQueueOffset(HashMap removeMap, List doneOpOffset, MessageExt msgExt, - long checkImmunityTime) { - if (System.currentTimeMillis() - msgExt.getBornTimestamp() < checkImmunityTime) { - String prepareQueueOffsetStr = msgExt.getUserProperty(MessageConst.PROPERTY_TRANSACTION_PREPARED_QUEUE_OFFSET); - if (null == prepareQueueOffsetStr) { - return putImmunityMsgBackToHalfQueue(msgExt); - } else { - long prepareQueueOffset = getLong(prepareQueueOffsetStr); - if (-1 == prepareQueueOffset) { - return false; - } else { - if (removeMap.containsKey(prepareQueueOffset)) { - long tmpOpOffset = removeMap.remove(prepareQueueOffset); - doneOpOffset.add(tmpOpOffset); - return true; - } else { - return putImmunityMsgBackToHalfQueue(msgExt); - } - } - - } - + private boolean checkPrepareQueueOffset(HashMap removeMap, List doneOpOffset, + MessageExt msgExt) { + String prepareQueueOffsetStr = msgExt.getUserProperty(MessageConst.PROPERTY_TRANSACTION_PREPARED_QUEUE_OFFSET); + if (null == prepareQueueOffsetStr) { + return putImmunityMsgBackToHalfQueue(msgExt); } else { - return true; + long prepareQueueOffset = getLong(prepareQueueOffsetStr); + if (-1 == prepareQueueOffset) { + return false; + } else { + if (removeMap.containsKey(prepareQueueOffset)) { + long tmpOpOffset = removeMap.remove(prepareQueueOffset); + doneOpOffset.add(tmpOpOffset); + return true; + } else { + return putImmunityMsgBackToHalfQueue(msgExt); + } + } } } From 23a24c44f06289ecf21c909e258c561cc610b4a6 Mon Sep 17 00:00:00 2001 From: laohu <2372554140@qq.com> Date: Mon, 10 Dec 2018 08:55:29 +0800 Subject: [PATCH 55/96] Seamless cloud --- acl/pom.xml | 37 +- .../rocketmq/acl/common/AclClientRPCHook.java | 30 +- .../rocketmq/acl/common/AclException.java | 26 +- .../apache/rocketmq/acl/common/AclSigner.java | 33 +- .../apache/rocketmq/acl/common/AclUtils.java | 10 +- .../rocketmq/acl/common/Permission.java | 78 +- .../acl/common/SessionCredentials.java | 21 +- .../rocketmq/acl/common/SigningAlgorithm.java | 16 + .../acl/plain/AclPlugRuntimeException.java | 35 - .../acl/plain/AuthenticationInfo.java | 80 --- .../acl/plain/AuthenticationResult.java | 63 -- .../acl/plain/BrokerAccessControl.java | 674 ------------------ .../acl/plain/PlainAccessResource.java | 120 +++- .../acl/plain/PlainAccessValidator.java | 26 +- .../acl/plain/PlainPermissionLoader.java | 320 +++------ .../plain/RemoteAddressStrategyFactory.java | 19 +- .../acl/{plain => common}/AclUtilsTest.java | 14 +- .../rocketmq/acl/common/PermissionTest.java | 152 ++++ .../acl/plain/PlainAccessValidatorTest.java | 84 +++ .../acl/plain/PlainAclPlugEngineTest.java | 436 ----------- .../acl/plain/PlainPermissionLoaderTest.java | 299 ++++++++ .../acl/plain/RemoteAddressStrategyTest.java | 66 +- .../test/resources/conf/transport-null.yml | 18 + acl/src/test/resources/conf/transport.yml | 33 +- distribution/conf/transport.yml | 4 +- 25 files changed, 1022 insertions(+), 1672 deletions(-) delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java delete mode 100644 acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java rename acl/src/test/java/org/apache/rocketmq/acl/{plain => common}/AclUtilsTest.java (90%) create mode 100644 acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java create mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java delete mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java create mode 100644 acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java create mode 100644 acl/src/test/resources/conf/transport-null.yml diff --git a/acl/pom.xml b/acl/pom.xml index 4ea559f84f..9a072269ef 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -1,17 +1,16 @@ - - + 4.0.0 org.apache.rocketmq @@ -50,5 +49,17 @@ org.apache.commons commons-lang3 + + org.powermock + powermock-module-junit4 + 1.7.1 + test + + + org.powermock + powermock-api-mockito2 + 1.7.1 + test + diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java index 9b5a5a5594..65c45f076f 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java @@ -1,24 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common; -import org.apache.rocketmq.remoting.CommandCustomHeader; -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; import java.lang.reflect.Field; import java.util.SortedMap; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; +import org.apache.rocketmq.remoting.CommandCustomHeader; +import org.apache.rocketmq.remoting.RPCHook; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; import static org.apache.rocketmq.acl.common.SessionCredentials.AccessKey; import static org.apache.rocketmq.acl.common.SessionCredentials.SecurityToken; import static org.apache.rocketmq.acl.common.SessionCredentials.Signature; public class AclClientRPCHook implements RPCHook { - protected ConcurrentHashMap, Field[]> fieldCache = - new ConcurrentHashMap, Field[]>(); - - - private final SessionCredentials sessionCredentials; + protected ConcurrentHashMap, Field[]> fieldCache = + new ConcurrentHashMap, Field[]>(); public AclClientRPCHook(SessionCredentials sessionCredentials) { this.sessionCredentials = sessionCredentials; @@ -37,7 +50,6 @@ public class AclClientRPCHook implements RPCHook { } } - @Override public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java index cd7aea9f37..0bc97db911 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common; public class AclException extends RuntimeException { @@ -6,27 +22,31 @@ public class AclException extends RuntimeException { private String status; private int code; - public AclException(String status, int code) { super(); this.status = status; this.code = code; } - public AclException(String status, int code, String message) { super(message); this.status = status; this.code = code; } - public AclException(String status, int code, Throwable throwable) { super(throwable); this.status = status; this.code = code; } + public AclException(String message) { + super(message); + } + + public AclException(String message, Throwable throwable) { + super(message, throwable); + } public AclException(String status, int code, String message, Throwable throwable) { super(message, throwable); diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java index a6c0c87956..7a71104ef6 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java @@ -1,13 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common; -import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.logging.InternalLogger; -import org.apache.rocketmq.logging.InternalLoggerFactory; import java.nio.charset.Charset; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; - +import org.apache.rocketmq.common.constant.LoggerName; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; public class AclSigner { public static final Charset defaultCharset = Charset.forName("UTF-8"); @@ -20,12 +35,13 @@ public class AclSigner { return calSignature(data, key, defaultAlgorithm, defaultCharset); } - public static String calSignature(String data, String key, SigningAlgorithm algorithm, Charset charset) throws AclException { + public static String calSignature(String data, String key, SigningAlgorithm algorithm, + Charset charset) throws AclException { return signAndBase64Encode(data, key, algorithm, charset); } private static String signAndBase64Encode(String data, String key, SigningAlgorithm algorithm, Charset charset) - throws AclException { + throws AclException { try { byte[] signature = sign(data.getBytes(charset), key.getBytes(charset), algorithm); return new String(Base64.encodeBase64(signature), defaultCharset); @@ -52,12 +68,13 @@ public class AclSigner { return calSignature(data, key, defaultAlgorithm, defaultCharset); } - public static String calSignature(byte[] data, String key, SigningAlgorithm algorithm, Charset charset) throws AclException { + public static String calSignature(byte[] data, String key, SigningAlgorithm algorithm, + Charset charset) throws AclException { return signAndBase64Encode(data, key, algorithm, charset); } private static String signAndBase64Encode(byte[] data, String key, SigningAlgorithm algorithm, Charset charset) - throws AclException { + throws AclException { try { byte[] signature = sign(data, key.getBytes(charset), algorithm); return new String(Base64.encodeBase64(signature), defaultCharset); diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java index 0b1b09c2f8..a3aab1ca7c 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.util.Map; import java.util.SortedMap; import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.plain.AclPlugRuntimeException; import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.yaml.snakeyaml.Yaml; @@ -45,7 +44,6 @@ public class AclUtils { } } - public static byte[] combineBytes(byte[] b1, byte[] b2) { int size = (null != b1 ? b1.length : 0) + (null != b2 ? b2.length : 0); byte[] total = new byte[size]; @@ -56,7 +54,6 @@ public class AclUtils { return total; } - public static String calSignature(byte[] data, String secretKey) { String signature = AclSigner.calSignature(data, secretKey); return signature; @@ -64,7 +61,7 @@ public class AclUtils { public static void verify(String netaddress, int index) { if (!AclUtils.isScope(netaddress, index)) { - throw new AclPlugRuntimeException(String.format("netaddress examine scope Exception netaddress is %s", netaddress)); + throw new AclException(String.format("netaddress examine scope Exception netaddress is %s", netaddress)); } } @@ -128,15 +125,16 @@ public class AclUtils { fis = new FileInputStream(new File(path)); return ymal.loadAs(fis, clazz); } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("The transport.yml file for Plain mode was not found , paths %s", path), e); + throw new AclException(String.format("The file for Plain mode was not found , paths %s", path), e); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { - throw new AclPlugRuntimeException("close transport fileInputStream Exception", e); + throw new AclException("close transport fileInputStream Exception", e); } } } } + } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java index 223ad19d1e..1b225c3852 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java @@ -1,5 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common; +import com.alibaba.fastjson.JSONArray; +import java.util.HashSet; +import java.util.Set; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.plain.PlainAccessResource; + public class Permission { public static final byte DENY = 1; @@ -7,7 +29,22 @@ public class Permission { public static final byte PUB = 1 << 2; public static final byte SUB = 1 << 3; - public boolean checkPermission(byte neededPerm, byte ownedPerm) { + public static final Set ADMIN_CODE = new HashSet(); + + static { + // UPDATE_AND_CREATE_TOPIC + ADMIN_CODE.add(17); + // UPDATE_BROKER_CONFIG + ADMIN_CODE.add(25); + // DELETE_TOPIC_IN_BROKER + ADMIN_CODE.add(215); + // UPDATE_AND_CREATE_SUBSCRIPTIONGROUP + ADMIN_CODE.add(200); + // DELETE_SUBSCRIPTIONGROUP + ADMIN_CODE.add(207); + } + + public static boolean checkPermission(byte neededPerm, byte ownedPerm) { if ((ownedPerm & DENY) > 0) { return false; } @@ -17,4 +54,43 @@ public class Permission { return (neededPerm & ownedPerm) > 0; } + public static byte fromStringGetPermission(String permString) { + if (permString == null) { + return Permission.DENY; + } + switch (permString.trim()) { + case "PUB": + return Permission.PUB; + case "SUB": + return Permission.SUB; + case "ANY": + return Permission.ANY; + case "PUB|SUB": + return Permission.ANY; + case "SUB|PUB": + return Permission.ANY; + case "DENY": + return Permission.DENY; + default: + return Permission.DENY; + } + } + + public static void setTopicPerm(PlainAccessResource plainAccessResource, Boolean isTopic, JSONArray topicArray) { + if (topicArray == null || topicArray.isEmpty()) { + return; + } + for (int i = 0; i < topicArray.size(); i++) { + String[] topicPrem = StringUtils.split(topicArray.getString(i), "="); + if (topicPrem.length == 2) { + plainAccessResource.addResourceAndPerm(isTopic ? topicPrem[0] : PlainAccessResource.getRetryTopic(topicPrem[0]), fromStringGetPermission(topicPrem[1])); + } else { + throw new AclException(String.format("%s Permission config erron %s", isTopic ? "topic" : "group", topicArray.getString(i))); + } + } + } + + public static boolean checkAdminCode(Integer code) { + return ADMIN_CODE.contains(code); + } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java b/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java index 650e11163b..62523d058d 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java @@ -1,10 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common; -import org.apache.rocketmq.common.MixAll; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.Properties; +import org.apache.rocketmq.common.MixAll; public class SessionCredentials { public static final Charset CHARSET = Charset.forName("UTF-8"); @@ -45,7 +61,6 @@ public class SessionCredentials { this.securityToken = securityToken; } - public void updateContent(Properties prop) { { String value = prop.getProperty(AccessKey); @@ -99,8 +114,6 @@ public class SessionCredentials { this.securityToken = securityToken; } - - @Override public int hashCode() { final int prime = 31; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java b/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java index 7a49c214b0..6937cdf490 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common;//package com.aliyun.openservices.ons.api.impl.rocketmq.spas; public enum SigningAlgorithm { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java deleted file mode 100644 index 29c06d5d22..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/AclPlugRuntimeException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; - -/** - * Use AclException instead - */ -@Deprecated -public class AclPlugRuntimeException extends RuntimeException { - - private static final long serialVersionUID = 6062101368637228900L; - - public AclPlugRuntimeException(String message) { - super(message); - } - - public AclPlugRuntimeException(String message, Throwable cause) { - super(message, cause); - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java deleted file mode 100644 index 7ff225085b..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationInfo.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; - -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -@Deprecated -public class AuthenticationInfo { - - private PlainAccessResource plainAccessResource; - - private RemoteAddressStrategy remoteAddressStrategy; - - private Map authority; - - public AuthenticationInfo(Map authority, PlainAccessResource plainAccessResource, - RemoteAddressStrategy remoteAddressStrategy) { - super(); - this.authority = authority; - this.plainAccessResource = plainAccessResource; - this.remoteAddressStrategy = remoteAddressStrategy; - } - - public PlainAccessResource getPlainAccessResource() { - return plainAccessResource; - } - - public void setPlainAccessResource(PlainAccessResource plainAccessResource) { - this.plainAccessResource = plainAccessResource; - } - - public RemoteAddressStrategy getRemoteAddressStrategy() { - return remoteAddressStrategy; - } - - public void setRemoteAddressStrategy(RemoteAddressStrategy remoteAddressStrategy) { - this.remoteAddressStrategy = remoteAddressStrategy; - } - - public Map getAuthority() { - return authority; - } - - public void setAuthority(Map authority) { - this.authority = authority; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("AuthenticationInfo [plainAccessResource=").append(plainAccessResource).append(", remoteAddressStrategy=") - .append(remoteAddressStrategy).append(", authority={"); - Iterator> it = authority.entrySet().iterator(); - while (it.hasNext()) { - Entry e = it.next(); - if (!e.getValue()) { - builder.append(e.getKey().toString()).append(":").append(e.getValue()).append(","); - } - } - builder.append("}]"); - return builder.toString(); - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java deleted file mode 100644 index 68eb05d1d7..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/AuthenticationResult.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; - - -@Deprecated -public class AuthenticationResult { - - private PlainAccessResource plainAccessResource; - - private boolean succeed; - - private Exception exception; - - private String resultString; - - public PlainAccessResource getPlainAccessResource() { - return plainAccessResource; - } - - public void setPlainAccessResource(PlainAccessResource plainAccessResource) { - this.plainAccessResource = plainAccessResource; - } - - public boolean isSucceed() { - return succeed; - } - - public void setSucceed(boolean succeed) { - this.succeed = succeed; - } - - public Exception getException() { - return exception; - } - - public void setException(Exception exception) { - this.exception = exception; - } - - public String getResultString() { - return resultString; - } - - public void setResultString(String resultString) { - this.resultString = resultString; - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java deleted file mode 100644 index cfb59e5927..0000000000 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/BrokerAccessControl.java +++ /dev/null @@ -1,674 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; - -import java.util.HashSet; -import java.util.Set; - -@Deprecated -public class BrokerAccessControl extends PlainAccessResource { - - private boolean admin; - - private Set permitSendTopic = new HashSet<>(); - private Set noPermitSendTopic = new HashSet<>(); - private Set permitPullTopic = new HashSet<>(); - private Set noPermitPullTopic = new HashSet<>(); - - private boolean sendMessage = true; - - private boolean sendMessageV2 = true; - - private boolean sendBatchMessage = true; - - private boolean consumerSendMsgBack = true; - - private boolean pullMessage = true; - - private boolean queryMessage = true; - - private boolean viewMessageById = true; - - private boolean heartBeat = true; - - private boolean unregisterClient = true; - - private boolean checkClientConfig = true; - - private boolean getConsumerListByGroup = true; - - private boolean updateConsumerOffset = true; - - private boolean queryConsumerOffset = true; - - private boolean endTransaction = true; - - private boolean updateAndCreateTopic = false; - - private boolean deleteTopicInbroker = false; - - private boolean getAllTopicConfig = true; - - private boolean updateBrokerConfig = false; - - private boolean getBrokerConfig = true; - - private boolean searchOffsetByTimestamp = true; - - private boolean getMaxOffset = true; - - private boolean getMinOffset = true; - - private boolean getEarliestMsgStoretime = true; - - private boolean getBrokerRuntimeInfo = true; - - private boolean lockBatchMQ = true; - - private boolean unlockBatchMQ = true; - - private boolean updateAndCreateSubscriptiongroup = false; - - private boolean getAllSubscriptiongroupConfig = true; - - private boolean deleteSubscriptiongroup = false; - - private boolean getTopicStatsInfo = true; - - private boolean getConsumerConnectionList = true; - - private boolean getProducerConnectionList = true; - - private boolean getConsumeStats = true; - - private boolean getAllConsumerOffset = true; - - private boolean getAllDelayOffset = true; - - private boolean invokeBrokerToresetOffset = true; - - private boolean queryTopicConsumeByWho = true; - - private boolean registerFilterServer = true; - - private boolean queryConsumeTimeSpan = true; - - private boolean getSystemTopicListFromBroker = true; - - private boolean cleanExpiredConsumequeue = true; - - private boolean cleanUnusedTopic = true; - - private boolean getConsumerRunningInfo = true; - - private boolean queryCorrectionOffset = true; - - private boolean consumeMessageDirectly = true; - - private boolean cloneGroupOffset = true; - - private boolean viewBrokerStatsData = true; - - private boolean getBrokerConsumeStats = true; - - private boolean queryConsumeQueue = true; - - public BrokerAccessControl() { - - } - - public boolean isAdmin() { - return admin; - } - - public void setAdmin(boolean admin) { - this.admin = admin; - } - - public Set getPermitSendTopic() { - return permitSendTopic; - } - - public void setPermitSendTopic(Set permitSendTopic) { - this.permitSendTopic = permitSendTopic; - } - - public Set getNoPermitSendTopic() { - return noPermitSendTopic; - } - - public void setNoPermitSendTopic(Set noPermitSendTopic) { - this.noPermitSendTopic = noPermitSendTopic; - } - - public Set getPermitPullTopic() { - return permitPullTopic; - } - - public void setPermitPullTopic(Set permitPullTopic) { - this.permitPullTopic = permitPullTopic; - } - - public Set getNoPermitPullTopic() { - return noPermitPullTopic; - } - - public void setNoPermitPullTopic(Set noPermitPullTopic) { - this.noPermitPullTopic = noPermitPullTopic; - } - - public boolean isSendMessage() { - return sendMessage; - } - - public void setSendMessage(boolean sendMessage) { - this.sendMessage = sendMessage; - } - - public boolean isSendMessageV2() { - return sendMessageV2; - } - - public void setSendMessageV2(boolean sendMessageV2) { - this.sendMessageV2 = sendMessageV2; - } - - public boolean isSendBatchMessage() { - return sendBatchMessage; - } - - public void setSendBatchMessage(boolean sendBatchMessage) { - this.sendBatchMessage = sendBatchMessage; - } - - public boolean isConsumerSendMsgBack() { - return consumerSendMsgBack; - } - - public void setConsumerSendMsgBack(boolean consumerSendMsgBack) { - this.consumerSendMsgBack = consumerSendMsgBack; - } - - public boolean isPullMessage() { - return pullMessage; - } - - public void setPullMessage(boolean pullMessage) { - this.pullMessage = pullMessage; - } - - public boolean isQueryMessage() { - return queryMessage; - } - - public void setQueryMessage(boolean queryMessage) { - this.queryMessage = queryMessage; - } - - public boolean isViewMessageById() { - return viewMessageById; - } - - public void setViewMessageById(boolean viewMessageById) { - this.viewMessageById = viewMessageById; - } - - public boolean isHeartBeat() { - return heartBeat; - } - - public void setHeartBeat(boolean heartBeat) { - this.heartBeat = heartBeat; - } - - public boolean isUnregisterClient() { - return unregisterClient; - } - - public void setUnregisterClient(boolean unregisterClient) { - this.unregisterClient = unregisterClient; - } - - public boolean isCheckClientConfig() { - return checkClientConfig; - } - - public void setCheckClientConfig(boolean checkClientConfig) { - this.checkClientConfig = checkClientConfig; - } - - public boolean isGetConsumerListByGroup() { - return getConsumerListByGroup; - } - - public void setGetConsumerListByGroup(boolean getConsumerListByGroup) { - this.getConsumerListByGroup = getConsumerListByGroup; - } - - public boolean isUpdateConsumerOffset() { - return updateConsumerOffset; - } - - public void setUpdateConsumerOffset(boolean updateConsumerOffset) { - this.updateConsumerOffset = updateConsumerOffset; - } - - public boolean isQueryConsumerOffset() { - return queryConsumerOffset; - } - - public void setQueryConsumerOffset(boolean queryConsumerOffset) { - this.queryConsumerOffset = queryConsumerOffset; - } - - public boolean isEndTransaction() { - return endTransaction; - } - - public void setEndTransaction(boolean endTransaction) { - this.endTransaction = endTransaction; - } - - public boolean isUpdateAndCreateTopic() { - return updateAndCreateTopic; - } - - public void setUpdateAndCreateTopic(boolean updateAndCreateTopic) { - this.updateAndCreateTopic = updateAndCreateTopic; - } - - public boolean isDeleteTopicInbroker() { - return deleteTopicInbroker; - } - - public void setDeleteTopicInbroker(boolean deleteTopicInbroker) { - this.deleteTopicInbroker = deleteTopicInbroker; - } - - public boolean isGetAllTopicConfig() { - return getAllTopicConfig; - } - - public void setGetAllTopicConfig(boolean getAllTopicConfig) { - this.getAllTopicConfig = getAllTopicConfig; - } - - public boolean isUpdateBrokerConfig() { - return updateBrokerConfig; - } - - public void setUpdateBrokerConfig(boolean updateBrokerConfig) { - this.updateBrokerConfig = updateBrokerConfig; - } - - public boolean isGetBrokerConfig() { - return getBrokerConfig; - } - - public void setGetBrokerConfig(boolean getBrokerConfig) { - this.getBrokerConfig = getBrokerConfig; - } - - public boolean isSearchOffsetByTimestamp() { - return searchOffsetByTimestamp; - } - - public void setSearchOffsetByTimestamp(boolean searchOffsetByTimestamp) { - this.searchOffsetByTimestamp = searchOffsetByTimestamp; - } - - public boolean isGetMaxOffset() { - return getMaxOffset; - } - - public void setGetMaxOffset(boolean getMinOffset) { - this.getMaxOffset = getMinOffset; - } - - public boolean isGetMinOffset() { - return getMinOffset; - } - - public void setGetMinOffset(boolean getMinOffset) { - this.getMinOffset = getMinOffset; - } - - public boolean isGetEarliestMsgStoretime() { - return getEarliestMsgStoretime; - } - - public void setGetEarliestMsgStoretime(boolean getEarliestMsgStoretime) { - this.getEarliestMsgStoretime = getEarliestMsgStoretime; - } - - public boolean isGetBrokerRuntimeInfo() { - return getBrokerRuntimeInfo; - } - - public void setGetBrokerRuntimeInfo(boolean getBrokerRuntimeInfo) { - this.getBrokerRuntimeInfo = getBrokerRuntimeInfo; - } - - public boolean isLockBatchMQ() { - return lockBatchMQ; - } - - public void setLockBatchMQ(boolean lockBatchMQ) { - this.lockBatchMQ = lockBatchMQ; - } - - public boolean isUnlockBatchMQ() { - return unlockBatchMQ; - } - - public void setUnlockBatchMQ(boolean unlockBatchMQ) { - this.unlockBatchMQ = unlockBatchMQ; - } - - public boolean isUpdateAndCreateSubscriptiongroup() { - return updateAndCreateSubscriptiongroup; - } - - public void setUpdateAndCreateSubscriptiongroup(boolean updateAndCreateSubscriptiongroup) { - this.updateAndCreateSubscriptiongroup = updateAndCreateSubscriptiongroup; - } - - public boolean isGetAllSubscriptiongroupConfig() { - return getAllSubscriptiongroupConfig; - } - - public void setGetAllSubscriptiongroupConfig(boolean getAllSubscriptiongroupConfig) { - this.getAllSubscriptiongroupConfig = getAllSubscriptiongroupConfig; - } - - public boolean isDeleteSubscriptiongroup() { - return deleteSubscriptiongroup; - } - - public void setDeleteSubscriptiongroup(boolean deleteSubscriptiongroup) { - this.deleteSubscriptiongroup = deleteSubscriptiongroup; - } - - public boolean isGetTopicStatsInfo() { - return getTopicStatsInfo; - } - - public void setGetTopicStatsInfo(boolean getTopicStatsInfo) { - this.getTopicStatsInfo = getTopicStatsInfo; - } - - public boolean isGetConsumerConnectionList() { - return getConsumerConnectionList; - } - - public void setGetConsumerConnectionList(boolean getConsumerConnectionList) { - this.getConsumerConnectionList = getConsumerConnectionList; - } - - public boolean isGetProducerConnectionList() { - return getProducerConnectionList; - } - - public void setGetProducerConnectionList(boolean getProducerConnectionList) { - this.getProducerConnectionList = getProducerConnectionList; - } - - public boolean isGetConsumeStats() { - return getConsumeStats; - } - - public void setGetConsumeStats(boolean getConsumeStats) { - this.getConsumeStats = getConsumeStats; - } - - public boolean isGetAllConsumerOffset() { - return getAllConsumerOffset; - } - - public void setGetAllConsumerOffset(boolean getAllConsumerOffset) { - this.getAllConsumerOffset = getAllConsumerOffset; - } - - public boolean isGetAllDelayOffset() { - return getAllDelayOffset; - } - - public void setGetAllDelayOffset(boolean getAllDelayOffset) { - this.getAllDelayOffset = getAllDelayOffset; - } - - public boolean isInvokeBrokerToresetOffset() { - return invokeBrokerToresetOffset; - } - - public void setInvokeBrokerToresetOffset(boolean invokeBrokerToresetOffset) { - this.invokeBrokerToresetOffset = invokeBrokerToresetOffset; - } - - public boolean isQueryTopicConsumeByWho() { - return queryTopicConsumeByWho; - } - - public void setQueryTopicConsumeByWho(boolean queryTopicConsumeByWho) { - this.queryTopicConsumeByWho = queryTopicConsumeByWho; - } - - public boolean isRegisterFilterServer() { - return registerFilterServer; - } - - public void setRegisterFilterServer(boolean registerFilterServer) { - this.registerFilterServer = registerFilterServer; - } - - public boolean isQueryConsumeTimeSpan() { - return queryConsumeTimeSpan; - } - - public void setQueryConsumeTimeSpan(boolean queryConsumeTimeSpan) { - this.queryConsumeTimeSpan = queryConsumeTimeSpan; - } - - public boolean isGetSystemTopicListFromBroker() { - return getSystemTopicListFromBroker; - } - - public void setGetSystemTopicListFromBroker(boolean getSystemTopicListFromBroker) { - this.getSystemTopicListFromBroker = getSystemTopicListFromBroker; - } - - public boolean isCleanExpiredConsumequeue() { - return cleanExpiredConsumequeue; - } - - public void setCleanExpiredConsumequeue(boolean cleanExpiredConsumequeue) { - this.cleanExpiredConsumequeue = cleanExpiredConsumequeue; - } - - public boolean isCleanUnusedTopic() { - return cleanUnusedTopic; - } - - public void setCleanUnusedTopic(boolean cleanUnusedTopic) { - this.cleanUnusedTopic = cleanUnusedTopic; - } - - public boolean isGetConsumerRunningInfo() { - return getConsumerRunningInfo; - } - - public void setGetConsumerRunningInfo(boolean getConsumerRunningInfo) { - this.getConsumerRunningInfo = getConsumerRunningInfo; - } - - public boolean isQueryCorrectionOffset() { - return queryCorrectionOffset; - } - - public void setQueryCorrectionOffset(boolean queryCorrectionOffset) { - this.queryCorrectionOffset = queryCorrectionOffset; - } - - public boolean isConsumeMessageDirectly() { - return consumeMessageDirectly; - } - - public void setConsumeMessageDirectly(boolean consumeMessageDirectly) { - this.consumeMessageDirectly = consumeMessageDirectly; - } - - public boolean isCloneGroupOffset() { - return cloneGroupOffset; - } - - public void setCloneGroupOffset(boolean cloneGroupOffset) { - this.cloneGroupOffset = cloneGroupOffset; - } - - public boolean isViewBrokerStatsData() { - return viewBrokerStatsData; - } - - public void setViewBrokerStatsData(boolean viewBrokerStatsData) { - this.viewBrokerStatsData = viewBrokerStatsData; - } - - public boolean isGetBrokerConsumeStats() { - return getBrokerConsumeStats; - } - - public void setGetBrokerConsumeStats(boolean getBrokerConsumeStats) { - this.getBrokerConsumeStats = getBrokerConsumeStats; - } - - public boolean isQueryConsumeQueue() { - return queryConsumeQueue; - } - - public void setQueryConsumeQueue(boolean queryConsumeQueue) { - this.queryConsumeQueue = queryConsumeQueue; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("BorkerAccessControl [permitSendTopic=").append(permitSendTopic).append(", noPermitSendTopic=") - .append(noPermitSendTopic).append(", permitPullTopic=").append(permitPullTopic) - .append(", noPermitPullTopic=").append(noPermitPullTopic); - if (!!sendMessage) - builder.append(", sendMessage=").append(sendMessage); - if (!!sendMessageV2) - builder.append(", sendMessageV2=").append(sendMessageV2); - if (!sendBatchMessage) - builder.append(", sendBatchMessage=").append(sendBatchMessage); - if (!consumerSendMsgBack) - builder.append(", consumerSendMsgBack=").append(consumerSendMsgBack); - if (!pullMessage) - builder.append(", pullMessage=").append(pullMessage); - if (!queryMessage) - builder.append(", queryMessage=").append(queryMessage); - if (!viewMessageById) - builder.append(", viewMessageById=").append(viewMessageById); - if (!heartBeat) - builder.append(", heartBeat=").append(heartBeat); - if (!unregisterClient) - builder.append(", unregisterClient=").append(unregisterClient); - if (!checkClientConfig) - builder.append(", checkClientConfig=").append(checkClientConfig); - if (!getConsumerListByGroup) - builder.append(", getConsumerListByGroup=").append(getConsumerListByGroup); - if (!updateConsumerOffset) - builder.append(", updateConsumerOffset=").append(updateConsumerOffset); - if (!queryConsumerOffset) - builder.append(", queryConsumerOffset=").append(queryConsumerOffset); - if (!endTransaction) - builder.append(", endTransaction=").append(endTransaction); - if (!updateAndCreateTopic) - builder.append(", updateAndCreateTopic=").append(updateAndCreateTopic); - if (!deleteTopicInbroker) - builder.append(", deleteTopicInbroker=").append(deleteTopicInbroker); - if (!getAllTopicConfig) - builder.append(", getAllTopicConfig=").append(getAllTopicConfig); - if (!updateBrokerConfig) - builder.append(", updateBrokerConfig=").append(updateBrokerConfig); - if (!getBrokerConfig) - builder.append(", getBrokerConfig=").append(getBrokerConfig); - if (!searchOffsetByTimestamp) - builder.append(", searchOffsetByTimestamp=").append(searchOffsetByTimestamp); - if (!getMaxOffset) - builder.append(", getMaxOffset=").append(getMaxOffset); - if (!getMinOffset) - builder.append(", getMixOffset=").append(getMinOffset); - if (!getEarliestMsgStoretime) - builder.append(", getEarliestMsgStoretime=").append(getEarliestMsgStoretime); - if (!getBrokerRuntimeInfo) - builder.append(", getBrokerRuntimeInfo=").append(getBrokerRuntimeInfo); - if (!lockBatchMQ) - builder.append(", lockBatchMQ=").append(lockBatchMQ); - if (!unlockBatchMQ) - builder.append(", unlockBatchMQ=").append(unlockBatchMQ); - if (!updateAndCreateSubscriptiongroup) - builder.append(", updateAndCreateSubscriptiongroup=").append(updateAndCreateSubscriptiongroup); - if (!getAllSubscriptiongroupConfig) - builder.append(", getAllSubscriptiongroupConfig=").append(getAllSubscriptiongroupConfig); - if (!deleteSubscriptiongroup) - builder.append(", deleteSubscriptiongroup=").append(deleteSubscriptiongroup); - if (!getTopicStatsInfo) - builder.append(", getTopicStatsInfo=").append(getTopicStatsInfo); - if (!getConsumerConnectionList) - builder.append(", getConsumerConnectionList=").append(getConsumerConnectionList); - if (!getProducerConnectionList) - builder.append(", getProducerConnectionList=").append(getProducerConnectionList); - if (!getConsumeStats) - builder.append(", getConsumeStats=").append(getConsumeStats); - if (!getAllConsumerOffset) - builder.append(", getAllConsumerOffset=").append(getAllConsumerOffset); - if (!getAllDelayOffset) - builder.append(", getAllDelayOffset=").append(getAllDelayOffset); - if (!invokeBrokerToresetOffset) - builder.append(", invokeBrokerToresetOffset=").append(invokeBrokerToresetOffset); - if (!queryTopicConsumeByWho) - builder.append(", queryTopicConsumeByWho=").append(queryTopicConsumeByWho); - if (!registerFilterServer) - builder.append(", registerFilterServer=").append(registerFilterServer); - if (!queryConsumeTimeSpan) - builder.append(", queryConsumeTimeSpan=").append(queryConsumeTimeSpan); - if (!getSystemTopicListFromBroker) - builder.append(", getSystemTopicListFromBroker=").append(getSystemTopicListFromBroker); - if (!cleanExpiredConsumequeue) - builder.append(", cleanExpiredConsumequeue=").append(cleanExpiredConsumequeue); - if (!getConsumerRunningInfo) - builder.append(", cleanUnusedTopic=").append(getConsumerRunningInfo); - if (!getConsumerRunningInfo) - builder.append(", getConsumerRunningInfo=").append(getConsumerRunningInfo); - if (!queryCorrectionOffset) - builder.append(", queryCorrectionOffset=").append(queryCorrectionOffset); - if (!consumeMessageDirectly) - builder.append(", consumeMessageDirectly=").append(consumeMessageDirectly); - if (!cloneGroupOffset) - builder.append(", cloneGroupOffset=").append(cloneGroupOffset); - if (!viewBrokerStatsData) - builder.append(", viewBrokerStatsData=").append(viewBrokerStatsData); - if (!getBrokerConsumeStats) - builder.append(", getBrokerConsumeStats=").append(getBrokerConsumeStats); - if (!queryConsumeQueue) - builder.append(", queryConsumeQueue=").append(queryConsumeQueue); - builder.append("]"); - return builder.toString(); - } - -} diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java index eeebfff7a2..74d7526fb0 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java @@ -23,34 +23,56 @@ import org.apache.rocketmq.acl.AccessResource; import org.apache.rocketmq.common.MixAll; public class PlainAccessResource implements AccessResource { + //identify the user private String accessKey; - private String signature; - //the content to calculate the content - private byte[] content; + private String secretKey; - private String secretToken; + private String whiteRemoteAddress; - private Map resourcePermMap = new HashMap<>(); + private boolean admin; - private String remoteAddr; + private byte defaultTopicPerm = 1; - private String recognition; + private byte defaultGroupPerm = 1; + + private Map resourcePermMap; + + private RemoteAddressStrategy remoteAddressStrategy; private int requestCode; + //the content to calculate the content + private byte[] content; - @Deprecated - private String topic; + private String signature; + + private String secretToken; + + private String recognition; public PlainAccessResource() { } + public static boolean isRetryTopic(String topic) { + return (null != topic && topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)); + } + + public static String getRetryTopic(String group) { + if (group == null) { + return null; + } + return MixAll.getRetryTopic(group); + } + public void addResourceAndPerm(String resource, byte perm) { if (resource == null) { return; } + if (resourcePermMap == null) { + resourcePermMap = new HashMap<>(); + } resourcePermMap.put(resource, perm); } @@ -62,20 +84,48 @@ public class PlainAccessResource implements AccessResource { this.accessKey = accessKey; } - public String getSignature() { - return signature; + public String getSecretKey() { + return secretKey; } - public void setSignature(String signature) { - this.signature = signature; + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; } - public String getRemoteAddr() { - return remoteAddr; + public String getWhiteRemoteAddress() { + return whiteRemoteAddress; } - public void setRemoteAddr(String remoteAddr) { - this.remoteAddr = remoteAddr; + public void setWhiteRemoteAddress(String whiteRemoteAddress) { + this.whiteRemoteAddress = whiteRemoteAddress; + } + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public byte getDefaultTopicPerm() { + return defaultTopicPerm; + } + + public void setDefaultTopicPerm(byte defaultTopicPerm) { + this.defaultTopicPerm = defaultTopicPerm; + } + + public byte getDefaultGroupPerm() { + return defaultGroupPerm; + } + + public void setDefaultGroupPerm(byte defaultGroupPerm) { + this.defaultGroupPerm = defaultGroupPerm; + } + + public Map getResourcePermMap() { + return resourcePermMap; } public String getRecognition() { @@ -94,14 +144,6 @@ public class PlainAccessResource implements AccessResource { this.requestCode = requestCode; } - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - public String getSecretToken() { return secretToken; } @@ -110,23 +152,27 @@ public class PlainAccessResource implements AccessResource { this.secretToken = secretToken; } + public RemoteAddressStrategy getRemoteAddressStrategy() { + return remoteAddressStrategy; + } + + public void setRemoteAddressStrategy(RemoteAddressStrategy remoteAddressStrategy) { + this.remoteAddressStrategy = remoteAddressStrategy; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); } - - public static boolean isRetryTopic(String topic) { - return (null != topic && topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)); - } - - public static String getRetryTopic(String group) { - if (group == null) { - return null; - } - return MixAll.getRetryTopic(group); - } - public byte[] getContent() { return content; } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java index 57ece5271b..150ccca26f 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java @@ -21,8 +21,8 @@ import java.util.SortedMap; import java.util.TreeMap; import org.apache.rocketmq.acl.AccessResource; import org.apache.rocketmq.acl.AccessValidator; -import org.apache.rocketmq.acl.common.AclUtils; import org.apache.rocketmq.acl.common.AclException; +import org.apache.rocketmq.acl.common.AclUtils; import org.apache.rocketmq.acl.common.Permission; import org.apache.rocketmq.acl.common.SessionCredentials; import org.apache.rocketmq.common.protocol.RequestCode; @@ -47,7 +47,7 @@ public class PlainAccessValidator implements AccessValidator { @Override public AccessResource parse(RemotingCommand request, String remoteAddr) { PlainAccessResource accessResource = new PlainAccessResource(); - accessResource.setRemoteAddr(remoteAddr); + accessResource.setWhiteRemoteAddress(remoteAddr); accessResource.setRequestCode(request.getCode()); accessResource.setAccessKey(request.getExtFields().get(SessionCredentials.AccessKey)); accessResource.setSignature(request.getExtFields().get(SessionCredentials.Signature)); @@ -77,7 +77,7 @@ public class PlainAccessValidator implements AccessValidator { HeartbeatData heartbeatData = HeartbeatData.decode(request.getBody(), HeartbeatData.class); for (ConsumerData data : heartbeatData.getConsumerDataSet()) { accessResource.addResourceAndPerm(getRetryTopic(data.getGroupName()), Permission.SUB); - for (SubscriptionData subscriptionData: data.getSubscriptionDataSet()) { + for (SubscriptionData subscriptionData : data.getSubscriptionDataSet()) { accessResource.addResourceAndPerm(subscriptionData.getTopic(), Permission.SUB); } } @@ -106,10 +106,8 @@ public class PlainAccessValidator implements AccessValidator { } } catch (Throwable t) { - throw new AclException(t.getMessage(), -1, t); + throw new AclException(t.getMessage(), t); } - - // content SortedMap map = new TreeMap(); for (Map.Entry entry : request.getExtFields().entrySet()) { @@ -118,26 +116,12 @@ public class PlainAccessValidator implements AccessValidator { } } accessResource.setContent(AclUtils.combineRequestContent(request, map)); - return accessResource; } @Override public void validate(AccessResource accessResource) { - AuthenticationResult authenticationResult = null; - try { - authenticationResult = aclPlugEngine.eachCheckAuthentication((PlainAccessResource) accessResource); - if (authenticationResult.isSucceed()) - return; - } catch (Exception e) { - throw new AclPlugRuntimeException(String.format("validate exception AccessResource data %s", accessResource.toString()), e); - } - if (authenticationResult.getException() != null) { - throw new AclPlugRuntimeException(String.format("eachCheck the inspection appear exception, accessControl data is %s", accessResource.toString()), authenticationResult.getException()); - } - if (authenticationResult.getPlainAccessResource() != null || !authenticationResult.isSucceed()) { - throw new AclPlugRuntimeException(String.format("%s accessControl data is %s", authenticationResult.getResultString(), accessResource.toString())); - } + aclPlugEngine.eachCheckPlainAccessResource((PlainAccessResource) accessResource); } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 0ef0137464..7d40f877e7 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -16,8 +16,9 @@ */ package org.apache.rocketmq.acl.plain; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import java.io.IOException; -import java.lang.reflect.Field; import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.Paths; @@ -32,11 +33,12 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.common.AclException; import org.apache.rocketmq.acl.common.AclUtils; +import org.apache.rocketmq.acl.common.Permission; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.ServiceThread; import org.apache.rocketmq.common.constant.LoggerName; -import org.apache.rocketmq.common.protocol.RequestCode; import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.logging.InternalLoggerFactory; @@ -47,16 +49,15 @@ public class PlainPermissionLoader { private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - private Map> accessControlMap = new HashMap<>(); + private String fileName = System.getProperty("romcketmq.acl.plain.fileName", "/conf/transport.yml"); - private AuthenticationInfo authenticationInfo; + private Map> plainAccessResourceMap = new HashMap<>(); + + private List globalWhiteRemoteAddressStrategy = new ArrayList<>(); private RemoteAddressStrategyFactory remoteAddressStrategyFactory = new RemoteAddressStrategyFactory(); - private AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - - private Class accessContralAnalysisClass = RequestCode.class; - private boolean isWatchStart; public PlainPermissionLoader() { @@ -65,13 +66,26 @@ public class PlainPermissionLoader { } public void initialize() { - BrokerAccessControlTransport accessControlTransport = AclUtils.getYamlDataObject(fileHome + "/conf/transport.yml", BrokerAccessControlTransport.class); - if (accessControlTransport == null) { - throw new AclPlugRuntimeException("transport.yml file is no data"); + JSONObject accessControlTransport = AclUtils.getYamlDataObject(fileHome + fileName, + JSONObject.class); + + if (accessControlTransport == null || accessControlTransport.isEmpty()) { + throw new AclException("transport.yml file is not data"); } log.info("BorkerAccessControlTransport data is : ", accessControlTransport.toString()); - accessContralAnalysis.analysisClass(accessContralAnalysisClass); - setBrokerAccessControlTransport(accessControlTransport); + JSONArray globalWhiteRemoteAddressesList = accessControlTransport.getJSONArray("globalWhiteRemoteAddresses"); + if (globalWhiteRemoteAddressesList != null && !globalWhiteRemoteAddressesList.isEmpty()) { + for (int i = 0; i < globalWhiteRemoteAddressesList.size(); i++) { + setGlobalWhite(globalWhiteRemoteAddressesList.getString(i)); + } + } + + JSONArray accounts = accessControlTransport.getJSONArray("accounts"); + if (accounts != null && !accounts.isEmpty()) { + for (int i = 0; i < accounts.size(); i++) { + this.setPlainAccessResource(getPlainAccessResource(accounts.getJSONObject(i))); + } + } } private void watch() { @@ -95,8 +109,9 @@ public class PlainPermissionLoader { WatchKey watchKey = watcher.take(); List> watchEvents = watchKey.pollEvents(); for (WatchEvent event : watchEvents) { - if ("transport.yml".equals(event.context().toString()) && - (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { + if ("transport.yml".equals(event.context().toString()) + && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) + || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { log.info("transprot.yml make a difference change is : ", event.toString()); PlainPermissionLoader.this.cleanAuthenticationInfo(); initialize(); @@ -124,234 +139,115 @@ public class PlainPermissionLoader { } } - private void handleAccessControl(PlainAccessResource plainAccessResource) { - if (plainAccessResource instanceof BrokerAccessControl) { - BrokerAccessControl brokerAccessControl = (BrokerAccessControl) plainAccessResource; - if (brokerAccessControl.isAdmin()) { - brokerAccessControl.setUpdateAndCreateSubscriptiongroup(true); - brokerAccessControl.setDeleteSubscriptiongroup(true); - brokerAccessControl.setUpdateAndCreateTopic(true); - brokerAccessControl.setDeleteTopicInbroker(true); - brokerAccessControl.setUpdateBrokerConfig(true); + PlainAccessResource getPlainAccessResource(JSONObject account) { + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setAccessKey(account.getString("accessKey")); + plainAccessResource.setSecretKey(account.getString("secretKey")); + plainAccessResource.setWhiteRemoteAddress(account.getString("whiteRemoteAddress")); + + plainAccessResource.setAdmin(account.containsKey("admin") ? account.getBoolean("admin") : false); + + plainAccessResource.setDefaultGroupPerm(Permission.fromStringGetPermission(account.getString("defaultGroupPerm"))); + plainAccessResource.setDefaultTopicPerm(Permission.fromStringGetPermission(account.getString("defaultTopicPerm"))); + + Permission.setTopicPerm(plainAccessResource, true, account.getJSONArray("groups")); + Permission.setTopicPerm(plainAccessResource, true, account.getJSONArray("topics")); + return plainAccessResource; + } + + void checkPerm(PlainAccessResource needCheckplainAccessResource, PlainAccessResource plainAccessResource) { + if (!plainAccessResource.isAdmin() && Permission.checkAdminCode(needCheckplainAccessResource.getRequestCode())) { + throw new AclException(String.format("accessKey is %s remoteAddress is %s , is not admin Premission . RequestCode is %d", plainAccessResource.getAccessKey(), plainAccessResource.getWhiteRemoteAddress(), needCheckplainAccessResource.getRequestCode())); + } + Map needCheckTopicAndGourpPerm = needCheckplainAccessResource.getResourcePermMap(); + Map topicAndGourpPerm = plainAccessResource.getResourcePermMap(); + + Iterator> it = topicAndGourpPerm.entrySet().iterator(); + Byte perm; + while (it.hasNext()) { + Entry e = it.next(); + if ((perm = needCheckTopicAndGourpPerm.get(e.getKey())) != null && Permission.checkPermission(perm, e.getValue())) { + continue; + } + byte neededPerm = PlainAccessResource.isRetryTopic(e.getKey()) ? needCheckplainAccessResource.getDefaultGroupPerm() : + needCheckplainAccessResource.getDefaultTopicPerm(); + if (!Permission.checkPermission(neededPerm, e.getValue())) { + throw new AclException(String.format("", e.toString())); } } } void cleanAuthenticationInfo() { - accessControlMap.clear(); - authenticationInfo = null; + this.plainAccessResourceMap.clear(); + this.globalWhiteRemoteAddressStrategy.clear(); } - public void setAccessControl(PlainAccessResource plainAccessResource) throws AclPlugRuntimeException { - if (plainAccessResource.getAccessKey() == null || plainAccessResource.getSignature() == null - || plainAccessResource.getAccessKey().length() <= 6 || plainAccessResource.getSignature().length() <= 6) { - throw new AclPlugRuntimeException(String.format( + public void setPlainAccessResource(PlainAccessResource plainAccessResource) throws AclException { + if (plainAccessResource.getAccessKey() == null || plainAccessResource.getSecretKey() == null + || plainAccessResource.getAccessKey().length() <= 6 + || plainAccessResource.getSecretKey().length() <= 6) { + throw new AclException(String.format( "The account password cannot be null and is longer than 6, account is %s password is %s", - plainAccessResource.getAccessKey(), plainAccessResource.getSignature())); + plainAccessResource.getAccessKey(), plainAccessResource.getSecretKey())); } try { - handleAccessControl(plainAccessResource); - RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - List accessControlAddressList = accessControlMap.get(plainAccessResource.getAccessKey()); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory + .getNetaddressStrategy(plainAccessResource); + List accessControlAddressList = plainAccessResourceMap.get(plainAccessResource.getAccessKey()); if (accessControlAddressList == null) { accessControlAddressList = new ArrayList<>(); - accessControlMap.put(plainAccessResource.getAccessKey(), accessControlAddressList); + plainAccessResourceMap.put(plainAccessResource.getAccessKey(), accessControlAddressList); } - AuthenticationInfo authenticationInfo = new AuthenticationInfo( - accessContralAnalysis.analysis(plainAccessResource), plainAccessResource, remoteAddressStrategy); - accessControlAddressList.add(authenticationInfo); - log.info("authenticationInfo is {}", authenticationInfo.toString()); + plainAccessResource.setRemoteAddressStrategy(remoteAddressStrategy); + + accessControlAddressList.add(plainAccessResource); + log.info("authenticationInfo is {}", plainAccessResource.toString()); } catch (Exception e) { - throw new AclPlugRuntimeException( + throw new AclException( String.format("Exception info %s %s", e.getMessage(), plainAccessResource.toString()), e); } } - public void setAccessControlList(List plainAccessResourceList) throws AclPlugRuntimeException { - for (PlainAccessResource plainAccessResource : plainAccessResourceList) { - setAccessControl(plainAccessResource); - } + private void setGlobalWhite(String remoteAddresses) { + globalWhiteRemoteAddressStrategy.add(remoteAddressStrategyFactory.getNetaddressStrategy(remoteAddresses)); } - public void setNetaddressAccessControl(PlainAccessResource plainAccessResource) throws AclPlugRuntimeException { - try { - authenticationInfo = new AuthenticationInfo(accessContralAnalysis.analysis(plainAccessResource), plainAccessResource, remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource)); - log.info("default authenticationInfo is {}", authenticationInfo.toString()); - } catch (Exception e) { - throw new AclPlugRuntimeException(plainAccessResource.toString(), e); - } + public void eachCheckPlainAccessResource(PlainAccessResource plainAccessResource) { - } - - public AuthenticationInfo getAccessControl(PlainAccessResource plainAccessResource) { - if (plainAccessResource.getAccessKey() == null && authenticationInfo != null) { - return authenticationInfo.getRemoteAddressStrategy().match(plainAccessResource) ? authenticationInfo : null; - } else { - List accessControlAddressList = accessControlMap.get(plainAccessResource.getAccessKey()); - if (accessControlAddressList != null) { - for (AuthenticationInfo ai : accessControlAddressList) { - if (ai.getRemoteAddressStrategy().match(plainAccessResource) && ai.getPlainAccessResource().getSignature().equals(plainAccessResource.getSignature())) { - return ai; - } + List plainAccessResourceAddressList = plainAccessResourceMap.get(plainAccessResource.getAccessKey()); + boolean isDistinguishAccessKey = false; + if (plainAccessResourceAddressList != null) { + for (PlainAccessResource plainAccess : plainAccessResourceAddressList) { + if (!plainAccess.getRemoteAddressStrategy().match(plainAccessResource)) { + isDistinguishAccessKey = true; + continue; + } + String signature = AclUtils.calSignature(plainAccessResource.getContent(), plainAccess.getSecretKey()); + if (signature.equals(plainAccessResource.getSignature())) { + checkPerm(plainAccess, plainAccessResource); + return; + } else { + throw new AclException(String.format("signature is erron. erron accessKe is %s , erron reomiteAddress %s", plainAccess.getAccessKey(), plainAccessResource.getWhiteRemoteAddress())); } } } - return null; - } - public AuthenticationResult eachCheckAuthentication(PlainAccessResource plainAccessResource) { - AuthenticationResult authenticationResult = new AuthenticationResult(); - AuthenticationInfo authenticationInfo = getAccessControl(plainAccessResource); - if (authenticationInfo != null) { - boolean boo = authentication(authenticationInfo, plainAccessResource, authenticationResult); - authenticationResult.setSucceed(boo); - authenticationResult.setPlainAccessResource(authenticationInfo.getPlainAccessResource()); + if (plainAccessResource.getAccessKey() == null && !globalWhiteRemoteAddressStrategy.isEmpty()) { + for (RemoteAddressStrategy remoteAddressStrategy : globalWhiteRemoteAddressStrategy) { + if (remoteAddressStrategy.match(plainAccessResource)) { + return; + } + } + } + if (isDistinguishAccessKey) { + throw new AclException(String.format("client ip not in WhiteRemoteAddress . erron accessKe is %s , erron reomiteAddress %s", plainAccessResource.getAccessKey(), plainAccessResource.getWhiteRemoteAddress())); } else { - authenticationResult.setResultString("plainAccessResource is null, Please check login, password, IP\""); + throw new AclException(String.format("It is not make Access and make client ip .erron accessKe is %s , erron reomiteAddress %s", plainAccessResource.getAccessKey(), plainAccessResource.getWhiteRemoteAddress())); } - return authenticationResult; - } - - void setBrokerAccessControlTransport(BrokerAccessControlTransport transport) { - if (transport.getOnlyNetAddress() == null && (transport.getList() == null || transport.getList().size() == 0)) { - throw new AclPlugRuntimeException("onlyNetAddress and list can't be all empty"); - } - - if (transport.getOnlyNetAddress() != null) { - this.setNetaddressAccessControl(transport.getOnlyNetAddress()); - } - if (transport.getList() != null || transport.getList().size() > 0) { - for (BrokerAccessControl accessControl : transport.getList()) { - this.setAccessControl(accessControl); - } - } - } - - public boolean authentication(AuthenticationInfo authenticationInfo, PlainAccessResource plainAccessResource, - AuthenticationResult authenticationResult) { - int code = plainAccessResource.getRequestCode(); - if (!authenticationInfo.getAuthority().get(code)) { - authenticationResult.setResultString(String.format("code is %d Authentication failed", code)); - return false; - } - if (!(authenticationInfo.getPlainAccessResource() instanceof BrokerAccessControl)) { - return true; - } - BrokerAccessControl borker = (BrokerAccessControl) authenticationInfo.getPlainAccessResource(); - String topicName = plainAccessResource.getTopic(); - if (code == 10 || code == 310 || code == 320) { - if (borker.getPermitSendTopic().contains(topicName)) { - return true; - } - if (borker.getNoPermitSendTopic().contains(topicName)) { - authenticationResult.setResultString(String.format("noPermitSendTopic include %s", topicName)); - return false; - } - return borker.getPermitSendTopic().isEmpty() ? true : false; - } else if (code == 11) { - if (borker.getPermitPullTopic().contains(topicName)) { - return true; - } - if (borker.getNoPermitPullTopic().contains(topicName)) { - authenticationResult.setResultString(String.format("noPermitPullTopic include %s", topicName)); - return false; - } - return borker.getPermitPullTopic().isEmpty() ? true : false; - } - return true; } public boolean isWatchStart() { return isWatchStart; } - public static class AccessContralAnalysis { - - private Map, Map> classTocodeAndMentod = new HashMap<>(); - - private Map fieldNameAndCode = new HashMap<>(); - - public void analysisClass(Class clazz) { - Field[] fields = clazz.getDeclaredFields(); - try { - for (Field field : fields) { - if (field.getType().equals(int.class)) { - String name = StringUtils.replace(field.getName(), "_", "").toLowerCase(); - fieldNameAndCode.put(name, (Integer) field.get(null)); - } - } - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugRuntimeException(String.format("analysis on failure Class is %s", clazz.getName()), e); - } - } - - public Map analysis(PlainAccessResource plainAccessResource) { - Class clazz = plainAccessResource.getClass(); - Map codeAndField = classTocodeAndMentod.get(clazz); - if (codeAndField == null) { - codeAndField = new HashMap<>(); - Field[] fields = clazz.getDeclaredFields(); - for (Field field : fields) { - if ("admin".equals(field.getName())) - continue; - if (!field.getType().equals(boolean.class)) - continue; - Integer code = fieldNameAndCode.get(field.getName().toLowerCase()); - if (code == null) { - throw new AclPlugRuntimeException( - String.format("field nonexistent in code fieldName is %s", field.getName())); - } - field.setAccessible(true); - codeAndField.put(code, field); - - } - if (codeAndField.isEmpty()) { - throw new AclPlugRuntimeException(String.format("PlainAccessResource nonexistent code , name %s", - plainAccessResource.getClass().getName())); - } - classTocodeAndMentod.put(clazz, codeAndField); - } - Iterator> it = codeAndField.entrySet().iterator(); - Map authority = new HashMap<>(); - try { - while (it.hasNext()) { - Entry e = it.next(); - authority.put(e.getKey(), (Boolean) e.getValue().get(plainAccessResource)); - } - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new AclPlugRuntimeException( - String.format("analysis on failure PlainAccessResource is %s", PlainAccessResource.class.getName()), e); - } - return authority; - } - - } - - public static class BrokerAccessControlTransport { - - private BrokerAccessControl onlyNetAddress; - - private List list; - - public BrokerAccessControl getOnlyNetAddress() { - return onlyNetAddress; - } - - public void setOnlyNetAddress(BrokerAccessControl onlyNetAddress) { - this.onlyNetAddress = onlyNetAddress; - } - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - - @Override - public String toString() { - return "BorkerAccessControlTransport [onlyNetAddress=" + onlyNetAddress + ", list=" + list + "]"; - } - } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java index fb07a49914..8015b6820d 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java @@ -19,6 +19,7 @@ package org.apache.rocketmq.acl.plain; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.common.AclException; import org.apache.rocketmq.acl.common.AclUtils; public class RemoteAddressStrategyFactory { @@ -26,7 +27,11 @@ public class RemoteAddressStrategyFactory { public static final NullRemoteAddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullRemoteAddressStrategy(); public RemoteAddressStrategy getNetaddressStrategy(PlainAccessResource plainAccessResource) { - String netaddress = plainAccessResource.getRemoteAddr(); + return getNetaddressStrategy(plainAccessResource.getWhiteRemoteAddress()); + + } + + public RemoteAddressStrategy getNetaddressStrategy(String netaddress) { if (StringUtils.isBlank(netaddress) || "*".equals(netaddress)) { return NULL_NET_ADDRESS_STRATEGY; } @@ -34,7 +39,7 @@ public class RemoteAddressStrategyFactory { String[] strArray = StringUtils.split(netaddress, "."); String four = strArray[3]; if (!four.startsWith("{")) { - throw new AclPlugRuntimeException(String.format("MultipleRemoteAddressStrategy netaddress examine scope Exception netaddress", netaddress)); + throw new AclException(String.format("MultipleRemoteAddressStrategy netaddress examine scope Exception netaddress", netaddress)); } return new MultipleRemoteAddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); } else if (AclUtils.isColon(netaddress)) { @@ -67,7 +72,7 @@ public class RemoteAddressStrategyFactory { @Override public boolean match(PlainAccessResource plainAccessResource) { - return multipleSet.contains(plainAccessResource.getRemoteAddr()); + return multipleSet.contains(plainAccessResource.getWhiteRemoteAddress()); } } @@ -83,7 +88,7 @@ public class RemoteAddressStrategyFactory { @Override public boolean match(PlainAccessResource plainAccessResource) { - return netaddress.equals(plainAccessResource.getRemoteAddr()); + return netaddress.equals(plainAccessResource.getWhiteRemoteAddress()); } } @@ -117,14 +122,14 @@ public class RemoteAddressStrategyFactory { setValue(0, 255); } else if (AclUtils.isMinus(value)) { if (value.indexOf("-") == 0) { - throw new AclPlugRuntimeException(String.format("RangeRemoteAddressStrategy netaddress examine scope Exception value %s ", value)); + throw new AclException(String.format("RangeRemoteAddressStrategy netaddress examine scope Exception value %s ", value)); } String[] valueArray = StringUtils.split(value, "-"); this.start = Integer.valueOf(valueArray[0]); this.end = Integer.valueOf(valueArray[1]); if (!(AclUtils.isScope(end) && AclUtils.isScope(start) && start <= end)) { - throw new AclPlugRuntimeException(String.format("RangeRemoteAddressStrategy netaddress examine scope Exception start is %s , end is %s", start, end)); + throw new AclException(String.format("RangeRemoteAddressStrategy netaddress examine scope Exception start is %s , end is %s", start, end)); } } return this.end > 0 ? true : false; @@ -137,7 +142,7 @@ public class RemoteAddressStrategyFactory { @Override public boolean match(PlainAccessResource plainAccessResource) { - String netAddress = plainAccessResource.getRemoteAddr(); + String netAddress = plainAccessResource.getWhiteRemoteAddress(); if (netAddress.startsWith(this.head)) { String value; if (index == 3) { diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/AclUtilsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java similarity index 90% rename from acl/src/test/java/org/apache/rocketmq/acl/plain/AclUtilsTest.java rename to acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java index bfb4bd5a7f..36af31f91f 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/AclUtilsTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.plain; +package org.apache.rocketmq.acl.common; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.acl.common.AclUtils; import org.junit.Assert; import org.junit.Test; @@ -125,7 +125,17 @@ public class AclUtilsTest { Assert.assertFalse(isMinus); } + @SuppressWarnings("unchecked") + @Test public void getYamlDataObjectTest() { + Map map = AclUtils.getYamlDataObject("src/test/resources/conf/transport.yml", Map.class); + Assert.assertFalse(map.isEmpty()); + } + + @Test(expected = Exception.class) + public void getYamlDataObjectExceptionTest() { + + AclUtils.getYamlDataObject("transport.yml", Map.class); } } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java new file mode 100644 index 0000000000..7678e4b27c --- /dev/null +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common; + +import com.alibaba.fastjson.JSONArray; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.apache.rocketmq.acl.plain.PlainAccessResource; +import org.junit.Assert; +import org.junit.Test; + +public class PermissionTest { + + @Test + public void fromStringGetPermissionTest() { + byte perm = Permission.fromStringGetPermission("PUB"); + Assert.assertEquals(perm, Permission.PUB); + + perm = Permission.fromStringGetPermission("SUB"); + Assert.assertEquals(perm, Permission.SUB); + + perm = Permission.fromStringGetPermission("ANY"); + Assert.assertEquals(perm, Permission.ANY); + + perm = Permission.fromStringGetPermission("PUB|SUB"); + Assert.assertEquals(perm, Permission.ANY); + + perm = Permission.fromStringGetPermission("SUB|PUB"); + Assert.assertEquals(perm, Permission.ANY); + + perm = Permission.fromStringGetPermission("DENY"); + Assert.assertEquals(perm, Permission.DENY); + + perm = Permission.fromStringGetPermission("1"); + Assert.assertEquals(perm, Permission.DENY); + + perm = Permission.fromStringGetPermission(null); + Assert.assertEquals(perm, Permission.DENY); + + } + + @Test + public void checkPermissionTest() { + boolean boo = Permission.checkPermission(Permission.DENY, Permission.DENY); + Assert.assertFalse(boo); + + boo = Permission.checkPermission(Permission.PUB, Permission.PUB); + Assert.assertTrue(boo); + + boo = Permission.checkPermission(Permission.SUB, Permission.SUB); + Assert.assertTrue(boo); + + boo = Permission.checkPermission(Permission.ANY, Permission.ANY); + Assert.assertFalse(boo); + + boo = Permission.checkPermission(Permission.ANY, Permission.SUB); + Assert.assertTrue(boo); + + boo = Permission.checkPermission(Permission.ANY, Permission.PUB); + Assert.assertTrue(boo); + + boo = Permission.checkPermission(Permission.DENY, Permission.ANY); + Assert.assertFalse(boo); + + boo = Permission.checkPermission(Permission.DENY, Permission.PUB); + Assert.assertFalse(boo); + + boo = Permission.checkPermission(Permission.DENY, Permission.SUB); + Assert.assertFalse(boo); + + } + + @Test(expected = AclException.class) + public void setTopicPermTest() { + PlainAccessResource plainAccessResource = new PlainAccessResource(); + Map resourcePermMap = plainAccessResource.getResourcePermMap(); + + Permission.setTopicPerm(plainAccessResource, false, null); + Assert.assertNull(resourcePermMap); + + JSONArray groups = new JSONArray(); + Permission.setTopicPerm(plainAccessResource, false, groups); + Assert.assertNull(resourcePermMap); + + groups.add("groupA=DENY"); + groups.add("groupB=PUB|SUB"); + groups.add("groupC=PUB"); + Permission.setTopicPerm(plainAccessResource, false, groups); + resourcePermMap = plainAccessResource.getResourcePermMap(); + + byte perm = resourcePermMap.get(PlainAccessResource.getRetryTopic("groupA")); + Assert.assertEquals(perm, Permission.DENY); + + perm = resourcePermMap.get(PlainAccessResource.getRetryTopic("groupB")); + Assert.assertEquals(perm, Permission.ANY); + + perm = resourcePermMap.get(PlainAccessResource.getRetryTopic("groupC")); + Assert.assertEquals(perm, Permission.PUB); + + JSONArray topics = new JSONArray(); + topics.add("topicA=DENY"); + topics.add("topicB=PUB|SUB"); + topics.add("topicC=PUB"); + + Permission.setTopicPerm(plainAccessResource, true, topics); + + perm = resourcePermMap.get("topicA"); + Assert.assertEquals(perm, Permission.DENY); + + perm = resourcePermMap.get("topicB"); + Assert.assertEquals(perm, Permission.ANY); + + perm = resourcePermMap.get("topicC"); + Assert.assertEquals(perm, Permission.PUB); + + JSONArray erron = new JSONArray(); + erron.add(""); + Permission.setTopicPerm(plainAccessResource, false, erron); + } + + @Test + public void checkAdminCodeTest() { + Set code = new HashSet<>(); + code.add(17); + code.add(25); + code.add(215); + code.add(200); + code.add(207); + + for (int i = 0; i < 400; i++) { + boolean boo = Permission.checkAdminCode(i); + if (boo) { + Assert.assertTrue(code.contains(i)); + } + } + } +} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java new file mode 100644 index 0000000000..83e98708b6 --- /dev/null +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; + +import java.nio.ByteBuffer; +import org.apache.rocketmq.acl.common.AclClientRPCHook; +import org.apache.rocketmq.acl.common.AclUtils; +import org.apache.rocketmq.acl.common.SessionCredentials; +import org.apache.rocketmq.common.protocol.RequestCode; +import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PlainAccessValidatorTest { + + PlainAccessValidator plainAccessValidator; + + @Before + public void init() { + System.setProperty("rocketmq.home.dir", "src/test/resources"); + plainAccessValidator = new PlainAccessValidator(); + } + + @Test + public void contentTest() { + SessionCredentials sessionCredentials = new SessionCredentials(); + sessionCredentials.setAccessKey("RocketMQ"); + sessionCredentials.setSecretKey("12345678"); + sessionCredentials.setSecurityToken("87654321"); + AclClientRPCHook aclClient = new AclClientRPCHook(sessionCredentials); + + SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); + messageRequestHeader.setTopic("topicA"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE, messageRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "127.0.0.1"); + String signature = AclUtils.calSignature(accessResource.getContent(), sessionCredentials.getSecretKey()); + + Assert.assertEquals(accessResource.getSignature(), signature); + + } + + @Test + public void validateTest() { + SessionCredentials sessionCredentials = new SessionCredentials(); + sessionCredentials.setAccessKey("RocketMQ"); + sessionCredentials.setSecretKey("12345678"); + sessionCredentials.setSecurityToken("87654321"); + AclClientRPCHook aclClient = new AclClientRPCHook(sessionCredentials); + + SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); + messageRequestHeader.setTopic("topicA"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE, messageRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1"); + plainAccessValidator.validate(accessResource); + } +} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java deleted file mode 100644 index 2010577490..0000000000 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAclPlugEngineTest.java +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import org.apache.rocketmq.acl.plain.PlainPermissionLoader.AccessContralAnalysis; -import org.apache.rocketmq.acl.plain.PlainPermissionLoader.BrokerAccessControlTransport; -import org.apache.rocketmq.common.protocol.RequestCode; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class PlainAclPlugEngineTest { - - PlainPermissionLoader plainPermissionLoader; - - AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - - PlainAccessResource plainAccessResource; - - PlainAccessResource plainAccessResourceTwo; - - AuthenticationInfo authenticationInfo; - - BrokerAccessControl brokerAccessControl; - - Set adminCode = new HashSet<>(); - - @Before - public void init() throws NoSuchFieldException, SecurityException, IOException { - // UPDATE_AND_CREATE_TOPIC - adminCode.add(17); - // UPDATE_BROKER_CONFIG - adminCode.add(25); - // DELETE_TOPIC_IN_BROKER - adminCode.add(215); - // UPDATE_AND_CREATE_SUBSCRIPTIONGROUP - adminCode.add(200); - // DELETE_SUBSCRIPTIONGROUP - adminCode.add(207); - - accessContralAnalysis.analysisClass(RequestCode.class); - - brokerAccessControl = new BrokerAccessControl(); - // 321 - brokerAccessControl.setQueryConsumeQueue(false); - - Set permitSendTopic = new HashSet<>(); - permitSendTopic.add("permitSendTopic"); - brokerAccessControl.setPermitSendTopic(permitSendTopic); - - Set noPermitSendTopic = new HashSet<>(); - noPermitSendTopic.add("noPermitSendTopic"); - brokerAccessControl.setNoPermitSendTopic(noPermitSendTopic); - - Set permitPullTopic = new HashSet<>(); - permitPullTopic.add("permitPullTopic"); - brokerAccessControl.setPermitPullTopic(permitPullTopic); - - Set noPermitPullTopic = new HashSet<>(); - noPermitPullTopic.add("noPermitPullTopic"); - brokerAccessControl.setNoPermitPullTopic(noPermitPullTopic); - - AccessContralAnalysis accessContralAnalysis = new AccessContralAnalysis(); - accessContralAnalysis.analysisClass(RequestCode.class); - Map map = accessContralAnalysis.analysis(brokerAccessControl); - - authenticationInfo = new AuthenticationInfo(map, brokerAccessControl, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); - - System.setProperty("rocketmq.home.dir", "src/test/resources"); - plainPermissionLoader = new PlainPermissionLoader(); - - plainAccessResource = new BrokerAccessControl(); - plainAccessResource.setAccessKey("rokcetmq"); - plainAccessResource.setSignature("aliyun11"); - plainAccessResource.setRemoteAddr("127.0.0.1"); - plainAccessResource.setRecognition("127.0.0.1:1"); - - plainAccessResourceTwo = new BrokerAccessControl(); - plainAccessResourceTwo.setAccessKey("rokcet1"); - plainAccessResourceTwo.setSignature("aliyun1"); - plainAccessResourceTwo.setRemoteAddr("127.0.0.1"); - plainAccessResourceTwo.setRecognition("127.0.0.1:2"); - - } - - @Test(expected = AclPlugRuntimeException.class) - public void accountNullTest() { - plainAccessResource.setAccessKey(null); - plainPermissionLoader.setAccessControl(plainAccessResource); - } - - @Test(expected = AclPlugRuntimeException.class) - public void accountThanTest() { - plainAccessResource.setAccessKey("123"); - plainPermissionLoader.setAccessControl(plainAccessResource); - } - - @Test(expected = AclPlugRuntimeException.class) - public void passWordtNullTest() { - plainAccessResource.setAccessKey(null); - plainPermissionLoader.setAccessControl(plainAccessResource); - } - - @Test(expected = AclPlugRuntimeException.class) - public void passWordThanTest() { - plainAccessResource.setAccessKey("123"); - plainPermissionLoader.setAccessControl(plainAccessResource); - } - - @Test(expected = AclPlugRuntimeException.class) - public void testPlainAclPlugEngineInit() { - System.setProperty("rocketmq.home.dir", ""); - new PlainPermissionLoader().initialize(); - } - - @Test - public void authenticationInfoOfSetAccessControl() { - plainPermissionLoader.setAccessControl(plainAccessResource); - - AuthenticationInfo authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResource); - - PlainAccessResource getPlainAccessResource = authenticationInfo.getPlainAccessResource(); - Assert.assertEquals(plainAccessResource, getPlainAccessResource); - - PlainAccessResource testPlainAccessResource = new PlainAccessResource(); - testPlainAccessResource.setAccessKey("rokcetmq"); - testPlainAccessResource.setSignature("aliyun11"); - testPlainAccessResource.setRemoteAddr("127.0.0.1"); - testPlainAccessResource.setRecognition("127.0.0.1:1"); - - testPlainAccessResource.setAccessKey("rokcetmq1"); - authenticationInfo = plainPermissionLoader.getAccessControl(testPlainAccessResource); - Assert.assertNull(authenticationInfo); - - testPlainAccessResource.setAccessKey("rokcetmq"); - testPlainAccessResource.setSignature("1234567"); - authenticationInfo = plainPermissionLoader.getAccessControl(testPlainAccessResource); - Assert.assertNull(authenticationInfo); - - testPlainAccessResource.setRemoteAddr("127.0.0.2"); - authenticationInfo = plainPermissionLoader.getAccessControl(testPlainAccessResource); - Assert.assertNull(authenticationInfo); - } - - @Test - public void setAccessControlList() { - List plainAccessResourceList = new ArrayList<>(); - plainAccessResourceList.add(plainAccessResource); - - plainAccessResourceList.add(plainAccessResourceTwo); - - plainPermissionLoader.setAccessControlList(plainAccessResourceList); - - AuthenticationInfo newAccessControl = plainPermissionLoader.getAccessControl(plainAccessResource); - Assert.assertEquals(plainAccessResource, newAccessControl.getPlainAccessResource()); - - newAccessControl = plainPermissionLoader.getAccessControl(plainAccessResourceTwo); - Assert.assertEquals(plainAccessResourceTwo, newAccessControl.getPlainAccessResource()); - - } - - @Test - public void setNetaddressAccessControl() { - PlainAccessResource plainAccessResource = new BrokerAccessControl(); - plainAccessResource.setAccessKey("RocketMQ"); - plainAccessResource.setSignature("RocketMQ"); - plainAccessResource.setRemoteAddr("127.0.0.1"); - plainPermissionLoader.setAccessControl(plainAccessResource); - plainPermissionLoader.setNetaddressAccessControl(plainAccessResource); - - AuthenticationInfo authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResource); - - PlainAccessResource getPlainAccessResource = authenticationInfo.getPlainAccessResource(); - Assert.assertEquals(plainAccessResource, getPlainAccessResource); - - plainAccessResource.setRemoteAddr("127.0.0.2"); - authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResource); - Assert.assertNull(authenticationInfo); - } - - public void eachCheckLoginAndAuthentication() { - - } - - @Test(expected = AclPlugRuntimeException.class) - public void BrokerAccessControlTransportTestNull() { - BrokerAccessControlTransport accessControlTransport = new BrokerAccessControlTransport(); - plainPermissionLoader.setBrokerAccessControlTransport(accessControlTransport); - } - - @Test - public void BrokerAccessControlTransportTest() { - BrokerAccessControlTransport accessControlTransport = new BrokerAccessControlTransport(); - List list = new ArrayList<>(); - list.add((BrokerAccessControl) this.plainAccessResourceTwo); - accessControlTransport.setOnlyNetAddress((BrokerAccessControl) this.plainAccessResource); - accessControlTransport.setList(list); - plainPermissionLoader.setBrokerAccessControlTransport(accessControlTransport); - - PlainAccessResource plainAccessResource = new BrokerAccessControl(); - plainAccessResource.setAccessKey("RocketMQ"); - plainAccessResource.setSignature("RocketMQ"); - plainAccessResource.setRemoteAddr("127.0.0.1"); - plainPermissionLoader.setAccessControl(plainAccessResource); - AuthenticationInfo authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResource); - Assert.assertNotNull(authenticationInfo.getPlainAccessResource()); - - authenticationInfo = plainPermissionLoader.getAccessControl(plainAccessResourceTwo); - Assert.assertEquals(plainAccessResourceTwo, authenticationInfo.getPlainAccessResource()); - - } - - @Test - public void authenticationTest() { - AuthenticationResult authenticationResult = new AuthenticationResult(); - plainAccessResource.setRequestCode(317); - - boolean isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertTrue(isReturn); - - plainAccessResource.setRequestCode(321); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertFalse(isReturn); - - plainAccessResource.setRequestCode(10); - plainAccessResource.setTopic("permitSendTopic"); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertTrue(isReturn); - - plainAccessResource.setRequestCode(310); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertTrue(isReturn); - - plainAccessResource.setRequestCode(320); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertTrue(isReturn); - - plainAccessResource.setTopic("noPermitSendTopic"); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertFalse(isReturn); - - plainAccessResource.setTopic("nopermitSendTopic"); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertFalse(isReturn); - - plainAccessResource.setRequestCode(11); - plainAccessResource.setTopic("permitPullTopic"); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertTrue(isReturn); - - plainAccessResource.setTopic("noPermitPullTopic"); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertFalse(isReturn); - - plainAccessResource.setTopic("nopermitPullTopic"); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertFalse(isReturn); - - } - - @Test - public void isEmptyTest() { - AuthenticationResult authenticationResult = new AuthenticationResult(); - plainAccessResource.setRequestCode(10); - plainAccessResource.setTopic("absentTopic"); - boolean isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertFalse(isReturn); - - Set permitSendTopic = new HashSet<>(); - brokerAccessControl.setPermitSendTopic(permitSendTopic); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertTrue(isReturn); - - plainAccessResource.setRequestCode(11); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertFalse(isReturn); - - brokerAccessControl.setPermitPullTopic(permitSendTopic); - isReturn = plainPermissionLoader.authentication(authenticationInfo, plainAccessResource, authenticationResult); - Assert.assertTrue(isReturn); - } - - @Test - public void adminBrokerAccessControlTest() { - BrokerAccessControl admin = new BrokerAccessControl(); - admin.setAccessKey("adminTest"); - admin.setSignature("adminTest"); - admin.setRemoteAddr("127.0.0.1"); - plainPermissionLoader.setAccessControl(admin); - Assert.assertFalse(admin.isUpdateAndCreateTopic()); - - admin.setAdmin(true); - plainPermissionLoader.setAccessControl(admin); - Assert.assertTrue(admin.isUpdateAndCreateTopic()); - } - - @Test - public void adminEachCheckAuthentication() { - BrokerAccessControl accessControl = new BrokerAccessControl(); - accessControl.setAccessKey("RocketMQ1"); - accessControl.setSignature("1234567"); - accessControl.setRemoteAddr("127.0.0.1"); - plainPermissionLoader.setAccessControl(accessControl); - for (Integer code : adminCode) { - accessControl.setRequestCode(code); - AuthenticationResult authenticationResult = plainPermissionLoader.eachCheckAuthentication(accessControl); - Assert.assertFalse(authenticationResult.isSucceed()); - - } - plainPermissionLoader.cleanAuthenticationInfo(); - accessControl.setAdmin(true); - plainPermissionLoader.setAccessControl(accessControl); - for (Integer code : adminCode) { - accessControl.setRequestCode(code); - AuthenticationResult authenticationResult = plainPermissionLoader.eachCheckAuthentication(accessControl); - Assert.assertTrue(authenticationResult.isSucceed()); - } - } - - @Test - public void cleanAuthenticationInfoTest() { - plainPermissionLoader.setAccessControl(plainAccessResource); - plainAccessResource.setRequestCode(202); - AuthenticationResult authenticationResult = plainPermissionLoader.eachCheckAuthentication(plainAccessResource); - Assert.assertTrue(authenticationResult.isSucceed()); - plainPermissionLoader.cleanAuthenticationInfo(); - authenticationResult = plainPermissionLoader.eachCheckAuthentication(plainAccessResource); - Assert.assertFalse(authenticationResult.isSucceed()); - } - - @Test - public void isWatchStartTest() { - PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); - Assert.assertTrue(plainPermissionLoader.isWatchStart()); - System.setProperty("java.version", "1.6.11"); - plainPermissionLoader = new PlainPermissionLoader(); - Assert.assertFalse(plainPermissionLoader.isWatchStart()); - } - - @Test - public void watchTest() throws IOException { - System.setProperty("rocketmq.home.dir", "src/test/resources/watch"); - File file = new File("src/test/resources/watch/conf"); - file.mkdirs(); - File transport = new File("src/test/resources/watch/conf/transport.yml"); - transport.createNewFile(); - - FileWriter writer = new FileWriter(transport); - writer.write("list:\r\n"); - writer.write("- account: rokcetmq\r\n"); - writer.write(" password: aliyun11\r\n"); - writer.write(" netaddress: 127.0.0.1\r\n"); - writer.flush(); - writer.close(); - PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); - plainAccessResource.setRequestCode(203); - AuthenticationResult authenticationResult = plainPermissionLoader.eachCheckAuthentication(plainAccessResource); - Assert.assertTrue(authenticationResult.isSucceed()); - - writer = new FileWriter(new File("src/test/resources/watch/conf/transport.yml"), true); - writer.write("- account: rokcet1\r\n"); - writer.write(" password: aliyun1\r\n"); - writer.write(" netaddress: 127.0.0.1\r\n"); - writer.flush(); - writer.close(); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - plainAccessResourceTwo.setRequestCode(203); - authenticationResult = plainPermissionLoader.eachCheckAuthentication(plainAccessResourceTwo); - Assert.assertTrue(authenticationResult.isSucceed()); - - transport.delete(); - file.delete(); - file = new File("src/test/resources/watch"); - file.delete(); - - } - - @Test - public void analysisTest() { - BrokerAccessControl accessControl = new BrokerAccessControl(); - accessControl.setSendMessage(false); - Map map = accessContralAnalysis.analysis(accessControl); - - Iterator> it = map.entrySet().iterator(); - long num = 0; - while (it.hasNext()) { - Entry e = it.next(); - if (!e.getValue()) { - if (adminCode.contains(e.getKey())) { - continue; - } - Assert.assertEquals(e.getKey(), Integer.valueOf(10)); - num++; - } - } - Assert.assertEquals(num, 1); - } - - @Test(expected = AclPlugRuntimeException.class) - public void analysisExceptionTest() { - PlainAccessResource plainAccessResource = new PlainAccessResource(); - accessContralAnalysis.analysis(plainAccessResource); - } -} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java new file mode 100644 index 0000000000..f1974a0904 --- /dev/null +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -0,0 +1,299 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.plain; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.rocketmq.acl.common.AclException; +import org.apache.rocketmq.acl.common.AclUtils; +import org.apache.rocketmq.acl.common.Permission; +import org.apache.rocketmq.common.MixAll; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({AclUtils.class}) +public class PlainPermissionLoaderTest { + + PlainPermissionLoader plainPermissionLoader; + PlainAccessResource PUBPlainAccessResource; + PlainAccessResource SUBPlainAccessResource; + PlainAccessResource ANYPlainAccessResource; + PlainAccessResource DENYPlainAccessResource; + PlainAccessResource plainAccessResource = new PlainAccessResource(); + PlainAccessResource plainAccessResourceTwo = new PlainAccessResource(); + Set adminCode = new HashSet<>(); + private String fileName = System.getProperty("romcketmq.acl.plain.fileName", "/conf/transport.yml"); + private Map> plainAccessResourceMap; + private List globalWhiteRemoteAddressStrategy; + + @Before + public void init() throws NoSuchFieldException, SecurityException, IOException { + // UPDATE_AND_CREATE_TOPIC + adminCode.add(17); + // UPDATE_BROKER_CONFIG + adminCode.add(25); + // DELETE_TOPIC_IN_BROKER + adminCode.add(215); + // UPDATE_AND_CREATE_SUBSCRIPTIONGROUP + adminCode.add(200); + // DELETE_SUBSCRIPTIONGROUP + adminCode.add(207); + + PUBPlainAccessResource = clonePlainAccessResource(Permission.PUB); + SUBPlainAccessResource = clonePlainAccessResource(Permission.SUB); + ANYPlainAccessResource = clonePlainAccessResource(Permission.ANY); + DENYPlainAccessResource = clonePlainAccessResource(Permission.DENY); + + System.setProperty("java.version", "1.6.11"); + System.setProperty("rocketmq.home.dir", "src/test/resources"); + plainPermissionLoader = new PlainPermissionLoader(); + + } + + public PlainAccessResource clonePlainAccessResource(byte perm) { + PlainAccessResource painAccessResource = new PlainAccessResource(); + painAccessResource.setAccessKey("RocketMQ"); + painAccessResource.setSecretKey("12345678"); + painAccessResource.setWhiteRemoteAddress("127.0." + perm + ".*"); + painAccessResource.setDefaultGroupPerm(perm); + painAccessResource.setDefaultTopicPerm(perm); + painAccessResource.addResourceAndPerm(PlainAccessResource.getRetryTopic("groupA"), Permission.PUB); + painAccessResource.addResourceAndPerm(PlainAccessResource.getRetryTopic("groupB"), Permission.SUB); + painAccessResource.addResourceAndPerm(PlainAccessResource.getRetryTopic("groupC"), Permission.ANY); + painAccessResource.addResourceAndPerm(PlainAccessResource.getRetryTopic("groupD"), Permission.DENY); + + painAccessResource.addResourceAndPerm("topicA", Permission.PUB); + painAccessResource.addResourceAndPerm("topicB", Permission.SUB); + painAccessResource.addResourceAndPerm("topicC", Permission.ANY); + painAccessResource.addResourceAndPerm("topicD", Permission.DENY); + return painAccessResource; + } + + @SuppressWarnings("unchecked") + private void getField(PlainPermissionLoader plainPermissionLoader) { + try { + this.globalWhiteRemoteAddressStrategy = (List) FieldUtils.readDeclaredField(plainPermissionLoader, "globalWhiteRemoteAddressStrategy", true); + this.plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + @Test(expected = AclException.class) + public void initializeTest() { + System.setProperty("romcketmq.acl.plain.fileName", "/conf/transport-null.yml"); + new PlainPermissionLoader(); + + } + + @Test + public void initializeIngetYamlDataObject() { + String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); + PowerMockito.mockStatic(AclUtils.class); + JSONObject json = new JSONObject(); + json.put("", ""); + PowerMockito.when(AclUtils.getYamlDataObject(fileHome + "/conf/transport.yml", JSONObject.class)).thenReturn(json); + PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); + getField(plainPermissionLoader); + Assert.assertTrue(globalWhiteRemoteAddressStrategy.isEmpty()); + Assert.assertTrue(plainAccessResourceMap.isEmpty()); + } + + @Test + public void getPlainAccessResourceTest() { + PlainAccessResource plainAccessResource = new PlainAccessResource(); + JSONObject account = new JSONObject(); + account.put("accessKey", "RocketMQ"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + Assert.assertEquals(plainAccessResource.getAccessKey(), "RocketMQ"); + + account.put("secretKey", "12345678"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + Assert.assertEquals(plainAccessResource.getSecretKey(), "12345678"); + + account.put("whiteRemoteAddress", "127.0.0.1"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + Assert.assertEquals(plainAccessResource.getWhiteRemoteAddress(), "127.0.0.1"); + + account.put("admin", true); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + Assert.assertEquals(plainAccessResource.isAdmin(), true); + + account.put("defaultGroupPerm", "ANY"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + Assert.assertEquals(plainAccessResource.getDefaultGroupPerm(), Permission.ANY); + + account.put("defaultTopicPerm", "ANY"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + Assert.assertEquals(plainAccessResource.getDefaultTopicPerm(), Permission.ANY); + + JSONArray groups = new JSONArray(); + groups.add("groupA=DENY"); + groups.add("groupB=PUB|SUB"); + groups.add("groupC=PUB"); + account.put("groups", groups); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + Map resourcePermMap = plainAccessResource.getResourcePermMap(); + Assert.assertEquals(resourcePermMap.size(), 3); + + Assert.assertEquals(resourcePermMap.get("groupA").byteValue(), Permission.DENY); + Assert.assertEquals(resourcePermMap.get("groupB").byteValue(), Permission.ANY); + Assert.assertEquals(resourcePermMap.get("groupC").byteValue(), Permission.PUB); + + JSONArray topics = new JSONArray(); + topics.add("topicA=DENY"); + topics.add("topicB=PUB|SUB"); + topics.add("topicC=PUB"); + account.put("topics", topics); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + resourcePermMap = plainAccessResource.getResourcePermMap(); + Assert.assertEquals(resourcePermMap.size(), 3); + + Assert.assertEquals(resourcePermMap.get("topicA").byteValue(), Permission.DENY); + Assert.assertEquals(resourcePermMap.get("topicB").byteValue(), Permission.ANY); + Assert.assertEquals(resourcePermMap.get("topicC").byteValue(), Permission.PUB); + } + + @Test(expected = AclException.class) + public void checkPermAdmin() { + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setRequestCode(17); + plainPermissionLoader.checkPerm(plainAccessResource, PUBPlainAccessResource); + } + + @Test + public void checkPerm() { + + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.addResourceAndPerm("pub", Permission.PUB); + plainPermissionLoader.checkPerm(PUBPlainAccessResource, plainAccessResource); + plainAccessResource.addResourceAndPerm("sub", Permission.SUB); + plainPermissionLoader.checkPerm(ANYPlainAccessResource, plainAccessResource); + + plainAccessResource = new PlainAccessResource(); + plainAccessResource.addResourceAndPerm("sub", Permission.SUB); + plainPermissionLoader.checkPerm(SUBPlainAccessResource, plainAccessResource); + plainAccessResource.addResourceAndPerm("pub", Permission.PUB); + plainPermissionLoader.checkPerm(ANYPlainAccessResource, plainAccessResource); + + } + + @Test(expected = AclException.class) + public void accountNullTest() { + plainAccessResource.setAccessKey(null); + plainPermissionLoader.setPlainAccessResource(plainAccessResource); + } + + @Test(expected = AclException.class) + public void accountThanTest() { + plainAccessResource.setAccessKey("123"); + plainPermissionLoader.setPlainAccessResource(plainAccessResource); + } + + @Test(expected = AclException.class) + public void passWordtNullTest() { + plainAccessResource.setAccessKey(null); + plainPermissionLoader.setPlainAccessResource(plainAccessResource); + } + + @Test(expected = AclException.class) + public void passWordThanTest() { + plainAccessResource.setAccessKey("123"); + plainPermissionLoader.setPlainAccessResource(plainAccessResource); + } + + @Test(expected = AclException.class) + public void testPlainAclPlugEngineInit() { + System.setProperty("rocketmq.home.dir", ""); + new PlainPermissionLoader().initialize(); + } + + @Test + public void cleanAuthenticationInfoTest() { + plainPermissionLoader.setPlainAccessResource(plainAccessResource); + plainAccessResource.setRequestCode(202); + plainPermissionLoader.eachCheckPlainAccessResource(plainAccessResource); + plainPermissionLoader.cleanAuthenticationInfo(); + plainPermissionLoader.eachCheckPlainAccessResource(plainAccessResource); + } + + @Test + public void isWatchStartTest() { + PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); + Assert.assertTrue(plainPermissionLoader.isWatchStart()); + System.setProperty("java.version", "1.6.11"); + plainPermissionLoader = new PlainPermissionLoader(); + Assert.assertFalse(plainPermissionLoader.isWatchStart()); + } + + @Test + public void watchTest() throws IOException { + System.setProperty("rocketmq.home.dir", "src/test/resources/watch"); + File file = new File("src/test/resources/watch/conf"); + file.mkdirs(); + File transport = new File("src/test/resources/watch/conf/transport.yml"); + transport.createNewFile(); + + FileWriter writer = new FileWriter(transport); + writer.write("list:\r\n"); + writer.write("- account: rokcetmq\r\n"); + writer.write(" password: aliyun11\r\n"); + writer.write(" netaddress: 127.0.0.1\r\n"); + writer.flush(); + writer.close(); + PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); + plainAccessResource.setRequestCode(203); + plainPermissionLoader.eachCheckPlainAccessResource(plainAccessResource); + + writer = new FileWriter(new File("src/test/resources/watch/conf/transport.yml"), true); + writer.write("- account: rokcet1\r\n"); + writer.write(" password: aliyun1\r\n"); + writer.write(" netaddress: 127.0.0.1\r\n"); + writer.flush(); + writer.close(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + plainAccessResourceTwo.setRequestCode(203); + plainPermissionLoader.eachCheckPlainAccessResource(plainAccessResourceTwo); + + transport.delete(); + file.delete(); + file = new File("src/test/resources/watch"); + file.delete(); + + } + +} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java index 8e0d3c6045..1d681e0f46 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java @@ -16,6 +16,7 @@ */ package org.apache.rocketmq.acl.plain; +import org.apache.rocketmq.acl.common.AclException; import org.junit.Assert; import org.junit.Test; @@ -29,41 +30,41 @@ public class RemoteAddressStrategyTest { RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); - plainAccessResource.setRemoteAddr("*"); + plainAccessResource.setWhiteRemoteAddress("*"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); - plainAccessResource.setRemoteAddr("127.0.0.1"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.OneRemoteAddressStrategy.class); - plainAccessResource.setRemoteAddr("127.0.0.1,127.0.0.2,127.0.0.3"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1,127.0.0.2,127.0.0.3"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.MultipleRemoteAddressStrategy.class); - plainAccessResource.setRemoteAddr("127.0.0.{1,2,3}"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.{1,2,3}"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.MultipleRemoteAddressStrategy.class); - plainAccessResource.setRemoteAddr("127.0.0.1-200"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1-200"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); - plainAccessResource.setRemoteAddr("127.0.0.*"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.*"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); - plainAccessResource.setRemoteAddr("127.0.1-20.*"); + plainAccessResource.setWhiteRemoteAddress("127.0.1-20.*"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); } - @Test(expected = AclPlugRuntimeException.class) + @Test(expected = AclException.class) public void verifyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setRemoteAddr("127.0.0.1"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - plainAccessResource.setRemoteAddr("256.0.0.1"); + plainAccessResource.setWhiteRemoteAddress("256.0.0.1"); remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } @@ -75,17 +76,17 @@ public class RemoteAddressStrategyTest { public void oneNetaddressStrategyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setRemoteAddr("127.0.0.1"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); - plainAccessResource.setRemoteAddr(""); + plainAccessResource.setWhiteRemoteAddress(""); boolean match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); - plainAccessResource.setRemoteAddr("127.0.0.2"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.2"); match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); - plainAccessResource.setRemoteAddr("127.0.0.1"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); match = remoteAddressStrategy.match(plainAccessResource); Assert.assertTrue(match); } @@ -93,42 +94,42 @@ public class RemoteAddressStrategyTest { @Test public void multipleNetaddressStrategyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setRemoteAddr("127.0.0.1,127.0.0.2,127.0.0.3"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1,127.0.0.2,127.0.0.3"); RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); multipleNetaddressStrategyTest(remoteAddressStrategy); - plainAccessResource.setRemoteAddr("127.0.0.{1,2,3}"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.{1,2,3}"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); multipleNetaddressStrategyTest(remoteAddressStrategy); } - @Test(expected = AclPlugRuntimeException.class) + @Test(expected = AclException.class) public void multipleNetaddressStrategyExceptionTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setRemoteAddr("127.0.0.1,2,3}"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1,2,3}"); remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } private void multipleNetaddressStrategyTest(RemoteAddressStrategy remoteAddressStrategy) { PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setRemoteAddr("127.0.0.1"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); boolean match = remoteAddressStrategy.match(plainAccessResource); Assert.assertTrue(match); - plainAccessResource.setRemoteAddr("127.0.0.2"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.2"); match = remoteAddressStrategy.match(plainAccessResource); Assert.assertTrue(match); - plainAccessResource.setRemoteAddr("127.0.0.3"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.3"); match = remoteAddressStrategy.match(plainAccessResource); Assert.assertTrue(match); - plainAccessResource.setRemoteAddr("127.0.0.4"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.4"); match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); - plainAccessResource.setRemoteAddr("127.0.0.0"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.0"); match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); @@ -138,23 +139,24 @@ public class RemoteAddressStrategyTest { public void rangeNetaddressStrategyTest() { String head = "127.0.0."; PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setRemoteAddr("127.0.0.1-200"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.1-200"); RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); rangeNetaddressStrategyTest(remoteAddressStrategy, head, 1, 200, true); - plainAccessResource.setRemoteAddr("127.0.0.*"); + plainAccessResource.setWhiteRemoteAddress("127.0.0.*"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); rangeNetaddressStrategyTest(remoteAddressStrategy, head, 0, 255, true); - plainAccessResource.setRemoteAddr("127.0.1-200.*"); + plainAccessResource.setWhiteRemoteAddress("127.0.1-200.*"); remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); rangeNetaddressStrategyThirdlyTest(remoteAddressStrategy, head, 1, 200); } - private void rangeNetaddressStrategyTest(RemoteAddressStrategy remoteAddressStrategy, String head, int start, int end, + private void rangeNetaddressStrategyTest(RemoteAddressStrategy remoteAddressStrategy, String head, int start, + int end, boolean isFalse) { PlainAccessResource plainAccessResource = new PlainAccessResource(); for (int i = -10; i < 300; i++) { - plainAccessResource.setRemoteAddr(head + i); + plainAccessResource.setWhiteRemoteAddress(head + i); boolean match = remoteAddressStrategy.match(plainAccessResource); if (isFalse && i >= start && i <= end) { Assert.assertTrue(match); @@ -176,24 +178,24 @@ public class RemoteAddressStrategyTest { } } - @Test(expected = AclPlugRuntimeException.class) + @Test(expected = AclException.class) public void rangeNetaddressStrategyExceptionStartGreaterEndTest() { rangeNetaddressStrategyExceptionTest("127.0.0.2-1"); } - @Test(expected = AclPlugRuntimeException.class) + @Test(expected = AclException.class) public void rangeNetaddressStrategyExceptionScopeTest() { rangeNetaddressStrategyExceptionTest("127.0.0.-1-200"); } - @Test(expected = AclPlugRuntimeException.class) + @Test(expected = AclException.class) public void rangeNetaddressStrategyExceptionScopeTwoTest() { rangeNetaddressStrategyExceptionTest("127.0.0.0-256"); } private void rangeNetaddressStrategyExceptionTest(String netaddress) { PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setRemoteAddr(netaddress); + plainAccessResource.setWhiteRemoteAddress(netaddress); remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); } diff --git a/acl/src/test/resources/conf/transport-null.yml b/acl/src/test/resources/conf/transport-null.yml new file mode 100644 index 0000000000..bc30380c88 --- /dev/null +++ b/acl/src/test/resources/conf/transport-null.yml @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +## suggested format + + diff --git a/acl/src/test/resources/conf/transport.yml b/acl/src/test/resources/conf/transport.yml index 384769f11f..2c3070e191 100644 --- a/acl/src/test/resources/conf/transport.yml +++ b/acl/src/test/resources/conf/transport.yml @@ -13,36 +13,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -onlyNetAddress: - remoteAddr: 10.10.103.* - noPermitPullTopic: - - broker-a - -list: -- accessKey: RocketMQ - signature: 1234567 - remoteAddr: 192.0.0.* - admin: true - permitSendTopic: - - test1 - - test2 -- accessKey: RocketMQ - signature: 1234567 - remoteAddr: 192.0.2.1 - permitSendTopic: - - test3 - - test4 - - ## suggested format globalWhiteRemoteAddresses: - - 10.10.103.* - - 192.168.0.* +- 10.10.103.* +- 192.168.0.* accounts: -- accessKey: ak1 - secretKey: sk1 +- accessKey: RocketMQ + secretKey: 12345678 whiteRemoteAddress: 192.168.0.* admin: false defaultTopicPerm: DENY @@ -57,8 +36,8 @@ accounts: - groupB=SUB - groupC=SUB -- accessKey: ak2 - secretKey: sk2 +- accessKey: aliyun.com + secretKey: 12345678 whiteRemoteAddress: 192.168.1.* # if it is admin, it could access all resources admin: true diff --git a/distribution/conf/transport.yml b/distribution/conf/transport.yml index 69c86bcd09..ccebd8f9ed 100644 --- a/distribution/conf/transport.yml +++ b/distribution/conf/transport.yml @@ -19,13 +19,13 @@ onlyNetAddress: - broker-a list: - - account: RocketMQ + - accessKey: RocketMQ signature: 1234567 remoteAddr: 192.168.0.* permitSendTopic: - TopicTest - test2 - - account: RocketMQ + - accessKey: RocketMQ signature: 1234567 remoteAddr: 192.168.2.1 permitSendTopic: From 3482f9445b966f36c41a6e9a6a93e8829d374eae Mon Sep 17 00:00:00 2001 From: von gosling Date: Wed, 5 Dec 2018 13:04:12 +0800 Subject: [PATCH 56/96] Clean code, don't list the default config in JVM --- distribution/bin/runbroker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distribution/bin/runbroker.sh b/distribution/bin/runbroker.sh index 3bd00bb301..df962b4a27 100644 --- a/distribution/bin/runbroker.sh +++ b/distribution/bin/runbroker.sh @@ -37,7 +37,7 @@ export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH} # JVM Configuration #=========================================================================================== JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" -JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8" +JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0" JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy" JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow" From f17725390a2372090944d1e20573e3fd1651df44 Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Thu, 6 Dec 2018 14:23:37 +0800 Subject: [PATCH 57/96] Modify the asynchronous send thread pool to a exclusive one --- .../impl/producer/DefaultMQProducerImpl.java | 36 ++++++++++++++++--- .../client/producer/DefaultMQProducer.java | 10 ++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java index 7ace9d5b07..90f4f78763 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java @@ -30,8 +30,10 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.rocketmq.client.QueryResult; import org.apache.rocketmq.client.Validators; import org.apache.rocketmq.client.common.ClientErrorCode; @@ -101,6 +103,10 @@ public class DefaultMQProducerImpl implements MQProducerInner { private MQFaultStrategy mqFaultStrategy = new MQFaultStrategy(); + private final BlockingQueue asyncSenderThreadPoolQueue; + private final ExecutorService defaultAsyncSenderExecutor; + private ExecutorService asyncSenderExecutor; + public DefaultMQProducerImpl(final DefaultMQProducer defaultMQProducer) { this(defaultMQProducer, null); } @@ -108,6 +114,22 @@ public class DefaultMQProducerImpl implements MQProducerInner { public DefaultMQProducerImpl(final DefaultMQProducer defaultMQProducer, RPCHook rpcHook) { this.defaultMQProducer = defaultMQProducer; this.rpcHook = rpcHook; + + this.asyncSenderThreadPoolQueue = new LinkedBlockingQueue(50000); + this.defaultAsyncSenderExecutor = new ThreadPoolExecutor( + Runtime.getRuntime().availableProcessors(), + Runtime.getRuntime().availableProcessors(), + 1000 * 60, + TimeUnit.MILLISECONDS, + this.asyncSenderThreadPoolQueue, + new ThreadFactory() { + private AtomicInteger threadIndex = new AtomicInteger(0); + + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "AsyncSenderExecutor_" + this.threadIndex.incrementAndGet()); + } + }); } public void registerCheckForbiddenHook(CheckForbiddenHook checkForbiddenHook) { @@ -456,7 +478,7 @@ public class DefaultMQProducerImpl implements MQProducerInner { public void send(final Message msg, final SendCallback sendCallback, final long timeout) throws MQClientException, RemotingException, InterruptedException { final long beginStartTime = System.currentTimeMillis(); - ExecutorService executor = this.getCallbackExecutor(); + ExecutorService executor = this.getAsyncSenderExecutor(); try { executor.submit(new Runnable() { @Override @@ -957,7 +979,7 @@ public class DefaultMQProducerImpl implements MQProducerInner { public void send(final Message msg, final MessageQueue mq, final SendCallback sendCallback, final long timeout) throws MQClientException, RemotingException, InterruptedException { final long beginStartTime = System.currentTimeMillis(); - ExecutorService executor = this.getCallbackExecutor(); + ExecutorService executor = this.getAsyncSenderExecutor(); try { executor.submit(new Runnable() { @Override @@ -1079,7 +1101,7 @@ public class DefaultMQProducerImpl implements MQProducerInner { public void send(final Message msg, final MessageQueueSelector selector, final Object arg, final SendCallback sendCallback, final long timeout) throws MQClientException, RemotingException, InterruptedException { final long beginStartTime = System.currentTimeMillis(); - ExecutorService executor = this.getCallbackExecutor(); + ExecutorService executor = this.getAsyncSenderExecutor(); try { executor.submit(new Runnable() { @Override @@ -1243,9 +1265,13 @@ public class DefaultMQProducerImpl implements MQProducerInner { public void setCallbackExecutor(final ExecutorService callbackExecutor) { this.mQClientFactory.getMQClientAPIImpl().getRemotingClient().setCallbackExecutor(callbackExecutor); } - public ExecutorService getCallbackExecutor() { - return this.mQClientFactory.getMQClientAPIImpl().getRemotingClient().getCallbackExecutor(); + public ExecutorService getAsyncSenderExecutor() { + return null == asyncSenderExecutor ? defaultAsyncSenderExecutor : asyncSenderExecutor; + } + + public void setAsyncSenderExecutor(ExecutorService asyncSenderExecutor) { + this.asyncSenderExecutor = asyncSenderExecutor; } public SendResult send(Message msg, diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index 9732d0eb84..f57e52c3ef 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -655,6 +655,16 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { this.defaultMQProducerImpl.setCallbackExecutor(callbackExecutor); } + /** + * Sets an Executor to be used for executing asynchronous send. If the Executor is not set, {@link + * DefaultMQProducerImpl#defaultAsyncSenderExecutor} will be used. + * + * @param asyncSenderExecutor the instance of Executor + */ + public void setAsyncSenderExecutor(final ExecutorService asyncSenderExecutor) { + this.defaultMQProducerImpl.setAsyncSenderExecutor(asyncSenderExecutor); + } + private MessageBatch batch(Collection msgs) throws MQClientException { MessageBatch msgBatch; try { From 495a01b6a50c7066a3d1cf6032475a5996531a4e Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Fri, 7 Dec 2018 10:55:45 +0800 Subject: [PATCH 58/96] Remove unnecessary code in test case --- .../client/producer/DefaultMQProducerTest.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java b/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java index c225afd684..9540755fe3 100644 --- a/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/producer/DefaultMQProducerTest.java @@ -167,10 +167,7 @@ public class DefaultMQProducerTest { @Test public void testSendMessageAsync_Success() throws RemotingException, InterruptedException, MQBrokerException, MQClientException { - ExecutorService callbackExecutor = Executors.newSingleThreadExecutor(); final CountDownLatch countDownLatch = new CountDownLatch(1); - when(mQClientAPIImpl.getRemotingClient()).thenReturn((nettyRemotingClient)); - when(nettyRemotingClient.getCallbackExecutor()).thenReturn(callbackExecutor); producer.send(message, new SendCallback() { @Override public void onSuccess(SendResult sendResult) { @@ -186,15 +183,11 @@ public class DefaultMQProducerTest { } }); countDownLatch.await(3000L, TimeUnit.MILLISECONDS); - callbackExecutor.shutdown(); } @Test public void testSendMessageAsync() throws RemotingException, MQClientException, InterruptedException { final AtomicInteger cc = new AtomicInteger(0); final CountDownLatch countDownLatch = new CountDownLatch(6); - ExecutorService callbackExecutor = Executors.newSingleThreadExecutor(); - when(mQClientAPIImpl.getRemotingClient()).thenReturn((nettyRemotingClient)); - when(nettyRemotingClient.getCallbackExecutor()).thenReturn(callbackExecutor); SendCallback sendCallback = new SendCallback() { @Override @@ -226,16 +219,13 @@ public class DefaultMQProducerTest { producer.send(message,messageQueueSelector,null,sendCallback,1000); countDownLatch.await(3000L, TimeUnit.MILLISECONDS); - callbackExecutor.shutdown(); assertThat(cc.get()).isEqualTo(6); } @Test public void testSendMessageAsync_BodyCompressed() throws RemotingException, InterruptedException, MQBrokerException, MQClientException { - ExecutorService callbackExecutor = Executors.newSingleThreadExecutor(); + final CountDownLatch countDownLatch = new CountDownLatch(1); - when(mQClientAPIImpl.getRemotingClient()).thenReturn((nettyRemotingClient)); - when(nettyRemotingClient.getCallbackExecutor()).thenReturn(callbackExecutor); producer.send(bigMessage, new SendCallback() { @Override public void onSuccess(SendResult sendResult) { @@ -251,7 +241,6 @@ public class DefaultMQProducerTest { } }); countDownLatch.await(3000L, TimeUnit.MILLISECONDS); - callbackExecutor.shutdown(); } @Test From 7fd657f75c3d76c8339763682147642c0ecbc8bd Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Mon, 10 Dec 2018 13:33:24 +0800 Subject: [PATCH 59/96] Format the precision output TPS --- .../tools/command/consumer/ConsumerProgressSubCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/consumer/ConsumerProgressSubCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/consumer/ConsumerProgressSubCommand.java index a1b3c1a227..b946ee141e 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/consumer/ConsumerProgressSubCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/consumer/ConsumerProgressSubCommand.java @@ -155,7 +155,7 @@ public class ConsumerProgressSubCommand implements SubCommand { } System.out.printf("%n"); - System.out.printf("Consume TPS: %s%n", consumeStats.getConsumeTps()); + System.out.printf("Consume TPS: %.2f%n", consumeStats.getConsumeTps()); System.out.printf("Diff Total: %d%n", diffTotal); } else { System.out.printf("%-32s %-6s %-24s %-5s %-14s %-7s %s%n", From 020f4b4c5d5f8ad4bac92b17a3efac6286db7dcd Mon Sep 17 00:00:00 2001 From: laohu <2372554140@qq.com> Date: Tue, 11 Dec 2018 09:12:38 +0800 Subject: [PATCH 60/96] clean code --- acl/pom.xml | 12 -- .../rocketmq/acl/common/AclClientRPCHook.java | 16 +- .../apache/rocketmq/acl/common/AclSigner.java | 12 +- .../apache/rocketmq/acl/common/AclUtils.java | 2 +- .../rocketmq/acl/common/Permission.java | 21 +-- .../acl/common/SessionCredentials.java | 18 +-- .../acl/plain/PlainAccessResource.java | 2 +- .../acl/plain/PlainAccessValidator.java | 9 +- .../acl/plain/PlainPermissionLoader.java | 111 +++++++++++-- .../rocketmq/acl/common/PermissionTest.java | 9 +- .../acl/plain/PlainAccessValidatorTest.java | 2 +- .../acl/plain/PlainPermissionLoaderTest.java | 146 ++++++++---------- 12 files changed, 205 insertions(+), 155 deletions(-) diff --git a/acl/pom.xml b/acl/pom.xml index 9a072269ef..03ce95cd07 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -49,17 +49,5 @@ org.apache.commons commons-lang3 - - org.powermock - powermock-module-junit4 - 1.7.1 - test - - - org.powermock - powermock-api-mockito2 - 1.7.1 - test - diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java index 65c45f076f..dd8ce1e204 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java @@ -24,9 +24,9 @@ import org.apache.rocketmq.remoting.CommandCustomHeader; import org.apache.rocketmq.remoting.RPCHook; import org.apache.rocketmq.remoting.protocol.RemotingCommand; -import static org.apache.rocketmq.acl.common.SessionCredentials.AccessKey; -import static org.apache.rocketmq.acl.common.SessionCredentials.SecurityToken; -import static org.apache.rocketmq.acl.common.SessionCredentials.Signature; +import static org.apache.rocketmq.acl.common.SessionCredentials.ACCESS_KEY; +import static org.apache.rocketmq.acl.common.SessionCredentials.SECURITY_TOKEN; +import static org.apache.rocketmq.acl.common.SessionCredentials.SIGNATURE; public class AclClientRPCHook implements RPCHook { private final SessionCredentials sessionCredentials; @@ -42,11 +42,11 @@ public class AclClientRPCHook implements RPCHook { byte[] total = AclUtils.combineRequestContent(request, parseRequestContent(request, sessionCredentials.getAccessKey(), sessionCredentials.getSecurityToken())); String signature = AclUtils.calSignature(total, sessionCredentials.getSecretKey()); - request.addExtField(Signature, signature); - request.addExtField(AccessKey, sessionCredentials.getAccessKey()); + request.addExtField(SIGNATURE, signature); + request.addExtField(ACCESS_KEY, sessionCredentials.getAccessKey()); if (sessionCredentials.getSecurityToken() != null) { - request.addExtField(SecurityToken, sessionCredentials.getSecurityToken()); + request.addExtField(SECURITY_TOKEN, sessionCredentials.getSecurityToken()); } } @@ -59,9 +59,9 @@ public class AclClientRPCHook implements RPCHook { CommandCustomHeader header = request.readCustomHeader(); // sort property SortedMap map = new TreeMap(); - map.put(AccessKey, ak); + map.put(ACCESS_KEY, ak); if (securityToken != null) { - map.put(SecurityToken, securityToken); + map.put(SECURITY_TOKEN, securityToken); } try { // add header properties diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java index 7a71104ef6..61e9350663 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java @@ -25,14 +25,14 @@ import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.logging.InternalLoggerFactory; public class AclSigner { - public static final Charset defaultCharset = Charset.forName("UTF-8"); - public static final SigningAlgorithm defaultAlgorithm = SigningAlgorithm.HmacSHA1; + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + public static final SigningAlgorithm DEFAULT_ALGORITHM = SigningAlgorithm.HmacSHA1; private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_AUTHORIZE_LOGGER_NAME); private static final int CAL_SIGNATURE_FAILED = 10015; private static final String CAL_SIGNATURE_FAILED_MSG = "[%s:signature-failed] unable to calculate a request signature. error=%s"; public static String calSignature(String data, String key) throws AclException { - return calSignature(data, key, defaultAlgorithm, defaultCharset); + return calSignature(data, key, DEFAULT_ALGORITHM, DEFAULT_CHARSET); } public static String calSignature(String data, String key, SigningAlgorithm algorithm, @@ -44,7 +44,7 @@ public class AclSigner { throws AclException { try { byte[] signature = sign(data.getBytes(charset), key.getBytes(charset), algorithm); - return new String(Base64.encodeBase64(signature), defaultCharset); + return new String(Base64.encodeBase64(signature), DEFAULT_CHARSET); } catch (Exception e) { String message = String.format(CAL_SIGNATURE_FAILED_MSG, CAL_SIGNATURE_FAILED, e.getMessage()); log.error(message, e); @@ -65,7 +65,7 @@ public class AclSigner { } public static String calSignature(byte[] data, String key) throws AclException { - return calSignature(data, key, defaultAlgorithm, defaultCharset); + return calSignature(data, key, DEFAULT_ALGORITHM, DEFAULT_CHARSET); } public static String calSignature(byte[] data, String key, SigningAlgorithm algorithm, @@ -77,7 +77,7 @@ public class AclSigner { throws AclException { try { byte[] signature = sign(data, key.getBytes(charset), algorithm); - return new String(Base64.encodeBase64(signature), defaultCharset); + return new String(Base64.encodeBase64(signature), DEFAULT_CHARSET); } catch (Exception e) { String message = String.format(CAL_SIGNATURE_FAILED_MSG, CAL_SIGNATURE_FAILED, e.getMessage()); log.error(message, e); diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java index a3aab1ca7c..1a618456f4 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java @@ -33,7 +33,7 @@ public class AclUtils { try { StringBuilder sb = new StringBuilder(""); for (Map.Entry entry : fieldsMap.entrySet()) { - if (!SessionCredentials.Signature.equals(entry.getKey())) { + if (!SessionCredentials.SIGNATURE.equals(entry.getKey())) { sb.append(entry.getValue()); } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java index 1b225c3852..b5e9be20f1 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java @@ -16,11 +16,12 @@ */ package org.apache.rocketmq.acl.common; -import com.alibaba.fastjson.JSONArray; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.plain.PlainAccessResource; +import org.apache.rocketmq.common.protocol.RequestCode; public class Permission { @@ -33,15 +34,15 @@ public class Permission { static { // UPDATE_AND_CREATE_TOPIC - ADMIN_CODE.add(17); + ADMIN_CODE.add(RequestCode.UPDATE_AND_CREATE_TOPIC); // UPDATE_BROKER_CONFIG - ADMIN_CODE.add(25); + ADMIN_CODE.add(RequestCode.UPDATE_BROKER_CONFIG); // DELETE_TOPIC_IN_BROKER - ADMIN_CODE.add(215); + ADMIN_CODE.add(RequestCode.DELETE_TOPIC_IN_BROKER); // UPDATE_AND_CREATE_SUBSCRIPTIONGROUP - ADMIN_CODE.add(200); + ADMIN_CODE.add(RequestCode.UPDATE_AND_CREATE_SUBSCRIPTIONGROUP); // DELETE_SUBSCRIPTIONGROUP - ADMIN_CODE.add(207); + ADMIN_CODE.add(RequestCode.DELETE_SUBSCRIPTIONGROUP); } public static boolean checkPermission(byte neededPerm, byte ownedPerm) { @@ -76,16 +77,16 @@ public class Permission { } } - public static void setTopicPerm(PlainAccessResource plainAccessResource, Boolean isTopic, JSONArray topicArray) { + public static void setTopicPerm(PlainAccessResource plainAccessResource, Boolean isTopic, List topicArray) { if (topicArray == null || topicArray.isEmpty()) { return; } - for (int i = 0; i < topicArray.size(); i++) { - String[] topicPrem = StringUtils.split(topicArray.getString(i), "="); + for (String topic : topicArray) { + String[] topicPrem = StringUtils.split(topic, "="); if (topicPrem.length == 2) { plainAccessResource.addResourceAndPerm(isTopic ? topicPrem[0] : PlainAccessResource.getRetryTopic(topicPrem[0]), fromStringGetPermission(topicPrem[1])); } else { - throw new AclException(String.format("%s Permission config erron %s", isTopic ? "topic" : "group", topicArray.getString(i))); + throw new AclException(String.format("%s Permission config erron %s", isTopic ? "topic" : "group", topic)); } } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java b/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java index 62523d058d..a637e36808 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java @@ -24,12 +24,12 @@ import org.apache.rocketmq.common.MixAll; public class SessionCredentials { public static final Charset CHARSET = Charset.forName("UTF-8"); - public static final String AccessKey = "AccessKey"; - public static final String SecretKey = "SecretKey"; - public static final String Signature = "Signature"; - public static final String SecurityToken = "SecurityToken"; + public static final String ACCESS_KEY = "AccessKey"; + public static final String SECRET_KEY = "SecretKey"; + public static final String SIGNATURE = "Signature"; + public static final String SECURITY_TOKEN = "SecurityToken"; - public static final String KeyFile = System.getProperty("rocketmq.client.keyFile", + public static final String KEY_FILE = System.getProperty("rocketmq.client.keyFile", System.getProperty("user.home") + File.separator + "onskey"); private String accessKey; @@ -40,7 +40,7 @@ public class SessionCredentials { public SessionCredentials() { String keyContent = null; try { - keyContent = MixAll.file2String(KeyFile); + keyContent = MixAll.file2String(KEY_FILE); } catch (IOException ignore) { } if (keyContent != null) { @@ -63,19 +63,19 @@ public class SessionCredentials { public void updateContent(Properties prop) { { - String value = prop.getProperty(AccessKey); + String value = prop.getProperty(ACCESS_KEY); if (value != null) { this.accessKey = value.trim(); } } { - String value = prop.getProperty(SecretKey); + String value = prop.getProperty(SECRET_KEY); if (value != null) { this.secretKey = value.trim(); } } { - String value = prop.getProperty(SecurityToken); + String value = prop.getProperty(SECURITY_TOKEN); if (value != null) { this.securityToken = value.trim(); } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java index 74d7526fb0..0b2f417c67 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java @@ -56,7 +56,7 @@ public class PlainAccessResource implements AccessResource { } public static boolean isRetryTopic(String topic) { - return (null != topic && topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)); + return null != topic && topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX); } public static String getRetryTopic(String group) { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java index 150ccca26f..8a80757a3d 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java @@ -49,12 +49,11 @@ public class PlainAccessValidator implements AccessValidator { PlainAccessResource accessResource = new PlainAccessResource(); accessResource.setWhiteRemoteAddress(remoteAddr); accessResource.setRequestCode(request.getCode()); - accessResource.setAccessKey(request.getExtFields().get(SessionCredentials.AccessKey)); - accessResource.setSignature(request.getExtFields().get(SessionCredentials.Signature)); - accessResource.setSecretToken(request.getExtFields().get(SessionCredentials.SecurityToken)); + accessResource.setAccessKey(request.getExtFields().get(SessionCredentials.ACCESS_KEY)); + accessResource.setSignature(request.getExtFields().get(SessionCredentials.SIGNATURE)); + accessResource.setSecretToken(request.getExtFields().get(SessionCredentials.SECURITY_TOKEN)); try { - // resource 和 permission 转换 switch (request.getCode()) { case RequestCode.SEND_MESSAGE: accessResource.addResourceAndPerm(request.getExtFields().get("topic"), Permission.PUB); @@ -111,7 +110,7 @@ public class PlainAccessValidator implements AccessValidator { // content SortedMap map = new TreeMap(); for (Map.Entry entry : request.getExtFields().entrySet()) { - if (!SessionCredentials.Signature.equals(entry.getKey())) { + if (!SessionCredentials.SIGNATURE.equals(entry.getKey())) { map.put(entry.getKey(), entry.getValue()); } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 7d40f877e7..469c161205 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -70,7 +70,7 @@ public class PlainPermissionLoader { JSONObject.class); if (accessControlTransport == null || accessControlTransport.isEmpty()) { - throw new AclException("transport.yml file is not data"); + throw new AclException(String.format("%s file is not data", fileHome + fileName)); } log.info("BorkerAccessControlTransport data is : ", accessControlTransport.toString()); JSONArray globalWhiteRemoteAddressesList = accessControlTransport.getJSONArray("globalWhiteRemoteAddresses"); @@ -81,9 +81,10 @@ public class PlainPermissionLoader { } JSONArray accounts = accessControlTransport.getJSONArray("accounts"); - if (accounts != null && !accounts.isEmpty()) { - for (int i = 0; i < accounts.size(); i++) { - this.setPlainAccessResource(getPlainAccessResource(accounts.getJSONObject(i))); + List plainAccessList = accounts.toJavaList(PlainAccess.class); + if (plainAccessList != null && !plainAccessList.isEmpty()) { + for (PlainAccess plainAccess : plainAccessList) { + this.setPlainAccessResource(getPlainAccessResource(plainAccess)); } } } @@ -139,19 +140,19 @@ public class PlainPermissionLoader { } } - PlainAccessResource getPlainAccessResource(JSONObject account) { + PlainAccessResource getPlainAccessResource(PlainAccess plainAccess) { PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setAccessKey(account.getString("accessKey")); - plainAccessResource.setSecretKey(account.getString("secretKey")); - plainAccessResource.setWhiteRemoteAddress(account.getString("whiteRemoteAddress")); + plainAccessResource.setAccessKey(plainAccess.getAccessKey()); + plainAccessResource.setSecretKey(plainAccess.getSecretKey()); + plainAccessResource.setWhiteRemoteAddress(plainAccess.getWhiteRemoteAddress()); - plainAccessResource.setAdmin(account.containsKey("admin") ? account.getBoolean("admin") : false); + plainAccessResource.setAdmin(plainAccess.isAdmin()); - plainAccessResource.setDefaultGroupPerm(Permission.fromStringGetPermission(account.getString("defaultGroupPerm"))); - plainAccessResource.setDefaultTopicPerm(Permission.fromStringGetPermission(account.getString("defaultTopicPerm"))); + plainAccessResource.setDefaultGroupPerm(Permission.fromStringGetPermission(plainAccess.getDefaultGroupPerm())); + plainAccessResource.setDefaultTopicPerm(Permission.fromStringGetPermission(plainAccess.getDefaultTopicPerm())); - Permission.setTopicPerm(plainAccessResource, true, account.getJSONArray("groups")); - Permission.setTopicPerm(plainAccessResource, true, account.getJSONArray("topics")); + Permission.setTopicPerm(plainAccessResource, false, plainAccess.getGroups()); + Permission.setTopicPerm(plainAccessResource, true, plainAccess.getTopics()); return plainAccessResource; } @@ -250,4 +251,88 @@ public class PlainPermissionLoader { return isWatchStart; } + static class PlainAccess { + + private String accessKey; + + private String secretKey; + + private String whiteRemoteAddress; + + private boolean admin; + + private String defaultTopicPerm; + + private String defaultGroupPerm; + + private List topics; + + private List groups; + + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + public String getWhiteRemoteAddress() { + return whiteRemoteAddress; + } + + public void setWhiteRemoteAddress(String whiteRemoteAddress) { + this.whiteRemoteAddress = whiteRemoteAddress; + } + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getDefaultTopicPerm() { + return defaultTopicPerm; + } + + public void setDefaultTopicPerm(String defaultTopicPerm) { + this.defaultTopicPerm = defaultTopicPerm; + } + + public String getDefaultGroupPerm() { + return defaultGroupPerm; + } + + public void setDefaultGroupPerm(String defaultGroupPerm) { + this.defaultGroupPerm = defaultGroupPerm; + } + + public List getTopics() { + return topics; + } + + public void setTopics(List topics) { + this.topics = topics; + } + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } + + } + } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java index 7678e4b27c..04a3f8f2c3 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java @@ -16,8 +16,9 @@ */ package org.apache.rocketmq.acl.common; -import com.alibaba.fastjson.JSONArray; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import org.apache.rocketmq.acl.plain.PlainAccessResource; @@ -93,7 +94,7 @@ public class PermissionTest { Permission.setTopicPerm(plainAccessResource, false, null); Assert.assertNull(resourcePermMap); - JSONArray groups = new JSONArray(); + List groups = new ArrayList<>(); Permission.setTopicPerm(plainAccessResource, false, groups); Assert.assertNull(resourcePermMap); @@ -112,7 +113,7 @@ public class PermissionTest { perm = resourcePermMap.get(PlainAccessResource.getRetryTopic("groupC")); Assert.assertEquals(perm, Permission.PUB); - JSONArray topics = new JSONArray(); + List topics = new ArrayList<>(); topics.add("topicA=DENY"); topics.add("topicB=PUB|SUB"); topics.add("topicC=PUB"); @@ -128,7 +129,7 @@ public class PermissionTest { perm = resourcePermMap.get("topicC"); Assert.assertEquals(perm, Permission.PUB); - JSONArray erron = new JSONArray(); + List erron = new ArrayList<>(); erron.add(""); Permission.setTopicPerm(plainAccessResource, false, erron); } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java index 83e98708b6..12e47afdcd 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java @@ -70,7 +70,7 @@ public class PlainAccessValidatorTest { AclClientRPCHook aclClient = new AclClientRPCHook(sessionCredentials); SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); - messageRequestHeader.setTopic("topicA"); + messageRequestHeader.setTopic("topicB"); RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE, messageRequestHeader); aclClient.doBeforeRequest("", remotingCommand); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java index f1974a0904..45004ec2ed 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -16,30 +16,22 @@ */ package org.apache.rocketmq.acl.plain; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.rocketmq.acl.common.AclException; -import org.apache.rocketmq.acl.common.AclUtils; import org.apache.rocketmq.acl.common.Permission; -import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.acl.plain.PlainPermissionLoader.PlainAccess; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -@RunWith(PowerMockRunner.class) -@PrepareForTest({AclUtils.class}) public class PlainPermissionLoaderTest { PlainPermissionLoader plainPermissionLoader; @@ -50,10 +42,6 @@ public class PlainPermissionLoaderTest { PlainAccessResource plainAccessResource = new PlainAccessResource(); PlainAccessResource plainAccessResourceTwo = new PlainAccessResource(); Set adminCode = new HashSet<>(); - private String fileName = System.getProperty("romcketmq.acl.plain.fileName", "/conf/transport.yml"); - private Map> plainAccessResourceMap; - private List globalWhiteRemoteAddressStrategy; @Before public void init() throws NoSuchFieldException, SecurityException, IOException { @@ -75,6 +63,7 @@ public class PlainPermissionLoaderTest { System.setProperty("java.version", "1.6.11"); System.setProperty("rocketmq.home.dir", "src/test/resources"); + System.setProperty("romcketmq.acl.plain.fileName", "/conf/transport.yml"); plainPermissionLoader = new PlainPermissionLoader(); } @@ -98,85 +87,56 @@ public class PlainPermissionLoaderTest { return painAccessResource; } - @SuppressWarnings("unchecked") - private void getField(PlainPermissionLoader plainPermissionLoader) { - try { - this.globalWhiteRemoteAddressStrategy = (List) FieldUtils.readDeclaredField(plainPermissionLoader, "globalWhiteRemoteAddressStrategy", true); - this.plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - - @Test(expected = AclException.class) - public void initializeTest() { - System.setProperty("romcketmq.acl.plain.fileName", "/conf/transport-null.yml"); - new PlainPermissionLoader(); - - } - - @Test - public void initializeIngetYamlDataObject() { - String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - PowerMockito.mockStatic(AclUtils.class); - JSONObject json = new JSONObject(); - json.put("", ""); - PowerMockito.when(AclUtils.getYamlDataObject(fileHome + "/conf/transport.yml", JSONObject.class)).thenReturn(json); - PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); - getField(plainPermissionLoader); - Assert.assertTrue(globalWhiteRemoteAddressStrategy.isEmpty()); - Assert.assertTrue(plainAccessResourceMap.isEmpty()); - } - @Test public void getPlainAccessResourceTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - JSONObject account = new JSONObject(); - account.put("accessKey", "RocketMQ"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + PlainAccess plainAccess = new PlainAccess(); + + plainAccess.setAccessKey("RocketMQ"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.getAccessKey(), "RocketMQ"); - account.put("secretKey", "12345678"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + plainAccess.setSecretKey("12345678"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.getSecretKey(), "12345678"); - account.put("whiteRemoteAddress", "127.0.0.1"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + plainAccess.setWhiteRemoteAddress("127.0.0.1"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.getWhiteRemoteAddress(), "127.0.0.1"); - account.put("admin", true); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + plainAccess.setAdmin(true); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.isAdmin(), true); - account.put("defaultGroupPerm", "ANY"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + plainAccess.setDefaultGroupPerm("ANY"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.getDefaultGroupPerm(), Permission.ANY); - account.put("defaultTopicPerm", "ANY"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + plainAccess.setDefaultTopicPerm("ANY"); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.getDefaultTopicPerm(), Permission.ANY); - JSONArray groups = new JSONArray(); + List groups = new ArrayList(); groups.add("groupA=DENY"); groups.add("groupB=PUB|SUB"); groups.add("groupC=PUB"); - account.put("groups", groups); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + plainAccess.setGroups(groups); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Map resourcePermMap = plainAccessResource.getResourcePermMap(); Assert.assertEquals(resourcePermMap.size(), 3); - Assert.assertEquals(resourcePermMap.get("groupA").byteValue(), Permission.DENY); - Assert.assertEquals(resourcePermMap.get("groupB").byteValue(), Permission.ANY); - Assert.assertEquals(resourcePermMap.get("groupC").byteValue(), Permission.PUB); + Assert.assertEquals(resourcePermMap.get(PlainAccessResource.getRetryTopic("groupA")).byteValue(), Permission.DENY); + Assert.assertEquals(resourcePermMap.get(PlainAccessResource.getRetryTopic("groupB")).byteValue(), Permission.ANY); + Assert.assertEquals(resourcePermMap.get(PlainAccessResource.getRetryTopic("groupC")).byteValue(), Permission.PUB); - JSONArray topics = new JSONArray(); + List topics = new ArrayList(); topics.add("topicA=DENY"); topics.add("topicB=PUB|SUB"); topics.add("topicC=PUB"); - account.put("topics", topics); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(account); + plainAccess.setTopics(topics); + plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); resourcePermMap = plainAccessResource.getResourcePermMap(); - Assert.assertEquals(resourcePermMap.size(), 3); + Assert.assertEquals(resourcePermMap.size(), 6); Assert.assertEquals(resourcePermMap.get("topicA").byteValue(), Permission.DENY); Assert.assertEquals(resourcePermMap.get("topicB").byteValue(), Permission.ANY); @@ -237,17 +197,21 @@ public class PlainPermissionLoaderTest { new PlainPermissionLoader().initialize(); } + @SuppressWarnings("unchecked") @Test - public void cleanAuthenticationInfoTest() { - plainPermissionLoader.setPlainAccessResource(plainAccessResource); - plainAccessResource.setRequestCode(202); - plainPermissionLoader.eachCheckPlainAccessResource(plainAccessResource); + public void cleanAuthenticationInfoTest() throws IllegalAccessException { + //plainPermissionLoader.setPlainAccessResource(plainAccessResource); + Map> plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); + Assert.assertFalse(plainAccessResourceMap.isEmpty()); + plainPermissionLoader.cleanAuthenticationInfo(); - plainPermissionLoader.eachCheckPlainAccessResource(plainAccessResource); + plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); + Assert.assertTrue(plainAccessResourceMap.isEmpty()); } @Test public void isWatchStartTest() { + System.setProperty("java.version", "1.7.11"); PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); Assert.assertTrue(plainPermissionLoader.isWatchStart()); System.setProperty("java.version", "1.6.11"); @@ -255,8 +219,10 @@ public class PlainPermissionLoaderTest { Assert.assertFalse(plainPermissionLoader.isWatchStart()); } + @SuppressWarnings("unchecked") @Test - public void watchTest() throws IOException { + public void watchTest() throws IOException, IllegalAccessException { + System.setProperty("java.version", "1.7.11"); System.setProperty("rocketmq.home.dir", "src/test/resources/watch"); File file = new File("src/test/resources/watch/conf"); file.mkdirs(); @@ -264,30 +230,33 @@ public class PlainPermissionLoaderTest { transport.createNewFile(); FileWriter writer = new FileWriter(transport); - writer.write("list:\r\n"); - writer.write("- account: rokcetmq\r\n"); - writer.write(" password: aliyun11\r\n"); - writer.write(" netaddress: 127.0.0.1\r\n"); + writer.write("accounts:\r\n"); + writer.write("- accessKey: rokcetmq\r\n"); + writer.write(" secretKey: aliyun11\r\n"); + writer.write(" whiteRemoteAddress: 127.0.0.1\r\n"); + writer.write(" admin: true\r\n"); writer.flush(); writer.close(); PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); - plainAccessResource.setRequestCode(203); - plainPermissionLoader.eachCheckPlainAccessResource(plainAccessResource); + + Map> plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); + Assert.assertEquals(plainAccessResourceMap.get("rokcetmq").size(), 1); writer = new FileWriter(new File("src/test/resources/watch/conf/transport.yml"), true); - writer.write("- account: rokcet1\r\n"); - writer.write(" password: aliyun1\r\n"); - writer.write(" netaddress: 127.0.0.1\r\n"); + writer.write("- accessKey: rokcet1\r\n"); + writer.write(" secretKey: aliyun1\r\n"); + writer.write(" whiteRemoteAddress: 127.0.0.1\r\n"); + writer.write(" admin: true\r\n"); writer.flush(); writer.close(); + try { Thread.sleep(100); } catch (InterruptedException e) { - // TODO Auto-generated catch block e.printStackTrace(); } - plainAccessResourceTwo.setRequestCode(203); - plainPermissionLoader.eachCheckPlainAccessResource(plainAccessResourceTwo); + plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); + Assert.assertEquals(plainAccessResourceMap.get("rokcet1").size(), 1); transport.delete(); file.delete(); @@ -296,4 +265,11 @@ public class PlainPermissionLoaderTest { } + @Test(expected = AclException.class) + public void initializeTest() { + System.setProperty("romcketmq.acl.plain.fileName", "/conf/transport-null.yml"); + new PlainPermissionLoader(); + + } + } From cde6f404414b5aff72a88c0d80f6464068e8ce75 Mon Sep 17 00:00:00 2001 From: huzongtang Date: Tue, 11 Dec 2018 16:03:53 +0800 Subject: [PATCH 61/96] [ISSUE #525] Support the message track,these committed codes have supported trace_topic name value Configurable by users. --- .../broker/topic/TopicConfigManager.java | 2 +- .../consumer/DefaultMQPushConsumer.java | 13 +++++++++--- .../client/producer/DefaultMQProducer.java | 16 ++++++++++---- .../core/common/TrackTraceConstants.java | 4 +--- .../dispatch/impl/AsyncArrayDispatcher.java | 21 ++++++++++++------- .../core/hook/SendMessageTrackHookImpl.java | 7 +++---- .../trace/DefaultMQConsumerWithTraceTest.java | 10 +++++---- .../trace/DefaultMQProducerWithTraceTest.java | 10 ++++++--- .../apache/rocketmq/common/BrokerConfig.java | 10 +++++++++ .../example/tracemessage/TraceProducer.java | 2 +- .../tracemessage/TracePushConsumer.java | 3 ++- .../logappender/common/ProducerInstance.java | 2 +- .../logappender/AbstractTestCase.java | 2 +- .../test/client/rmq/RMQNormalConsumer.java | 2 +- .../test/factory/ProducerFactory.java | 2 +- .../message/QueryMsgByIdSubCommand.java | 2 +- .../tools/monitor/MonitorService.java | 2 +- 17 files changed, 73 insertions(+), 37 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java index 163897b1cc..bd5eaeeab2 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java @@ -126,7 +126,7 @@ public class TopicConfigManager extends ConfigManager { } { if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { - String topic = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC; + String topic = this.brokerController.getBrokerConfig().getMsgTrackTopicName(); TopicConfig topicConfig = new TopicConfig(topic); this.systemTopicList.add(topic); topicConfig.setReadQueueNums(1); diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index 0b5ce05217..179a80daa4 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -289,9 +289,10 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * @param rpcHook RPC hook to execute before each remoting command. * @param allocateMessageQueueStrategy message queue allocating algorithm. * @param msgTraceSwitch switch flag instance for message track trace. + * @param traceTopicName the name value of message track trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, - AllocateMessageQueueStrategy allocateMessageQueueStrategy, boolean msgTraceSwitch) { + AllocateMessageQueueStrategy allocateMessageQueueStrategy, boolean msgTraceSwitch, final String traceTopicName) { this.consumerGroup = consumerGroup; this.allocateMessageQueueStrategy = allocateMessageQueueStrategy; defaultMQPushConsumerImpl = new DefaultMQPushConsumerImpl(this, rpcHook); @@ -303,6 +304,11 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume tempProperties.put(TrackTraceConstants.MAX_BATCH_NUM, "100"); tempProperties.put(TrackTraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); tempProperties.put(TrackTraceConstants.TRACE_DISPATCHER_TYPE, TrackTraceDispatcherType.CONSUMER.name()); + if (!UtilAll.isBlank(traceTopicName)) { + tempProperties.put(TrackTraceConstants.TRACE_TOPIC, traceTopicName); + } else { + tempProperties.put(TrackTraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); + } AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties); dispatcher.setHostConsumer(this.getDefaultMQPushConsumerImpl()); traceDispatcher = dispatcher; @@ -329,9 +335,10 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * * @param consumerGroup Consumer group. * @param msgTraceSwitch switch flag instance for message track trace. + * @param traceTopicName the name value of message track trace topic.If you don't config,you can use the default trace topic name. */ - public DefaultMQPushConsumer(final String consumerGroup, boolean msgTraceSwitch) { - this(consumerGroup, null, new AllocateMessageQueueAveragely(), msgTraceSwitch); + public DefaultMQPushConsumer(final String consumerGroup, boolean msgTraceSwitch, final String traceTopicName) { + this(consumerGroup, null, new AllocateMessageQueueAveragely(), msgTraceSwitch, traceTopicName); } /** diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index 8bee795d01..3c33d2eed5 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -33,6 +33,7 @@ import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; import org.apache.rocketmq.client.trace.core.hook.SendMessageTrackHookImpl; import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageBatch; import org.apache.rocketmq.common.message.MessageClientIDSetter; @@ -138,7 +139,7 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * Default constructor. */ public DefaultMQProducer() { - this(MixAll.DEFAULT_PRODUCER_GROUP, null,false); + this(MixAll.DEFAULT_PRODUCER_GROUP, null); } /** @@ -158,8 +159,9 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * @param producerGroup Producer group, see the name-sake field. * @param rpcHook RPC hook to execute per each remoting command execution. * @param msgTraceSwitch switch flag instance for message track trace. + * @param traceTopicName the name value of message track trace topic.If you don't config,you can use the default trace topic name. */ - public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean msgTraceSwitch) { + public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean msgTraceSwitch,final String traceTopicName) { this.producerGroup = producerGroup; defaultMQProducerImpl = new DefaultMQProducerImpl(this, rpcHook); //if client open the message track trace feature @@ -171,6 +173,11 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { tempProperties.put(TrackTraceConstants.MAX_BATCH_NUM, "100"); tempProperties.put(TrackTraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); tempProperties.put(TrackTraceConstants.TRACE_DISPATCHER_TYPE, TrackTraceDispatcherType.PRODUCER.name()); + if (!UtilAll.isBlank(traceTopicName)) { + tempProperties.put(TrackTraceConstants.TRACE_TOPIC, traceTopicName); + } else { + tempProperties.put(TrackTraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); + } AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties); dispatcher.setHostProducer(this.getDefaultMQProducerImpl()); traceDispatcher = dispatcher; @@ -197,9 +204,10 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * * @param producerGroup Producer group, see the name-sake field. * @param msgTraceSwitch switch flag instance for message track trace. + * @param traceTopicName the name value of message track trace topic.If you don't config,you can use the default trace topic name. */ - public DefaultMQProducer(final String producerGroup, boolean msgTraceSwitch) { - this(producerGroup, null, msgTraceSwitch); + public DefaultMQProducer(final String producerGroup, boolean msgTraceSwitch, final String traceTopicName) { + this(producerGroup, null, msgTraceSwitch, traceTopicName); } /** diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java index aa49d1c5bb..a8868614b5 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java @@ -16,8 +16,6 @@ */ package org.apache.rocketmq.client.trace.core.common; -import org.apache.rocketmq.common.MixAll; - public class TrackTraceConstants { public static final String NAMESRV_ADDR = "NAMESRV_ADDR"; public static final String ADDRSRV_URL = "ADDRSRV_URL"; @@ -27,7 +25,7 @@ public class TrackTraceConstants { public static final String WAKE_UP_NUM = "WakeUpNum"; public static final String MAX_MSG_SIZE = "MaxMsgSize"; public static final String GROUP_NAME = "_INNER_TRACE_PRODUCER"; - public static final String TRACE_TOPIC = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC; + public static final String TRACE_TOPIC = "TRACK_TRACE_TOPIC_NAME"; public static final char CONTENT_SPLITOR = (char) 1; public static final char FIELD_SPLITOR = (char) 2; public static final String TRACE_DISPATCHER_TYPE = "DispatcherType"; diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java index 1c1c4c3813..90b00d414c 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java @@ -72,6 +72,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { private DefaultMQPushConsumerImpl hostConsumer; private volatile ThreadLocalIndex sendWhichQueue = new ThreadLocalIndex(); private String dispatcherId = UUID.randomUUID().toString(); + private String traceTopicName; public AsyncArrayDispatcher(Properties properties) throws MQClientException { dispatcherType = properties.getProperty(TrackTraceConstants.TRACE_DISPATCHER_TYPE); @@ -83,7 +84,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { this.discardCount = new AtomicLong(0L); traceContextQueue = new ArrayBlockingQueue(1024); appenderQueue = new ArrayBlockingQueue(queueSize); - + traceTopicName = properties.getProperty(TrackTraceConstants.TRACE_TOPIC); this.traceExecuter = new ThreadPoolExecutor(// 10, // 20, // @@ -94,6 +95,14 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { traceProducer = TrackTraceProducerFactory.getTraceDispatcherProducer(properties); } + public String getTraceTopicName() { + return traceTopicName; + } + + public void setTraceTopicName(String traceTopicName) { + this.traceTopicName = traceTopicName; + } + public DefaultMQProducer getTraceProducer() { return traceProducer; } @@ -115,7 +124,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { } public void start(Properties properties) throws MQClientException { - TrackTraceProducerFactory.registerTraceDispatcher(dispatcherId,properties.getProperty(TrackTraceConstants.NAMESRV_ADDR)); + TrackTraceProducerFactory.registerTraceDispatcher(dispatcherId, properties.getProperty(TrackTraceConstants.NAMESRV_ADDR)); this.worker = new Thread(new AsyncRunnable(), "MQ-AsyncArrayDispatcher-Thread-" + dispatcherId); this.worker.setDaemon(true); this.worker.start(); @@ -247,16 +256,14 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { transBeanList.add(traceData); } for (Map.Entry> entry : transBeanMap.entrySet()) { - //key -> dataTopic(Not trace Topic) - String dataTopic = entry.getKey(); - flushData(entry.getValue(), dataTopic); + flushData(entry.getValue()); } } /** * batch sending data actually */ - private void flushData(List transBeanList, String topic) { + private void flushData(List transBeanList) { if (transBeanList.size() == 0) { return; } @@ -292,7 +299,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { * @param data the message track trace data in this batch */ private void sendTraceDataByMQ(Set keySet, final String data) { - String topic = TrackTraceConstants.TRACE_TOPIC; + String topic = traceTopicName; final Message message = new Message(topic, data.getBytes()); //keyset of message track trace includes msgId of or original message diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java index 0c38e22036..c174f462de 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java @@ -20,11 +20,10 @@ import org.apache.rocketmq.client.hook.SendMessageContext; import org.apache.rocketmq.client.hook.SendMessageHook; import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.client.trace.core.common.TrackTraceBean; -import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; import org.apache.rocketmq.client.trace.core.common.TrackTraceContext; import org.apache.rocketmq.client.trace.core.common.TrackTraceType; import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; -import org.apache.rocketmq.common.MixAll; +import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; import java.util.ArrayList; public class SendMessageTrackHookImpl implements SendMessageHook { @@ -43,7 +42,7 @@ public class SendMessageTrackHookImpl implements SendMessageHook { @Override public void sendMessageBefore(SendMessageContext context) { //if it is message track trace data,then it doesn't recorded - if (context == null || context.getMessage().getTopic().startsWith(MixAll.SYSTEM_TOPIC_PREFIX)) { + if (context == null || context.getMessage().getTopic().startsWith(((AsyncArrayDispatcher) localDispatcher).getTraceTopicName())) { return; } //build the context content of TuxeTraceContext @@ -67,7 +66,7 @@ public class SendMessageTrackHookImpl implements SendMessageHook { @Override public void sendMessageAfter(SendMessageContext context) { //if it is message track trace data,then it doesn't recorded - if (context == null || context.getMessage().getTopic().startsWith(TrackTraceConstants.TRACE_TOPIC) + if (context == null || context.getMessage().getTopic().startsWith(((AsyncArrayDispatcher) localDispatcher).getTraceTopicName()) || context.getMqTraceContext() == null) { return; } diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java index 27c10dad5a..08382dfe8e 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java @@ -100,21 +100,23 @@ public class DefaultMQConsumerWithTraceTest { private RebalancePushImpl rebalancePushImpl; private DefaultMQPushConsumer pushConsumer; private DefaultMQPushConsumer normalPushConsumer; + private DefaultMQPushConsumer customTraceTopicpushConsumer; + private AsyncArrayDispatcher asyncArrayDispatcher; private MQClientInstance mQClientTraceFactory; @Mock private MQClientAPIImpl mQClientTraceAPIImpl; private DefaultMQProducer traceProducer; - + private String customerTraceTopic = "rmq_track_trace_topic_12345"; @Before public void init() throws Exception { consumerGroup = "FooBarGroup" + System.currentTimeMillis(); - pushConsumer = new DefaultMQPushConsumer(consumerGroup,true); + pushConsumer = new DefaultMQPushConsumer(consumerGroup,true,""); consumerGroupNormal = "FooBarGroup" + System.currentTimeMillis(); - normalPushConsumer = new DefaultMQPushConsumer(consumerGroupNormal,false); - + normalPushConsumer = new DefaultMQPushConsumer(consumerGroupNormal,false,""); + customTraceTopicpushConsumer = new DefaultMQPushConsumer(consumerGroup,true,customerTraceTopic); pushConsumer.setNamesrvAddr("127.0.0.1:9876"); pushConsumer.setPullInterval(60 * 1000); diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java index c3757a8afa..3b482884e3 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java @@ -76,6 +76,7 @@ public class DefaultMQProducerWithTraceTest { private AsyncArrayDispatcher asyncArrayDispatcher; private DefaultMQProducer producer; + private DefaultMQProducer customTraceTopicproducer; private DefaultMQProducer traceProducer; private DefaultMQProducer normalProducer; @@ -84,14 +85,17 @@ public class DefaultMQProducerWithTraceTest { private String producerGroupPrefix = "FooBar_PID"; private String producerGroupTemp = producerGroupPrefix + System.currentTimeMillis(); private String producerGroupTraceTemp = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC + System.currentTimeMillis(); - + private String customerTraceTopic = "rmq_track_trace_topic_12345"; + @Before public void init() throws Exception { - normalProducer = new DefaultMQProducer(producerGroupTemp,false); - producer = new DefaultMQProducer(producerGroupTemp,true); + customTraceTopicproducer = new DefaultMQProducer(producerGroupTemp,false, customerTraceTopic); + normalProducer = new DefaultMQProducer(producerGroupTemp,false,""); + producer = new DefaultMQProducer(producerGroupTemp,true,""); producer.setNamesrvAddr("127.0.0.1:9876"); normalProducer.setNamesrvAddr("127.0.0.1:9877"); + customTraceTopicproducer.setNamesrvAddr("127.0.0.1:9878"); message = new Message(topic, new byte[] {'a', 'b' ,'c'}); asyncArrayDispatcher = (AsyncArrayDispatcher)producer.getTraceDispatcher(); traceProducer = asyncArrayDispatcher.getTraceProducer(); diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index 77d492ecbb..11c1fcb917 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -53,6 +53,8 @@ public class BrokerConfig { private String messageStorePlugIn = ""; @ImportantField private boolean autoTraceBrokerEnable = false; + @ImportantField + private String msgTrackTopicName = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC; /** * thread numbers for send message thread pool, since spin lock will be used by default since 4.0.x, the default * value is 1. @@ -741,4 +743,12 @@ public class BrokerConfig { public void setAutoTraceBrokerEnable(boolean autoTraceBrokerEnable) { this.autoTraceBrokerEnable = autoTraceBrokerEnable; } + + public String getMsgTrackTopicName() { + return msgTrackTopicName; + } + + public void setMsgTrackTopicName(String msgTrackTopicName) { + this.msgTrackTopicName = msgTrackTopicName; + } } diff --git a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java index fb8e37fd2b..5a513e4144 100644 --- a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java @@ -26,7 +26,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class TraceProducer { public static void main(String[] args) throws MQClientException, InterruptedException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",true); + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",true, ""); producer.start(); for (int i = 0; i < 128; i++) diff --git a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java index b9710d4a73..e0e05a8cf8 100644 --- a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java @@ -28,7 +28,8 @@ import org.apache.rocketmq.common.message.MessageExt; public class TracePushConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1",true); + //here,we use the default message track trace topic name + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1",true, ""); consumer.subscribe("TopicTest", "*"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); //wrong time format 2017_0422_221800 diff --git a/logappender/src/main/java/org/apache/rocketmq/logappender/common/ProducerInstance.java b/logappender/src/main/java/org/apache/rocketmq/logappender/common/ProducerInstance.java index 7ba580df97..d2adac53db 100644 --- a/logappender/src/main/java/org/apache/rocketmq/logappender/common/ProducerInstance.java +++ b/logappender/src/main/java/org/apache/rocketmq/logappender/common/ProducerInstance.java @@ -63,7 +63,7 @@ public class ProducerInstance { return p; } - DefaultMQProducer defaultMQProducer = new DefaultMQProducer(group,false); + DefaultMQProducer defaultMQProducer = new DefaultMQProducer(group); defaultMQProducer.setNamesrvAddr(nameServerAddress); MQProducer beforeProducer = null; beforeProducer = getProducerInstance().producerMap.putIfAbsent(genKey, defaultMQProducer); diff --git a/logappender/src/test/java/org/apache/rocketmq/logappender/AbstractTestCase.java b/logappender/src/test/java/org/apache/rocketmq/logappender/AbstractTestCase.java index 1289393850..38904c0bfc 100644 --- a/logappender/src/test/java/org/apache/rocketmq/logappender/AbstractTestCase.java +++ b/logappender/src/test/java/org/apache/rocketmq/logappender/AbstractTestCase.java @@ -39,7 +39,7 @@ public class AbstractTestCase { @Before public void mockLoggerAppender() throws Exception { - DefaultMQProducer defaultMQProducer = spy(new DefaultMQProducer("loggerAppender",false)); + DefaultMQProducer defaultMQProducer = spy(new DefaultMQProducer("loggerAppender")); doAnswer(new Answer() { @Override public Void answer(InvocationOnMock invocationOnMock) throws Throwable { diff --git a/test/src/main/java/org/apache/rocketmq/test/client/rmq/RMQNormalConsumer.java b/test/src/main/java/org/apache/rocketmq/test/client/rmq/RMQNormalConsumer.java index a828e8ddf3..ce739be591 100644 --- a/test/src/main/java/org/apache/rocketmq/test/client/rmq/RMQNormalConsumer.java +++ b/test/src/main/java/org/apache/rocketmq/test/client/rmq/RMQNormalConsumer.java @@ -46,7 +46,7 @@ public class RMQNormalConsumer extends AbstractMQConsumer { } public void create(boolean useTLS) { - consumer = new DefaultMQPushConsumer(consumerGroup,false); + consumer = new DefaultMQPushConsumer(consumerGroup); consumer.setInstanceName(RandomUtil.getStringByUUID()); consumer.setNamesrvAddr(nsAddr); try { diff --git a/test/src/main/java/org/apache/rocketmq/test/factory/ProducerFactory.java b/test/src/main/java/org/apache/rocketmq/test/factory/ProducerFactory.java index abd1e3b64e..66767cc9f0 100644 --- a/test/src/main/java/org/apache/rocketmq/test/factory/ProducerFactory.java +++ b/test/src/main/java/org/apache/rocketmq/test/factory/ProducerFactory.java @@ -24,7 +24,7 @@ import org.apache.rocketmq.test.util.RandomUtil; public class ProducerFactory { public static DefaultMQProducer getRMQProducer(String ns) { - DefaultMQProducer producer = new DefaultMQProducer(RandomUtil.getStringByUUID(),false); + DefaultMQProducer producer = new DefaultMQProducer(RandomUtil.getStringByUUID()); producer.setNamesrvAddr(ns); try { producer.start(); diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/message/QueryMsgByIdSubCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/message/QueryMsgByIdSubCommand.java index 675fc2a812..6bb8caad40 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/message/QueryMsgByIdSubCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/message/QueryMsgByIdSubCommand.java @@ -213,7 +213,7 @@ public class QueryMsgByIdSubCommand implements SubCommand { public void execute(CommandLine commandLine, Options options, RPCHook rpcHook) throws SubCommandException { DefaultMQAdminExt defaultMQAdminExt = new DefaultMQAdminExt(rpcHook); defaultMQAdminExt.setInstanceName(Long.toString(System.currentTimeMillis())); - DefaultMQProducer defaultMQProducer = new DefaultMQProducer("ReSendMsgById",false); + DefaultMQProducer defaultMQProducer = new DefaultMQProducer("ReSendMsgById"); defaultMQProducer.setInstanceName(Long.toString(System.currentTimeMillis())); try { diff --git a/tools/src/main/java/org/apache/rocketmq/tools/monitor/MonitorService.java b/tools/src/main/java/org/apache/rocketmq/tools/monitor/MonitorService.java index 3debb3d15c..9bf09ad410 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/monitor/MonitorService.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/monitor/MonitorService.java @@ -65,7 +65,7 @@ public class MonitorService { private final DefaultMQPullConsumer defaultMQPullConsumer = new DefaultMQPullConsumer( MixAll.TOOLS_CONSUMER_GROUP); private final DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer( - MixAll.MONITOR_CONSUMER_GROUP,false); + MixAll.MONITOR_CONSUMER_GROUP); public MonitorService(MonitorConfig monitorConfig, MonitorListener monitorListener, RPCHook rpcHook) { this.monitorConfig = monitorConfig; From cb46a66a8ba9fca79f97a2d6fb9d107bb66f32a7 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Tue, 4 Dec 2018 10:59:38 +0800 Subject: [PATCH 62/96] Add notes --- .../main/java/org/apache/rocketmq/broker/BrokerController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index 796b72ef27..e649665ad4 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -508,6 +508,7 @@ public class BrokerController { @Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) { + //Do not catch the exception validator.validate(validator.parse(request, remoteAddr)); } From d480c8123fe515eae8ab2447ddede37daa464df0 Mon Sep 17 00:00:00 2001 From: huzongtang Date: Tue, 11 Dec 2018 18:00:40 +0800 Subject: [PATCH 63/96] [ISSUE #525] Support the message track,add the test case to increase code coverage. --- .../trace/DefaultMQProducerWithTraceTest.java | 3 +++ .../rocketmq/common/BrokerConfigTest.java | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java index 3b482884e3..9460d6834e 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java @@ -98,6 +98,9 @@ public class DefaultMQProducerWithTraceTest { customTraceTopicproducer.setNamesrvAddr("127.0.0.1:9878"); message = new Message(topic, new byte[] {'a', 'b' ,'c'}); asyncArrayDispatcher = (AsyncArrayDispatcher)producer.getTraceDispatcher(); + asyncArrayDispatcher.setTraceTopicName(customerTraceTopic); + asyncArrayDispatcher.getHostProducer(); + asyncArrayDispatcher.getHostConsumer(); traceProducer = asyncArrayDispatcher.getTraceProducer(); producer.start(); diff --git a/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java b/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java index 0fb9b3afb1..8b10eef2a1 100644 --- a/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java @@ -27,4 +27,24 @@ public class BrokerConfigTest { long expect = 1024L * 1024 * 1024 * 16; assertThat(new BrokerConfig().getConsumerFallbehindThreshold()).isEqualTo(expect); } + + @Test + public void testBrokerConfigAttribute() { + BrokerConfig brokerConfig = new BrokerConfig(); + brokerConfig.setNamesrvAddr("127.0.0.1:9876"); + brokerConfig.setAutoCreateTopicEnable(false); + brokerConfig.setAutoTraceBrokerEnable(true); + brokerConfig.setBrokerName("broker-a"); + brokerConfig.setBrokerId(0); + brokerConfig.setBrokerClusterName("DefaultCluster"); + brokerConfig.setMsgTrackTopicName("RMQ_SYS_TRACK_TRACE_TOPIC4"); + assertThat(brokerConfig.getBrokerClusterName()).isEqualTo("DefaultCluster"); + assertThat(brokerConfig.getNamesrvAddr()).isEqualTo("127.0.0.1:9876"); + assertThat(brokerConfig.getMsgTrackTopicName()).isEqualTo("RMQ_SYS_TRACK_TRACE_TOPIC4"); + assertThat(brokerConfig.getBrokerId()).isEqualTo(0); + assertThat(brokerConfig.getBrokerName()).isEqualTo("broker-a"); + assertThat(brokerConfig.isAutoCreateTopicEnable()).isEqualTo(false); + assertThat(brokerConfig.isAutoTraceBrokerEnable()).isEqualTo(true); + + } } \ No newline at end of file From e3d38d7c3fa71d100fabc7fc3d34a11609ce3f5e Mon Sep 17 00:00:00 2001 From: dongeforever Date: Wed, 12 Dec 2018 11:36:40 +0800 Subject: [PATCH 64/96] Rename and polish permission loader --- .../rocketmq/acl/common/Permission.java | 18 +- .../acl/plain/PlainAccessResource.java | 17 ++ .../acl/plain/PlainAccessValidator.java | 2 +- .../acl/plain/PlainPermissionLoader.java | 206 +++++++++--------- .../plain/RemoteAddressStrategyFactory.java | 33 +-- .../rocketmq/acl/common/PermissionTest.java | 28 +-- .../acl/plain/PlainPermissionLoaderTest.java | 20 +- .../acl/plain/RemoteAddressStrategyTest.java | 36 +-- acl/src/test/resources/conf/transport.yml | 4 +- .../org/apache/rocketmq/common/UtilAll.java | 12 + 10 files changed, 205 insertions(+), 171 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java index b5e9be20f1..2fa38b15bd 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java @@ -55,7 +55,7 @@ public class Permission { return (neededPerm & ownedPerm) > 0; } - public static byte fromStringGetPermission(String permString) { + public static byte parsePermFromString(String permString) { if (permString == null) { return Permission.DENY; } @@ -77,21 +77,21 @@ public class Permission { } } - public static void setTopicPerm(PlainAccessResource plainAccessResource, Boolean isTopic, List topicArray) { - if (topicArray == null || topicArray.isEmpty()) { + public static void parseResourcePerms(PlainAccessResource plainAccessResource, Boolean isTopic, List resources) { + if (resources == null || resources.isEmpty()) { return; } - for (String topic : topicArray) { - String[] topicPrem = StringUtils.split(topic, "="); - if (topicPrem.length == 2) { - plainAccessResource.addResourceAndPerm(isTopic ? topicPrem[0] : PlainAccessResource.getRetryTopic(topicPrem[0]), fromStringGetPermission(topicPrem[1])); + for (String resource : resources) { + String[] items = StringUtils.split(resource, "="); + if (items.length == 2) { + plainAccessResource.addResourceAndPerm(isTopic ? items[0].trim() : PlainAccessResource.getRetryTopic(items[0].trim()), parsePermFromString(items[1].trim())); } else { - throw new AclException(String.format("%s Permission config erron %s", isTopic ? "topic" : "group", topic)); + throw new AclException(String.format("Parse resource permission failed for %s:%s", isTopic ? "topic" : "group", resource)); } } } - public static boolean checkAdminCode(Integer code) { + public static boolean needAdminPerm(Integer code) { return ADMIN_CODE.contains(code); } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java index 0b2f417c67..932a7a94ff 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java @@ -59,6 +59,23 @@ public class PlainAccessResource implements AccessResource { return null != topic && topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX); } + public static String printStr(String resource, boolean isGroup) { + if (resource == null) { + return null; + } + if (isGroup) { + return String.format("%s:%s", "group", getGroupFromRetryTopic(resource)); + } else { + return String.format("%s:%s", "topic", resource); + } + } + + public static String getGroupFromRetryTopic(String retryTopic) { + if (retryTopic == null) { + return null; + } + return retryTopic.substring(MixAll.RETRY_GROUP_TOPIC_PREFIX.length()); + } public static String getRetryTopic(String group) { if (group == null) { return null; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java index 8a80757a3d..d71509846f 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java @@ -120,7 +120,7 @@ public class PlainAccessValidator implements AccessValidator { @Override public void validate(AccessResource accessResource) { - aclPlugEngine.eachCheckPlainAccessResource((PlainAccessResource) accessResource); + aclPlugEngine.validate((PlainAccessResource) accessResource); } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 469c161205..36f6522119 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -28,16 +28,15 @@ import java.nio.file.WatchKey; import java.nio.file.WatchService; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.common.AclException; import org.apache.rocketmq.acl.common.AclUtils; import org.apache.rocketmq.acl.common.Permission; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.ServiceThread; +import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.logging.InternalLoggerFactory; @@ -46,13 +45,14 @@ public class PlainPermissionLoader { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); + private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - private String fileName = System.getProperty("romcketmq.acl.plain.fileName", "/conf/transport.yml"); + //TODO rename transport to plain_acl.yml + private String fileName = System.getProperty("rocketmq.acl.plain.file", "/conf/transport.yml"); - private Map> plainAccessResourceMap = new HashMap<>(); + private Map plainAccessResourceMap = new HashMap<>(); private List globalWhiteRemoteAddressStrategy = new ArrayList<>(); @@ -61,6 +61,7 @@ public class PlainPermissionLoader { private boolean isWatchStart; public PlainPermissionLoader() { + //TODO test what will happen if initialize failed initialize(); watch(); } @@ -76,25 +77,24 @@ public class PlainPermissionLoader { JSONArray globalWhiteRemoteAddressesList = accessControlTransport.getJSONArray("globalWhiteRemoteAddresses"); if (globalWhiteRemoteAddressesList != null && !globalWhiteRemoteAddressesList.isEmpty()) { for (int i = 0; i < globalWhiteRemoteAddressesList.size(); i++) { - setGlobalWhite(globalWhiteRemoteAddressesList.getString(i)); + addGlobalWhiteRemoteAddress(globalWhiteRemoteAddressesList.getString(i)); } } JSONArray accounts = accessControlTransport.getJSONArray("accounts"); - List plainAccessList = accounts.toJavaList(PlainAccess.class); + List plainAccessList = accounts.toJavaList(PlainAccessConfig.class); if (plainAccessList != null && !plainAccessList.isEmpty()) { - for (PlainAccess plainAccess : plainAccessList) { - this.setPlainAccessResource(getPlainAccessResource(plainAccess)); + for (PlainAccessConfig plainAccess : plainAccessList) { + this.addPlainAccessResource(getPlainAccessResource(plainAccess)); } } } private void watch() { String version = System.getProperty("java.version"); - log.info("java.version is : {}", version); String[] str = StringUtils.split(version, "."); if (Integer.valueOf(str[1]) < 7) { - log.warn("wacth need jdk 1.7 support , current version no support"); + log.warn("Watch need jdk equal or greater than 1.7, current version is {}", str[1]); return; } try { @@ -106,41 +106,41 @@ public class PlainPermissionLoader { public void run() { while (true) { try { - while (true) { - WatchKey watchKey = watcher.take(); - List> watchEvents = watchKey.pollEvents(); - for (WatchEvent event : watchEvents) { - if ("transport.yml".equals(event.context().toString()) - && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) - || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { - log.info("transprot.yml make a difference change is : ", event.toString()); - PlainPermissionLoader.this.cleanAuthenticationInfo(); - initialize(); - } + WatchKey watchKey = watcher.take(); + List> watchEvents = watchKey.pollEvents(); + for (WatchEvent event : watchEvents) { + //TODO use variable instead of raw text + if ("transport.yml".equals(event.context().toString()) + && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) + || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { + log.info("transprot.yml make a difference change is : ", event.toString()); + PlainPermissionLoader.this.clearPermissionInfo(); + initialize(); } - watchKey.reset(); } + watchKey.reset(); } catch (InterruptedException e) { log.error(e.getMessage(), e); + UtilAll.sleep(3000); + } } } - @Override public String getServiceName() { - return "watcherServcie"; + return "AclWatcherService"; } }; watcherServcie.start(); - log.info("succeed start watcherServcie"); + log.info("Succeed to start AclWatcherService"); this.isWatchStart = true; } catch (IOException e) { - log.error(e.getMessage(), e); + log.error("Failed to start AclWatcherService", e); } } - PlainAccessResource getPlainAccessResource(PlainAccess plainAccess) { + PlainAccessResource getPlainAccessResource(PlainAccessConfig plainAccess) { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setAccessKey(plainAccess.getAccessKey()); plainAccessResource.setSecretKey(plainAccess.getSecretKey()); @@ -148,110 +148,114 @@ public class PlainPermissionLoader { plainAccessResource.setAdmin(plainAccess.isAdmin()); - plainAccessResource.setDefaultGroupPerm(Permission.fromStringGetPermission(plainAccess.getDefaultGroupPerm())); - plainAccessResource.setDefaultTopicPerm(Permission.fromStringGetPermission(plainAccess.getDefaultTopicPerm())); + plainAccessResource.setDefaultGroupPerm(Permission.parsePermFromString(plainAccess.getDefaultGroupPerm())); + plainAccessResource.setDefaultTopicPerm(Permission.parsePermFromString(plainAccess.getDefaultTopicPerm())); - Permission.setTopicPerm(plainAccessResource, false, plainAccess.getGroups()); - Permission.setTopicPerm(plainAccessResource, true, plainAccess.getTopics()); + Permission.parseResourcePerms(plainAccessResource, false, plainAccess.getGroupPerms()); + Permission.parseResourcePerms(plainAccessResource, true, plainAccess.getTopicPerms()); return plainAccessResource; } - void checkPerm(PlainAccessResource needCheckplainAccessResource, PlainAccessResource plainAccessResource) { - if (!plainAccessResource.isAdmin() && Permission.checkAdminCode(needCheckplainAccessResource.getRequestCode())) { - throw new AclException(String.format("accessKey is %s remoteAddress is %s , is not admin Premission . RequestCode is %d", plainAccessResource.getAccessKey(), plainAccessResource.getWhiteRemoteAddress(), needCheckplainAccessResource.getRequestCode())); + void checkPerm(PlainAccessResource needCheckedAccess, PlainAccessResource ownedAccess) { + if (Permission.needAdminPerm(needCheckedAccess.getRequestCode()) && !ownedAccess.isAdmin()) { + throw new AclException(String.format("Need admin permission for request code=%d, but accessKey=%s is not", needCheckedAccess.getRequestCode(), ownedAccess.getAccessKey())); } - Map needCheckTopicAndGourpPerm = needCheckplainAccessResource.getResourcePermMap(); - Map topicAndGourpPerm = plainAccessResource.getResourcePermMap(); + Map needCheckedPermMap = needCheckedAccess.getResourcePermMap(); + Map ownedPermMap = ownedAccess.getResourcePermMap(); - Iterator> it = topicAndGourpPerm.entrySet().iterator(); - Byte perm; - while (it.hasNext()) { - Entry e = it.next(); - if ((perm = needCheckTopicAndGourpPerm.get(e.getKey())) != null && Permission.checkPermission(perm, e.getValue())) { + for (Map.Entry needCheckedEntry : needCheckedPermMap.entrySet()) { + String resource = needCheckedEntry.getKey(); + Byte neededPerm = needCheckedEntry.getValue(); + boolean isGroup = PlainAccessResource.isRetryTopic(resource); + + if (!ownedPermMap.containsKey(resource)) { + //Check the default perm + byte ownedPerm = isGroup ? needCheckedAccess.getDefaultGroupPerm() : + needCheckedAccess.getDefaultTopicPerm(); + if (!Permission.checkPermission(neededPerm, ownedPerm)) { + throw new AclException(String.format("No default permission for %s", PlainAccessResource.printStr(resource, isGroup))); + } continue; } - byte neededPerm = PlainAccessResource.isRetryTopic(e.getKey()) ? needCheckplainAccessResource.getDefaultGroupPerm() : - needCheckplainAccessResource.getDefaultTopicPerm(); - if (!Permission.checkPermission(neededPerm, e.getValue())) { - throw new AclException(String.format("", e.toString())); + if (!Permission.checkPermission(neededPerm, ownedPermMap.get(resource))) { + throw new AclException(String.format("No default permission for %s", PlainAccessResource.printStr(resource, isGroup))); } } } - void cleanAuthenticationInfo() { + void clearPermissionInfo() { this.plainAccessResourceMap.clear(); this.globalWhiteRemoteAddressStrategy.clear(); } - public void setPlainAccessResource(PlainAccessResource plainAccessResource) throws AclException { - if (plainAccessResource.getAccessKey() == null || plainAccessResource.getSecretKey() == null + public void addPlainAccessResource(PlainAccessResource plainAccessResource) throws AclException { + if (plainAccessResource.getAccessKey() == null + || plainAccessResource.getSecretKey() == null || plainAccessResource.getAccessKey().length() <= 6 || plainAccessResource.getSecretKey().length() <= 6) { throw new AclException(String.format( - "The account password cannot be null and is longer than 6, account is %s password is %s", + "The accessKey=%s and secretKey=%s cannot be null and length should longer than 6", plainAccessResource.getAccessKey(), plainAccessResource.getSecretKey())); } try { RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory - .getNetaddressStrategy(plainAccessResource); - List accessControlAddressList = plainAccessResourceMap.get(plainAccessResource.getAccessKey()); - if (accessControlAddressList == null) { - accessControlAddressList = new ArrayList<>(); - plainAccessResourceMap.put(plainAccessResource.getAccessKey(), accessControlAddressList); - } + .getRemoteAddressStrategy(plainAccessResource); plainAccessResource.setRemoteAddressStrategy(remoteAddressStrategy); - accessControlAddressList.add(plainAccessResource); - log.info("authenticationInfo is {}", plainAccessResource.toString()); - } catch (Exception e) { - throw new AclException( - String.format("Exception info %s %s", e.getMessage(), plainAccessResource.toString()), e); - } - } - - private void setGlobalWhite(String remoteAddresses) { - globalWhiteRemoteAddressStrategy.add(remoteAddressStrategyFactory.getNetaddressStrategy(remoteAddresses)); - } - - public void eachCheckPlainAccessResource(PlainAccessResource plainAccessResource) { - - List plainAccessResourceAddressList = plainAccessResourceMap.get(plainAccessResource.getAccessKey()); - boolean isDistinguishAccessKey = false; - if (plainAccessResourceAddressList != null) { - for (PlainAccessResource plainAccess : plainAccessResourceAddressList) { - if (!plainAccess.getRemoteAddressStrategy().match(plainAccessResource)) { - isDistinguishAccessKey = true; - continue; - } - String signature = AclUtils.calSignature(plainAccessResource.getContent(), plainAccess.getSecretKey()); - if (signature.equals(plainAccessResource.getSignature())) { - checkPerm(plainAccess, plainAccessResource); - return; - } else { - throw new AclException(String.format("signature is erron. erron accessKe is %s , erron reomiteAddress %s", plainAccess.getAccessKey(), plainAccessResource.getWhiteRemoteAddress())); - } + if (plainAccessResourceMap.containsKey(plainAccessResource.getAccessKey())) { + log.warn("Duplicate acl config for {}, the newly one may overwrite the old", plainAccessResource.getAccessKey()); } + plainAccessResourceMap.put(plainAccessResource.getAccessKey(), plainAccessResource); + } catch (Exception e) { + throw new AclException(String.format("Load plain access resource failed %s %s", e.getMessage(), plainAccessResource.toString()), e); } + } - if (plainAccessResource.getAccessKey() == null && !globalWhiteRemoteAddressStrategy.isEmpty()) { + private void addGlobalWhiteRemoteAddress(String remoteAddresses) { + globalWhiteRemoteAddressStrategy.add(remoteAddressStrategyFactory.getRemoteAddressStrategy(remoteAddresses)); + } + + public void validate(PlainAccessResource plainAccessResource) { + + //Step 1, check the global white remote addr + if (plainAccessResource.getAccessKey() == null) { + if (globalWhiteRemoteAddressStrategy.isEmpty()) { + throw new AclException(String.format("No accessKey is configured and no global white remote addr is configured")); + } for (RemoteAddressStrategy remoteAddressStrategy : globalWhiteRemoteAddressStrategy) { if (remoteAddressStrategy.match(plainAccessResource)) { return; } } + throw new AclException(String.format("No accessKey is configured and no global white remote addr is matched")); } - if (isDistinguishAccessKey) { - throw new AclException(String.format("client ip not in WhiteRemoteAddress . erron accessKe is %s , erron reomiteAddress %s", plainAccessResource.getAccessKey(), plainAccessResource.getWhiteRemoteAddress())); - } else { - throw new AclException(String.format("It is not make Access and make client ip .erron accessKe is %s , erron reomiteAddress %s", plainAccessResource.getAccessKey(), plainAccessResource.getWhiteRemoteAddress())); + + if (!plainAccessResourceMap.containsKey(plainAccessResource.getAccessKey())) { + throw new AclException(String.format("No acl config for %s", plainAccessResource.getAccessKey())); } + + //Step 2, check the white addr for accesskey + PlainAccessResource ownedAccess = plainAccessResourceMap.get(plainAccessResource.getAccessKey()); + if (ownedAccess.getRemoteAddressStrategy().match(plainAccessResource)) { + return; + } + + + //Step 3, check the signature + String signature = AclUtils.calSignature(plainAccessResource.getContent(), ownedAccess.getSecretKey()); + if (!signature.equals(plainAccessResource.getSignature())) { + throw new AclException(String.format("Check signature failed for accessKey=%s", plainAccessResource.getAccessKey())); + } + //Step 4, check perm of each resource + + checkPerm(plainAccessResource, ownedAccess); } public boolean isWatchStart() { return isWatchStart; } - static class PlainAccess { + static class PlainAccessConfig { private String accessKey; @@ -265,9 +269,9 @@ public class PlainPermissionLoader { private String defaultGroupPerm; - private List topics; + private List topicPerms; - private List groups; + private List groupPerms; public String getAccessKey() { return accessKey; @@ -317,20 +321,20 @@ public class PlainPermissionLoader { this.defaultGroupPerm = defaultGroupPerm; } - public List getTopics() { - return topics; + public List getTopicPerms() { + return topicPerms; } - public void setTopics(List topics) { - this.topics = topics; + public void setTopicPerms(List topicPerms) { + this.topicPerms = topicPerms; } - public List getGroups() { - return groups; + public List getGroupPerms() { + return groupPerms; } - public void setGroups(List groups) { - this.groups = groups; + public void setGroupPerms(List groupPerms) { + this.groupPerms = groupPerms; } } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java index 8015b6820d..679e846d19 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java @@ -26,28 +26,29 @@ public class RemoteAddressStrategyFactory { public static final NullRemoteAddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullRemoteAddressStrategy(); - public RemoteAddressStrategy getNetaddressStrategy(PlainAccessResource plainAccessResource) { - return getNetaddressStrategy(plainAccessResource.getWhiteRemoteAddress()); + public RemoteAddressStrategy getRemoteAddressStrategy(PlainAccessResource plainAccessResource) { + return getRemoteAddressStrategy(plainAccessResource.getWhiteRemoteAddress()); } - public RemoteAddressStrategy getNetaddressStrategy(String netaddress) { - if (StringUtils.isBlank(netaddress) || "*".equals(netaddress)) { + public RemoteAddressStrategy getRemoteAddressStrategy(String remoteAddr) { + //TODO if the white addr is not configured, should reject it. + if (StringUtils.isBlank(remoteAddr) || "*".equals(remoteAddr)) { return NULL_NET_ADDRESS_STRATEGY; } - if (netaddress.endsWith("}")) { - String[] strArray = StringUtils.split(netaddress, "."); + if (remoteAddr.endsWith("}")) { + String[] strArray = StringUtils.split(remoteAddr, "."); String four = strArray[3]; if (!four.startsWith("{")) { - throw new AclException(String.format("MultipleRemoteAddressStrategy netaddress examine scope Exception netaddress", netaddress)); + throw new AclException(String.format("MultipleRemoteAddressStrategy netaddress examine scope Exception netaddress", remoteAddr)); } - return new MultipleRemoteAddressStrategy(AclUtils.getAddreeStrArray(netaddress, four)); - } else if (AclUtils.isColon(netaddress)) { - return new MultipleRemoteAddressStrategy(StringUtils.split(netaddress, ",")); - } else if (AclUtils.isAsterisk(netaddress) || AclUtils.isMinus(netaddress)) { - return new RangeRemoteAddressStrategy(netaddress); + return new MultipleRemoteAddressStrategy(AclUtils.getAddreeStrArray(remoteAddr, four)); + } else if (AclUtils.isColon(remoteAddr)) { + return new MultipleRemoteAddressStrategy(StringUtils.split(remoteAddr, ",")); + } else if (AclUtils.isAsterisk(remoteAddr) || AclUtils.isMinus(remoteAddr)) { + return new RangeRemoteAddressStrategy(remoteAddr); } - return new OneRemoteAddressStrategy(netaddress); + return new OneRemoteAddressStrategy(remoteAddr); } @@ -103,10 +104,10 @@ public class RemoteAddressStrategyFactory { private int index; - public RangeRemoteAddressStrategy(String netaddress) { - String[] strArray = StringUtils.split(netaddress, "."); + public RangeRemoteAddressStrategy(String remoteAddr) { + String[] strArray = StringUtils.split(remoteAddr, "."); if (analysis(strArray, 2) || analysis(strArray, 3)) { - AclUtils.verify(netaddress, index - 1); + AclUtils.verify(remoteAddr, index - 1); StringBuffer sb = new StringBuffer().append(strArray[0].trim()).append(".").append(strArray[1].trim()).append("."); if (index == 3) { sb.append(strArray[2].trim()).append("."); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java index 04a3f8f2c3..2d998cc4e5 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java @@ -29,28 +29,28 @@ public class PermissionTest { @Test public void fromStringGetPermissionTest() { - byte perm = Permission.fromStringGetPermission("PUB"); + byte perm = Permission.parsePermFromString("PUB"); Assert.assertEquals(perm, Permission.PUB); - perm = Permission.fromStringGetPermission("SUB"); + perm = Permission.parsePermFromString("SUB"); Assert.assertEquals(perm, Permission.SUB); - perm = Permission.fromStringGetPermission("ANY"); + perm = Permission.parsePermFromString("ANY"); Assert.assertEquals(perm, Permission.ANY); - perm = Permission.fromStringGetPermission("PUB|SUB"); + perm = Permission.parsePermFromString("PUB|SUB"); Assert.assertEquals(perm, Permission.ANY); - perm = Permission.fromStringGetPermission("SUB|PUB"); + perm = Permission.parsePermFromString("SUB|PUB"); Assert.assertEquals(perm, Permission.ANY); - perm = Permission.fromStringGetPermission("DENY"); + perm = Permission.parsePermFromString("DENY"); Assert.assertEquals(perm, Permission.DENY); - perm = Permission.fromStringGetPermission("1"); + perm = Permission.parsePermFromString("1"); Assert.assertEquals(perm, Permission.DENY); - perm = Permission.fromStringGetPermission(null); + perm = Permission.parsePermFromString(null); Assert.assertEquals(perm, Permission.DENY); } @@ -91,17 +91,17 @@ public class PermissionTest { PlainAccessResource plainAccessResource = new PlainAccessResource(); Map resourcePermMap = plainAccessResource.getResourcePermMap(); - Permission.setTopicPerm(plainAccessResource, false, null); + Permission.parseResourcePerms(plainAccessResource, false, null); Assert.assertNull(resourcePermMap); List groups = new ArrayList<>(); - Permission.setTopicPerm(plainAccessResource, false, groups); + Permission.parseResourcePerms(plainAccessResource, false, groups); Assert.assertNull(resourcePermMap); groups.add("groupA=DENY"); groups.add("groupB=PUB|SUB"); groups.add("groupC=PUB"); - Permission.setTopicPerm(plainAccessResource, false, groups); + Permission.parseResourcePerms(plainAccessResource, false, groups); resourcePermMap = plainAccessResource.getResourcePermMap(); byte perm = resourcePermMap.get(PlainAccessResource.getRetryTopic("groupA")); @@ -118,7 +118,7 @@ public class PermissionTest { topics.add("topicB=PUB|SUB"); topics.add("topicC=PUB"); - Permission.setTopicPerm(plainAccessResource, true, topics); + Permission.parseResourcePerms(plainAccessResource, true, topics); perm = resourcePermMap.get("topicA"); Assert.assertEquals(perm, Permission.DENY); @@ -131,7 +131,7 @@ public class PermissionTest { List erron = new ArrayList<>(); erron.add(""); - Permission.setTopicPerm(plainAccessResource, false, erron); + Permission.parseResourcePerms(plainAccessResource, false, erron); } @Test @@ -144,7 +144,7 @@ public class PermissionTest { code.add(207); for (int i = 0; i < 400; i++) { - boolean boo = Permission.checkAdminCode(i); + boolean boo = Permission.needAdminPerm(i); if (boo) { Assert.assertTrue(code.contains(i)); } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java index 45004ec2ed..de9b45dc3d 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -27,7 +27,7 @@ import java.util.Set; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.rocketmq.acl.common.AclException; import org.apache.rocketmq.acl.common.Permission; -import org.apache.rocketmq.acl.plain.PlainPermissionLoader.PlainAccess; +import org.apache.rocketmq.acl.plain.PlainPermissionLoader.PlainAccessConfig; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -90,7 +90,7 @@ public class PlainPermissionLoaderTest { @Test public void getPlainAccessResourceTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - PlainAccess plainAccess = new PlainAccess(); + PlainAccessConfig plainAccess = new PlainAccessConfig(); plainAccess.setAccessKey("RocketMQ"); plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); @@ -120,7 +120,7 @@ public class PlainPermissionLoaderTest { groups.add("groupA=DENY"); groups.add("groupB=PUB|SUB"); groups.add("groupC=PUB"); - plainAccess.setGroups(groups); + plainAccess.setGroupPerms(groups); plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Map resourcePermMap = plainAccessResource.getResourcePermMap(); Assert.assertEquals(resourcePermMap.size(), 3); @@ -133,7 +133,7 @@ public class PlainPermissionLoaderTest { topics.add("topicA=DENY"); topics.add("topicB=PUB|SUB"); topics.add("topicC=PUB"); - plainAccess.setTopics(topics); + plainAccess.setTopicPerms(topics); plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); resourcePermMap = plainAccessResource.getResourcePermMap(); Assert.assertEquals(resourcePermMap.size(), 6); @@ -170,25 +170,25 @@ public class PlainPermissionLoaderTest { @Test(expected = AclException.class) public void accountNullTest() { plainAccessResource.setAccessKey(null); - plainPermissionLoader.setPlainAccessResource(plainAccessResource); + plainPermissionLoader.addPlainAccessResource(plainAccessResource); } @Test(expected = AclException.class) public void accountThanTest() { plainAccessResource.setAccessKey("123"); - plainPermissionLoader.setPlainAccessResource(plainAccessResource); + plainPermissionLoader.addPlainAccessResource(plainAccessResource); } @Test(expected = AclException.class) public void passWordtNullTest() { plainAccessResource.setAccessKey(null); - plainPermissionLoader.setPlainAccessResource(plainAccessResource); + plainPermissionLoader.addPlainAccessResource(plainAccessResource); } @Test(expected = AclException.class) public void passWordThanTest() { plainAccessResource.setAccessKey("123"); - plainPermissionLoader.setPlainAccessResource(plainAccessResource); + plainPermissionLoader.addPlainAccessResource(plainAccessResource); } @Test(expected = AclException.class) @@ -200,11 +200,11 @@ public class PlainPermissionLoaderTest { @SuppressWarnings("unchecked") @Test public void cleanAuthenticationInfoTest() throws IllegalAccessException { - //plainPermissionLoader.setPlainAccessResource(plainAccessResource); + //plainPermissionLoader.addPlainAccessResource(plainAccessResource); Map> plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); Assert.assertFalse(plainAccessResourceMap.isEmpty()); - plainPermissionLoader.cleanAuthenticationInfo(); + plainPermissionLoader.clearPermissionInfo(); plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); Assert.assertTrue(plainAccessResourceMap.isEmpty()); } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java index 1d681e0f46..527c5c297e 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java @@ -27,35 +27,35 @@ public class RemoteAddressStrategyTest { @Test public void NetaddressStrategyFactoryTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); plainAccessResource.setWhiteRemoteAddress("*"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.OneRemoteAddressStrategy.class); plainAccessResource.setWhiteRemoteAddress("127.0.0.1,127.0.0.2,127.0.0.3"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.MultipleRemoteAddressStrategy.class); plainAccessResource.setWhiteRemoteAddress("127.0.0.{1,2,3}"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.MultipleRemoteAddressStrategy.class); plainAccessResource.setWhiteRemoteAddress("127.0.0.1-200"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); plainAccessResource.setWhiteRemoteAddress("127.0.0.*"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); plainAccessResource.setWhiteRemoteAddress("127.0.1-20.*"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); } @@ -63,9 +63,9 @@ public class RemoteAddressStrategyTest { public void verifyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); - remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); plainAccessResource.setWhiteRemoteAddress("256.0.0.1"); - remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); } @Test @@ -77,7 +77,7 @@ public class RemoteAddressStrategyTest { public void oneNetaddressStrategyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); - RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); plainAccessResource.setWhiteRemoteAddress(""); boolean match = remoteAddressStrategy.match(plainAccessResource); Assert.assertFalse(match); @@ -95,11 +95,11 @@ public class RemoteAddressStrategyTest { public void multipleNetaddressStrategyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setWhiteRemoteAddress("127.0.0.1,127.0.0.2,127.0.0.3"); - RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); multipleNetaddressStrategyTest(remoteAddressStrategy); plainAccessResource.setWhiteRemoteAddress("127.0.0.{1,2,3}"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); multipleNetaddressStrategyTest(remoteAddressStrategy); } @@ -108,7 +108,7 @@ public class RemoteAddressStrategyTest { public void multipleNetaddressStrategyExceptionTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setWhiteRemoteAddress("127.0.0.1,2,3}"); - remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); } private void multipleNetaddressStrategyTest(RemoteAddressStrategy remoteAddressStrategy) { @@ -140,14 +140,14 @@ public class RemoteAddressStrategyTest { String head = "127.0.0."; PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setWhiteRemoteAddress("127.0.0.1-200"); - RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); rangeNetaddressStrategyTest(remoteAddressStrategy, head, 1, 200, true); plainAccessResource.setWhiteRemoteAddress("127.0.0.*"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); rangeNetaddressStrategyTest(remoteAddressStrategy, head, 0, 255, true); plainAccessResource.setWhiteRemoteAddress("127.0.1-200.*"); - remoteAddressStrategy = remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); rangeNetaddressStrategyThirdlyTest(remoteAddressStrategy, head, 1, 200); } @@ -196,7 +196,7 @@ public class RemoteAddressStrategyTest { private void rangeNetaddressStrategyExceptionTest(String netaddress) { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setWhiteRemoteAddress(netaddress); - remoteAddressStrategyFactory.getNetaddressStrategy(plainAccessResource); + remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); } } diff --git a/acl/src/test/resources/conf/transport.yml b/acl/src/test/resources/conf/transport.yml index 2c3070e191..5daefb67c3 100644 --- a/acl/src/test/resources/conf/transport.yml +++ b/acl/src/test/resources/conf/transport.yml @@ -26,11 +26,11 @@ accounts: admin: false defaultTopicPerm: DENY defaultGroupPerm: SUB - topics: + topicPerms: - topicA=DENY - topicB=PUB|SUB - topicC=SUB - groups: + groupPerms: # the group should convert to retry topic - groupA=DENY - groupB=SUB diff --git a/common/src/main/java/org/apache/rocketmq/common/UtilAll.java b/common/src/main/java/org/apache/rocketmq/common/UtilAll.java index a846755d8d..dee6ca2911 100644 --- a/common/src/main/java/org/apache/rocketmq/common/UtilAll.java +++ b/common/src/main/java/org/apache/rocketmq/common/UtilAll.java @@ -60,6 +60,18 @@ public class UtilAll { } } + public static void sleep(long sleepMs) { + if (sleepMs < 0) { + return; + } + try { + Thread.sleep(sleepMs); + } catch (Throwable ignored) { + + } + + } + public static String currentStackTrace() { StringBuilder sb = new StringBuilder(); StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); From c127438371bc9d880878f73f5d540a1bb593fdaf Mon Sep 17 00:00:00 2001 From: laohu <2372554140@qq.com> Date: Thu, 13 Dec 2018 09:15:09 +0800 Subject: [PATCH 65/96] handle TODO --- .../rocketmq/acl/common/Permission.java | 3 +- .../acl/plain/PlainAccessResource.java | 1 + .../acl/plain/PlainPermissionLoader.java | 20 +++++++------ .../plain/RemoteAddressStrategyFactory.java | 6 ++-- .../rocketmq/acl/common/AclUtilsTest.java | 4 +-- .../acl/plain/PlainPermissionLoaderTest.java | 28 +++++++++---------- .../acl/plain/RemoteAddressStrategyTest.java | 12 +++++--- .../conf/{transport.yml => plain_acl.yml} | 0 ...{transport-null.yml => plain_acl_null.yml} | 0 .../conf/{transport.yml => plain_acl.yml} | 0 pom.xml | 4 +-- 11 files changed, 45 insertions(+), 33 deletions(-) rename acl/src/test/resources/conf/{transport.yml => plain_acl.yml} (100%) rename acl/src/test/resources/conf/{transport-null.yml => plain_acl_null.yml} (100%) rename distribution/conf/{transport.yml => plain_acl.yml} (100%) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java index 2fa38b15bd..c608f05dac 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java @@ -77,7 +77,8 @@ public class Permission { } } - public static void parseResourcePerms(PlainAccessResource plainAccessResource, Boolean isTopic, List resources) { + public static void parseResourcePerms(PlainAccessResource plainAccessResource, Boolean isTopic, + List resources) { if (resources == null || resources.isEmpty()) { return; } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java index 932a7a94ff..9017bf22ea 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java @@ -76,6 +76,7 @@ public class PlainAccessResource implements AccessResource { } return retryTopic.substring(MixAll.RETRY_GROUP_TOPIC_PREFIX.length()); } + public static String getRetryTopic(String group) { if (group == null) { return null; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 36f6522119..01161d0cfa 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -45,12 +45,12 @@ public class PlainPermissionLoader { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); + private static final String DEFAULT_PLAIN_ACL_FILE = "/conf/plain_acl.yml"; private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - //TODO rename transport to plain_acl.yml - private String fileName = System.getProperty("rocketmq.acl.plain.file", "/conf/transport.yml"); + private String fileName = System.getProperty("rocketmq.acl.plain.file", DEFAULT_PLAIN_ACL_FILE); private Map plainAccessResourceMap = new HashMap<>(); @@ -61,7 +61,6 @@ public class PlainPermissionLoader { private boolean isWatchStart; public PlainPermissionLoader() { - //TODO test what will happen if initialize failed initialize(); watch(); } @@ -97,9 +96,15 @@ public class PlainPermissionLoader { log.warn("Watch need jdk equal or greater than 1.7, current version is {}", str[1]); return; } + try { + int fileIndex = fileName.lastIndexOf("/") + 1; + String watchDirectory = fileName.substring(0, fileIndex); + final String watchFileName = fileName.substring(fileIndex); + log.info("watch directory is {} , watch directory file name is {} ", fileHome + watchDirectory, watchFileName); + final WatchService watcher = FileSystems.getDefault().newWatchService(); - Path p = Paths.get(fileHome + "/conf/"); + Path p = Paths.get(fileHome + watchDirectory); p.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE); ServiceThread watcherServcie = new ServiceThread() { @@ -109,11 +114,10 @@ public class PlainPermissionLoader { WatchKey watchKey = watcher.take(); List> watchEvents = watchKey.pollEvents(); for (WatchEvent event : watchEvents) { - //TODO use variable instead of raw text - if ("transport.yml".equals(event.context().toString()) + if (watchFileName.equals(event.context().toString()) && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { - log.info("transprot.yml make a difference change is : ", event.toString()); + log.info("{} make a difference change is : {}", watchFileName, event.toString()); PlainPermissionLoader.this.clearPermissionInfo(); initialize(); } @@ -126,6 +130,7 @@ public class PlainPermissionLoader { } } } + @Override public String getServiceName() { return "AclWatcherService"; @@ -240,7 +245,6 @@ public class PlainPermissionLoader { return; } - //Step 3, check the signature String signature = AclUtils.calSignature(plainAccessResource.getContent(), ownedAccess.getSecretKey()); if (!signature.equals(plainAccessResource.getSignature())) { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java index 679e846d19..b82d79388a 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java @@ -32,8 +32,10 @@ public class RemoteAddressStrategyFactory { } public RemoteAddressStrategy getRemoteAddressStrategy(String remoteAddr) { - //TODO if the white addr is not configured, should reject it. - if (StringUtils.isBlank(remoteAddr) || "*".equals(remoteAddr)) { + if (StringUtils.isBlank(remoteAddr)) { + throw new AclException("Must fill in the white list address"); + } + if ("*".equals(remoteAddr)) { return NULL_NET_ADDRESS_STRATEGY; } if (remoteAddr.endsWith("}")) { diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java index 36af31f91f..72bcda6bb3 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java @@ -129,13 +129,13 @@ public class AclUtilsTest { @Test public void getYamlDataObjectTest() { - Map map = AclUtils.getYamlDataObject("src/test/resources/conf/transport.yml", Map.class); + Map map = AclUtils.getYamlDataObject("src/test/resources/conf/plain_acl.yml", Map.class); Assert.assertFalse(map.isEmpty()); } @Test(expected = Exception.class) public void getYamlDataObjectExceptionTest() { - AclUtils.getYamlDataObject("transport.yml", Map.class); + AclUtils.getYamlDataObject("plain_acl.yml", Map.class); } } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java index de9b45dc3d..4f5ae5b523 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -63,7 +63,7 @@ public class PlainPermissionLoaderTest { System.setProperty("java.version", "1.6.11"); System.setProperty("rocketmq.home.dir", "src/test/resources"); - System.setProperty("romcketmq.acl.plain.fileName", "/conf/transport.yml"); + System.setProperty("romcketmq.acl.plain.fileName", "/conf/plain_acl.yml"); plainPermissionLoader = new PlainPermissionLoader(); } @@ -154,16 +154,16 @@ public class PlainPermissionLoaderTest { public void checkPerm() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.addResourceAndPerm("pub", Permission.PUB); - plainPermissionLoader.checkPerm(PUBPlainAccessResource, plainAccessResource); - plainAccessResource.addResourceAndPerm("sub", Permission.SUB); - plainPermissionLoader.checkPerm(ANYPlainAccessResource, plainAccessResource); + plainAccessResource.addResourceAndPerm("topicA", Permission.PUB); + plainPermissionLoader.checkPerm(plainAccessResource, PUBPlainAccessResource); + plainAccessResource.addResourceAndPerm("topicB", Permission.SUB); + plainPermissionLoader.checkPerm(plainAccessResource, ANYPlainAccessResource); plainAccessResource = new PlainAccessResource(); - plainAccessResource.addResourceAndPerm("sub", Permission.SUB); - plainPermissionLoader.checkPerm(SUBPlainAccessResource, plainAccessResource); - plainAccessResource.addResourceAndPerm("pub", Permission.PUB); - plainPermissionLoader.checkPerm(ANYPlainAccessResource, plainAccessResource); + plainAccessResource.addResourceAndPerm("topicB", Permission.SUB); + plainPermissionLoader.checkPerm(plainAccessResource, SUBPlainAccessResource); + plainAccessResource.addResourceAndPerm("topicA", Permission.PUB); + plainPermissionLoader.checkPerm(plainAccessResource, ANYPlainAccessResource); } @@ -226,7 +226,7 @@ public class PlainPermissionLoaderTest { System.setProperty("rocketmq.home.dir", "src/test/resources/watch"); File file = new File("src/test/resources/watch/conf"); file.mkdirs(); - File transport = new File("src/test/resources/watch/conf/transport.yml"); + File transport = new File("src/test/resources/watch/conf/plain_acl.yml"); transport.createNewFile(); FileWriter writer = new FileWriter(transport); @@ -240,9 +240,9 @@ public class PlainPermissionLoaderTest { PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); Map> plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); - Assert.assertEquals(plainAccessResourceMap.get("rokcetmq").size(), 1); + Assert.assertNotNull(plainAccessResourceMap.get("rokcetmq")); - writer = new FileWriter(new File("src/test/resources/watch/conf/transport.yml"), true); + writer = new FileWriter(new File("src/test/resources/watch/conf/plain_acl.yml"), true); writer.write("- accessKey: rokcet1\r\n"); writer.write(" secretKey: aliyun1\r\n"); writer.write(" whiteRemoteAddress: 127.0.0.1\r\n"); @@ -256,7 +256,7 @@ public class PlainPermissionLoaderTest { e.printStackTrace(); } plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); - Assert.assertEquals(plainAccessResourceMap.get("rokcet1").size(), 1); + Assert.assertNotNull(plainAccessResourceMap.get("rokcet1")); transport.delete(); file.delete(); @@ -267,7 +267,7 @@ public class PlainPermissionLoaderTest { @Test(expected = AclException.class) public void initializeTest() { - System.setProperty("romcketmq.acl.plain.fileName", "/conf/transport-null.yml"); + System.setProperty("rocketmq.acl.plain.file", "/conf/plain_acl_null.yml"); new PlainPermissionLoader(); } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java index 527c5c297e..a390c604ff 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java @@ -24,14 +24,18 @@ public class RemoteAddressStrategyTest { RemoteAddressStrategyFactory remoteAddressStrategyFactory = new RemoteAddressStrategyFactory(); + @Test(expected = AclException.class) + public void netaddressStrategyFactoryExceptionTest() { + PlainAccessResource plainAccessResource = new PlainAccessResource(); + remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); + } + @Test - public void NetaddressStrategyFactoryTest() { + public void netaddressStrategyFactoryTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); - RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); - Assert.assertEquals(remoteAddressStrategy, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); plainAccessResource.setWhiteRemoteAddress("*"); - remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); + RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy, RemoteAddressStrategyFactory.NULL_NET_ADDRESS_STRATEGY); plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); diff --git a/acl/src/test/resources/conf/transport.yml b/acl/src/test/resources/conf/plain_acl.yml similarity index 100% rename from acl/src/test/resources/conf/transport.yml rename to acl/src/test/resources/conf/plain_acl.yml diff --git a/acl/src/test/resources/conf/transport-null.yml b/acl/src/test/resources/conf/plain_acl_null.yml similarity index 100% rename from acl/src/test/resources/conf/transport-null.yml rename to acl/src/test/resources/conf/plain_acl_null.yml diff --git a/distribution/conf/transport.yml b/distribution/conf/plain_acl.yml similarity index 100% rename from distribution/conf/transport.yml rename to distribution/conf/plain_acl.yml diff --git a/pom.xml b/pom.xml index 1f2091a5b6..a337929e4a 100644 --- a/pom.xml +++ b/pom.xml @@ -216,9 +216,9 @@ generate-effective-dependencies-pom generate-resources - + ${project.build.directory}/effective-pom/effective-dependencies.xml From d073c6913f53f273377e0ac30a11087fe08c5bd1 Mon Sep 17 00:00:00 2001 From: von gosling Date: Thu, 6 Dec 2018 16:23:31 +0800 Subject: [PATCH 66/96] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a5f47e597c..7518f06a8f 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ It offers a variety of features: ---------- ## Apache RocketMQ Community -* [RocketMQ Community Incubator Projects](https://github.com/apache/rocketmq-externals) +* [RocketMQ Community Projects](https://github.com/apache/rocketmq-externals) ---------- From 6bb6cffed75ef12f460aebda80960286cc85a6dd Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Thu, 6 Dec 2018 12:50:16 +0800 Subject: [PATCH 67/96] update the year info in NOTICE --- NOTICE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE b/NOTICE index c218b26089..703c28b27c 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Apache RocketMQ -Copyright 2016-2017 The Apache Software Foundation +Copyright 2016-2018 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). \ No newline at end of file From 0a31a7b27186ddb9d8cb453aef87e4872554f3c6 Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Thu, 13 Dec 2018 17:07:30 +0800 Subject: [PATCH 68/96] Release semaphore when timeout --- .../apache/rocketmq/remoting/netty/NettyRemotingAbstract.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java index 8dccebc045..9b026403dd 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java @@ -410,7 +410,8 @@ public abstract class NettyRemotingAbstract { final SemaphoreReleaseOnlyOnce once = new SemaphoreReleaseOnlyOnce(this.semaphoreAsync); long costTime = System.currentTimeMillis() - beginStartTime; if (timeoutMillis < costTime) { - throw new RemotingTooMuchRequestException("invokeAsyncImpl call timeout"); + once.release(); + throw new RemotingTimeoutException("invokeAsyncImpl call timeout"); } final ResponseFuture responseFuture = new ResponseFuture(channel, opaque, timeoutMillis - costTime, invokeCallback, once); From b06074a559b33b0cabe33fc0f0cc4991c8da7848 Mon Sep 17 00:00:00 2001 From: von gosling Date: Fri, 14 Dec 2018 20:35:21 +0800 Subject: [PATCH 69/96] Revert "Release semaphore when timeout" This reverts commit d4d02b5e017ebf8c7d3405516264645280cf57fa. --- .../apache/rocketmq/remoting/netty/NettyRemotingAbstract.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java index 9b026403dd..8dccebc045 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java @@ -410,8 +410,7 @@ public abstract class NettyRemotingAbstract { final SemaphoreReleaseOnlyOnce once = new SemaphoreReleaseOnlyOnce(this.semaphoreAsync); long costTime = System.currentTimeMillis() - beginStartTime; if (timeoutMillis < costTime) { - once.release(); - throw new RemotingTimeoutException("invokeAsyncImpl call timeout"); + throw new RemotingTooMuchRequestException("invokeAsyncImpl call timeout"); } final ResponseFuture responseFuture = new ResponseFuture(channel, opaque, timeoutMillis - costTime, invokeCallback, once); From 9fe30e2e27d34e0df0c575e0fcb7c323f17210cc Mon Sep 17 00:00:00 2001 From: "maowei.ymw" Date: Tue, 18 Dec 2018 16:25:25 +0800 Subject: [PATCH 70/96] FixSemaphoreProblem --- .../apache/rocketmq/remoting/netty/NettyRemotingAbstract.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java index 8dccebc045..9b026403dd 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java @@ -410,7 +410,8 @@ public abstract class NettyRemotingAbstract { final SemaphoreReleaseOnlyOnce once = new SemaphoreReleaseOnlyOnce(this.semaphoreAsync); long costTime = System.currentTimeMillis() - beginStartTime; if (timeoutMillis < costTime) { - throw new RemotingTooMuchRequestException("invokeAsyncImpl call timeout"); + once.release(); + throw new RemotingTimeoutException("invokeAsyncImpl call timeout"); } final ResponseFuture responseFuture = new ResponseFuture(channel, opaque, timeoutMillis - costTime, invokeCallback, once); From 1594dc9e810aa579fe8c6cd40369524bc6f45d35 Mon Sep 17 00:00:00 2001 From: huzongtang Date: Mon, 24 Dec 2018 17:25:54 +0800 Subject: [PATCH 71/96] [ISSUE#403]fix some bugs and Optimization code for rocketmq's acl feature. --- .../acl/common/SessionCredentials.java | 2 +- .../acl/plain/PlainPermissionLoader.java | 25 +++++++++++-------- .../plain/RemoteAddressStrategyFactory.java | 19 ++++++++++++-- .../acl/plain/PlainPermissionLoaderTest.java | 6 +---- .../acl/plain/RemoteAddressStrategyTest.java | 14 ++++++++++- .../rocketmq/broker/BrokerController.java | 1 + .../org.apache.rocketmq.acl.AccessValidator | 1 + .../rocketmq/broker/BrokerControllerTest.java | 15 +++++++++++ .../org.apache.rocketmq.acl.AccessValidator | 2 +- .../apache/rocketmq/common/BrokerConfig.java | 6 ++++- 10 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java b/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java index a637e36808..33a8a34350 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/SessionCredentials.java @@ -30,7 +30,7 @@ public class SessionCredentials { public static final String SECURITY_TOKEN = "SecurityToken"; public static final String KEY_FILE = System.getProperty("rocketmq.client.keyFile", - System.getProperty("user.home") + File.separator + "onskey"); + System.getProperty("user.home") + File.separator + "key"); private String accessKey; private String secretKey; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 01161d0cfa..9c36ecf71f 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -81,8 +81,8 @@ public class PlainPermissionLoader { } JSONArray accounts = accessControlTransport.getJSONArray("accounts"); - List plainAccessList = accounts.toJavaList(PlainAccessConfig.class); - if (plainAccessList != null && !plainAccessList.isEmpty()) { + if (accounts != null && !accounts.isEmpty()) { + List plainAccessList = accounts.toJavaList(PlainAccessConfig.class); for (PlainAccessConfig plainAccess : plainAccessList) { this.addPlainAccessResource(getPlainAccessResource(plainAccess)); } @@ -168,6 +168,11 @@ public class PlainPermissionLoader { Map needCheckedPermMap = needCheckedAccess.getResourcePermMap(); Map ownedPermMap = ownedAccess.getResourcePermMap(); + if (needCheckedPermMap == null) { + //if the needCheckedPermMap is null,then return + return; + } + for (Map.Entry needCheckedEntry : needCheckedPermMap.entrySet()) { String resource = needCheckedEntry.getKey(); Byte neededPerm = needCheckedEntry.getValue(); @@ -223,16 +228,14 @@ public class PlainPermissionLoader { public void validate(PlainAccessResource plainAccessResource) { //Step 1, check the global white remote addr + for (RemoteAddressStrategy remoteAddressStrategy : globalWhiteRemoteAddressStrategy) { + if (remoteAddressStrategy.match(plainAccessResource)) { + return; + } + } + if (plainAccessResource.getAccessKey() == null) { - if (globalWhiteRemoteAddressStrategy.isEmpty()) { - throw new AclException(String.format("No accessKey is configured and no global white remote addr is configured")); - } - for (RemoteAddressStrategy remoteAddressStrategy : globalWhiteRemoteAddressStrategy) { - if (remoteAddressStrategy.match(plainAccessResource)) { - return; - } - } - throw new AclException(String.format("No accessKey is configured and no global white remote addr is matched")); + throw new AclException(String.format("No accessKey is configured")); } if (!plainAccessResourceMap.containsKey(plainAccessResource.getAccessKey())) { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java index b82d79388a..10b4734588 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java @@ -21,19 +21,26 @@ import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.acl.common.AclException; import org.apache.rocketmq.acl.common.AclUtils; +import org.apache.rocketmq.common.constant.LoggerName; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; public class RemoteAddressStrategyFactory { + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); + public static final NullRemoteAddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullRemoteAddressStrategy(); + public static final BlankRemoteAddressStrategy BLANK_NET_ADDRESS_STRATEGY = new BlankRemoteAddressStrategy(); + public RemoteAddressStrategy getRemoteAddressStrategy(PlainAccessResource plainAccessResource) { return getRemoteAddressStrategy(plainAccessResource.getWhiteRemoteAddress()); - } public RemoteAddressStrategy getRemoteAddressStrategy(String remoteAddr) { if (StringUtils.isBlank(remoteAddr)) { - throw new AclException("Must fill in the white list address"); + log.warn("white list address is null"); + return BLANK_NET_ADDRESS_STRATEGY; } if ("*".equals(remoteAddr)) { return NULL_NET_ADDRESS_STRATEGY; @@ -62,6 +69,14 @@ public class RemoteAddressStrategyFactory { } + public static class BlankRemoteAddressStrategy implements RemoteAddressStrategy { + @Override + public boolean match(PlainAccessResource plainAccessResource) { + return false; + } + + } + public static class MultipleRemoteAddressStrategy implements RemoteAddressStrategy { private final Set multipleSet = new HashSet<>(); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java index 4f5ae5b523..2bd5b8ceac 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -227,6 +227,7 @@ public class PlainPermissionLoaderTest { File file = new File("src/test/resources/watch/conf"); file.mkdirs(); File transport = new File("src/test/resources/watch/conf/plain_acl.yml"); + transport.delete(); transport.createNewFile(); FileWriter writer = new FileWriter(transport); @@ -258,11 +259,6 @@ public class PlainPermissionLoaderTest { plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); Assert.assertNotNull(plainAccessResourceMap.get("rokcet1")); - transport.delete(); - file.delete(); - file = new File("src/test/resources/watch"); - file.delete(); - } @Test(expected = AclException.class) diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java index a390c604ff..53391f4118 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyTest.java @@ -24,10 +24,12 @@ public class RemoteAddressStrategyTest { RemoteAddressStrategyFactory remoteAddressStrategyFactory = new RemoteAddressStrategyFactory(); - @Test(expected = AclException.class) + @Test public void netaddressStrategyFactoryExceptionTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource).getClass(), + RemoteAddressStrategyFactory.BlankRemoteAddressStrategy.class); } @Test @@ -61,6 +63,10 @@ public class RemoteAddressStrategyTest { plainAccessResource.setWhiteRemoteAddress("127.0.1-20.*"); remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.RangeRemoteAddressStrategy.class); + + plainAccessResource.setWhiteRemoteAddress(""); + remoteAddressStrategy = remoteAddressStrategyFactory.getRemoteAddressStrategy(plainAccessResource); + Assert.assertEquals(remoteAddressStrategy.getClass(), RemoteAddressStrategyFactory.BlankRemoteAddressStrategy.class); } @Test(expected = AclException.class) @@ -78,6 +84,12 @@ public class RemoteAddressStrategyTest { Assert.assertTrue(isMatch); } + @Test + public void blankNetaddressStrategyTest() { + boolean isMatch = RemoteAddressStrategyFactory.BLANK_NET_ADDRESS_STRATEGY.match(new PlainAccessResource()); + Assert.assertFalse(isMatch); + } + public void oneNetaddressStrategyTest() { PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setWhiteRemoteAddress("127.0.0.1"); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index e649665ad4..73ed7eb4ca 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -499,6 +499,7 @@ public class BrokerController { List accessValidators = ServiceProvider.load(ServiceProvider.ACL_VALIDATOR_ID, AccessValidator.class); if (accessValidators == null || accessValidators.isEmpty()) { + log.info("The broker dose not load the AccessValidator"); return; } diff --git a/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator b/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator new file mode 100644 index 0000000000..1abc92e016 --- /dev/null +++ b/broker/src/main/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator @@ -0,0 +1 @@ +org.apache.rocketmq.acl.plain.PlainAccessValidator \ No newline at end of file diff --git a/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java b/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java index 56abf084a7..71bbe06969 100644 --- a/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java +++ b/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java @@ -42,6 +42,21 @@ public class BrokerControllerTest { brokerController.shutdown(); } + @Test + public void testBrokerStartAclEnabled() throws Exception { + BrokerConfig brokerConfigAclEnabled = new BrokerConfig(); + brokerConfigAclEnabled.setEnableAcl(true); + + BrokerController brokerController = new BrokerController( + brokerConfigAclEnabled, + new NettyServerConfig(), + new NettyClientConfig(), + new MessageStoreConfig()); + assertThat(brokerController.initialize()); + brokerController.start(); + brokerController.shutdown(); + } + @After public void destroy() { UtilAll.deleteFile(new File(new MessageStoreConfig().getStorePathRootDir())); diff --git a/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator b/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator index bbf21d376c..1abc92e016 100644 --- a/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator +++ b/broker/src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator @@ -1 +1 @@ -org.apache.rocketmq.acl.DefaultAclRemotingServiceImpl \ No newline at end of file +org.apache.rocketmq.acl.plain.PlainAccessValidator \ No newline at end of file diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index 60bd7ce411..07242b3776 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -171,7 +171,11 @@ public class BrokerConfig { @ImportantField private long transactionCheckInterval = 60 * 1000; - private boolean enableAcl; + /** + * Acl feature switch + */ + @ImportantField + private boolean enableAcl = false; public static String localHostName() { From 7a48d370b4fd8b2fc7c32c756e931a404f6cb436 Mon Sep 17 00:00:00 2001 From: huzongtang Date: Wed, 26 Dec 2018 00:21:22 +0800 Subject: [PATCH 72/96] [ISSUE#403] add the conf/plain_acl.yml file for acl_feature. --- distribution/conf/plain_acl.yml | 40 +++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/distribution/conf/plain_acl.yml b/distribution/conf/plain_acl.yml index ccebd8f9ed..9043b0dd80 100644 --- a/distribution/conf/plain_acl.yml +++ b/distribution/conf/plain_acl.yml @@ -13,22 +13,28 @@ # See the License for the specific language governing permissions and # limitations under the License. -onlyNetAddress: - remoteAddr: 192.168.0.* - noPermitPullTopic: - - broker-a +globalWhiteRemoteAddresses: -list: - - accessKey: RocketMQ - signature: 1234567 - remoteAddr: 192.168.0.* - permitSendTopic: - - TopicTest - - test2 - - accessKey: RocketMQ - signature: 1234567 - remoteAddr: 192.168.2.1 - permitSendTopic: - - test3 - - test4 +accounts: +- accessKey: RocketMQ + secretKey: 12345678 + whiteRemoteAddress: + admin: false + defaultTopicPerm: DENY + defaultGroupPerm: SUB + topicPerms: + - topicA=DENY + - topicB=PUB|SUB + - topicC=SUB + groupPerms: + # the group should convert to retry topic + - groupA=DENY + - groupB=PUB|SUB + - groupC=SUB + +- accessKey: aliyun.com + secretKey: 12345678 + whiteRemoteAddress: 192.168.1.* + # if it is admin, it could access all resources + admin: true From 62fbeeb0f163a2b7bd5d92ee6a7dbc1184b76bcc Mon Sep 17 00:00:00 2001 From: huzongtang Date: Wed, 26 Dec 2018 14:22:51 +0800 Subject: [PATCH 73/96] [ISSUE#403]adjust AclClient codes for rocketmq's acl feature and Ignore a unit test. --- .../rocketmq/broker/BrokerControllerTest.java | 2 + example/pom.xml | 5 ++ .../rocketmq/example/simple/AclClient.java | 49 ++++--------------- 3 files changed, 16 insertions(+), 40 deletions(-) diff --git a/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java b/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java index 71bbe06969..8ba3ab59cd 100644 --- a/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java +++ b/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java @@ -24,6 +24,7 @@ import org.apache.rocketmq.remoting.netty.NettyClientConfig; import org.apache.rocketmq.remoting.netty.NettyServerConfig; import org.apache.rocketmq.store.config.MessageStoreConfig; import org.junit.After; +import org.junit.Ignore; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -42,6 +43,7 @@ public class BrokerControllerTest { brokerController.shutdown(); } + @Ignore @Test public void testBrokerStartAclEnabled() throws Exception { BrokerConfig brokerConfigAclEnabled = new BrokerConfig(); diff --git a/example/pom.xml b/example/pom.xml index 28dfe922fb..1a4065770b 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -53,5 +53,10 @@ rocketmq-openmessaging 4.4.0-SNAPSHOT + + org.apache.rocketmq + rocketmq-acl + 4.4.0-SNAPSHOT + diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java index fa0bf0a1e1..898051704b 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java @@ -20,6 +20,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; + +import org.apache.rocketmq.acl.common.AclClientRPCHook; +import org.apache.rocketmq.acl.common.SessionCredentials; import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.PullResult; @@ -36,25 +39,22 @@ import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageQueue; import org.apache.rocketmq.remoting.RPCHook; import org.apache.rocketmq.remoting.common.RemotingHelper; -import org.apache.rocketmq.remoting.protocol.RemotingCommand; /** * - * English explain - * 1. broker module src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator copy to src/java/resources/META-INF/service. + * 1. view the /conf/plain_acl.yml file under the distribution module, pay attention to the accessKey,secretKey, + * globalWhiteRemoteAddresses and whiteRemoteAddress and some other attributes. * - * 2. view the /conf/transport.yml file under the distribution module, pay attention to the account password, IP. - * - * 3. Modify ALC_RCP_HOOK_ACCOUT and ACL_RCP_HOOK_PASSWORD to the corresponding account password in transport.yml + * 2. Modify ACL_ACCESS_KEY and ACL_SECRET_KEY to the corresponding accessKey and secretKey in plain_acl.yml * */ public class AclClient { private static final Map OFFSE_TABLE = new HashMap(); - private static final String ACL_RCPHOOK_ACCOUT = "RocketMQ"; + private static final String ACL_ACCESS_KEY = "RocketMQ"; - private static final String ACL_RCPHOOK_PASSWORD = "1234567"; + private static final String ACL_SECRET_KEY = "1234567"; public static void main(String[] args) throws MQClientException, InterruptedException { producer(); @@ -170,37 +170,6 @@ public class AclClient { } static RPCHook getAclRPCHook() { - return new AclRPCHook(ACL_RCPHOOK_ACCOUT, ACL_RCPHOOK_PASSWORD); - } - - static class AclRPCHook implements RPCHook { - - private String account; - - private String password; - - public AclRPCHook(String account, String password) { - this.account = account; - this.password = password; - } - - @Override - public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - - HashMap ext = request.getExtFields(); - if (ext == null) { - ext = new HashMap<>(); - request.setExtFields(ext); - } - ext.put("account", this.account); - ext.put("password", this.password); - } - - @Override - public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { - //do nothing - - } - + return new AclClientRPCHook(new SessionCredentials(ACL_ACCESS_KEY,ACL_SECRET_KEY)); } } From 3c3c5ef4b62cc350c50990e5c04b2bf7ef59937b Mon Sep 17 00:00:00 2001 From: huzongtang Date: Wed, 26 Dec 2018 14:32:50 +0800 Subject: [PATCH 74/96] [ISSUE#403] remove the unit test. --- .../rocketmq/broker/BrokerControllerTest.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java b/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java index 8ba3ab59cd..dae1335540 100644 --- a/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java +++ b/broker/src/test/java/org/apache/rocketmq/broker/BrokerControllerTest.java @@ -43,22 +43,6 @@ public class BrokerControllerTest { brokerController.shutdown(); } - @Ignore - @Test - public void testBrokerStartAclEnabled() throws Exception { - BrokerConfig brokerConfigAclEnabled = new BrokerConfig(); - brokerConfigAclEnabled.setEnableAcl(true); - - BrokerController brokerController = new BrokerController( - brokerConfigAclEnabled, - new NettyServerConfig(), - new NettyClientConfig(), - new MessageStoreConfig()); - assertThat(brokerController.initialize()); - brokerController.start(); - brokerController.shutdown(); - } - @After public void destroy() { UtilAll.deleteFile(new File(new MessageStoreConfig().getStorePathRootDir())); From 459b246d28f2c865e2ef89e25f41103904416a55 Mon Sep 17 00:00:00 2001 From: wangshaojie4039 Date: Wed, 26 Dec 2018 18:51:23 +0800 Subject: [PATCH 75/96] [ISSUE#403] fix some bugs and Optimization code for rocketmq's acl feature. (#632) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ISSUE#403] fix some bugs and Optimization code for rocketmq's acl feature.  * [ISSUE#403] fix some bugs and Optimization code for rocketmq's acl feature.  * Update MQAdminStartup.java * Update MQAdminStartup.java --- .../rocketmq/acl/common/Permission.java | 6 +- .../acl/plain/PlainAccessValidator.java | 6 +- .../rocketmq/acl/common/PermissionTest.java | 21 ++--- .../acl/plain/PlainPermissionLoaderTest.java | 12 +-- distribution/conf/tools.yml | 19 +++++ tools/pom.xml | 4 + .../tools/command/MQAdminStartup.java | 76 +++++-------------- 7 files changed, 61 insertions(+), 83 deletions(-) create mode 100644 distribution/conf/tools.yml diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java index c608f05dac..7a95ee053d 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java @@ -64,12 +64,10 @@ public class Permission { return Permission.PUB; case "SUB": return Permission.SUB; - case "ANY": - return Permission.ANY; case "PUB|SUB": - return Permission.ANY; + return Permission.PUB | Permission.SUB; case "SUB|PUB": - return Permission.ANY; + return Permission.PUB | Permission.SUB; case "DENY": return Permission.DENY; default: diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java index d71509846f..bb1c0a11c6 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java @@ -47,7 +47,11 @@ public class PlainAccessValidator implements AccessValidator { @Override public AccessResource parse(RemotingCommand request, String remoteAddr) { PlainAccessResource accessResource = new PlainAccessResource(); - accessResource.setWhiteRemoteAddress(remoteAddr); + if (remoteAddr != null && remoteAddr.contains(":")) { + accessResource.setWhiteRemoteAddress(remoteAddr.split(":")[0]); + } else { + accessResource.setWhiteRemoteAddress(remoteAddr); + } accessResource.setRequestCode(request.getCode()); accessResource.setAccessKey(request.getExtFields().get(SessionCredentials.ACCESS_KEY)); accessResource.setSignature(request.getExtFields().get(SessionCredentials.SIGNATURE)); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java index 2d998cc4e5..31820ad7d5 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java @@ -35,14 +35,11 @@ public class PermissionTest { perm = Permission.parsePermFromString("SUB"); Assert.assertEquals(perm, Permission.SUB); - perm = Permission.parsePermFromString("ANY"); - Assert.assertEquals(perm, Permission.ANY); - perm = Permission.parsePermFromString("PUB|SUB"); - Assert.assertEquals(perm, Permission.ANY); + Assert.assertEquals(perm, Permission.PUB|Permission.SUB); perm = Permission.parsePermFromString("SUB|PUB"); - Assert.assertEquals(perm, Permission.ANY); + Assert.assertEquals(perm, Permission.PUB|Permission.SUB); perm = Permission.parsePermFromString("DENY"); Assert.assertEquals(perm, Permission.DENY); @@ -66,8 +63,14 @@ public class PermissionTest { boo = Permission.checkPermission(Permission.SUB, Permission.SUB); Assert.assertTrue(boo); - boo = Permission.checkPermission(Permission.ANY, Permission.ANY); - Assert.assertFalse(boo); + boo = Permission.checkPermission(Permission.PUB, (byte) (Permission.PUB|Permission.SUB)); + Assert.assertTrue(boo); + + boo = Permission.checkPermission(Permission.SUB, (byte) (Permission.PUB|Permission.SUB)); + Assert.assertTrue(boo); + + boo = Permission.checkPermission(Permission.ANY, (byte) (Permission.PUB|Permission.SUB)); + Assert.assertTrue(boo); boo = Permission.checkPermission(Permission.ANY, Permission.SUB); Assert.assertTrue(boo); @@ -108,7 +111,7 @@ public class PermissionTest { Assert.assertEquals(perm, Permission.DENY); perm = resourcePermMap.get(PlainAccessResource.getRetryTopic("groupB")); - Assert.assertEquals(perm, Permission.ANY); + Assert.assertEquals(perm,Permission.PUB|Permission.SUB); perm = resourcePermMap.get(PlainAccessResource.getRetryTopic("groupC")); Assert.assertEquals(perm, Permission.PUB); @@ -124,7 +127,7 @@ public class PermissionTest { Assert.assertEquals(perm, Permission.DENY); perm = resourcePermMap.get("topicB"); - Assert.assertEquals(perm, Permission.ANY); + Assert.assertEquals(perm, Permission.PUB|Permission.SUB); perm = resourcePermMap.get("topicC"); Assert.assertEquals(perm, Permission.PUB); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java index 2bd5b8ceac..68f6e11986 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -108,14 +108,6 @@ public class PlainPermissionLoaderTest { plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.isAdmin(), true); - plainAccess.setDefaultGroupPerm("ANY"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); - Assert.assertEquals(plainAccessResource.getDefaultGroupPerm(), Permission.ANY); - - plainAccess.setDefaultTopicPerm("ANY"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); - Assert.assertEquals(plainAccessResource.getDefaultTopicPerm(), Permission.ANY); - List groups = new ArrayList(); groups.add("groupA=DENY"); groups.add("groupB=PUB|SUB"); @@ -126,7 +118,7 @@ public class PlainPermissionLoaderTest { Assert.assertEquals(resourcePermMap.size(), 3); Assert.assertEquals(resourcePermMap.get(PlainAccessResource.getRetryTopic("groupA")).byteValue(), Permission.DENY); - Assert.assertEquals(resourcePermMap.get(PlainAccessResource.getRetryTopic("groupB")).byteValue(), Permission.ANY); + Assert.assertEquals(resourcePermMap.get(PlainAccessResource.getRetryTopic("groupB")).byteValue(), Permission.PUB|Permission.SUB); Assert.assertEquals(resourcePermMap.get(PlainAccessResource.getRetryTopic("groupC")).byteValue(), Permission.PUB); List topics = new ArrayList(); @@ -139,7 +131,7 @@ public class PlainPermissionLoaderTest { Assert.assertEquals(resourcePermMap.size(), 6); Assert.assertEquals(resourcePermMap.get("topicA").byteValue(), Permission.DENY); - Assert.assertEquals(resourcePermMap.get("topicB").byteValue(), Permission.ANY); + Assert.assertEquals(resourcePermMap.get("topicB").byteValue(), Permission.PUB|Permission.SUB); Assert.assertEquals(resourcePermMap.get("topicC").byteValue(), Permission.PUB); } diff --git a/distribution/conf/tools.yml b/distribution/conf/tools.yml new file mode 100644 index 0000000000..b909696708 --- /dev/null +++ b/distribution/conf/tools.yml @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + + +accessKey: aliyun.com +secretKey: 12345678 + diff --git a/tools/pom.xml b/tools/pom.xml index 086c3e64c1..a4a8630b13 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -37,6 +37,10 @@ ${project.groupId} rocketmq-client + + ${project.groupId} + rocketmq-acl + ${project.groupId} rocketmq-store diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java index 34e9f451a2..065e4175df 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java @@ -19,17 +19,16 @@ package org.apache.rocketmq.tools.command; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.core.joran.spi.JoranException; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import com.alibaba.fastjson.JSONObject; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.acl.common.AclClientRPCHook; +import org.apache.rocketmq.acl.common.AclUtils; +import org.apache.rocketmq.acl.common.SessionCredentials; import org.apache.rocketmq.common.MQVersion; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.remoting.RPCHook; @@ -79,7 +78,6 @@ import org.apache.rocketmq.tools.command.topic.UpdateOrderConfCommand; import org.apache.rocketmq.tools.command.topic.UpdateTopicPermSubCommand; import org.apache.rocketmq.tools.command.topic.UpdateTopicSubCommand; import org.slf4j.LoggerFactory; -import org.yaml.snakeyaml.Yaml; public class MQAdminStartup { protected static List subCommandList = new ArrayList(); @@ -250,62 +248,22 @@ public class MQAdminStartup { public static RPCHook getAclRPCHook(CommandLine commandLine) { String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); - File file = new File(fileHome + "/conf/tools.yml"); - if (!file.exists()) { - System.out.printf("file %s is not exist \n", file.getPath()); + String fileName = "/conf/tools.yml"; + JSONObject yamlDataObject = AclUtils.getYamlDataObject(fileHome + fileName , + JSONObject.class); + + if (yamlDataObject == null || yamlDataObject.isEmpty()) { + System.out.printf(" Cannot find conf file %s, acl is not be enabled.%n" ,fileHome + fileName); return null; } - Yaml ymal = new Yaml(); - FileInputStream fis = null; - Map> map = null; - try { - fis = new FileInputStream(file); - map = ymal.loadAs(fis, Map.class); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (fis != null) { - try { - fis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - if (map == null || map.isEmpty()) { - System.out.printf("file %s is no data", file.getPath()); + // admin ak sk + String accessKey = yamlDataObject.getString("accessKey"); + String secretKey = yamlDataObject.getString("secretKey"); + + if (StringUtils.isBlank(accessKey) || StringUtils.isBlank(secretKey)) { + System.out.printf("AccessKey or secretKey is blank, the acl is not enabled.%n"); return null; } - - final Map> newMap = map; - return new RPCHook() { - - @Override - public void doBeforeRequest(String remoteAddr, RemotingCommand request) { - System.out.printf("remoteAddr is %s code %d \n", remoteAddr, request.getCode()); - String fastRemoteAddr = null; - if (remoteAddr != null) { - String[] ipAndPost = StringUtils.split(remoteAddr, ":"); - Integer fastPost = Integer.valueOf(ipAndPost[1]) + 2; - fastRemoteAddr = ipAndPost[0] + ":" + fastPost.toString(); - } - Map map; - if ((map = newMap.get(remoteAddr)) != null || (map = newMap.get(fastRemoteAddr)) != null || (map = newMap.get("all")) != null) { - HashMap ext = request.getExtFields(); - if (ext == null) { - ext = new HashMap<>(); - request.setExtFields(ext); - } - ext.put("account", map.get("account").toString()); - ext.put("password", map.get("password").toString()); - } - - } - - @Override - public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) { - } - }; - + return new AclClientRPCHook(new SessionCredentials(accessKey,secretKey)); } } From 0bb40f920326709889375d2be4094906c9cf4c6a Mon Sep 17 00:00:00 2001 From: wangshaojie4039 Date: Wed, 26 Dec 2018 21:17:38 +0800 Subject: [PATCH 76/96] [ISSUE#403] add some test case,increasing code coverage (#636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ISSUE#403] fix some bugs and Optimization code for rocketmq's acl feature.  * [ISSUE#403] fix some bugs and Optimization code for rocketmq's acl feature.  * Update MQAdminStartup.java * Update MQAdminStartup.java * [ISSUE#403] add some test case,increasing code coverage * [ISSUE#403] add some test case,increasing code coverage --- .../rocketmq/acl/common/AclSignerTest.java | 18 ++ .../acl/common/SessionCredentialsTest.java | 29 +++ .../acl/plain/PlainAccessValidatorTest.java | 177 ++++++++++++++++-- 3 files changed, 210 insertions(+), 14 deletions(-) create mode 100644 acl/src/test/java/org/apache/rocketmq/acl/common/AclSignerTest.java create mode 100644 acl/src/test/java/org/apache/rocketmq/acl/common/SessionCredentialsTest.java diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/AclSignerTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/AclSignerTest.java new file mode 100644 index 0000000000..4169d88fe9 --- /dev/null +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/AclSignerTest.java @@ -0,0 +1,18 @@ +package org.apache.rocketmq.acl.common; + +import org.junit.Test; + +public class AclSignerTest { + + @Test(expected = Exception.class) + public void calSignatureExceptionTest(){ + AclSigner.calSignature(new byte[]{},""); + } + + @Test + public void calSignatureTest(){ + AclSigner.calSignature("RocketMQ","12345678"); + AclSigner.calSignature("RocketMQ".getBytes(),"12345678"); + } + +} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/SessionCredentialsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/SessionCredentialsTest.java new file mode 100644 index 0000000000..b6f9b8ce05 --- /dev/null +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/SessionCredentialsTest.java @@ -0,0 +1,29 @@ +package org.apache.rocketmq.acl.common; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Properties; + +public class SessionCredentialsTest { + + @Test + public void equalsTest(){ + SessionCredentials sessionCredentials=new SessionCredentials("RocketMQ","12345678"); + sessionCredentials.setSecurityToken("abcd"); + SessionCredentials other=new SessionCredentials("RocketMQ","12345678","abcd"); + Assert.assertTrue(sessionCredentials.equals(other)); + } + + @Test + public void updateContentTest(){ + SessionCredentials sessionCredentials=new SessionCredentials(); + Properties properties=new Properties(); + properties.setProperty(SessionCredentials.ACCESS_KEY,"RocketMQ"); + properties.setProperty(SessionCredentials.SECRET_KEY,"12345678"); + properties.setProperty(SessionCredentials.SECURITY_TOKEN,"abcd"); + sessionCredentials.updateContent(properties); + } + + +} diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java index 12e47afdcd..77bbb1193f 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java @@ -17,11 +17,18 @@ package org.apache.rocketmq.acl.plain; import java.nio.ByteBuffer; +import java.util.HashSet; +import java.util.Set; + import org.apache.rocketmq.acl.common.AclClientRPCHook; import org.apache.rocketmq.acl.common.AclUtils; import org.apache.rocketmq.acl.common.SessionCredentials; import org.apache.rocketmq.common.protocol.RequestCode; -import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; +import org.apache.rocketmq.common.protocol.header.*; +import org.apache.rocketmq.common.protocol.heartbeat.ConsumerData; +import org.apache.rocketmq.common.protocol.heartbeat.HeartbeatData; +import org.apache.rocketmq.common.protocol.heartbeat.ProducerData; +import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData; import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.junit.Assert; import org.junit.Before; @@ -29,22 +36,22 @@ import org.junit.Test; public class PlainAccessValidatorTest { - PlainAccessValidator plainAccessValidator; - + private PlainAccessValidator plainAccessValidator; + private AclClientRPCHook aclClient; + private SessionCredentials sessionCredentials; @Before public void init() { System.setProperty("rocketmq.home.dir", "src/test/resources"); plainAccessValidator = new PlainAccessValidator(); + sessionCredentials = new SessionCredentials(); + sessionCredentials.setAccessKey("RocketMQ"); + sessionCredentials.setSecretKey("12345678"); + sessionCredentials.setSecurityToken("87654321"); + aclClient = new AclClientRPCHook(sessionCredentials); } @Test public void contentTest() { - SessionCredentials sessionCredentials = new SessionCredentials(); - sessionCredentials.setAccessKey("RocketMQ"); - sessionCredentials.setSecretKey("12345678"); - sessionCredentials.setSecurityToken("87654321"); - AclClientRPCHook aclClient = new AclClientRPCHook(sessionCredentials); - SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); messageRequestHeader.setTopic("topicA"); RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE, messageRequestHeader); @@ -63,12 +70,22 @@ public class PlainAccessValidatorTest { @Test public void validateTest() { - SessionCredentials sessionCredentials = new SessionCredentials(); - sessionCredentials.setAccessKey("RocketMQ"); - sessionCredentials.setSecretKey("12345678"); - sessionCredentials.setSecurityToken("87654321"); - AclClientRPCHook aclClient = new AclClientRPCHook(sessionCredentials); + SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); + messageRequestHeader.setTopic("topicB"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE, messageRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1"); + plainAccessValidator.validate(accessResource); + + } + + @Test + public void validateSendMessageTest() { SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); messageRequestHeader.setTopic("topicB"); RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE, messageRequestHeader); @@ -81,4 +98,136 @@ public class PlainAccessValidatorTest { PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1"); plainAccessValidator.validate(accessResource); } + + @Test + public void validateSendMessageV2Test() { + SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); + messageRequestHeader.setTopic("topicC"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE_V2, SendMessageRequestHeaderV2.createSendMessageRequestHeaderV2(messageRequestHeader)); + aclClient.doBeforeRequest("", remotingCommand); + + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1:9876"); + plainAccessValidator.validate(accessResource); + } + + @Test + public void validatePullMessageTest() { + PullMessageRequestHeader pullMessageRequestHeader=new PullMessageRequestHeader(); + pullMessageRequestHeader.setTopic("topicC"); + pullMessageRequestHeader.setConsumerGroup("consumerGroupA"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.PULL_MESSAGE,pullMessageRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1:9876"); + plainAccessValidator.validate(accessResource); + } + + @Test + public void validateConsumeMessageBackTest() { + ConsumerSendMsgBackRequestHeader consumerSendMsgBackRequestHeader=new ConsumerSendMsgBackRequestHeader(); + consumerSendMsgBackRequestHeader.setOriginTopic("topicC"); + consumerSendMsgBackRequestHeader.setGroup("consumerGroupA"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.CONSUMER_SEND_MSG_BACK,consumerSendMsgBackRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1:9876"); + plainAccessValidator.validate(accessResource); + } + + @Test + public void validateQueryMessageTest() { + QueryMessageRequestHeader queryMessageRequestHeader=new QueryMessageRequestHeader(); + queryMessageRequestHeader.setTopic("topicC"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.QUERY_MESSAGE,queryMessageRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1:9876"); + plainAccessValidator.validate(accessResource); + } + + @Test + public void validateHeartBeatTest() { + HeartbeatData heartbeatData=new HeartbeatData(); + Set producerDataSet=new HashSet<>(); + Set consumerDataSet=new HashSet<>(); + Set subscriptionDataSet=new HashSet<>(); + ProducerData producerData=new ProducerData(); + producerData.setGroupName("producerGroupA"); + ConsumerData consumerData=new ConsumerData(); + consumerData.setGroupName("consumerGroupA"); + SubscriptionData subscriptionData=new SubscriptionData(); + subscriptionData.setTopic("topicC"); + producerDataSet.add(producerData); + consumerDataSet.add(consumerData); + subscriptionDataSet.add(subscriptionData); + consumerData.setSubscriptionDataSet(subscriptionDataSet); + heartbeatData.setProducerDataSet(producerDataSet); + heartbeatData.setConsumerDataSet(consumerDataSet); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.HEART_BEAT,null); + remotingCommand.setBody(heartbeatData.encode()); + aclClient.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encode(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1:9876"); + plainAccessValidator.validate(accessResource); + } + + @Test + public void validateUnRegisterClientTest() { + UnregisterClientRequestHeader unregisterClientRequestHeader=new UnregisterClientRequestHeader(); + unregisterClientRequestHeader.setConsumerGroup("consumerGroupA"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.UNREGISTER_CLIENT,unregisterClientRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1:9876"); + plainAccessValidator.validate(accessResource); + } + + @Test + public void validateGetConsumerListByGroupTest() { + GetConsumerListByGroupRequestHeader getConsumerListByGroupRequestHeader=new GetConsumerListByGroupRequestHeader(); + getConsumerListByGroupRequestHeader.setConsumerGroup("consumerGroupA"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.GET_CONSUMER_LIST_BY_GROUP,getConsumerListByGroupRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1:9876"); + plainAccessValidator.validate(accessResource); + } + + @Test + public void validateUpdateConsumerOffSetTest() { + UpdateConsumerOffsetRequestHeader updateConsumerOffsetRequestHeader=new UpdateConsumerOffsetRequestHeader(); + updateConsumerOffsetRequestHeader.setConsumerGroup("consumerGroupA"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.UPDATE_CONSUMER_OFFSET,updateConsumerOffsetRequestHeader); + aclClient.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.0.1:9876"); + plainAccessValidator.validate(accessResource); + } + + } From d45fda46515ab84a8150f9bdd1b0b5987374ee33 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Thu, 27 Dec 2018 14:41:19 +0800 Subject: [PATCH 77/96] Add docs --- docs/cn/index.md | 0 docs/en/index.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/cn/index.md create mode 100644 docs/en/index.md diff --git a/docs/cn/index.md b/docs/cn/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/en/index.md b/docs/en/index.md new file mode 100644 index 0000000000..e69de29bb2 From e5d2807f38195589e9575277bb92f2b6a8817bb7 Mon Sep 17 00:00:00 2001 From: chengxiangwang Date: Thu, 27 Dec 2018 18:37:52 +0800 Subject: [PATCH 78/96] exclude docs folder when running apache-rat-plugin --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 0a8fef8758..fbb7effc09 100644 --- a/pom.xml +++ b/pom.xml @@ -259,6 +259,7 @@ src/test/resources/META-INF/service/* */target/** */*.iml + docs/** From 5f664247214696e5a5ffb8a8600dc9dba901eee9 Mon Sep 17 00:00:00 2001 From: Hu Zongtang Date: Fri, 28 Dec 2018 10:56:48 +0800 Subject: [PATCH 79/96] [ISSUE#525]add aclClient PRCHook for message track (#638) * prepare to separate production-ready projects from the external projects * Update fastjson to the latest stable version * Clean code, don't list the default config in JVM * Update README.md * update the year info in NOTICE * Release semaphore when timeout * [ISSUE#525]add aclClient PRCHook for message track * [ISSUE#525]add the apache license text,remove the merged from master branch * [ISSUE#525]add aclClient PRCHook for message track,remove the merged content of notice and readme.md from master branch,add some unit test to increase the code coverage. --- README.md | 3 +- .../rocketmq/acl/common/AclSignerTest.java | 16 +++++ .../rocketmq/acl/common/PermissionTest.java | 12 ++++ .../acl/common/SessionCredentialsTest.java | 62 ++++++++++++++++++ .../pagecache/ManyMessageTransferTest.java | 64 +++++++++++++++++++ .../pagecache/OneMessageTransferTest.java | 53 +++++++++++++++ .../consumer/DefaultMQPushConsumer.java | 2 +- .../client/producer/DefaultMQProducer.java | 2 +- .../dispatch/impl/AsyncArrayDispatcher.java | 5 +- .../impl/TrackTraceProducerFactory.java | 5 +- pom.xml | 1 + 11 files changed, 217 insertions(+), 8 deletions(-) create mode 100644 broker/src/test/java/org/apache/rocketmq/broker/pagecache/ManyMessageTransferTest.java create mode 100644 broker/src/test/java/org/apache/rocketmq/broker/pagecache/OneMessageTransferTest.java diff --git a/README.md b/README.md index a5f47e597c..a6493b6f50 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,7 @@ It offers a variety of features: ---------- ## Apache RocketMQ Community -* [RocketMQ Community Incubator Projects](https://github.com/apache/rocketmq-externals) - +[RocketMQ Community Incubator Projects](https://github.com/apache/rocketmq-externals) ---------- ## Contributing diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/AclSignerTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/AclSignerTest.java index 4169d88fe9..eec626357f 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/AclSignerTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/AclSignerTest.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common; import org.junit.Test; diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java index 31820ad7d5..253b5b241e 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/PermissionTest.java @@ -153,4 +153,16 @@ public class PermissionTest { } } } + + @Test + public void AclExceptionTest(){ + AclException aclException = new AclException("CAL_SIGNATURE_FAILED",10015); + AclException aclExceptionWithMessage = new AclException("CAL_SIGNATURE_FAILED",10015,"CAL_SIGNATURE_FAILED Exception"); + Assert.assertEquals(aclException.getCode(),10015); + Assert.assertEquals(aclExceptionWithMessage.getStatus(),"CAL_SIGNATURE_FAILED"); + aclException.setCode(10016); + Assert.assertEquals(aclException.getCode(),10016); + aclException.setStatus("netaddress examine scope Exception netaddress"); + Assert.assertEquals(aclException.getStatus(),"netaddress examine scope Exception netaddress"); + } } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/SessionCredentialsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/SessionCredentialsTest.java index b6f9b8ce05..a1a4bde4f8 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/SessionCredentialsTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/SessionCredentialsTest.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.acl.common; import org.junit.Assert; @@ -25,5 +41,51 @@ public class SessionCredentialsTest { sessionCredentials.updateContent(properties); } + @Test + public void SessionCredentialHashCodeTest(){ + SessionCredentials sessionCredentials=new SessionCredentials(); + Properties properties=new Properties(); + properties.setProperty(SessionCredentials.ACCESS_KEY,"RocketMQ"); + properties.setProperty(SessionCredentials.SECRET_KEY,"12345678"); + properties.setProperty(SessionCredentials.SECURITY_TOKEN,"abcd"); + sessionCredentials.updateContent(properties); + Assert.assertEquals(sessionCredentials.hashCode(),353652211); + } + + @Test + public void SessionCredentialEqualsTest(){ + SessionCredentials sessionCredential1 =new SessionCredentials(); + Properties properties1=new Properties(); + properties1.setProperty(SessionCredentials.ACCESS_KEY,"RocketMQ"); + properties1.setProperty(SessionCredentials.SECRET_KEY,"12345678"); + properties1.setProperty(SessionCredentials.SECURITY_TOKEN,"abcd"); + sessionCredential1.updateContent(properties1); + + SessionCredentials sessionCredential2 =new SessionCredentials(); + Properties properties2=new Properties(); + properties2.setProperty(SessionCredentials.ACCESS_KEY,"RocketMQ"); + properties2.setProperty(SessionCredentials.SECRET_KEY,"12345678"); + properties2.setProperty(SessionCredentials.SECURITY_TOKEN,"abcd"); + sessionCredential2.updateContent(properties2); + + Assert.assertTrue(sessionCredential2.equals(sessionCredential1)); + sessionCredential2.setSecretKey("1234567899"); + sessionCredential2.setSignature("1234567899"); + Assert.assertFalse(sessionCredential2.equals(sessionCredential1)); + } + + @Test + public void SessionCredentialToStringTest(){ + SessionCredentials sessionCredential1 =new SessionCredentials(); + Properties properties1=new Properties(); + properties1.setProperty(SessionCredentials.ACCESS_KEY,"RocketMQ"); + properties1.setProperty(SessionCredentials.SECRET_KEY,"12345678"); + properties1.setProperty(SessionCredentials.SECURITY_TOKEN,"abcd"); + sessionCredential1.updateContent(properties1); + + Assert.assertEquals(sessionCredential1.toString(), + "SessionCredentials [accessKey=RocketMQ, secretKey=12345678, signature=null, SecurityToken=abcd]"); + } + } diff --git a/broker/src/test/java/org/apache/rocketmq/broker/pagecache/ManyMessageTransferTest.java b/broker/src/test/java/org/apache/rocketmq/broker/pagecache/ManyMessageTransferTest.java new file mode 100644 index 0000000000..508635c044 --- /dev/null +++ b/broker/src/test/java/org/apache/rocketmq/broker/pagecache/ManyMessageTransferTest.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.broker.pagecache; + +import java.nio.ByteBuffer; +import org.apache.rocketmq.store.GetMessageResult; +import org.junit.Assert; +import org.junit.Test; + +public class ManyMessageTransferTest { + + @Test + public void ManyMessageTransferBuilderTest(){ + ByteBuffer byteBuffer = ByteBuffer.allocate(20); + byteBuffer.putInt(20); + GetMessageResult getMessageResult = new GetMessageResult(); + ManyMessageTransfer manyMessageTransfer = new ManyMessageTransfer(byteBuffer,getMessageResult); + } + + @Test + public void ManyMessageTransferPosTest(){ + ByteBuffer byteBuffer = ByteBuffer.allocate(20); + byteBuffer.putInt(20); + GetMessageResult getMessageResult = new GetMessageResult(); + ManyMessageTransfer manyMessageTransfer = new ManyMessageTransfer(byteBuffer,getMessageResult); + Assert.assertEquals(manyMessageTransfer.position(),4); + } + + @Test + public void ManyMessageTransferCountTest(){ + ByteBuffer byteBuffer = ByteBuffer.allocate(20); + byteBuffer.putInt(20); + GetMessageResult getMessageResult = new GetMessageResult(); + ManyMessageTransfer manyMessageTransfer = new ManyMessageTransfer(byteBuffer,getMessageResult); + + Assert.assertEquals(manyMessageTransfer.count(),20); + + } + + @Test + public void ManyMessageTransferCloseTest(){ + ByteBuffer byteBuffer = ByteBuffer.allocate(20); + byteBuffer.putInt(20); + GetMessageResult getMessageResult = new GetMessageResult(); + ManyMessageTransfer manyMessageTransfer = new ManyMessageTransfer(byteBuffer,getMessageResult); + manyMessageTransfer.close(); + manyMessageTransfer.deallocate(); + } +} diff --git a/broker/src/test/java/org/apache/rocketmq/broker/pagecache/OneMessageTransferTest.java b/broker/src/test/java/org/apache/rocketmq/broker/pagecache/OneMessageTransferTest.java new file mode 100644 index 0000000000..2cd4bdc165 --- /dev/null +++ b/broker/src/test/java/org/apache/rocketmq/broker/pagecache/OneMessageTransferTest.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.rocketmq.broker.pagecache; + +import java.nio.ByteBuffer; +import org.apache.rocketmq.store.MappedFile; +import org.apache.rocketmq.store.SelectMappedBufferResult; +import org.junit.Assert; +import org.junit.Test; + +public class OneMessageTransferTest { + + @Test + public void OneMessageTransferTest(){ + ByteBuffer byteBuffer = ByteBuffer.allocate(20); + byteBuffer.putInt(20); + SelectMappedBufferResult selectMappedBufferResult = new SelectMappedBufferResult(0,byteBuffer,20,new MappedFile()); + OneMessageTransfer manyMessageTransfer = new OneMessageTransfer(byteBuffer,selectMappedBufferResult); + } + + @Test + public void OneMessageTransferCountTest(){ + ByteBuffer byteBuffer = ByteBuffer.allocate(20); + byteBuffer.putInt(20); + SelectMappedBufferResult selectMappedBufferResult = new SelectMappedBufferResult(0,byteBuffer,20,new MappedFile()); + OneMessageTransfer manyMessageTransfer = new OneMessageTransfer(byteBuffer,selectMappedBufferResult); + Assert.assertEquals(manyMessageTransfer.count(),40); + } + + @Test + public void OneMessageTransferPosTest(){ + ByteBuffer byteBuffer = ByteBuffer.allocate(20); + byteBuffer.putInt(20); + SelectMappedBufferResult selectMappedBufferResult = new SelectMappedBufferResult(0,byteBuffer,20,new MappedFile()); + OneMessageTransfer manyMessageTransfer = new OneMessageTransfer(byteBuffer,selectMappedBufferResult); + Assert.assertEquals(manyMessageTransfer.position(),8); + } +} diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index 179a80daa4..2149d67568 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -309,7 +309,7 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume } else { tempProperties.put(TrackTraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); } - AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties); + AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties, rpcHook); dispatcher.setHostConsumer(this.getDefaultMQPushConsumerImpl()); traceDispatcher = dispatcher; diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index 3c33d2eed5..22c676055f 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -178,7 +178,7 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { } else { tempProperties.put(TrackTraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); } - AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties); + AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties, rpcHook); dispatcher.setHostProducer(this.getDefaultMQProducerImpl()); traceDispatcher = dispatcher; diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java index 90b00d414c..496d290f5c 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java @@ -49,6 +49,7 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import org.apache.rocketmq.remoting.RPCHook; /** * Created by zongtanghu on 2018/11/6. @@ -74,7 +75,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { private String dispatcherId = UUID.randomUUID().toString(); private String traceTopicName; - public AsyncArrayDispatcher(Properties properties) throws MQClientException { + public AsyncArrayDispatcher(Properties properties, RPCHook rpcHook) throws MQClientException { dispatcherType = properties.getProperty(TrackTraceConstants.TRACE_DISPATCHER_TYPE); int queueSize = Integer.parseInt(properties.getProperty(TrackTraceConstants.ASYNC_BUFFER_SIZE, "2048")); // queueSize is greater than or equal to the n power of 2 of value @@ -92,7 +93,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { TimeUnit.MILLISECONDS, // this.appenderQueue, // new ThreadFactoryImpl("MQTraceSendThread_")); - traceProducer = TrackTraceProducerFactory.getTraceDispatcherProducer(properties); + traceProducer = TrackTraceProducerFactory.getTraceDispatcherProducer(properties, rpcHook); } public String getTraceTopicName() { diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java index 27447df734..37c39a14e5 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.rocketmq.remoting.RPCHook; public class TrackTraceProducerFactory { @@ -33,10 +34,10 @@ public class TrackTraceProducerFactory { private static DefaultMQProducer traceProducer; - public static DefaultMQProducer getTraceDispatcherProducer(Properties properties) { + public static DefaultMQProducer getTraceDispatcherProducer(Properties properties, RPCHook rpcHook) { if (traceProducer == null) { - traceProducer = new DefaultMQProducer(); + traceProducer = new DefaultMQProducer(rpcHook); traceProducer.setProducerGroup(TrackTraceConstants.GROUP_NAME); traceProducer.setSendMsgTimeout(5000); traceProducer.setInstanceName(properties.getProperty(TrackTraceConstants.INSTANCE_NAME, String.valueOf(System.currentTimeMillis()))); diff --git a/pom.xml b/pom.xml index c20b04cb36..1e3c4bcc85 100644 --- a/pom.xml +++ b/pom.xml @@ -259,6 +259,7 @@ src/test/resources/certs/* src/test/**/*.log src/test/resources/META-INF/service/* + src/main/resources/META-INF/service/* */target/** */*.iml From b8cb82f47ca837369459b5ab2699700e9952e693 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Fri, 28 Dec 2018 14:21:18 +0800 Subject: [PATCH 80/96] Rename tracktrace to trace, and polish the package hierarchy --- .../consumer/DefaultMQPushConsumer.java | 34 +++--- .../client/producer/DefaultMQProducer.java | 38 +++--- ...patcher.java => AsyncTraceDispatcher.java} | 66 +++++----- .../TrackTraceBean.java => TraceBean.java} | 4 +- ...raceConstants.java => TraceConstants.java} | 4 +- ...ackTraceContext.java => TraceContext.java} | 22 ++-- ...DataEncoder.java => TraceDataEncoder.java} | 114 +++++++++--------- ...ncDispatcher.java => TraceDispatcher.java} | 4 +- ...cherType.java => TraceDispatcherType.java} | 4 +- ...Factory.java => TraceProducerFactory.java} | 16 +-- ...ansferBean.java => TraceTransferBean.java} | 4 +- .../TrackTraceType.java => TraceType.java} | 4 +- .../hook/ConsumeMessageTraceHookImpl.java | 28 ++--- .../SendMessageTraceHookImpl.java} | 34 +++--- .../trace/DefaultMQConsumerWithTraceTest.java | 7 +- .../trace/DefaultMQProducerWithTraceTest.java | 13 +- .../rocketmq/example/simple/AclClient.java | 9 +- 17 files changed, 194 insertions(+), 211 deletions(-) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/dispatch/impl/AsyncArrayDispatcher.java => AsyncTraceDispatcher.java} (82%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/common/TrackTraceBean.java => TraceBean.java} (97%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/common/TrackTraceConstants.java => TraceConstants.java} (94%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/common/TrackTraceContext.java => TraceContext.java} (84%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/common/TrackTraceDataEncoder.java => TraceDataEncoder.java} (54%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/dispatch/AsyncDispatcher.java => TraceDispatcher.java} (94%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/common/TrackTraceDispatcherType.java => TraceDispatcherType.java} (89%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/dispatch/impl/TrackTraceProducerFactory.java => TraceProducerFactory.java} (84%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/common/TrackTraceTransferBean.java => TraceTransferBean.java} (93%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/common/TrackTraceType.java => TraceType.java} (91%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core => }/hook/ConsumeMessageTraceHookImpl.java (81%) rename client/src/main/java/org/apache/rocketmq/client/trace/{core/hook/SendMessageTrackHookImpl.java => hook/SendMessageTraceHookImpl.java} (74%) diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index 2149d67568..cbe22fdb35 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -31,11 +31,11 @@ import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; import org.apache.rocketmq.client.log.ClientLogger; -import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; -import org.apache.rocketmq.client.trace.core.common.TrackTraceDispatcherType; -import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; -import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; -import org.apache.rocketmq.client.trace.core.hook.ConsumeMessageTraceHookImpl; +import org.apache.rocketmq.client.trace.AsyncTraceDispatcher; +import org.apache.rocketmq.client.trace.TraceConstants; +import org.apache.rocketmq.client.trace.TraceDispatcher; +import org.apache.rocketmq.client.trace.TraceDispatcherType; +import org.apache.rocketmq.client.trace.hook.ConsumeMessageTraceHookImpl; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.consumer.ConsumeFromWhere; @@ -259,7 +259,7 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume /** * Interface of asynchronous transfer data */ - private AsyncDispatcher traceDispatcher = null; + private TraceDispatcher traceDispatcher = null; /** * Default constructor. @@ -299,17 +299,17 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume if (msgTraceSwitch) { try { Properties tempProperties = new Properties(); - tempProperties.put(TrackTraceConstants.MAX_MSG_SIZE, "128000"); - tempProperties.put(TrackTraceConstants.ASYNC_BUFFER_SIZE, "2048"); - tempProperties.put(TrackTraceConstants.MAX_BATCH_NUM, "100"); - tempProperties.put(TrackTraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); - tempProperties.put(TrackTraceConstants.TRACE_DISPATCHER_TYPE, TrackTraceDispatcherType.CONSUMER.name()); + tempProperties.put(TraceConstants.MAX_MSG_SIZE, "128000"); + tempProperties.put(TraceConstants.ASYNC_BUFFER_SIZE, "2048"); + tempProperties.put(TraceConstants.MAX_BATCH_NUM, "100"); + tempProperties.put(TraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); + tempProperties.put(TraceConstants.TRACE_DISPATCHER_TYPE, TraceDispatcherType.CONSUMER.name()); if (!UtilAll.isBlank(traceTopicName)) { - tempProperties.put(TrackTraceConstants.TRACE_TOPIC, traceTopicName); + tempProperties.put(TraceConstants.TRACE_TOPIC, traceTopicName); } else { - tempProperties.put(TrackTraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); + tempProperties.put(TraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); } - AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties, rpcHook); + AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(tempProperties, rpcHook); dispatcher.setHostConsumer(this.getDefaultMQPushConsumerImpl()); traceDispatcher = dispatcher; @@ -586,7 +586,7 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume if (null != traceDispatcher) { try { Properties tempProperties = new Properties(); - tempProperties.put(TrackTraceConstants.NAMESRV_ADDR, this.getNamesrvAddr()); + tempProperties.put(TraceConstants.NAMESRV_ADDR, this.getNamesrvAddr()); traceDispatcher.start(tempProperties); } catch (MQClientException e) { log.warn("trace dispatcher start failed ", e); @@ -772,11 +772,11 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume this.consumeTimeout = consumeTimeout; } - public AsyncDispatcher getTraceDispatcher() { + public TraceDispatcher getTraceDispatcher() { return traceDispatcher; } - public void setTraceDispatcher(AsyncDispatcher traceDispatcher) { + public void setTraceDispatcher(TraceDispatcher traceDispatcher) { this.traceDispatcher = traceDispatcher; } } diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index 22c676055f..1592d22b24 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -27,11 +27,11 @@ import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; import org.apache.rocketmq.client.log.ClientLogger; -import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; -import org.apache.rocketmq.client.trace.core.common.TrackTraceDispatcherType; -import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; -import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; -import org.apache.rocketmq.client.trace.core.hook.SendMessageTrackHookImpl; +import org.apache.rocketmq.client.trace.AsyncTraceDispatcher; +import org.apache.rocketmq.client.trace.TraceConstants; +import org.apache.rocketmq.client.trace.TraceDispatcherType; +import org.apache.rocketmq.client.trace.TraceDispatcher; +import org.apache.rocketmq.client.trace.hook.SendMessageTraceHookImpl; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.message.Message; @@ -133,7 +133,7 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { /** * Interface of asynchronous transfer data */ - private AsyncDispatcher traceDispatcher = null; + private TraceDispatcher traceDispatcher = null; /** * Default constructor. @@ -165,25 +165,26 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { this.producerGroup = producerGroup; defaultMQProducerImpl = new DefaultMQProducerImpl(this, rpcHook); //if client open the message track trace feature + //TODO wrap this code to TraceDispatcherFactory if (msgTraceSwitch) { try { Properties tempProperties = new Properties(); - tempProperties.put(TrackTraceConstants.MAX_MSG_SIZE, "128000"); - tempProperties.put(TrackTraceConstants.ASYNC_BUFFER_SIZE, "2048"); - tempProperties.put(TrackTraceConstants.MAX_BATCH_NUM, "100"); - tempProperties.put(TrackTraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); - tempProperties.put(TrackTraceConstants.TRACE_DISPATCHER_TYPE, TrackTraceDispatcherType.PRODUCER.name()); + tempProperties.put(TraceConstants.MAX_MSG_SIZE, "128000"); + tempProperties.put(TraceConstants.ASYNC_BUFFER_SIZE, "2048"); + tempProperties.put(TraceConstants.MAX_BATCH_NUM, "100"); + tempProperties.put(TraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); + tempProperties.put(TraceConstants.TRACE_DISPATCHER_TYPE, TraceDispatcherType.PRODUCER.name()); if (!UtilAll.isBlank(traceTopicName)) { - tempProperties.put(TrackTraceConstants.TRACE_TOPIC, traceTopicName); + tempProperties.put(TraceConstants.TRACE_TOPIC, traceTopicName); } else { - tempProperties.put(TrackTraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); + tempProperties.put(TraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); } - AsyncArrayDispatcher dispatcher = new AsyncArrayDispatcher(tempProperties, rpcHook); + AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(tempProperties, rpcHook); dispatcher.setHostProducer(this.getDefaultMQProducerImpl()); traceDispatcher = dispatcher; this.getDefaultMQProducerImpl().registerSendMessageHook( - new SendMessageTrackHookImpl(traceDispatcher)); + new SendMessageTraceHookImpl(traceDispatcher)); } catch (Throwable e) { log.error("system mqtrace hook init failed ,maybe can't send msg trace data"); } @@ -234,10 +235,11 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { @Override public void start() throws MQClientException { this.defaultMQProducerImpl.start(); + //TODO wrap this code to TraceDispatcherFactory if (null != traceDispatcher) { try { Properties tempProperties = new Properties(); - tempProperties.put(TrackTraceConstants.NAMESRV_ADDR, this.getNamesrvAddr()); + tempProperties.put(TraceConstants.NAMESRV_ADDR, this.getNamesrvAddr()); traceDispatcher.start(tempProperties); } catch (MQClientException e) { log.warn("trace dispatcher start failed ", e); @@ -864,11 +866,11 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { this.retryTimesWhenSendAsyncFailed = retryTimesWhenSendAsyncFailed; } - public AsyncDispatcher getTraceDispatcher() { + public TraceDispatcher getTraceDispatcher() { return traceDispatcher; } - public void setTraceDispatcher(AsyncDispatcher traceDispatcher) { + public void setTraceDispatcher(TraceDispatcher traceDispatcher) { this.traceDispatcher = traceDispatcher; } } diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java similarity index 82% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java rename to client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java index 496d290f5c..ce82d1bb1c 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/AsyncArrayDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.dispatch.impl; +package org.apache.rocketmq.client.trace; import org.apache.rocketmq.client.common.ThreadLocalIndex; import org.apache.rocketmq.client.exception.MQClientException; @@ -26,11 +26,6 @@ import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.MessageQueueSelector; import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; -import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; -import org.apache.rocketmq.client.trace.core.common.TrackTraceContext; -import org.apache.rocketmq.client.trace.core.common.TrackTraceDataEncoder; -import org.apache.rocketmq.client.trace.core.common.TrackTraceTransferBean; -import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; import org.apache.rocketmq.common.ThreadFactoryImpl; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageQueue; @@ -51,10 +46,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import org.apache.rocketmq.remoting.RPCHook; -/** - * Created by zongtanghu on 2018/11/6. - */ -public class AsyncArrayDispatcher implements AsyncDispatcher { +public class AsyncTraceDispatcher implements TraceDispatcher { private final static InternalLogger log = ClientLogger.getLog(); private final int queueSize; @@ -64,7 +56,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { // the last discard number of log private AtomicLong discardCount; private Thread worker; - private ArrayBlockingQueue traceContextQueue; + private ArrayBlockingQueue traceContextQueue; private ArrayBlockingQueue appenderQueue; private volatile Thread shutDownHook; private volatile boolean stopped = false; @@ -75,17 +67,17 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { private String dispatcherId = UUID.randomUUID().toString(); private String traceTopicName; - public AsyncArrayDispatcher(Properties properties, RPCHook rpcHook) throws MQClientException { - dispatcherType = properties.getProperty(TrackTraceConstants.TRACE_DISPATCHER_TYPE); - int queueSize = Integer.parseInt(properties.getProperty(TrackTraceConstants.ASYNC_BUFFER_SIZE, "2048")); + public AsyncTraceDispatcher(Properties properties, RPCHook rpcHook) throws MQClientException { + dispatcherType = properties.getProperty(TraceConstants.TRACE_DISPATCHER_TYPE); + int queueSize = Integer.parseInt(properties.getProperty(TraceConstants.ASYNC_BUFFER_SIZE, "2048")); // queueSize is greater than or equal to the n power of 2 of value queueSize = 1 << (32 - Integer.numberOfLeadingZeros(queueSize - 1)); this.queueSize = queueSize; - batchSize = Integer.parseInt(properties.getProperty(TrackTraceConstants.MAX_BATCH_NUM, "1")); + batchSize = Integer.parseInt(properties.getProperty(TraceConstants.MAX_BATCH_NUM, "1")); this.discardCount = new AtomicLong(0L); - traceContextQueue = new ArrayBlockingQueue(1024); + traceContextQueue = new ArrayBlockingQueue(1024); appenderQueue = new ArrayBlockingQueue(queueSize); - traceTopicName = properties.getProperty(TrackTraceConstants.TRACE_TOPIC); + traceTopicName = properties.getProperty(TraceConstants.TRACE_TOPIC); this.traceExecuter = new ThreadPoolExecutor(// 10, // 20, // @@ -93,7 +85,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { TimeUnit.MILLISECONDS, // this.appenderQueue, // new ThreadFactoryImpl("MQTraceSendThread_")); - traceProducer = TrackTraceProducerFactory.getTraceDispatcherProducer(properties, rpcHook); + traceProducer = TraceProducerFactory.getTraceDispatcherProducer(properties, rpcHook); } public String getTraceTopicName() { @@ -125,8 +117,8 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { } public void start(Properties properties) throws MQClientException { - TrackTraceProducerFactory.registerTraceDispatcher(dispatcherId, properties.getProperty(TrackTraceConstants.NAMESRV_ADDR)); - this.worker = new Thread(new AsyncRunnable(), "MQ-AsyncArrayDispatcher-Thread-" + dispatcherId); + TraceProducerFactory.registerTraceDispatcher(dispatcherId, properties.getProperty(TraceConstants.NAMESRV_ADDR)); + this.worker = new Thread(new AsyncRunnable(), "MQ-AsyncTraceDispatcher-Thread-" + dispatcherId); this.worker.setDaemon(true); this.worker.start(); this.registerShutDownHook(); @@ -134,7 +126,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { @Override public boolean append(final Object ctx) { - boolean result = traceContextQueue.offer((TrackTraceContext) ctx); + boolean result = traceContextQueue.offer((TraceContext) ctx); if (!result) { log.info("buffer full" + discardCount.incrementAndGet() + " ,context is " + ctx); } @@ -159,7 +151,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { public void shutdown() { this.stopped = true; this.traceExecuter.shutdown(); - TrackTraceProducerFactory.unregisterTraceDispatcher(dispatcherId); + TraceProducerFactory.unregisterTraceDispatcher(dispatcherId); this.removeShutdownHook(); } @@ -197,9 +189,9 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { @Override public void run() { while (!stopped) { - List contexts = new ArrayList(batchSize); + List contexts = new ArrayList(batchSize); for (int i = 0; i < batchSize; i++) { - TrackTraceContext context = null; + TraceContext context = null; try { //get track trace data element from blocking Queue — traceContextQueue context = traceContextQueue.poll(5, TimeUnit.MILLISECONDS); @@ -214,7 +206,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { if (contexts.size() > 0) { AsyncAppenderRequest request = new AsyncAppenderRequest(contexts); traceExecuter.submit(request); - } else if (AsyncArrayDispatcher.this.stopped) { + } else if (AsyncTraceDispatcher.this.stopped) { this.stopped = true; } } @@ -223,13 +215,13 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { } class AsyncAppenderRequest implements Runnable { - List contextList; + List contextList; - public AsyncAppenderRequest(final List contextList) { + public AsyncAppenderRequest(final List contextList) { if (contextList != null) { this.contextList = contextList; } else { - this.contextList = new ArrayList(1); + this.contextList = new ArrayList(1); } } @@ -238,9 +230,9 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { sendTraceData(contextList); } - public void sendTraceData(List contextList) { - Map> transBeanMap = new HashMap>(); - for (TrackTraceContext context : contextList) { + public void sendTraceData(List contextList) { + Map> transBeanMap = new HashMap>(); + for (TraceContext context : contextList) { if (context.getTraceBeans().isEmpty()) { continue; } @@ -248,15 +240,15 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { String topic = context.getTraceBeans().get(0).getTopic(); //2.use original message entity's topic as key String key = topic; - List transBeanList = transBeanMap.get(key); + List transBeanList = transBeanMap.get(key); if (transBeanList == null) { - transBeanList = new ArrayList(); + transBeanList = new ArrayList(); transBeanMap.put(key, transBeanList); } - TrackTraceTransferBean traceData = TrackTraceDataEncoder.encoderFromContextBean(context); + TraceTransferBean traceData = TraceDataEncoder.encoderFromContextBean(context); transBeanList.add(traceData); } - for (Map.Entry> entry : transBeanMap.entrySet()) { + for (Map.Entry> entry : transBeanMap.entrySet()) { flushData(entry.getValue()); } } @@ -264,7 +256,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { /** * batch sending data actually */ - private void flushData(List transBeanList) { + private void flushData(List transBeanList) { if (transBeanList.size() == 0) { return; } @@ -273,7 +265,7 @@ public class AsyncArrayDispatcher implements AsyncDispatcher { int count = 0; Set keySet = new HashSet(); - for (TrackTraceTransferBean bean : transBeanList) { + for (TraceTransferBean bean : transBeanList) { // keyset of message track trace includes msgId of or original message keySet.addAll(bean.getTransKey()); buffer.append(bean.getTransData()); diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceBean.java similarity index 97% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceBean.java index 220a128115..f93aa38b82 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceBean.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceBean.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.common; +package org.apache.rocketmq.client.trace; import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.message.MessageType; -public class TrackTraceBean { +public class TraceBean { private static final String LOCAL_ADDRESS = UtilAll.ipToIPv4Str(UtilAll.getIP()); private String topic = ""; private String msgId = ""; diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceConstants.java similarity index 94% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceConstants.java index a8868614b5..970b556350 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceConstants.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceConstants.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.common; +package org.apache.rocketmq.client.trace; -public class TrackTraceConstants { +public class TraceConstants { public static final String NAMESRV_ADDR = "NAMESRV_ADDR"; public static final String ADDRSRV_URL = "ADDRSRV_URL"; public static final String INSTANCE_NAME = "InstanceName"; diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceContext.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceContext.java similarity index 84% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceContext.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceContext.java index a6374a6d58..2370db955b 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceContext.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceContext.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.common; +package org.apache.rocketmq.client.trace; import org.apache.rocketmq.common.message.MessageClientIDSetter; @@ -23,9 +23,9 @@ import java.util.List; /** * The context of Track Trace */ -public class TrackTraceContext implements Comparable { +public class TraceContext implements Comparable { - private TrackTraceType traceType; + private TraceType traceType; private long timeStamp = System.currentTimeMillis(); private String regionId = ""; private String regionName = ""; @@ -34,7 +34,7 @@ public class TrackTraceContext implements Comparable { private boolean isSuccess = true; private String requestId = MessageClientIDSetter.createUniqID(); private int contextCode = 0; - private List traceBeans; + private List traceBeans; public int getContextCode() { return contextCode; @@ -44,11 +44,11 @@ public class TrackTraceContext implements Comparable { this.contextCode = contextCode; } - public List getTraceBeans() { + public List getTraceBeans() { return traceBeans; } - public void setTraceBeans(List traceBeans) { + public void setTraceBeans(List traceBeans) { this.traceBeans = traceBeans; } @@ -60,11 +60,11 @@ public class TrackTraceContext implements Comparable { this.regionId = regionId; } - public TrackTraceType getTraceType() { + public TraceType getTraceType() { return traceType; } - public void setTraceType(TrackTraceType traceType) { + public void setTraceType(TraceType traceType) { this.traceType = traceType; } @@ -117,7 +117,7 @@ public class TrackTraceContext implements Comparable { } @Override - public int compareTo(TrackTraceContext o) { + public int compareTo(TraceContext o) { return (int) (this.timeStamp - o.getTimeStamp()); } @@ -127,10 +127,10 @@ public class TrackTraceContext implements Comparable { sb.append(traceType).append("_").append(groupName) .append("_").append(regionId).append("_").append(isSuccess).append("_"); if (traceBeans != null && traceBeans.size() > 0) { - for (TrackTraceBean bean : traceBeans) { + for (TraceBean bean : traceBeans) { sb.append(bean.getMsgId() + "_" + bean.getTopic() + "_"); } } - return "TrackTraceContext{" + sb.toString() + '}'; + return "TraceContext{" + sb.toString() + '}'; } } diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDataEncoder.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java similarity index 54% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDataEncoder.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java index 3362106e62..6015e27e68 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDataEncoder.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java @@ -14,19 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.common; +package org.apache.rocketmq.client.trace; import org.apache.rocketmq.common.message.MessageType; import java.util.ArrayList; import java.util.List; -import static org.apache.rocketmq.client.trace.core.common.TrackTraceType.Pub; - /** * encode/decode for Track Trace Data */ -public class TrackTraceDataEncoder { +public class TraceDataEncoder { /** * resolving traceContext list From track trace data String @@ -34,21 +32,21 @@ public class TrackTraceDataEncoder { * @param traceData * @return */ - public static List decoderFromTraceDataString(String traceData) { - List resList = new ArrayList(); + public static List decoderFromTraceDataString(String traceData) { + List resList = new ArrayList(); if (traceData == null || traceData.length() <= 0) { return resList; } - String[] contextList = traceData.split(String.valueOf(TrackTraceConstants.FIELD_SPLITOR)); + String[] contextList = traceData.split(String.valueOf(TraceConstants.FIELD_SPLITOR)); for (String context : contextList) { - String[] line = context.split(String.valueOf(TrackTraceConstants.CONTENT_SPLITOR)); - if (line[0].equals(Pub.name())) { - TrackTraceContext pubContext = new TrackTraceContext(); - pubContext.setTraceType(Pub); + String[] line = context.split(String.valueOf(TraceConstants.CONTENT_SPLITOR)); + if (line[0].equals(TraceType.Pub.name())) { + TraceContext pubContext = new TraceContext(); + pubContext.setTraceType(TraceType.Pub); pubContext.setTimeStamp(Long.parseLong(line[1])); pubContext.setRegionId(line[2]); pubContext.setGroupName(line[3]); - TrackTraceBean bean = new TrackTraceBean(); + TraceBean bean = new TraceBean(); bean.setTopic(line[4]); bean.setMsgId(line[5]); bean.setTags(line[6]); @@ -64,31 +62,31 @@ public class TrackTraceDataEncoder { bean.setOffsetMsgId(line[12]); pubContext.setSuccess(Boolean.parseBoolean(line[13])); } - pubContext.setTraceBeans(new ArrayList(1)); + pubContext.setTraceBeans(new ArrayList(1)); pubContext.getTraceBeans().add(bean); resList.add(pubContext); - } else if (line[0].equals(TrackTraceType.SubBefore.name())) { - TrackTraceContext subBeforeContext = new TrackTraceContext(); - subBeforeContext.setTraceType(TrackTraceType.SubBefore); + } else if (line[0].equals(TraceType.SubBefore.name())) { + TraceContext subBeforeContext = new TraceContext(); + subBeforeContext.setTraceType(TraceType.SubBefore); subBeforeContext.setTimeStamp(Long.parseLong(line[1])); subBeforeContext.setRegionId(line[2]); subBeforeContext.setGroupName(line[3]); subBeforeContext.setRequestId(line[4]); - TrackTraceBean bean = new TrackTraceBean(); + TraceBean bean = new TraceBean(); bean.setMsgId(line[5]); bean.setRetryTimes(Integer.parseInt(line[6])); bean.setKeys(line[7]); - subBeforeContext.setTraceBeans(new ArrayList(1)); + subBeforeContext.setTraceBeans(new ArrayList(1)); subBeforeContext.getTraceBeans().add(bean); resList.add(subBeforeContext); - } else if (line[0].equals(TrackTraceType.SubAfter.name())) { - TrackTraceContext subAfterContext = new TrackTraceContext(); - subAfterContext.setTraceType(TrackTraceType.SubAfter); + } else if (line[0].equals(TraceType.SubAfter.name())) { + TraceContext subAfterContext = new TraceContext(); + subAfterContext.setTraceType(TraceType.SubAfter); subAfterContext.setRequestId(line[1]); - TrackTraceBean bean = new TrackTraceBean(); + TraceBean bean = new TraceBean(); bean.setMsgId(line[2]); bean.setKeys(line[5]); - subAfterContext.setTraceBeans(new ArrayList(1)); + subAfterContext.setTraceBeans(new ArrayList(1)); subAfterContext.getTraceBeans().add(bean); subAfterContext.setCostTime(Integer.parseInt(line[3])); subAfterContext.setSuccess(Boolean.parseBoolean(line[4])); @@ -108,62 +106,62 @@ public class TrackTraceDataEncoder { * @param ctx * @return */ - public static TrackTraceTransferBean encoderFromContextBean(TrackTraceContext ctx) { + public static TraceTransferBean encoderFromContextBean(TraceContext ctx) { if (ctx == null) { return null; } //build message track trace of the transfering entity content bean - TrackTraceTransferBean transferBean = new TrackTraceTransferBean(); + TraceTransferBean transferBean = new TraceTransferBean(); StringBuilder sb = new StringBuilder(256); switch (ctx.getTraceType()) { case Pub: { - TrackTraceBean bean = ctx.getTraceBeans().get(0); + TraceBean bean = ctx.getTraceBeans().get(0); //append the content of context and traceBean to transferBean's TransData - sb.append(ctx.getTraceType()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getTimeStamp()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getRegionId()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getGroupName()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getTopic()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getMsgId()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getTags()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getKeys()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getStoreHost()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getBodyLength()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getCostTime()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getMsgType().ordinal()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getOffsetMsgId()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.isSuccess()).append(TrackTraceConstants.FIELD_SPLITOR); + sb.append(ctx.getTraceType()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getTimeStamp()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getRegionId()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getGroupName()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getTopic()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getMsgId()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getTags()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getKeys()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getStoreHost()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getBodyLength()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getCostTime()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getMsgType().ordinal()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getOffsetMsgId()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.isSuccess()).append(TraceConstants.FIELD_SPLITOR); } break; case SubBefore: { - for (TrackTraceBean bean : ctx.getTraceBeans()) { - sb.append(ctx.getTraceType()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getTimeStamp()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getRegionId()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getGroupName()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getRequestId()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getMsgId()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getRetryTimes()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getKeys()).append(TrackTraceConstants.FIELD_SPLITOR);// + for (TraceBean bean : ctx.getTraceBeans()) { + sb.append(ctx.getTraceType()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getTimeStamp()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getRegionId()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getGroupName()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getRequestId()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getMsgId()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getRetryTimes()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getKeys()).append(TraceConstants.FIELD_SPLITOR);// } } break; case SubAfter: { - for (TrackTraceBean bean : ctx.getTraceBeans()) { - sb.append(ctx.getTraceType()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getRequestId()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getMsgId()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getCostTime()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.isSuccess()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(bean.getKeys()).append(TrackTraceConstants.CONTENT_SPLITOR)// - .append(ctx.getContextCode()).append(TrackTraceConstants.FIELD_SPLITOR); + for (TraceBean bean : ctx.getTraceBeans()) { + sb.append(ctx.getTraceType()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getRequestId()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getMsgId()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getCostTime()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.isSuccess()).append(TraceConstants.CONTENT_SPLITOR)// + .append(bean.getKeys()).append(TraceConstants.CONTENT_SPLITOR)// + .append(ctx.getContextCode()).append(TraceConstants.FIELD_SPLITOR); } } break; default: } transferBean.setTransData(sb.toString()); - for (TrackTraceBean bean : ctx.getTraceBeans()) { + for (TraceBean bean : ctx.getTraceBeans()) { transferBean.getTransKey().add(bean.getMsgId()); if (bean.getKeys() != null && bean.getKeys().length() > 0) { diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/AsyncDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java similarity index 94% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/AsyncDispatcher.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java index 9b282bb0b1..3efef7c462 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/AsyncDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.dispatch; +package org.apache.rocketmq.client.trace; import java.util.Properties; import org.apache.rocketmq.client.exception.MQClientException; @@ -23,7 +23,7 @@ import java.io.IOException; /** * Interface of asynchronous transfer data */ -public interface AsyncDispatcher { +public interface TraceDispatcher { /** * Initialize asynchronous transfer data module diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDispatcherType.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcherType.java similarity index 89% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDispatcherType.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcherType.java index a22198e81b..f09c9b8db4 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceDispatcherType.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcherType.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.common; +package org.apache.rocketmq.client.trace; -public enum TrackTraceDispatcherType { +public enum TraceDispatcherType { PRODUCER, CONSUMER } diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceProducerFactory.java similarity index 84% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceProducerFactory.java index 37c39a14e5..6e4ed363a8 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/dispatch/impl/TrackTraceProducerFactory.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceProducerFactory.java @@ -14,11 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.dispatch.impl; +package org.apache.rocketmq.client.trace; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; -import org.apache.rocketmq.client.trace.core.common.TrackTraceConstants; import org.apache.rocketmq.common.namesrv.TopAddressing; import java.util.Map; @@ -27,7 +26,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.rocketmq.remoting.RPCHook; -public class TrackTraceProducerFactory { +@Deprecated +public class TraceProducerFactory { private static Map dispatcherTable = new ConcurrentHashMap(); private static AtomicBoolean isStarted = new AtomicBoolean(false); @@ -38,18 +38,18 @@ public class TrackTraceProducerFactory { if (traceProducer == null) { traceProducer = new DefaultMQProducer(rpcHook); - traceProducer.setProducerGroup(TrackTraceConstants.GROUP_NAME); + traceProducer.setProducerGroup(TraceConstants.GROUP_NAME); traceProducer.setSendMsgTimeout(5000); - traceProducer.setInstanceName(properties.getProperty(TrackTraceConstants.INSTANCE_NAME, String.valueOf(System.currentTimeMillis()))); - String nameSrv = properties.getProperty(TrackTraceConstants.NAMESRV_ADDR); + traceProducer.setInstanceName(properties.getProperty(TraceConstants.INSTANCE_NAME, String.valueOf(System.currentTimeMillis()))); + String nameSrv = properties.getProperty(TraceConstants.NAMESRV_ADDR); if (nameSrv == null) { - TopAddressing topAddressing = new TopAddressing(properties.getProperty(TrackTraceConstants.ADDRSRV_URL)); + TopAddressing topAddressing = new TopAddressing(properties.getProperty(TraceConstants.ADDRSRV_URL)); nameSrv = topAddressing.fetchNSAddr(); } traceProducer.setNamesrvAddr(nameSrv); traceProducer.setVipChannelEnabled(false); //the max size of message is 128K - int maxSize = Integer.parseInt(properties.getProperty(TrackTraceConstants.MAX_MSG_SIZE, "128000")); + int maxSize = Integer.parseInt(properties.getProperty(TraceConstants.MAX_MSG_SIZE, "128000")); traceProducer.setMaxMessageSize(maxSize - 10 * 1000); } return traceProducer; diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceTransferBean.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java similarity index 93% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceTransferBean.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java index 9535b5d472..d3d25c4d4a 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceTransferBean.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.common; +package org.apache.rocketmq.client.trace; import java.util.HashSet; import java.util.Set; @@ -22,7 +22,7 @@ import java.util.Set; /** * track trace transfering bean */ -public class TrackTraceTransferBean { +public class TraceTransferBean { private String transData; private Set transKey = new HashSet(); diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceType.java similarity index 91% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java rename to client/src/main/java/org/apache/rocketmq/client/trace/TraceType.java index 72fa630554..79b19c17e4 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/common/TrackTraceType.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceType.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.common; +package org.apache.rocketmq.client.trace; -public enum TrackTraceType { +public enum TraceType { Pub, SubBefore, SubAfter, diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/ConsumeMessageTraceHookImpl.java b/client/src/main/java/org/apache/rocketmq/client/trace/hook/ConsumeMessageTraceHookImpl.java similarity index 81% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/hook/ConsumeMessageTraceHookImpl.java rename to client/src/main/java/org/apache/rocketmq/client/trace/hook/ConsumeMessageTraceHookImpl.java index df88ce2d57..7fbad36979 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/ConsumeMessageTraceHookImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/hook/ConsumeMessageTraceHookImpl.java @@ -14,15 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.hook; +package org.apache.rocketmq.client.trace.hook; import org.apache.rocketmq.client.consumer.listener.ConsumeReturnType; import org.apache.rocketmq.client.hook.ConsumeMessageContext; import org.apache.rocketmq.client.hook.ConsumeMessageHook; -import org.apache.rocketmq.client.trace.core.common.TrackTraceBean; -import org.apache.rocketmq.client.trace.core.common.TrackTraceContext; -import org.apache.rocketmq.client.trace.core.common.TrackTraceType; -import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; +import org.apache.rocketmq.client.trace.TraceContext; +import org.apache.rocketmq.client.trace.TraceDispatcher; +import org.apache.rocketmq.client.trace.TraceBean; +import org.apache.rocketmq.client.trace.TraceType; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.message.MessageConst; import org.apache.rocketmq.common.message.MessageExt; @@ -32,9 +32,9 @@ import java.util.List; public class ConsumeMessageTraceHookImpl implements ConsumeMessageHook { - private AsyncDispatcher localDispatcher; + private TraceDispatcher localDispatcher; - public ConsumeMessageTraceHookImpl(AsyncDispatcher localDispatcher) { + public ConsumeMessageTraceHookImpl(TraceDispatcher localDispatcher) { this.localDispatcher = localDispatcher; } @@ -48,11 +48,11 @@ public class ConsumeMessageTraceHookImpl implements ConsumeMessageHook { if (context == null || context.getMsgList() == null || context.getMsgList().isEmpty()) { return; } - TrackTraceContext traceContext = new TrackTraceContext(); + TraceContext traceContext = new TraceContext(); context.setMqTraceContext(traceContext); - traceContext.setTraceType(TrackTraceType.SubBefore);// + traceContext.setTraceType(TraceType.SubBefore);// traceContext.setGroupName(context.getConsumerGroup());// - List beans = new ArrayList(); + List beans = new ArrayList(); for (MessageExt msg : context.getMsgList()) { if (msg == null) { continue; @@ -64,7 +64,7 @@ public class ConsumeMessageTraceHookImpl implements ConsumeMessageHook { // if trace switch is false ,skip it continue; } - TrackTraceBean traceBean = new TrackTraceBean(); + TraceBean traceBean = new TraceBean(); traceBean.setTopic(msg.getTopic());// traceBean.setMsgId(msg.getMsgId());// traceBean.setTags(msg.getTags());// @@ -87,14 +87,14 @@ public class ConsumeMessageTraceHookImpl implements ConsumeMessageHook { if (context == null || context.getMsgList() == null || context.getMsgList().isEmpty()) { return; } - TrackTraceContext subBeforeContext = (TrackTraceContext) context.getMqTraceContext(); + TraceContext subBeforeContext = (TraceContext) context.getMqTraceContext(); if (subBeforeContext.getTraceBeans() == null || subBeforeContext.getTraceBeans().size() < 1) { // if subbefore bean is null ,skip it return; } - TrackTraceContext subAfterContext = new TrackTraceContext(); - subAfterContext.setTraceType(TrackTraceType.SubAfter);// + TraceContext subAfterContext = new TraceContext(); + subAfterContext.setTraceType(TraceType.SubAfter);// subAfterContext.setRegionId(subBeforeContext.getRegionId());// subAfterContext.setGroupName(subBeforeContext.getGroupName());// subAfterContext.setRequestId(subBeforeContext.getRequestId());// diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java b/client/src/main/java/org/apache/rocketmq/client/trace/hook/SendMessageTraceHookImpl.java similarity index 74% rename from client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java rename to client/src/main/java/org/apache/rocketmq/client/trace/hook/SendMessageTraceHookImpl.java index c174f462de..bfe5d7aa35 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/core/hook/SendMessageTrackHookImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/hook/SendMessageTraceHookImpl.java @@ -14,23 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.client.trace.core.hook; +package org.apache.rocketmq.client.trace.hook; import org.apache.rocketmq.client.hook.SendMessageContext; import org.apache.rocketmq.client.hook.SendMessageHook; import org.apache.rocketmq.client.producer.SendStatus; -import org.apache.rocketmq.client.trace.core.common.TrackTraceBean; -import org.apache.rocketmq.client.trace.core.common.TrackTraceContext; -import org.apache.rocketmq.client.trace.core.common.TrackTraceType; -import org.apache.rocketmq.client.trace.core.dispatch.AsyncDispatcher; -import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; +import org.apache.rocketmq.client.trace.AsyncTraceDispatcher; +import org.apache.rocketmq.client.trace.TraceContext; +import org.apache.rocketmq.client.trace.TraceDispatcher; +import org.apache.rocketmq.client.trace.TraceBean; +import org.apache.rocketmq.client.trace.TraceType; import java.util.ArrayList; -public class SendMessageTrackHookImpl implements SendMessageHook { +public class SendMessageTraceHookImpl implements SendMessageHook { - private AsyncDispatcher localDispatcher; + private TraceDispatcher localDispatcher; - public SendMessageTrackHookImpl(AsyncDispatcher localDispatcher) { + public SendMessageTraceHookImpl(TraceDispatcher localDispatcher) { this.localDispatcher = localDispatcher; } @@ -42,18 +42,18 @@ public class SendMessageTrackHookImpl implements SendMessageHook { @Override public void sendMessageBefore(SendMessageContext context) { //if it is message track trace data,then it doesn't recorded - if (context == null || context.getMessage().getTopic().startsWith(((AsyncArrayDispatcher) localDispatcher).getTraceTopicName())) { + if (context == null || context.getMessage().getTopic().startsWith(((AsyncTraceDispatcher) localDispatcher).getTraceTopicName())) { return; } //build the context content of TuxeTraceContext - TrackTraceContext tuxeContext = new TrackTraceContext(); - tuxeContext.setTraceBeans(new ArrayList(1)); + TraceContext tuxeContext = new TraceContext(); + tuxeContext.setTraceBeans(new ArrayList(1)); context.setMqTraceContext(tuxeContext); - tuxeContext.setTraceType(TrackTraceType.Pub); + tuxeContext.setTraceType(TraceType.Pub); tuxeContext.setGroupName(context.getProducerGroup()); //build the data bean object of message track trace - TrackTraceBean traceBean = new TrackTraceBean(); + TraceBean traceBean = new TraceBean(); traceBean.setTopic(context.getMessage().getTopic()); traceBean.setTags(context.getMessage().getTags()); traceBean.setKeys(context.getMessage().getKeys()); @@ -66,7 +66,7 @@ public class SendMessageTrackHookImpl implements SendMessageHook { @Override public void sendMessageAfter(SendMessageContext context) { //if it is message track trace data,then it doesn't recorded - if (context == null || context.getMessage().getTopic().startsWith(((AsyncArrayDispatcher) localDispatcher).getTraceTopicName()) + if (context == null || context.getMessage().getTopic().startsWith(((AsyncTraceDispatcher) localDispatcher).getTraceTopicName()) || context.getMqTraceContext() == null) { return; } @@ -80,8 +80,8 @@ public class SendMessageTrackHookImpl implements SendMessageHook { return; } - TrackTraceContext tuxeContext = (TrackTraceContext) context.getMqTraceContext(); - TrackTraceBean traceBean = tuxeContext.getTraceBeans().get(0); + TraceContext tuxeContext = (TraceContext) context.getMqTraceContext(); + TraceBean traceBean = tuxeContext.getTraceBeans().get(0); int costTime = (int) ((System.currentTimeMillis() - tuxeContext.getTimeStamp()) / tuxeContext.getTraceBeans().size()); tuxeContext.setCostTime(costTime); if (context.getSendResult().getSendStatus().equals(SendStatus.SEND_OK)) { diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java index 08382dfe8e..b34784055f 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java @@ -53,7 +53,6 @@ import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.client.producer.SendStatus; -import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.message.MessageClientExt; import org.apache.rocketmq.common.message.MessageDecoder; @@ -103,7 +102,7 @@ public class DefaultMQConsumerWithTraceTest { private DefaultMQPushConsumer customTraceTopicpushConsumer; - private AsyncArrayDispatcher asyncArrayDispatcher; + private AsyncTraceDispatcher asyncTraceDispatcher; private MQClientInstance mQClientTraceFactory; @Mock private MQClientAPIImpl mQClientTraceAPIImpl; @@ -120,8 +119,8 @@ public class DefaultMQConsumerWithTraceTest { pushConsumer.setNamesrvAddr("127.0.0.1:9876"); pushConsumer.setPullInterval(60 * 1000); - asyncArrayDispatcher = (AsyncArrayDispatcher)pushConsumer.getTraceDispatcher(); - traceProducer = asyncArrayDispatcher.getTraceProducer(); + asyncTraceDispatcher = (AsyncTraceDispatcher)pushConsumer.getTraceDispatcher(); + traceProducer = asyncTraceDispatcher.getTraceProducer(); pushConsumer.registerMessageListener(new MessageListenerConcurrently() { diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java index 9460d6834e..905efb9830 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java @@ -37,7 +37,6 @@ import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.client.producer.SendStatus; -import org.apache.rocketmq.client.trace.core.dispatch.impl.AsyncArrayDispatcher; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeader; @@ -73,7 +72,7 @@ public class DefaultMQProducerWithTraceTest { @Mock private MQClientAPIImpl mQClientTraceAPIImpl; - private AsyncArrayDispatcher asyncArrayDispatcher; + private AsyncTraceDispatcher asyncTraceDispatcher; private DefaultMQProducer producer; private DefaultMQProducer customTraceTopicproducer; @@ -97,11 +96,11 @@ public class DefaultMQProducerWithTraceTest { normalProducer.setNamesrvAddr("127.0.0.1:9877"); customTraceTopicproducer.setNamesrvAddr("127.0.0.1:9878"); message = new Message(topic, new byte[] {'a', 'b' ,'c'}); - asyncArrayDispatcher = (AsyncArrayDispatcher)producer.getTraceDispatcher(); - asyncArrayDispatcher.setTraceTopicName(customerTraceTopic); - asyncArrayDispatcher.getHostProducer(); - asyncArrayDispatcher.getHostConsumer(); - traceProducer = asyncArrayDispatcher.getTraceProducer(); + asyncTraceDispatcher = (AsyncTraceDispatcher)producer.getTraceDispatcher(); + asyncTraceDispatcher.setTraceTopicName(customerTraceTopic); + asyncTraceDispatcher.getHostProducer(); + asyncTraceDispatcher.getHostConsumer(); + traceProducer = asyncTraceDispatcher.getTraceProducer(); producer.start(); diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java index 898051704b..f4cb4e4b37 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java @@ -40,14 +40,7 @@ import org.apache.rocketmq.common.message.MessageQueue; import org.apache.rocketmq.remoting.RPCHook; import org.apache.rocketmq.remoting.common.RemotingHelper; -/** - * - * 1. view the /conf/plain_acl.yml file under the distribution module, pay attention to the accessKey,secretKey, - * globalWhiteRemoteAddresses and whiteRemoteAddress and some other attributes. - * - * 2. Modify ACL_ACCESS_KEY and ACL_SECRET_KEY to the corresponding accessKey and secretKey in plain_acl.yml - * - */ + public class AclClient { private static final Map OFFSE_TABLE = new HashMap(); From 06da1045e317de32e9c12888fcbde9ae93e4cce0 Mon Sep 17 00:00:00 2001 From: Hu Zongtang Date: Sat, 29 Dec 2018 10:35:07 +0800 Subject: [PATCH 81/96] [ISSUE#525]restructure and optimize codes for message track (#645) --- .../broker/topic/TopicConfigManager.java | 2 +- .../consumer/DefaultMQPushConsumer.java | 29 ++------ .../client/producer/DefaultMQProducer.java | 34 ++------- .../client/trace/AsyncTraceDispatcher.java | 67 +++++++++++------ .../rocketmq/client/trace/TraceConstants.java | 11 +-- .../rocketmq/client/trace/TraceContext.java | 2 +- .../client/trace/TraceDataEncoder.java | 8 +-- .../client/trace/TraceDispatcher.java | 5 +- .../client/trace/TraceProducerFactory.java | 72 ------------------- .../client/trace/TraceTransferBean.java | 2 +- .../trace/hook/SendMessageTraceHookImpl.java | 9 ++- .../trace/DefaultMQConsumerWithTraceTest.java | 4 +- .../trace/DefaultMQProducerWithTraceTest.java | 4 +- .../apache/rocketmq/common/BrokerConfig.java | 11 +-- .../org/apache/rocketmq/common/MixAll.java | 2 +- .../rocketmq/common/BrokerConfigTest.java | 4 +- 16 files changed, 88 insertions(+), 178 deletions(-) delete mode 100644 client/src/main/java/org/apache/rocketmq/client/trace/TraceProducerFactory.java diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java index bd5eaeeab2..f1ae2612aa 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java @@ -126,7 +126,7 @@ public class TopicConfigManager extends ConfigManager { } { if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { - String topic = this.brokerController.getBrokerConfig().getMsgTrackTopicName(); + String topic = this.brokerController.getBrokerConfig().getMsgTraceTopicName(); TopicConfig topicConfig = new TopicConfig(topic); this.systemTopicList.add(topic); topicConfig.setReadQueueNums(1); diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index cbe22fdb35..edb8cb5abf 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -18,7 +18,6 @@ package org.apache.rocketmq.client.consumer; import java.util.HashMap; import java.util.Map; -import java.util.Properties; import java.util.Set; import org.apache.rocketmq.client.ClientConfig; import org.apache.rocketmq.client.QueryResult; @@ -32,9 +31,7 @@ import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; import org.apache.rocketmq.client.log.ClientLogger; import org.apache.rocketmq.client.trace.AsyncTraceDispatcher; -import org.apache.rocketmq.client.trace.TraceConstants; import org.apache.rocketmq.client.trace.TraceDispatcher; -import org.apache.rocketmq.client.trace.TraceDispatcherType; import org.apache.rocketmq.client.trace.hook.ConsumeMessageTraceHookImpl; import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.UtilAll; @@ -288,8 +285,8 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * @param consumerGroup Consume queue. * @param rpcHook RPC hook to execute before each remoting command. * @param allocateMessageQueueStrategy message queue allocating algorithm. - * @param msgTraceSwitch switch flag instance for message track trace. - * @param traceTopicName the name value of message track trace topic.If you don't config,you can use the default trace topic name. + * @param msgTraceSwitch switch flag instance for message trace. + * @param traceTopicName the name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, AllocateMessageQueueStrategy allocateMessageQueueStrategy, boolean msgTraceSwitch, final String traceTopicName) { @@ -298,21 +295,9 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume defaultMQPushConsumerImpl = new DefaultMQPushConsumerImpl(this, rpcHook); if (msgTraceSwitch) { try { - Properties tempProperties = new Properties(); - tempProperties.put(TraceConstants.MAX_MSG_SIZE, "128000"); - tempProperties.put(TraceConstants.ASYNC_BUFFER_SIZE, "2048"); - tempProperties.put(TraceConstants.MAX_BATCH_NUM, "100"); - tempProperties.put(TraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); - tempProperties.put(TraceConstants.TRACE_DISPATCHER_TYPE, TraceDispatcherType.CONSUMER.name()); - if (!UtilAll.isBlank(traceTopicName)) { - tempProperties.put(TraceConstants.TRACE_TOPIC, traceTopicName); - } else { - tempProperties.put(TraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); - } - AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(tempProperties, rpcHook); + AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(traceTopicName, rpcHook); dispatcher.setHostConsumer(this.getDefaultMQPushConsumerImpl()); traceDispatcher = dispatcher; - this.getDefaultMQPushConsumerImpl().registerConsumeMessageHook( new ConsumeMessageTraceHookImpl(traceDispatcher)); } catch (Throwable e) { @@ -334,8 +319,8 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * Constructor specifying consumer group. * * @param consumerGroup Consumer group. - * @param msgTraceSwitch switch flag instance for message track trace. - * @param traceTopicName the name value of message track trace topic.If you don't config,you can use the default trace topic name. + * @param msgTraceSwitch switch flag instance for message trace. + * @param traceTopicName the name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQPushConsumer(final String consumerGroup, boolean msgTraceSwitch, final String traceTopicName) { this(consumerGroup, null, new AllocateMessageQueueAveragely(), msgTraceSwitch, traceTopicName); @@ -585,9 +570,7 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume this.defaultMQPushConsumerImpl.start(); if (null != traceDispatcher) { try { - Properties tempProperties = new Properties(); - tempProperties.put(TraceConstants.NAMESRV_ADDR, this.getNamesrvAddr()); - traceDispatcher.start(tempProperties); + traceDispatcher.start(this.getNamesrvAddr()); } catch (MQClientException e) { log.warn("trace dispatcher start failed ", e); } diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index 1592d22b24..23cb53ca1f 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -18,7 +18,6 @@ package org.apache.rocketmq.client.producer; import java.util.Collection; import java.util.List; -import java.util.Properties; import java.util.concurrent.ExecutorService; import org.apache.rocketmq.client.ClientConfig; import org.apache.rocketmq.client.QueryResult; @@ -28,12 +27,9 @@ import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl; import org.apache.rocketmq.client.log.ClientLogger; import org.apache.rocketmq.client.trace.AsyncTraceDispatcher; -import org.apache.rocketmq.client.trace.TraceConstants; -import org.apache.rocketmq.client.trace.TraceDispatcherType; import org.apache.rocketmq.client.trace.TraceDispatcher; import org.apache.rocketmq.client.trace.hook.SendMessageTraceHookImpl; import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageBatch; import org.apache.rocketmq.common.message.MessageClientIDSetter; @@ -158,31 +154,18 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * * @param producerGroup Producer group, see the name-sake field. * @param rpcHook RPC hook to execute per each remoting command execution. - * @param msgTraceSwitch switch flag instance for message track trace. - * @param traceTopicName the name value of message track trace topic.If you don't config,you can use the default trace topic name. + * @param msgTraceSwitch switch flag instance for message trace. + * @param traceTopicName the name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean msgTraceSwitch,final String traceTopicName) { this.producerGroup = producerGroup; defaultMQProducerImpl = new DefaultMQProducerImpl(this, rpcHook); - //if client open the message track trace feature - //TODO wrap this code to TraceDispatcherFactory + //if client open the message trace feature if (msgTraceSwitch) { try { - Properties tempProperties = new Properties(); - tempProperties.put(TraceConstants.MAX_MSG_SIZE, "128000"); - tempProperties.put(TraceConstants.ASYNC_BUFFER_SIZE, "2048"); - tempProperties.put(TraceConstants.MAX_BATCH_NUM, "100"); - tempProperties.put(TraceConstants.INSTANCE_NAME, "PID_CLIENT_INNER_TRACE_PRODUCER"); - tempProperties.put(TraceConstants.TRACE_DISPATCHER_TYPE, TraceDispatcherType.PRODUCER.name()); - if (!UtilAll.isBlank(traceTopicName)) { - tempProperties.put(TraceConstants.TRACE_TOPIC, traceTopicName); - } else { - tempProperties.put(TraceConstants.TRACE_TOPIC, MixAll.RMQ_SYS_TRACK_TRACE_TOPIC); - } - AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(tempProperties, rpcHook); + AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(traceTopicName, rpcHook); dispatcher.setHostProducer(this.getDefaultMQProducerImpl()); traceDispatcher = dispatcher; - this.getDefaultMQProducerImpl().registerSendMessageHook( new SendMessageTraceHookImpl(traceDispatcher)); } catch (Throwable e) { @@ -204,8 +187,8 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * Constructor specifying producer group. * * @param producerGroup Producer group, see the name-sake field. - * @param msgTraceSwitch switch flag instance for message track trace. - * @param traceTopicName the name value of message track trace topic.If you don't config,you can use the default trace topic name. + * @param msgTraceSwitch switch flag instance for message trace. + * @param traceTopicName the name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQProducer(final String producerGroup, boolean msgTraceSwitch, final String traceTopicName) { this(producerGroup, null, msgTraceSwitch, traceTopicName); @@ -235,12 +218,9 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { @Override public void start() throws MQClientException { this.defaultMQProducerImpl.start(); - //TODO wrap this code to TraceDispatcherFactory if (null != traceDispatcher) { try { - Properties tempProperties = new Properties(); - tempProperties.put(TraceConstants.NAMESRV_ADDR, this.getNamesrvAddr()); - traceDispatcher.start(tempProperties); + traceDispatcher.start(this.getNamesrvAddr()); } catch (MQClientException e) { log.warn("trace dispatcher start failed ", e); } diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java index ce82d1bb1c..04ef8e09a1 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java @@ -16,6 +16,7 @@ */ package org.apache.rocketmq.client.trace; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.rocketmq.client.common.ThreadLocalIndex; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; @@ -26,7 +27,9 @@ import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.MessageQueueSelector; import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.common.ThreadFactoryImpl; +import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageQueue; import org.apache.rocketmq.logging.InternalLogger; @@ -35,7 +38,6 @@ import java.io.IOException; import java.util.List; import java.util.HashMap; import java.util.UUID; -import java.util.Properties; import java.util.Set; import java.util.HashSet; import java.util.ArrayList; @@ -46,11 +48,14 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import org.apache.rocketmq.remoting.RPCHook; +import static org.apache.rocketmq.client.trace.TraceConstants.TRACE_INSTANCE_NAME; + public class AsyncTraceDispatcher implements TraceDispatcher { private final static InternalLogger log = ClientLogger.getLog(); private final int queueSize; private final int batchSize; + private final int maxMsgSize; private final DefaultMQProducer traceProducer; private final ThreadPoolExecutor traceExecuter; // the last discard number of log @@ -60,24 +65,27 @@ public class AsyncTraceDispatcher implements TraceDispatcher { private ArrayBlockingQueue appenderQueue; private volatile Thread shutDownHook; private volatile boolean stopped = false; - private String dispatcherType; private DefaultMQProducerImpl hostProducer; private DefaultMQPushConsumerImpl hostConsumer; private volatile ThreadLocalIndex sendWhichQueue = new ThreadLocalIndex(); private String dispatcherId = UUID.randomUUID().toString(); private String traceTopicName; + private static AtomicBoolean isStarted = new AtomicBoolean(false); - public AsyncTraceDispatcher(Properties properties, RPCHook rpcHook) throws MQClientException { - dispatcherType = properties.getProperty(TraceConstants.TRACE_DISPATCHER_TYPE); - int queueSize = Integer.parseInt(properties.getProperty(TraceConstants.ASYNC_BUFFER_SIZE, "2048")); + + public AsyncTraceDispatcher(String traceTopicName, RPCHook rpcHook) throws MQClientException { // queueSize is greater than or equal to the n power of 2 of value - queueSize = 1 << (32 - Integer.numberOfLeadingZeros(queueSize - 1)); - this.queueSize = queueSize; - batchSize = Integer.parseInt(properties.getProperty(TraceConstants.MAX_BATCH_NUM, "1")); + this.queueSize = 2048; + this.batchSize = 100; + this.maxMsgSize = 128000; this.discardCount = new AtomicLong(0L); - traceContextQueue = new ArrayBlockingQueue(1024); - appenderQueue = new ArrayBlockingQueue(queueSize); - traceTopicName = properties.getProperty(TraceConstants.TRACE_TOPIC); + this.traceContextQueue = new ArrayBlockingQueue(1024); + this.appenderQueue = new ArrayBlockingQueue(queueSize); + if (!UtilAll.isBlank(traceTopicName)) { + this.traceTopicName = traceTopicName; + } else { + this.traceTopicName = MixAll.RMQ_SYS_TRACE_TOPIC; + } this.traceExecuter = new ThreadPoolExecutor(// 10, // 20, // @@ -85,7 +93,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { TimeUnit.MILLISECONDS, // this.appenderQueue, // new ThreadFactoryImpl("MQTraceSendThread_")); - traceProducer = TraceProducerFactory.getTraceDispatcherProducer(properties, rpcHook); + traceProducer = getAndCreateTraceProducer(rpcHook); } public String getTraceTopicName() { @@ -116,14 +124,31 @@ public class AsyncTraceDispatcher implements TraceDispatcher { this.hostConsumer = hostConsumer; } - public void start(Properties properties) throws MQClientException { - TraceProducerFactory.registerTraceDispatcher(dispatcherId, properties.getProperty(TraceConstants.NAMESRV_ADDR)); + public void start(String nameSrvAddr) throws MQClientException { + if (isStarted.compareAndSet(false, true)) { + traceProducer.setNamesrvAddr(nameSrvAddr); + traceProducer.start(); + } this.worker = new Thread(new AsyncRunnable(), "MQ-AsyncTraceDispatcher-Thread-" + dispatcherId); this.worker.setDaemon(true); this.worker.start(); this.registerShutDownHook(); } + private DefaultMQProducer getAndCreateTraceProducer(RPCHook rpcHook) { + DefaultMQProducer traceProducerInstance = this.traceProducer; + if (traceProducerInstance == null) { + traceProducerInstance = new DefaultMQProducer(rpcHook); + traceProducerInstance.setProducerGroup(TraceConstants.GROUP_NAME); + traceProducerInstance.setSendMsgTimeout(5000); + traceProducerInstance.setInstanceName(TRACE_INSTANCE_NAME); + traceProducerInstance.setVipChannelEnabled(false); + //the max size of message is 128K + traceProducerInstance.setMaxMessageSize(maxMsgSize - 10 * 1000); + } + return traceProducerInstance; + } + @Override public boolean append(final Object ctx) { boolean result = traceContextQueue.offer((TraceContext) ctx); @@ -151,7 +176,9 @@ public class AsyncTraceDispatcher implements TraceDispatcher { public void shutdown() { this.stopped = true; this.traceExecuter.shutdown(); - TraceProducerFactory.unregisterTraceDispatcher(dispatcherId); + if (isStarted.get()) { + traceProducer.shutdown(); + } this.removeShutdownHook(); } @@ -193,7 +220,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { for (int i = 0; i < batchSize; i++) { TraceContext context = null; try { - //get track trace data element from blocking Queue — traceContextQueue + //get trace data element from blocking Queue — traceContextQueue context = traceContextQueue.poll(5, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { } @@ -266,7 +293,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { Set keySet = new HashSet(); for (TraceTransferBean bean : transBeanList) { - // keyset of message track trace includes msgId of or original message + // keyset of message trace includes msgId of or original message keySet.addAll(bean.getTransKey()); buffer.append(bean.getTransData()); count++; @@ -286,16 +313,16 @@ public class AsyncTraceDispatcher implements TraceDispatcher { } /** - * send message track trace data + * send message trace data * * @param keySet the keyset in this batch(including msgId in original message not offsetMsgId) - * @param data the message track trace data in this batch + * @param data the message trace data in this batch */ private void sendTraceDataByMQ(Set keySet, final String data) { String topic = traceTopicName; final Message message = new Message(topic, data.getBytes()); - //keyset of message track trace includes msgId of or original message + //keyset of message trace includes msgId of or original message message.setKeys(keySet); try { Set traceBrokerSet = tryGetMessageQueueBrokerSet(traceProducer.getDefaultMQProducerImpl(), topic); diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceConstants.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceConstants.java index 970b556350..b9fd8778ea 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceConstants.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceConstants.java @@ -17,16 +17,9 @@ package org.apache.rocketmq.client.trace; public class TraceConstants { - public static final String NAMESRV_ADDR = "NAMESRV_ADDR"; - public static final String ADDRSRV_URL = "ADDRSRV_URL"; - public static final String INSTANCE_NAME = "InstanceName"; - public static final String ASYNC_BUFFER_SIZE = "AsyncBufferSize"; - public static final String MAX_BATCH_NUM = "MaxBatchNum"; - public static final String WAKE_UP_NUM = "WakeUpNum"; - public static final String MAX_MSG_SIZE = "MaxMsgSize"; + public static final String GROUP_NAME = "_INNER_TRACE_PRODUCER"; - public static final String TRACE_TOPIC = "TRACK_TRACE_TOPIC_NAME"; public static final char CONTENT_SPLITOR = (char) 1; public static final char FIELD_SPLITOR = (char) 2; - public static final String TRACE_DISPATCHER_TYPE = "DispatcherType"; + public static final String TRACE_INSTANCE_NAME = "PID_CLIENT_INNER_TRACE_PRODUCER"; } diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceContext.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceContext.java index 2370db955b..f61ba888cb 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceContext.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceContext.java @@ -21,7 +21,7 @@ import org.apache.rocketmq.common.message.MessageClientIDSetter; import java.util.List; /** - * The context of Track Trace + * The context of Trace */ public class TraceContext implements Comparable { diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java index 6015e27e68..2ed8940248 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java @@ -22,12 +22,12 @@ import java.util.ArrayList; import java.util.List; /** - * encode/decode for Track Trace Data + * encode/decode for Trace Data */ public class TraceDataEncoder { /** - * resolving traceContext list From track trace data String + * resolving traceContext list From trace data String * * @param traceData * @return @@ -101,7 +101,7 @@ public class TraceDataEncoder { } /** - * Encoding the trace context into track data strings and keyset sets + * Encoding the trace context into data strings and keyset sets * * @param ctx * @return @@ -110,7 +110,7 @@ public class TraceDataEncoder { if (ctx == null) { return null; } - //build message track trace of the transfering entity content bean + //build message trace of the transfering entity content bean TraceTransferBean transferBean = new TraceTransferBean(); StringBuilder sb = new StringBuilder(256); switch (ctx.getTraceType()) { diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java index 3efef7c462..2b0f453090 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java @@ -16,7 +16,6 @@ */ package org.apache.rocketmq.client.trace; -import java.util.Properties; import org.apache.rocketmq.client.exception.MQClientException; import java.io.IOException; @@ -28,7 +27,7 @@ public interface TraceDispatcher { /** * Initialize asynchronous transfer data module */ - void start(Properties properties) throws MQClientException; + void start(String nameSrvAddr) throws MQClientException; /** * append the transfering data @@ -45,7 +44,7 @@ public interface TraceDispatcher { void flush() throws IOException; /** - * close the track trace Hook + * close the trace Hook */ void shutdown(); } diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceProducerFactory.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceProducerFactory.java deleted file mode 100644 index 6e4ed363a8..0000000000 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceProducerFactory.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.rocketmq.client.trace; - -import org.apache.rocketmq.client.exception.MQClientException; -import org.apache.rocketmq.client.producer.DefaultMQProducer; -import org.apache.rocketmq.common.namesrv.TopAddressing; - -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.rocketmq.remoting.RPCHook; - -@Deprecated -public class TraceProducerFactory { - - private static Map dispatcherTable = new ConcurrentHashMap(); - private static AtomicBoolean isStarted = new AtomicBoolean(false); - private static DefaultMQProducer traceProducer; - - - public static DefaultMQProducer getTraceDispatcherProducer(Properties properties, RPCHook rpcHook) { - if (traceProducer == null) { - - traceProducer = new DefaultMQProducer(rpcHook); - traceProducer.setProducerGroup(TraceConstants.GROUP_NAME); - traceProducer.setSendMsgTimeout(5000); - traceProducer.setInstanceName(properties.getProperty(TraceConstants.INSTANCE_NAME, String.valueOf(System.currentTimeMillis()))); - String nameSrv = properties.getProperty(TraceConstants.NAMESRV_ADDR); - if (nameSrv == null) { - TopAddressing topAddressing = new TopAddressing(properties.getProperty(TraceConstants.ADDRSRV_URL)); - nameSrv = topAddressing.fetchNSAddr(); - } - traceProducer.setNamesrvAddr(nameSrv); - traceProducer.setVipChannelEnabled(false); - //the max size of message is 128K - int maxSize = Integer.parseInt(properties.getProperty(TraceConstants.MAX_MSG_SIZE, "128000")); - traceProducer.setMaxMessageSize(maxSize - 10 * 1000); - } - return traceProducer; - } - - public static void registerTraceDispatcher(String dispatcherId, String nameSrvAddr) throws MQClientException { - dispatcherTable.put(dispatcherId, new Object()); - if (traceProducer != null && isStarted.compareAndSet(false, true)) { - traceProducer.setNamesrvAddr(nameSrvAddr); - traceProducer.start(); - } - } - - public static void unregisterTraceDispatcher(String dispatcherId) { - dispatcherTable.remove(dispatcherId); - if (dispatcherTable.isEmpty() && traceProducer != null && isStarted.get()) { - traceProducer.shutdown(); - } - } -} diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java index d3d25c4d4a..2e054ee1eb 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java @@ -20,7 +20,7 @@ import java.util.HashSet; import java.util.Set; /** - * track trace transfering bean + * trace transfering bean */ public class TraceTransferBean { private String transData; diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/hook/SendMessageTraceHookImpl.java b/client/src/main/java/org/apache/rocketmq/client/trace/hook/SendMessageTraceHookImpl.java index bfe5d7aa35..20396c6ddc 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/hook/SendMessageTraceHookImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/hook/SendMessageTraceHookImpl.java @@ -36,12 +36,12 @@ public class SendMessageTraceHookImpl implements SendMessageHook { @Override public String hookName() { - return "SendMessageTrackHook"; + return "SendMessageTraceHook"; } @Override public void sendMessageBefore(SendMessageContext context) { - //if it is message track trace data,then it doesn't recorded + //if it is message trace data,then it doesn't recorded if (context == null || context.getMessage().getTopic().startsWith(((AsyncTraceDispatcher) localDispatcher).getTraceTopicName())) { return; } @@ -51,8 +51,7 @@ public class SendMessageTraceHookImpl implements SendMessageHook { context.setMqTraceContext(tuxeContext); tuxeContext.setTraceType(TraceType.Pub); tuxeContext.setGroupName(context.getProducerGroup()); - - //build the data bean object of message track trace + //build the data bean object of message trace TraceBean traceBean = new TraceBean(); traceBean.setTopic(context.getMessage().getTopic()); traceBean.setTags(context.getMessage().getTags()); @@ -65,7 +64,7 @@ public class SendMessageTraceHookImpl implements SendMessageHook { @Override public void sendMessageAfter(SendMessageContext context) { - //if it is message track trace data,then it doesn't recorded + //if it is message trace data,then it doesn't recorded if (context == null || context.getMessage().getTopic().startsWith(((AsyncTraceDispatcher) localDispatcher).getTraceTopicName()) || context.getMqTraceContext() == null) { return; diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java index b34784055f..b45ad02818 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQConsumerWithTraceTest.java @@ -87,7 +87,7 @@ import static org.mockito.Mockito.when; public class DefaultMQConsumerWithTraceTest { private String consumerGroup; private String consumerGroupNormal; - private String producerGroupTraceTemp = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC + System.currentTimeMillis(); + private String producerGroupTraceTemp = MixAll.RMQ_SYS_TRACE_TOPIC + System.currentTimeMillis(); private String topic = "FooBar"; private String brokerName = "BrokerA"; @@ -107,7 +107,7 @@ public class DefaultMQConsumerWithTraceTest { @Mock private MQClientAPIImpl mQClientTraceAPIImpl; private DefaultMQProducer traceProducer; - private String customerTraceTopic = "rmq_track_trace_topic_12345"; + private String customerTraceTopic = "rmq_trace_topic_12345"; @Before public void init() throws Exception { diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java index 905efb9830..6dcceeb5c0 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java @@ -83,8 +83,8 @@ public class DefaultMQProducerWithTraceTest { private String topic = "FooBar"; private String producerGroupPrefix = "FooBar_PID"; private String producerGroupTemp = producerGroupPrefix + System.currentTimeMillis(); - private String producerGroupTraceTemp = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC + System.currentTimeMillis(); - private String customerTraceTopic = "rmq_track_trace_topic_12345"; + private String producerGroupTraceTemp = MixAll.RMQ_SYS_TRACE_TOPIC + System.currentTimeMillis(); + private String customerTraceTopic = "rmq_trace_topic_12345"; @Before public void init() throws Exception { diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index 9823ca0479..eb1a684dfc 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -54,7 +54,7 @@ public class BrokerConfig { @ImportantField private boolean autoTraceBrokerEnable = false; @ImportantField - private String msgTrackTopicName = MixAll.RMQ_SYS_TRACK_TRACE_TOPIC; + private String msgTraceTopicName = MixAll.RMQ_SYS_TRACE_TOPIC; /** * thread numbers for send message thread pool, since spin lock will be used by default since 4.0.x, the default * value is 1. @@ -759,11 +759,12 @@ public class BrokerConfig { this.autoTraceBrokerEnable = autoTraceBrokerEnable; } - public String getMsgTrackTopicName() { - return msgTrackTopicName; + public String getMsgTraceTopicName() { + return msgTraceTopicName; } - public void setMsgTrackTopicName(String msgTrackTopicName) { - this.msgTrackTopicName = msgTrackTopicName; + public void setMsgTraceTopicName(String msgTraceTopicName) { + this.msgTraceTopicName = msgTraceTopicName; } + } diff --git a/common/src/main/java/org/apache/rocketmq/common/MixAll.java b/common/src/main/java/org/apache/rocketmq/common/MixAll.java index 0573c762ab..5fdb0120f4 100644 --- a/common/src/main/java/org/apache/rocketmq/common/MixAll.java +++ b/common/src/main/java/org/apache/rocketmq/common/MixAll.java @@ -91,7 +91,7 @@ public class MixAll { public static final String CONSUME_CONTEXT_TYPE = "ConsumeContextType"; public static final String RMQ_SYS_TRANS_HALF_TOPIC = "RMQ_SYS_TRANS_HALF_TOPIC"; - public static final String RMQ_SYS_TRACK_TRACE_TOPIC = "RMQ_SYS_TRACK_TRACE_TOPIC"; + public static final String RMQ_SYS_TRACE_TOPIC = "RMQ_SYS_TRACE_TOPIC"; public static final String RMQ_SYS_TRANS_OP_HALF_TOPIC = "RMQ_SYS_TRANS_OP_HALF_TOPIC"; public static final String CID_SYS_RMQ_TRANS = "CID_RMQ_SYS_TRANS"; diff --git a/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java b/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java index 8b10eef2a1..7e197522f3 100644 --- a/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java @@ -37,10 +37,10 @@ public class BrokerConfigTest { brokerConfig.setBrokerName("broker-a"); brokerConfig.setBrokerId(0); brokerConfig.setBrokerClusterName("DefaultCluster"); - brokerConfig.setMsgTrackTopicName("RMQ_SYS_TRACK_TRACE_TOPIC4"); + brokerConfig.setMsgTraceTopicName("RMQ_SYS_TRACE_TOPIC4"); assertThat(brokerConfig.getBrokerClusterName()).isEqualTo("DefaultCluster"); assertThat(brokerConfig.getNamesrvAddr()).isEqualTo("127.0.0.1:9876"); - assertThat(brokerConfig.getMsgTrackTopicName()).isEqualTo("RMQ_SYS_TRACK_TRACE_TOPIC4"); + assertThat(brokerConfig.getMsgTraceTopicName()).isEqualTo("RMQ_SYS_TRACE_TOPIC4"); assertThat(brokerConfig.getBrokerId()).isEqualTo(0); assertThat(brokerConfig.getBrokerName()).isEqualTo("broker-a"); assertThat(brokerConfig.isAutoCreateTopicEnable()).isEqualTo(false); From 1a80c5ba57b4bf5b56a63a00018fefcbf2d26536 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Sat, 29 Dec 2018 12:03:40 +0800 Subject: [PATCH 82/96] Trivial pilishment for acl and msg_trace --- .../acl/plain/PlainPermissionLoader.java | 2 +- .../plain/RemoteAddressStrategyFactory.java | 2 +- .../broker/processor/AdminBrokerProcessor.java | 8 -------- .../broker/topic/TopicConfigManager.java | 18 ++++++------------ .../client/consumer/DefaultMQPushConsumer.java | 4 ---- .../client/producer/DefaultMQProducer.java | 3 --- .../apache/rocketmq/common/BrokerConfig.java | 10 ---------- .../org/apache/rocketmq/common/MixAll.java | 3 +-- .../rocketmq/common/constant/LoggerName.java | 1 - .../rocketmq/common/BrokerConfigTest.java | 3 --- .../conf/2m-noslave/broker-a.properties | 1 - .../conf/2m-noslave/broker-b.properties | 1 - .../conf/2m-noslave/broker-trace.properties | 1 - distribution/conf/broker.conf | 2 -- .../apache/rocketmq/srvutil/ServerUtil.java | 4 ++-- .../apache/rocketmq/test/base/BaseConf.java | 1 - .../rocketmq/tools/command/MQAdminStartup.java | 4 ++-- 17 files changed, 13 insertions(+), 55 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 9c36ecf71f..7f0e67a56c 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -43,7 +43,7 @@ import org.apache.rocketmq.logging.InternalLoggerFactory; public class PlainPermissionLoader { - private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); private static final String DEFAULT_PLAIN_ACL_FILE = "/conf/plain_acl.yml"; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java index 10b4734588..4f1dc055d0 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java @@ -27,7 +27,7 @@ import org.apache.rocketmq.logging.InternalLoggerFactory; public class RemoteAddressStrategyFactory { - private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ACL_PLUG_LOGGER_NAME); + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); public static final NullRemoteAddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullRemoteAddressStrategy(); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java index 9771ec9a9e..73fe439427 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java @@ -228,14 +228,6 @@ public class AdminBrokerProcessor implements NettyRequestProcessor { return response; } - if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { - String errorMsg = "the topic[" + requestHeader.getTopic() + "] is user self defined topic and this node is trace broker!"; - log.warn(errorMsg); - response.setCode(ResponseCode.SYSTEM_ERROR); - response.setRemark(errorMsg); - return response; - } - try { response.setCode(ResponseCode.SUCCESS); response.setOpaque(request.getOpaque()); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java index f1ae2612aa..6a97c1c7fd 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java @@ -125,14 +125,12 @@ public class TopicConfigManager extends ConfigManager { this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); } { - if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { - String topic = this.brokerController.getBrokerConfig().getMsgTraceTopicName(); - TopicConfig topicConfig = new TopicConfig(topic); - this.systemTopicList.add(topic); - topicConfig.setReadQueueNums(1); - topicConfig.setWriteQueueNums(1); - this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); - } + String topic = this.brokerController.getBrokerConfig().getMsgTraceTopicName(); + TopicConfig topicConfig = new TopicConfig(topic); + this.systemTopicList.add(topic); + topicConfig.setReadQueueNums(1); + topicConfig.setWriteQueueNums(1); + this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); } } @@ -164,10 +162,6 @@ public class TopicConfigManager extends ConfigManager { if (topicConfig != null) return topicConfig; - if (this.brokerController.getBrokerConfig().isAutoTraceBrokerEnable()) { - return topicConfig; - } - TopicConfig defaultTopicConfig = this.topicConfigTable.get(defaultTopic); if (defaultTopicConfig != null) { if (defaultTopic.equals(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC)) { diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index edb8cb5abf..d13a16a26f 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -758,8 +758,4 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume public TraceDispatcher getTraceDispatcher() { return traceDispatcher; } - - public void setTraceDispatcher(TraceDispatcher traceDispatcher) { - this.traceDispatcher = traceDispatcher; - } } diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index 23cb53ca1f..adfac3cd23 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -850,7 +850,4 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { return traceDispatcher; } - public void setTraceDispatcher(TraceDispatcher traceDispatcher) { - this.traceDispatcher = traceDispatcher; - } } diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index eb1a684dfc..f9d403ec5b 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -52,8 +52,6 @@ public class BrokerConfig { private boolean autoCreateSubscriptionGroup = true; private String messageStorePlugIn = ""; @ImportantField - private boolean autoTraceBrokerEnable = false; - @ImportantField private String msgTraceTopicName = MixAll.RMQ_SYS_TRACE_TOPIC; /** * thread numbers for send message thread pool, since spin lock will be used by default since 4.0.x, the default @@ -751,14 +749,6 @@ public class BrokerConfig { this.waitTimeMillsInTransactionQueue = waitTimeMillsInTransactionQueue; } - public boolean isAutoTraceBrokerEnable() { - return autoTraceBrokerEnable; - } - - public void setAutoTraceBrokerEnable(boolean autoTraceBrokerEnable) { - this.autoTraceBrokerEnable = autoTraceBrokerEnable; - } - public String getMsgTraceTopicName() { return msgTraceTopicName; } diff --git a/common/src/main/java/org/apache/rocketmq/common/MixAll.java b/common/src/main/java/org/apache/rocketmq/common/MixAll.java index 5fdb0120f4..d39e63386f 100644 --- a/common/src/main/java/org/apache/rocketmq/common/MixAll.java +++ b/common/src/main/java/org/apache/rocketmq/common/MixAll.java @@ -82,8 +82,7 @@ public class MixAll { public static final long CURRENT_JVM_PID = getPID(); public static final String RETRY_GROUP_TOPIC_PREFIX = "%RETRY%"; - public static final String TRACE_BROKER_NAME_SUFFIX = "trace"; - + public static final String DLQ_GROUP_TOPIC_PREFIX = "%DLQ%"; public static final String SYSTEM_TOPIC_PREFIX = "rmq_sys_"; public static final String UNIQUE_MSG_QUERY_FLAG = "_UNIQUE_KEY_QUERY"; diff --git a/common/src/main/java/org/apache/rocketmq/common/constant/LoggerName.java b/common/src/main/java/org/apache/rocketmq/common/constant/LoggerName.java index a463a4ed7c..fe0ae9f171 100644 --- a/common/src/main/java/org/apache/rocketmq/common/constant/LoggerName.java +++ b/common/src/main/java/org/apache/rocketmq/common/constant/LoggerName.java @@ -37,5 +37,4 @@ public class LoggerName { public static final String PROTECTION_LOGGER_NAME = "RocketmqProtection"; public static final String WATER_MARK_LOGGER_NAME = "RocketmqWaterMark"; public static final String FILTER_LOGGER_NAME = "RocketmqFilter"; - public static final String ACL_PLUG_LOGGER_NAME = "RocketmqAclPlug"; } diff --git a/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java b/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java index 7e197522f3..aa8bcfa725 100644 --- a/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/BrokerConfigTest.java @@ -33,7 +33,6 @@ public class BrokerConfigTest { BrokerConfig brokerConfig = new BrokerConfig(); brokerConfig.setNamesrvAddr("127.0.0.1:9876"); brokerConfig.setAutoCreateTopicEnable(false); - brokerConfig.setAutoTraceBrokerEnable(true); brokerConfig.setBrokerName("broker-a"); brokerConfig.setBrokerId(0); brokerConfig.setBrokerClusterName("DefaultCluster"); @@ -44,7 +43,5 @@ public class BrokerConfigTest { assertThat(brokerConfig.getBrokerId()).isEqualTo(0); assertThat(brokerConfig.getBrokerName()).isEqualTo("broker-a"); assertThat(brokerConfig.isAutoCreateTopicEnable()).isEqualTo(false); - assertThat(brokerConfig.isAutoTraceBrokerEnable()).isEqualTo(true); - } } \ No newline at end of file diff --git a/distribution/conf/2m-noslave/broker-a.properties b/distribution/conf/2m-noslave/broker-a.properties index cd051cdc13..b704b54c54 100644 --- a/distribution/conf/2m-noslave/broker-a.properties +++ b/distribution/conf/2m-noslave/broker-a.properties @@ -19,4 +19,3 @@ deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH -autoTraceBrokerEnable=false \ No newline at end of file diff --git a/distribution/conf/2m-noslave/broker-b.properties b/distribution/conf/2m-noslave/broker-b.properties index da00cd4190..130671a7c3 100644 --- a/distribution/conf/2m-noslave/broker-b.properties +++ b/distribution/conf/2m-noslave/broker-b.properties @@ -19,4 +19,3 @@ deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH -autoTraceBrokerEnable=false \ No newline at end of file diff --git a/distribution/conf/2m-noslave/broker-trace.properties b/distribution/conf/2m-noslave/broker-trace.properties index a4898aae0c..9dd57a73de 100644 --- a/distribution/conf/2m-noslave/broker-trace.properties +++ b/distribution/conf/2m-noslave/broker-trace.properties @@ -21,4 +21,3 @@ deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH -autoTraceBrokerEnable=true \ No newline at end of file diff --git a/distribution/conf/broker.conf b/distribution/conf/broker.conf index 970395735d..0c0b28b7b8 100644 --- a/distribution/conf/broker.conf +++ b/distribution/conf/broker.conf @@ -20,5 +20,3 @@ deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH -enableAcl=true -namesrvAddr=127.0.0.1:9876 diff --git a/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java b/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java index ea8047a2ff..066d36cedd 100644 --- a/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java +++ b/srvutil/src/main/java/org/apache/rocketmq/srvutil/ServerUtil.java @@ -35,8 +35,8 @@ public class ServerUtil { new Option("n", "namesrvAddr", true, "Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876"); opt.setRequired(false); - options.addOption(opt); - + options.addOption(opt); + return options; } diff --git a/test/src/test/java/org/apache/rocketmq/test/base/BaseConf.java b/test/src/test/java/org/apache/rocketmq/test/base/BaseConf.java index a05a55a06b..780bd47506 100644 --- a/test/src/test/java/org/apache/rocketmq/test/base/BaseConf.java +++ b/test/src/test/java/org/apache/rocketmq/test/base/BaseConf.java @@ -24,7 +24,6 @@ import org.apache.log4j.Logger; import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.common.MQVersion; import org.apache.rocketmq.namesrv.NamesrvController; -import org.apache.rocketmq.remoting.netty.TlsSystemConfig; import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.test.client.rmq.RMQAsyncSendProducer; import org.apache.rocketmq.test.client.rmq.RMQNormalConsumer; diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java index 065e4175df..989f8d7716 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java @@ -132,7 +132,7 @@ public class MQAdminStartup { System.setProperty(MixAll.NAMESRV_ADDR_PROPERTY, namesrvAddr); } - cmd.execute(commandLine, options, getAclRPCHook(commandLine)); + cmd.execute(commandLine, options, getAclRPCHook()); } else { System.out.printf("The sub command %s not exist.%n", args[0]); } @@ -246,7 +246,7 @@ public class MQAdminStartup { subCommandList.add(command); } - public static RPCHook getAclRPCHook(CommandLine commandLine) { + public static RPCHook getAclRPCHook() { String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); String fileName = "/conf/tools.yml"; JSONObject yamlDataObject = AclUtils.getYamlDataObject(fileHome + fileName , From be83a9a3ba72892d473ac636f640412c8f33a0c3 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Sat, 29 Dec 2018 12:59:43 +0800 Subject: [PATCH 83/96] Polish acl names --- .../rocketmq/acl/common/SigningAlgorithm.java | 2 +- .../acl/plain/PlainPermissionLoader.java | 17 +++--- .../acl/plain/PlainPermissionLoaderTest.java | 56 +++++++++++-------- acl/src/test/resources/conf/plain_acl.yml | 2 +- distribution/conf/plain_acl.yml | 2 +- distribution/conf/tools.yml | 2 +- 6 files changed, 46 insertions(+), 35 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java b/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java index 6937cdf490..bfed7b2f23 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/SigningAlgorithm.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.rocketmq.acl.common;//package com.aliyun.openservices.ons.api.impl.rocketmq.spas; +package org.apache.rocketmq.acl.common; public enum SigningAlgorithm { HmacSHA1, diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 7f0e67a56c..217fb35eee 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -18,6 +18,7 @@ package org.apache.rocketmq.acl.plain; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; @@ -66,21 +67,21 @@ public class PlainPermissionLoader { } public void initialize() { - JSONObject accessControlTransport = AclUtils.getYamlDataObject(fileHome + fileName, + JSONObject plainAclConfData = AclUtils.getYamlDataObject(fileHome + File.separator + fileName, JSONObject.class); - if (accessControlTransport == null || accessControlTransport.isEmpty()) { - throw new AclException(String.format("%s file is not data", fileHome + fileName)); + if (plainAclConfData == null || plainAclConfData.isEmpty()) { + throw new AclException(String.format("%s file is not data", fileHome + File.separator + fileName)); } - log.info("BorkerAccessControlTransport data is : ", accessControlTransport.toString()); - JSONArray globalWhiteRemoteAddressesList = accessControlTransport.getJSONArray("globalWhiteRemoteAddresses"); + log.info("Broker plain acl conf data is : ", plainAclConfData.toString()); + JSONArray globalWhiteRemoteAddressesList = plainAclConfData.getJSONArray("globalWhiteRemoteAddresses"); if (globalWhiteRemoteAddressesList != null && !globalWhiteRemoteAddressesList.isEmpty()) { for (int i = 0; i < globalWhiteRemoteAddressesList.size(); i++) { addGlobalWhiteRemoteAddress(globalWhiteRemoteAddressesList.getString(i)); } } - JSONArray accounts = accessControlTransport.getJSONArray("accounts"); + JSONArray accounts = plainAclConfData.getJSONArray("accounts"); if (accounts != null && !accounts.isEmpty()) { List plainAccessList = accounts.toJavaList(PlainAccessConfig.class); for (PlainAccessConfig plainAccess : plainAccessList) { @@ -101,10 +102,10 @@ public class PlainPermissionLoader { int fileIndex = fileName.lastIndexOf("/") + 1; String watchDirectory = fileName.substring(0, fileIndex); final String watchFileName = fileName.substring(fileIndex); - log.info("watch directory is {} , watch directory file name is {} ", fileHome + watchDirectory, watchFileName); + log.info("watch directory is {} , watch directory file name is {} ", fileHome + File.separator + watchDirectory, watchFileName); final WatchService watcher = FileSystems.getDefault().newWatchService(); - Path p = Paths.get(fileHome + watchDirectory); + Path p = Paths.get(fileHome + File.separator + watchDirectory); p.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE); ServiceThread watcherServcie = new ServiceThread() { diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java index 68f6e11986..b34a5b7964 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -28,6 +28,7 @@ import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.rocketmq.acl.common.AclException; import org.apache.rocketmq.acl.common.Permission; import org.apache.rocketmq.acl.plain.PlainPermissionLoader.PlainAccessConfig; +import org.apache.rocketmq.common.UtilAll; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -61,9 +62,8 @@ public class PlainPermissionLoaderTest { ANYPlainAccessResource = clonePlainAccessResource(Permission.ANY); DENYPlainAccessResource = clonePlainAccessResource(Permission.DENY); - System.setProperty("java.version", "1.6.11"); System.setProperty("rocketmq.home.dir", "src/test/resources"); - System.setProperty("romcketmq.acl.plain.fileName", "/conf/plain_acl.yml"); + System.setProperty("rocketmq.acl.plain.file", "/conf/plain_acl.yml"); plainPermissionLoader = new PlainPermissionLoader(); } @@ -211,46 +211,56 @@ public class PlainPermissionLoaderTest { Assert.assertFalse(plainPermissionLoader.isWatchStart()); } - @SuppressWarnings("unchecked") @Test - public void watchTest() throws IOException, IllegalAccessException { + public void testWatch() throws IOException, IllegalAccessException { System.setProperty("java.version", "1.7.11"); - System.setProperty("rocketmq.home.dir", "src/test/resources/watch"); - File file = new File("src/test/resources/watch/conf"); - file.mkdirs(); - File transport = new File("src/test/resources/watch/conf/plain_acl.yml"); + System.setProperty("rocketmq.home.dir", "src/test/resources/conf"); + System.setProperty("rocketmq.acl.plain.file", "watch/plain_acl_watch.yml"); + String fileName = "src/test/resources/conf/watch/plain_acl_watch.yml"; + File transport = new File(fileName); transport.delete(); transport.createNewFile(); FileWriter writer = new FileWriter(transport); writer.write("accounts:\r\n"); - writer.write("- accessKey: rokcetmq\r\n"); - writer.write(" secretKey: aliyun11\r\n"); + writer.write("- accessKey: rocketmq\r\n"); + writer.write(" secretKey: 12345678\r\n"); writer.write(" whiteRemoteAddress: 127.0.0.1\r\n"); writer.write(" admin: true\r\n"); writer.flush(); writer.close(); + + System.out.println(System.getProperty("rocketmq.acl.plain.file")); PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); + Assert.assertTrue(plainPermissionLoader.isWatchStart()); - Map> plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); - Assert.assertNotNull(plainAccessResourceMap.get("rokcetmq")); + { + Map plainAccessResourceMap = (Map) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); + PlainAccessResource accessResource = plainAccessResourceMap.get("rocketmq"); + Assert.assertNotNull(accessResource); + Assert.assertEquals(accessResource.getSecretKey(), "12345678"); + Assert.assertTrue(accessResource.isAdmin()); - writer = new FileWriter(new File("src/test/resources/watch/conf/plain_acl.yml"), true); - writer.write("- accessKey: rokcet1\r\n"); - writer.write(" secretKey: aliyun1\r\n"); + } + + writer = new FileWriter(new File(fileName), true); + writer.write("- accessKey: rocketmq1\r\n"); + writer.write(" secretKey: 88888888\r\n"); writer.write(" whiteRemoteAddress: 127.0.0.1\r\n"); - writer.write(" admin: true\r\n"); + writer.write(" admin: false\r\n"); writer.flush(); writer.close(); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - plainAccessResourceMap = (Map>) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); - Assert.assertNotNull(plainAccessResourceMap.get("rokcet1")); + UtilAll.sleep(1000); + { + Map plainAccessResourceMap = (Map) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); + PlainAccessResource accessResource = plainAccessResourceMap.get("rocketmq1"); + Assert.assertNotNull(accessResource); + Assert.assertEquals(accessResource.getSecretKey(), "88888888"); + Assert.assertFalse(accessResource.isAdmin()); + } + transport.delete(); } @Test(expected = AclException.class) diff --git a/acl/src/test/resources/conf/plain_acl.yml b/acl/src/test/resources/conf/plain_acl.yml index 5daefb67c3..2c24795ff6 100644 --- a/acl/src/test/resources/conf/plain_acl.yml +++ b/acl/src/test/resources/conf/plain_acl.yml @@ -36,7 +36,7 @@ accounts: - groupB=SUB - groupC=SUB -- accessKey: aliyun.com +- accessKey: rocketmq2 secretKey: 12345678 whiteRemoteAddress: 192.168.1.* # if it is admin, it could access all resources diff --git a/distribution/conf/plain_acl.yml b/distribution/conf/plain_acl.yml index 9043b0dd80..413a7120f2 100644 --- a/distribution/conf/plain_acl.yml +++ b/distribution/conf/plain_acl.yml @@ -32,7 +32,7 @@ accounts: - groupB=PUB|SUB - groupC=SUB -- accessKey: aliyun.com +- accessKey: rocketmq2 secretKey: 12345678 whiteRemoteAddress: 192.168.1.* # if it is admin, it could access all resources diff --git a/distribution/conf/tools.yml b/distribution/conf/tools.yml index b909696708..a4a9ad1b5a 100644 --- a/distribution/conf/tools.yml +++ b/distribution/conf/tools.yml @@ -14,6 +14,6 @@ # limitations under the License. -accessKey: aliyun.com +accessKey: rocketmq secretKey: 12345678 From 10d84bbee60ea9a780b44cfa7b69bb75ff372c2c Mon Sep 17 00:00:00 2001 From: dongeforever Date: Sat, 29 Dec 2018 14:04:37 +0800 Subject: [PATCH 84/96] Polish the watch test --- acl/pom.xml | 17 ++++++++++ .../acl/plain/PlainPermissionLoader.java | 6 ++-- .../plain/RemoteAddressStrategyFactory.java | 2 +- .../acl/plain/PlainPermissionLoaderTest.java | 9 +++-- .../resources/conf/watch/plain_acl_watch.yml | 9 +++++ acl/src/test/resources/logback-test.xml | 34 +++++++++++++++++++ 6 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 acl/src/test/resources/conf/watch/plain_acl_watch.yml create mode 100644 acl/src/test/resources/logback-test.xml diff --git a/acl/pom.xml b/acl/pom.xml index 03ce95cd07..aab09001ac 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -49,5 +49,22 @@ org.apache.commons commons-lang3 + + + org.slf4j + slf4j-api + test + + + ch.qos.logback + logback-classic + test + + + ch.qos.logback + logback-core + test + + diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 217fb35eee..14b25253e0 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -44,7 +44,7 @@ import org.apache.rocketmq.logging.InternalLoggerFactory; public class PlainPermissionLoader { - private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME); private static final String DEFAULT_PLAIN_ACL_FILE = "/conf/plain_acl.yml"; @@ -102,7 +102,7 @@ public class PlainPermissionLoader { int fileIndex = fileName.lastIndexOf("/") + 1; String watchDirectory = fileName.substring(0, fileIndex); final String watchFileName = fileName.substring(fileIndex); - log.info("watch directory is {} , watch directory file name is {} ", fileHome + File.separator + watchDirectory, watchFileName); + log.info("watch directory is {} , watch file name is {} ", fileHome + File.separator + watchDirectory, watchFileName); final WatchService watcher = FileSystems.getDefault().newWatchService(); Path p = Paths.get(fileHome + File.separator + watchDirectory); @@ -119,6 +119,8 @@ public class PlainPermissionLoader { && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { log.info("{} make a difference change is : {}", watchFileName, event.toString()); + //TODO do a retain + //Clearing the info, may result in a non-available time PlainPermissionLoader.this.clearPermissionInfo(); initialize(); } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java index 4f1dc055d0..c9166f8da9 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java @@ -27,7 +27,7 @@ import org.apache.rocketmq.logging.InternalLoggerFactory; public class RemoteAddressStrategyFactory { - private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME); + private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME); public static final NullRemoteAddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullRemoteAddressStrategy(); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java index b34a5b7964..77d418e9bc 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -223,20 +223,19 @@ public class PlainPermissionLoaderTest { FileWriter writer = new FileWriter(transport); writer.write("accounts:\r\n"); - writer.write("- accessKey: rocketmq\r\n"); + writer.write("- accessKey: watchrocketmq\r\n"); writer.write(" secretKey: 12345678\r\n"); writer.write(" whiteRemoteAddress: 127.0.0.1\r\n"); writer.write(" admin: true\r\n"); writer.flush(); writer.close(); - System.out.println(System.getProperty("rocketmq.acl.plain.file")); PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); Assert.assertTrue(plainPermissionLoader.isWatchStart()); { Map plainAccessResourceMap = (Map) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); - PlainAccessResource accessResource = plainAccessResourceMap.get("rocketmq"); + PlainAccessResource accessResource = plainAccessResourceMap.get("watchrocketmq"); Assert.assertNotNull(accessResource); Assert.assertEquals(accessResource.getSecretKey(), "12345678"); Assert.assertTrue(accessResource.isAdmin()); @@ -244,7 +243,7 @@ public class PlainPermissionLoaderTest { } writer = new FileWriter(new File(fileName), true); - writer.write("- accessKey: rocketmq1\r\n"); + writer.write("- accessKey: watchrocketmq1\r\n"); writer.write(" secretKey: 88888888\r\n"); writer.write(" whiteRemoteAddress: 127.0.0.1\r\n"); writer.write(" admin: false\r\n"); @@ -254,7 +253,7 @@ public class PlainPermissionLoaderTest { UtilAll.sleep(1000); { Map plainAccessResourceMap = (Map) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); - PlainAccessResource accessResource = plainAccessResourceMap.get("rocketmq1"); + PlainAccessResource accessResource = plainAccessResourceMap.get("watchrocketmq1"); Assert.assertNotNull(accessResource); Assert.assertEquals(accessResource.getSecretKey(), "88888888"); Assert.assertFalse(accessResource.isAdmin()); diff --git a/acl/src/test/resources/conf/watch/plain_acl_watch.yml b/acl/src/test/resources/conf/watch/plain_acl_watch.yml new file mode 100644 index 0000000000..d705092a1e --- /dev/null +++ b/acl/src/test/resources/conf/watch/plain_acl_watch.yml @@ -0,0 +1,9 @@ +accounts: +- accessKey: watchrocketmq + secretKey: 12345678 + whiteRemoteAddress: 127.0.0.1 + admin: true +- accessKey: watchrocketmq1 + secretKey: 88888888 + whiteRemoteAddress: 127.0.0.1 + admin: false diff --git a/acl/src/test/resources/logback-test.xml b/acl/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..e556c649e5 --- /dev/null +++ b/acl/src/test/resources/logback-test.xml @@ -0,0 +1,34 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n + UTF-8 + + + + + + + + + + + From 945257522f9cb875baba07b5504c6d86dd0a0bdb Mon Sep 17 00:00:00 2001 From: dongeforever Date: Sat, 29 Dec 2018 14:10:28 +0800 Subject: [PATCH 85/96] Refine the interface for msg_trace --- .../consumer/DefaultMQPushConsumer.java | 29 +++++++++++++------ .../client/producer/DefaultMQProducer.java | 29 +++++++++++++------ .../example/tracemessage/TraceProducer.java | 2 +- .../tracemessage/TracePushConsumer.java | 2 +- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index d13a16a26f..3ebcb76a86 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -285,17 +285,17 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * @param consumerGroup Consume queue. * @param rpcHook RPC hook to execute before each remoting command. * @param allocateMessageQueueStrategy message queue allocating algorithm. - * @param msgTraceSwitch switch flag instance for message trace. - * @param traceTopicName the name value of message trace topic.If you don't config,you can use the default trace topic name. + * @param enableMsgTrace switch flag instance for message trace. + * @param customizedTraceTopic the name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, - AllocateMessageQueueStrategy allocateMessageQueueStrategy, boolean msgTraceSwitch, final String traceTopicName) { + AllocateMessageQueueStrategy allocateMessageQueueStrategy, boolean enableMsgTrace, final String customizedTraceTopic) { this.consumerGroup = consumerGroup; this.allocateMessageQueueStrategy = allocateMessageQueueStrategy; defaultMQPushConsumerImpl = new DefaultMQPushConsumerImpl(this, rpcHook); - if (msgTraceSwitch) { + if (enableMsgTrace) { try { - AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(traceTopicName, rpcHook); + AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(customizedTraceTopic, rpcHook); dispatcher.setHostConsumer(this.getDefaultMQPushConsumerImpl()); traceDispatcher = dispatcher; this.getDefaultMQPushConsumerImpl().registerConsumeMessageHook( @@ -315,15 +315,26 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume this(MixAll.DEFAULT_CONSUMER_GROUP, rpcHook, new AllocateMessageQueueAveragely()); } + /** * Constructor specifying consumer group. * * @param consumerGroup Consumer group. - * @param msgTraceSwitch switch flag instance for message trace. - * @param traceTopicName the name value of message trace topic.If you don't config,you can use the default trace topic name. + * @param enableMsgTrace switch flag instance for message trace. */ - public DefaultMQPushConsumer(final String consumerGroup, boolean msgTraceSwitch, final String traceTopicName) { - this(consumerGroup, null, new AllocateMessageQueueAveragely(), msgTraceSwitch, traceTopicName); + public DefaultMQPushConsumer(final String consumerGroup, boolean enableMsgTrace) { + this(consumerGroup, null, new AllocateMessageQueueAveragely(), enableMsgTrace, null); + } + + /** + * Constructor specifying consumer group. + * + * @param consumerGroup Consumer group. + * @param enableMsgTrace switch flag instance for message trace. + * @param customizedTraceTopic the name value of message trace topic.If you don't config,you can use the default trace topic name. + */ + public DefaultMQPushConsumer(final String consumerGroup, boolean enableMsgTrace, final String customizedTraceTopic) { + this(consumerGroup, null, new AllocateMessageQueueAveragely(), enableMsgTrace, customizedTraceTopic); } /** diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index adfac3cd23..8b4027c400 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -154,16 +154,16 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * * @param producerGroup Producer group, see the name-sake field. * @param rpcHook RPC hook to execute per each remoting command execution. - * @param msgTraceSwitch switch flag instance for message trace. - * @param traceTopicName the name value of message trace topic.If you don't config,you can use the default trace topic name. + * @param enableMsgTrace switch flag instance for message trace. + * @param customizedTraceTopic the name value of message trace topic.If you don't config,you can use the default trace topic name. */ - public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean msgTraceSwitch,final String traceTopicName) { + public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean enableMsgTrace,final String customizedTraceTopic) { this.producerGroup = producerGroup; defaultMQProducerImpl = new DefaultMQProducerImpl(this, rpcHook); //if client open the message trace feature - if (msgTraceSwitch) { + if (enableMsgTrace) { try { - AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(traceTopicName, rpcHook); + AsyncTraceDispatcher dispatcher = new AsyncTraceDispatcher(customizedTraceTopic, rpcHook); dispatcher.setHostProducer(this.getDefaultMQProducerImpl()); traceDispatcher = dispatcher; this.getDefaultMQProducerImpl().registerSendMessageHook( @@ -187,11 +187,22 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { * Constructor specifying producer group. * * @param producerGroup Producer group, see the name-sake field. - * @param msgTraceSwitch switch flag instance for message trace. - * @param traceTopicName the name value of message trace topic.If you don't config,you can use the default trace topic name. + * @param enableMsgTrace switch flag instance for message trace. */ - public DefaultMQProducer(final String producerGroup, boolean msgTraceSwitch, final String traceTopicName) { - this(producerGroup, null, msgTraceSwitch, traceTopicName); + public DefaultMQProducer(final String producerGroup, boolean enableMsgTrace) { + this(producerGroup, null, enableMsgTrace, null); + } + + + /** + * Constructor specifying producer group. + * + * @param producerGroup Producer group, see the name-sake field. + * @param enableMsgTrace switch flag instance for message trace. + * @param customizedTraceTopic the name value of message trace topic.If you don't config,you can use the default trace topic name. + */ + public DefaultMQProducer(final String producerGroup, boolean enableMsgTrace, final String customizedTraceTopic) { + this(producerGroup, null, enableMsgTrace, customizedTraceTopic); } /** diff --git a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java index 5a513e4144..fb8e37fd2b 100644 --- a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TraceProducer.java @@ -26,7 +26,7 @@ import org.apache.rocketmq.remoting.common.RemotingHelper; public class TraceProducer { public static void main(String[] args) throws MQClientException, InterruptedException { - DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",true, ""); + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",true); producer.start(); for (int i = 0; i < 128; i++) diff --git a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java index e0e05a8cf8..a89661d547 100644 --- a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java @@ -29,7 +29,7 @@ import org.apache.rocketmq.common.message.MessageExt; public class TracePushConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { //here,we use the default message track trace topic name - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1",true, ""); + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1",true); consumer.subscribe("TopicTest", "*"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); //wrong time format 2017_0422_221800 From 5cf0d0a8f3e2d68e303b860a5e31b4798ef1a6ee Mon Sep 17 00:00:00 2001 From: chenhoudao Date: Sat, 29 Dec 2018 19:10:41 +0800 Subject: [PATCH 86/96] add architecture.md --- docs/cn/architecture.md | 46 ++++++++++++++++++++++ docs/cn/image/rocketmq_architecture_1.png | Bin 0 -> 46292 bytes docs/cn/image/rocketmq_architecture_2.png | Bin 0 -> 18500 bytes docs/cn/image/rocketmq_architecture_3.png | Bin 0 -> 61421 bytes 4 files changed, 46 insertions(+) create mode 100644 docs/cn/architecture.md create mode 100644 docs/cn/image/rocketmq_architecture_1.png create mode 100644 docs/cn/image/rocketmq_architecture_2.png create mode 100644 docs/cn/image/rocketmq_architecture_3.png diff --git a/docs/cn/architecture.md b/docs/cn/architecture.md new file mode 100644 index 0000000000..a26bcbdd08 --- /dev/null +++ b/docs/cn/architecture.md @@ -0,0 +1,46 @@ +# 架构设计 + +## 技术架构 +![](image/rocketmq_architecture_1.png) + +RocketMQ架构上主要分为四部分,如上图所示: + + +- Producer:消息发布的角色,支持分布式集群方式部署。producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递。投递的过程支持快速失败并且低延迟 + +- Consumer:消息消费者的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播形式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求 + +- NameServer:NameServer是一个非常简单的Topic路由注册中心,其角色类似dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活。路由信息管理。每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Produce,Consumer仍然可以动态感知Broker的路由的信息。 + +- BrokerServer:Broker主要负责消息的存储、投递和查询以及服务高可用保证,为了实现这些功能broker包含了以下几个重要子模块。 +1. Remoting Module:整个broker的实体,负责处理来自clients端的请求。 +2. Client Manager:负责管理客户端(Producer/Consumer)和维护Consumer的topic订阅信息 +3. Store Service:提供方便简单的API接口处理消息存储到物理硬盘和查询功能。 +4. HA Service:高可用服务,提供master broker 和 slave broker之间的数据同步功能。 +5. Index Service:根据特定的Message key对投递到broker的消息进行索引服务,以提供消息的快速查询。 + +![](image/rocketmq_architecture_2.png) + +## 部署架构 + + +![](image/rocketmq_architecture_3.png) + + +### RocketMQ 网络部署特点 + +- NameServer 是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。 + +- Broker 部署相对复杂,Broker 分为Master 与Slave,一个Master 可以对应多个Slave,但是一个Slave 只能对应一个Master,Master 与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId 为0 表示Master,非0 表示Slave。Master 也可以部署多个。每个Broker 与Name Server 集群中的所有节点建立长连接,定时注册Topic 信息到所有Name Server。 注意:当前RocketMQ版本在部署架构上支持一master多slave,但只有brokerId=1的从服务器才会参与消息的读负载。 + +- Producer与NameServer 集群中的其中一个节点(随机选择)建立长连接,定期从NameServer 获取Topic 路由信息,并向提供Topic 服务的Master 建立长连接,且定时向Master 发送心跳。Producer 完全无状态,可集群部署。 + +- Consumer与NameServer 集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,消费者在向master拉取消息时Master服务器会根据拉取偏移量与最大偏移量的距离(判断是否读老消息,产生读IO),以及从服务器是否可读等因素建议下一次是从Master还是Slave拉取。 + +结合部署结构图,描述集群工作流程: + +1. 启动Namesrv,Namesrv起来后监听端口,等待Broker、Produer、Consumer连上来,相当于一个路由控制中心。 +2. Broker启动,跟所有的Namesrv保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有topic信息。注册成功后,namesrv集群中就有Topic跟Broker的映射关系 +3. 收发消息前,先创建topic,创建topic时需要指定该topic要存储在哪些Broker上。也可以在发送消息时自动创建Topic +4. Producer发送消息,启动时先跟Namesrv集群中的其中一台建立长连接,并从Namesrv中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息 +5. Consumer跟Producer类似。跟其中一台Namesrv建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息 diff --git a/docs/cn/image/rocketmq_architecture_1.png b/docs/cn/image/rocketmq_architecture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..548c8752a8409bcf7b0f591f293a3bb5bf9435ad GIT binary patch literal 46292 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 LaE@e_|CT=i{2+O% literal 0 HcmV?d00001 diff --git a/docs/cn/image/rocketmq_architecture_2.png b/docs/cn/image/rocketmq_architecture_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ab8d34c6cf0b13e44c1d7cea720e69d8191935 GIT binary patch literal 18500 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 literal 0 HcmV?d00001 diff --git a/docs/cn/image/rocketmq_architecture_3.png b/docs/cn/image/rocketmq_architecture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..aa74ed7ac15120112d45b2a2b3213ca452ff79d7 GIT binary patch literal 61421 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 f{~!HLw_=OvXq Date: Tue, 1 Jan 2019 00:06:37 +0800 Subject: [PATCH 87/96] [ISSUE#525]add a switch variable(traceTopicEnable) for making msg trace worked which is decided by users and rename enableAcl flag variable to keep naming specification,such as clusterTopicEnable. --- .../acl/plain/PlainPermissionLoader.java | 1 - .../rocketmq/broker/BrokerController.java | 2 +- .../broker/topic/TopicConfigManager.java | 14 ++++++---- .../apache/rocketmq/common/BrokerConfig.java | 28 ++++++++++++------- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 14b25253e0..1b8269332f 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -119,7 +119,6 @@ public class PlainPermissionLoader { && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { log.info("{} make a difference change is : {}", watchFileName, event.toString()); - //TODO do a retain //Clearing the info, may result in a non-available time PlainPermissionLoader.this.clearPermissionInfo(); initialize(); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index 73ed7eb4ca..c3431ca41e 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -492,7 +492,7 @@ public class BrokerController { } private void initialAcl() { - if (!this.brokerConfig.isEnableAcl()) { + if (!this.brokerConfig.isAclEnable()) { log.info("The broker dose not enable acl"); return; } diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java index 6a97c1c7fd..ed353da4bb 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java @@ -125,12 +125,14 @@ public class TopicConfigManager extends ConfigManager { this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); } { - String topic = this.brokerController.getBrokerConfig().getMsgTraceTopicName(); - TopicConfig topicConfig = new TopicConfig(topic); - this.systemTopicList.add(topic); - topicConfig.setReadQueueNums(1); - topicConfig.setWriteQueueNums(1); - this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); + if (this.brokerController.getBrokerConfig().isTraceTopicEnable()) { + String topic = this.brokerController.getBrokerConfig().getMsgTraceTopicName(); + TopicConfig topicConfig = new TopicConfig(topic); + this.systemTopicList.add(topic); + topicConfig.setReadQueueNums(1); + topicConfig.setWriteQueueNums(1); + this.topicConfigTable.put(topicConfig.getTopicName(), topicConfig); + } } } diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index f9d403ec5b..1c3f37d00d 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -53,6 +53,8 @@ public class BrokerConfig { private String messageStorePlugIn = ""; @ImportantField private String msgTraceTopicName = MixAll.RMQ_SYS_TRACE_TOPIC; + @ImportantField + private boolean traceTopicEnable = false; /** * thread numbers for send message thread pool, since spin lock will be used by default since 4.0.x, the default * value is 1. @@ -176,8 +178,7 @@ public class BrokerConfig { * Acl feature switch */ @ImportantField - private boolean enableAcl = false; - + private boolean aclEnable = false; public static String localHostName() { try { @@ -717,14 +718,6 @@ public class BrokerConfig { this.transactionCheckInterval = transactionCheckInterval; } - public boolean isEnableAcl() { - return enableAcl; - } - - public void setEnableAcl(boolean isAclPlug) { - this.enableAcl = isAclPlug; - } - public int getEndTransactionThreadPoolNums() { return endTransactionThreadPoolNums; } @@ -756,5 +749,20 @@ public class BrokerConfig { public void setMsgTraceTopicName(String msgTraceTopicName) { this.msgTraceTopicName = msgTraceTopicName; } + + public boolean isTraceTopicEnable() { + return traceTopicEnable; + } + public void setTraceTopicEnable(boolean traceTopicEnable) { + this.traceTopicEnable = traceTopicEnable; + } + + public boolean isAclEnable() { + return aclEnable; + } + + public void setAclEnable(boolean aclEnable) { + this.aclEnable = aclEnable; + } } From 180a7dbd683c070d13aa443108986041f693acf9 Mon Sep 17 00:00:00 2001 From: wangshaojie4039 Date: Fri, 4 Jan 2019 17:37:10 +0800 Subject: [PATCH 88/96] [ISSUE#403] fix acl config file watch bug,clean and optimize the codes for acl feature. (#651) * [ISSUE#403] fix acl config file watch bug,clean and optimize the codes for acl feature. * [ISSUE#403] fix acl config file watch bug,clean and optimize the codes for acl feature. * [ISSUE#403]fix lock/unlock issue,and optimize the codes. --- acl/pom.xml | 4 + .../acl/plain/PlainPermissionLoader.java | 153 ++++++------------ .../acl/plain/PlainAccessValidatorTest.java | 37 +++++ .../acl/plain/PlainPermissionLoaderTest.java | 63 ++++---- .../resources/conf/watch/plain_acl_watch.yml | 34 ++-- 5 files changed, 150 insertions(+), 141 deletions(-) diff --git a/acl/pom.xml b/acl/pom.xml index aab09001ac..4978ad5e9c 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -37,6 +37,10 @@ ${project.groupId} rocketmq-common + + ${project.groupId} + rocketmq-srvutil + org.yaml snakeyaml diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 1b8269332f..9a5fea7324 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -19,28 +19,20 @@ package org.apache.rocketmq.acl.plain; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.io.File; -import java.io.IOException; -import java.nio.file.FileSystems; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardWatchEventKinds; -import java.nio.file.WatchEvent; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang3.StringUtils; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.rocketmq.acl.common.AclException; import org.apache.rocketmq.acl.common.AclUtils; import org.apache.rocketmq.acl.common.Permission; import org.apache.rocketmq.common.MixAll; -import org.apache.rocketmq.common.ServiceThread; -import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.logging.InternalLoggerFactory; +import org.apache.rocketmq.srvutil.FileWatchService; public class PlainPermissionLoader { @@ -48,25 +40,31 @@ public class PlainPermissionLoader { private static final String DEFAULT_PLAIN_ACL_FILE = "/conf/plain_acl.yml"; + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV)); private String fileName = System.getProperty("rocketmq.acl.plain.file", DEFAULT_PLAIN_ACL_FILE); - private Map plainAccessResourceMap = new HashMap<>(); + private Map plainAccessResourceMap = new HashMap<>(); - private List globalWhiteRemoteAddressStrategy = new ArrayList<>(); + private List globalWhiteRemoteAddressStrategy = new ArrayList<>(); private RemoteAddressStrategyFactory remoteAddressStrategyFactory = new RemoteAddressStrategyFactory(); private boolean isWatchStart; public PlainPermissionLoader() { - initialize(); + load(); watch(); } - public void initialize() { + public void load() { + + Map plainAccessResourceMap = new HashMap<>(); + List globalWhiteRemoteAddressStrategy = new ArrayList<>(); + JSONObject plainAclConfData = AclUtils.getYamlDataObject(fileHome + File.separator + fileName, JSONObject.class); @@ -77,92 +75,42 @@ public class PlainPermissionLoader { JSONArray globalWhiteRemoteAddressesList = plainAclConfData.getJSONArray("globalWhiteRemoteAddresses"); if (globalWhiteRemoteAddressesList != null && !globalWhiteRemoteAddressesList.isEmpty()) { for (int i = 0; i < globalWhiteRemoteAddressesList.size(); i++) { - addGlobalWhiteRemoteAddress(globalWhiteRemoteAddressesList.getString(i)); + globalWhiteRemoteAddressStrategy.add(remoteAddressStrategyFactory. + getRemoteAddressStrategy(globalWhiteRemoteAddressesList.getString(i))); } } JSONArray accounts = plainAclConfData.getJSONArray("accounts"); if (accounts != null && !accounts.isEmpty()) { - List plainAccessList = accounts.toJavaList(PlainAccessConfig.class); - for (PlainAccessConfig plainAccess : plainAccessList) { - this.addPlainAccessResource(getPlainAccessResource(plainAccess)); + List plainAccessConfigList = accounts.toJavaList(PlainAccessConfig.class); + for (PlainAccessConfig plainAccessConfig : plainAccessConfigList) { + PlainAccessResource plainAccessResource = buildPlainAccessResource(plainAccessConfig); + plainAccessResourceMap.put(plainAccessResource.getAccessKey(),plainAccessResource); } } + + this.globalWhiteRemoteAddressStrategy = globalWhiteRemoteAddressStrategy; + this.plainAccessResourceMap = plainAccessResourceMap; } private void watch() { - String version = System.getProperty("java.version"); - String[] str = StringUtils.split(version, "."); - if (Integer.valueOf(str[1]) < 7) { - log.warn("Watch need jdk equal or greater than 1.7, current version is {}", str[1]); - return; - } - try { - int fileIndex = fileName.lastIndexOf("/") + 1; - String watchDirectory = fileName.substring(0, fileIndex); - final String watchFileName = fileName.substring(fileIndex); - log.info("watch directory is {} , watch file name is {} ", fileHome + File.separator + watchDirectory, watchFileName); - - final WatchService watcher = FileSystems.getDefault().newWatchService(); - Path p = Paths.get(fileHome + File.separator + watchDirectory); - p.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE); - ServiceThread watcherServcie = new ServiceThread() { - - public void run() { - while (true) { - try { - WatchKey watchKey = watcher.take(); - List> watchEvents = watchKey.pollEvents(); - for (WatchEvent event : watchEvents) { - if (watchFileName.equals(event.context().toString()) - && (StandardWatchEventKinds.ENTRY_MODIFY.equals(event.kind()) - || StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind()))) { - log.info("{} make a difference change is : {}", watchFileName, event.toString()); - //Clearing the info, may result in a non-available time - PlainPermissionLoader.this.clearPermissionInfo(); - initialize(); - } - } - watchKey.reset(); - } catch (InterruptedException e) { - log.error(e.getMessage(), e); - UtilAll.sleep(3000); - - } - } - } - + String watchFilePath = fileHome + fileName; + FileWatchService fileWatchService = new FileWatchService(new String[] {watchFilePath}, new FileWatchService.Listener() { @Override - public String getServiceName() { - return "AclWatcherService"; + public void onChanged(String path) { + log.info("The plain acl yml changed, reload the context"); + load(); } - - }; - watcherServcie.start(); + }); + fileWatchService.start(); log.info("Succeed to start AclWatcherService"); this.isWatchStart = true; - } catch (IOException e) { + } catch (Exception e) { log.error("Failed to start AclWatcherService", e); } } - PlainAccessResource getPlainAccessResource(PlainAccessConfig plainAccess) { - PlainAccessResource plainAccessResource = new PlainAccessResource(); - plainAccessResource.setAccessKey(plainAccess.getAccessKey()); - plainAccessResource.setSecretKey(plainAccess.getSecretKey()); - plainAccessResource.setWhiteRemoteAddress(plainAccess.getWhiteRemoteAddress()); - - plainAccessResource.setAdmin(plainAccess.isAdmin()); - - plainAccessResource.setDefaultGroupPerm(Permission.parsePermFromString(plainAccess.getDefaultGroupPerm())); - plainAccessResource.setDefaultTopicPerm(Permission.parsePermFromString(plainAccess.getDefaultTopicPerm())); - - Permission.parseResourcePerms(plainAccessResource, false, plainAccess.getGroupPerms()); - Permission.parseResourcePerms(plainAccessResource, true, plainAccess.getTopicPerms()); - return plainAccessResource; - } - void checkPerm(PlainAccessResource needCheckedAccess, PlainAccessResource ownedAccess) { if (Permission.needAdminPerm(needCheckedAccess.getRequestCode()) && !ownedAccess.isAdmin()) { throw new AclException(String.format("Need admin permission for request code=%d, but accessKey=%s is not", needCheckedAccess.getRequestCode(), ownedAccess.getAccessKey())); @@ -200,31 +148,32 @@ public class PlainPermissionLoader { this.globalWhiteRemoteAddressStrategy.clear(); } - public void addPlainAccessResource(PlainAccessResource plainAccessResource) throws AclException { - if (plainAccessResource.getAccessKey() == null - || plainAccessResource.getSecretKey() == null - || plainAccessResource.getAccessKey().length() <= 6 - || plainAccessResource.getSecretKey().length() <= 6) { + public PlainAccessResource buildPlainAccessResource(PlainAccessConfig plainAccessConfig) throws AclException { + if (plainAccessConfig.getAccessKey() == null + || plainAccessConfig.getSecretKey() == null + || plainAccessConfig.getAccessKey().length() <= 6 + || plainAccessConfig.getSecretKey().length() <= 6) { throw new AclException(String.format( "The accessKey=%s and secretKey=%s cannot be null and length should longer than 6", - plainAccessResource.getAccessKey(), plainAccessResource.getSecretKey())); + plainAccessConfig.getAccessKey(), plainAccessConfig.getSecretKey())); } - try { - RemoteAddressStrategy remoteAddressStrategy = remoteAddressStrategyFactory - .getRemoteAddressStrategy(plainAccessResource); - plainAccessResource.setRemoteAddressStrategy(remoteAddressStrategy); + PlainAccessResource plainAccessResource = new PlainAccessResource(); + plainAccessResource.setAccessKey(plainAccessConfig.getAccessKey()); + plainAccessResource.setSecretKey(plainAccessConfig.getSecretKey()); + plainAccessResource.setWhiteRemoteAddress(plainAccessConfig.getWhiteRemoteAddress()); - if (plainAccessResourceMap.containsKey(plainAccessResource.getAccessKey())) { - log.warn("Duplicate acl config for {}, the newly one may overwrite the old", plainAccessResource.getAccessKey()); - } - plainAccessResourceMap.put(plainAccessResource.getAccessKey(), plainAccessResource); - } catch (Exception e) { - throw new AclException(String.format("Load plain access resource failed %s %s", e.getMessage(), plainAccessResource.toString()), e); - } - } + plainAccessResource.setAdmin(plainAccessConfig.isAdmin()); - private void addGlobalWhiteRemoteAddress(String remoteAddresses) { - globalWhiteRemoteAddressStrategy.add(remoteAddressStrategyFactory.getRemoteAddressStrategy(remoteAddresses)); + plainAccessResource.setDefaultGroupPerm(Permission.parsePermFromString(plainAccessConfig.getDefaultGroupPerm())); + plainAccessResource.setDefaultTopicPerm(Permission.parsePermFromString(plainAccessConfig.getDefaultTopicPerm())); + + Permission.parseResourcePerms(plainAccessResource, false, plainAccessConfig.getGroupPerms()); + Permission.parseResourcePerms(plainAccessResource, true, plainAccessConfig.getTopicPerms()); + + plainAccessResource.setRemoteAddressStrategy(remoteAddressStrategyFactory. + getRemoteAddressStrategy(plainAccessResource.getWhiteRemoteAddress())); + + return plainAccessResource; } public void validate(PlainAccessResource plainAccessResource) { diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java index 77bbb1193f..16e770206c 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.Set; import org.apache.rocketmq.acl.common.AclClientRPCHook; +import org.apache.rocketmq.acl.common.AclException; import org.apache.rocketmq.acl.common.AclUtils; import org.apache.rocketmq.acl.common.SessionCredentials; import org.apache.rocketmq.common.protocol.RequestCode; @@ -229,5 +230,41 @@ public class PlainAccessValidatorTest { plainAccessValidator.validate(accessResource); } + @Test(expected = AclException.class) + public void validateNullAccessKeyTest() { + SessionCredentials sessionCredentials=new SessionCredentials(); + sessionCredentials.setAccessKey("RocketMQ1"); + sessionCredentials.setSecretKey("1234"); + AclClientRPCHook aclClientRPCHook=new AclClientRPCHook(sessionCredentials); + SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); + messageRequestHeader.setTopic("topicB"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE, messageRequestHeader); + aclClientRPCHook.doBeforeRequest("", remotingCommand); + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.1.1"); + plainAccessValidator.validate(accessResource); + } + + @Test(expected = AclException.class) + public void validateErrorSecretKeyTest() { + SessionCredentials sessionCredentials=new SessionCredentials(); + sessionCredentials.setAccessKey("RocketMQ"); + sessionCredentials.setSecretKey("1234"); + AclClientRPCHook aclClientRPCHook=new AclClientRPCHook(sessionCredentials); + SendMessageRequestHeader messageRequestHeader = new SendMessageRequestHeader(); + messageRequestHeader.setTopic("topicB"); + RemotingCommand remotingCommand = RemotingCommand.createRequestCommand(RequestCode.SEND_MESSAGE, messageRequestHeader); + aclClientRPCHook.doBeforeRequest("", remotingCommand); + + ByteBuffer buf = remotingCommand.encodeHeader(); + buf.getInt(); + buf = ByteBuffer.allocate(buf.limit() - buf.position()).put(buf); + buf.position(0); + PlainAccessResource accessResource = (PlainAccessResource) plainAccessValidator.parse(RemotingCommand.decode(buf), "192.168.1.1"); + plainAccessValidator.validate(accessResource); + } } diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java index 77d418e9bc..ebbc4fd260 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainPermissionLoaderTest.java @@ -41,6 +41,7 @@ public class PlainPermissionLoaderTest { PlainAccessResource ANYPlainAccessResource; PlainAccessResource DENYPlainAccessResource; PlainAccessResource plainAccessResource = new PlainAccessResource(); + PlainAccessConfig plainAccessConfig = new PlainAccessConfig(); PlainAccessResource plainAccessResourceTwo = new PlainAccessResource(); Set adminCode = new HashSet<>(); @@ -88,24 +89,22 @@ public class PlainPermissionLoaderTest { } @Test - public void getPlainAccessResourceTest() { - PlainAccessResource plainAccessResource = new PlainAccessResource(); + public void buildPlainAccessResourceTest() { + PlainAccessResource plainAccessResource = null; PlainAccessConfig plainAccess = new PlainAccessConfig(); plainAccess.setAccessKey("RocketMQ"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); - Assert.assertEquals(plainAccessResource.getAccessKey(), "RocketMQ"); - plainAccess.setSecretKey("12345678"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); + plainAccessResource = plainPermissionLoader.buildPlainAccessResource(plainAccess); + Assert.assertEquals(plainAccessResource.getAccessKey(), "RocketMQ"); Assert.assertEquals(plainAccessResource.getSecretKey(), "12345678"); plainAccess.setWhiteRemoteAddress("127.0.0.1"); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); + plainAccessResource = plainPermissionLoader.buildPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.getWhiteRemoteAddress(), "127.0.0.1"); plainAccess.setAdmin(true); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); + plainAccessResource = plainPermissionLoader.buildPlainAccessResource(plainAccess); Assert.assertEquals(plainAccessResource.isAdmin(), true); List groups = new ArrayList(); @@ -113,7 +112,7 @@ public class PlainPermissionLoaderTest { groups.add("groupB=PUB|SUB"); groups.add("groupC=PUB"); plainAccess.setGroupPerms(groups); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); + plainAccessResource = plainPermissionLoader.buildPlainAccessResource(plainAccess); Map resourcePermMap = plainAccessResource.getResourcePermMap(); Assert.assertEquals(resourcePermMap.size(), 3); @@ -126,7 +125,7 @@ public class PlainPermissionLoaderTest { topics.add("topicB=PUB|SUB"); topics.add("topicC=PUB"); plainAccess.setTopicPerms(topics); - plainAccessResource = plainPermissionLoader.getPlainAccessResource(plainAccess); + plainAccessResource = plainPermissionLoader.buildPlainAccessResource(plainAccess); resourcePermMap = plainAccessResource.getResourcePermMap(); Assert.assertEquals(resourcePermMap.size(), 6); @@ -158,35 +157,41 @@ public class PlainPermissionLoaderTest { plainPermissionLoader.checkPerm(plainAccessResource, ANYPlainAccessResource); } + @Test(expected = AclException.class) + public void checkErrorPerm() { + plainAccessResource = new PlainAccessResource(); + plainAccessResource.addResourceAndPerm("topicF", Permission.SUB); + plainPermissionLoader.checkPerm(plainAccessResource, SUBPlainAccessResource); + } @Test(expected = AclException.class) public void accountNullTest() { - plainAccessResource.setAccessKey(null); - plainPermissionLoader.addPlainAccessResource(plainAccessResource); + plainAccessConfig.setAccessKey(null); + plainPermissionLoader.buildPlainAccessResource(plainAccessConfig); } @Test(expected = AclException.class) public void accountThanTest() { - plainAccessResource.setAccessKey("123"); - plainPermissionLoader.addPlainAccessResource(plainAccessResource); + plainAccessConfig.setAccessKey("123"); + plainPermissionLoader.buildPlainAccessResource(plainAccessConfig); } @Test(expected = AclException.class) public void passWordtNullTest() { - plainAccessResource.setAccessKey(null); - plainPermissionLoader.addPlainAccessResource(plainAccessResource); + plainAccessConfig.setAccessKey(null); + plainPermissionLoader.buildPlainAccessResource(plainAccessConfig); } @Test(expected = AclException.class) public void passWordThanTest() { - plainAccessResource.setAccessKey("123"); - plainPermissionLoader.addPlainAccessResource(plainAccessResource); + plainAccessConfig.setAccessKey("123"); + plainPermissionLoader.buildPlainAccessResource(plainAccessConfig); } @Test(expected = AclException.class) public void testPlainAclPlugEngineInit() { System.setProperty("rocketmq.home.dir", ""); - new PlainPermissionLoader().initialize(); + new PlainPermissionLoader().load(); } @SuppressWarnings("unchecked") @@ -203,24 +208,20 @@ public class PlainPermissionLoaderTest { @Test public void isWatchStartTest() { - System.setProperty("java.version", "1.7.11"); + PlainPermissionLoader plainPermissionLoader = new PlainPermissionLoader(); Assert.assertTrue(plainPermissionLoader.isWatchStart()); - System.setProperty("java.version", "1.6.11"); - plainPermissionLoader = new PlainPermissionLoader(); - Assert.assertFalse(plainPermissionLoader.isWatchStart()); } + @Test - public void testWatch() throws IOException, IllegalAccessException { - System.setProperty("java.version", "1.7.11"); - System.setProperty("rocketmq.home.dir", "src/test/resources/conf"); - System.setProperty("rocketmq.acl.plain.file", "watch/plain_acl_watch.yml"); - String fileName = "src/test/resources/conf/watch/plain_acl_watch.yml"; + public void testWatch() throws IOException, IllegalAccessException ,InterruptedException{ + System.setProperty("rocketmq.home.dir", "src/test/resources"); + System.setProperty("rocketmq.acl.plain.file", "/conf/plain_acl-test.yml"); + String fileName =System.getProperty("rocketmq.home.dir", "src/test/resources")+System.getProperty("rocketmq.acl.plain.file", "/conf/plain_acl.yml"); File transport = new File(fileName); transport.delete(); transport.createNewFile(); - FileWriter writer = new FileWriter(transport); writer.write("accounts:\r\n"); writer.write("- accessKey: watchrocketmq\r\n"); @@ -250,7 +251,7 @@ public class PlainPermissionLoaderTest { writer.flush(); writer.close(); - UtilAll.sleep(1000); + Thread.sleep(1000); { Map plainAccessResourceMap = (Map) FieldUtils.readDeclaredField(plainPermissionLoader, "plainAccessResourceMap", true); PlainAccessResource accessResource = plainAccessResourceMap.get("watchrocketmq1"); @@ -260,6 +261,8 @@ public class PlainPermissionLoaderTest { } transport.delete(); + System.setProperty("rocketmq.home.dir", "src/test/resources"); + System.setProperty("rocketmq.acl.plain.file", "/conf/plain_acl.yml"); } @Test(expected = AclException.class) diff --git a/acl/src/test/resources/conf/watch/plain_acl_watch.yml b/acl/src/test/resources/conf/watch/plain_acl_watch.yml index d705092a1e..9d2c395494 100644 --- a/acl/src/test/resources/conf/watch/plain_acl_watch.yml +++ b/acl/src/test/resources/conf/watch/plain_acl_watch.yml @@ -1,9 +1,25 @@ -accounts: -- accessKey: watchrocketmq - secretKey: 12345678 - whiteRemoteAddress: 127.0.0.1 - admin: true -- accessKey: watchrocketmq1 - secretKey: 88888888 - whiteRemoteAddress: 127.0.0.1 - admin: false +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +## suggested format +accounts: +- accessKey: watchrocketmq + secretKey: 12345678 + whiteRemoteAddress: 127.0.0.1 + admin: true +- accessKey: watchrocketmq1 + secretKey: 88888888 + whiteRemoteAddress: 127.0.0.1 + admin: false From 6263fb03ca55d2824acb17f633906341032a4359 Mon Sep 17 00:00:00 2001 From: dongeforever Date: Fri, 4 Jan 2019 18:49:44 +0800 Subject: [PATCH 89/96] Resolve the conficts in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6493b6f50..686ba46294 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ It offers a variety of features: ---------- ## Apache RocketMQ Community -[RocketMQ Community Incubator Projects](https://github.com/apache/rocketmq-externals) +* [RocketMQ Community Projects](https://github.com/apache/rocketmq-externals) ---------- ## Contributing From 28e4ac50fd9a1bdbea5d6a32cfb96acf33a3cbfd Mon Sep 17 00:00:00 2001 From: wlliqipeng Date: Fri, 4 Jan 2019 15:52:43 +0800 Subject: [PATCH 90/96] add concept.md --- docs/cn/concept.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/cn/concept.md diff --git a/docs/cn/concept.md b/docs/cn/concept.md new file mode 100644 index 0000000000..38036f22f6 --- /dev/null +++ b/docs/cn/concept.md @@ -0,0 +1,39 @@ +# 基本概念 +## 消息模型(Message Model) + + + +RocketMQ 消息模型如图1所示,主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。 +## 消息生产者(Producer) + 负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。 +## 消息消费者(Consumer) + 负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。 +## 主题(Topic) + 表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。 +##代理服务器(Broker Server) +消息中转角色,负责存储消息、转发消息。代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。 +## 名字服务(Name Server) + 名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。多个Namesrv实例组成集群,但相互独立,没有信息交换。 +## 拉取式消费(Pull Consumer) + Consumer消费的一种类型,应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。 +## 推动式消费(Push Consumer) + Consumer消费的一种类型,该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高。 +## 生产者组(Producer Group) + 同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。如果发送的是事物消息且原始生产者在发送之后崩溃,则Broker服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。 +## 消费者组(Consumer Group) + 同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。 +## 集群消费(Clustering) +集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊消息。 +## 广播消费(Broadcasting) +广播消费模式下,相同Consumer Group的每个Consumer实例都接收全量的消息。 +## 普通顺序消息(Normal Ordered Message) +普通顺序消费模式下,消费者通过同一个消费队列收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。 +## 严格顺序消息(Strictly Ordered Message) +严格顺序消息模式下,消费者收到的所有消息均是有顺序的。 +## 代理服务器(Broker Server) +消息中转角色,负责存储消息、转发消息。代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。 +## 消息(Message) +消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。 +## 标签(Tag) + 为消息设置的标志,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。 + From 691b71216744a97ce4c7845a78029e0e27454f38 Mon Sep 17 00:00:00 2001 From: Hu Zongtang Date: Mon, 7 Jan 2019 19:03:54 +0800 Subject: [PATCH 91/96] [ISSUE#662]capitalizing the first letter in comments and removing the unless comments for acl and msg trace feature codes. (#669) * [ISSUE#662]capitalizing the first letter in comments and removing the unless comments for acl and msg trace feature codes. * [ISSUE#662]polish the acl feature codes. --- .../apache/rocketmq/acl/AccessValidator.java | 3 ++- .../rocketmq/acl/common/AclClientRPCHook.java | 7 +++--- .../rocketmq/acl/common/AclException.java | 8 +------ .../rocketmq/acl/common/Permission.java | 6 ++--- .../acl/plain/PlainAccessResource.java | 2 +- .../acl/plain/PlainAccessValidator.java | 2 +- .../acl/plain/PlainPermissionLoader.java | 12 +++++----- .../acl/plain/RemoteAddressStrategy.java | 2 +- .../consumer/DefaultMQPushConsumer.java | 18 +++++++------- .../client/producer/DefaultMQProducer.java | 16 ++++++------- .../client/trace/AsyncTraceDispatcher.java | 24 +++++++++---------- .../client/trace/TraceDataEncoder.java | 4 ++-- .../client/trace/TraceDispatcher.java | 6 ++--- .../client/trace/TraceTransferBean.java | 2 +- .../hook/ConsumeMessageTraceHookImpl.java | 6 ++--- .../rocketmq/example/simple/AclClient.java | 2 +- .../tracemessage/TracePushConsumer.java | 4 ++-- pom.xml | 3 --- .../tools/command/MQAdminStartup.java | 2 +- 19 files changed, 61 insertions(+), 68 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/AccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/AccessValidator.java index 0b1b0823c5..c915cf35d1 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/AccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/AccessValidator.java @@ -24,7 +24,8 @@ public interface AccessValidator { * Parse to get the AccessResource(user, resource, needed permission) * * @param request - * @return + * @param remoteAddr + * @return Plain access resource result,include access key,signature and some other access attributes. */ AccessResource parse(RemotingCommand request, String remoteAddr); diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java index dd8ce1e204..9e5bf1fb5d 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclClientRPCHook.java @@ -44,7 +44,8 @@ public class AclClientRPCHook implements RPCHook { String signature = AclUtils.calSignature(total, sessionCredentials.getSecretKey()); request.addExtField(SIGNATURE, signature); request.addExtField(ACCESS_KEY, sessionCredentials.getAccessKey()); - + + // The SecurityToken value is unneccessary,user can choose this one. if (sessionCredentials.getSecurityToken() != null) { request.addExtField(SECURITY_TOKEN, sessionCredentials.getSecurityToken()); } @@ -57,14 +58,14 @@ public class AclClientRPCHook implements RPCHook { protected SortedMap parseRequestContent(RemotingCommand request, String ak, String securityToken) { CommandCustomHeader header = request.readCustomHeader(); - // sort property + // Sort property SortedMap map = new TreeMap(); map.put(ACCESS_KEY, ak); if (securityToken != null) { map.put(SECURITY_TOKEN, securityToken); } try { - // add header properties + // Add header properties if (null != header) { Field[] fields = fieldCache.get(header.getClass()); if (null == fields) { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java index 0bc97db911..54579d48a7 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclException.java @@ -17,7 +17,7 @@ package org.apache.rocketmq.acl.common; public class AclException extends RuntimeException { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -7256002576788700354L; private String status; private int code; @@ -34,12 +34,6 @@ public class AclException extends RuntimeException { this.code = code; } - public AclException(String status, int code, Throwable throwable) { - super(throwable); - this.status = status; - this.code = code; - } - public AclException(String message) { super(message); } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java index 7a95ee053d..0acc8e9508 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/Permission.java @@ -33,11 +33,11 @@ public class Permission { public static final Set ADMIN_CODE = new HashSet(); static { - // UPDATE_AND_CREATE_TOPIC + // UPDATE_AND_CREATE_TOPIC ADMIN_CODE.add(RequestCode.UPDATE_AND_CREATE_TOPIC); - // UPDATE_BROKER_CONFIG + // UPDATE_BROKER_CONFIG ADMIN_CODE.add(RequestCode.UPDATE_BROKER_CONFIG); - // DELETE_TOPIC_IN_BROKER + // DELETE_TOPIC_IN_BROKER ADMIN_CODE.add(RequestCode.DELETE_TOPIC_IN_BROKER); // UPDATE_AND_CREATE_SUBSCRIPTIONGROUP ADMIN_CODE.add(RequestCode.UPDATE_AND_CREATE_SUBSCRIPTIONGROUP); diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java index 9017bf22ea..00072e8e2e 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessResource.java @@ -24,7 +24,7 @@ import org.apache.rocketmq.common.MixAll; public class PlainAccessResource implements AccessResource { - //identify the user + // Identify the user private String accessKey; private String secretKey; diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java index bb1c0a11c6..34bb1b439e 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainAccessValidator.java @@ -111,7 +111,7 @@ public class PlainAccessValidator implements AccessValidator { } catch (Throwable t) { throw new AclException(t.getMessage(), t); } - // content + // Content SortedMap map = new TreeMap(); for (Map.Entry entry : request.getExtFields().entrySet()) { if (!SessionCredentials.SIGNATURE.equals(entry.getKey())) { diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java index 9a5fea7324..1da7380b6d 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionLoader.java @@ -119,7 +119,7 @@ public class PlainPermissionLoader { Map ownedPermMap = ownedAccess.getResourcePermMap(); if (needCheckedPermMap == null) { - //if the needCheckedPermMap is null,then return + // If the needCheckedPermMap is null,then return return; } @@ -129,7 +129,7 @@ public class PlainPermissionLoader { boolean isGroup = PlainAccessResource.isRetryTopic(resource); if (!ownedPermMap.containsKey(resource)) { - //Check the default perm + // Check the default perm byte ownedPerm = isGroup ? needCheckedAccess.getDefaultGroupPerm() : needCheckedAccess.getDefaultTopicPerm(); if (!Permission.checkPermission(neededPerm, ownedPerm)) { @@ -178,7 +178,7 @@ public class PlainPermissionLoader { public void validate(PlainAccessResource plainAccessResource) { - //Step 1, check the global white remote addr + // Check the global white remote addr for (RemoteAddressStrategy remoteAddressStrategy : globalWhiteRemoteAddressStrategy) { if (remoteAddressStrategy.match(plainAccessResource)) { return; @@ -193,18 +193,18 @@ public class PlainPermissionLoader { throw new AclException(String.format("No acl config for %s", plainAccessResource.getAccessKey())); } - //Step 2, check the white addr for accesskey + // Check the white addr for accesskey PlainAccessResource ownedAccess = plainAccessResourceMap.get(plainAccessResource.getAccessKey()); if (ownedAccess.getRemoteAddressStrategy().match(plainAccessResource)) { return; } - //Step 3, check the signature + // Check the signature String signature = AclUtils.calSignature(plainAccessResource.getContent(), ownedAccess.getSecretKey()); if (!signature.equals(plainAccessResource.getSignature())) { throw new AclException(String.format("Check signature failed for accessKey=%s", plainAccessResource.getAccessKey())); } - //Step 4, check perm of each resource + // Check perm of each resource checkPerm(plainAccessResource, ownedAccess); } diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategy.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategy.java index 60e92960e6..8eab40c954 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategy.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategy.java @@ -18,5 +18,5 @@ package org.apache.rocketmq.acl.plain; public interface RemoteAddressStrategy { - public boolean match(PlainAccessResource plainAccessResource); + boolean match(PlainAccessResource plainAccessResource); } diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index 3ebcb76a86..6cd2ad18a5 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -270,7 +270,7 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume * * @param consumerGroup Consume queue. * @param rpcHook RPC hook to execute before each remoting command. - * @param allocateMessageQueueStrategy message queue allocating algorithm. + * @param allocateMessageQueueStrategy Message queue allocating algorithm. */ public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, AllocateMessageQueueStrategy allocateMessageQueueStrategy) { @@ -280,13 +280,13 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume } /** - * Constructor specifying consumer group, RPC hook and message queue allocating algorithm. + * Constructor specifying consumer group, RPC hook, message queue allocating algorithm, enabled msg trace flag and customized trace topic name. * * @param consumerGroup Consume queue. * @param rpcHook RPC hook to execute before each remoting command. * @param allocateMessageQueueStrategy message queue allocating algorithm. - * @param enableMsgTrace switch flag instance for message trace. - * @param customizedTraceTopic the name value of message trace topic.If you don't config,you can use the default trace topic name. + * @param enableMsgTrace Switch flag instance for message trace. + * @param customizedTraceTopic The name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, AllocateMessageQueueStrategy allocateMessageQueueStrategy, boolean enableMsgTrace, final String customizedTraceTopic) { @@ -317,21 +317,21 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume /** - * Constructor specifying consumer group. + * Constructor specifying consumer group and enabled msg trace flag. * * @param consumerGroup Consumer group. - * @param enableMsgTrace switch flag instance for message trace. + * @param enableMsgTrace Switch flag instance for message trace. */ public DefaultMQPushConsumer(final String consumerGroup, boolean enableMsgTrace) { this(consumerGroup, null, new AllocateMessageQueueAveragely(), enableMsgTrace, null); } /** - * Constructor specifying consumer group. + * Constructor specifying consumer group, enabled msg trace flag and customized trace topic name. * * @param consumerGroup Consumer group. - * @param enableMsgTrace switch flag instance for message trace. - * @param customizedTraceTopic the name value of message trace topic.If you don't config,you can use the default trace topic name. + * @param enableMsgTrace Switch flag instance for message trace. + * @param customizedTraceTopic The name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQPushConsumer(final String consumerGroup, boolean enableMsgTrace, final String customizedTraceTopic) { this(consumerGroup, null, new AllocateMessageQueueAveragely(), enableMsgTrace, customizedTraceTopic); diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java index 8b4027c400..2339142616 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java @@ -150,12 +150,12 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { } /** - * Constructor specifying both producer group and RPC hook. + * Constructor specifying producer group, RPC hook, enabled msgTrace flag and customized trace topic name. * * @param producerGroup Producer group, see the name-sake field. * @param rpcHook RPC hook to execute per each remoting command execution. - * @param enableMsgTrace switch flag instance for message trace. - * @param customizedTraceTopic the name value of message trace topic.If you don't config,you can use the default trace topic name. + * @param enableMsgTrace Switch flag instance for message trace. + * @param customizedTraceTopic The name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean enableMsgTrace,final String customizedTraceTopic) { this.producerGroup = producerGroup; @@ -184,10 +184,10 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { } /** - * Constructor specifying producer group. + * Constructor specifying producer group and enabled msg trace flag. * * @param producerGroup Producer group, see the name-sake field. - * @param enableMsgTrace switch flag instance for message trace. + * @param enableMsgTrace Switch flag instance for message trace. */ public DefaultMQProducer(final String producerGroup, boolean enableMsgTrace) { this(producerGroup, null, enableMsgTrace, null); @@ -195,11 +195,11 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer { /** - * Constructor specifying producer group. + * Constructor specifying producer group, enabled msgTrace flag and customized trace topic name. * * @param producerGroup Producer group, see the name-sake field. - * @param enableMsgTrace switch flag instance for message trace. - * @param customizedTraceTopic the name value of message trace topic.If you don't config,you can use the default trace topic name. + * @param enableMsgTrace Switch flag instance for message trace. + * @param customizedTraceTopic The name value of message trace topic.If you don't config,you can use the default trace topic name. */ public DefaultMQProducer(final String producerGroup, boolean enableMsgTrace, final String customizedTraceTopic) { this(producerGroup, null, enableMsgTrace, customizedTraceTopic); diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java index 04ef8e09a1..5542324413 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java @@ -58,7 +58,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { private final int maxMsgSize; private final DefaultMQProducer traceProducer; private final ThreadPoolExecutor traceExecuter; - // the last discard number of log + // The last discard number of log private AtomicLong discardCount; private Thread worker; private ArrayBlockingQueue traceContextQueue; @@ -143,7 +143,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { traceProducerInstance.setSendMsgTimeout(5000); traceProducerInstance.setInstanceName(TRACE_INSTANCE_NAME); traceProducerInstance.setVipChannelEnabled(false); - //the max size of message is 128K + // The max size of message is 128K traceProducerInstance.setMaxMessageSize(maxMsgSize - 10 * 1000); } return traceProducerInstance; @@ -160,7 +160,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { @Override public void flush() throws IOException { - // the maximum waiting time for refresh,avoid being written all the time, resulting in failure to return. + // The maximum waiting time for refresh,avoid being written all the time, resulting in failure to return. long end = System.currentTimeMillis() + 500; while (traceContextQueue.size() > 0 || appenderQueue.size() > 0 && System.currentTimeMillis() <= end) { try { @@ -263,9 +263,9 @@ public class AsyncTraceDispatcher implements TraceDispatcher { if (context.getTraceBeans().isEmpty()) { continue; } - //1.topic value corresponding to original message entity content + // Topic value corresponding to original message entity content String topic = context.getTraceBeans().get(0).getTopic(); - //2.use original message entity's topic as key + // Use original message entity's topic as key String key = topic; List transBeanList = transBeanMap.get(key); if (transBeanList == null) { @@ -281,26 +281,26 @@ public class AsyncTraceDispatcher implements TraceDispatcher { } /** - * batch sending data actually + * Batch sending data actually */ private void flushData(List transBeanList) { if (transBeanList.size() == 0) { return; } - // temporary buffer + // Temporary buffer StringBuilder buffer = new StringBuilder(1024); int count = 0; Set keySet = new HashSet(); for (TraceTransferBean bean : transBeanList) { - // keyset of message trace includes msgId of or original message + // Keyset of message trace includes msgId of or original message keySet.addAll(bean.getTransKey()); buffer.append(bean.getTransData()); count++; // Ensure that the size of the package should not exceed the upper limit. if (buffer.length() >= traceProducer.getMaxMessageSize()) { sendTraceDataByMQ(keySet, buffer.toString()); - // clear temporary buffer after finishing + // Clear temporary buffer after finishing buffer.delete(0, buffer.length()); keySet.clear(); count = 0; @@ -313,7 +313,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { } /** - * send message trace data + * Send message trace data * * @param keySet the keyset in this batch(including msgId in original message not offsetMsgId) * @param data the message trace data in this batch @@ -322,7 +322,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { String topic = traceTopicName; final Message message = new Message(topic, data.getBytes()); - //keyset of message trace includes msgId of or original message + // Keyset of message trace includes msgId of or original message message.setKeys(keySet); try { Set traceBrokerSet = tryGetMessageQueueBrokerSet(traceProducer.getDefaultMQProducerImpl(), topic); @@ -337,7 +337,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { } }; if (traceBrokerSet.isEmpty()) { - //no cross set + // No cross set traceProducer.send(message, callback, 5000); } else { traceProducer.send(message, new MessageQueueSelector() { diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java index 2ed8940248..5a1afaf361 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java @@ -22,12 +22,12 @@ import java.util.ArrayList; import java.util.List; /** - * encode/decode for Trace Data + * Encode/decode for Trace Data */ public class TraceDataEncoder { /** - * resolving traceContext list From trace data String + * Resolving traceContext list From trace data String * * @param traceData * @return diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java index 2b0f453090..275e6a3220 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDispatcher.java @@ -30,21 +30,21 @@ public interface TraceDispatcher { void start(String nameSrvAddr) throws MQClientException; /** - * append the transfering data + * Append the transfering data * @param ctx data infomation * @return */ boolean append(Object ctx); /** - * write flush action + * Write flush action * * @throws IOException */ void flush() throws IOException; /** - * close the trace Hook + * Close the trace Hook */ void shutdown(); } diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java index 2e054ee1eb..052ca36521 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceTransferBean.java @@ -20,7 +20,7 @@ import java.util.HashSet; import java.util.Set; /** - * trace transfering bean + * Trace transfering bean */ public class TraceTransferBean { private String transData; diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/hook/ConsumeMessageTraceHookImpl.java b/client/src/main/java/org/apache/rocketmq/client/trace/hook/ConsumeMessageTraceHookImpl.java index 7fbad36979..38ec8b97a3 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/hook/ConsumeMessageTraceHookImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/hook/ConsumeMessageTraceHookImpl.java @@ -61,7 +61,7 @@ public class ConsumeMessageTraceHookImpl implements ConsumeMessageHook { String traceOn = msg.getProperty(MessageConst.PROPERTY_TRACE_SWITCH); if (traceOn != null && traceOn.equals("false")) { - // if trace switch is false ,skip it + // If trace switch is false ,skip it continue; } TraceBean traceBean = new TraceBean(); @@ -90,7 +90,7 @@ public class ConsumeMessageTraceHookImpl implements ConsumeMessageHook { TraceContext subBeforeContext = (TraceContext) context.getMqTraceContext(); if (subBeforeContext.getTraceBeans() == null || subBeforeContext.getTraceBeans().size() < 1) { - // if subbefore bean is null ,skip it + // If subbefore bean is null ,skip it return; } TraceContext subAfterContext = new TraceContext(); @@ -100,7 +100,7 @@ public class ConsumeMessageTraceHookImpl implements ConsumeMessageHook { subAfterContext.setRequestId(subBeforeContext.getRequestId());// subAfterContext.setSuccess(context.isSuccess());// - //caculate the cost time for processing messages + // Caculate the cost time for processing messages int costTime = (int) ((System.currentTimeMillis() - subBeforeContext.getTimeStamp()) / context.getMsgList().size()); subAfterContext.setCostTime(costTime);// subAfterContext.setTraceBeans(subBeforeContext.getTraceBeans()); diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java index f4cb4e4b37..0c97cd3321 100644 --- a/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java +++ b/example/src/main/java/org/apache/rocketmq/example/simple/AclClient.java @@ -84,7 +84,7 @@ public class AclClient { consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.subscribe("TopicTest", "*"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - //wrong time format 2017_0422_221800 + // Wrong time format 2017_0422_221800 consumer.setConsumeTimestamp("20180422221800"); consumer.registerMessageListener(new MessageListenerConcurrently() { diff --git a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java index a89661d547..473351963f 100644 --- a/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/tracemessage/TracePushConsumer.java @@ -28,11 +28,11 @@ import org.apache.rocketmq.common.message.MessageExt; public class TracePushConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { - //here,we use the default message track trace topic name + // Here,we use the default message track trace topic name DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1",true); consumer.subscribe("TopicTest", "*"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - //wrong time format 2017_0422_221800 + // Wrong time format 2017_0422_221800 consumer.setConsumeTimestamp("20181109221800"); consumer.registerMessageListener(new MessageListenerConcurrently() { diff --git a/pom.xml b/pom.xml index ff96c4cb7d..5de0465b66 100644 --- a/pom.xml +++ b/pom.xml @@ -216,9 +216,6 @@ generate-effective-dependencies-pom generate-resources - ${project.build.directory}/effective-pom/effective-dependencies.xml diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java index 989f8d7716..2ca60aa860 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/MQAdminStartup.java @@ -256,7 +256,7 @@ public class MQAdminStartup { System.out.printf(" Cannot find conf file %s, acl is not be enabled.%n" ,fileHome + fileName); return null; } - // admin ak sk + String accessKey = yamlDataObject.getString("accessKey"); String secretKey = yamlDataObject.getString("secretKey"); From 6574b69e981cbacc916ee0e6fa0dcd7bb14c4dd2 Mon Sep 17 00:00:00 2001 From: Zhendong Liu Date: Mon, 7 Jan 2019 19:12:45 +0800 Subject: [PATCH 92/96] Remove the log when get none remote address strategy --- .../apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java | 1 - 1 file changed, 1 deletion(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java index c9166f8da9..de29e92fd5 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java @@ -39,7 +39,6 @@ public class RemoteAddressStrategyFactory { public RemoteAddressStrategy getRemoteAddressStrategy(String remoteAddr) { if (StringUtils.isBlank(remoteAddr)) { - log.warn("white list address is null"); return BLANK_NET_ADDRESS_STRATEGY; } if ("*".equals(remoteAddr)) { From 0767a9d5f926f6295509e409228b4d95e8094cb5 Mon Sep 17 00:00:00 2001 From: Black-Mamba24 <329926648@qq.com> Date: Tue, 15 Jan 2019 21:28:33 +0800 Subject: [PATCH 93/96] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dissue556=20EpollEventLo?= =?UTF-8?q?opGroup=E5=90=AF=E5=8A=A8=E5=A4=B1=E8=B4=A5=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remoting/netty/NettyRemotingServer.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java index 198484251c..c9691bada0 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingServer.java @@ -108,16 +108,16 @@ public class NettyRemotingServer extends NettyRemotingAbstract implements Remoti } }); - this.eventLoopGroupBoss = new NioEventLoopGroup(1, new ThreadFactory() { - private AtomicInteger threadIndex = new AtomicInteger(0); - - @Override - public Thread newThread(Runnable r) { - return new Thread(r, String.format("NettyBoss_%d", this.threadIndex.incrementAndGet())); - } - }); - if (useEpoll()) { + this.eventLoopGroupBoss = new EpollEventLoopGroup(1, new ThreadFactory() { + private AtomicInteger threadIndex = new AtomicInteger(0); + + @Override + public Thread newThread(Runnable r) { + return new Thread(r, String.format("NettyEPOLLBoss_%d", this.threadIndex.incrementAndGet())); + } + }); + this.eventLoopGroupSelector = new EpollEventLoopGroup(nettyServerConfig.getServerSelectorThreads(), new ThreadFactory() { private AtomicInteger threadIndex = new AtomicInteger(0); private int threadTotal = nettyServerConfig.getServerSelectorThreads(); @@ -128,6 +128,15 @@ public class NettyRemotingServer extends NettyRemotingAbstract implements Remoti } }); } else { + this.eventLoopGroupBoss = new NioEventLoopGroup(1, new ThreadFactory() { + private AtomicInteger threadIndex = new AtomicInteger(0); + + @Override + public Thread newThread(Runnable r) { + return new Thread(r, String.format("NettyNIOBoss_%d", this.threadIndex.incrementAndGet())); + } + }); + this.eventLoopGroupSelector = new NioEventLoopGroup(nettyServerConfig.getServerSelectorThreads(), new ThreadFactory() { private AtomicInteger threadIndex = new AtomicInteger(0); private int threadTotal = nettyServerConfig.getServerSelectorThreads(); From eeb1407032ec383ca8d2610af8dd1f3d5dca4994 Mon Sep 17 00:00:00 2001 From: superheizai Date: Thu, 17 Jan 2019 15:24:31 +0800 Subject: [PATCH 94/96] fix bug: when producers send msg to multi clusters, only one cluster can receive message trace message (#694) * make isStarted as not static; rename instanceName with nameSrv address as subfix to fix connect multi cluster * fix checkstyle error * remove useless mock in DefaultMQProducerWithTraceTest --- .../client/trace/AsyncTraceDispatcher.java | 41 +++++++------- .../trace/DefaultMQProducerWithTraceTest.java | 55 +++++++------------ 2 files changed, 42 insertions(+), 54 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java index 5542324413..87a795e4b4 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java @@ -16,7 +16,6 @@ */ package org.apache.rocketmq.client.trace; -import java.util.concurrent.atomic.AtomicBoolean; import org.apache.rocketmq.client.common.ThreadLocalIndex; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl; @@ -33,20 +32,22 @@ import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageQueue; import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.remoting.RPCHook; import java.io.IOException; -import java.util.List; -import java.util.HashMap; -import java.util.UUID; -import java.util.Set; -import java.util.HashSet; -import java.util.ArrayList; -import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; -import org.apache.rocketmq.remoting.RPCHook; +import java.util.UUID; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; +import java.util.Set; +import java.util.HashSet; + import static org.apache.rocketmq.client.trace.TraceConstants.TRACE_INSTANCE_NAME; @@ -70,7 +71,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { private volatile ThreadLocalIndex sendWhichQueue = new ThreadLocalIndex(); private String dispatcherId = UUID.randomUUID().toString(); private String traceTopicName; - private static AtomicBoolean isStarted = new AtomicBoolean(false); + private AtomicBoolean isStarted = new AtomicBoolean(false); public AsyncTraceDispatcher(String traceTopicName, RPCHook rpcHook) throws MQClientException { @@ -87,12 +88,12 @@ public class AsyncTraceDispatcher implements TraceDispatcher { this.traceTopicName = MixAll.RMQ_SYS_TRACE_TOPIC; } this.traceExecuter = new ThreadPoolExecutor(// - 10, // - 20, // - 1000 * 60, // - TimeUnit.MILLISECONDS, // - this.appenderQueue, // - new ThreadFactoryImpl("MQTraceSendThread_")); + 10, // + 20, // + 1000 * 60, // + TimeUnit.MILLISECONDS, // + this.appenderQueue, // + new ThreadFactoryImpl("MQTraceSendThread_")); traceProducer = getAndCreateTraceProducer(rpcHook); } @@ -103,11 +104,11 @@ public class AsyncTraceDispatcher implements TraceDispatcher { public void setTraceTopicName(String traceTopicName) { this.traceTopicName = traceTopicName; } - + public DefaultMQProducer getTraceProducer() { return traceProducer; } - + public DefaultMQProducerImpl getHostProducer() { return hostProducer; } @@ -127,6 +128,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { public void start(String nameSrvAddr) throws MQClientException { if (isStarted.compareAndSet(false, true)) { traceProducer.setNamesrvAddr(nameSrvAddr); + traceProducer.setInstanceName(TRACE_INSTANCE_NAME + "_" + nameSrvAddr); traceProducer.start(); } this.worker = new Thread(new AsyncRunnable(), "MQ-AsyncTraceDispatcher-Thread-" + dispatcherId); @@ -141,7 +143,6 @@ public class AsyncTraceDispatcher implements TraceDispatcher { traceProducerInstance = new DefaultMQProducer(rpcHook); traceProducerInstance.setProducerGroup(TraceConstants.GROUP_NAME); traceProducerInstance.setSendMsgTimeout(5000); - traceProducerInstance.setInstanceName(TRACE_INSTANCE_NAME); traceProducerInstance.setVipChannelEnabled(false); // The max size of message is 128K traceProducerInstance.setMaxMessageSize(maxMsgSize - 10 * 1000); @@ -256,7 +257,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { public void run() { sendTraceData(contextList); } - + public void sendTraceData(List contextList) { Map> transBeanMap = new HashMap>(); for (TraceContext context : contextList) { diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java index 6dcceeb5c0..903be01cdd 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/DefaultMQProducerWithTraceTest.java @@ -17,12 +17,6 @@ package org.apache.rocketmq.client.trace; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import org.apache.rocketmq.client.ClientConfig; import org.apache.rocketmq.client.exception.MQBrokerException; import org.apache.rocketmq.client.exception.MQClientException; @@ -52,11 +46,14 @@ import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.nullable; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) @@ -67,11 +64,6 @@ public class DefaultMQProducerWithTraceTest { @Mock private MQClientAPIImpl mQClientAPIImpl; - @Spy - private MQClientInstance mQClientTraceFactory = MQClientManager.getInstance().getAndCreateMQClientInstance(new ClientConfig()); - @Mock - private MQClientAPIImpl mQClientTraceAPIImpl; - private AsyncTraceDispatcher asyncTraceDispatcher; private DefaultMQProducer producer; @@ -89,56 +81,52 @@ public class DefaultMQProducerWithTraceTest { @Before public void init() throws Exception { - customTraceTopicproducer = new DefaultMQProducer(producerGroupTemp,false, customerTraceTopic); - normalProducer = new DefaultMQProducer(producerGroupTemp,false,""); - producer = new DefaultMQProducer(producerGroupTemp,true,""); + customTraceTopicproducer = new DefaultMQProducer(producerGroupTemp, false, customerTraceTopic); + normalProducer = new DefaultMQProducer(producerGroupTemp, false, ""); + producer = new DefaultMQProducer(producerGroupTemp, true, ""); producer.setNamesrvAddr("127.0.0.1:9876"); normalProducer.setNamesrvAddr("127.0.0.1:9877"); customTraceTopicproducer.setNamesrvAddr("127.0.0.1:9878"); - message = new Message(topic, new byte[] {'a', 'b' ,'c'}); - asyncTraceDispatcher = (AsyncTraceDispatcher)producer.getTraceDispatcher(); + message = new Message(topic, new byte[]{'a', 'b', 'c'}); + asyncTraceDispatcher = (AsyncTraceDispatcher) producer.getTraceDispatcher(); asyncTraceDispatcher.setTraceTopicName(customerTraceTopic); asyncTraceDispatcher.getHostProducer(); asyncTraceDispatcher.getHostConsumer(); traceProducer = asyncTraceDispatcher.getTraceProducer(); producer.start(); - + Field field = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); field.setAccessible(true); field.set(producer.getDefaultMQProducerImpl(), mQClientFactory); Field fieldTrace = DefaultMQProducerImpl.class.getDeclaredField("mQClientFactory"); fieldTrace.setAccessible(true); - fieldTrace.set(traceProducer.getDefaultMQProducerImpl(), mQClientTraceFactory); + fieldTrace.set(traceProducer.getDefaultMQProducerImpl(), mQClientFactory); field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); field.setAccessible(true); field.set(mQClientFactory, mQClientAPIImpl); - field = MQClientInstance.class.getDeclaredField("mQClientAPIImpl"); - field.setAccessible(true); - field.set(mQClientTraceFactory, mQClientTraceAPIImpl); producer.getDefaultMQProducerImpl().getmQClientFactory().registerProducer(producerGroupTemp, producer.getDefaultMQProducerImpl()); when(mQClientAPIImpl.sendMessage(anyString(), anyString(), any(Message.class), any(SendMessageRequestHeader.class), anyLong(), any(CommunicationMode.class), - nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))).thenCallRealMethod(); + nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))).thenCallRealMethod(); when(mQClientAPIImpl.sendMessage(anyString(), anyString(), any(Message.class), any(SendMessageRequestHeader.class), anyLong(), any(CommunicationMode.class), - nullable(SendCallback.class), nullable(TopicPublishInfo.class), nullable(MQClientInstance.class), anyInt(), nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))) - .thenReturn(createSendResult(SendStatus.SEND_OK)); - + nullable(SendCallback.class), nullable(TopicPublishInfo.class), nullable(MQClientInstance.class), anyInt(), nullable(SendMessageContext.class), any(DefaultMQProducerImpl.class))) + .thenReturn(createSendResult(SendStatus.SEND_OK)); + } @Test public void testSendMessageSync_WithTrace_Success() throws RemotingException, InterruptedException, MQBrokerException, MQClientException { traceProducer.getDefaultMQProducerImpl().getmQClientFactory().registerProducer(producerGroupTraceTemp, traceProducer.getDefaultMQProducerImpl()); when(mQClientAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); - when(mQClientTraceAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTraceTopicRoute()); final CountDownLatch countDownLatch = new CountDownLatch(1); try { producer.send(message); - }catch (MQClientException e){ + } catch (MQClientException e) { } countDownLatch.await(3000L, TimeUnit.MILLISECONDS); @@ -147,11 +135,10 @@ public class DefaultMQProducerWithTraceTest { @Test public void testSendMessageSync_WithTrace_NoBrokerSet_Exception() throws RemotingException, InterruptedException, MQBrokerException, MQClientException { when(mQClientAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTopicRoute()); - when(mQClientTraceAPIImpl.getTopicRouteInfoFromNameServer(anyString(), anyLong())).thenReturn(createTraceTopicRoute()); final CountDownLatch countDownLatch = new CountDownLatch(1); try { producer.send(message); - }catch (MQClientException e){ + } catch (MQClientException e) { } countDownLatch.await(3000L, TimeUnit.MILLISECONDS); From 012723fc53482384b20172dbc8ee28149d0b9095 Mon Sep 17 00:00:00 2001 From: ShannonDing Date: Thu, 17 Jan 2019 18:48:37 +0800 Subject: [PATCH 95/96] Pre release 4.4.0 --- common/src/main/java/org/apache/rocketmq/common/MQVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/org/apache/rocketmq/common/MQVersion.java b/common/src/main/java/org/apache/rocketmq/common/MQVersion.java index 6c2712d611..e67b6e7d13 100644 --- a/common/src/main/java/org/apache/rocketmq/common/MQVersion.java +++ b/common/src/main/java/org/apache/rocketmq/common/MQVersion.java @@ -18,7 +18,7 @@ package org.apache.rocketmq.common; public class MQVersion { - public static final int CURRENT_VERSION = Version.V4_3_1.ordinal(); + public static final int CURRENT_VERSION = Version.V4_4_0.ordinal(); public static String getVersionDesc(int value) { int length = Version.values().length; From f61fd5c73f58589c47061bb78fc6693b6402ecc3 Mon Sep 17 00:00:00 2001 From: duhenglucky Date: Thu, 17 Jan 2019 19:57:42 +0800 Subject: [PATCH 96/96] [maven-release-plugin] prepare release rocketmq-all-4.4.0 --- acl/pom.xml | 6 ++---- broker/pom.xml | 6 ++---- client/pom.xml | 2 +- common/pom.xml | 2 +- distribution/pom.xml | 2 +- example/pom.xml | 6 +++--- filter/pom.xml | 2 +- logappender/pom.xml | 2 +- logging/pom.xml | 2 +- namesrv/pom.xml | 2 +- openmessaging/pom.xml | 2 +- pom.xml | 9 ++++----- remoting/pom.xml | 2 +- srvutil/pom.xml | 2 +- store/pom.xml | 2 +- test/pom.xml | 2 +- tools/pom.xml | 5 ++--- 17 files changed, 25 insertions(+), 31 deletions(-) diff --git a/acl/pom.xml b/acl/pom.xml index 4978ad5e9c..ae4de04429 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -8,14 +8,12 @@ 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. --> - + 4.0.0 org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 rocketmq-acl rocketmq-acl ${project.version} diff --git a/broker/pom.xml b/broker/pom.xml index f617d2492d..6a655931ae 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -9,13 +9,11 @@ OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - + org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/client/pom.xml b/client/pom.xml index da6f53a874..2a7444a1d2 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/common/pom.xml b/common/pom.xml index 62c6d7eb5c..39986b4846 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/distribution/pom.xml b/distribution/pom.xml index c4d3b955c6..5fbe917cfd 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -20,7 +20,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 rocketmq-distribution rocketmq-distribution ${project.version} diff --git a/example/pom.xml b/example/pom.xml index 1a4065770b..060715f7ef 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 @@ -51,12 +51,12 @@ org.apache.rocketmq rocketmq-openmessaging - 4.4.0-SNAPSHOT + 4.4.0 org.apache.rocketmq rocketmq-acl - 4.4.0-SNAPSHOT + 4.4.0 diff --git a/filter/pom.xml b/filter/pom.xml index 0134f03d0e..e684bbfede 100644 --- a/filter/pom.xml +++ b/filter/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/logappender/pom.xml b/logappender/pom.xml index c250e59e5b..21ef2ddbe1 100644 --- a/logappender/pom.xml +++ b/logappender/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 rocketmq-logappender diff --git a/logging/pom.xml b/logging/pom.xml index a52b9d0ac6..1d0c3e8dd3 100644 --- a/logging/pom.xml +++ b/logging/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/namesrv/pom.xml b/namesrv/pom.xml index 79f0abdc81..a058452450 100644 --- a/namesrv/pom.xml +++ b/namesrv/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/openmessaging/pom.xml b/openmessaging/pom.xml index 2850b1f2e1..932ea700b4 100644 --- a/openmessaging/pom.xml +++ b/openmessaging/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/pom.xml b/pom.xml index 5de0465b66..ff33ace91e 100644 --- a/pom.xml +++ b/pom.xml @@ -16,8 +16,7 @@ limitations under the License. --> - + org.apache @@ -30,7 +29,7 @@ 2012 org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 pom Apache RocketMQ ${project.version} http://rocketmq.apache.org/ @@ -43,7 +42,7 @@ git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git - HEAD + rocketmq-all-4.4.0 @@ -159,7 +158,7 @@ - + true diff --git a/remoting/pom.xml b/remoting/pom.xml index 55d92f3705..50a52b5549 100644 --- a/remoting/pom.xml +++ b/remoting/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/srvutil/pom.xml b/srvutil/pom.xml index 73229ac9b1..de5e7d94fb 100644 --- a/srvutil/pom.xml +++ b/srvutil/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/store/pom.xml b/store/pom.xml index 59be3739de..5dac3d49f2 100644 --- a/store/pom.xml +++ b/store/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 08d26b3e29..995f86db04 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.4.0-SNAPSHOT + 4.4.0 4.0.0 diff --git a/tools/pom.xml b/tools/pom.xml index a4a8630b13..cecb5c75c6 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -15,12 +15,11 @@ limitations under the License. --> - + org.apache.rocketmq rocketmq-all - 4.4.0-SNAPSHOT + 4.4.0 4.0.0