#include <signal.h>
#include <pwd.h>
-#include <setjmp.h>
#include <errno.h>
#include <stdarg.h>
#include "citadel.h"
#endif
#include "screen.h"
+/* work around solaris include files */
+#ifdef reg
+#undef reg
+#endif
+
extern char temp[];
extern char tempdir[];
extern char *axdefs[7];
int r; /* IPC response code */
if (rc_alt_semantics) {
- if (maxmsgnum == highest_msg_read == 0) {
- /* err_printf("maxmsgnum == highest_msg_read == 0\n"); */
+ if (maxmsgnum == 0 && highest_msg_read == 0) {
return;
}
r = CtdlIPCSetLastRead(ipc, (maxmsgnum > highest_msg_read) ?
maxmsgnum : highest_msg_read, buf);
} else {
- r = CtdlIPCSetLastRead(ipc, 0, buf);
+ r = CtdlIPCSetLastRead(ipc, (maxmsgnum > highest_msg_read) ?
+ maxmsgnum : highest_msg_read, buf);
+/* r = CtdlIPCSetLastRead(ipc, maxmsgnum, buf); */
+/* This is a quick-and-dirty fix to all msgs becoming new in Mail>.
+ * It will need to be rethought when messages.c is rewritten.
+ */
}
if (r / 100 != 2)
scr_printf("%s\n", buf);
}
/*
- * validate a user
+ * validate a user (returns 0 for successful validation, nonzero if quitting)
*/
-void val_user(CtdlIPC *ipc, char *user, int do_validate)
+int val_user(CtdlIPC *ipc, char *user, int do_validate)
{
int a;
char cmd[SIZ];
char buf[SIZ];
char *resp = NULL;
int ax = 0;
+ char answer[2];
int r; /* IPC response code */
+ scr_printf("\n");
r = CtdlIPCGetUserRegistration(ipc, user, &resp, cmd);
if (r / 100 == 1) {
a = 0;
if (do_validate) {
/* now set the access level */
- ax = intprompt("Access level", ax, 0, 6);
- r = CtdlIPCValidateUser(ipc, user, ax, cmd);
- if (r / 100 != 2)
- scr_printf("%s\n", cmd);
+ while(1) {
+ sprintf(answer, "%d", ax);
+ strprompt("New access level (? for help, q to quit)",
+ answer, 1);
+ if ((answer[0] >= '0') && (answer[0] <= '6')) {
+ ax = atoi(answer);
+ r = CtdlIPCValidateUser(ipc, user, ax, cmd);
+ if (r / 100 != 2)
+ scr_printf("%s\n\n", cmd);
+ return(0);
+ }
+ if (tolower(answer[0]) == 'q') {
+ scr_printf("*** Aborted.\n\n");
+ return(1);
+ }
+ if (answer[0] == '?') {
+ scr_printf("Available access levels:\n");
+ for (a=0; a<7; ++a) {
+ scr_printf("%d - %s\n",
+ a, axdefs[a]);
+ }
+ }
+ }
}
- scr_printf("\n");
+ return(0);
}
scr_printf("%s\n", cmd);
if (r / 100 == 3) {
extract(buf, cmd, 0);
- val_user(ipc, buf, 1);
+ if (val_user(ipc, buf, 1) != 0) finished = 1;
}
} while (finished == 0);
}
snprintf(sc[26], sizeof sc[26], "%d", (boolprompt(
"Allow Aides to Zap (forget) rooms",
atoi(&sc[26][0]))));
- snprintf(sc[30], sizeof sc[29], "%d", (boolprompt(
+ snprintf(sc[30], sizeof sc[30], "%d", (boolprompt(
"Allow system Aides access to user mailboxes",
atoi(&sc[30][0]))));
*/
strprompt("How often to run network jobs (in seconds)", &sc[28][0], 5);
- strprompt("SMTP server port (-1 to disable)", &sc[24][0], 5);
strprompt("POP3 server port (-1 to disable)", &sc[23][0], 5);
strprompt("IMAP server port (-1 to disable)", &sc[27][0], 5);
+ strprompt("SMTP server port (-1 to disable)", &sc[24][0], 5);
+
+ /* This logic flips the question around, because it's one of those
+ * situations where 0=yes and 1=no
+ */
+ a = atoi(sc[25]);
+ a = (a ? 0 : 1);
+ a = boolprompt("Correct forged From: lines during authenticated SMTP",
+ a);
+ a = (a ? 0 : 1);
+ snprintf(sc[25], sizeof sc[25], "%d", a);
/* Expiry settings */
strprompt("Default user purge time (days)", &sc[16][0], 5);
keyopt(" <3> smart-host (Forward all outbound mail to this host)\n");
keyopt(" <4> directory (Consult the Global Address Book)\n");
keyopt(" <5> SpamAssassin (Address of SpamAssassin server)\n");
- sel = intprompt("Which one", 1, 1, 5);
+ keyopt(" <6> RBL (domain suffix of spam hunting RBL)\n");
+ sel = intprompt("Which one", 1, 1, 6);
switch(sel) {
case 1: strcpy(buf, "localhost");
return;
return;
case 5: strcpy(buf, "spamassassin");
return;
+ case 6: strcpy(buf, "rbl");
+ return;
}
}
ch = keymenu("", "<A>dd|<D>elete|<S>ave|<Q>uit");
switch(ch) {
case 'a':
- ++num_recs;
- if (num_recs == 1)
- recs = malloc(sizeof(char *));
- else recs = realloc(recs,
- (sizeof(char *)) * num_recs);
newprompt("Enter host name: ",
buf, 50);
- strcat(buf, "|");
- get_inet_rec_type(ipc, &buf[strlen(buf)]);
- recs[num_recs-1] = strdup(buf);
+ striplt(buf);
+ if (strlen(buf) > 0) {
+ ++num_recs;
+ if (num_recs == 1)
+ recs = malloc(sizeof(char *));
+ else recs = realloc(recs,
+ (sizeof(char *)) * num_recs);
+ strcat(buf, "|");
+ get_inet_rec_type(ipc,
+ &buf[strlen(buf)]);
+ recs[num_recs-1] = strdup(buf);
+ }
break;
case 'd':
i = intprompt("Delete which one",
err_printf("Can't save config - out of memory!\n");
logoff(ipc, 1);
}
- for (i = 0; i < num_recs; i++) {
+ if (num_recs) for (i = 0; i < num_recs; i++) {
strcat(resp, recs[i]);
strcat(resp, "\n");
}
FILE *tempfp;
FILE *changefp;
- if (strlen(editor_path) == 0) {
+ if (strlen(editor_paths[0]) == 0) {
scr_printf("You must have an external editor configured in"
" order to use this function.\n");
return;
if (editor_pid == 0) {
chmod(filename, 0600);
putenv("WINDOW_TITLE=Network configuration");
- execlp(editor_path, editor_path, filename, NULL);
+ execlp(editor_paths[0], editor_paths[0], filename, NULL);
exit(1);
}
if (editor_pid > 0) {