Add support for gpg-encrypted files

This commit is contained in:
Nikita Ivanov 2022-07-13 14:59:22 +05:00
parent 06ae795b4e
commit eb43b4e836
No known key found for this signature in database
GPG Key ID: 6E656AC5B97B5133
10 changed files with 109 additions and 73 deletions

View File

@ -54,6 +54,7 @@ For example, you only need either `elinks`, `lynx` or
| archive | `atool` |
| diff | `colordiff` `delta` `diff-so-fancy` |
| directory | `ls` |
| gpg-encrypted | `gpg` |
| html | `elinks` `lynx` `w3m` |
| image | `ueberzug` `chafa` |
| json | `jq` |

View File

@ -24,7 +24,7 @@ function process_file(file, i, line, arr, t, p, p_len) {
return
}
if (match(line, /^#\s*(\w+):\s*(.*)/, arr) == 0)
if (match(line, /^#\s*([a-zA-Z0-9_-]+):\s*(.*)/, arr) == 0)
return
t = arr[1]

View File

@ -113,6 +113,9 @@ T}
directory T{
ls
T}
gpg-encrypted T{
gpg
T}
html T{
elinks lynx w3m
T}
@ -316,6 +319,13 @@ Print only text and do not use any image previewing method.
.B nosymlinkinfo
Do not print resolved path of symbolic links.
.
.TP
.B showgpg
Preview
.BR gpg (1)
encrypted files.
Filename must have \(lq.gpg\(rq extension.
.
.SS Defining custom previews
.
A snippet below defines a new preview with name

View File

@ -10,88 +10,89 @@
*/
#define PNAME(n) prev_scr_##n##_sh
#define PR(e, t, s, n) { #n, e, t, s, PNAME(n), 0, 0, LEN(PNAME(n)) }
#define PR(e, t, s, n, a) { #n, e, t, s, PNAME(n), 0, 0, a, LEN(PNAME(n)) }
Preview b_previews[] = {
PR(NULL, NULL, NULL, any),
PR(NULL, NULL, NULL, any, PREV_ATTR_NONE),
PR("md", NULL, NULL, mdcat),
PR("torrent", NULL, NULL, torrent),
PR("odt", NULL, NULL, odt),
PR("md", NULL, NULL, mdcat, PREV_ATTR_NONE),
PR("torrent", NULL, NULL, torrent, PREV_ATTR_NONE),
PR("odt", NULL, NULL, odt, PREV_ATTR_NONE),
PR(NULL, "text", NULL, bat),
PR(NULL, "text", NULL, highlight),
PR(NULL, "text", NULL, source_highlight),
PR(NULL, "text", NULL, cat),
PR(NULL, "text", NULL, bat, PREV_ATTR_NONE),
PR(NULL, "text", NULL, highlight, PREV_ATTR_NONE),
PR(NULL, "text", NULL, source_highlight, PREV_ATTR_NONE),
PR(NULL, "text", NULL, cat, PREV_ATTR_NONE),
PR(NULL, "image", NULL, image),
PR(NULL, "video", NULL, video),
PR(NULL, "image", NULL, image, PREV_ATTR_NONE),
PR(NULL, "video", NULL, video, PREV_ATTR_NONE),
PR(NULL, "application", "pdf", pdf),
PR(NULL, "application", "json", jq),
PR(NULL, "application", "pdf", pdf, PREV_ATTR_NONE),
PR(NULL, "application", "json", jq, PREV_ATTR_NONE),
PR(NULL, "inode", "directory", ls),
PR(NULL, "inode", "symlink", symlink),
PR(NULL, "inode", "directory", ls, PREV_ATTR_NONE),
PR(NULL, "inode", "symlink", symlink, PREV_ATTR_NONE),
PR(NULL, "text", "html", elinks),
PR(NULL, "text", "html", lynx),
PR(NULL, "text", "html", w3m),
PR(NULL, "text", "html", elinks, PREV_ATTR_NONE),
PR(NULL, "text", "html", lynx, PREV_ATTR_NONE),
PR(NULL, "text", "html", w3m, PREV_ATTR_NONE),
PR(NULL, "text", "x-diff", delta),
PR(NULL, "text", "x-patch", delta),
PR(NULL, "text", "x-diff", diff_so_fancy),
PR(NULL, "text", "x-patch", diff_so_fancy),
PR(NULL, "text", "x-diff", colordiff),
PR(NULL, "text", "x-patch", colordiff),
PR(NULL, "text", "x-diff", delta, PREV_ATTR_NONE),
PR(NULL, "text", "x-patch", delta, PREV_ATTR_NONE),
PR(NULL, "text", "x-diff", diff_so_fancy, PREV_ATTR_NONE),
PR(NULL, "text", "x-patch", diff_so_fancy, PREV_ATTR_NONE),
PR(NULL, "text", "x-diff", colordiff, PREV_ATTR_NONE),
PR(NULL, "text", "x-patch", colordiff, PREV_ATTR_NONE),
PR("tar.gz", NULL, NULL, atool),
PR("tgz", NULL, NULL, atool),
PR("tgz", NULL, NULL, atool),
PR("tar.gz", NULL, NULL, atool),
PR("tgz", NULL, NULL, atool),
PR("tar.bz", NULL, NULL, atool),
PR("tbz", NULL, NULL, atool),
PR("tar.bz2", NULL, NULL, atool),
PR("tbz2", NULL, NULL, atool),
PR("tar.Z", NULL, NULL, atool),
PR("tZ", NULL, NULL, atool),
PR("tar.lzo", NULL, NULL, atool),
PR("tzo", NULL, NULL, atool),
PR("tar.lz", NULL, NULL, atool),
PR("tlz", NULL, NULL, atool),
PR("tar.xz", NULL, NULL, atool),
PR("txz", NULL, NULL, atool),
PR("tar.7z", NULL, NULL, atool),
PR("t7z", NULL, NULL, atool),
PR("tar", NULL, NULL, atool),
PR("zip", NULL, NULL, atool),
PR("jar", NULL, NULL, atool),
PR("war", NULL, NULL, atool),
PR("rar", NULL, NULL, atool),
PR("lha", NULL, NULL, atool),
PR("lzh", NULL, NULL, atool),
PR("7z", NULL, NULL, atool),
PR("alz", NULL, NULL, atool),
PR("ace", NULL, NULL, atool),
PR("a", NULL, NULL, atool),
PR("arj", NULL, NULL, atool),
PR("arc", NULL, NULL, atool),
PR("rpm", NULL, NULL, atool),
PR("deb", NULL, NULL, atool),
PR("cab", NULL, NULL, atool),
PR("gz", NULL, NULL, atool),
PR("bz", NULL, NULL, atool),
PR("bz2", NULL, NULL, atool),
PR("Z", NULL, NULL, atool),
PR("lzma", NULL, NULL, atool),
PR("lzo", NULL, NULL, atool),
PR("lz", NULL, NULL, atool),
PR("xz", NULL, NULL, atool),
PR("rz", NULL, NULL, atool),
PR("lrz", NULL, NULL, atool),
PR("7z", NULL, NULL, atool),
PR("cpio", NULL, NULL, atool),
PR("tar.gz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tgz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tgz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar.gz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tgz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar.bz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tbz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar.bz2", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tbz2", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar.Z", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tZ", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar.lzo", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tzo", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar.lz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tlz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar.xz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("txz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar.7z", NULL, NULL, atool, PREV_ATTR_NONE),
PR("t7z", NULL, NULL, atool, PREV_ATTR_NONE),
PR("tar", NULL, NULL, atool, PREV_ATTR_NONE),
PR("zip", NULL, NULL, atool, PREV_ATTR_NONE),
PR("jar", NULL, NULL, atool, PREV_ATTR_NONE),
PR("war", NULL, NULL, atool, PREV_ATTR_NONE),
PR("rar", NULL, NULL, atool, PREV_ATTR_NONE),
PR("lha", NULL, NULL, atool, PREV_ATTR_NONE),
PR("lzh", NULL, NULL, atool, PREV_ATTR_NONE),
PR("7z", NULL, NULL, atool, PREV_ATTR_NONE),
PR("alz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("ace", NULL, NULL, atool, PREV_ATTR_NONE),
PR("a", NULL, NULL, atool, PREV_ATTR_NONE),
PR("arj", NULL, NULL, atool, PREV_ATTR_NONE),
PR("arc", NULL, NULL, atool, PREV_ATTR_NONE),
PR("rpm", NULL, NULL, atool, PREV_ATTR_NONE),
PR("deb", NULL, NULL, atool, PREV_ATTR_NONE),
PR("cab", NULL, NULL, atool, PREV_ATTR_NONE),
PR("gz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("bz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("bz2", NULL, NULL, atool, PREV_ATTR_NONE),
PR("Z", NULL, NULL, atool, PREV_ATTR_NONE),
PR("lzma", NULL, NULL, atool, PREV_ATTR_NONE),
PR("lzo", NULL, NULL, atool, PREV_ATTR_NONE),
PR("lz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("xz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("rz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("lrz", NULL, NULL, atool, PREV_ATTR_NONE),
PR("7z", NULL, NULL, atool, PREV_ATTR_NONE),
PR("cpio", NULL, NULL, atool, PREV_ATTR_NONE),
PR("gpg", NULL, NULL, gpg, PREV_ATTR_EXT_SHORT),
};
/* vim: set nowrap: */

6
sh/prev/gpg.sh Normal file
View File

@ -0,0 +1,6 @@
# gpg-encrypted: gpg
# "showgpg" option must be enabled for this preview to work
[ -z "$showgpg" ] && exit 127
gpg -d -- "$f" 2>&1

View File

@ -51,6 +51,7 @@ static struct Option options[] = {
DEF_OPTION_BOOL(forcechafa),
DEF_OPTION_BOOL(noimages),
DEF_OPTION_BOOL(nosymlinkinfo),
DEF_OPTION_BOOL(showgpg),
};
static void any_type_null(char **s)
@ -78,6 +79,7 @@ static void add_preview(char *name, char *script, char *type, char *subtype,
.type = type,
.subtype = subtype,
.ext = ext,
.attrs = PREV_ATTR_NONE,
.order = 1 /* custom previews are always prioritized */
};

View File

@ -15,6 +15,7 @@ struct CTPV {
char *server_id_s;
struct {
int forcekitty, forcekittyanim, forcechafa, noimages, nosymlinkinfo;
int showgpg;
} opts;
};

View File

@ -89,11 +89,19 @@ static void break_mimetype(char *mimetype, char **type, char **subtype)
static Preview *find_preview(const char *type, const char *subtype, const char *ext, size_t *i)
{
Preview *p;
const char *rext;
for (; *i < previews.len; (*i)++) {
p = previews.list[*i];
if (p->ext && strcmpnull(p->ext, ext) != 0)
if (p->attrs & PREV_ATTR_EXT_SHORT) {
if ((rext = strrchr(ext, '.')))
rext += 1;
} else {
rext = ext;
}
if (p->ext && strcmpnull(p->ext, rext) != 0)
continue;
if (p->type && strcmpnull(p->type, type) != 0)

View File

@ -7,9 +7,15 @@
#define MIMETYPE_MAX 64
enum PreviewAttr {
PREV_ATTR_NONE = 0,
PREV_ATTR_EXT_SHORT = 1 << 0,
};
typedef struct {
char *name, *ext, *type, *subtype, *script;
int order, priority;
enum PreviewAttr attrs;
size_t script_len;
} Preview;

View File

@ -42,6 +42,7 @@ int run_script(char *script, size_t script_len, int *exitcode, int *signal,
OPT_SETENV(forcechafa);
OPT_SETENV(noimages);
OPT_SETENV(nosymlinkinfo);
OPT_SETENV(showgpg);
char *scr = prepend_helpers(script, script_len);
char *args[] = SHELL_ARGS(scr);