[php]curlでダイジェスト認証(Digest-Auth)を通過する

Written by uechoco 9月 30
この記事を読む時間:243くらい

phpスクリプトでダイジェスト認証(Digest-Auth)を通過する方法を調べていたのですが、どうやらcurlライブラリを用いるしか方法が見当たりません。その他の方法があれば教えてください。

で本題のダイジェスト認証の通過ですが、ネットで調べて2件だけありました。
Perl Tips | PHP で、ダイジェスト認証(Digest Auth)をする HTTP クライアント
PHPでダイジェスト認証(curl) – ユーウツな雨がふりつづいても雪がハートを曇らせてもドアの中で待っていた君に魔法をかけたいのさ

とにかくまずは CURL が PHP で動けば、あとはプロトコルとして HTTP、HTTPS(SSL/TLS)、FTP、Telnet、LDAP プロトコルでアクセスするクライアントを作れるようだ。 CURL では HTTP だと、GET、POST、PUT、FTP アップロード、フォームからのアップロード、Proxy、cookie、ユーザ名とパスワードによる基本認証/ダイジェスト認証、HTTP(または HTTPS)の認証…と、フルサポートするようだ。

[phpcode]
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_USERPWD, “$username:$password”);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$str = curl_exec($ch);
curl_close($ch);
[/phpcode]

curlのいいところは、「HTTPS+ダイジェスト認証」みたいな際どいURLなんかにもアクセスできちゃうこと。しかも認証されていないhttpsにアクセスするためのオプションもちゃんとある。以下がそのオプション。

[phpcode]
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
[/phpcode]

これでやりたいことができるようになった!うーん・・・でも世の中的にはBasic認証の方が一般的ですよね。HTTPS+Digest-Authってレアかなぁ。。。

[Let’s note]2008年冬モデルでCF-F8登場、T8とR8はメモリ最大3GB

Written by uechoco 9月 27
この記事を読む時間:124くらい

パソコン(個人向け)| Let’snote(レッツノート モバイルパソコン) | Panasonic
松下電器、ビジネスノート「Let’snote」新モデル発表会 | パソコン | マイコミジャーナル
松下、Let’snoteシリーズに14.1型ワイド液晶搭載の新モデル投入 | パソコン | マイコミジャーナル

2008年冬モデルで”8″シリーズになりましたね!

注目は、新シリーズCF-F8の登場。なんと!ダサい取っ手が付いてるwww そこまでするなら収納ポケットとか、つけちゃって、カバンいらずのLet’s noteとかにしてくれYo!(ぉぃ

今回のモデルでYシリーズ以外はCentrino 2 プロセッサー・テクノロジー対応で、無線がIEEE 802.11 ドラフトnになってますね。そのうち省電力が進んでバッテリー駆動時間も伸びそうですね。あと、DDR3メモリに対応してくれればでさらに消費電力ダウンかな?

そういえば、CF-T8とCF-R8はメモリが最大3GBに増設可能だとか。ようやく3GBですか。CF-W8は最大4GBにしてくれればいいのに。

感想としては、やっぱり富士通のLOOX Rシリーズの2008年秋冬モデルが、1歩どころか、5歩くらいリードしてるかな。完全浮気しそうだゎw

[php]文字列の各文字の間に別の文字列を挿入するスクリプト

Written by uechoco 9月 24
この記事を読む時間:145くらい

文章を書いていた時に、たまたま「1と2と3と5と6」と言う文字列を順番どおりに書いて、入力切り替えのかったるさを実感しました。ふと考えてみると。「12356」を先に書いてから、あとから間に「と」を入れてくれるとスマートな気がして、でもphpでどうやって書くんだろうっていう、変な妄想にふけりました。

妄想の結果:

[phpcode]

$insert = ‘と’;
$str = ‘12356’;

$len = strlen($str);
for ($i = 0; $i < $len; $i++) { echo ($i > 0) ? $insert . $str[$i] : $str[$i];
}

[/phpcode]

もう少し、スマートに書けるんじゃないかと思ったけど、これで満足・・・・と思いきや、$strがマルチバイトだと動かなそうな気がした。で、第2版がこちら

[phpcode]
$insert = ‘to’;
$str = ‘あいうえお’;

mb_internal_encoding(‘UTF-8’); // 環境に合わせて
$len = mb_strlen($str);
for ($i = 0; $i < $len; $i++) { echo (($i > 0) ? $insert : ”) . mb_substr($str, $i, 1);
}

[/phpcode]

まーこれでいいかなぁー。自分の要望は満たしてるし。でもphpならもっとスマートにできる関数があると思うんだけどな。

[symfony]ログイン認証バリデータ(データベース接続)のサンプル

Written by uechoco 9月 21
この記事を読む時間:718くらい

symfony1.1で、メールアドレスとパスワードによるログインフォームを作りたい。

ログインフォーム

ログインフォーム

メンバー情報などが記録されたMemberテーブルは以下の仕様

  1. propel:
  2. member:
  3. _attributes: { idMethod: native }
  4. id: { type: INTEGER, required: true, autoIncrement: true, primaryKey: true }
  5. name: { type: VARCHAR, size: '255', required: true, default: '' }
  6. mail_pc: { type: VARCHAR, size: '255', required: true, default: '' }
  7. password: { type: VARCHAR, size: '255', required: true, default: '' }
  8. created_at: { type: TIMESTAMP }
  9. updated_at: { type: TIMESTAMP }
  10. last_logined_at: { type: TIMESTAMP }
  11. is_admin: { type: TINYINT, default: '0' }
  12. enabled: { type: TINYINT, required: true, default: '1' }

ログインフォームに必要なバリデータは、個々の項目(mail_pc、password)のバリデートと、データベースへの問い合わせの2つ。個々の項目のバリデートはバリデータを使えばすぐにできそう。以下のような感じ。

[phpcode]
class LoginForm extends sfForm
{
public function configure()
{
$this->setWidgets(array(
‘mail_pc’? => new sfWidgetFormInput(array(), array(‘size’ => 50)),
‘password’ => new sfWidgetFormInputPassword(array(), array(‘size’ => 32)),
));

$this->widgetSchema->setLabels(array(
‘mail_pc’? => ‘PCメールアドレス’,
‘password’ => ‘パスワード’,
));

$this->widgetSchema->setNameFormat(‘login[%s]’);

$this->setValidators(array(
‘mail_pc’? => new sfValidatorEmail(
array(),
array(
‘required’ => ‘メールアドレスを入力してください。’,
‘invalid’? => ‘メールアドレスが正しくありません。’
)
),
‘password’ => new sfValidatorString(
array(‘min_length’ => 6, ‘max_length’ => 64),
array(
‘required’?? => ‘パスワードを入力してください。’,
‘min_length’ => ‘パスワードは%min_length%文字以上です。’,
‘max_length’ => ‘パスワードは%max_length%文字以下です。’,
)
)
));
}

}

[/phpcode]

エラー処理とかもバリデータが一括で請け負ってくれるので、データベースへの問い合わせもバリデータにすればすっきりすると思って、作ろうと思ったけど、ネット上に資料が少ない。どうやっていいかよくわからない。

とりあえず、複数項目のバリデートだから、validatorSchemaのsetPostValidator()に登録するんじゃないかと気づく。こんな感じでsfValidatorSchemaLoginクラスを作ってみた。

[phpcode]
/**
* sfValidatorSchemaLogin
*
* @package??? Travi
* @subpackage validator
*/
class sfValidatorSchemaLogin extends sfValidatorBase
{
/**
* @see sfValidatorBase
*/
protected function doClean($values)
{
if ($values[‘mail_pc’] != ” && $values[‘password’] != ”) {
// 両パラメータが与えられたときだけ実行
$encrypted_password = myUtil::encrypt($values[‘password’]);
if (MemberPeer::isValidUser($values[‘mail_pc’], $encrypted_password)) {
return $values;
} else {
throw new sfValidatorError($this, ‘invalid’, array());
}
}
return $values;
}
}

[/phpcode]

このクラスのミソは、必要なパラメータ(メールアドレスとパスワード)がそろったときだけ、データベースに問い合わせること。なぜかというと、メールアドレスかパスワードのバリデータが成功した時点でデータベースの問い合わせをした方が効率がいいので。

最後に、LoginFormのPostValidatorを登録

[phpcode]

$this->validatorSchema->setPostValidator(
new sfValidatorSchemaLogin(
array(),
array(
‘invalid’? => ‘メールアドレスかパスワードが間違っています。’
)
)
);

[/phpcode]

意外と簡単にいけたけど、もっとスマートな方法ないかなぁ。。。Propel系の標準Validatorがいまいちよくわからないんだな。

[symfony]Fatal error: Class ‘BaseFormPropel’ not found

Written by uechoco 9月 21
この記事を読む時間:41くらい

(関連記事:[symfony]Class ‘BaseFormPropel’ not foundエラー解決

symfony 1.1系列が出てるので、sandboxを拡張してsfFormの練習がてらアプリを作っているのですが、symfony 1.1.1や1.1.2で、以下のようなエラーが出ました。
[phpcode][?php /** * Project form base class. * * @package form * @version SVN: $Id: sfPropelFormBaseTemplate.php 6174 2007-11-27 06:22:40Z fabien $ */
abstract class BaseFormPropel extends sfFormPropel { public function setup() { } }
Fatal error: Class ‘BaseFormPropel’ not found in /path/to/symfony/lib/form/base/BaseMemberForm.class.php on line 10[/phpcode]

状況的には、symfonyコマンドのpropel:build-formsで作成したフォームを使おうとすると、BaseFormPropelクラスがないって言って、上のようなエラー画面になってしまう。

不自然なのは、phpタグが大括弧で始まっていること。

プロジェクト内を検索してみたら、

  1. /lib/symfony/plugins/sfPropelPlugin/data/generator/sfPropelForm/default/template/sfPropelFormBaseTemplate.php

に確かに大括弧で始まる同じデータがあった。

なんでこのファイルをロードするんだろう。。。

解決策1

とりあえず、自分のやる気をそがれるのが嫌だから、暫定措置として、/lib/form/base/BaseXXXXForm.class.phpのextendsしているクラスをBaseFormPropelからsfFormPropelに変更。簡単に言うと、BaseFormPropelっていう中間のクラスを抜いただけ。とりあえず、それほど大きいアプリじゃないから、このままでいいや。

解決策2

思いつきで、クラス名とファイル名を変えてあげればいいかなっと思って、/lib/form/base/BaseXXXXForm.class.phpのextendsしているクラスをBaseFormPropelからBaseFormPropel2に変更。/lib/form/BaseFormPropel.class.phpをBaseFormPropel2.class.phpに変更。そのファイルの中身をBaseFormPropelからBaseFormPropel2に変更。どうやらこれでもうまくいきました。なんていうか。。。微妙な解決策w

ネットで探したら、同じエラーの人がいた。symfony framework forum: Installation and setup => “Fatal error: Class ‘BaseFormPropel’ not found”でも、起きている状況が違うような気もするな。あと、英語よくわからない。

根本的な原因がわからないのが、ちょっと後味悪いかな。

続き:[symfony]Class ‘BaseFormPropel’ not foundエラー解決