From: Wilfried Göesgens Date: Mon, 3 Dec 2007 22:59:14 +0000 (+0000) Subject: * applied Patrick Colemans patch X-Git-Tag: v7.86~2681 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=8256324d0953581e7c7d1a2b7a42e508bca2ea40 * applied Patrick Colemans patch * patched CtdlDoIHavePermissionToPostInThisRoom to enable anonymous posting to non-aide-only post rooms * first starts on bug 209 to get more versatile email interfaces. --- diff --git a/citadel/ipcdef.h b/citadel/ipcdef.h index 438dc4dcb..2073589ee 100644 --- a/citadel/ipcdef.h +++ b/citadel/ipcdef.h @@ -58,6 +58,8 @@ extern "C" { #define QR2_SELFLIST 2 /* Self-service mailing list mgmt */ #define QR2_COLLABDEL 4 /* Anyone who can post can delete */ #define QR2_SUBJECTREQ 8 /* Subject strongly recommended */ +#define QR2_SUBSONLY 16 /* Listservice Subscribers may post */ +#define QR2_MODERATED 32 /* Listservice aide has to permit posts */ #define US_NEEDVALID 1 /* User needs to be validated */ #define US_EXTEDIT 2 /* Always use external editor */ diff --git a/citadel/modules/imap/imap_misc.c b/citadel/modules/imap/imap_misc.c index 3b7d95834..f0f93627e 100644 --- a/citadel/modules/imap/imap_misc.c +++ b/citadel/modules/imap/imap_misc.c @@ -467,7 +467,7 @@ void imap_append(int num_parms, char *parms[]) { /* * Can we post here? */ - ret = CtdlDoIHavePermissionToPostInThisRoom(buf, sizeof buf); + ret = CtdlDoIHavePermissionToPostInThisRoom(buf, sizeof buf, POST_LOGGED_IN); if (ret) { /* Nope ... print an error message */ diff --git a/citadel/msgbase.c b/citadel/msgbase.c index c75cd1e26..15957eb24 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -3090,13 +3090,31 @@ struct CtdlMessage *CtdlMakeMessage( * room. Returns a *CITADEL ERROR CODE* and puts a message in errmsgbuf, or * returns 0 on success. */ -int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n) { +int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n, int PostPublic) { int ra; - if (!(CC->logged_in)) { + if (!(CC->logged_in) && + (PostPublic == POST_LOGGED_IN)) { snprintf(errmsgbuf, n, "Not logged in."); return (ERROR + NOT_LOGGED_IN); } + else if (PostPublic == CHECK_EXISTANCE) { + return (0); + } + else if (!(CC->logged_in)) { + if ((CC->room.QRflags & QR_READONLY)) { + snprintf(errmsgbuf, n, "Not logged in."); + return (ERROR + NOT_LOGGED_IN); + } + else if (CC->room.QRflags2 & QR2_SUBSONLY){ + ////TODO: check if we're in that list... + return (0); + } + else if (CC->room.QRflags2 & QR2_MODERATED) { + return (0); + } + + } if ((CC->user.axlevel < 2) && ((CC->room.QRflags & QR_MAILBOX) == 0)) { @@ -3160,6 +3178,9 @@ struct recptypes *validate_recipients(char *supplied_recipients) { int invalid; struct ctdluser tempUS; struct ctdlroom tempQR; + struct ctdlroom tempQR2; + int err = 0; + char errmsg[SIZ]; int in_quotes = 0; /* Initialize */ @@ -3268,11 +3289,31 @@ struct recptypes *validate_recipients(char *supplied_recipients) { } else if ( (!strncasecmp(this_recp, "room_", 5)) && (!getroom(&tempQR, &this_recp_cooked[5])) ) { - ++ret->num_room; - if (!IsEmptyStr(ret->recp_room)) { - strcat(ret->recp_room, "|"); + + /* Save room so we can restore it later */ + tempQR2 = CC->room; + CC->room = tempQR; + + /* Check permissions to send mail to this room */ + err = CtdlDoIHavePermissionToPostInThisRoom(errmsg, sizeof errmsg, POST_EXTERNAL); + //// TODO: CHECK_EXISTANCE for dict_tcp + if (err) + { + cprintf("%d %s\n", err, errmsg); + ++ret->num_error; + invalid = 1; + } + else { + ++ret->num_room; + if (!IsEmptyStr(ret->recp_room)) { + strcat(ret->recp_room, "|"); + } + strcat(ret->recp_room, &this_recp_cooked[5]); } - strcat(ret->recp_room, &this_recp_cooked[5]); + + /* Restore room in case something needs it */ + CC->room = tempQR2; + } else { ++ret->num_error; @@ -3433,7 +3474,7 @@ void cmd_ent0(char *entargs) /* first check to make sure the request is valid. */ - err = CtdlDoIHavePermissionToPostInThisRoom(errmsg, sizeof errmsg); + err = CtdlDoIHavePermissionToPostInThisRoom(errmsg, sizeof errmsg, POST_LOGGED_IN); if (err) { cprintf("%d %s\n", err, errmsg); diff --git a/citadel/msgbase.h b/citadel/msgbase.h index ca0e6f0ac..61800c76f 100644 --- a/citadel/msgbase.h +++ b/citadel/msgbase.h @@ -148,7 +148,13 @@ int CtdlOutputPreLoadedMsg(struct CtdlMessage *, ); 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 +}; +int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n, int PostPublic); /* values for which_set */