source: dispositivos_moviles/TibisayMovil/src/ve/gob/cenditel/tibisaymovil/EncryptionCertificatesActivity.java @ 42e7061

Last change on this file since 42e7061 was fd4a5b9, checked in by Antonio Araujo Brett <aaraujo@…>, 11 years ago

*- Implementada funcionalidad de descifrar un archivo. Agregadas actividades para realizar operación de descifrado y mostrar resultados del archivo descifrado.

  • Property mode set to 100644
File size: 17.8 KB
Line 
1package ve.gob.cenditel.tibisaymovil;
2
3import java.io.BufferedInputStream;
4import java.io.File;
5import java.io.FileInputStream;
6import java.io.FileNotFoundException;
7import java.io.IOException;
8import java.io.InputStream;
9import java.security.cert.Certificate;
10import java.security.cert.CertificateException;
11import java.security.cert.CertificateFactory;
12import java.security.cert.X509Certificate;
13import java.util.ArrayList;
14import java.util.HashMap;
15
16
17
18import ee.sk.digidoc.DigiDocException;
19import ee.sk.digidoc.SignedDoc;
20
21
22
23import android.os.Bundle;
24import android.os.Environment;
25import android.app.Activity;
26import android.app.AlertDialog;
27import android.content.Context;
28import android.content.DialogInterface;
29import android.content.Intent;
30import android.util.Log;
31import android.view.LayoutInflater;
32import android.view.Menu;
33import android.view.View;
34import android.view.ViewGroup;
35import android.view.Window;
36import android.view.View.OnClickListener;
37import android.widget.AdapterView;
38import android.widget.BaseAdapter;
39import android.widget.ImageView;
40import android.widget.LinearLayout;
41import android.widget.ListView;
42import android.widget.RadioButton;
43import android.widget.TextView;
44import android.widget.Toast;
45import android.widget.AdapterView.OnItemClickListener;
46
47
48
49
50// activity para gestionar los certificados de destinatarios disponibles para cifrar
51// un archivo
52public class EncryptionCertificatesActivity extends Activity  {
53
54       
55        // layout del boton agregar certificado
56        private LinearLayout button_add;
57
58        // layout del boton eliminar certificado
59        private LinearLayout button_remove;
60   
61        // ListView que mantiene la lista de certificados
62    private ListView certificate_list;
63       
64    // ruta del directorio que almancena los certificados de destinatarios
65    String certificatesDir;
66   
67    // id de certificado seleccionado
68    int certificateSelectedIndex = -1;
69   
70    // lista de rutas absolutas de archivos de certificados
71    HashMap<String, String> certificatesPathHashMap = null;
72   
73   
74    // intent para relanzar al momento de eliminar un certificado
75    Intent starterIntent = null;
76   
77        @Override
78        protected void onCreate(Bundle savedInstanceState) {
79               
80               
81                //Estilando la barra de titulo
82                final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
83               
84                super.onCreate(savedInstanceState);
85                setContentView(R.layout.activity_encryption_certificates);
86               
87                //Estilando Barra de titulo
88                if(customTitleSupported)
89                        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);
90       
91                button_remove = (LinearLayout) this.findViewById(R.id.button_remove_certificate_zone);
92        button_add = (LinearLayout) this.findViewById(R.id.button_add_certificate_zone);
93               
94        final TextView labelRemoveCertificate = (TextView) this.findViewById(R.id.label_certificate_to_remove);
95        labelRemoveCertificate.setVisibility(View.GONE);
96       
97        final LinearLayout layoutCertificateToRemove = (LinearLayout) this.findViewById(R.id.layout_certificate_to_remove); 
98        layoutCertificateToRemove.setVisibility(View.GONE);
99       
100        final TextView certificateToRemove = (TextView) this.findViewById(R.id.filename_text);
101       
102        starterIntent = getIntent();
103       
104            // lista de certificados
105            final ArrayList<RecipientCertificate> certificates = new ArrayList<RecipientCertificate>();
106
107            // asignar ruta de certificados de destinatarios
108                certificatesDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
109                getResources().getString(R.string.app_name) + "/" +
110                getResources().getString(R.string.certificates_dir) + "/";
111                //Toast.makeText(getApplicationContext(), "certificatesDir: "+ certificatesDir, Toast.LENGTH_SHORT).show();
112           
113            // chequear disponibilidad de directorio de certificados
114            if (!checkCertificatesDirectoryAvailability()){
115                return;
116            }
117           
118            // Leer el contenido del directorio de certificados
119            // Crea un arreglo con las lista de archivos contenidos en el directorio cwd
120        File f = new File(certificatesDir);
121            File[] ls = f.listFiles();
122                   
123        if (ls != null) {
124                //Toast.makeText(getApplicationContext(), "numero de archivos: " +Integer.toString(ls.length), Toast.LENGTH_SHORT).show();
125               
126                certificatesPathHashMap = new HashMap<String, String>();
127               
128                String recipient = null;
129                // iterar sobre todos los archivos de certificados
130                // en el KeyStore
131                for (File iFile : ls) {
132                       
133                        try {
134                                        X509Certificate recvCert = SignedDoc.readCertificate(new File(iFile.getAbsolutePath()));
135                                       
136                                        recipient = SignedDoc.getCommonName(recvCert.getSubjectDN().getName());
137                                        //Toast.makeText(getApplicationContext(), "Destinatario: "+ recipient,Toast.LENGTH_SHORT).show();
138                                       
139                                        certificates.add(new RecipientCertificate(recipient));
140                                       
141                                        certificatesPathHashMap.put(recipient, iFile.getAbsolutePath());
142                                       
143                                } catch (DigiDocException e) {                                 
144                                        Toast.makeText(getApplicationContext(), "DigiDocException: "+ e.getMessage(), Toast.LENGTH_SHORT).show();
145                                }
146                }// fin de la iteracion sobre iFile
147               
148                               
149        }
150                   
151       
152        // se crea el adaptador para mostrar los certificados de destinatarios
153                final RecipientCertificateAdapter certificateAdapter = new RecipientCertificateAdapter(EncryptionCertificatesActivity.this, certificates);
154                final ListView certificateListView = (ListView) findViewById(R.id.certificate_list);
155                certificateListView.setAdapter(certificateAdapter);
156                certificateListView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
157                        @Override
158                        public void onItemClick(AdapterView<?> parent, View view,
159                                        int position, long id) {
160                               
161                                Object o = certificateListView.getItemAtPosition(position);
162                                RecipientCertificate c = (RecipientCertificate) o;
163                               
164                                certificateSelectedIndex = position;                           
165                               
166                               
167                                labelRemoveCertificate.setVisibility(View.VISIBLE);
168                                layoutCertificateToRemove.setVisibility(View.VISIBLE);
169                               
170                                certificateToRemove.setText(c.getName());
171                                                               
172                                //Toast.makeText(getApplicationContext(), "click sobre certificado"+ c.getName(), Toast.LENGTH_SHORT).show();                           
173                       
174                        }                       
175                });
176
177       
178       
179       
180                // habilita el click sobre la acción para agregar un certificado nuevo
181        button_add.setOnClickListener(new OnClickListener() 
182        {       
183            public void onClick(View v) 
184            {
185               
186                //Intent oIntent = new Intent(BDOCVerifyResultActivity.this, TibisayMovilActivity.class);
187                        //oIntent.setAction(Intent.ACTION_VIEW);
188                        //oIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
189                        //startActivity(oIntent);
190                       
191                        //finish();
192                Toast.makeText(getApplicationContext(), "Se debe agregar un certificado", Toast.LENGTH_SHORT).show();
193               
194                // llamar a función para cargar certificado
195                loadNewCertificate();
196               
197            }
198        });
199
200        // habilita el click sobre la acción eliminar el certificado seleccionado
201        button_remove.setOnClickListener(new OnClickListener() 
202        {       
203            public void onClick(View v) 
204            {
205                //shareIt();
206               
207                Toast.makeText(getApplicationContext(), "eliminar un certificado", Toast.LENGTH_SHORT).show();
208               
209                if (certificateSelectedIndex == -1){
210                        // 1. Instantiate an AlertDialog.Builder with its constructor
211                        AlertDialog.Builder builder = new AlertDialog.Builder(EncryptionCertificatesActivity.this);
212
213                        // 2. Chain together various setter methods to set the dialog characteristics
214                        builder.setMessage("Debe seleccionar un certificado para eliminarlo.")
215                        .setTitle("Información:");
216
217                        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
218                        public void onClick(DialogInterface dialog, int id) {
219                            // User clicked OK button                                                   
220                                Toast.makeText(getApplicationContext(), "User clicked OK button", Toast.LENGTH_LONG).show();                           
221                        }
222                                });
223                       
224                        // 3. Get the AlertDialog from create()                         
225                        AlertDialog dialog = builder.create();
226                        dialog.show();
227                }else{
228                        // 1. Instantiate an AlertDialog.Builder with its constructor
229                        AlertDialog.Builder builder = new AlertDialog.Builder(EncryptionCertificatesActivity.this);
230
231                        // 2. Chain together various setter methods to set the dialog characteristics
232                        builder.setMessage("¿Está seguro de eliminar el certificado?.")
233                        .setTitle("Información:");
234
235                        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
236                        public void onClick(DialogInterface dialog, int id) {
237                            // User clicked OK button                                                   
238                                Toast.makeText(getApplicationContext(), "User clicked OK button", Toast.LENGTH_LONG).show();
239                               
240                                // funcion para eliminar el certificado
241                                // ...
242                                String pathToErase = certificatesPathHashMap.get(certificateToRemove.getText());
243                               
244                                File file = new File(pathToErase);
245                                boolean deleted = file.delete();
246                                                               
247                                //actualizar la lista de certificados en ListView
248                                certificateAdapter.notifyDataSetChanged();
249                               
250                                labelRemoveCertificate.setVisibility(View.GONE);
251                                        layoutCertificateToRemove.setVisibility(View.GONE);
252                               
253                                // la funcion recreate esta disponible a partir del api 11
254                                if (android.os.Build.VERSION.SDK_INT >= 11)
255                            {
256                                        EncryptionCertificatesActivity.this.recreate();
257                            }
258                            else
259                            {
260                                startActivity(starterIntent);
261                                finish();
262                            }
263                               
264                                Toast.makeText(getApplicationContext(), "**archivo a borrar: "+pathToErase, Toast.LENGTH_LONG).show();
265                               
266                               
267                               
268                        }
269                                });
270                       
271                        builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
272                        public void onClick(DialogInterface dialog, int id) {
273                            // User cancelled the dialog
274                                Toast.makeText(getApplicationContext(), "User clicked Cancel button", Toast.LENGTH_LONG).show();
275                               
276                                labelRemoveCertificate.setVisibility(View.GONE);
277                                        layoutCertificateToRemove.setVisibility(View.GONE);
278                        }
279                                });
280                        // 3. Get the AlertDialog from create()                         
281                        AlertDialog dialog = builder.create();
282                        dialog.show();
283                }
284            }
285        });
286               
287       
288               
289        } // fin de funcion onCreate()
290
291        @Override
292        public boolean onCreateOptionsMenu(Menu menu) {
293                // Inflate the menu; this adds items to the action bar if it is present.
294                getMenuInflater().inflate(R.menu.encryption_certificates, menu);
295                return true;
296        }
297
298       
299        /**
300     * Carga un nuevo certificado al lanzar CertificateToLoadActivity.
301     * @return void
302     */
303        public void loadNewCertificate() {
304                Intent intent = new Intent(this, CertificateToLoadActivity.class);
305                startActivity(intent);
306                finish(); 
307               
308        }
309       
310       
311        // clase que abstrae un certificado de destinatario
312        // se utiliza para mostrar en la interfaz grafica cada certificado
313        // de destinatario almancenado por la aplicacion
314        public class RecipientCertificate {
315                private String mName;
316               
317                public RecipientCertificate(String name){
318                        mName = name;
319                }
320               
321                public void setName(String name) {
322                        this.mName = name;
323                }
324               
325                public String getName() {
326                        return mName;
327                }       
328        } // fin de clase RecipientCertificate
329       
330        // clase que abstrae el adaptador para llenar el ListView de documentos que
331        // se encuentran dentro del contenedor BDOC
332        private class RecipientCertificateAdapter extends BaseAdapter {
333
334                private ArrayList<RecipientCertificate> mRecipientCertificateList;
335                private LayoutInflater lInflater;
336               
337                private RecipientCertificateAdapter(Context context, ArrayList<RecipientCertificate> certificates) {
338                        this.lInflater = LayoutInflater.from(context);
339                        this.mRecipientCertificateList = certificates;
340                       
341                }
342               
343               
344                @Override
345                public int getCount() {                 
346                        return mRecipientCertificateList.size();
347                }
348
349                @Override
350                public Object getItem(int position) {                   
351                        return mRecipientCertificateList.get(position);
352                }
353
354                @Override
355                public long getItemId(int position) {                   
356                        return position;
357                }
358
359                @Override
360                public View getView(int position, View convertView, ViewGroup parent) {
361                        ViewHolder container = null;
362                       
363                        if (convertView == null){
364                                container = new ViewHolder();
365                                convertView = lInflater.inflate(R.layout.recipient_certificate_info, null);
366                               
367                                container.filename_text = (TextView) convertView.findViewById(R.id.filename_text);
368                                //container.filename_modified = (TextView) convertView.findViewById(R.id.filename_modified);
369                                container.type_image = (ImageView) convertView.findViewById(R.id.type_image);
370                                convertView.setTag(container);
371                        }else{
372                                container = (ViewHolder) convertView.getTag();
373                        }
374                       
375                        RecipientCertificate certificate = (RecipientCertificate) getItem(position);
376                        container.filename_text.setText(certificate.getName());
377                        //container.filename_modified.setText(certificate.getName());
378                        container.type_image.setImageResource(R.drawable.ic_archivo);
379                       
380                        return convertView;
381                }
382       
383               
384                class ViewHolder{
385                      TextView filename_text;
386                      //TextView filename_modified;
387                      ImageView type_image;
388                   }
389               
390        } // fin de la clase RecipientCertificateAdapter
391       
392       
393       
394       
395        /**
396     * Prepara directorio
397     * @return boolean
398     */
399    boolean prepareDirectory(String dir) 
400    {
401        try
402        {
403            if (makedirs(dir)) 
404            {
405                return true;
406            } else {
407                return false;
408            }
409        } catch (Exception e) 
410        {
411            e.printStackTrace();
412            Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", Toast.LENGTH_LONG).show();
413            return false;
414        }
415    }
416   
417    /**
418     * Crea directorio utilizando la variable tmpDir
419     * @return boolean
420     */
421    private boolean makedirs(String dir) 
422    {
423        //File tempdir = new File(extractedDirFiles);
424        File tempdir = new File(dir);
425        if (!tempdir.exists())
426            tempdir.mkdirs();
427        return (tempdir.isDirectory());
428    }
429       
430    /**
431     * Chequea la disponibilidad del directorio de /TibisayMovil/CertificatesToEncrypt
432     * @return boolean
433     */
434    private boolean checkCertificatesDirectoryAvailability() {
435        // verificar acceso al directorio /mnt/sdcard/TibisayMovil/CertificatesToEncrypt
436            boolean mExternalStorageAvailable = false;
437            boolean mExternalStorageWriteable = false;
438            String state = Environment.getExternalStorageState();
439           
440                AlertDialog.Builder builder = new AlertDialog.Builder(EncryptionCertificatesActivity.this);
441               
442           
443            if (Environment.MEDIA_MOUNTED.equals(state)) {
444                // We can read and write the media
445                mExternalStorageAvailable = mExternalStorageWriteable = true;
446                Toast.makeText(getApplicationContext(), "We can read and write the media", Toast.LENGTH_SHORT).show();
447               
448                // Crear directorio CertificatesToEncrypt donde se almacenan los certificados de
449                // destinatarios para cifrado
450                        /*
451                String certificatesDir = Environment.getExternalStorageDirectory() + "/" +
452                        getResources().getString(R.string.app_name) + "/" +
453                        getResources().getString(R.string.certificates_dir) + "/";
454                        */                     
455                        if (prepareDirectory(certificatesDir)){                         
456                                return true;
457                        }else{
458                                builder.setMessage("No existe el directorio "+certificatesDir+" para almacenar certificados.").setTitle("Error:");
459               
460                        }
461                       
462            } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
463                // We can only read the media
464                mExternalStorageAvailable = true;
465                mExternalStorageWriteable = false;
466                Toast.makeText(getApplicationContext(), "We can only read the media", Toast.LENGTH_SHORT).show();
467               
468                builder.setMessage("Directorio "+certificatesDir+ " montado de solo lectura. No se pueden almancenar certificados.").setTitle("Error:");
469       
470               
471            } else {
472                // Something else is wrong. It may be one of many other states, but all we need
473                //  to know is we can neither read nor write
474                mExternalStorageAvailable = mExternalStorageWriteable = false;
475                Toast.makeText(getApplicationContext(), "we can neither read nor write", Toast.LENGTH_SHORT).show();
476               
477                builder.setMessage("Directorio "+certificatesDir+ " no está disponible. No se pueden almancenar certificados.").setTitle("Error:");                     
478       
479            }
480           
481           
482        builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
483                public void onClick(DialogInterface dialog, int id) {
484               // User cancelled the dialog
485               EncryptionCertificatesActivity.this.finish();
486            }
487        });
488            AlertDialog dialog = builder.create();
489            dialog.show();
490            return false;
491    }
492
493
494   
495       
496} // fin de la activity
Note: See TracBrowser for help on using the repository browser.