From c6f40f9f4903151794580d6125543eff97196c1c Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 24 Sep 2007 20:16:15 +0000 Subject: [PATCH] * Citadel configuration screens in the text mode client have been moved to their own file (tuiconfig.c) * Added configuration screen for POP3 client module --- citadel/Makefile.in | 6 +- citadel/citadel.c | 5 + citadel/citadel.rc | 1 + citadel/routines2.c | 835 ---------------------------------- citadel/routines2.h | 5 - citadel/tuiconfig.c | 1055 +++++++++++++++++++++++++++++++++++++++++++ citadel/tuiconfig.h | 7 + 7 files changed, 1071 insertions(+), 843 deletions(-) create mode 100644 citadel/tuiconfig.c create mode 100644 citadel/tuiconfig.h diff --git a/citadel/Makefile.in b/citadel/Makefile.in index f1dfea84d..41149ed4e 100644 --- a/citadel/Makefile.in +++ b/citadel/Makefile.in @@ -114,7 +114,7 @@ SOURCES=aidepost.c auth.c base64.c chkpwd.c chkpw.c citadel.c citadel_ipc.c \ ipc_c_tcp.c locate_host.c md5.c messages.c \ modules/autocompletion/serv_autocompletion.c \ mime_parser.c msgbase.c msgform.c parsedate.c policy.c \ - room_ops.c rooms.c routines.c routines2.c euidindex.c \ + room_ops.c rooms.c routines.c routines2.c tuiconfig.c euidindex.c \ screen.c sendcommand.c \ modules/bio/serv_bio.c \ modules/calendar/serv_calendar.c \ @@ -169,10 +169,10 @@ utils: $(UTIL_TARGETS) $(UTILBIN_TARGETS) citadel$(EXEEXT): citadel.o citadel_ipc.o client_chat.o client_passwords.o \ commands.o html.o ipc_c_tcp.o md5.o messages.o rooms.o routines.o \ - routines2.o screen.o tools.o citadel_dirs.o ecrash.o $(LIBOBJS) + routines2.o tuiconfig.o screen.o tools.o citadel_dirs.o ecrash.o $(LIBOBJS) $(CC) citadel.o citadel_ipc.o client_chat.o client_passwords.o \ commands.o html.o ipc_c_tcp.o md5.o messages.o rooms.o routines.o \ - routines2.o screen.o tools.o citadel_dirs.o ecrash.o $(LIBOBJS) \ + routines2.o tuiconfig.o screen.o tools.o citadel_dirs.o ecrash.o $(LIBOBJS) \ $(LDFLAGS) -o citadel $(LIBS) .y.c: diff --git a/citadel/citadel.c b/citadel/citadel.c index d5c0b1059..7d2b7b704 100644 --- a/citadel/citadel.c +++ b/citadel/citadel.c @@ -38,6 +38,7 @@ #include "axdefs.h" #include "routines.h" #include "routines2.h" +#include "tuiconfig.h" #include "rooms.h" #include "messages.h" #include "commands.h" @@ -2286,6 +2287,10 @@ NEWUSR: if (IsEmptyStr(rc_password)) { dotknown(ipc, 6, NULL); break; + case 127: /* Configure POP3 aggregation */ + do_pop3client_configuration(ipc); + break; + default: /* allow some math on the command */ /* commands 100... to 100+MAX_EDITORS-1 will call the appropriate editor... in other diff --git a/citadel/citadel.rc b/citadel/citadel.rc index c22bb57a9..b34392aa7 100644 --- a/citadel/citadel.rc +++ b/citadel/citadel.rc @@ -354,6 +354,7 @@ cmd=77,0,&.,&Enter,&Username # cmd=41,0,&.,&Enter,re&Gistration cmd=4,0,&.,&Enter,&Message +cmd=127,0,&.,&Enter,remote POP&3 accounts # If you have an external editor defined, it will appear on command 46. cmd=46,0,&.,&Enter,message with &Editor diff --git a/citadel/routines2.c b/citadel/routines2.c index 346b3ea62..9896697a6 100644 --- a/citadel/routines2.c +++ b/citadel/routines2.c @@ -643,839 +643,4 @@ void read_bio(CtdlIPC *ipc) } -/* - * General system configuration command - */ -void do_system_configuration(CtdlIPC *ipc) -{ - -#define NUM_CONFIGS 60 - - char buf[256]; - char sc[NUM_CONFIGS][256]; - char *resp = NULL; - struct ExpirePolicy *site_expirepolicy = NULL; - struct ExpirePolicy *mbx_expirepolicy = NULL; - int a; - int logpages = 0; - int r; /* IPC response code */ - int server_configs = 0; - - /* Clear out the config buffers */ - memset(&sc[0][0], 0, sizeof(sc)); - - /* Fetch the current config */ - r = CtdlIPCGetSystemConfig(ipc, &resp, buf); - if (r / 100 == 1) { - server_configs = num_tokens(resp, '\n'); - for (a=0; aServInfo.supports_ldap) { - a = strlen(&sc[32][0]); - a = (a ? 1 : 0); /* Set only to 1 or 0 */ - a = boolprompt("Connect this Citadel to an external LDAP directory", a); - if (a) { - strprompt("Host name of LDAP server", - &sc[32][0], 127); - strprompt("Port number of LDAP service", - &sc[33][0], 5); - strprompt("Base DN", &sc[34][0], 255); - strprompt("Bind DN", &sc[35][0], 255); - strprompt("Password for bind DN", &sc[36][0], 255); - } - else { - strcpy(&sc[32][0], ""); - } - } - - /* Expiry settings */ - strprompt("Default user purge time (days)", &sc[16][0], 5); - strprompt("Default room purge time (days)", &sc[17][0], 5); - - /* Angels and demons dancing in my head... */ - do { - snprintf(buf, sizeof buf, "%d", site_expirepolicy->expire_mode); - strprompt("System default message expire policy (? for list)", - buf, 1); - if (buf[0] == '?') { - scr_printf("\n" - "1. Never automatically expire messages\n" - "2. Expire by message count\n" - "3. Expire by message age\n"); - } - } while ((buf[0] < '1') || (buf[0] > '3')); - site_expirepolicy->expire_mode = buf[0] - '0'; - - /* ...lunatics and monsters underneath my bed */ - if (site_expirepolicy->expire_mode == 2) { - snprintf(buf, sizeof buf, "%d", site_expirepolicy->expire_value); - strprompt("Keep how many messages online?", buf, 10); - site_expirepolicy->expire_value = atol(buf); - } - if (site_expirepolicy->expire_mode == 3) { - snprintf(buf, sizeof buf, "%d", site_expirepolicy->expire_value); - strprompt("Keep messages for how many days?", buf, 10); - site_expirepolicy->expire_value = atol(buf); - } - - /* Media messiahs preying on my fears... */ - do { - snprintf(buf, sizeof buf, "%d", mbx_expirepolicy->expire_mode); - strprompt("Mailbox default message expire policy (? for list)", - buf, 1); - if (buf[0] == '?') { - scr_printf("\n" - "0. Go with the system default\n" - "1. Never automatically expire messages\n" - "2. Expire by message count\n" - "3. Expire by message age\n"); - } - } while ((buf[0] < '0') || (buf[0] > '3')); - mbx_expirepolicy->expire_mode = buf[0] - '0'; - - /* ...Pop culture prophets playing in my ears */ - if (mbx_expirepolicy->expire_mode == 2) { - snprintf(buf, sizeof buf, "%d", mbx_expirepolicy->expire_value); - strprompt("Keep how many messages online?", buf, 10); - mbx_expirepolicy->expire_value = atol(buf); - } - if (mbx_expirepolicy->expire_mode == 3) { - snprintf(buf, sizeof buf, "%d", mbx_expirepolicy->expire_value); - strprompt("Keep messages for how many days?", buf, 10); - mbx_expirepolicy->expire_value = atol(buf); - } - - strprompt("How often to run network jobs (in seconds)", &sc[28][0], 5); - strprompt("Hour to run purges (0-23)", &sc[31][0], 2); - snprintf(sc[42], sizeof sc[42], "%d", (boolprompt( - "Enable full text search index (warning: resource intensive)", - atoi(&sc[42][0])))); - - snprintf(sc[46], sizeof sc[46], "%d", (boolprompt( - "Perform journaling of email messages", - atoi(&sc[46][0])))); - snprintf(sc[47], sizeof sc[47], "%d", (boolprompt( - "Perform journaling of non-email messages", - atoi(&sc[47][0])))); - if ( (atoi(&sc[46][0])) || (atoi(&sc[47][0])) ) { - strprompt("Email destination of journalized messages", - &sc[48][0], 127); - } - - /* Funambol push stuff */ - int yes_funambol = 0; - if (strlen(sc[53]) > 0) yes_funambol = 1; - yes_funambol = boolprompt("Connect to an external Funambol sync server", yes_funambol); - if (yes_funambol) { - strprompt("Funambol server (blank to disable)", &sc[53][0], 63); - strprompt("Funambol server port", &sc[54][0], 5); - strprompt("Funambol sync source", &sc[55][0], 63); - strprompt("Funambol authentication details (user:pass in Base64)", &sc[56][0],63); - } - else { - sc[53][0] = 0; - sc[54][0] = 0; - sc[55][0] = 0; - sc[56][0] = 0; - } - - /* Master user account */ - int yes_muacct = 0; - if (strlen(sc[58]) > 0) yes_muacct = 1; - yes_muacct = boolprompt("Enable a 'master user' account", yes_muacct); - if (yes_muacct) { - strprompt("Master user name", &sc[58][0], 31); - strprompt("Master user password", &sc[59][0], -31); - } - else { - strcpy(&sc[58][0], ""); - strcpy(&sc[59][0], "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); - } - - /* Save it */ - scr_printf("Save this configuration? "); - if (yesno()) { - r = 1; - for (a = 0; a < NUM_CONFIGS; a++) - r += 1 + strlen(sc[a]); - resp = (char *)calloc(1, r); - if (!resp) { - err_printf("Can't save config - out of memory!\n"); - logoff(ipc, 1); - } - for (a = 0; a < NUM_CONFIGS; a++) { - strcat(resp, sc[a]); - strcat(resp, "\n"); - } - r = CtdlIPCSetSystemConfig(ipc, resp, buf); - if (r / 100 != 4) { - err_printf("%s\n", buf); - } - free(resp); - - r = CtdlIPCSetMessageExpirationPolicy(ipc, 2, site_expirepolicy, buf); - if (r / 100 != 2) { - err_printf("%s\n", buf); - } - - r = CtdlIPCSetMessageExpirationPolicy(ipc, 3, mbx_expirepolicy, buf); - if (r / 100 != 2) { - err_printf("%s\n", buf); - } - - } - if (site_expirepolicy) free(site_expirepolicy); - if (mbx_expirepolicy) free(mbx_expirepolicy); -} - - -/* - * support function for do_internet_configuration() - */ -void get_inet_rec_type(CtdlIPC *ipc, char *buf) { - int sel; - - keyopt(" <1> localhost (Alias for this computer)\n"); - keyopt(" <2> gateway domain (Domain for all Citadel systems)\n"); - 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"); - keyopt(" <6> RBL (domain suffix of spam hunting RBL)\n"); - keyopt(" <7> masq domains (Domains as which users are allowed to masquerade)\n"); - sel = intprompt("Which one", 1, 1, 6); - switch(sel) { - case 1: strcpy(buf, "localhost"); - return; - case 2: strcpy(buf, "gatewaydomain"); - return; - case 3: strcpy(buf, "smarthost"); - return; - case 4: strcpy(buf, "directory"); - return; - case 5: strcpy(buf, "spamassassin"); - return; - case 6: strcpy(buf, "rbl"); - return; - case 7: strcpy(buf, "masqdomain"); - return; - } -} - - -/* - * Internet mail configuration - */ -void do_internet_configuration(CtdlIPC *ipc) -{ - char buf[256]; - char *resp = NULL; - int num_recs = 0; - char **recs = NULL; - char ch; - int badkey; - int i, j; - int quitting = 0; - int modified = 0; - int r; - - r = CtdlIPCGetSystemConfigByType(ipc, INTERNETCFG, &resp, buf); - if (r / 100 == 1) { - while (!IsEmptyStr(resp)) { - extract_token(buf, resp, 0, '\n', sizeof buf); - remove_token(resp, 0, '\n'); - ++num_recs; - if (num_recs == 1) recs = malloc(sizeof(char *)); - else recs = realloc(recs, (sizeof(char *)) * num_recs); - recs[num_recs-1] = malloc(strlen(buf) + 1); - strcpy(recs[num_recs-1], buf); - } - } - if (resp) free(resp); - - do { - scr_printf("\n"); - color(BRIGHT_WHITE); - scr_printf("### Host or domain Record type \n"); - color(DIM_WHITE); - scr_printf("--- -------------------------------------------------- --------------------\n"); - for (i=0; idd|elete|ave|uit"); - switch(ch) { - case 'a': - newprompt("Enter host name: ", - buf, 50); - striplt(buf); - if (!IsEmptyStr(buf)) { - ++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); - } - modified = 1; - break; - case 'd': - i = intprompt("Delete which one", - 1, 1, num_recs) - 1; - free(recs[i]); - --num_recs; - for (j=i; j 0) { - do { - e_ex_code = 0; - b = ka_wait(&e_ex_code); - } while ((b != editor_pid) && (b >= 0)); - editor_pid = (-1); - stty_ctdl(0); - screen_set(); - } - - if (file_checksum(filename) == cksum) { - err_printf("*** No changes to save.\n"); - e_ex_code = 1; - } - - if (e_ex_code == 0) { /* Save changes */ - changefp = fopen(changefile, "w"); - - /* Load all netconfig entries that are *not* of the type we are editing */ - r = CtdlIPCGetRoomNetworkConfig(ipc, &listing, buf); - if (r / 100 == 1) { - while(listing && !IsEmptyStr(listing)) { - extract_token(buf, listing, 0, '\n', sizeof buf); - remove_token(listing, 0, '\n'); - extract_token(instr, buf, 0, '|', sizeof instr); - if (strcasecmp(instr, entrytype)) { - fprintf(changefp, "%s\n", buf); - } - } - } - if (listing) { - free(listing); - listing = NULL; - } - - /* ...and merge that with the data we just edited */ - tempfp = fopen(filename, "r"); - while (fgets(buf, sizeof buf, tempfp) != NULL) { - for (i=0; idd|elete|ave|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 node name : ", buf, 16); - strcat(buf, "|"); - newprompt("Enter shared secret: ", - &buf[strlen(buf)], 18); - strcat(buf, "|"); - newprompt("Enter host or IP : ", - &buf[strlen(buf)], 32); - strcat(buf, "|504"); - strprompt("Enter port number : ", - &buf[strlen(buf)-3], 5); - recs[num_recs-1] = strdup(buf); - modified = 1; - break; - case 'd': - i = intprompt("Delete which one", - 1, 1, num_recs) - 1; - free(recs[i]); - --num_recs; - for (j=i; jdd|elete|ave|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 user name: ", buf, 28); - strcat(buf, "|"); - newprompt("Enter room name: ", - &buf[strlen(buf)], 28); - strcat(buf, "|"); - newprompt("Enter node name: ", - &buf[strlen(buf)], 16); - strcat(buf, "|"); - recs[num_recs-1] = strdup(buf); - modified = 1; - break; - case 'd': - i = intprompt("Delete which one", - 1, 1, num_recs) - 1; - free(recs[i]); - --num_recs; - for (j=i; j +#include +#include +#include +#include +#include +#include +#include +#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include +#include +#include +#include +#include "sysdep.h" +#include "citadel.h" +#include "citadel_ipc.h" +#include "citadel_decls.h" +#include "tuiconfig.h" +#include "messages.h" +#include "routines.h" +#include "commands.h" +#include "tools.h" +#ifndef HAVE_SNPRINTF +#include "snprintf.h" +#endif +#include "screen.h" + +/* work around solaris include files */ +#ifdef reg +#undef reg +#endif + +extern char temp[]; +extern char tempdir[]; +extern char *axdefs[8]; +extern long highest_msg_read; +extern long maxmsgnum; +extern unsigned room_flags; +extern int screenwidth; + + +/* + * General system configuration command + */ +void do_system_configuration(CtdlIPC *ipc) +{ + +#define NUM_CONFIGS 60 + + char buf[256]; + char sc[NUM_CONFIGS][256]; + char *resp = NULL; + struct ExpirePolicy *site_expirepolicy = NULL; + struct ExpirePolicy *mbx_expirepolicy = NULL; + int a; + int logpages = 0; + int r; /* IPC response code */ + int server_configs = 0; + + /* Clear out the config buffers */ + memset(&sc[0][0], 0, sizeof(sc)); + + /* Fetch the current config */ + r = CtdlIPCGetSystemConfig(ipc, &resp, buf); + if (r / 100 == 1) { + server_configs = num_tokens(resp, '\n'); + for (a=0; aServInfo.supports_ldap) { + a = strlen(&sc[32][0]); + a = (a ? 1 : 0); /* Set only to 1 or 0 */ + a = boolprompt("Connect this Citadel to an external LDAP directory", a); + if (a) { + strprompt("Host name of LDAP server", + &sc[32][0], 127); + strprompt("Port number of LDAP service", + &sc[33][0], 5); + strprompt("Base DN", &sc[34][0], 255); + strprompt("Bind DN", &sc[35][0], 255); + strprompt("Password for bind DN", &sc[36][0], 255); + } + else { + strcpy(&sc[32][0], ""); + } + } + + /* Expiry settings */ + strprompt("Default user purge time (days)", &sc[16][0], 5); + strprompt("Default room purge time (days)", &sc[17][0], 5); + + /* Angels and demons dancing in my head... */ + do { + snprintf(buf, sizeof buf, "%d", site_expirepolicy->expire_mode); + strprompt("System default message expire policy (? for list)", + buf, 1); + if (buf[0] == '?') { + scr_printf("\n" + "1. Never automatically expire messages\n" + "2. Expire by message count\n" + "3. Expire by message age\n"); + } + } while ((buf[0] < '1') || (buf[0] > '3')); + site_expirepolicy->expire_mode = buf[0] - '0'; + + /* ...lunatics and monsters underneath my bed */ + if (site_expirepolicy->expire_mode == 2) { + snprintf(buf, sizeof buf, "%d", site_expirepolicy->expire_value); + strprompt("Keep how many messages online?", buf, 10); + site_expirepolicy->expire_value = atol(buf); + } + if (site_expirepolicy->expire_mode == 3) { + snprintf(buf, sizeof buf, "%d", site_expirepolicy->expire_value); + strprompt("Keep messages for how many days?", buf, 10); + site_expirepolicy->expire_value = atol(buf); + } + + /* Media messiahs preying on my fears... */ + do { + snprintf(buf, sizeof buf, "%d", mbx_expirepolicy->expire_mode); + strprompt("Mailbox default message expire policy (? for list)", + buf, 1); + if (buf[0] == '?') { + scr_printf("\n" + "0. Go with the system default\n" + "1. Never automatically expire messages\n" + "2. Expire by message count\n" + "3. Expire by message age\n"); + } + } while ((buf[0] < '0') || (buf[0] > '3')); + mbx_expirepolicy->expire_mode = buf[0] - '0'; + + /* ...Pop culture prophets playing in my ears */ + if (mbx_expirepolicy->expire_mode == 2) { + snprintf(buf, sizeof buf, "%d", mbx_expirepolicy->expire_value); + strprompt("Keep how many messages online?", buf, 10); + mbx_expirepolicy->expire_value = atol(buf); + } + if (mbx_expirepolicy->expire_mode == 3) { + snprintf(buf, sizeof buf, "%d", mbx_expirepolicy->expire_value); + strprompt("Keep messages for how many days?", buf, 10); + mbx_expirepolicy->expire_value = atol(buf); + } + + strprompt("How often to run network jobs (in seconds)", &sc[28][0], 5); + strprompt("Hour to run purges (0-23)", &sc[31][0], 2); + snprintf(sc[42], sizeof sc[42], "%d", (boolprompt( + "Enable full text search index (warning: resource intensive)", + atoi(&sc[42][0])))); + + snprintf(sc[46], sizeof sc[46], "%d", (boolprompt( + "Perform journaling of email messages", + atoi(&sc[46][0])))); + snprintf(sc[47], sizeof sc[47], "%d", (boolprompt( + "Perform journaling of non-email messages", + atoi(&sc[47][0])))); + if ( (atoi(&sc[46][0])) || (atoi(&sc[47][0])) ) { + strprompt("Email destination of journalized messages", + &sc[48][0], 127); + } + + /* Funambol push stuff */ + int yes_funambol = 0; + if (strlen(sc[53]) > 0) yes_funambol = 1; + yes_funambol = boolprompt("Connect to an external Funambol sync server", yes_funambol); + if (yes_funambol) { + strprompt("Funambol server (blank to disable)", &sc[53][0], 63); + strprompt("Funambol server port", &sc[54][0], 5); + strprompt("Funambol sync source", &sc[55][0], 63); + strprompt("Funambol authentication details (user:pass in Base64)", &sc[56][0],63); + } + else { + sc[53][0] = 0; + sc[54][0] = 0; + sc[55][0] = 0; + sc[56][0] = 0; + } + + /* Master user account */ + int yes_muacct = 0; + if (strlen(sc[58]) > 0) yes_muacct = 1; + yes_muacct = boolprompt("Enable a 'master user' account", yes_muacct); + if (yes_muacct) { + strprompt("Master user name", &sc[58][0], 31); + strprompt("Master user password", &sc[59][0], -31); + } + else { + strcpy(&sc[58][0], ""); + strcpy(&sc[59][0], "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + } + + /* Save it */ + scr_printf("Save this configuration? "); + if (yesno()) { + r = 1; + for (a = 0; a < NUM_CONFIGS; a++) + r += 1 + strlen(sc[a]); + resp = (char *)calloc(1, r); + if (!resp) { + err_printf("Can't save config - out of memory!\n"); + logoff(ipc, 1); + } + for (a = 0; a < NUM_CONFIGS; a++) { + strcat(resp, sc[a]); + strcat(resp, "\n"); + } + r = CtdlIPCSetSystemConfig(ipc, resp, buf); + if (r / 100 != 4) { + err_printf("%s\n", buf); + } + free(resp); + + r = CtdlIPCSetMessageExpirationPolicy(ipc, 2, site_expirepolicy, buf); + if (r / 100 != 2) { + err_printf("%s\n", buf); + } + + r = CtdlIPCSetMessageExpirationPolicy(ipc, 3, mbx_expirepolicy, buf); + if (r / 100 != 2) { + err_printf("%s\n", buf); + } + + } + if (site_expirepolicy) free(site_expirepolicy); + if (mbx_expirepolicy) free(mbx_expirepolicy); +} + + +/* + * support function for do_internet_configuration() + */ +void get_inet_rec_type(CtdlIPC *ipc, char *buf) { + int sel; + + keyopt(" <1> localhost (Alias for this computer)\n"); + keyopt(" <2> gateway domain (Domain for all Citadel systems)\n"); + 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"); + keyopt(" <6> RBL (domain suffix of spam hunting RBL)\n"); + keyopt(" <7> masq domains (Domains as which users are allowed to masquerade)\n"); + sel = intprompt("Which one", 1, 1, 6); + switch(sel) { + case 1: strcpy(buf, "localhost"); + return; + case 2: strcpy(buf, "gatewaydomain"); + return; + case 3: strcpy(buf, "smarthost"); + return; + case 4: strcpy(buf, "directory"); + return; + case 5: strcpy(buf, "spamassassin"); + return; + case 6: strcpy(buf, "rbl"); + return; + case 7: strcpy(buf, "masqdomain"); + return; + } +} + + +/* + * Internet mail configuration + */ +void do_internet_configuration(CtdlIPC *ipc) +{ + char buf[256]; + char *resp = NULL; + int num_recs = 0; + char **recs = NULL; + char ch; + int badkey; + int i, j; + int quitting = 0; + int modified = 0; + int r; + + r = CtdlIPCGetSystemConfigByType(ipc, INTERNETCFG, &resp, buf); + if (r / 100 == 1) { + while (!IsEmptyStr(resp)) { + extract_token(buf, resp, 0, '\n', sizeof buf); + remove_token(resp, 0, '\n'); + ++num_recs; + if (num_recs == 1) recs = malloc(sizeof(char *)); + else recs = realloc(recs, (sizeof(char *)) * num_recs); + recs[num_recs-1] = malloc(strlen(buf) + 1); + strcpy(recs[num_recs-1], buf); + } + } + if (resp) free(resp); + + do { + scr_printf("\n"); + color(BRIGHT_WHITE); + scr_printf("### Host or domain Record type \n"); + color(DIM_WHITE); + scr_printf("--- -------------------------------------------------- --------------------\n"); + for (i=0; idd|elete|ave|uit"); + switch(ch) { + case 'a': + newprompt("Enter host name: ", + buf, 50); + striplt(buf); + if (!IsEmptyStr(buf)) { + ++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); + } + modified = 1; + break; + case 'd': + i = intprompt("Delete which one", + 1, 1, num_recs) - 1; + free(recs[i]); + --num_recs; + for (j=i; j 0) { + do { + e_ex_code = 0; + b = ka_wait(&e_ex_code); + } while ((b != editor_pid) && (b >= 0)); + editor_pid = (-1); + stty_ctdl(0); + screen_set(); + } + + if (file_checksum(filename) == cksum) { + err_printf("*** No changes to save.\n"); + e_ex_code = 1; + } + + if (e_ex_code == 0) { /* Save changes */ + changefp = fopen(changefile, "w"); + + /* Load all netconfig entries that are *not* of the type we are editing */ + r = CtdlIPCGetRoomNetworkConfig(ipc, &listing, buf); + if (r / 100 == 1) { + while(listing && !IsEmptyStr(listing)) { + extract_token(buf, listing, 0, '\n', sizeof buf); + remove_token(listing, 0, '\n'); + extract_token(instr, buf, 0, '|', sizeof instr); + if (strcasecmp(instr, entrytype)) { + fprintf(changefp, "%s\n", buf); + } + } + } + if (listing) { + free(listing); + listing = NULL; + } + + /* ...and merge that with the data we just edited */ + tempfp = fopen(filename, "r"); + while (fgets(buf, sizeof buf, tempfp) != NULL) { + for (i=0; idd|elete|ave|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 node name : ", buf, 16); + strcat(buf, "|"); + newprompt("Enter shared secret: ", + &buf[strlen(buf)], 18); + strcat(buf, "|"); + newprompt("Enter host or IP : ", + &buf[strlen(buf)], 32); + strcat(buf, "|504"); + strprompt("Enter port number : ", + &buf[strlen(buf)-3], 5); + recs[num_recs-1] = strdup(buf); + modified = 1; + break; + case 'd': + i = intprompt("Delete which one", + 1, 1, num_recs) - 1; + free(recs[i]); + --num_recs; + for (j=i; jdd|elete|ave|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 user name: ", buf, 28); + strcat(buf, "|"); + newprompt("Enter room name: ", + &buf[strlen(buf)], 28); + strcat(buf, "|"); + newprompt("Enter node name: ", + &buf[strlen(buf)], 16); + strcat(buf, "|"); + recs[num_recs-1] = strdup(buf); + modified = 1; + break; + case 'd': + i = intprompt("Delete which one", + 1, 1, num_recs) - 1; + free(recs[i]); + --num_recs; + for (j=i; jdd|elete|ave|uit"); + switch(ch) { + case 'a': + ++num_recs; + if (num_recs == 1) + recs = malloc(sizeof(char *)); + else recs = realloc(recs, + (sizeof(char *)) * num_recs); + strcpy(buf, "pop3client|"); + newprompt("Enter host name: ", + &buf[strlen(buf)], 28); + strcat(buf, "|"); + newprompt("Enter user name: ", + &buf[strlen(buf)], 28); + strcat(buf, "|"); + newprompt("Enter password : ", + &buf[strlen(buf)], 16); + strcat(buf, "|"); + recs[num_recs-1] = strdup(buf); + modified = 1; + break; + case 'd': + i = intprompt("Delete which one", + 1, 1, num_recs) - 1; + free(recs[i]); + --num_recs; + for (j=i; j