* patched CtdlDoIHavePermissionToPostInThisRoom to enable anonymous posting to non-aide-only post rooms
* first starts on bug 209 to get more versatile email interfaces.
#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_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 */
#define US_NEEDVALID 1 /* User needs to be validated */
#define US_EXTEDIT 2 /* Always use external editor */
/*
* Can we post here?
*/
/*
* Can we post here?
*/
- ret = CtdlDoIHavePermissionToPostInThisRoom(buf, sizeof buf);
+ ret = CtdlDoIHavePermissionToPostInThisRoom(buf, sizeof buf, POST_LOGGED_IN);
if (ret) {
/* Nope ... print an error message */
if (ret) {
/* Nope ... print an error message */
* room. Returns a *CITADEL ERROR CODE* and puts a message in errmsgbuf, or
* returns 0 on success.
*/
* 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) {
- if (!(CC->logged_in)) {
+ if (!(CC->logged_in) &&
+ (PostPublic == POST_LOGGED_IN)) {
snprintf(errmsgbuf, n, "Not logged in.");
return (ERROR + NOT_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)) {
if ((CC->user.axlevel < 2)
&& ((CC->room.QRflags & QR_MAILBOX) == 0)) {
int invalid;
struct ctdluser tempUS;
struct ctdlroom tempQR;
int invalid;
struct ctdluser tempUS;
struct ctdlroom tempQR;
+ struct ctdlroom tempQR2;
+ int err = 0;
+ char errmsg[SIZ];
int in_quotes = 0;
/* Initialize */
int in_quotes = 0;
/* Initialize */
}
else if ( (!strncasecmp(this_recp, "room_", 5))
&& (!getroom(&tempQR, &this_recp_cooked[5])) ) {
}
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;
}
else {
++ret->num_error;
/* first check to make sure the request is valid. */
/* 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);
if (err)
{
cprintf("%d %s\n", err, errmsg);
);
int CtdlCopyMsgsToRoom(long *msgnum, int num_msgs, char *dest);
int CtdlDoIHavePermissionToDeleteMessagesFromThisRoom(void);
);
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 */
/* values for which_set */