Skip to content

Commit 3c5dbaf

Browse files
authored
Add findPrincipalById helper (#2810)
* Add findPrincipalById helper this simplifies frequent usage of the lower level `loadEntity` api (similar to the existing `findPrincipalByName` helper)
1 parent f473da3 commit 3c5dbaf

File tree

8 files changed

+68
-92
lines changed

8 files changed

+68
-92
lines changed

polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -844,14 +844,12 @@ private void revokeGrantRecord(
844844
BasePersistence ms = callCtx.getMetaStore();
845845

846846
// if not found, the principal must have been dropped
847-
EntityResult loadEntityResult =
848-
loadEntity(
849-
callCtx, PolarisEntityConstants.getNullId(), principalId, PolarisEntityType.PRINCIPAL);
850-
if (loadEntityResult.getReturnStatus() != BaseResult.ReturnStatus.SUCCESS) {
847+
Optional<PrincipalEntity> principalLookup = findPrincipalById(callCtx, principalId);
848+
if (principalLookup.isEmpty()) {
851849
return new PrincipalSecretsResult(BaseResult.ReturnStatus.ENTITY_NOT_FOUND, null);
852850
}
853851

854-
PolarisBaseEntity principal = loadEntityResult.getEntity();
852+
PrincipalEntity principal = principalLookup.get();
855853
Map<String, String> internalProps = principal.getInternalPropertiesAsMap();
856854

857855
boolean doReset =
@@ -895,11 +893,10 @@ private void revokeGrantRecord(
895893
String customClientSecret) {
896894
// get metastore we should be using
897895
BasePersistence ms = callCtx.getMetaStore();
896+
898897
// if not found, the principal must have been dropped
899-
EntityResult loadEntityResult =
900-
loadEntity(
901-
callCtx, PolarisEntityConstants.getNullId(), principalId, PolarisEntityType.PRINCIPAL);
902-
if (loadEntityResult.getReturnStatus() != BaseResult.ReturnStatus.SUCCESS) {
898+
Optional<PrincipalEntity> principalEntity = findPrincipalById(callCtx, principalId);
899+
if (principalEntity.isEmpty()) {
903900
return new PrincipalSecretsResult(BaseResult.ReturnStatus.ENTITY_NOT_FOUND, null);
904901
}
905902

polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManager.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,20 @@ default Optional<PrincipalEntity> findRootPrincipal(PolarisCallContext polarisCa
470470
return findPrincipalByName(polarisCallContext, PolarisEntityConstants.getRootPrincipalName());
471471
}
472472

473+
default Optional<PrincipalEntity> findPrincipalById(
474+
PolarisCallContext polarisCallContext, long principalId) {
475+
EntityResult loadResult =
476+
loadEntity(
477+
polarisCallContext,
478+
PolarisEntityConstants.getNullId(),
479+
principalId,
480+
PolarisEntityType.PRINCIPAL);
481+
if (!loadResult.isSuccess()) {
482+
return Optional.empty();
483+
}
484+
return Optional.of(loadResult.getEntity()).map(PrincipalEntity::of);
485+
}
486+
473487
default Optional<PrincipalEntity> findPrincipalByName(
474488
PolarisCallContext polarisCallContext, String principalName) {
475489
EntityResult entityResult =

polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/PolarisTestMetaStoreManager.java

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ void ensureGrantRecordRemoved(
404404
}
405405

406406
/** Create a principal */
407-
PolarisBaseEntity createPrincipal(String name) {
407+
PrincipalEntity createPrincipal(String name) {
408408
// create new principal identity
409409
PrincipalEntity principalEntity =
410410
new PrincipalEntity.Builder()
@@ -490,14 +490,11 @@ PolarisBaseEntity createPrincipal(String name) {
490490
.getPrincipalSecrets();
491491
Assertions.assertThat(secrets.getMainSecret()).isNotEqualTo(reloadSecrets.getMainSecret());
492492

493-
PolarisBaseEntity reloadPrincipal =
493+
PrincipalEntity reloadPrincipal =
494494
polarisMetaStoreManager
495-
.loadEntity(
496-
this.polarisCallContext,
497-
0L,
498-
createPrincipalResult.getPrincipal().getId(),
499-
createPrincipalResult.getPrincipal().getType())
500-
.getEntity();
495+
.findPrincipalById(
496+
this.polarisCallContext, createPrincipalResult.getPrincipal().getId())
497+
.orElseThrow();
501498
internalProperties = reloadPrincipal.getInternalPropertiesAsMap();
502499
Assertions.assertThat(
503500
internalProperties.get(
@@ -549,11 +546,10 @@ PolarisBaseEntity createPrincipal(String name) {
549546
Assertions.assertThat(reloadSecrets.getMainSecretHash()).isNotEqualTo(newMainSecretHash);
550547
Assertions.assertThat(reloadSecrets.getSecondarySecretHash()).isNotEqualTo(newMainSecretHash);
551548

552-
PolarisBaseEntity newPrincipal =
549+
PrincipalEntity newPrincipal =
553550
polarisMetaStoreManager
554-
.loadEntity(
555-
this.polarisCallContext, 0L, principalEntity.getId(), principalEntity.getType())
556-
.getEntity();
551+
.findPrincipalById(this.polarisCallContext, principalEntity.getId())
552+
.orElseThrow();
557553
internalProperties = newPrincipal.getInternalPropertiesAsMap();
558554
Assertions.assertThat(
559555
internalProperties.get(
@@ -582,11 +578,10 @@ PolarisBaseEntity createPrincipal(String name) {
582578
Assertions.assertThat(postResetCredentials.getSecondarySecretHash())
583579
.isNotEqualTo(reloadSecrets.getSecondarySecretHash());
584580

585-
PolarisBaseEntity finalPrincipal =
581+
PrincipalEntity finalPrincipal =
586582
polarisMetaStoreManager
587-
.loadEntity(
588-
this.polarisCallContext, 0L, principalEntity.getId(), principalEntity.getType())
589-
.getEntity();
583+
.findPrincipalById(this.polarisCallContext, principalEntity.getId())
584+
.orElseThrow();
590585
internalProperties = finalPrincipal.getInternalPropertiesAsMap();
591586
Assertions.assertThat(
592587
internalProperties.get(
@@ -1342,8 +1337,8 @@ PolarisBaseEntity createTestCatalog(String catalogName) {
13421337
grantToGrantee(catalog, R2, PR2, PolarisPrivilege.CATALOG_ROLE_USAGE);
13431338

13441339
// also create two new principals
1345-
PolarisBaseEntity P1 = this.createPrincipal("P1");
1346-
PolarisBaseEntity P2 = this.createPrincipal("P2");
1340+
PrincipalEntity P1 = this.createPrincipal("P1");
1341+
PrincipalEntity P2 = this.createPrincipal("P2");
13471342

13481343
// assign PR1 and PR2 to this principal
13491344
grantToGrantee(null, PR1, P1, PolarisPrivilege.PRINCIPAL_ROLE_USAGE);

runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,15 +1182,17 @@ public void deletePrincipal(String name) {
11821182
"Failed to %s secrets for principal '%s'",
11831183
shouldReset ? "reset" : "rotate", principalName));
11841184
}
1185-
PolarisEntity newPrincipal =
1186-
PolarisEntity.of(
1187-
metaStoreManager.loadEntity(
1188-
getCurrentPolarisContext(),
1189-
0L,
1190-
currentPrincipalEntity.getId(),
1191-
currentPrincipalEntity.getType()));
1185+
Optional<PrincipalEntity> updatedPrincipalEntity =
1186+
metaStoreManager.findPrincipalById(
1187+
getCurrentPolarisContext(), currentPrincipalEntity.getId());
1188+
if (updatedPrincipalEntity.isEmpty()) {
1189+
throw new IllegalStateException(
1190+
String.format(
1191+
"Failed to reload principal '%s' by id: %s",
1192+
principalName, currentPrincipalEntity.getId()));
1193+
}
11921194
return new PrincipalWithCredentials(
1193-
PrincipalEntity.of(newPrincipal).asPrincipal(),
1195+
updatedPrincipalEntity.get().asPrincipal(),
11941196
new PrincipalWithCredentialsCredentials(
11951197
newSecrets.getPrincipalClientId(), newSecrets.getMainSecret()));
11961198
}

runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultAuthenticator.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,10 @@ protected PrincipalEntity resolvePrincipalEntity(PolarisCredential credentials)
115115
// otherwise, use the principal name to load the entity.
116116
if (credentials.getPrincipalId() != null && credentials.getPrincipalId() > 0) {
117117
principal =
118-
PrincipalEntity.of(
119-
metaStoreManager
120-
.loadEntity(
121-
callContext.getPolarisCallContext(),
122-
0L,
123-
credentials.getPrincipalId(),
124-
PolarisEntityType.PRINCIPAL)
125-
.getEntity());
118+
metaStoreManager
119+
.findPrincipalById(
120+
callContext.getPolarisCallContext(), credentials.getPrincipalId())
121+
.orElse(null);
126122
} else if (credentials.getPrincipalName() != null) {
127123
principal =
128124
metaStoreManager

runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/JWTBroker.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@
2828
import java.util.UUID;
2929
import org.apache.iceberg.exceptions.NotAuthorizedException;
3030
import org.apache.polaris.core.PolarisCallContext;
31-
import org.apache.polaris.core.entity.PolarisEntityType;
3231
import org.apache.polaris.core.entity.PrincipalEntity;
3332
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
34-
import org.apache.polaris.core.persistence.dao.entity.EntityResult;
3533
import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult;
3634
import org.apache.polaris.service.auth.DefaultAuthenticator;
3735
import org.apache.polaris.service.auth.PolarisCredential;
@@ -106,11 +104,9 @@ public TokenResponse generateFromToken(
106104
LOGGER.error("Failed to verify the token", e.getCause());
107105
return TokenResponse.of(OAuthError.invalid_client);
108106
}
109-
EntityResult principalLookup =
110-
metaStoreManager.loadEntity(
111-
polarisCallContext, 0L, decodedToken.getPrincipalId(), PolarisEntityType.PRINCIPAL);
112-
if (!principalLookup.isSuccess()
113-
|| principalLookup.getEntity().getType() != PolarisEntityType.PRINCIPAL) {
107+
Optional<PrincipalEntity> principalLookup =
108+
metaStoreManager.findPrincipalById(polarisCallContext, decodedToken.getPrincipalId());
109+
if (principalLookup.isEmpty()) {
114110
return TokenResponse.of(OAuthError.unauthorized_client);
115111
}
116112
String tokenString =
@@ -191,15 +187,7 @@ private Optional<PrincipalEntity> findPrincipalEntity(
191187
if (!principalSecrets.getPrincipalSecrets().matchesSecret(clientSecret)) {
192188
return Optional.empty();
193189
}
194-
EntityResult result =
195-
metaStoreManager.loadEntity(
196-
polarisCallContext,
197-
0L,
198-
principalSecrets.getPrincipalSecrets().getPrincipalId(),
199-
PolarisEntityType.PRINCIPAL);
200-
if (!result.isSuccess() || result.getEntity().getType() != PolarisEntityType.PRINCIPAL) {
201-
return Optional.empty();
202-
}
203-
return Optional.of(PrincipalEntity.of(result.getEntity()));
190+
return metaStoreManager.findPrincipalById(
191+
polarisCallContext, principalSecrets.getPrincipalSecrets().getPrincipalId());
204192
}
205193
}

runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/JWTSymmetricKeyGeneratorTest.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@
2424
import com.auth0.jwt.JWTVerifier;
2525
import com.auth0.jwt.algorithms.Algorithm;
2626
import com.auth0.jwt.interfaces.DecodedJWT;
27+
import java.util.Optional;
2728
import org.apache.polaris.core.PolarisCallContext;
28-
import org.apache.polaris.core.entity.PolarisBaseEntity;
29-
import org.apache.polaris.core.entity.PolarisEntitySubType;
30-
import org.apache.polaris.core.entity.PolarisEntityType;
3129
import org.apache.polaris.core.entity.PolarisPrincipalSecrets;
30+
import org.apache.polaris.core.entity.PrincipalEntity;
3231
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
33-
import org.apache.polaris.core.persistence.dao.entity.EntityResult;
3432
import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult;
3533
import org.apache.polaris.service.types.TokenType;
3634
import org.junit.jupiter.api.Test;
@@ -43,23 +41,17 @@ public class JWTSymmetricKeyGeneratorTest {
4341
public void testJWTSymmetricKeyGenerator() {
4442
PolarisCallContext polarisCallContext = new PolarisCallContext(null, null, null);
4543
PolarisMetaStoreManager metastoreManager = Mockito.mock(PolarisMetaStoreManager.class);
44+
long principalId = 123L;
4645
String mainSecret = "test_secret";
4746
String clientId = "test_client_id";
4847
PolarisPrincipalSecrets principalSecrets =
49-
new PolarisPrincipalSecrets(1L, clientId, mainSecret, "otherSecret");
48+
new PolarisPrincipalSecrets(principalId, clientId, mainSecret, "otherSecret");
5049
Mockito.when(metastoreManager.loadPrincipalSecrets(polarisCallContext, clientId))
5150
.thenReturn(new PrincipalSecretsResult(principalSecrets));
52-
PolarisBaseEntity principal =
53-
new PolarisBaseEntity(
54-
0L,
55-
1L,
56-
PolarisEntityType.PRINCIPAL,
57-
PolarisEntitySubType.NULL_SUBTYPE,
58-
0L,
59-
"principal");
60-
Mockito.when(
61-
metastoreManager.loadEntity(polarisCallContext, 0L, 1L, PolarisEntityType.PRINCIPAL))
62-
.thenReturn(new EntityResult(principal));
51+
PrincipalEntity principal =
52+
new PrincipalEntity.Builder().setId(principalId).setName("principal").build();
53+
Mockito.when(metastoreManager.findPrincipalById(polarisCallContext, principalId))
54+
.thenReturn(Optional.of(principal));
6355
TokenBroker generator = new SymmetricKeyJWTBroker(metastoreManager, 666, () -> "polaris");
6456
TokenResponse token =
6557
generator.generateFromClientSecrets(

runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerTest.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,12 @@
2828
import jakarta.inject.Inject;
2929
import java.security.interfaces.RSAPrivateKey;
3030
import java.security.interfaces.RSAPublicKey;
31+
import java.util.Optional;
3132
import org.apache.polaris.core.PolarisCallContext;
3233
import org.apache.polaris.core.config.PolarisConfigurationStore;
33-
import org.apache.polaris.core.entity.PolarisBaseEntity;
34-
import org.apache.polaris.core.entity.PolarisEntitySubType;
35-
import org.apache.polaris.core.entity.PolarisEntityType;
3634
import org.apache.polaris.core.entity.PolarisPrincipalSecrets;
35+
import org.apache.polaris.core.entity.PrincipalEntity;
3736
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
38-
import org.apache.polaris.core.persistence.dao.entity.EntityResult;
3937
import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult;
4038
import org.apache.polaris.service.types.TokenType;
4139
import org.junit.jupiter.api.Test;
@@ -50,27 +48,21 @@ public class RSAKeyPairJWTBrokerTest {
5048
public void testSuccessfulTokenGeneration() throws Exception {
5149
var keyPair = PemUtils.generateKeyPair();
5250

51+
final long principalId = 123L;
5352
final String clientId = "test-client-id";
5453
final String scope = "PRINCIPAL_ROLE:TEST";
5554

5655
PolarisCallContext polarisCallContext = new PolarisCallContext(null, null, configurationStore);
5756
PolarisMetaStoreManager metastoreManager = Mockito.mock(PolarisMetaStoreManager.class);
5857
String mainSecret = "client-secret";
5958
PolarisPrincipalSecrets principalSecrets =
60-
new PolarisPrincipalSecrets(1L, clientId, mainSecret, "otherSecret");
59+
new PolarisPrincipalSecrets(principalId, clientId, mainSecret, "otherSecret");
6160
Mockito.when(metastoreManager.loadPrincipalSecrets(polarisCallContext, clientId))
6261
.thenReturn(new PrincipalSecretsResult(principalSecrets));
63-
PolarisBaseEntity principal =
64-
new PolarisBaseEntity(
65-
0L,
66-
1L,
67-
PolarisEntityType.PRINCIPAL,
68-
PolarisEntitySubType.NULL_SUBTYPE,
69-
0L,
70-
"principal");
71-
Mockito.when(
72-
metastoreManager.loadEntity(polarisCallContext, 0L, 1L, PolarisEntityType.PRINCIPAL))
73-
.thenReturn(new EntityResult(principal));
62+
PrincipalEntity principal =
63+
new PrincipalEntity.Builder().setId(principalId).setName("principal").build();
64+
Mockito.when(metastoreManager.findPrincipalById(polarisCallContext, principalId))
65+
.thenReturn(Optional.of(principal));
7466
KeyProvider provider = new LocalRSAKeyProvider(keyPair);
7567
TokenBroker tokenBroker = new RSAKeyPairJWTBroker(metastoreManager, 420, provider);
7668
TokenResponse token =

0 commit comments

Comments
 (0)