アーカイブ

‘java’ カテゴリーのアーカイブ

slim3のバージョンアップをする (1.0.7から1.0.8に更新)

2011 年 3 月 2 日 tdtsh Comments off

この手順は私が行ったことの記録として書いたものですので、誤りを含んでいる可能性があります。

実際の手順は、Slim3 日本語サイト(非公式)などを良く確認して行ってください。

ダウンロード

slim3プロジェクト から、slim3の最新版( 2011年3月2日現在 slim3-blank-1.0.8.zip ) をダウンロードして解凍する。

 
 


jarファイルを置換

slim3を置換
下記のファイルをを削除し

	yourproject/war/WEB-INF/lib/slim3-1.0.7.jar

解凍したslim3のものをプロジェクト内のディレクトリにペーストする

	yourproject/war/WEB-INF/lib/slim3-1.0.8.jar

 
 

slim3-genを置換
下記のファイルをを削除し

	yourproject/lib/slim3-gen-1.0.7.jar

解凍したslim3のものをプロジェクト内のディレクトリにペーストする

	yourproject/lib/slim3-gen-1.0.8.jar

 
 

slim3-*-sourceを置換
下記のファイルをを削除し

	yourproject/libsrc/slim3-1.0.7-sources.jar
	yourproject/libsrc/slim3-gen-1.0.7-sources.jar

解凍したslim3のものをプロジェクト内のディレクトリにペーストする

	yourproject/libsrc/slim3-1.0.8-sources.jar
	yourproject/libsrc/slim3-gen-1.0.8-sources.jar

 
 


ビルドパスの変更

eclipseを起動し、yourprojectプロジェクトを右クリック – [ビルド・パス(B)] – [ビルド・パスの構成(C)]をクリック

プロジェクトのプロパティー [Java のビルド・パス]が開くので、[ライブラリー(L)]タブを選択

下記を選択し[除去(R)]をクリック

	war/WEB-INF/lib/slim3-1.0.7.jar

左ペインの yourprojectプロジェクト の下記を右クリック

	war/WEB-INF/lib/slim3-1.0.8.jar

[ビルド・パス(B)] – [ビルド・パスに追加(A)]をクリック

 
 


アノテーション処理のファクトリパスを変更

パッケージ・エクスプローラにてyourprojectプロジェクトを選択する

[プロジェクト(P)] – [プロパティー(P)]をクリックする

[Javaコンパイラー] – [注釈処理] – [ファクトリーパス]をクリックする

[JAR の追加(J)]をクリックする

[JARの選択]ダイアログにて、[yourproject] – [lib] – [slim3-gen-1.0.8.jar]を選択し、[適用(A)]をクリックする

[OK]をクリックする

カテゴリー: Google App Engine, eclipse, java, slim3 タグ:

CentOS 5.5 のserifフォントで「葉」のグリフがおかしい

2010 年 12 月 1 日 tdtsh Comments off

CentOS 5.5 で動かしているサーブレットコンテナで、つまりjavaで、論理フォントにserifを指定して日本語を扱っている時に気がついたんですが、「葉」が文字化けみたいになっちゃいます。

こんなん
葉がおかしい

※背景は気にしないでください

で、そのCentOSでFirefoxを立ち上げてみたら、やっぱり「葉」がおかしい。
どうやら、さざなみ明朝の「葉」のグリフがおかしいみたい。
ちゃんと調べてないけど他にもあるかもしれない。

良い機会だから、もう少しマシなフォントを入れたのでメモしておきます。

 


IPAフォントをインストール

http://ossipedia.ipa.go.jp/ipafont/ から IPAfont00302.zip をダウンロードして、

unzip IPAfont00302.zip
cp ./IPAfont00302/*.ttf /usr/share/fonts/japanese/TrueType/
fc-cache -fv

fc-list | grep IPA
#——————————————————————–
# IPAゴシック,IPAGothic:style=Regular
# IPA Pゴシック,IPAPGothic:style=Regular
# IPA明朝,IPAMincho:style=Regular
# IPA P明朝,IPAPMincho:style=Regular
#——————————————————————–

 


 


jdkにでIPAフォントを使う

これがハマリました。

JDK は 6u16 で、yum でインストールせず、 Sunのサイト、今は
Oracleのサイトからダウンロードした jdk-6u16-linux-i586.bin で、過去の習慣から /usr/local/j2sdk/ でシンボリックリンク貼ってます。

fallback ディレクトリにリンクを貼ればいいらしいんで、やってみたんですが文字化け?は解消されませんでした。

mkdir -p /usr/local/j2sdk/jre/lib/fonts/fallback/
ln -s /usr/share/fonts/japanese/TrueType/ipa*.ttf /usr/local/j2sdk/jre/lib/fonts/fallback/

で、fontconfig.properties.src を編集すれば良いらしいんで、やってみました。

vim /usr/local/j2sdk/jre/lib/fontconfig.properties.src
#--------------------------------------------------------------------
dialog.plain.japanese=IPA Gothic
dialog.bold.japanese=IPA Gothic
dialog.italic.japanese=IPA Gothic
dialog.bolditalic.japanese=IPA Gothic
sansserif.plain.japanese=IPA PGothic
sansserif.bold.japanese=IPA PGothic
sansserif.italic.japanese=IPA PGothic
sansserif.bolditalic.japanese=IPA PGothic
serif.plain.japanese=IPA PMincho
serif.bold.japanese=IPA PMincho
serif.italic.japanese=IPA PMincho
serif.bolditalic.japanese=IPA PMincho
monospaced.plain.japanese=IPA Gothic
monospaced.bold.japanese=IPA Gothic
monospaced.italic.japanese=IPA Gothic
monospaced.bolditalic.japanese=IPA Gothic
dialoginput.plain.japanese=IPA Gothic
dialoginput.bold.japanese=IPA Gothic
dialoginput.italic.japanese=IPA Gothic
dialoginput.bolditalic.japanese=IPA Gothic

# Search Sequences
#sequence.allfonts=latin-1
sequence.allfonts.x-euc-jp-linux=japanese,latin-1
sequence.allfonts.UTF-8.ja=japanese,latin-1
sequence.fallback=japanese

# Exclusion Ranges

# Font File Names
filename.IPA_Gothic=/usr/share/fonts/japanese/TrueType/ipag.ttf
filename.IPA_PGothic=/usr/share/fonts/japanese/TrueType/ipagp.ttf
filename.IPA_Mincho=/usr/share/fonts/japanese/TrueType/ipam.ttf
filename.IPA_PMincho=/usr/share/fonts/japanese/TrueType/ipamp.ttf
filename.Sazanami_Gothic=/usr/share/fonts/japanese/TrueType/sazanami-gothic.ttf
filename.Sazanami_Mincho=/usr/share/fonts/japanese/TrueType/sazanami-mincho.ttf
#--------------------------------------------------------------------

が、コレでもダメでした。

ここでよくよく確認すると、設定ファイルは読み込む優先順位があるらしいじゃないですか。

なので、他のfontconfigファイルを移動して、編集したやつだけの状態にしたら、いけました。こんな方法で良いのかしら・・

mkdir -p /usr/local/j2sdk/jre/lib/old_fontconfig
mv /usr/local/j2sdk/jre/lib/fontconfig.* /usr/local/j2sdk/jre/lib/old_fontconfig
cp /usr/local/j2sdk/jre/lib/old_fontconfig/fontconfig.properties.src /usr/local/j2sdk/jre/lib/fontconfig.properties

 


一応CentOSのローカルでも使える様に

vi /etc/fonts/conf.d/65-nonlatin.conf
#--------------------------------------------------------------------
<fontconfig>
	<alias>
		<family>serif</family>
		<prefer>
			<family>IPAPMincho</family>
			...
		</prefer>
	</alias>
	<alias>
		<family>sans-serif</family>
		<prefer>
			<family>IPAPGothic</family>
			...
		</prefer>
	</alias>
#--------------------------------------------------------------------
</fontconfig></pre>

 


参考サイト

Blog: CentOSへの日本語フォントのインストール – Jade Developers

フォント – Linux に Java(JRE 1.5) をインストールする方法 – livedoor Wiki(ウィキ)

centos上でブラウザのフォントを変えたい – cloudcomputingはおいしいよ

CentOS 5 インストール個人的ノート

カテゴリー: java, linux, インフラ タグ:

ROMEでRSSフィードを解析して簡易RSSリーダServletを作る

2010 年 10 月 8 日 tdtsh Comments off

javaでRSSフィードを解析したい時には、ROMEプロジェクトが便利です。

インストール

Project ROMEからrome-1.0.jarをダウンロードして、クラスパスに配備します。

Servletを作る

やっつけ仕事でServletを作ってみます。
先人の知恵を参考にさせて頂きました。

ROMEプロジェクトと他人のコードという巨人の肩にのって、楽して遠方を見るのです。
コピペプログラミングとも言います。

package my.package;

import java.net.URL;
import java.util.List;
import java.io.PrintWriter;
import java.io.IOException;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RSSReaderServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request,
						HttpServletResponse response)
		throws ServletException, IOException {

		String url = request.getParameter("url");
		if (url == null) {
			url = "http://www.j-cast.com/index.xml";
		}
		try {
			URL feedUrl = new URL(url);
			SyndFeedInput input = new SyndFeedInput();
			SyndFeed feed = input.build(new XmlReader(feedUrl.openStream()));
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter pw = response.getWriter();
			pw.print("<html>\n");
			pw.print("<head>\n");
			pw.print("<title> "+feed.getTitle()+"/ 簡易RSSリーダ</title>\n");
			pw.print("</head>\n");
			pw.print("<body>\n");
			pw.print("<table>\n");
			List<SyndEntry> entries = (List)feed.getEntries();
			for (SyndEntry entry : entries) {
				pw.print("<tr>\n");
				pw.print("<td><a href='"+entry.getUri()+"'>"+entry.getTitle()+"</a></td>\n");
				pw.print("<td>"+entry.getPublishedDate().toString()+"</td>\n");
				pw.print("<td>"+entry.getDescription().getValue()+"</td>\n");
				pw.print("</tr>\n");
			}
			pw.print("</table>\n");
			pw.print("</body>\n");
			pw.print("</html>\n");
			pw.close();
		} catch (Exception e) {
			//
		}
		return;
	}

}

うん、簡単です。

カテゴリー: java, web タグ:

java の AntiSamyでサニタイズ、任意のHTMLタグを許可しscriptタグとかを無効化

2010 年 8 月 24 日 tdtsh Comments off

一般公開するWEBサービスを作る場合、慣れてないと手がかかるのがセキュリティへの配慮です。

Google App Engineとか使っている時点でSQLインジェクションとかディレクトリ・トラバーサルとかOSコマンド・インジェクションとか関係ありませんが、セッションハイジャックとかアプリケーションの作りに依存する部分は他のフレームワークと同じです。

気をつけたいのがXSS(クロスサイト・スクリプティング)です。

HTMLタグ不許可な場合は簡単なんですが、昨今のWEBサービスではブログをはじめフォームにHTMLタグを入力できる様なサービスが増えてきたので大変です。

良い子のウェブプログラマはIPAのガイドライン、安全なウェブサイトの作り方 (PDFファイル、2.09MB) を参考にします。

同ガイドラインでは根本解決策を「入力されたHTMLテキストから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する」としています。
そんなもん自力で書いてられません。

そこで、OWASP(Open Web Application Security Project)謹製のAntiSamyを使いたいと思います。

 

 


ダウンロード

Google Codeから antisamy-bin.1.4.1.jar をダウンロードします。

設定はポリシーファイルで行います。テンプレが用意されていますのでダウンロードします。
ここを参考に、antisamy-ebay.xml をダウンロードしました。

 

 


インストール

基本的にjarファイルをクラスパスに置くだけ、の筈ですが、私の環境ではそれだけでは動きませんでした。(slim3 1.0.5、Eclipse 3.5、google app engine for java 1.3.6)
いろんなクラスが見つからないと怒られます。

先ほどのGoogle CodeでAll downloadsをSearch すると、antisamy-required-libs-1.2.zip が出てきます。こいつをダウンロードして解党し、依存性があるであろうjar達をクラスパスに置いたら動きました。

 

 


使い方

またもやここを参考にしてください。

一応書いときます。

import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy;
import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException;
...
	public static final String PATH_ANTISAMY_POLICY = "WEB-INF/antisamy-ebay-1.4.1.xml";
...
	public static String doSamy(String str)
		throws PolicyException, ScanException
	{
		Policy policy = Policy.getInstance(PATH_ANTISAMY_POLICY);
		AntiSamy as = new AntiSamy();
		CleanResults cr = as.scan(str, policy);
		return cr.getCleanHTML();
	}
...

 

 


Youtubeを動かしたい

Youtubeのタグが弾かれる事に気がつきました。

一番なんでもアリのポリシーファイル(antisamy-anythinggoes-1.4.1.xml)に変えてもダメです。

色々ググっているウチに、先人の知恵を発見。
AntiSamy Policy to allow YouTube Videos

無事Youtubeも動くようになりました。

FireFoxのプラグインXSS MEでテストしてみましたが、機嫌よくサニタイズしている様に見えます。

満足です。

 

 


カテゴリー: Google App Engine, java, slim3 タグ:

OpenID RP を Google App Engine (java) で (dyuproject)

2010 年 3 月 18 日 tdtsh Comments off

 
前回も書きましたが、GAE/J上ではSocketが使えない。故にopenid4javaはGAEでは使えない。

でも、dyuprojectは動くし、動かした上にコードを公開されている方もいる。

どうやらGAE/Jの URLフェッチ API を使っている模様。そりゃそれしか方法はないですよね。

私は職業プログラマでは無いので、車輪の再開発どころか、なるべくコードは書きたくないんです。
早速、dyprojectにトライしてみましょう。
 
 


dyuproject-openid-1.1.6-jarjar.jar のダウンロード

dyuprojectDownloadsから、dyuproject-1.1.6.zipをダウンロードします。

JavaDocとか他のライブラリとかデモが不要なら、dyuproject-openid-1.1.6-jarjar.jar でもいいです。
 
 


eclipseのGAEプロジェクトへライブラリを追加する

ダウンロードしたzipファイルの、/dist に、dyuproject-openid-1.1.6-jarjar.jar はあります。
それを、eclipse の /war/WEB-INF/lib/にコピーします。

eclipseを起動して、war/WEB-INF/lib/ の下にコピーしたjarファイルを右クリックして、[ビルド・バス(B)] – [ビルド・パスに追加(A)]をクリックします。

念のため、プロジェクトの[参照ライブラリー]に追加されている事を確認します。
 
 


/WEB-INF/web.xml に追記する

QuickStartOpenid – dyuprojectのんを参考にしながら書きます。
ちょっとだけ手を加え (ログアウト用サーブレットを追加とか) ましたが、基本的に同じです。

<filter>
    <filter-name>openid-filter</filter-name>
    <filter-class>com.dyuproject.openid.OpenIdServletFilter</filter-class>
    <init-param>
        <param-name>forwardUri</param-name>
        <param-value>/</param-value>
    </init-param>
</filter> 

<filter-mapping>
    <filter-name>openid-filter</filter-name>
    <url-pattern>/openid-login</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>openid-filter</filter-name>
    <url-pattern>/openid-logout</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>openid-servlet</servlet-name>
    <servlet-class>my.package.OpenIdLoginServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>openid-servlet</servlet-name>
    <url-pattern>/openid-login</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>openid-logout</servlet-name>
    <servlet-class>my.package.OpenIdLogoutServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>openid-logout</servlet-name>
    <url-pattern>/openid-logout</url-pattern>
</servlet-mapping>

ログイン用サーブレットを作る

QuickStartOpenid – dyuprojectのサンプルコードにほんに少しだけ異常系を付け足しただけです。

package my.package;

import com.dyuproject.openid.RelyingParty;
import com.dyuproject.openid.ext.AxSchemaExtension;
import com.dyuproject.openid.OpenIdUser;

public class OpenIdLoginServlet extends HttpServlet {

    static {
        RelyingParty.getInstance()
        .addListener(new AxSchemaExtension()
            .addExchange("email")
            .addExchange("nickname")
            .addExchange("fullname")
            .addExchange("gender")
            .addExchange("postcode")
            .addExchange("country")
            .addExchange("language")
        );
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
        OpenIdUser user = (OpenIdUser) request.getAttribute(OpenIdUser.ATTR_NAME);
        if (user != null) {
            String identity = user.getIdentity();
            HttpSession session = request.getSession();
            session.setAttribute("identity", identity);
            Map axschema = AxSchemaExtension.get(user);
            if (axschema != null && axschema.size() > 0) {
                session.setAttribute("email", axschema.get("email"));
                session.setAttribute("nickname", axschema.get("nickname"));
            } else {
                session.setAttribute("email", "unknown");
                session.setAttribute("nickname", identity);
            }
        } else {
            //
        }
        response.sendRedirect(response.encodeRedirectURL(request.getParameter("redirect_url")));
    }

}

 
 


ログアウト用サーブレットを作る

QuickStartOpenid – dyuprojectにはサンプルが無かったけど、ログインしっぱなしじゃ困るから、ログアウト用サーブレットも作ります。

package my.package;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.RequestDispatcher;

public class OpenIdLogoutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
        HttpSession session = request.getSession(false);
        session.invalidate();
        response.sendRedirect(response.encodeRedirectURL(request.getParameter("redirect_url")));

    }
}

 
 


動かす

あとはHTMLでいいので、OpenIDプロバイダのURLを引数 “openid_identifier”にセットして、サーブレットに渡すAタグなり、フォームなりを書いて実行します。

mixi OpenIDならこんな感じですね。

<a href="openid-login?openid_identifier=https://mixi.jp">mixiでログインします</a>

なんて簡単なんでしょう。

サンプルコードでは、mixi、Google、Yahoo!、openid.ne.jp は動きました。
hatena はうまくいきませんでした。なんでだろう。

nickNameが取れたのはmixiだけでした。

 
 


カテゴリー: Google App Engine, OpenID, java タグ: