[openpne]opAuthPOP3PluginにGoogle Apps向けのオプションをつける

2012-06-08(Fri) Server

OpenPNE 3系では、認証系もプラグイン提供となっているようです。2系は実はよく知りませんが。

個別にアカウント登録以外にも、SNSのアカウントやLDAPも利用できるらしいです(ただし多くは実験的な提供のようです。間違えていたらすみません)

タイトルにあるopAuthPOP3Pluginもそのひとつで、これはPOP3認証を使ってアカウント作成とログインが行えるというプラグイン。
Google AppsやMSExchangeでメール機能を提供(POP3の利用が可能)されている場合に、POP3サーバとドメインを指定しておくとメールのアカウント名(ユーザー名)とパスワードでOpenPNEにログイン出来るといったものです。

Google Appsで利用するために考えていた所、OpenPNE開発者の手島さんに教えてもらい利用してみてました。

アカウントが増殖する問題

認証系は特に問題無く利用できたように見えましたが、ここでGoogle Apps側の仕様に泣かされるはめに。
Google Apps(というかgoogle)アカウントの仕様では、@以前のユーザー名は大文字小文字の区別なく利用出来るようで、"hogehuga"はもちろん"Hogehuga"も"HoGeFuGa"も同一のもの見られてしまいます。

そして、OpnePNEのアカウントの仕様では、大文字小文字の区別が有るようです。

どうなるかというと、OpenPNE側で"hogehuga"で初期ログインしアカウントを作り、"HogeHuga"でログインすると"HogeHuga"のアカウントが作成されてしまいます。

この逆も同じで、つまりはApps側で認証が可能な組み合わせ分OpenPNE側にアカウントが増殖してしまいます。

Apps側では大文字小文字を区別するといった設定はないようで、ユーザー側が気をつける必要がありますが、間違いは防ぎきれないので何とかしたい所。メンバーの削除の必要もありちょっと面倒です。
そこでopAuthPOP3Pluginを改造することにしました。

解決案

opAuthPOP3Pluginのプラグイン設定画面に、Google Appsを利用している場合に使うようなオプションを新設し、オプションを有効にしている場合はアカウント名が大文字だろうと大文字小文字の混在だろうと、全て小文字にしてしまうといった物。

この方法が良いものか悪いものかがよくわかってないのでとりあえずの用途としての修正です。自分が利用を考えているところではこれで必要十分なのでこのまま使う予定です。

[tweet https://twitter.com/hrs_sano645/status/176858820952330240 align='center' lang='ja']

イメージ

opauthpop3plugin-apps_mod.png

このアイディアより良い方法が有れば、教えていただける(あと手島さん)と助かります。

以下よりdiffったものです。ところでdiffってこんな感じで良いのでしょうか?

opAuthPOP3PluginConfigForm.class.php

---
./tejima-opAuthPOP3Plugin-9243bc1/apps/pc\_backend/modules/opAuthPOP3Plugin/lib/opAuthPOP3PluginConfigForm.class.php  
+++
./tejima-opAuthPOP3Plugin-mod/apps/pc\_backend/modules/opAuthPOP3Plugin/lib/opAuthPOP3PluginConfigForm.class.php  
@@ -6,21 +6,32 @@  

//s(\$app['all']['twipne\_config']['accesskey'],\$app['all']['twipne\_config']['secretaccesskey']);  
'pop3\_host' =\> 'opauthpop3plugin\_pop3\_host',  
'pop3\_domain\_suffix' =\> 'opauthpop3plugin\_pop3\_domain\_suffix',  
+ 'pop3\_enable\_googleapps\_option' =\>
'opauthpop3plugin\_pop3\_enable\_googleapps\_option',  
);  
+  
+ private \$apps\_config\_choice = array('on'=\>'on', 'off'=\>'off');  
+  
public function configure()  
{  
\$this-\>setWidgets(array(  
'pop3\_host' =\> new sfWidgetFormInput(),  
'pop3\_domain\_suffix' =\> new sfWidgetFormInput(),  
+ 'pop3\_enable\_googleapps\_option' =\> new sfWidgetFormChoice(array(  
+ 'expanded' =\> true,  
+ 'choices'=\>\$this-\>apps\_config\_choicei,  
+ ))  
));  
\$this-\>setValidators(array(  
'pop3\_host' =\> new sfValidatorString(array(),array()),  
'pop3\_domain\_suffix' =\> new sfValidatorString(array(),array()),  
+ 'pop3\_enable\_googleapps\_option' =\> new sfValidatorChoice(array(  
+ 'choices' =\> array\_keys(\$this-\>apps\_config\_choice)  
+ ))  
));
</p>
-  
\$this-\>widgetSchema-\>setHelp('pop3\_host', 'POP3 HOST');  
\$this-\>widgetSchema-\>setHelp('pop3\_domain\_suffix', 'POP3 DOMAIN
SUFFIX');  
+ \$this-\>widgetSchema-\>setHelp('pop3\_enable\_googleapps\_option',
'POP3 ENABLE GOOGLEAPPS OPTION');

foreach(\$this-\>configs as \$k =\> \$v)  
{  

opAuthValidatorPOP3.class.php

---
./tejima-opAuthPOP3Plugin-9243bc1/lib/opAuthValidatorPOP3.class.php  
+++ ./tejima-opAuthPOP3Plugin-mod/lib/opAuthValidatorPOP3.class.php  
@@ -50,7 +50,18 @@  
protected function doClean(\$values)  
{  
opActivateBehavior::disable();  
- \$user = \$values['id'] . "@" .
opConfig::get('opauthpop3plugin\_pop3\_domain\_suffix',null);  
+  
+ // google apps用に分岐  
+ // appsの設定をしている場合は英数を小文字にする。  
+  
+
if(opConfig::get('opauthpop3plugin\_pop3\_enable\_googleapps\_option',null)==="on")  
+ {  
+ \$pop\_username = strtolower(\$values['id']);  
+ }else{  
+ \$pop\_username = \$values['id'];  
+ }  
+  
+ \$user = \$pop\_username . "@" .
opConfig::get('opauthpop3plugin\_pop3\_domain\_suffix',null);
</p>
\$param = array('host' =\>
opConfig::get('opauthpop3plugin\_pop3\_host',null),  
'user' =\> \$user,  

OpenPNEプラグイン(というかsymfony)の書き方がよくわからなかったもので、オプションのオンオフをチェックボックスで出来ないかと随分格闘してましたが、結局on/offの選択リストで済ませました。

ラジオボタンも有効にしてみたもの(sfWidgetFormChoiceのextended)のなぜかHTML側に描写されなかったので、素のまま利用です。

さて、これがひとまず解決したので、次はスマートフォンAPI経由でOpenPNEに投稿出来るようなりたいです。ChromeやAndroidから共有したいURIを流したい用途に使えそうなので。