Thanks to visit codestin.com
Credit goes to code.neomutt.org

NeoMutt  2025-12-11-189-gceedb6
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
functions.c
Go to the documentation of this file.
1
23
29
30#include "config.h"
31#ifdef _MAKEDOC
32#include "docs/makedoc_defs.h"
33#else
34#include <stdbool.h>
35#include <stdio.h>
36#include "mutt/lib.h"
37#include "config/lib.h"
38#include "email/lib.h"
39#include "core/lib.h"
40#include "gui/lib.h"
41#include "key/lib.h"
42#include "menu/lib.h"
43#include "ncrypt/lib.h"
44#include "question/lib.h"
45#include "send/lib.h"
46#include "attach.h"
47#include "functions.h"
48#include "mutt_attach.h"
49#include "private_data.h"
50#include "recvattach.h"
51#include "recvcmd.h"
52#endif
53
56 "Function not permitted in attach-message mode");
57
58// clang-format off
62static const struct MenuFuncOp OpAttachment[] = { /* map: attachment */
63 { "bounce-message", OP_BOUNCE_MESSAGE },
64 { "check-traditional-pgp", OP_CHECK_TRADITIONAL },
65 { "collapse-parts", OP_ATTACHMENT_COLLAPSE },
66 { "compose-to-sender", OP_COMPOSE_TO_SENDER },
67 { "delete-entry", OP_ATTACHMENT_DELETE },
68 { "display-toggle-weed", OP_DISPLAY_HEADERS },
69 { "edit-type", OP_ATTACHMENT_EDIT_TYPE },
70 { "exit", OP_EXIT },
71 { "extract-keys", OP_EXTRACT_KEYS },
72 { "followup-message", OP_FOLLOWUP },
73 { "forget-passphrase", OP_FORGET_PASSPHRASE },
74 { "forward-message", OP_FORWARD_MESSAGE },
75 { "forward-to-group", OP_FORWARD_TO_GROUP },
76 { "group-chat-reply", OP_GROUP_CHAT_REPLY },
77 { "group-reply", OP_GROUP_REPLY },
78 { "list-reply", OP_LIST_REPLY },
79 { "list-subscribe", OP_LIST_SUBSCRIBE },
80 { "list-unsubscribe", OP_LIST_UNSUBSCRIBE },
81 { "pipe-entry", OP_PIPE },
82 { "pipe-message", OP_PIPE },
83 { "print-entry", OP_ATTACHMENT_PRINT },
84 { "reply", OP_REPLY },
85 { "resend-message", OP_RESEND },
86 { "save-entry", OP_ATTACHMENT_SAVE },
87 { "undelete-entry", OP_ATTACHMENT_UNDELETE },
88 { "view-attach", OP_ATTACHMENT_VIEW },
89 { "view-mailcap", OP_ATTACHMENT_VIEW_MAILCAP },
90 { "view-pager", OP_ATTACHMENT_VIEW_PAGER },
91 { "view-text", OP_ATTACHMENT_VIEW_TEXT },
92 { NULL, 0 },
93};
94
98static const struct MenuOpSeq AttachmentDefaultBindings[] = { /* map: attachment */
99 { OP_ATTACHMENT_COLLAPSE, "v" },
100 { OP_ATTACHMENT_DELETE, "d" },
101 { OP_ATTACHMENT_EDIT_TYPE, "\005" }, // <Ctrl-E>
102 { OP_EXIT, "q" },
103 { OP_PIPE, "|" },
104 { OP_ATTACHMENT_PRINT, "p" },
105 { OP_ATTACHMENT_SAVE, "s" },
106 { OP_ATTACHMENT_UNDELETE, "u" },
107 { OP_ATTACHMENT_VIEW, "<keypadenter>" },
108 { OP_ATTACHMENT_VIEW, "\n" }, // <Enter>
109 { OP_ATTACHMENT_VIEW, "\r" }, // <Return>
110 { OP_ATTACHMENT_VIEW_MAILCAP, "m" },
111 { OP_ATTACHMENT_VIEW_TEXT, "T" },
112 { OP_BOUNCE_MESSAGE, "b" },
113 { OP_CHECK_TRADITIONAL, "\033P" }, // <Alt-P>
114 { OP_DISPLAY_HEADERS, "h" },
115 { OP_EXTRACT_KEYS, "\013" }, // <Ctrl-K>
116 { OP_FORGET_PASSPHRASE, "\006" }, // <Ctrl-F>
117 { OP_FORWARD_MESSAGE, "f" },
118 { OP_GROUP_REPLY, "g" },
119 { OP_LIST_REPLY, "L" },
120 { OP_REPLY, "r" },
121 { OP_RESEND, "\033e" }, // <Alt-e>
122 { 0, NULL },
123};
124// clang-format on
125
129void attach_init_keys(struct SubMenu *sm_generic)
130{
131 struct MenuDefinition *md = NULL;
132 struct SubMenu *sm = NULL;
133
135 md = km_register_menu(MENU_ATTACHMENT, "attach");
136 km_menu_add_submenu(md, sm);
137 km_menu_add_submenu(md, sm_generic);
139}
140
146static void attach_collapse(struct AttachCtx *actx, struct Menu *menu)
147{
148 int rindex, curlevel;
149
150 struct AttachPtr *cur_att = current_attachment(actx, menu);
151 cur_att->collapsed = !cur_att->collapsed;
152 /* When expanding, expand all the children too */
153 if (cur_att->collapsed)
154 return;
155
156 curlevel = cur_att->level;
157 const int index = menu_get_index(menu);
158 rindex = actx->v2r[index] + 1;
159
160 const bool c_digest_collapse = cs_subset_bool(NeoMutt->sub, "digest_collapse");
161 while ((rindex < actx->idxlen) && (actx->idx[rindex]->level > curlevel))
162 {
163 if (c_digest_collapse && (actx->idx[rindex]->body->type == TYPE_MULTIPART) &&
164 mutt_istr_equal(actx->idx[rindex]->body->subtype, "digest"))
165 {
166 actx->idx[rindex]->collapsed = true;
167 }
168 else
169 {
170 actx->idx[rindex]->collapsed = false;
171 }
172 rindex++;
173 }
174}
175
181static bool check_attach(struct AttachPrivateData *priv)
182{
183 if (priv->attach_msg)
184 {
187 return true;
188 }
189
190 return false;
191}
192
198static bool check_readonly(struct Mailbox *m)
199{
200 if (!m || m->readonly)
201 {
203 mutt_error(_("Mailbox is read-only"));
204 return true;
205 }
206
207 return false;
208}
209
215static void recvattach_extract_pgp_keys(struct AttachCtx *actx, struct Menu *menu)
216{
217 if (menu->tag_prefix)
218 {
219 for (int i = 0; i < actx->idxlen; i++)
220 {
221 if (actx->idx[i]->body->tagged)
222 {
224 }
225 }
226 }
227 else
228 {
229 struct AttachPtr *cur_att = current_attachment(actx, menu);
231 }
232}
233
242static int recvattach_pgp_check_traditional(struct AttachCtx *actx, struct Menu *menu)
243{
244 int rc = 0;
245
246 if (menu->tag_prefix)
247 {
248 for (int i = 0; i < actx->idxlen; i++)
249 if (actx->idx[i]->body->tagged)
250 rc = rc || crypt_pgp_check_traditional(actx->idx[i]->fp, actx->idx[i]->body, true);
251 }
252 else
253 {
254 struct AttachPtr *cur_att = current_attachment(actx, menu);
255 rc = crypt_pgp_check_traditional(cur_att->fp, cur_att->body, true);
256 }
257
258 return rc;
259}
260
261// -----------------------------------------------------------------------------
262
266static int op_attachment_collapse(struct AttachPrivateData *priv, const struct KeyEvent *event)
267{
268 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
269 if (!cur_att->body->parts)
270 {
271 mutt_error(_("There are no subparts to show"));
272 return FR_NO_ACTION;
273 }
274 attach_collapse(priv->actx, priv->menu);
275 mutt_update_recvattach_menu(priv->actx, priv->menu, false);
276 return FR_SUCCESS;
277}
278
282static int op_attachment_delete(struct AttachPrivateData *priv, const struct KeyEvent *event)
283{
284 if (check_readonly(priv->mailbox))
285 return FR_ERROR;
286
287 if (priv->mailbox->type == MUTT_POP)
288 {
290 mutt_error(_("Can't delete attachment from POP server"));
291 return FR_ERROR;
292 }
293
294 if (priv->mailbox->type == MUTT_NNTP)
295 {
297 mutt_error(_("Can't delete attachment from news server"));
298 return FR_ERROR;
299 }
300
301 if ((WithCrypto != 0) && (priv->actx->email->security & SEC_ENCRYPT))
302 {
303 mutt_message(_("Deletion of attachments from encrypted messages is unsupported"));
304 return FR_ERROR;
305 }
306 if ((WithCrypto != 0) && (priv->actx->email->security & (SEC_SIGN | SEC_PARTSIGN)))
307 {
308 mutt_message(_("Deletion of attachments from signed messages may invalidate the signature"));
309 }
310
311 if (priv->menu->tag_prefix)
312 {
313 for (int i = 0; i < priv->menu->max; i++)
314 {
315 if (priv->actx->idx[i]->body->tagged)
316 {
317 if (priv->actx->idx[i]->parent_type == TYPE_MULTIPART)
318 {
319 priv->actx->idx[i]->body->deleted = true;
321 }
322 else
323 {
324 mutt_message(_("Only deletion of multipart attachments is supported"));
325 }
326 }
327 }
328 }
329 else
330 {
331 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
332 if (cur_att->parent_type == TYPE_MULTIPART)
333 {
334 cur_att->body->deleted = true;
335 const bool c_resolve = cs_subset_bool(NeoMutt->sub, "resolve");
336 const int index = menu_get_index(priv->menu) + 1;
337 if (c_resolve && (index < priv->menu->max))
338 {
339 menu_set_index(priv->menu, index);
340 }
341 else
342 {
344 }
345 }
346 else
347 {
348 mutt_message(_("Only deletion of multipart attachments is supported"));
349 }
350 }
351
352 return FR_SUCCESS;
353}
354
358static int op_attachment_edit_type(struct AttachPrivateData *priv, const struct KeyEvent *event)
359{
360 recvattach_edit_content_type(priv->actx, priv->menu, priv->actx->email);
362 return FR_SUCCESS;
363}
364
368static int op_attachment_pipe(struct AttachPrivateData *priv, const struct KeyEvent *event)
369{
370 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
371 mutt_pipe_attachment_list(priv->actx, cur_att->fp, priv->menu->tag_prefix,
372 cur_att->body, false);
373 return FR_SUCCESS;
374}
375
379static int op_attachment_print(struct AttachPrivateData *priv, const struct KeyEvent *event)
380{
381 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
382 mutt_print_attachment_list(priv->actx, cur_att->fp, priv->menu->tag_prefix,
383 cur_att->body);
384 return FR_SUCCESS;
385}
386
390static int op_attachment_save(struct AttachPrivateData *priv, const struct KeyEvent *event)
391{
392 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
393 mutt_save_attachment_list(priv->actx, cur_att->fp, priv->menu->tag_prefix,
394 cur_att->body, priv->actx->email, priv->menu);
395
396 const bool c_resolve = cs_subset_bool(NeoMutt->sub, "resolve");
397 const int index = menu_get_index(priv->menu) + 1;
398 if (!priv->menu->tag_prefix && c_resolve && (index < priv->menu->max))
399 menu_set_index(priv->menu, index);
400 return FR_SUCCESS;
401}
402
406static int op_attachment_undelete(struct AttachPrivateData *priv, const struct KeyEvent *event)
407{
408 if (check_readonly(priv->mailbox))
409 return FR_ERROR;
410
411 if (priv->menu->tag_prefix)
412 {
413 for (int i = 0; i < priv->menu->max; i++)
414 {
415 if (priv->actx->idx[i]->body->tagged)
416 {
417 priv->actx->idx[i]->body->deleted = false;
419 }
420 }
421 }
422 else
423 {
424 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
425 cur_att->body->deleted = false;
426 const bool c_resolve = cs_subset_bool(NeoMutt->sub, "resolve");
427 const int index = menu_get_index(priv->menu) + 1;
428 if (c_resolve && (index < priv->menu->max))
429 {
430 menu_set_index(priv->menu, index);
431 }
432 else
433 {
435 }
436 }
437
438 return FR_SUCCESS;
439}
440
444static int op_attachment_view(struct AttachPrivateData *priv, const struct KeyEvent *event)
445{
446 priv->op = mutt_attach_display_loop(priv->sub, priv->menu, event->op,
447 priv->actx->email, priv->actx, true);
449
450 return FR_CONTINUE;
451}
452
457 const struct KeyEvent *event)
458{
459 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
460 mutt_view_attachment(cur_att->fp, cur_att->body, MUTT_VA_MAILCAP,
461 priv->actx->email, priv->actx, priv->menu->win);
463 return FR_SUCCESS;
464}
465
469static int op_attachment_view_pager(struct AttachPrivateData *priv, const struct KeyEvent *event)
470{
471 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
472 mutt_view_attachment(cur_att->fp, cur_att->body, MUTT_VA_PAGER,
473 priv->actx->email, priv->actx, priv->menu->win);
475 return FR_SUCCESS;
476}
477
481static int op_attachment_view_text(struct AttachPrivateData *priv, const struct KeyEvent *event)
482{
483 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
484 mutt_view_attachment(cur_att->fp, cur_att->body, MUTT_VA_AS_TEXT,
485 priv->actx->email, priv->actx, priv->menu->win);
487 return FR_SUCCESS;
488}
489
493static int op_bounce_message(struct AttachPrivateData *priv, const struct KeyEvent *event)
494{
495 if (check_attach(priv))
496 return FR_ERROR;
497 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
498 attach_bounce_message(priv->mailbox, cur_att->fp, priv->actx,
499 priv->menu->tag_prefix ? NULL : cur_att->body);
501 return FR_SUCCESS;
502}
503
507static int op_check_traditional(struct AttachPrivateData *priv, const struct KeyEvent *event)
508{
509 if (((WithCrypto & APPLICATION_PGP) != 0) &&
511 {
512 priv->actx->email->security = crypt_query(NULL);
514 }
515 return FR_SUCCESS;
516}
517
521static int op_compose_to_sender(struct AttachPrivateData *priv, const struct KeyEvent *event)
522{
523 if (check_attach(priv))
524 return FR_ERROR;
525 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
526 mutt_attach_mail_sender(priv->actx, priv->menu->tag_prefix ? NULL : cur_att->body);
528 return FR_SUCCESS;
529}
530
534static int op_exit(struct AttachPrivateData *priv, const struct KeyEvent *event)
535{
536 priv->actx->email->attach_del = false;
537 for (int i = 0; i < priv->actx->idxlen; i++)
538 {
539 if (priv->actx->idx[i]->body && priv->actx->idx[i]->body->deleted)
540 {
541 priv->actx->email->attach_del = true;
542 break;
543 }
544 }
545 if (priv->actx->email->attach_del)
546 priv->actx->email->changed = true;
547
548 mutt_actx_free(&priv->actx);
549 return FR_DONE;
550}
551
555static int op_extract_keys(struct AttachPrivateData *priv, const struct KeyEvent *event)
556{
558 return FR_NO_ACTION;
559
562
563 return FR_SUCCESS;
564}
565
569static int op_forget_passphrase(struct AttachPrivateData *priv, const struct KeyEvent *event)
570{
572 return FR_SUCCESS;
573}
574
578static int op_forward_message(struct AttachPrivateData *priv, const struct KeyEvent *event)
579{
580 if (check_attach(priv))
581 return FR_ERROR;
582 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
583 mutt_attach_forward(cur_att->fp, priv->actx->email, priv->actx,
584 priv->menu->tag_prefix ? NULL : cur_att->body, SEND_NO_FLAGS);
586 return FR_SUCCESS;
587}
588
592static int op_list_subscribe(struct AttachPrivateData *priv, const struct KeyEvent *event)
593{
594 if (!check_attach(priv))
596 return FR_SUCCESS;
597}
598
602static int op_list_unsubscribe(struct AttachPrivateData *priv, const struct KeyEvent *event)
603{
604 if (!check_attach(priv))
606 return FR_SUCCESS;
607}
608
612static int op_reply(struct AttachPrivateData *priv, const struct KeyEvent *event)
613{
614 if (check_attach(priv))
615 return FR_ERROR;
616
617 const int op = event->op;
618 SendFlags flags = SEND_REPLY;
619 if (op == OP_GROUP_REPLY)
620 flags |= SEND_GROUP_REPLY;
621 else if (op == OP_GROUP_CHAT_REPLY)
622 flags |= SEND_GROUP_CHAT_REPLY;
623 else if (op == OP_LIST_REPLY)
624 flags |= SEND_LIST_REPLY;
625
626 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
627 mutt_attach_reply(cur_att->fp, priv->mailbox, priv->actx->email, priv->actx,
628 priv->menu->tag_prefix ? NULL : cur_att->body, flags);
630 return FR_SUCCESS;
631}
632
636static int op_resend(struct AttachPrivateData *priv, const struct KeyEvent *event)
637{
638 if (check_attach(priv))
639 return FR_ERROR;
640 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
641 mutt_attach_resend(cur_att->fp, priv->mailbox, priv->actx,
642 priv->menu->tag_prefix ? NULL : cur_att->body);
644 return FR_SUCCESS;
645}
646
647// -----------------------------------------------------------------------------
648
652static int op_followup(struct AttachPrivateData *priv, const struct KeyEvent *event)
653{
654 if (check_attach(priv))
655 return FR_ERROR;
656
657 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
658 if (!cur_att->body->email->env->followup_to ||
659 !mutt_istr_equal(cur_att->body->email->env->followup_to, "poster") ||
660 (query_quadoption(_("Reply by mail as poster prefers?"), NeoMutt->sub,
661 "followup_to_poster") != MUTT_YES))
662 {
663 mutt_attach_reply(cur_att->fp, priv->mailbox, priv->actx->email, priv->actx,
664 priv->menu->tag_prefix ? NULL : cur_att->body, SEND_NEWS | SEND_REPLY);
666 return FR_SUCCESS;
667 }
668
669 return op_reply(priv, event);
670}
671
675static int op_forward_to_group(struct AttachPrivateData *priv, const struct KeyEvent *event)
676{
677 if (check_attach(priv))
678 return FR_ERROR;
679 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
680 mutt_attach_forward(cur_att->fp, priv->actx->email, priv->actx,
681 priv->menu->tag_prefix ? NULL : cur_att->body, SEND_NEWS);
683 return FR_SUCCESS;
684}
685
686// -----------------------------------------------------------------------------
687
691static const struct AttachFunction AttachFunctions[] = {
692 // clang-format off
693 { OP_ATTACHMENT_COLLAPSE, op_attachment_collapse },
694 { OP_ATTACHMENT_DELETE, op_attachment_delete },
695 { OP_ATTACHMENT_EDIT_TYPE, op_attachment_edit_type },
696 { OP_PIPE, op_attachment_pipe },
697 { OP_ATTACHMENT_PRINT, op_attachment_print },
698 { OP_ATTACHMENT_SAVE, op_attachment_save },
699 { OP_ATTACHMENT_UNDELETE, op_attachment_undelete },
700 { OP_ATTACHMENT_VIEW, op_attachment_view },
701 { OP_ATTACHMENT_VIEW_MAILCAP, op_attachment_view_mailcap },
702 { OP_ATTACHMENT_VIEW_PAGER, op_attachment_view_pager },
703 { OP_ATTACHMENT_VIEW_TEXT, op_attachment_view_text },
704 { OP_BOUNCE_MESSAGE, op_bounce_message },
705 { OP_CHECK_TRADITIONAL, op_check_traditional },
706 { OP_COMPOSE_TO_SENDER, op_compose_to_sender },
707 { OP_DISPLAY_HEADERS, op_attachment_view },
708 { OP_EXIT, op_exit },
709 { OP_EXTRACT_KEYS, op_extract_keys },
710 { OP_FOLLOWUP, op_followup },
711 { OP_FORGET_PASSPHRASE, op_forget_passphrase },
712 { OP_FORWARD_MESSAGE, op_forward_message },
713 { OP_FORWARD_TO_GROUP, op_forward_to_group },
714 { OP_GROUP_CHAT_REPLY, op_reply },
715 { OP_GROUP_REPLY, op_reply },
716 { OP_LIST_REPLY, op_reply },
717 { OP_LIST_SUBSCRIBE, op_list_subscribe },
718 { OP_LIST_UNSUBSCRIBE, op_list_unsubscribe },
719 { OP_REPLY, op_reply },
720 { OP_RESEND, op_resend },
721 { 0, NULL },
722 // clang-format on
723};
724
728int attach_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
729{
730 // The Dispatcher may be called on any Window in the Dialog
731 struct MuttWindow *dlg = dialog_find(win);
732 if (!event || !dlg || !dlg->wdata)
733 return FR_ERROR;
734
735 struct Menu *menu = dlg->wdata;
736 struct AttachPrivateData *priv = menu->mdata;
737 if (!priv)
738 return FR_ERROR;
739
740 const int op = event->op;
741 int rc = FR_UNKNOWN;
742 for (size_t i = 0; AttachFunctions[i].op != OP_NULL; i++)
743 {
744 const struct AttachFunction *fn = &AttachFunctions[i];
745 if (fn->op == op)
746 {
747 rc = fn->function(priv, event);
748 break;
749 }
750 }
751
752 return rc;
753}
void mutt_actx_free(struct AttachCtx **ptr)
Free an Attachment Context.
Definition attach.c:198
static const struct MenuOpSeq AttachmentDefaultBindings[]
Key bindings for the Attachment Menu.
Definition functions.c:98
static bool check_attach(struct AttachPrivateData *priv)
Check if in attach-message mode.
Definition functions.c:181
void attach_init_keys(struct SubMenu *sm_generic)
Initialise the Attach Keybindings - Implements ::init_keys_api.
Definition functions.c:129
static void attach_collapse(struct AttachCtx *actx, struct Menu *menu)
Close the tree of the current attachment.
Definition functions.c:146
static int recvattach_pgp_check_traditional(struct AttachCtx *actx, struct Menu *menu)
Is the Attachment inline PGP?
Definition functions.c:242
static const struct MenuFuncOp OpAttachment[]
Functions for the Attachment Menu.
Definition functions.c:62
static const char * Function_not_permitted_in_attach_message_mode
Error message for unavailable functions in attach mode.
Definition functions.c:55
static const struct AttachFunction AttachFunctions[]
All the NeoMutt functions that the Attach supports.
Definition functions.c:691
static bool check_readonly(struct Mailbox *m)
Check if the Mailbox is readonly.
Definition functions.c:198
static void recvattach_extract_pgp_keys(struct AttachCtx *actx, struct Menu *menu)
Extract PGP keys from attachments.
Definition functions.c:215
Attachment functions.
Private state data for Attachments.
Handling of email attachments.
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
@ MUTT_POP
'POP3' Mailbox type
Definition mailbox.h:52
@ MUTT_NNTP
'NNTP' (Usenet) Mailbox type
Definition mailbox.h:49
void crypt_forget_passphrase(void)
Forget a passphrase and display a message.
Definition crypt.c:89
SecurityFlags crypt_query(struct Body *b)
Check out the type of encryption used.
Definition crypt.c:687
bool crypt_pgp_check_traditional(FILE *fp, struct Body *b, bool just_one)
Wrapper for CryptModuleSpecs::pgp_check_traditional()
Definition cryptglue.c:282
void crypt_pgp_extract_key_from_attachment(FILE *fp, struct Body *b)
Wrapper for CryptModuleSpecs::pgp_extract_key_from_attachment()
Definition cryptglue.c:394
struct MuttWindow * dialog_find(struct MuttWindow *win)
Find the parent Dialog of a Window.
Definition dialog.c:89
@ FR_SUCCESS
Valid function - successfully performed.
Definition dispatcher.h:40
@ FR_DONE
Exit the Dialog.
Definition dispatcher.h:36
@ FR_UNKNOWN
Unknown function.
Definition dispatcher.h:34
@ FR_ERROR
Valid function - error occurred.
Definition dispatcher.h:39
@ FR_CONTINUE
Remain in the Dialog.
Definition dispatcher.h:35
@ FR_NO_ACTION
Valid function - no action performed.
Definition dispatcher.h:38
Structs that make up an email.
void mutt_flushinp(void)
Empty all the keyboard buffers.
Definition get.c:65
static int op_exit(struct AliasMenuData *mdata, const struct KeyEvent *event)
exit this menu - Implements alias_function_t -
Definition functions.c:221
static int op_forward_message(struct AttachPrivateData *priv, const struct KeyEvent *event)
forward a message with comments - Implements attach_function_t -
Definition functions.c:578
static int op_attachment_view_mailcap(struct AttachPrivateData *priv, const struct KeyEvent *event)
force viewing of attachment using mailcap - Implements attach_function_t -
Definition functions.c:456
static int op_attachment_delete(struct AttachPrivateData *priv, const struct KeyEvent *event)
delete the current entry - Implements attach_function_t -
Definition functions.c:282
static int op_reply(struct AttachPrivateData *priv, const struct KeyEvent *event)
reply to a message - Implements attach_function_t -
Definition functions.c:612
static int op_attachment_view_text(struct AttachPrivateData *priv, const struct KeyEvent *event)
view attachment as text - Implements attach_function_t -
Definition functions.c:481
static int op_attachment_collapse(struct AttachPrivateData *priv, const struct KeyEvent *event)
toggle display of subparts - Implements attach_function_t -
Definition functions.c:266
static int op_forget_passphrase(struct AttachPrivateData *priv, const struct KeyEvent *event)
wipe passphrases from memory - Implements attach_function_t -
Definition functions.c:569
static int op_compose_to_sender(struct AttachPrivateData *priv, const struct KeyEvent *event)
compose new message to the current message sender - Implements attach_function_t -
Definition functions.c:521
static int op_list_subscribe(struct AttachPrivateData *priv, const struct KeyEvent *event)
subscribe to a mailing list - Implements attach_function_t -
Definition functions.c:592
static int op_attachment_edit_type(struct AttachPrivateData *priv, const struct KeyEvent *event)
edit attachment content type - Implements attach_function_t -
Definition functions.c:358
static int op_attachment_pipe(struct AttachPrivateData *priv, const struct KeyEvent *event)
pipe message/attachment to a shell command - Implements attach_function_t -
Definition functions.c:368
static int op_check_traditional(struct AttachPrivateData *priv, const struct KeyEvent *event)
check for classic PGP - Implements attach_function_t -
Definition functions.c:507
static int op_list_unsubscribe(struct AttachPrivateData *priv, const struct KeyEvent *event)
unsubscribe from a mailing list - Implements attach_function_t -
Definition functions.c:602
static int op_extract_keys(struct AttachPrivateData *priv, const struct KeyEvent *event)
extract supported public keys - Implements attach_function_t -
Definition functions.c:555
static int op_resend(struct AttachPrivateData *priv, const struct KeyEvent *event)
use the current message as a template for a new one - Implements attach_function_t -
Definition functions.c:636
static int op_attachment_print(struct AttachPrivateData *priv, const struct KeyEvent *event)
print the current entry - Implements attach_function_t -
Definition functions.c:379
static int op_attachment_undelete(struct AttachPrivateData *priv, const struct KeyEvent *event)
undelete the current entry - Implements attach_function_t -
Definition functions.c:406
static int op_attachment_view(struct AttachPrivateData *priv, const struct KeyEvent *event)
view attachment using mailcap entry if necessary - Implements attach_function_t -
Definition functions.c:444
static int op_attachment_view_pager(struct AttachPrivateData *priv, const struct KeyEvent *event)
view attachment in pager using copiousoutput mailcap - Implements attach_function_t -
Definition functions.c:469
static int op_forward_to_group(struct AttachPrivateData *priv, const struct KeyEvent *event)
forward to newsgroup - Implements attach_function_t -
Definition functions.c:675
static int op_bounce_message(struct AttachPrivateData *priv, const struct KeyEvent *event)
remail a message to another user - Implements attach_function_t -
Definition functions.c:493
static int op_attachment_save(struct AttachPrivateData *priv, const struct KeyEvent *event)
save message/attachment to a mailbox/file - Implements attach_function_t -
Definition functions.c:390
static int op_followup(struct AttachPrivateData *priv, const struct KeyEvent *event)
followup to newsgroup - Implements attach_function_t -
Definition functions.c:652
int attach_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Attach function - Implements function_dispatcher_t -.
Definition functions.c:728
#define mutt_error(...)
Definition logging2.h:94
#define mutt_message(...)
Definition logging2.h:93
Convenience wrapper for the gui headers.
void km_menu_add_submenu(struct MenuDefinition *md, struct SubMenu *sm)
Add a SubMenu to a Menu Definition.
Definition init.c:123
struct SubMenu * km_register_submenu(const struct MenuFuncOp functions[])
Register a submenu.
Definition init.c:91
struct MenuDefinition * km_register_menu(int menu, const char *name)
Register a menu.
Definition init.c:107
void km_menu_add_bindings(struct MenuDefinition *md, const struct MenuOpSeq bindings[])
Add Keybindings to a Menu.
Definition init.c:136
Manage keymappings.
GUI present the user with a selectable list.
#define MENU_REDRAW_FULL
Redraw everything.
Definition lib.h:60
#define MENU_REDRAW_INDEX
Redraw the index.
Definition lib.h:57
void menu_queue_redraw(struct Menu *menu, MenuRedrawFlags redraw)
Queue a request for a redraw.
Definition menu.c:186
int menu_get_index(struct Menu *menu)
Get the current selection in the Menu.
Definition menu.c:162
#define MENU_REDRAW_CURRENT
Redraw the current line of the menu.
Definition lib.h:59
MenuRedrawFlags menu_set_index(struct Menu *menu, int index)
Set the current selection in the Menu.
Definition menu.c:176
@ TYPE_MULTIPART
Type: 'multipart/*'.
Definition mime.h:37
Convenience wrapper for the library headers.
#define N_(a)
Definition message.h:32
#define _(a)
Definition message.h:28
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition string.c:674
int mutt_view_attachment(FILE *fp, struct Body *b, enum ViewAttachMode mode, struct Email *e, struct AttachCtx *actx, struct MuttWindow *win)
View an attachment.
Handling of email attachments.
void mutt_save_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, struct Body *b, struct Email *e, struct Menu *menu)
Save a list of attachments.
Definition recvattach.c:426
@ MUTT_VA_MAILCAP
Force viewing using mailcap entry.
Definition mutt_attach.h:45
@ MUTT_VA_PAGER
View attachment in pager using copiousoutput mailcap.
Definition mutt_attach.h:47
@ MUTT_VA_AS_TEXT
Force viewing as text.
Definition mutt_attach.h:46
int mutt_attach_display_loop(struct ConfigSubset *sub, struct Menu *menu, int op, struct Email *e, struct AttachCtx *actx, bool recv)
Event loop for the Attachment menu.
Definition recvattach.c:957
void mutt_pipe_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, struct Body *b, bool filter)
Pipe a list of attachments to a command.
Definition recvattach.c:718
void mutt_print_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, struct Body *b)
Print a list of Attachments.
Definition recvattach.c:882
API for encryption/signing of emails.
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition lib.h:98
#define SEC_PARTSIGN
Not all parts of the email is signed.
Definition lib.h:90
#define SEC_ENCRYPT
Email is encrypted.
Definition lib.h:86
#define WithCrypto
Definition lib.h:124
#define SEC_SIGN
Email is signed.
Definition lib.h:87
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
Definition quad.h:39
Ask the user a question.
enum QuadOption query_quadoption(const char *prompt, struct ConfigSubset *sub, const char *name)
Ask the user a quad-question.
Definition question.c:378
void mutt_update_recvattach_menu(struct AttachCtx *actx, struct Menu *menu, bool init)
Update the Attachment Menu.
struct AttachPtr * current_attachment(struct AttachCtx *actx, struct Menu *menu)
Get the current attachment.
Definition recvattach.c:71
void recvattach_edit_content_type(struct AttachCtx *actx, struct Menu *menu, struct Email *e)
Edit the content type of an attachment.
Definition recvattach.c:927
Routines for managing attachments.
void mutt_attach_resend(FILE *fp, struct Mailbox *m, struct AttachCtx *actx, struct Body *b)
Resend-message, from the attachment menu.
Definition recvcmd.c:286
void mutt_attach_mail_sender(struct AttachCtx *actx, struct Body *b)
Compose an email to the sender in the email attachment.
Definition recvcmd.c:1123
void mutt_attach_forward(FILE *fp, struct Email *e, struct AttachCtx *actx, struct Body *b, SendFlags flags)
Forward an Attachment.
Definition recvcmd.c:789
void attach_bounce_message(struct Mailbox *m, FILE *fp, struct AttachCtx *actx, struct Body *b)
Bounce function, from the attachment menu.
Definition recvcmd.c:162
void mutt_attach_reply(FILE *fp, struct Mailbox *m, struct Email *e, struct AttachCtx *actx, struct Body *b, SendFlags flags)
Attach a reply.
Definition recvcmd.c:945
Send/reply with an attachment.
Convenience wrapper for the send headers.
bool mutt_send_list_unsubscribe(struct Mailbox *m, struct Email *e)
Send a mailing-list unsubscription email.
Definition send.c:2974
bool mutt_send_list_subscribe(struct Mailbox *m, struct Email *e)
Send a mailing-list subscription email.
Definition send.c:2945
#define SEND_GROUP_CHAT_REPLY
Reply to all recipients preserving To/Cc.
Definition send.h:54
uint32_t SendFlags
Flags for mutt_send_message(), e.g. SEND_REPLY.
Definition send.h:40
#define SEND_GROUP_REPLY
Reply to all.
Definition send.h:43
#define SEND_LIST_REPLY
Reply to mailing list.
Definition send.h:44
#define SEND_NO_FLAGS
No flags are set.
Definition send.h:41
#define SEND_REPLY
Reply to sender.
Definition send.h:42
#define SEND_NEWS
Reply to a news article.
Definition send.h:55
A set of attachments.
Definition attach.h:63
struct Email * email
Used by recvattach for updating.
Definition attach.h:64
struct AttachPtr ** idx
Array of attachments.
Definition attach.h:67
short idxlen
Number of attachmentes.
Definition attach.h:68
short * v2r
Mapping from virtual to real attachment.
Definition attach.h:71
A NeoMutt function.
Definition functions.h:49
attach_function_t function
Function to call.
Definition functions.h:51
int op
Op code, e.g. OP_ATTACHMENT_COLLAPSE.
Definition functions.h:50
Private state data for Attachments.
int op
Op returned from the Pager, e.g. OP_NEXT_ENTRY.
struct Menu * menu
Current Menu.
struct ConfigSubset * sub
Config subset.
struct AttachCtx * actx
List of all Attachments.
bool attach_msg
Are we in "attach message" mode?
struct Mailbox * mailbox
Current Mailbox.
An email to which things will be attached.
Definition attach.h:35
struct Body * body
Attachment.
Definition attach.h:36
bool collapsed
Group is collapsed.
Definition attach.h:44
int level
Nesting depth of attachment.
Definition attach.h:40
FILE * fp
Used in the recvattach menu.
Definition attach.h:37
int parent_type
Type of parent attachment, e.g. TYPE_MULTIPART.
Definition attach.h:38
struct Body * parts
parts of a multipart or message/rfc822
Definition body.h:73
bool deleted
Attachment marked for deletion.
Definition body.h:88
struct Email * email
header information for message/rfc822
Definition body.h:74
bool tagged
This attachment is tagged.
Definition body.h:90
char * subtype
content-type subtype
Definition body.h:61
unsigned int type
content-type primary type, ContentType
Definition body.h:40
struct Envelope * env
Envelope information.
Definition email.h:68
SecurityFlags security
bit 0-10: flags, bit 11,12: application, bit 13: traditional pgp See: ncrypt/lib.h pgplib....
Definition email.h:43
bool changed
Email has been edited.
Definition email.h:77
bool attach_del
Has an attachment marked for deletion.
Definition email.h:99
char * followup_to
List of 'followup-to' fields.
Definition envelope.h:80
An event such as a keypress.
Definition get.h:50
int op
Function opcode, e.g. OP_HELP.
Definition get.h:52
A mailbox.
Definition mailbox.h:79
enum MailboxType type
Mailbox type.
Definition mailbox.h:102
bool readonly
Don't allow changes to the mailbox.
Definition mailbox.h:116
Functions for a Dialog or Window.
Definition menu.h:81
Mapping between a function and an operation.
Definition menu.h:39
Mapping between an operation and a key sequence.
Definition menu.h:49
Definition lib.h:80
struct MuttWindow * win
Window holding the Menu.
Definition lib.h:88
void * mdata
Private data.
Definition lib.h:149
bool tag_prefix
User has pressed <tag-prefix>
Definition lib.h:86
int max
Number of entries in the menu.
Definition lib.h:82
void * wdata
Private data.
Container for Accounts, Notifications.
Definition neomutt.h:128
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:134
Collection of related functions.
Definition menu.h:69
@ MENU_ATTACHMENT
Select an attachment.
Definition type.h:35