PageRenderTime 37ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/ymca/trunk/src/com/excilys/ymca/activity/LoginToCasActivity.java

http://excilys.googlecode.com/
Java | 190 lines | 145 code | 45 blank | 0 comment | 12 complexity | 56e08a414b7127ff5a898e752971eb1e MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.excilys.ymca.activity;
  2. import java.io.IOException;
  3. import java.net.URLEncoder;
  4. import java.util.List;
  5. import org.apache.http.Header;
  6. import org.apache.http.HttpResponse;
  7. import org.apache.http.client.methods.HttpGet;
  8. import org.apache.http.client.params.ClientPNames;
  9. import org.apache.http.cookie.Cookie;
  10. import org.apache.http.impl.client.DefaultHttpClient;
  11. import roboguice.activity.GuiceActivity;
  12. import roboguice.inject.InjectResource;
  13. import android.app.AlertDialog;
  14. import android.app.ProgressDialog;
  15. import android.content.DialogInterface;
  16. import android.content.Intent;
  17. import android.content.DialogInterface.OnClickListener;
  18. import android.os.AsyncTask;
  19. import android.os.Bundle;
  20. import android.util.Log;
  21. import android.webkit.WebView;
  22. import android.webkit.WebViewClient;
  23. import com.excilys.ymca.R;
  24. import com.excilys.ymca.util.SessionCookieHolder;
  25. import com.google.inject.Inject;
  26. import com.google.inject.Provider;
  27. public class LoginToCasActivity extends GuiceActivity {
  28. private static final String TAG = LoginToCasActivity.class.getSimpleName();
  29. private static final String LOGIN_DENIED_PATH = "/login/denied";
  30. private static final String VALIDATE_PATH = "/j_spring_cas_security_check";
  31. private static final String TICKET_PARAM = "?ticket=";
  32. private static final String CAS_LOGIN_PATH = "/login";
  33. private static final String CAS_LOGOUT_PATH = "/logout";
  34. private static final String CAS_SERVICE_PARAM = "?service=";
  35. private static final String CAS_LOGOUT_URL_PARAM = "?url=";
  36. @InjectResource(R.string.cas_host)
  37. private String casHost;
  38. @InjectResource(R.string.zencontact_host)
  39. private String zencontactHost;
  40. @InjectResource(R.string.zencontact_service_host)
  41. private String zencontactServiceHost;
  42. @Inject
  43. private Provider<DefaultHttpClient> httpClientProvider;
  44. @Inject
  45. private SessionCookieHolder sessionCookieHolder;
  46. private WebView loginView;
  47. @Override
  48. protected void onCreate(Bundle savedInstanceState) {
  49. super.onCreate(savedInstanceState);
  50. loginView = new WebView(this);
  51. setContentView(loginView);
  52. WebViewClient client = new WebViewClient() {
  53. @Override
  54. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  55. Log.d(TAG, url);
  56. if (url.startsWith(zencontactServiceHost)) {
  57. loginToZencontact(url);
  58. return true;
  59. } else {
  60. return false;
  61. }
  62. }
  63. };
  64. loginView.setWebViewClient(client);
  65. loginView.loadUrl(buildCasLoginUrl(true));
  66. }
  67. private String buildCasLoginUrl(boolean encode) {
  68. String serviceUrl = zencontactServiceHost + VALIDATE_PATH;
  69. if (encode) {
  70. serviceUrl = URLEncoder.encode(serviceUrl);
  71. }
  72. return casHost + CAS_LOGIN_PATH + CAS_SERVICE_PARAM + serviceUrl;
  73. }
  74. private String buildCasLogoutUrl() {
  75. return casHost + CAS_LOGOUT_PATH + CAS_LOGOUT_URL_PARAM + URLEncoder.encode(buildCasLoginUrl(false));
  76. }
  77. protected void loginToZencontact(final String url) {
  78. final String loginUrl = zencontactHost + VALIDATE_PATH + TICKET_PARAM
  79. + url.substring(url.lastIndexOf(TICKET_PARAM) + TICKET_PARAM.length());
  80. final ProgressDialog dialog = new ProgressDialog(this);
  81. dialog.setCancelable(false);
  82. dialog.setTitle(R.string.login_in_title);
  83. dialog.setMessage(getString(R.string.login_in_message));
  84. dialog.show();
  85. new AsyncTask<Void, Void, Exception>() {
  86. @Override
  87. protected Exception doInBackground(Void... params) {
  88. DefaultHttpClient httpClient = httpClientProvider.get();
  89. httpClient.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);
  90. HttpResponse response;
  91. try {
  92. response = httpClient.execute(new HttpGet(loginUrl));
  93. } catch (IOException e) {
  94. Log.e(TAG, "Error when login in to ZenContact", e);
  95. return e;
  96. }
  97. Header locationHeader = response.getFirstHeader("location");
  98. if (locationHeader != null) {
  99. String location = locationHeader.getValue();
  100. if (location.startsWith(zencontactHost + LOGIN_DENIED_PATH)) {
  101. return new IllegalStateException("Login failed, access denied");
  102. }
  103. Log.d(TAG, location);
  104. Log.d(TAG, zencontactHost + LOGIN_DENIED_PATH);
  105. }
  106. List<Cookie> cookies = httpClient.getCookieStore().getCookies();
  107. for (Cookie cookie : cookies) {
  108. if (cookie.getPath().equals("/zencontactdemo") && cookie.getName().equals("JSESSIONID")) {
  109. sessionCookieHolder.setSessionCookie(cookie);
  110. return null;
  111. }
  112. }
  113. return new IllegalStateException("Session cookie not found");
  114. }
  115. @Override
  116. protected void onPostExecute(Exception exception) {
  117. dialog.cancel();
  118. if (exception != null) {
  119. onLoginFailed(exception, url);
  120. } else {
  121. startActivity(new Intent(LoginToCasActivity.this, ContactListActivity.class));
  122. }
  123. };
  124. }.execute();
  125. }
  126. protected void onLoginFailed(Exception exception, final String url) {
  127. String message = String.format(getString(R.string.login_failed_message), exception.getMessage());
  128. new AlertDialog.Builder(this)//
  129. .setTitle(R.string.login_failed_title) //
  130. .setCancelable(false) //
  131. .setMessage(message) //
  132. .setPositiveButton(R.string.retry, new OnClickListener() {
  133. public void onClick(DialogInterface dialog, int which) {
  134. loginView.loadUrl(buildCasLogoutUrl());
  135. }
  136. }) //
  137. .setNegativeButton(R.string.exit, new OnClickListener() {
  138. public void onClick(DialogInterface dialog, int which) {
  139. finish();
  140. }
  141. })//
  142. .create()//
  143. .show();
  144. }
  145. }