* evaluate sender against the subscriber list.
* in all other cases, hand over a NULL
static int seq = 0;
int i;
- journal_recps = validate_recipients(config.c_journal_dest, 0);
+ journal_recps = validate_recipients(config.c_journal_dest, NULL, 0);
if (journal_recps != NULL) {
if ( (journal_recps->num_local > 0)
if (!strncasecmp(attendee_string, "MAILTO:", 7)) {
strcpy(attendee_string, &attendee_string[7]);
striplt(attendee_string);
- recp = validate_recipients(attendee_string, 0);
+ recp = validate_recipients(attendee_string, NULL, 0);
if (recp != NULL) {
if (!strcasecmp(recp->recp_local, CC->user.fullname)) {
if (me_attend) icalproperty_free(me_attend);
reply_message_text);
if (msg != NULL) {
- valid = validate_recipients(organizer_string, 0);
+ valid = validate_recipients(organizer_string, NULL, 0);
CtdlSubmitMsg(msg, valid, "");
CtdlFreeMessage(msg);
free_recipients(valid);
/* If not found, try it as an unqualified email address. */
if (found_user != 0) {
strcpy(buf, who);
- recp = validate_recipients(buf, 0);
+ recp = validate_recipients(buf, NULL, 0);
lprintf(CTDL_DEBUG, "Trying <%s>\n", buf);
if (recp != NULL) {
if (recp->num_local == 1) {
if (found_user != 0) {
snprintf(buf, sizeof buf, "%s@%s", who, config.c_fqdn);
lprintf(CTDL_DEBUG, "Trying <%s>\n", buf);
- recp = validate_recipients(buf, 0);
+ recp = validate_recipients(buf, NULL, 0);
if (recp != NULL) {
if (recp->num_local == 1) {
found_user = getuser(&usbuf, recp->recp_local);
|| (!strcasecmp(type, "directory")) ) {
snprintf(buf, sizeof buf, "%s@%s", who, host);
lprintf(CTDL_DEBUG, "Trying <%s>\n", buf);
- recp = validate_recipients(buf, 0);
+ recp = validate_recipients(buf, NULL, 0);
if (recp != NULL) {
if (recp->num_local == 1) {
found_user = getuser(&usbuf, recp->recp_local);
request_message_text);
if (msg != NULL) {
- valid = validate_recipients(attendees_string, 0);
+ valid = validate_recipients(attendees_string, NULL, 0);
CtdlSubmitMsg(msg, valid, "");
CtdlFreeMessage(msg);
free_recipients(valid);
* Search for the specified user
*/
ret = (-1);
- valid = validate_recipients(parms[3], 0);
+ valid = validate_recipients(parms[3], NULL, 0);
if (valid != NULL) {
if (valid->num_local == 1) {
ret = getuser(&temp, valid->recp_local);
/*
* Can we post here?
*/
- ret = CtdlDoIHavePermissionToPostInThisRoom(buf, sizeof buf, POST_LOGGED_IN);
+ ret = CtdlDoIHavePermissionToPostInThisRoom(buf, sizeof buf, NULL, POST_LOGGED_IN);
if (ret) {
/* Nope ... print an error message */
}
/* Now submit the message */
- valid = validate_recipients(recps, 0);
+ valid = validate_recipients(recps, NULL, 0);
free(recps);
CtdlSubmitMsg(msg, valid, NULL);
CtdlFreeMessage(msg);
}
/* Now submit the message */
- valid = validate_recipients(recps, 0);
+ valid = validate_recipients(recps, NULL, 0);
free(recps);
CtdlSubmitMsg(msg, valid, NULL);
free_recipients(valid);
}
msg->cm_fields['R'] = strdup(nptr->name);
- valid = validate_recipients(nptr->name, 0);
+ valid = validate_recipients(nptr->name, NULL, 0);
CtdlSubmitMsg(msg, valid, "");
free_recipients(valid);
}
}
return 1;
}
-int is_recipient(SpoolControl *sc, char *Name)
+int is_recipient(SpoolControl *sc, const char *Name)
{
namelist *nptr;
free(oldpath);
/* Now submit the message */
- valid = validate_recipients(recipient, 0);
+ valid = validate_recipients(recipient, NULL, 0);
if (valid != NULL) if (valid->num_error != 0) {
free_recipients(valid);
valid = NULL;
/* Otherwise, does it have a recipient? If so, validate it... */
else if (msg->cm_fields['R'] != NULL) {
- recp = validate_recipients(msg->cm_fields['R'], 0);
+ recp = validate_recipients(msg->cm_fields['R'], NULL, 0);
if (recp != NULL) if (recp->num_error != 0) {
network_bounce(msg,
"A message you sent could not be delivered due to an invalid address.\n"
lprintf(CTDL_DEBUG, "Action is REDIRECT, recipient <%s>\n", recp);
- valid = validate_recipients(recp, 0);
+ valid = validate_recipients(recp, NULL, 0);
if (valid == NULL) {
lprintf(CTDL_WARNING, "REDIRECT failed: bad recipient <%s>\n", recp);
return SIEVE2_ERROR_BADARGS;
SMTP->message_originated_locally = 0;
}
+const char *smtp_get_Recipients(void)
+{
+ if (SMTP == NULL)
+ return NULL;
+ else return SMTP->from;
+}
/*
* Implements the "MAIL From:" command
}
valid = validate_recipients(recp,
+ smtp_get_Recipients (),
(CC->logged_in)? POST_LOGGED_IN:POST_EXTERNAL);
if (valid->num_error != 0) {
cprintf("599 5.1.1 Error: %s\r\n", valid->errormsg);
/* Submit the message into the Citadel system. */
valid = validate_recipients(SMTP->recipients,
+ smtp_get_Recipients (),
(CC->logged_in)? POST_LOGGED_IN:POST_EXTERNAL);
/* If there are modules that want to scan this message before final
}
/* Can we deliver the bounce to the original sender? */
- valid = validate_recipients(bounceto, 0);
+ valid = validate_recipients(bounceto, smtp_get_Recipients (), 0);
if (valid != NULL) {
if (valid->num_error == 0) {
CtdlSubmitMsg(bmsg, valid, "");
char *argbuf = &cmdbuf[4];
extract_token(internet_addr, argbuf, 0, '|', sizeof internet_addr);
- rcpt = validate_recipients(internet_addr, CHECK_EXISTANCE);
+ rcpt = validate_recipients(internet_addr, NULL, CHECK_EXISTANCE);
if ((rcpt != NULL)&&
(
(*rcpt->recp_local != '\0')||
#include "journaling.h"
#include "citadel_dirs.h"
#include "clientsocket.h"
+#include "serv_network.h"
long config_msgnum;
msg->cm_fields['N'] = strdup(NODENAME);
if (to != NULL) {
msg->cm_fields['R'] = strdup(to);
- recp = validate_recipients(to, 0);
+ recp = validate_recipients(to, NULL, 0);
}
if (subject != NULL) {
msg->cm_fields['U'] = strdup(subject);
* 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 PostPublic) {
+int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf,
+ size_t n,
+ const char* RemoteIdentifier,
+ int PostPublic) {
int ra;
if (!(CC->logged_in) &&
return (ERROR + NOT_LOGGED_IN);
}
else if (PostPublic == CHECK_EXISTANCE) {
- return (0);
+ SpoolControl *sc;
+ char filename[SIZ];
+ char room_to_spool[SIZ];
+ int found;
+
+ if (RemoteIdentifier == NULL)
+ {
+ snprintf(errmsgbuf, n, "Need sender to permit access.");
+ return (0);
+ }
+ if (getroom(&CC->room, room_to_spool) != 0) {
+ lprintf(CTDL_CRIT, "ERROR: cannot load <%s>\n", room_to_spool);
+ return (0);
+ }
+
+ assoc_file_name(filename, sizeof filename, &CC->room, ctdl_netcfg_dir);
+
+ lprintf(CTDL_INFO, "Networking started for <%s>\n", CC->room.QRname);
+ begin_critical_section(S_NETCONFIGS);
+ if (!read_spoolcontrol_file(&sc, filename))
+ {
+ end_critical_section(S_NETCONFIGS);
+ snprintf(errmsgbuf, n, "No Subscribers found.");
+ return (0);
+ }
+ end_critical_section(S_NETCONFIGS);
+ found = is_recipient (sc, RemoteIdentifier);
+ free_spoolcontrol_struct(&sc);
+ return (found);
}
else if (!(CC->logged_in)) {
if ((CC->room.QRflags & QR_READONLY)) {
*
* Caller needs to free the result using free_recipients()
*/
-struct recptypes *validate_recipients(char *supplied_recipients, int Flags) {
+struct recptypes *validate_recipients(char *supplied_recipients,
+ const char *RemoteIdentifier,
+ int Flags) {
struct recptypes *ret;
char *recipients = NULL;
char this_recp[256];
CC->room = tempQR;
/* Check permissions to send mail to this room */
- err = CtdlDoIHavePermissionToPostInThisRoom(errmsg, sizeof errmsg, Flags);
+ err = CtdlDoIHavePermissionToPostInThisRoom(errmsg,
+ sizeof errmsg,
+ RemoteIdentifier,
+ Flags);
if (err)
{
cprintf("%d %s\n", err, errmsg);
/* first check to make sure the request is valid. */
- err = CtdlDoIHavePermissionToPostInThisRoom(errmsg, sizeof errmsg, POST_LOGGED_IN);
+ err = CtdlDoIHavePermissionToPostInThisRoom(errmsg, sizeof errmsg, NULL, POST_LOGGED_IN);
if (err)
{
cprintf("%d %s\n", err, errmsg);
strcpy(bcc, "");
}
- valid_to = validate_recipients(recp, 0);
+ valid_to = validate_recipients(recp, NULL, 0);
if (valid_to->num_error > 0) {
cprintf("%d Invalid recipient (To)\n", ERROR + NO_SUCH_USER);
free_recipients(valid_to);
return;
}
- valid_cc = validate_recipients(cc, 0);
+ valid_cc = validate_recipients(cc, NULL, 0);
if (valid_cc->num_error > 0) {
cprintf("%d Invalid recipient (CC)\n", ERROR + NO_SUCH_USER);
free_recipients(valid_to);
return;
}
- valid_bcc = validate_recipients(bcc, 0);
+ valid_bcc = validate_recipients(bcc, NULL, 0);
if (valid_bcc->num_error > 0) {
cprintf("%d Invalid recipient (BCC)\n", ERROR + NO_SUCH_USER);
free_recipients(valid_to);
strcat(all_recps, bcc);
}
if (!IsEmptyStr(all_recps)) {
- valid = validate_recipients(all_recps, 0);
+ valid = validate_recipients(all_recps, NULL, 0);
}
else {
valid = NULL;
struct recptypes *recp;
int i;
- recp = validate_recipients(addr, 0);
+ recp = validate_recipients(addr, NULL, 0);
if (recp == NULL) return(0);
if (recp->num_local == 0) {
POST_EXTERNAL,
CHECK_EXISTANCE
};
-int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n, int PostPublic);
+int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf,
+ size_t n,
+ const char* RemoteIdentifier,
+ int PostPublic);
/* values for which_set */
struct ctdluser *which_user, struct ctdlroom *which_room);
void CtdlGetSeen(char *buf, int which_set);
-struct recptypes *validate_recipients(char *recipients, int Flags);
+struct recptypes *validate_recipients(char *recipients,
+ const char *RemoteIdentifier,
+ int Flags);
+
void free_recipients(struct recptypes *);
struct CtdlMessage *CtdlMakeMessage(
int writenfree_spoolcontrol_file(SpoolControl **scc, char *filename);
int read_spoolcontrol_file(SpoolControl **scc, char *filename);
-int is_recipient(SpoolControl *sc, char *Name);
+int is_recipient(SpoolControl *sc, const char *Name);
void network_queue_room(struct ctdlroom *, void *);
* is an e-mail address
*/
if (found_user != 0) {
- valid = validate_recipients(username, 0);
+ valid = validate_recipients(username, NULL, 0);
if (valid != NULL) {
if (valid->num_local == 1) {
found_user = getuser(&CC->user, valid->recp_local);