2007/03/31

WebObjectsで直接SQL実行


WebObjectsで、直接SQLを実行したい場合、よく目にするのは「EOUtilities.rawRowsForSQL」です。
今までずっとこいつを使っていたのですが、こいつでINSERTを実行したあとに、「ec.saveChanges()」をやると、以下のエラーが出るようです。


: Exception occurred while handling request:
java.lang.IllegalArgumentException: Array is empty
at com.webobjects.foundation.NSArray.objectAtIndex(NSArray.java:488)
at com.webobjects.jdbcadaptor.JDBCPlugIn.newPrimaryKeys(JDBCPlugIn.java:611)
:
:


なぜだかまったく分からず、色々調べてみると、

Are you expecting rows from your UPDATE statements? If not, why do you use rawRowsForSQL() in preference of evaluateExpression()?

どうやら、結果を求める場合はrawRowsForSQL()を使い、実行するだけの場合はevaluateExpression()を使うようです。



というわけで、以下のようにevaluateExpressionを使用するようにしました。

もちろんエラーはなくなりました。


EODatabaseContext dbContext = EOUtilities.databaseContextForModelNamed(ec, "model");
EOAdaptorContext adContext = dbContext.adaptorContext();
EOAdaptorChannel adCannel = (EOAdaptorChannel)adContext.channels().lastObject();
EOSQLExpressionFactory factory = new EOSQLExpressionFactory(adContext.adaptor());
EOSQLExpression expression = factory.expressionForString("sql");
adCannel.evaluateExpression(expression);

2007/03/24

logに残されるパスワードをフィルタリングする



Railsアプリを作成していて、動作の確認等で非常に重要なログファイルですが、このログには様々な情報が残されます。

例えばユーザ登録画面等で送信したパラメータもログに残されます。

ユーザ登録の際は、パスワードを入力したりしますので、パスワードがそのまま平文で残されるのはちょいとまずいものです。


Processing UserController#signup (for 192.168.0.25 at 2007-03-24 10:41:08) [POST]
Session ID: 42d8820cd16b8a672b86f737d8d6b4e8
Parameters: {"user"=>{"password_confirmation"=>"testpassword", "lastname"=>"Tarou", "firstname"=>"Test", "login"=>"tester", "password"=>"testpassword", "email"=>"test@test.com"}, "commit"=>"Signup", "action"=>"signup", "controller"=>"admin/user"}


そこで、以下のようにするとログに残されるパスワードをフィルタリングすることができます。

filter_parameter_logging(*filter_words) {|key, value| ...}


class ApplicationController < ActionController::Base
filter_parameter_logging "password"
end



すばらしい!


Processing UserController#signup (for 192.168.0.25 at 2007-03-24 10:43:50) [POST]
Session ID: 42d8820cd16b8a672b86f737d8d6b4e8
Parameters: {"user"=>{"password_confirmation"=>"[FILTERED]", "firstname"=>"Test", "lastname"=>"Tarou", "password"=>"[FILTERED]", "login"=>"tester2", "email"=>"test2@test.com"}, "commit"=>"Signup", "action"=>"signup", "controller"=>"admin/user"}

Filtering Sensitive Logs


2007/03/16

JavaMailでAuth認証とOutbound Port25 Blocking(OP25B)対策



JavaからMailを送信するのに、javax.mailを使って送信していたのですが、社内のサーバ構成を変更しているうちに送信できなくなってしまった。


javax.mail.SendFailedException: Sending failed;
nested exception is:
class javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
class javax.mail.SendFailedException: 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)

at javax.mail.Transport.send0(Transport.java:218)
at javax.mail.Transport.send(Transport.java:80)
at SendMail.sendMail(SendMail.java:42)
...


どうやら認証が必要なようです。

今までは同じホストでアプリケーションが稼動していたので問題なかったようです。



というわけで、Auth認証、そしてOutbound Port25 Blocking(OP25B)対策をして対処しました。


import java.util.Properties;
import java.util.Date;
import javax.mail.Session;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class SendMail {
public void sendMail(
String sourceAdd,
String sourceName,
String descAdd,
String subject, String message,
String type) {
try {
Properties props = System.getProperties();
props.put("mail.smtp.host","mail.hoge.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
Authenticator auth = new MyAuthenticator();
Session session=Session.getDefaultInstance(props, auth);
MimeMessage mimeMessage=new MimeMessage(session);
mimeMessage.setFrom(new InternetAddress(sourceAdd, sourceName, "iso-2022-jp"));
mimeMessage.setRecipients(Message.RecipientType.TO, descAdd);
mimeMessage.setSubject(subject, "iso-2022-jp");
mimeMessage.setText(message, "iso-2022-jp");
mimeMessage.setHeader("Content-Type", type);
mimeMessage.setSentDate(new Date());
Transport.send(mimeMessage);
} catch (Exception e) {
e.printStackTrace();
}
}
}

class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user" , "password");
}
}

2007/03/13

J-PHONE/3.0で、postがうまくいかない



携帯向けアプリを構築していて、特定の端末(おそらく)の場合だけ、post送信時、sessionが維持されない現象を確認。

post送信されるパラメータで、「"_session_id"=>"901cbb6b5a6d515a99a06373d20ba2f4?page=1"」というように、セッションIDのなかになぜか他のパラメータが混入する。

これでは当然、「そんなセッションありません」、ということになってsessionが維持できなくなります。



で、あれこれ試行錯誤した結果、どうやら、formのアクションで、自動でURLパラメータとしてsession_idを付与しているところが問題のよう。

formのアクションを直打ちして解決しました。



ちなみに自動でsession_idを付与してくれるのは、ActiveHeartのTransSidのお陰です。



参考:

RubyOnRails を使ってみる 【第 5 回】 ActiveHeart