Skip to content

Commit afd3ad3

Browse files
committed
new: return org id if viewing of application is denied
1 parent d10a516 commit afd3ad3

File tree

5 files changed

+48
-6
lines changed

5 files changed

+48
-6
lines changed

server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/exception/BizException.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package org.lowcoder.sdk.exception;
22

33
import lombok.Getter;
4+
import org.apache.commons.lang3.StringUtils;
45
import org.lowcoder.sdk.util.LocaleUtils;
6+
import org.springframework.http.HttpHeaders;
57

68
import java.util.Locale;
9+
import java.util.Map;
710

811
@Getter
912
public class BizException extends BaseException {
1013

1114
private final BizError error;
1215
private final String messageKey;
1316
private final transient Object[] args;
17+
private transient HttpHeaders headers;
1418

1519
public BizException(BizError error, String messageKey, Object... args) {
1620
super(LocaleUtils.getMessage(Locale.ENGLISH, messageKey, args));
@@ -19,6 +23,11 @@ public BizException(BizError error, String messageKey, Object... args) {
1923
this.args = args;
2024
}
2125

26+
public BizException(BizError error, String messageKey, HttpHeaders headers, Object... args) {
27+
this(error, messageKey, args);
28+
this.headers = headers;
29+
}
30+
2231
public int getHttpStatus() {
2332
return error == null ? 500 : error.getHttpErrorCode();
2433
}
@@ -36,4 +45,13 @@ public String getMessage(Locale locale) {
3645
return error == null ? super.getMessage() : LocaleUtils.getMessage(locale, messageKey, args);
3746
}
3847

48+
public void addHeader(String header, String value) {
49+
if (StringUtils.isAnyBlank(header, value)) {
50+
return;
51+
}
52+
if (headers == null) {
53+
headers = new HttpHeaders();
54+
}
55+
headers.add(header, value);
56+
}
3957
}

server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/ExceptionUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.lowcoder.sdk.util;
22

33
import org.lowcoder.sdk.exception.*;
4+
import org.springframework.http.HttpHeaders;
45
import reactor.core.publisher.Mono;
56

67
import static reactor.core.Exceptions.throwIfFatal;
@@ -18,6 +19,10 @@ public static <T> Mono<T> ofError(BizError errorCode, String messageKey, Object.
1819
return Mono.error(new BizException(errorCode, messageKey, args));
1920
}
2021

22+
public static <T> Mono<T> ofErrorWithHeaders(BizError errorCode, String messageKey, HttpHeaders headers, Object... args) {
23+
return Mono.error(new BizException(errorCode, messageKey, headers, args));
24+
}
25+
2126
public static BizException ofException(BizError errorCode, String messageKey, Object... args) {
2227
return new BizException(errorCode, messageKey, args);
2328
}

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.lowcoder.sdk.plugin.common.QueryExecutor;
4646
import org.lowcoder.sdk.util.ExceptionUtils;
4747
import org.springframework.context.annotation.Lazy;
48+
import org.springframework.http.HttpHeaders;
4849
import org.springframework.stereotype.Service;
4950
import reactor.core.publisher.Flux;
5051
import reactor.core.publisher.Mono;
@@ -59,8 +60,7 @@
5960
import static org.lowcoder.domain.application.model.ApplicationStatus.NORMAL;
6061
import static org.lowcoder.domain.permission.model.ResourceAction.*;
6162
import static org.lowcoder.sdk.exception.BizError.*;
62-
import static org.lowcoder.sdk.util.ExceptionUtils.deferredError;
63-
import static org.lowcoder.sdk.util.ExceptionUtils.ofError;
63+
import static org.lowcoder.sdk.util.ExceptionUtils.*;
6464

6565
@RequiredArgsConstructor
6666
@Service
@@ -474,18 +474,29 @@ public Mono<ResourcePermission> checkApplicationPermissionWithReadableErrorMsg(S
474474
.flatMap(visitorId -> resourcePermissionService.checkUserPermissionStatusOnApplication(visitorId, applicationId, action, requestType))
475475
.flatMap(permissionStatus -> {
476476
if (!permissionStatus.hasPermission()) {
477+
478+
String orgId = applicationService.findById(applicationId)
479+
.map(Application::getOrganizationId)
480+
.onErrorReturn("")
481+
.block();
482+
483+
HttpHeaders headers = new HttpHeaders();
484+
if (StringUtils.isNotBlank(orgId)) {
485+
headers.add("X-ORG-ID", orgId);
486+
}
487+
477488
if (permissionStatus.failByAnonymousUser()) {
478-
return ofError(USER_NOT_SIGNED_IN, "USER_NOT_SIGNED_IN");
489+
return ofErrorWithHeaders(USER_NOT_SIGNED_IN, "USER_NOT_SIGNED_IN", headers);
479490
}
480491

481492
if (permissionStatus.failByNotInOrg()) {
482-
return ofError(NO_PERMISSION_TO_REQUEST_APP, "INSUFFICIENT_PERMISSION");
493+
return ofErrorWithHeaders(NO_PERMISSION_TO_REQUEST_APP, "INSUFFICIENT_PERMISSION", headers);
483494
}
484495

485496
return suggestAppAdminSolutionService.getSuggestAppAdminNames(applicationId)
486497
.flatMap(names -> {
487498
String messageKey = action == EDIT_APPLICATIONS ? "NO_PERMISSION_TO_EDIT" : "NO_PERMISSION_TO_VIEW";
488-
return ofError(NO_PERMISSION_TO_REQUEST_APP, messageKey, names);
499+
return ofErrorWithHeaders(NO_PERMISSION_TO_REQUEST_APP, messageKey, headers, names);
489500
});
490501
}
491502
return Mono.just(permissionStatus.getPermission());

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/exception/CustomErrorWebExceptionHandler.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,12 @@ private Mono<ServerResponse> render(ServerRequest request) {
9393
}
9494

9595
Locale locale = globalContextService.getClientLocale(request);
96-
return ServerResponse.status(bizException.getError().getHttpErrorCode())
96+
97+
ServerResponse.BodyBuilder response = ServerResponse.status(bizException.getError().getHttpErrorCode());
98+
if (bizException.getHeaders() != null && !bizException.getHeaders().isEmpty()) {
99+
response.headers(headersBuilder -> headersBuilder.addAll(bizException.getHeaders()));
100+
}
101+
return response
97102
.contentType(MediaType.APPLICATION_JSON)
98103
.body(BodyInserters.fromValue(ResponseView.error(bizException.getError().getBizErrorCode(),
99104
LocaleUtils.getMessage(locale, bizException.getMessageKey(), bizException.getArgs()))));

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/exception/GlobalExceptionHandler.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public Mono<ResponseView<?>> catchBizException(BizException e, ServerWebExchange
5151
apiPerfHelper.perf(e.getError(), exchange.getRequest().getPath());
5252
doLog(e, ctx, e.getError().logVerbose());
5353
Locale locale = getLocale(ctx);
54+
if (e.getHeaders() != null && !e.getHeaders().isEmpty()) {
55+
exchange.getResponse().getHeaders().addAll(e.getHeaders());
56+
}
5457
return Mono.just(error(e.getBizErrorCode(), e.getMessage(locale)));
5558
});
5659
}

0 commit comments

Comments
 (0)