From 78b085815b9873acdf178b2e9c9598d065fd40c0 Mon Sep 17 00:00:00 2001
From: Joaquín Reñé <jrene@curisit.net>
Date: Mon, 20 Apr 2026 19:30:51 +0000
Subject: [PATCH] #4479 - upgrade SecurisServer to Java 21

---
 securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java     |    3 
 securis/src/main/webapp/src/app/resources/licenses.ts                        |   22 ++-
 securis/src/main/java/net/curisit/securis/RestServicesApplication.java       |    4 
 securis/src/main/webapp/src/app/resources/base.ts                            |   94 +++++++++-----
 securis/src/main/java/net/curisit/securis/services/ApiResource.java          |    2 
 securis/src/main/webapp/src/app/resources/users.ts                           |    5 
 securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java       |    5 
 securis/src/main/webapp/src/app/resources/organizations.ts                   |    5 
 securis/src/main/webapp/src/app/footer.component.ts                          |    2 
 securis/src/main/webapp/src/app/forms/base.ts                                |    2 
 securis/src/main/webapp/src/app/resources/applications.ts                    |    5 
 securis/src/main/java/net/curisit/securis/services/ApplicationResource.java  |    4 
 securis/src/main/java/net/curisit/securis/services/PackResource.java         |    2 
 securis/src/main/webapp/WEB-INF/log4j2.xml                                   |   55 +-------
 securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java  |    4 
 securis/src/main/webapp/src/app/resources/packs.ts                           |   33 +++--
 securis/src/main/webapp/WEB-INF/web.xml                                      |   12 +
 securis/src/main/java/net/curisit/securis/services/UserResource.java         |   35 +++++
 securis/src/main/webapp/src/app/forms/pack.form.component.ts                 |    2 
 securis/src/main/webapp/src/app/resources/license_types.ts                   |    5 
 securis/src/main/webapp/src/app/user.service.ts                              |    4 
 securis/src/main/java/net/curisit/securis/services/OrganizationResource.java |   44 ++++---
 securis/src/main/java/net/curisit/securis/LicenseGenerator.java              |    4 
 23 files changed, 197 insertions(+), 156 deletions(-)

diff --git a/securis/src/main/java/net/curisit/securis/LicenseGenerator.java b/securis/src/main/java/net/curisit/securis/LicenseGenerator.java
index 419ba29..c9c8f79 100644
--- a/securis/src/main/java/net/curisit/securis/LicenseGenerator.java
+++ b/securis/src/main/java/net/curisit/securis/LicenseGenerator.java
@@ -27,7 +27,7 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
-import jakarta.inject.Singleton;
+import jakarta.enterprise.context.ApplicationScoped;
 
 /**
 * LicenseGenerator
@@ -39,7 +39,7 @@
 * @author JRA
 * Last reviewed by JRA on Oct 5, 2025.
 */
-@Singleton
+@ApplicationScoped
 public class LicenseGenerator {
 
     private static final Logger LOG = LogManager.getLogger(LicenseGenerator.class);
diff --git a/securis/src/main/java/net/curisit/securis/RestServicesApplication.java b/securis/src/main/java/net/curisit/securis/RestServicesApplication.java
index b6a7ea3..6300925 100644
--- a/securis/src/main/java/net/curisit/securis/RestServicesApplication.java
+++ b/securis/src/main/java/net/curisit/securis/RestServicesApplication.java
@@ -8,7 +8,7 @@
 
 import jakarta.ws.rs.core.Application;
 
-/// import net.curisit.securis.ioc.RequestsInterceptor;
+import net.curisit.securis.ioc.RequestsInterceptor;
 import net.curisit.securis.services.ApiResource;
 import net.curisit.securis.services.ApplicationResource;
 import net.curisit.securis.services.BasicServices;
@@ -50,7 +50,7 @@
         classes.add(OrganizationResource.class);
         classes.add(LicenseTypeResource.class);
         classes.add(PackResource.class);
-        /// classes.add(RequestsInterceptor.class);
+        classes.add(RequestsInterceptor.class);
         // classes.add(TransactionsInterceptor.class);
         // classes.add(JpaJacksonProvider.class);
         // classes.add(JacksonConfig.class);
diff --git a/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java b/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java
index dc560fa..f40d3ab 100644
--- a/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java
+++ b/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java
@@ -21,8 +21,7 @@
 
     private static final Logger log = LogManager.getLogger(EntityManagerProducer.class);
 
-    @Inject
-    private EntityManagerProvider emProvider;
+    @Inject private EntityManagerProvider emProvider;
 
     @Produces
     @RequestScoped
diff --git a/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java b/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
index 64e3e92..6865d77 100644
--- a/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
+++ b/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
@@ -28,7 +28,7 @@
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-
+import org.jboss.resteasy.core.ResteasyContext;
 import net.curisit.securis.db.User;
 import net.curisit.securis.security.BasicSecurityContext;
 import net.curisit.securis.security.Securable;
@@ -189,6 +189,9 @@
         sc.setOrganizationsIds(getUserOrganizations(username));
         sc.setApplicationsIds(getUserApplications(username));
         ctx.setSecurityContext(sc);
+        
+        ResteasyContext.pushContext(BasicSecurityContext.class, sc);
+        
         return true;
     }
 
diff --git a/securis/src/main/java/net/curisit/securis/services/ApiResource.java b/securis/src/main/java/net/curisit/securis/services/ApiResource.java
index 07da3d2..a151588 100644
--- a/securis/src/main/java/net/curisit/securis/services/ApiResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/ApiResource.java
@@ -7,6 +7,7 @@
 import java.util.Date;
 import java.util.List;
 
+import jakarta.enterprise.context.RequestScoped;
 import jakarta.inject.Inject;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.NoResultException;
@@ -76,6 +77,7 @@
 * Last reviewed by JRA on Oct 5, 2025.
 */
 @Path("/api")
+@RequestScoped
 public class ApiResource {
 
     private static final Logger LOG = LogManager.getLogger(ApiResource.class);
diff --git a/securis/src/main/java/net/curisit/securis/services/ApplicationResource.java b/securis/src/main/java/net/curisit/securis/services/ApplicationResource.java
index 3022fde..7d1265d 100644
--- a/securis/src/main/java/net/curisit/securis/services/ApplicationResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/ApplicationResource.java
@@ -10,6 +10,7 @@
 import java.util.Set;
 
 import jakarta.annotation.security.RolesAllowed;
+import jakarta.enterprise.context.RequestScoped;
 import jakarta.inject.Inject;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.TypedQuery;
@@ -63,12 +64,13 @@
  * Last reviewed by JRA on Oct 5, 2025.
  */
 @Path("/application")
+@RequestScoped
 public class ApplicationResource {
 
     @Inject TokenHelper tokenHelper;
     @Inject MetadataHelper metadataHelper;
 
-    @Context EntityManager em;
+    @Inject EntityManager em;
 
     private static final Logger LOG = LogManager.getLogger(ApplicationResource.class);
 
diff --git a/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java b/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
index 04c15a2..4be86cf 100644
--- a/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
@@ -10,6 +10,7 @@
 import java.util.stream.Collectors;
 
 import jakarta.annotation.security.RolesAllowed;
+import jakarta.enterprise.context.RequestScoped;
 import jakarta.inject.Inject;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.TypedQuery;
@@ -57,6 +58,7 @@
  * Last reviewed by JRA on Oct 5, 2025.
  */
 @Path("/licensetype")
+@RequestScoped
 public class LicenseTypeResource {
 
 	private static final Logger LOG = LogManager.getLogger(LicenseTypeResource.class);
@@ -64,7 +66,7 @@
 	@Inject TokenHelper tokenHelper;
 	@Inject MetadataHelper metadataHelper;
 
-	@Context EntityManager em;
+	@Inject EntityManager em;
 
 	public LicenseTypeResource() { }
 
diff --git a/securis/src/main/java/net/curisit/securis/services/OrganizationResource.java b/securis/src/main/java/net/curisit/securis/services/OrganizationResource.java
index 30d5940..831e5a3 100644
--- a/securis/src/main/java/net/curisit/securis/services/OrganizationResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/OrganizationResource.java
@@ -10,6 +10,7 @@
 
 import jakarta.annotation.security.RolesAllowed;
 import jakarta.enterprise.context.RequestScoped;
+import jakarta.inject.Inject;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.TypedQuery;
 import jakarta.servlet.http.HttpServletRequest;
@@ -26,6 +27,7 @@
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
+import jakarta.ws.rs.core.SecurityContext;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -55,8 +57,7 @@
 
 	private static final Logger LOG = LogManager.getLogger(OrganizationResource.class);
 
-	@Context EntityManager em;
-	@Context BasicSecurityContext bsc;
+	@Inject EntityManager em;
 
 	public OrganizationResource() { }
 
@@ -72,23 +73,28 @@
 	@Path("/")
 	@Produces({ MediaType.APPLICATION_JSON })
 	@Securable
-	public Response index() {
-		LOG.info("Getting organizations list ");
-		em.clear();
-		TypedQuery<Organization> q;
-		if (bsc.isUserInRole(BasicSecurityContext.ROL_ADMIN)) {
-			LOG.info("GEtting all orgs for user: " + bsc.getUserPrincipal());
-			q = em.createNamedQuery("list-organizations", Organization.class);
-		} else {
-			if (bsc.getOrganizationsIds() == null || bsc.getOrganizationsIds().isEmpty()) {
-				return Response.ok().build();
-			} else {
-				q = em.createNamedQuery("list-organizations-by-ids", Organization.class);
-				q.setParameter("list_ids", bsc.getOrganizationsIds());
-			}
-		}
-		List<Organization> list = q.getResultList();
-		return Response.ok(list).build();
+	public Response index(@Context SecurityContext securityContext) {
+		BasicSecurityContext bsc = org.jboss.resteasy.core.ResteasyContext.getContextData(BasicSecurityContext.class);
+	    if (bsc == null) {
+	    	LOG.error("BasicSecurityContext not found in ResteasyContext");
+	        return Response.status(Status.UNAUTHORIZED).build();
+	    }
+	    LOG.info("Getting organizations list ");
+	    em.clear();
+	    TypedQuery<Organization> q;
+	    if (bsc.isUserInRole(BasicSecurityContext.ROL_ADMIN)) {
+	        LOG.info("Getting all orgs for user: " + bsc.getUserPrincipal());
+	        q = em.createNamedQuery("list-organizations", Organization.class);
+	    } else {
+	        if (bsc.getOrganizationsIds() == null || bsc.getOrganizationsIds().isEmpty()) {
+	            return Response.ok().build();
+	        } else {
+	            q = em.createNamedQuery("list-organizations-by-ids", Organization.class);
+	            q.setParameter("list_ids", bsc.getOrganizationsIds());
+	        }
+	    }
+	    List<Organization> list = q.getResultList();
+	    return Response.ok(list).build();
 	}
 
 	/**
diff --git a/securis/src/main/java/net/curisit/securis/services/PackResource.java b/securis/src/main/java/net/curisit/securis/services/PackResource.java
index 5049445..b390b87 100644
--- a/securis/src/main/java/net/curisit/securis/services/PackResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/PackResource.java
@@ -11,6 +11,7 @@
 import java.util.Set;
 
 import jakarta.annotation.security.RolesAllowed;
+import jakarta.enterprise.context.RequestScoped;
 import jakarta.inject.Inject;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.TypedQuery;
@@ -66,6 +67,7 @@
  * Last reviewed by JRA on Oct 5, 2025.
  */
 @Path("/pack")
+@RequestScoped
 public class PackResource {
 
 	private static final Logger LOG = LogManager.getLogger(PackResource.class);
diff --git a/securis/src/main/java/net/curisit/securis/services/UserResource.java b/securis/src/main/java/net/curisit/securis/services/UserResource.java
index 3674d25..85fd4b7 100644
--- a/securis/src/main/java/net/curisit/securis/services/UserResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/UserResource.java
@@ -407,11 +407,15 @@
         LOG.info("login() called. session={}", request.getSession(false));
         LOG.info("login() username='{}'", username);
         
-        LOG.info("UserResource instance={}", this);
-        LOG.info("Injected em={}", em);
-        LOG.info("Injected tokenHelper={}", tokenHelper);
-        LOG.info("Injected cache={}", cache);
-
+        boolean trazalogin = false;
+        
+        if (trazalogin) {
+	        LOG.info("UserResource instance={}", this);
+	        LOG.info("Injected em={}", em);
+	        LOG.info("Injected tokenHelper={}", tokenHelper);
+	        LOG.info("Injected cache={}", cache);
+        }
+        
         if (username == null || username.trim().isEmpty()) {
             LOG.error("login() username is null or empty");
             throw new SeCurisServiceException(ErrorCodes.UNAUTHORIZED_ACCESS, "Wrong credentials");
@@ -432,6 +436,27 @@
         String securedPassword = Utils.sha256(password);
         LOG.info("login() hashed password generated? {}", securedPassword != null);
 
+        if (trazalogin) {
+	        LOG.info("login() stored password hash='{}'", user.getPassword());
+	        LOG.info("login() computed password hash='{}'", securedPassword);
+	        LOG.info("login() stored length={}, computed length={}",
+	                user.getPassword() == null ? null : user.getPassword().length(),
+	                securedPassword == null ? null : securedPassword.length());
+	        
+	        
+	        LOG.info("raw password='{}'", password);
+	        LOG.info("sha256(raw)='{}'", Utils.sha256(password));
+	        LOG.info("sha256(trim)='{}'", Utils.sha256(password == null ? null : password.trim()));
+	        LOG.info("sha256(lower)='{}'", Utils.sha256(password == null ? null : password.toLowerCase()));
+	        LOG.info("sha256(upper)='{}'", Utils.sha256(password == null ? null : password.toUpperCase()));
+	        LOG.info("sha256(username+password)='{}'", Utils.sha256(username + password));
+	        LOG.info("sha256(password+username)='{}'", Utils.sha256(password + username));
+	        LOG.info("stored hash='{}'", user.getPassword());
+	        
+	        LOG.info("password.equals('admin')={}", "admin".equals(password));
+	        LOG.info("password length={}", password == null ? null : password.length());
+        }    
+	        
         if (securedPassword == null || !securedPassword.equals(user.getPassword())) {
             LOG.error("Wrong password for user '{}'", username);
             throw new SeCurisServiceException(ErrorCodes.UNAUTHORIZED_ACCESS, "Wrong credentials");
diff --git a/securis/src/main/webapp/WEB-INF/log4j2.xml b/securis/src/main/webapp/WEB-INF/log4j2.xml
index a3ae586..17943a4 100644
--- a/securis/src/main/webapp/WEB-INF/log4j2.xml
+++ b/securis/src/main/webapp/WEB-INF/log4j2.xml
@@ -1,48 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Configuration>
-	<Appenders>
-
-		<RollingFile name="defaultFile"
-			fileName="${sys:catalina.home}/logs/securis-server.log" append="true"
-			filePattern="${sys:catalina.home}/logs/securis-server-%d{yyyy-MM-dd-HH}.log.gz">
-			<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
-			<Policies>
-				<TimeBasedTriggeringPolicy interval="1"
-					modulate="true" />
-			</Policies>
-			<DefaultRolloverStrategy max="10" />
-		</RollingFile>
-		<Async name="defaultFileAsync" includeLocation="true">
-			<AppenderRef ref="defaultFile" />
-		</Async>
-
-		<Console name="stdout" target="SYSTEM_OUT">
-			<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
-		</Console>
-
-		<Console name="console" target="SYSTEM_OUT">
-			<PatternLayout pattern="%m%n" />
-		</Console>
-	</Appenders>
-	<Loggers>
-
-		<Logger name="net.curisit" level="INFO" additivity="false">
-			<AppenderRef ref="defaultFileAsync" />
-			<AppenderRef ref="stdout" />
-		</Logger>
-
-		<Logger name="console" level="INFO" additivity="false">
-			<AppenderRef ref="console" />
-		</Logger>
-
-<!-- 		<logger name="org.hibernate.type.descriptor.sql.BasicBinder"
-			level="TRACE" additivity="false">
-			<appender-ref ref="stdout" />
-		</logger> -->
-
-		<Root level="INFO">
-			<AppenderRef ref="stdout" />
-		</Root>
-
-	</Loggers>
+  <Appenders>
+    <Console name="STDOUT" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <Root level="info">
+      <AppenderRef ref="STDOUT"/>
+    </Root>
+  </Loggers>
 </Configuration>
diff --git a/securis/src/main/webapp/WEB-INF/web.xml b/securis/src/main/webapp/WEB-INF/web.xml
index 32393d6..24ec927 100644
--- a/securis/src/main/webapp/WEB-INF/web.xml
+++ b/securis/src/main/webapp/WEB-INF/web.xml
@@ -36,16 +36,18 @@
         <param-name>resteasy.providers</param-name>
         <param-value>net.curisit.securis.DefaultExceptionHandler</param-value>
     </context-param>
+ 
+ 	<context-param>
+		<param-name>resteasy.injector.factory</param-name>
+		<param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value>
+	</context-param>
      
+       
     <context-param>
 	    <param-name>resteasy.servlet.mapping.prefix</param-name>
 	    <param-value>/api</param-value>
 	</context-param>
     
-	<context-param>
-		<param-name>resteasy.injector.factory</param-name>
-		<param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value>
-	</context-param>
      
      
 	<filter>
@@ -56,7 +58,7 @@
     </filter>    
     <filter-mapping>
         <filter-name>DevFilter</filter-name>
-        <url-pattern>/api/*</url-pattern>
+        <url-pattern>/*</url-pattern>
     </filter-mapping>
 
 	<filter>
diff --git a/securis/src/main/webapp/src/app/footer.component.ts b/securis/src/main/webapp/src/app/footer.component.ts
index 309167b..2018eaa 100644
--- a/securis/src/main/webapp/src/app/footer.component.ts
+++ b/securis/src/main/webapp/src/app/footer.component.ts
@@ -17,7 +17,7 @@
 
   ngOnInit(): void {
             //TODO Move to service
-      this.http.get("version", /* workaround to avoid OPTIONS method request*/ new BaseRequestOptions())
+      this.http.get("api/version", /* workaround to avoid OPTIONS method request*/ new BaseRequestOptions())
         .map((res) => <string>res.json().version)
         .subscribe(
           version => this.securisVersion = version,
diff --git a/securis/src/main/webapp/src/app/forms/base.ts b/securis/src/main/webapp/src/app/forms/base.ts
index 5d66cf4..58775c2 100644
--- a/securis/src/main/webapp/src/app/forms/base.ts
+++ b/securis/src/main/webapp/src/app/forms/base.ts
@@ -84,7 +84,7 @@
 							this.toaster.success(this.$L.get('{} was sucessfully deleted', this.resourceName.capitalize()));
 							this.goBack();
 						},
-						err => this.toaster.success(err.message, this.$L.get('Error deleting the {}', this.resourceName))
+						err => this.toaster.error(err.message, this.$L.get('Error deleting the {}', this.resourceName))
 				);
 			}
 		});
diff --git a/securis/src/main/webapp/src/app/forms/pack.form.component.ts b/securis/src/main/webapp/src/app/forms/pack.form.component.ts
index 97f4832..9676626 100644
--- a/securis/src/main/webapp/src/app/forms/pack.form.component.ts
+++ b/securis/src/main/webapp/src/app/forms/pack.form.component.ts
@@ -34,7 +34,7 @@
   }
 
   loadCombos(): void {
-      this.http.get('organization')
+      this.http.get('api/organization')
         .map(response => response.json().map((org : any) => <IComboOption>{id: org.id, label: `(${org.code}) ${org.name}`}))
         .subscribe(
           data => super.setViewData(() => this.organizations = (<IComboOption[]>data).sort((e1, e2) => e1.label.localeCompare(e2.label))),
diff --git a/securis/src/main/webapp/src/app/resources/applications.ts b/securis/src/main/webapp/src/app/resources/applications.ts
index ecfa6a8..d6d8f8f 100644
--- a/securis/src/main/webapp/src/app/resources/applications.ts
+++ b/securis/src/main/webapp/src/app/resources/applications.ts
@@ -1,6 +1,7 @@
 import { Observable } from 'rxjs/Rx';
 import { Injectable } from '@angular/core';
 import { Http, RequestOptions } from '@angular/http';
+import { Locker } from 'angular-safeguard';
 import { SeCurisResourceServices } from './base';
 import { LocaleService } from '../common/i18n';
 
@@ -18,8 +19,8 @@
 
 @Injectable()
 export class ApplicationsService extends SeCurisResourceServices {
-  constructor(http: Http, $L: LocaleService) {
-    super($L, http, 'application');
+  constructor(http: Http, $L: LocaleService, store: Locker) {
+    super($L, http, store, 'application');
   }
 
 
diff --git a/securis/src/main/webapp/src/app/resources/base.ts b/securis/src/main/webapp/src/app/resources/base.ts
index 2833eb0..3f5f39d 100644
--- a/securis/src/main/webapp/src/app/resources/base.ts
+++ b/securis/src/main/webapp/src/app/resources/base.ts
@@ -1,53 +1,77 @@
 import { LocaleService } from '../common/i18n';
 import { BasicService } from '../common/utils';
 import { Observable } from 'rxjs/Observable';
-import { Http, RequestOptionsArgs, URLSearchParams } from '@angular/http';
+import { Http, RequestOptionsArgs, URLSearchParams, Headers } from '@angular/http';
+import { Locker } from 'angular-safeguard';
+
 
 export class MySearchParams extends URLSearchParams {
-  constructor(obj : any = {}) {
-    var searchQuery = Object.keys(obj).map(key => `${key}=${encodeURIComponent(obj[key])}`).join('&');
+  constructor(obj: any = {}) {
+    const searchQuery = Object.keys(obj).map(key => `${key}=${encodeURIComponent(obj[key])}`).join('&');
     super(searchQuery);
   }
 }
 
 export class SeCurisResourceServices extends BasicService {
-    constructor($L: LocaleService,
-                protected http: Http,                
-                protected resource: string) {
-        super($L);
-    }    
+  constructor($L: LocaleService,
+              protected http: Http,
+              protected store: Locker,
+              protected resource: string) {
+    super($L);
+    this.resource = `api/${resource}`;
+  }
 
-    public get(id?: any) : Observable<any> {
-      let url = `${this.resource}/${id || ''}`;
-      return this.http.get(url).map(response => response.json()).catch(err => super.processErrorResponse(err));
+  protected getAuthHeaders(): RequestOptionsArgs {
+    const token = this.store.get('token');
+    const headers = new Headers();
+    if (token) {
+      headers.append('X-SECURIS-TOKEN', token);
     }
+    headers.append('Content-Type', 'application/json');
+    return { headers: headers };
+  }
 
-    public create(data: any) : Observable<any> {
-      let url = `${this.resource}`;
-      return this.http.post(url, JSON.stringify(data)).map(response => response.json()).catch(err => super.processErrorResponse(err));
-    }
+  public get(id?: any): Observable<any> {
+    const url = `${this.resource}/${id || ''}`;
+    return this.http.get(url, this.getAuthHeaders())
+      .map(response => response.json())
+      .catch(err => super.processErrorResponse(err));
+  }
 
-    public modify(id: any, data: any) : Observable<any> {
-      let url = `${this.resource}/${id}`;
-      return this.http.post(url, JSON.stringify(data)).map(response => response.json()).catch(err => super.processErrorResponse(err));
-    }
+  public create(data: any): Observable<any> {
+    const url = `${this.resource}`;
+    return this.http.post(url, JSON.stringify(data), this.getAuthHeaders())
+      .map(response => response.json())
+      .catch(err => super.processErrorResponse(err));
+  }
 
-    public remove(id: any) : Observable<any> {
-      let url = `${this.resource}/${id}`;
-      return this.http.delete(url).map(response => response.json()).catch(err => super.processErrorResponse(err));
-    }
-    
-    public action(id: any, action: string, method = 'POST', params : any = {}) : Observable<any> {
-      let url = `${this.resource}/${id}/${action}`;
-      params.action = action;
-      var options:RequestOptionsArgs = {
-        url: url,
-        method: method,
-        search: (method == 'GET') && new MySearchParams(params) || undefined,
-        body: (method == 'POST') && JSON.stringify(params) || undefined
-      };
-      return this.http.request(url, options).map(response => response.json()).catch(err => super.processErrorResponse(err));
-    }
+  public modify(id: any, data: any): Observable<any> {
+    const url = `${this.resource}/${id}`;
+    // Se usa POST para modificar (según tu diseño original)
+    return this.http.post(url, JSON.stringify(data), this.getAuthHeaders())
+      .map(response => response.json())
+      .catch(err => super.processErrorResponse(err));
+  }
 
+  public remove(id: any): Observable<any> {
+    const url = `${this.resource}/${id}`;
+    return this.http.delete(url, this.getAuthHeaders())
+      .map(response => response.json())
+      .catch(err => super.processErrorResponse(err));
+  }
 
+  public action(id: any, action: string, method: string = 'POST', params: any = {}): Observable<any> {
+    const url = `${this.resource}/${id}/${action}`;
+    params.action = action;
+    const options: RequestOptionsArgs = {
+      url: url,
+      method: method,
+      search: (method === 'GET') ? new MySearchParams(params) : undefined,
+      headers: this.getAuthHeaders().headers,
+      body: (method === 'POST') ? JSON.stringify(params) : undefined
+    };
+    return this.http.request(url, options)
+      .map(response => response.json())
+      .catch(err => super.processErrorResponse(err));
+  }
 }
\ No newline at end of file
diff --git a/securis/src/main/webapp/src/app/resources/license_types.ts b/securis/src/main/webapp/src/app/resources/license_types.ts
index c12c90e..066af99 100644
--- a/securis/src/main/webapp/src/app/resources/license_types.ts
+++ b/securis/src/main/webapp/src/app/resources/license_types.ts
@@ -1,6 +1,7 @@
 import { Observable } from 'rxjs/Rx';
 import { Injectable } from '@angular/core';
 import { Http, RequestOptions } from '@angular/http';
+import { Locker } from 'angular-safeguard';
 import { SeCurisResourceServices } from './base';
 import { LocaleService } from '../common/i18n';
 
@@ -15,8 +16,8 @@
 
 @Injectable()
 export class LicenseTypesService extends SeCurisResourceServices {
-  constructor(http: Http, $L: LocaleService) {
-    super($L, http, 'licensetype');
+  constructor(http: Http, $L: LocaleService, store: Locker) {
+    super($L, http, store, 'licensetype');
   }
 
 
diff --git a/securis/src/main/webapp/src/app/resources/licenses.ts b/securis/src/main/webapp/src/app/resources/licenses.ts
index bb51ddd..65dc318 100644
--- a/securis/src/main/webapp/src/app/resources/licenses.ts
+++ b/securis/src/main/webapp/src/app/resources/licenses.ts
@@ -2,6 +2,7 @@
 import { Observable } from 'rxjs/Rx';
 import { Injectable } from '@angular/core';
 import { Http, RequestOptions, ResponseContentType, Response } from '@angular/http';
+import { Locker } from 'angular-safeguard';
 import { SeCurisResourceServices } from './base';
 import { saveAs } from "file-saver";
 
@@ -78,14 +79,13 @@
 
 @Injectable()
 export class LicensesService extends SeCurisResourceServices {
-	constructor(http: Http,
-				$L: LocaleService) {
-		super($L, http, 'license');
+	constructor(http: Http, $L: LocaleService, store: Locker) {
+		super($L, http, store, 'license');
 	}
 
 	public getByPack(packId: number) {
 		let url = `${this.resource}?packId=${packId}`;
-		return this.http.get(url).map(response => response.json());
+		return this.http.get(url, this.getAuthHeaders()).map(response => response.json());
 	}
 
 	public activate(id: number) {
@@ -114,12 +114,14 @@
 
 	public download(id: number) {
 	    let url = `${this.resource}/${id}/download`;
-        return this.http.get(url).map((response : Response) => {
-			let filename =  JSON.parse(response.headers.get('Content-Disposition').match(/".*"$/g)[0]);
-			let content = JSON.stringify(response.json(), null, 2);
-			saveAs( new Blob([ content ], { type : 'application/octet-stream' }), filename);
-			return Observable.of(true);
-		}).catch(err => super.processErrorResponse(err));
+		return this.http.get(url, this.getAuthHeaders()) 
+		        .map((response: Response) => {
+		            let filename = JSON.parse(response.headers.get('Content-Disposition').match(/".*"$/g)[0]);
+		            let content = JSON.stringify(response.json(), null, 2);
+		            saveAs(new Blob([content], { type: 'application/octet-stream' }), filename);
+		            return Observable.of(true);
+		        })
+		        .catch(err => super.processErrorResponse(err));
 	}
 
 	public isActionAvailable(action:string, lic:any) {
diff --git a/securis/src/main/webapp/src/app/resources/organizations.ts b/securis/src/main/webapp/src/app/resources/organizations.ts
index 27568b5..7d67518 100644
--- a/securis/src/main/webapp/src/app/resources/organizations.ts
+++ b/securis/src/main/webapp/src/app/resources/organizations.ts
@@ -1,6 +1,7 @@
 import { Observable } from 'rxjs/Rx';
 import { Injectable } from '@angular/core';
 import { Http, RequestOptions } from '@angular/http';
+import { Locker } from 'angular-safeguard';
 import { SeCurisResourceServices } from './base';
 import { LocaleService } from '../common/i18n';
 
@@ -13,8 +14,8 @@
 @Injectable()
 export class OrganizationsService extends SeCurisResourceServices {
 
-  constructor(http: Http, $L: LocaleService) {
-    super($L, http, 'organization');
+  constructor(http: Http, $L: LocaleService, store: Locker) {
+    super($L, http, store, 'organization');
   }
 
 
diff --git a/securis/src/main/webapp/src/app/resources/packs.ts b/securis/src/main/webapp/src/app/resources/packs.ts
index a03baf2..af18bca 100644
--- a/securis/src/main/webapp/src/app/resources/packs.ts
+++ b/securis/src/main/webapp/src/app/resources/packs.ts
@@ -1,6 +1,7 @@
 import { Observable } from 'rxjs/Rx';
 import { Injectable } from '@angular/core';
 import { Http, RequestOptions } from '@angular/http';
+import { Locker } from 'angular-safeguard'; 
 import { SeCurisResourceServices, MySearchParams } from './base';
 import { LocaleService } from '../common/i18n';
 
@@ -82,19 +83,21 @@
 
 @Injectable()
 export class PacksService extends SeCurisResourceServices {
-  constructor(http: Http, $L: LocaleService) {
-    super($L, http, 'pack');
+  constructor(http: Http, $L: LocaleService, store: Locker) {
+    super($L, http, store, 'pack');
   }
 
   public get(filter?: PacksFilter | number | string) {
-      if (!filter || typeof filter === "number" || typeof filter === "string") {
-        return super.get(filter);
-      }
-      let searchParams = new MySearchParams(filter);
-      let url = `${this.resource}/?${searchParams}`;
-      return this.http.get(url).map(response => response.json()).catch(err => super.processErrorResponse(err));
-	}
-
+    if (!filter || typeof filter === "number" || typeof filter === "string") {
+      return super.get(filter);
+    }
+    const searchParams = new MySearchParams(filter);
+    const url = `${this.resource}/?${searchParams}`;
+    // Añade las cabeceras usando el método de la base
+    return this.http.get(url, this.getAuthHeaders())
+      .map(response => response.json())
+      .catch(err => super.processErrorResponse(err));
+  }
 
   public activate(id: number) {
 			return super.action(id, "activate");
@@ -108,12 +111,12 @@
 			return super.action(id, "putonhold");
 	}
   public nextLicCode(id: number) {
-      let url = `pack/${id}/next_license_code`
-      return this.http.get(url).map(response => response.text());
+	  const url = `api/pack/${id}/next_license_code`;
+	  return this.http.get(url, this.getAuthHeaders())
+	    .map(response => response.text());
 	}
-  
-
- 	public isActionAvailable(action:string, pack:any) {
+	
+  public isActionAvailable(action:string, pack:any) {
 		var validStatuses = PACK_ACTIONS_BY_STATUS[action];
 		return pack && validStatuses && validStatuses.indexOf(pack.status) !== -1;
 	}
diff --git a/securis/src/main/webapp/src/app/resources/users.ts b/securis/src/main/webapp/src/app/resources/users.ts
index 09eebb3..adb2c24 100644
--- a/securis/src/main/webapp/src/app/resources/users.ts
+++ b/securis/src/main/webapp/src/app/resources/users.ts
@@ -1,6 +1,7 @@
 import { Observable } from 'rxjs/Rx';
 import { Injectable } from '@angular/core';
 import { Http, RequestOptions } from '@angular/http';
+import { Locker } from 'angular-safeguard';
 import { SeCurisResourceServices } from './base';
 import { LocaleService } from '../common/i18n';
 
@@ -18,8 +19,8 @@
 
 @Injectable()
 export class UsersService extends SeCurisResourceServices {
-  constructor(http: Http, $L: LocaleService) {
-    super($L, http, 'user');
+  constructor(http: Http, $L: LocaleService, store: Locker) {
+    super($L, http, store, 'user');
   }
 
 
diff --git a/securis/src/main/webapp/src/app/user.service.ts b/securis/src/main/webapp/src/app/user.service.ts
index 45bb541..95273eb 100644
--- a/securis/src/main/webapp/src/app/user.service.ts
+++ b/securis/src/main/webapp/src/app/user.service.ts
@@ -27,7 +27,7 @@
     params.append('username', username);
     params.append('password', password);
     let options = new RequestOptions({ headers: new Headers({ "Content-Type": "application/x-www-form-urlencoded" })});
-    return this.http.post('user/login', params.toString(), options)
+    return this.http.post('api/user/login', params.toString(), options)
                     .map((resp) => this.mapLogin(resp))
                     .catch((err) => super.processErrorResponse(err));
   }
@@ -47,7 +47,7 @@
     }
     var token = this.store.get("token");
     let option = new RequestOptions({ headers: new Headers({ 'X-SECURIS-TOKEN': token }) });
-    return this.http.get('check', option)
+    return this.http.get('api/check', option)
                     .map((resp) => this.mapCheck(resp))
                     .catch((err) => super.processErrorResponse(err));
   }

--
Gitblit v1.3.2