kdc: pass down the delegated_proxy_principal to the verify_pac() function
[heimdal.git] / appl / popper / popper.h
blobd792ab1fa1ecd3ea40261cf5b2593f5591d74b33
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.
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";
9 */
11 /* $Id$ */
14 * Header file for the POP programs
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
26 /* Common include files */
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
84 #ifdef HAVE_NETDB_H
85 #include <netdb.h>
86 #endif
87 #ifdef HAVE_ARPA_INET_H
88 #ifdef _AIX
89 struct sockaddr_dl; /* AIX fun */
90 struct 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"
105 #ifdef SOCKS
106 #include <socks.h>
107 #endif
109 #include <err.h>
110 #include <roken.h>
111 #include <getarg.h>
113 #ifdef KRB5
114 #include <krb5.h>
115 #endif
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"
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
132 #ifdef HAVE_PATHS_H
133 #include <paths.h>
134 #endif
135 #ifdef HAVE_MAILLOCK_H
136 #include <maillock.h>
137 #endif
139 #ifdef OTP
140 #include <otp.h>
141 #endif
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
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.
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 */
166 extern int pop_timeout;
168 extern int hangup;
170 #define AUTH_NONE 0
171 #define AUTH_OTP 1
172 #define AUTH_SASL 2
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 */
178 typedef 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;
193 #define DEL_FLAG 1
194 #define RETR_FLAG 2
195 #define NEW_FLAG 4
197 typedef 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;
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;
218 #define IS_MAILDIR(P) ((P)->temp_drop[0] == '\0')
220 typedef 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;
272 typedef 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;
289 typedef 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;
299 int pop_dele(POP *p);
300 int pop_dropcopy(POP *p, struct passwd *pwp);
301 int pop_dropinfo(POP *p);
302 int pop_init(POP *p,int argcount,char **argmessage);
303 int pop_last(POP *p);
304 int pop_list(POP *p);
305 int pop_parse(POP *p, char *buf);
306 int pop_pass(POP *p);
307 int pop_quit(POP *p);
308 int pop_rset(POP *p);
309 int pop_send(POP *p);
310 int pop_stat(POP *p);
311 int pop_updt(POP *p);
312 int pop_user(POP *p);
313 #ifdef UIDL
314 int pop_uidl(POP *p);
315 #endif
316 #ifdef XOVER
317 int pop_xover(POP *p);
318 #endif
319 #ifdef XDELE
320 int pop_xdele(POP *p);
321 #endif
322 int pop_help(POP *p);
323 state_table *pop_get_command(POP *p, char *mp);
324 void pop_lower(char *buf);
325 #ifdef SASL
326 int pop_auth (POP *p);
327 void pop_capa_sasl(POP *p);
328 #endif
330 int pop_log(POP *p, int stat, char *format, ...)
331 #ifdef __GNUC__
332 __attribute__ ((format (printf, 3, 4)))
333 #endif
336 int pop_msg(POP *p, int stat, const char *format, ...)
337 #ifdef __GNUC__
338 __attribute__ ((format (printf, 3, 4)))
339 #endif
342 int pop_maildir_info (POP*);
343 int pop_maildir_open (POP*, MsgInfoList*);
344 int pop_maildir_update (POP*);
346 int changeuser(POP*, struct passwd*);
347 void parse_header(MsgInfoList*, char*);
348 int add_missing_headers(POP*, MsgInfoList*);
349 int login_user(POP *p);