2011年7月29日金曜日

d3blogのコメントがWizMobileでエラーになる件

少々込み入っているのでブログにまとめる。

まず、いきなりリダイレクトされて面食らうのだが、WizMobileではpostメソッドで呼ばれたら$_GETパラメータは取得できないらしい。という事でPOSTメソッドを使うにも関わらず、URLにGETパラメータを埋め込んで呼び出している変則的な部分をPOSTパラメータに埋め込み直す。

xoops_trust_path/modules/d3blog /templates/inc_comment_form.html
themes/wmb_default/templates/d3blog/inc_comment_form.html
themes/mbxoops6/templates/d3blog/inc_comment_form.html


上記のいずれもpostメソッドなのにgetパラメータ渡しを目論んでいた。
<form name='d3blogCommentForm' id='d3blogCommentForm' action='<{$xoops_url}>/modules/<{$mydirname}>/index.php?page=comment_post' method='post'>


(そりゃないぜセニョール)なのでpostへ変更

<form name='d3blogCommentForm' id='d3blogCommentForm' action='<{$xoops_url}>/modules/<{$mydirname}>/index.php' method='post'>

  <!-- comment rule -->
  <div style="text-align: center; <{$smarty.const.MBX_FS_XSMALL}>">
    (<{$rule_text}>)
  </div>
  <{$smarty.const.MBX_BLANK_TAG}>

  <!-- hidden items -->
  <input type='hidden' name='page' id='page' value='comment_post' />

こんな感じで hidden items 欄へパラメータを埋め込み直す。しかーし、このpageという変数はgetでしか受け取ってくれない。という事で次は受け取り部にpost処理を追加

xoops_trust_path/modules/d3blog /main.php

$mytrustdirpath = dirname( __FILE__ ) ;

$page = preg_replace( '/[^a-zA-Z0-9_-]/' , '' , @$_GET['page'] );

の1行下に追加。

// Hacked by a.k.a Bluemoon
if (isset($_POST['page'])) $page = preg_replace( '/[^a-zA-Z0-9_-]/' , '' , @$_POST['page'] );

で、気を取り直してデバッグするとリダイレクトされる。しかしコメント投稿は成功していた。じゃリダイレクトがへんじゃねとさらにハックする。

xoops_trust_path/modules/d3blog /main/comment_post.php

以下、書込み成功後のリダイレクトがどーだったかというと


        if (!isset($comment_post_results)) {

            // if the comment is active, redirect to posted comment
            if ($comment->getVar('com_status') == XOOPS_COMMENT_ACTIVE) {
                redirect_header($redirect_page.'='.$com_itemid.'&amp;com_id='.$newcid.'&amp;com_rootid='.$com_rootid.'&amp;com_mode='.$com_mode.'&amp;com_order='.$com_order.'#comment'.$newcid, 2, _CM_THANKSPOST);
            } else {
                // not active, so redirect to top comment page
                redirect_header($redirect_page.'='.$com_itemid.'&amp;com_mode='.$com_mode.'&amp;com_order='.$com_order.'#comment'.$newcid, 2, _CM_THANKSPOST);
            }
        }
まあ、通常のブラウザなら問題ないんだけどWizMobile的にはきちんとXOOPS_URLが記載されていないのとNGらしい。という事でちゃんと頭から正式なURIを入れてみる。

        if (!isset($comment_post_results)) {
            // Hacked by a.k.a Bluemoon  start
            // if the comment is active, redirect to posted comment
            if ($comment->getVar('com_status') == XOOPS_COMMENT_ACTIVE) {
                $redirect = sprintf('%s/modules/%s/', XOOPS_URL, $mydirname) . $redirect_page.'='.$com_itemid.'&amp;com_id='.$newcid.'&amp;com_rootid='.$com_rootid.'&amp;com_mode='.$com_mode.'&amp;com_order='.$com_order.'#comment'.$newcid;
            } else {
                // not active, so redirect to top comment page
                $redirect = sprintf('%s/modules/%s/', XOOPS_URL, $mydirname) . $redirect_page.'='.$com_itemid.'&amp;com_mode='.$com_mode.'&amp;com_order='.$com_order.'#comment'.$newcid;
            }
            redirect_header($redirect, 2, _CM_THANKSPOST);
            // Hack end
        }


おK。やたらハマって他の作業しながらだが1週間位掛かってしまった。orz

最近マックに開発環境が移行したのでimodeシュミレータとかVMwareで済ましていたのだが、流石にVMwareにxampp入れるのも面倒なのでサーバ直でつついていたのがいけなかった.。しかも前に使っていたWindowsXPな環境がimodeシュミレータ何故かローカルにつながらず最後はauの openwave SDK 6.2でのソース表示に助けられた始末。これってもうダウンロードできないんじゃなかったっけ?(未確認)まあそんなこんなで、WindowsXPな環境はガラケーがある限り取っておかねばなるまい。

ああ、これらGPL V2なので訂正したら私のコメントも(いじってみた)記念に入れておいて欲しい。

2011年7月25日月曜日

Multiple fileupload class for Actung Baby

<?php
class commonCtrl {
    var $getUploadFileName = array();
    function commonCtrl(){
    }
    private function getRandomString($nLengthRequired = 8){
        $rdm_str = md5(uniqid(rand(), true));
        $rdm_str = substr($rdm_str,0,$nLengthRequired);
        return $rdm_str.date("ymdHis");
    }
    private function is_image($file){
        if (!(file_exists($file) && ($fp=fopen($file, "rb")))) return NULL;
        $data = fread($fp, 8);
        fclose($fp);
        if (strncmp("\x00\x00\x01\x00", $data, 4) == 0) {                                   // ICO
            return "ico";
        } else if (strncmp("\x89PNG\x0d\x0a\x1a\x0a", $data, 8) == 0) {                        // PNG
            return "pmg";
        } else if (strncmp('BM', $data, 2) == 0) {                                            // BMP
            return "bmp";
        } else if (strncmp('GIF87a', $data, 6) == 0 || strncmp('GIF89a', $data, 6) == 0) {    // GIF
            return "gif";
        } else if (strncmp("\xff\xd8", $data, 2) == 0) {                                    // JPEG
            return "jpg";
        } else {
            return NULL;
        }
    }
    /*
     * $files = $_FILES
     * $formName = form tag name as <input type="file".... />
     */
    function getUploadFiles($files,$formName,$prefix="img"){
        $this->getUploadFileName = array();
        for($i=0;$i<count($files[$formName]);$i++) {
            $myrow = array(
                'name' => $files[$formName]['name'][$i],
                'type' => $files[$formName]['type'][$i],
                 'tmp_name' => $files[$formName]['tmp_name'][$i],
                'error' => $files[$formName]['error'][$i],
                'size' => intval($files[$formName]['size'][$i])
            );
            if ( $myrow['size']>0 ){
                if ( !is_null($ext = $this->is_image($myrow['tmp_name'])) ){
                    $info = pathinfo($myrow['tmp_name']);
                    $upfile_name = $prefix . $this->getRandomString() . "." . $ext;
                    $upfile_path = XOOPS_ROOT_PATH."/uploads/" . $upfile_name;
                    move_uploaded_file($myrow['tmp_name'], $upfile_path);
                    chmod($upfile_path,0644);
                    $this->getUploadFileName[$i] = $upfile_name;
                }
            }
        }
        //var_dump($this->getUploadFileName); die;
        return $this->getUploadFileName;
    }
}
?>

2011年7月21日木曜日

The Actung Baby - Rapid MVC framework

This is a "tiny" MVC framework just only 50 lines. Completely Objective, Simple and easy to handle. See below as "index.php".
<?php
/***********************************************************************************
 * MVC ( Model View Control ) Action Program
 ******************************** License: GPLv3 ********************************
 * Copyright (C) 2011 Yoshi Sakai (A.K.A. bluemooninc)
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ***********************************************************************************/
require '../../mainfile.php';
include XOOPS_ROOT_PATH."/header.php";
/***********************************************************************************
 * Model Section
 ***********************************************************************************/
$mydirname = basename( dirname( __FILE__ ) ) ;
$mymodpath = XOOPS_ROOT_PATH."/modules/$mydirname" ;
$model = isset($_GET['model']) ? htmlspecialchars($_GET['model'],ENT_QUOTES) : "category";
$model = isset($_POST['model']) ? htmlspecialchars($_POST['model'],ENT_QUOTES) : $model;
$ctrl = isset($_GET['ctrl']) ? $model . "_" . htmlspecialchars($_GET['ctrl'],ENT_QUOTES) : "";
$ctrl = isset($_POST['ctrl']) ? $model . "_" . htmlspecialchars($_POST['ctrl'],ENT_QUOTES) : $ctrl;
$myclass = $mymodpath . "/class/" . $model . ".php";
require( $myclass );
$handler = new ActionHandler($ctrl);
if ( !$ret = $handler->load() ){
    echo $handler->debug(); die;
}
/***********************************************************************************
 * Ctrl Section
 ***********************************************************************************/
if ( $ctrl ){
    if ( !$ret = $handler->$ctrl() ){
        echo $handler->debug(); die;
    }
}
/***********************************************************************************
 * View Section
 ***********************************************************************************/
$handler->assignRecords();$xoopsOption['template_main'] = "cartb2b_" . $model . ".html" ;
include( XOOPS_ROOT_PATH.'/footer.php' ) ;
?>

2011年7月17日日曜日

Jelly! はじめました。


WeeklyCMS収録後から、これってどうやるのとか自然と勉強会的な感じになって、懇親会の後も仕事するならJelly!やろうという感じでやってみました。

普段は別々の会社で働いているWeeklyCMSのメンバーですがさっそく打ち解けて楽しくリラックスしながらそれぞれの仕事をこなしていました。図書館とランチルームの中間みたいな雰囲気で仕事に集中したい時、雑談してくつろぎたいときとメリハリのある時間を作れたのが意外でこれはもしかしたら一人で仕事しているよりはかどるんじゃ無いかと思いました。

それに自分が詰まった所を呟くとすぐに相談に乗ってくれたり逆に自分のやり方を教えたりして、googleで調べるより速く出口へと導いてくれます。この働き方はノマドワーカーや自営業、SOHOで働く人にとってはとてもいい刺激になるし楽しい事この上ないです。

米西海岸ではじまった(たしかサンフランシスコ発祥と記憶しています)このJelly!という働き方、きっと日本でもはやりますよ。

What is Jelly!
http://www.workatjelly.com/

2011年7月7日木曜日

XOOPS Cube : 携帯対応モジュールのエラー表示

WizMobile で「照合用のワンタイム・チケットが見つかりませんでした。」というエラー表示がでる件について

Q:何故、この様なエラー表示が出るのですか?
A:セッションIDというユーザー識別情報が不明になった時表示されます。

 セッションIDとは:Webアプリケーションなどで、アクセス中のユーザの識別や行動の捕捉(セッション管理)のために付与される固有の識別情報。ユーザがアクセスしたりログインした際に発行され、一定時間アクセスが無かったりログアウトすると破棄されます。

Q:このエラーの出る機種は特定できますか?
A:2009年度以前のimodeブラウザ1.0規格のdocomo携帯で発生します。

Q:何故、imodeブラウザ1.0規格で発生しますか?
A:cookieという仕組みが利用できない為、URLでセッションを受け渡している為です。
Cookie とは、訪れた Web サイトによって作成され、あなたのコンピュータに保存される小さなファイルです。Cookie には、ユーザの識別や行動の捕捉(セッション管理)が保存されます
Q:URLでセッションを受け渡すと何故エラーがでますか?
A:サイトのプログラムとのデータ受け渡しに齟齬が出やすいため、WizMobile(携帯対応モジュール)は色々な方法で受け渡し情報をカバーしますが100%確実な方法が無い為です。

Q:解決策は?
A:cookieの保存が可能になった imodeブラウザ2.0の機種に移行してもらう必要があります。

Q:docomo携帯の買い替えを閲覧して来る人に強制できません。
A:imodeブラウザ1.0とURLによるセッション管理という仕組みでは確実に動作する事は技術上不可能です。「2009年度以前のdocomo機種(imodeブラウザ1.0)の場合は閲覧のみの対応となります」等のアナウンスが必要です。

 Q:何故セキィリティ対策が取れないのですか?
A: 簡単に説明するとブラウザのURL情報は簡単に盗み見る事ができコピーして為り変わる事が可能だからです。具体的にはセッションIDをURL上に保持した場合、HTTP Refererにより、他のドメインにセッションIDが漏洩します。また、ユーザの不注意により、セッションID付きのURLをソーシャルブックマークなどで公開したり、メールで知人に送信した結果、セッション情報が外部に漏洩するような事故が現実に発生しています。

Q:これから対応の予定はありますか?
A:ありません。前述の問題点に加えてCookieによるセッション管理でなければ問題が生じる事が明らかになってきている為です。

Q:どんな問題があるのですか?
A:技術的な詳細については以下URLや書籍を参照下さい。

http://d.hatena.ne.jp/ockeghem/20110615/p1

体系的に学ぶ 安全なWebアプリケーションの作り方
http://www.amazon.co.jp/exec/obidos/ASIN/4797361190/jisakucompile-22/

2011年7月1日金曜日

testarea の文字列もしくは MySQL text の文字列より任意の文字を切り出す関数

テキストエリア中から任意の文字だけを切り出したい場合の関数。
$textarea ="発着地を入力下さい。
出発地:上野
到着地:大井町
";
例えば、 pickupFromTextArea("出発地:",$textarea);
 とかすると、上野だけを取り出せます。
/*
 * Get one needle to line break from textarea strings
 */
function pickupFromTextArea($needle,$subject) {
  $pattern = "/{$needle}(.*)/";
  if (preg_match($pattern, $subject, $matches) === 1) {
    return trim($matches[1], "\r");
  }
  return false;
}

教えて!XOOのカテゴリにグループ権限を追加その2

さて、 教えて!XOOのカテゴリにグループ権限を追加した後、権限の無い場合は質問だけ表示して回答を表示しないというハックを紹介します。変更は以下ソース

/plzXoo/default/actions/detail.class.php
<?php

class default_DetailAction extends mojaLE_AbstractAction
{
    function execute(&$controller,&$request,&$user)
    {
        global $xoopsUser;    // bluemoon added
       
        exFrame::init(EXFRAME_PERM);
        // 閲覧権限のチェック
        exPerm::GuardRedirect('view_detail','index.php',_MD_PLZXOO_ERROR_PERMISSION);

        $id = isset($_REQUEST['qid']) ? intval($_REQUEST['qid']) : 0;
        $handler=&plzXoo::getHandler('question');

        $question=&$handler->get($id);
        if(!is_object($question))
            return VIEW_ERROR;

        // ステータスが1,2と異なるものは管理者以外キック
        if( ! in_array( $question->getVar('status') , array(1,2) ) ) {
            if( ! is_object( $GLOBALS['xoopsUser'] ) || ! $GLOBALS['xoopsUser']->isAdmin() )
                return VIEW_ERROR;
        }

        // hack by bluemoon: in
        $db =& Database::getInstance() ;
        $cid = $question->getVar('cid');
        $sql = "SELECT `groupid` FROM ".$db->prefix('plzxoo_category')." WHERE `cid`=".$cid ;
        list($groupid) = $db->fetchRow( $db->query( $sql) );
        if ( $xoopsUser ){
            $gids = array_merge( array(0,3) , $xoopsUser->getGroups());
            $permissionOkay = in_array( $groupid, $gids );
        }else{
            $gids = array(0,3);
            $permissionOkay = in_array( $groupid, $gids );
        }
        if ($permissionOkay){
            $handler=&plzXoo::getHandler('answer');
            $criteria = new Criteria('qid',$id);
            $criteria->setSort('input_date');
            $criteria->setOrder('DESC');
            $answers=&$handler->getObjects($criteria);
            $request->setAttribute('answers',$answers);
            //    $myrow['answer_body'] = _MD_PLZXOO_ERROR_PERMISSION;
        }
        // out
       
        $request->setAttribute('question',$question);
        return VIEW_SUCCESS;
    }

    function isSecure()
    {
        return false;
    }
}

?>