mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-08 07:27:43 +00:00
Fix: Multiple approvers acceptance bug
This commit is contained in:
+23
-17
@@ -274,8 +274,8 @@ export const accessApprovalRequestServiceFactory = ({
|
|||||||
|
|
||||||
const approvedReviews = allReviews.filter((r) => r.status === ApprovalStatus.APPROVED);
|
const approvedReviews = allReviews.filter((r) => r.status === ApprovalStatus.APPROVED);
|
||||||
|
|
||||||
// If all approvers have approved the request, update the privilege to approved
|
// approvals is the required number of approvals. If the number of approved reviews is equal to the number of required approvals, then the request is approved.
|
||||||
if (approvedReviews.length === policy.approvers.length) {
|
if (approvedReviews.length === policy.approvals) {
|
||||||
if (accessApprovalRequest.isTemporary && !accessApprovalRequest.temporaryRange) {
|
if (accessApprovalRequest.isTemporary && !accessApprovalRequest.temporaryRange) {
|
||||||
throw new BadRequestError({ message: "Temporary range is required for temporary access" });
|
throw new BadRequestError({ message: "Temporary range is required for temporary access" });
|
||||||
}
|
}
|
||||||
@@ -284,27 +284,33 @@ export const accessApprovalRequestServiceFactory = ({
|
|||||||
|
|
||||||
if (!accessApprovalRequest.isTemporary && !accessApprovalRequest.temporaryRange) {
|
if (!accessApprovalRequest.isTemporary && !accessApprovalRequest.temporaryRange) {
|
||||||
// Permanent access
|
// Permanent access
|
||||||
const privilege = await additionalPrivilegeDAL.create({
|
const privilege = await additionalPrivilegeDAL.create(
|
||||||
projectMembershipId: accessApprovalRequest.requestedBy,
|
{
|
||||||
slug: `requested-privilege-${slugify(alphaNumericNanoId(12))}`,
|
projectMembershipId: accessApprovalRequest.requestedBy,
|
||||||
permissions: JSON.stringify(accessApprovalRequest.permissions)
|
slug: `requested-privilege-${slugify(alphaNumericNanoId(12))}`,
|
||||||
});
|
permissions: JSON.stringify(accessApprovalRequest.permissions)
|
||||||
|
},
|
||||||
|
tx
|
||||||
|
);
|
||||||
privilegeId = privilege.id;
|
privilegeId = privilege.id;
|
||||||
} else {
|
} else {
|
||||||
// Temporary access
|
// Temporary access
|
||||||
const relativeTempAllocatedTimeInMs = ms(accessApprovalRequest.temporaryRange!);
|
const relativeTempAllocatedTimeInMs = ms(accessApprovalRequest.temporaryRange!);
|
||||||
const startTime = new Date();
|
const startTime = new Date();
|
||||||
|
|
||||||
const privilege = await additionalPrivilegeDAL.create({
|
const privilege = await additionalPrivilegeDAL.create(
|
||||||
projectMembershipId: accessApprovalRequest.requestedBy,
|
{
|
||||||
slug: `requested-privilege-${slugify(alphaNumericNanoId(12))}`,
|
projectMembershipId: accessApprovalRequest.requestedBy,
|
||||||
permissions: JSON.stringify(accessApprovalRequest.permissions),
|
slug: `requested-privilege-${slugify(alphaNumericNanoId(12))}`,
|
||||||
isTemporary: true,
|
permissions: JSON.stringify(accessApprovalRequest.permissions),
|
||||||
temporaryMode: ProjectUserAdditionalPrivilegeTemporaryMode.Relative,
|
isTemporary: true,
|
||||||
temporaryRange: accessApprovalRequest.temporaryRange!,
|
temporaryMode: ProjectUserAdditionalPrivilegeTemporaryMode.Relative,
|
||||||
temporaryAccessStartTime: startTime,
|
temporaryRange: accessApprovalRequest.temporaryRange!,
|
||||||
temporaryAccessEndTime: new Date(new Date(startTime).getTime() + relativeTempAllocatedTimeInMs)
|
temporaryAccessStartTime: startTime,
|
||||||
});
|
temporaryAccessEndTime: new Date(new Date(startTime).getTime() + relativeTempAllocatedTimeInMs)
|
||||||
|
},
|
||||||
|
tx
|
||||||
|
);
|
||||||
privilegeId = privilege.id;
|
privilegeId = privilege.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+23
-9
@@ -342,12 +342,14 @@ export const AccessApprovalRequest = ({
|
|||||||
displayData = { label: "Access Granted", colorClass: "bg-green/20 text-green" };
|
displayData = { label: "Access Granted", colorClass: "bg-green/20 text-green" };
|
||||||
else if (isRejectedByAnyone)
|
else if (isRejectedByAnyone)
|
||||||
displayData = { label: "Rejected", colorClass: "bg-red/20 text-red" };
|
displayData = { label: "Rejected", colorClass: "bg-red/20 text-red" };
|
||||||
else if (userReviewStatus === ApprovalStatus.APPROVED)
|
else if (userReviewStatus === ApprovalStatus.APPROVED) {
|
||||||
displayData = {
|
displayData = {
|
||||||
label: `Pending ${request.policy.approvals - request.reviewers.length} reviews`,
|
label: `Pending ${request.policy.approvals - request.reviewers.length} review${
|
||||||
|
request.policy.approvals - request.reviewers.length > 1 ? "s" : ""
|
||||||
|
}`,
|
||||||
colorClass: "bg-yellow/20 text-yellow"
|
colorClass: "bg-yellow/20 text-yellow"
|
||||||
};
|
};
|
||||||
else if (!isReviewedByUser)
|
} else if (!isReviewedByUser)
|
||||||
displayData = {
|
displayData = {
|
||||||
label: "Review Required",
|
label: "Review Required",
|
||||||
colorClass: "bg-yellow/20 text-yellow"
|
colorClass: "bg-yellow/20 text-yellow"
|
||||||
@@ -499,14 +501,21 @@ export const AccessApprovalRequest = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
aria-disabled={details.isReviewedByUser || details.isRejectedByAnyone}
|
aria-disabled={
|
||||||
|
details.isReviewedByUser || details.isRejectedByAnyone || details.isAccepted
|
||||||
|
}
|
||||||
key={request.id}
|
key={request.id}
|
||||||
className="flex w-full cursor-pointer px-8 py-4 hover:bg-mineshaft-700 aria-disabled:opacity-80"
|
className="flex w-full cursor-pointer px-8 py-4 hover:bg-mineshaft-700 aria-disabled:opacity-80"
|
||||||
role="button"
|
role="button"
|
||||||
tabIndex={0}
|
tabIndex={0}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (!details.isApprover) return;
|
if (
|
||||||
if (details.isReviewedByUser || details.isRejectedByAnyone) return;
|
!details.isApprover ||
|
||||||
|
details.isReviewedByUser ||
|
||||||
|
details.isRejectedByAnyone ||
|
||||||
|
details.isAccepted
|
||||||
|
)
|
||||||
|
return;
|
||||||
|
|
||||||
setSelectedRequest({
|
setSelectedRequest({
|
||||||
...request,
|
...request,
|
||||||
@@ -515,8 +524,13 @@ export const AccessApprovalRequest = ({
|
|||||||
handlePopUpOpen("reviewRequest");
|
handlePopUpOpen("reviewRequest");
|
||||||
}}
|
}}
|
||||||
onKeyDown={(evt) => {
|
onKeyDown={(evt) => {
|
||||||
if (!details.isApprover) return;
|
if (
|
||||||
if (details.isReviewedByUser || details.isRejectedByAnyone) return;
|
!details.isApprover ||
|
||||||
|
details.isAccepted ||
|
||||||
|
details.isReviewedByUser ||
|
||||||
|
details.isRejectedByAnyone
|
||||||
|
)
|
||||||
|
return;
|
||||||
if (evt.key === "Enter") {
|
if (evt.key === "Enter") {
|
||||||
setSelectedRequest({
|
setSelectedRequest({
|
||||||
...request,
|
...request,
|
||||||
@@ -543,7 +557,7 @@ export const AccessApprovalRequest = ({
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="">
|
<div>
|
||||||
{details.isApprover && (
|
{details.isApprover && (
|
||||||
<DisplayBadge
|
<DisplayBadge
|
||||||
text={details.displayData.label}
|
text={details.displayData.label}
|
||||||
|
|||||||
Reference in New Issue
Block a user