X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fmoonshot-identity-dialog.vala;h=ccec92c5f31368d06b3389f9110ad8177354955e;hb=3483be3d73af11f2bf7ce3318514c4fce50bebf4;hp=3c96d49082477bb4cb2961e681a85a145748f848;hpb=97500f7016809c2c6c168fff8d8f67f0243aa19d;p=moonshot-ui.git diff --git a/src/moonshot-identity-dialog.vala b/src/moonshot-identity-dialog.vala index 3c96d49..ccec92c 100644 --- a/src/moonshot-identity-dialog.vala +++ b/src/moonshot-identity-dialog.vala @@ -42,6 +42,9 @@ static const string CANCEL = STOCK_CANCEL; #endif +// For use when exporting certificates. +static string export_directory = null; + class IdentityDialog : Dialog { private static Gdk.Color white = make_color(65535, 65535, 65535); @@ -69,6 +72,9 @@ class IdentityDialog : Dialog private Label selected_item = null; + // Whether to clear the card's TrustAnchor after the user selects OK + internal bool clear_trust_anchor = false; + public string display_name { get { return displayname_entry.get_text(); } } @@ -199,7 +205,7 @@ class IdentityDialog : Dialog this.show_all(); } - private static Widget make_trust_anchor_box(IdCard id) + private Widget make_trust_anchor_box(IdCard id) { Label ta_label = new Label(_("Trust anchor: ") @@ -218,14 +224,17 @@ class IdentityDialog : Dialog int row = 0; var ta_clear_button = new Button.with_label(_("Clear Trust Anchor")); - ta_clear_button.clicked.connect((w) => {id.trust_anchor = new TrustAnchor();}); + ta_clear_button.clicked.connect((w) => { + clear_trust_anchor = true; + ta_table.set_sensitive(false); + } + ); ta_table.attach(ta_label, 0, 1, row, row + 1, opts, opts, 0, 0); ta_table.attach(ta_clear_button, 1, 2, row, row + 1, fill, fill, 0, 0); row++; - //!!TODO - Label added_label = new Label(_("Added on: N/A")); + Label added_label = new Label(_("Added : " + id.trust_anchor.datetime_added)); added_label.set_alignment(0, 0.5f); ta_table.attach(added_label, 0, 1, row, row + 1, opts, opts, 20, 5); row++; @@ -239,7 +248,7 @@ class IdentityDialog : Dialog ca_cert_label.set_alignment(0, 0.5f); var export_button = new Button.with_label(_("Export Certificate")); //!!TODO! - export_button.clicked.connect((w) => {/* !!TODO! */}); + export_button.clicked.connect((w) => {export_certificate(id);}); ta_table.attach(ca_cert_label, 0, 1, row, row + 1, opts, opts, 20, 0); ta_table.attach(export_button, 1, 2, row, row + 1, fill, fill, 0, 0); @@ -468,5 +477,52 @@ class IdentityDialog : Dialog return services_vbox; } - + private void export_certificate(IdCard id) + { + var dialog = new FileChooserDialog("Save File", + this, + FileChooserAction.SAVE, + _("Cancel"),ResponseType.CANCEL, + _("Save"), ResponseType.ACCEPT, + null); + dialog.set_do_overwrite_confirmation(true); + if (export_directory != null) { + dialog.set_current_folder(export_directory); + } + // Remove slashes from the default filename. + string default_filename = + (id.display_name + ".pem").replace(Path.DIR_SEPARATOR_S, "_"); + dialog.set_current_name(default_filename); + if (dialog.run() == ResponseType.ACCEPT) + { + // Export the certificate in PEM format. + + const string CERT_HEADER = "-----BEGIN CERTIFICATE-----\n"; + const string CERT_FOOTER = "\n-----END CERTIFICATE-----\n"; + + // Strip any embedded newlines in the certificate... + string cert = id.trust_anchor.ca_cert.replace("\n", ""); + + // Re-embed newlines every 64 chars. + string newcert = CERT_HEADER; + while (cert.length > 63) { + newcert += cert[0:64]; + newcert += "\n"; + cert = cert[64:cert.length]; + } + if (cert.length > 0) { + newcert += cert; + } + newcert += CERT_FOOTER; + + string filename = dialog.get_filename(); + var file = File.new_for_path(filename); + var stream = file.replace(null, false, FileCreateFlags.PRIVATE); + stream.write(newcert.data); + + // Save the parent directory to use as default for next save + export_directory = file.get_parent().get_path(); + } + dialog.destroy(); + } }