From f7be2173201d6ef2d559ef4e8fdfef5534eee29e Mon Sep 17 00:00:00 2001
From: Roberto Sánchez <roberto.sanchez@curisit.net>
Date: Mon, 24 Feb 2014 10:10:05 +0000
Subject: [PATCH] #593 feature - Added basic functionality (without server sync) to validate licenses and create request files

---
 src/main/java/net/curisit/securis/LicenseValidator.java  |   22 +++++++
 src/main/java/net/curisit/securis/utils/Params.java      |    3 +
 src/main/java/net/curisit/securis/LicenseManager.java    |   57 ++++++++++++++++--
 src/main/java/net/curisit/securis/ReqGenerator.java      |   29 +++++++++
 src/patch/java/net/curisit/securis/LicenseGenerator.java |   29 +++++++++
 5 files changed, 132 insertions(+), 8 deletions(-)

diff --git a/src/main/java/net/curisit/securis/LicenseManager.java b/src/main/java/net/curisit/securis/LicenseManager.java
index 6d74838..7aa0ac3 100644
--- a/src/main/java/net/curisit/securis/LicenseManager.java
+++ b/src/main/java/net/curisit/securis/LicenseManager.java
@@ -6,6 +6,7 @@
 import net.curisit.securis.beans.LicenseBean;
 import net.curisit.securis.beans.RequestBean;
 import net.curisit.securis.utils.JsonUtils;
+import net.curisit.securis.utils.Params;
 
 import org.apache.commons.io.FileUtils;
 
@@ -25,23 +26,65 @@
 		return singleton;
 	}
 
-	public LicenseBean validateLicense(File licFile, String appCode, String customerCode) throws SeCurisException {
+	/**
+	 * Validates the license stored in {@code licFile} and get the corresponding LicenseBean
+	 * <p>
+	 * The validation includes:
+	 * <ul>
+	 * <li>Signature</li>
+	 * <li>HW data</li>
+	 * <li>Logo CRC</li>
+	 * </ul>
+	 * </p>
+	 * 
+	 * @param licFile
+	 * @param appCode
+	 * @param customerCode
+	 * @return
+	 * @throws SeCurisException
+	 */
+	public LicenseBean validateLicense(File licFile) throws SeCurisException {
 		LicenseBean licBean;
 		try {
 			licBean = JsonUtils.json2object(FileUtils.readFileToString(licFile), LicenseBean.class);
 		} catch (IOException e) {
-			throw new SeCurisException("Error validating license", e);
+			throw new SeCurisException("Error getting license data from file: " + licFile, e);
 		}
 		SignatureHelper.getInstance().validateSignature(licBean);
-		validateHW(licBean, appCode, customerCode);
+		LicenseValidator.getInstance().validateHW(licBean, Params.get(Params.KEYS.APPLICATION_CODE), Params.get(Params.KEYS.CUSTOMER_CODE));
+		LicenseValidator.getInstance().validateLogo(licBean);
 
 		return licBean;
 	}
 
-	private void validateHW(RequestBean reqBean, String appCode, String customerCode) throws SeCurisException {
-		RequestBean currentHW = ReqGenerator.getInstance().createRequest(appCode, customerCode);
-		if (!currentHW.match(reqBean))
-			throw new SeCurisException("Current System info mismatch the License System info: " + JsonUtils.toJSON(reqBean));
+	/**
+	 * Creates a new request file with current hardware in the File passed as paramter
+	 * 
+	 * @param outputRequestFile
+	 *            File where the request data will be saved
+	 * @return The generated request bean
+	 * @throws SeCurisException
+	 */
+	public RequestBean createRequestFile(File outputRequestFile) throws SeCurisException {
+		RequestBean req = ReqGenerator.getInstance().createRequest(Params.get(Params.KEYS.APPLICATION_CODE), Params.get(Params.KEYS.CUSTOMER_CODE));
+
+		ReqGenerator.getInstance().save(req, outputRequestFile);
+
+		return req;
+	}
+
+	/**
+	 * Send the current license file to server, which is previously validated, to get a renewed one if it is prepared in server side.
+	 * 
+	 * @param licenseFile
+	 *            Current and valid License file
+	 * @return New license bean if server creates a new one, otherwise the same current License bean will be returned
+	 * @throws SeCurisException
+	 */
+	public LicenseBean sync(File licenseFile) throws SeCurisException {
+		LicenseBean lic = validateLicense(licenseFile);
+		// TODO: Send the current LicenseBean to server to check if a new one is prepared.
+		return lic;
 	}
 
 }
diff --git a/src/main/java/net/curisit/securis/LicenseValidator.java b/src/main/java/net/curisit/securis/LicenseValidator.java
index b622885..23c9ea7 100644
--- a/src/main/java/net/curisit/securis/LicenseValidator.java
+++ b/src/main/java/net/curisit/securis/LicenseValidator.java
@@ -4,20 +4,27 @@
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 
+import net.curisit.securis.beans.RequestBean;
+import net.curisit.securis.utils.JsonUtils;
 import net.curisit.securis.utils.LicUtils;
 
 import org.apache.commons.io.IOUtils;
 
 public class LicenseValidator {
 
+	public static LicenseValidator singleton = new LicenseValidator();
 	private byte[] LOGO_SECRET;
 
-	public LicenseValidator() {
+	private LicenseValidator() {
 		try {
 			LOGO_SECRET = "Logo ipsum s3cr3t test áíóú".getBytes("utf-8");
 		} catch (UnsupportedEncodingException e) {
 			e.printStackTrace();
 		}
+	}
+
+	public static LicenseValidator getInstance() {
+		return singleton;
 	}
 
 	/**
@@ -33,4 +40,17 @@
 			return null;
 		}
 	}
+
+	public void validateLogo(RequestBean reqBean) throws SeCurisException {
+		String currentCRC = getCrcLogo();
+		if (!currentCRC.equals(reqBean.getCrcLogo()))
+			throw new SeCurisException("License logo validation failed for request data: " + JsonUtils.toJSON(reqBean));
+	}
+
+	public void validateHW(RequestBean reqBean, String appCode, String customerCode) throws SeCurisException {
+		RequestBean currentHW = ReqGenerator.getInstance().createRequest(appCode, customerCode);
+		if (!currentHW.match(reqBean))
+			throw new SeCurisException("Current System info mismatch the License System info: " + JsonUtils.toJSON(reqBean));
+	}
+
 }
diff --git a/src/main/java/net/curisit/securis/ReqGenerator.java b/src/main/java/net/curisit/securis/ReqGenerator.java
index 665b54a..a329031 100644
--- a/src/main/java/net/curisit/securis/ReqGenerator.java
+++ b/src/main/java/net/curisit/securis/ReqGenerator.java
@@ -1,10 +1,15 @@
 package net.curisit.securis;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 
 import net.curisit.securis.beans.RequestBean;
+import net.curisit.securis.utils.JsonUtils;
 import net.curisit.securis.utils.LicUtils;
 
 import org.apache.commons.io.IOUtils;
@@ -45,6 +50,30 @@
 		return req;
 	}
 
+	/**
+	 * Generate a request file using a {@link RequestBean}
+	 * 
+	 * @param req
+	 * @param file
+	 * @throws SeCurisException
+	 */
+	public void save(RequestBean req, File file) throws SeCurisException {
+		byte[] json;
+		try {
+			json = JsonUtils.toJSON(req, true).getBytes("utf-8");
+			Files.write(Paths.get(file.toURI()), json, StandardOpenOption.CREATE);
+		} catch (UnsupportedEncodingException e) {
+			log.error("Error creating json doc from request: " + req, e);
+			throw new SeCurisException("Error creating json doc from request: " + req, e);
+		} catch (IOException e) {
+			log.error("Error creating request file: " + file, e);
+			throw new SeCurisException("Error creating request file: " + file, e);
+		}
+
+		log.info("License saved in {}", file);
+
+	}
+
 	private String getCrcLogo() {
 		String logResource = "images/logo_customer.png";
 		InputStream is = getClass().getClassLoader().getResourceAsStream(logResource);
diff --git a/src/main/java/net/curisit/securis/utils/Params.java b/src/main/java/net/curisit/securis/utils/Params.java
index 56260c3..9b8da6b 100644
--- a/src/main/java/net/curisit/securis/utils/Params.java
+++ b/src/main/java/net/curisit/securis/utils/Params.java
@@ -186,6 +186,9 @@
 		 */
 		public static final String PUBLIC_KEY_FILE = "public.key.file";
 
+		public static final String APPLICATION_CODE = "app.code";
+
+		public static final String CUSTOMER_CODE = "customer.code";
 	}
 
 }
diff --git a/src/patch/java/net/curisit/securis/LicenseGenerator.java b/src/patch/java/net/curisit/securis/LicenseGenerator.java
index e2b96f6..cd696ff 100644
--- a/src/patch/java/net/curisit/securis/LicenseGenerator.java
+++ b/src/patch/java/net/curisit/securis/LicenseGenerator.java
@@ -2,6 +2,10 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchProviderException;
@@ -14,6 +18,7 @@
 
 import net.curisit.securis.beans.LicenseBean;
 import net.curisit.securis.beans.RequestBean;
+import net.curisit.securis.utils.JsonUtils;
 
 import org.apache.commons.net.util.Base64;
 import org.slf4j.Logger;
@@ -62,6 +67,30 @@
 	}
 
 	/**
+	 * Generate a license file using a {@link LicenseBean}
+	 * 
+	 * @param license
+	 * @param file
+	 * @throws SeCurisException
+	 */
+	public void save(LicenseBean license, File file) throws SeCurisException {
+		byte[] json;
+		try {
+			json = JsonUtils.toJSON(license, true).getBytes("utf-8");
+			Files.write(Paths.get(file.toURI()), json, StandardOpenOption.CREATE);
+		} catch (UnsupportedEncodingException e) {
+			log.error("Error creating json doc from license: " + license, e);
+			throw new SeCurisException("Error creating json doc from license: " + license, e);
+		} catch (IOException e) {
+			log.error("Error creating license file: " + file, e);
+			throw new SeCurisException("Error creating json doc from license: " + license, e);
+		}
+
+		log.info("License saved in {}", file);
+
+	}
+
+	/**
 	 * TODO: This method should be removed from client code.
 	 * 
 	 * @param licBean

--
Gitblit v1.3.2