From 7d9055a4985cdad24c23dfe53a5b0d2ba046bd7c Mon Sep 17 00:00:00 2001
From: Roberto Sánchez <roberto.sanchez@curisit.net>
Date: Fri, 19 Sep 2014 14:50:56 +0000
Subject: [PATCH] #396 feature - Added license generation from request file/content

---
 securis/src/main/java/net/curisit/securis/services/LicenseResource.java |  129 ++++++++++++++++++++++++++++++++++++++----
 1 files changed, 115 insertions(+), 14 deletions(-)

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 8869c03..ba65000 100644
--- a/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
@@ -1,8 +1,11 @@
 package net.curisit.securis.services;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 import javax.inject.Inject;
 import javax.inject.Provider;
@@ -22,10 +25,17 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
+import net.curisit.integrity.commons.JsonUtils;
 import net.curisit.integrity.commons.Utils;
 import net.curisit.securis.DefaultExceptionHandler;
+import net.curisit.securis.LicenseGenerator;
+import net.curisit.securis.ReqGenerator;
+import net.curisit.securis.SeCurisException;
+import net.curisit.securis.beans.LicenseBean;
+import net.curisit.securis.beans.RequestBean;
 import net.curisit.securis.db.License;
 import net.curisit.securis.db.LicenseHistory;
+import net.curisit.securis.db.LicenseType;
 import net.curisit.securis.db.Pack;
 import net.curisit.securis.db.User;
 import net.curisit.securis.security.BasicSecurityContext;
@@ -33,8 +43,10 @@
 import net.curisit.securis.services.exception.SeCurisServiceException;
 import net.curisit.securis.utils.TokenHelper;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.bouncycastle.jce.provider.asymmetric.ec.ECUtil;
 import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
 
 import com.google.inject.persist.Transactional;
@@ -56,8 +68,8 @@
     @Inject
     Provider<EntityManager> emProvider;
 
-    public LicenseResource() {
-    }
+    @Inject
+    LicenseGenerator licenseGenerator;
 
     /**
      * 
@@ -138,6 +150,13 @@
         return Response.ok(lic.getLicenseData()).build();
     }
 
+    /**
+     * Activate the given license
+     * @param licId
+     * @param bsc
+     * @return
+     * @throws SeCurisServiceException
+     */
     @PUT
     @POST
     @Path("/{licId}/activate")
@@ -166,6 +185,13 @@
         return Response.ok(lic).build();
     }
 
+    /**
+     * Send license file by email to the organization
+     * @param licId
+     * @param bsc
+     * @return
+     * @throws SeCurisServiceException
+     */
     @PUT
     @POST
     @Path("/{licId}/send")
@@ -188,6 +214,13 @@
         return Response.ok(lic).build();
     }
 
+    /**
+     * Cancel given license
+     * @param licId
+     * @param bsc
+     * @return
+     * @throws SeCurisServiceException
+     */
     @PUT
     @POST
     @Path("/{licId}/cancel")
@@ -246,7 +279,7 @@
 
         User createdBy = getUser(bsc.getUserPrincipal().getName(), em);
 
-        // ODO: Manage status if request data is set
+        // TODO: Manage status if request data is set
         lic.setCreatedBy(createdBy);
         lic.setStatus(License.Status.CREATED);
         lic.setCreationTimestamp(new Date());
@@ -256,27 +289,95 @@
 
         return Response.ok(lic).build();
     }
-
+    
+    /**
+     * Extract the corresponding metadata for the Request license given
+     * @param req
+     * @return
+     * @throws SeCurisException
+     */
+    @SuppressWarnings("unchecked")
+    private Map<String, Object> getLicenseMetadata(RequestBean req) throws SeCurisException {
+        // TODO: The dummy metadata file is temporal, this info should be read from DB
+        File dummyMetadata =  new File(System.getProperty("user.home") + File.separator + ".SeCuris" + File.separator + "dummy_metadata.json");
+        Map<String, Object> metadata = null;
+        try {
+            String metadataJson = IOUtils.toString(dummyMetadata.toURI());
+            metadata = new TreeMap<>((Map<String, Object>)JsonUtils.json2map(metadataJson).get(req.getAppCode()));
+        } catch (IOException e) {
+            LOG.error("Error reading dummy metadata file", e);
+            throw new SeCurisException("Error reading dummy metadata file");
+        }
+        
+        return metadata;
+    }
+    private License getLicenseData(RequestBean req) throws SeCurisException {
+        // TODO: The dummy expiration date is temporal, this info should be read from DB
+        License lic = new License();
+        lic.setExpirationDate(new Date(new Date().getTime() + (1000L * 3600 * 24 * 365 * 10)));
+        lic.setCode(req.getAppCode() + "-LIC-INTERNAL");
+        LicenseType lt = new LicenseType();
+        lt.setCode("TYPE-" + req.getAppCode());
+        Pack pack = new Pack();
+        pack.setLicenseType(lt);
+        lic.setPack(pack);
+        return lic;
+    }
+    
+    /**
+     * Request a new license file based in a RequestBean object sent as parameter 
+     * @param mpfdi
+     * @param bsc
+     * @return
+     * @throws IOException
+     * @throws SeCurisServiceException
+     */
     @POST
-    @Path("/")
+    @Path("/request")
+    @Consumes(MediaType.APPLICATION_JSON)
+    //TODO: Enable this: @Securable
+    @Produces({
+        MediaType.APPLICATION_JSON
+    })
+    @Transactional
+    public Response createFromRequest(RequestBean request, @Context BasicSecurityContext bsc) throws IOException, SeCurisServiceException, SeCurisException {
+        LOG.info("Request to get license: {}", request);
+
+        Map<String, Object> metadata = getLicenseMetadata(request);
+        License licDB = getLicenseData(request);
+        
+        Date expirationDate = licDB.getExpirationDate();
+        String licenseTypeCode = licDB.getPack().getLicenseType().getCode();
+        String licenseCode = licDB.getCode();
+        LicenseBean lic = licenseGenerator.generateLicense(request, metadata, expirationDate, licenseTypeCode, licenseCode);
+        return Response.ok(lic).build();
+    }
+    
+    @POST
+    @Path("/request")
     @Consumes(MediaType.MULTIPART_FORM_DATA)
     @Securable
     @Produces({
         MediaType.APPLICATION_JSON
     })
     @Transactional
-    public Response createWithFile(MultipartFormDataInput mpfdi, @Context BasicSecurityContext bsc) throws IOException, SeCurisServiceException {
-        License lic = new License();
-        lic.setCode(mpfdi.getFormDataPart("code", String.class, null));
-        lic.setRequestData(mpfdi.getFormDataPart("request_data", String.class, null));
-        lic.setPackId(mpfdi.getFormDataPart("pack_id", Integer.class, null));
-        lic.setFullName(mpfdi.getFormDataPart("full_name", String.class, null));
-        lic.setEmail(mpfdi.getFormDataPart("email", String.class, null));
-        lic.setComments(mpfdi.getFormDataPart("comments", String.class, null));
+    @SuppressWarnings("unchecked")
+    public Response createFromRequestFile(MultipartFormDataInput mpfdi, @Context BasicSecurityContext bsc) throws IOException, SeCurisServiceException, SeCurisException {
+        RequestBean req = new RequestBean();
+        req.setAppCode(mpfdi.getFormDataPart("appCode", String.class, null));
+        req.setArch(mpfdi.getFormDataPart("arch", String.class, null));
+        req.setCrcLogo(mpfdi.getFormDataPart("crcLogo", String.class, null));
+        req.setCustomerCode(mpfdi.getFormDataPart("customerCode", String.class, null));
+        req.setMacAddresses(mpfdi.getFormDataPart("macAddresses", List.class, null));
+        req.setOsName(mpfdi.getFormDataPart("osName", String.class, null));
 
-        return create(lic, bsc);
+        return createFromRequest(req, bsc);
     }
 
+    
+
+        
+
     @PUT
     @POST
     @Path("/{licId}")

--
Gitblit v1.3.2