From ac54945b250f90c59d18c6852a7899093df22721 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Fri, 5 Jan 2018 20:39:50 -0800 Subject: [PATCH 01/16] Fix improper signed int conversion of IMAP uid and msn values. Several places in the imap code, when parsing "number" and "nz-number" values from the IMAP data, use atoi() and strtol(). This is incorrect, and can result in failures when a uid value happens to be larger than 2^31. Create a helper function, mutt_atoui() and use that instead. One place was using strtol() and relying on the endptr parameter, and so was changed to use strtoul() instead. Thanks to Paul Saunders for the bug report and original patch, which this commit is based on. --- imap/command.c | 35 ++++++++++++++++++++----------- imap/imap.c | 10 +++++---- imap/message.c | 14 ++++++++----- muttlib.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ protos.h | 3 +++ 5 files changed, 97 insertions(+), 21 deletions(-) diff --git a/imap/command.c b/imap/command.c index 8bfc4c81aaf..d8ffbcaefce 100644 --- a/imap/command.c +++ b/imap/command.c @@ -40,6 +40,7 @@ #include "config.h" #include +#include #include #include #include @@ -253,8 +254,7 @@ static void cmd_parse_expunge(struct ImapData *idata, const char *s) mutt_debug(2, "Handling EXPUNGE\n"); - exp_msn = atoi(s); - if (exp_msn < 1 || exp_msn > idata->max_msn) + if (mutt_atoui(s, &exp_msn) < 0 || exp_msn < 1 || exp_msn > idata->max_msn) return; h = idata->msn_index[exp_msn - 1]; @@ -299,8 +299,7 @@ static void cmd_parse_fetch(struct ImapData *idata, char *s) mutt_debug(3, "Handling FETCH\n"); - msn = atoi(s); - if (msn < 1 || msn > idata->max_msn) + if (mutt_atoui(s, &msn) < 0 || msn < 1 || msn > idata->max_msn) { mutt_debug(3, "#1 FETCH response ignored for this message\n"); return; @@ -313,7 +312,7 @@ static void cmd_parse_fetch(struct ImapData *idata, char *s) return; } - mutt_debug(2, "Message UID %d updated\n", HEADER_DATA(h)->uid); + mutt_debug(2, "Message UID %u updated\n", HEADER_DATA(h)->uid); /* skip FETCH */ s = imap_next_word(s); s = imap_next_word(s); @@ -346,7 +345,11 @@ static void cmd_parse_fetch(struct ImapData *idata, char *s) { s += 3; SKIPWS(s); - uid = (unsigned int) atoi(s); + if (mutt_atoui(s, &uid) < 0) + { + mutt_debug(2, "Illegal UID. Skipping update.\n"); + return; + } if (uid != HEADER_DATA(h)->uid) { mutt_debug(2, "FETCH UID vs MSN mismatch. Skipping update.\n"); @@ -610,7 +613,8 @@ static void cmd_parse_search(struct ImapData *idata, const char *s) while ((s = imap_next_word((char *) s)) && *s != '\0') { - uid = (unsigned int) atoi(s); + if (mutt_atoui(s, &uid) < 0) + continue; h = (struct Header *) mutt_hash_int_find(idata->uid_hash, uid); if (h) h->matched = true; @@ -631,7 +635,7 @@ static void cmd_parse_status(struct ImapData *idata, char *s) char *value = NULL; struct Buffy *inc = NULL; struct ImapMbox mx; - int count; + unsigned int count; struct ImapStatus *status = NULL; unsigned int olduv, oldun; long litlen; @@ -673,7 +677,14 @@ static void cmd_parse_status(struct ImapData *idata, char *s) while (*s && *s != ')') { value = imap_next_word(s); - count = strtol(value, &value, 10); + + errno = 0; + count = strtoul(value, &value, 10); + if (errno == ERANGE && count == ULONG_MAX) + { + mutt_debug(1, "Error parsing STATUS number\n"); + return; + } if (mutt_str_strncmp("MESSAGES", s, 8) == 0) { @@ -695,7 +706,7 @@ static void cmd_parse_status(struct ImapData *idata, char *s) } mutt_debug( 3, - "%s (UIDVALIDITY: %d, UIDNEXT: %d) %d messages, %d recent, %d unseen\n", + "%s (UIDVALIDITY: %u, UIDNEXT: %u) %d messages, %d recent, %d unseen\n", status->name, status->uidvalidity, status->uidnext, status->messages, status->recent, status->unseen); @@ -733,7 +744,7 @@ static void cmd_parse_status(struct ImapData *idata, char *s) if (value && (imap_mxcmp(mailbox, value) == 0)) { - mutt_debug(3, "Found %s in buffy list (OV: %d ON: %d U: %d)\n", mailbox, + mutt_debug(3, "Found %s in buffy list (OV: %u ON: %u U: %d)\n", mailbox, olduv, oldun, status->unseen); if (MailCheckRecent) @@ -827,7 +838,7 @@ static int cmd_handle_untagged(struct ImapData *idata) mutt_debug(2, "Handling EXISTS\n"); /* new mail arrived */ - count = atoi(pn); + mutt_atoui(pn, &count); if (!(idata->reopen & IMAP_EXPUNGE_PENDING) && count < idata->max_msn) { diff --git a/imap/imap.c b/imap/imap.c index 77f18f7ef43..85f9e2c2cbd 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -883,7 +883,7 @@ void imap_expunge_mailbox(struct ImapData *idata) if (h->index == INT_MAX) { - mutt_debug(2, "Expunging message UID %d.\n", HEADER_DATA(h)->uid); + mutt_debug(2, "Expunging message UID %u.\n", HEADER_DATA(h)->uid); h->active = false; idata->ctx->size -= h->content->length; @@ -1669,7 +1669,7 @@ struct ImapStatus *imap_mboxcache_get(struct ImapData *idata, const char *mbox, } status->uidvalidity = *(unsigned int *) uidvalidity; status->uidnext = uidnext ? *(unsigned int *) uidnext : 0; - mutt_debug(3, "hcache uidvalidity %d, uidnext %d\n", status->uidvalidity, + mutt_debug(3, "hcache uidvalidity %u, uidnext %u\n", status->uidvalidity, status->uidnext); } mutt_hcache_free(hc, &uidvalidity); @@ -2143,7 +2143,8 @@ static int imap_open_mailbox(struct Context *ctx) mutt_debug(3, "Getting mailbox UIDVALIDITY\n"); pc += 3; pc = imap_next_word(pc); - idata->uid_validity = strtol(pc, NULL, 10); + if (mutt_atoui(pc, &idata->uid_validity) < 0) + goto fail; status->uidvalidity = idata->uid_validity; } else if (mutt_str_strncasecmp("OK [UIDNEXT", pc, 11) == 0) @@ -2151,7 +2152,8 @@ static int imap_open_mailbox(struct Context *ctx) mutt_debug(3, "Getting mailbox UIDNEXT\n"); pc += 3; pc = imap_next_word(pc); - idata->uidnext = strtol(pc, NULL, 10); + if (mutt_atoui(pc, &idata->uidnext) < 0) + goto fail; status->uidnext = idata->uidnext; } else diff --git a/imap/message.c b/imap/message.c index 8f01cf6a74e..a5823ee4c81 100644 --- a/imap/message.c +++ b/imap/message.c @@ -328,7 +328,8 @@ static int msg_parse_fetch(struct ImapHeader *h, char *s) { s += 3; SKIPWS(s); - h->data->uid = (unsigned int) atoi(s); + if (mutt_atoui(s, &h->data->uid) < 0) + return -1; s = imap_next_word(s); } @@ -359,7 +360,8 @@ static int msg_parse_fetch(struct ImapHeader *h, char *s) while (isdigit((unsigned char) *s)) *ptmp++ = *s++; *ptmp = '\0'; - h->content_length = atoi(tmp); + if (mutt_str_atol(tmp, &h->content_length) < 0) + return -1; } else if ((mutt_str_strncasecmp("BODY", s, 4) == 0) || (mutt_str_strncasecmp("RFC822.HEADER", s, 13) == 0)) @@ -406,7 +408,8 @@ static int msg_fetch_header(struct Context *ctx, struct ImapHeader *h, char *buf /* skip to message number */ buf = imap_next_word(buf); - h->data->msn = atoi(buf); + if (mutt_atoui(buf, &h->data->msn) < 0) + return rc; /* find FETCH tag */ buf = imap_next_word(buf); @@ -1005,7 +1008,7 @@ int imap_fetch_message(struct Context *ctx, struct Message *msg, int msgno) char *pc = NULL; long bytes; struct Progress progressbar; - int uid; + unsigned int uid; int cacheno; struct ImapCache *cache = NULL; bool read; @@ -1096,7 +1099,8 @@ int imap_fetch_message(struct Context *ctx, struct Message *msg, int msgno) if (mutt_str_strncasecmp("UID", pc, 3) == 0) { pc = imap_next_word(pc); - uid = atoi(pc); + if (mutt_atoui(pc, &uid) < 0) + goto bail; if (uid != HEADER_DATA(h)->uid) mutt_error(_( "The message index is incorrect. Try reopening the mailbox.")); diff --git a/muttlib.c b/muttlib.c index 46f6ffcc20e..2b867ad9909 100644 --- a/muttlib.c +++ b/muttlib.c @@ -1594,3 +1594,59 @@ int mutt_inbox_cmp(const char *a, const char *b) return 0; } + +/* NOTE: this function's return value breaks with the above three functions. + * The imap code lexes uint values out of a stream of characters without + * tokenization. The above functions return -1 if there is input beyond + * the number. + * + * returns: 1 - successful conversion, with trailing characters + * 0 - successful conversion + * -1 - invalid input + * -2 - input out of range + */ +int mutt_atoui(const char *str, unsigned int *dst) +{ + int rc; + unsigned long res; + unsigned int tmp; + unsigned int *t = dst ? dst : &tmp; + + *t = 0; + + if ((rc = mutt_atoul(str, &res)) < 0) + return rc; + if ((unsigned int) res != res) + return -2; + + *t = (unsigned int) res; + return rc; +} + +/* NOTE: this function's return value is different from mutt_atol. + * + * returns: 1 - successful conversion, with trailing characters + * 0 - successful conversion + * -1 - invalid input + */ +int mutt_atoul(const char *str, unsigned long *dst) +{ + unsigned long r; + unsigned long *res = dst ? dst : &r; + char *e = NULL; + + /* no input: 0 */ + if (!str || !*str) + { + *res = 0; + return 0; + } + + errno = 0; + *res = strtoul(str, &e, 10); + if (*res == ULONG_MAX && errno == ERANGE) + return -1; + if (e && *e != '\0') + return 1; + return 0; +} diff --git a/protos.h b/protos.h index 860fbd4a5e8..649a9fff33e 100644 --- a/protos.h +++ b/protos.h @@ -363,4 +363,7 @@ bool message_is_visible(struct Context *ctx, int index); int mutt_addrlist_to_intl(struct Address *a, char **err); int mutt_addrlist_to_local(struct Address *a); +int mutt_atoui(const char *str, unsigned int *dst); +int mutt_atoul(const char *str, unsigned long *dst); + #endif /* _MUTT_PROTOS_H */ From c44d5026eaf2cd4c67f6f2c648d16dcebaa06b75 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Sat, 6 Jan 2018 15:55:17 -0800 Subject: [PATCH 02/16] Change imap literal counts to parse and store unsigned ints. IMAP literals are of type number. Change imap_get_literal_count() to use mutt_atoui() instead of atoi(). Change the return type variables used to store the count to type unsigned int. It's doubtful this was a real issue, but as long as we're cleaning up incorrect atoi() usage, we should fix this too. --- imap/command.c | 4 ++-- imap/imap.c | 5 +++-- imap/imap_private.h | 4 ++-- imap/message.c | 4 ++-- imap/util.c | 5 +++-- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/imap/command.c b/imap/command.c index d8ffbcaefce..c13bf8416f0 100644 --- a/imap/command.c +++ b/imap/command.c @@ -412,7 +412,7 @@ static void cmd_parse_list(struct ImapData *idata, char *s) struct ImapList *list = NULL; struct ImapList lb; char delimbuf[5]; /* worst case: "\\"\0 */ - long litlen; + unsigned int litlen; if (idata->cmddata && idata->cmdtype == IMAP_CT_LIST) list = (struct ImapList *) idata->cmddata; @@ -638,7 +638,7 @@ static void cmd_parse_status(struct ImapData *idata, char *s) unsigned int count; struct ImapStatus *status = NULL; unsigned int olduv, oldun; - long litlen; + unsigned int litlen; short new = 0; short new_msg_count = 0; diff --git a/imap/imap.c b/imap/imap.c index 85f9e2c2cbd..85be54dcb17 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -816,14 +816,15 @@ void imap_logout_all(void) * Not explicitly buffered, relies on FILE buffering. NOTE: strips `\r` from * `\r\n`. Apparently even literals use `\r\n`-terminated strings ?! */ -int imap_read_literal(FILE *fp, struct ImapData *idata, long bytes, struct Progress *pbar) +int imap_read_literal(FILE *fp, struct ImapData *idata, unsigned long bytes, + struct Progress *pbar) { char c; bool r = false; mutt_debug(2, "reading %ld bytes\n", bytes); - for (long pos = 0; pos < bytes; pos++) + for (unsigned long pos = 0; pos < bytes; pos++) { if (mutt_socket_readchar(idata->conn, &c) != 1) { diff --git a/imap/imap_private.h b/imap/imap_private.h index cc565cd8980..11f4a4b0573 100644 --- a/imap/imap_private.h +++ b/imap/imap_private.h @@ -279,7 +279,7 @@ int imap_exec_msgset(struct ImapData *idata, const char *pre, const char *post, int imap_open_connection(struct ImapData *idata); void imap_close_connection(struct ImapData *idata); struct ImapData *imap_conn_find(const struct Account *account, int flags); -int imap_read_literal(FILE *fp, struct ImapData *idata, long bytes, struct Progress *pbar); +int imap_read_literal(FILE *fp, struct ImapData *idata, unsigned long bytes, struct Progress *pbar); void imap_expunge_mailbox(struct ImapData *idata); void imap_logout(struct ImapData **idata); int imap_sync_message_for_copy(struct ImapData *idata, struct Header *hdr, struct Buffer *cmd, int *err_continue); @@ -324,7 +324,7 @@ struct ImapData *imap_new_idata(void); void imap_free_idata(struct ImapData **idata); char *imap_fix_path(struct ImapData *idata, const char *mailbox, char *path, size_t plen); void imap_cachepath(struct ImapData *idata, const char *mailbox, char *dest, size_t dlen); -int imap_get_literal_count(const char *buf, long *bytes); +int imap_get_literal_count(const char *buf, unsigned int *bytes); char *imap_get_qualifier(char *buf); int imap_mxcmp(const char *mx1, const char *mx2); char *imap_next_word(char *s); diff --git a/imap/message.c b/imap/message.c index a5823ee4c81..8d69a3a50b0 100644 --- a/imap/message.c +++ b/imap/message.c @@ -397,7 +397,7 @@ static int msg_parse_fetch(struct ImapHeader *h, char *s) static int msg_fetch_header(struct Context *ctx, struct ImapHeader *h, char *buf, FILE *fp) { struct ImapData *idata = NULL; - long bytes; + unsigned int bytes; int rc = -1; /* default now is that string isn't FETCH response */ int parse_rc; @@ -1006,7 +1006,7 @@ int imap_fetch_message(struct Context *ctx, struct Message *msg, int msgno) char buf[LONG_STRING]; char path[_POSIX_PATH_MAX]; char *pc = NULL; - long bytes; + unsigned int bytes; struct Progress progressbar; unsigned int uid; int cacheno; diff --git a/imap/util.c b/imap/util.c index 12df02744ff..5e28d203606 100644 --- a/imap/util.c +++ b/imap/util.c @@ -737,7 +737,7 @@ void imap_cachepath(struct ImapData *idata, const char *mailbox, char *dest, siz * @retval 0 Success * @retval -1 Failure */ -int imap_get_literal_count(const char *buf, long *bytes) +int imap_get_literal_count(const char *buf, unsigned int *bytes) { char *pc = NULL; char *pn = NULL; @@ -750,7 +750,8 @@ int imap_get_literal_count(const char *buf, long *bytes) while (isdigit((unsigned char) *pc)) pc++; *pc = '\0'; - *bytes = atoi(pn); + if (mutt_atoui(pn, bytes) < 0) + return -1; return 0; } From a4a250d5f51a76e14f8f20b8adb4021293fab6c8 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Sun, 7 Jan 2018 12:12:42 -0800 Subject: [PATCH 03/16] Fix imap status count range check. The strtoul() call for parsing the STATUS count wasn't checking the range properly, because it was assigning to an unsigned int. Change to assign to a unsigned long, and also add the conversion check from mutt_atoui(). Thanks to Charles (@chdiza) for quickly noticing the problem! --- imap/command.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/imap/command.c b/imap/command.c index c13bf8416f0..df9d9ac9464 100644 --- a/imap/command.c +++ b/imap/command.c @@ -635,6 +635,7 @@ static void cmd_parse_status(struct ImapData *idata, char *s) char *value = NULL; struct Buffy *inc = NULL; struct ImapMbox mx; + unsigned long ulcount; unsigned int count; struct ImapStatus *status = NULL; unsigned int olduv, oldun; @@ -679,12 +680,13 @@ static void cmd_parse_status(struct ImapData *idata, char *s) value = imap_next_word(s); errno = 0; - count = strtoul(value, &value, 10); - if (errno == ERANGE && count == ULONG_MAX) + ulcount = strtoul(value, &value, 10); + if (((errno == ERANGE) && (ulcount == ULONG_MAX)) || ((unsigned int) ulcount != ulcount)) { mutt_debug(1, "Error parsing STATUS number\n"); return; } + count = (unsigned int) ulcount; if (mutt_str_strncmp("MESSAGES", s, 8) == 0) { From 5da97022bed8a263773b7e42afc00d93db9bfc5b Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Sun, 7 Jan 2018 13:06:56 +0100 Subject: [PATCH 04/16] cmd_handle_fatal: make error message a bit more descriptive When there are multiple IMAP connections available, "Mailbox closed" doesn't give a hint as to which one. Use account info to identify which mailbox was closed. --- imap/command.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/imap/command.c b/imap/command.c index df9d9ac9464..03548090e23 100644 --- a/imap/command.c +++ b/imap/command.c @@ -168,7 +168,8 @@ static void cmd_handle_fatal(struct ImapData *idata) { mx_fastclose_mailbox(idata->ctx); mutt_socket_close(idata->conn); - mutt_error(_("Mailbox closed")); + mutt_error(_("Mailbox %s@%s closed"), idata->conn->account.login, + idata->conn->account.host); mutt_sleep(1); idata->state = IMAP_DISCONNECTED; } From 1be22412811ed8555da35cde847351be90920fb9 Mon Sep 17 00:00:00 2001 From: Vincent Lefevre Date: Tue, 9 Jan 2018 04:09:11 +0100 Subject: [PATCH 05/16] Updated French translation. --- po/fr.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/fr.po b/po/fr.po index f3281d6946e..b0aeb503522 100644 --- a/po/fr.po +++ b/po/fr.po @@ -2335,8 +2335,8 @@ msgid "Mailbox renamed." msgstr "Boîte aux lettres renommée." #: imap/command.c:170 -msgid "Mailbox closed" -msgstr "Boîte aux lettres fermée" +msgid "Mailbox %s@%s closed" +msgstr "Boîte aux lettres %s@%s fermée" #: imap/command.c:1118 imap/command.c:1213 #, c-format From 09ff726131ac594ff800f6e739302652fcf01c31 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Thu, 11 Jan 2018 13:24:30 -0800 Subject: [PATCH 06/16] Create pgp and s/mime default and sign_as key vars. (see #3983) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The $postpone_encrypt and $(pgp/smime)_self_encrypt configuration variables have created a somewhat messier situation for users. Many of them now have to specify their keys across multiple configuration variables. (Trac) Ticket #3983 had a reasonable request: "if my encrypt and signing keys are the same, why can't I just specify my key once in my .muttrc?" The problem currently is that $smime_default_key and $pgp_sign_as are both used to specify signing keys, and are set by the "sign (a)s" security menu choice. So we can't store encryption keys there because some users have separate sign-only capability keys. Create $pgp_default_key to store the default encryption key. Change signing to use $pgp_default_key, unless overridden by $pgp_sign_as. The pgp "sign (a)s" will continue setting $pgp_sign_as. Create $smime_sign_as. Change signing to use $smime_default_key unless overridden by $smime_sign_as. Change s/mime "sign (a)s" menu to set $smime_sign_as instead. Change $postpone_encrypt and $(pgp/smime)_self_encrypt to use $(pgp/smime)_default_key by default. Mark $(pgp/smime)_self_encrypt_as deprecated. They are now aliases for the $(pgp/smime)_default_key config vars. Change $(pgp/smime)_self_encrypt default to set. The intent is that most users now need only set $(pgp/smime)_default_key. If they have a sign-only key, or have separate signing and encryption keys, they can put that in $(pgp/smime)_sign_as. This also enables to default self_encrypt on and solve a very common request. Thanks to Michele Marcionelli and Vincent Lefèvre for gently pushing me towards a solution. --- compose.c | 2 +- doc/manual.xml.head | 6 ++-- globals.h | 4 +-- init.h | 71 ++++++++++++++++++++++++++++----------------- ncrypt/crypt.c | 4 +-- ncrypt/pgpinvoke.c | 37 +++++++++++++---------- ncrypt/smime.c | 40 ++++++++++--------------- postpone.c | 2 +- send.c | 12 ++++---- sendlib.c | 4 +-- 10 files changed, 98 insertions(+), 84 deletions(-) diff --git a/compose.c b/compose.c index d113791aa6b..d22bfc9a1dc 100644 --- a/compose.c +++ b/compose.c @@ -310,7 +310,7 @@ static void redraw_crypt_lines(struct Header *msg) SETCOLOR(MT_COLOR_COMPOSE_HEADER); printw("%*s", HeaderPadding[HDR_CRYPTINFO], _(Prompts[HDR_CRYPTINFO])); NORMAL_COLOR; - printw("%s", SmimeDefaultKey ? SmimeDefaultKey : _("")); + printw("%s", SmimeSignAs ? SmimeSignAs : _("")); } if ((WithCrypto & APPLICATION_SMIME) && (msg->security & APPLICATION_SMIME) && diff --git a/doc/manual.xml.head b/doc/manual.xml.head index 7c688764fcb..c696b44dac0 100644 --- a/doc/manual.xml.head +++ b/doc/manual.xml.head @@ -2707,11 +2707,11 @@ color sidebar_divider color8 default message will be encrypted using the selected public keys when sent out. - To ensure you can view encrypted message you have sent, you + To ensure you can view encrypted messages you have sent, you may wish to set $pgp_self_encrypt - and $pgp_self_encrypt_as for PGP, or + and $pgp_default_key for PGP, or $smime_self_encrypt - and $smime_self_encrypt_as for S/MIME. + and $smime_default_key for S/MIME. Most fields of the entries in the key selection menu (see also $pgp_entry_format) have obvious diff --git a/globals.h b/globals.h index 9118394ff28..5b66941c0b2 100644 --- a/globals.h +++ b/globals.h @@ -282,6 +282,7 @@ WHERE short ImapPollTimeout; /* -- formerly in pgp.h -- */ WHERE struct Regex *PgpGoodSign; WHERE struct Regex *PgpDecryptionOkay; +WHERE char *PgpDefaultKey; WHERE char *PgpSignAs; WHERE short PgpTimeout; WHERE char *PgpEntryFormat; @@ -298,10 +299,10 @@ WHERE char *PgpVerifyKeyCommand; WHERE char *PgpListSecringCommand; WHERE char *PgpListPubringCommand; WHERE char *PgpGetkeysCommand; -WHERE char *PgpSelfEncryptAs; /* -- formerly in smime.h -- */ WHERE char *SmimeDefaultKey; +WHERE char *SmimeSignAs; WHERE short SmimeTimeout; WHERE char *SmimeCertificates; WHERE char *SmimeKeys; @@ -318,7 +319,6 @@ WHERE char *SmimePk7outCommand; WHERE char *SmimeGetCertCommand; WHERE char *SmimeImportCertCommand; WHERE char *SmimeGetCertEmailCommand; -WHERE char *SmimeSelfEncryptAs; #ifdef USE_NOTMUCH WHERE int NmOpenTimeout; diff --git a/init.h b/init.h index 77961849e10..574f434944e 100644 --- a/init.h +++ b/init.h @@ -2253,7 +2253,8 @@ struct Option MuttVars[] = { ** .dt %f .dd Expands to the name of a file containing a message. ** .dt %s .dd Expands to the name of a file containing the signature part ** . of a \fCmultipart/signed\fP attachment when verifying it. - ** .dt %a .dd The value of $$pgp_sign_as. + ** .dt %a .dd The value of $$pgp_sign_as if set, otherwise the value + ** of $$pgp_default_key. ** .dt %r .dd One or more key IDs (or fingerprints if available). ** .de ** .pp @@ -2283,6 +2284,18 @@ struct Option MuttVars[] = { ** (e.g. simply signed and ascii armored text). ** (PGP only) */ + { "pgp_default_key", DT_STRING, R_NONE, UL &PgpDefaultKey, 0 }, + /* + ** .pp + ** This is the default key-pair to use for PGP operations. It will be + ** used for encryption (see $$postpone_encrypt and $$pgp_self_encrypt). + ** .pp + ** It will also be used for signing unless $$pgp_sign_as is set. + ** .pp + ** The (now deprecated) \fIpgp_self_encrypt_as\fP is an alias for this + ** variable, and should no longer be used. + ** (PGP only) + */ { "pgp_encrypt_only_command", DT_STRING, R_NONE, UL &PgpEncryptOnlyCommand, 0 }, /* ** .pp @@ -2463,19 +2476,11 @@ struct Option MuttVars[] = { ** removed, while the inner \fCmultipart/signed\fP part is retained. ** (PGP only) */ - { "pgp_self_encrypt", DT_BOOL, R_NONE, UL &PgpSelfEncrypt, 0 }, + { "pgp_self_encrypt", DT_BOOL, R_NONE, UL &PgpSelfEncrypt, 1 }, /* ** .pp ** When \fIset\fP, PGP encrypted messages will also be encrypted - ** using the key in $$pgp_self_encrypt_as. - ** (PGP only) - */ - { "pgp_self_encrypt_as", DT_STRING, R_NONE, UL &PgpSelfEncryptAs, 0 }, - /* - ** .pp - ** This is an additional key used to encrypt messages when $$pgp_self_encrypt - ** is \fIset\fP. It is also used to specify the key for $$postpone_encrypt. - ** It should be in keyid or fingerprint form (e.g. 0x00112233). + ** using the key in $$pgp_default_key. ** (PGP only) */ { "pgp_show_unusable", DT_BOOL, R_NONE, UL &PgpShowUnusable, 1 }, @@ -2489,9 +2494,10 @@ struct Option MuttVars[] = { { "pgp_sign_as", DT_STRING, R_NONE, UL &PgpSignAs, 0 }, /* ** .pp - ** If you have more than one key pair, this option allows you to specify - ** which of your private keys to use. It is recommended that you use the - ** keyid form to specify your key (e.g. \fC0x00112233\fP). + ** If you have a different key pair to use for signing, you should + ** set this to the signing key. Most people will only need to set + ** $$pgp_default_key. It is recommended that you use the keyid form + ** to specify your key (e.g. \fC0x00112233\fP). ** (PGP only) */ { "pgp_sign_command", DT_STRING, R_NONE, UL &PgpSignCommand, 0 }, @@ -2705,7 +2711,7 @@ struct Option MuttVars[] = { ** .pp ** When \fIset\fP, postponed messages that are marked for encryption will be ** self-encrypted. NeoMutt will first try to encrypt using the value specified - ** in $$pgp_self_encrypt_as or $$smime_self_encrypt_as. If those are not + ** in $$pgp_default_key or $$smime_default_key. If those are not ** set, it will try the deprecated $$postpone_encrypt_as. ** (Crypto only) */ @@ -2713,7 +2719,7 @@ struct Option MuttVars[] = { /* ** .pp ** This is a deprecated fall-back variable for $$postpone_encrypt. - ** Please use $$pgp_self_encrypt_as or $$smime_self_encrypt_as. + ** Please use $$pgp_default_key or $$smime_default_key. ** (Crypto only) */ #ifdef USE_SOCKET @@ -3482,8 +3488,19 @@ struct Option MuttVars[] = { { "smime_default_key", DT_STRING, R_NONE, UL &SmimeDefaultKey, 0 }, /* ** .pp - ** This is the default key-pair to use for signing. This must be set to the - ** keyid (the hash-value that OpenSSL generates) to work properly + ** This is the default key-pair to use for S/MIME operations, and must be + ** set to the keyid (the hash-value that OpenSSL generates) to work properly. + ** .pp + ** It will be used for encryption (see $$postpone_encrypt and + ** $$smime_self_encrypt). + ** .pp + ** It will be used for decryption unless $$smime_decrypt_use_default_key + ** is \fIunset\fP. + ** .pp + ** It will also be used for signing unless $$smime_sign_as is set. + ** .pp + ** The (now deprecated) \fIsmime_self_encrypt_as\fP is an alias for this + ** variable, and should no longer be used. ** (S/MIME only) */ { "smime_encrypt_command", DT_STRING, R_NONE, UL &SmimeEncryptCommand, 0 }, @@ -3544,7 +3561,8 @@ struct Option MuttVars[] = { ** This command is used to import a certificate via smime_keys. ** .pp ** This is a format string, see the $$smime_decrypt_command command for - ** possible \fCprintf(3)\fP-like sequences. + ** possible \fCprintf(3)\fP-like sequences. NOTE: %c and %k will default + ** to $$smime_sign_as if set, otherwise $$smime_default_key. ** (S/MIME only) */ { "smime_is_default", DT_BOOL, R_NONE, UL &SmimeIsDefault, 0 }, @@ -3578,20 +3596,18 @@ struct Option MuttVars[] = { ** possible \fCprintf(3)\fP-like sequences. ** (S/MIME only) */ - { "smime_self_encrypt", DT_BOOL, R_NONE, UL &SmimeSelfEncrypt, 0 }, + { "smime_self_encrypt", DT_BOOL, R_NONE, UL &SmimeSelfEncrypt, 1 }, /* ** .pp ** When \fIset\fP, S/MIME encrypted messages will also be encrypted - ** using the certificate in $$smime_self_encrypt_as. + ** using the certificate in $$smime_default_key. ** (S/MIME only) */ - { "smime_self_encrypt_as", DT_STRING, R_NONE, UL &SmimeSelfEncryptAs, 0 }, + { "smime_sign_as", DT_STRING, R_NONE, UL &SmimeSignAs, 0 }, /* ** .pp - ** This is an additional certificate used to encrypt messages when - ** $$smime_self_encrypt is \fIset\fP. It is also used to specify the - ** certificate for $$postpone_encrypt. It should be the hash-value that - ** OpenSSL generates. + ** If you have a separate key to use for signing, you should set this + ** to the signing key. Most people will only need to set $$smime_default_key. ** (S/MIME only) */ { "smime_sign_command", DT_STRING, R_NONE, UL &SmimeSignCommand, 0 }, @@ -4394,10 +4410,11 @@ struct Option MuttVars[] = { { "pgp_replyencrypt", DT_SYNONYM, R_NONE, UL "crypt_replyencrypt", 0 }, { "pgp_replysign", DT_SYNONYM, R_NONE, UL "crypt_replysign", 0 }, { "pgp_replysignencrypted", DT_SYNONYM, R_NONE, UL "crypt_replysignencrypted", 0 }, + { "pgp_self_encrypt_as", DT_SYNONYM, R_NONE, UL "pgp_default_key", 0 }, { "pgp_verify_sig", DT_SYNONYM, R_NONE, UL "crypt_verify_sig", 0 }, { "post_indent_str", DT_SYNONYM, R_NONE, UL "post_indent_string", 0 }, { "print_cmd", DT_SYNONYM, R_NONE, UL "print_command", 0 }, - { "smime_sign_as", DT_SYNONYM, R_NONE, UL "smime_default_key", 0 }, + { "smime_self_encrypt_as", DT_SYNONYM, R_NONE, UL "smime_default_key", 0 }, { "xterm_icon", DT_SYNONYM, R_NONE, UL "ts_icon_format", 0 }, { "xterm_set_titles", DT_SYNONYM, R_NONE, UL "ts_enabled", 0 }, { "xterm_title", DT_SYNONYM, R_NONE, UL "ts_status_format", 0 }, diff --git a/ncrypt/crypt.c b/ncrypt/crypt.c index 1828fac0323..090c5f7b5e4 100644 --- a/ncrypt/crypt.c +++ b/ncrypt/crypt.c @@ -874,7 +874,7 @@ int crypt_get_keys(struct Header *msg, char **keylist, int oppenc_mode) } OPT_PGP_CHECK_TRUST = false; if (PgpSelfEncrypt || (PgpEncryptSelf == MUTT_YES)) - self_encrypt = PgpSelfEncryptAs; + self_encrypt = PgpDefaultKey; } if ((WithCrypto & APPLICATION_SMIME) && (msg->security & APPLICATION_SMIME)) { @@ -885,7 +885,7 @@ int crypt_get_keys(struct Header *msg, char **keylist, int oppenc_mode) return -1; } if (SmimeSelfEncrypt || (SmimeEncryptSelf == MUTT_YES)) - self_encrypt = SmimeSelfEncryptAs; + self_encrypt = SmimeDefaultKey; } } diff --git a/ncrypt/pgpinvoke.c b/ncrypt/pgpinvoke.c index 750c7f4e71e..a25d5204ac3 100644 --- a/ncrypt/pgpinvoke.c +++ b/ncrypt/pgpinvoke.c @@ -155,7 +155,7 @@ static void mutt_pgp_command(char *buf, size_t buflen, static pid_t pgp_invoke(FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, int pgpoutfd, int pgperrfd, short need_passphrase, const char *fname, const char *sig_fname, - const char *signas, const char *ids, const char *format) + const char *ids, const char *format) { struct PgpCommandContext cctx; char cmd[HUGE_STRING]; @@ -168,7 +168,10 @@ static pid_t pgp_invoke(FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, cctx.need_passphrase = need_passphrase; cctx.fname = fname; cctx.sig_fname = sig_fname; - cctx.signas = signas; + if (PgpSignAs && *PgpSignAs) + cctx.signas = PgpSignAs; + else + cctx.signas = PgpDefaultKey; cctx.ids = ids; mutt_pgp_command(cmd, sizeof(cmd), &cctx, format); @@ -186,28 +189,28 @@ pid_t pgp_invoke_decode(FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, int pgpoutfd, int pgperrfd, const char *fname, short need_passphrase) { return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, - need_passphrase, fname, NULL, PgpSignAs, NULL, PgpDecodeCommand); + need_passphrase, fname, NULL, NULL, PgpDecodeCommand); } pid_t pgp_invoke_verify(FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, int pgpoutfd, int pgperrfd, const char *fname, const char *sig_fname) { return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 0, - fname, sig_fname, PgpSignAs, NULL, PgpVerifyCommand); + fname, sig_fname, NULL, PgpVerifyCommand); } pid_t pgp_invoke_decrypt(FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, int pgpoutfd, int pgperrfd, const char *fname) { return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 1, - fname, NULL, PgpSignAs, NULL, PgpDecryptCommand); + fname, NULL, NULL, PgpDecryptCommand); } pid_t pgp_invoke_sign(FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, int pgpoutfd, int pgperrfd, const char *fname) { return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 1, - fname, NULL, PgpSignAs, NULL, PgpSignCommand); + fname, NULL, NULL, PgpSignCommand); } pid_t pgp_invoke_encrypt(FILE **pgpin, FILE **pgpout, FILE **pgperr, @@ -216,10 +219,10 @@ pid_t pgp_invoke_encrypt(FILE **pgpin, FILE **pgpout, FILE **pgperr, { if (sign) return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 1, - fname, NULL, PgpSignAs, uids, PgpEncryptSignCommand); + fname, NULL, uids, PgpEncryptSignCommand); else return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 0, - fname, NULL, PgpSignAs, uids, PgpEncryptOnlyCommand); + fname, NULL, uids, PgpEncryptOnlyCommand); } pid_t pgp_invoke_traditional(FILE **pgpin, FILE **pgpout, FILE **pgperr, @@ -228,11 +231,11 @@ pid_t pgp_invoke_traditional(FILE **pgpin, FILE **pgpout, FILE **pgperr, { if (flags & ENCRYPT) return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, - flags & SIGN ? 1 : 0, fname, NULL, PgpSignAs, uids, + flags & SIGN ? 1 : 0, fname, NULL, uids, flags & SIGN ? PgpEncryptSignCommand : PgpEncryptOnlyCommand); else return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 1, - fname, NULL, PgpSignAs, NULL, PgpClearSignCommand); + fname, NULL, NULL, PgpClearSignCommand); } void pgp_invoke_import(const char *fname) @@ -245,7 +248,10 @@ void pgp_invoke_import(const char *fname) mutt_file_quote_filename(tmp_fname, sizeof(tmp_fname), fname); cctx.fname = tmp_fname; - cctx.signas = PgpSignAs; + if (PgpSignAs && *PgpSignAs) + cctx.signas = PgpSignAs; + else + cctx.signas = PgpDefaultKey; mutt_pgp_command(cmd, sizeof(cmd), &cctx, PgpImportCommand); if (mutt_system(cmd) != 0) @@ -301,14 +307,14 @@ pid_t pgp_invoke_export(FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, int pgpoutfd, int pgperrfd, const char *uids) { return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 0, NULL, - NULL, PgpSignAs, uids, PgpExportCommand); + NULL, uids, PgpExportCommand); } pid_t pgp_invoke_verify_key(FILE **pgpin, FILE **pgpout, FILE **pgperr, int pgpinfd, int pgpoutfd, int pgperrfd, const char *uids) { return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 0, NULL, - NULL, PgpSignAs, uids, PgpVerifyKeyCommand); + NULL, uids, PgpVerifyKeyCommand); } pid_t pgp_invoke_list_keys(FILE **pgpin, FILE **pgpout, FILE **pgperr, @@ -329,7 +335,6 @@ pid_t pgp_invoke_list_keys(FILE **pgpin, FILE **pgpout, FILE **pgperr, strcpy(uids, tmpuids); } - return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 0, NULL, - NULL, PgpSignAs, uids, - keyring == PGP_SECRING ? PgpListSecringCommand : PgpListPubringCommand); + return pgp_invoke(pgpin, pgpout, pgperr, pgpinfd, pgpoutfd, pgperrfd, 0, NULL, NULL, + uids, keyring == PGP_SECRING ? PgpListSecringCommand : PgpListPubringCommand); } diff --git a/ncrypt/smime.c b/ncrypt/smime.c index 511994b19a0..43f524bb447 100644 --- a/ncrypt/smime.c +++ b/ncrypt/smime.c @@ -1494,11 +1494,13 @@ struct Body *smime_sign_message(struct Body *a) int err = 0; int empty = 0; pid_t thepid; - struct SmimeKey *default_key = NULL; + char *signas = NULL; + struct SmimeKey *signas_key = NULL; char *intermediates = NULL; char *micalg = NULL; - if (!SmimeDefaultKey) + signas = (SmimeSignAs && *SmimeSignAs) ? SmimeSignAs : SmimeDefaultKey; + if (!signas || !*signas) { mutt_error(_("Can't sign: No key specified. Use Sign As.")); return NULL; @@ -1529,21 +1531,21 @@ struct Body *smime_sign_message(struct Body *a) mutt_write_mime_body(a, sfp); mutt_file_fclose(&sfp); - snprintf(SmimeKeyToUse, sizeof(SmimeKeyToUse), "%s/%s", NONULL(SmimeKeys), SmimeDefaultKey); + snprintf(SmimeKeyToUse, sizeof(SmimeKeyToUse), "%s/%s", NONULL(SmimeKeys), signas); snprintf(SmimeCertToUse, sizeof(SmimeCertToUse), "%s/%s", - NONULL(SmimeCertificates), SmimeDefaultKey); + NONULL(SmimeCertificates), signas); - default_key = smime_get_key_by_hash(SmimeDefaultKey, 1); - if ((!default_key) || (mutt_str_strcmp("?", default_key->issuer) == 0)) - intermediates = SmimeDefaultKey; /* so openssl won't complain in any case */ + signas_key = smime_get_key_by_hash(signas, 1); + if ((!signas_key) || (!mutt_str_strcmp("?", signas_key->issuer))) + intermediates = signas; /* so openssl won't complain in any case */ else - intermediates = default_key->issuer; + intermediates = signas_key->issuer; snprintf(SmimeIntermediateToUse, sizeof(SmimeIntermediateToUse), "%s/%s", NONULL(SmimeCertificates), intermediates); - smime_free_key(&default_key); + smime_free_key(&signas_key); thepid = smime_invoke_sign(&smimein, NULL, &smimeerr, -1, fileno(smimeout), -1, filetosign); if (thepid == -1) @@ -2162,29 +2164,19 @@ int smime_send_menu(struct Header *msg) break; case 's': /* (s)ign */ + msg->security &= ~ENCRYPT; + msg->security |= SIGN; + break; + case 'S': /* (s)ign in oppenc mode */ - if (!SmimeDefaultKey) - { - key = smime_ask_for_key(_("Sign as: "), KEYFLAG_CANSIGN, 0); - if (key) - { - mutt_str_replace(&SmimeDefaultKey, key->hash); - smime_free_key(&key); - } - else - break; - } - if (choices[choice - 1] == 's') - msg->security &= ~ENCRYPT; msg->security |= SIGN; break; case 'a': /* sign (a)s */ - key = smime_ask_for_key(_("Sign as: "), KEYFLAG_CANSIGN, 0); if (key) { - mutt_str_replace(&SmimeDefaultKey, key->hash); + mutt_str_replace(&SmimeSignAs, key->hash); smime_free_key(&key); msg->security |= SIGN; diff --git a/postpone.c b/postpone.c index 15252ffb620..429541c8bc3 100644 --- a/postpone.c +++ b/postpone.c @@ -515,7 +515,7 @@ int mutt_parse_crypt_hdr(const char *p, int set_empty_signas, int crypt_app) if ((WithCrypto & APPLICATION_SMIME) && (crypt_app == APPLICATION_SMIME) && (flags & SIGN) && (set_empty_signas || *sign_as)) { - mutt_str_replace(&SmimeDefaultKey, sign_as); + mutt_str_replace(&SmimeSignAs, sign_as); } return flags; diff --git a/send.c b/send.c index 0e09eaaf408..e5e33804a06 100644 --- a/send.c +++ b/send.c @@ -1290,7 +1290,7 @@ int ci_send_message(int flags, struct Header *msg, char *tempfile, char *pgpkeylist = NULL; /* save current value of "pgp_sign_as" and "smime_default_key" */ char *pgp_signas = NULL; - char *smime_default_key = NULL; + char *smime_signas = NULL; char *tag = NULL, *err = NULL; char *ctype = NULL; char *finalpath = NULL; @@ -1322,7 +1322,7 @@ int ci_send_message(int flags, struct Header *msg, char *tempfile, if (WithCrypto & APPLICATION_PGP) pgp_signas = mutt_str_strdup(PgpSignAs); if (WithCrypto & APPLICATION_SMIME) - smime_default_key = mutt_str_strdup(SmimeDefaultKey); + smime_signas = mutt_str_strdup(SmimeSignAs); } /* Delay expansion of aliases until absolutely necessary--shouldn't @@ -1835,9 +1835,9 @@ int ci_send_message(int flags, struct Header *msg, char *tempfile, char *encrypt_as = NULL; if ((WithCrypto & APPLICATION_PGP) && (msg->security & APPLICATION_PGP)) - encrypt_as = PgpSelfEncryptAs; + encrypt_as = PgpDefaultKey; else if ((WithCrypto & APPLICATION_SMIME) && (msg->security & APPLICATION_SMIME)) - encrypt_as = SmimeSelfEncryptAs; + encrypt_as = SmimeDefaultKey; if (!(encrypt_as && *encrypt_as)) encrypt_as = PostponeEncryptAs; @@ -2201,8 +2201,8 @@ int ci_send_message(int flags, struct Header *msg, char *tempfile, } if (WithCrypto & APPLICATION_SMIME) { - FREE(&SmimeDefaultKey); - SmimeDefaultKey = smime_default_key; + FREE(&SmimeSignAs); + SmimeSignAs = smime_signas; } } diff --git a/sendlib.c b/sendlib.c index 51a83a37478..5b38c016177 100644 --- a/sendlib.c +++ b/sendlib.c @@ -3049,8 +3049,8 @@ int mutt_write_fcc(const char *path, struct Header *hdr, const char *msgid, if (hdr->security & SIGN) { fputc('S', msg->fp); - if (SmimeDefaultKey && *SmimeDefaultKey) - fprintf(msg->fp, "<%s>", SmimeDefaultKey); + if (SmimeSignAs && *SmimeSignAs) + fprintf(msg->fp, "<%s>", SmimeSignAs); } if (hdr->security & INLINE) fputc('I', msg->fp); From f651caa0e0f2a13559e00ac0c10d4768ed801079 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Thu, 11 Jan 2018 15:08:30 -0800 Subject: [PATCH 07/16] Add missing setup calls when resuming encrypted drafts. Calls to get the passphrase were missing for app/pgp and app/smime. App/smime was also missing a call to crypt_smime_getkeys(). If a failure occurs, report it back, rather than just continuing. Otherwise, postponed messages could be completely lost. --- postpone.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/postpone.c b/postpone.c index 429541c8bc3..d7251327695 100644 --- a/postpone.c +++ b/postpone.c @@ -580,17 +580,12 @@ int mutt_prepare_template(FILE *fp, struct Context *ctx, struct Header *newhdr, { newhdr->security |= sec_type; if (!crypt_valid_passphrase(sec_type)) - goto err; + goto bail; mutt_message(_("Decrypting message...")); if ((crypt_pgp_decrypt_mime(fp, &bfp, newhdr->content, &b) == -1) || b == NULL) { - err: - mx_close_message(ctx, &msg); - mutt_env_free(&newhdr->env); - mutt_free_body(&newhdr->content); - mutt_error(_("Decryption failed.")); - return -1; + goto bail; } mutt_free_body(&newhdr->content); @@ -678,7 +673,18 @@ int mutt_prepare_template(FILE *fp, struct Context *ctx, struct Header *newhdr, if ((WithCrypto & APPLICATION_PGP) && ((sec_type = mutt_is_application_pgp(b)) & (ENCRYPT | SIGN))) { - mutt_body_handler(b, &s); + if (sec_type & ENCRYPT) + { + if (!crypt_valid_passphrase(APPLICATION_PGP)) + goto bail; + mutt_message(_("Decrypting message...")); + } + + if (mutt_body_handler(b, &s) < 0) + { + mutt_error(_("Decryption failed.")); + goto bail; + } newhdr->security |= sec_type; @@ -689,7 +695,19 @@ int mutt_prepare_template(FILE *fp, struct Context *ctx, struct Header *newhdr, else if ((WithCrypto & APPLICATION_SMIME) && ((sec_type = mutt_is_application_smime(b)) & (ENCRYPT | SIGN))) { - mutt_body_handler(b, &s); + if (sec_type & ENCRYPT) + { + if (!crypt_valid_passphrase(APPLICATION_SMIME)) + goto bail; + crypt_smime_getkeys(newhdr->env); + mutt_message(_("Decrypting message...")); + } + + if (mutt_body_handler(b, &s) < 0) + { + mutt_error(_("Decryption failed.")); + goto bail; + } newhdr->security |= sec_type; b->type = TYPETEXT; From 5e96005e08d9da09f84dd01118c0b0218d6324d0 Mon Sep 17 00:00:00 2001 From: Olaf Hering Date: Tue, 3 Dec 2013 16:43:49 +0100 Subject: [PATCH 08/16] mutt_pretty_size: show real number for small files If a file is smaller than a certain size it is unfriendly to print 0K or 0,1K as number of mails or as file size. Instead use the real number. Signed-off-by: Olaf Hering --- muttlib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/muttlib.c b/muttlib.c index 2b867ad9909..599ad43f0b9 100644 --- a/muttlib.c +++ b/muttlib.c @@ -568,8 +568,8 @@ void mutt_pretty_mailbox(char *s, size_t buflen) void mutt_pretty_size(char *s, size_t len, size_t n) { - if (n == 0) - mutt_str_strfcpy(s, "0K", len); + if (n < 1000) + snprintf(s, len, "%d", (int) n); else if (n < 10189) /* 0.1K - 9.9K */ snprintf(s, len, "%3.1fK", (n < 103) ? 0.1 : n / 1024.0); else if (n < 1023949) /* 10K - 999K */ From 469afa220d2b6cc508a563a7e230e024ca6d0b1f Mon Sep 17 00:00:00 2001 From: Olaf Hering Date: Tue, 3 Dec 2013 16:42:39 +0100 Subject: [PATCH 09/16] examine_directory: set directory/symlink size to zero The size of a directory or symlink in the folder browser is not meaningful. For directories it means just how many blocks were allocated to hold all entries. It does not mean that the entries are still present in the directory. For symlinks its the size of the target. Set both to zero to simplify the folder browser output. Signed-off-by: Olaf Hering --- browser.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/browser.c b/browser.c index b932798e4c8..847d52d37df 100644 --- a/browser.c +++ b/browser.c @@ -800,7 +800,10 @@ static int examine_directory(struct Menu *menu, struct BrowserState *state, if (lstat(buffer, &s) == -1) continue; - if ((!S_ISREG(s.st_mode)) && (!S_ISDIR(s.st_mode)) && (!S_ISLNK(s.st_mode))) + /* No size for directories or symlinks */ + if (S_ISDIR(s.st_mode) || S_ISLNK(s.st_mode)) + s.st_size = 0; + else if (!S_ISREG(s.st_mode)) continue; tmp = Incoming; From 02f1e75742c4381b0a2ed05e3649415a283f0fd9 Mon Sep 17 00:00:00 2001 From: Grzegorz Szymaszek Date: Sat, 13 Jan 2018 20:27:11 +0100 Subject: [PATCH 10/16] Update pl.po --- po/pl.po | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/po/pl.po b/po/pl.po index 7160625cca3..a5b6818075a 100644 --- a/po/pl.po +++ b/po/pl.po @@ -300,6 +300,15 @@ msgstr "Skrzynka została usunięta." msgid "Mailbox deletion failed." msgstr "Skrzynka została usunięta." +msgid "No PGP backend configured" +msgstr "" + +msgid "No S/MIME backend configured" +msgstr "" + +msgid "No crypto backend configured. Disabling message security setting." +msgstr "" + #: browser.c:1678 msgid "Mailbox not deleted." msgstr "Skrzynka nie została usunięta." @@ -5223,8 +5232,9 @@ msgid "print the current entry" msgstr "wydrukuj obecną pozycję" #: opcodes.h:193 +#, fuzzy msgid "delete the current entry, bypassing the trash folder" -msgstr "" +msgstr "usuń bieżący list" #: opcodes.h:194 msgid "delete the current thread, bypassing the trash folder" @@ -6370,11 +6380,14 @@ msgid "" msgstr "" "Copyright (C) 1996-2016 Michael R. Elkins \n" "Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2007 Thomas Roessler \n" +"Copyright (C) 1997-2009 Thomas Roessler \n" "Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2007 Brendan Cully \n" +"Copyright (C) 1999-2014 Brendan Cully \n" "Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2002 Edmund Grimley Evans \n" +"Copyright (C) 2000-2004 Edmund Grimley Evans \n" +"Copyright (C) 2006-2009 Rocco Rutte \n" +"Copyright (C) 2014-2016 Kevin J. McCarthy \n" +"Copyright (C) 2015-2017 Richard Russon \n" "\n" "Wielu innych twórców, nie wspomnianych tutaj,\n" "wniosło wiele nowego kodu, poprawek i sugestii.\n" From b5f7ddb191a3e9c93fd7a1716ac8569a9d075541 Mon Sep 17 00:00:00 2001 From: Grzegorz Szymaszek Date: Sat, 13 Jan 2018 21:21:35 +0100 Subject: [PATCH 11/16] =?UTF-8?q?Fixed=20GPGME=20translations=20that=20wer?= =?UTF-8?q?en=E2=80=99t=20shown=20but=20affected=20the=20keyboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- po/pl.po | 3 --- 1 file changed, 3 deletions(-) diff --git a/po/pl.po b/po/pl.po index a5b6818075a..f6c894af20f 100644 --- a/po/pl.po +++ b/po/pl.po @@ -4077,19 +4077,16 @@ msgid "esabmco" msgstr "zpjosa" #: ncrypt/crypt_gpgme.c:4956 -#, fuzzy msgid "S/MIME (e)ncrypt, (s)ign, sign (a)s, (b)oth, (p)gp or (c)lear? " msgstr "" "S/MIME: (z)aszyfruj, (p)odpisz, podpisz (j)ako, (o)ba, p(g)p, (a)nuluj?" #. L10N: S/MIME options #: ncrypt/crypt_gpgme.c:4958 -#, fuzzy msgid "esabpc" msgstr "zpjoga" #: ncrypt/crypt_gpgme.c:4965 -#, fuzzy msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, s/(m)ime or (c)lear? " msgstr "" "PGP: (z)aszyfruj, (p)odpisz, podpisz (j)ako, (o)ba, (s)/mime, (a)nuluj?" From 10a0e6cffec83db90db19eec64e0e6a754de2359 Mon Sep 17 00:00:00 2001 From: Richard Russon Date: Mon, 15 Jan 2018 01:40:56 +0000 Subject: [PATCH 12/16] docs: update encrypt-to-self --- doc/manual.xml.head | 53 ++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/doc/manual.xml.head b/doc/manual.xml.head index c696b44dac0..1c2f059c74d 100644 --- a/doc/manual.xml.head +++ b/doc/manual.xml.head @@ -10520,20 +10520,23 @@ set index_format='%4C %Z %<[y?%<[m?%<[d?%[%H:%M ]&%[%a %d]>& $fcc_clear. A better option is to enable $smime_self_encrypt, then set - $smime_self_encrypt_as to your + $smime_default_key to your personal S/MIME key id. -set smime_self_encrypt = yes -set smime_self_encrypt_as = bb345e23.0 +set smime_self_encrypt = yes +set smime_default_key = bb345e23.0 Or, if you use PGP, $pgp_self_encrypt, then set - $pgp_self_encrypt_as to your personal PGP key - id. + $pgp_default_key to your personal + PGP key id. -set pgp_self_encrypt = yes -set pgp_self_encrypt_as = A4AF18C5582473BD35A1E9CE78BB3D480042198E +set pgp_self_encrypt = yes +set pgp_default_key = A4AF18C5582473BD35A1E9CE78BB3D480042198E + If you have different key for signing, then you can set + $pgp_sign_as or + $smime_sign_as respectively. @@ -10552,28 +10555,42 @@ set pgp_self_encrypt_as = A4AF18C5582473BD35A1E9CE78BB3D480042198E - smime_self_encrypt + pgp_default_key + + string + (empty) + + + + pgp_self_encrypt boolean - no + yes - smime_self_encrypt_as + pgp_sign_as string (empty) - pgp_self_encrypt + smime_default_key + + string + (empty) + + + + smime_self_encrypt boolean - no + yes - pgp_self_encrypt_as + smime_sign_as string (empty) @@ -10592,12 +10609,14 @@ set pgp_self_encrypt_as = A4AF18C5582473BD35A1E9CE78BB3D480042198E # VARIABLES - shown with their default values # -------------------------------------------------------------------------- # Save a copy of outgoing email, encrypted to yourself -set smime_self_encrypt = "no" -# set smime_self_encrypt_as = "SMIME-KEY" +set pgp_self_encrypt = "yes" +set pgp_default_key = "PGP-KEY" +# set pgp_sign_as = "PGP-SIGNING-KEY" # Save a copy of outgoing email, encrypted to yourself -set pgp_self_encrypt = "no" -set pgp_self_encrypt_as = "PGP-KEY" +set smime_self_encrypt = "yes" +set smime_default_key = "SMIME-KEY" +# set smime_sign_as = "SMIME-SIGNING-KEY" # vim: syntax=neomuttrc From f1820b92c7f510c32ab564007a333597d46dad8c Mon Sep 17 00:00:00 2001 From: Konstantin Stephan Date: Mon, 15 Jan 2018 14:43:53 +0000 Subject: [PATCH 13/16] Update smime.rc: Typo fix, consistent headings --- contrib/smime.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/smime.rc b/contrib/smime.rc index bc15fed03b3..dfd724f876c 100644 --- a/contrib/smime.rc +++ b/contrib/smime.rc @@ -19,7 +19,7 @@ set crypt_replysign = yes set crypt_replysignencrypted = yes set crypt_verify_sig = yes -# Section A: Key Management. +# Section A: Key Management # The (default) keyfile for signing/decrypting. Uncomment the following # line and replace the keyid with your own. @@ -56,7 +56,7 @@ set smime_import_cert_command="/usr/lib/neomutt/smime_keys add_cert %f" -# Sction B: Outgoing messages +# Section B: Outgoing messages # Algorithm to use for encryption. # valid choices are aes128, aes192, aes256, rc2-40, rc2-64, rc2-128, des, des3 @@ -74,7 +74,7 @@ set smime_sign_command="openssl smime -sign -md %d -signer %c -inkey %k -passin -#Section C: Incoming messages +# Section C: Incoming messages # Decrypt a message. Output is a MIME entity. set smime_decrypt_command="openssl smime -decrypt -passin stdin -inform DER -in %f -inkey %k -recip %c" From 563158a0c044c60ab28ce025f540b75b462a3070 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Mon, 15 Jan 2018 16:06:30 -0800 Subject: [PATCH 14/16] Add pgp_default_key and smime_sign_as info to contrib rc files. Explain $pgp_default_key vs $pgp_sign_as in gpg.rc. Explain $smime_default_key vs $smime_sign_as in smime.rc. --- contrib/gpg.rc | 27 +++++++++++++++++++++++++-- contrib/smime.rc | 21 +++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/contrib/gpg.rc b/contrib/gpg.rc index 680bc7a3dfb..9f5740f316d 100644 --- a/contrib/gpg.rc +++ b/contrib/gpg.rc @@ -8,7 +8,7 @@ # the "loopback" argument in instances where "--passphrase-fd" is # used. # -# The gpg-2comp found in some comments comes from +# Some of the older commented-out versions of the commands use gpg-2comp from: # http://70t.de/download/gpg-2comp.tar.gz # # %p The empty string when no passphrase is needed, @@ -24,12 +24,35 @@ # file's name. # # %a In "signing" contexts, this expands to the value of the -# configuration variable $pgp_sign_as. You probably need to +# configuration variable $pgp_sign_as, if set, otherwise +# $pgp_default_key. You probably need to # use this within a conditional % sequence. # # %r In many contexts, neomutt passes key IDs to pgp. %r expands to # a list of key IDs. +# Section A: Key Management + +# The default key for encryption (used by $pgp_self_encrypt and +# $postpone_encrypt). +# +# It will also be used for signing unless $pgp_sign_as is set to a +# key. +# +# Unless your key does not have encryption capability, uncomment this +# line and replace the keyid with your own. +# +# set pgp_default_key="0x12345678" + +# If you have a separate signing key, or your key _only_ has signing +# capability, uncomment this line and replace the keyid with your +# signing keyid. +# +# set pgp_sign_as="0x87654321" + + +# Section B: Commands + # Note that we explicitly set the comment armor header since GnuPG, when used # in some localiaztion environments, generates 8bit data in that header, thereby # breaking PGP/MIME. diff --git a/contrib/smime.rc b/contrib/smime.rc index dfd724f876c..9a6e76a9e80 100644 --- a/contrib/smime.rc +++ b/contrib/smime.rc @@ -19,11 +19,28 @@ set crypt_replysign = yes set crypt_replysignencrypted = yes set crypt_verify_sig = yes + # Section A: Key Management -# The (default) keyfile for signing/decrypting. Uncomment the following +# The default keyfile for encryption (used by $smime_self_encrypt and +# $postpone_encrypt). +# +# It will also be used for decryption unless +# $smime_decrypt_use_default_key is unset. +# +# It will additionally be used for signing unless $smime_sign_as is +# set to a key. +# +# Unless your key does not have encryption capability, uncomment this # line and replace the keyid with your own. -set smime_default_key="12345678.0" +# +# set smime_default_key="12345678.0" + +# If you have a separate signing key, or your key _only_ has signing +# capability, uncomment this line and replace the keyid with your +# signing keyid. +# +# set smime_sign_as="87654321.0" # Uncomment to make neomutt ask what key to use when trying to decrypt a message. # It will use the default key above (if that was set) else. From 1a028043810246b34ebdf4961b132347de3e7849 Mon Sep 17 00:00:00 2001 From: Olaf Hering Date: Tue, 16 Jan 2018 09:40:06 +0100 Subject: [PATCH 15/16] Split Copyright and Thanks in help output. The Copyright string is changing often, and its content is obvious. It does not need translation. The remaining string can be translated. This change avoids a stale translation once one of the years change. Signed-off-by: Olaf Hering --- version.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/version.c b/version.c index b9ebadbe38c..7811cddd480 100644 --- a/version.c +++ b/version.c @@ -48,18 +48,19 @@ extern unsigned char cc_cflags[]; extern unsigned char configure_options[]; static const char *Copyright = - N_("Copyright (C) 1996-2016 Michael R. Elkins \n" - "Copyright (C) 1996-2002 Brandon Long \n" - "Copyright (C) 1997-2009 Thomas Roessler \n" - "Copyright (C) 1998-2005 Werner Koch \n" - "Copyright (C) 1999-2017 Brendan Cully \n" - "Copyright (C) 1999-2002 Tommi Komulainen \n" - "Copyright (C) 2000-2004 Edmund Grimley Evans \n" - "Copyright (C) 2006-2009 Rocco Rutte \n" - "Copyright (C) 2014-2017 Kevin J. McCarthy \n" - "Copyright (C) 2015-2017 Richard Russon \n" - "\n" - "Many others not mentioned here contributed code, fixes,\n" + "Copyright (C) 1996-2016 Michael R. Elkins \n" + "Copyright (C) 1996-2002 Brandon Long \n" + "Copyright (C) 1997-2009 Thomas Roessler \n" + "Copyright (C) 1998-2005 Werner Koch \n" + "Copyright (C) 1999-2017 Brendan Cully \n" + "Copyright (C) 1999-2002 Tommi Komulainen \n" + "Copyright (C) 2000-2004 Edmund Grimley Evans \n" + "Copyright (C) 2006-2009 Rocco Rutte \n" + "Copyright (C) 2014-2017 Kevin J. McCarthy \n" + "Copyright (C) 2015-2017 Richard Russon \n"; + +static const char *Thanks = + N_("Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n"); static const char *License = N_( @@ -435,7 +436,8 @@ void print_version(void) void print_copyright(void) { puts(mutt_make_version()); - puts(_(Copyright)); + puts(Copyright); + puts(_(Thanks)); puts(_(License)); puts(_(Obtaining)); puts(_(ReachingUs)); From 6fc83eb0127c5c1d50339a69371aafc2af6d088b Mon Sep 17 00:00:00 2001 From: Richard Russon Date: Tue, 16 Jan 2018 23:21:15 +0000 Subject: [PATCH 16/16] strip out copyright translations --- po/bg.po | 11 ----------- po/ca.po | 21 --------------------- po/cs.po | 21 --------------------- po/da.po | 21 --------------------- po/de.po | 22 ---------------------- po/el.po | 11 ----------- po/en_GB.po | 22 ---------------------- po/eo.po | 21 --------------------- po/es.po | 22 ---------------------- po/et.po | 11 ----------- po/eu.po | 19 ------------------- po/fr.po | 21 --------------------- po/ga.po | 19 ------------------- po/gl.po | 11 ----------- po/hu.po | 11 ----------- po/id.po | 19 ------------------- po/it.po | 20 -------------------- po/ja.po | 11 ----------- po/ko.po | 11 ----------- po/lt.po | 11 ----------- po/nl.po | 21 --------------------- po/pl.po | 22 ---------------------- po/pt_BR.po | 11 ----------- po/ru.po | 21 --------------------- po/sk.po | 11 ----------- po/sv.po | 19 ------------------- po/tr.po | 19 ------------------- po/uk.po | 21 --------------------- po/zh_CN.po | 20 -------------------- po/zh_TW.po | 11 ----------- 30 files changed, 512 deletions(-) diff --git a/po/bg.po b/po/bg.po index 1202f2509c4..aa51d0c8701 100644 --- a/po/bg.po +++ b/po/bg.po @@ -6477,17 +6477,6 @@ msgstr "Родителското писмо не е видимо в този о #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/ca.po b/po/ca.po index ad8fa297afa..64679865909 100644 --- a/po/ca.po +++ b/po/ca.po @@ -6637,30 +6637,9 @@ msgstr "El missatge pare no és visible en aquesta vista limitada." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright © 1996-2016 Michael R. Elkins \n" -"Copyright © 1996-2002 Brandon Long \n" -"Copyright © 1997-2009 Thomas Roessler \n" -"Copyright © 1998-2005 Werner Koch \n" -"Copyright © 1999-2014 Brendan Cully \n" -"Copyright © 1999-2002 Tommi Komulainen \n" -"Copyright © 2000-2004 Edmund Grimley Evans \n" -"Copyright © 2006-2009 Rocco Rutte \n" -"Copyright © 2014-2016 Kevin J. McCarthy \n" -"\n" "Moltes altres persones que no s’hi mencionen han contribuït amb codi,\n" "solucions i suggeriments.\n" diff --git a/po/cs.po b/po/cs.po index cf6a12cf58d..cc770129146 100644 --- a/po/cs.po +++ b/po/cs.po @@ -6290,30 +6290,9 @@ msgstr "Rodičovská zpráva není v omezeném zobrazení viditelná." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright © 1996-2016 Michael R. Elkins \n" -"Copyright © 1996-2002 Brandon Long \n" -"Copyright © 1997-2009 Thomas Roessler \n" -"Copyright © 1998-2005 Werner Koch \n" -"Copyright © 1999-2014 Brendan Cully \n" -"Copyright © 1999-2002 Tommi Komulainen \n" -"Copyright © 2000-2004 Edmund Grimley Evans \n" -"Copyright © 2006-2009 Rocco Rutte \n" -"Copyright © 2014-2016 Kevin J. McCarthy \n" -"\n" "Mnoho dalších zde nezmíněných přispělo kódem, opravami a nápady.\n" #: version.c:66 diff --git a/po/da.po b/po/da.po index 7638c2333e2..a0a9070600c 100644 --- a/po/da.po +++ b/po/da.po @@ -6267,30 +6267,9 @@ msgstr "Forrige brev i tråden er ikke synligt i afgrænset oversigt." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"\n" "Mange andre, som ikke er nævnt her, har bidraget med kode, rettelser\n" "og forslag.\n" diff --git a/po/de.po b/po/de.po index e80c57f5527..991b40b5686 100644 --- a/po/de.po +++ b/po/de.po @@ -6260,31 +6260,9 @@ msgstr "Bezugsnachricht ist in dieser begrenzten Ansicht nicht sichtbar." #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Viele andere, welche hier nicht explizit genannt werden, haben Code,\n" "Fehlerkorrekturen und Hinweise beigesteuert.\n" diff --git a/po/el.po b/po/el.po index a28e76fd50a..6a2f677111d 100644 --- a/po/el.po +++ b/po/el.po @@ -6474,17 +6474,6 @@ msgstr "Το τρέχον μήνυμα δεν είναι ορατό σε αυτ #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/en_GB.po b/po/en_GB.po index 439c2e2ddb5..60759af3250 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -6186,31 +6186,9 @@ msgstr "Parent message is not visible in this limited view." #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" diff --git a/po/eo.po b/po/eo.po index 5e61bf56ce9..776da927867 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6273,30 +6273,9 @@ msgstr "Patra mesaĝo ne estas videbla en ĉi tiu limigita rigardo." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Kopirajto (C) 1996-2016 Michael R. Elkins \n" -"Kopirajto (C) 1996-2002 Brandon Long \n" -"Kopirajto (C) 1997-2009 Thomas Roessler \n" -"Kopirajto (C) 1998-2005 Werner Koch \n" -"Kopirajto (C) 1999-2014 Brendan Cully \n" -"Kopirajto (C) 1999-2002 Tommi Komulainen \n" -"Kopirajto (C) 2000-2004 Edmund Grimley Evans \n" -"Kopirajto (C) 2006-2009 Rocco Rutte \n" -"Kopirajto (C) 2014-2016 Kevin J. McCarthy \n" -"\n" "Multaj aliaj homoj ne menciitaj ĉi tie kontribuis programliniojn,\n" "riparojn, kaj sugestojn.\n" diff --git a/po/es.po b/po/es.po index e3609e8f7f9..aae2cd47b15 100644 --- a/po/es.po +++ b/po/es.po @@ -6519,31 +6519,9 @@ msgstr "El mensaje anterior no es visible en vista limitada" #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2016 Richard Russon \n" -"\n" "Muchos otros que no son mencionados aquí han contribuido con\n" "código, parches y sugerencias.\n" diff --git a/po/et.po b/po/et.po index b3fef5e8720..729479acc0e 100644 --- a/po/et.po +++ b/po/et.po @@ -6435,17 +6435,6 @@ msgstr "Vanem teade ei ole selles piiratud vaates nähtav." #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/eu.po b/po/eu.po index ddb34185ac1..d401426cb4a 100644 --- a/po/eu.po +++ b/po/eu.po @@ -6346,28 +6346,9 @@ msgstr "Jatorrizko mezua ez da ikusgarria bistaratze mugatu honetan." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2007 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2008 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2002 Edmund Grimley Evans \n" -"\n" "Izendatzen ez diren beste zenbaitek kodea, zuzenketak eta gomendioekin\n" "lagundu dute.\n" diff --git a/po/fr.po b/po/fr.po index b0aeb503522..d5e91c5f1fd 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6499,30 +6499,9 @@ msgstr "Le message père n'est pas visible dans cette vue limitée." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"\n" "De nombreuses autres personnes non mentionnées ici ont fourni\n" "du code, des corrections et des suggestions.\n" diff --git a/po/ga.po b/po/ga.po index 4e39eec674d..6f29e514686 100644 --- a/po/ga.po +++ b/po/ga.po @@ -6368,28 +6368,9 @@ msgstr "Níl an mháthair-theachtaireacht infheicthe san amharc srianta seo." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright © 1996-2016 Michael R. Elkins \n" -"Copyright © 1996-2002 Brandon Long \n" -"Copyright © 1997-2006 Thomas Roessler \n" -"Copyright © 1998-2005 Werner Koch \n" -"Copyright © 1999-2006 Brendan Cully \n" -"Copyright © 1999-2002 Tommi Komulainen \n" -"Copyright © 2000-2002 Edmund Grimley Evans \n" -"\n" "Thug neart daoine eile cód, ceartúcháin, agus moltaí dúinn.\n" #: version.c:66 diff --git a/po/gl.po b/po/gl.po index e87e40ed41a..b044c597a0a 100644 --- a/po/gl.po +++ b/po/gl.po @@ -6504,17 +6504,6 @@ msgstr "A mensaxe pai non é visible na vista limitada." #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/hu.po b/po/hu.po index 6c279f488a5..992bd011001 100644 --- a/po/hu.po +++ b/po/hu.po @@ -6472,17 +6472,6 @@ msgstr "A nyitóüzenet nem látható a szűkített nézetben." #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/id.po b/po/id.po index 2e25311ac12..c2393af7e8c 100644 --- a/po/id.po +++ b/po/id.po @@ -6363,28 +6363,9 @@ msgstr "Surat induk tidak bisa dilihat di tampilan terbatas ini." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Hak Cipta (C) 1996-2016 Michael R. Elkins \n" -"Hak Cipta (C) 1996-2002 Brandon Long \n" -"Hak Cipta (C) 1997-2007 Thomas Roessler \n" -"Hak Cipta (C) 1998-2005 Werner Koch \n" -"Hak Cipta (C) 1999-2007 Brendan Cully \n" -"Hak Cipta (C) 1999-2002 Tommi Komulainen \n" -"Hak Cipta (C) 2000-2002 Edmund Grimley Evans \n" -"\n" "Banyak lagi yg tidak disebutkan disini telah menyumbangkan kode, perbaikan,\n" "dan saran.\n" diff --git a/po/it.po b/po/it.po index d6fd51c73d3..4cf7c71575e 100644 --- a/po/it.po +++ b/po/it.po @@ -6334,29 +6334,9 @@ msgstr "Il messaggio padre non è visibil in questa visualizzazione limitata." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2008 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2009 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2002 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"\n" "Molti altri non citati qui hanno contribuito con codice,\n" "correzioni e suggerimenti.\n" diff --git a/po/ja.po b/po/ja.po index 0884052e5c0..efeceedece9 100644 --- a/po/ja.po +++ b/po/ja.po @@ -6268,17 +6268,6 @@ msgstr "親メッセージはこの制限された表示範囲では不可視。 #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/ko.po b/po/ko.po index ffa38db102d..b6f4f91758b 100644 --- a/po/ko.po +++ b/po/ko.po @@ -6423,17 +6423,6 @@ msgstr "제한된 보기로 부모 메일은 보이지 않는 상태임." #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/lt.po b/po/lt.po index 4874cc48115..c2517722153 100644 --- a/po/lt.po +++ b/po/lt.po @@ -6449,17 +6449,6 @@ msgstr "Tėvinis laiškas nematomas ribotame vaizde" #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/nl.po b/po/nl.po index 226368166cf..30047e3adaf 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6291,30 +6291,9 @@ msgstr "Voorafgaand bericht is niet zichtbaar in deze beperkte weergave." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"\n" "Vele anderen die hier niet vermeld zijn hebben code, verbeteringen,\n" "en suggesties bijgedragen.\n" diff --git a/po/pl.po b/po/pl.po index f6c894af20f..379fcc638b3 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6361,31 +6361,9 @@ msgstr "" #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Wielu innych twórców, nie wspomnianych tutaj,\n" "wniosło wiele nowego kodu, poprawek i sugestii.\n" diff --git a/po/pt_BR.po b/po/pt_BR.po index 47e8d49e771..12bb3a609ef 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -6544,17 +6544,6 @@ msgstr "A mensagem pai não está visível nesta visão limitada" #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/ru.po b/po/ru.po index e9c8f4fbaf5..465b0552957 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6300,30 +6300,9 @@ msgstr "Родительское сообщение не видимо при п #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"\n" "Многие части кода, исправления и предложения были сделаны неупомянутыми\n" "здесь людьми.\n" diff --git a/po/sk.po b/po/sk.po index ff677253fa8..af192005021 100644 --- a/po/sk.po +++ b/po/sk.po @@ -6460,17 +6460,6 @@ msgstr "Táto správa nie je viditeľná." #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" diff --git a/po/sv.po b/po/sv.po index 4a4128469ca..6a432a1e9ba 100644 --- a/po/sv.po +++ b/po/sv.po @@ -6351,28 +6351,9 @@ msgstr "Första meddelandet är inte synligt i den här begränsade vyn" #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Upphovsrätt (C) 1996-2016 Michael R. Elkins \n" -"Upphovsrätt (C) 1996-2002 Brandon Long \n" -"Upphovsrätt (C) 1997-2007 Thomas Roessler \n" -"Upphovsrätt (C) 1998-2005 Werner Koch \n" -"Upphovsrätt (C) 1999-2007 Brendan Cully \n" -"Upphovsrätt (C) 1999-2002 Tommi Komulainen \n" -"Upphovsrätt (C) 2000-2002 Edmund Grimley Evans \n" -"\n" "Många ej nämnda personer har bidragit med kod, fixar och förslag.\n" #: version.c:66 diff --git a/po/tr.po b/po/tr.po index fb792af3113..c176b45075f 100644 --- a/po/tr.po +++ b/po/tr.po @@ -6366,28 +6366,9 @@ msgstr "Sınırlandırılmış görünümde ana ileti görünemez." #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Telif hakkı (C) 1996-2016 Michael R. Elkins \n" -"Telif hakkı (C) 1996-2002 Brandon Long \n" -"Telif hakkı (C) 1997-2005 Thomas Roessler \n" -"Telif hakkı (C) 1998-2005 Werner Koch \n" -"Telif hakkı (C) 1999-2005 Brendan Cully \n" -"Telif hakkı (C) 1999-2002 Tommi Komulainen \n" -"Telif hakkı (C) 2000-2002 Edmund Grimley Evans \n" -"\n" "Burada listelenmeyen başka bir çok geliştirici; çok miktarda kod,\n" "düzeltme ve öneriyle yazılıma katkıda bulunmuştur.\n" diff --git a/po/uk.po b/po/uk.po index 301f8272a77..ed2db65adc2 100644 --- a/po/uk.po +++ b/po/uk.po @@ -6258,30 +6258,9 @@ msgstr "Батьківський лист не можна побачити пр #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"\n" "Багато інших не вказаних тут осіб залишили свій код, виправлення і " "побажання.\n" diff --git a/po/zh_CN.po b/po/zh_CN.po index 7c6e6a53bfb..e824fb86e26 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -6326,29 +6326,9 @@ msgstr "父信件在此限制视图中不可见。" #: version.c:51 #, fuzzy msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2008 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2009 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2002 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"\n" "许多这里没有提到的人也贡献了代码,修正以及建议。\n" #: version.c:66 diff --git a/po/zh_TW.po b/po/zh_TW.po index f50c4fdb054..ae58379a499 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -6489,17 +6489,6 @@ msgstr "在限制閱覽模式下無法顯示主信件。" #: version.c:51 msgid "" -"Copyright (C) 1996-2016 Michael R. Elkins \n" -"Copyright (C) 1996-2002 Brandon Long \n" -"Copyright (C) 1997-2009 Thomas Roessler \n" -"Copyright (C) 1998-2005 Werner Koch \n" -"Copyright (C) 1999-2014 Brendan Cully \n" -"Copyright (C) 1999-2002 Tommi Komulainen \n" -"Copyright (C) 2000-2004 Edmund Grimley Evans \n" -"Copyright (C) 2006-2009 Rocco Rutte \n" -"Copyright (C) 2014-2016 Kevin J. McCarthy \n" -"Copyright (C) 2015-2017 Richard Russon \n" -"\n" "Many others not mentioned here contributed code, fixes,\n" "and suggestions.\n" msgstr ""