/* GNU Mailutils -- a suite of utilities for electronic mail Copyright (C) 1999-2021 Free Software Foundation, Inc. GNU Mailutils 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, or (at your option) any later version. GNU Mailutils 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 GNU Mailutils. If not, see . */ #ifndef _IMAP4D_H #define _IMAP4D_H 1 #ifdef HAVE_CONFIG_H #include #endif #define _QNX_SOURCE #include #ifdef HAVE_SECURITY_PAM_APPL_H # include #endif #ifdef HAVE_SHADOW_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_ALLOCA_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_PATHS_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct imap4d_tokbuf *imap4d_tokbuf_t; struct imap4d_session; struct imap4d_command { const char *name; int (*func) (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); int states; int failure; int success; char *tag; }; /* Global variables and constants*/ #define STATE_NONE (0) #define STATE_NONAUTH (1 << 0) #define STATE_AUTH (1 << 1) #define STATE_SEL (1 << 2) #define STATE_LOGOUT (1 << 3) #define STATE_ALL (STATE_NONE | STATE_NONAUTH | STATE_AUTH | STATE_SEL \ | STATE_LOGOUT) /* Response code. */ #define RESP_OK 0 #define RESP_BAD 1 #define RESP_NO 2 #define RESP_BYE 3 #define RESP_NONE 4 #define RESP_PREAUTH 5 /* Error values. */ #define OK 0 #define ERR_NO_MEM 1 #define ERR_NO_OFILE 2 #define ERR_NO_IFILE 3 #define ERR_TIMEOUT 4 #define ERR_SIGNAL 5 #define ERR_TLS 6 #define ERR_MAILBOX_CORRUPTED 7 #define ERR_TERMINATE 8 #define ERR_STREAM_CREATE 9 /* Namespace numbers */ #define NS_PERSONAL 0 #define NS_OTHER 1 #define NS_SHARED 2 #define NS_MAX 3 /* IMAP4D capability names */ #define IMAP_CAPA_STARTTLS "STARTTLS" #define IMAP_CAPA_LOGINDISABLED "LOGINDISABLED" #define IMAP_CAPA_XTLSREQUIRED "XTLSREQUIRED" /* Preauth types */ enum imap4d_preauth { preauth_none, preauth_stdio, preauth_ident, preauth_prog }; /* TLS modes */ enum tls_mode { tls_unspecified, tls_no, tls_ondemand, tls_required, tls_connection }; struct imap4d_session { enum tls_mode tls_mode; struct mu_tls_config *tls_conf; }; struct imap4d_srv_config { struct mu_srv_config m_cfg; enum tls_mode tls_mode; struct mu_tls_config tls_conf; }; extern struct imap4d_command imap4d_command_table[]; extern mu_mailbox_t mbox; extern char *real_homedir; extern int state; extern size_t children; extern int is_virtual; extern struct mu_auth_data *auth_data; extern const char *program_version; extern int login_disabled; extern enum imap4d_preauth preauth_mode; extern char *preauth_program; extern int preauth_only; extern int ident_port; extern char *ident_keyfile; extern int ident_encrypt_only; extern unsigned int idle_timeout; extern int imap4d_transcript; extern mu_list_t imap4d_id_list; extern int imap4d_argc; extern char **imap4d_argv; extern jmp_buf child_jmp; extern struct mu_tls_config global_tls_conf; extern int global_tls_mode; extern int test_mode; extern int silent_expunge; /* Input functions */ extern mu_stream_t iostream; extern int io_untagged_response (int, const char *, ...) MU_PRINTFLIKE(2,3); extern int io_sendf (const char *, ...) MU_PRINTFLIKE(1,2); extern int io_send_bytes (const char *buf, size_t size); extern int io_send_qstring (const char *); extern int io_send_astring (const char *); extern int io_send_literal (const char *); extern int io_copy_out (mu_stream_t str, size_t size); extern int io_completion_response (struct imap4d_command *, int, const char *, ...) MU_PRINTFLIKE(3,4); extern int io_stream_completion_response (mu_stream_t str, struct imap4d_command *command, int rc, const char *format, ...) MU_PRINTFLIKE(4,5); void io_getline (char **pbuf, size_t *psize, size_t *pnbytes); void io_setio (int, int, struct mu_tls_config *); void io_flush (void); int io_wait_input (int); void io_enable_crlf (int); imap4d_tokbuf_t imap4d_tokbuf_init (void); void imap4d_tokbuf_destroy (imap4d_tokbuf_t *tok); int imap4d_tokbuf_argc (imap4d_tokbuf_t tok); char *imap4d_tokbuf_getarg (imap4d_tokbuf_t tok, int n); void imap4d_readline (imap4d_tokbuf_t tok); imap4d_tokbuf_t imap4d_tokbuf_from_string (char *str); #define IMAP4_ARG_TAG 0 #define IMAP4_ARG_COMMAND 1 #define IMAP4_ARG_1 2 #define IMAP4_ARG_2 3 #define IMAP4_ARG_3 4 #define IMAP4_ARG_4 5 /* Specialized buffer parsing */ struct imap4d_parsebuf { imap4d_tokbuf_t tok; int arg; /* Argument number in tok */ char *tokptr; /* Current token */ size_t tokoff; /* Offset of next delimiter in tokptr */ int save_char; /* Character saved from tokptr[tokoff] */ char *token; /* Pointer to the current token */ const char *delim; /* Array of delimiters */ char *peek_ptr; /* Peeked token */ jmp_buf errjmp; char *err_text; void *data; }; typedef struct imap4d_parsebuf *imap4d_parsebuf_t; void imap4d_parsebuf_exit (imap4d_parsebuf_t pb, char *text); char *imap4d_parsebuf_peek (imap4d_parsebuf_t pb); char *imap4d_parsebuf_next (imap4d_parsebuf_t pb, int req); int imap4d_with_parsebuf (imap4d_tokbuf_t tok, int arg, const char *delim, int (*thunk) (imap4d_parsebuf_t), void *data, char **err_text); #define imap4d_parsebuf_token(p) ((p)->token) #define imap4d_parsebuf_data(p) ((p)->data) /* Imap4 commands */ extern int imap4d_append (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_authenticate (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern void imap4d_auth_capability (struct imap4d_session *); extern int imap4d_capability (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_check (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_close (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_unselect (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_copy (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_copy0 (imap4d_tokbuf_t, int isuid, char **err_text); extern int imap4d_create (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_delete (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_examine (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_expunge (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_fetch (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_fetch0 (imap4d_tokbuf_t tok, int isuid, char **err_text); extern int imap4d_list (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_login (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_logout (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_noop (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_rename (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_preauth_setup (int fd); extern int imap4d_search (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_search0 (imap4d_tokbuf_t, int isuid, char **repyptr); extern int imap4d_select (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_select0 (struct imap4d_command *, const char *, int); extern int imap4d_select_status (void); extern int imap4d_starttls (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); int starttls_init (mu_m_server_t msrv); int starttls_server_check (struct imap4d_srv_config *cfg, char const *srvid); void tls_encryption_on (struct imap4d_session *); extern int imap4d_status (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_store (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_store0 (imap4d_tokbuf_t, int, char **); mu_property_t open_subscription (void); extern int imap4d_subscribe (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_unsubscribe (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_lsub (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_uid (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_namespace (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_version (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_idle (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_id (struct imap4d_session *, struct imap4d_command *, imap4d_tokbuf_t); extern int imap4d_check_home_dir (const char *dir, uid_t uid, gid_t gid); /* Shared between fetch and store */ extern void fetch_flags0 (const char *prefix, mu_message_t msg, int isuid); /* Permissions for creating intermediate directories. FIXME: These should better be configurable. */ #define MKDIR_PERMISSIONS 0700 int make_interdir (const char *name, int delim, int perms); /* Synchronisation on simultaneous access. */ extern int imap4d_sync (void); extern void imap4d_sync_invalidate (void); extern int imap4d_sync_flags (size_t); extern size_t uid_to_msgno (size_t); extern void imap4d_set_observer (mu_mailbox_t mbox); /* Signal handling. */ extern RETSIGTYPE imap4d_master_signal (int); extern RETSIGTYPE imap4d_child_signal (int); extern int imap4d_bye (int); extern int imap4d_bye_command (int, struct imap4d_command *); void imap4d_enter_critical (void); void imap4d_leave_critical (void); /* Namespace functions */ struct namespace_prefix { char *prefix; /* Prefix string */ int delim; /* Delimiter character */ char *dir; /* Directory in the file system */ char *scheme; /* Mailbox URL scheme (type) */ mu_record_t record; /* The corresponding record */ int ns; /* Namespace */ }; struct namespace { char const *name; int mode; /* File mode for creating new mailboxes */ mu_list_t prefixes; /* List of prefixes (struct namespace_prefix */ }; void namespace_init (void); struct namespace *namespace_lookup (char const *name); char *namespace_translate_name (char const *name, struct namespace_prefix const **pfx); char *namespace_get_name (char const *name, mu_record_t *rec, int *mode); char *namespace_decode_delim (struct namespace_prefix const *pfx, char const *src); char *namespace_encode_delim (struct namespace_prefix const *pfx, char const *src); void translate_delim (char *dst, char const *src, int dst_delim, int src_delim); int imap4d_session_setup (char *username); int imap4d_session_setup0 (void); void imap4d_child_signal_setup (RETSIGTYPE (*handler) (int signo)); /* Capability functions */ extern void imap4d_capability_add (const char *str); extern void imap4d_capability_remove (const char *str); extern void imap4d_capability_init (void); /* Helper functions. */ extern int util_start (char *); extern int util_getstate (void); extern int util_do_command (struct imap4d_session *, imap4d_tokbuf_t); extern struct imap4d_command *util_getcommand (char *, struct imap4d_command []); enum datetime_parse_mode /* how to parse date/time strings */ { datetime_default, /* default mode */ datetime_date_only, /* return only date part, ignore time and TZ */ datetime_time_only /* return only time and TZ, ignore date */ }; extern int util_parse_internal_date (char *date, time_t *timep, enum datetime_parse_mode flag); extern int util_parse_822_date (const char *date, time_t *timep, enum datetime_parse_mode flag); extern int util_parse_ctime_date (const char *date, time_t *timep, enum datetime_parse_mode flag); extern char *util_localname (void); void util_print_flags (mu_attribute_t attr); int util_attribute_matches_flag (mu_attribute_t attr, const char *item); int util_uidvalidity (mu_mailbox_t smbox, unsigned long *uidvp); void util_bye (void); void util_chdir (const char *homedir); int is_atom (const char *s); int util_isdelim (const char *str); int util_trim_nl (char *s, size_t len); int set_xscript_level (int xlev); void xscript_declare_client_payload (size_t len); int imap4d_init_tls_server (struct mu_tls_config *); struct imap4d_auth { /* input */ struct imap4d_command *command; char *auth_type; /* output */ char *username; int response; }; enum imap4d_auth_result { imap4d_auth_nosup = 0, imap4d_auth_ok = MU_ERR_USER0, imap4d_auth_resp = MU_ERR_USER1, imap4d_auth_fail = MU_ERR_USER2 }; typedef enum imap4d_auth_result (*imap4d_auth_handler_fp) (struct imap4d_auth *); extern void auth_add (char *name, imap4d_auth_handler_fp handler); extern void auth_remove (char *name); #ifdef WITH_GSSAPI extern void auth_gssapi_init (void); #else # define auth_gssapi_init() #endif #ifdef WITH_GSASL extern void auth_gsasl_init (void); #else # define auth_gsasl_init() #endif /* Quota support */ void quota_setup (void); int quota_check (mu_off_t size); void quota_update (mu_off_t size); #ifdef __cplusplus } #endif #endif /* _IMAP4D_H */