rsanchez
2014-12-01 e9297cfa6b7b86ffdfa1d10609295771c9b00e18
#396 fix - Added automated license code generation
8 files modified
changed files
pom.xml patch | view | blame | history
src/main/java/net/curisit/securis/License.java patch | view | blame | history
src/main/java/net/curisit/securis/LicenseManager.java patch | view | blame | history
src/main/java/net/curisit/securis/beans/RequestBean.java patch | view | blame | history
src/main/java/net/curisit/securis/utils/JsonUtils.java patch | view | blame | history
src/main/java/net/curisit/securis/utils/LicUtils.java patch | view | blame | history
src/main/java/net/curisit/securis/utils/Params.java patch | view | blame | history
src/main/resources/securis-client.properties patch | view | blame | history
pom.xml
....@@ -49,7 +49,7 @@
4949 <dependency>
5050 <groupId>org.apache.logging.log4j</groupId>
5151 <artifactId>log4j-core</artifactId>
52
- <version>2.0.2</version>
52
+ <version>2.1</version>
5353 </dependency>
5454 <dependency>
5555 <groupId>org.apache.httpcomponents</groupId>
....@@ -69,14 +69,14 @@
6969 <uniqueVersion>true</uniqueVersion>
7070 <id>curistec</id>
7171 <name>CurisTec Corporate Repository</name>
72
- <url>http://92.54.10.233:48080/archiva/repository/internal/</url>
72
+ <url>http://archiva.curisit.net/archiva/repository/internal/</url>
7373 <layout>default</layout>
7474 </repository>
7575 <snapshotRepository>
7676 <uniqueVersion>true</uniqueVersion>
7777 <id>curistecSnapshot</id>
7878 <name>CurisTec Snapshots</name>
79
- <url>http://10.0.0.12:8080/archiva/repository/snapshots/</url>
79
+ <url>http://archiva.curisit.net/archiva/repository/snapshots/</url>
8080 <layout>default</layout>
8181 </snapshotRepository>
8282 </distributionManagement>
src/main/java/net/curisit/securis/License.java
....@@ -197,4 +197,5 @@
197197
198198 return options;
199199 }
200
+
200201 }
src/main/java/net/curisit/securis/LicenseManager.java
....@@ -210,4 +210,13 @@
210210 }
211211 }
212212
213
+ public static void main(String[] args) throws SeCurisException {
214
+ String filename = null;
215
+ if (filename == null)
216
+ filename = "./license.req";
217
+ File file = new File(filename);
218
+ LicenseManager.getInstance().createRequestFile(file);
219
+ LOG.info("Request file {} generated OK", file.getAbsolutePath());
220
+
221
+ }
213222 }
src/main/java/net/curisit/securis/beans/RequestBean.java
....@@ -1,13 +1,18 @@
11 package net.curisit.securis.beans;
22
3
+import java.util.Collections;
34 import java.util.List;
45
56 import com.fasterxml.jackson.annotation.JsonAutoDetect;
67 import com.fasterxml.jackson.annotation.JsonInclude;
78 import com.fasterxml.jackson.annotation.JsonInclude.Include;
9
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
810
911 @JsonAutoDetect
1012 @JsonInclude(Include.NON_NULL)
13
+@JsonPropertyOrder({
14
+ "appName", "licenseTypeCode", "packCode", "arch", "osName", "customerCode", "macAddresses", "crcLogo"
15
+})
1116 public class RequestBean {
1217 private String customerCode;
1318 private String crcLogo;
....@@ -38,6 +43,9 @@
3843 }
3944
4045 public void setMacAddresses(List<String> macAddresses) {
46
+ // We need to be sure that the same mac addresses are always shown in
47
+ // the same order, to generate a valid hash
48
+ Collections.<String> sort(macAddresses);
4149 this.macAddresses = macAddresses;
4250 }
4351
src/main/java/net/curisit/securis/utils/JsonUtils.java
....@@ -15,8 +15,6 @@
1515 import com.fasterxml.jackson.databind.ObjectMapper;
1616 import com.fasterxml.jackson.databind.SerializationFeature;
1717
18
-//import org.codehaus.jackson.map.ObjectMapper;
19
-
2018 /**
2119 * Helper method to perform JSON tasks
2220 *
src/main/java/net/curisit/securis/utils/LicUtils.java
....@@ -1,56 +1,103 @@
11 package net.curisit.securis.utils;
22
33 import java.math.BigInteger;
4
+import java.nio.charset.Charset;
45 import java.security.MessageDigest;
56 import java.security.NoSuchAlgorithmException;
7
+import java.util.zip.CRC32;
68
79 import org.apache.logging.log4j.LogManager;
810 import org.apache.logging.log4j.Logger;
911
1012 public class LicUtils {
1113
12
- private static final Logger LOG = LogManager.getLogger(LicUtils.class);
14
+ private static final Logger LOG = LogManager.getLogger(LicUtils.class);
1315
14
- public static String md5(String str) {
15
- try {
16
- MessageDigest mDigest = MessageDigest.getInstance("MD5");
17
- mDigest.update(str.getBytes(), 0, str.length());
18
- BigInteger i = new BigInteger(1, mDigest.digest());
19
- return String.format("%1$032x", i);
20
- } catch (NoSuchAlgorithmException e) {
21
- LOG.error("Error generating MD5 for string: " + str, e);
22
- }
23
- return null;
24
- }
16
+ public static String md5(String str) {
17
+ try {
18
+ MessageDigest mDigest = MessageDigest.getInstance("MD5");
19
+ mDigest.update(str.getBytes(DEFAULT_CHARSET), 0, str.length());
20
+ BigInteger i = new BigInteger(1, mDigest.digest());
21
+ return String.format("%1$032x", i);
22
+ } catch (NoSuchAlgorithmException e) {
23
+ LOG.error("Error generating MD5 for string: " + str, e);
24
+ }
25
+ return null;
26
+ }
2527
26
- public static String sha256(String str) {
27
- return sha256(str.getBytes());
28
- }
28
+ public static String sha256(String str) {
29
+ return sha256(str.getBytes(DEFAULT_CHARSET));
30
+ }
2931
30
- public static String sha256(byte[] bytes) {
31
- try {
32
- MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
33
- mDigest.update(bytes, 0, bytes.length);
34
- BigInteger i = new BigInteger(1, mDigest.digest());
35
- return String.format("%1$064x", i);
36
- } catch (NoSuchAlgorithmException e) {
37
- LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
38
- }
39
- return null;
40
- }
32
+ public static String sha256(byte[] bytes) {
33
+ try {
34
+ MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
35
+ mDigest.update(bytes, 0, bytes.length);
36
+ BigInteger i = new BigInteger(1, mDigest.digest());
37
+ return String.format("%1$064x", i);
38
+ } catch (NoSuchAlgorithmException e) {
39
+ LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
40
+ }
41
+ return null;
42
+ }
4143
42
- public static String sha256(byte[]... bytes) {
43
- try {
44
- MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
45
- for (byte[] bs : bytes) {
46
- mDigest.update(bs, 0, bs.length);
47
- }
48
- BigInteger i = new BigInteger(1, mDigest.digest());
49
- return String.format("%1$064x", i);
50
- } catch (NoSuchAlgorithmException e) {
51
- LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
52
- }
53
- return null;
54
- }
44
+ public static String sha256(byte[]... bytes) {
45
+ try {
46
+ MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
47
+ for (byte[] bs : bytes) {
48
+ mDigest.update(bs, 0, bs.length);
49
+ }
50
+ BigInteger i = new BigInteger(1, mDigest.digest());
51
+ return String.format("%1$064x", i);
52
+ } catch (NoSuchAlgorithmException e) {
53
+ LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
54
+ }
55
+ return null;
56
+ }
5557
58
+ private final static Charset DEFAULT_CHARSET = Charset.forName("utf-8");
59
+
60
+ public static String getLicenseCrc(String packCode, String licSufixCode) {
61
+ CRC32 crc = new CRC32();
62
+ crc.update(packCode.getBytes(DEFAULT_CHARSET));
63
+ crc.update(licSufixCode.getBytes(DEFAULT_CHARSET));
64
+ return String.format("%03d", crc.getValue() % 1000);
65
+ }
66
+
67
+ public static String getLicenseCrc(String packCode, Integer licSufixCode) {
68
+ return getLicenseCrc(packCode, licSufixCode.toString());
69
+ }
70
+
71
+ public static Integer getLicenseCodeSuffix(String licCode) {
72
+ String[] parts = licCode.split("-");
73
+
74
+ return new Integer(parts[2]);
75
+ }
76
+
77
+ public static String getLicenseCode(String packCode, Integer licSufixCode) {
78
+ String crc = getLicenseCrc(packCode, licSufixCode);
79
+ return String.format("%s-%s-%s", packCode, crc, licSufixCode);
80
+ }
81
+
82
+ /**
83
+ * Check if the license code is valid according to the format, the CRC is
84
+ * validated
85
+ *
86
+ * @param licCode
87
+ * @return true if license code format and its CRC are valid
88
+ */
89
+ public static boolean checkValidLicenseCodeCrc(String licCode) {
90
+ String[] parts = licCode.split("-");
91
+ if (parts.length != 3) {
92
+ return false;
93
+ }
94
+ String crc = getLicenseCrc(parts[0], parts[2]);
95
+ return crc.equals(parts[1]);
96
+ }
97
+
98
+ public static void main(String[] args) {
99
+ String code = getLicenseCode("PCK01", 5);
100
+ System.out.println(code);
101
+ System.out.println("Is valid ? " + checkValidLicenseCodeCrc("PCK01-512-"));
102
+ }
56103 }
src/main/java/net/curisit/securis/utils/Params.java
....@@ -24,7 +24,7 @@
2424 * can be set as initial parameter in a servlet loaded on startup
2525 */
2626 public static final String DEFAUT_SERVER_URL = "https://securis.curistec.com/api";
27
- public static final String KEY_CONFIG_FILE = "/securis-server.properties";
27
+ public static final String KEY_CONFIG_FILE = "/securis-client.properties";
2828
2929 private static Properties params = null;
3030
....@@ -204,10 +204,6 @@
204204
205205 public static final String LICENSE_SERVER_URL = "license.server.url";
206206
207
- public static final String MAILGUN_DOMAIN = "mailgun.domain";
208
- public static final String MAILGUN_API_KEY = "mailgun.api.key";
209
- public static final String EMAIL_FROM_ADDRESS = "email.from.address";
210
- public static final String EMAIL_LIC_DEFAULT_SUBJECT = "email.lic.default.subject";
211207 }
212208
213209 }
src/main/resources/securis-client.properties
....@@ -1,3 +1,4 @@
11 license.server.url = https://securis.curistec.com/api
22 app.code = CI01
33 customer.code = CT01
4
+pack.code = P1