package kidozen.client.authentication;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.http.SslError;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.JavascriptInterface;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
/**
* Created by christian on 6/17/14.
*/
public class PassiveAuthenticationActivity extends Activity {
public static final String AUTH_SERVICE_PAYLOAD = "AUTH_SERVICE_PAYLOAD";
private static final String mPrefix="Success payload=";
private static final String mFailPrefix="Error message=";
private WebView webView;
private Boolean mStrictSSL = true;
private WebChromeClient webChromeClient;
private ProgressDialog progressDialog;
private boolean mForceCleanCookies = false;
private class AuthenticationWebViewClient extends WebViewClient {
private static final java.lang.String GET_TITLE_FN = "javascript:( function () { window.HTMLOUT.getTitleCallback(document.title); } ) ()";
protected final String TAG = AuthenticationWebViewClient.class.getSimpleName();
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(PassiveAuthenticationResponseReceiver.ACTION_RESP);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.REQUEST_CODE, KZPassiveAuthBroadcastConstants.REQUEST_FAILED_CODE);
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.ERROR_DESCRIPTION, description);
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.ERROR_FAILING_URL, failingUrl);
sendBroadcast(broadcastIntent);
PassiveAuthenticationActivity.this.finish();
progressDialog.dismiss();
webView.setVisibility(View.VISIBLE);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if(!mStrictSSL)
handler.proceed(); // Ignore SSL certificate errors
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String payload = view.getTitle();
if ( payload.indexOf(mPrefix) > -1 ) {
webView.loadUrl(GET_TITLE_FN);
} else if ( payload.indexOf(mFailPrefix) > -1 ) {
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(PassiveAuthenticationResponseReceiver.ACTION_RESP);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.REQUEST_CODE, KZPassiveAuthBroadcastConstants.REQUEST_FAILED_CODE);
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.ERROR_DESCRIPTION, payload);
sendBroadcast(broadcastIntent);
PassiveAuthenticationActivity.this.finish();
}
progressDialog.dismiss();
}
}
WebViewClient getWebViewClient() {
return new AuthenticationWebViewClient();
}
WebChromeClient getWebChromeClient() {
return new AuthenticationWebChromeClient();
}
private class AuthenticationWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int progress) {
progressDialog.setProgress(progress);
}
}
private class AuthenticationJavaScriptInterface {
@JavascriptInterface
public void getTitleCallback(String jsResult) {
String payload = jsResult.replace(mPrefix,"");
byte[] data = Base64.decode(payload, Base64.DEFAULT);
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(PassiveAuthenticationResponseReceiver.ACTION_RESP);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
try {
String jsonPayload = new String(data,"UTF-8");
if (URLDecoder.decode(jsonPayload).contains(Constants.USER_SOURCE_AUTHORIZATION_CLAIM)) {
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.REQUEST_CODE, KZPassiveAuthBroadcastConstants.REQUEST_COMPLETE_CODE);
broadcastIntent.putExtra(AUTH_SERVICE_PAYLOAD,jsonPayload);
}
else {
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.REQUEST_CODE, KZPassiveAuthBroadcastConstants.REQUEST_FAILED_CODE);
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.ERROR_DESCRIPTION, "unauthorized");
}
} catch (UnsupportedEncodingException e) {
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.REQUEST_CODE, KZPassiveAuthBroadcastConstants.REQUEST_FAILED_CODE);
broadcastIntent.putExtra(KZPassiveAuthBroadcastConstants.ERROR_DESCRIPTION, e.getMessage());
}
sendBroadcast(broadcastIntent);
PassiveAuthenticationActivity.this.finish();
}
}
AuthenticationJavaScriptInterface getJavaScriptInterface() {
return new AuthenticationJavaScriptInterface();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String signInUrl = intent.getStringExtra(IdentityManager.PASSIVE_SIGNIN_URL);
mStrictSSL = Boolean.parseBoolean(intent.getStringExtra(IdentityManager.PASSIVE_STRICT_SSL)) ;
mForceCleanCookies= Boolean.parseBoolean(intent.getStringExtra(IdentityManager.FORCE_CLEAN_COOKIES)) ;
Context context = this;
// no window title
requestWindowFeature(Window.FEATURE_NO_TITLE);
LinearLayout mainLayout = new LinearLayout(context);
mainLayout.setPadding(0, 0, 0, 0);
FrameLayout.LayoutParams frame = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading");
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setProgress(0); // set percentage completed to 0%
webView = new WebView(context);
if(mForceCleanCookies) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
WebSettings ws = webView.getSettings();
ws.setSaveFormData(false);
}
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
webView.setWebViewClient(getWebViewClient());
webView.setWebChromeClient(getWebChromeClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.setLayoutParams(frame);
webView.getSettings().setSavePassword(false);
webView.loadUrl(signInUrl);
webView.addJavascriptInterface(getJavaScriptInterface(), "HTMLOUT");
mainLayout.addView(webView);
setContentView(mainLayout,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
progressDialog.show();
}
}