/*
* Citadel setup utility
*
- * Copyright (c) 1987-2012 by the citadel.org team
+ * Copyright (c) 1987-2014 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 3.
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/utsname.h>
#include <sys/wait.h>
#include <signal.h>
#include <netdb.h>
const char *setup_titles[eMaxQuestions];
const char *setup_text[eMaxQuestions];
+char *program_title;
void SetTitles(void)
{
#endif
}
-int direction;
-
void title(const char *text)
break;
case UI_DIALOG:
- sprintf(buf, "exec %s %s --yesno '%s' 15 75",
+ snprintf(buf, sizeof buf, "exec %s --backtitle '%s' %s --yesno '%s' 15 75",
getenv("CTDL_DIALOG"),
+ program_title,
( default_value ? "" : "--defaultno" ),
question);
i = system(buf);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" %s \n\n%s\n\n", title, msgtext);
printf("%s", _("Press return to continue..."));
- if (fgets(buf, sizeof buf, stdin));
+ if (fgets(buf, sizeof buf, stdin))
+ ;
break;
case UI_DIALOG:
- sprintf(buf, "exec %s --msgbox '%s' 19 72",
+ snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --msgbox '%s' 19 72",
getenv("CTDL_DIALOG"),
+ program_title,
msgtext);
int rv = system(buf);
if (rv != 0) {
case UI_DIALOG:
if (curr == 0) {
- sprintf(buf, "exec %s --gauge '%s' 7 72 0",
+ snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --gauge '%s' 7 72 0",
getenv("CTDL_DIALOG"),
+ program_title,
text);
fp = popen(buf, "w");
if (fp != NULL) {
int lines = 0;
int rv;
- sprintf(buf,
+ snprintf(buf, sizeof buf,
"/bin/ls -l /etc/rc*.d/S*%s 2>/dev/null; "
"/bin/ls -l /etc/rc.d/rc*.d/S*%s 2>/dev/null",
mta, mta
}
- sprintf(buf, "for x in /etc/rc*.d/S*%s; do mv $x `echo $x |sed s/S/K/g`; done >/dev/null 2>&1", mta);
+ snprintf(buf, sizeof buf, "for x in /etc/rc*.d/S*%s; do mv $x `echo $x |sed s/S/K/g`; done >/dev/null 2>&1", mta);
rv = system(buf);
if (rv != 0)
display_error("%s %s.\n", _("failed to disable other mta"), mta);
- sprintf(buf, "/etc/init.d/%s stop >/dev/null 2>&1", mta);
+ snprintf(buf, sizeof buf, "/etc/init.d/%s stop >/dev/null 2>&1", mta);
rv = system(buf);
if (rv != 0)
display_error(" %s.\n", _("failed to disable other mta"), mta);
case UI_DIALOG:
CtdlMakeTempFileName(dialog_result, sizeof dialog_result);
- sprintf(buf, "exec %s --nocancel --inputbox '%s' 19 72 '%s' 2>%s",
+ snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --nocancel --inputbox '%s' 19 72 '%s' 2>%s",
getenv("CTDL_DIALOG"),
+ program_title,
prompt_text,
Target,
dialog_result);
);
if (yesno(question, 1)) {
- sprintf(buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
+ snprintf(buf, sizeof buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
rv = system(buf);
if (rv != 0) {
fprintf(stderr, "failed to edit %s.\n", NSSCONF);
GetDefaultVALINT(c_managesieve_port, 2020);
GetDefaultVALINT(c_xmpp_c2s_port, 5222);
GetDefaultVALINT(c_xmpp_s2s_port, 5269);
+ GetDefaultVALINT(c_nntp_port, 119);
+ GetDefaultVALINT(c_nntps_port, 563);
#endif
}
char buf[1024];
char aaa[128];
int info_only = 0;
- int relh=0;
- int home=0;
+ int relh = 0;
+ int home = 0;
+ int nRetries = 0;
char relhome[PATH_MAX]="";
char ctdldir[PATH_MAX]=CTDLDIR;
struct passwd *pw;
gid_t gid;
char *activity = NULL;
+ /* Keep a mild groove on */
+ program_title = _("Citadel setup program");
+
/* set an invalid setup type */
setup_type = (-1);
enable_home = ( relh | home );
if (chdir(ctdl_run_dir) != 0) {
- display_error(_("Citadel Setup"),
- "%s: [%s]\n",
+ display_error("%s: [%s]\n",
_("The directory you specified does not exist"),
ctdl_run_dir);
exit(errno);
/*
* Connect to the running Citadel server.
*/
- serv_sock = uds_connectsock(file_citadel_admin_socket);
+ while ((serv_sock < 0) && (nRetries < 10)) {
+ serv_sock = uds_connectsock(file_citadel_admin_socket);
+ nRetries ++;
+ if (serv_sock < 0)
+ sleep(1);
+ }
if (serv_sock < 0) {
display_error(
- "%s\n",
- _("Setup could not connect to a running Citadel server.")
+ "%s: %s %s\n",
+ _("Setup could not connect to a running Citadel server."),
+ strerror(errno), file_citadel_admin_socket
);
exit(1);
}
++a;
}
-
/*
* Now begin.
*/
/* _("Citadel Setup"), */
if (setup_type == UI_TEXT) {
- printf("\n\n\n"
- " *** %s ***\n\n",
- _("Citadel setup program")
- );
+ printf("\n\n\n *** %s ***\n\n", program_title);
}
if (setup_type == UI_DIALOG) {
/* Go through a series of dialogs prompting for config info */
for (curr = 1; curr < eMaxQuestions; ++curr) {
edit_value(curr);
+
if ( (curr == 6)
&& (atoi(configs[52]) != AUTHMODE_LDAP)
&& (atoi(configs[52]) != AUTHMODE_LDAP_AD)
) {
curr += 5; /* skip LDAP questions if we're not authenticating against LDAP */
}
- }
- //config.c_setup_level = REV_LEVEL;
+ if (curr == eSysAdminName) {
+ if (atoi(configs[52]) == AUTHMODE_NATIVE) {
+ /* for native auth mode, fetch the admin's existing pw */
+ snprintf(buf, sizeof buf, "AGUP %s", configs[13]);
+ serv_puts(buf);
+ serv_gets(buf);
+ if (buf[0] == '2') {
+ extract_token(admin_pass, &buf[4], 1, '|', sizeof admin_pass);
+ }
+ }
+ else {
+ ++curr; /* skip the password question for non-native auth modes */
+ }
+ }
+ }
if ((pw = getpwuid(atoi(configs[69]))) == NULL) {
gid = getgid();
create_run_directories(atoi(configs[69]), gid);
activity = _("Reconfiguring Citadel server");
- progress(activity, 0, NUM_CONFIGS+1);
+ progress(activity, 0, NUM_CONFIGS+3);
sleep(1); /* Let the message appear briefly */
serv_puts("CONF SET");
serv_gets(buf);
if (buf[0] == '4') {
for (i=0; i<NUM_CONFIGS; ++i) {
- progress(activity, i+1, NUM_CONFIGS+1);
+ progress(activity, i+1, NUM_CONFIGS+3);
serv_puts(configs[i]);
}
serv_puts("000");
}
sleep(1); /* Let the message appear briefly */
- progress(activity, NUM_CONFIGS+1, NUM_CONFIGS+1);
+
+ /*
+ * Create the administrator account. It's ok if the command fails if this user already exists.
+ */
+ progress(activity, NUM_CONFIGS+1, NUM_CONFIGS+3);
+ snprintf(buf, sizeof buf, "CREU %s|%s", configs[13], admin_pass);
+ serv_puts(buf);
+ progress(activity, NUM_CONFIGS+2, NUM_CONFIGS+3);
+ serv_gets(buf);
+ progress(activity, NUM_CONFIGS+3, NUM_CONFIGS+3);
+
+ /*
+ * Assign the desired password and access level to the administrator account.
+ */
+ snprintf(buf, sizeof buf, "AGUP %s", configs[13]);
+ serv_puts(buf);
+ serv_gets(buf);
+ if (buf[0] == '2') {
+ int admin_flags = extract_int(&buf[4], 2);
+ int admin_times_called = extract_int(&buf[4], 3);
+ int admin_msgs_posted = extract_int(&buf[4], 4);
+ snprintf(buf, sizeof buf, "ASUP %s|%s|%d|%d|%d|6",
+ configs[13], admin_pass, admin_flags, admin_times_called, admin_msgs_posted
+ );
+ serv_puts(buf);
+ serv_gets(buf);
+ }
#ifndef __CYGWIN__
check_xinetd_entry(); /* Check /etc/xinetd.d/telnet */
close(serv_sock);
serv_sock = (-1);
- for (i=3; i<=6; ++i) {
+ for (i=3; i<=6; ++i) { /* wait for server to shut down */
progress(activity, i, 41);
sleep(1);
}
- for (i=7; ((i<=38) && (serv_sock < 0)) ; ++i) {
+ for (i=7; ((i<=38) && (serv_sock < 0)) ; ++i) { /* wait for server to start up */
progress(activity, i, 41);
serv_sock = uds_connectsock(file_citadel_admin_socket);
sleep(1);
close(serv_sock);
progress(activity, 41, 41);
- if (original_start_time == new_start_time) {
+ if ( (original_start_time == new_start_time)
+ || (new_start_time <= 0)
+ ) {
display_error("%s\n",
_("Setup failed to restart Citadel server. Please restart it manually.")
);