feat: secure match ans poule endpoints

This commit is contained in:
2024-08-15 13:56:54 +02:00
parent bd386d1b0a
commit 6b38405e94
7 changed files with 82 additions and 61 deletions

View File

@@ -274,7 +274,6 @@ public class ClubEndpoints {
@GET
@Path("{clubId}/logo")
@RolesAllowed({"federation_admin", "club_president", "club_secretaire", "club_respo_intra"})
@Operation(summary = "Renvoie le logo du club", description = "Renvoie le logo du club spécifié")
@APIResponses(value = {
@APIResponse(responseCode = "200", description = "Le logo du club"),
@@ -284,7 +283,7 @@ public class ClubEndpoints {
})
public Uni<Response> getLogo(
@Parameter(description = "Identifiant long (clubId) de club") @PathParam("clubId") String clubId) {
return clubService.getByClubId(clubId).onItem().invoke(checkPerm).chain(Unchecked.function(clubModel -> {
return clubService.getByClubId(clubId).chain(Unchecked.function(clubModel -> {
try {
return Utils.getMediaFile((clubModel != null) ? clubModel.getId() : -1, media, "ppClub",
Uni.createFrom().nullItem());

View File

@@ -1,21 +1,17 @@
package fr.titionfire.ffsaf.rest;
import fr.titionfire.ffsaf.data.model.ClubModel;
import fr.titionfire.ffsaf.domain.service.MatchService;
import fr.titionfire.ffsaf.rest.data.MatchData;
import fr.titionfire.ffsaf.rest.exception.DForbiddenException;
import fr.titionfire.ffsaf.utils.CompetitionSystem;
import fr.titionfire.ffsaf.utils.ScoreEmbeddable;
import fr.titionfire.ffsaf.utils.SecurityCtx;
import io.quarkus.security.Authenticated;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.unchecked.Unchecked;
import jakarta.inject.Inject;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import java.util.List;
import java.util.function.Consumer;
@Authenticated
@Path("api/match/{system}/")
@@ -30,42 +26,38 @@ public class MatchEndpoints {
@Inject
SecurityCtx securityCtx;
Consumer<ClubModel> checkPerm = Unchecked.consumer(clubModel -> {
if (!securityCtx.roleHas("federation_admin") && !securityCtx.isInClubGroup(clubModel.getId()))
throw new DForbiddenException();
});
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Uni<MatchData> getById(@PathParam("id") Long id) {
return service.getById(checkPerm, system, id);
return service.getById(securityCtx, system, id);
}
@GET
@Path("getAllByPoule/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Uni<List<MatchData>> getAllByPoule(@PathParam("id") Long id) {
return service.getAllByPoule(checkPerm, system, id);
return service.getAllByPoule(securityCtx, system, id);
}
@POST
@Produces(MediaType.APPLICATION_JSON)
public Uni<MatchData> addOrUpdate(MatchData data) {
return service.addOrUpdate(checkPerm, system, data);
return service.addOrUpdate(securityCtx, system, data);
}
@POST
@Path("score/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Uni<?> updateScore(@PathParam("id") Long id, List<ScoreEmbeddable> scores) {
return service.updateScore(system, id, scores);
return service.updateScore(securityCtx, system, id, scores);
}
@DELETE
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Uni<?> delete(@PathParam("id") Long id) {
return service.delete(checkPerm, system, id);
return service.delete(securityCtx, system, id);
}
}

View File

@@ -1,22 +1,19 @@
package fr.titionfire.ffsaf.rest;
import fr.titionfire.ffsaf.data.model.ClubModel;
import fr.titionfire.ffsaf.domain.service.PouleService;
import fr.titionfire.ffsaf.rest.data.PouleData;
import fr.titionfire.ffsaf.rest.data.PouleFullData;
import fr.titionfire.ffsaf.rest.exception.DForbiddenException;
import fr.titionfire.ffsaf.utils.CompetitionSystem;
import fr.titionfire.ffsaf.utils.SecurityCtx;
import io.quarkus.security.Authenticated;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.unchecked.Unchecked;
import jakarta.inject.Inject;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import java.util.List;
import java.util.function.Consumer;
// @Authenticated
@Authenticated
@Path("api/poule/{system}/")
public class PouleEndpoints {
@@ -29,16 +26,12 @@ public class PouleEndpoints {
@Inject
SecurityCtx securityCtx;
Consumer<ClubModel> checkPerm = Unchecked.consumer(clubModel -> {
if (!securityCtx.roleHas("federation_admin") && !securityCtx.isInClubGroup(clubModel.getId()))
throw new DForbiddenException();
});
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Uni<PouleData> getById(@PathParam("id") Long id) {
return service.getById(checkPerm, system, id);
return service.getById(securityCtx, system, id);
}
@GET
@@ -51,20 +44,20 @@ public class PouleEndpoints {
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Uni<PouleData> addOrUpdate(PouleData data) {
return service.addOrUpdate(checkPerm, system, data);
return service.addOrUpdate(securityCtx, system, data);
}
@POST
@Path("sync")
@Consumes(MediaType.APPLICATION_JSON)
public Uni<?> syncPoule(PouleFullData data) {
return service.syncPoule(system, data);
return service.syncPoule(securityCtx, system, data);
}
@DELETE
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Uni<?> delete(@PathParam("id") Long id) {
return service.delete(checkPerm, system, id);
return service.delete(securityCtx, system, id);
}
}