/*
 * conf.h
 *
 * This file is part of msmtp, an SMTP client.
 *
 * Copyright (C) 2000, 2003, 2004, 2005, 2006, 2007
 * Martin Lambers <marlam@marlam.de>
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef CONF_H
#define CONF_H

#include "list.h"

/*
 * If a function with an 'errstr' argument returns a value != CONF_EOK,
 * '*errstr' either points to an allocates string containing an error 
 * description or is NULL.
 * If such a function returns CONF_EOK, 'errstr' will not be changed.
 */
#define CONF_EOK	0	/* no error */
#define CONF_ECANTOPEN	1	/* Cannot open file */
#define CONF_EIO	2	/* Input/output error */
#define CONF_EPARSE	3	/* Parse error */
#define CONF_ESYNTAX	4	/* Syntax error */
#define CONF_EINSECURE	5	/* Insecure permissions */

/*
 * An account
 */

#define ACC_HOST		(1 << 0)
#define ACC_PORT		(1 << 1)
#define ACC_TIMEOUT		(1 << 2)
#define ACC_PROTOCOL		(1 << 3)
#define ACC_AUTO_FROM		(1 << 4)
#define ACC_FROM		(1 << 5)
#define ACC_DOMAIN		(1 << 6)
#define ACC_MAILDOMAIN		(1 << 7)
#define ACC_DSN_RETURN		(1 << 8)
#define ACC_DSN_NOTIFY		(1 << 9)
#define ACC_KEEPBCC		(1 << 10)
#define ACC_AUTH_MECH		(1 << 11)
#define ACC_USERNAME		(1 << 12)
#define ACC_PASSWORD		(1 << 13)
#define ACC_NTLMDOMAIN		(1 << 14)
#define ACC_TLS			(1 << 15)
#define ACC_TLS_NOSTARTTLS	(1 << 16)
#define ACC_TLS_KEY_FILE	(1 << 17)
#define ACC_TLS_CERT_FILE	(1 << 18)
#define ACC_TLS_TRUST_FILE	(1 << 19)
#define ACC_TLS_NOCERTCHECK	(1 << 20)
#define ACC_TLS_FORCE_SSLV3	(1 << 21)
#define ACC_LOGFILE		(1 << 22)
#define ACC_SYSLOG		(1 << 23)

typedef struct
{
    /* identification */
    char *id;			/* name of this account */
    char *conffile;		/* name of the configuration file of this 
				   account or NULL for command line */
    int mask;			/* combination of the above ACC_* flags. 
				   Shows which settings were changed */
    /* SMTP server */
    char *host;			/* hostname of SMTP server */
    int port;			/* port number */
    int timeout;		/* network timeout in seconds */
    /* SMTP settings */
    int protocol;		/* which SMTP sub protocol? */
    char *domain;		/* argument to EHLO command */
    int auto_from;		/* automatic envelope-from addresses? */
    char *from;			/* envelope from address */
    char *maildomain;		/* the domain part of generated envelope from 
				   addresses */
    char *dsn_return;		/* DSN return request */
    char *dsn_notify;		/* DSN notify request */
    int keepbcc;		/* flag: keep the Bcc header in the mail? */
    /* Authentication */
    char *auth_mech;		/* authentication mechanism */
    char *username;		/* username for authentication */
    char *password;		/* password for authentication */
    char *ntlmdomain;		/* domain for NTLM authentication */
    /* TLS / SSL */
    int tls;			/* flag: use TLS? */
    char *tls_key_file;		/* file in PEM format */
    char *tls_cert_file;	/* file in PEM format */
    char *tls_trust_file;	/* file in PEM format */
    int tls_nostarttls;		/* flag: start TLS immediatly 
				   (without STARTTLS command)? */
    int tls_nocertcheck;	/* flag: do not check certificate? */
    int tls_force_sslv3;	/* flag: force SSLv3? */
    /* logging */
    char *logfile;		/* NULL or logfile */
    char *syslog;		/* NULL or syslog facility */
} account_t;


/* 
 * account_new()
 * 
 * Create a new account_t. Built-in default values are filled in, except for
 * settings whose default values are not yet known. This currently only affects
 * the port.
 * Must be freed with account_free().
 * Both arguments may be NULL.
 */
account_t *account_new(const char *conffile, const char *id);

/*
 * account_copy()
 *
 * Create a new account which is a copy of 'acc'.
 * If 'acc' is NULL, NULL is returned.
 */
account_t *account_copy(account_t *acc);

/* 
 * account_free()
 * 
 * Free an account_t.
 */
void account_free(void *a);

/*
 * find_account()
 * 
 * Find an account in a list of accounts by its id.
 * Returns the account or NULL.
 */
account_t *find_account(list_t *acc_list, const char *id);

/*
 * find_account_by_envelope_from()
 * 
 * Find an account in a list of accounts by its envelope from address.
 * Returns the *first* account that matches or NULL.
 */
account_t *find_account_by_envelope_from(list_t *acc_list, const char *from);

/*
 * is_on(), is_off()
 *
 * Check whether the given string is "on" or "off"
 */
int is_on(char *s);
int is_off(char *s);

/*
 * get_pos_int()
 *
 * Gets a positive integer. Returns -1 on error.
 */
int get_pos_int(const char *arg);

/*
 * check_auth_arg()
 *
 * checks if the given string is a proper argument to the auth command.
 * If so, the string is converted to uppercase and 0 is returned. Otherwise, 1
 * is returned.
 * Note that you have to check whether the arg is "off" separately, because 
 * that value results in NULL.
 */
int check_auth_arg(char *arg);

/*
 * check_dsn_notify_arg()
 *
 * checks if the given string is a proper argument to the dsn_notify command.
 * If so, the string is converted to uppercase and 0 is returned. Otherwise, 1
 * is returned.
 * Note that you have to check whether the arg is "off" separately, because that
 * value results in NULL.
 */
int check_dsn_notify_arg(char *arg);

/*
 * check_syslog_arg()
 *
 * checks if the given string is a proper argument to the syslog command.
 * If so, the string is converted to uppercase and 0 is returned. Otherwise, 1
 * is returned.
 * Note that you have to check whether the arg is "on" or "off" or ""
 * separately.
 */
int check_syslog_arg(const char *arg);

/*
 * get_default_syslog_facility()
 *
 * Returns a pointer to an allocated string containing the default syslog
 * facility.
 */
char *get_default_syslog_facility(void);

/*
 * override_account()
 *
 * Override 'acc1' with 'acc2': those settings of acc2 whose flag is set in
 * acc2->mask override the corresponding settings of acc1.
 * The flags from acc2->mask will also be set in acc1->mask.
 */
void override_account(account_t *acc1, account_t *acc2);

/*
 * check_account()
 * 
 * Check an account_t. 'sendmail_mode' must indicate whether msmtp works
 * in sendmail mode, because some checks depend on this.
 * If this function returns CONF_ESYNTAX, *errstr will always point to an
 * error string.
 * Used error codes: CONF_ESYNTAX
 */
int check_account(account_t *acc, int sendmail_mode, char **errstr);

/*
 * get_conf()
 * 
 * Read 'conffile' and store all account data in 'acc_list'.
 * If 'securitycheck' is set, the file must not have more permissions than 0600,
 * must be a regular file and owned by the current user.
 * Used error codes: CONF_ECANTOPEN, CONF_EIO, CONF_EPARSE, CONF_ESYNTAX
 */
int get_conf(const char *conffile, int securitycheck, list_t **acc_list, 
	char **errstr);

#endif


syntax highlighted by Code2HTML, v. 0.9.1