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