The requestor will now receive a mail telling him something went wrong
when he tries to unsubscribe an address without specifying a list name.
This commit is contained in:
parent
99aaaee119
commit
1ee5bff1c4
157
unsubscribe.c
157
unsubscribe.c
@ -26,7 +26,8 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
const char * param1,
|
||||
const char * param2,
|
||||
const char * defaultlist)
|
||||
{
|
||||
{
|
||||
const struct PD_Config * MasterConfig;
|
||||
const struct List_Config * ListConfig;
|
||||
FILE * fh;
|
||||
const char * address = NULL;
|
||||
@ -38,55 +39,91 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
char * p;
|
||||
char * list;
|
||||
|
||||
/* Initialize internal stuff from master config file. */
|
||||
|
||||
MasterConfig = getMasterConfig();
|
||||
sprintf(envelope, "petidomo-manager@%s", MasterConfig->fqdn);
|
||||
originator = (MailStruct->Reply_To) ? MailStruct->Reply_To : MailStruct->From;
|
||||
|
||||
/* Try to find out, which parameter is what. */
|
||||
|
||||
if (param1 != NULL) {
|
||||
if (param1 != NULL)
|
||||
{
|
||||
if (isValidListName(param1) == TRUE)
|
||||
listname = param1;
|
||||
else if (isRFC822Address(param1) == TRUE)
|
||||
address = param1;
|
||||
|
||||
if (param2 != NULL) {
|
||||
if (isValidListName(param2) == TRUE)
|
||||
if (param2 != NULL)
|
||||
{
|
||||
if (listname == NULL && isValidListName(param2) == TRUE)
|
||||
listname = param2;
|
||||
else if (isRFC822Address(param2) == TRUE)
|
||||
else if (address == NULL && isRFC822Address(param2) == TRUE)
|
||||
address = param2;
|
||||
}
|
||||
}
|
||||
|
||||
if (address == NULL)
|
||||
address = (MailStruct->Reply_To) ? MailStruct->Reply_To : MailStruct->From;
|
||||
if (listname == NULL && defaultlist != NULL)
|
||||
listname = defaultlist;
|
||||
assert(address != NULL);
|
||||
|
||||
if (address == NULL || listname == NULL) {
|
||||
syslog(LOG_NOTICE, "%s: unsubscribe-command invalid: No list specified.",
|
||||
MailStruct->From);
|
||||
if (listname == NULL)
|
||||
{
|
||||
if (defaultlist != NULL)
|
||||
listname = defaultlist;
|
||||
else
|
||||
{
|
||||
syslog(LOG_NOTICE, "%s: unsubscribe-command invalid: No list specified.", MailStruct->From);
|
||||
fh = vOpenMailer(envelope, originator, NULL);
|
||||
if (fh != NULL)
|
||||
{
|
||||
fprintf(fh, "From: petidomo@%s (Petidomo Mailing List Server)\n", MasterConfig->fqdn);
|
||||
fprintf(fh, "To: %s\n", originator);
|
||||
fprintf(fh, "Subject: Petidomo: Your request \"unsubscribe %s\"\n", address);
|
||||
if (MailStruct->Message_Id != NULL)
|
||||
fprintf(fh, "In-Reply-To: %s\n", MailStruct->Message_Id);
|
||||
fprintf(fh, "Precedence: junk\n");
|
||||
fprintf(fh, "Sender: %s\n", envelope);
|
||||
fprintf(fh, "\n");
|
||||
buffer = text_easy_sprintf("You tried to unsubscribe the address \"%s\" from a mailing list. " \
|
||||
"Unfortunately, your request could not be processed, because " \
|
||||
"you didn't specify a valid mailing list name from which the " \
|
||||
"address should be unsubscribed. You may use the command INDEX " \
|
||||
"to receive an overview over the available mailing lists. Also, " \
|
||||
"use the command HELP to verify that you got the command syntax " \
|
||||
"right.", address);
|
||||
text_wordwrap(buffer, 70);
|
||||
fprintf(fh, "%s\n", buffer);
|
||||
CloseMailer(fh);
|
||||
}
|
||||
else
|
||||
syslog(LOG_ERR, "Failed to send email to \"%s\" concerning his request.", originator);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize internal stuff. */
|
||||
/* Initialize internal stuff again from list config. */
|
||||
|
||||
ListConfig = getListConfig(listname);
|
||||
sprintf(owner, "%s-owner@%s", listname, ListConfig->fqdn);
|
||||
sprintf(envelope, "%s-owner@%s", listname, ListConfig->fqdn);
|
||||
originator = (MailStruct->Reply_To) ? MailStruct->Reply_To : MailStruct->From;
|
||||
|
||||
/* Check whether the request is authorized at all. */
|
||||
|
||||
if (isValidAdminPassword(getPassword(), listname) == FALSE) {
|
||||
|
||||
if (isValidAdminPassword(getPassword(), listname) == FALSE)
|
||||
{
|
||||
/* No valid password, check further. */
|
||||
|
||||
if (ListConfig->allowpubsub == FALSE) {
|
||||
|
||||
if (ListConfig->allowpubsub == FALSE)
|
||||
{
|
||||
/* Access was unauthorized, notify the originator. */
|
||||
|
||||
syslog(LOG_INFO, "\"%s\" tried to unsubscribe \"%s\" from list \"%s\", but " \
|
||||
"couldn't provide the correct password.", originator, address, listname);
|
||||
|
||||
fh = vOpenMailer(envelope, originator, NULL);
|
||||
if (fh != NULL) {
|
||||
if (fh != NULL)
|
||||
{
|
||||
fprintf(fh, "From: %s-request@%s (Petidomo Mailing List Server)\n",
|
||||
listname, ListConfig->fqdn);
|
||||
fprintf(fh, "To: %s\n", originator);
|
||||
@ -98,10 +135,10 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
fprintf(fh, "Sender: %s\n", envelope);
|
||||
fprintf(fh, "\n");
|
||||
buffer = text_easy_sprintf(
|
||||
"The mailing list \"%s\" is a closed forum and only the maintainer may " \
|
||||
"unsubscribe addresses. Your request has been forwarded to the " \
|
||||
"appropriate person, so please don't send any further mail. You will " \
|
||||
"be notified as soon as possible.", listname);
|
||||
"The mailing list \"%s\" is a closed forum and only the maintainer may " \
|
||||
"unsubscribe addresses. Your request has been forwarded to the " \
|
||||
"appropriate person, so please don't send any further mail. You will " \
|
||||
"be notified as soon as possible.", listname);
|
||||
text_wordwrap(buffer, 70);
|
||||
fprintf(fh, "%s\n", buffer);
|
||||
CloseMailer(fh);
|
||||
@ -113,7 +150,8 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
/* Notify the owner. */
|
||||
|
||||
fh = vOpenMailer(envelope, owner, NULL);
|
||||
if (fh != NULL) {
|
||||
if (fh != NULL)
|
||||
{
|
||||
fprintf(fh, "From: %s-request@%s (Petidomo Mailing List Server)\n",
|
||||
listname, ListConfig->fqdn);
|
||||
fprintf(fh, "To: %s\n", owner);
|
||||
@ -122,16 +160,17 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
fprintf(fh, "Sender: %s\n", envelope);
|
||||
fprintf(fh, "\n");
|
||||
buffer = text_easy_sprintf(
|
||||
"\"%s\" tried to unsubscribe the address \"%s\" from the \"%s\" mailing list, " \
|
||||
"but couldn't provide the correct password. To unsubscribe him, send the " \
|
||||
"following commands to the server:", originator, address, listname);
|
||||
"\"%s\" tried to unsubscribe the address \"%s\" from the \"%s\" mailing list, " \
|
||||
"but couldn't provide the correct password. To unsubscribe him, send the " \
|
||||
"following commands to the server:", originator, address, listname);
|
||||
text_wordwrap(buffer, 70);
|
||||
fprintf(fh, "%s\n\n", buffer);
|
||||
fprintf(fh, "password <AdminPassword>\n");
|
||||
fprintf(fh, "unsubscribe %s %s\n", address, listname);
|
||||
CloseMailer(fh);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to send email to \"%s\"!", owner);
|
||||
return -1;
|
||||
}
|
||||
@ -139,7 +178,8 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
}
|
||||
if (ListConfig->allowaliensub == FALSE &&
|
||||
(MailStruct->From == NULL || !strcasecmp(address, MailStruct->From) == FALSE) &&
|
||||
(MailStruct->Reply_To == NULL || !strcasecmp(address, MailStruct->Reply_To) == FALSE)) {
|
||||
(MailStruct->Reply_To == NULL || !strcasecmp(address, MailStruct->Reply_To) == FALSE))
|
||||
{
|
||||
|
||||
/* Trying to unsubscribe something different than himself. */
|
||||
|
||||
@ -147,7 +187,8 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
"list type doesn't allow this.", originator, address, listname);
|
||||
|
||||
fh = vOpenMailer(envelope, originator, NULL);
|
||||
if (fh != NULL) {
|
||||
if (fh != NULL)
|
||||
{
|
||||
fprintf(fh, "From: %s-request@%s (Petidomo Mailing List Server)\n",
|
||||
listname, ListConfig->fqdn);
|
||||
fprintf(fh, "To: %s\n", originator);
|
||||
@ -159,10 +200,10 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
fprintf(fh, "Sender: %s\n", envelope);
|
||||
fprintf(fh, "\n");
|
||||
buffer = text_easy_sprintf(
|
||||
"The mailing list \"%s\" does not allow to automatically subscribe or unsubscribe an " \
|
||||
"address not equal to the one, you are mailing from. Your request has been forwarded " \
|
||||
"to the list administrator, so please don't send any futher mail. You will be notified " \
|
||||
"as soon as possible.", listname);
|
||||
"The mailing list \"%s\" does not allow to automatically subscribe or unsubscribe an " \
|
||||
"address not equal to the one, you are mailing from. Your request has been forwarded " \
|
||||
"to the list administrator, so please don't send any futher mail. You will be notified " \
|
||||
"as soon as possible.", listname);
|
||||
text_wordwrap(buffer, 70);
|
||||
fprintf(fh, "%s\n", buffer);
|
||||
CloseMailer(fh);
|
||||
@ -174,7 +215,8 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
/* Notify the owner. */
|
||||
|
||||
fh = vOpenMailer(envelope, owner, NULL);
|
||||
if (fh != NULL) {
|
||||
if (fh != NULL)
|
||||
{
|
||||
fprintf(fh, "From: %s-request@%s (Petidomo Mailing List Server)\n",
|
||||
listname, ListConfig->fqdn);
|
||||
fprintf(fh, "To: %s\n", owner);
|
||||
@ -183,17 +225,18 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
fprintf(fh, "Sender: %s\n", envelope);
|
||||
fprintf(fh, "\n");
|
||||
buffer = text_easy_sprintf(
|
||||
"\"%s\" tried to unsubscribe the address \"%s\" from the \"%s\" mailing list. " \
|
||||
"The list type does not allow unsubscribing addresses not equal to the From: " \
|
||||
"address, though, so the request has been denied. To unsubscribe this person " \
|
||||
"manually, send the following commands to the server:", originator, address, listname);
|
||||
"\"%s\" tried to unsubscribe the address \"%s\" from the \"%s\" mailing list. " \
|
||||
"The list type does not allow unsubscribing addresses not equal to the From: " \
|
||||
"address, though, so the request has been denied. To unsubscribe this person " \
|
||||
"manually, send the following commands to the server:", originator, address, listname);
|
||||
text_wordwrap(buffer, 70);
|
||||
fprintf(fh, "%s\n\n", buffer);
|
||||
fprintf(fh, "password <AdminPassword>\n");
|
||||
fprintf(fh, "unsubscribe %s %s\n", address, listname);
|
||||
CloseMailer(fh);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to send email to \"%s\"!", owner);
|
||||
return -1;
|
||||
}
|
||||
@ -203,13 +246,14 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
|
||||
/* Okay, remove the address from the list. */
|
||||
|
||||
if (isSubscribed(listname, address, &list, &p, FALSE) == FALSE) {
|
||||
|
||||
if (isSubscribed(listname, address, &list, &p, FALSE) == FALSE)
|
||||
{
|
||||
/* Notify the originator, that the address is not subscribed at
|
||||
all. */
|
||||
|
||||
fh = vOpenMailer(envelope, originator, NULL);
|
||||
if (fh != NULL) {
|
||||
if (fh != NULL)
|
||||
{
|
||||
fprintf(fh, "From: %s-request@%s (Petidomo Mailing List Server)\n",
|
||||
listname, ListConfig->fqdn);
|
||||
fprintf(fh, "To: %s\n", originator);
|
||||
@ -223,15 +267,18 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
fprintf(fh, "The address is not subscribed to this list.\n");
|
||||
CloseMailer(fh);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to send email to \"%s\" concerning his request.",
|
||||
originator);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
fh = fopen(ListConfig->address_file, "w");
|
||||
if (fh == NULL) {
|
||||
if (fh == NULL)
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to open file \"%s\" for writing: %m", ListConfig->address_file);
|
||||
return -1;
|
||||
}
|
||||
@ -248,7 +295,8 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
fh = vOpenMailer(envelope, address, owner, NULL);
|
||||
else
|
||||
fh = vOpenMailer(envelope, address, originator, owner, NULL);
|
||||
if (fh != NULL) {
|
||||
if (fh != NULL)
|
||||
{
|
||||
fprintf(fh, "From: %s-request@%s (Petidomo Mailing List Server)\n",
|
||||
listname, ListConfig->fqdn);
|
||||
fprintf(fh, "To: %s\n", address);
|
||||
@ -262,25 +310,28 @@ DeleteAddress(struct Mail * MailStruct,
|
||||
fprintf(fh, "Precedence: junk\n");
|
||||
fprintf(fh, "Sender: %s\n", envelope);
|
||||
fprintf(fh, "\n");
|
||||
if (!strcasecmp(address, originator) == TRUE) {
|
||||
if (!strcasecmp(address, originator) == TRUE)
|
||||
{
|
||||
buffer = text_easy_sprintf(
|
||||
"Per your request, the address \"%s\" has been unsubscribed from the " \
|
||||
"\"%s\" mailing list.\n\n", address, listname);
|
||||
"Per your request, the address \"%s\" has been unsubscribed from the " \
|
||||
"\"%s\" mailing list.\n\n", address, listname);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
buffer = text_easy_sprintf(
|
||||
"Per request from \"%s\", the address \"%s\" has been unsubscribed from the " \
|
||||
"\"%s\" mailing list.\n\n", originator, address, listname);
|
||||
"Per request from \"%s\", the address \"%s\" has been unsubscribed from the " \
|
||||
"\"%s\" mailing list.\n\n", originator, address, listname);
|
||||
}
|
||||
text_wordwrap(buffer, 70);
|
||||
fprintf(fh, "%s", buffer);
|
||||
CloseMailer(fh);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to send email to \"%s\"!", owner);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
free(list);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user