CodeIgniterの学習 54 - Pawfaliki (Wiki)をCodeIgniterのライブラリー化して、wikiを使えるようにしてみる(その1:実験・紹介編)

08/12/21追記
やっぱりとりやめ。理由は次のエントリーを参照。
あと、ぐぐってみたらディレクトリートラバーサルの危険性があるとの情報を見かけました。
(追記終わり)

以下ボツエントリー

お久しぶりです。

今日は前回のエントリーでちょっとふれたwiki (Pawfaliki) のライブラリー化をしてみる。
CodeIgniterのwikiライブラリーってまだ無いみたい。


エントリーは長いので何回かに分けます。(分けないとエントリーが続かないのだ)
今日は改造コードは貼らない。(まだ改造が足りない。)


元ネタ

元ネタは、
http://www.pawfal.org/pawfaliki
http://www.sourceforge.net/projects/pawfaliki
です。
GPLライセンス。ソースをダウンロードしてご確認ください。
ページ上はCreative Commons Licenseと有るけど、配布ソース内とREADMEではGPLと記載されている。)


phpファイル1つ+cssファイルで出来ているwikiで低機能だが気に入っている。
(保存されるwikiデータは1ページ1テキストファイル形式)
(クラスで作られていない等の理由でこのままだとCodeIgniterで使えない。)


これを昔、俺俺クラス化して使っていたので、CodeIgniter用に改造してみた。
クラス化するのが結構面倒だったけど、今回はこのクラス化改造版をさらに改造するというわけ。


注意

この改造版を公開しても、興味がある人でかつソースの中身を解析したい人・さらに改造したい人だけが、あくまで実験・参考用として使ってください。


wikiプログラムって結構セキュリティーホールになっているので、このwikiにもいろいろ潜在している可能性があります。
(いつもながら無保証でメンテナンスをする予定も未定なのと、元ソース内部でevalを呼んでいたりするので。)


編集権限を不特定多数に持たせず、編集は自分のみで利用者は閲覧のみだと問題は少ないだろうけど。

私的な実験・開発履歴ブログですので。あしからず。


wikiは便利な反面、危険性・脆弱性が入る可能性も高くなります。ご注意ください。
(外部に公開しているapacheのログを見ると、脆弱性のあるwikiプログラムに接続しようとしている404エラーログもたまに見かけます。)


俺の利用用途は、
レイアウト等にあまり凝る必要が無くかつアクセス数の少ない、管理者のみが編集可能な半固定ページ

(プライバシーポリシーとか、サイトマップとか、更新履歴とか)
をこれを使って楽をしてみようと思っています。



改造中画面


こんな感じ。まだレイアウトとか、ソース内の書き方など、
いろいろ不満な箇所が有るので、ライブラリー化した改造版ソースを貼るのは先。



(編集画面:wikiのホームページの編集画面)

書き方はこんなかんじ。



(閲覧画面:wikiのホームページ)

見え方はこんな感じ



(新規画面:新規wikiページ fuga の作成画面)

fuga?のリンクから飛んだ新規作成画面




一応動いている。

wikiのページは、ファイルとして保存される。
(application/data/wiki/pages/hoge や application/data/wiki/pages/fuga 等のファイル)


urlは、

みたいな感じで、wiki/page/ページ名
となる。


画像のリンクも上の亀の写真のように張れる。

なお、このwikiではhtmlタグは書けない。
基本文字ベースのwikiだけど、使う場所はいろいろあると思う。


残りの改造ポイント

このほかにも

  • バックアップ機能
  • レストア機能
  • 一覧表示機能
  • 編集後メールでのnotify機能
  • ベーシック認証

等が標準であるので、動くようにまだまだ結構改造がいる。
ふぅー。


ついでに、

  • 閲覧専用モードと
  • 編集ボタン出現モード
  • CodeIgniterの書き方に寄せる
  • キャプチャを入れる
  • csrf対策をする
  • 画像のアップロード機能を作る
  • ファイルの添付機能を作る
  • wiki内部のブレッドクラム機能
  • 一部のhtmlタグを使えるようにする

等の俺俺改造を入れたいと思っている。

(途中で挫折して公開しないかもしれない)


呼びだし側ソース

呼びだし側ソースはこんな感じ。開発中だが貼っておく。

コントローラー:application/controllers/wiki.php

<?php if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
//PawfalikiのCodeIgniterライブラリー化サンプル
class Wiki extends Controller {
    // コンストラクタ
    function Wiki()
    {
        parent :: Controller();
        $this->load->helper('url');

        //pawfalikiライブラリーのロード
        $this->load->library('pawfaliki');
        //pawfalikiライブラリーの初期化
        $this->pawfaliki->init('/wiki/page/',true);
    }
    
    function index()
    {
        redirect( "/wiki/page/index" );//indexはpageにリダイレクト
    }

    function page($page='index')
    {
        $data["title"] = "PawfalikiのCodeIgniterライブラリー化サンプル";
        $data['wikibody'] = $this->pawfaliki->get_page($page);
        $this->_setTpl( 'wiki_index', $data);
    }

    function _setTpl( $viewName, $data = array() )
    {
        $tpl["page_title"] = "PawfalikiのCodeIgniterライブラリー化サンプル";
        $tpl["main_content"] = $this -> load -> view( $viewName, $data , true );
        $this -> load -> view( 'base_view', $tpl );// 大枠のテンプレートに、タスクリストのビューをはめ込む
    }


} //Endofclass

/* End of file wiki.php */
/* Location: ./application/controllers/wiki.php */
 ?>
$this->load->library('pawfaliki');

で、ライブラリーをロードし、

$this->pawfaliki->init('/wiki/page/',true);

で、初期化を行い

$this->pawfaliki->get_page($page);

wikiを生成するだけ。かなりお手軽。




内側ビュー:application/views/wiki_index.php

<!-- wikiの表示-->
<h3><?= $title ?></h3>
<div>
<?= $wikibody ?>
</div>

外側ビュー:
省略


これだけ。wikiのライブラリー側で生成されたHTMLタグがビューに差し込まれる感じになる。




ここから数回のエントリーは、これで引っ張ります。
細かい説明とかは次回以降。(来週のどこか)