NeoMutt  2025-12-11-435-g4ac674
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
dlg_verifycert.c
Go to the documentation of this file.
1
23
53
54#include "config.h"
55#include <stdbool.h>
56#include <string.h>
57#include "mutt/lib.h"
58#include "gui/lib.h"
59#include "color/lib.h"
60#include "key/lib.h"
61#include "menu/lib.h"
62#include "ssl.h"
63
65static const struct Mapping VerifyHelp[] = {
66 // clang-format off
67 { N_("Exit"), OP_EXIT },
68 { N_("Help"), OP_HELP },
69 { NULL, 0 },
70 // clang-format on
71};
72
80static int menu_dialog_dokey(struct Menu *menu, int *id)
81{
83
84 if ((event.op == OP_TIMEOUT) || (event.op == OP_ABORT))
85 {
86 *id = event.op;
87 return 0;
88 }
89
90 struct CertMenuData *mdata = menu->mdata;
91 char *p = NULL;
92 if ((event.ch != 0) && (p = strchr(mdata->keys, event.ch)))
93 {
94 *id = OP_MAX + (p - mdata->keys + 1);
95 return 0;
96 }
97
98 if (event.op == OP_NULL)
99 mutt_unget_ch(event.ch);
100 else
101 mutt_unget_op(event.op);
102 return -1;
103}
104
110static int menu_dialog_translate_op(int op)
111{
112 switch (op)
113 {
114 case OP_NEXT_ENTRY:
115 return OP_NEXT_LINE;
116 case OP_PREV_ENTRY:
117 return OP_PREV_LINE;
118 case OP_CURRENT_TOP:
119 return OP_TOP_PAGE;
120 case OP_CURRENT_BOTTOM:
121 return OP_BOTTOM_PAGE;
122 case OP_CURRENT_MIDDLE:
123 return OP_MIDDLE_PAGE;
124 }
125
126 return op;
127}
128
132static int cert_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
133{
134 struct CertMenuData *mdata = menu->mdata;
135
136 int total_cols = 0;
137
138 const char **line_ptr = ARRAY_GET(mdata->carr, line);
139 if (line_ptr)
140 {
141 const int bytes = buf_addstr(buf, *line_ptr);
142 total_cols = mutt_strnwidth(buf_string(buf), bytes);
143 }
144
145 return total_cols;
146}
147
166int dlg_certificate(const char *title, struct StringArray *carr, bool allow_always, bool allow_skip)
167{
169
170 struct CertMenuData mdata = { carr };
171
172 struct Menu *menu = sdw.menu;
173 menu->mdata = &mdata;
174 menu->mdata_free = NULL; // Menu doesn't own the data
176 menu->max = ARRAY_SIZE(carr);
177 menu->show_indicator = false;
178
179 sbar_set_title(sdw.sbar, title);
180
181 if (allow_always)
182 {
183 if (allow_skip)
184 {
185 mdata.prompt = _("(r)eject, accept (o)nce, (a)ccept always, (s)kip");
186 /* L10N: The letters correspond to the choices in the string:
187 "(r)eject, accept (o)nce, (a)ccept always, (s)kip"
188 This is an interactive certificate confirmation prompt for an SSL connection. */
189 mdata.keys = _("roas");
190 }
191 else
192 {
193 mdata.prompt = _("(r)eject, accept (o)nce, (a)ccept always");
194 /* L10N: The letters correspond to the choices in the string:
195 "(r)eject, accept (o)nce, (a)ccept always"
196 This is an interactive certificate confirmation prompt for an SSL connection. */
197 mdata.keys = _("roa");
198 }
199 }
200 else
201 {
202 if (allow_skip)
203 {
204 mdata.prompt = _("(r)eject, accept (o)nce, (s)kip");
205 /* L10N: The letters correspond to the choices in the string:
206 "(r)eject, accept (o)nce, (s)kip"
207 This is an interactive certificate confirmation prompt for an SSL connection. */
208 mdata.keys = _("ros");
209 }
210 else
211 {
212 mdata.prompt = _("(r)eject, accept (o)nce");
213 /* L10N: The letters correspond to the choices in the string:
214 "(r)eject, accept (o)nce"
215 This is an interactive certificate confirmation prompt for an SSL connection. */
216 mdata.keys = _("ro");
217 }
218 }
220
221 struct MuttWindow *old_focus = window_set_focus(menu->win);
222 // ---------------------------------------------------------------------------
223 // Event Loop
224 int choice = 0;
225 int op = OP_NULL;
226 struct KeyEvent event = { 0, OP_NULL };
227 do
228 {
229 window_redraw(NULL);
231
232 // Try to catch dialog keys before ops
233 if (menu_dialog_dokey(menu, &op) != 0)
234 {
236 op = event.op;
237 }
238
239 if (op == OP_TIMEOUT)
240 continue;
241
242 // Convert menubar movement to scrolling
244
245 if (op <= OP_MAX)
246 mutt_debug(LL_DEBUG1, "Got op %s (%d)\n", opcodes_get_name(op), op);
247 else
248 mutt_debug(LL_DEBUG1, "Got choice %d\n", op - OP_MAX);
249
250 switch (op)
251 {
252 case OP_ABORT: // Abort: Ctrl-G
253 case OP_QUIT: // Q)uit
254 case OP_MAX + 1: // R)eject
255 choice = 1;
256 break;
257 case OP_MAX + 2: // O)nce
258 choice = 2;
259 break;
260 case OP_MAX + 3: // A)lways / S)kip
261 choice = 3;
262 break;
263 case OP_MAX + 4: // S)kip
264 choice = 4;
265 break;
266
267 case OP_JUMP:
268 case OP_JUMP_1:
269 case OP_JUMP_2:
270 case OP_JUMP_3:
271 case OP_JUMP_4:
272 case OP_JUMP_5:
273 case OP_JUMP_6:
274 case OP_JUMP_7:
275 case OP_JUMP_8:
276 case OP_JUMP_9:
277 mutt_error(_("Jumping is not implemented for dialogs"));
278 continue;
279
280 case OP_SEARCH:
281 case OP_SEARCH_NEXT:
282 case OP_SEARCH_OPPOSITE:
283 case OP_SEARCH_REVERSE:
284 mutt_error(_("Search is not implemented for this menu"));
285 continue;
286 }
287
288 (void) menu_function_dispatcher(menu->win, &event);
289 } while (choice == 0);
290 // ---------------------------------------------------------------------------
291
292 window_set_focus(old_focus);
294
295 return choice;
296}
#define ARRAY_SIZE(head)
The number of elements stored.
Definition array.h:87
#define ARRAY_GET(head, idx)
Return the element at index.
Definition array.h:109
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition buffer.c:226
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
Color and attribute parsing.
@ MT_COLOR_PROMPT
Question/user input.
Definition color.h:56
size_t mutt_strnwidth(const char *s, size_t n)
Measure a string's width in screen cells.
Definition curs_lib.c:457
static int menu_dialog_dokey(struct Menu *menu, int *id)
Check if there are any menu key events to process.
static int menu_dialog_translate_op(int op)
Convert menubar movement to scrolling.
static const struct Mapping VerifyHelp[]
Help Bar for the Certificate Verification dialog.
struct KeyEvent mutt_getch(GetChFlags flags)
Read a character from the input buffer.
Definition get.c:201
struct KeyEvent km_dokey(const struct MenuDefinition *md, GetChFlags flags)
Determine what a keypress should do.
Definition get.c:434
void mutt_unget_op(int op)
Return an operation to the input buffer.
Definition get.c:133
void mutt_unget_ch(int ch)
Return a keystroke to the input buffer.
Definition get.c:122
#define GETCH_IGNORE_MACRO
Don't use MacroEvents.
Definition get.h:35
int menu_function_dispatcher(struct MuttWindow *win, const struct KeyEvent *event)
Perform a Menu function - Implements function_dispatcher_t -.
Definition functions.c:320
int dlg_certificate(const char *title, struct StringArray *carr, bool allow_always, bool allow_skip)
Ask the user to validate the certificate -.
#define mutt_error(...)
Definition logging2.h:94
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
static int cert_make_entry(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Create a Certificate for the Menu - Implements Menu::make_entry() -.
struct MenuDefinition * MdDialog
Dialog Menu Definition.
Definition functions.c:53
struct MenuDefinition * MdGeneric
Generic Menu Definition.
Definition functions.c:50
Convenience wrapper for the gui headers.
void simple_dialog_free(struct MuttWindow **ptr)
Destroy a simple index Dialog.
Definition simple.c:169
struct SimpleDialogWindows simple_dialog_new(const struct MenuDefinition *md, enum WindowType wtype, const struct Mapping *help_data)
Create a simple index Dialog.
Definition simple.c:132
Manage keymappings.
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
GUI present the user with a selectable list.
void msgwin_set_text(struct MuttWindow *win, const char *text, enum ColorId color)
Set the text for the Message Window.
Definition msgwin.c:483
Convenience wrapper for the library headers.
#define N_(a)
Definition message.h:32
#define _(a)
Definition message.h:28
void window_redraw(struct MuttWindow *win)
Reflow, recalc and repaint a tree of Windows.
struct MuttWindow * window_set_focus(struct MuttWindow *win)
Set the Window focus.
@ WT_DLG_CERTIFICATE
Certificate Dialog, dlg_certificate()
Definition mutt_window.h:81
const char * opcodes_get_name(int op)
Get the name of an opcode.
Definition opcodes.c:48
#define OP_TIMEOUT
1 second with no events
Definition opcodes.h:35
#define OP_ABORT
$abort_key pressed (Ctrl-G)
Definition opcodes.h:36
@ OP_MAX
Definition opcodes.h:1003
void sbar_set_title(struct MuttWindow *win, const char *title)
Set the title for the Simple Bar.
Definition sbar.c:227
Handling of SSL encryption.
String manipulation buffer.
Definition buffer.h:36
Certificate data to use in the Menu.
Definition ssl.h:37
char * prompt
Prompt for user, similar to mw_multi_choice.
Definition ssl.h:39
struct StringArray * carr
Lines of the Certificate.
Definition ssl.h:38
char * keys
Keys used in the prompt.
Definition ssl.h:40
An event such as a keypress.
Definition get.h:50
int op
Function opcode, e.g. OP_HELP.
Definition get.h:52
int ch
Raw key pressed.
Definition get.h:51
Mapping between user-readable string and a constant.
Definition mapping.h:33
Definition lib.h:80
struct MuttWindow * win
Window holding the Menu.
Definition lib.h:88
void(* mdata_free)(struct Menu *menu, void **ptr)
Definition lib.h:163
bool show_indicator
Show the Indicator colour.
Definition lib.h:87
int(* make_entry)(struct Menu *menu, int line, int max_cols, struct Buffer *buf)
Definition lib.h:108
void * mdata
Private data.
Definition lib.h:149
int max
Number of entries in the menu.
Definition lib.h:82
Tuple for the results of simple_dialog_new()
Definition simple.h:35
struct MuttWindow * sbar
Simple Bar.
Definition simple.h:37
struct Menu * menu
Menu.
Definition simple.h:38
struct MuttWindow * dlg
Main Dialog Window.
Definition simple.h:36