/***************************************************************************** POPular -- A POP3 server and proxy for large mail systems $Id: pdm.h,v 1.12 2001/03/23 10:56:44 sqrt Exp $ http://www.remote.org/jochen/mail/popular/ ****************************************************************************** Copyright (C) 1999-2001 Jochen Topf 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA *****************************************************************************/ #ifndef _POPULAR_PDM_H #define _POPULAR_PDM_H #include "xlog.h" typedef enum { pdmAccept, /* Authentication accepted */ pdmFail, /* Authentication failed, but user exists */ pdmUnknown, /* Unknown user or namespace */ pdmError /* Internal error */ } pdm_result_t; typedef enum { pdmFailUnknown, /* Failed for unspecified reasons */ pdmFailIP, /* Not allowed from this IP */ pdmFailProtocol, /* Not allowed with this protocol */ pdmFailPassword /* Wrong password */ } pdm_fail_reason_t; struct pdm_request { char *peer; protocol_t prot; char *user; char *pass; char *namespace; }; struct pdm_data { int flags; pdm_fail_reason_t reason; char backend[MAXLEN_ID]; char user[MAXLEN_USERNAME]; char pass[MAXLEN_PASSWORD]; }; struct pdm_mvar { int *debug; void (*xlog_printf)(xlog_level_t level, int code, const char *format, ...); }; struct pdm_module { struct pdm_module *next; char id[MAXBUF]; char name[MAXBUF]; void *lib; void *ctx; char *(*init)(int, char **, struct pdm_mvar *, void **); int (*close)(void *); char *(*args)(void *); int (*reload)(void *); pdm_result_t (*check)(void *, const struct pdm_request *, struct pdm_data *); pdm_result_t (*auth)(void *, const struct pdm_request *, struct pdm_data *); }; /* in pdm.c */ struct pdm_module *pdm_attach(const char *dir, int argc, char *argv[]); int pdm_detach(struct pdm_module *m); pdm_result_t pdm_auth_user(const struct pdm_request *pr, struct pdm_data *pd); int pdm_call_reload(struct pdm_module *m); char *pdm_get_args(struct pdm_module *m); /* in pdm modules */ char *pdm_init(int argc, char *argv[], struct pdm_mvar *mvar, void **pdmctx); int pdm_close(void *pdmctx); char *pdm_args(void *pdmctx); int pdm_reload(void *pdmctx); pdm_result_t pdm_check(void *pdmctx, const struct pdm_request *pdmr, struct pdm_data *pdmd); pdm_result_t pdm_auth(void *pdmctx, const struct pdm_request *pdmr, struct pdm_data *pdmd); /* debug macros */ #define PDM_DEBUG0(func, text) \ if (*(mv->debug) & DG_AUTH) do { \ (*(mv->xlog_printf))(xlog_dbg, 0x0000, "PDM:" func ":" __FILE__ ":%d " text, __LINE__); \ } while (0) /* This is not supported by older gccs :-( #define PDM_DEBUGX(func, text, ...) \ if (*(mv->debug) & DG_AUTH) do { \ (*(mv->xlog_printf))(xlog_dbg, 0x0000, "PDM:" func ":" __FILE__ ":%d " text, __LINE__, __VA_ARGS__); \ } while (0) */ #define PDM_DEBUG1(func, text, a1) \ if (*(mv->debug) & DG_AUTH) do { \ (*(mv->xlog_printf))(xlog_dbg, 0x0000, "PDM:" func ":" __FILE__ ":%d " text, __LINE__, (a1)); \ } while (0) #define PDM_DEBUG2(func, text, a1, a2) \ if (*(mv->debug) & DG_AUTH) do { \ (*(mv->xlog_printf))(xlog_dbg, 0x0000, "PDM:" func ":" __FILE__ ":%d " text, __LINE__, (a1), (a2)); \ } while (0) #define PDM_DEBUG3(func, text, a1, a2, a3) \ if (*(mv->debug) & DG_AUTH) do { \ (*(mv->xlog_printf))(xlog_dbg, 0x0000, "PDM:" func ":" __FILE__ ":%d " text, __LINE__, (a1), (a2), (a3)); \ } while (0) #define PDM_DEBUG4(func, text, a1, a2, a3, a4) \ if (*(mv->debug) & DG_AUTH) do { \ (*(mv->xlog_printf))(xlog_dbg, 0x0000, "PDM:" func ":" __FILE__ ":%d " text, __LINE__, (a1), (a2), (a3), (a4)); \ } while (0) #define PDM_DEBUG5(func, text, a1, a2, a3, a4, a5) \ if (*(mv->debug) & DG_AUTH) do { \ (*(mv->xlog_printf))(xlog_dbg, 0x0000, "PDM:" func ":" __FILE__ ":%d " text, __LINE__, (a1), (a2), (a3), (a4), (a5)); \ } while (0) #define PDM_DEBUG6(func, text, a1, a2, a3, a4, a5, a6) \ if (*(mv->debug) & DG_AUTH) do { \ (*(mv->xlog_printf))(xlog_dbg, 0x0000, "PDM:" func ":" __FILE__ ":%d " text, __LINE__, (a1), (a2), (a3), (a4), (a5), (a6)); \ } while (0) #endif /* _POPULAR_PDM_H */ /** THE END *****************************************************************/