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(); 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) }