NeoMutt  2024-12-12-14-g7b49f7
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
functions.c
Go to the documentation of this file.
1
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
62const 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
98const 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
131static void attach_collapse(struct AttachCtx *actx, struct Menu *menu)
132{
133 int rindex, curlevel;
134
135 struct AttachPtr *cur_att = current_attachment(actx, menu);
136 cur_att->collapsed = !cur_att->collapsed;
137 /* When expanding, expand all the children too */
138 if (cur_att->collapsed)
139 return;
140
141 curlevel = cur_att->level;
142 const int index = menu_get_index(menu);
143 rindex = actx->v2r[index] + 1;
144
145 const bool c_digest_collapse = cs_subset_bool(NeoMutt->sub, "digest_collapse");
146 while ((rindex < actx->idxlen) && (actx->idx[rindex]->level > curlevel))
147 {
148 if (c_digest_collapse && (actx->idx[rindex]->body->type == TYPE_MULTIPART) &&
149 mutt_istr_equal(actx->idx[rindex]->body->subtype, "digest"))
150 {
151 actx->idx[rindex]->collapsed = true;
152 }
153 else
154 {
155 actx->idx[rindex]->collapsed = false;
156 }
157 rindex++;
158 }
159}
160
166static bool check_attach(struct AttachPrivateData *priv)
167{
168 if (priv->attach_msg)
169 {
172 return true;
173 }
174
175 return false;
176}
177
183static bool check_readonly(struct Mailbox *m)
184{
185 if (!m || m->readonly)
186 {
188 mutt_error(_("Mailbox is read-only"));
189 return true;
190 }
191
192 return false;
193}
194
200static void recvattach_extract_pgp_keys(struct AttachCtx *actx, struct Menu *menu)
201{
202 if (menu->tag_prefix)
203 {
204 for (int i = 0; i < actx->idxlen; i++)
205 {
206 if (actx->idx[i]->body->tagged)
207 {
209 }
210 }
211 }
212 else
213 {
214 struct AttachPtr *cur_att = current_attachment(actx, menu);
216 }
217}
218
227static int recvattach_pgp_check_traditional(struct AttachCtx *actx, struct Menu *menu)
228{
229 int rc = 0;
230
231 if (menu->tag_prefix)
232 {
233 for (int i = 0; i < actx->idxlen; i++)
234 if (actx->idx[i]->body->tagged)
235 rc = rc || crypt_pgp_check_traditional(actx->idx[i]->fp, actx->idx[i]->body, true);
236 }
237 else
238 {
239 struct AttachPtr *cur_att = current_attachment(actx, menu);
240 rc = crypt_pgp_check_traditional(cur_att->fp, cur_att->body, true);
241 }
242
243 return rc;
244}
245
246// -----------------------------------------------------------------------------
247
251static int op_attachment_collapse(struct AttachPrivateData *priv, int op)
252{
253 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
254 if (!cur_att->body->parts)
255 {
256 mutt_error(_("There are no subparts to show"));
257 return FR_NO_ACTION;
258 }
259 attach_collapse(priv->actx, priv->menu);
260 mutt_update_recvattach_menu(priv->actx, priv->menu, false);
261 return FR_SUCCESS;
262}
263
267static int op_attachment_delete(struct AttachPrivateData *priv, int op)
268{
269 if (check_readonly(priv->mailbox))
270 return FR_ERROR;
271
272 if (priv->mailbox->type == MUTT_POP)
273 {
275 mutt_error(_("Can't delete attachment from POP server"));
276 return FR_ERROR;
277 }
278
279 if (priv->mailbox->type == MUTT_NNTP)
280 {
282 mutt_error(_("Can't delete attachment from news server"));
283 return FR_ERROR;
284 }
285
286 if ((WithCrypto != 0) && (priv->actx->email->security & SEC_ENCRYPT))
287 {
288 mutt_message(_("Deletion of attachments from encrypted messages is unsupported"));
289 return FR_ERROR;
290 }
291 if ((WithCrypto != 0) && (priv->actx->email->security & (SEC_SIGN | SEC_PARTSIGN)))
292 {
293 mutt_message(_("Deletion of attachments from signed messages may invalidate the signature"));
294 }
295
296 if (priv->menu->tag_prefix)
297 {
298 for (int i = 0; i < priv->menu->max; i++)
299 {
300 if (priv->actx->idx[i]->body->tagged)
301 {
302 if (priv->actx->idx[i]->parent_type == TYPE_MULTIPART)
303 {
304 priv->actx->idx[i]->body->deleted = true;
306 }
307 else
308 {
309 mutt_message(_("Only deletion of multipart attachments is supported"));
310 }
311 }
312 }
313 }
314 else
315 {
316 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
317 if (cur_att->parent_type == TYPE_MULTIPART)
318 {
319 cur_att->body->deleted = true;
320 const bool c_resolve = cs_subset_bool(NeoMutt->sub, "resolve");
321 const int index = menu_get_index(priv->menu) + 1;
322 if (c_resolve && (index < priv->menu->max))
323 {
324 menu_set_index(priv->menu, index);
325 }
326 else
327 {
329 }
330 }
331 else
332 {
333 mutt_message(_("Only deletion of multipart attachments is supported"));
334 }
335 }
336
337 return FR_SUCCESS;
338}
339
343static int op_attachment_edit_type(struct AttachPrivateData *priv, int op)
344{
345 recvattach_edit_content_type(priv->actx, priv->menu, priv->actx->email);
347 return FR_SUCCESS;
348}
349
353static int op_attachment_pipe(struct AttachPrivateData *priv, int op)
354{
355 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
356 mutt_pipe_attachment_list(priv->actx, cur_att->fp, priv->menu->tag_prefix,
357 cur_att->body, false);
358 return FR_SUCCESS;
359}
360
364static int op_attachment_print(struct AttachPrivateData *priv, int op)
365{
366 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
367 mutt_print_attachment_list(priv->actx, cur_att->fp, priv->menu->tag_prefix,
368 cur_att->body);
369 return FR_SUCCESS;
370}
371
375static int op_attachment_save(struct AttachPrivateData *priv, int op)
376{
377 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
378 mutt_save_attachment_list(priv->actx, cur_att->fp, priv->menu->tag_prefix,
379 cur_att->body, priv->actx->email, priv->menu);
380
381 const bool c_resolve = cs_subset_bool(NeoMutt->sub, "resolve");
382 const int index = menu_get_index(priv->menu) + 1;
383 if (!priv->menu->tag_prefix && c_resolve && (index < priv->menu->max))
384 menu_set_index(priv->menu, index);
385 return FR_SUCCESS;
386}
387
391static int op_attachment_undelete(struct AttachPrivateData *priv, int op)
392{
393 if (check_readonly(priv->mailbox))
394 return FR_ERROR;
395
396 if (priv->menu->tag_prefix)
397 {
398 for (int i = 0; i < priv->menu->max; i++)
399 {
400 if (priv->actx->idx[i]->body->tagged)
401 {
402 priv->actx->idx[i]->body->deleted = false;
404 }
405 }
406 }
407 else
408 {
409 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
410 cur_att->body->deleted = false;
411 const bool c_resolve = cs_subset_bool(NeoMutt->sub, "resolve");
412 const int index = menu_get_index(priv->menu) + 1;
413 if (c_resolve && (index < priv->menu->max))
414 {
415 menu_set_index(priv->menu, index);
416 }
417 else
418 {
420 }
421 }
422
423 return FR_SUCCESS;
424}
425
429static int op_attachment_view(struct AttachPrivateData *priv, int op)
430{
431 priv->op = mutt_attach_display_loop(priv->sub, priv->menu, op,
432 priv->actx->email, priv->actx, true);
434
435 return FR_CONTINUE;
436}
437
441static int op_attachment_view_mailcap(struct AttachPrivateData *priv, int op)
442{
443 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
444 mutt_view_attachment(cur_att->fp, cur_att->body, MUTT_VA_MAILCAP,
445 priv->actx->email, priv->actx, priv->menu->win);
447 return FR_SUCCESS;
448}
449
453static int op_attachment_view_pager(struct AttachPrivateData *priv, int op)
454{
455 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
456 mutt_view_attachment(cur_att->fp, cur_att->body, MUTT_VA_PAGER,
457 priv->actx->email, priv->actx, priv->menu->win);
459 return FR_SUCCESS;
460}
461
465static int op_attachment_view_text(struct AttachPrivateData *priv, int op)
466{
467 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
468 mutt_view_attachment(cur_att->fp, cur_att->body, MUTT_VA_AS_TEXT,
469 priv->actx->email, priv->actx, priv->menu->win);
471 return FR_SUCCESS;
472}
473
477static int op_bounce_message(struct AttachPrivateData *priv, int op)
478{
479 if (check_attach(priv))
480 return FR_ERROR;
481 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
482 attach_bounce_message(priv->mailbox, cur_att->fp, priv->actx,
483 priv->menu->tag_prefix ? NULL : cur_att->body);
485 return FR_SUCCESS;
486}
487
491static int op_check_traditional(struct AttachPrivateData *priv, int op)
492{
493 if (((WithCrypto & APPLICATION_PGP) != 0) &&
495 {
496 priv->actx->email->security = crypt_query(NULL);
498 }
499 return FR_SUCCESS;
500}
501
505static int op_compose_to_sender(struct AttachPrivateData *priv, int op)
506{
507 if (check_attach(priv))
508 return FR_ERROR;
509 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
510 mutt_attach_mail_sender(priv->actx, priv->menu->tag_prefix ? NULL : cur_att->body);
512 return FR_SUCCESS;
513}
514
518static int op_exit(struct AttachPrivateData *priv, int op)
519{
520 priv->actx->email->attach_del = false;
521 for (int i = 0; i < priv->actx->idxlen; i++)
522 {
523 if (priv->actx->idx[i]->body && priv->actx->idx[i]->body->deleted)
524 {
525 priv->actx->email->attach_del = true;
526 break;
527 }
528 }
529 if (priv->actx->email->attach_del)
530 priv->actx->email->changed = true;
531
532 mutt_actx_free(&priv->actx);
533 return FR_DONE;
534}
535
539static int op_extract_keys(struct AttachPrivateData *priv, int op)
540{
542 return FR_NO_ACTION;
543
546
547 return FR_SUCCESS;
548}
549
553static int op_forget_passphrase(struct AttachPrivateData *priv, int op)
554{
556 return FR_SUCCESS;
557}
558
562static int op_forward_message(struct AttachPrivateData *priv, int op)
563{
564 if (check_attach(priv))
565 return FR_ERROR;
566 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
567 mutt_attach_forward(cur_att->fp, priv->actx->email, priv->actx,
568 priv->menu->tag_prefix ? NULL : cur_att->body, SEND_NO_FLAGS);
570 return FR_SUCCESS;
571}
572
576static int op_list_subscribe(struct AttachPrivateData *priv, int op)
577{
578 if (!check_attach(priv))
580 return FR_SUCCESS;
581}
582
586static int op_list_unsubscribe(struct AttachPrivateData *priv, int op)
587{
588 if (!check_attach(priv))
590 return FR_SUCCESS;
591}
592
596static int op_reply(struct AttachPrivateData *priv, int op)
597{
598 if (check_attach(priv))
599 return FR_ERROR;
600
601 SendFlags flags = SEND_REPLY;
602 if (op == OP_GROUP_REPLY)
603 flags |= SEND_GROUP_REPLY;
604 else if (op == OP_GROUP_CHAT_REPLY)
605 flags |= SEND_GROUP_CHAT_REPLY;
606 else if (op == OP_LIST_REPLY)
607 flags |= SEND_LIST_REPLY;
608
609 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
610 mutt_attach_reply(cur_att->fp, priv->mailbox, priv->actx->email, priv->actx,
611 priv->menu->tag_prefix ? NULL : cur_att->body, flags);
613 return FR_SUCCESS;
614}
615
619static int op_resend(struct AttachPrivateData *priv, int op)
620{
621 if (check_attach(priv))
622 return FR_ERROR;
623 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
624 mutt_attach_resend(cur_att->fp, priv->mailbox, priv->actx,
625 priv->menu->tag_prefix ? NULL : cur_att->body);
627 return FR_SUCCESS;
628}
629
630// -----------------------------------------------------------------------------
631
635static int op_followup(struct AttachPrivateData *priv, int op)
636{
637 if (check_attach(priv))
638 return FR_ERROR;
639
640 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
641 if (!cur_att->body->email->env->followup_to ||
642 !mutt_istr_equal(cur_att->body->email->env->followup_to, "poster") ||
643 (query_quadoption(_("Reply by mail as poster prefers?"), NeoMutt->sub,
644 "followup_to_poster") != MUTT_YES))
645 {
646 mutt_attach_reply(cur_att->fp, priv->mailbox, priv->actx->email, priv->actx,
647 priv->menu->tag_prefix ? NULL : cur_att->body, SEND_NEWS | SEND_REPLY);
649 return FR_SUCCESS;
650 }
651
652 return op_reply(priv, op);
653}
654
658static int op_forward_to_group(struct AttachPrivateData *priv, int op)
659{
660 if (check_attach(priv))
661 return FR_ERROR;
662 struct AttachPtr *cur_att = current_attachment(priv->actx, priv->menu);
663 mutt_attach_forward(cur_att->fp, priv->actx->email, priv->actx,
664 priv->menu->tag_prefix ? NULL : cur_att->body, SEND_NEWS);
666 return FR_SUCCESS;
667}
668
669// -----------------------------------------------------------------------------
670
674static const struct AttachFunction AttachFunctions[] = {
675 // clang-format off
676 { OP_ATTACHMENT_COLLAPSE, op_attachment_collapse },
677 { OP_ATTACHMENT_DELETE, op_attachment_delete },
678 { OP_ATTACHMENT_EDIT_TYPE, op_attachment_edit_type },
679 { OP_PIPE, op_attachment_pipe },
680 { OP_ATTACHMENT_PRINT, op_attachment_print },
681 { OP_ATTACHMENT_SAVE, op_attachment_save },
682 { OP_ATTACHMENT_UNDELETE, op_attachment_undelete },
683 { OP_ATTACHMENT_VIEW, op_attachment_view },
684 { OP_ATTACHMENT_VIEW_MAILCAP, op_attachment_view_mailcap },
685 { OP_ATTACHMENT_VIEW_PAGER, op_attachment_view_pager },
686 { OP_ATTACHMENT_VIEW_TEXT, op_attachment_view_text },
687 { OP_BOUNCE_MESSAGE, op_bounce_message },
688 { OP_CHECK_TRADITIONAL, op_check_traditional },
689 { OP_COMPOSE_TO_SENDER, op_compose_to_sender },
690 { OP_DISPLAY_HEADERS, op_attachment_view },
691 { OP_EXIT, op_exit },
692 { OP_EXTRACT_KEYS, op_extract_keys },
693 { OP_FOLLOWUP, op_followup },
694 { OP_FORGET_PASSPHRASE, op_forget_passphrase },
695 { OP_FORWARD_MESSAGE, op_forward_message },
696 { OP_FORWARD_TO_GROUP, op_forward_to_group },
697 { OP_GROUP_CHAT_REPLY, op_reply },
698 { OP_GROUP_REPLY, op_reply },
699 { OP_LIST_REPLY, op_reply },
700 { OP_LIST_SUBSCRIBE, op_list_subscribe },
701 { OP_LIST_UNSUBSCRIBE, op_list_unsubscribe },
702 { OP_REPLY, op_reply },
703 { OP_RESEND, op_resend },
704 { 0, NULL },
705 // clang-format on
706};
707
712{
713 // The Dispatcher may be called on any Window in the Dialog
714 struct MuttWindow *dlg = dialog_find(win);
715 if (!dlg || !dlg->wdata)
716 return FR_ERROR;
717
718 struct Menu *menu = dlg->wdata;
719 struct AttachPrivateData *priv = menu->mdata;
720 if (!priv)
721 return FR_ERROR;
722
723 int rc = FR_UNKNOWN;
724 for (size_t i = 0; AttachFunctions[i].op != OP_NULL; i++)
725 {
726 const struct AttachFunction *fn = &AttachFunctions[i];
727 if (fn->op == op)
728 {
729 rc = fn->function(priv, op);
730 break;
731 }
732 }
733
734 return rc;
735}
void mutt_actx_free(struct AttachCtx **ptr)
Free an Attachment Context.
Definition: attach.c:198
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:166
static void attach_collapse(struct AttachCtx *actx, struct Menu *menu)
Close the tree of the current attachment.
Definition: functions.c:131
static int recvattach_pgp_check_traditional(struct AttachCtx *actx, struct Menu *menu)
Is the Attachment inline PGP?
Definition: functions.c:227
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:674
static bool check_readonly(struct Mailbox *m)
Check if the Mailbox is readonly.
Definition: functions.c:183
static void recvattach_extract_pgp_keys(struct AttachCtx *actx, struct Menu *menu)
Extract PGP keys from attachments.
Definition: functions.c:200
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:90
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
void mutt_flushinp(void)
Empty all the keyboard buffers.
Definition: get.c:58
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:39
@ FR_DONE
Exit the Dialog.
Definition: dispatcher.h:35
@ FR_UNKNOWN
Unknown function.
Definition: dispatcher.h:33
@ FR_ERROR
Valid function - error occurred.
Definition: dispatcher.h:38
@ FR_CONTINUE
Remain in the Dialog.
Definition: dispatcher.h:34
@ FR_NO_ACTION
Valid function - no action performed.
Definition: dispatcher.h:37
Structs that make up an email.
static int op_exit(struct AliasMenuData *mdata, int op)
exit this menu - Implements alias_function_t -
Definition: functions.c:201
static int op_attachment_print(struct AttachPrivateData *priv, int op)
print the current entry - Implements attach_function_t -
Definition: functions.c:364
static int op_followup(struct AttachPrivateData *priv, int op)
followup to newsgroup - Implements attach_function_t -
Definition: functions.c:635
static int op_forward_message(struct AttachPrivateData *priv, int op)
forward a message with comments - Implements attach_function_t -
Definition: functions.c:562
static int op_attachment_collapse(struct AttachPrivateData *priv, int op)
toggle display of subparts - Implements attach_function_t -
Definition: functions.c:251
static int op_bounce_message(struct AttachPrivateData *priv, int op)
remail a message to another user - Implements attach_function_t -
Definition: functions.c:477
static int op_attachment_edit_type(struct AttachPrivateData *priv, int op)
edit attachment content type - Implements attach_function_t -
Definition: functions.c:343
static int op_extract_keys(struct AttachPrivateData *priv, int op)
extract supported public keys - Implements attach_function_t -
Definition: functions.c:539
static int op_reply(struct AttachPrivateData *priv, int op)
reply to a message - Implements attach_function_t -
Definition: functions.c:596
static int op_attachment_view(struct AttachPrivateData *priv, int op)
view attachment using mailcap entry if necessary - Implements attach_function_t -
Definition: functions.c:429
static int op_forward_to_group(struct AttachPrivateData *priv, int op)
forward to newsgroup - Implements attach_function_t -
Definition: functions.c:658
static int op_attachment_view_mailcap(struct AttachPrivateData *priv, int op)
force viewing of attachment using mailcap - Implements attach_function_t -
Definition: functions.c:441
static int op_compose_to_sender(struct AttachPrivateData *priv, int op)
compose new message to the current message sender - Implements attach_function_t -
Definition: functions.c:505
static int op_attachment_pipe(struct AttachPrivateData *priv, int op)
pipe message/attachment to a shell command - Implements attach_function_t -
Definition: functions.c:353
static int op_attachment_view_pager(struct AttachPrivateData *priv, int op)
view attachment in pager using copiousoutput mailcap - Implements attach_function_t -
Definition: functions.c:453
static int op_forget_passphrase(struct AttachPrivateData *priv, int op)
wipe passphrases from memory - Implements attach_function_t -
Definition: functions.c:553
static int op_attachment_undelete(struct AttachPrivateData *priv, int op)
undelete the current entry - Implements attach_function_t -
Definition: functions.c:391
static int op_list_subscribe(struct AttachPrivateData *priv, int op)
subscribe to a mailing list - Implements attach_function_t -
Definition: functions.c:576
static int op_attachment_delete(struct AttachPrivateData *priv, int op)
delete the current entry - Implements attach_function_t -
Definition: functions.c:267
static int op_attachment_save(struct AttachPrivateData *priv, int op)
save message/attachment to a mailbox/file - Implements attach_function_t -
Definition: functions.c:375
static int op_attachment_view_text(struct AttachPrivateData *priv, int op)
view attachment as text - Implements attach_function_t -
Definition: functions.c:465
static int op_list_unsubscribe(struct AttachPrivateData *priv, int op)
unsubscribe from a mailing list - Implements attach_function_t -
Definition: functions.c:586
static int op_check_traditional(struct AttachPrivateData *priv, int op)
check for classic PGP - Implements attach_function_t -
Definition: functions.c:491
static int op_resend(struct AttachPrivateData *priv, int op)
use the current message as a template for a new one - Implements attach_function_t -
Definition: functions.c:619
int attach_function_dispatcher(struct MuttWindow *win, int op)
Perform a Attach function - Implements function_dispatcher_t -.
Definition: functions.c:711
#define mutt_error(...)
Definition: logging2.h:92
#define mutt_message(...)
Definition: logging2.h:91
Convenience wrapper for the gui headers.
Manage keymappings.
GUI present the user with a selectable list.
#define MENU_REDRAW_FULL
Redraw everything.
Definition: lib.h:59
#define MENU_REDRAW_INDEX
Redraw the index.
Definition: lib.h:56
void menu_queue_redraw(struct Menu *menu, MenuRedrawFlags redraw)
Queue a request for a redraw.
Definition: menu.c:184
int menu_get_index(struct Menu *menu)
Get the current selection in the Menu.
Definition: menu.c:160
#define MENU_REDRAW_CURRENT
Redraw the current line of the menu.
Definition: lib.h:58
MenuRedrawFlags menu_set_index(struct Menu *menu, int index)
Set the current selection in the Menu.
Definition: menu.c:174
@ 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:672
int mutt_view_attachment(FILE *fp, struct Body *b, enum ViewAttachMode mode, struct Email *e, struct AttachCtx *actx, struct MuttWindow *win)
View an attachment.
Definition: mutt_attach.c:419
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:433
@ 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:962
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:725
void mutt_print_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, struct Body *b)
Print a list of Attachments.
Definition: recvattach.c:888
API for encryption/signing of emails.
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition: lib.h:96
#define SEC_PARTSIGN
Not all parts of the email is signed.
Definition: lib.h:88
#define SEC_ENCRYPT
Email is encrypted.
Definition: lib.h:84
#define WithCrypto
Definition: lib.h:122
#define SEC_SIGN
Email is signed.
Definition: lib.h:85
Private state data for the Pager.
@ 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:379
void mutt_update_recvattach_menu(struct AttachCtx *actx, struct Menu *menu, bool init)
Update the Attachment Menu.
Definition: recvattach.c:1214
struct AttachPtr * current_attachment(struct AttachCtx *actx, struct Menu *menu)
Get the current attachment.
Definition: recvattach.c:77
void recvattach_edit_content_type(struct AttachCtx *actx, struct Menu *menu, struct Email *e)
Edit the content type of an attachment.
Definition: recvattach.c:932
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:290
void mutt_attach_mail_sender(struct AttachCtx *actx, struct Body *b)
Compose an email to the sender in the email attachment.
Definition: recvcmd.c:1127
void mutt_attach_forward(FILE *fp, struct Email *e, struct AttachCtx *actx, struct Body *b, SendFlags flags)
Forward an Attachment.
Definition: recvcmd.c:793
void attach_bounce_message(struct Mailbox *m, FILE *fp, struct AttachCtx *actx, struct Body *b)
Bounce function, from the attachment menu.
Definition: recvcmd.c:166
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:949
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:2973
bool mutt_send_list_subscribe(struct Mailbox *m, struct Email *e)
Send a mailing-list subscription email.
Definition: send.c:2944
#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
Sidebar functions.
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:45
attach_function_t function
Function to call.
Definition: functions.h:47
int op
Op code, e.g. OP_ATTACHMENT_COLLAPSE.
Definition: functions.h:46
Private state data for Attachments.
Definition: private_data.h:36
int op
Op returned from the Pager, e.g. OP_NEXT_ENTRY.
Definition: private_data.h:41
struct Menu * menu
Current Menu.
Definition: private_data.h:37
struct ConfigSubset * sub
Config subset.
Definition: private_data.h:39
struct AttachCtx * actx
List of all Attachments.
Definition: private_data.h:38
bool attach_msg
Are we in "attach message" mode?
Definition: private_data.h:42
struct Mailbox * mailbox
Current Mailbox.
Definition: private_data.h:40
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
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
Mapping between a function and an operation.
Definition: lib.h:101
Mapping between an operation and a key sequence.
Definition: lib.h:110
Definition: lib.h:79
struct MuttWindow * win
Window holding the Menu.
Definition: lib.h:86
void * mdata
Private data.
Definition: lib.h:147
bool tag_prefix
User has pressed <tag-prefix>
Definition: lib.h:85
int max
Number of entries in the menu.
Definition: lib.h:81
void * wdata
Private data.
Definition: mutt_window.h:145
Container for Accounts, Notifications.
Definition: neomutt.h:42
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:46