Skip to content

Commit 169e570

Browse files
committed
Keep rules fix
1 parent d93ee96 commit 169e570

File tree

6 files changed

+74
-47
lines changed

6 files changed

+74
-47
lines changed

src/main/java/net/cvs0/config/ConfigLoader.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,24 @@ public ObfuscationConfig.Builder loadConfig(File configFile) throws IOException
2020
JsonNode root = objectMapper.readTree(configFile);
2121
ObfuscationConfig.Builder builder = new ObfuscationConfig.Builder();
2222

23+
JsonNode obfuscationNode = root.has("obfuscation") ? root.get("obfuscation") : root;
24+
2325
if (root.has("renameClasses")) {
2426
builder.renameClasses(root.get("renameClasses").asBoolean());
27+
} else if (obfuscationNode.has("renameClasses")) {
28+
builder.renameClasses(obfuscationNode.get("renameClasses").asBoolean());
2529
}
26-
30+
2731
if (root.has("renameFields")) {
2832
builder.renameFields(root.get("renameFields").asBoolean());
33+
} else if (obfuscationNode.has("renameFields")) {
34+
builder.renameFields(obfuscationNode.get("renameFields").asBoolean());
2935
}
3036

3137
if (root.has("renameMethods")) {
3238
builder.renameMethods(root.get("renameMethods").asBoolean());
39+
} else if (obfuscationNode.has("renameMethods")) {
40+
builder.renameMethods(obfuscationNode.get("renameMethods").asBoolean());
3341
}
3442

3543

@@ -54,12 +62,18 @@ public ObfuscationConfig.Builder loadConfig(File configFile) throws IOException
5462
builder.verbose(root.get("verbose").asBoolean());
5563
}
5664

65+
JsonNode keepRulesNode = root.has("keepRules") ? root.get("keepRules") : root;
66+
5767
if (root.has("keepMainClass")) {
5868
builder.keepMainClass(root.get("keepMainClass").asBoolean());
69+
} else if (keepRulesNode.has("keepMainClass")) {
70+
builder.keepMainClass(keepRulesNode.get("keepMainClass").asBoolean());
5971
}
6072

6173
if (root.has("keepStandardEntryPoints")) {
6274
builder.keepStandardEntryPoints(root.get("keepStandardEntryPoints").asBoolean());
75+
} else if (keepRulesNode.has("keepStandardEntryPoints")) {
76+
builder.keepStandardEntryPoints(keepRulesNode.get("keepStandardEntryPoints").asBoolean());
6377
}
6478

6579
if (root.has("sequentialTransformers")) {
@@ -95,9 +109,9 @@ public ObfuscationConfig.Builder loadConfig(File configFile) throws IOException
95109
if (root.has("maxThreads")) {
96110
builder.maxThreads(root.get("maxThreads").asInt());
97111
}
98-
99-
if (root.has("keepClasses")) {
100-
JsonNode keepClasses = root.get("keepClasses");
112+
113+
if (keepRulesNode.has("keepClasses")) {
114+
JsonNode keepClasses = keepRulesNode.get("keepClasses");
101115
if (keepClasses.isArray()) {
102116
List<String> classes = new ArrayList<>();
103117
for (JsonNode node : keepClasses) {
@@ -107,8 +121,8 @@ public ObfuscationConfig.Builder loadConfig(File configFile) throws IOException
107121
}
108122
}
109123

110-
if (root.has("keepClassPatterns")) {
111-
JsonNode keepClassPatterns = root.get("keepClassPatterns");
124+
if (keepRulesNode.has("keepClassPatterns")) {
125+
JsonNode keepClassPatterns = keepRulesNode.get("keepClassPatterns");
112126
if (keepClassPatterns.isArray()) {
113127
List<String> patterns = new ArrayList<>();
114128
for (JsonNode node : keepClassPatterns) {
@@ -118,8 +132,8 @@ public ObfuscationConfig.Builder loadConfig(File configFile) throws IOException
118132
}
119133
}
120134

121-
if (root.has("keepMethods")) {
122-
JsonNode keepMethods = root.get("keepMethods");
135+
if (keepRulesNode.has("keepMethods")) {
136+
JsonNode keepMethods = keepRulesNode.get("keepMethods");
123137
if (keepMethods.isArray()) {
124138
List<String> methods = new ArrayList<>();
125139
for (JsonNode node : keepMethods) {
@@ -129,8 +143,19 @@ public ObfuscationConfig.Builder loadConfig(File configFile) throws IOException
129143
}
130144
}
131145

132-
if (root.has("keepFields")) {
133-
JsonNode keepFields = root.get("keepFields");
146+
if (keepRulesNode.has("keepMethodsInClassPatterns")) {
147+
JsonNode keepMethodsInClassPatterns = keepRulesNode.get("keepMethodsInClassPatterns");
148+
if (keepMethodsInClassPatterns.isArray()) {
149+
List<String> patterns = new ArrayList<>();
150+
for (JsonNode node : keepMethodsInClassPatterns) {
151+
patterns.add(node.asText());
152+
}
153+
builder.keepMethodsInClassPatterns(patterns);
154+
}
155+
}
156+
157+
if (keepRulesNode.has("keepFields")) {
158+
JsonNode keepFields = keepRulesNode.get("keepFields");
134159
if (keepFields.isArray()) {
135160
List<String> fields = new ArrayList<>();
136161
for (JsonNode node : keepFields) {

src/main/java/net/cvs0/config/ConfigValidator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.cvs0.config;
22

33
import java.util.*;
4+
import java.util.regex.Pattern;
5+
import java.util.regex.PatternSyntaxException;
46

57
public class ConfigValidator
68
{
@@ -48,6 +50,12 @@ public static ValidationResult validate(ObfuscationConfig config)
4850
for (String pattern : config.getKeepClassPatterns()) {
4951
if (pattern == null || pattern.trim().isEmpty()) {
5052
result.addError("Keep class pattern cannot be null or empty");
53+
} else {
54+
try {
55+
Pattern.compile(pattern);
56+
} catch (PatternSyntaxException e) {
57+
result.addError("Invalid regex pattern '" + pattern + "': " + e.getMessage());
58+
}
5159
}
5260
}
5361

src/main/java/net/cvs0/config/ObfuscationConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class ObfuscationConfig
2727
private final Set<String> keepClasses;
2828
private final Set<String> keepClassPatterns;
2929
private final Set<String> keepMethods;
30+
private final Set<String> keepMethodsInClassPatterns;
3031
private final Set<String> keepFields;
3132
private final Set<String> includePackages;
3233
private final Set<String> excludePackages;
@@ -58,6 +59,7 @@ private ObfuscationConfig(Builder builder)
5859
this.keepClasses = Collections.unmodifiableSet(new HashSet<>(builder.keepClasses));
5960
this.keepClassPatterns = Collections.unmodifiableSet(new HashSet<>(builder.keepClassPatterns));
6061
this.keepMethods = Collections.unmodifiableSet(new HashSet<>(builder.keepMethods));
62+
this.keepMethodsInClassPatterns = Collections.unmodifiableSet(new HashSet<>(builder.keepMethodsInClassPatterns));
6163
this.keepFields = Collections.unmodifiableSet(new HashSet<>(builder.keepFields));
6264
this.includePackages = Collections.unmodifiableSet(new HashSet<>(builder.includePackages));
6365
this.excludePackages = Collections.unmodifiableSet(new HashSet<>(builder.excludePackages));
@@ -88,6 +90,7 @@ private ObfuscationConfig(Builder builder)
8890
public Set<String> getKeepClasses() { return keepClasses; }
8991
public Set<String> getKeepClassPatterns() { return keepClassPatterns; }
9092
public Set<String> getKeepMethods() { return keepMethods; }
93+
public Set<String> getKeepMethodsInClassPatterns() { return keepMethodsInClassPatterns; }
9194
public Set<String> getKeepFields() { return keepFields; }
9295
public Set<String> getIncludePackages() { return includePackages; }
9396
public Set<String> getExcludePackages() { return excludePackages; }
@@ -133,6 +136,7 @@ public static class Builder
133136
private Set<String> keepClasses = new HashSet<>();
134137
private Set<String> keepClassPatterns = new HashSet<>();
135138
private Set<String> keepMethods = new HashSet<>();
139+
private Set<String> keepMethodsInClassPatterns = new HashSet<>();
136140
private Set<String> keepFields = new HashSet<>();
137141
private Set<String> includePackages = new HashSet<>();
138142
private Set<String> excludePackages = new HashSet<>();
@@ -165,6 +169,8 @@ public static class Builder
165169
public Builder keepClassPatterns(Collection<String> patterns) { this.keepClassPatterns.addAll(patterns); return this; }
166170
public Builder keepMethod(String methodSignature) { this.keepMethods.add(methodSignature); return this; }
167171
public Builder keepMethods(Collection<String> methodSignatures) { this.keepMethods.addAll(methodSignatures); return this; }
172+
public Builder keepMethodsInClassPattern(String classPattern) { this.keepMethodsInClassPatterns.add(classPattern); return this; }
173+
public Builder keepMethodsInClassPatterns(Collection<String> classPatterns) { this.keepMethodsInClassPatterns.addAll(classPatterns); return this; }
168174
public Builder keepField(String fieldSignature) { this.keepFields.add(fieldSignature); return this; }
169175
public Builder keepFields(Collection<String> fieldSignatures) { this.keepFields.addAll(fieldSignatures); return this; }
170176
public Builder includePackage(String packageName) { this.includePackages.add(packageName); return this; }

src/main/java/net/cvs0/core/Obfuscator.java

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -212,34 +212,4 @@ private List<ObfuscationStrategy> createDefaultStrategies()
212212

213213
return defaultStrategies;
214214
}
215-
216-
public void addStrategy(ObfuscationStrategy strategy)
217-
{
218-
if (strategy != null) {
219-
strategies.add(strategy);
220-
}
221-
}
222-
223-
public void removeStrategy(Class<? extends ObfuscationStrategy> strategyClass)
224-
{
225-
strategies.removeIf(strategy -> strategy.getClass().equals(strategyClass));
226-
}
227-
228-
public List<ObfuscationStrategy> getStrategies()
229-
{
230-
return new ArrayList<>(strategies);
231-
}
232-
233-
public void shutdown()
234-
{
235-
executorService.shutdown();
236-
try {
237-
if (!executorService.awaitTermination(30, TimeUnit.SECONDS)) {
238-
executorService.shutdownNow();
239-
}
240-
} catch (InterruptedException e) {
241-
Thread.currentThread().interrupt();
242-
executorService.shutdownNow();
243-
}
244-
}
245215
}

src/main/java/net/cvs0/obfuscation/strategies/ClassRenamingStrategy.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,20 @@ private void initializeKeepRules(Program program, ObfuscationConfig config, Mapp
5454
}
5555

5656
for (String pattern : config.getKeepClassPatterns()) {
57-
Pattern regex = Pattern.compile(pattern.replace("*", ".*"));
58-
for (ProgramClass cls : program.getAllClasses()) {
59-
if (regex.matcher(cls.getName()).matches()) {
60-
mappingContext.addKeepClass(cls.getName());
61-
nameGenerator.addReservedName(cls.getName());
62-
if (config.isVerbose()) {
63-
Logger.debug("Added keep class by pattern '" + pattern + "': " + cls.getName());
57+
try {
58+
Pattern regex = Pattern.compile(pattern);
59+
int matchCount = 0;
60+
for (ProgramClass cls : program.getAllClasses()) {
61+
String className = cls.getName();
62+
if (regex.matcher(className).matches()) {
63+
mappingContext.addKeepClass(className);
64+
nameGenerator.addReservedName(className);
65+
matchCount++;
6466
}
6567
}
68+
Logger.info("Pattern '" + pattern + "' matched " + matchCount + " classes");
69+
} catch (Exception e) {
70+
Logger.info("Invalid regex pattern '" + pattern + "': " + e.getMessage());
6671
}
6772
}
6873

src/main/java/net/cvs0/obfuscation/strategies/MethodRenamingStrategy.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import net.cvs0.utils.Logger;
99

1010
import java.util.*;
11+
import java.util.regex.Pattern;
1112

1213
public class MethodRenamingStrategy implements ObfuscationStrategy
1314
{
@@ -76,6 +77,18 @@ private void initializeKeepRules(Program program, ObfuscationConfig config, Mapp
7677
}
7778
}
7879

80+
for (String pattern : config.getKeepMethodsInClassPatterns()) {
81+
Pattern regex = Pattern.compile(pattern);
82+
for (ProgramClass cls : program.getAllClasses()) {
83+
if (regex.matcher(cls.getName()).matches()) {
84+
for (ProgramMethod method : cls.getMethods()) {
85+
mappingContext.addKeepMethod(cls.getName(), method.getName(), method.getDescriptor());
86+
nameGenerator.addReservedName(method.getName());
87+
}
88+
}
89+
}
90+
}
91+
7992
for (String customMapping : config.getCustomMappings().keySet()) {
8093
if (customMapping.contains(".") && customMapping.contains("(")) {
8194
String[] parts = customMapping.split("\\.", 2);

0 commit comments

Comments
 (0)