/* Tibisay Movil Copyright (C) 2013 Antonio Araujo (aaraujo@cenditel.gob.ve), Jose Ruiz (jruiz@cenditel.gob.ve), Fundacion Centro Nacional de Desarrollo e Investigacion en Tecnologias Libres - CENDITEL. La Fundación CENDITEL concede permiso para usar, copiar, distribuir y/o modificar este programa, reconociendo el derecho que la humanidad posee al libre acceso al conocimiento, bajo los términos de la licencia de software GPL versión 2.0 de la Free Software Foundation. Este programa se distribuye con la esperanza de que sea util, pero SIN NINGUNA GARANTIA; tampoco las implicitas garantias de MERCANTILIDAD o ADECUACION A UN PROPOSITO PARTICULAR. Para mayor información sobre los términos de la licencia ver el archivo llamado "gpl-2.0.txt" en ingles. */ package ve.gob.cenditel.tibisaymovil; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.util.ArrayList; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; import ee.sk.digidoc.DataFile; import ee.sk.digidoc.DigiDocException; import ee.sk.digidoc.Signature; import ee.sk.digidoc.SignedDoc; import ee.sk.digidoc.factory.DigiDocFactory; import ee.sk.utils.ConfigManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.os.Looper; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.View.OnClickListener; import android.webkit.MimeTypeMap; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class BDOCVerifyResultActivity extends Activity { // linear private LinearLayout button_share; private LinearLayout button_finish; private ListView documents_list; private ImageView arrowShowErrors; // cadena que mantiene la ruta para almacenar los archivos // extraidos de un contendor BDOC private String extractedDirFiles; // cadena que mantiene la ruta para almacenar los archivos // descargados desde un servidor para verificar su firma private String downloadedDirFiles; // ruta absoluta al archivo a verificar private String fileToVerify; // extension del archivo a verificar private String fileToVerifyExtension; // mimetype del archivo a verificar private String mimeTypeFileToVerify; private ArrayList errorList; // Progress Dialog private ProgressDialog mProgressDialog; // Progress dialog type (0 - for Horizontal progress bar) public static final int DIALOG_DOWNLOAD_PROGRESS = 0; //String urlhttps = "https://tibisay.cenditel.gob.ve/trac/raw-attachment/wiki/WikiStart/actados.2.bdoc"; String urlhttps = null; @Override protected void onCreate(Bundle savedInstanceState) { //Estilando la barra de titulo final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); Log.d("onCreate", "antes de super"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_verify_result_bdoc); //Estilando Barra de titulo if(customTitleSupported) getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar); arrowShowErrors = (ImageView) this.findViewById(R.id.arrow_show_errors); arrowShowErrors.setVisibility(ImageView.GONE); button_share = (LinearLayout) this.findViewById(R.id.button_remove_certificate_zone); button_finish = (LinearLayout) this.findViewById(R.id.button_add_certificate_zone); // inicializa la lista de objetos de errores de firma errorList = new ArrayList(); // habilita el click sobre la acción de finalizar la verificacion de firma y regresar button_finish.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent oIntent = new Intent(BDOCVerifyResultActivity.this, TibisayMovilActivity.class); oIntent.setAction(Intent.ACTION_VIEW); oIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(oIntent); finish(); } }); // habilita el click sobre la acción de compartir el archivo button_share.setOnClickListener(new OnClickListener() { public void onClick(View v) { shareIt(); } }); // habilita el click sobre la flecha para mostrar los errores de la firma arrowShowErrors.setOnClickListener(new OnClickListener(){ public void onClick(View arg0) { Intent intent = new Intent(BDOCVerifyResultActivity.this, ActivitySignatureErrors.class); intent.setClass(BDOCVerifyResultActivity.this, ActivitySignatureErrors.class); intent.putExtra("SignatureErrorDetailList", errorList); intent.putExtra("numeroObjetoError", Integer.toString(errorList.size())); startActivity(intent); } }); // chequear si intent tiene data final android.content.Intent intent = getIntent(); final Bundle bundle = getIntent().getExtras(); if (intent != null) { //Toast.makeText(getApplicationContext(), "intent != null", Toast.LENGTH_SHORT).show(); final android.net.Uri data = intent.getData (); if (data != null) { //Toast.makeText(getApplicationContext(), "data != null", Toast.LENGTH_SHORT).show(); // verificar el tipo de scheme String scheme = data.getScheme(); // verificacion de un archivo que esta en el dispositivo if (scheme.equals("file")) { //Toast.makeText(getApplicationContext(), "file: "+data.getPath(), Toast.LENGTH_SHORT).show(); // verificar el archivo if (data.getPath().endsWith("bdoc")){ fileToVerify = data.getPath(); // ejecutar la verificacion doBdocVerification(data.getPath()); }else{ //Toast.makeText(getApplicationContext(), "¡Por Implementar! scheme == file", Toast.LENGTH_SHORT).show(); } } // verificacion de un archivo que se debe descargar if (scheme.equals("https")) { //Toast.makeText(getApplicationContext(), "scheme: "+data.toString(), Toast.LENGTH_SHORT).show(); //Toast.makeText(getApplicationContext(), "externalStorage: "+Environment.getExternalStorageDirectory().toString(), Toast.LENGTH_SHORT).show(); urlhttps = data.toString(); new DownloadFileAsync().execute(data.toString(), "false"); //new DownloadFileFromURL().execute("http://farm1.static.flickr.com/114/298125983_0e4bf66782_b.jpg"); //Toast.makeText(getApplicationContext(), "****despues de execute()", Toast.LENGTH_SHORT).show(); // verificar el archivo //Toast.makeText(getApplicationContext(), "Ahora viene la verificación del archivo", Toast.LENGTH_SHORT).show(); } return; } // verificacion de archivo desde la Activity principal if (bundle != null) { fileToVerify = bundle.getString("fileToVerify"); fileToVerifyExtension = bundle.getString("fileExtension"); mimeTypeFileToVerify = getMimeType(fileToVerify); //Toast.makeText(getApplicationContext(), "BDOCVerifyResultActivity fileToVerify: "+fileToVerify, Toast.LENGTH_SHORT).show(); //Toast.makeText(getApplicationContext(), "BDOCVerifyResultActivity fileToVerifyExtension: "+fileToVerifyExtension, Toast.LENGTH_SHORT).show(); if (fileToVerifyExtension.equals("bdoc")){ //Toast.makeText(getApplicationContext(), "BDOCVerifyResultActivity: -> doBdocVerification(fileToVerify)", Toast.LENGTH_SHORT).show(); // ejecutar la verificacion doBdocVerification(fileToVerify); }else{ //Toast.makeText(getApplicationContext(), "¡Por Implementar bundle != null!", Toast.LENGTH_SHORT).show(); // ejecutar la verificacion del pdf firmado doPdfVerification(fileToVerify); } //return; } }else{ //Toast.makeText(getApplicationContext(), "intent == null", Toast.LENGTH_SHORT).show(); } //Bundle bundle=getIntent().getExtras(); //fileToVerify = bundle.getString("fileToVerify"); //fileToVerifyExtension = bundle.getString("fileExtension"); //mimeTypeFileToVerify = getMimeType(fileToVerify); //Toast.makeText(getApplicationContext(), "fileToVerify: "+fileToVerify, Toast.LENGTH_SHORT).show(); /* if (fileToVerifyExtension.equals("bdoc")){ // ejecutar la verificacion doBdocVerification(fileToVerify); }else{ Toast.makeText(getApplicationContext(), "¡Por Implementar!", Toast.LENGTH_SHORT).show(); } */ } @Override public void onStart () { android.util.Log.d ("**onStart(): ", " onStart"); super.onStart (); final android.content.Intent intent = getIntent (); if (intent != null) { android.util.Log.d ("**onStart(): ", "> Got intent : " + intent); final android.net.Uri data = intent.getData (); if (data != null) { android.util.Log.d ("**onStart(): ", "> Got data : " + data); final String filePath = data.getEncodedPath (); android.util.Log.d ("**onStart(): ", "> Open file : " + filePath); // file loading comes here. } // if } // if android.util.Log.d ("**onStart(): ", "- saliendo onStart"); return; } // funcion para verificar un documento private void doBdocVerification(String absolutePathFileToVerify){ //Toast.makeText(getApplicationContext(), "BDOCVerifyResultActivity: dentro doBdocVerification(fileToVerify)"+absolutePathFileToVerify, Toast.LENGTH_SHORT).show(); try { Log.d("doBdocVerification:", "Inicializando jdigidoc ..."); ConfigManager.init("jar://jdigidoc.cfg"); Log.d("despues de:", "ConfigManager.init"); Log.d("antes de:", "digFac"); DigiDocFactory digFac = ConfigManager.instance().getDigiDocFactory(); Log.d("getFilesDir:", getFilesDir().getAbsolutePath()); Log.d("PATH", Environment.getExternalStorageDirectory().toString()); File file = new File(absolutePathFileToVerify); InputStream selectedFile = null; selectedFile = new BufferedInputStream(new FileInputStream(file)); SignedDoc sdoc = digFac.readSignedDocFromStreamOfType(selectedFile, true); selectedFile.close(); //SignedDoc sdoc = digFac.readSignedDocFromStreamOfType(fraw, true); Signature signature = sdoc.getSignature(0); // TextView para colocar el resultado de la firma TextView signatureVerificationResult = (TextView) findViewById(R.id.archivo_original_a_descifrar); // array de excepciones lanzadas al verificar firmas ArrayList arraySignaturesErrors = null; // verificar cada una de las firmas del contenedor for (int i = 0; i < sdoc.countSignatures(); i++){ Signature tmpSignature = sdoc.getSignature(i); arraySignaturesErrors = new ArrayList(); arraySignaturesErrors = tmpSignature.verify(sdoc, false, false); Log.d("**La Firma: "+Integer.toString(i),"tiene : "+ arraySignaturesErrors.size()+" errores."); // lista de cadenas que almancenara los errores para el firmante i ArrayList signatureVerificationErrors = new ArrayList(); for (int j = 0; j < arraySignaturesErrors.size(); j++){ // agregar la cadena de error particular a la lista signatureVerificationErrors.add(arraySignaturesErrors.get(j).toString() + "\n"); } //String cn = SignedDoc.getCommonName(sdoc.getSignature(i).getKeyInfo().getSignersCertificate().getSubjectDN().getName()); String signer = sdoc.getSignature(i).getKeyInfo().getSubjectLastName(); // crear objeto SignatureErrorDetail con detalles de error para la firma i SignatureErrorDetail object = new SignatureErrorDetail(signer, signatureVerificationErrors); // agregar el objeto SignatureErrorDetail a lista errorList.add(object); } // fin del for para la firma i if (arraySignaturesErrors.isEmpty()) { signatureVerificationResult.setText(getResources().getString(R.string.string_valid_signature)); Log.d("signature.verify", "NO HUBO ERROR EN LA VERIFICACION DE FIRMA"); Toast.makeText(getApplicationContext(), "¡FIRMA CORRECTA!", Toast.LENGTH_SHORT).show(); }else{ // habilitar la flecha para mostrar los errores de firma arrowShowErrors.setVisibility(ImageView.VISIBLE); //signatureVerificationResult.setText("Inválida."); signatureVerificationResult.setText(getResources().getString(R.string.string_invalid_signature)); Log.d("************", "SI HUBO ERROR"); Toast.makeText(getApplicationContext(), "ERROR DE VERIFICACION DE FIRMA", Toast.LENGTH_SHORT).show(); } //ArrayList sigError = signature.verify(sdoc, false, false); //ArrayList sigError = sdoc.verify(false, false); // se crea el adaptador para mostrar los documentos firmados ListView documentListView = (ListView) findViewById(R.id.documents_list); final ArrayList docs = new ArrayList(); // Crear directorio ExtractedFiles donde se almacenan los archivos extraidos // de los contenedores BDOC extractedDirFiles = Environment.getExternalStorageDirectory() + "/" + getResources().getString(R.string.app_name) + "/" + getResources().getString(R.string.extracted_dir_files) + "/"; prepareDirectory(extractedDirFiles); for (int i = 0; i < sdoc.countDataFiles(); i++){ // obtener el DataFile DataFile df = sdoc.getDataFile(i); docs.add(new DocumentFromBDOC(df.getFileName())); Log.d("MIMETYPE:", df.getMimeType()); // Extraer el archivo y guardarlo en /mnt/sdcard/TibisayMovil/ExtractedFiles FileOutputStream fos = new FileOutputStream(extractedDirFiles+df.getFileName()); InputStream is = df.getBodyAsStream(); if(is == null) { Log.d("ERROR al extrarer archivo", "DataFile has no data!"); //return false; } byte[] data = new byte[4096]; int n = 0, m = 0; while((n = is.read(data)) > 0) { fos.write(data, 0, n); m += n; } fos.close(); is.close(); } DocumentFromBDOCAdapter documentAdapter = new DocumentFromBDOCAdapter(BDOCVerifyResultActivity.this, docs); documentListView.setAdapter(documentAdapter); documentListView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { String absolutePathToOpen = extractedDirFiles + docs.get(position).getName(); //Toast.makeText(getApplicationContext(), getMimeType(absolutePathToOpen), Toast.LENGTH_SHORT).show(); openIt(absolutePathToOpen, getMimeType(absolutePathToOpen)); } }); // se crea el adaptador para mostrar los firmantes del contenedor ListView signerListView = (ListView) findViewById(R.id.signatures_list); final ArrayList signers = new ArrayList(); for (int i = 0; i < sdoc.countSignatures(); i++){ Signature signatureTemp = sdoc.getSignature(i); //signers.add(new SignerFromBDOC(signatureTemp.getSubject())); String cn = SignedDoc.getCommonName( sdoc.getSignature(i).getKeyInfo().getSignersCertificate().getSubjectDN().getName()); String name = sdoc.getSignature(i).getKeyInfo().getSubjectLastName(); String date = sdoc.getSignature(i).getSignedProperties().getSigningTime().toString(); String certificateSerial = sdoc.getSignature(i).getKeyInfo().getSignersCertificate().getSerialNumber().toString(); String validFrom = sdoc.getSignature(i).getKeyInfo().getSignersCertificate().getNotBefore().toLocaleString(); String validUntil = sdoc.getSignature(i).getKeyInfo().getSignersCertificate().getNotAfter().toLocaleString(); String certificateIssuer = sdoc.getSignature(i).getKeyInfo().getSignersCertificate().getIssuerX500Principal().toString(); // agregar el nombre comun del firmante y la fecha y la hora signers.add(new SignerFromBDOC(name, cn, date, certificateSerial, validFrom, validUntil, certificateIssuer)); } SignerFromBDOCAdapter signerAdapter = new SignerFromBDOCAdapter(BDOCVerifyResultActivity.this, signers); signerListView.setAdapter(signerAdapter); signerListView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { //String signer = parent.getItemAtPosition(position).toString(); //Toast.makeText(getApplicationContext(), "SE DEBE MOSTRAR INFORMACIÓN DEL FIRMANTE", Toast.LENGTH_SHORT).show(); showSignatureDetails(position, signers); } }); } catch (Exception e) { // TODO Auto-generated catch block //showOneButtonDialog(e.getMessage()); Log.d("****exception:", e.getMessage()); e.printStackTrace(); Toast.makeText(getApplicationContext(), "BDOCVerifyResultActivity: "+e.getMessage(), Toast.LENGTH_LONG).show(); } } // fin de doVerification(String f) // clase que abstrae un documento incluido dentro de un contenedor BDOC public class DocumentFromBDOC { private String mName; public DocumentFromBDOC(String name){ mName = name; } public void setName(String name) { this.mName = name; } public String getName() { return mName; } } // fin de clase DocumentFromBDOC // clase que abstrae el adaptador para llenar el ListView de documentos que // se encuentran dentro del contenedor BDOC private class DocumentFromBDOCAdapter extends BaseAdapter { private ArrayList mDocumentFromBDOCList; private LayoutInflater lInflater; private DocumentFromBDOCAdapter(Context context, ArrayList documents) { this.lInflater = LayoutInflater.from(context); this.mDocumentFromBDOCList = documents; } @Override public int getCount() { return mDocumentFromBDOCList.size(); } @Override public Object getItem(int position) { return mDocumentFromBDOCList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder container = null; if (convertView == null){ container = new ViewHolder(); convertView = lInflater.inflate(R.layout.document_inside_bdoc_item, null); container.filename_text = (TextView) convertView.findViewById(R.id.filename_text); container.filename_modified = (TextView) convertView.findViewById(R.id.filename_modified); container.type_image = (ImageView) convertView.findViewById(R.id.type_image); convertView.setTag(container); }else{ container = (ViewHolder) convertView.getTag(); } DocumentFromBDOC doc = (DocumentFromBDOC) getItem(position); container.filename_text.setText(doc.getName()); container.filename_modified.setText(doc.getName()); container.type_image.setImageResource(R.drawable.ic_archivo); return convertView; } class ViewHolder{ TextView filename_text; TextView filename_modified; ImageView type_image; } } // class que abstrae un firmante incluido en un contenedor BDOC private class SignerFromBDOC { // nombre del firmante private String mName; // nombre comun del firmante private String mCN; // fecha y hora de la firma private String mDate; // serial del certificado private String mCertificateSerial; // fecha de validez inicial private String mValidFrom; // fecha de validez final private String mValidUntil; // emisor del certificado private String mCertificateIssuer; public SignerFromBDOC(String name, String cn, String date, String serial, String validFrom, String validUntil, String issuer){ mName = name; mCN = cn; mDate = date; mCertificateSerial = serial; mValidFrom = validFrom; mValidUntil = validUntil; mCertificateIssuer = issuer; } public void setName(String name) { this.mName = name; } public String getName() { return mName; } public void setCN(String cn) { this.mCN = cn; } public String getCN() { return mCN; } public void setDate(String date) { this.mDate = date; } public String getDate() { return mDate; } public void setCertificateSerial(String certSerial) { this.mCertificateSerial = certSerial; } public String getCertificateSerial() { return mCertificateSerial; } public void setValidFrom(String validFrom) { this.mValidFrom = validFrom; } public String getValidFrom() { return mValidFrom; } public void setValidUntil(String validUntil) { this.mValidUntil = validUntil; } public String getValidUntil() { return mValidUntil; } public void setCertificateIssuer(String certIssuer) { this.mCertificateIssuer = certIssuer; } public String getCertificateIssuer() { return mCertificateIssuer; } } // fin de clase SignerFromBDOC // clase que abstrae el adaptador para llenar el ListView de documentos que // se encuentran dentro del contenedor BDOC private class SignerFromBDOCAdapter extends BaseAdapter { private ArrayList mSignerFromBDOCList; private LayoutInflater lInflater; private SignerFromBDOCAdapter(Context context, ArrayList signers) { this.lInflater = LayoutInflater.from(context); this.mSignerFromBDOCList = signers; } @Override public int getCount() { return mSignerFromBDOCList.size(); } @Override public Object getItem(int position) { return mSignerFromBDOCList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder container = null; if (convertView == null){ container = new ViewHolder(); convertView = lInflater.inflate(R.layout.signer_inside_bdoc_item, null); container.signer_text = (TextView) convertView.findViewById(R.id.signer_info); container.signer_modified = (TextView) convertView.findViewById(R.id.signature_errors); container.type_image = (ImageView) convertView.findViewById(R.id.type_image); convertView.setTag(container); }else{ container = (ViewHolder) convertView.getTag(); } SignerFromBDOC doc = (SignerFromBDOC) getItem(position); container.signer_text.setText(doc.getName()); container.signer_modified.setText(doc.getName()); container.type_image.setImageResource(R.drawable.ic_pluma); return convertView; } class ViewHolder{ TextView signer_text; TextView signer_modified; ImageView type_image; } } /** * Prepara directorio * @return boolean */ private boolean prepareDirectory(String dir) { try { if (makedirs(dir)) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); //Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", Toast.LENGTH_LONG).show(); Toast.makeText(this, "No se pudo iniciar el sistema de archivos. ¿Está la SDCARD montada?", Toast.LENGTH_LONG).show(); return false; } } /** * Crea directorio utilizando la variable tmpDir * @return boolean */ private boolean makedirs(String dir) { //File tempdir = new File(extractedDirFiles); File tempdir = new File(dir); if (!tempdir.exists()) tempdir.mkdirs(); // if (tempdir.isDirectory()) // { // File[] files = tempdir.listFiles(); // for (File file : files) // { // if (!file.delete()) // { // System.out.println("Failed to delete " + file); // } // } // } return (tempdir.isDirectory()); } // funcion para lanzar un intent que abra un archivo private void openIt(String filePath, String mimeType) { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_VIEW); File file = new File(filePath); Uri uri = Uri.fromFile(file); Log.i("DEBUG", file.getPath()); shareIntent.setDataAndType(uri, mimeType); startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.open_it_using))); } // funcion para obtener el tipo mime de un archivo public static String getMimeType(String url) { String extension = url.substring(url.lastIndexOf(".")); String mimeTypeMap = MimeTypeMap.getFileExtensionFromUrl(extension); String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(mimeTypeMap); return mimeType; } // funcion para compartir el documento private void shareIt() { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); File file = new File(fileToVerify); Uri uri = Uri.fromFile(file); Log.i("DEBUG", file.getPath()); //Log.d("******", getMimeType(file.getPath())); //shareIntent.setDataAndType(uri, getMimeType(file.getPath())); shareIntent.putExtra(Intent.EXTRA_STREAM, uri); shareIntent.setType("application/*"); startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.share_it_using))); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.bdocverify_result, menu); return true; } private void showSignatureDetails(int position, ArrayList signers) { Log.d("**showSignatureDetails", Integer.toString(position)); Log.d("** nombre", signers.get(position).getName()); Intent intent = new Intent(this, ActivitySignerInfo.class); intent.putExtra("name", signers.get(position).getName()); intent.putExtra("cn", signers.get(position).getCN()); intent.putExtra("date", signers.get(position).getDate()); intent.putExtra("certificateSerial", signers.get(position).getCertificateSerial()); intent.putExtra("validFrom", signers.get(position).getValidFrom()); intent.putExtra("validUntil", signers.get(position).getValidUntil()); intent.putExtra("certificateIssuer", signers.get(position).getCertificateIssuer()); startActivity(intent); } // funcion para desplegar la interfaz con los detalles de errores de la firma private void showSignatureDetails() { Log.d("showSignatureDetails()", "..."); } /** * Showing Dialog for downloading file * */ @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_DOWNLOAD_PROGRESS: // we set this to 0 mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Descargando archivo. Por favor espere..."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); mProgressDialog.show(); return mProgressDialog; default: return null; } } // clase para descargar archivo private class DownloadFileAsync extends AsyncTask> { File rootDir = Environment.getExternalStorageDirectory(); /** * Before starting background thread * Show Progress Bar Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); showDialog(DIALOG_DOWNLOAD_PROGRESS); } /** * Downloading file in background thread * */ @Override protected ArrayList doInBackground(String... params) { // para solventar error: // Can't create handler inside thread that has not called Looper.prepare() Looper.prepare(); int count; Log.d("doInBackground", params[0]); // resultArray [0] -> 0 para ruta de archivo valida // resultArray [0] -> 1 ocurrio un error // resultArray [1] -> ruta del archivo descargado // resultArray [1] -> mensaje de la excepcion ArrayList resultArray = new ArrayList(); String outputString = null; try { URL url = new URL(params[0]); int lenghtOfFile = 0; InputStream input = null; if (url.getProtocol().equals("http")){ HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection(); input = new BufferedInputStream(httpConnection.getInputStream()); lenghtOfFile = httpConnection.getContentLength(); }else{ // https // ejecutar la descarga despues de haber aceptado que el certificado // no es conocido if (params[1].equals("true")){ Log.d("***", "params[1].equals(true)"); // descarga del certificado del servidor CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInput = new BufferedInputStream(new FileInputStream(rootDir+"/tibisay.cenditel.gob.ve.pem")); //InputStream caInput = new BufferedInputStream(new FileInputStream(rootDir+"/tibisay.pem")); Certificate ca; try { ca = cf.generateCertificate(caInput); //Log.d("**ca:", ((X509Certificate) ca).getSubjectDN()); //Log.d("*** try: ca.toString()", ca.toString()); } finally { caInput.close(); } Log.d("***", "despues de Certificate ca"); // Create a KeyStore containing our trusted CAs String keyStoreType = KeyStore.getDefaultType(); KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(null, null); keyStore.setCertificateEntry("ca", ca); Log.d("***", "despues de crear KeyStore"); // Create a TrustManager that trusts the CAs in our KeyStore String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore); Log.d("***", "despues de crear TrustManager"); // Create an SSLContext that uses our TrustManager SSLContext context = SSLContext.getInstance("TLS"); context.init(null, tmf.getTrustManagers(), null); Log.d("***", "despues de crear SSLContext"); HttpsURLConnection httpsConnection = (HttpsURLConnection) url.openConnection(); Log.d("***", "despues de crear httpsConnection"); httpsConnection.setSSLSocketFactory(context.getSocketFactory()); Log.d("***", "despues de crear setSSLSocketFactory"); //input = new BufferedInputStream(httpsConnection.getInputStream()); input = httpsConnection.getInputStream(); Log.d("***", "despues de crear BufferedInputStream"); lenghtOfFile = httpsConnection.getContentLength(); Log.d("***", "se acepto la excepcion"); }else{ HttpsURLConnection httpsConnection = (HttpsURLConnection) url.openConnection(); input = new BufferedInputStream(httpsConnection.getInputStream()); lenghtOfFile = httpsConnection.getContentLength(); } } // Crear directorio DownloadedFiles donde se almacenan los archivos descargados // desde un servidor para verificar su firma downloadedDirFiles = Environment.getExternalStorageDirectory() + "/" + getResources().getString(R.string.app_name) + "/" + getResources().getString(R.string.downloaded_dir_files) + "/"; prepareDirectory(downloadedDirFiles); //int lenghtOfFile = conexion.getContentLength(); Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); //InputStream input = new BufferedInputStream(url.openStream()); //InputStream input = new BufferedInputStream(conexion.getInputStream()); //OutputStream output = new FileOutputStream("/mnt/sdcard/TibisayMovil/ExtractedFiles/photo.jpg"); //OutputStream output = new FileOutputStream(new File(rootDir+"/midescarga/", "foto.jpg")); String urlString = url.toString(); String[] values = urlString.split("/"); //OutputStream output = new FileOutputStream(new File(downloadedDirFiles, "acta.2.bdoc")); OutputStream output = new FileOutputStream(new File(downloadedDirFiles, values[values.length-1])); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; publishProgress(""+(int)((total*100)/lenghtOfFile)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); resultArray.add("0"); resultArray.add(output.toString()); } catch (Exception e) { Log.e("Error: ", e.getMessage()); outputString = e.getMessage(); resultArray.add("1"); resultArray.add(e.toString()); } //return null; return resultArray; } protected void onProgressUpdate(String... progress) { Log.d("ANDRO_ASYNC",progress[0]); mProgressDialog.setProgress(Integer.parseInt(progress[0])); } @Override protected void onPostExecute(ArrayList result) { dismissDialog(DIALOG_DOWNLOAD_PROGRESS); //Toast.makeText(getApplicationContext(), "onPostExecute: "+ result.get(0), Toast.LENGTH_LONG).show(); // ocurrio una excepcion if (result.get(0).equals("1")){ //Toast.makeText(getApplicationContext(), "onPostExecute: dentro del if" , Toast.LENGTH_LONG).show(); // ocurrio un problema AlertDialog.Builder builder = new AlertDialog.Builder(BDOCVerifyResultActivity.this); builder.setMessage(result.get(1)).setTitle("Error al descargar el archivo"); builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User clicked OK button Log.d("***", "DownloadFileAsync().execute(urlhttps, true)"); //Toast.makeText(getApplicationContext(), "DownloadFileAsync().execute(urlhttps, true)", Toast.LENGTH_LONG).show(); // pasar como segundo argmento que se acepta que el sertivor es desconocido new DownloadFileAsync().execute(urlhttps, "true"); } }); builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User cancelled the dialog } }); AlertDialog dialog = builder.create(); dialog.show(); }else{ // no ocurrió excepcion Toast.makeText(getApplicationContext(), "Se descargo correctamente el archivo", Toast.LENGTH_LONG).show(); } } } // fin de la clase DownloadFileAsync // funcion para verificar un documento pdf private void doPdfVerification(String pdfToVerify) { Intent intent = new Intent(this, PDFVerifyResultActivity.class); intent.putExtra("pdfToVerify", pdfToVerify); startActivity(intent); finish(); } // fin de doPdfVerification(String fileToVerify) }