/* Copyright (c) 2017, Computer History Museum All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted (subject to the limitations in the disclaimer below) provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Computer History Museum nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MAIL_H #define MAIL_H /* * Program: Mailbox Access routines * * Author: Mark Crispin * Networks and Distributed Computing * Computing & Communications * University of Washington * Administration Building, AG-44 * Seattle, WA 98195 * Internet: MRC@CAC.Washington.EDU * * Date: 22 November 1989 * Last Edited: 3 March 1997 * * Copyright 1997 by the University of Washington * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appears in all copies and that both the * above copyright notice and this permission notice appear in supporting * documentation, and that the name of the University of Washington not be * used in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. This software is made * available "as is", and * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ #include "imapnetlib.h" /* Build parameters */ #define CACHEINCREMENT 250 /* cache growth increments */ #define MAILTMPLEN 1024 /* size of a temporary buffer */ #define MAXMESSAGESIZE 65000 /* MS-DOS: maximum text buffer size * other: initial text buffer size */ #define NUSERFLAGS 30 /* # of user flags (current servers 30 max) */ #define BASEYEAR 1970 /* the year time began on Unix (note: mx * driver depends upon this matching Unix) */ /* default for unqualified addresses */ #define BADHOST ".MISSING-HOST-NAME." /* default for syntax errors in addresses */ #define ERRHOST ".SYNTAX-ERROR." /* Coddle certain compilers' 6-character symbol limitation */ #ifdef __COMPILER_KCC__ #include "shortsym.h" #endif /* Constants */ #define NIL 0 /* convenient name */ #define T 1 /* opposite of NIL */ #define LONGT (long) 1 /* long T */ #define WARN (long) 1 /* mm_log warning type */ #define IMAP_ERROR (long) 2 /* mm_log error type */ #define PARSE (long) 3 /* mm_log parse error type */ #define BYE (long) 4 /* mm_notify stream dying */ #define DELIM '\377' /* strtok delimiter character */ /* Bits from mail_parse_flags(). Don't change these, since the IMAPheader format * used by tenex, mtx, dawz, and tenexdos corresponds to these bits. */ #define fSEEN 1 #define fDELETED 2 #define fFLAGGED 4 #define fANSWERED 8 #define fOLD 16 #define fDRAFT 32 /* Global and Driver Parameters */ /* 0xx: driver flags */ #define ENABLE_DRIVER (long) 1 #define DISABLE_DRIVER (long) 2 /* 1xx: c-client globals */ #define GET_DRIVERS (long) 101 #define SET_DRIVERS (long) 102 #define GET_GETS (long) 103 #define SET_GETS (long) 104 #define GET_CACHE (long) 105 #define SET_CACHE (long) 106 #define GET_SMTPVERBOSE (long) 107 #define SET_SMTPVERBOSE (long) 108 #define GET_RFC822OUTPUT (long) 109 #define SET_RFC822OUTPUT (long) 110 #define GET_READPROGRESS (long) 111 #define SET_READPROGRESS (long) 112 /* 2xx: environment */ #define GET_USERNAME (long) 201 #define SET_USERNAME (long) 202 #define GET_HOMEDIR (long) 203 #define SET_HOMEDIR (long) 204 #define GET_LOCALHOST (long) 205 #define SET_LOCALHOST (long) 206 #define GET_SYSINBOX (long) 207 #define SET_SYSINBOX (long) 208 /* 3xx: TCP/IP */ #define GET_OPENTIMEOUT (long) 300 #define SET_OPENTIMEOUT (long) 301 #define GET_READTIMEOUT (long) 302 #define SET_READTIMEOUT (long) 303 #define GET_WRITETIMEOUT (long) 304 #define SET_WRITETIMEOUT (long) 305 #define GET_CLOSETIMEOUT (long) 306 #define SET_CLOSETIMEOUT (long) 307 #define GET_TIMEOUT (long) 308 #define SET_TIMEOUT (long) 309 #define GET_RSHTIMEOUT (long) 310 #define SET_RSHTIMEOUT (long) 311 /* 4xx: network drivers */ #define GET_MAXLOGINTRIALS (long) 400 #define SET_MAXLOGINTRIALS (long) 401 #define GET_LOOKAHEAD (long) 402 #define SET_LOOKAHEAD (long) 403 #define GET_IMAPPORT (long) 404 #define SET_IMAPPORT (long) 405 #define GET_PREFETCH (long) 406 #define SET_PREFETCH (long) 407 #define GET_CLOSEONERROR (long) 408 #define SET_CLOSEONERROR (long) 409 #define GET_POP3PORT (long) 410 #define SET_POP3PORT (long) 411 #define GET_UIDLOOKAHEAD (long) 412 #define SET_UIDLOOKAHEAD (long) 413 #define GET_NNTPPORT (long) 414 #define SET_NNTPPORT (long) 415 #define GET_IMAPENVELOPE (long) 416 #define SET_IMAPENVELOPE (long) 417 /* 5xx: local file drivers */ #define GET_MBXPROTECTION (long) 500 #define SET_MBXPROTECTION (long) 501 #define GET_DIRPROTECTION (long) 502 #define SET_DIRPROTECTION (long) 503 #define GET_LOCKPROTECTION (long) 504 #define SET_LOCKPROTECTION (long) 505 #define GET_FROMWIDGET (long) 506 #define SET_FROMWIDGET (long) 507 #define GET_NEWSACTIVE (long) 508 #define SET_NEWSACTIVE (long) 509 #define GET_NEWSSPOOL (long) 510 #define SET_NEWSSPOOL (long) 511 #define GET_NEWSRC (long) 512 #define SET_NEWSRC (long) 513 #define GET_EXTENSION (long) 514 #define SET_EXTENSION (long) 515 #define GET_DISABLEFCNTLLOCK (long) 516 #define SET_DISABLEFCNTLLOCK (long) 517 #define GET_LOCKEACCESERROR (long) 518 #define SET_LOCKEACCESERROR (long) 519 #define GET_LISTMAXLEVEL (long) 520 #define SET_LISTMAXLEVEL (long) 521 #define GET_ANONYMOUSHOME (long) 522 #define SET_ANONYMOUSHOME (long) 523 #define GET_FTPHOME (long) 524 #define SET_FTPHOME (long) 525 #define GET_PUBLICHOME (long) 526 #define SET_PUBLICHOME (long) 527 #define GET_SHAREDHOME (long) 528 #define SET_SHAREDHOME (long) 529 #define GET_MHPROFILE (long) 530 #define SET_MHPROFILE (long) 531 #define GET_MHPATH (long) 532 #define SET_MHPATH (long) 533 /* Driver flags */ #define DR_DISABLE (long) 1 /* driver is disabled */ #define DR_LOCAL (long) 2 /* local file driver */ #define DR_MAIL (long) 4 /* supports mail */ #define DR_NEWS (long) 8 /* supports news */ #define DR_READONLY (long) 16 /* driver only allows readonly access */ #define DR_NOFAST (long) 32 /* "fast" data is slow (whole msg fetch) */ #define DR_NAMESPACE (long) 64 /* driver has a special namespace */ #define DR_LOWMEM (long) 128 /* low amounts of memory available */ /* Cache management function codes */ #define CH_INIT (long) 10 /* initialize cache */ #define CH_SIZE (long) 11 /* (re-)size the cache */ #define CH_MAKEELT (long) 30 /* return elt, make if needed */ #define CH_ELT (long) 31 /* return elt if exists */ #define CH_FREE (long) 40 /* free space used by elt */ #define CH_EXPUNGE (long) 45 /* delete elt pointer from list */ /* Open options */ #define OP_DEBUG (long) 1 /* debug protocol negotiations */ #define OP_READONLY (long) 2 /* read-only open */ #define OP_ANONYMOUS (long) 4 /* anonymous open of newsgroup */ #define OP_SHORTCACHE (long) 8 /* short (elt-only) caching */ #define OP_SILENT (long) 16 /* don't pass up events (internal use) */ #define OP_PROTOTYPE (long) 32 /* return driver prototype */ #define OP_HALFOPEN (long) 64 /* half-open (IMAP connect but no select) */ #define OP_EXPUNGE (long) 128 /* silently expunge recycle stream */ /* Close options */ #define CL_EXPUNGE (long) 1 /* expunge silently */ /* Fetch options */ #define FT_UID (long) 1 /* argument is a UID */ #define FT_PEEK (long) 2 /* peek at data */ #define FT_NOT (long) 4 /* NOT flag for IMAPheader lines fetch */ #define FT_INTERNAL (long) 8 /* text can be internal strings */ #define FT_PREFETCHTEXT (long) 16 /* IMAP prefetch text when fetching IMAPheader */ /* Flagging options */ #define ST_UID (long) 1 /* argument is a UID sequence */ #define ST_SILENT (long) 2 /* don't return results */ #define ST_SET (long) 4 /* set vs. clear */ /* Copy options */ #define CP_UID (long) 1 /* argument is a UID sequence */ #define CP_MOVE (long) 2 /* delete from source after copying */ /* Search/sort options */ #define SE_UID (long) 1 /* return UID */ #define SE_FREE (long) 2 /* free search program after finished */ #define SE_NOPREFETCH (long) 4 /* no search prefetching */ #define SO_FREE (long) 8 /* free sort program after finished */ /* Status options */ #define SA_MESSAGES (long) 1 /* number of messages */ #define SA_RECENT (long) 2 /* number of recent messages */ #define SA_UNSEEN (long) 4 /* number of unseen messages */ #define SA_UIDNEXT (long) 8 /* next UID to be assigned */ #define SA_UIDVALIDITY (long) 16/* UID validity value */ /* Mailgets flags */ #define MG_UID (long) 1 /* message number is a UID */ #define MG_COPY (long) 2 /* must return copy of argument */ /* Garbage collection flags */ #define GC_ELT (long) 1 /* message cache elements */ #define GC_ENV (long) 2 /* envelopes and bodies */ #define GC_TEXTS (long) 4 /* cached texts */ /* Bits for mm_list() and mm_lsub() */ /* defined in imapnetlib.h now -JDB #define LATT_NOINFERIORS (long) 1 #define LATT_NOSELECT (long) 2 #define LATT_MARKED (long) 4 #define LATT_UNMARKED (long) 8 */ /* Sort functions */ #define SORTDATE 0 /* date */ #define SORTARRIVAL 1 /* arrival date */ #define SORTFROM 2 /* from */ #define SORTSUBJECT 3 /* subject */ #define SORTTO 4 /* to */ #define SORTCC 5 /* cc */ #define SORTSIZE 6 /* size */ #define NETMAXHOST 65 #define NETMAXUSER 65 #define NETMAXMBX 255 #define NETMAXSRV 21 /* In-memory sized-text */ #ifdef ORIGINAL //Now defined in imapnetlib.h #define SIZEDTEXT struct mail_text /* Sized text */ SIZEDTEXT { char *data; // text unsigned long size; // size of text in octets }; /* String list */ #define STRINGLIST struct string_list STRINGLIST { SIZEDTEXT text; // string text STRINGLIST *next; }; #endif //ORIGINAL /* Sort program */ #define SORTPGM struct sort_program SORTPGM { unsigned int reverse : 1; // sort function is to be reversed short function; // sort function SORTPGM *next; // next function }; #ifdef ORIGINAL //Now defined in imapnetlib.h /* Item in an address list */ #define ADDRESS struct mail_address ADDRESS { char *personal; // personal name phrase char *adl; // at-domain-list source route char *mailbox; // mailbox name char *host; // domain name of mailbox's host char *error; // error in address from SMTP module ADDRESS *next; // pointer to next address in list }; /* Message envelope */ typedef struct mail_envelope { char *remail; // remail IMAPheader if any ADDRESS *return_path; // error return address char *date; // message composition date string ADDRESS *from; // originator address list ADDRESS *sender; // sender address list ADDRESS *reply_to; // reply address list char *subject; // message subject string ADDRESS *to; // primary recipient list ADDRESS *cc; // secondary recipient list ADDRESS *bcc; // blind secondary recipient list char *in_reply_to; // replied message ID char *message_id; // message ID char *newsgroups; // USENET newsgroups char *followup_to; // USENET reply newsgroups char *references; // USENET references } ENVELOPE; #endif //ORIGINAL /* Primary body types */ /* If you change any of these you must also change body_types in rfc822.c */ extern char *body_types[]; /* defined body type strings */ #define TYPETEXT 0 /* unformatted text */ #define TYPEMULTIPART 1 /* multiple part */ #define TYPEMESSAGE 2 /* encapsulated message */ #define TYPEAPPLICATION 3 /* application data */ #define TYPEAUDIO 4 /* audio */ #define TYPEIMAGE 5 /* static image */ #define TYPEVIDEO 6 /* video */ #define TYPEMODEL 7 /* model */ #define TYPEOTHER 8 /* unknown */ #define TYPEMAX 15 /* maximum type code */ /* Body encodings */ /* If you change any of these you must also change body_encodings in rfc822.c */ extern char *body_encodings[]; /* defined body encoding strings */ #define ENC7BIT 0 /* 7 bit SMTP semantic data */ #define ENC8BIT 1 /* 8 bit SMTP semantic data */ #define ENCBINARY 2 /* 8 bit binary data */ #define ENCBASE64 3 /* base-64 encoded data */ #define ENCQUOTEDPRINTABLE 4 /* human-readable 8-as-7 bit data */ #define ENCOTHER 5 /* unknown */ #define ENCMAX 10 /* maximum encoding code */ /* Body contents */ #define IMAPBODY struct mail_bodystruct #define MESSAGE struct mail_body_message #define PARAMETER struct mail_body_parameter #define PART struct mail_body_part #define PARTTEXT struct mail_body_text #ifdef ORIGINAL //Now defined in imapnetlib.h /* Message body text */ PARTTEXT { unsigned long offset; // offset from body origin SIZEDTEXT text; // text }; /* Message body structure */ IMAPBODY { unsigned short type; // body primary type unsigned short encoding; // body transfer encoding char *subtype; // subtype string PARAMETER *parameter; // parameter list char *id; // body identifier char *description; // body description struct // body disposition { char *type; // disposition type PARAMETER *parameter; // disposition parameters } disposition; STRINGLIST *language; // body language PARTTEXT mime; // MIME IMAPheader PARTTEXT contents; // body part contents union // different ways of accessing contents { PART *part; // body part list MESSAGE *msg; // body encapsulated message } nested; struct { unsigned long lines; // size of text in lines unsigned long bytes; // size of text in octets } size; char *md5; // MD5 checksum }; /* Parameter list */ PARAMETER { char *attribute; // parameter attribute name char *value; // parameter value PARAMETER *next; // next parameter in list }; /* Multipart content list */ PART { IMAPBODY body; // body information for this part PART *next; // next body part }; /* RFC-822 Message */ MESSAGE { ENVELOPE *env; // message envelope IMAPBODY *body; // message body PARTTEXT full; // full message STRINGLIST *lines; // lines used to filter IMAPheader PARTTEXT IMAPheader; // IMAPheader text PARTTEXT text; // body text }; #endif //ORIGINAL /* Entry in the message cache array */ typedef struct message_cache { unsigned long msgno; // message number unsigned int lockcount : 8; // non-zero if multiple references unsigned long rfc822_size; // # of bytes of message as raw RFC822 struct // c-client internal use only { unsigned long uid; // message unique ID PARTTEXT special; // special text pointers MESSAGE msg; // internal message pointers } privat; /* internal date */ unsigned int day : 5; // day of month (1-31) unsigned int month : 4; // month of year (1-12) unsigned int year : 7; // year since BASEYEAR (expires in 127 yrs) unsigned int hours: 5; // hours (0-23) unsigned int minutes: 6; // minutes (0-59) unsigned int seconds: 6; // seconds (0-59) unsigned int zoccident : 1; // non-zero if west of UTC unsigned int zhours : 4; // hours from UTC (0-12) unsigned int zminutes: 6; // minutes (0-59) /* system flags */ unsigned int seen : 1; // system Seen flag unsigned int deleted : 1; // system Deleted flag unsigned int flagged : 1; // system Flagged flag unsigned int answered : 1; // system Answered flag unsigned int draft : 1; // system Draft flag unsigned int recent : 1; // system Recent flag /* message status */ unsigned int valid : 1; // elt has valid flags unsigned int searched : 1; // message was searched unsigned int sequence : 1; // message is in sequence /* reserved for use by main program */ unsigned int spare : 1; // first spare bit unsigned int spare2 : 1; // second spare bit unsigned int spare3 : 1; // third spare bit void *sparep; // spare pointer unsigned long sent:1; // user defined //Sent flag unsigned long user_flags:31; // user-assignable flags } MESSAGECACHE; #ifdef ORIGINAL //Now defined in imapnetlib.h /* String structure */ #define STRINGDRIVER struct string_driver typedef struct mailstring { void *data; // driver-dependent data unsigned long data1; // driver-dependent data unsigned long size; // total length of string char *chunk; // base address of chunk unsigned long chunksize; // size of chunk unsigned long offset; // offset of this chunk in base char *curpos; // current position in chunk unsigned long cursize; // number of bytes remaining in chunk STRINGDRIVER *dtb; // driver that handles this type of string } STRING; /* Dispatch table for string driver */ STRINGDRIVER { /* initialize string driver */ void (*init) (STRING *s,void *data,unsigned long size); /* get next character in string */ char (*next) (STRING *s); /* set position in string */ void (*setpos) (STRING *s,unsigned long i); }; #endif //ORIGINAL /* Stringstruct access routines */ #define INIT(s,d,data,size) ((*((s)->dtb = &d)->init) (s,data,size)) #define SIZE(s) ((s)->size - GETPOS (s)) #define CHR(s) (*(s)->curpos) #define SNX(s) (--(s)->cursize ? *(s)->curpos++ : (*(s)->dtb->next) (s)) #define GETPOS(s) ((s)->offset + ((s)->curpos - (s)->chunk)) #define SETPOS(s,i) (*(s)->dtb->setpos) (s,i) /* Search program */ #define SEARCHPGM struct search_program #define SEARCHHEADER struct search_header #define SEARCHSET struct search_set #define SEARCHOR struct search_or #define SEARCHPGMLIST struct search_pgm_list SEARCHHEADER // IMAPheader search { char *line; // IMAPheader line char *text; // text in IMAPheader SEARCHHEADER *next; // next in list }; SEARCHSET // message set { unsigned long first; // sequence number unsigned long last; // last value, if a range SEARCHSET *next; // next in list }; SEARCHOR { SEARCHPGM *first; // first program SEARCHPGM *second; // second program SEARCHOR *next; // next in list }; SEARCHPGMLIST { SEARCHPGM *pgm; // search program SEARCHPGMLIST *next; // next in list }; SEARCHPGM // search program { SEARCHSET *msgno; // message numbers SEARCHSET *uid; // unique identifiers SEARCHOR *or; // or'ed in programs SEARCHPGMLIST *not; // and'ed not program SEARCHHEADER *IMAPheader; // list of headers STRINGLIST *bcc; // bcc recipients STRINGLIST *body; // text in message body STRINGLIST *cc; // cc recipients STRINGLIST *from; // originator STRINGLIST *keyword; // keywords STRINGLIST *unkeyword; // unkeywords STRINGLIST *subject; // text in subject STRINGLIST *text; // text in headers and body STRINGLIST *to; // to recipients unsigned long larger; // larger than this size unsigned long smaller; // smaller than this size unsigned short sentbefore; // sent before this date unsigned short senton; // sent on this date unsigned short sentsince; // sent since this date unsigned short before; // before this date unsigned short on; // on this date unsigned short since; // since this date unsigned int answered : 1; // answered messages unsigned int unanswered : 1;// unanswered messages unsigned int deleted : 1; // deleted messages unsigned int undeleted : 1; // undeleted messages unsigned int draft : 1; // message draf unsigned int undraft : 1; // message undraft unsigned int flagged : 1; // flagged messages unsigned int unflagged : 1; // unflagged messages unsigned int recent : 1; // recent messages unsigned int old : 1; // old messages unsigned int seen : 1; // seen messages unsigned int unseen : 1; // unseen messages }; /* Mailbox status */ typedef struct mbx_status { long flags; // validity flags unsigned long messages; // number of messages unsigned long recent; // number of recent messages unsigned long unseen; // number of unseen messages unsigned long uidnext; // next UID to be assigned unsigned long uidvalidity; // UID validity value } MAILSTATUS; /* Mail Access I/O stream */ /* Parse results from mail_valid_net_parse */ typedef struct net_mailbox { char host[NETMAXHOST]; // host name char user[NETMAXUSER]; // user name char mailbox[NETMAXMBX]; // mailbox name char service[NETMAXSRV]; // service name unsigned long port; // TCP port number unsigned int anoflag : 1; // anonymous unsigned int dbgflag : 1; // debug flag } NETMBX; /* Network access I/O stream */ /* Mailgets data identifier */ typedef struct GETS_DATA { MAILSTREAM *stream; unsigned long msgno; char *what; STRINGLIST *stl; unsigned long first; unsigned long last; long flags; } GETS_DATA; #define INIT_GETS(md,s,m,w,f,l) \ md.stream = s, md.msgno = m, md.what = w, md.first = f, md.last = l, \ md.stl = NIL, md.flags = NIL; /* Jacket into external interfaces */ typedef long (*readfn_t) (void *stream,unsigned long size,char *buffer); typedef char *(*mailgets_t) (readfn_t f,void *stream,unsigned long size, GETS_DATA *md); typedef char *(*readprogress_t) (GETS_DATA *md,unsigned long octets); typedef void *(*mailcache_t) (MAILSTREAM *stream,unsigned long msgno,long op); typedef long (*tcptimeout_t) (long time); typedef void *(*authchallenge_t) (void *stream,unsigned long *len); typedef long (*authrespond_t) (void *stream,char *s,unsigned long size); typedef long (*authclient_t) (authchallenge_t challenger, authrespond_t responder,NETMBX *mb,void *s, unsigned long *trial,char *user); typedef char *(*authresponse_t) (void *challenge,unsigned long clen, unsigned long *rlen); typedef char *(*authserver_t) (authresponse_t responder,int argc,char *argv[]); typedef void (*smtpverbose_t) (char *buffer); typedef void (*imapenvelope_t) (MAILSTREAM *stream,unsigned long msgno, ENVELOPE *env); #define AUTHENTICATOR struct mail_authenticator AUTHENTICATOR { char *name; // name of this authenticator authclient_t client; // client function that supports it authserver_t server; // server function that supports it AUTHENTICATOR *next; // next authenticator }; /* Structure for mail driver dispatch */ #define DRIVER struct driver /* Mail I/O stream handle */ typedef struct mail_stream_handle { MAILSTREAM *stream; // pointer to mail stream unsigned short sequence; // sequence of what we expect stream to be } MAILHANDLE; /* Mail I/O stream */ typedef struct mail_stream { DRIVER *dtb; // dispatch table for this driver void *local; // pointer to driver local data char *mailbox; // mailbox name unsigned short use; // stream use count unsigned short sequence; // stream sequence unsigned int lock : 1; // stream lock flag unsigned int debug : 1; // stream debug flag unsigned int silent : 1; // silent stream from Tenex unsigned int rdonly : 1; // stream read-only flag unsigned int anonymous : 1; // stream anonymous access flag unsigned int scache : 1; // stream short cache flAG unsigned int halfopen : 1; // stream half-open flag unsigned int perm_seen : 1; // permanent Seen flag unsigned int perm_deleted : 1; // permanent Deleted flag unsigned int perm_flagged : 1; // permanent Flagged flag unsigned int perm_answered :1; // permanent Answered flag unsigned int perm_draft : 1; // permanent Draft flag unsigned int kwd_create : 1; // can create new keywords unsigned long perm_user_flags; // mask of permanent user flags unsigned long gensym; // generated tag unsigned long nmsgs; // # of associated msgs unsigned long recent; // # of recent msgs unsigned long uid_validity; // UID validity sequence unsigned long uid_last; // last assigned UID char *user_flags[NUSERFLAGS]; // pointers to user flags in bit order unsigned long cachesize; // size of message cache // NOTE: (JOK) The stream now has a "current elt". Fetch body and fetch envelope // places stuff into elt.privat.msg.body and elt.privat.msg.env. MESSAGECACHE *CurrentElt; // END NOTE JOK. //This can go away MESSAGECACHE **cache; // message cache array unsigned long msgno; // message number of `current' message ENVELOPE *env; // scratch buffer for envelope IMAPBODY *body; // scratch buffer for body SIZEDTEXT IMAPheader; // scratch buffer for IMAPheader text SIZEDTEXT text; // scratch buffer for text union { // internal use only struct { // search temporaries char *charset; // character set STRINGLIST *string; // string(s) to search long result; // search result } search; } private; // added by JDB // stream to talk to do the network stuff TransStream transStream; // Eudora network stream information short bConnected; // Set to true once we're connected short bAuthenticated; // Set to true once we're authenticated short bSelected; // Set to true once we've selected an mbox unsigned char pHost[NETMAXHOST+1]; unsigned long port; Boolean errorred; // we already displayed an error // mailbox list results MailboxNodeHandle fListResultsHandle; // handle to tree of mailboxes const char *fRef; Boolean fIncludeInbox; Boolean fProgress; // should we display progress as we're fetching mailboxes? mailgets_t mailgets; // fetch flags results UIDNodeHandle fUIDResults; // network traffic results handle Handle fNetData; // header/message data read from network // mailbox resync specific Boolean chunkHeaders; // set to true to tell imap engine we're fetching minimal headers in chunks unsigned long headerUID; // the uid of the message we just fetched headers for Handle delivery; // place to put minimal headers // used to save messages short refN; // refNum of open file waiting to accept message // progress Boolean showProgress; // set to true to display progress long totalTransfer; // total # of bytes to transfer long currentTransfer; // current # of bytes transferred long lastProgress; // last time some progress was displayed // mailbox status MAILSTATUS mailboxStatus; // place to store results of last STATUS command. // logout options Boolean fastLogout; // set to true if we don't want to wait for the server to respond to a LOGOUT #ifdef DEBUG short flagsRefN; // refNum of file to save flags to. #endif // ALERT status responses Str255 alertStr; // string containing text returned from the IMAP server in an ALERT response. Accumulator UIDPLUSResponse; // uids returned in a UIDPLUS response long UIDPLUSuv; // the uidvalidity noted during a series of UIDPLUS responses. // if this changes before messages are transferred, the responses are discarded. //End added by JDB } MAILSTREAM; // Structure for allowing a callback to read from a string. typedef struct { char *s; unsigned long size; } ParenStrData; /* Message overview */ typedef struct mail_overview { char *subject; // message subject string ADDRESS *from; // originator address list char *date; // message composition date string char *message_id; // message ID char *references; // USENET references struct // may be 0 or NUL if unknown/undefined { unsigned long octets; // message octets (probably LF-newline form) unsigned long lines; // message lines char *xref; // cross references } optional; } OVERVIEW; typedef void (*overview_t) (MAILSTREAM *stream,unsigned long uid,OVERVIEW *ov); /* Mail driver dispatch */ DRIVER { char *name; // driver name unsigned long flags; // driver flags DRIVER *next; // next driver // mailbox is valid for us DRIVER *(*valid) (char *mailbox); // manipulate driver parameters void *(*parameters) (long function,void *value); // scan mailboxes void (*scan) (MAILSTREAM *stream,char *ref,char *pat,char *contents); // list mailboxes void (*list) (MAILSTREAM *stream,char *ref,char *pat); // list subscribed mailboxes void (*lsub) (MAILSTREAM *stream,char *ref,char *pat); // subscribe to mailbox long (*subscribe) (MAILSTREAM *stream,char *mailbox); // unsubscribe from mailbox long (*unsubscribe) (MAILSTREAM *stream,char *mailbox); // create mailbox long (*create) (MAILSTREAM *stream,char *mailbox); // delete mailbox long (*mbxdel) (MAILSTREAM *stream,char *mailbox); // rename mailbox long (*mbxren) (MAILSTREAM *stream,char *old,char *newname); // status of mailbox long (*status) (MAILSTREAM *stream,char *mbx,long flags); // open mailbox MAILSTREAM *(*open) (MAILSTREAM *stream); // close mailbox void (*close) (MAILSTREAM *stream,long options); // fetch message "fast" attributes Boolean (*fast) (MAILSTREAM *stream,char *sequence,long flags); // fetch message flags Boolean (*msgflags) (MAILSTREAM *stream,char *sequence,long flags); // fetch message overview Boolean (*overview) (MAILSTREAM *stream,char *sequence,overview_t ofn); // Added by JOK!!! ENVELOPE *(*envelope) (MAILSTREAM *stream,unsigned long msgno, long flags); /* fetch message envelopes */ // Modified by JOK!!! IMAPBODY *(*structure) (MAILSTREAM *stream,unsigned long msgno, long flags); // fetch message envelopes // ENVELOPE *(*structure) (MAILSTREAM *stream,unsigned long msgno,IMAPBODY **body,long flags); // return RFC-822 IMAPheader char *(*IMAPheader) (MAILSTREAM *stream,unsigned long msgno, unsigned long *length,long flags); // return RFC-822 text long (*text) (MAILSTREAM *stream,unsigned long msgno,STRING *bs,long flags); // load cache long (*msgdata) (MAILSTREAM *stream,unsigned long msgno,char *sequence,char *section, unsigned long first,unsigned long last,STRINGLIST *lines, long flags); // return UID for message unsigned long (*uid) (MAILSTREAM *stream,unsigned long msgno); // return message number from UID unsigned long (*msgno) (MAILSTREAM *stream,unsigned long uid); // modify flags Boolean (*flag) (MAILSTREAM *stream,char *sequence,char *flag,long flags); // per-message modify flags void (*flagmsg) (MAILSTREAM *stream,MESSAGECACHE *elt); // search for message based on criteria was void, now Boolean JDB Boolean (*search) (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,long flags); // sort messages unsigned long *(*sort) (MAILSTREAM *stream,char *charset,SEARCHPGM *spg, SORTPGM *pgm,long flags); // thread messages void *(*thread) (MAILSTREAM *stream,char *seq,long function,long flag); // ping mailbox to see if still alive long (*ping) (MAILSTREAM *stream); // check for new messages void (*check) (MAILSTREAM *stream); // expunge deleted messages long (*expunge) (MAILSTREAM *stream); // copy messages to another mailbox long (*copy) (MAILSTREAM *stream,char *sequence,char *mailbox,long options); // append string message to mailbox long (*append) (MAILSTREAM *stream,char *mailbox,char *flags,char *date, STRING *message); // garbage collect stream void (*gc) (MAILSTREAM *stream,long gcflags); // see if the stream is connected. Boolean (*connected) (MAILSTREAM *stream); // resturn the rfc822size unsigned long (*rfc822size) (MAILSTREAM *stream, unsigned long msgno, long flags); }; /* Other symbols */ extern const char *days[]; /* day name strings */ extern const char *months[]; /* month name strings */ // Stuff that used to be in linkage.h extern DRIVER imapdriver; extern DRIVER dummydriver; extern AUTHENTICATOR auth_log; /* Function prototypes */ void mm_searched (MAILSTREAM *stream,unsigned long number); void mm_exists (MAILSTREAM *stream,unsigned long number); void mm_expunged (MAILSTREAM *stream,unsigned long number); void mm_flags (MAILSTREAM *stream,unsigned long number); void mm_elt_flags (MAILSTREAM *stream, MESSAGECACHE *elt); //added by JOK void mm_notify (MAILSTREAM *stream,char *string,long errflg); void mm_list (MAILSTREAM *stream,int delimiter,char *name,long attributes); void mm_lsub (MAILSTREAM *stream,int delimiter,char *name,long attributes); void mm_status (MAILSTREAM *stream,char *mailbox,MAILSTATUS *status); void mm_alert (MAILSTREAM *stream, char *string); void mm_log (char *string,long errflg); void pmm_log(Str255 pErrorString,long errflg); void mm_dlog (char *string); void mm_login (NETMBX *mb,char *user,char *pwd,long trial); void mm_critical (MAILSTREAM *stream); void mm_nocritical (MAILSTREAM *stream); long mm_diskerror (MAILSTREAM *stream,long errcode,long serious); void mm_fatal (char *string); void *mm_cache (MAILSTREAM *stream,unsigned long msgno,long op); extern STRINGDRIVER mail_string; void mail_string_init (STRING *s,void *data,unsigned long size); char mail_string_next (STRING *s); void mail_string_setpos (STRING *s,unsigned long i); void mail_link (DRIVER *driver); void *mail_parameters (MAILSTREAM *stream,long function,void *value); DRIVER *mail_valid (MAILSTREAM *stream,char *mailbox,char *purpose); DRIVER *mail_valid_net (char *name,DRIVER *drv,char *host,char *mailbox); long mail_valid_net_parse (char *name,NETMBX *mb); void mail_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents); void mail_list (MAILSTREAM *stream,char *ref,char *pat); //void mail_lsub (MAILSTREAM *stream,char *ref,char *pat); long mail_subscribe (MAILSTREAM *stream,char *mailbox); long mail_unsubscribe (MAILSTREAM *stream,char *mailbox); long mail_create (MAILSTREAM *stream,char *mailbox); long mail_delete (MAILSTREAM *stream,char *mailbox); long mail_rename (MAILSTREAM *stream,char *old,char *newname); long mail_status (MAILSTREAM *stream,char *mbx,long flags); MAILSTREAM *mail_open (MAILSTREAM *oldstream,char *name,long options); MAILSTREAM *mail_close_full (MAILSTREAM *stream,long options); MAILHANDLE *mail_makehandle (MAILSTREAM *stream); void mail_free_handle (MAILHANDLE **handle); MAILSTREAM *mail_stream (MAILHANDLE *handle); Boolean mail_fetch_fast (MAILSTREAM *stream,char *sequence,long flags); Boolean mail_fetch_flags (MAILSTREAM *stream,char *sequence,long flags); //Modfified Boolean mail_fetch_overview (MAILSTREAM *stream,char *sequence,overview_t ofn); //Added by JOK unsigned long mail_fetch_rfc822size (MAILSTREAM *stream, unsigned long msgno, long flags); // JOK - These have been modified. IMAPBODY *mail_fetch_structure (MAILSTREAM *stream,unsigned long msgno, long flags); // JOK - THis is new. ENVELOPE *mail_fetch_envelope (MAILSTREAM *stream,unsigned long msgno, long flags); // END JOK long mail_fetch_message (MAILSTREAM *stream,unsigned long msgno, long flags); long mail_fetch_header (MAILSTREAM *stream, unsigned long msgno, char *sequence, char *section, STRINGLIST *lines, long flags); long mail_fetch_text (MAILSTREAM *stream, unsigned long msgno, char *section, long flags); long mail_fetch_mime (MAILSTREAM *stream, unsigned long msgno, char *section, long flags); long mail_fetch_body (MAILSTREAM *stream, unsigned long msgno, char *section, long flags); /* char *mail_fetch_header (MAILSTREAM *stream,unsigned long msgno,char *section,STRINGLIST *lines,unsigned long *len,long flags); char *mail_fetch_text (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long *len,long flags); char *mail_fetch_mime (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long *len,long flags); char *mail_fetch_body (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long *len,long flags); */ long mail_partial_text (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long first,unsigned long last,long flags); long mail_partial_body (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long first,unsigned long last,long flags); unsigned long mail_uid (MAILSTREAM *stream,unsigned long msgno); unsigned long mail_msgno (MAILSTREAM *stream,unsigned long uid); MESSAGECACHE *mail_elt (MAILSTREAM *stream); //MESSAGECACHE *mail_elt (MAILSTREAM *stream,unsigned long msgno); Boolean mail_flag (MAILSTREAM *stream,char *sequence,char *flag,long flags); Boolean mail_search_full (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,long flags); long mail_ping (MAILSTREAM *stream); void mail_check (MAILSTREAM *stream); long mail_expunge (MAILSTREAM *stream); long mail_copy_full (MAILSTREAM *stream,char *sequence,char *mailbox,long options); long mail_append_full (MAILSTREAM *stream,char *mailbox,char *flags,char *date,STRING *message); void mail_gc (MAILSTREAM *stream,long gcflags); void mail_gc_msg (MESSAGE *msg,long gcflags); #if 0 // JOK - No longer used - replaced by mail_sub_body(). BODY *mail_body (MAILSTREAM *stream,unsigned long msgno,char *section); #endif // JOK // Added by JOK IMAPBODY *mail_sub_body (IMAPBODY *body, char *section); // END JOK char *mail_date (char *string,MESSAGECACHE *elt); char *mail_cdate (char *string,MESSAGECACHE *elt); long mail_parse_date (MESSAGECACHE *elt,char *string); void mail_exists (MAILSTREAM *stream,unsigned long nmsgs); void mail_recent (MAILSTREAM *stream,unsigned long recent); void mail_expunged (MAILSTREAM *stream,unsigned long msgno); #ifdef NOT_NEEDED void mail_lock (MAILSTREAM *stream); void mail_unlock (MAILSTREAM *stream); #endif //NOT_NEEDED void mail_debug (MAILSTREAM *stream); void mail_nodebug (MAILSTREAM *stream); long mail_match_lines (STRINGLIST *lines,STRINGLIST *msglines,long flags); unsigned long mail_filter (char *text,unsigned long len,STRINGLIST *lines,long flags); long mail_search_msg (MAILSTREAM *stream,unsigned long msgno,char *charset,SEARCHPGM *pgm); long mail_search_keyword (MAILSTREAM *stream,MESSAGECACHE *elt,STRINGLIST *st); long mail_search_addr (ADDRESS *adr,char *charset,STRINGLIST *st); long mail_search_string (char *txt,char *charset,STRINGLIST *st); char *mail_search_gets (readfn_t f,void *stream,unsigned long size,MAILSTREAM *ms,unsigned long msgno,char *what,long flags); long mail_search_text (char *txt,long len,char *charset,STRINGLIST *st); SEARCHPGM *mail_criteria (char *criteria); int mail_criteria_date (unsigned short *date); int mail_criteria_string (STRINGLIST **s); unsigned long *mail_sort (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,SORTPGM *pgm,long flags); unsigned long *mail_sort_msgs (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,SORTPGM *pgm,long flags); int mail_sort_compare (const void *a1,const void *a2); int mail_compare_msg (MAILSTREAM *stream,short function,unsigned long m1,unsigned long m2); int mail_compare_ulong (unsigned long l1,unsigned long l2); int mail_compare_cstring (char *s1,char *s2); int mail_compare_sstring (char *s1,char *s2); int mail_compare_address (ADDRESS *a1,ADDRESS *a2); unsigned long mail_longdate (MESSAGECACHE *elt); char *mail_skip_re (char *s); char *mail_skip_fwd (char *s); long mail_sequence (MAILSTREAM *stream,char *sequence); long mail_uid_sequence (MAILSTREAM *stream,char *sequence); long mail_parse_flags (MAILSTREAM *stream,char *flag,unsigned long *uf); MESSAGECACHE *mail_new_cache_elt (void); //MESSAGECACHE *mail_new_cache_elt (unsigned long msgno); ENVELOPE *mail_newenvelope (void); ADDRESS *mail_newaddr (void); IMAPBODY *mail_newbody (void); IMAPBODY *mail_initbody (IMAPBODY *body); PARAMETER *mail_newbody_parameter (void); PART *mail_newbody_part (void); MESSAGE *mail_newmsg (void); STRINGLIST *mail_newstringlist (void); SEARCHPGM *mail_newsearchpgm (void); SEARCHHEADER *mail_newsearchheader (char *line); SEARCHSET *mail_newsearchset (void); SEARCHOR *mail_newsearchor (void); SEARCHPGMLIST *mail_newsearchpgmlist (void); SORTPGM *mail_newsortpgm (void); void mail_free_body (IMAPBODY **body); void mail_free_body_data (IMAPBODY *body); void mail_free_body_parameter (PARAMETER **parameter); void mail_free_body_part (PART **part); //void mail_free_cache (MAILSTREAM *stream); void mail_free_elt (MESSAGECACHE **elt); void mail_free_envelope (ENVELOPE **env); void mail_free_address (ADDRESS **address); void mail_free_stringlist (STRINGLIST **string); void mail_free_searchpgm (SEARCHPGM **pgm); void mail_free_searchheader (SEARCHHEADER **hdr); void mail_free_searchset (SEARCHSET **set); void mail_free_searchor (SEARCHOR **orl); void mail_free_searchpgmlist (SEARCHPGMLIST **pgl); void mail_free_sortpgm (SORTPGM **pgm); AUTHENTICATOR *mail_lookup_auth (unsigned long i); unsigned int mail_lookup_auth_name (char *mechanism); TransStream net_open (MAILSTREAM *stream,char *host,char *service,unsigned long prt); char *net_getline (TransStream stream); /* stream must be void* for use as readfn_t */ long net_getbuffer (void *stream,unsigned long size,char *buffer); long net_soutr (TransStream stream,char *string); long net_sout (TransStream stream,char *string,unsigned long size); void net_close (TransStream stream); char *net_host (TransStream stream); unsigned long net_port (TransStream stream); char *net_localhost (TransStream stream); // not used #ifdef NOT_USED long sm_subscribe (char *mailbox); long sm_unsubscribe (char *mailbox); char *sm_read (void **sdb); #endif //JDB OSErr mail_new_stream (MAILSTREAM **stream, unsigned char *host, unsigned long *port, const char *user); void mail_free_stream (MAILSTREAM **stream); DRIVER *imapmail_valid_net (MAILSTREAM *stream, DRIVER *drv, char *host); long imapmail_valid_net_parse (MAILSTREAM *stream, NETMBX *mb); char *MyUpperCase(char *string); // Callback routine to read from a string. Boolean str_getbuffer (void *st,unsigned long size,char *buffer); #endif //MAIL_H