Преглед на файлове

第一轮整体测试,代码优化、逻辑完善、bug修复

JustryDeng преди 5 години
родител
ревизия
cbe4627e3e

+ 22 - 7
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/executor/EncryptExecutor.java

@@ -386,6 +386,7 @@ public class EncryptExecutor {
             }
             
             // 密码
+            // libUserIfInputPwd代表的意思是: 对lib进行混淆的时候,用户是否主动指定了密码
             boolean libUserIfInputPwd = Boolean.parseBoolean(new String(IOUtil.readFileFromWorkbenchRoot(lib, Constant.USER_IF_INPUT_PWD)));
             Logger.debug(EncryptExecutor.class, "libUserIfInputPwd info of lib [" + libJarName + "] -> " + libUserIfInputPwd);
             if (libUserIfInputPwd && StrUtil.isBlank(password)) {
@@ -409,6 +410,27 @@ public class EncryptExecutor {
             IOUtil.writeContentToFile(encryptedPassword, new File(dirAbsolutePathForLib, Constant.PWD_WINTER_SIMPLE_NAME));
             // 由于这里已经处理了,将所有lib的密码(不论当初加密lib时密码是用户主动输入的还是系统自动产生的),都当做系统自动产生的进行录入,所以这里写死为false
             IOUtil.writeContentToFile("false", new File(dirAbsolutePathForLib, Constant.USER_IF_INPUT_PWD_SIMPLE_NAME));
+    
+            // 擦除MANIFEST.MF中的Premain-Class信息, 如果有的话(步骤:判断是否需要擦除 => 解压lib => 擦除 => 删除原lib => 再压缩得到擦除后的lib => 删除临时目录)
+            byte[] jarManifestFileByte = IOUtil.readFileFromWorkbenchRoot(lib, Constant.MANIFEST_FILE);
+            if (jarManifestFileByte != null) {
+                String content = new String(jarManifestFileByte, StandardCharsets.UTF_8);
+                String agentPremain = "Premain-Class: " + Reverses.class.getName();
+                if (content.contains(agentPremain)) {
+                    content = content.replace(agentPremain, "");
+                    String libAbsolutePath = lib.getAbsolutePath();
+                    String tmpTargetDir = libAbsolutePath.substring(0, libAbsolutePath.length() - 4) + Constant.TMP_DIR_SUFFIX;
+                    JarUtil.unJarWar(libAbsolutePath, tmpTargetDir);
+                    IOUtil.writeContentToFile(content, new File(tmpTargetDir, Constant.MANIFEST_FILE));
+                    // 删除原lib
+                    IOUtil.delete(lib);
+                    // 再生成lib
+                    JarUtil.doJarWar(tmpTargetDir, libAbsolutePath);
+                    // 删除临时目录
+                    IOUtil.delete(new File(tmpTargetDir));
+                }
+
+            }
 
         });
         
@@ -458,13 +480,6 @@ public class EncryptExecutor {
             libJarAndTmpDirMap.put(jarAbsolutePath, temDir);
             // 删除原来的lib包
             IOUtil.delete(new File(jarAbsolutePath));
-            // 擦除MANIFEST.MF中的Premain-Class信息, 如果有的话
-            File jarManifestFile = new File(temDir, Constant.MANIFEST_FILE);
-            if (jarManifestFile.exists()) {
-                String content = IOUtil.readContentFromFile(jarManifestFile);
-                content = content.replace("Premain-Class: " + Reverses.class.getName(), "");
-                IOUtil.writeContentToFile(content, jarManifestFile);
-            }
         });
     }
     

+ 22 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AlreadyProtectedLibs_Test.java

@@ -14,7 +14,8 @@ import java.util.concurrent.TimeUnit;
  * 场景说明:
  *     项目my-project-with-encrypted-lib-no-pwd中依赖了lib包,但是这个lib包是被class-winter混淆了的,
  *     那么在对my-project-with-encrypted-lib-no-pwd进行打包时,就需要指定alreadyProtectedLibs
- *     以使用maven插件进行加密为例:
+ *
+ *     以使用maven插件进行加密为例(示例一):
  *     <plugin>
  *         <groupId>com.idea-aedi</groupId>
  *         <artifactId>class-winter-maven-plugin</artifactId>
@@ -35,6 +36,26 @@ import java.util.concurrent.TimeUnit;
  *         </executions>
  *     </plugin>
  *
+ *     以使用maven插件进行加密为例(示例二,lib需要输入密码):
+ *     <plugin>
+ *         <groupId>com.idea-aedi</groupId>
+ *         <artifactId>class-winter-maven-plugin</artifactId>
+ *         <version>1.0.0</version>
+ *         <configuration>
+ *             <finalName>my-project-with-encrypted-lib-have-pwd</finalName>
+ *             <includePrefix>non-exist</includePrefix>
+ *             <alreadyProtectedLibs>encrypted-lib-have-pwd-1.0.0.jar:qwer123~</alreadyProtectedLibs>
+ *         </configuration>
+ *         <executions>
+ *             <execution>
+ *                 <phase>package</phase>
+ *                 <goals>
+ *                     <goal>class-winter</goal>
+ *                 </goals>
+ *             </execution>
+ *         </executions>
+ *     </plugin>
+ *
  * @author {@link JustryDeng}
  * @since 2021/6/12 14:34:45
  */

+ 3 - 3
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/MixTest.java

@@ -28,14 +28,14 @@ public class MixTest {
 //                .originJarOrWar(projectRootDir + Constant.LINUX_FILE_SEPARATOR + "boot-jar.jar")
                 // 加密普通jar包
 //                 .originJarOrWar(projectRootDir + "normal-jar.jar")
-                 .originJarOrWar(projectRootDir + "ssm-0.0.1-SNAPSHOT.jar")
+                 .originJarOrWar(projectRootDir + "tmp/my-project-with-encrypted-lib-have-pwd.jar")
                 // 加密war包
                 // .originJarOrWar(projectRootDir + "war-project.war")
                 
                 // (必须)-> 前缀匹配的方式,指定需要加密的class
                 // 逗号后面有没有空格都可以
                 //.includePrefix("com.aspire.ssm.config,com.aspire.ssm.util,com.zaxxer.hikari,com.fasterxml.jackson")
-                .includePrefix("com.aspire.ssm")
+                .includePrefix("com.aspire.ssm123")
                 
                 // (可选)-> 指定加密后的jar包的名称, 会在同目录下生成abc-encrypted.jar
                 // 若与原jar(or war)同名,则会覆盖原来的jar(or war)包.
@@ -59,7 +59,7 @@ public class MixTest {
                 // (可选)-> 指明当前项依赖来的lib中,有哪些lib是本身就已经是被class-winter混淆了的
                 //  格式形如 xxx.jar:password, 多个之间使用逗号分割, 如果当初对该lib进行混淆时没有主动指定密码,那么可以不写
                 //.alreadyProtectedLibs("encrypted-lib-no-pwd.jar")
-                //.alreadyProtectedLibs("aa.jar,bb.jar:pwd123,cc.jar:")
+                .alreadyProtectedLibs("encrypted-lib-have-pwd-1.0.0.jar:qwer123~")
         
                 // (可选)-> 加密时,额外往加密上下文中添加的jar文件(或者jar文件所在的目录)
                 // <p>

BIN
class-winter-core/src/test/resources/my-project-with-encrypted-lib-have-pwd.jar


BIN
class-winter-core/src/test/resources/my-project-with-encrypted-lib-have-pwd.war


BIN
class-winter-core/src/test/resources/my-project-with-encrypted-lib-no-pwd.jar


BIN
class-winter-core/src/test/resources/my-project-with-encrypted-lib-no-pwd.war


BIN
class-winter-core/src/test/resources/my-project-with-normal-lib.jar


BIN
class-winter-core/src/test/resources/my-project-with-normal-lib.war