app/src/main/java/org/mcopenplatform/muoapi/mcopsdk/ScreenAutheticationWebView.java
175b478c
 /*
  *
74ca6d11
  *   Copyright (C) 2020, University of the Basque Country (UPV/EHU)
175b478c
  *
  *  Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com>
  *
  *  This file is part of MCOP MCPTT Client
  *
  *  This is free software: you can redistribute it and/or modify it under the terms of
  *  the GNU General Public License as published by the Free Software Foundation, either version 3
  *  of the License, or (at your option) any later version.
  *
  *  This is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  *  See the GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License along
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  */
 
 
 
 package org.mcopenplatform.muoapi.mcopsdk;
 
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.support.v7.app.AppCompatActivity;
 import android.util.Log;
 import android.webkit.CookieManager;
 import android.webkit.CookieSyncManager;
 import android.webkit.WebResourceRequest;
 import android.webkit.WebResourceResponse;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
 import org.doubango.ngn.R;
 import org.mcopenplatform.muoapi.BuildConfig;
 import org.mcopenplatform.muoapi.utils.Utils;
 
 import java.net.URI;
 import java.net.URISyntaxException;
 
 public class ScreenAutheticationWebView extends AppCompatActivity {
 
     private final static String TAG = Utils.getTAG(ScreenAutheticationWebView.class.getCanonicalName());
     private Context mContext;
     public final static int RETURN_ON_AUTHENTICATION_LISTENER_OK= 6547;
     public final static int RETURN_ON_AUTHENTICATION_LISTENER_FAILURE= 6548;
     public final static String RETURN_ON_AUTHENTICATION_CAMPS= "RETURN__ON_AUTHENTICATION_CAMPS."+TAG;
     public final static String RETURN_ON_AUTHENTICATION_ERROR= "RETURN__ON_AUTHENTICATION_ERROR."+TAG;
     public final static String RETURN_ON_AUTHENTICATION_RESPONSE= "RETURN__ON_AUTHENTICATION_RESPONSE."+TAG;
 
     public final static String DATA_URI_INTENT= "DATA_URI_INTENT."+TAG;
     public final static String DATA_REDIRECTION_URI= "DATA_REDIRECTION_URI."+TAG;
     public final static String DATA_USER= "DATA_USER."+TAG;
     public final static String DATA_PASS= "DATA_PASS."+TAG;
     private final static String QUERY_PATH="code";
 
     private final static int TIME_DELAY_MSEG=5000;
 
     private WebView screen_authentication_WebView_info;
     private String userAuthentication;
     private String passAuthentication;
     private String uriString;
     private Runnable mRunnableCheckUrl;
     private Handler handler;
     private URI redirectionDataUri;
     private WebViewClient mWebViewClient;
 
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.screen_authetication_web);
 
         mContext=this;
         Log.d(TAG,"Start Authentication Process");
         //Delete all Cache for webView
         CookieSyncManager.createInstance(this);
         CookieManager cookieManager = CookieManager.getInstance();
         cookieManager.removeAllCookie();
         //End Delete all Cache for webView
         screen_authentication_WebView_info=(WebView)findViewById(R.id.screen_authentication_WebView_info);
         //Force links and redirects to open in the WebView instead of in a browser
         screen_authentication_WebView_info.setWebViewClient(new WebViewClient());
         screen_authentication_WebView_info.setFindListener(new WebView.FindListener() {
             @Override
             public void onFindResultReceived(int i, int i1, boolean b) {
                 Log.d(TAG,"Response web:"+i+" "+i1);
             }
         });
         //Enable Javascript
         WebSettings webSettings = screen_authentication_WebView_info.getSettings();
         webSettings.setJavaScriptEnabled(true);
         webSettings.setAppCacheEnabled(false);
         webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
         Intent intent=getIntent();
         if (intent != null) {
             uriString=intent.getStringExtra(DATA_URI_INTENT);
             String redirectionDataString=intent.getStringExtra(DATA_REDIRECTION_URI);
             if(redirectionDataString==null || redirectionDataString.trim().isEmpty()){
                 Log.e(TAG,"Invalid redirectionURI data");
                 sendError("Invalid redirectionURI data");
             }else{
                 try {
                     redirectionDataUri=new URI(redirectionDataString);
                 } catch (URISyntaxException e) {
                     Log.e(TAG,"Error parsing redirectionURI. "+e.getMessage() );
                     sendError("Error parsing redirectionURI. "+e.getMessage());
                 }
             }
             userAuthentication=intent.getStringExtra(DATA_USER);
             passAuthentication=intent.getStringExtra(DATA_PASS);
             if(uriString!=null){
                 screen_authentication_WebView_info.loadUrl(uriString);
             }
         }
         mWebViewClient=new WebViewClient(){
             @Override
             public void onReceivedError(final WebView view, int errorCode, String description, final String failingUrl) {
                 if(BuildConfig.DEBUG)Log.e(TAG,"onReceivedError: "+errorCode+" des: "+description);
                 Uri uri=Uri.parse(screen_authentication_WebView_info.getUrl());
                 if(((uri.getScheme().compareToIgnoreCase(redirectionDataUri.getScheme())!=0 ||
                         uri.getHost().compareToIgnoreCase(redirectionDataUri.getHost())!=0 ||
                         uri.getPort()!=redirectionDataUri.getPort() )&&
                         description.trim().compareTo("net::ERR_CONNECTION_REFUSED") ==0
                 )){
                     Log.e(TAG,"Web Code Error: "+errorCode+" des: "+description);
                     finishError(getString(R.string.Error_in_authetication)+" code: "+errorCode+" des: "+description);
                 }
                 super.onReceivedError(view, errorCode, description, failingUrl);
             }
 
             @Override
             public void onPageFinished(WebView view, String url)
             {
                 if(userAuthentication!=null && passAuthentication!=null){
                     screen_authentication_WebView_info.loadUrl("javascript:(function() { document.getElementById('j_username').value = '" + userAuthentication + "'; ;})()");
                     screen_authentication_WebView_info.loadUrl("javascript:(function() { document.getElementById('j_password').value = '" + passAuthentication + "'; ;})()");
                 }
                 checkUrl();
             }
 
             @Override
             public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                 if(BuildConfig.DEBUG)Log.d(TAG,"onReceivedHttpError: "+errorResponse.toString());
             }
         };
 
         screen_authentication_WebView_info.setWebViewClient(mWebViewClient);
     }
 
     /*private String getUrlParameters(String url) throws URISyntaxException {
         URI uri = new URI(url);
         return new URI(uri.getScheme(),
                 uri.getAuthority(),
                 uri.getPath(),
                 null, // Ignore the query part of the input url
                 uri.getFragment()).toString();
     }*/
     private String getUrlParameters(Uri uri) throws URISyntaxException {
         String uriString=new URI(uri.getScheme(),
                 uri.getAuthority(),
                 uri.getPath(),
                 null, // Ignore the query part of the input url
                 uri.getFragment()).toString();
         return uriString;
     }
 
     private boolean isEquals(String stringUri1,String stringUri2){
         try {
             int index=stringUri1.lastIndexOf("/");
             if(stringUri1.lastIndexOf("/")==(stringUri1.length()-1)){
                 stringUri1=stringUri1.substring(0,stringUri1.length()-1);
             }
             index=stringUri2.lastIndexOf("/");
             if(stringUri2.lastIndexOf("/")==(stringUri2.length()-1)){
                 stringUri2=stringUri2.substring(0,stringUri2.length()-1);
             }
             return stringUri1.compareToIgnoreCase(stringUri2)==0?true:false;
         } catch (Exception e) {
             Log.e(TAG,"Error parse URL.");
            return false;
         }
     }
 
     private void checkUrl(){
         handler = new Handler();
         mRunnableCheckUrl=new Runnable() {
             @Override
             public void run() {
                 try {
                     Uri uri=Uri.parse(screen_authentication_WebView_info.getUrl());
                     String scheme=uri.getScheme();
                     String host=uri.getHost();
                     String path=uri.getPath();
                     String uriWhitoutParameters=getUrlParameters(uri);
                     if(isEquals(uriWhitoutParameters,redirectionDataUri.toString())
                             ){
                             Intent intent = new Intent();
                         intent.putExtra(RETURN_ON_AUTHENTICATION_RESPONSE, uri.toString());
                             setResult(RETURN_ON_AUTHENTICATION_LISTENER_OK,intent);
                         finish();
                     }
                     else{
                         if(userAuthentication!=null &&
                             !userAuthentication.isEmpty() &&
                             passAuthentication!=null &&
                             !passAuthentication.isEmpty()) {
                             //Configure User and Pass and click Submit
                             screen_authentication_WebView_info.loadUrl("javascript:(function() { document.getElementsByName('submit')[0].click(); })()");
                             //Click Authorize
                             screen_authentication_WebView_info.loadUrl("javascript:(function() { document.getElementsByName('authorize')[0].click(); })()");
                         }else{
                             checkUrl();
                         }
 
                     }
                 } catch (Exception e) {
                     Log.e(TAG,"Error checking URL authentication: "+e.getMessage());
                     e.printStackTrace();
                 }
             }
         };
         handler.postDelayed(mRunnableCheckUrl,TIME_DELAY_MSEG);
     }
 
     @Override
     protected void onStart() {
         super.onStart();
     }
 
     @Override
     protected void onNewIntent(Intent intent) {
 
     }
 
     @Override
     public void finish(){
         if(handler!=null){
             handler.removeCallbacks(mRunnableCheckUrl);
         }
          super.finish();
     }
 
     public void finishError(String error){
         sendError(error);
         finish();
     }
 
     private void sendError(String error){
         Intent intent = new Intent();
         intent.putExtra(RETURN_ON_AUTHENTICATION_ERROR,error);
         setResult(RETURN_ON_AUTHENTICATION_LISTENER_FAILURE,intent);
     }
 }