Joaquín Reñé
2025-10-07 146a0fb8b0e90f9196e569152f649baf60d6cc8f
securis/src/main/java/net/curisit/securis/services/BasicServices.java
....@@ -1,3 +1,6 @@
1
+/*
2
+ * Copyright @ 2013 CurisTEC, S.A.S. All Rights Reserved.
3
+ */
14 package net.curisit.securis.services;
25
36 import java.net.URI;
....@@ -32,96 +35,124 @@
3235 import net.curisit.securis.utils.TokenHelper;
3336
3437 /**
35
- * Basic services for login and basic app wrkflow
36
- *
37
- * @author roberto <roberto.sanchez@curisit.net>
38
+ * BasicServices
39
+ * <p>
40
+ * Minimal public endpoints for service liveness, version info and token checks.
41
+ * Also provides entry routing to SPA (admin/login/licenses) via /index.jsp.
42
+ *
43
+ * Security:
44
+ * <ul>
45
+ * <li>/check requires a valid bearer token (via {@link Securable}).</li>
46
+ * <li>/logout just logs intention; token invalidation is outside this class.</li>
47
+ * </ul>
48
+ *
49
+ * Author: roberto &lt;roberto.sanchez@curisit.net&gt;
50
+ * Last reviewed by JRA on Oct 5, 2025.
3851 */
3952 @Path("/")
4053 @ApplicationScoped
4154 public class BasicServices {
4255
43
- private static final Logger LOG = LogManager.getLogger(BasicServices.class);
56
+ private static final Logger LOG = LogManager.getLogger(BasicServices.class);
4457
45
- @Inject
46
- TokenHelper tokenHelper;
58
+ @Inject TokenHelper tokenHelper;
59
+ @Context EntityManager em;
4760
48
- @Context
49
- EntityManager em;
61
+ @Inject public BasicServices() {}
5062
51
- @Inject
52
- public BasicServices() {
53
- }
63
+ /**
64
+ * info<p>
65
+ * Simple liveness text endpoint.
66
+ *
67
+ * @param request
68
+ * @return response
69
+ */
70
+ @GET
71
+ @Path("/info")
72
+ @Produces({ MediaType.TEXT_PLAIN })
73
+ public Response info(@Context HttpServletRequest request) {
74
+ return Response.ok().entity("License server running OK. Date: " + new Date()).build();
75
+ }
5476
55
- @GET
56
- @Path("/info")
57
- @Produces({ MediaType.TEXT_PLAIN })
58
- public Response info(@Context HttpServletRequest request) {
59
- return Response.ok().entity("License server running OK. Date: " + new Date()).build();
60
- }
77
+ /**
78
+ * version<p>
79
+ * Returns semantic app version as JSON.
80
+ *
81
+ * @param request
82
+ * @return version
83
+ */
84
+ @GET
85
+ @Path("/version")
86
+ @Produces({ MediaType.APPLICATION_JSON })
87
+ public Map<String, String> version(@Context HttpServletRequest request) {
88
+ Map<String, String> resp = new HashMap<>();
89
+ resp.put("version", AppVersion.getInstance().getCompleteVersion());
90
+ return resp;
91
+ }
6192
62
- @GET
63
- @Path("/version")
64
- @Produces({ MediaType.APPLICATION_JSON })
65
- public Map<String, String> version(@Context HttpServletRequest request) {
66
- Map<String, String> resp = new HashMap<>();
67
-
68
- // Get the real version
69
- String version = AppVersion.getInstance().getCompleteVersion();
70
- resp.put("version", version);
71
- return resp;
72
- }
93
+ /**
94
+ * init<p>
95
+ * Redirects SPA modules to the main index page.
96
+ *
97
+ * @param module
98
+ * @param request
99
+ * @return response
100
+ */
101
+ @GET
102
+ @Path("/{module:(admin)|(login)|(licenses)}")
103
+ @Produces({ MediaType.TEXT_HTML })
104
+ public Response init(@PathParam("module") String module, @Context HttpServletRequest request) {
105
+ LOG.info("App index main.html");
106
+ URI uri = UriBuilder.fromUri("/index.jsp").build();
107
+ return Response.seeOther(uri).build();
108
+ }
73109
74
- @GET
75
- @Path("/{module:(admin)|(login)|(licenses)}")
76
- @Produces({ MediaType.TEXT_HTML })
77
- public Response init(@PathParam("module") String module, @Context HttpServletRequest request) {
78
- LOG.info("App index main.html");
79
- String page = "/index.jsp";
80
- URI uri = UriBuilder.fromUri(page).build();
81
- return Response.seeOther(uri).build();
82
- }
110
+ /**
111
+ * check<p>
112
+ * Validates a token (from header or query param).
113
+ *
114
+ * @param token X-Token header
115
+ * @param token2 token query param fallback
116
+ * @return 200 with user/date if valid, 401/403 otherwise
117
+ */
118
+ @GET
119
+ @Securable()
120
+ @Path("/check")
121
+ @Produces({ MediaType.APPLICATION_JSON })
122
+ @EnsureTransaction
123
+ public Response check(@HeaderParam(TokenHelper.TOKEN_HEADER_PÀRAM) String token, @QueryParam("token") String token2) {
124
+ if (token == null) token = token2;
125
+ if (token == null) {
126
+ return Response.status(Status.FORBIDDEN).build();
127
+ }
128
+ boolean valid = tokenHelper.isTokenValid(token);
129
+ if (!valid) {
130
+ return Response.status(Status.UNAUTHORIZED).build();
131
+ }
83132
84
- /**
85
- * Check if current token is valid
86
- *
87
- * @param user
88
- * @param password
89
- * @param request
90
- * @return
91
- */
92
- @GET
93
- @Securable()
94
- @Path("/check")
95
- @Produces({ MediaType.APPLICATION_JSON })
96
- @EnsureTransaction
97
- public Response check(@HeaderParam(TokenHelper.TOKEN_HEADER_PÀRAM) String token, @QueryParam("token") String token2) {
98
- if (token == null) {
99
- token = token2;
100
- }
101
- if (token == null) {
102
- return Response.status(Status.FORBIDDEN).build();
103
- }
104
- boolean valid = tokenHelper.isTokenValid(token);
105
- if (!valid) {
106
- return Response.status(Status.UNAUTHORIZED).build();
107
- }
133
+ String user = tokenHelper.extractUserFromToken(token);
134
+ Date date = tokenHelper.extractDateCreationFromToken(token);
135
+ return Response.ok(Utils.createMap("valid", true, "user", user, "date", date)).build();
136
+ }
108137
109
- String user = tokenHelper.extractUserFromToken(token);
110
- Date date = tokenHelper.extractDateCreationFromToken(token);
111
-
112
- return Response.ok(Utils.createMap("valid", true, "user", user, "date", date)).build();
113
- }
114
-
115
- @GET
116
- @POST
117
- @Path("/logout")
118
- @Produces({ MediaType.APPLICATION_JSON })
119
- public Response logout(@HeaderParam(TokenHelper.TOKEN_HEADER_PÀRAM) String token) {
120
- if (token == null) {
121
- Response.status(Status.BAD_REQUEST).build();
122
- }
123
- String user = tokenHelper.extractUserFromToken(token);
124
- LOG.info("User {} has logged out", user);
125
- return Response.ok().build();
126
- }
138
+ /**
139
+ * logout<p>
140
+ * Logs logout event. (Token invalidation is handled elsewhere.)
141
+ *
142
+ * @param token
143
+ * @return response
144
+ */
145
+ @GET
146
+ @POST
147
+ @Path("/logout")
148
+ @Produces({ MediaType.APPLICATION_JSON })
149
+ public Response logout(@HeaderParam(TokenHelper.TOKEN_HEADER_PÀRAM) String token) {
150
+ if (token == null) {
151
+ Response.status(Status.BAD_REQUEST).build();
152
+ }
153
+ String user = tokenHelper.extractUserFromToken(token);
154
+ LOG.info("User {} has logged out", user);
155
+ return Response.ok().build();
156
+ }
127157 }
158
+