Skip to content

Commit 9b68c08

Browse files
committed
1. fix sanitize query for js data source
2. fix issue that library query doesn't show when imported from other workspaces in SAAS mode 3. fix: none exist datasource permission check for library-query list and application save
1 parent 3aeb4e9 commit 9b68c08

File tree

8 files changed

+71
-10
lines changed

8 files changed

+71
-10
lines changed

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/datasource/repository/DatasourceRepository.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
import static com.openblocks.sdk.util.JsonUtils.fromJsonMap;
44
import static com.openblocks.sdk.util.JsonUtils.toJson;
55

6+
import java.util.Collection;
7+
import java.util.HashSet;
8+
import java.util.Set;
9+
import java.util.function.Function;
10+
11+
import org.apache.commons.collections4.CollectionUtils;
612
import org.springframework.beans.factory.annotation.Autowired;
713
import org.springframework.stereotype.Repository;
814

@@ -16,6 +22,7 @@
1622
import com.openblocks.domain.plugin.service.DatasourceMetaInfoService;
1723
import com.openblocks.infra.mongo.MongoUpsertHelper;
1824
import com.openblocks.sdk.models.DatasourceConnectionConfig;
25+
import com.openblocks.sdk.models.HasIdAndAuditing;
1926
import com.openblocks.sdk.models.JsDatasourceConnectionConfig;
2027
import com.openblocks.sdk.util.JsonUtils;
2128

@@ -77,6 +84,23 @@ public Mono<Boolean> markDatasourceAsDeleted(String datasourceId) {
7784
return mongoUpsertHelper.updateById(datasource, datasourceId);
7885
}
7986

87+
public Flux<String> retainNoneExistAndNonCurrentOrgDatasourceIds(Collection<String> datasourceIds, String orgId) {
88+
if (CollectionUtils.isEmpty(datasourceIds)) {
89+
return Flux.empty();
90+
}
91+
return repository.findAllById(new HashSet<>(datasourceIds))
92+
.collectList()
93+
.map(existDatasources -> {
94+
Set<String> result = new HashSet<>(datasourceIds);
95+
existDatasources.stream()
96+
.filter(datasource -> datasource.getOrganizationId().equals(orgId))
97+
.map(HasIdAndAuditing::getId)
98+
.forEach(result::remove);
99+
return result;
100+
})
101+
.flatMapIterable(Function.identity());
102+
}
103+
80104
public Mono<Long> countByOrganizationId(String orgId) {
81105
return repository.countByOrganizationId(orgId);
82106
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/datasource/service/DatasourceService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.openblocks.domain.datasource.service;
22

3+
import java.util.Collection;
4+
35
import com.openblocks.domain.datasource.model.Datasource;
46
import com.openblocks.sdk.models.DatasourceTestResult;
57

@@ -25,4 +27,6 @@ public interface DatasourceService {
2527
Mono<Long> countByOrganizationId(String orgId);
2628

2729
Mono<Datasource> findWorkspacePredefinedDatasource(String organizationId, String datasourceType);
30+
31+
Flux<String> retainNoneExistAndNonCurrentOrgDatasourceIds(Collection<String> datasourceIds, String organizationId);
2832
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/datasource/service/impl/DatasourceServiceImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
77

88
import java.time.Duration;
9+
import java.util.Collection;
910
import java.util.Locale;
1011
import java.util.Set;
1112
import java.util.stream.Collectors;
1213

1314
import javax.annotation.Nonnull;
1415

16+
import org.apache.commons.collections4.CollectionUtils;
1517
import org.apache.commons.lang3.ObjectUtils;
1618
import org.apache.commons.lang3.StringUtils;
1719
import org.springframework.beans.factory.annotation.Autowired;
@@ -220,6 +222,14 @@ public Mono<Datasource> findWorkspacePredefinedDatasource(String organizationId,
220222
return repository.findWorkspacePredefinedDatasourceByOrgIdAndType(organizationId, type);
221223
}
222224

225+
@Override
226+
public Flux<String> retainNoneExistAndNonCurrentOrgDatasourceIds(Collection<String> datasourceIds, String orgId) {
227+
if (CollectionUtils.isEmpty(datasourceIds)) {
228+
return Flux.empty();
229+
}
230+
return repository.retainNoneExistAndNonCurrentOrgDatasourceIds(datasourceIds, orgId);
231+
}
232+
223233
@Override
224234
public Mono<Boolean> delete(String datasourceId) {
225235
return stillUsedInApplications(datasourceId)

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/plugin/service/impl/DatasourceMetaInfoServiceImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ public List<DatasourceMetaInfo> getJavaBasedSupportedDatasourceMetaInfos() {
158158

159159
@Override
160160
public boolean isJavaDatasourcePlugin(String type) {
161-
return getJavaBasedSupportedDatasourceMetaInfos()
161+
return "majiangInternal".equals(type)
162+
|| "openblocksApi".equals(type)
163+
|| getJavaBasedSupportedDatasourceMetaInfos()
162164
.stream()
163165
.anyMatch(datasourceMetaInfo -> datasourceMetaInfo.getType().equals(type));
164166
}

server/api-service/openblocks-server/src/main/java/com/openblocks/api/application/ApplicationApiService.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.stereotype.Service;
3232

3333
import com.google.common.collect.Maps;
34+
import com.google.common.collect.Sets;
3435
import com.openblocks.api.application.ApplicationController.CreateApplicationRequest;
3536
import com.openblocks.api.application.view.ApplicationInfoView;
3637
import com.openblocks.api.application.view.ApplicationPermissionView;
@@ -47,6 +48,7 @@
4748
import com.openblocks.domain.application.service.ApplicationService;
4849
import com.openblocks.domain.bizthreshold.AbstractBizThresholdChecker;
4950
import com.openblocks.domain.datasource.model.Datasource;
51+
import com.openblocks.domain.datasource.service.DatasourceService;
5052
import com.openblocks.domain.group.service.GroupService;
5153
import com.openblocks.domain.interaction.UserApplicationInteractionService;
5254
import com.openblocks.domain.organization.model.Organization;
@@ -68,6 +70,7 @@
6870
import com.openblocks.sdk.constants.Authentication;
6971
import com.openblocks.sdk.exception.BizError;
7072
import com.openblocks.sdk.exception.BizException;
73+
import com.openblocks.sdk.plugin.common.QueryExecutor;
7174
import com.openblocks.sdk.util.ExceptionUtils;
7275

7376
import lombok.extern.slf4j.Slf4j;
@@ -128,6 +131,8 @@ public class ApplicationApiService {
128131
private TemplateService templateService;
129132
@Autowired
130133
private PermissionHelper permissionHelper;
134+
@Autowired
135+
private DatasourceService datasourceService;
131136

132137
public Mono<ApplicationView> create(CreateApplicationRequest createApplicationRequest) {
133138

@@ -517,7 +522,12 @@ private Map<String, Object> doSanitizeQuery(Object query) {
517522
VIEW_DATASOURCE_TYPE.equalsIgnoreCase(datasourceType)) {
518523
return queryMap;
519524
}
520-
var queryExecutor = datasourceMetaInfoService.getQueryExecutor(datasourceType);
525+
QueryExecutor<?, Object, ?> queryExecutor;
526+
try {
527+
queryExecutor = datasourceMetaInfoService.getQueryExecutor(datasourceType);
528+
} catch (Exception e) {
529+
return queryMap;
530+
}
521531
Object comp = queryMap.get("comp");
522532
if (!(comp instanceof Map<?, ?> queryConfig)) {
523533
return queryMap;
@@ -551,10 +561,15 @@ private Mono<Void> checkDatasourcePermissions(Application application) {
551561
return Mono.empty();
552562
}
553563

564+
String organizationId = application.getOrganizationId();
554565
return sessionUserService.getVisitorId()
555-
.flatMap(userId -> resourcePermissionService.haveAllEnoughPermissions(userId, datasourceIds, USE_DATASOURCES))
556-
.flatMap(havePermissions -> {
557-
if (havePermissions) {
566+
.flatMap(userId -> resourcePermissionService.getMaxMatchingPermission(userId, datasourceIds, USE_DATASOURCES))
567+
.zipWith(datasourceService.retainNoneExistAndNonCurrentOrgDatasourceIds(datasourceIds, organizationId).collectList())
568+
.flatMap(tuple -> {
569+
Set<String> hasPermissionDatasourceIds = tuple.getT1().keySet();
570+
List<String> noneExistDatasourceIds = tuple.getT2();
571+
572+
if (Sets.union(hasPermissionDatasourceIds, new HashSet<>(noneExistDatasourceIds)).containsAll(datasourceIds)) {
558573
return Mono.empty();
559574
}
560575
return ExceptionUtils.ofError(BizError.NOT_AUTHORIZED, "APPLICATION_EDIT_ERROR_LACK_OF_DATASOURCE_PERMISSIONS");

server/api-service/openblocks-server/src/main/java/com/openblocks/api/query/LibraryQueryApiService.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,21 +103,27 @@ private Flux<LibraryQuery> getByOrgIdWithDatasourcePermissions(String orgId) {
103103
Flux<LibraryQuery> libraryQueryFlux = libraryQueryService.getByOrganizationId(orgId)
104104
.cache();
105105

106-
Mono<HashSet<String>> datasourceIdSetWithPermissions = libraryQueryFlux.map(libraryQuery -> libraryQuery.getQuery().getDatasourceId())
106+
Mono<List<String>> datasourceIdListMono = libraryQueryFlux.map(libraryQuery -> libraryQuery.getQuery().getDatasourceId())
107107
.filter(StringUtils::isNotBlank)
108108
.collectList()
109+
.cache();
110+
111+
Mono<HashSet<String>> datasourceIdSetWithPermissionsOrNoneExists = datasourceIdListMono
109112
.zipWith(sessionUserService.getVisitorId())
110113
.flatMapMany(tuple -> {
111114
List<String> datasourceIds = tuple.getT1();
112115
String userId = tuple.getT2();
113116
return resourcePermissionService.filterResourceWithPermission(userId, datasourceIds, ResourceAction.USE_DATASOURCES);
114117
})
118+
.concatWith(datasourceIdListMono.flatMapMany(
119+
datasourceIds -> datasourceService.retainNoneExistAndNonCurrentOrgDatasourceIds(datasourceIds, orgId)))
115120
.collectList()
116121
.map(HashSet::new)
117122
.cache();
118123

119124
return libraryQueryFlux
120-
.filterWhen(libraryQuery -> datasourceIdSetWithPermissions.map(set -> set.contains(libraryQuery.getQuery().getDatasourceId())));
125+
.filterWhen(libraryQuery -> datasourceIdSetWithPermissionsOrNoneExists.map(
126+
set -> set.contains(libraryQuery.getQuery().getDatasourceId())));
121127
}
122128

123129
public Mono<LibraryQueryView> create(LibraryQuery libraryQuery) {
@@ -275,7 +281,7 @@ public Mono<QueryExecutionResult> executeLibraryQuery(ServerWebExchange exchange
275281
Mono<BaseQuery> baseQueryMono = libraryQueryService.getEditingBaseQueryByLibraryQueryId(
276282
queryExecutionRequest.getLibraryQueryCombineId().libraryQueryId()).cache();
277283
Mono<Datasource> datasourceMono = baseQueryMono.flatMap(query -> datasourceService.getById(query.getDatasourceId())
278-
.switchIfEmpty(deferredError(BizError.DATASOURCE_NOT_FOUND, "DATASOURCE_NOT_FOUND", query.getDatasourceId()))).cache();
284+
.switchIfEmpty(deferredError(BizError.DATASOURCE_NOT_FOUND, "DATASOURCE_NOT_FOUND", query.getDatasourceId()))).cache();
279285

280286
return orgDevChecker.checkCurrentOrgDev()
281287
.then(Mono.zip(sessionUserService.getVisitorOrgMemberCache(),

server/api-service/openblocks-server/src/main/resources/application-openblocks.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ common:
3535
security:
3636
cors-allowed-domains:
3737
- '*'
38-
version: 1.1.3
38+
version: 1.1.4
3939
block-hound-enable: false
4040

4141
material:

server/api-service/openblocks-server/src/main/resources/selfhost/ce/application.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ common:
2727
domain:
2828
default-value: openblocks.dev
2929
cloud: false
30-
version: 1.1.3
30+
version: 1.1.4
3131
block-hound-enable: false
3232

3333
material:

0 commit comments

Comments
 (0)