gsls200808 8 anos atrás
pai
commit
ba0b0736bf

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+/.idea/*
+/target/*
+*.iml

+ 68 - 0
pom.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.vvvtimes.com</groupId>
+    <artifactId>JrebelBrainsLicenseServerforJava</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.eclipse.jetty.aggregate</groupId>
+            <artifactId>jetty-all</artifactId>
+            <version>8.1.21.v20160908</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>3.0.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.58</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>2.4</version>
+            <classifier>jdk15</classifier>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.1</version>
+        </dependency>
+
+    </dependencies>
+
+
+</project>

+ 33 - 0
src/main/java/com/vvvtimes/JrebelUtil/ByteUtil.java

@@ -0,0 +1,33 @@
+package com.vvvtimes.JrebelUtil;
+import org.apache.commons.codec.binary.Base64;
+
+import java.nio.charset.Charset;
+import java.util.Random;
+
+public class ByteUtil {
+    private static final Random a;
+
+    public static String a(final byte[] binaryData) {
+        if (binaryData == null) {
+            return null;
+        }
+        return new String(Base64.encodeBase64(binaryData), Charset.forName("UTF-8"));
+    }
+
+    public static byte[] a(final String s) {
+        if (s == null) {
+            return null;
+        }
+        return Base64.decodeBase64(s.getBytes(Charset.forName("UTF-8")));
+    }
+
+    public static byte[] a(final int n) {
+        final byte[] array = new byte[n];
+        ByteUtil.a.nextBytes(array);
+        return array;
+    }
+
+    static {
+        a = new Random();
+    }
+}

+ 23 - 0
src/main/java/com/vvvtimes/JrebelUtil/JrebelSign.java

@@ -0,0 +1,23 @@
+package com.vvvtimes.JrebelUtil;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class JrebelSign {
+    private String signature;
+
+    public void toLeaseCreateJson(String clientRandomness,String guid ) {
+        //String serverRandomness = ByteUtil.a(ByteUtil.a(8));
+        String serverRandomness =  "H2ulzLlh7E0="; //服务端随机数,如果要自己生成,务必将其写到json的serverRandomness中
+        String installationGuidString = guid;
+        String value = String.valueOf("false");
+        String s2 = StringUtils.join((Object[]) new String[]{clientRandomness, serverRandomness, installationGuidString , value}, ';');
+        System.out.println(s2);
+        final byte[] a2 =LicenseServer2ToJRebelPrivateKey.a(s2.getBytes());
+        this.signature = ByteUtil.a(a2);
+    }
+
+    public String getSignature() {
+        return signature;
+    }
+
+}

+ 41 - 0
src/main/java/com/vvvtimes/JrebelUtil/LicenseServer2ToJRebelPrivateKey.java

@@ -0,0 +1,41 @@
+package com.vvvtimes.JrebelUtil;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.security.GeneralSecurityException;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.security.spec.PKCS8EncodedKeySpec;
+
+public class LicenseServer2ToJRebelPrivateKey {
+    private static final String b = "MIICXAIBAAKBgQDQ93CP6SjEneDizCF1P/MaBGf582voNNFcu8oMhgdTZ/N6qa6O7XJDr1FSCyaDdKSsPCdxPK7Y4Usq/fOPas2kCgYcRS/iebrtPEFZ/7TLfk39HLuTEjzo0/CNvjVsgWeh9BYznFaxFDLx7fLKqCQ6w1OKScnsdqwjpaXwXqiulwIDAQABAoGATOQvvBSMVsTNQkbgrNcqKdGjPNrwQtJkk13aO/95ZJxkgCc9vwPqPrOdFbZappZeHa5IyScOI2nLEfe+DnC7V80K2dBtaIQjOeZQt5HoTRG4EHQaWoDh27BWuJoip5WMrOd+1qfkOtZoRjNcHl86LIAh/+3vxYyebkug4UHNGPkCQQD+N4ZUkhKNQW7mpxX6eecitmOdN7Yt0YH9UmxPiW1LyCEbLwduMR2tfyGfrbZALiGzlKJize38shGC1qYSMvZFAkEA0m6psWWiTUWtaOKMxkTkcUdigalZ9xFSEl6jXFB94AD+dlPS3J5gNzTEmbPLc14VIWJFkO+UOrpl77w5uF2dKwJAaMpslhnsicvKMkv31FtBut5iK6GWeEafhdPfD94/bnidpP362yJl8Gmya4cI1GXvwH3pfj8S9hJVA5EFvgTB3QJBAJP1O1uAGp46X7Nfl5vQ1M7RYnHIoXkWtJ417Kb78YWPLVwFlD2LHhuy/okT4fk8LZ9LeZ5u1cp1RTdLIUqAiAECQC46OwOm87L35yaVfpUIjqg/1gsNwNsj8HvtXdF/9d30JIM3GwdytCvNRLqP35Ciogb9AO8ke8L6zY83nxPbClM=";
+    private static final byte[] c;
+    private static final BouncyCastleProvider d;
+
+    private static PrivateKey a() {
+        final PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(LicenseServer2ToJRebelPrivateKey.c);
+        try {
+            return KeyFactory.getInstance("RSA", LicenseServer2ToJRebelPrivateKey.d).generatePrivate(pkcs8EncodedKeySpec);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            return null;
+        }
+    }
+
+    public static byte[] a(final byte[] array) {
+        try {
+            final Signature instance = Signature.getInstance("SHA1withRSA", LicenseServer2ToJRebelPrivateKey.d);
+            instance.initSign(a());
+            instance.update(array);
+            return instance.sign();
+        } catch (GeneralSecurityException ex) {
+            throw new RuntimeException("License Server installation error 0000000F2", ex);
+        }
+    }
+
+    static {
+        c = ByteUtil.a("MIICXAIBAAKBgQDQ93CP6SjEneDizCF1P/MaBGf582voNNFcu8oMhgdTZ/N6qa6O7XJDr1FSCyaDdKSsPCdxPK7Y4Usq/fOPas2kCgYcRS/iebrtPEFZ/7TLfk39HLuTEjzo0/CNvjVsgWeh9BYznFaxFDLx7fLKqCQ6w1OKScnsdqwjpaXwXqiulwIDAQABAoGATOQvvBSMVsTNQkbgrNcqKdGjPNrwQtJkk13aO/95ZJxkgCc9vwPqPrOdFbZappZeHa5IyScOI2nLEfe+DnC7V80K2dBtaIQjOeZQt5HoTRG4EHQaWoDh27BWuJoip5WMrOd+1qfkOtZoRjNcHl86LIAh/+3vxYyebkug4UHNGPkCQQD+N4ZUkhKNQW7mpxX6eecitmOdN7Yt0YH9UmxPiW1LyCEbLwduMR2tfyGfrbZALiGzlKJize38shGC1qYSMvZFAkEA0m6psWWiTUWtaOKMxkTkcUdigalZ9xFSEl6jXFB94AD+dlPS3J5gNzTEmbPLc14VIWJFkO+UOrpl77w5uF2dKwJAaMpslhnsicvKMkv31FtBut5iK6GWeEafhdPfD94/bnidpP362yJl8Gmya4cI1GXvwH3pfj8S9hJVA5EFvgTB3QJBAJP1O1uAGp46X7Nfl5vQ1M7RYnHIoXkWtJ417Kb78YWPLVwFlD2LHhuy/okT4fk8LZ9LeZ5u1cp1RTdLIUqAiAECQC46OwOm87L35yaVfpUIjqg/1gsNwNsj8HvtXdF/9d30JIM3GwdytCvNRLqP35Ciogb9AO8ke8L6zY83nxPbClM=");
+        d = new BouncyCastleProvider();
+    }
+}

+ 90 - 0
src/main/java/com/vvvtimes/server/MainServer.java

@@ -0,0 +1,90 @@
+package com.vvvtimes.server;
+
+import com.vvvtimes.JrebelUtil.JrebelSign;
+import net.sf.json.JSONObject;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+
+public class MainServer extends AbstractHandler {
+
+    public static void main(String[] args) throws Exception {
+        Server server = new Server(8081);
+        server.setHandler(new MainServer());
+        server.start();
+        server.join();
+    }
+
+    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+        System.out.println(target);
+        if (target.equals("/")) {
+            indexHandler(target, baseRequest, request, response);
+        }  else if (target.equals("/jrebel/leases")) {
+            jrebelLeasesHandler(target, baseRequest, request, response);
+        } else {
+            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+        }
+
+    }
+
+    private void jrebelLeasesHandler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        response.setContentType("application/json; charset=utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+        String clientRandomness = request.getParameter("randomness");
+        String username = request.getParameter("username");
+        String guid = request.getParameter("guid");
+        baseRequest.setHandled(true);
+        String jsonStr = "{\n" +
+                "    \"serverVersion\": \"3.2.4\",\n" +
+                "    \"serverProtocolVersion\": \"1.1\",\n" +
+                "    \"serverGuid\": \"a1b4aea8-b031-4302-b602-670a990272cb\",\n" +
+                "    \"groupType\": \"managed\",\n" +
+                "    \"id\": 1,\n" +
+                "    \"licenseType\": 1,\n" +
+                "    \"evaluationLicense\": false,\n" +
+                "    \"signature\": \"OJE9wGg2xncSb+VgnYT+9HGCFaLOk28tneMFhCbpVMKoC/Iq4LuaDKPirBjG4o394/UjCDGgTBpIrzcXNPdVxVr8PnQzpy7ZSToGO8wv/KIWZT9/ba7bDbA8/RZ4B37YkCeXhjaixpmoyz/CIZMnei4q7oWR7DYUOlOcEWDQhiY=\",\n" +
+                "    \"serverRandomness\": \"H2ulzLlh7E0=\",\n" +
+                "    \"seatPoolType\": \"standalone\",\n" +
+                "    \"statusCode\": \"SUCCESS\",\n" +
+                "    \"offline\": false,\n" +
+                "    \"validFrom\": null,\n" +
+                "    \"validUntil\": null,\n" +
+                "    \"company\": \"Administrator\",\n" +
+                "    \"orderId\": \"\",\n" +
+                "    \"zeroIds\": [\n" +
+                "        \n" +
+                "    ],\n" +
+                "    \"licenseValidFrom\": 1490544001000,\n" +
+                "    \"licenseValidUntil\": 1691839999000\n" +
+                "}";
+
+        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
+        if (clientRandomness == null || username == null || guid == null) {
+            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+        } else {
+            JrebelSign jrebelSign =new JrebelSign();
+            jrebelSign.toLeaseCreateJson(clientRandomness,guid);
+            String signature = jrebelSign.getSignature();
+            jsonObject.put("signature",signature);
+            jsonObject.put("company",username);
+            String body = jsonObject.toString();
+            response.getWriter().print(body);
+        }
+    }
+
+    private void indexHandler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        response.setContentType("text/html; charset=utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+        baseRequest.setHandled(true);
+        response.getWriter().println("<h1>Hello,This is a Jrebel License Server!</h1>");
+
+    }
+}