From 8200793f22c0ec9fc1ab9026406fe4d3a8cbaab7 Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Wed, 17 Dec 2014 12:30:46 +0000
Subject: [PATCH] #2205 feature - Added support for name or reference and email in license requests
---
securis/src/main/java/net/curisit/securis/services/ApiResource.java | 79 ++++++++++++++++++++++++++++-----------
1 files changed, 56 insertions(+), 23 deletions(-)
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 d432621..032ec6f 100644
--- a/securis/src/main/java/net/curisit/securis/services/ApiResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/ApiResource.java
@@ -9,6 +9,7 @@
import javax.persistence.EntityManager;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@@ -120,11 +121,10 @@
MediaType.APPLICATION_JSON
})
@Transactional
- public Response createFromRequest(RequestBean request, @Context BasicSecurityContext bsc) throws IOException, SeCurisServiceException,
- SeCurisException {
+ public Response createFromRequest(RequestBean request, @HeaderParam(LicenseManager.HEADER_LICENSE_NAME_OR_REFERENCE) String nameOrReference,
+ @HeaderParam(LicenseManager.HEADER_LICENSE_EMAIL) String userEmail) throws IOException, SeCurisServiceException, SeCurisException {
LOG.info("Request to get license: {}", request);
-
- SignedLicenseBean lic = createLicense(request, emProvider.get(), false);
+ SignedLicenseBean lic = createLicense(request, emProvider.get(), false, nameOrReference, userEmail);
return Response.ok(lic).build();
}
@@ -148,8 +148,9 @@
})
@Transactional
@SuppressWarnings("unchecked")
- public Response createFromRequestFile(MultipartFormDataInput mpfdi, @Context BasicSecurityContext bsc) throws IOException,
- SeCurisServiceException, SeCurisException {
+ public Response createFromRequestFile(MultipartFormDataInput mpfdi,
+ @HeaderParam(LicenseManager.HEADER_LICENSE_NAME_OR_REFERENCE) String nameOrReference,
+ @HeaderParam(LicenseManager.HEADER_LICENSE_EMAIL) String userEmail) throws IOException, SeCurisServiceException, SeCurisException {
RequestBean req = new RequestBean();
req.setPackCode(mpfdi.getFormDataPart("packCode", String.class, null));
req.setLicenseTypeCode(mpfdi.getFormDataPart("licenseTypeCode", String.class, null));
@@ -159,7 +160,7 @@
req.setMacAddresses(mpfdi.getFormDataPart("macAddresses", List.class, null));
req.setOsName(mpfdi.getFormDataPart("osName", String.class, null));
- return createFromRequest(req, bsc);
+ return createFromRequest(req, nameOrReference, userEmail);
}
/**
@@ -194,7 +195,7 @@
throw new SeCurisServiceException(ErrorCodes.LICENSE_NOT_READY_FOR_RENEW, "Only licenses with status 'Active' can be renew");
}
- SignedLicenseBean signedLic = createLicense(previousLic, em, true);
+ SignedLicenseBean signedLic = renewLicense(previousLic, em);
return Response.ok(signedLic).build();
}
@@ -273,7 +274,11 @@
throw new SeCurisServiceException(ErrorCodes.LICENSE_NOT_READY_FOR_RENEW, "The license is still valid, not ready for renew");
}
- return createFromRequest(lic, bsc);
+ return renewFromPreviousLicense(lic, bsc);
+ }
+
+ private SignedLicenseBean renewLicense(RequestBean req, EntityManager em) throws SeCurisServiceException {
+ return createLicense(req, em, true, null, null);
}
/**
@@ -286,7 +291,8 @@
* @return
* @throws SeCurisServiceException
*/
- private SignedLicenseBean createLicense(RequestBean req, EntityManager em, boolean renew) throws SeCurisServiceException {
+ private SignedLicenseBean createLicense(RequestBean req, EntityManager em, boolean renew, String nameOrReference, String email)
+ throws SeCurisServiceException {
LicenseBean previousLicenseBean = null;
License lic = null;
if (renew) {
@@ -295,14 +301,25 @@
if (lic.getStatus() != LicenseStatus.ACTIVE && lic.getStatus() != LicenseStatus.PRE_ACTIVE) {
throw new SeCurisServiceException(ErrorCodes.INVALID_DATA, "The current license has been cancelled");
}
- } else {
- lic = new License();
}
if (!renew) {
- License existingLicense = License.findLicenseByRequestData(lic.getRequestData(), em);
- if (existingLicense != null) {
- throw new SeCurisServiceException(ErrorCodes.DUPLICATED_REQUEST_DATA, "There is already an active license for current request data");
+ try {
+ lic = License.findValidLicenseByRequestData(JsonUtils.toJSON(req), em);
+ } catch (SeCurisException e1) {
+ throw new SeCurisServiceException(ErrorCodes.INVALID_FORMAT, "Request sent is not valid");
+ }
+ if (lic != null) {
+ try {
+ if (lic.getStatus() == LicenseStatus.ACTIVE || lic.getStatus() == LicenseStatus.PRE_ACTIVE) {
+ return JsonUtils.json2object(lic.getLicenseData(), SignedLicenseBean.class);
+ }
+ } catch (SeCurisException e) {
+ throw new SeCurisServiceException(ErrorCodes.INVALID_FORMAT, "Error trying to get the license bean from license code: "
+ + lic.getCode());
+ }
+ } else {
+ lic = new License();
}
}
Pack pack = em.createNamedQuery("pack-by-code", Pack.class).setParameter("code", req.getPackCode()).getSingleResult();
@@ -310,11 +327,15 @@
if (!renew && pack.getNumAvailables() <= 0) {
throw new SeCurisServiceException(ErrorCodes.NO_AVAILABLE_LICENSES, "The current pack has no licenses availables");
}
+ if (!renew && lic.getStatus() == LicenseStatus.REQUESTED && !pack.isLicensePreactivation()) {
+ throw new SeCurisServiceException(ErrorCodes.NO_AVAILABLE_LICENSES, "Current pack doesn't allow license preactivation");
+ }
+
SignedLicenseBean signedLicense;
try {
String licCode;
- if (renew) {
- licCode = previousLicenseBean.getLicenseCode();
+ if (renew || lic.getStatus() == LicenseStatus.REQUESTED) {
+ licCode = lic.getCode();
} else {
licCode = LicUtils.getLicenseCode(pack.getCode(), licenseHelper.getNextCodeSuffix(pack.getId(), em));
}
@@ -340,23 +361,35 @@
lic.setModificationTimestamp(new Date());
lic.setExpirationDate(signedLicense.getExpirationDate());
User user = em.find(User.class, CLIENT_USERNAME);
- if (!renew) {
-
+ if (!renew && lic.getStatus() != LicenseStatus.REQUESTED) {
lic.setPack(pack);
lic.setCreatedBy(user);
lic.setCreationTimestamp(new Date());
- lic.setStatus(LicenseStatus.PRE_ACTIVE);
+ if (pack.isLicensePreactivation()) {
+ lic.setStatus(LicenseStatus.PRE_ACTIVE);
+ } else {
+ lic.setStatus(LicenseStatus.REQUESTED);
+ }
lic.setCode(signedLicense.getLicenseCode());
lic.setCodeSuffix(LicUtils.getLicenseCodeSuffix(signedLicense.getLicenseCode()));
+ lic.setEmail(email);
+ lic.setFullName(nameOrReference);
em.persist(lic);
em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.CREATE));
- if (lic.getStatus() == LicenseStatus.ACTIVE) {
+ if (pack.isLicensePreactivation()) {
em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.PRE_ACTIVATE, "Pre-activated on creation"));
+ } else {
+ LOG.warn("License ({}) created, but the pack doesn't allow preactivation", lic.getCode());
+ throw new SeCurisServiceException(ErrorCodes.NO_AVAILABLE_LICENSES, "Current pack doesn't allow license preactivation");
}
} else {
- lic.setStatus(LicenseStatus.ACTIVE);
+ lic.setStatus(renew ? LicenseStatus.ACTIVE : LicenseStatus.PRE_ACTIVE);
em.merge(lic);
- em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.RENEW));
+ if (renew) {
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.RENEW));
+ } else {
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.PRE_ACTIVATE, "Pre-activated after request"));
+ }
}
return signedLicense;
--
Gitblit v1.3.2