You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by li...@apache.org on 2024/11/08 10:38:10 UTC

(shenyu) branch master updated: [type:fix] fix client register validation (#5764)

This is an automated email from the ASF dual-hosted git repository.

liuhongyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new ab8723893b [type:fix] fix client register validation (#5764)
ab8723893b is described below

commit ab8723893b44817df4d61d626145970c81d8f975
Author: moremind <he...@apache.org>
AuthorDate: Fri Nov 8 18:38:04 2024 +0800

    [type:fix] fix client register validation (#5764)
    
    * [type:fix] fix client register validation
    
    * [type:fix] fix client register validation
    
    * [type:fix] fix client register validation
    
    * [type:fix] fix client register validation
    
    * [type:fix] fix client register validation
    
    * [type:fix] fix client register validation
    
    * [type:fix] fix client register validation
    
    * [type:fix] fix sql error
    
    ---------
    
    Co-authored-by: liuhy <li...@apache.org>
---
 .../AbstractContextPathRegisterService.java        |  1 +
 .../AbstractShenyuClientRegisterServiceImpl.java   | 27 ++++++++++++++-
 .../register/ShenyuClientRegisterService.java      |  8 +++++
 .../src/main/resources/sql-script/h2/schema.sql    |  2 +-
 .../AbstractContextPathRegisterServiceTest.java    | 19 ++++++++++
 ...bstractShenyuClientRegisterServiceImplTest.java | 40 ++++++++++++++++++++++
 .../FallbackShenyuClientRegisterServiceTest.java   | 10 ++++++
 7 files changed, 105 insertions(+), 2 deletions(-)

diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/AbstractContextPathRegisterService.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/AbstractContextPathRegisterService.java
index 7e8a009a76..ac72a71c6d 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/AbstractContextPathRegisterService.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/AbstractContextPathRegisterService.java
@@ -41,6 +41,7 @@ public abstract class AbstractContextPathRegisterService extends AbstractShenyuC
 
     @Override
     public void registerContextPath(final MetaDataRegisterDTO dto) {
+        this.checkNamespacePluginRel(dto.getNamespaceId(), PluginEnum.CONTEXT_PATH.getName());
         String name = PluginEnum.CONTEXT_PATH.getName();
         String contextPath = PathUtils.decoratorContextPath(dto.getContextPath());
         String key = LOCK_KEY_PREFIX + contextPath;
diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/AbstractShenyuClientRegisterServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/AbstractShenyuClientRegisterServiceImpl.java
index 0c3e6a18cf..39433c46ae 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/AbstractShenyuClientRegisterServiceImpl.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/AbstractShenyuClientRegisterServiceImpl.java
@@ -21,10 +21,14 @@ import jakarta.annotation.Resource;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.listener.DataChangedEvent;
+import org.apache.shenyu.admin.mapper.NamespacePluginRelMapper;
+import org.apache.shenyu.admin.mapper.PluginMapper;
 import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
 import org.apache.shenyu.admin.model.dto.RuleConditionDTO;
 import org.apache.shenyu.admin.model.dto.RuleDTO;
+import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.admin.model.entity.SelectorDO;
+import org.apache.shenyu.admin.model.vo.NamespacePluginVO;
 import org.apache.shenyu.admin.service.DiscoveryService;
 import org.apache.shenyu.admin.service.DiscoveryUpstreamService;
 import org.apache.shenyu.admin.service.MetaDataService;
@@ -101,6 +105,12 @@ public abstract class AbstractShenyuClientRegisterServiceImpl extends FallbackSh
     @Resource
     private DiscoveryUpstreamService discoveryUpstreamService;
 
+    @Resource
+    private PluginMapper pluginMapper;
+
+    @Resource
+    private NamespacePluginRelMapper namespacePluginRelMapper;
+
     /**
      * Selector handler string.
      *
@@ -141,6 +151,8 @@ public abstract class AbstractShenyuClientRegisterServiceImpl extends FallbackSh
     @Override
     public String register(final MetaDataRegisterDTO dto) {
         String namespaceId = StringUtils.defaultIfEmpty(dto.getNamespaceId(), SYS_DEFAULT_NAMESPACE_ID);
+        String pluginName = PluginNameAdapter.rpcTypeAdapter(rpcType());
+        this.checkNamespacePluginRel(namespaceId, pluginName);
         dto.setNamespaceId(namespaceId);
         //handler plugin selector
         String selectorHandler = selectorHandler(dto);
@@ -183,10 +195,13 @@ public abstract class AbstractShenyuClientRegisterServiceImpl extends FallbackSh
         if (Objects.isNull(selectorDO)) {
             throw new ShenyuException("doRegister Failed to execute, wait to retry.");
         }
+        this.checkNamespacePluginRel(namespaceId, pluginName);
         // fetch UPSTREAM_MAP data from db
         //upstreamCheckService.fetchUpstreamData();
         //update upstream
-        List<URIRegisterDTO> validUriList = uriList.stream().filter(dto -> Objects.nonNull(dto.getPort()) && StringUtils.isNotBlank(dto.getHost())).collect(Collectors.toList());
+        List<URIRegisterDTO> validUriList = uriList.stream()
+                .filter(dto -> Objects.nonNull(dto.getPort()) && StringUtils.isNotBlank(dto.getHost()))
+                .collect(Collectors.toList());
         String handler = buildHandle(validUriList, selectorDO);
         if (handler != null) {
             selectorDO.setHandle(handler);
@@ -199,6 +214,16 @@ public abstract class AbstractShenyuClientRegisterServiceImpl extends FallbackSh
         }
         return ShenyuResultMessage.SUCCESS;
     }
+
+    @Override
+    public void checkNamespacePluginRel(final String namespaceId, final String pluginName) {
+        PluginDO pluginDO = pluginMapper.selectByName(pluginName);
+        NamespacePluginVO namespacePluginRelation = namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginDO.getId(), namespaceId);
+        if (Objects.isNull(namespacePluginRelation)) {
+            String errorMsg = String.format("%s plugin not enabled for current namespace or plugin not exist for namespaceId: %s", pluginName, namespaceId);
+            throw new IllegalArgumentException(errorMsg);
+        }
+    }
     
     @Override
     public String doHeartbeat(final String selectorName, final List<URIRegisterDTO> uriList, final String namespaceId) {
diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/ShenyuClientRegisterService.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/ShenyuClientRegisterService.java
index 4abf235796..5e439ded95 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/ShenyuClientRegisterService.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/ShenyuClientRegisterService.java
@@ -50,6 +50,14 @@ public interface ShenyuClientRegisterService {
      * @return String
      */
     String registerApiDoc(ApiDocRegisterDTO apiDocRegisterDTO);
+
+    /**
+     * check whether the namespace and plugin relation exists.
+     *
+     * @param namespaceId namespaceId
+     * @param pluginName plugin name
+     */
+    void checkNamespacePluginRel(String namespaceId, String pluginName);
     
     /**
      * Register uri string.
diff --git a/shenyu-admin/src/main/resources/sql-script/h2/schema.sql b/shenyu-admin/src/main/resources/sql-script/h2/schema.sql
index 74d3f3e458..68c16a6af3 100755
--- a/shenyu-admin/src/main/resources/sql-script/h2/schema.sql
+++ b/shenyu-admin/src/main/resources/sql-script/h2/schema.sql
@@ -1418,7 +1418,7 @@ CREATE TABLE IF NOT EXISTS `namespace_user_rel`
     `namespace_id`   varchar(50)  NOT NULL COMMENT 'namespace_id',
     `user_id`        varchar(128)  NOT NULL COMMENT 'user_id',
     `date_created`   timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'date_created',
-    `date_updated`   timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'date_updated'
+    `date_updated`   timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'date_updated',
     PRIMARY KEY (`id`)
 );
 
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/AbstractContextPathRegisterServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/AbstractContextPathRegisterServiceTest.java
index 524f637250..99a40b5222 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/AbstractContextPathRegisterServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/AbstractContextPathRegisterServiceTest.java
@@ -17,9 +17,14 @@
 
 package org.apache.shenyu.admin.service.register;
 
+import org.apache.shenyu.admin.mapper.NamespacePluginRelMapper;
+import org.apache.shenyu.admin.mapper.PluginMapper;
+import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.admin.model.entity.SelectorDO;
+import org.apache.shenyu.admin.model.vo.NamespacePluginVO;
 import org.apache.shenyu.admin.service.impl.RuleServiceImpl;
 import org.apache.shenyu.admin.service.impl.SelectorServiceImpl;
+import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
 import org.apache.shenyu.register.common.dto.URIRegisterDTO;
@@ -60,17 +65,31 @@ class AbstractContextPathRegisterServiceTest {
     @Mock
     private LockRegistry registry;
 
+    @Mock
+    private NamespacePluginRelMapper namespacePluginRelMapper;
+
+    @Mock
+    private PluginMapper pluginMapper;
+
     @Test
     public void testRegisterContextPath() {
         MetaDataRegisterDTO dto = MetaDataRegisterDTO.builder().build();
         dto.setContextPath("Context_Path");
         dto.setAddPrefixed(true);
+        dto.setNamespaceId(Constants.SYS_DEFAULT_NAMESPACE_ID);
         when(selectorService.registerDefault(dto, PluginEnum.CONTEXT_PATH.getName(), "")).thenReturn("Context_Path_Selector_Id");
         // org.springframework.integration.jdbc.lock.JdbcLockRegistry.JdbcLock is private and cannot be mocked directly so we mock the LockRegistry and return a mock MockLock
         // here  mock ReentrantLock   cause cpu usage 100% in the jdk 19 20 21 environment
         when(registry.obtain(any())).thenReturn(mock(MockLock.class));
         when(ruleService.findBySelectorIdAndName("Context_Path_Selector_Id", "Context_Path")).thenReturn(null);
         when(ruleService.registerDefault(any())).thenReturn("Context_Path_Rule_Id");
+        PluginDO pluginDO = new PluginDO();
+        pluginDO.setId("1");
+        pluginDO.setName(PluginEnum.CONTEXT_PATH.getName());
+        when(pluginMapper.selectByName(PluginEnum.CONTEXT_PATH.getName())).thenReturn(pluginDO);
+        NamespacePluginVO namespacePluginVO = new NamespacePluginVO();
+        namespacePluginVO.setPluginId("1");
+        when(namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginDO.getId(), Constants.SYS_DEFAULT_NAMESPACE_ID)).thenReturn(namespacePluginVO);
         abstractContextPathRegisterService.registerContextPath(dto);
         verify(ruleService).registerDefault(any());
     }
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/AbstractShenyuClientRegisterServiceImplTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/AbstractShenyuClientRegisterServiceImplTest.java
index d88211aa34..b79b1cc58a 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/AbstractShenyuClientRegisterServiceImplTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/AbstractShenyuClientRegisterServiceImplTest.java
@@ -18,8 +18,12 @@
 package org.apache.shenyu.admin.service.register;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.mapper.NamespacePluginRelMapper;
+import org.apache.shenyu.admin.mapper.PluginMapper;
 import org.apache.shenyu.admin.model.dto.RuleDTO;
+import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.admin.model.entity.SelectorDO;
+import org.apache.shenyu.admin.model.vo.NamespacePluginVO;
 import org.apache.shenyu.admin.model.vo.TagVO;
 import org.apache.shenyu.admin.service.SelectorService;
 import org.apache.shenyu.admin.service.RuleService;
@@ -29,9 +33,11 @@ import org.apache.shenyu.admin.service.MetaDataService;
 import org.apache.shenyu.admin.service.impl.UpstreamCheckService;
 import org.apache.shenyu.admin.service.manager.RegisterApiDocService;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
+import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.dto.DiscoverySyncData;
 import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.dto.convert.selector.CommonUpstream;
+import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.common.exception.ShenyuException;
 import org.apache.shenyu.register.common.dto.ApiDocRegisterDTO;
 import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
@@ -42,6 +48,8 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
 import org.springframework.context.ApplicationEventPublisher;
 
 import java.util.ArrayList;
@@ -60,6 +68,7 @@ import static org.mockito.Mockito.mock;
  * Test cases for AbstractShenyuClientRegisterServiceImpl.
  */
 @ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
 public final class AbstractShenyuClientRegisterServiceImplTest {
 
     @InjectMocks
@@ -89,11 +98,26 @@ public final class AbstractShenyuClientRegisterServiceImplTest {
     @Mock
     private RegisterApiDocService registerApiDocService;
 
+    @Mock
+    private NamespacePluginRelMapper namespacePluginRelMapper;
+
+    @Mock
+    private PluginMapper pluginMapper;
+
     @Test
     public void testRegister() {
         MetaDataRegisterDTO dto = MetaDataRegisterDTO.builder().build();
         dto.setContextPath("Context_Path");
         dto.setPath("Path");
+        dto.setNamespaceId(Constants.SYS_DEFAULT_NAMESPACE_ID);
+        PluginDO pluginDO = new PluginDO();
+        pluginDO.setId("1");
+        pluginDO.setName(PluginEnum.GRPC.getName());
+        when(pluginMapper.selectByName(PluginEnum.GRPC.getName())).thenReturn(pluginDO);
+        NamespacePluginVO namespacePluginVO = new NamespacePluginVO();
+        namespacePluginVO.setPluginId("1");
+        namespacePluginVO.setNamespaceId(Constants.SYS_DEFAULT_NAMESPACE_ID);
+        when(namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginDO.getId(), Constants.SYS_DEFAULT_NAMESPACE_ID)).thenReturn(namespacePluginVO);
         when(selectorService.registerDefault(any(), any(), any())).thenReturn("SELECTOR_ID");
         assertEquals(ShenyuResultMessage.SUCCESS, abstractShenyuClientRegisterService.register(dto));
 
@@ -137,6 +161,14 @@ public final class AbstractShenyuClientRegisterServiceImplTest {
 
     @Test
     public void testDoRegisterURI() {
+        PluginDO pluginDO = new PluginDO();
+        pluginDO.setId("1");
+        pluginDO.setName(PluginEnum.GRPC.getName());
+        when(pluginMapper.selectByName(PluginEnum.GRPC.getName())).thenReturn(pluginDO);
+        NamespacePluginVO namespacePluginVO = new NamespacePluginVO();
+        namespacePluginVO.setPluginId("1");
+        namespacePluginVO.setNamespaceId(Constants.SYS_DEFAULT_NAMESPACE_ID);
+        when(namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginDO.getId(), Constants.SYS_DEFAULT_NAMESPACE_ID)).thenReturn(namespacePluginVO);
         assertEquals(StringUtils.EMPTY, abstractShenyuClientRegisterService.doRegisterURI("Selector_Name", new ArrayList<>(), SYS_DEFAULT_NAMESPACE_ID));
 
         URIRegisterDTO uriRegisterDTO = URIRegisterDTO.builder().build();
@@ -148,6 +180,14 @@ public final class AbstractShenyuClientRegisterServiceImplTest {
         when(selectorService.findByNameAndPluginNameAndNamespaceId(any(), any(), any())).thenReturn(selectorDO);
         SelectorData selectorData = new SelectorData();
         when(selectorService.buildByNameAndPluginNameAndNamespaceId(any(), any(), any())).thenReturn(selectorData);
+        PluginDO plugin = new PluginDO();
+        plugin.setId("1");
+        plugin.setName(PluginEnum.GRPC.getName());
+        when(pluginMapper.selectByName(PluginEnum.GRPC.getName())).thenReturn(plugin);
+        NamespacePluginVO namespacePlugin = new NamespacePluginVO();
+        namespacePlugin.setPluginId("1");
+        namespacePlugin.setNamespaceId(Constants.SYS_DEFAULT_NAMESPACE_ID);
+        when(namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginDO.getId(), Constants.SYS_DEFAULT_NAMESPACE_ID)).thenReturn(namespacePlugin);
         assertEquals(ShenyuResultMessage.SUCCESS, abstractShenyuClientRegisterService.doRegisterURI("Selector_Name", Collections.singletonList(uriRegisterDTO), SYS_DEFAULT_NAMESPACE_ID));
     }
 
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/FallbackShenyuClientRegisterServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/FallbackShenyuClientRegisterServiceTest.java
index 4880c749b6..7def1cb009 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/FallbackShenyuClientRegisterServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/register/FallbackShenyuClientRegisterServiceTest.java
@@ -70,6 +70,11 @@ class FallbackShenyuClientRegisterServiceTest {
         public String registerApiDoc(final ApiDocRegisterDTO apiDocRegisterDTO) {
             return null;
         }
+
+        @Override
+        public void checkNamespacePluginRel(final String namespaceId, final String pluginName) {
+
+        }
     }
 
     static class MockFallbackShenyuClientRegisterServiceException extends FallbackShenyuClientRegisterService {
@@ -98,5 +103,10 @@ class FallbackShenyuClientRegisterServiceTest {
         public String registerApiDoc(final ApiDocRegisterDTO apiDocRegisterDTO) {
             return null;
         }
+
+        @Override
+        public void checkNamespacePluginRel(final String namespaceId, final String pluginName) {
+
+        }
     }
 }