From e9297cfa6b7b86ffdfa1d10609295771c9b00e18 Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Mon, 01 Dec 2014 15:00:01 +0000
Subject: [PATCH] #396 fix - Added automated license code generation

---
 src/main/java/net/curisit/securis/utils/Params.java      |    6 -
 src/main/java/net/curisit/securis/utils/LicUtils.java    |  125 ++++++++++++++++++++++++++++-------------
 src/main/java/net/curisit/securis/utils/JsonUtils.java   |    2 
 src/main/java/net/curisit/securis/LicenseManager.java    |    9 +++
 src/main/resources/securis-client.properties             |    1 
 src/main/java/net/curisit/securis/beans/RequestBean.java |    8 ++
 pom.xml                                                  |    6 +-
 src/main/java/net/curisit/securis/License.java           |    1 
 8 files changed, 109 insertions(+), 49 deletions(-)

diff --git a/pom.xml b/pom.xml
index 914f385..9b5eab9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,7 @@
 		<dependency>
 			<groupId>org.apache.logging.log4j</groupId>
 			<artifactId>log4j-core</artifactId>
-			<version>2.0.2</version>
+			<version>2.1</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.httpcomponents</groupId>
@@ -69,14 +69,14 @@
       <uniqueVersion>true</uniqueVersion>
       <id>curistec</id>
       <name>CurisTec Corporate Repository</name>
-      <url>http://92.54.10.233:48080/archiva/repository/internal/</url>
+      <url>http://archiva.curisit.net/archiva/repository/internal/</url>
       <layout>default</layout>
     </repository>
     <snapshotRepository>
       <uniqueVersion>true</uniqueVersion>
       <id>curistecSnapshot</id>
       <name>CurisTec Snapshots</name>
-      <url>http://10.0.0.12:8080/archiva/repository/snapshots/</url>
+      <url>http://archiva.curisit.net/archiva/repository/snapshots/</url>
       <layout>default</layout>
    </snapshotRepository>
 	</distributionManagement>
diff --git a/src/main/java/net/curisit/securis/License.java b/src/main/java/net/curisit/securis/License.java
index d92061c..e33c9fb 100644
--- a/src/main/java/net/curisit/securis/License.java
+++ b/src/main/java/net/curisit/securis/License.java
@@ -197,4 +197,5 @@
 
         return options;
     }
+
 }
diff --git a/src/main/java/net/curisit/securis/LicenseManager.java b/src/main/java/net/curisit/securis/LicenseManager.java
index e6bf728..46365df 100644
--- a/src/main/java/net/curisit/securis/LicenseManager.java
+++ b/src/main/java/net/curisit/securis/LicenseManager.java
@@ -210,4 +210,13 @@
         }
     }
 
+    public static void main(String[] args) throws SeCurisException {
+        String filename = null;
+        if (filename == null)
+            filename = "./license.req";
+        File file = new File(filename);
+        LicenseManager.getInstance().createRequestFile(file);
+        LOG.info("Request file {} generated OK", file.getAbsolutePath());
+
+    }
 }
diff --git a/src/main/java/net/curisit/securis/beans/RequestBean.java b/src/main/java/net/curisit/securis/beans/RequestBean.java
index 3f79375..8925903 100644
--- a/src/main/java/net/curisit/securis/beans/RequestBean.java
+++ b/src/main/java/net/curisit/securis/beans/RequestBean.java
@@ -1,13 +1,18 @@
 package net.curisit.securis.beans;
 
+import java.util.Collections;
 import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 
 @JsonAutoDetect
 @JsonInclude(Include.NON_NULL)
+@JsonPropertyOrder({
+        "appName", "licenseTypeCode", "packCode", "arch", "osName", "customerCode", "macAddresses", "crcLogo"
+})
 public class RequestBean {
     private String customerCode;
     private String crcLogo;
@@ -38,6 +43,9 @@
     }
 
     public void setMacAddresses(List<String> macAddresses) {
+        // We need to be sure that the same mac addresses are always shown in
+        // the same order, to generate a valid hash
+        Collections.<String> sort(macAddresses);
         this.macAddresses = macAddresses;
     }
 
diff --git a/src/main/java/net/curisit/securis/utils/JsonUtils.java b/src/main/java/net/curisit/securis/utils/JsonUtils.java
index 1492de4..5226c98 100644
--- a/src/main/java/net/curisit/securis/utils/JsonUtils.java
+++ b/src/main/java/net/curisit/securis/utils/JsonUtils.java
@@ -15,8 +15,6 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
-//import org.codehaus.jackson.map.ObjectMapper;
-
 /**
  * Helper method to perform JSON tasks
  * 
diff --git a/src/main/java/net/curisit/securis/utils/LicUtils.java b/src/main/java/net/curisit/securis/utils/LicUtils.java
index 964cca8..234b14c 100644
--- a/src/main/java/net/curisit/securis/utils/LicUtils.java
+++ b/src/main/java/net/curisit/securis/utils/LicUtils.java
@@ -1,56 +1,103 @@
 package net.curisit.securis.utils;
 
 import java.math.BigInteger;
+import java.nio.charset.Charset;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.zip.CRC32;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 public class LicUtils {
 
-	private static final Logger LOG = LogManager.getLogger(LicUtils.class);
+    private static final Logger LOG = LogManager.getLogger(LicUtils.class);
 
-	public static String md5(String str) {
-		try {
-			MessageDigest mDigest = MessageDigest.getInstance("MD5");
-			mDigest.update(str.getBytes(), 0, str.length());
-			BigInteger i = new BigInteger(1, mDigest.digest());
-			return String.format("%1$032x", i);
-		} catch (NoSuchAlgorithmException e) {
-			LOG.error("Error generating MD5 for string: " + str, e);
-		}
-		return null;
-	}
+    public static String md5(String str) {
+        try {
+            MessageDigest mDigest = MessageDigest.getInstance("MD5");
+            mDigest.update(str.getBytes(DEFAULT_CHARSET), 0, str.length());
+            BigInteger i = new BigInteger(1, mDigest.digest());
+            return String.format("%1$032x", i);
+        } catch (NoSuchAlgorithmException e) {
+            LOG.error("Error generating MD5 for string: " + str, e);
+        }
+        return null;
+    }
 
-	public static String sha256(String str) {
-		return sha256(str.getBytes());
-	}
+    public static String sha256(String str) {
+        return sha256(str.getBytes(DEFAULT_CHARSET));
+    }
 
-	public static String sha256(byte[] bytes) {
-		try {
-			MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
-			mDigest.update(bytes, 0, bytes.length);
-			BigInteger i = new BigInteger(1, mDigest.digest());
-			return String.format("%1$064x", i);
-		} catch (NoSuchAlgorithmException e) {
-			LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
-		}
-		return null;
-	}
+    public static String sha256(byte[] bytes) {
+        try {
+            MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
+            mDigest.update(bytes, 0, bytes.length);
+            BigInteger i = new BigInteger(1, mDigest.digest());
+            return String.format("%1$064x", i);
+        } catch (NoSuchAlgorithmException e) {
+            LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
+        }
+        return null;
+    }
 
-	public static String sha256(byte[]... bytes) {
-		try {
-			MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
-			for (byte[] bs : bytes) {
-				mDigest.update(bs, 0, bs.length);
-			}
-			BigInteger i = new BigInteger(1, mDigest.digest());
-			return String.format("%1$064x", i);
-		} catch (NoSuchAlgorithmException e) {
-			LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
-		}
-		return null;
-	}
+    public static String sha256(byte[]... bytes) {
+        try {
+            MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
+            for (byte[] bs : bytes) {
+                mDigest.update(bs, 0, bs.length);
+            }
+            BigInteger i = new BigInteger(1, mDigest.digest());
+            return String.format("%1$064x", i);
+        } catch (NoSuchAlgorithmException e) {
+            LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
+        }
+        return null;
+    }
 
+    private final static Charset DEFAULT_CHARSET = Charset.forName("utf-8");
+
+    public static String getLicenseCrc(String packCode, String licSufixCode) {
+        CRC32 crc = new CRC32();
+        crc.update(packCode.getBytes(DEFAULT_CHARSET));
+        crc.update(licSufixCode.getBytes(DEFAULT_CHARSET));
+        return String.format("%03d", crc.getValue() % 1000);
+    }
+
+    public static String getLicenseCrc(String packCode, Integer licSufixCode) {
+        return getLicenseCrc(packCode, licSufixCode.toString());
+    }
+
+    public static Integer getLicenseCodeSuffix(String licCode) {
+        String[] parts = licCode.split("-");
+
+        return new Integer(parts[2]);
+    }
+
+    public static String getLicenseCode(String packCode, Integer licSufixCode) {
+        String crc = getLicenseCrc(packCode, licSufixCode);
+        return String.format("%s-%s-%s", packCode, crc, licSufixCode);
+    }
+
+    /**
+     * Check if the license code is valid according to the format, the CRC is
+     * validated
+     * 
+     * @param licCode
+     * @return true if license code format and its CRC are valid
+     */
+    public static boolean checkValidLicenseCodeCrc(String licCode) {
+        String[] parts = licCode.split("-");
+        if (parts.length != 3) {
+            return false;
+        }
+        String crc = getLicenseCrc(parts[0], parts[2]);
+        return crc.equals(parts[1]);
+    }
+
+    public static void main(String[] args) {
+        String code = getLicenseCode("PCK01", 5);
+        System.out.println(code);
+        System.out.println("Is valid ? " + checkValidLicenseCodeCrc("PCK01-512-"));
+    }
 }
diff --git a/src/main/java/net/curisit/securis/utils/Params.java b/src/main/java/net/curisit/securis/utils/Params.java
index ce20eac..622335b 100644
--- a/src/main/java/net/curisit/securis/utils/Params.java
+++ b/src/main/java/net/curisit/securis/utils/Params.java
@@ -24,7 +24,7 @@
      * can be set as initial parameter in a servlet loaded on startup
      */
     public static final String DEFAUT_SERVER_URL = "https://securis.curistec.com/api";
-    public static final String KEY_CONFIG_FILE = "/securis-server.properties";
+    public static final String KEY_CONFIG_FILE = "/securis-client.properties";
 
     private static Properties params = null;
 
@@ -204,10 +204,6 @@
 
         public static final String LICENSE_SERVER_URL = "license.server.url";
 
-        public static final String MAILGUN_DOMAIN = "mailgun.domain";
-        public static final String MAILGUN_API_KEY = "mailgun.api.key";
-        public static final String EMAIL_FROM_ADDRESS = "email.from.address";
-        public static final String EMAIL_LIC_DEFAULT_SUBJECT = "email.lic.default.subject";
     }
 
 }
diff --git a/src/main/resources/securis-client.properties b/src/main/resources/securis-client.properties
index 11910d7..5382344 100644
--- a/src/main/resources/securis-client.properties
+++ b/src/main/resources/securis-client.properties
@@ -1,3 +1,4 @@
 license.server.url = https://securis.curistec.com/api
 app.code = CI01
 customer.code = CT01
+pack.code = P1

--
Gitblit v1.3.2