* Blank out the Envelope-to: header when reading messages via POP or IMAP. Resolves...
[citadel.git] / citadel / msgbase.h
index d8a3697ee5a865b3bc33d16bd505b7d2a64442dd..beced22efd3e7c7ed65aeaf45d4a5f993bfad01c 100644 (file)
@@ -1,6 +1,9 @@
 /* $Id$ */
 
-#define aide_message(text, subject)      quickie_message("Citadel",NULL,NULL,AIDEROOM,text,0,subject)
+#ifndef MSGBASE_H
+#define MSGBASE_H
+
+#define aide_message(text, subject)      quickie_message("Citadel",NULL,NULL,AIDEROOM,text,FMT_CITADEL,subject)
 
 enum {
        MSGS_ALL,
@@ -51,19 +54,24 @@ struct repl {                       /* Info for replication checking */
 
 /* Data structure returned by validate_recipients() */
 struct recptypes {
+       int recptypes_magic;
         int num_local;
         int num_internet;
         int num_ignet;
        int num_room;
         int num_error;
-       char errormsg[SIZ];
-       char recp_local[SIZ];
-       char recp_internet[SIZ];
-       char recp_ignet[SIZ];
-       char recp_room[SIZ];
-       char display_recp[SIZ];
+       char *errormsg;
+       char *recp_local;
+       char *recp_internet;
+       char *recp_ignet;
+       char *recp_room;
+       char *display_recp;
+       char *bounce_to;
+       char *envelope_from;
 };
 
+#define RECPTYPES_MAGIC 0xfeeb
+
 /*
  * This is a list of "harvested" email addresses that we might want to
  * stick into someone's address book.  But we defer this operaiton so
@@ -93,8 +101,8 @@ void cmd_opna (char *cmdbuf);
 void cmd_dlat (char *cmdbuf);
 long send_message (struct CtdlMessage *);
 void loadtroom (void);
-long CtdlSubmitMsg(struct CtdlMessage *, struct recptypes *, char *);
-void quickie_message (char *, char *, char *, char *, char *, int, char *);
+long CtdlSubmitMsg(struct CtdlMessage *, struct recptypes *, char *, int);
+void quickie_message (const char *, const char *, char *, char *, const char *, int, const char *);
 void cmd_ent0 (char *entargs);
 void cmd_dele (char *delstr);
 void cmd_move (char *args);
@@ -113,35 +121,61 @@ int CtdlForEachMessage(int mode,
                         void (*CallBack) (long, void *),
                        void *userdata);
 int CtdlDeleteMessages(char *, long *, int, char *);
-void CtdlWriteObject(char *, char *, char *, struct ctdluser *,
-                       int, int, unsigned int);
+void CtdlWriteObject(char *req_room,                   /* Room to stuff it in */
+                       char *content_type,             /* MIME type of this object */
+                       char *raw_message,              /* Data to be written */
+                       off_t raw_length,               /* Size of raw_message */
+                       struct ctdluser *is_mailbox,    /* Mailbox room? */
+                       int is_binary,                  /* Is encoding necessary? */
+                       int is_unique,                  /* Del others of this type? */
+                       unsigned int flags              /* Internal save flags */
+);
 struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body);
 void CtdlFreeMessage(struct CtdlMessage *msg);
 void serialize_message(struct ser_ret *, struct CtdlMessage *);
+void dump_message(struct CtdlMessage *msg, long Siz);
 int is_valid_message(struct CtdlMessage *);
 void ReplicationChecks(struct CtdlMessage *);
 int CtdlSaveMsgPointersInRoom(char *roomname, long newmsgidlist[], int num_newmsgs,
                                int do_repl_check, struct CtdlMessage *supplied_msg);
 int CtdlSaveMsgPointerInRoom(char *roomname, long msgid, int do_repl_check, struct CtdlMessage *msg);
-char *CtdlReadMessageBody(char *terminator, size_t maxlen, char *exist, int crlf);
+char *CtdlReadMessageBody(char *terminator, size_t maxlen, char *exist, int crlf, int sock);
 char *CtdlGetSysConfig(char *sysconfname);
 void CtdlPutSysConfig(char *sysconfname, char *sysconfdata);
 int CtdlOutputMsg(long msg_num,                /* message number (local) to fetch */
-               int mode,               /* how would you like that message? */
-               int headers_only,       /* eschew the message body? */
-               int do_proto,           /* do Citadel protocol responses? */
-               int crlf,               /* 0=LF, 1=CRLF */
-               char *section           /* output a message/rfc822 section */
+                 int mode,             /* how would you like that message? */
+                 int headers_only,     /* eschew the message body? */
+                 int do_proto,         /* do Citadel protocol responses? */
+                 int crlf,             /* 0=LF, 1=CRLF */
+                 char *section,                /* output a message/rfc822 section */
+                 int flags             /* should the bessage be exported clean? */
 );
+
+/* Flags which may be passed to CtdlOutputMsg() and CtdlOutputPreLoadedMsg() */
+#define QP_EADDR       (1<<0)          /* quoted-printable encode email addresses */
+#define CRLF           (1<<1)
+#define ESC_DOT                (1<<2)          /* output a line containing only "." as ".." instead */
+#define SUPPRESS_ENV_TO        (1<<3)          /* suppress Envelope-to: header (warning: destructive!) */
+
 int CtdlOutputPreLoadedMsg(struct CtdlMessage *,
-               int mode,               /* how would you like that message? */
-               int headers_only,       /* eschew the message body? */
-               int do_proto,           /* do Citadel protocol responses? */
-               int crlf                /* 0=LF, 1=CRLF */
+                          int mode,            /* how would you like that message? */
+                          int headers_only,    /* eschew the message body? */
+                          int do_proto,                /* do Citadel protocol responses? */
+                          int crlf,            /* 0=LF, 1=CRLF */
+                          int flags            /* should the bessage be exported clean? */
 );
-int CtdlCopyMsgsToRoom(long *msgnum, int num_msgs, char *dest);
 int CtdlDoIHavePermissionToDeleteMessagesFromThisRoom(void);
-int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n);
+
+enum {
+       POST_LOGGED_IN,
+       POST_EXTERNAL,
+       CHECK_EXISTANCE,
+       POST_LMTP
+};
+int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, 
+                                         size_t n, 
+                                         const char* RemoteIdentifier,
+                                         int PostPublic);
 
 
 /* values for which_set */
@@ -154,7 +188,12 @@ void CtdlSetSeen(long *target_msgnums, int num_target_msgnums,
                struct ctdluser *which_user, struct ctdlroom *which_room);
 void CtdlGetSeen(char *buf, int which_set);
 
-struct recptypes *validate_recipients(char *recipients);
+struct recptypes *validate_recipients(char *recipients,
+                                     const char *RemoteIdentifier, 
+                                     int Flags);
+
+void free_recipients(struct recptypes *);
+
 struct CtdlMessage *CtdlMakeMessage(
         struct ctdluser *author,        /* author's user structure */
         char *recipient,                /* NULL if it's not mail */
@@ -163,9 +202,13 @@ struct CtdlMessage *CtdlMakeMessage(
         int type,                       /* see MES_ types in header file */
         int format_type,                /* variformat, plain text, MIME... */
         char *fake_name,                /* who we're masquerading as */
+       char *my_email,                 /* which of my email addresses to use (empty is ok) */
         char *subject,                  /* Subject (optional) */
        char *supplied_euid,            /* ...or NULL if this is irrelevant */
-        char *preformatted_text         /* ...or NULL to read text from client */
+        char *preformatted_text,        /* ...or NULL to read text from client */
+       char *references                /* Thread references */
 );
 int CtdlCheckInternetMailPermission(struct ctdluser *who);
 int CtdlIsMe(char *addr, int addr_buf_len);
+
+#endif /* MSGBASE_H */