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) {
+
+ }
}
}