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