Roberto Sánchez
2014-09-19 7d9055a4985cdad24c23dfe53a5b0d2ba046bd7c
#396 feature - Added license generation from request file/content
2 files modified
1 files renamed
changed files
securis/pom.xml patch | view | blame | history
securis/src/main/java/net/curisit/securis/LicenseGenerator.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/services/LicenseResource.java patch | view | blame | history
securis/pom.xml
....@@ -24,22 +24,22 @@
2424 <dependency>
2525 <groupId>org.jboss.resteasy</groupId>
2626 <artifactId>resteasy-guice</artifactId>
27
- <version>3.0.5.Final</version>
27
+ <version>3.0.9.Final</version>
2828 </dependency>
2929 <dependency>
3030 <groupId>org.jboss.resteasy</groupId>
3131 <artifactId>resteasy-jackson-provider</artifactId>
32
- <version>3.0.5.Final</version>
32
+ <version>3.0.9.Final</version>
3333 </dependency>
3434 <dependency>
3535 <groupId>org.jboss.resteasy</groupId>
3636 <artifactId>resteasy-multipart-provider</artifactId>
37
- <version>3.0.5.Final</version>
37
+ <version>3.0.9.Final</version>
3838 </dependency>
3939 <dependency>
4040 <groupId>org.jboss.resteasy</groupId>
4141 <artifactId>resteasy-jaxrs</artifactId>
42
- <version>3.0.5.Final</version>
42
+ <version>3.0.9.Final</version>
4343 </dependency>
4444 <dependency>
4545 <groupId>net.curisit</groupId>
securis/src/patch/java/net/curisit/securis/LicenseGenerator.java
similarity index 95%rename from securis/src/patch/java/net/curisit/securis/LicenseGenerator.javarename to securis/src/main/java/net/curisit/securis/LicenseGenerator.java
....@@ -26,19 +26,19 @@
2626 import org.apache.logging.log4j.LogManager;
2727 import org.apache.logging.log4j.Logger;
2828
29
+import com.google.inject.Singleton;
30
+
2931 /**
3032 * License generator and signer
3133 *
3234 * @author roberto <roberto.sanchez@curisit.net>
3335 */
36
+@Singleton
3437 public class LicenseGenerator {
3538
3639 private static final Logger LOG = LogManager.getLogger(LicenseGenerator.class);
3740
3841 private static LicenseGenerator singleton = new LicenseGenerator();
39
-
40
- private LicenseGenerator() {
41
- }
4242
4343 public static LicenseGenerator getInstance() {
4444 return singleton;
....@@ -113,7 +113,7 @@
113113 Signature signature;
114114 try {
115115 signature = Signature.getInstance(SignatureHelper.SIGNATURE_GENERATION_ALGORITHM);
116
- signature.initSign(sh.generatePrivateKey(new File("/Users/cproberto/Documents/wsPython/doky/tests/securis_private_key.pkcs8")));
116
+ signature.initSign(sh.generatePrivateKey(new File(System.getProperty("user.home") + File.separator + ".SeCuris" + File.separator + "keys" + File.separator + "securis_private_key.pkcs8")));
117117
118118 sh.prepareSignature(signature, licBean);
119119
....@@ -147,6 +147,7 @@
147147 metadata.put("timeThreshold", 0);
148148 metadata.put("datasetPrefix", "BP");
149149 metadata.put("extendedMode", true);
150
+
150151 Date expirationDate = new Date(new Date().getTime() + (1000L * 3600 * 24 * 365 * 10));
151152 LicenseBean lic = LicenseGenerator.getInstance().generateLicense(req, metadata, expirationDate, "CI-01", "LIC-CURISTEC-0001");
152153 LicenseGenerator.getInstance().save(lic, new File("/Users/cproberto/Desktop/AxelLicCI.lic"));
....@@ -155,3 +156,4 @@
155156
156157 }
157158 }
159
+
securis/src/main/java/net/curisit/securis/services/LicenseResource.java
....@@ -1,8 +1,11 @@
11 package net.curisit.securis.services;
22
3
+import java.io.File;
34 import java.io.IOException;
45 import java.util.Date;
56 import java.util.List;
7
+import java.util.Map;
8
+import java.util.TreeMap;
69
710 import javax.inject.Inject;
811 import javax.inject.Provider;
....@@ -22,10 +25,17 @@
2225 import javax.ws.rs.core.Response;
2326 import javax.ws.rs.core.Response.Status;
2427
28
+import net.curisit.integrity.commons.JsonUtils;
2529 import net.curisit.integrity.commons.Utils;
2630 import net.curisit.securis.DefaultExceptionHandler;
31
+import net.curisit.securis.LicenseGenerator;
32
+import net.curisit.securis.ReqGenerator;
33
+import net.curisit.securis.SeCurisException;
34
+import net.curisit.securis.beans.LicenseBean;
35
+import net.curisit.securis.beans.RequestBean;
2736 import net.curisit.securis.db.License;
2837 import net.curisit.securis.db.LicenseHistory;
38
+import net.curisit.securis.db.LicenseType;
2939 import net.curisit.securis.db.Pack;
3040 import net.curisit.securis.db.User;
3141 import net.curisit.securis.security.BasicSecurityContext;
....@@ -33,8 +43,10 @@
3343 import net.curisit.securis.services.exception.SeCurisServiceException;
3444 import net.curisit.securis.utils.TokenHelper;
3545
46
+import org.apache.commons.io.IOUtils;
3647 import org.apache.logging.log4j.LogManager;
3748 import org.apache.logging.log4j.Logger;
49
+import org.bouncycastle.jce.provider.asymmetric.ec.ECUtil;
3850 import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
3951
4052 import com.google.inject.persist.Transactional;
....@@ -56,8 +68,8 @@
5668 @Inject
5769 Provider<EntityManager> emProvider;
5870
59
- public LicenseResource() {
60
- }
71
+ @Inject
72
+ LicenseGenerator licenseGenerator;
6173
6274 /**
6375 *
....@@ -138,6 +150,13 @@
138150 return Response.ok(lic.getLicenseData()).build();
139151 }
140152
153
+ /**
154
+ * Activate the given license
155
+ * @param licId
156
+ * @param bsc
157
+ * @return
158
+ * @throws SeCurisServiceException
159
+ */
141160 @PUT
142161 @POST
143162 @Path("/{licId}/activate")
....@@ -166,6 +185,13 @@
166185 return Response.ok(lic).build();
167186 }
168187
188
+ /**
189
+ * Send license file by email to the organization
190
+ * @param licId
191
+ * @param bsc
192
+ * @return
193
+ * @throws SeCurisServiceException
194
+ */
169195 @PUT
170196 @POST
171197 @Path("/{licId}/send")
....@@ -188,6 +214,13 @@
188214 return Response.ok(lic).build();
189215 }
190216
217
+ /**
218
+ * Cancel given license
219
+ * @param licId
220
+ * @param bsc
221
+ * @return
222
+ * @throws SeCurisServiceException
223
+ */
191224 @PUT
192225 @POST
193226 @Path("/{licId}/cancel")
....@@ -246,7 +279,7 @@
246279
247280 User createdBy = getUser(bsc.getUserPrincipal().getName(), em);
248281
249
- // ODO: Manage status if request data is set
282
+ // TODO: Manage status if request data is set
250283 lic.setCreatedBy(createdBy);
251284 lic.setStatus(License.Status.CREATED);
252285 lic.setCreationTimestamp(new Date());
....@@ -256,27 +289,95 @@
256289
257290 return Response.ok(lic).build();
258291 }
259
-
292
+
293
+ /**
294
+ * Extract the corresponding metadata for the Request license given
295
+ * @param req
296
+ * @return
297
+ * @throws SeCurisException
298
+ */
299
+ @SuppressWarnings("unchecked")
300
+ private Map<String, Object> getLicenseMetadata(RequestBean req) throws SeCurisException {
301
+ // TODO: The dummy metadata file is temporal, this info should be read from DB
302
+ File dummyMetadata = new File(System.getProperty("user.home") + File.separator + ".SeCuris" + File.separator + "dummy_metadata.json");
303
+ Map<String, Object> metadata = null;
304
+ try {
305
+ String metadataJson = IOUtils.toString(dummyMetadata.toURI());
306
+ metadata = new TreeMap<>((Map<String, Object>)JsonUtils.json2map(metadataJson).get(req.getAppCode()));
307
+ } catch (IOException e) {
308
+ LOG.error("Error reading dummy metadata file", e);
309
+ throw new SeCurisException("Error reading dummy metadata file");
310
+ }
311
+
312
+ return metadata;
313
+ }
314
+ private License getLicenseData(RequestBean req) throws SeCurisException {
315
+ // TODO: The dummy expiration date is temporal, this info should be read from DB
316
+ License lic = new License();
317
+ lic.setExpirationDate(new Date(new Date().getTime() + (1000L * 3600 * 24 * 365 * 10)));
318
+ lic.setCode(req.getAppCode() + "-LIC-INTERNAL");
319
+ LicenseType lt = new LicenseType();
320
+ lt.setCode("TYPE-" + req.getAppCode());
321
+ Pack pack = new Pack();
322
+ pack.setLicenseType(lt);
323
+ lic.setPack(pack);
324
+ return lic;
325
+ }
326
+
327
+ /**
328
+ * Request a new license file based in a RequestBean object sent as parameter
329
+ * @param mpfdi
330
+ * @param bsc
331
+ * @return
332
+ * @throws IOException
333
+ * @throws SeCurisServiceException
334
+ */
260335 @POST
261
- @Path("/")
336
+ @Path("/request")
337
+ @Consumes(MediaType.APPLICATION_JSON)
338
+ //TODO: Enable this: @Securable
339
+ @Produces({
340
+ MediaType.APPLICATION_JSON
341
+ })
342
+ @Transactional
343
+ public Response createFromRequest(RequestBean request, @Context BasicSecurityContext bsc) throws IOException, SeCurisServiceException, SeCurisException {
344
+ LOG.info("Request to get license: {}", request);
345
+
346
+ Map<String, Object> metadata = getLicenseMetadata(request);
347
+ License licDB = getLicenseData(request);
348
+
349
+ Date expirationDate = licDB.getExpirationDate();
350
+ String licenseTypeCode = licDB.getPack().getLicenseType().getCode();
351
+ String licenseCode = licDB.getCode();
352
+ LicenseBean lic = licenseGenerator.generateLicense(request, metadata, expirationDate, licenseTypeCode, licenseCode);
353
+ return Response.ok(lic).build();
354
+ }
355
+
356
+ @POST
357
+ @Path("/request")
262358 @Consumes(MediaType.MULTIPART_FORM_DATA)
263359 @Securable
264360 @Produces({
265361 MediaType.APPLICATION_JSON
266362 })
267363 @Transactional
268
- public Response createWithFile(MultipartFormDataInput mpfdi, @Context BasicSecurityContext bsc) throws IOException, SeCurisServiceException {
269
- License lic = new License();
270
- lic.setCode(mpfdi.getFormDataPart("code", String.class, null));
271
- lic.setRequestData(mpfdi.getFormDataPart("request_data", String.class, null));
272
- lic.setPackId(mpfdi.getFormDataPart("pack_id", Integer.class, null));
273
- lic.setFullName(mpfdi.getFormDataPart("full_name", String.class, null));
274
- lic.setEmail(mpfdi.getFormDataPart("email", String.class, null));
275
- lic.setComments(mpfdi.getFormDataPart("comments", String.class, null));
364
+ @SuppressWarnings("unchecked")
365
+ public Response createFromRequestFile(MultipartFormDataInput mpfdi, @Context BasicSecurityContext bsc) throws IOException, SeCurisServiceException, SeCurisException {
366
+ RequestBean req = new RequestBean();
367
+ req.setAppCode(mpfdi.getFormDataPart("appCode", String.class, null));
368
+ req.setArch(mpfdi.getFormDataPart("arch", String.class, null));
369
+ req.setCrcLogo(mpfdi.getFormDataPart("crcLogo", String.class, null));
370
+ req.setCustomerCode(mpfdi.getFormDataPart("customerCode", String.class, null));
371
+ req.setMacAddresses(mpfdi.getFormDataPart("macAddresses", List.class, null));
372
+ req.setOsName(mpfdi.getFormDataPart("osName", String.class, null));
276373
277
- return create(lic, bsc);
374
+ return createFromRequest(req, bsc);
278375 }
279376
377
+
378
+
379
+
380
+
280381 @PUT
281382 @POST
282383 @Path("/{licId}")