Skip to content

Commit

Permalink
Bugfix for read access on exts with tenant access
Browse files Browse the repository at this point in the history
  • Loading branch information
cjmalloy committed Sep 25, 2023
1 parent 9645fb7 commit 661c171
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
11 changes: 11 additions & 0 deletions src/main/java/jasper/repository/spec/OriginSpec.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import jasper.domain.proj.HasOrigin;
import org.springframework.data.jpa.domain.Specification;

import java.util.List;

public class OriginSpec {

public static <T extends HasOrigin> Specification<T> isOrigin(String origin) {
Expand All @@ -13,6 +15,15 @@ public static <T extends HasOrigin> Specification<T> isOrigin(String origin) {
origin.equals("@") ? "" : origin);
}

public static <T extends HasOrigin> Specification<T> isAnyOrigin(List<String> origins) {
if (origins == null || origins.isEmpty()) return null;
for (var o : origins) if (o.equals("@*")) return any();
if (origins.size() == 1) return isOrigin(origins.get(0));
return (root, query, cb) ->
root.get("origin")
.in(origins);
}

public static <T extends HasOrigin> Specification<T> any() {
return (root, query, cb) ->
cb.conjunction();
Expand Down
25 changes: 22 additions & 3 deletions src/main/java/jasper/security/Auth.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import java.util.Set;
import java.util.stream.Stream;

import static jasper.repository.spec.OriginSpec.isAnyOrigin;
import static jasper.repository.spec.OriginSpec.isOrigin;
import static jasper.repository.spec.QualifiedTag.originSelector;
import static jasper.repository.spec.QualifiedTag.qt;
Expand Down Expand Up @@ -136,6 +137,7 @@ public class Auth {
protected Client client;
protected Optional<User> user;
protected List<QualifiedTag> publicTags;
protected List<String> tenantAccessOrigins;
protected List<QualifiedTag> readAccess;
protected List<QualifiedTag> writeAccess;
protected List<QualifiedTag> tagReadAccess;
Expand Down Expand Up @@ -586,7 +588,9 @@ public <T extends Tag> Specification<T> tagReadSpec() {
if (isLoggedIn()) {
spec = spec.or(getUserTag().spec());
}
return spec.or(isAnyQualifiedTag(getTagReadAccess()));
return spec
.or(Specification.<T>where(isAnyOrigin(getTenantAccessOrigins())).and(notPrivateTag()))
.or(isAnyQualifiedTag(getTagReadAccess()));
}

protected boolean tagWriteAccessCaptures(String tag) {
Expand Down Expand Up @@ -721,8 +725,7 @@ public List<QualifiedTag> getPublicTags() {
if (publicTags == null) {
if (props.isMultiTenant()) {
publicTags = new ArrayList<>(List.of(qt("public" + getOrigin())));
if (getClient().getTenantAccess() == null) return publicTags;
for (var t : getClient().getTenantAccess()) {
for (var t : getTenantAccessOrigins()) {
publicTags.add(qt("public" + t));
}
} else {
Expand All @@ -732,6 +735,22 @@ public List<QualifiedTag> getPublicTags() {
return publicTags;
}

public List<String> getTenantAccessOrigins() {
if (tenantAccessOrigins == null) {
if (props.isMultiTenant()) {
tenantAccessOrigins = new ArrayList<>(List.of(getOrigin()));
if (getClient().getTenantAccess() == null) return tenantAccessOrigins;
for (var t : getClient().getTenantAccess()) {
if (isBlank(t) || t.equals("@") || t.equals("default")) t = "";
tenantAccessOrigins.add(t);
}
} else {
tenantAccessOrigins = List.of("@*");
}
}
return tenantAccessOrigins;
}

protected String getMultiTenantOrigin() {
return props.isMultiTenant() ? getOrigin() : "@*";
}
Expand Down

0 comments on commit 661c171

Please sign in to comment.