tmenunym.c - mixmaster - mixmaster 3.0 patched for libressl
 (HTM) git clone git://parazyd.org/mixmaster.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
       tmenunym.c (11544B)
       ---
            1 /* Mixmaster version 3.0  --  (C) 1999 - 2006 Anonymizer Inc. and others.
            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    $Id: menunym.c 934 2006-06-24 13:40:39Z rabbi $ */
           10 
           11 #ifdef NYMSUPPORT
           12 
           13 #include "menu.h"
           14 #include "mix3.h"
           15 #include <string.h>
           16 #include <stdlib.h>
           17 #ifdef POSIX
           18 #include <unistd.h>
           19 #endif /* POSIX */
           20 
           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 #endif /* USE_PGP */
           70   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 #endif /* USE_PGP */
          465     default:
          466       beep();
          467       goto select;
          468     }
          469 }
          470 
          471 #endif /* USE_NCURSES */
          472 #endif /* NYMSUPPORT */