feat: add SecurityContext class

This commit is contained in:
2024-08-15 11:44:54 +02:00
parent 7f80c876d3
commit bd386d1b0a
19 changed files with 181 additions and 224 deletions

View File

@@ -7,15 +7,13 @@ import fr.titionfire.ffsaf.net2.data.SimpleCompet;
import fr.titionfire.ffsaf.net2.request.SReqCompet;
import fr.titionfire.ffsaf.rest.exception.DForbiddenException;
import fr.titionfire.ffsaf.utils.CompetitionSystem;
import fr.titionfire.ffsaf.utils.GroupeUtils;
import fr.titionfire.ffsaf.utils.SecurityCtx;
import io.quarkus.cache.Cache;
import io.quarkus.cache.CacheName;
import io.quarkus.security.identity.SecurityIdentity;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.unchecked.Unchecked;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.jwt.JsonWebToken;
import java.util.HashMap;
import java.util.UUID;
@@ -54,7 +52,7 @@ public class CompetPermService {
});
}
public Uni<HashMap<Long, String>> getAllHaveAccess (String subject) {
public Uni<HashMap<Long, String>> getAllHaveAccess(String subject) {
return cacheAccess.get(subject, k -> {
CompletableFuture<HashMap<Long, String>> f = new CompletableFuture<>();
SReqCompet.getAllHaveAccess(serverCustom.clients, subject, f);
@@ -67,52 +65,52 @@ public class CompetPermService {
});
}
public Uni<CompetitionModel> hasViewPerm(JsonWebToken idToken, SecurityIdentity sid, long id) {
public Uni<CompetitionModel> hasViewPerm(SecurityCtx securityCtx, long id) {
return competitionRepository.findById(id).call(o -> (
idToken.getSubject().equals(o.getOwner()) || sid.getRoles().contains("federation_admin")) ?
securityCtx.getSubject().equals(o.getOwner()) || securityCtx.roleHas("federation_admin")) ?
Uni.createFrom().nullItem()
:
o.getSystem() == CompetitionSystem.SAFCA ?
hasSafcaViewPerm(idToken, sid, id)
hasSafcaViewPerm(securityCtx, id)
: Uni.createFrom().nullItem().invoke(Unchecked.consumer(__ -> {
if (!GroupeUtils.isInClubGroup(o.getClub().getId(), idToken))
if (!securityCtx.isInClubGroup(o.getClub().getId()))
throw new DForbiddenException();
})
));
}
public Uni<CompetitionModel> hasEditPerm(JsonWebToken idToken, SecurityIdentity sid, long id) {
public Uni<CompetitionModel> hasEditPerm(SecurityCtx securityCtx, long id) {
return competitionRepository.findById(id).call(o -> (
idToken.getSubject().equals(o.getOwner()) || sid.getRoles().contains("federation_admin")) ?
securityCtx.getSubject().equals(o.getOwner()) || securityCtx.roleHas("federation_admin")) ?
Uni.createFrom().nullItem()
:
o.getSystem() == CompetitionSystem.SAFCA ?
hasSafcaEditPerm(idToken, sid, id)
hasSafcaEditPerm(securityCtx, id)
: Uni.createFrom().nullItem().invoke(Unchecked.consumer(__ -> {
if (!GroupeUtils.isInClubGroup(o.getClub().getId(), idToken))
if (!securityCtx.isInClubGroup(o.getClub().getId()))
throw new DForbiddenException();
})
));
}
private Uni<?> hasSafcaViewPerm(JsonWebToken idToken, SecurityIdentity sid, long id) {
return sid.getRoles().contains("safca_super_admin") ?
private Uni<?> hasSafcaViewPerm(SecurityCtx securityCtx, long id) {
return securityCtx.roleHas("safca_super_admin") ?
Uni.createFrom().nullItem()
:
getSafcaConfig(id).chain(Unchecked.function(o -> {
if (!o.admin().contains(UUID.fromString(idToken.getSubject())) && !o.table()
.contains(UUID.fromString(idToken.getSubject())))
if (!o.admin().contains(UUID.fromString(securityCtx.getSubject())) && !o.table()
.contains(UUID.fromString(securityCtx.getSubject())))
throw new DForbiddenException();
return Uni.createFrom().nullItem();
}));
}
private Uni<?> hasSafcaEditPerm(JsonWebToken idToken, SecurityIdentity sid, long id) {
return sid.getRoles().contains("safca_super_admin") ?
private Uni<?> hasSafcaEditPerm(SecurityCtx securityCtx, long id) {
return securityCtx.roleHas("safca_super_admin") ?
Uni.createFrom().nullItem()
:
getSafcaConfig(id).chain(Unchecked.function(o -> {
if (!o.admin().contains(UUID.fromString(idToken.getSubject())))
if (!o.admin().contains(UUID.fromString(securityCtx.getSubject())))
throw new DForbiddenException();
return Uni.createFrom().nullItem();
}));