Skip to content

Commit 1083877

Browse files
authored
Merge pull request #34 from SentriusLLC/issue33
WIP: Updates for issue #33
2 parents c6b40a1 + 9068cd6 commit 1083877

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1140
-408
lines changed

.gcp.env

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
SENTRIUS_VERSION=1.0.37
1+
SENTRIUS_VERSION=1.0.44
22
SENTRIUS_SSH_VERSION=1.0.4
3-
SENTRIUS_KEYCLOAK_VERSION=1.0.6
4-
SENTRIUS_AGENT_VERSION=1.0.16
3+
SENTRIUS_KEYCLOAK_VERSION=1.0.7
4+
SENTRIUS_AGENT_VERSION=1.0.18

analyagents/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@
6767
<groupId>org.projectlombok</groupId>
6868
<artifactId>lombok</artifactId>
6969
</dependency>
70+
<dependency>
71+
<groupId>net.snowflake</groupId>
72+
<artifactId>snowflake-ingest-sdk</artifactId>
73+
<version>${snowflake-ingest-version}</version>
74+
</dependency>
7075
</dependencies>
7176

7277
<build>

analyagents/src/main/java/io/sentrius/agent/analysis/agents/sessions/SessionAnalyticsAgent.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ public void processSessions() {
6161
List<TerminalSessionMetadata> unprocessedSessions = sessionMetadataService.getSessionsByState("CLOSED").stream()
6262
.filter(session -> !processedSessionIds.contains(session.getId()))
6363
.collect(Collectors.toList());
64-
64+
long count = 0;
6565
for (TerminalSessionMetadata session : unprocessedSessions) {
66+
count++;
6667
try {
6768
processSession(session);
6869
// ACTIVE -> INACTIVE -> CLOSED -> PROCESSED
@@ -75,7 +76,7 @@ public void processSessions() {
7576
sessionMetadataService.saveSession(session);
7677
}
7778

78-
log.info("Finished processing sessions");
79+
log.info("Finished processing {} sessions ", count);
7980
}
8081
/* TODO - Implement this
8182
@Scheduled(fixedDelay = 60000) // Waits 60 seconds after the previous run completes
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.sentrius.agent.analysis.sinks.log;
2+
3+
import java.util.List;
4+
import io.sentrius.sso.core.model.sessions.TerminalLogs;
5+
6+
public interface LogSink {
7+
8+
void process(List<TerminalLogs> logs);
9+
}

api/src/main/java/io/sentrius/sso/config/SecurityConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class SecurityConfig {
3737

3838
private final CustomUserDetailsService userDetailsService;
3939
private final CustomAuthenticationSuccessHandler successHandler;
40+
private final KeycloakAuthSuccessHandler keycloakAuthSuccessHandler;
4041
final UserService userService;
4142

4243
@Value("${https.required:false}") // Default is false
@@ -55,6 +56,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
5556
)
5657
.oauth2Login(oauth2 -> oauth2
5758
.loginPage("/oauth2/authorization/keycloak")
59+
.successHandler(keycloakAuthSuccessHandler)
5860
)
5961
.cors(Customizer.withDefaults());
6062

api/src/main/java/io/sentrius/sso/controllers/CustomErrorHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ public static String createErrorHash(StackTraceElement[] trace, String t) {
3434
@RequestMapping("/error")
3535
public String handleError(HttpServletRequest request, Model model) {
3636
// Retrieve error details
37-
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
38-
Throwable ex = (Throwable) request.getAttribute("javax.servlet.error.exception");
37+
Integer statusCode = (Integer) request.getAttribute("jakarta.servlet.error.status_code");
38+
Throwable ex = (Throwable) request.getAttribute("jakarta.servlet.error.exception");
3939

4040
// Log error details (optional)
4141
if (ex != null) {

api/src/main/java/io/sentrius/sso/controllers/api/IntegrationApiController.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
import org.springframework.http.ResponseEntity;
2323
import org.springframework.stereotype.Controller;
2424
import org.springframework.web.bind.annotation.PostMapping;
25+
import org.springframework.web.bind.annotation.RequestBody;
2526
import org.springframework.web.bind.annotation.RequestMapping;
2627
import org.springframework.web.bind.annotation.RequestParam;
28+
import org.springframework.web.bind.annotation.ResponseBody;
2729

2830
@Slf4j
2931
@Controller
@@ -76,9 +78,10 @@ public ResponseEntity<ExternalIntegrationDTO> addJiraIntegration(HttpServletRequ
7678
@LimitAccess(applicationAccess = {ApplicationAccessEnum.CAN_MANAGE_APPLICATION})
7779
public ResponseEntity<ExternalIntegrationDTO> addOpenaiIntegration(HttpServletRequest request,
7880
HttpServletResponse response,
79-
ExternalIntegrationDTO integrationDTO)
81+
@RequestBody ExternalIntegrationDTO integrationDTO)
8082
throws JsonProcessingException {
8183

84+
log.info("ahh");
8285

8386
var json = JsonUtil.MAPPER.writeValueAsString(integrationDTO);
8487
IntegrationSecurityToken token = IntegrationSecurityToken.builder()

api/src/main/java/io/sentrius/sso/controllers/api/UserApiController.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,33 @@
66
import java.util.List;
77
import java.util.Map;
88
import com.fasterxml.jackson.core.JsonProcessingException;
9+
import com.fasterxml.jackson.databind.JsonNode;
910
import com.fasterxml.jackson.databind.node.BooleanNode;
1011
import com.fasterxml.jackson.databind.node.IntNode;
1112
import com.fasterxml.jackson.databind.node.ObjectNode;
1213
import com.fasterxml.jackson.databind.node.TextNode;
1314
import io.sentrius.sso.core.annotations.LimitAccess;
1415
import io.sentrius.sso.core.annotations.Model;
1516
import io.sentrius.sso.core.controllers.BaseController;
17+
import io.sentrius.sso.core.model.HostSystem;
1618
import io.sentrius.sso.core.model.security.UserType;
1719
import io.sentrius.sso.core.model.users.User;
1820
import io.sentrius.sso.core.model.dto.UserDTO;
1921
import io.sentrius.sso.core.model.dto.UserTypeDTO;
2022
import io.sentrius.sso.core.model.security.enums.UserAccessEnum;
2123
import io.sentrius.sso.core.model.users.UserConfig;
2224
import io.sentrius.sso.core.model.users.UserSettings;
25+
import io.sentrius.sso.core.model.zt.OpsZeroTrustAcessTokenRequest;
26+
import io.sentrius.sso.core.model.zt.ZeroTrustAccessTokenRequest;
2327
import io.sentrius.sso.core.security.service.CryptoService;
2428
import io.sentrius.sso.core.services.ErrorOutputService;
2529
import io.sentrius.sso.core.services.SessionService;
2630
import io.sentrius.sso.core.services.UserCustomizationService;
2731
import io.sentrius.sso.core.services.UserService;
2832
import io.sentrius.sso.core.services.HostGroupService;
2933
import io.sentrius.sso.core.config.SystemOptions;
34+
import io.sentrius.sso.core.services.ZeroTrustAccessTokenService;
35+
import io.sentrius.sso.core.services.ZeroTrustRequestService;
3036
import io.sentrius.sso.core.utils.JsonUtil;
3137
import io.sentrius.sso.core.utils.MessagingUtil;
3238
import jakarta.servlet.http.HttpServletRequest;
@@ -37,6 +43,7 @@
3743
import org.springframework.web.bind.annotation.GetMapping;
3844
import org.springframework.web.bind.annotation.ModelAttribute;
3945
import org.springframework.web.bind.annotation.PostMapping;
46+
import org.springframework.web.bind.annotation.RequestBody;
4047
import org.springframework.web.bind.annotation.RequestMapping;
4148
import org.springframework.web.bind.annotation.RequestParam;
4249

@@ -51,6 +58,8 @@ public class UserApiController extends BaseController {
5158
final CryptoService cryptoService;
5259
private final MessagingUtil messagingUtil;
5360
final UserCustomizationService userThemeService;
61+
final ZeroTrustRequestService ztatRequestService;
62+
final ZeroTrustAccessTokenService ztatService;
5463

5564
static Map<String, Field> fields = new HashMap<>();
5665
static {
@@ -66,14 +75,18 @@ protected UserApiController(UserService userService, SystemOptions systemOptions
6675
HostGroupService hostGroupService, CryptoService cryptoService,
6776
MessagingUtil messagingUtil,
6877
UserCustomizationService userThemeService,
69-
SessionService sessionService
78+
SessionService sessionService,
79+
ZeroTrustRequestService ztatRequestService,
80+
ZeroTrustAccessTokenService ztatService
7081
) {
7182
super(userService, systemOptions, errorOutputService);
7283
this.hostGroupService = hostGroupService;
7384
this.cryptoService = cryptoService;
7485
this.messagingUtil = messagingUtil;
7586
this.userThemeService = userThemeService;
7687
this.sessionService = sessionService;
88+
this.ztatRequestService = ztatRequestService;
89+
this.ztatService = ztatService;
7790
}
7891

7992
@GetMapping("list")
@@ -117,7 +130,6 @@ public String deleteUser(@RequestParam("userId") String userId) throws GeneralSe
117130
}
118131

119132
@PostMapping("/settings")
120-
@LimitAccess(userAccess = {UserAccessEnum.CAN_EDIT_USERS})
121133
public String updateUser(HttpServletRequest request, HttpServletResponse response ) throws JsonProcessingException {
122134
var user = userService.getOperatingUser(request,response, null);
123135

@@ -163,6 +175,18 @@ public String updateUser(HttpServletRequest request, HttpServletResponse respons
163175
return "redirect:/sso/v1/users/settings?message=" + MessagingUtil.getMessageId(MessagingUtil.SETTINGS_UPDATED);
164176
}
165177

178+
@PostMapping("/settings/workhours")
179+
public String updateWorkhours(HttpServletRequest request, HttpServletResponse response,
180+
@RequestBody JsonNode body) throws JsonProcessingException {
181+
log.info("Updating work hours: {}", body);
182+
/*
183+
var reason = ztatService.createReason("Updating work hours", "Updating work hours", "");
184+
var ztatRequest = ztatService.createOpsRequest("Updating work hours", "Updating work hours",
185+
reason, userService.getOperatingUser(request,response, null));
186+
ztatRequestService.createOpsTATRequest(ztatRequest);*/
187+
return "";
188+
}
189+
166190
@GetMapping("/types/list")
167191
@LimitAccess(userAccess = {UserAccessEnum.CAN_MANAGE_USERS})
168192
public ResponseEntity<List<UserTypeDTO>> getUserTypes() throws GeneralSecurityException {

api/src/main/java/io/sentrius/sso/controllers/api/ZeroTrustATApiController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@
1313
import io.sentrius.sso.core.config.SystemOptions;
1414
import jakarta.servlet.http.HttpServletRequest;
1515
import jakarta.servlet.http.HttpServletResponse;
16+
import lombok.extern.slf4j.Slf4j;
1617
import org.springframework.http.ResponseEntity;
1718
import org.springframework.stereotype.Controller;
1819
import org.springframework.web.bind.annotation.GetMapping;
1920
import org.springframework.web.bind.annotation.PathVariable;
2021
import org.springframework.web.bind.annotation.RequestMapping;
2122
import org.springframework.web.bind.annotation.RequestParam;
2223

24+
@Slf4j
2325
@Controller
2426
@RequestMapping("/api/v1/zerotrust/accesstoken")
2527
public class ZeroTrustATApiController extends BaseController {
@@ -52,6 +54,7 @@ public String manageRequest(HttpServletRequest request, HttpServletResponse resp
5254
@RequestParam("ztatId") Long ztatId) throws SQLException, GeneralSecurityException {
5355
var operatingUser = getOperatingUser(request, response);
5456
if (null != type ){
57+
log.info("Operating user {} is managing a {} request with status {}", operatingUser, type, status);
5558
switch(type){
5659
case "terminal":
5760
manageTerminalZtAt(operatingUser, ztatId, status);

api/src/main/java/io/sentrius/sso/controllers/view/UserController.java

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,35 @@
11
package io.sentrius.sso.controllers.view;
22

33
import java.lang.reflect.Field;
4+
import java.security.GeneralSecurityException;
45
import java.util.ArrayList;
56
import java.util.HashSet;
67
import java.util.List;
8+
import java.util.Map;
79
import java.util.Set;
10+
import java.util.stream.Collectors;
811
import com.fasterxml.jackson.core.JsonProcessingException;
912
import com.fasterxml.jackson.databind.JsonNode;
1013
import com.fasterxml.jackson.databind.ObjectMapper;
1114
import io.sentrius.sso.core.annotations.LimitAccess;
1215
import io.sentrius.sso.core.controllers.BaseController;
16+
import io.sentrius.sso.core.model.WorkHours;
17+
import io.sentrius.sso.core.model.dto.DayOfWeekDTO;
1318
import io.sentrius.sso.core.model.dto.SystemOption;
19+
import io.sentrius.sso.core.model.dto.UserDTO;
1420
import io.sentrius.sso.core.model.dto.UserTypeDTO;
1521
import io.sentrius.sso.core.model.security.UserType;
1622
import io.sentrius.sso.core.model.security.enums.UserAccessEnum;
1723
import io.sentrius.sso.core.model.users.User;
1824
import io.sentrius.sso.core.model.users.UserConfig;
1925
import io.sentrius.sso.core.model.users.UserSettings;
26+
import io.sentrius.sso.core.repository.UserTypeRepository;
27+
import io.sentrius.sso.core.security.service.CryptoService;
2028
import io.sentrius.sso.core.services.ErrorOutputService;
2129
import io.sentrius.sso.core.services.UserCustomizationService;
2230
import io.sentrius.sso.core.services.UserService;
2331
import io.sentrius.sso.core.config.SystemOptions;
32+
import io.sentrius.sso.core.services.WorkHoursService;
2433
import io.sentrius.sso.core.utils.JsonUtil;
2534
import jakarta.servlet.http.HttpServletRequest;
2635
import jakarta.servlet.http.HttpServletResponse;
@@ -29,18 +38,27 @@
2938
import org.springframework.ui.Model;
3039
import org.springframework.web.bind.annotation.GetMapping;
3140
import org.springframework.web.bind.annotation.ModelAttribute;
41+
import org.springframework.web.bind.annotation.PathVariable;
3242
import org.springframework.web.bind.annotation.RequestMapping;
43+
import org.springframework.web.bind.annotation.RequestParam;
3344

3445
@Slf4j
3546
@Controller
3647
@RequestMapping("/sso/v1/users")
3748
public class UserController extends BaseController {
3849

3950
final UserCustomizationService userThemeService;
51+
final WorkHoursService workHoursService;
52+
final CryptoService cryptoService;
4053

41-
protected UserController(UserService userService, SystemOptions systemOptions, ErrorOutputService errorOutputService, UserCustomizationService userThemeService) {
54+
protected UserController(UserService userService, SystemOptions systemOptions,
55+
ErrorOutputService errorOutputService, UserCustomizationService userThemeService, WorkHoursService workHoursService,
56+
CryptoService cryptoService
57+
) {
4258
super(userService, systemOptions, errorOutputService);
4359
this.userThemeService = userThemeService;
60+
this.workHoursService = workHoursService;
61+
this.cryptoService = cryptoService;
4462
}
4563

4664
@ModelAttribute("userSettings")
@@ -147,9 +165,45 @@ public String listUsers(Model model) {
147165
return "sso/users/list_users";
148166
}
149167

168+
169+
@GetMapping("/edit")
170+
@LimitAccess(userAccess = {UserAccessEnum.CAN_EDIT_USERS})
171+
public String editUser(Model model, HttpServletRequest request, HttpServletResponse response,
172+
@RequestParam("userId") String userId) throws GeneralSecurityException {
173+
model.addAttribute("globalAccessSet", UserType.createSuperUser().getAccessSet());
174+
Long id = Long.parseLong(cryptoService.decrypt(userId));
175+
User user = userService.getUserById(id);
176+
UserDTO userDTO = new UserDTO(user);
177+
var types = userService.getUserTypeList();
178+
model.addAttribute("userTypes",types);
179+
model.addAttribute("user", userDTO);
180+
return "sso/users/edit_user";
181+
}
182+
150183
@GetMapping("/settings")
151184
@LimitAccess(userAccess = {UserAccessEnum.CAN_VIEW_USERS})
152-
public String getUserSettings(HttpServletRequest request, HttpServletResponse response) {
185+
public String getUserSettings(Model model, HttpServletRequest request, HttpServletResponse response) {
186+
187+
var user = userService.getOperatingUser(request,response, null);
188+
189+
List<WorkHours> workHoursList = workHoursService.getWorkHoursForUser(user.getId());
190+
191+
// Convert the list into a Map where the key is the day of the week (0-6)
192+
Map<Integer, WorkHours> userWorkHours = workHoursList.stream()
193+
.collect(Collectors.toMap(WorkHours::getDayOfWeek, wh -> wh));
194+
195+
// Pass data to Thymeleaf
196+
model.addAttribute("userWorkHours", userWorkHours);
197+
model.addAttribute("daysOfWeek", List.of(
198+
new DayOfWeekDTO(0, "Sunday"),
199+
new DayOfWeekDTO(1, "Monday"),
200+
new DayOfWeekDTO(2, "Tuesday"),
201+
new DayOfWeekDTO(3, "Wednesday"),
202+
new DayOfWeekDTO(4, "Thursday"),
203+
new DayOfWeekDTO(5, "Friday"),
204+
new DayOfWeekDTO(6, "Saturday")
205+
));
206+
153207
return "sso/users/user_settings";
154208
}
155209

0 commit comments

Comments
 (0)