|
6 | 6 | import static org.lowcoder.sdk.util.ExceptionUtils.deferredError;
|
7 | 7 | import static org.lowcoder.sdk.util.ExceptionUtils.ofError;
|
8 | 8 |
|
9 |
| -import java.util.HashSet; |
10 |
| -import java.util.List; |
11 |
| -import java.util.Map; |
| 9 | +import java.util.*; |
12 | 10 |
|
13 | 11 | import org.apache.commons.collections4.CollectionUtils;
|
14 | 12 | import org.apache.commons.lang3.StringUtils;
|
|
23 | 21 | import org.lowcoder.api.usermanagement.OrgDevChecker;
|
24 | 22 | import org.lowcoder.api.util.BusinessEventPublisher;
|
25 | 23 | import org.lowcoder.api.util.ViewBuilder;
|
| 24 | +import org.lowcoder.domain.authentication.AuthenticationService; |
26 | 25 | import org.lowcoder.domain.datasource.model.Datasource;
|
27 | 26 | import org.lowcoder.domain.datasource.service.DatasourceService;
|
28 | 27 | import org.lowcoder.domain.organization.model.OrgMember;
|
|
35 | 34 | import org.lowcoder.domain.query.service.LibraryQueryRecordService;
|
36 | 35 | import org.lowcoder.domain.query.service.LibraryQueryService;
|
37 | 36 | import org.lowcoder.domain.query.service.QueryExecutionService;
|
| 37 | +import org.lowcoder.domain.user.model.Connection; |
38 | 38 | import org.lowcoder.domain.user.model.User;
|
39 | 39 | import org.lowcoder.domain.user.service.UserService;
|
40 | 40 | import org.lowcoder.sdk.config.CommonConfig;
|
41 | 41 | import org.lowcoder.sdk.exception.BizError;
|
42 | 42 | import org.lowcoder.sdk.exception.PluginCommonError;
|
43 | 43 | import org.lowcoder.sdk.models.Property;
|
44 | 44 | import org.lowcoder.sdk.models.QueryExecutionResult;
|
| 45 | +import org.lowcoder.sdk.plugin.restapi.RestApiDatasourceConfig; |
| 46 | +import org.lowcoder.sdk.plugin.restapi.auth.OAuthInheritAuthConfig; |
45 | 47 | import org.lowcoder.sdk.query.QueryVisitorContext;
|
46 | 48 | import org.springframework.beans.factory.annotation.Autowired;
|
47 | 49 | import org.springframework.beans.factory.annotation.Value;
|
@@ -87,6 +89,9 @@ public class LibraryQueryApiService {
|
87 | 89 | @Autowired
|
88 | 90 | private CommonConfig commonConfig;
|
89 | 91 |
|
| 92 | + @Autowired |
| 93 | + private AuthenticationService authenticationService; |
| 94 | + |
90 | 95 | @Value("${server.port}")
|
91 | 96 | private int port;
|
92 | 97 |
|
@@ -245,15 +250,19 @@ public Mono<QueryExecutionResult> executeLibraryQueryFromJs(ServerWebExchange ex
|
245 | 250 |
|
246 | 251 | Mono<OrgMember> visitorOrgMemberCache = sessionUserService.getVisitorOrgMemberCache()
|
247 | 252 | .onErrorReturn(NOT_EXIST);
|
248 |
| - return Mono.zip(visitorOrgMemberCache, baseQueryMono, datasourceMono) |
| 253 | + |
| 254 | + Mono<User> userMono = sessionUserService.getVisitor(); |
| 255 | + |
| 256 | + return Mono.zip(visitorOrgMemberCache, baseQueryMono, datasourceMono, userMono) |
249 | 257 | .flatMap(tuple -> {
|
250 | 258 | OrgMember orgMember = tuple.getT1();
|
251 | 259 | String orgId = orgMember.getOrgId();
|
252 | 260 | String userId = orgMember.getUserId();
|
253 | 261 | BaseQuery baseQuery = tuple.getT2();
|
254 | 262 | Datasource datasource = tuple.getT3();
|
| 263 | + User user = tuple.getT4(); |
255 | 264 | Mono<List<Property>> paramsAndHeadersInheritFromLogin = orgMember.isInvalid()
|
256 |
| - ? Mono.empty() : getParamsAndHeadersInheritFromLogin(userId, orgId); |
| 265 | + ? Mono.empty() : getParamsAndHeadersInheritFromLogin(user, null); |
257 | 266 |
|
258 | 267 | QueryVisitorContext queryVisitorContext = new QueryVisitorContext(userId, orgId, port,
|
259 | 268 | exchange.getRequest().getCookies(),
|
@@ -284,17 +293,31 @@ public Mono<QueryExecutionResult> executeLibraryQuery(ServerWebExchange exchange
|
284 | 293 | Mono<Datasource> datasourceMono = baseQueryMono.flatMap(query -> datasourceService.getById(query.getDatasourceId())
|
285 | 294 | .switchIfEmpty(deferredError(BizError.DATASOURCE_NOT_FOUND, "DATASOURCE_NOT_FOUND", query.getDatasourceId()))).cache();
|
286 | 295 |
|
| 296 | + Mono<User> userMono = sessionUserService.getVisitor(); |
| 297 | + |
287 | 298 | return orgDevChecker.checkCurrentOrgDev()
|
288 | 299 | .then(Mono.zip(sessionUserService.getVisitorOrgMemberCache(),
|
289 |
| - baseQueryMono, datasourceMono)) |
| 300 | + baseQueryMono, datasourceMono, userMono)) |
290 | 301 | .flatMap(tuple -> {
|
291 | 302 | OrgMember orgMember = tuple.getT1();
|
292 | 303 | String orgId = orgMember.getOrgId();
|
293 | 304 | String userId = orgMember.getUserId();
|
294 | 305 | BaseQuery baseQuery = tuple.getT2();
|
295 | 306 | Datasource datasource = tuple.getT3();
|
296 |
| - Mono<List<Property>> paramsAndHeadersInheritFromLogin = |
297 |
| - getParamsAndHeadersInheritFromLogin(userId, orgId); |
| 307 | + User user = tuple.getT4(); |
| 308 | + |
| 309 | + Mono<List<Property>> paramsAndHeadersInheritFromLogin = Mono.empty(); |
| 310 | + |
| 311 | + if (datasource.isRestApi()) { |
| 312 | + // then check if oauth inherited from login and save token |
| 313 | + if(datasource.getDetailConfig() instanceof RestApiDatasourceConfig restApiDatasourceConfig |
| 314 | + && restApiDatasourceConfig.isOauth2InheritFromLogin()) { |
| 315 | + paramsAndHeadersInheritFromLogin = getParamsAndHeadersInheritFromLogin |
| 316 | + (user, ((OAuthInheritAuthConfig)restApiDatasourceConfig.getAuthConfig()).getAuthId()); |
| 317 | + |
| 318 | + } |
| 319 | + } |
| 320 | + |
298 | 321 | QueryVisitorContext queryVisitorContext = new QueryVisitorContext(userId, orgId, port, cookies, paramsAndHeadersInheritFromLogin,
|
299 | 322 | commonConfig.getDisallowedHosts());
|
300 | 323 | Map<String, Object> queryConfig = baseQuery.getQueryConfig();
|
@@ -322,8 +345,15 @@ private Mono<BaseQuery> getBaseQuery(LibraryQueryCombineId libraryQueryCombineId
|
322 | 345 | .map(LibraryQueryRecord::getQuery);
|
323 | 346 | }
|
324 | 347 |
|
325 |
| - protected Mono<List<Property>> getParamsAndHeadersInheritFromLogin(String userId, String orgId) { |
326 |
| - return Mono.empty(); |
| 348 | + protected Mono<List<Property>> getParamsAndHeadersInheritFromLogin(User user, String authId) { |
| 349 | + Optional<Connection> activeConnectionOptional = user.getConnections() |
| 350 | + .stream() |
| 351 | + .filter(connection -> connection.getAuthId().equals(authId)) |
| 352 | + .findFirst(); |
| 353 | + if(!activeConnectionOptional.isPresent() || activeConnectionOptional.get().getAuthConnectionAuthToken() == null) { |
| 354 | + return Mono.empty(); |
| 355 | + } |
| 356 | + return Mono.just(Collections.singletonList(new Property("Authorization","Bearer " + activeConnectionOptional.get().getAuthConnectionAuthToken().getAccessToken(),"header"))); |
327 | 357 | }
|
328 | 358 |
|
329 | 359 | protected void onNextOrError(QueryExecutionRequest queryExecutionRequest, QueryVisitorContext queryVisitorContext, BaseQuery baseQuery,
|
|
0 commit comments