summaryrefslogtreecommitdiffstats
path: root/libesmtp-private.h
diff options
context:
space:
mode:
Diffstat (limited to 'libesmtp-private.h')
-rw-r--r--libesmtp-private.h256
1 files changed, 256 insertions, 0 deletions
diff --git a/libesmtp-private.h b/libesmtp-private.h
new file mode 100644
index 0000000..7e242f7
--- /dev/null
+++ b/libesmtp-private.h
@@ -0,0 +1,256 @@
+#ifndef _libesmtp_private_h
+#define _libesmtp_private_h
+/*
+ * This file is part of libESMTP, a library for submission of RFC 2822
+ * formatted electronic mail messages using the SMTP protocol described
+ * in RFC 2821.
+ *
+ * Copyright (C) 2001,2002 Brian Stafford <brian@stafford.uklinux.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stddef.h> /* for size_t */
+
+#ifdef USE_TLS
+#include <openssl/ssl.h>
+#endif
+#include "libesmtp.h" /* The library needs the public declarations too! */
+#include "message-source.h"
+#include "concatenate.h"
+#include "auth-client.h"
+
+/* SMTP Extensions */
+
+#define _BIT(n) (1 << (n))
+
+#define EXT_ENHANCEDSTATUSCODES _BIT(0) /* RFC 1893, RFC 2034 */
+#define EXT_PIPELINING _BIT(1) /* RFC 2920 */
+#define EXT_DSN _BIT(2) /* RFC 1891 */
+#define EXT_AUTH _BIT(3) /* RFC 2554 AUTH using SASL */
+#define EXT_STARTTLS _BIT(4) /* RFC 3207 */
+#define EXT_SIZE _BIT(5) /* RFC 1870 */
+#define EXT_CHUNKING _BIT(6) /* RFC 3030 */
+#define EXT_BINARYMIME _BIT(7) /* RFC 3030 */
+#define EXT_8BITMIME _BIT(8) /* RFC 1652 */
+#define EXT_DELIVERBY _BIT(9) /* RFC 2852 */
+#define EXT_ETRN _BIT(10)/* RFC 1985 */
+#define EXT_XUSR _BIT(11)/* sendmail */
+#define EXT_XEXCH50 _BIT(12)/* exchange */
+
+struct smtp_session
+ {
+ /* Local info */
+ char *localhost; /* Domain name of localhost */
+
+ /* MTA */
+ char *host; /* Host domain name of SMTP server */
+ const char *port; /* Port number - default to 587 */
+
+ /* Application data */
+ void *application_data; /* Pointer to data maintained by app */
+
+ /* Messages */
+ struct smtp_message *messages; /* list of messages to submit */
+ struct smtp_message *end_messages;
+
+ /* Protocol events */
+ smtp_eventcb_t event_cb; /* Protocol event callback */
+ void *event_cb_arg; /* Argument for above */
+
+ /* Protocol monitor */
+ smtp_monitorcb_t monitor_cb; /* Protocol monitor callback */
+ void *monitor_cb_arg; /* Argument for above */
+ int monitor_cb_headers; /* Monitor views message headers */
+
+ /* Variables used by the protocol state engine */
+ int cmd_state, rsp_state;
+ struct smtp_message *current_message;
+ struct smtp_recipient *cmd_recipient;
+ struct smtp_recipient *rsp_recipient;
+ msg_source_t msg_source;
+
+ /* SMTP timeouts */
+ long greeting_timeout; /* default 5 minutes */
+ long envelope_timeout; /* default 5 minutes */
+ long data_timeout; /* default 2 minutes */
+ long transfer_timeout; /* default 3 minutes */
+ long data2_timeout; /* default 10 minutes */
+
+ /* Status */
+ smtp_status_t mta_status; /* Status from MTA greeting */
+
+ /* Protocol extensions */
+ unsigned long extensions;
+ unsigned long required_extensions;
+ unsigned long size_limit; /* RFC 1870 */
+ long min_by_time; /* RFC 2852 */
+
+ /* Interface to RFC 2554 AUTH and SASL */
+ auth_context_t auth_context;
+ struct mechanism *auth_mechanisms;
+ struct mechanism *current_mechanism;
+
+#ifdef USE_ETRN
+ /* Interface to RFC 1985 ETRN extension */
+ struct smtp_etrn_node *etrn_nodes;
+ struct smtp_etrn_node *end_etrn_nodes;
+ struct smtp_etrn_node *cmd_etrn_node;
+ struct smtp_etrn_node *rsp_etrn_node;
+#endif
+
+#ifdef USE_TLS
+ /* Interface to RFC 3207 STARTTLS extension */
+ enum starttls_option starttls_enabled;
+ SSL_CTX *starttls_ctx;
+#endif
+
+#ifdef USE_CHUNKING
+ int bdat_pipelined;
+#endif
+
+ /* Miscellaneous options and flags */
+ unsigned int try_fallback_server : 1;
+ unsigned int require_all_recipients : 1;
+ unsigned int authenticated : 1;
+#ifdef USE_CHUNKING
+ unsigned int bdat_abort_pipeline : 1;
+ unsigned int bdat_last_issued : 1;
+#endif
+#ifdef USE_TLS
+ unsigned int using_tls : 1;
+#endif
+ };
+
+struct smtp_message
+ {
+ struct smtp_message *next;
+ struct smtp_session *session; /* Back reference */
+
+ /* Application data */
+ void *application_data; /* Pointer to data maintained by app */
+
+ /* Reverse Path */
+ char *reverse_path_mailbox; /* Reverse path */
+
+ /* Status */
+ smtp_status_t reverse_path_status; /* Reverse path status from MAIL */
+ smtp_status_t message_status; /* Message status from DATA/BDAT */
+
+ /* Recipients */
+ struct smtp_recipient *recipients; /* List of recipients */
+ struct smtp_recipient *end_recipients;
+ int valid_recipients; /* Valid recipients in this session */
+ int failed_recipients; /* Failed recipients in this session */
+
+ /* Headers */
+ struct rfc2822_header *headers; /* List of headers to add to message */
+ struct rfc2822_header *end_headers;
+ struct rfc2822_header *current_header;
+ struct h_node **hdr_action; /* Hash table for header action */
+ struct catbuf hdr_buffer; /* Buffer for printing headers */
+
+ /* Message */
+ smtp_messagecb_t cb; /* Transfer message from app. */
+ void *cb_arg; /* Argument for above */
+
+ /* DSN (RFC 1891) */
+ char *dsn_envid; /* envelope identifier */
+ enum ret_flags dsn_ret; /* return headers or entire message */
+
+ /* SIZE (RFC 1870) */
+ unsigned long size_estimate;
+
+ /* DELIVERBY (RFC 2852 ) */
+ long by_time;
+ enum by_mode by_mode;
+ int by_trace;
+
+ /* 8BITMIME (RFC 1652) */
+ enum e8bitmime_body e8bitmime;
+ };
+
+struct smtp_recipient
+ {
+ struct smtp_recipient *next;
+ struct smtp_message *message; /* Back reference */
+
+ /* Application data */
+ void *application_data; /* Pointer to data maintained by app */
+
+ /* Recipient Info */
+ char *mailbox; /* Envelope address */
+ smtp_status_t status; /* Recipient status from RCPT */
+ unsigned complete : 1; /* Sent OK or permanent failure */
+ /* more per recipient stuff */
+
+ /* DSN - (RFC 1891) */
+ char *dsn_addrtype; /* original recipient address type */
+ char *dsn_orcpt; /* original recipient */
+ enum notify_flags dsn_notify; /* notification options */
+ };
+
+#define APPEND_LIST(start,end,item) do { \
+ if ((start) == NULL) \
+ (start) = (item); \
+ else \
+ (end)->next = (item); \
+ (end) = (item); \
+ (item)->next = NULL; \
+ } while (0)
+
+/* RFC 2822 minimum timeouts */
+
+#define GREETING_DEFAULT ( 5 * 60l * 1000l)
+#define ENVELOPE_DEFAULT ( 5 * 60l * 1000l)
+#define DATA_DEFAULT ( 2 * 60l * 1000l)
+#define TRANSFER_DEFAULT ( 3 * 60l * 1000l)
+#define DATA2_DEFAULT (10 * 60l * 1000l)
+
+/* protocol.c */
+
+int initial_transaction_state (smtp_session_t session);
+int next_message (smtp_session_t session);
+
+/* errors.c */
+
+void set_error (int code);
+void set_errno(int code);
+void set_herror (int code);
+int do_session (smtp_session_t session);
+void reset_status (struct smtp_status *status);
+
+/* smtp-auth.c */
+
+void set_auth_mechanisms (smtp_session_t session, const char *mechanisms);
+void destroy_auth_mechanisms (smtp_session_t session);
+int select_auth_mechanism (smtp_session_t session);
+
+#ifdef USE_TLS
+/* smtp-tls.c */
+
+int select_starttls (smtp_session_t session);
+void destroy_starttls_context (smtp_session_t session);
+#endif
+
+#ifdef USE_ETRN
+/* smtp-etrn.c */
+
+int check_etrn (smtp_session_t session);
+void destroy_etrn_nodes (smtp_session_t session);
+
+#endif
+
+#endif