/[pkg-mixmaster]/trunk/Mix/Src/menunym.c
ViewVC logotype

Contents of /trunk/Mix/Src/menunym.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 647 - (hide annotations) (download)
Sat Oct 25 23:34:13 2003 UTC (9 years, 6 months ago) by weasel
File MIME type: text/plain
File size: 11480 byte(s)
Set keyword expansion for Id on all files that already have $Id$ tags.
1 rabbi 1 /* Mixmaster version 3 -- (C) 1999 Anonymizer Inc.
2    
3     Mixmaster may be redistributed and modified under certain conditions.
4     This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
5     ANY KIND, either express or implied. See the file COPYRIGHT for
6     details.
7    
8     Menu-based user interface - nym management
9 weasel 647 $Id$ */
10 rabbi 1
11 weaselp 574 #ifdef NYMSUPPORT
12 rabbi 1
13     #include "menu.h"
14     #include "mix3.h"
15     #include <string.h>
16     #include <stdlib.h>
17     #ifdef POSIX
18     #include <unistd.h>
19 rabbi 262 #endif /* POSIX */
20 rabbi 1
21     #ifdef USE_NCURSES
22     void menu_nym(char *nnym)
23     {
24     char nym[maxnym][LINELEN];
25     char pending[maxnym][LINELEN];
26     int c, i, num = 0, numpending = 0, select = -1;
27     int edit = 0;
28     BUFFER *nymlist;
29     int s;
30     int pass = 0;
31     char reliability[9]; /* When printing information about a chain,
32     this variable stores the reliability. */
33    
34     nymlist = buf_new();
35    
36     strcpy(nym[0], NONANON);
37     strcatn(nym[0], " (", sizeof(nym[0]));
38     strcatn(nym[0], NAME, sizeof(nym[0]));
39     strcatn(nym[0], ")", sizeof(nym[0]));
40    
41     strcpy(nym[1], ANON);
42     num = 2;
43     if (nymlist_read(nymlist) == -1) {
44     user_delpass();
45     mix_status("");
46     } else
47     pass = 1;
48     while (nymlist_get(nymlist, nym[num], NULL, NULL, NULL, NULL, NULL, &s) >= 0) {
49     if (s == NYM_OK) {
50     if (num < maxnym)
51     num++;
52     } else if (s == NYM_WAITING) {
53     if (numpending < maxnym)
54     strncpy(pending[numpending++], nym[num], LINELEN);
55     }
56     }
57     buf_free(nymlist);
58    
59     nymselect:
60     clear();
61     standout();
62     printw("Select nym:\n\n");
63     standend();
64     #ifdef USE_PGP
65     if (pass)
66     printw("c)reate new nym\ne)dit nym\nd)elete nym\n\n");
67     else
68     printw("[nym passphrase is invalid]\n\n");
69 rabbi 262 #endif /* USE_PGP */
70 rabbi 1 for (i = 0; i < num; i++)
71     printw("%d) %s\n", i, nym[i]);
72     if (numpending > 0) {
73     printw("\n\nWaiting for confirmation: ");
74     for (i = 0; i < numpending; i++)
75     printw("%s ", pending[i]);
76     printw("\n");
77     }
78     select:
79     if (select != -1)
80     printw("\r%d", select);
81     else
82     printw("\r \r");
83     refresh();
84     c = getch();
85     if (c == erasechar())
86     c = KEY_BACKSPACE;
87     if (c >= '0' && c <= '9') {
88     if (select == -1)
89     select = c - '0';
90     else
91     select = 10 * select + c - '0';
92     if (edit ? select == 0 || select >= num + numpending - 1 : select >= num) {
93     beep();
94     select = -1;
95     }
96     refresh();
97     goto select;
98     } else
99     switch (c) {
100     case KEY_BACKSPACE:
101     select /= 10;
102     if (select < 1)
103     select = -1;
104     goto select;
105     case 'q':
106     if (edit) {
107     edit = 0;
108     select = -1;
109     goto nymselect;
110     }
111     break;
112     #ifdef USE_PGP
113     case 'e':
114     if (pass) {
115     if (edit || num + numpending < 3) {
116     edit = 0;
117     select = -1;
118     goto nymselect;
119     } else {
120     clear();
121     standout();
122     printw("Edit nym:\n\n");
123     standend();
124     for (i = 2; i < num + numpending; i++)
125     printw("%d) %s\n", i - 1, i < num ? nym[i] : pending[i - num]);
126     printw("\n");
127     select = -1;
128     edit = NYM_MODIFY;
129     goto select;
130     }
131     }
132     break;
133     case 'd':
134     if (pass) {
135     if (edit || num + numpending < 3) {
136     edit = 0;
137     select = -1;
138     goto nymselect;
139     } else {
140     clear();
141     standout();
142     printw("Delete nym:\n\n");
143     standend();
144     for (i = 2; i < num + numpending; i++)
145     printw("%d) %s\n", i - 1, i < num ? nym[i] : pending[i - num]);
146     printw("\n");
147     select = -1;
148     edit = NYM_DELETE;
149     goto select;
150     }
151     }
152     break;
153     case '\r':
154     case '\n':
155     if (select == -1 || (edit && select == 0)) {
156     beep();
157     edit = 0;
158     select = -1;
159     goto nymselect;
160     }
161     if (!edit) {
162     strncpy(nnym, nym[select], LINELEN);
163     return;
164     }
165     /* fallthru */
166     case 'c':
167     if (pass) {
168     char nymserv[LINELEN] = "*";
169     char replyblock[5][CHAINMAX], dest[10][LINELEN];
170     int latent[5], desttype[5];
171     char mdest[LINELEN], pdest[LINELEN] = "alt.anonymous.messages",
172     psub[LINELEN] = "";
173     int deflatent = 0, defdesttype = MSG_MAIL;
174     char alias[LINELEN] = "";
175     BUFFER *name, *opt;
176     char sendchain[CHAINMAX];
177     int sendnumcopies = 1, rnum = 1;
178     int i;
179     char line[LINELEN];
180     int acksend = 0, signsend = 0, fixedsize = 0, disable = 0,
181     fingerkey = 1;
182    
183     name = buf_new();
184     opt = buf_new();
185     strncpy(sendchain, CHAIN, CHAINMAX);
186     strncpy(mdest, ADDRESS, LINELEN);
187     if (edit)
188     strncpy(alias, select + 1 < num ? nym[select + 1] :
189     pending[select + 1 - num], LINELEN);
190     if (edit == NYM_MODIFY) {
191     nymlist_getnym(alias, NULL, NULL, opt, name, NULL);
192     acksend = bufifind(opt, "+acksend");
193     signsend = bufifind(opt, "+signsend");
194     fixedsize = bufifind(opt, "+fixedsize");
195     disable = bufifind(opt, "+disable");
196     fingerkey = bufifind(opt, "+fingerkey");
197     rnum = -1;
198     }
199     newnym:
200     if (!edit) {
201     clear();
202     standout();
203     printw("Create a nym:");
204     standend();
205    
206     mvprintw(3, 0, "Alias address: ");
207     echo();
208     wgetnstr(stdscr, alias, LINELEN);
209     noecho();
210     if (alias[0] == '\0')
211     goto end;
212     for (i = 0; alias[i] > ' ' && alias[i] != '@'; i++) ;
213     alias[i] = '\0';
214     if (i == 0)
215     goto newnym;
216     mvprintw(4, 0, "Pseudonym: ");
217     echo();
218     wgetnstr(stdscr, line, LINELEN);
219     noecho();
220     buf_sets(name, line);
221     menu_chain(nymserv, 2, 0);
222     }
223     if (edit != NYM_DELETE) {
224     for (i = 0; i < 5; i++) {
225     desttype[i] = defdesttype;
226     latent[i] = deflatent;
227     dest[i][0] = '\0';
228     strcpy(replyblock[i], "*,*,*,*");
229     }
230     if (rnum != -1) {
231     menu_replychain(&defdesttype, &deflatent, mdest, pdest, psub,
232     replyblock[0]);
233     desttype[0] = defdesttype;
234     latent[0] = deflatent;
235     strncpy(dest[0], desttype[0] == MSG_POST ? pdest : mdest,
236     LINELEN);
237     }
238     }
239     redraw:
240     clear();
241     standout();
242     switch (edit) {
243     case NYM_DELETE:
244     printw("Delete nym:");
245     break;
246     case NYM_MODIFY:
247     printw("Edit nym:");
248     break;
249     default:
250     printw("Create a nym:");
251     break;
252     }
253     standend();
254     loop:
255     {
256     if (!edit) {
257     cl(2, 0);
258     printw("Nym: a)lias address: %s", alias);
259     cl(3, 0);
260     printw(" nym s)erver: %s", nymserv);
261     }
262     if (edit != NYM_DELETE) {
263     cl(4, 0);
264     printw(" p)seudonym: %s", name->data);
265     if (edit)
266     mvprintw(6, 0, "Nym modification:");
267     else
268     mvprintw(6, 0, "Nym creation:");
269     }
270     cl(7, 0);
271     chain_reliability(sendchain, 0, reliability); /* chaintype 0=mix */
272     printw(" c)hain to nym server: %-30s (reliability: %s)", sendchain, reliability);
273     cl(8, 0);
274     printw(" n)umber of redundant copies: %d", sendnumcopies);
275     if (edit != NYM_DELETE) {
276     mvprintw(10, 0, "Configuration:\n");
277     printw(" A)cknowledge sending: %s\n", acksend ? "yes" : "no");
278     printw(" S)erver signatures: %s\n", signsend ? "yes" : "no");
279     printw(" F)ixed size replies: %s\n", fixedsize ? "yes" :
280     "no");
281     printw(" D)isable: %s\n", disable ? "yes" : "no");
282     printw(" Finger K)ey: %s\n", fingerkey ? "yes" : "no");
283     mvprintw(17, 0, "Reply chains:");
284     cl(18, 0);
285     if (rnum == -1)
286     printw(" create new r)eply block");
287     else {
288     printw(" number of r)eply chains: %2d reliability", rnum);
289     for (i = 0; i < rnum; i++) {
290     cl(i + 19, 0);
291     chain_reliability(replyblock[i], 1, reliability); /* 1=ek */
292     printw(" %d) %30s %-31s [%s]", i + 1,
293     desttype[i] == MSG_NULL ?
294     "(cover traffic)" : dest[i], replyblock[i],
295     reliability);
296     }
297     }
298     }
299     move(LINES - 1, COLS - 1);
300     refresh();
301     c = getch();
302     if (edit != NYM_DELETE && c >= '1' && c <= '9' && c - '1' < rnum) {
303     menu_replychain(&defdesttype, &deflatent, mdest, pdest, psub,
304     replyblock[c - '1']);
305     desttype[c - '1'] = defdesttype;
306     latent[c - '1'] = deflatent;
307     strncpy(dest[c - '1'],
308     desttype[c - '1'] == MSG_POST ? pdest : mdest, LINELEN);
309     goto redraw;
310     }
311     switch (c) {
312     case 'A':
313     acksend = !acksend;
314     goto redraw;
315     case 'S':
316     signsend = !signsend;
317     goto redraw;
318     case 'F':
319     fixedsize = !fixedsize;
320     goto redraw;
321     case 'D':
322     disable = !disable;
323     goto redraw;
324     case 'K':
325     fingerkey = !fingerkey;
326     goto redraw;
327     case 'q':
328     edit = 0;
329     select = -1;
330     goto nymselect;
331     case '\014':
332     goto redraw;
333     case 'a':
334     cl(2, 0);
335     printw("Nym: a)lias address: ");
336     echo();
337     wgetnstr(stdscr, alias, LINELEN);
338     noecho();
339     for (i = 0; alias[i] > ' ' && alias[i] != '@'; i++) ;
340     alias[i] = '\0';
341     if (i == 0)
342     goto nymselect;
343     goto redraw;
344     case 'p':
345     cl(4, 0);
346     printw(" p)seudonym: ");
347     echo();
348     wgetnstr(stdscr, line, LINELEN);
349     noecho();
350     if (line[0] != '\0')
351     buf_sets(name, line);
352     goto redraw;
353     case 'c':
354     menu_chain(sendchain, 0, 0);
355     goto redraw;
356     case 'n':
357     cl(8, 0);
358     printw(" n)umber of redundant copies: ");
359     echo();
360     wgetnstr(stdscr, line, LINELEN);
361     noecho();
362     sendnumcopies = strtol(line, NULL, 10);
363     if (sendnumcopies < 1 || sendnumcopies > 10)
364     sendnumcopies = 1;
365     goto redraw;
366     case 'r':
367     cl(18, 0);
368     printw(" number of r)eply chains: ");
369     echo();
370     wgetnstr(stdscr, line, LINELEN);
371     noecho();
372     i = rnum;
373     rnum = strtol(line, NULL, 10);
374     if (rnum < 1)
375     rnum = 1;
376     if (rnum > 5)
377     rnum = 5;
378     for (; i < rnum; i++)
379     if (dest[i][0] == '\0') {
380     desttype[i] = defdesttype;
381     latent[i] = deflatent;
382     strncpy(dest[i], defdesttype == MSG_POST ? pdest :
383     mdest, LINELEN);
384     }
385     goto redraw;
386     case 's':
387     menu_chain(nymserv, 2, 0);
388     goto redraw;
389     case '\n':
390     case '\r':
391     {
392     BUFFER *chains;
393     int err;
394    
395     if (rnum == -1)
396     chains = NULL;
397     else {
398     chains = buf_new();
399     for (i = 0; i < rnum; i++)
400     if (replyblock[i][0] != '\0') {
401     if (desttype[i] == MSG_POST)
402     buf_appendf(chains, "Subject: %s\n", psub);
403     if (desttype[i] == MSG_MAIL)
404     buf_appends(chains, "To: ");
405     else if (desttype[i] == MSG_POST)
406     buf_appends(chains, "Newsgroups: ");
407     else
408     buf_appends(chains, "Null:");
409     buf_appendf(chains, "%s\n", dest[i]);
410     buf_appendf(chains, "Chain: %s\n", replyblock[i]);
411     buf_appendf(chains, "Latency: %d\n\n", latent[i]);
412     }
413     }
414     create:
415     clear();
416     buf_setf(opt,
417     " %cacksend %csignsend +cryptrecv %cfixedsize %cdisable %cfingerkey",
418     acksend ? '+' : '-',
419     signsend ? '+' : '-',
420     fixedsize ? '+' : '-',
421     disable ? '+' : '-',
422     fingerkey ? '+' : '-');
423     if (edit) {
424     mix_status("Preparing nymserver configuration message...");
425     err = nym_config(edit, alias, NULL,
426     name, sendchain, sendnumcopies,
427     chains, opt);
428     } else {
429     mix_status("Preparing nym creation request...");
430     err = nym_config(edit, alias, nymserv, name,
431     sendchain, sendnumcopies, chains,
432     opt);
433     }
434     if (err == -3) {
435     beep();
436     mix_status("Bad passphrase!");
437     getch();
438     goto create;
439     }
440     if (err != 0) {
441     mix_genericerror();
442     beep();
443     refresh();
444     } else {
445     if (edit)
446     mix_status("Nymserver configuration message completed.");
447     else
448     mix_status("Nym creation request completed.");
449     }
450     if (chains)
451     buf_free(chains);
452     goto end;
453     }
454     default:
455     beep();
456     goto loop;
457     }
458     }
459     end:
460     buf_free(name);
461     buf_free(opt);
462     return;
463     }
464 rabbi 262 #endif /* USE_PGP */
465 rabbi 1 default:
466     beep();
467     goto select;
468     }
469     }
470    
471 rabbi 262 #endif /* USE_NCURSES */
472 weaselp 574 #endif /* NYMSUPPORT */

Properties

Name Value
svn:keywords Id

  ViewVC Help
Powered by ViewVC 1.1.5