public FormSignatureDetails(X509Certificate2 certificate, ChainDocumentStatus status) { signatureCertificate = certificate; chainStatus = status; InitializeComponent(); }
public bool loadSigners() { bool checkCRL = Convert.ToBoolean(assinadorRegistry.GetValue("ConsultCRL")); if (documents == null) { return(false); } this.Cursor = Cursors.WaitCursor; lstSigners.Items.Clear(); lstSigners.Groups.Clear(); if (lstDocuments.SelectedItems.Count > 0) { List <string> problematicFoundDocuments = new List <string>(); Signers commonSigners = new Signers(); List <X509Certificate2> nonconformitySigners = new List <X509Certificate2>(); List <X509Certificate2> conformitySigners = new List <X509Certificate2>(); Hashtable certificatesList = new Hashtable(); foreach (FileHistory filepath in selectedDocuments) { try { loadDigitalSignature(filepath.NewPath); if (digitalSignature.error) { if (digitalSignature.DocumentType.Equals(Types.XpsDocument)) { digitalSignature.xpsDocument.Close(); } else { digitalSignature.package.Close(); } this.Cursor = Cursors.Arrow; return(false); } invalidSignatures.Clear(); if (!digitalSignature.Validate()) { invalidSignatures = digitalSignature.InvalidDigitalSignatureHolderNames; } ListViewGroup sigaturesGroup = new ListViewGroup(Path.GetFileName(filepath.NewPath)); lstSigners.Groups.Add(sigaturesGroup); foreach (Signer signer in digitalSignature.signers) { string[] signature = new string[5]; signature[0] = signer.name; signature[1] = signer.issuer; signature[2] = signer.uri; signature[3] = signer.date; signature[4] = signer.serialNumber; X509Certificate2 signatureCertificate = signer.signerCertificate; if ((!nonconformitySigners.Contains(signatureCertificate)) && (!conformitySigners.Contains(signatureCertificate))) { if (!CertificateUtils.ValidateCertificate(signatureCertificate, checkCRL, false) ?? true) { nonconformitySigners.Add(signatureCertificate); } else { conformitySigners.Add(signatureCertificate); } certificatesList.Add(signatureCertificate, CertificateUtils.buildStatus); } X509ChainStatus chainStatus = new X509ChainStatus(); chainStatus = (X509ChainStatus)certificatesList[signatureCertificate]; ChainDocumentStatus chainDocumentStatus = new ChainDocumentStatus(); int signatureIcon; if (!(invalidSignatures.Contains(signature[0]) && invalidSignatures.Contains(signature[1]) && invalidSignatures.Contains(signature[2]) && invalidSignatures.Contains(signature[3]))) { chainDocumentStatus = new ChainDocumentStatus(chainStatus, null); if (nonconformitySigners.Contains(signatureCertificate)) { signatureIcon = 1; } else { signatureIcon = 2; } } else { signatureIcon = 0; chainDocumentStatus = new ChainDocumentStatus(chainStatus, ChainDocumentStatus.ChainDocumentStatusFlags.CorruptedDocument); } ListViewItem newSignerItem = new ListViewItem(); //INDEX newSignerItem.Text = signature[0].ToString(); //0 signer.name newSignerItem.ImageIndex = signatureIcon; newSignerItem.Group = sigaturesGroup; newSignerItem.SubItems.Add(signature[1]); //1 signer.issuer newSignerItem.SubItems.Add(signature[3]); //2 signer.date newSignerItem.SubItems.Add(filepath.NewPath); //3 signer.path newSignerItem.SubItems.Add(signature[4]); //4 signer.serialNumber newSignerItem.SubItems.Add(signature[2]); //5 signer.URI newSignerItem.SubItems.Add(filepath.OriginalPath); //6 signer.originalPath ListViewItem.ListViewSubItem chainSt = new ListViewItem.ListViewSubItem(); chainSt.Text = ""; chainSt.Tag = (object)chainDocumentStatus; newSignerItem.SubItems.Add(chainSt); //7 Tag chainStatus newSignerItem.Tag = (object)signatureCertificate; //Tag signer.signerCertificate lstSigners.Items.Add(newSignerItem); if (lstSigners.Groups.Count == 1) { Signer sgn = new Signer(); sgn.name = signature[0].ToString(); sgn.issuer = signature[1].ToString(); sgn.serialNumber = signature[4].ToString(); sgn.signerCertificate = signatureCertificate; if (!commonSigners.Contains(sgn)) { commonSigners.Add(sgn); } } } Signers commonRecentlyFoundSigners = new Signers(); foreach (ListViewItem lst in sigaturesGroup.Items) { foreach (Signer sgn in commonSigners) { if (lst.SubItems[0].Text == sgn.name && lst.SubItems[1].Text == sgn.issuer && lst.SubItems[4].Text == sgn.serialNumber && !commonRecentlyFoundSigners.Contains(sgn)) { commonRecentlyFoundSigners.Add(sgn); } } } commonSigners = commonRecentlyFoundSigners; } #region catch catch (IOException) { if (MessageBox.Show("Erro ao abrir o documento " + System.IO.Path.GetFileName(filepath.NewPath) + ".\nCertifique-se de que o documento não foi movido ou está em uso por outra aplicação.\n\nDeseja retirá-lo da lista?", System.IO.Path.GetFileName(filepath.NewPath), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); lstDocuments.Items.Remove(item); } } } else { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); item.Selected = false; if (lstDocuments.SelectedItems.Count > 0) { lstDocuments.FocusedItem = lstDocuments.SelectedItems[0]; } } } } } catch (FileFormatException) { if (MessageBox.Show("Erro ao abrir o documento " + System.IO.Path.GetFileName(filepath.NewPath) + ".\nSeu conteúdo está corrompido, talvez seja um arquivo temporário.\n\nDeseja retirá-lo da lista?", System.IO.Path.GetFileName(filepath.NewPath), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); lstDocuments.Items.Remove(item); } } } else { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); item.Selected = false; if (lstDocuments.SelectedItems.Count > 0) { lstDocuments.FocusedItem = lstDocuments.SelectedItems[0]; } } } } } catch (ArgumentNullException) { if (MessageBox.Show("O Documento " + System.IO.Path.GetFileName(filepath.NewPath) + "não está disponível para abertura.\n\nDeseja retirá-lo da lista?", System.IO.Path.GetFileName(filepath.NewPath), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); lstDocuments.Items.Remove(item); } } } else { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); item.Selected = false; if (lstDocuments.SelectedItems.Count > 0) { lstDocuments.FocusedItem = lstDocuments.SelectedItems[0]; } } } } } catch (OpenXmlPackageException) { if (MessageBox.Show("O Documento " + System.IO.Path.GetFileName(filepath.NewPath) + " não é um pacote Open XML válido.\n\nDeseja retirá-lo da lista?", System.IO.Path.GetFileName(filepath.NewPath), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); lstDocuments.Items.Remove(item); } } } else { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); item.Selected = false; if (lstDocuments.SelectedItems.Count > 0) { lstDocuments.FocusedItem = lstDocuments.SelectedItems[0]; } } } } } catch (Exception err) { if (MessageBox.Show("Houve um problema na listagem do seguinte documento:\n " + System.IO.Path.GetFileName(filepath.NewPath) + "\n" + err.Message.Substring(0, err.Message.IndexOf(".") + 1) + "\n\nDeseja excluí-lo da lista?", System.IO.Path.GetFileName(filepath.NewPath), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); lstDocuments.Items.Remove(item); } } } else { foreach (ListViewItem item in lstDocuments.Items) { if (item.SubItems[2].Text == filepath.NewPath) { problematicFoundDocuments.Add(item.SubItems[2].Text); item.Selected = false; if (lstDocuments.SelectedItems.Count > 0) { lstDocuments.FocusedItem = lstDocuments.SelectedItems[0]; } } } } } #endregion } if (lstDocuments.SelectedItems.Count > 1) { ListViewGroup commonSigaturesGroup = new ListViewGroup("commonSignatures", "Assinaturas em Comum"); lstSigners.Groups.Insert(0, commonSigaturesGroup); foreach (Signer sig in commonSigners) { ListViewItem newCommonSignerItem = new ListViewItem(); newCommonSignerItem.Text = sig.name; //0 signer.name newCommonSignerItem.Group = commonSigaturesGroup; newCommonSignerItem.SubItems.Add(sig.issuer); //1 signer.issuer newCommonSignerItem.SubItems.Add(""); //2 signer.date newCommonSignerItem.SubItems.Add(""); //3 signer.path newCommonSignerItem.SubItems.Add(sig.serialNumber); //4 signer.serialNumber newCommonSignerItem.SubItems.Add(""); //5 signer.URI newCommonSignerItem.SubItems.Add(""); //6 signer.originalPath newCommonSignerItem.Tag = (object)sig.signerCertificate; //Tag signer.signerCertificate lstSigners.Items.Add(newCommonSignerItem); } } selectedDocuments.Clear(); foreach (ListViewItem lvi in lstDocuments.SelectedItems) { FileHistory fh = new FileHistory(lvi.SubItems[3].Text, lvi.SubItems[2].Text); selectedDocuments.Add(fh); } } if (lstDocuments.SelectedItems.Count > 0) { loadFileDescription(); if (digitalSignature.DocumentType.Equals(Types.XpsDocument)) { digitalSignature.xpsDocument.Close(); } else { digitalSignature.package.Close(); } } else if (lstDocuments.Items.Count == 0) { MessageBox.Show("Os arquivos selecionados não são pacotes Open XML válidos.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); } this.Cursor = Cursors.Arrow; return(true); }