středa 13. srpna 2014

Debug security in WildFly 8.x / EAP 6.x / JBoss AS7

If you try to find what are the security components doing in WildFly 8.x (or EAP 6.x + AS7) then enable TRACE log level for several categories.

You can simply use JBoss CLI to configure it:

cd $JBOSS_HOME/bin
./jboss-cli.sh -c << EOT
/subsystem=logging/logger=org.jboss.security:add(level=TRACE)
/subsystem=logging/logger=org.jboss.as.security:add(level=TRACE)
/subsystem=logging/logger=org.picketbox:add(level=TRACE)
/subsystem=logging/logger=org.apache.catalina.authenticator:add(level=TRACE)
/subsystem=logging/logger=org.jboss.as.web.security:add(level=TRACE)
/subsystem=logging/logger=org.jboss.as.domain.management.security:add(level=TRACE)
/subsystem=logging/console-handler=CONSOLE:write-attribute(name=level)
quit
EOT

If you don't use $JBOSS_HOME environment variable, just replace it with path to your application server installation.

pondělí 14. října 2013

jd-cli – Command line Java Decompiler

Kdo by neznal jd-gui Java Decompiler (z free.fr) a jeho sourozence, pluginy pro IDE – Eclipse a IntelliJ. Ale nechyběla vám také někdy možnost rychle decompilovat celý JAR nebo WAR do adresáře, případně zobrazit si decompilovanou třídu jen v konzoli bez nutnosti spouštění GUI?
Jestliže ano, pak se zkuste podívat na utilitku jd-cli, která toto všechno umožňuje. Tato aplikace je jednoduchý wrapper nad nativní knihovnou pro jd-gui InelliJ plugin.

Kde všude tato java aplikace běží?
  • Windows
  • Linux
  • Mac OSX

Kompilace

Potřebujete git a Maven.
git clone git@github.com:kwart/jd-cmd.git
cd jd-cmd
mvn clean package

Rozbalte jd-cli-[version].zip (.tar.gz) někam, kam odkazuje systémová PATH proměnná (C:\Windows nebo $HOME/bin) - distribuce obsahuje i spouštěcí skripty (shell a batch), takže pak už jen vesele voláte
jd-cli [aParametry]

Příklady použití

jd-cli HelloWorld.class
Zobrazí dekompilovanou třídu v konzoli

jd-cli --skipResources -n -g ALL app.jar
Dekompiluje obsah archivu app.jar do souboru app.src.jar, přeskočí kopírování resource souborů a výstup bude obsahovat v java souborech i komentáře s čísly řádků. Aplikace vypisuje všechny debug informace.

jd-cli myapp.jar -od decompiled -oc
Dekompiluje myapp.jar do adresáře pojmenovaného 'decompiled' a také vypisuje dekompilované třídy na obrazovku.

jd-cli --help
Na co asi tento příkaz slouží?

Chcete-li zjistit co se změnilo mezi verzemi nějaké knihovny, pak použijte něco na způsob:
jd-cli -od old library-oldVersion.jar
jd-cli -od new library-newVersion.jar
winmerge old new

Projekt naleznete na githubu - má dva moduly:
  • jd-lib - API decompilátoru
  • jd-cli - command-line prográmek (all-in-one jar), který využívá jd-lib a navíc obsahuje i JCommander pro parsování argumentů a LogBack pro logování.

pondělí 11. června 2012

Write once, run everywhere! Ale jen ocuť pocuť.

Dneska jsem zkoumal, proč nám některé testy pracují správně s Oracle Javou (1.6), ale pod IBM Javičkou padají. A výsledek mého bádání mě ohromil. Člověk by doufal, že alespoň třídy v balíku java.lang budou implementovány obdobně. A prdlajz!

Náš problém má původ v rozdílné implementaci metody Class.getMethods(), která toho občas u IBM vrátí o něco více než u Oraclu. Nejsem si zatím jistý, která implementace odpovídá JLS lépe, ale do dneška jsem předpokládal, že kvůli takovýmto problémům existuje TCK.

Chcete-li si problém vyzkoušet sami, zde je kód:

/**
 * This class is a reproducer for different results returned from Oracle and IBM Class.getMethod() call.
 * 
 * @author Josef Cacek
 */
public class GetMethodsProblemReproducer {

    // Public methods --------------------------------------------------------

    /**
     * Main method.
     */
    public static void main(String[] args) {
        System.out.println("Java: " + System.getProperty("java.version") + " " + System.getProperty("java.vendor"));
        System.out.println("Length of array returned by B.class.getMethods() call: " + B.class.getMethods().length);
    }

    // Embedded classes ------------------------------------------------------

    public static class A {
        public static void test() {
        }
    }

    public static class B extends A {
        public static void test() {
        }
    }
}

Výsledek pro Oracle Javu:

Java: 1.6.0_31 Sun Microsystems Inc.
Length of array returned by B.class.getMethods() call: 10

Výsledek pro IBM Javu:

Java: 1.6.0 IBM Corporation
Length of array returned by B.class.getMethods() call: 11

Jak jste jistě již sami správně vydedukovali, problém se vyskytne v případě, že "překrýváme" (nebo správněji skrýváme) veřejnou statickou metodu předka.