OpenPNE
SNS(ソーシャルネットワーキングサイト)とよばれ、参加者が友達を紹介して、新しい友人関係を広げていく。
誰でも参加できるタイプと、既存の参加者から招待されないと入れないタイプがある。
必要なもの
自分のサーバー。
Apache+PHP+Postfix+MySQLが必要。
まずApacheはWebサーバー、OpenPNEを実際に動作させるプログラムがPHPになる。実際のデータを蓄えるのがMySQL。PostfixはSMTPサーバーでメールを送信、転送するのに必要。
その他ドメインでの運用が必須になるので、bindの設定が必要。とりあえずウチはDDNSでなんとか運用できるようにした。
ダウンロード
ソーシャルネットワーキング
インストール
今回、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;
}
今回の引越し環境は
という状況。
この環境において、Crypt_Blowfishの結果が異なる。
引越し作業
下記コードをopenpne/public_html/test.phpとして用意し、実行すると
- DBのc_member_secureテーブルの情報を取得
- pc_address、ktai_address、regist_addressについて復号化(t_decrypt)を行う
- 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として用意し、実行すると
- test.txtの情報を取得
- pc_address、ktai_address、regist_addressについて暗号化(t_encrypt)を行う
- 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使用でログインできず
Fedora9でOpenPNE-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