/* GNU Mailutils -- a suite of utilities for electronic mail Copyright (C) 1999-2019 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 _POP3D_H #define _POP3D_H 1 #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include /* The implementation */ #define IMPL "GNU POP3 Daemon" /* APOP password file, without .db or .passwd, which are added based on file type automatically */ #define APOP_PASSFILE_NAME "apop" #ifdef ENABLE_DBM # define APOP_PASSFILE SYSCONFDIR "/" APOP_PASSFILE_NAME ".db" # define ENABLE_LOGIN_DELAY #else # define APOP_PASSFILE SYSCONFDIR "/" APOP_PASSFILE_NAME ".passwd" # undef ENABLE_LOGIN_DELAY #endif struct pop3d_session; #ifdef ENABLE_LOGIN_DELAY # define LOGIN_STAT_FILE "/var/run/pop3-login" extern time_t login_delay; extern char *login_stat_file; extern int check_login_delay (char *username); extern void update_login_delay (char *username); extern void login_delay_capa (const char *, struct pop3d_session *); #else # define check_login_delay(u) 0 # define update_login_delay(u) # define login_delay_capa NULL #endif /* Minimum advertise retention time for messages. */ extern unsigned expire; extern int expire_on_exit; #define EXPIRE_NEVER ((unsigned)-1) /* Size of the MD5 digest for APOP */ #define APOP_DIGEST 70 #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_STRINGS_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 "mailutils/syslog.h" /* For Berkley DB2 APOP password file */ #ifdef HAVE_DB_H #include #endif #ifdef HAVE_SECURITY_PAM_APPL_H #include #endif #ifdef HAVE_SHADOW_H #include #endif #define POP3_ATTRIBUTE_DELE 0x0001 #define POP3_ATTRIBUTE_RETR 0x0010 #define INITIAL -1 #define AUTHORIZATION 0 #define TRANSACTION 1 #define UPDATE 2 #define ABORT 3 enum pop3d_error { OK = 0, ERR_WRONG_STATE, ERR_BAD_ARGS, ERR_BAD_LOGIN, ERR_NO_MESG, ERR_MESG_DELE, ERR_NOT_IMPL, ERR_BAD_CMD, ERR_MBOX_LOCK, ERR_TOO_LONG, ERR_NO_MEM, ERR_SIGNAL, ERR_FILE, ERR_NO_IFILE, ERR_NO_OFILE, ERR_IO, ERR_PROTO, ERR_TIMEOUT, ERR_UNKNOWN, ERR_MBOX_SYNC, ERR_TLS_IO, ERR_LOGIN_DELAY, ERR_TERMINATE, ERR_SYS_LOGIN }; enum tls_mode { tls_unspecified, tls_no, tls_ondemand, tls_required, tls_connection }; enum pop3d_capa_type { capa_string, capa_func }; struct pop3d_capa { enum pop3d_capa_type type; const char *name; union { char *string; void (*func) (const char *, struct pop3d_session *); } value; }; struct pop3d_session { mu_list_t capa; enum tls_mode tls_mode; struct mu_tls_config *tls_conf; }; struct pop3d_srv_config { struct mu_srv_config m_cfg; enum tls_mode tls_mode; struct mu_tls_config tls_conf; }; void pop3d_session_init (struct pop3d_session *session); void pop3d_session_free (struct pop3d_session *session); typedef struct mu_pop_server *mu_pop_server_t; typedef int (*pop3d_command_handler_t) (char *, struct pop3d_session *sess); struct pop3d_command { const char *name; pop3d_command_handler_t handler; }; extern mu_stream_t iostream; extern mu_pop_server_t pop3srv; extern mu_mailbox_t mbox; extern int state; extern int initial_state; extern char *username; extern char *maildir; extern char *md5shared; extern size_t children; extern struct daemon_param daemon_param; extern int debug_mode; extern int undelete_on_startup; extern struct mu_auth_data *auth_data; extern unsigned int idle_timeout; extern int pop3d_transcript; extern size_t pop3d_output_bufsize; extern int pop3d_xlines; extern char *apop_database_name; extern int apop_database_safety; extern uid_t apop_database_owner; extern int apop_database_owner_set; extern struct mu_tls_config global_tls_conf; extern int global_tls_mode; /* Safety checks for group-rw database files, such as stat and bulletin databases */ #define DEFAULT_GROUP_DB_SAFETY \ (MU_FILE_SAFETY_WORLD_WRITABLE| \ MU_FILE_SAFETY_WORLD_READABLE| \ MU_FILE_SAFETY_LINKED_WRDIR| \ MU_FILE_SAFETY_DIR_IWGRP| \ MU_FILE_SAFETY_DIR_IWOTH) extern pop3d_command_handler_t pop3d_find_command (const char *name); extern int pop3d_stat (char *, struct pop3d_session *); extern int pop3d_top (char *, struct pop3d_session *); extern int pop3d_uidl (char *, struct pop3d_session *); extern int pop3d_user (char *, struct pop3d_session *); extern int pop3d_apop (char *, struct pop3d_session *); extern int pop3d_auth (char *, struct pop3d_session *); extern int pop3d_capa (char *, struct pop3d_session *); extern int pop3d_dele (char *, struct pop3d_session *); extern int pop3d_list (char *, struct pop3d_session *); extern int pop3d_noop (char *, struct pop3d_session *); extern int pop3d_quit (char *, struct pop3d_session *); extern int pop3d_retr (char *, struct pop3d_session *); extern int pop3d_rset (char *, struct pop3d_session *); void pop3d_send_payload (mu_stream_t stream, mu_stream_t linestr, size_t maxlines); extern void pop3d_bye (void); extern int pop3d_abquit (int); extern char *pop3d_apopuser (const char *); extern void process_cleanup (void); extern void pop3d_parse_command (char *cmd, char **pcmd, char **parg); extern RETSIGTYPE pop3d_master_signal (int); extern RETSIGTYPE pop3d_child_signal (int); extern int pop3d_stls (char *, struct pop3d_session *); int stls_preflight (mu_m_server_t msrv); int stls_server_check (struct pop3d_srv_config *cfg, char const *srvid); extern void pop3d_outf (const char *fmt, ...) MU_PRINTFLIKE(1,2); extern void pop3d_setio (int, int, struct mu_tls_config *); extern char *pop3d_readline (char *, size_t); extern void pop3d_flush_output (void); extern int pop3d_is_master (void); extern void pop3d_mark_deleted (mu_attribute_t attr); extern int pop3d_is_deleted (mu_attribute_t attr); extern void pop3d_unset_deleted (mu_attribute_t attr); void pop3d_undelete_all (void); extern int pop3d_init_tls_server (struct mu_tls_config *tls_conf); extern void pop3d_mark_retr (mu_attribute_t attr); extern int pop3d_is_retr (mu_attribute_t attr); extern void pop3d_unmark_retr (mu_attribute_t attr); extern void expire_mark_message (mu_message_t msg, char **value); extern void deliver_pending_bulletins (void); extern void set_bulletin_db (const char *file); extern int set_bulletin_source (const char *source); extern int pop3d_begin_session (void); extern const char *pop3d_error_string (int code); extern int set_xscript_level (int xlev); #endif /* _POP3D_H */