char ctdl_netcfg_dir[PATH_MAX]="netconfigs";
char ctdl_sbin_dir[PATH_MAX];
char ctdl_bin_dir[PATH_MAX];
+char ctdl_ssl_dir[PATH_MAX];
/* some of our files, that are needed in several places */
char file_citadel_control[PATH_MAX]="";
char file_citadel_socket[PATH_MAX]="";
char file_mail_aliases[PATH_MAX]="";
char file_pid_file[PATH_MAX]="";
+char file_crpt_file_key[PATH_MAX]="";
+char file_crpt_file_csr[PATH_MAX]="";
+char file_crpt_file_cer[PATH_MAX]="";
int home_specified = 0;
#endif
COMPUTE_DIRECTORY(ctdl_run_dir);
+ basedir=SSL_DIR;
+ COMPUTE_DIRECTORY(ctdl_ssl_dir);
+
#ifndef HAVE_DATA_DIR
basedir=ctdldir;
#else
"%srefcount_adjustments.dat",
ctdl_run_dir);
+ snprintf(file_crpt_file_key,
+ sizeof file_crpt_file_key,
+ "%scitadel.key",
+ ctdl_ssl_dir);
+ snprintf(file_crpt_file_csr,
+ sizeof file_crpt_file_csr,
+ "%scitadel.csr",
+ ctdl_ssl_dir);
+ snprintf(file_crpt_file_cer,
+ sizeof file_crpt_file_cer,
+ "%scitadel.cer",
+ ctdl_ssl_dir);
/*
* DIRTY HACK FOLLOWS! due to configs in the network dir in the
* legacy installations, we need to calculate ifdeffed here.
extern char ctdl_bbsbase_dir[PATH_MAX];
extern char ctdl_sbin_dir[PATH_MAX];
extern char ctdl_bin_dir[PATH_MAX];
+extern char ctdl_ssl_dir[PATH_MAX];
/* some of the frequently used files */
extern char file_citadel_socket[PATH_MAX];
extern char file_mail_aliases[PATH_MAX];
extern char file_pid_file[PATH_MAX];
+extern char file_crpt_file_key[PATH_MAX];
+extern char file_crpt_file_csr[PATH_MAX];
+extern char file_crpt_file_cer[PATH_MAX];
extern void calc_dirs_n_files(int relh, int home, const char *relhome,const char *ctdldir);
int ScheduledShutdown = 0;
int do_defrag = 0;
time_t server_startup_time;
-char pid_file_name[PATH_MAX];
/*
* Various things that need to be initialized at startup
unsigned int seed;
FILE *urandom;
struct ctdlroom qrbuf;
- FILE *pidfile_fp;
lprintf(CTDL_DEBUG, "master_startup() started\n");
time(&server_startup_time);
- /* pid file. If we go FSSTND this should end up in 'localstatedir' */
- snprintf(pid_file_name, sizeof pid_file_name, "./citadel.pid");
- pidfile_fp = fopen(pid_file_name, "w");
- if (pidfile_fp != NULL) {
- fprintf(pidfile_fp, "%d\n", (int)getpid());
- fclose(pidfile_fp);
- }
-
lprintf(CTDL_INFO, "Opening databases\n");
open_databases();
lprintf(CTDL_NOTICE, "citserver: Exiting with status %d\n", exitcode);
fflush(stdout); fflush(stderr);
- unlink(pid_file_name);
exit(exitcode);
}
FILE *cfp;
struct stat st;
- if (chdir(home_specified ? ctdl_home_directory : CTDLDIR) != 0) {
+ if (chdir(ctdl_bbsbase_dir) != 0) {
fprintf(stderr,
"This program could not be started.\n"
"Unable to change directory to %s\n"
"Error: %s\n",
- (home_specified ? ctdl_home_directory : CTDLDIR),
+ ctdl_bbsbase_dir,
strerror(errno));
exit(CTDLEXIT_HOME);
}
AC_PREFIX_DEFAULT(/usr/local/citadel)
if test "$prefix" = NONE; then
AC_DEFINE_UNQUOTED(CTDLDIR, "$ac_default_prefix")
+ ssl_dir="$ac_default_prefix/keys"
else
AC_DEFINE_UNQUOTED(CTDLDIR, "$prefix")
+ ssl_dir="$prefix/keys"
fi
]
)
+
+dnl Checks for the SSLdir
+dnl this is a bit different than the rest,
+dnl because of the citadel used to have a keys/ subdir.
+AC_ARG_WITH(ssldir,
+ [ --with-ssldir directory to store the ssl certificates under],
+ [ if test "x$withval" != "xno" ; then
+
+ ssl_dir="$withval"
+ fi
+ AC_SUBST(MAKE_SSL_DIR)
+ ]
+)
+AC_DEFINE_UNQUOTED(SSL_DIR, "$ssl_dir", [were should we put our keys?])
+
+
dnl Checks for the spooldir
AC_ARG_WITH(spooldir,
[ --with-spooldir directory to keep queues under],
DESC="Citadel Groupware "
NAME=citserver
DAEMON=/usr/sbin/$NAME
-DAEMON_ARGS=" -d -x3 -lmail -t/dev/null"
PIDFILE=$RUNDIR/$NAME.pid
+DAEMON_ARGS=" -D${PIDFILE} -x3 -lmail -t/dev/null"
SCRIPTNAME=/etc/init.d/citadel
SENDCOMMAND=/usr/sbin/sendcommand
dh_testdir
CFLAGS="$(CFLAGS)" ./configure \
+ --with-prefix=/var/lib/citadel \
--with-datadir=/var/lib/citadel \
--with-spooldir=/var/spool/citadel \
--with-sysconfdir=/etc/citadel \
--with-rundir=/var/run/citadel \
--with-docdir=/usr/share/doc/citadel-doc/ \
+ --with-ssldir=/etc/ssl/citadel/ \
--with-pam \
--with-db \
--with-zlib \
/* Get our certificates in order.
* First, create the key/cert directory if it's not there already...
*/
- mkdir(CTDL_CRYPTO_DIR, 0700);
+ mkdir(ctdl_ssl_dir, 0700);
/*
* Generate a key pair if we don't have one.
*/
- if (access(CTDL_KEY_PATH, R_OK) != 0) {
+ if (access(file_crpt_file_key, R_OK) != 0) {
lprintf(CTDL_INFO, "Generating RSA key pair.\n");
rsa = RSA_generate_key(1024, /* modulus size */
65537, /* exponent */
ERR_reason_error_string(ERR_get_error()));
}
if (rsa != NULL) {
- fp = fopen(CTDL_KEY_PATH, "w");
+ fp = fopen(file_crpt_file_key, "w");
if (fp != NULL) {
- chmod(CTDL_KEY_PATH, 0600);
+ chmod(file_crpt_file_key, 0600);
if (PEM_write_RSAPrivateKey(fp, /* the file */
rsa, /* the key */
NULL, /* no enc */
) != 1) {
lprintf(CTDL_CRIT, "Cannot write key: %s\n",
ERR_reason_error_string(ERR_get_error()));
- unlink(CTDL_KEY_PATH);
+ unlink(file_crpt_file_key);
}
fclose(fp);
}
/*
* Generate a CSR if we don't have one.
*/
- if (access(CTDL_CSR_PATH, R_OK) != 0) {
+ if (access(file_crpt_file_csr, R_OK) != 0) {
lprintf(CTDL_INFO, "Generating a certificate signing request.\n");
/*
* there is the possibility that the key was already on disk
* and we didn't just generate it now.
*/
- fp = fopen(CTDL_KEY_PATH, "r");
+ fp = fopen(file_crpt_file_csr, "r");
if (fp) {
rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
fclose(fp);
}
else {
/* Write it to disk. */
- fp = fopen(CTDL_CSR_PATH, "w");
+ fp = fopen(file_crpt_file_csr, "w");
if (fp != NULL) {
- chmod(CTDL_CSR_PATH, 0600);
+ chmod(file_crpt_file_csr, 0600);
PEM_write_X509_REQ(fp, req);
fclose(fp);
}
/*
* Generate a self-signed certificate if we don't have one.
*/
- if (access(CTDL_CER_PATH, R_OK) != 0) {
+ if (access(file_crpt_file_cer, R_OK) != 0) {
lprintf(CTDL_INFO, "Generating a self-signed certificate.\n");
/* Same deal as before: always read the key from disk because
* it may or may not have just been generated.
*/
- fp = fopen(CTDL_KEY_PATH, "r");
+ fp = fopen(file_crpt_file_cer, "r");
if (fp) {
rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
fclose(fp);
EVP_PKEY_assign_RSA(pk, rsa);
}
- fp = fopen(CTDL_CSR_PATH, "r");
+ fp = fopen(file_crpt_file_cer, "r");
if (fp) {
req = PEM_read_X509_REQ(fp, NULL, NULL, NULL);
fclose(fp);
}
else {
/* Write it to disk. */
- fp = fopen(CTDL_CER_PATH, "w");
+ fp = fopen(file_crpt_file_cer, "w");
if (fp != NULL) {
- chmod(CTDL_CER_PATH, 0600);
+ chmod(file_crpt_file_cer, 0600);
PEM_write_X509(fp, cer);
fclose(fp);
}
/*
* Now try to bind to the key and certificate.
*/
- SSL_CTX_use_certificate_chain_file(ssl_ctx, CTDL_CER_PATH);
- SSL_CTX_use_PrivateKey_file(ssl_ctx, CTDL_KEY_PATH, SSL_FILETYPE_PEM);
+ SSL_CTX_use_certificate_chain_file(ssl_ctx, file_crpt_file_cer);
+ SSL_CTX_use_PrivateKey_file(ssl_ctx, file_crpt_file_key, SSL_FILETYPE_PEM);
if ( !SSL_CTX_check_private_key(ssl_ctx) ) {
lprintf(CTDL_CRIT, "Cannot install certificate: %s\n",
ERR_reason_error_string(ERR_get_error()));
/*
* Pathnames for cryptographic goodness
*/
+/*
#define CTDL_CRYPTO_DIR "./keys"
#define CTDL_KEY_PATH CTDL_CRYPTO_DIR "/citadel.key"
#define CTDL_CSR_PATH CTDL_CRYPTO_DIR "/citadel.csr"
#define CTDL_CER_PATH CTDL_CRYPTO_DIR "/citadel.cer"
-
+*/
#define THREADSTACKSIZE 1048576
/*