diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2020-08-28 20:49:01 +0300 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2020-08-28 20:49:01 +0300 |
commit | 3c63fd4aad97b87ab1f854e5304bbeee5fd76b7d (patch) | |
tree | 96b67aae75600c3f17bad7160c33a2cb7ea0a6ee | |
parent | 48deb41856d599e78ddbfd4e9d5f3ad6ac5bb55b (diff) |
macOS: Revealing files of an identity
Finder is accessed via AppleScript.
-rw-r--r-- | src/app.c | 33 | ||||
-rw-r--r-- | src/app.h | 1 | ||||
-rw-r--r-- | src/gmcerts.c | 22 | ||||
-rw-r--r-- | src/gmcerts.h | 2 | ||||
-rw-r--r-- | src/ui/sidebarwidget.c | 5 |
5 files changed, 60 insertions, 3 deletions
@@ -812,3 +812,36 @@ void openInDefaultBrowser_App(const iString *url) { | |||
812 | start_Process(proc); | 812 | start_Process(proc); |
813 | iRelease(proc); | 813 | iRelease(proc); |
814 | } | 814 | } |
815 | |||
816 | void revealPath_App(const iString *path) { | ||
817 | #if defined (iPlatformApple) | ||
818 | const char *scriptPath = concatPath_CStr(dataDir_App_, "revealfile.scpt"); | ||
819 | iFile *f = newCStr_File(scriptPath); | ||
820 | if (open_File(f, writeOnly_FileMode | text_FileMode)) { | ||
821 | /* AppleScript to select a specific file. */ | ||
822 | write_File(f, collect_Block(newCStr_Block("on run argv\n" | ||
823 | " tell application \"Finder\"\n" | ||
824 | " activate\n" | ||
825 | " reveal POSIX file (item 1 of argv) as text\n" | ||
826 | " end tell\n" | ||
827 | "end run\n"))); | ||
828 | close_File(f); | ||
829 | iProcess *proc = new_Process(); | ||
830 | setArguments_Process( | ||
831 | proc, | ||
832 | iClob(newStringsCStr_StringList( | ||
833 | "/usr/bin/osascript", scriptPath, cstr_String(path), NULL))); | ||
834 | start_Process(proc); | ||
835 | iRelease(proc); | ||
836 | } | ||
837 | iRelease(f); | ||
838 | #elif defined (iPlatformLinux) | ||
839 | { | ||
840 | String path = (fileOrFolder.isDirectory() ? fileOrFolder.toString() | ||
841 | : fileOrFolder.fileNamePath().toString()); | ||
842 | CommandLine({"/usr/bin/xdg-open", path}).execute(); | ||
843 | } | ||
844 | #else | ||
845 | iAssert(0 /* File revealing not implemented on this platform */); | ||
846 | #endif | ||
847 | } | ||
@@ -76,3 +76,4 @@ iLocalDef void postCommandString_App(const iString *command) { | |||
76 | } | 76 | } |
77 | 77 | ||
78 | void openInDefaultBrowser_App (const iString *url); | 78 | void openInDefaultBrowser_App (const iString *url); |
79 | void revealPath_App (const iString *path); | ||
diff --git a/src/gmcerts.c b/src/gmcerts.c index 3c10fff2..09728414 100644 --- a/src/gmcerts.c +++ b/src/gmcerts.c | |||
@@ -448,11 +448,18 @@ iGmIdentity *newIdentity_GmCerts(iGmCerts *d, int flags, iDate validUntil, const | |||
448 | return id; | 448 | return id; |
449 | } | 449 | } |
450 | 450 | ||
451 | void deleteIdentity_GmCerts(iGmCerts *d, iGmIdentity *identity) { | 451 | static const char *certPath_GmCerts_(const iGmCerts *d, const iGmIdentity *identity) { |
452 | /* Only delete the files if we created them. */ | ||
453 | if (!(identity->flags & (temporary_GmIdentityFlag | imported_GmIdentityFlag))) { | 452 | if (!(identity->flags & (temporary_GmIdentityFlag | imported_GmIdentityFlag))) { |
454 | const char *finger = cstrCollect_String(hexEncode_Block(&identity->fingerprint)); | 453 | const char *finger = cstrCollect_String(hexEncode_Block(&identity->fingerprint)); |
455 | const char *filename = concatPath_CStr(cstr_String(&d->saveDir), format_CStr("idents/%s", finger)); | 454 | return concatPath_CStr(cstr_String(&d->saveDir), format_CStr("idents/%s", finger)); |
455 | } | ||
456 | return NULL; | ||
457 | } | ||
458 | |||
459 | void deleteIdentity_GmCerts(iGmCerts *d, iGmIdentity *identity) { | ||
460 | /* Only delete the files if we created them. */ | ||
461 | const char *filename = certPath_GmCerts_(d, identity); | ||
462 | if (filename) { | ||
456 | remove(format_CStr("%s.crt", filename)); | 463 | remove(format_CStr("%s.crt", filename)); |
457 | remove(format_CStr("%s.key", filename)); | 464 | remove(format_CStr("%s.key", filename)); |
458 | } | 465 | } |
@@ -460,6 +467,15 @@ void deleteIdentity_GmCerts(iGmCerts *d, iGmIdentity *identity) { | |||
460 | collect_GmIdentity(identity); | 467 | collect_GmIdentity(identity); |
461 | } | 468 | } |
462 | 469 | ||
470 | const iString *certificatePath_GmCerts(const iGmCerts *d, const iGmIdentity *identity) { | ||
471 | const char *filename = certPath_GmCerts_(d, identity); | ||
472 | if (filename) { | ||
473 | return collectNewFormat_String("%s.crt", filename); | ||
474 | } | ||
475 | return NULL; | ||
476 | } | ||
477 | |||
463 | const iPtrArray *identities_GmCerts(const iGmCerts *d) { | 478 | const iPtrArray *identities_GmCerts(const iGmCerts *d) { |
464 | return &d->idents; | 479 | return &d->idents; |
465 | } | 480 | } |
481 | |||
diff --git a/src/gmcerts.h b/src/gmcerts.h index 37419b9e..db1a6200 100644 --- a/src/gmcerts.h +++ b/src/gmcerts.h | |||
@@ -75,6 +75,8 @@ iGmIdentity * newIdentity_GmCerts (iGmCerts *, int flags, iDate validU | |||
75 | 75 | ||
76 | void deleteIdentity_GmCerts (iGmCerts *, iGmIdentity *identity); | 76 | void deleteIdentity_GmCerts (iGmCerts *, iGmIdentity *identity); |
77 | 77 | ||
78 | const iString * certificatePath_GmCerts (const iGmCerts *, const iGmIdentity *identity); | ||
79 | |||
78 | iGmIdentity * identity_GmCerts (iGmCerts *, unsigned int id); | 80 | iGmIdentity * identity_GmCerts (iGmCerts *, unsigned int id); |
79 | const iGmIdentity * constIdentity_GmCerts (const iGmCerts *, unsigned int id); | 81 | const iGmIdentity * constIdentity_GmCerts (const iGmCerts *, unsigned int id); |
80 | const iGmIdentity * identityForUrl_GmCerts (const iGmCerts *, const iString *url); | 82 | const iGmIdentity * identityForUrl_GmCerts (const iGmCerts *, const iString *url); |
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c index 19886964..25fa3f6a 100644 --- a/src/ui/sidebarwidget.c +++ b/src/ui/sidebarwidget.c | |||
@@ -635,6 +635,11 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) | |||
635 | return iTrue; | 635 | return iTrue; |
636 | } | 636 | } |
637 | else if (isCommand_Widget(w, ev, "ident.reveal")) { | 637 | else if (isCommand_Widget(w, ev, "ident.reveal")) { |
638 | const iString *crtPath = | ||
639 | certificatePath_GmCerts(certs_App(), constHoverIdentity_SidebarWidget_(d)); | ||
640 | if (crtPath) { | ||
641 | revealPath_App(crtPath); | ||
642 | } | ||
638 | return iTrue; | 643 | return iTrue; |
639 | } | 644 | } |
640 | else if (equal_Command(cmd, "ident.delete")) { | 645 | else if (equal_Command(cmd, "ident.delete")) { |