トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

OpenPNE

OpenPNE

SNS(ソーシャルネットワーキングサイト)とよばれ、参加者が友達を紹介して、新しい友人関係を広げていく。
誰でも参加できるタイプと、既存の参加者から招待されないと入れないタイプがある。

必要なもの

自分のサーバー。
Apache+PHP+Postfix+MySQLが必要。

まずApacheはWebサーバー、OpenPNEを実際に動作させるプログラムがPHPになる。実際のデータを蓄えるのがMySQL。PostfixはSMTPサーバーでメールを送信、転送するのに必要。

その他ドメインでの運用が必須になるので、bindの設定が必要。とりあえずウチはDDNSでなんとか運用できるようにした。

ダウンロード

OpenPNE 公式サイト
http://www.openpne.jp/

ソーシャルネットワーキング

インストール

今回、mysql5を利用するため、UTF-8で運用することになった。いままでのOpenPNEは携帯電話を意識したSJISだったが、ちょうどよいことに開発版としてUTF-8がでていたので利用してみることにする。

インストールそのものはマニュアルどおり、しかし実際に使ってみると部分的に文字化けしている。ブラウザのエンコードをEUCにすることでその部分は読むことができた。

原因はphp.iniのmbstring設定で

mbstring.encoding_translation Off
mbstring.internal_encoding EUC-JP

となっていたためだった。translationがOffだから問題ないと思っていたが

mbstring.internal_encoding pass

とすることで改善できた。OpenPNEでは携帯電話に対しては内部でSJIS出力しているので、変換の必要はない。

.htaccessで対応することにする。

php_value output_handler none
php_value default_charset UTF-8
php_value mbstring.language Japanese
php_value mbstring.internal_encoding pass
php_value mbstring.http_input auto
php_value mbstring.http_output pass
php_flag mbstring.encoding_translation pass
php_value mbstring.detect_order auto
php_value mbstring.substitute_character none

上記.htaccessでの対策は、1.9.3あたりから不要になった。config.phpに設定が盛り込まれている。

引越しの注意点

引越し元と先で同じ環境を構築していれば、意外と簡単。

  • httpd
  • php
  • php-mbstring
  • php-mysql
  • php-mcrypt
  • libmcrypt
  • mysql
  • mysql-server
  • postfix

のあたりが必要。
とくにphp-mcryptが忘れがちで、これを忘れるとログインできなくなる。

 ログインできないとき

詳しくはまだ調査中。

管理画面にはログインできるがSNSにはログインできない状態になった。
管理画面よりメンバー一覧をチェックすると、PCアドレス、携帯アドレスが空欄になっている。

PCアドレスや携帯アドレスはc_member_secureテーブルの中にBLOB型で記録され、一見しても元のアドレスはわからない。
またconfig.phpの暗号化キーで暗号化もされている。

本来であればc_member_secureのデータを復号化して、管理画面のメンバー一覧では元通りのPCアドレス、携帯アドレスが表示される。
格納されたデータ自体は引越し前と引越し後で一致するのを確認済み。
復号化の段階で文字化けするのではなく、空欄になってしまっている模様。

OpenPNEの関数であるt_encrypt()とt_decrypt()のあたりを利用して、引越し前のアドレスを、引越し後の環境で暗号化し直す必要があるのかもしれない。
この辺りの処理を追う必要がある。

 ログインできないときの続き

まず、問題となる処理は

openpne/webapp/lib/util/util.php

にある

function t_encrypt($str)
{
    if (!$str) return '';

    $bf =& get_crypt_blowfish();
    $str = $bf->encrypt($str);

    //base64
    $str = base64_encode($str);

    return $str;
}


function t_decrypt($str)
{
    if (!$str) return '';

    //base64
    $str = base64_decode($str);

    $bf =& get_crypt_blowfish();
    return rtrim($bf->decrypt($str));
}

で、crypt_blowfishのencryptしたものをbase64を通してDBに格納。
復号化はその逆の処理。

crypt_blowfishは旧版と新版があって、config.phpの設定により切り替えられる。

function &get_crypt_blowfish()
{
    static $singleton;
    if (empty($singleton)) {
        if (OPENPNE_USE_OLD_CRYPT_BLOWFISH) {
            include_once 'Crypt/BlowfishOld.php';
            $singleton = new Crypt_BlowfishOld(ENCRYPT_KEY);
        } else {
            include_once 'Crypt/Blowfish.php';
            $singleton = new Crypt_Blowfish(ENCRYPT_KEY);
        }
    }
    return $singleton;
}

今回の引越し環境は

引越元引越先
Mac mini ppcFujitsu FMV i386
CentOS 5.2FedoraCore 6
PHP 5.1.6PHP 5.2
rpmでインストールtar.gzでインストール

という状況。

この環境において、Crypt_Blowfishの結果が異なる。

 引越し作業

下記コードをopenpne/public_html/test.phpとして用意し、実行すると

  1. DBのc_member_secureテーブルの情報を取得
  2. pc_address、ktai_address、regist_addressについて復号化(t_decrypt)を行う
  3. test.txtに書き出す

が行われ、openpne/public_html/test.txtが作成される。
※public_htmlのパーミッションを変えるか、あらかじめtest.txtを作成のこと。

<?php
require_once('./config.inc.php');
require_once(OPENPNE_WEBAPP_DIR . '/init.inc');

$c_member_secure = db_get_all('select * from c_member_secure order by c_member_id asc');
$count = count($c_member_secure);

for($i = 0; $i < $count;$i++) {
    $c_member_secure[$i]['pc_address'] = t_decrypt($c_member_secure[$i]['pc_address']);
    $c_member_secure[$i]['ktai_address'] = t_decrypt($c_member_secure[$i]['ktai_address']);
    $c_member_secure[$i]['regist_address'] = t_decrypt($c_member_secure[$i]['regist_address']);
    $lines[$i] = rtrim(implode(",", $c_member_secure[$i]), ",");
}

$line = join("\n", $lines);

$fileName = "test.txt";
$file = fopen($fileName, "w") or die("open error: $fileName");
flock($file, LOCK_EX);
fwrite($file, $line);
flock($file, LOCK_UN);
fclose($file);
?>

できあがったtest.txtを引越し先のopenpne/public_htmlへ移す。
下記コードをopenpne/public_html/test.phpとして用意し、実行すると

  1. test.txtの情報を取得
  2. pc_address、ktai_address、regist_addressについて暗号化(t_encrypt)を行う
  3. DBのc_member_secureのpc_address、ktai_address、regist_addressをアップデート

が行われ、ログインできるようになる。

<?php
require_once('./config.inc.php');
require_once(OPENPNE_WEBAPP_DIR . '/init.inc');

$fileName = "test.txt";
$file = fopen($fileName, "r") or die("open error: $fileName");
flock($file, LOCK_SH);
while(!feof($file)) {
    $line = fgets($file, 1000);
    list($c_member_secure_id, $c_member_id, $hash_password, $hash_password_query_answer, $pc_address, $ktai_address, $regist_address, $easy_access_id) = split(",", $line);
    $data = array(
        'pc_address' => strval(t_encrypt($pc_address)),
        'ktai_address' => strval(t_encrypt($ktai_address)),
        'regist_address' => strval(t_encrypt($regist_address)),
    );
    $where = array('c_member_id' => intval($c_member_id));
    db_update('c_member_secure', $data, $where);
}
flock($file, LOCK_UN);
fclose($file);
?>

使用後はtest.php、test2.php、test.txtは削除のこと。

sessionにmemcached使用でログインできず

Fedora9OpenPNE-2.14.6を使用していたが、今回、Fedora12にアップグレードした。

で、その後にOpenPNEにログインしようとするが、ログインできない。
エラーもでず、エラーログにもそれらしいエラーは無し。
とりあえずsessionにmemcachedを使用していたのをDBに変更したら、ログインできた。

PHPとmemcachedサーバーがうまく連携できていないのかと思って、簡単なプログラムを作ってみたが、普通に動作している?

わからないのでググってみたら、どうやらこういうことらしい。

satoru.net - openpneでSESSION_STORAGEのmemcached機能が使えないとき
http://d.hatena.ne.jp/satoru_net/20100120/1263960511

php-pecl-memcache-3.xはダメぽ、ということです(汗)。

多分OpenPNE側の

webapp/lib/Cache/Container/memcache.php

あたりを3.x用にいじってやればよいと思うのだけれど、とりあえずDBで良しとしますw

PHP-5.4に変えたらDB::connect()等でwarning出まくりんぐ

OpenPNEっていうかPEARのDBなんですけどね。
表示は↓みたいな感じ。

Strict Standards: Non-static method DB::connect() ...
Strict Standards: Non-static method DB::connect() ...
Strict Standards: Non-static method DB::connect() ...
:

検索してみると、どうやらE_STRICTの表示のようなのでphp.iniを確認してみるも

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE

となっているのに効果なし。

よく考えたらOpenPNEのconfig.phpの中でerror_reporting()を使っていたので

error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT);

してOKとなる。