March 20, 2009

Android hack-a-thon

3/20に Android hack-a-thon に参加してきました。

みなさん一日で色々作っています。すごいな〜

私の方は、全くの初心者なので午前中は HelloWorld をやってみました。午後からは gdata のライブラリを使って Google Apps のグループアドレスを作成できるようなアプリケーションにトライ。

gdata の jar をプロジェクトに取り込み、必要な画面を作るところまではうまくいったけど、 GroupService の認証をするところでうまくいかず、当日はここで断念。原因はSSL証明書の検証が失敗している事まではつきとめたんですけど...

せっかくなので今日がんばって動かす事ができたので書きます。

まず gdata の Java クライアントのソースを落としてきて、下記のパッチを当てます。内容はSSL証明書の検証が必ず成功するようにしているだけです。


diff -uNr gdata/java/src/com/google/gdata/client/GoogleAuthTokenFactory.java gdata.mine/java/src/com/google/gdata/client/GoogleAuthTokenFactory.java
--- gdata/java/src/com/google/gdata/client/GoogleAuthTokenFactory.java 2009-02-12 05:09:34.000000000 +0900
+++ gdata.mine/java/src/com/google/gdata/client/GoogleAuthTokenFactory.java 2009-03-22 13:49:42.000000000 +0900
@@ -16,6 +16,13 @@

package com.google.gdata.client;

+import org.apache.http.conn.ssl.X509HostnameVerifier;
+import javax.security.cert.X509Certificate;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLException;
+
import com.google.gdata.util.common.base.CharEscapers;
import com.google.gdata.util.common.base.StringUtil;
import com.google.gdata.client.GoogleService.AccountDeletedException;
@@ -450,7 +457,27 @@

// Open connection
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
-
+ if ( urlConnection instanceof HttpsURLConnection ) {
+ HttpsURLConnection ucs = (HttpsURLConnection) urlConnection;
+ ucs.setHostnameVerifier( new X509HostnameVerifier(){
+ @Override
+ public boolean verify(String arg0, SSLSession arg1) {
+ return true;
+ }
+ @Override
+ public void verify(String arg0, SSLSocket arg1) throws IOException {
+ }
+ @Override
+ public void verify(String arg0,
+ java.security.cert.X509Certificate arg1)
+ throws SSLException {
+ }
+ @Override
+ public void verify(String arg0, String[] arg1, String[]
+ arg2) throws SSLException {
+ }
+ });
+ }
// Set properties of the connection
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
diff -uNr gdata/java/src/com/google/gdata/client/appsforyourdomain/AppsGroupsService.java gdata.mine/java/src/com/google/gdata/client/appsforyourdomain/AppsGroupsService.java
--- gdata/java/src/com/google/gdata/client/appsforyourdomain/AppsGroupsService.java 2009-02-12 05:09:34.000000000 +0900
+++ gdata.mine/java/src/com/google/gdata/client/appsforyourdomain/AppsGroupsService.java 2009-03-22 14:10:47.000000000 +0900
@@ -37,7 +37,7 @@
public class AppsGroupsService extends AppsPropertyService {

public static final String BASE_URL =
- "http://apps-apis.google.com/a/feeds/group/2.0/";
+ "https://apps-apis.google.com/a/feeds/group/2.0/";
public final String baseDomainUrl;

public static final String APPS_PROP_GROUP_ID = "groupId";
diff -uNr gdata/java/src/com/google/gdata/client/http/HttpGDataRequest.java gdata.mine/java/src/com/google/gdata/client/http/HttpGDataRequest.java
--- gdata/java/src/com/google/gdata/client/http/HttpGDataRequest.java 2009-02-12 05:09:35.000000000 +0900
+++ gdata.mine/java/src/com/google/gdata/client/http/HttpGDataRequest.java 2009-03-22 13:49:39.000000000 +0900
@@ -16,6 +16,13 @@

package com.google.gdata.client.http;

+import org.apache.http.conn.ssl.X509HostnameVerifier;
+import javax.security.cert.X509Certificate;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLException;
+
import com.google.gdata.util.common.xml.XmlWriter;
import com.google.gdata.client.AuthTokenFactory;
import com.google.gdata.client.GDataProtocol;
@@ -312,6 +319,29 @@
}
HttpURLConnection uc = (HttpURLConnection) requestUrl.openConnection();

+ // Open connection
+ if ( uc instanceof HttpsURLConnection ) {
+ HttpsURLConnection ucs = (HttpsURLConnection) uc;
+ ucs.setHostnameVerifier( new X509HostnameVerifier(){
+ @Override
+ public boolean verify(String arg0, SSLSession arg1) {
+ return true;
+ }
+ @Override
+ public void verify(String arg0, SSLSocket arg1) throws IOException {
+ }
+ @Override
+ public void verify(String arg0,
+ java.security.cert.X509Certificate arg1)
+ throws SSLException {
+ }
+ @Override
+ public void verify(String arg0, String[] arg1, String[]
+ arg2) throws SSLException {
+ }
+ });
+ }
+
// Should never cache GData requests/responses
uc.setUseCaches(false);






あと gdata/java/build-src/core.xml のコンパイル箇所で android.jar に classpath を通せばコンパイルが通ります。(メッセージに従って mail.jar と activation.jar を用意する必要もあるけど)

でき上がった gdata-appsforyourdomain-1.0.jar と gdata-core-1.0.jar を使うときちんと動かすことができました。手軽に Google Apps の Group を追加できるだけのしょーもないアプリですが...



これを進化させて Google Apps の管理コンソールが作れそう。でも需要は無さそうだなorz

1 comment:

Syun said...

Android hack-a-thonなのに、なぜかGoogle App Engine の質問をさせて頂いた者です。その節は、有難う御座いました。おかげで助かりました。
明日のGoogle Developer Dayの資料を調べていたらここにたどり着きました。
うちのスタッフがあさってのGoogle App EngineのHackathonにWaveチームとして参加する予定です。もし、チューター等で参加されるのような事があれば、よろしくお願いします。