From 1d9d7b5f03b3e7b6af5600574a0ae6053843b77b Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Tue, 28 Oct 2014 13:07:05 +0000
Subject: [PATCH] #2021 feature - Fixing pack cacnellation and deletion actions
---
securis/src/main/java/net/curisit/securis/services/helpers/LicenseHelper.java | 64 ++++++++++++
securis/src/main/java/net/curisit/securis/services/helpers/UserHelper.java | 29 +++++
securis/src/main/resources/static/licenses.html | 19 ---
securis/src/main/java/net/curisit/securis/db/Application.java | 3
securis/src/main/java/net/curisit/securis/services/LicenseResource.java | 97 +++++--------------
securis/src/main/resources/static/js/licenses.js | 20 ++-
securis/src/main/java/net/curisit/securis/db/LicenseType.java | 3
securis/src/main/java/net/curisit/securis/db/Pack.java | 10 +
securis/src/main/java/net/curisit/securis/services/PackResource.java | 35 +++++-
9 files changed, 173 insertions(+), 107 deletions(-)
diff --git a/securis/src/main/java/net/curisit/securis/db/Application.java b/securis/src/main/java/net/curisit/securis/db/Application.java
index 46d896d..17885c8 100644
--- a/securis/src/main/java/net/curisit/securis/db/Application.java
+++ b/securis/src/main/java/net/curisit/securis/db/Application.java
@@ -4,6 +4,7 @@
import java.util.Date;
import java.util.Set;
+import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
@@ -56,7 +57,7 @@
@OneToMany(fetch = FetchType.LAZY, mappedBy = "application")
private Set<LicenseType> licenseTypes;
- @OneToMany(fetch = FetchType.LAZY, mappedBy = "application")
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "application")
private Set<ApplicationMetadata> metadata;
public Integer getId() {
diff --git a/securis/src/main/java/net/curisit/securis/db/LicenseType.java b/securis/src/main/java/net/curisit/securis/db/LicenseType.java
index 3196743..c42353b 100644
--- a/securis/src/main/java/net/curisit/securis/db/LicenseType.java
+++ b/securis/src/main/java/net/curisit/securis/db/LicenseType.java
@@ -4,6 +4,7 @@
import java.util.Date;
import java.util.Set;
+import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
@@ -62,7 +63,7 @@
@JoinColumn(name = "application_id")
private Application application;
- @OneToMany(fetch = FetchType.LAZY, mappedBy = "licenseType")
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "licenseType")
private Set<LicenseTypeMetadata> metadata;
public Set<LicenseTypeMetadata> getMetadata() {
diff --git a/securis/src/main/java/net/curisit/securis/db/Pack.java b/securis/src/main/java/net/curisit/securis/db/Pack.java
index 1cd05ca..b44548c 100644
--- a/securis/src/main/java/net/curisit/securis/db/Pack.java
+++ b/securis/src/main/java/net/curisit/securis/db/Pack.java
@@ -99,7 +99,7 @@
@JsonProperty("default_valid_period")
private Integer defaultValidPeriod;
- @OneToMany(fetch = FetchType.LAZY, mappedBy = "pack")
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pack")
private Set<PackMetadata> metadata;
public Integer getId() {
@@ -317,6 +317,14 @@
this.endValidDate = endValidDate;
}
+ public Set<License> getLicenses() {
+ return licenses;
+ }
+
+ public void setLicenses(Set<License> licenses) {
+ this.licenses = licenses;
+ }
+
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Pack))
diff --git a/securis/src/main/java/net/curisit/securis/services/LicenseResource.java b/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
index ae36938..e338592 100644
--- a/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
@@ -1,7 +1,6 @@
package net.curisit.securis.services;
import java.io.File;
-import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.text.MessageFormat;
@@ -51,6 +50,8 @@
import net.curisit.securis.security.Securable;
import net.curisit.securis.services.exception.SeCurisServiceException;
import net.curisit.securis.services.exception.SeCurisServiceException.ErrorCodes;
+import net.curisit.securis.services.helpers.LicenseHelper;
+import net.curisit.securis.services.helpers.UserHelper;
import net.curisit.securis.utils.EmailManager;
import net.curisit.securis.utils.JsonUtils;
import net.curisit.securis.utils.Params;
@@ -75,16 +76,22 @@
private static final Logger LOG = LogManager.getLogger(LicenseResource.class);
@Inject
- TokenHelper tokenHelper;
+ private TokenHelper tokenHelper;
@Inject
- EmailManager emailManager;
+ private EmailManager emailManager;
@Inject
- Provider<EntityManager> emProvider;
+ private UserHelper userHelper;
@Inject
- LicenseGenerator licenseGenerator;
+ private LicenseHelper licenseHelper;
+
+ @Inject
+ private Provider<EntityManager> emProvider;
+
+ @Inject
+ private LicenseGenerator licenseGenerator;
/**
*
@@ -162,7 +169,7 @@
LOG.error("License with id {} is not active, so It can not downloaded", licId, bsc.getUserPrincipal());
throw new SeCurisServiceException(ErrorCodes.WRONG_STATUS, "License is not active, so It can not be downloaded");
}
- em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.DOWNLOAD));
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.DOWNLOAD));
return Response
.ok(lic.getLicenseData())
.header("Content-Disposition",
@@ -210,8 +217,8 @@
lic.setModificationTimestamp(new Date());
em.persist(lic);
- User user = getUser(bsc.getUserPrincipal().getName(), em);
- em.persist(createLicenseHistoryAction(lic, user, LicenseHistory.Actions.ACTIVATE));
+ User user = userHelper.getUser(bsc.getUserPrincipal().getName(), em);
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.ACTIVATE));
return Response.ok(lic).build();
}
@@ -243,12 +250,12 @@
throw new SeCurisServiceException(Status.NOT_FOUND.getStatusCode(), "There is no license file available");
}
- User user = getUser(bsc.getUserPrincipal().getName(), em);
+ User user = userHelper.getUser(bsc.getUserPrincipal().getName(), em);
try {
String subject = MessageFormat.format(Params.get(Params.KEYS.EMAIL_LIC_DEFAULT_SUBJECT), lic.getPack().getAppName());
String email_tpl = IOUtils.toString(this.getClass().getResourceAsStream("/lic_email_template.en"));
String body = MessageFormat.format(email_tpl, lic.getFullName(), app.getName());
- licFile = createTemporaryLicenseFile(lic, app.getLicenseFilename());
+ licFile = licenseHelper.createTemporaryLicenseFile(lic, app.getLicenseFilename());
emailManager.sendEmail(subject, body, lic.getEmail(), addCC ? user.getEmail() : null, licFile);
} catch (IOException e) {
@@ -262,7 +269,7 @@
lic.setModificationTimestamp(new Date());
em.persist(lic);
- em.persist(createLicenseHistoryAction(lic, user, LicenseHistory.Actions.SEND, "Email sent to: " + lic.getEmail()));
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, user, LicenseHistory.Actions.SEND, "Email sent to: " + lic.getEmail()));
return Response.ok(lic).build();
}
@@ -301,23 +308,8 @@
+ " can not be canceled without a reason");
}
- lic.setStatus(LicenseStatus.CANCELLED);
- lic.setCancelledById(bsc.getUserPrincipal().getName());
- lic.setModificationTimestamp(new Date());
- em.persist(lic);
-
- em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.CANCEL, "Cancellation reason: " + reason));
+ licenseHelper.cancelLicense(lic, reason, bsc, em);
return Response.ok(lic).build();
- }
-
- /**
- * Cancel the license
- *
- * @param lic
- * @param em
- */
- public static void cancelLicense(License lic, EntityManager em) throws SeCurisServiceException {
-
}
@POST
@@ -349,7 +341,7 @@
}
}
- User createdBy = getUser(bsc.getUserPrincipal().getName(), em);
+ User createdBy = userHelper.getUser(bsc.getUserPrincipal().getName(), em);
if (lic.getRequestData() != null) {
License existingLicense = License.findLicenseByRequestData(lic.getRequestData(), em);
@@ -380,9 +372,9 @@
lic.setCreationTimestamp(new Date());
lic.setModificationTimestamp(lic.getCreationTimestamp());
em.persist(lic);
- em.persist(createLicenseHistoryAction(lic, createdBy, LicenseHistory.Actions.CREATE));
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, createdBy, LicenseHistory.Actions.CREATE));
if (lic.getStatus() == LicenseStatus.ACTIVE) {
- em.persist(createLicenseHistoryAction(lic, createdBy, LicenseHistory.Actions.CREATE, "Activated on creation"));
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, createdBy, LicenseHistory.Actions.CREATE, "Activated on creation"));
}
return Response.ok(lic).build();
@@ -486,7 +478,7 @@
currentLicense.setModificationTimestamp(new Date());
em.persist(currentLicense);
- em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.MODIFY));
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.MODIFY));
return Response.ok(currentLicense).build();
}
@@ -547,12 +539,12 @@
}
BlockedRequest blockedReq = new BlockedRequest();
blockedReq.setCreationTimestamp(new Date());
- blockedReq.setBlockedBy(getUser(bsc, em));
+ blockedReq.setBlockedBy(userHelper.getUser(bsc, em));
blockedReq.setRequestData(lic.getRequestData());
em.persist(blockedReq);
- em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.BLOCK));
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.BLOCK));
return Response.ok(Utils.createMap("success", true, "id", licId)).build();
}
@@ -571,7 +563,7 @@
if (BlockedRequest.isRequestBlocked(lic.getRequestData(), em)) {
BlockedRequest blockedReq = em.find(BlockedRequest.class, lic.getReqDataHash());
em.remove(blockedReq);
- em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.UNBLOCK));
+ em.persist(licenseHelper.createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.UNBLOCK));
} else {
LOG.info("Request data for license {} is NOT blocked", licId);
}
@@ -595,43 +587,6 @@
throw new SeCurisServiceException(Status.UNAUTHORIZED.getStatusCode(), "Unathorized access to license data");
}
return lic;
- }
-
- private User getUser(BasicSecurityContext bsc, EntityManager em) throws SeCurisServiceException {
- String username = bsc.getUserPrincipal().getName();
- return getUser(username, em);
- }
-
- private User getUser(String username, EntityManager em) throws SeCurisServiceException {
- User user = null;
- if (username != null) {
- user = em.find(User.class, username);
- if (user == null) {
- throw new SeCurisServiceException(Status.NOT_FOUND.getStatusCode(), "User not found with username: " + username);
- }
- }
- return user;
- }
-
- private File createTemporaryLicenseFile(License lic, String licFileName) throws IOException {
- File f = Files.createTempDirectory("securis-server").toFile();
- f = new File(f, licFileName);
- IOUtils.write(lic.getLicenseData(), new FileWriter(f));
- return f;
- }
-
- private LicenseHistory createLicenseHistoryAction(License lic, User user, String action, String comments) {
- LicenseHistory lh = new LicenseHistory();
- lh.setLicense(lic);
- lh.setUser(user);
- lh.setTimestamp(new Date());
- lh.setAction(action);
- lh.setComments(comments);
- return lh;
- }
-
- private LicenseHistory createLicenseHistoryAction(License lic, User user, String action) {
- return createLicenseHistoryAction(lic, user, action, null);
}
public static void main(String[] args) throws IOException {
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 a3b65a9..cd18426 100644
--- a/securis/src/main/java/net/curisit/securis/services/PackResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/PackResource.java
@@ -12,6 +12,7 @@
import javax.persistence.TypedQuery;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
@@ -26,6 +27,8 @@
import net.curisit.integrity.commons.Utils;
import net.curisit.securis.DefaultExceptionHandler;
import net.curisit.securis.SeCurisException;
+import net.curisit.securis.db.License;
+import net.curisit.securis.db.LicenseStatus;
import net.curisit.securis.db.LicenseType;
import net.curisit.securis.db.Organization;
import net.curisit.securis.db.Pack;
@@ -36,6 +39,8 @@
import net.curisit.securis.security.Securable;
import net.curisit.securis.services.exception.SeCurisServiceException;
import net.curisit.securis.services.exception.SeCurisServiceException.ErrorCodes;
+import net.curisit.securis.services.helpers.LicenseHelper;
+import net.curisit.securis.services.helpers.UserHelper;
import net.curisit.securis.utils.TokenHelper;
import org.apache.logging.log4j.LogManager;
@@ -60,8 +65,11 @@
@Inject
Provider<EntityManager> emProvider;
- public PackResource() {
- }
+ @Inject
+ private UserHelper userHelper;
+
+ @Inject
+ private LicenseHelper licenseHelper;
/**
*
@@ -297,8 +305,9 @@
@Produces({
MediaType.APPLICATION_JSON
})
- public Response cancel(@PathParam("packId") Integer packId) throws SeCurisServiceException {
- LOG.info("Putting On hold pack with id: {}", packId);
+ public Response cancel(@PathParam("packId") Integer packId, @FormParam("reason") String reason, @Context BasicSecurityContext bsc)
+ throws SeCurisServiceException {
+ LOG.info("Cancelling pack with id: {}", packId);
EntityManager em = emProvider.get();
Pack currentPack = em.find(Pack.class, packId);
@@ -308,6 +317,12 @@
throw new SeCurisServiceException(ErrorCodes.WRONG_STATUS, "Pack cannot be cancelled in status: " + currentPack.getStatus().name());
}
+ Set<License> licenses = currentPack.getLicenses();
+ for (License license : licenses) {
+ if (license.getStatus() == LicenseStatus.ACTIVE || license.getStatus() == LicenseStatus.PRE_ACTIVE) {
+ licenseHelper.cancelLicense(license, "Pack cancellation. " + reason, bsc, em);
+ }
+ }
currentPack.setStatus(PackStatus.CANCELLED);
em.persist(currentPack);
@@ -334,7 +349,7 @@
@Produces({
MediaType.APPLICATION_JSON
})
- public Response delete(@PathParam("packId") String packId) {
+ public Response delete(@PathParam("packId") String packId) throws SeCurisServiceException {
LOG.info("Deleting pack with id: {}", packId);
EntityManager em = emProvider.get();
Pack pack = em.find(Pack.class, Integer.parseInt(packId));
@@ -343,10 +358,14 @@
return Response.status(Status.NOT_FOUND).header(DefaultExceptionHandler.ERROR_MESSAGE_HEADER, "Pack was not found, ID: " + packId)
.build();
}
- if (pack.getMetadata() != null) {
- for (PackMetadata md : pack.getMetadata()) {
- em.remove(md);
+ // Pack metadata is removed in cascade automatically.
+
+ Set<License> licenses = pack.getLicenses();
+ for (License license : licenses) {
+ if (license.getStatus() == LicenseStatus.ACTIVE || license.getStatus() == LicenseStatus.PRE_ACTIVE) {
+ throw new SeCurisServiceException(ErrorCodes.WRONG_STATUS, "An active license cannot be deleted. License code: " + license.getCode());
}
+ em.remove(license);
}
em.remove(pack);
diff --git a/securis/src/main/java/net/curisit/securis/services/helpers/LicenseHelper.java b/securis/src/main/java/net/curisit/securis/services/helpers/LicenseHelper.java
new file mode 100644
index 0000000..191e53d
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/services/helpers/LicenseHelper.java
@@ -0,0 +1,64 @@
+package net.curisit.securis.services.helpers;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Date;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import javax.persistence.EntityManager;
+
+import net.curisit.securis.db.License;
+import net.curisit.securis.db.LicenseHistory;
+import net.curisit.securis.db.LicenseStatus;
+import net.curisit.securis.db.User;
+import net.curisit.securis.security.BasicSecurityContext;
+import net.curisit.securis.services.exception.SeCurisServiceException;
+
+import org.apache.commons.io.IOUtils;
+
+@Singleton
+public class LicenseHelper {
+
+ @Inject
+ private UserHelper userHelper;
+
+ /**
+ * Cancel the license
+ *
+ * @param lic
+ * @param em
+ */
+ public void cancelLicense(License lic, String reason, BasicSecurityContext bsc, EntityManager em) throws SeCurisServiceException {
+ lic.setStatus(LicenseStatus.CANCELLED);
+ lic.setCancelledById(bsc.getUserPrincipal().getName());
+ lic.setModificationTimestamp(new Date());
+ em.persist(lic);
+
+ em.persist(createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.CANCEL, "Cancellation reason: " + reason));
+
+ }
+
+ public LicenseHistory createLicenseHistoryAction(License lic, User user, String action, String comments) {
+ LicenseHistory lh = new LicenseHistory();
+ lh.setLicense(lic);
+ lh.setUser(user);
+ lh.setTimestamp(new Date());
+ lh.setAction(action);
+ lh.setComments(comments);
+ return lh;
+ }
+
+ public LicenseHistory createLicenseHistoryAction(License lic, User user, String action) {
+ return createLicenseHistoryAction(lic, user, action, null);
+ }
+
+ public File createTemporaryLicenseFile(License lic, String licFileName) throws IOException {
+ File f = Files.createTempDirectory("securis-server").toFile();
+ f = new File(f, licFileName);
+ IOUtils.write(lic.getLicenseData(), new FileWriter(f));
+ return f;
+ }
+}
diff --git a/securis/src/main/java/net/curisit/securis/services/helpers/UserHelper.java b/securis/src/main/java/net/curisit/securis/services/helpers/UserHelper.java
new file mode 100644
index 0000000..5719764
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/services/helpers/UserHelper.java
@@ -0,0 +1,29 @@
+package net.curisit.securis.services.helpers;
+
+import javax.inject.Singleton;
+import javax.persistence.EntityManager;
+import javax.ws.rs.core.Response.Status;
+
+import net.curisit.securis.db.User;
+import net.curisit.securis.security.BasicSecurityContext;
+import net.curisit.securis.services.exception.SeCurisServiceException;
+
+@Singleton
+public class UserHelper {
+
+ public User getUser(BasicSecurityContext bsc, EntityManager em) throws SeCurisServiceException {
+ String username = bsc.getUserPrincipal().getName();
+ return getUser(username, em);
+ }
+
+ public User getUser(String username, EntityManager em) throws SeCurisServiceException {
+ User user = null;
+ if (username != null) {
+ user = em.find(User.class, username);
+ if (user == null) {
+ throw new SeCurisServiceException(Status.NOT_FOUND.getStatusCode(), "User not found with username: " + username);
+ }
+ }
+ return user;
+ }
+}
diff --git a/securis/src/main/resources/static/js/licenses.js b/securis/src/main/resources/static/js/licenses.js
index 6dfe849..2e250fa 100644
--- a/securis/src/main/resources/static/js/licenses.js
+++ b/securis/src/main/resources/static/js/licenses.js
@@ -105,11 +105,12 @@
var _error = _createErrorCallback(pack, $L.get('Put on hold'), _onerror);
packResource.putonhold({id: pack.id}, _success, _error);
}
- this.cancel = function(pack, _onsuccess, _onerror) {
+ this.cancel = function(pack, extra_data, _onsuccess, _onerror) {
console.log('Cancellation on pack: ' + pack.id);
var _success = _createSuccessCallback($L.get('Cancellation'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("cancelled")), _onsuccess);
var _error = _createErrorCallback(pack, $L.get('Cancellation'), _onerror);
- packResource.cancel({id: pack.id}, _success, _error);
+ var params = angular.extend({id: pack.id}, extra_data);
+ packResource.cancel(params, _success, _error);
}
this.delete = function(pack, _onsuccess, _onerror) {
console.log('Delete on pack: ' + pack.id);
@@ -334,10 +335,17 @@
*/
$scope.execute = function(action, pack) {
var _execute = function(extra_data) {
- Packs[action](pack || $scope.pack, extra_data, function() {
- if (!$scope.isNew) $scope.showForm = false;
- $scope.packs = Packs.getPacksList();
- });
+ if (extra_data) {
+ Packs[action](pack || $scope.pack, extra_data, function() {
+ if (!$scope.isNew) $scope.showForm = false;
+ $scope.packs = Packs.getPacksList();
+ });
+ } else {
+ Packs[action](pack || $scope.pack, function() {
+ if (!$scope.isNew) $scope.showForm = false;
+ $scope.packs = Packs.getPacksList();
+ });
+ }
}
if (action === 'delete') {
BootstrapDialog.confirm($L.get("The pack '{0}' will be deleted, are you sure ?", $scope.pack.code), function(answer) {
diff --git a/securis/src/main/resources/static/licenses.html b/securis/src/main/resources/static/licenses.html
index 977f1e3..a51263c 100644
--- a/securis/src/main/resources/static/licenses.html
+++ b/securis/src/main/resources/static/licenses.html
@@ -266,24 +266,6 @@
</form>
</div>
-<div class="modal fade" id="cancellationReasonDialog" tabindex="-1" role="dialog" aria-labelledby="cancelDialogLabel" aria-hidden="true">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
- <h4 class="modal-title" id="cancelDialogLabel" i18n>Pack cancellation</h4>
- </div>
- <div class="modal-body">
-
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal" i18n>Close</button>
- <button type="button" class="btn btn-primary" i18n>Cancel pack</button>
- </div>
- </div>
- </div>
-</div>
-
<div class="panel panel-default">
<div class="panel-heading">
Packs <span class="badge pull-right" ng-bind="packs.length || 0"></span>
@@ -323,7 +305,6 @@
</div>
</div>
- {{license | json}}
<div id="licenses_section" class="col-md-6"
ng-controller="LicensesCtrl">
<nav class="navbar navbar-default navbar-static-top"
--
Gitblit v1.3.2