public override NSMenu MenuForEvent(NSEvent theEvent) { CGPoint pt = this.ConvertPointFromView(theEvent.LocationInWindow, null); _selectedRow = this.GetRow(pt); NSTableViewDataSource ds = (NSTableViewDataSource)this.DataSource; NSMenu menu = new NSMenu(); if (_selectedRow >= (nint)0) { if (ds is NodesListView) { string data = (ds as NodesListView).Entries [(int)_selectedRow].DisplayName; switch (data) { case "Private Entities": NSMenuItem addPrivateEntity = new NSMenuItem("Add Private Entity", ((ds as NodesListView).Entries [(int)_selectedRow] as VecsPrivateKeysNode).AddPrivateKeyHandler); menu.AddItem(addPrivateEntity); break; case "Secret Keys": NSMenuItem createCertificate = new NSMenuItem("Add Secret Key", ((ds as NodesListView).Entries [(int)_selectedRow] as VecsSecretKeysNode).AddSecretKey); menu.AddItem(createCertificate); break; case "Trusted Certs": NSMenuItem createSigningRequest = new NSMenuItem("Create Certificate", ((ds as NodesListView).Entries [(int)_selectedRow] as VecsTrustedCertsNode).AddCertificate); menu.AddItem(createSigningRequest); break; default: break; } } else if (ds is CertificateDetailsListView) { CertificateDetailsListView lw = ds as CertificateDetailsListView; CertDTO cert = lw.Entries [(int)_selectedRow]; NSMenuItem showCert = new NSMenuItem("Show Certificate", (object sender, EventArgs e) => CertificateService.DisplayX509Certificate2(this, cert.Cert)); menu.AddItem(showCert); NSMenuItem deleteEntry = new NSMenuItem("Delete", (object sender, EventArgs e) => { UIErrorHelper.CheckedExec(delegate() { if (UIErrorHelper.ConfirmDeleteOperation("Are you sure?") == true) { using (var session = new VecsStoreSession(lw.ServerDto.VecsClient, lw.Store, "")) { session.DeleteCertificate(cert.Alias); } lw.Entries.Remove(cert); UIErrorHelper.ShowAlert("", "Successfully deleted the entry."); NSNotificationCenter.DefaultCenter.PostNotificationName("ReloadServerData", this); } }); }); menu.AddItem(deleteEntry); } NSMenu.PopUpContextMenu(menu, theEvent, theEvent.Window.ContentView); } return(base.MenuForEvent(theEvent)); }
public IEnumerable<CertDTO> GetStoreEntries (VecsAdaptor.CertEntryType entryType) { var lst = new List<CertDTO> (); UInt32 certCount = 0; IntPtr ptrCerts = IntPtr.Zero; var hEnumContext = new IntPtr (); try { var result = VecsAdaptor.VecsGetEntryCount (StoreHandle, out certCount); VecsError.Check (result); result = VecsAdaptor.VecsBeginEnumEntries ( _hStore, certCount, VecsAdaptor.EntryInfoLevel.Level2, out hEnumContext); VecsError.Check (result); if (hEnumContext != null) { result = VecsAdaptor.VecsEnumEntriesA ( hEnumContext, out ptrCerts, out certCount); VecsError.Check (result); int sz = Marshal.SizeOf (typeof(VecsAdaptor.VECS_CERT_ENTRY)); var certArray = new VecsAdaptor.VECS_CERT_ENTRY[certCount]; for (UInt32 i = 0; i < certCount; i++) { certArray [i] = (VecsAdaptor.VECS_CERT_ENTRY)Marshal.PtrToStructure ( new IntPtr (ptrCerts.ToInt64 () + (sz * i)), typeof(VecsAdaptor.VECS_CERT_ENTRY)); var certString = Marshal.PtrToStringAnsi ( certArray [i].pszCertificate); var aliasString = Marshal.PtrToStringAnsi ( certArray [i].pszAlias); var passwordString = Marshal.PtrToStringAnsi ( certArray [i].pszPassword); //if(!string.IsNullOrEmpty(aliasString)) // File.WriteAllText("c:\\temp\\" + aliasString, certString); if (certArray [i].entryType != (int)entryType) { continue; } var dto = new CertDTO { Alias = aliasString != null ? aliasString : "" }; lst.Add (dto); try { if (!string.IsNullOrEmpty (certString)) { dto.Cert = certString.GetX509Certificate2FromString (); } if (!string.IsNullOrEmpty (passwordString)) { dto.Password = passwordString; } } catch (Exception) { } } } } catch (Exception e) { throw e; } finally { if (hEnumContext != IntPtr.Zero) { VecsAdaptor.VecsEndEnumEntries (hEnumContext); } if (ptrCerts != IntPtr.Zero) { VecsAdaptor.VecsFreeCertEntryArrayA (ptrCerts, certCount); } } return lst; }