1616import org .lowcoder .domain .query .service .LibraryQueryRecordService ;
1717import org .lowcoder .domain .query .service .LibraryQueryService ;
1818import org .lowcoder .domain .query .service .QueryExecutionService ;
19+ import org .lowcoder .domain .user .model .Connection ;
20+ import org .lowcoder .domain .user .model .User ;
1921import org .lowcoder .infra .util .TupleUtils ;
2022import org .lowcoder .sdk .config .CommonConfig ;
2123import org .lowcoder .sdk .exception .BizError ;
2224import org .lowcoder .sdk .models .Property ;
2325import org .lowcoder .sdk .models .QueryExecutionResult ;
26+ import org .lowcoder .sdk .plugin .restapi .RestApiDatasourceConfig ;
27+ import org .lowcoder .sdk .plugin .restapi .auth .OAuthInheritAuthConfig ;
2428import org .lowcoder .sdk .query .QueryVisitorContext ;
2529import org .lowcoder .sdk .util .ExceptionUtils ;
2630import org .springframework .beans .factory .annotation .Autowired ;
3337import reactor .core .publisher .Timed ;
3438
3539import javax .annotation .Nullable ;
40+ import java .util .Collections ;
3641import java .util .List ;
42+ import java .util .Optional ;
3743import java .util .stream .Collectors ;
3844
3945import static org .lowcoder .domain .permission .model .ResourceAction .READ_APPLICATIONS ;
@@ -91,12 +97,13 @@ public Mono<QueryExecutionResult> executeApplicationQuery(ServerWebExchange exch
9197 Mono <Datasource > datasourceMono = baseQueryMono .flatMap (query -> datasourceService .getById (query .getDatasourceId ())
9298 .switchIfEmpty (deferredError (BizError .DATASOURCE_NOT_FOUND , "DATASOURCE_NOT_FOUND" , query .getDatasourceId ())))
9399 .cache ();
94- return sessionUserService .getVisitorId ()
95- .delayUntil (userId -> checkExecutePermission (userId , queryExecutionRequest .getPath (), appId ,
100+
101+ return sessionUserService .getVisitor ()
102+ .delayUntil (user -> checkExecutePermission (user .getId (), queryExecutionRequest .getPath (), appId ,
96103 queryExecutionRequest .isViewMode ()))
97104 .zipWhen (visitorId -> Mono .zip (appMono , appQueryMono , baseQueryMono , datasourceMono ), TupleUtils ::merge )
98105 .flatMap (tuple -> {
99- String userId = tuple .getT1 ();
106+ String userId = tuple .getT1 (). getId () ;
100107 Application app = tuple .getT2 ();
101108 ApplicationQuery appQuery = tuple .getT3 ();
102109 BaseQuery baseQuery = tuple .getT4 ();
@@ -107,8 +114,19 @@ public Mono<QueryExecutionResult> executeApplicationQuery(ServerWebExchange exch
107114 }
108115
109116 MultiValueMap <String , HttpCookie > cookies = exchange .getRequest ().getCookies ();
110- QueryVisitorContext queryVisitorContext = new QueryVisitorContext (userId , app .getOrganizationId (), port , cookies ,
111- getAuthParamsAndHeadersInheritFromLogin (userId , app .getOrganizationId ()), commonConfig .getDisallowedHosts ());
117+
118+ Mono <List <Property >> paramsAndHeadersInheritFromLogin = Mono .empty ();
119+
120+ if (datasource .isRestApi ()) {
121+ // then check if oauth inherited from login and save token
122+ if (datasource .getDetailConfig () instanceof RestApiDatasourceConfig restApiDatasourceConfig
123+ && restApiDatasourceConfig .isOauth2InheritFromLogin ()) {
124+ paramsAndHeadersInheritFromLogin = getAuthParamsAndHeadersInheritFromLogin (tuple .getT1 (), ((OAuthInheritAuthConfig )restApiDatasourceConfig .getAuthConfig ()).getAuthId ());
125+
126+ }
127+ }
128+
129+ QueryVisitorContext queryVisitorContext = new QueryVisitorContext (userId , app .getOrganizationId (), port , cookies , paramsAndHeadersInheritFromLogin , commonConfig .getDisallowedHosts ());
112130 return queryExecutionService .executeQuery (datasource , baseQuery .getQueryConfig (), queryExecutionRequest .paramMap (),
113131 appQuery .getTimeoutStr (), queryVisitorContext
114132 )
@@ -174,8 +192,18 @@ private Mono<BaseQuery> getBaseQueryFromLibraryQuery(ApplicationQuery query) {
174192 .map (LibraryQueryRecord ::getQuery );
175193 }
176194
177- protected Mono <List <Property >> getAuthParamsAndHeadersInheritFromLogin (String userId , String orgId ) {
178- return Mono .empty ();
195+ protected Mono <List <Property >> getAuthParamsAndHeadersInheritFromLogin (User user , String authId ) {
196+ if (authId == null ) {
197+ return Mono .empty ();
198+ }
199+ Optional <Connection > activeConnectionOptional = user .getConnections ()
200+ .stream ()
201+ .filter (connection -> connection .getAuthId ().equals (authId ))
202+ .findFirst ();
203+ if (!activeConnectionOptional .isPresent () || activeConnectionOptional .get ().getAuthConnectionAuthToken () == null ) {
204+ return Mono .empty ();
205+ }
206+ return Mono .just (Collections .singletonList (new Property ("Authorization" ,"Bearer " + activeConnectionOptional .get ().getAuthConnectionAuthToken ().getAccessToken (),"header" )));
179207 }
180208
181209 protected void onNextOrError (QueryExecutionRequest queryExecutionRequest , QueryVisitorContext queryVisitorContext ,
0 commit comments