/*
Copyright (C) 1999-2004 IC & S dbmail@ic-s.nl
Copyright (c) 2005-2006 NFG Net Facilities Group BV support@nfg.nl
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/**
* \file dbmailtypes.h
*
* all data type definitions used within the dbmail package should
* be declared here.
*
*/
#ifndef _DBMAILTYPES_H
#define _DBMAILTYPES_H
#include "dbmail.h"
/** max length of search query */
#define MAX_SEARCH_LEN 1024
#define MIME_FIELD_MAX 128
#define MIME_VALUE_MAX 4096
#define UID_SIZE 70
#define IPNUM_LEN 32
#define IPLEN 32
#define BACKLOG 16
#define DM_SOCKADDR_LEN 108
#define DM_USERNAME_LEN 100
/** string length of configuration values */
#define FIELDSIZE 1024
/** use 64-bit unsigned integers as common data type */
//typedef unsigned long long u64_t;
#define u64_t guint64
typedef enum {
DM_EQUERY = -1,
DM_SUCCESS = 0,
DM_EGENERAL = 1
} DbmailErrorCodes;
/** Status fields for messages *
*
* Please note that db.c uses 'status < MESSAGE_STATUS_DELETE'
* and these numbers go into the database as magic values,
* so don't change them unless you want to break things badly.
* */
typedef enum {
MESSAGE_STATUS_NEW = 0,
MESSAGE_STATUS_SEEN = 1,
MESSAGE_STATUS_DELETE = 2,
MESSAGE_STATUS_PURGE = 3,
MESSAGE_STATUS_UNUSED = 4,
MESSAGE_STATUS_INSERT = 5,
MESSAGE_STATUS_ERROR = 6
} MessageStatus_t;
/** field_t is used for storing configuration values */
typedef char field_t[FIELDSIZE];
/** size of a timestring_t field */
#define TIMESTRING_SIZE 30
/** timestring_t is used for holding timestring */
typedef char timestring_t[TIMESTRING_SIZE];
/** parameters for the database connection */
typedef struct {
field_t driver; /**< database driver: mysql, pgsql, sqlite */
field_t authdriver; /**< authentication driver: sql, ldap */
field_t sortdriver; /**< sort driver: sieve or nothing at all */
field_t host; /**< hostname or ip address of database server */
field_t user; /**< username to connect with */
field_t pass; /**< password of user */
field_t db; /**< name of database to connect with */
unsigned int port; /**< port number of database server */
field_t sock; /**< path to local unix socket (local connection) */
field_t pfx; /**< prefix for tables e.g. dbmail_ */
unsigned int serverid; /**< unique id for dbmail instance used in clusters */
field_t encoding; /**< character encoding to use */
unsigned int query_time_info;
unsigned int query_time_message;
unsigned int query_time_warning;
} db_param_t;
/** configuration items */
typedef struct {
field_t name; /**< name of configuration item */
field_t value; /**< value of configuration item */
} item_t;
typedef struct {
FILE *tx, *rx;
char ip_src[IPNUM_LEN]; /* client IP-number */
field_t clientname; /* resolved client ip */
int timeout; /* server timeout (seconds) */
int login_timeout; /* login timeout (seconds) */
void *userData;
} clientinfo_t;
typedef struct {
int maxConnect;
int *listenSockets;
int numSockets;
int resolveIP;
int timeout;
int login_timeout;
int (*ClientHandler) (clientinfo_t *);
} ChildInfo_t;
/*
* structures used by POP mechanism
*
*/
/** all virtual_ definitions are session specific
* when a RSET occurs all will be set to the real values */
struct message {
u64_t msize; /**< message size */
u64_t messageid; /**< messageid (from database) */
u64_t realmessageid;
/**< ? */
char uidl[UID_SIZE];
/**< unique id */
/* message status :
* 000 message is new, never touched
* 001 message is read
* 002 message is deleted by user
* ----------------------------------
* The server additionally uses:
* 003 message is deleted by sysop
* 004 message is ready for final deletion */
/** message status */
MessageStatus_t messagestatus;
/** virtual message status */
MessageStatus_t virtual_messagestatus;
};
/**
* pop3 connection states */
typedef enum {
POP3_AUTHORIZATION_STATE,
POP3_TRANSACTION_STATE,
POP3_UPDATE_STATE,
} Pop3State_t;
/**
* struct for a POP3 session.
*/
typedef struct {
int error_count;/**< number of errors that have occured */
Pop3State_t state; /**< current POP state */
int was_apop; /**< 1 if session was session was apop (no plaintext password) */
int SessionResult; /**< what happened during the session */
char *username;
char *password;
char *apop_stamp; /**< timestamp for APOP */
u64_t useridnr; /**< Used by timsieved */
u64_t totalsize;/**< total size of messages */
u64_t virtual_totalsize;
u64_t totalmessages; /**< number of messages */
u64_t virtual_totalmessages;
struct dm_list messagelst; /** list of messages */
} PopSession_t;
/*
* define some IMAP symbols
*/
#define IMAP_NFLAGS 6
enum IMAP_COMMAND_TYPES {
IMAP_COMM_NONE,
IMAP_COMM_CAPABILITY,
IMAP_COMM_NOOP,
IMAP_COMM_LOGOUT,
IMAP_COMM_AUTH,
IMAP_COMM_LOGIN,
IMAP_COMM_SELECT,
IMAP_COMM_EXAMINE,
IMAP_COMM_CREATE,
IMAP_COMM_DELETE,
IMAP_COMM_RENAME,
IMAP_COMM_SUBSCRIBE,
IMAP_COMM_UNSUBSCRIBE,
IMAP_COMM_LIST,
IMAP_COMM_LSUB,
IMAP_COMM_STATUS,
IMAP_COMM_APPEND,
IMAP_COMM_CHECK,
IMAP_COMM_CLOSE,
IMAP_COMM_EXPUNGE,
IMAP_COMM_SEARCH,
IMAP_COMM_FETCH,
IMAP_COMM_STORE,
IMAP_COMM_COPY,
IMAP_COMM_UID,
IMAP_COMM_SORT,
IMAP_COMM_GETQUOTAROOT,
IMAP_COMM_GETQUOTA,
IMAP_COMM_SETACL,
IMAP_COMM_DELETEACL,
IMAP_COMM_GETACL,
IMAP_COMM_LISTRIGHTS,
IMAP_COMM_MYRIGHTS,
IMAP_COMM_NAMESPACE,
IMAP_COMM_THREAD,
IMAP_COMM_UNSELECT,
IMAP_COMM_IDLE,
IMAP_COMM_LAST
};
enum IMAP4_CLIENT_STATES {
IMAPCS_INITIAL_CONNECT,
IMAPCS_NON_AUTHENTICATED,
IMAPCS_AUTHENTICATED,
IMAPCS_SELECTED,
IMAPCS_LOGOUT
};
enum IMAP4_FLAGS {
IMAPFLAG_SEEN = 0x01,
IMAPFLAG_ANSWERED = 0x02,
IMAPFLAG_DELETED = 0x04,
IMAPFLAG_FLAGGED = 0x08,
IMAPFLAG_DRAFT = 0x10,
IMAPFLAG_RECENT = 0x20
};
enum IMAP4_PERMISSION {
IMAPPERM_READ = 0x01,
IMAPPERM_READWRITE = 0x02
};
enum IMAP4_FLAG_ACTIONS {
IMAPFA_NONE,
IMAPFA_REPLACE,
IMAPFA_ADD,
IMAPFA_REMOVE
};
enum BODY_FETCH_ITEM_TYPES {
BFIT_TEXT,
BFIT_HEADER,
BFIT_MIME,
BFIT_HEADER_FIELDS,
BFIT_HEADER_FIELDS_NOT,
BFIT_TEXT_SILENT
};
/* maximum size of a mailbox name */
#define IMAP_MAX_MAILBOX_NAMELEN 100
/* length of internaldate string
* DD-MMM-YYYY hh:mm:ss +HHMM
* 12345678901234567890123456 */
#define IMAP_INTERNALDATE_LEN 27
/* length of database date string
YYYY-MM-DD HH:MM:SS
1234567890123456789 */
#define SQL_INTERNALDATE_LEN 19
/* max length of number/dots part specifier */
#define IMAP_MAX_PARTSPEC_LEN 100
typedef struct {
int no_daemonize;
int log_verbose;
char *pidFile;
char *stateFile;
int startChildren;
int minSpareChildren;
int maxSpareChildren;
int maxChildren;
int childMaxConnect;
int timeout;
int login_timeout;
char **iplist; // Allocated memory.
int ipcount;
int *listenSockets; // Allocated memory.
int service_before_smtp;
int port;
int backlog;
int resolveIP;
field_t serverUser, serverGroup;
field_t socket;
field_t log, error_log;
field_t pid_dir;
field_t state_dir;
int (*ClientHandler) (clientinfo_t *);
} serverConfig_t;
/*
* (imap) mailbox data type
*/
typedef struct {
u64_t uid, msguidnext, owner_idnr;
char *name;
unsigned no_select, no_inferiors, exists, recent, unseen, no_children, flags;
int permission;
gboolean is_public, is_users, is_inbox;
} mailbox_t;
/*
* search data types
*/
enum IMAP_SEARCH_TYPES {
IST_SET = 1, /* 1 */
IST_UIDSET, /* 2 */
IST_FLAG, /* 3 */
IST_SORT, /* 4 */
IST_HDR, /* 5 */
IST_HDRDATE_BEFORE, /* 6 */
IST_HDRDATE_ON, /* 7 */
IST_HDRDATE_SINCE, /* 8 */
IST_IDATE, /* 9 */
IST_DATA_BODY, /* 10 */
IST_DATA_TEXT, /* 11 */
IST_SIZE_LARGER, /* 12 */
IST_SIZE_SMALLER, /* 13 */
IST_SUBSEARCH_AND, /* 14 */
IST_SUBSEARCH_OR, /* 15 */
IST_SUBSEARCH_NOT /* 16 */
};
typedef enum {
SEARCH_UNORDERED = 0,
SEARCH_SORTED,
SEARCH_THREAD_ORDEREDSUBJECT,
SEARCH_THREAD_REFERENCES
} search_order_t;
typedef struct {
int type;
u64_t size;
char table[MAX_SEARCH_LEN];
char order[MAX_SEARCH_LEN];
char field[MAX_SEARCH_LEN];
char search[MAX_SEARCH_LEN];
char hdrfld[MIME_FIELD_MAX];
int match;
GTree *found;
gboolean reverse;
gboolean searched;
gboolean merged;
} search_key_t;
/**
* remembering database positions for mail
*/
typedef struct {
u64_t block, pos;
} db_pos_t;
/*
* simple cache mechanism
*/
typedef struct {
struct DbmailMessage *dmsg;
MEM *memdump, *tmpdump;
u64_t num;
int file_dumped, msg_parsed;
u64_t dumpsize;
} cache_t;
/*
* structure for basic message info
* so it can be retrieved at once
*/
typedef struct {
int flags[IMAP_NFLAGS];
char internaldate[IMAP_INTERNALDATE_LEN];
u64_t rfcsize, uid;
} msginfo_t;
/*
* A struct to hold info about a Sieve script
*/
typedef struct ssinfo {
char *name;
int active;
} sievescript_info_t;
/* messageblk types */
typedef enum {
BODY_BLOCK = 0,
HEAD_BLOCK = 1
} blocktype_t;
/*
* A struct to say which Sieve allocations
* will need an associated free.
*/
typedef struct {
int free_interp : 1; // t
int free_script : 1; // s
int free_support : 1; // p
int free_error : 1; // e
int free_message : 1; // m
int free_action : 1; // a
} sievefree_t;
#define SA_KEEP 1
#define SA_DISCARD 2
#define SA_REDIRECT 3
#define SA_REJECT 4
#define SA_FILEINTO 5
typedef struct sort_action {
int method;
char *destination;
char *message;
} sort_action_t;
typedef enum {
ACL_RIGHT_LOOKUP,
ACL_RIGHT_READ,
ACL_RIGHT_SEEN,
ACL_RIGHT_WRITE,
ACL_RIGHT_INSERT,
ACL_RIGHT_POST,
ACL_RIGHT_CREATE,
ACL_RIGHT_DELETE,
ACL_RIGHT_ADMINISTER,
ACL_RIGHT_NONE
} ACLRight_t;
struct ACLMap {
int lookup_flag;
int read_flag;
int seen_flag;
int write_flag;
int insert_flag;
int post_flag;
int create_flag;
int delete_flag;
int administer_flag;
};
/* Depending upon where the mailbox spec comes from,
* we may or may not create it on the fly and auto-subscribe
* to it. Some of these will resolve to the same action;
* see db_find_create_mailbox in db.c to find which.
*/
typedef enum {
BOX_NONE, /* No mailbox yet. */
BOX_UNKNOWN, /* Not gonna create. */
BOX_ADDRESSPART, /* Not gonna create. */
BOX_BRUTEFORCE, /* Autocreate, no perms checks and skip Sieve scripts. */
BOX_COMMANDLINE, /* Autocreate. */
BOX_SORTING, /* Autocreate. */
BOX_DEFAULT /* Autocreate. */
} mailbox_source_t;
typedef enum {
SQL_TO_DATE,
SQL_TO_DATETIME,
SQL_TO_CHAR,
SQL_CURRENT_TIMESTAMP,
SQL_EXPIRE,
SQL_BINARY,
SQL_REGEXP,
SQL_SENSITIVE_LIKE,
SQL_INSENSITIVE_LIKE,
SQL_ENCODE_ESCAPE,
SQL_STRCASE,
SQL_PARTIAL
} sql_fragment_t;
typedef enum {
IMAP_FLAG_SEEN,
IMAP_FLAG_ANSWERED,
IMAP_FLAG_DELETED,
IMAP_FLAG_FLAGGED,
IMAP_FLAG_DRAFT,
IMAP_FLAG_RECENT
} imap_flag_t;
#endif
syntax highlighted by Code2HTML, v. 0.9.1