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タグがビューに差し込まれる感じになる。
ここから数回のエントリーは、これで引っ張ります。
細かい説明とかは次回以降。(来週のどこか)