Skip to content

Commit 7e7d003

Browse files
committed
add ztat uses
1 parent 5fb8fa3 commit 7e7d003

File tree

8 files changed

+232
-2
lines changed

8 files changed

+232
-2
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
ALTER TABLE ztat_approvals ADD COLUMN rationale TEXT;
2+
ALTER TABLE ops_approvals ADD COLUMN rationale TEXT;
3+
4+
CREATE TABLE IF NOT EXISTS ztat_uses (
5+
id BIGSERIAL PRIMARY KEY,
6+
ztat_approval_id BIGINT NOT NULL,
7+
user_id BIGINT NOT NULL,
8+
used_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
9+
FOREIGN KEY (ztat_approval_id) REFERENCES ztat_approvals(id),
10+
FOREIGN KEY (user_id) REFERENCES users(id)
11+
);
12+
13+
14+
CREATE TABLE IF NOT EXISTS ops_uses (
15+
id BIGSERIAL PRIMARY KEY,
16+
ops_approval_id BIGINT NOT NULL,
17+
user_id BIGINT NOT NULL,
18+
used_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
19+
FOREIGN KEY (ops_approval_id) REFERENCES ops_approvals(id),
20+
FOREIGN KEY (user_id) REFERENCES users(id)
21+
);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.sentrius.sso.core.model.zt;
2+
3+
import java.time.LocalDateTime;
4+
import io.sentrius.sso.core.model.users.User;
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.FetchType;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.GenerationType;
10+
import jakarta.persistence.Id;
11+
import jakarta.persistence.JoinColumn;
12+
import jakarta.persistence.ManyToOne;
13+
import jakarta.persistence.Table;
14+
import lombok.Getter;
15+
import lombok.Setter;
16+
import org.hibernate.annotations.CreationTimestamp;
17+
18+
@Entity
19+
@Setter
20+
@Getter
21+
@Table(name = "ops_uses")
22+
public class OpsUse {
23+
24+
@Id
25+
@GeneratedValue(strategy = GenerationType.IDENTITY)
26+
private Long id;
27+
28+
@ManyToOne(fetch = FetchType.LAZY)
29+
@JoinColumn(name = "ztat_approval_id", nullable = false)
30+
private ZeroTrustAccessTokenApproval ztatApproval;
31+
32+
@ManyToOne(fetch = FetchType.LAZY)
33+
@JoinColumn(name = "user_id", nullable = false)
34+
private User user;
35+
36+
@CreationTimestamp
37+
@Column(name = "used_at", nullable = false, updatable = false)
38+
private LocalDateTime usedAt;
39+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.sentrius.sso.core.model.zt;
2+
3+
4+
import java.time.LocalDateTime;
5+
import io.sentrius.sso.core.model.users.User;
6+
import jakarta.persistence.Column;
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.FetchType;
9+
import jakarta.persistence.GeneratedValue;
10+
import jakarta.persistence.GenerationType;
11+
import jakarta.persistence.Id;
12+
import jakarta.persistence.JoinColumn;
13+
import jakarta.persistence.ManyToOne;
14+
import jakarta.persistence.Table;
15+
import lombok.Getter;
16+
import lombok.Setter;
17+
import org.hibernate.annotations.CreationTimestamp;
18+
19+
@Entity
20+
@Setter
21+
@Getter
22+
@Table(name = "ztat_approval_history")
23+
public class ZeroTrustApprovalHistory {
24+
25+
@Id
26+
@GeneratedValue(strategy = GenerationType.IDENTITY)
27+
private Long id;
28+
29+
@ManyToOne(fetch = FetchType.LAZY)
30+
@JoinColumn(name = "ztat_request_id", nullable = false)
31+
private ZeroTrustAccessTokenRequest ztatRequest;
32+
33+
@ManyToOne(fetch = FetchType.LAZY)
34+
@JoinColumn(name = "approver_id", nullable = false)
35+
private User approver;
36+
37+
@Column(name = "approved", nullable = false)
38+
private boolean approved;
39+
40+
@Column(name = "rationale", columnDefinition = "TEXT")
41+
private String rationale;
42+
43+
@CreationTimestamp
44+
@Column(name = "decision_timestamp", nullable = false, updatable = false)
45+
private LocalDateTime decisionTimestamp;
46+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.sentrius.sso.core.model.zt;
2+
3+
import io.sentrius.sso.core.model.users.User;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.FetchType;
7+
import jakarta.persistence.GeneratedValue;
8+
import jakarta.persistence.GenerationType;
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.JoinColumn;
11+
import jakarta.persistence.ManyToOne;
12+
import jakarta.persistence.Table;
13+
import lombok.Getter;
14+
import lombok.Setter;
15+
import org.hibernate.annotations.CreationTimestamp;
16+
17+
import java.time.LocalDateTime;
18+
19+
@Entity
20+
@Setter
21+
@Getter
22+
@Table(name = "ztat_approval_history")
23+
public class ZtatApprovalHistory {
24+
25+
@Id
26+
@GeneratedValue(strategy = GenerationType.IDENTITY)
27+
private Long id;
28+
29+
@ManyToOne(fetch = FetchType.LAZY)
30+
@JoinColumn(name = "ztat_request_id", nullable = false)
31+
private ZeroTrustAccessTokenRequest ztatRequest;
32+
33+
@ManyToOne(fetch = FetchType.LAZY)
34+
@JoinColumn(name = "approver_id", nullable = false)
35+
private User approver;
36+
37+
@Column(name = "approved", nullable = false)
38+
private boolean approved;
39+
40+
@Column(name = "rationale", columnDefinition = "TEXT")
41+
private String rationale;
42+
43+
@CreationTimestamp
44+
@Column(name = "decision_timestamp", nullable = false, updatable = false)
45+
private LocalDateTime decisionTimestamp;
46+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.sentrius.sso.core.model.zt;
2+
3+
import java.time.LocalDateTime;
4+
import io.sentrius.sso.core.model.users.User;
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.FetchType;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.GenerationType;
10+
import jakarta.persistence.Id;
11+
import jakarta.persistence.JoinColumn;
12+
import jakarta.persistence.ManyToOne;
13+
import jakarta.persistence.Table;
14+
import lombok.AllArgsConstructor;
15+
import lombok.Builder;
16+
import lombok.Getter;
17+
import lombok.NoArgsConstructor;
18+
import lombok.Setter;
19+
import org.hibernate.annotations.CreationTimestamp;
20+
21+
@Entity
22+
@Setter
23+
@Builder
24+
@Getter
25+
@NoArgsConstructor
26+
@AllArgsConstructor
27+
@Table(name = "ztat_uses")
28+
public class ZtatUse {
29+
30+
@Id
31+
@GeneratedValue(strategy = GenerationType.IDENTITY)
32+
private Long id;
33+
34+
@ManyToOne(fetch = FetchType.LAZY)
35+
@JoinColumn(name = "ztat_approval_id", nullable = false)
36+
private ZeroTrustAccessTokenApproval ztatApproval;
37+
38+
@ManyToOne(fetch = FetchType.LAZY)
39+
@JoinColumn(name = "user_id", nullable = false)
40+
private User user;
41+
42+
@CreationTimestamp
43+
@Column(name = "used_at", nullable = false, updatable = false)
44+
private LocalDateTime usedAt;
45+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.sentrius.sso.core.repository;
2+
3+
import io.sentrius.sso.core.model.zt.OpsUse;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
@Repository
8+
public interface OpsUseRepository extends JpaRepository<OpsUse, Long> {
9+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.sentrius.sso.core.repository;
2+
3+
import java.util.List;
4+
import io.sentrius.sso.core.model.zt.ZeroTrustAccessTokenApproval;
5+
import io.sentrius.sso.core.model.zt.ZtatUse;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.stereotype.Repository;
9+
10+
@Repository
11+
public interface ZtatUseRepository extends JpaRepository<ZtatUse, Long> {
12+
13+
14+
@Query("SELECT ztu FROM ZtatUse ztu WHERE ztu.ztatApproval = :ztatApproval")
15+
List<ZtatUse> getUses(ZeroTrustAccessTokenApproval ztatApproval);
16+
}

core/src/main/java/io/sentrius/sso/core/services/ZeroTrustRequestService.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
import io.sentrius.sso.core.model.zt.ZeroTrustAccessTokenRequest;
99
import io.sentrius.sso.core.model.zt.OpsApproval;
1010
import io.sentrius.sso.core.model.zt.OpsZeroTrustAcessTokenRequest;
11+
import io.sentrius.sso.core.model.zt.ZtatUse;
1112
import io.sentrius.sso.core.repository.ZeroTrustAccessTokenApprovalRepository;
1213
import io.sentrius.sso.core.repository.JITReasonRepository;
1314
import io.sentrius.sso.core.repository.ZeroTrustAccessTokenRequestRepository;
1415
import io.sentrius.sso.core.repository.OpsApprovalRepository;
1516
import io.sentrius.sso.core.repository.OpsJITRequestRepository;
17+
import io.sentrius.sso.core.repository.ZtatUseRepository;
1618
import io.sentrius.sso.core.utils.ZTATUtils;
1719
import lombok.NonNull;
1820
import lombok.extern.slf4j.Slf4j;
@@ -45,6 +47,9 @@ public class ZeroTrustRequestService {
4547
@Autowired
4648
private SystemOptions systemOptions;
4749

50+
@Autowired
51+
private ZtatUseRepository ztatUseRepository;
52+
4853

4954
@Transactional(readOnly = true)
5055
public List<ZeroTrustAccessTokenRequest> getAllJITRequests() {
@@ -210,7 +215,8 @@ public void incrementAccessTokenUses(ZeroTrustAccessTokenRequest request) {
210215
if (approval.getUses() >= systemOptions.maxJitUses) {
211216
throw new RuntimeException("JIT uses exceeded");
212217
}
213-
approval.setUses(approval.getUses() + 1);
218+
;
219+
ztatUseRepository.save(ZtatUse.builder().ztatApproval(approval).user(request.getUser()).build());
214220
log.info("Incrementing uses for JITRequest: {}", request.getId());
215221
ztatApprovalRepository.save(approval);
216222
});
@@ -339,7 +345,8 @@ private Integer getUsesRemaining(ZeroTrustAccessTokenRequest request) {
339345
// get the latest approval
340346
List<ZeroTrustAccessTokenApproval> approval = request.getApprovals();
341347
if (!approval.isEmpty()) {
342-
return systemOptions.maxJitUses - approval.get(0).getUses();
348+
var uses = ztatUseRepository.getUses(approval.get(0));
349+
return systemOptions.maxJitUses - uses.size();
343350
}
344351

345352
return systemOptions.maxJitUses; // Update as needed based on your logic
@@ -349,6 +356,7 @@ private Integer getUsesRemaining(OpsZeroTrustAcessTokenRequest request) {
349356

350357
List<OpsApproval> approval = request.getApprovals();
351358
if (!approval.isEmpty()) {
359+
352360
return systemOptions.maxJitUses - approval.get(0).getUses();
353361
}
354362

0 commit comments

Comments
 (0)