source: dispositivos_moviles/TibisayMovil/src/ve/gob/cenditel/tibisaymovil/SignActivity.java @ c14b8d2

Last change on this file since c14b8d2 was 288126d, checked in by Jose Ruiz <joseruiz@…>, 11 years ago

Manejo de repositorio de certificados y firma con pkcs7

  • Property mode set to 100644
File size: 17.0 KB
Line 
1package ve.gob.cenditel.tibisaymovil;
2
3import java.io.ByteArrayInputStream;
4import java.io.ByteArrayOutputStream;
5import java.io.File;
6import java.io.FileOutputStream;
7import java.io.IOException;
8import java.io.InputStream;
9import java.io.ObjectOutputStream;
10import java.security.PrivateKey;
11import java.security.cert.X509Certificate;
12import java.util.ArrayList;
13import java.util.List;
14
15import com.sun.jersey.api.client.ClientHandlerException;
16import com.sun.jersey.api.client.UniformInterfaceException;
17
18import android.app.Activity;
19import android.content.Context;
20import android.content.Intent;
21import android.content.res.Resources;
22import android.net.Uri;
23import android.os.Bundle;
24import android.os.Environment;
25import android.text.method.ScrollingMovementMethod;
26import android.util.Log;
27import android.view.View;
28import android.view.Window;
29import android.view.View.OnClickListener;
30import android.widget.Button;
31import android.widget.LinearLayout;
32import android.widget.TextView;
33import android.widget.Toast;
34
35
36// prueba de droidtext
37import com.lowagie.text.pdf.*;
38import com.lowagie.text.*;
39
40public class SignActivity extends Activity implements OnClickListener {
41
42    private boolean embedInPdf;
43    private String alias;
44    private List<Uri> uris;
45    private SignView viewHolder;
46    private List<Uri> signed;
47    private List<Uri> unsigned;
48    private ArrayList<Uri> send = new ArrayList<Uri>();
49    private SignTask task;
50
51    /** Called when the activity is first created. */
52    @Override
53    public void onCreate(Bundle savedInstanceState) {
54                //Estilando la barra de titulo
55                final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
56
57        super.onCreate(savedInstanceState);
58        this.embedInPdf = getIntent().getBooleanExtra(IntentExtraField.EMBED_SIGNATURE_IN_PDF, false);
59        this.alias = getIntent().getStringExtra(IntentExtraField.ALIAS);
60        this.uris = getIntent().getParcelableArrayListExtra(IntentExtraField.FILES);
61        this.viewHolder = new SignView();
62
63        this.task = (SignTask) getLastNonConfigurationInstance();
64        if (this.task != null) {
65            this.task.activity = this;
66        } else if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
67            this.task = (SignTask) new SignTask(this, FsUtils.createOutputDirectory(this), this).execute(
68                    uris.toArray(new Uri[uris.size()]));
69        } else {
70            this.viewHolder.noStorageError();
71        }
72
73        if (savedInstanceState != null) {
74            this.send = savedInstanceState.getParcelableArrayList("send");
75            this.viewHolder.done();
76        }
77        //Estilando Barra de titulo
78                if(customTitleSupported)
79                        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);
80    }
81
82    @Override
83    public Object onRetainNonConfigurationInstance() {
84
85        return this.task;
86    }
87
88    @Override
89    protected void onDestroy() {
90        this.task.cancel(true);
91       
92        if (this.task != null) {
93            this.task.activity = null;
94        }
95        super.onDestroy();
96    }
97
98    @Override
99    protected void onSaveInstanceState(Bundle outState) {
100
101        super.onSaveInstanceState(outState);
102        outState.putParcelableArrayList("send", this.send);
103    }
104
105    @Override
106    public void onBackPressed() {
107        Intent back = new Intent(this, TibisayMovilActivity.class);
108        startActivity(back);
109        finish();
110    }
111   
112   
113    @Override
114    public void onClick(View v) {
115
116        switch (v.getId()) {
117
118        case R.id.button_finish_zone:
119                Intent back = new Intent(this, TibisayMovilActivity.class);
120                startActivity(back);
121            finish();
122            break;
123
124        case R.id.button_share_zone:
125            Intent intent = IntentUtils.sendMultipleFiles(this.send);
126            //In case user has no email application.
127            try{
128                startActivity(intent);
129                finish();
130            }catch (android.content.ActivityNotFoundException e){
131                Toast.makeText(this, this.getString(R.string.errornoemail), Toast.LENGTH_SHORT).show();
132            }
133        }
134    }
135
136    private static class SignTask extends AsyncErrorTask<Uri, Void, List<Uri>> {
137
138        private SignActivity activity;
139        private String directory;
140                private Context context;
141
142        public SignTask(SignActivity activity, String directory, Context context) {
143
144            this.activity = activity;
145            this.directory = directory;
146            this.context = context;
147        }
148
149        @Override
150        protected List<Uri> doInBackground(Uri... uris) {
151
152            X509Certificate[] chain;
153            X509Certificate certificate;
154            PrivateKey key;
155            KeyChainStrategy keyChain = KeyChainStrategy.getInstance();
156
157            try {
158                chain = keyChain.getCertificateChain(this.activity.alias);
159                certificate = chain[0];
160                key = keyChain.getPrivateKey(this.activity.alias);
161            } catch (Exception e) {
162                this.cancel(true);
163                chain=null;
164                key=null;
165                certificate=null; 
166                throw new RuntimeException(e);
167            }
168
169            ArrayList<Uri> signed = new ArrayList<Uri>(uris.length);
170           
171            //NEW: History.
172            ArrayList<String> sourcesPath = new ArrayList<String>();
173            ArrayList<String> destinationsPath = new ArrayList<String>();
174           
175            Log.d("SignActivity:SignTask", "antes del for");
176
177            for (Uri uri : uris) {
178                Uri signedUri = null;
179
180                try {
181                    String inputFilename = uri.getPath();
182                    if (this.activity.embedInPdf && FsUtils.isPDF(inputFilename)) {
183                       
184                       
185                        // ********************************************************************
186                        Log.d("SignActivity", "antes de CryptoUtils.signPDF");
187                       
188                        PdfReader reader = new PdfReader(inputFilename);
189                       
190                        Log.d("SignActivity", "new PdfReader");
191                       
192                        int n;
193                        String targetFilename = new File(this.directory, uri.getLastPathSegment()).getPath();
194                        if ((n = targetFilename.lastIndexOf(".")) > targetFilename.lastIndexOf("/")) {
195                            targetFilename = targetFilename.substring(0, n) + "-firma.pdf";
196                        } else {
197                            targetFilename = targetFilename + "-firma.pdf";
198                        }
199                        Log.d("SignActivity", "targetFilename: "+targetFilename);
200                       
201                        FileOutputStream fout = new FileOutputStream(targetFilename);
202                       
203                        PdfStamper stp = PdfStamper.createSignature(reader, fout, '?');
204                       
205                        Log.d("SignActivity", "PdfStamper.createSignature");
206                       
207                        PdfSignatureAppearance sap = stp.getSignatureAppearance();
208                       
209                        Log.d("SignActivity", "stp.getSignatureAppearance()");
210                       
211                        sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
212                       
213                        Log.d("SignActivity", "sap.setCrypto");
214                       
215                        sap.setReason("Firma PKCS12 Android");
216                       
217                        Log.d("SignActivity", "sap.setReason");
218                       
219                        sap.setLocation("Imaginanet");
220                       
221                        Log.d("SignActivity", "sap.setLocation");
222                       
223                        stp.close();
224                       
225                        Log.d("SignActivity", "stp.close");
226                       
227                        //signedUri = FsUtils.saveToFile(fout, targetFilename);
228                        File file = new File(targetFilename);
229                        signedUri = Uri.fromFile(file);
230                       
231                        // ********************************************************************
232                        /*
233                        InputStream signedPDF = CryptoUtils.signPDF(new File(inputFilename), chain, key, this.context);
234                        int n;
235                        String targetFilename = new File(this.directory, uri.getLastPathSegment()).getPath();
236                        if ((n = targetFilename.lastIndexOf(".")) > targetFilename.lastIndexOf("/")) {
237                            targetFilename = targetFilename.substring(0, n) + "-firma.pdf";
238                        } else {
239                            targetFilename = targetFilename + "-firma.pdf";
240                        }
241                        signedUri = FsUtils.saveToFile(signedPDF, targetFilename);
242                        */
243                       
244                        //TODO: signedUri for uri
245                        signed.add(uri);
246                                               
247                        this.activity.send.add(signedUri);
248                    } else {
249                        FsUtils.copyTo(new File(uri.getPath()), this.directory);
250                       
251                       
252                        Log.d("SignActivity", "antes de CryptoUtils.signPKCS7");
253                       
254                        byte[] signature = CryptoUtils.signPKCS7(new File(inputFilename), certificate, key);
255                        int n;
256                        String targetFilename = new File(this.directory, uri.getLastPathSegment()).getPath();
257                        if ((n = targetFilename.lastIndexOf(".")) > targetFilename.lastIndexOf("/")) {
258                            targetFilename = targetFilename.substring(0, n) + ".p7b";
259                        } else {
260                            targetFilename = targetFilename + ".p7b";
261                        }
262                        Log.d("SignActivity", "antes de signedUri");
263                        signedUri = FsUtils.saveToFile(signature, targetFilename);
264                        signed.add(uri);
265                        this.activity.send.add(uri);
266                        this.activity.send.add(signedUri);
267                        Log.d("SignActivity", "despues de signedUri");
268                    }
269                } catch (FileAlreadyExistsException e) {
270                        final Activity act = ((Activity) this.context);
271                        Toast.makeText(act, act.getString(R.string.errorServerNotReachable), Toast.LENGTH_SHORT).show();
272
273                //} catch (DocumentWritingException e) {
274
275                } catch (ClientHandlerException e){
276                        final Activity act = ((Activity) this.context);
277                        act.runOnUiThread(new Runnable() {
278                                  public void run() {
279                                Toast.makeText(act, act.getString(R.string.errorServerNotReachable), Toast.LENGTH_SHORT).show();
280                                  }
281                                });
282                } catch (UniformInterfaceException e) {
283                        final Activity act = ((Activity) this.context);
284                        act.runOnUiThread(new Runnable() {
285                                  public void run() {
286                                Toast.makeText(act, act.getString(R.string.errorConnection), Toast.LENGTH_SHORT).show();
287                                  }
288                                });
289               
290                } catch (Exception e) {
291                        final Activity act = ((Activity) this.context);
292                        Toast.makeText(act, "exception", Toast.LENGTH_SHORT).show();
293                    FsUtils.checkOutOfSpace(e, true);
294                    this.cancel(true);
295                    //throw new RuntimeException(e);
296                } 
297               
298               
299              //HISTORY:
300                //Fixed spaces path error with getPath instead of getEncodedPath
301                finally{
302                    sourcesPath.add(uri.getPath());
303                    if (signedUri!=null)
304                        destinationsPath.add(signedUri.getPath());
305                    else
306                        destinationsPath.add("");
307   
308                       
309                }
310            }
311           
312           
313            // DIR Save history.mbs
314            String[] pathSplit = this.directory.split("/");
315            String dirName = pathSplit[pathSplit.length-1];
316            File targetHistory = new File(this.directory, dirName);
317
318            //File targetHistory = new File(this.directory, "history.mbs");
319
320            String alias = this.activity.alias;
321//            this.saveHistoryData(alias, CertificateUtils.getSubject(chain[0]),
322//                    CertificateUtils.getSerial(chain[0]),
323//                    CertificateUtils.getIssuer(chain[0]),sourcesPath, destinationsPath, targetHistory);
324            //----------
325           
326           
327            return signed;
328        }
329
330       
331       
332       
333       
334       
335                @Override
336        protected void onPostExecute(List<Uri> signed) {
337
338            if (this.activity != null) {
339                if (getError() != null) {
340                    if (getError().getCause() instanceof OutOfSpaceError) {
341                        this.activity.viewHolder.outOfSpaceError();
342                    } else {
343                        this.activity.viewHolder.unknownError();
344                    }
345                    return;
346                }
347                this.activity.signed = signed;
348                if (signed.size() < this.activity.uris.size()) {
349                    this.activity.unsigned = new ArrayList<Uri>(this.activity.uris);
350                    this.activity.unsigned.removeAll(signed);
351                   
352                }
353                this.activity.viewHolder.update();
354   
355            }
356        }
357               
358
359//        private void saveHistoryData(String alias, String subject, String serial, String issuer, List<String> files,
360//                      ArrayList<String> unsigned, File path) {
361//             
362//
363//                HistoryData data = new HistoryData (alias, subject, serial, issuer, files, unsigned);
364//               
365//                ByteArrayOutputStream baos = new ByteArrayOutputStream();
366//                try{
367//                ObjectOutputStream oos = new ObjectOutputStream(baos);
368//                oos.writeObject(data);
369//                oos.flush();
370//                oos.close();
371//                }catch(IOException e){}
372//                InputStream is = new ByteArrayInputStream(baos.toByteArray());
373//               
374//                              try {
375//                                      FsUtils.saveToFile(is, path.getPath());
376//                              } catch (Exception e){}
377//                             
378//                             
379//        }
380               
381               
382    }
383
384    private class SignView {
385
386        public LinearLayout finish;
387        public LinearLayout share;
388        public TextView summary;
389        public TextView summary2;
390        public View signing;
391
392        public SignView () {
393            setContentView(R.layout.sign);
394
395            this.finish = (LinearLayout) findViewById(R.id.button_finish_zone);
396            this.finish.setOnClickListener(SignActivity.this);
397
398            this.share = (LinearLayout) findViewById(R.id.button_share_zone);
399            this.share.setOnClickListener(SignActivity.this);
400
401            this.summary = (TextView) findViewById(R.id.summary);
402            this.summary.setMovementMethod(new ScrollingMovementMethod());
403            this.summary2 = (TextView) findViewById(R.id.summary2);
404            this.summary2.setMovementMethod(new ScrollingMovementMethod());
405
406            this.signing = findViewById(R.id.signing);
407        }
408
409        public void noStorageError() {
410
411            this.summary.setText(R.string.no_storage);
412            this.signing.setVisibility(View.GONE);
413        }
414
415        public void outOfSpaceError() {
416
417            this.summary.setText(R.string.error_no_space);
418            this.signing.setVisibility(View.GONE);
419        }
420
421        public void unknownError() {
422
423            this.summary.setText(R.string.error_unknown);
424            this.signing.setVisibility(View.GONE);
425        }
426
427        public void update() {
428
429            StringBuilder builder = new StringBuilder();
430            StringBuilder builder2 = new StringBuilder();
431            Resources res = SignActivity.this.getResources();
432
433            //Fix Error #75235
434            if (SignActivity.this.signed != null && !SignActivity.this.signed.isEmpty()) {
435//            builder.append(res.getString(R.string.signedfiles));
436            for (Uri file : SignActivity.this.signed) {
437                builder.append("\n - ");
438                builder.append(file.getLastPathSegment());
439            }
440//            builder.append("\n\n");
441            }
442            if (SignActivity.this.unsigned != null && !SignActivity.this.unsigned.isEmpty()) {
443               
444                builder2.append(res.getString(R.string.unsigned2));
445                for (Uri file : SignActivity.this.unsigned) {
446                    builder2.append("\n - ");
447                    builder2.append(file.getLastPathSegment());
448                }
449               
450
451            }
452
453            this.summary.setText(builder);
454            this.summary2.setText(builder2);
455            done();
456        }
457
458        public void done() {
459
460            this.signing.setVisibility(View.GONE);
461            this.share.setEnabled(true);
462        }
463    }
464}
Note: See TracBrowser for help on using the repository browser.