Security Advisories (4)
CPANSA-Jifty-2011-01 (2011-03-17)

The path as passed in the fragment request data structure was used verbatim in the dispatcher and other locations. This possibly allowed requests to walk around ACLs by requesting '/some/safe/place/../../../dangerous' as a fragment.

CPANSA-Jifty-2009-01 (2009-04-09)

The REST plugin would let you call any method on the model.

CPANSA-Jifty-2008-01 (2009-04-08)

Allowed all actions on GET.

CPANSA-Jifty-2006-01 (2006-07-06)

Jifty did not protect users against a class of remote data access vulnerability. If an attacker knew the structure of your local filesystem and you were using the "standalone" webserver in production, the attacker could gain read only access to local files.

題名

Jifty::Manual::Tutorial - あっという間にゼロからJifty

説明

このチュートリアルを読めば、Jiftyではじめてのアプリケーションを 構築するにあたって知っておくべきことはすべてわかるはずです。

使い方

必要なもの

ここでは――少なくともこのチュートリアルの執筆時点で――インス トールしておくべきものを紹介します。

Jiftyのインストール

そんなに構えなくても大丈夫。私たちはDRY (Don't Repeat Yourself) の原則をとても大事に思っていますし、だからこそPerlやCPANを愛し ているのですから。JiftyはCPANのすばらしいコードをたくさん利用し ています。直接依存しているCPANパッケージは全部あわせて60にもな りましたが、そのほとんどはクロス・プラットフォームなピュアPerl パッケージですから、Perlを利用できるプラットフォームならインス トールするだけでばっちり動くはずです。

それだけではありません。次から次へとライブラリをダウンロードす るだけで一日が終わってしまわないよう、バンドルできるライブラリ はすべてJiftyパッケージのなかにまとめるようにしています。運が よければ、(Perlのデータベース・インタフェースやJiftyがデフォ ルトで利用する組み込みSQLiteのように)実際にOSにあわせてコンパ イルしなければならないトリッキーなライブラリをいくつかインスト ールするだけですみます。

http://download.jifty.org/pub/jifty/ から完全版をダウンロード するのでも、CPANからインストールするのでも結構ですが、CPANから 「スリム」版を入手する場合は、依存パッケージは自分でインストー ルする必要があります(その場合でもできる限り簡単にインストール できるようにはしてありますが)。すぐに始めたいのであれば、以下 のURLからどうぞ。

http://download.jifty.org/pub/jifty/

いずれにしても、インストールの手順は同じです。

# tar xzvf jifty-<version>.tgz
# cd jifty-<version>
# perl Makefile.PL
# make
# make test
# make install

テストが通らないようでしたら、お話を聞きたいので、 jifty-devel@lists.jifty.orgに参加して失敗したことを報告して ください(メーリング・リストへの参加方法については以下の 「"困ったときは"」をご覧ください)。

足場をつくる(スキャフォールディング)

Jiftyをうまくインストールできたら、準備完了。はじめてのアプリケ ーションをつくってみましょう。

Jiftyはわざと少々ミニマリスト的につくってあります。アプリケーシ ョンを走らせるにあたって、「本当に」必要なのはjiftyというコ マンドラインツールのみなのです(新しくつくったアプリケーション のbin/ディレクトリに入っています)。

もちろん往々にしてもう少し仕掛けを用意しておいた方が作業は楽に なるものですから、そのような仕掛けを構築するツールも用意して あります。

どこか、新しいJiftyアプリケーションをつくってもかまわないディレ クトリに移動してください(Jiftyはサブディレクトリをつくります)。

# jifty app --name MyWeblog
Can't guess application root from current path (/your/current/directory) or bin path (/usr/bin)
Creating new application MyWebLog
Creating directory lib
Creating directory lib/MyWebLog
Creating directory bin
Creating directory etc
Creating directory doc
Creating directory log
Creating directory web
Creating directory web/templates
Creating directory web/static
Creating directory lib/MyWebLog/Model
Creating directory lib/MyWebLog/Action
Creating directory t
Creating configuration file MyWeblog/etc/config.yml

では、ひとつひとつ見ていきましょう。

bin

bin/のなかにはjiftyというコマンド・ディスパッチャが入って います。特に重要なコマンドとしては、データベースのスキーマを設定 したり更新したりするschemaと、スタンドアロンのウェブサーバを 起動するserverがあります。jiftyにどのようなコマンドがある か知りたい場合は次のようにタイプしてください。

jifty help
etc

etc/には設定ファイルが入ります。設定ファイルがない場合はJifty が適切なデフォルト値を用意します。

doc

Jiftyの魔法もドキュメントまでは書いてはくれませんが、「みなさん が」ドキュメントを書くときはdoc/に入れてください。

log

JiftyはLog::Log4perlを使ってログの設定を行います。デフォルト ではlogディレクトリにserver.logerror.logというログを 吐き出します。

web/templates

JiftyはHTML::Masonをメインのテンプレート・システムとしていま す。アプリケーションのテンプレートはweb/templates/に入れてく ださい。Jiftyには最初からアプリケーションの「スケルトン」が用意 されています(share/web/templates/にインストールされています)。 このデフォルト・アプリケーションは、基本的なアプリケーションを 急いで準備したいときには便利です。ただし、もっと複雑なアプリケ ーションを構築するときにはなにがしかのカスタマイズを行う必要が あるでしょう。

PerlがどこにJiftyのデフォルト・テンプレートをインストールしたか 知りたい場合は次のようにします。

perl -MJifty::Util -e 'print Jifty::Util->share_root'
web/static

ウェブ・アプリケーションが提供する「素材」のなかには、テンプレ ート・エンジンを通す必要のない(あるいは「通すべきでない」)も のも少なからずあります。

そのような静的ファイルについては、web/static/に入れておいて ください。 適切な名前のテンプレートが見つからない場合はそこか らサーブされます。

また、Jiftyには最初からCSSのスタイルシート、Javascriptライブラ リ、Ponyも用意されています。/usr/local/share/jifty/web/static のなかをご覧ください。

lib/MyWebLog

Jiftyのオブジェクト・モデルの詳細については Jifty::Manual::ObjectModelをご覧ください。

基本的なJiftyアプリケーションを構築するだけなら、気にかける必 要があるのは「モデル」と「アクション」という二種類のクラスのみ です。

lib/MyWebLog/Model

アプリケーションの本当の基礎となるものは lib/アプリケーション名/Modelに入っています。ここに入って いるクラスはアプリケーションのデータ構造とそれらの相関関係を定 義するものです。Jiftyはこのモデル・クラスを利用して必要なときに データベースのスキーマを設定・更新します。

lib/MyWebLog/Action

先ほどは「モデル」と「アクション」さえ気にかけていればいいと言 いましたが、それは真実の一面でしかありません。たしかにJiftyは 「モデル」となるデータベースに対する基本的なやりとり(CREATE、 READ、UPDATE、DELETE) をする「アクション」を用意してくれるの ですが、なにがしかの変更を加えたければ、変更すべきものはここに あります。

t

Jiftyはアプリケーションの土台を一式用意しますが、まだあらゆる テストを用意することまではできません(もっとも、生成したモデル ・クラスに対する簡単なテストは用意します)。

データ・モデルを構築する

このチュートリアル・アプリケーションの名前がMyWebLogである ことからも想像がつくかと思いますが、ここでは例題として簡単なウ ェブログ・アプリケーションをとりあげます。今後のチュートリアル では、認証、コメント、RSSやAtomフィードの機能を追加する予定です。

記事

ウェブログの中心はふつう記事です。だから、当然最初につくるモデ ルはpostになります。

# cd MyWeblog
# jifty model --name Post
Writing file /tmp/MyWeblog/t/00-model-Post.t
Writing file /tmp/MyWeblog/lib/MyWeblog/Model/Post.pm

すごいですね! これでPostというモデルができたのです(もっと も、いまのところモデルらしいことはしませんけれどね)。

お好きなエディタでlib/MyWeblog/Model/Post.pmを開いてください。

このような画面になるはずです。

package MyWeblog::Model::Post::Schema;
use Jifty::DBI::Schema;

# Your column definitions go here.  See L<Jifty::DBI::Schema> for
# documentation about how to write column definitions.

package MyWeblog::Model::Post;
use base qw/MyWeblog::Record/;

# Your model-specific methods go here.

1;

では、このモデル・クラスに記事の構造を教えましょう。まずは記事 にbodytitlecategoryを用意します(将来的にはこの categorytagsテーブルにアップグレードして完全なフォーク ソノミー対応にする予定です)。

カーソルを以下の行のすぐ下に移動してください。

# Your column definitions go here.  See L<Jifty::DBI::Schema> for
# documentation about how to write column definitions.

以下の行を加えます。

column title =>
      type is 'text',
      label is 'Title',
      default is 'Untitled post';

column body => 
      type is 'text',
      label is 'Content',
      render_as 'Textarea';

モデル・クラスを保存しましょう。

データベースのセットアップ

OK。今度はMyWeblogのデータベースを初期化します。デフォルトで はSQLiteデータベース・エンジンを使うようにセットアップされます ので、PostgreSQLやMySQLを使いたい場合は、etc/jifty.ymlに何 行か付け足す必要があります(Jifty::Configにもう少し詳しい説 明があります)。

# jifty schema --setup
INFO - Generating SQL for application MyWeblog...
INFO - Using MyWeblog::Model::Post
INFO - Using Jifty::Model::Schema
INFO - Set up version v0.0.1

Jiftyのアプリケーション・サーバを起動する

OK。これで簡単ながら動作するアプリケーションができました。 ウェブサーバを起動して見てみましょう。AJAXのきいた管理UIやオ ンライン・ドキュメント・ブラウザ、Ponyを確かめてみてください。

# ./bin/jifty server
INFO - You can connect to your server at http://localhost:8888/

ユーザ・インタフェースの構築

管理画面を使えばアプリケーションのデータを管理するのに必要な ものはすべて手に入りますが、それではあまりウェブログらしくは ありません。

記事を投稿する

新しいエントリを投稿するページをつくりましょう。

# cd web/templates/

postという新規ファイルをテキスト・エディタで開いて、この ようにしてください。

<%init>
my $action = Jifty->web->new_action(class =>'CreatePost');
</%init>

<&|/_elements/wrapper, title => "Post to your weblog" &>
<% Jifty->web->form->start() %>
<% Jifty->web->form->next_page( url => '/') %>
<% $action->form_field('title') %>
<% $action->form_field('body') %>
<% Jifty->web->form->submit( label => 'Post' ) %>
<% Jifty->web->form->end() %>
</&>

閲覧する

「基本的な」エントリ一覧をつくるのは本当に簡単です。AJAXでペー ジングするきれいな一覧の方はもう少し複雑ですが、ここでは両方の やり方を紹介します。お好みの方を選んでください。

手っ取り早いやり方

web/templatesディレクトリでindex.htmlという新規ファイル をテキスト・エディタで開き(ウェブサーバは/index.htmlという URLをサイトの「デフォルト」ページとしてくれるはずです)、この ようにしてください。

<%init>
my $posts = MyWeblog::Model::PostCollection->new();
$posts->unlimit();
</%init>

<&|/_elements/wrapper, title => Jifty->config->framework('ApplicationName') &>
<dl>
% while (my $post = $posts->next) {
 <dt><%$post->title%></dt>
 <dd><%$post->body%></dd>
% }
</dl>
</&>

複雑だけどクールなツールをふんだんに使う方法

「複雑な方法」ではJiftyの上級機能のひとつである「ページ領域 (Page regions)」というものを使います。領域を指定しておくと、 最近の高性能ブラウザならAJAXで、lynxw3m、携帯電話のブ ラウザのように機能が限定されたブラウザでも通常のGETリクエスト を使って、ページの一部だけを独立してリロードすることが できるのです。

このアプローチの欠点は、指定する領域ごとに固有の「部品」ファイ ルを用意しなければならないことです。

複雑な方法も、最初は簡単な方法とほとんど同じです。テキスト・エ ディタでweb/templates/index.htmlという新規ファイルを開いて、 以下のように書き込んでください。

<&|/_elements/wrapper, title => Jifty->config->framework('ApplicationName') &>

<% Jifty->web->region(name => "myweblog-posts",
                      path => "/fragments/page_of_posts") %>
</&>

勘のいい方ならたぶんもうおわかりでしょうが、今度は web/templates/fragments/page_of_postsというファイルをつく って、以下のようにする必要があります。

<%args>
$page => 1
</%args>
<%init>
my $posts = MyWeblog::Model::PostCollection->new();
$posts->unlimit();
$posts->set_page_info( current_page => $page,
                       per_page     => 25
                     );
$m->out("No items found.") if ($posts->pager->total_entries == 0);

</%init>
% if ($posts->pager->last_page > 1) {
   Page <% $page %> of <% $posts->pager->last_page %>
% }
<dl class="list">
% while (my $post = $posts->next) {
 <dt><%$post->title%></dt>
 <dd><%$post->body%></dd>
% }
</dl>

% if ($posts->pager->previous_page) {
  <% Jifty->web->link( label => "Previous Page", onclick => { args => { page => $posts->pager->previous_page } } ) %>
% }
% if ($posts->pager->next_page) {
  <% Jifty->web->link( label => "Next Page", onclick => { args => { page => $posts->pager->next_page } } ) %>
% }

さて、もう一度Jiftyのウェブサーバを起動してみましょう。ブラウ ザで/postを表示して、記事を作成してみてください。

ナビゲーション

当然のことながら、投稿ページのURLを覚えていなければならないと いうのはいささか面倒なことです。ただし、メニューに「投稿」ボタ ンを用意するには、デフォルトのメニューをオーバーライドしなけれ ばなりません。

Jiftyの「デフォルト」メニューは(Ponyともども)アプリケーショ ンのデフォルト・テンプレートのなかの_elements/navにあります。 さしあたっては、_elements/navをオーバーライドしましょう(こ こは改善中です)。

アプリケーションのweb/templatesディレクトリのなかに、 _elementsというディレクトリをつくります。

_elementsディレクトリのなかにテキスト・エディタでnavとい う新規ファイルをつくり、以下を挿入してください。

<%init>
my $top = Jifty->web->navigation;
$top->child( Home => url => "/");
$top->child( Post => url => "/post", 
                     label => "Post Article");
</%init>

メニュー・システムについての詳細はJifty::Web::Menuをご覧ください。

おしまい!

おおよそこれだけ知っていればJiftyアプリケーションの構築は始め られるはずです。私たちもJiftyをもっと使いやすく、またこのチュ ートリアルの「手強い部分」をなくすべく鋭意努力しています。

ぜひjifty-develメーリング・リストに参加して、Jiftyをどう使 っているか、使ってみて難しいとか使いづらいと思った点をお知らせ ください。

困ったときは

メーリング・リストに参加する

jifty-devel@lists.jifty.orgではJiftyをどのように構築するか、 何に困っているか等が話し合われています。

メーリング・リストに参加したい方は jifty-devel-subscribe@lists.jifty.orgにメールを送ってください。

wikiを見る

wikiもあります!(というか、このwikiがJiftyのメイン・サイトなのです)

http://jifty.org/に来て、書き込みしてみてください。

このwikiは、WiftyというJiftyベースのwikiで運用されています。 ソースコードはjiftyのsubversionリポジトリから自由に入手可能です。

バグを報告する

Jiftyは信じられないほど初期の段階にありますので、バグが見つかっ たらjifty-devel@lists.jifty.orgに報告してください。

予定されているチュートリアル

将来的には以下のチュートリアルが予定されています。

  • アクセス・コントロールとセキュリティ

  • データ・モデルのアップグレード

  • ディスパッチャの詳細

  • 本番環境への移行

  • ウェブ・サービス

  • 継続についての詳細

翻訳者

石垣憲一(ishigaki_at_tcool.orghttp://www.tcool.org/