Friday, March 22, 2013

What is the best open source Java decompiler?

A Java decompiler turns a .class file back into a .java file. While decompiled code is not perfect (no comments, sometimes obfuscated names), it can be useful during hacking competitions, or to liberate your data locked by proprietary software, or to satisfy curiosity.

There used to be a time where everyone's decompiler of choice was jad.
But jad is dead, and it was not Open Source anyway, so there must be something better, right?

Current winner



Started in 2012, Procyon has quickly emerged as the best open source Java decompiler. Its source code is released under the Apache 2 license, making it easily reusable. It has GUI frontends:  and SecureTeam Java Decompiler, bytecode-viewer and Luyten.

Lead by Mike Strobel, Procyon has a healthy community with issue reports being filed and processed every few weeks, pull requests from various contributors, and several releases per year.

Challengers

  • Fernflower is the second best, and its inclusion in IntelliJ speaks about its reliability. Also released under the Apache 2 license, it is unfortunately hold back by project policy problems: 1) No releases, meaning that users have to either compile it or use IntelliJ 2) No separate issue tracker, which means Fernflower issue reports get lost in the sea of IntelliJ issue reports.
  • Krakatau, interestingly written in Python, and licensed under the GNU GPLv3 license, is kept active by its leader and its community is slowly growing. It does not fully support Java 8 yet.
  • CFR is produced as a friendly competition within the same company as Procyon. A young project with frequent releases, it is not open source yet as the author wishes to polish the code before.
  •  Cake Decompiler/Candle Decompiler is a work in progress that stalled a few months ago. Even though it is backed by RedHat, there is a risk that it will be abandoned in favor of the more advanced challengers.

Abandoned

  • Jdec is a great Open Source decompiler, but it is not perfect: There is no community, and there are bugs, none of which has got fixed since 2007.
  • JODE has had no release since 2004.
  • dcompiler has had no release since 2002.
  • JReversePro shows signs of activity but has had no release since 2002.

Need work

  • Dava seems to be a thesis project rather than a programming tool.
  • javap only shows assembly-level code.
  • Soot is not really a decompiler.

Out of Competition

Those ones might be usable but they are not Open Source:
Please let us know about any other Open Source decompiler your know!
Nicolas Raoul

Wednesday, March 13, 2013

Alfrescoのユーザ検索の文字数制限

こんにちは。おおたにです。

今回はAlfrescoのユーザ検索についてお話ししたいと思います。Alfrescoを使っている人であればご存知の方も多いと思いますが、ユーザ検索には最低文字数が設定されています。基本的には1文字なのですが、権限管理画面でのユーザ/グループ検索だけ何故か3文字になっています。ユーザIDだけでなく姓名でも検索できるのですが、残念ながら「鈴木」さんとか「林」さんとかでは検索できません。


せっかくなので、ここも1文字以上で検索できるようにしてみましょう。変更箇所は以下のとおりです。

webapps/share/components/manage-permissions/manage-permissions.js
// Set the correct options for our use
this.modules.authorityFinder.setOptions(
{
   dataWebScript: Alfresco.constants.URL_SERVICECONTEXT + "components/people-finder/authority-query",
   viewMode: Alfresco.AuthorityFinder.VIEW_MODE_COMPACT,
   singleSelectMode: true,
//   minSearchTermLength: 3
   minSearchTermLength: 1
});

さらに、上記変更ファイルからwebapps/share/components/manage-permissions/manage-permissions-min.jsを再作成する必要があります。この-min.jsは元のJavaScriptファイルを圧縮し、容量を減らしたものなので、YUI Compressor等を使って圧縮してください。

上記2ファイルの修正が終わったら、Alfrescoサーバを再起動して確認してみましょう。以下のように3文字未満でも検索ができるようになっていればOKです。

 

Wednesday, March 6, 2013

AlfrescoをActive Directoryと連携させてみた

こんにちは。おおたにです。

今回はAlfrescoをActive Directory(以下AD)と連携させてみようと思います。一言で連携と言っても、単純な認証の委譲なのか、SSOなのかとかありますが、今回はAlfrescoログイン時の認証をADに行ってもらう&ユーザ・グループ情報を同期するという一番簡単なパターンについて見ていきます。


初めに


この記事の前提条件は以下の通りです。
  • Alfrescoがインストールされている(本記事では現時点での最新版であるAlfresco 4.2.cを使っています)
  • ADがセットアップされている(Windows Server 2008 R2を使ってます)
Alfrescoがインストールされていない場合は「Alfresco4.0をインストールしてみよう(インストーラ編)」や「Alfresco4.0をインストールしてみよう(手動インストール編)」を参考にインストールしてみてください。ADについては…頑張ってください!

なお、ADにはLDAPアクセスする必要があるため、ファイアウォールでは標準的なLDAP用ポートである389番を通すように設定しておいてください。


AlfrescoにAD連携用の設定を行う


基本は以前の記事「AlfrescoのLDAP連携」とほぼ同じで、設定項目がちょろっと違う程度だと思ってください。

まずは、ユーザやグループのBaseDNを調べるべく、適当なLDAPクライアントを使ってADにアクセスしてみます。筆者はよくApache Directory Studio(のEclipseプラグイン)を使っています。インストール方法等はこちらにまとめられています。インストールしたら、早速ADにアクセスしてみます。以下のスナップショットのように新規接続を作成してアクセスし、同期対象のユーザ/グループのBaseDNを調べます。




すると、ユーザのBaseDNはOU=User Accounts,DC=aegif,DC=localで、グループのBaseDNはOU=User Groups,DC=aegif,DC=localであることが分かります。ちなみにこの例ではADサーバのIPが192.168.0.70、ドメイン名がaegif.local、ADアクセス用のユーザアカウントはAdministratorとなっています(実運用上は、ADの情報を取得する権限を委譲した個別のユーザアカウントを用意した方がよいかと思います)。

以上で設定に必要な情報がそろったので、Alfrescoにこれらの設定を反映させます。いじるファイルは <tomcat_dir>/shared/classes/alfresco-global.properties です。このファイルが無い場合は、alfresco-global.properties.sample というファイルがあるはずなのでこれをリネームして利用します。

# How to map the user id entered by the user to taht passed through to LDAP
# In Active Directory, this can either be the user principal name (UPN) or DN.
# UPNs are in the form <samaccountname>@domain and are held in the userPrincipalName attribute of a user
ldap.authentication.userNameFormat=%s@aegif.local

# The URL to connect to the LDAP server 
ldap.authentication.java.naming.provider.url=ldap://192.168.0.70:389

# The default principal to bind with (only used for LDAP sync). This should be a UPN or DN
ldap.synchronization.java.naming.security.principal=Administrator@aegif.local

# The password for the default principal (only used for LDAP sync)
ldap.synchronization.java.naming.security.credentials=p@ssw0rd

# The group search base restricts the LDAP group query to a sub section of tree on the LDAP server.
ldap.synchronization.groupSearchBase=ou\=User Groups,dc\=aegif,dc\=local

# The user search base restricts the LDAP user query to a sub section of tree on the LDAP server.
ldap.synchronization.userSearchBase=ou\=User Accounts,dc\=aegif,dc\=local


# authentication chain
authentication.chain=alfrescoNtlm1:alfrescoNtlm,ldap-ad1:ldap-ad

以上で設定完了です。"ldap"から始まるプロパティがAD連携に関する設定で、"authentication.chain"は、Alfrescoログイン時の認証システムとして何を利用するかを指定するものです。複数指定し、認証処理をチェイニングすることが可能で、この例では通常のAlfrescoの認証とAD認証の両方を利用できるように設定されます。
"ldap-ad1:ldap-ad"はある種のおまじないで、Alfrescoの認証システム等で使われるSubsystemという仕組みにおけるAD連携モジュールのIDだと思ってください(このおまじないによって呼び出されるbeanの定義ファイルは <tomcat_dir>/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Authentication/ldap-ad/ldap-ad-authentication-context.xml ですので、興味があったら見てみてください)。


できたかな?


あとはAlfrescoを起動し、実際に動作確認してみるだけです。Alfresco起動時にユーザ/グループ情報の同期処理が走るので、起動後にログをチェックしてみてエラーが出力されていないかを確認してみてください。 また、実際にADのユーザでログインしてみて、正常にログインできることも確認してくださいね(当たり前!)。他方、adminユーザでログインし、ユーザ/グループ情報が同期されていることも確認しましょう。

今回はここまでになります。この先にはSSO等がひかえていると思いますが、それはそれで大きなトピックですのでまたの機会にしたいと思います。