X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Flistsub%2Fserv_listsub.c;h=ada4bbadd64e2323be4d29a903020104f4d87cbe;hb=3ea9847837af221d22494eebeb8b08826db0fb25;hp=6c9ed1f743340e114e3f3cf861dcad4b79799ff7;hpb=dade39dc9ec1d4ab56f14842a162373542e26a67;p=citadel.git
diff --git a/citadel/modules/listsub/serv_listsub.c b/citadel/modules/listsub/serv_listsub.c
index 6c9ed1f74..ada4bbadd 100644
--- a/citadel/modules/listsub/serv_listsub.c
+++ b/citadel/modules/listsub/serv_listsub.c
@@ -48,7 +48,6 @@
#include "msgbase.h"
#include "internet_addressing.h"
#include "clientsocket.h"
-#include "file_ops.h"
#include "ctdl_module.h"
/*
@@ -58,17 +57,21 @@
void listsub_generate_token(char *buf) {
char sourcebuf[SIZ];
static int seq = 0;
+ size_t len;
/* Theo, please sit down and shut up. This key doesn't have to be
* tinfoil-hat secure, it just needs to be reasonably unguessable
* and unique.
*/
- sprintf(sourcebuf, "%lx",
+ len = sprintf(sourcebuf, "%lx",
(long) (++seq + getpid() + time(NULL))
);
/* Convert it to base64 so it looks cool */
- CtdlEncodeBase64(buf, sourcebuf, strlen(sourcebuf), 0);
+ len = CtdlEncodeBase64(buf, sourcebuf, len, 0);
+ if (buf[len - 1] == '\n') {
+ buf[len - 1] = '\0';
+ }
}
const RoomNetCfg ActiveSubscribers[] = {listrecp, digestrecp};
@@ -109,6 +112,7 @@ void do_subscribe(StrBuf **room, StrBuf **email, StrBuf **subtype, StrBuf **webp
const char *RoomMailAddress;
OneRoomNetCfg *OneRNCfg;
RoomNetCfgLine *Line;
+ const char *EmailSender = NULL;
long RoomMailAddressLen;
if (CtdlGetRoom(&qrbuf, ChrPtr(*room)) != 0) {
@@ -132,8 +136,9 @@ void do_subscribe(StrBuf **room, StrBuf **email, StrBuf **subtype, StrBuf **webp
OneRNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber);
if (OneRNCfg!=NULL) {
found_sub = CountThisSubscriber(OneRNCfg, *email);
- if (StrLength(OneRNCfg->Sender) > 0)
- RoomMailAddress = ChrPtr(OneRNCfg->Sender);
+ if (StrLength(OneRNCfg->Sender) > 0) {
+ EmailSender = RoomMailAddress = ChrPtr(OneRNCfg->Sender);
+ }
}
if (found_sub != 0) {
@@ -157,7 +162,7 @@ void do_subscribe(StrBuf **room, StrBuf **email, StrBuf **subtype, StrBuf **webp
Line->Value = (StrBuf**) malloc(sizeof(StrBuf*) * 5);
- Line->Value[0] = *email; *email = NULL;
+ Line->Value[0] = NewStrBufDup(*email);
Line->Value[1] = *subtype; *subtype = NULL;
Line->Value[2] = NewStrBufPlain(token, -1);
Line->Value[3] = NewStrBufPlain(NULL, 10);
@@ -270,7 +275,7 @@ void do_subscribe(StrBuf **room, StrBuf **email, StrBuf **subtype, StrBuf **webp
pcf_req = SmashStrBuf(&cf_req);
quickie_message( /* This delivers the message */
"Citadel",
- NULL,
+ EmailSender,
ChrPtr(*email),
NULL,
pcf_req,
@@ -289,6 +294,7 @@ void do_subscribe(StrBuf **room, StrBuf **email, StrBuf **subtype, StrBuf **webp
*/
void do_unsubscribe(StrBuf **room, StrBuf **email, StrBuf **webpage) {
struct ctdlroom qrbuf;
+ const char *EmailSender = NULL;
char token[256];
char *pcf_req;
StrBuf *cf_req;
@@ -323,7 +329,7 @@ void do_unsubscribe(StrBuf **room, StrBuf **email, StrBuf **webpage) {
if (OneRNCfg!=NULL) {
found_sub = CountThisSubscriber(OneRNCfg, *email);
if (StrLength(OneRNCfg->Sender) > 0)
- RoomMailAddress = ChrPtr(OneRNCfg->Sender);
+ EmailSender = RoomMailAddress = ChrPtr(OneRNCfg->Sender);
}
if (found_sub == 0) {
@@ -344,14 +350,14 @@ void do_unsubscribe(StrBuf **room, StrBuf **email, StrBuf **webpage) {
Line = (RoomNetCfgLine*)malloc(sizeof(RoomNetCfgLine));
memset(Line, 0, sizeof(RoomNetCfgLine));
- Line->Value = (StrBuf**) malloc(sizeof(StrBuf*) * 5);
+ Line->Value = (StrBuf**) malloc(sizeof(StrBuf*) * 4);
- Line->Value[0] = *email; *email = NULL;
- Line->Value[2] = NewStrBufPlain(token, -1);
- Line->Value[3] = NewStrBufPlain(NULL, 10);
- StrBufPrintf(Line->Value[3], "%ld", time(NULL));
- Line->Value[4] = *webpage; *webpage = NULL;
- Line->nValues = 5;
+ Line->Value[0] = NewStrBufDup(*email);
+ Line->Value[1] = NewStrBufPlain(token, -1);
+ Line->Value[2] = NewStrBufPlain(NULL, 10);
+ StrBufPrintf(Line->Value[2], "%ld", time(NULL));
+ Line->Value[3] = *webpage; *webpage = NULL;
+ Line->nValues = 4;
AddRoomCfgLine(OneRNCfg, &qrbuf, unsubpending, Line);
@@ -386,11 +392,11 @@ void do_unsubscribe(StrBuf **room, StrBuf **email, StrBuf **webpage) {
HKEY("' mailing list.\n"
"\n"
"Please go here to confirm this request:\n "), 0);
- StrBufAppendBuf(cf_req, Line->Value[4], 0);
+ StrBufAppendBuf(cf_req, Line->Value[3], 0);
StrBufAppendBufPlain(cf_req, HKEY("?room="), 0);
StrBufAppendBuf(cf_req, UrlRoom, 0);
StrBufAppendBufPlain(cf_req, HKEY("&token="), 0);
- StrBufAppendBuf(cf_req, Line->Value[2], 0);
+ StrBufAppendBuf(cf_req, Line->Value[1], 0);
StrBufAppendBufPlain(
cf_req,
@@ -422,22 +428,22 @@ void do_unsubscribe(StrBuf **room, StrBuf **email, StrBuf **webpage) {
HKEY(" mailing list.
\n"
"Please click here to confirm this request:
\n"
"Value[4], 0);
+ StrBufAppendBuf(cf_req, Line->Value[3], 0);
StrBufAppendBufPlain(cf_req, HKEY("?room="), 0);
StrBufAppendBuf(cf_req, UrlRoom, 0);
StrBufAppendBufPlain(cf_req, HKEY("&token="), 0);
- StrBufAppendBuf(cf_req, Line->Value[2], 0);
+ StrBufAppendBuf(cf_req, Line->Value[1], 0);
StrBufAppendBufPlain(cf_req, HKEY("&cmd=confirm\">"), 0);
- StrBufAppendBuf(cf_req, Line->Value[4], 0);
+ StrBufAppendBuf(cf_req, Line->Value[3], 0);
StrBufAppendBufPlain(cf_req, HKEY("?room="), 0);
StrBufAppendBuf(cf_req, UrlRoom, 0);
StrBufAppendBufPlain(cf_req, HKEY("&token="), 0);
- StrBufAppendBuf(cf_req, Line->Value[2], 0);
+ StrBufAppendBuf(cf_req, Line->Value[1], 0);
StrBufAppendBufPlain(
@@ -460,7 +466,7 @@ void do_unsubscribe(StrBuf **room, StrBuf **email, StrBuf **webpage) {
pcf_req = SmashStrBuf(&cf_req);
quickie_message( /* This delivers the message */
"Citadel",
- NULL,
+ EmailSender,
ChrPtr(*email),
NULL,
pcf_req,
@@ -468,6 +474,8 @@ void do_unsubscribe(StrBuf **room, StrBuf **email, StrBuf **webpage) {
"Please confirm your unsubscribe request"
);
+ free(pcf_req);
+ FreeStrBuf(&UrlRoom);
cprintf("%d Unubscription noted; confirmation request sent\n", CIT_OK);
}
@@ -481,10 +489,12 @@ void do_confirm(StrBuf **room, StrBuf **token) {
struct ctdlroom qrbuf;
OneRoomNetCfg *OneRNCfg;
RoomNetCfgLine *Line;
- RoomNetCfgLine *ConfirmLine;
+ RoomNetCfgLine *ConfirmLine = NULL;
+ RoomNetCfgLine *RemoveLine = NULL;
RoomNetCfgLine **PrevLine;
int success = 0;
RoomNetCfg ConfirmType;
+ const char *errmsg = "";
int i;
if (CtdlGetRoom(&qrbuf, ChrPtr(*room)) != 0) {
@@ -500,65 +510,96 @@ void do_confirm(StrBuf **room, StrBuf **token) {
return;
}
+
+ if (StrLength(*token) == 0) {
+ cprintf("%d empty token.\n", ERROR + ILLEGAL_VALUE);
+ return;
+ }
/*
* Now start scanning this room's netconfig file for the
* specified token.
*/
begin_critical_section(S_NETCONFIGS);
OneRNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber);
- if (OneRNCfg==NULL) {
-////TODO
- }
-
ConfirmType = maxRoomNetCfg;
- for (i = 0; i < 2; i++)
+ if (OneRNCfg==NULL)
+ {
+ errmsg = "no networking config found";
+ }
+ else for (i = 0; i < 2; i++)
{
+ int offset;
+
+ if (ConfirmSubscribers[i] == subpending)
+ offset = 2;
+ else
+ offset = 1;
PrevLine = &OneRNCfg->NetConfigs[ConfirmSubscribers[i]];
Line = *PrevLine;
while (Line != NULL)
{
if (!strcasecmp(ChrPtr(*token),
- ChrPtr(Line->Value[2])))
+ ChrPtr(Line->Value[offset])))
{
- *PrevLine = Line->next; /* Remove it from the list */
ConfirmLine = Line;
+ *PrevLine = Line->next; /* Remove it from the list */
ConfirmType = ConfirmSubscribers[i];
+ ConfirmLine->next = NULL;
+
i += 100;
break;
+
}
- PrevLine = &Line;
+ PrevLine = &(*PrevLine)->next;
Line = Line->next;
}
+ if (ConfirmType == maxRoomNetCfg)
+ {
+ errmsg = "No active un/subscribe request found";
+ }
}
- if (ConfirmType == subpending) {
- if (!strcasecmp(ChrPtr(ConfirmLine->Value[2]),
- ("digest")))
+ if (ConfirmType == subpending)
+ {
+ if (CountThisSubscriber(OneRNCfg, ConfirmLine->Value[0]) == 0)
{
- ConfirmType = digestrecp;
+ if (!strcasecmp(ChrPtr(ConfirmLine->Value[2]),
+ ("digest")))
+ {
+ ConfirmType = digestrecp;
+ }
+ else /* "list" */
+ {
+ ConfirmType = listrecp;
+ }
+
+ syslog(LOG_NOTICE,
+ "Mailing list: %s subscribed to %s with token %s\n",
+ ChrPtr(ConfirmLine->Value[0]),
+ qrbuf.QRname,
+ ChrPtr(*token));
+
+ FreeStrBuf(&ConfirmLine->Value[1]);
+ FreeStrBuf(&ConfirmLine->Value[2]);
+ FreeStrBuf(&ConfirmLine->Value[3]);
+ FreeStrBuf(&ConfirmLine->Value[4]);
+ ConfirmLine->nValues = 1;
+
+ AddRoomCfgLine(OneRNCfg, &qrbuf, ConfirmType, ConfirmLine);
+ success = 1;
}
else
{
- ConfirmType = listrecp;
+ /* whipe duplicate subscribe entry... */
+ OneRNCfg->changed = 1;
+ SaveChangedConfigs();
+ errmsg = "already subscribed";
}
-
- syslog(LOG_NOTICE,
- "Mailing list: %s subscribed to %s with token %s\n",
- ChrPtr(ConfirmLine->Value[0]),
- qrbuf.QRname,
- ChrPtr(*token));
-
- FreeStrBuf(&ConfirmLine->Value[1]);
- FreeStrBuf(&ConfirmLine->Value[2]);
- FreeStrBuf(&ConfirmLine->Value[3]);
- FreeStrBuf(&ConfirmLine->Value[4]);
- ConfirmLine->nValues = 5;
-
- AddRoomCfgLine(OneRNCfg, &qrbuf, ConfirmType, ConfirmLine);
- success = 1;
}
- else if (ConfirmType == unsubpending) {
+ else if (ConfirmType == unsubpending)
+ {
+
for (i = 0; i < 2; i++)
{
PrevLine = &OneRNCfg->NetConfigs[ActiveSubscribers[i]];
@@ -566,29 +607,37 @@ void do_confirm(StrBuf **room, StrBuf **token) {
while (Line != NULL)
{
if (!strcasecmp(ChrPtr(ConfirmLine->Value[0]),
- ChrPtr(Line->Value[2])))
+ ChrPtr(Line->Value[0])))
{
+ success = 1;
+ RemoveLine = Line;
*PrevLine = Line->next; /* Remove it from the list */
- i += 100;
- break;
+ RemoveLine->next = NULL;
+ if (RemoveLine != NULL)
+ DeleteGenericCfgLine(NULL/*TODO*/, &RemoveLine);
+ Line = *PrevLine;
+ continue;
}
- PrevLine = &Line;
+ PrevLine = &(*PrevLine)->next;
Line = Line->next;
}
}
-
- syslog(LOG_NOTICE,
- "Mailing list: %s unsubscribed to %s with token %s\n",
- ChrPtr(ConfirmLine->Value[0]),
- qrbuf.QRname,
- ChrPtr(*token));
-
-
- if (Line != NULL) DeleteGenericCfgLine(NULL/*TODO*/, &Line);
+ if (success)
+ {
+ syslog(LOG_NOTICE,
+ "Mailing list: %s unsubscribed to %s with token %s\n",
+ ChrPtr(ConfirmLine->Value[0]),
+ qrbuf.QRname,
+ ChrPtr(*token));
+ }
+ else
+ {
+ errmsg = "no subscriber found for this unsubscription request";
+ }
DeleteGenericCfgLine(NULL/*TODO*/, &ConfirmLine);
- AddRoomCfgLine(OneRNCfg, &qrbuf, ConfirmType, NULL);
- success = 1;
+ OneRNCfg->changed = 1;
+ SaveChangedConfigs();
}
end_critical_section(S_NETCONFIGS);
@@ -600,6 +649,8 @@ void do_confirm(StrBuf **room, StrBuf **token) {
cprintf("%d %d operation(s) confirmed.\n", CIT_OK, success);
}
else {
+ syslog(LOG_NOTICE, "failed processing (un)subscribe request: %s",
+ errmsg);
cprintf("%d Invalid token.\n", ERROR + ILLEGAL_VALUE);
}