#include <libpwmd.h>
#endif
-/* constants designating the various supported protocols */
-#define P_AUTO 1
-#define P_POP3 3
-#define P_APOP 4
-#define P_IMAP 6
-#define P_ETRN 7
-#define P_ODMR 8
+/** constants designating the various supported protocols -- ordered */
+enum protocols {
+ P_AUTO = 1 /**< probe IMAP and POP3 - deprecated */,
+ P_POP3 /** POP3, including APOP and KPOP, RFC 1939 et al. */,
+ P_IMAP /** IMAP4, RFC 3501 */,
+ P_ETRN /** ETRN - SMTP Service Extension for Remote Message Queue Starting, "extended TURN", RFC 1985 */,
+ P_ODMR /** ODMR/ATRN - On-Demand Mail Relay SMTP with dynamic addresses/Authenticated TURN, RFC 2645 */
+};
#define SMTP_PORT "smtp"
#define SMTP_PORT_NUM 25
*/
#define MAILBOX_PROTOCOL(ctl) ((ctl)->server.protocol < P_ETRN)
-/* authentication types */
-#define A_ANY 0 /* use the first method that works */
-#define A_PASSWORD 1 /* password authentication */
-#define A_NTLM 2 /* Microsoft NTLM protocol */
-#define A_CRAM_MD5 3 /* CRAM-MD5 shrouding (RFC2195) */
-#define A_OTP 4 /* One-time password (RFC1508) */
-#define A_KERBEROS_V5 6 /* authenticate w/ Kerberos V5 */
-#define A_GSSAPI 7 /* authenticate with GSSAPI */
-#define A_SSH 8 /* authentication at session level */
-#define A_MSN 9 /* same as NTLM with keyword MSN */
-#define A_EXTERNAL 10 /* external authentication (client cert) */
+/** authentication types */
+enum authenticators {
+ A_ANY = 0 /**< use the first method that works */,
+ A_PASSWORD /** password authentication */,
+ A_NTLM /** Microsoft NTLM protocol */,
+ A_CRAM_MD5 /** CRAM-MD5 shrouding (RFC2195) */,
+ A_OTP /** One-time password (RFC1508) */,
+ A_APOP /** POP3 APOP */,
+ A_KERBEROS_V5 /** authenticate w/ Kerberos V5 */,
+ A_GSSAPI /** authenticate with GSSAPI */,
+ A_SSH /** authentication at session level */,
+ A_MSN /** same as NTLM with keyword MSN */,
+ A_EXTERNAL /** external authentication (client cert) */
+};
/* some protocols or authentication types (KERBEROS, GSSAPI, SSH) don't
* require a password */
enum badheader { BHREJECT = 0, BHACCEPT };
+/* Message retrieval error mode */
+enum retrieveerror { RE_ABORT = 0, RE_CONTINUE, RE_MARKSEEN };
+
struct hostdata /* shared among all user connections to given server */
{
/* rc file data */
char *qvirtual; /* prefix removed from local user id */
flag skip; /* suppress poll in implicit mode? */
flag dns; /* do DNS lookup on multidrop? */
- flag uidl; /* use RFC1725 UIDLs? */
#ifdef SDPS_ENABLE
flag sdps; /* use Demon Internet SDPS *ENV */
#endif /* SDPS_ENABLE */
char *principal; /* Kerberos principal for mail service */
char *esmtp_name, *esmtp_password; /* ESMTP AUTH information */
enum badheader badheader; /* bad-header {pass|reject} */
+ enum retrieveerror retrieveerror; /* retrieve-error (abort|continue|markseen) */
#if defined(linux) || defined(__FreeBSD__)
#define CAN_MONITOR
struct query *next; /* next query control block in chain */
};
-struct msgblk /* message header parsed for open_sink() */
+struct msgblk /** message header parsed for open_sink() */
{
- char *headers; /* raw message headers */
- struct idlist *recipients; /* addressees */
- char return_path[HOSTLEN + USERNAMELEN + 4];
+ char *headers; /**< raw message headers */
+ struct idlist *recipients; /**< addressees */
+ char return_path[HOSTLEN + USERNAMELEN + 4]; /**< envelope sender */
int msglen;
int reallen;
};
int do_protocol(struct query *, const struct method *);
/* transact.c: transaction support */
+/** \ingroup gen_recv_split
+ * Data structure to cache data between \func gen_recv_split calls,
+ * must be initialized before use by calling \func gen_recv_split_init. */
+struct RecvSplit
+{
+ char prefix[100]; /**< prefix to match/repeat when splitting lines */
+ int cached; /**< flag to record if we have data cached in \a buf */
+ char buf[MSGBUFSIZE]; /**< buffer for cached data */
+};
+
void init_transact(const struct method *);
int readheaders(int sock,
long fetchlen,
__attribute__ ((format (printf, 2, 3)))
;
int gen_recv(int sock, char *buf, int size);
+void gen_recv_split_init(const char *prefix, struct RecvSplit *rs);
+int gen_recv_split(int sock, char *buf, int size, struct RecvSplit *rs);
int gen_transact(int sock, const char *, ... )
__attribute__ ((format (printf, 2, 3)))
;
__attribute__ ((format (printf, 3, 4)))
;
void close_warning_by_mail(struct query *, struct msgblk *);
+void abort_message_sink(struct query *ctl);
/* rfc822.c: RFC822 header parsing */
char *reply_hack(char *, const char *, size_t *);
/* authentication functions */
int do_cram_md5(int sock, const char *command, struct query *ctl, const char *strip);
-int do_rfc1731(int sock, const char *command, const char *truename);
int check_gss_creds(const char *service, const char *hostname);
int do_gssauth(int sock, const char *command, const char *service, const char *hostname, const char *username);
int do_otp(int sock, const char *command, struct query *ctl);
extern char currentwd[1024], rcfiledir[1024];
struct query *hostalloc(struct query *);
-int parsecmdline (int, char **, struct runctl *, struct query *);
+int parsecmdline (int, char **, struct runctl *, struct query *, flag *);
char *prependdir (const char *, const char *);
char *MD5Digest (unsigned const char *);
void hmac_md5 (const unsigned char *, size_t, const unsigned char *, size_t, unsigned char *, size_t);