1/* 2 * Copyright (c) 1989 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * static char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n"; 7 * static char SccsId[] = "@(#)@(#)popper.h 2.2 2.2 4/2/91"; 8 * 9 */ 10 11/* $Id$ */ 12 13/* 14 * Header file for the POP programs 15 */ 16 17#ifdef HAVE_CONFIG_H 18#include <config.h> 19#define UIDL 20#define XOVER 21#define XDELE 22#define DEBUG 23#define RETURN_PATH_HANDLING 24#endif 25 26/* Common include files */ 27 28#include <stdio.h> 29#include <stdarg.h> 30#include <stdlib.h> 31#include <string.h> 32#include <errno.h> 33#include <signal.h> 34#include <setjmp.h> 35#include <ctype.h> 36#ifdef HAVE_FCNTL_H 37#include <fcntl.h> 38#endif 39#ifdef HAVE_PWD_H 40#include <pwd.h> 41#endif 42#ifdef HAVE_SYS_TYPES_H 43#include <sys/types.h> 44#endif 45#ifdef HAVE_IO_H 46#include <io.h> 47#endif 48#ifdef HAVE_UNISTD_H 49#include <unistd.h> 50#endif 51#ifdef HAVE_SYS_STAT_H 52#include <sys/stat.h> 53#endif 54#ifdef HAVE_SYS_FILE_H 55#include <sys/file.h> 56#endif 57#ifdef TIME_WITH_SYS_TIME 58#include <sys/time.h> 59#include <time.h> 60#elif defined(HAVE_SYS_TIME_H) 61#include <sys/time.h> 62#else 63#include <time.h> 64#endif 65#ifdef HAVE_SYS_RESOURCE_H 66#include <sys/resource.h> 67#endif 68#ifdef HAVE_SYS_WAIT_H 69#include <sys/wait.h> 70#endif 71#ifdef HAVE_SYS_SOCKET_H 72#include <sys/socket.h> 73#endif 74#ifdef HAVE_NETINET_IN_H 75#include <netinet/in.h> 76#endif 77#ifdef HAVE_NETINET_IN6_H 78#include <netinet/in6.h> 79#endif 80#ifdef HAVE_NETINET6_IN6_H 81#include <netinet6/in6.h> 82#endif 83 84#ifdef HAVE_NETDB_H 85#include <netdb.h> 86#endif 87#ifdef HAVE_ARPA_INET_H 88#ifdef _AIX 89struct sockaddr_dl; /* AIX fun */ 90struct ether_addr; 91#endif 92#include <arpa/inet.h> 93#endif 94#ifdef HAVE_SYSLOG_H 95#include <syslog.h> 96#endif 97#ifdef HAVE_SYS_SELECT_H 98#include <sys/select.h> 99#endif 100#ifdef HAVE_SYS_PARAM_H 101#include <sys/param.h> 102#endif 103#include "version.h" 104 105#ifdef SOCKS 106#include <socks.h> 107#endif 108 109#include <err.h> 110#include <roken.h> 111#include <getarg.h> 112 113#ifdef KRB5 114#include <krb5.h> 115#endif 116 117#define MAXUSERNAMELEN 65 118#define MAXLINELEN 1024 119#define MAXMSGLINELEN 1024 120#define MAXCMDLEN 4 121#define MAXPARMCOUNT 10 122#define MAXPARMLEN 10 123#define ALLOC_MSGS 20 124#define MAIL_COMMAND "/usr/lib/sendmail" 125 126#define POP_FACILITY LOG_LOCAL0 127#define POP_PRIORITY LOG_NOTICE 128#define POP_DEBUG LOG_DEBUG 129#define POP_INFO LOG_INFO 130#define POP_LOGOPTS 0 131 132#ifdef HAVE_PATHS_H 133#include <paths.h> 134#endif 135#ifdef HAVE_MAILLOCK_H 136#include <maillock.h> 137#endif 138 139#ifdef OTP 140#include <otp.h> 141#endif 142 143#if defined(_PATH_MAILDIR) 144#define POP_MAILDIR _PATH_MAILDIR 145#elif defined(MAILDIR) 146#define POP_MAILDIR MAILDIR 147#else 148#define POP_MAILDIR "/usr/spool/mail" 149#endif 150 151#define POP_DROP POP_MAILDIR "/.%s.pop" 152 /* POP_TMPSIZE needs to be big enough to hold the string 153 * defined by POP_TMPDROP. POP_DROP and POP_TMPDROP 154 * must be in the same filesystem. 155 */ 156#define POP_TMPDROP POP_MAILDIR "/tmpXXXXXX" 157#define POP_TMPSIZE 256 158#define POP_TMPXMIT "/tmp/xmitXXXXXX" 159#define POP_OK "+OK" 160#define POP_ERR "-ERR" 161#define POP_SUCCESS 1 162#define POP_FAILURE 0 163#define POP_TERMINATE '.' 164#define POP_TIMEOUT 120 /* timeout connection after this many secs */ 165 166extern int pop_timeout; 167 168extern int hangup; 169 170#define AUTH_NONE 0 171#define AUTH_OTP 1 172#define AUTH_SASL 2 173 174#define pop_command pop_parm[0] /* POP command is first token */ 175#define pop_subcommand pop_parm[1] /* POP XTND subcommand is the 176 second token */ 177 178typedef enum { /* POP processing states */ 179 auth1, /* Authorization: waiting for 180 USER command */ 181 auth2, /* Authorization: waiting for 182 PASS command */ 183 trans, /* Transaction */ 184 update, /* Update: session ended, 185 process maildrop changes */ 186 halt, /* (Halt): stop processing 187 and exit */ 188 error /* (Error): something really 189 bad happened */ 190} state; 191 192 193#define DEL_FLAG 1 194#define RETR_FLAG 2 195#define NEW_FLAG 4 196 197typedef struct { /* Message information */ 198 int number; /* Message number relative to 199 the beginning of list */ 200 long length; /* Length of message in 201 bytes */ 202 int lines; /* Number of (null-terminated) lines in the message */ 203 long offset; /* Offset from beginning of 204 file */ 205 unsigned flags; 206 207#if defined(UIDL) || defined(XOVER) 208 char *msg_id; /* The POP UIDL uniqueifier */ 209#endif 210#ifdef XOVER 211 char *subject; 212 char *from; 213 char *date; 214#endif 215 char *name; 216} MsgInfoList; 217 218#define IS_MAILDIR(P) ((P)->temp_drop[0] == '\0') 219 220typedef struct { /* POP parameter block */ 221 int debug; /* Debugging requested */ 222 char * myname; /* The name of this POP 223 daemon program */ 224 char myhost[MaxHostNameLen]; /* The name of our host 225 computer */ 226 char client[MaxHostNameLen]; /* Canonical name of client 227 computer */ 228 char ipaddr[MaxHostNameLen]; /* Dotted-notation format of 229 client IP address */ 230 unsigned short ipport; /* Client port for privileged 231 operations */ 232 char user[MAXUSERNAMELEN]; /* Name of the POP user */ 233 state CurrentState; /* The current POP operational state */ 234 MsgInfoList * mlp; /* Message information list */ 235 int msg_count; /* Number of messages in 236 the maildrop */ 237 int msgs_deleted; /* Number of messages flagged 238 for deletion */ 239 int last_msg; /* Last message touched by 240 the user */ 241 long bytes_deleted; /* Number of maildrop bytes 242 flagged for deletion */ 243 char drop_name[MAXPATHLEN]; /* The name of the user's 244 maildrop */ 245 char temp_drop[MAXPATHLEN]; /* The name of the user's 246 temporary maildrop */ 247 long drop_size; /* Size of the maildrop in 248 bytes */ 249 FILE * drop; /* (Temporary) mail drop */ 250 FILE * input; /* Input TCP/IP communication 251 stream */ 252 FILE * output; /* Output TCP/IP communication stream */ 253 FILE * trace; /* Debugging trace file */ 254 char * pop_parm[MAXPARMCOUNT]; /* Parse POP parameter list */ 255 int parm_count; /* Number of parameters in 256 parsed list */ 257 int kerberosp; /* Using KPOP? */ 258#ifdef KRB5 259 krb5_context context; 260 krb5_principal principal; /* principal auth as */ 261 krb5_log_facility* logf; 262#endif 263 int version; /* 4 or 5? */ 264 int auth_level; /* Dont allow cleartext */ 265#ifdef OTP 266 OtpContext otp_ctx; /* OTP context */ 267#endif 268 unsigned int flags; 269#define POP_FLAG_CAPA 1 270} POP; 271 272typedef struct { /* State information for 273 each POP command */ 274 state ValidCurrentState; /* The operating state of 275 the command */ 276 char * command; /* The POP command */ 277 int min_parms; /* Minimum number of parms 278 for the command */ 279 int max_parms; /* Maximum number of parms 280 for the command */ 281 int (*function) (); /* The function that process 282 the command */ 283 state result[2]; /* The resulting state after 284 command processing */ 285#define success_state result[0] /* State when a command 286 succeeds */ 287} state_table; 288 289typedef struct { /* Table of extensions */ 290 char * subcommand; /* The POP XTND subcommand */ 291 int min_parms; /* Minimum number of parms for 292 the subcommand */ 293 int max_parms; /* Maximum number of parms for 294 the subcommand */ 295 int (*function) (); /* The function that processes 296 the subcommand */ 297} xtnd_table; 298 299int pop_dele(POP *p); 300int pop_dropcopy(POP *p, struct passwd *pwp); 301int pop_dropinfo(POP *p); 302int pop_init(POP *p,int argcount,char **argmessage); 303int pop_last(POP *p); 304int pop_list(POP *p); 305int pop_parse(POP *p, char *buf); 306int pop_pass(POP *p); 307int pop_quit(POP *p); 308int pop_rset(POP *p); 309int pop_send(POP *p); 310int pop_stat(POP *p); 311int pop_updt(POP *p); 312int pop_user(POP *p); 313#ifdef UIDL 314int pop_uidl(POP *p); 315#endif 316#ifdef XOVER 317int pop_xover(POP *p); 318#endif 319#ifdef XDELE 320int pop_xdele(POP *p); 321#endif 322int pop_help(POP *p); 323state_table *pop_get_command(POP *p, char *mp); 324void pop_lower(char *buf); 325#ifdef SASL 326int pop_auth (POP *p); 327void pop_capa_sasl(POP *p); 328#endif 329 330int pop_log(POP *p, int stat, char *format, ...) 331#ifdef __GNUC__ 332__attribute__ ((format (printf, 3, 4))) 333#endif 334; 335 336int pop_msg(POP *p, int stat, const char *format, ...) 337#ifdef __GNUC__ 338__attribute__ ((format (printf, 3, 4))) 339#endif 340; 341 342int pop_maildir_info (POP*); 343int pop_maildir_open (POP*, MsgInfoList*); 344int pop_maildir_update (POP*); 345 346int changeuser(POP*, struct passwd*); 347void parse_header(MsgInfoList*, char*); 348int add_missing_headers(POP*, MsgInfoList*); 349int login_user(POP *p); 350