Skip to content

Commit b43a2ff

Browse files
committed
auth into separate class
1 parent 7d31e41 commit b43a2ff

File tree

12 files changed

+357
-194
lines changed

12 files changed

+357
-194
lines changed

server/app/src/main/java/io/whitefox/api/deltasharing/server/DeltaSharesApiImpl.java

Lines changed: 68 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,12 @@ public DeltaSharesApiImpl(
4343
@Override
4444
public Response getShare(String share) {
4545
return wrapExceptions(
46-
() ->
47-
optionalToNotFound(shareService.getShare(share),
48-
foundShare ->
49-
shareToForbidden(foundShare, s -> {
50-
var resultShare = new Share().name(s.name()).id(s.id());
51-
return Response.ok(resultShare).build();
52-
})),
46+
() -> optionalToNotFound(
47+
shareService.getShare(share),
48+
foundShare -> shareToForbidden(foundShare, s -> {
49+
var resultShare = new Share().name(s.name()).id(s.id());
50+
return Response.ok(resultShare).build();
51+
})),
5352
exceptionToResponse);
5453
}
5554

@@ -74,58 +73,67 @@ public Response getTableMetadata(
7473
String startingTimestampStr,
7574
String deltaSharingCapabilities) {
7675
return wrapExceptions(
77-
() ->
78-
optionalToNotFound(shareService.getShare(share), foundShare -> shareToForbidden(foundShare, s -> {
79-
var startingTimestamp = parseTimestamp(startingTimestampStr);
80-
return optionalToNotFound(
81-
deltaSharesService.getTableMetadata(share, schema, table, startingTimestamp),
82-
m -> optionalToNotFound(
83-
deltaSharesService.getTableVersion(share, schema, table, startingTimestamp),
84-
v -> Response.ok(
85-
tableResponseSerializer.serialize(
86-
DeltaMappers.toTableResponseMetadata(m)),
87-
ndjsonMediaType)
88-
.status(Response.Status.OK.getStatusCode())
89-
.header(DELTA_TABLE_VERSION_HEADER, String.valueOf(v))
90-
.header(
91-
DELTA_SHARE_CAPABILITIES_HEADER,
92-
getResponseFormatHeader(
93-
DeltaMappers.toHeaderCapabilitiesMap(deltaSharingCapabilities)))
94-
.build()));
95-
})),
76+
() -> optionalToNotFound(
77+
shareService.getShare(share),
78+
foundShare -> shareToForbidden(foundShare, s -> {
79+
var startingTimestamp = parseTimestamp(startingTimestampStr);
80+
return optionalToNotFound(
81+
deltaSharesService.getTableMetadata(
82+
share, schema, table, startingTimestamp, getRequestPrincipal()),
83+
m -> optionalToNotFound(
84+
deltaSharesService.getTableVersion(
85+
share, schema, table, startingTimestamp, getRequestPrincipal()),
86+
v -> Response.ok(
87+
tableResponseSerializer.serialize(
88+
DeltaMappers.toTableResponseMetadata(m)),
89+
ndjsonMediaType)
90+
.status(Response.Status.OK.getStatusCode())
91+
.header(DELTA_TABLE_VERSION_HEADER, String.valueOf(v))
92+
.header(
93+
DELTA_SHARE_CAPABILITIES_HEADER,
94+
getResponseFormatHeader(
95+
DeltaMappers.toHeaderCapabilitiesMap(deltaSharingCapabilities)))
96+
.build()));
97+
})),
9698
exceptionToResponse);
9799
}
98100

99101
@Override
100102
public Response getTableVersion(
101103
String share, String schema, String table, String startingTimestampStr) {
102-
103104
return wrapExceptions(
104-
() ->
105-
optionalToNotFound(shareService.getShare(share), foundShare -> shareToForbidden(foundShare, s -> {
105+
() -> {
106106
var startingTimestamp = parseTimestamp(startingTimestampStr);
107107
return optionalToNotFound(
108-
deltaSharesService.getTableVersion(share, schema, table, startingTimestamp),
108+
deltaSharesService.getTableVersion(
109+
share, schema, table, startingTimestamp, getRequestPrincipal()),
109110
t -> Response.ok().header(DELTA_TABLE_VERSION_HEADER, t).build());
110-
})),
111+
},
111112
exceptionToResponse);
112113
}
113114

114115
@Override
115116
public Response listALLTables(String share, Integer maxResults, String pageToken) {
116117
return wrapExceptions(
117-
() ->
118-
optionalToNotFound(shareService.getShare(share), foundShare -> shareToForbidden(foundShare, s ->
119-
optionalToNotFound(
120-
deltaSharesService.listTablesOfShare(
121-
share, parseToken(pageToken), Optional.ofNullable(maxResults)),
122-
c -> Response.ok(c.getToken()
123-
.map(t -> new ListTablesResponse()
124-
.items(mapList(c.getContent(), DeltaMappers::table2api))
125-
.nextPageToken(tokenEncoder.encodePageToken(t)))
126-
.orElse(new ListTablesResponse()
127-
.items(mapList(c.getContent(), DeltaMappers::table2api))))
128-
.build()))),
118+
() -> optionalToNotFound(
119+
shareService.getShare(share),
120+
foundShare -> shareToForbidden(
121+
foundShare,
122+
s -> optionalToNotFound(
123+
deltaSharesService.listTablesOfShare(
124+
share,
125+
parseToken(pageToken),
126+
Optional.ofNullable(maxResults),
127+
getRequestPrincipal()),
128+
c -> Response.ok(c.getToken()
129+
.map(
130+
t -> new ListTablesResponse()
131+
.items(mapList(c.getContent(), DeltaMappers::table2api))
132+
.nextPageToken(tokenEncoder.encodePageToken(t)))
133+
.orElse(
134+
new ListTablesResponse()
135+
.items(mapList(c.getContent(), DeltaMappers::table2api))))
136+
.build()))),
129137
exceptionToResponse);
130138
}
131139

@@ -134,7 +142,11 @@ public Response listSchemas(String share, Integer maxResults, String pageToken)
134142
return wrapExceptions(
135143
() -> optionalToNotFound(
136144
deltaSharesService
137-
.listSchemas(share, parseToken(pageToken), Optional.ofNullable(maxResults))
145+
.listSchemas(
146+
share,
147+
parseToken(pageToken),
148+
Optional.ofNullable(maxResults),
149+
getRequestPrincipal())
138150
.map(ct -> ct.getToken()
139151
.map(t -> new ListSchemasResponse()
140152
.nextPageToken(tokenEncoder.encodePageToken(t))
@@ -149,8 +161,8 @@ public Response listSchemas(String share, Integer maxResults, String pageToken)
149161
public Response listShares(Integer maxResults, String pageToken) {
150162
return wrapExceptions(
151163
() -> {
152-
var c =
153-
deltaSharesService.listShares(parseToken(pageToken), Optional.ofNullable(maxResults));
164+
var c = deltaSharesService.listShares(
165+
parseToken(pageToken), Optional.ofNullable(maxResults), getRequestPrincipal());
154166
var response =
155167
new ListShareResponse().items(mapList(c.getContent(), DeltaMappers::share2api));
156168
return Response.ok(c.getToken()
@@ -166,7 +178,11 @@ public Response listTables(String share, String schema, Integer maxResults, Stri
166178
return wrapExceptions(
167179
() -> optionalToNotFound(
168180
deltaSharesService.listTables(
169-
share, schema, parseToken(pageToken), Optional.ofNullable(maxResults)),
181+
share,
182+
schema,
183+
parseToken(pageToken),
184+
Optional.ofNullable(maxResults),
185+
getRequestPrincipal()),
170186
c -> Response.ok(c.getToken()
171187
.map(t -> new ListTablesResponse()
172188
.items(mapList(c.getContent(), DeltaMappers::table2api))
@@ -195,7 +211,11 @@ public Response queryTable(
195211
return wrapExceptions(
196212
() -> {
197213
var readResult = deltaSharesService.queryTable(
198-
share, schema, table, DeltaMappers.api2ReadTableRequest(queryRequest));
214+
share,
215+
schema,
216+
table,
217+
DeltaMappers.api2ReadTableRequest(queryRequest),
218+
getRequestPrincipal());
199219
var serializedReadResult =
200220
tableQueryResponseSerializer.serialize(DeltaMappers.readTableResult2api(readResult));
201221
return Response.ok(serializedReadResult, ndjsonMediaType)

server/app/src/main/java/io/whitefox/api/server/ApiUtils.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,8 @@ default <T> Response optionalToNotFound(Optional<T> opt, Function<T, Response> f
7272
}
7373

7474
default Response shareToForbidden(Share value, Function<Share, Response> fn) {
75-
if (value.recipients().contains(getRequestPrincipal()))
76-
return fn.apply(value);
77-
else
78-
return Response.status(Response.Status.FORBIDDEN).build();
75+
if (value.recipients().contains(getRequestPrincipal())) return fn.apply(value);
76+
else return Response.status(Response.Status.FORBIDDEN).build();
7977
}
8078

8179
default String getResponseFormatHeader(Map<String, String> deltaSharingCapabilities) {

server/app/src/test/java/io/whitefox/api/deltasharing/server/DeltaSharesApiImplAwsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public void updateStorageManagerWithS3Tables() {
8484
"s3share",
8585
s3IcebergTable1(s3TestConfig, awsGlueTestConfig))),
8686
"s3share")),
87-
new Principal("Mr fox"),
87+
new Principal("Mr. Fox"),
8888
0L));
8989
}
9090

server/app/src/test/java/io/whitefox/api/server/ShareV1ApiImplTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void createShare() {
5757
.statusCode(201)
5858
.body("name", is("share1"))
5959
.body("comment", is(nullValue()))
60-
.body("recipients", is(hasSize(0)))
60+
.body("recipients", is(hasSize(1)))
6161
.body("schemas", is(hasSize(0)))
6262
.body("createdAt", is(0))
6363
.body("createdBy", is("Mr. Fox"))
@@ -89,7 +89,7 @@ void addRecipientsToShare() {
8989
.statusCode(200)
9090
.body("name", is("share1"))
9191
.body("comment", is(nullValue()))
92-
.body("recipients", is(hasSize(3)))
92+
.body("recipients", is(hasSize(4)))
9393
.body("schemas", is(hasSize(0)))
9494
.body("createdAt", is(0))
9595
.body("createdBy", is("Mr. Fox"))
@@ -105,7 +105,7 @@ void addSameRecipientTwice() {
105105
.statusCode(200)
106106
.body("name", is("share1"))
107107
.body("comment", is(nullValue()))
108-
.body("recipients", is(hasSize(3)))
108+
.body("recipients", is(hasSize(4)))
109109
.body("schemas", is(hasSize(0)))
110110
.body("createdAt", is(0))
111111
.body("createdBy", is("Mr. Fox"))
@@ -121,7 +121,7 @@ void addAnotherRecipient() {
121121
.statusCode(200)
122122
.body("name", is("share1"))
123123
.body("comment", is(nullValue()))
124-
.body("recipients", is(hasSize(4)))
124+
.body("recipients", is(hasSize(5)))
125125
.body("schemas", is(hasSize(0)))
126126
.body("createdAt", is(0))
127127
.body("createdBy", is("Mr. Fox"))
@@ -143,7 +143,7 @@ public void createSchema() {
143143
.statusCode(201)
144144
.body("name", is("share1"))
145145
.body("comment", is(nullValue()))
146-
.body("recipients", is(hasSize(4)))
146+
.body("recipients", is(hasSize(5)))
147147
.body("schemas", is(hasSize(1)))
148148
.body("schemas[0]", is("schema1"))
149149
.body("createdAt", is(0))
@@ -185,7 +185,7 @@ public void addTableToSchema() {
185185
.statusCode(201)
186186
.body("name", is("share1"))
187187
.body("comment", is(nullValue()))
188-
.body("recipients", is(hasSize(4)))
188+
.body("recipients", is(hasSize(5)))
189189
.body("schemas", is(hasSize(1)))
190190
.body("schemas[0]", is("schema1"))
191191
.body("createdAt", is(0))
@@ -200,7 +200,7 @@ ValidatableResponse createEmptyShare(String name) {
200200
.when()
201201
.filter(whitefoxFilter)
202202
.body(
203-
new CreateShareInput().name(name).recipients(List.of()).schemas(List.of()),
203+
new CreateShareInput().name(name).recipients(List.of("Mr. Fox")).schemas(List.of()),
204204
new Jackson2Mapper((cls, charset) -> objectMapper))
205205
.header(new Header("Content-Type", "application/json"))
206206
.post("/whitefox-api/v1/shares")

server/core/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ dependencies {
1919
implementation(enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
2020
// QUARKUS
2121
compileOnly("jakarta.enterprise:jakarta.enterprise.cdi-api")
22-
compileOnly("jakarta.ws.rs:jakarta.ws.rs-api")
22+
implementation("jakarta.ws.rs:jakarta.ws.rs-api")
2323
compileOnly("org.eclipse.microprofile.config:microprofile-config-api")
24-
24+
implementation("org.glassfish.jersey.core:jersey-common:3.1.2")
2525

2626
testFixturesImplementation(String.format("jakarta.inject:jakarta.inject-api:%s", jakartaVersion))
2727
testFixturesImplementation(String.format("org.eclipse.microprofile.config:microprofile-config-api:%s", microprofileConfigVersion))

server/core/src/main/java/io/whitefox/core/Share.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public Share(
5050
id,
5151
schemas,
5252
Optional.empty(),
53-
Set.of(),
53+
Set.of(createPrincipal),
5454
createTime,
5555
createPrincipal,
5656
createTime,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.whitefox.core;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import lombok.Data;
5+
6+
public interface WhitefoxAuthorization {
7+
8+
Boolean authorize(Share share, Principal principal);
9+
10+
@Data
11+
@ApplicationScoped
12+
class WhitefoxSimpleAuthorization implements WhitefoxAuthorization {
13+
14+
@Override
15+
public Boolean authorize(Share share, Principal principal) {
16+
return share.recipients().contains(principal);
17+
}
18+
}
19+
}

server/core/src/main/java/io/whitefox/core/services/DeltaSharesService.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,47 @@
1212
public interface DeltaSharesService {
1313

1414
Optional<Long> getTableVersion(
15-
String share, String schema, String table, Optional<Timestamp> startingTimestamp);
15+
String share,
16+
String schema,
17+
String table,
18+
Optional<Timestamp> startingTimestamp,
19+
Principal principal);
1620

1721
ContentAndToken<List<Share>> listShares(
18-
Optional<ContentAndToken.Token> nextPageToken, Optional<Integer> maxResults);
22+
Optional<ContentAndToken.Token> nextPageToken,
23+
Optional<Integer> maxResults,
24+
Principal currentPrincipal);
1925

2026
Optional<Metadata> getTableMetadata(
21-
String share, String schema, String table, Optional<Timestamp> startingTimestamp);
27+
String share,
28+
String schema,
29+
String table,
30+
Optional<Timestamp> startingTimestamp,
31+
Principal currentPrincipal);
2232

2333
Optional<ContentAndToken<List<Schema>>> listSchemas(
24-
String share, Optional<ContentAndToken.Token> nextPageToken, Optional<Integer> maxResults);
34+
String share,
35+
Optional<ContentAndToken.Token> nextPageToken,
36+
Optional<Integer> maxResults,
37+
Principal currentPrincipal);
2538

2639
Optional<ContentAndToken<List<SharedTable>>> listTables(
2740
String share,
2841
String schema,
2942
Optional<ContentAndToken.Token> nextPageToken,
30-
Optional<Integer> maxResults);
43+
Optional<Integer> maxResults,
44+
Principal currentPrincipal);
3145

3246
Optional<ContentAndToken<List<SharedTable>>> listTablesOfShare(
33-
String share, Optional<ContentAndToken.Token> token, Optional<Integer> maxResults);
47+
String share,
48+
Optional<ContentAndToken.Token> token,
49+
Optional<Integer> maxResults,
50+
Principal currentPrincipal);
3451

3552
ReadTableResult queryTable(
36-
String share, String schema, String table, ReadTableRequest queryRequest);
53+
String share,
54+
String schema,
55+
String table,
56+
ReadTableRequest queryRequest,
57+
Principal currentPrincipal);
3758
}

0 commit comments

Comments
 (0)