-/*
- * "Subscribe" and "Unsubscribe" operations are so similar that they share a function.
- * The actual subscription doesn't take place here -- we just send out the confirmation request
- * and record the address and confirmation token.
- */
-void do_subscribe_or_unsubscribe(int action, char *emailaddr, char *url) {
-
- int i;
- char buf[1024];
- char confirmation_token[40];
-
- // Update this room's netconfig with the updated lastsent
- begin_critical_section(S_NETCONFIGS);
- char *oldnetconfig = LoadRoomNetConfigFile(CC->room.QRnumber);
- if (!oldnetconfig) {
- oldnetconfig = strdup("");
- }
-
- // The new netconfig begins with an empty buffer...
- char *newnetconfig = malloc(strlen(oldnetconfig) + 1024);
- newnetconfig[0] = 0;
-
- // And then we...
- int is_already_subscribed = 0;
- int config_lines = num_tokens(oldnetconfig, '\n');
- for (i=0; i<config_lines; ++i) {
- extract_token(buf, oldnetconfig, i, '\n', sizeof buf);
- int keep_this_line =1; // set to nonzero if we are discarding a line
-
- if (IsEmptyStr(buf)) {
- keep_this_line = 0;
- }
-
- char buf_directive[1024];
- char buf_email[1024];
- extract_token(buf_directive, buf, 0, '|', sizeof buf_directive);
- extract_token(buf_email, buf, 1, '|', sizeof buf_email);
-
- if ( ( (!strcasecmp(buf_directive, "listrecp")) || (!strcasecmp(buf_directive, "digestrecp")) )
- && (!strcasecmp(buf_email, emailaddr))
- ) {
- is_already_subscribed = 1;
- }
-
- if ( (!strcasecmp(buf_directive, "subpending")) || (!strcasecmp(buf_directive, "unsubpending")) ) {
- time_t pendingtime = extract_long(buf, 3);
- if ((time(NULL) - pendingtime) > 259200) {
- syslog(LOG_DEBUG, "%s %s is %ld seconds old - deleting it", buf_email, buf_directive, time(NULL) - pendingtime);
- keep_this_line = 0;
- }
- }
-
- if (keep_this_line) {
- sprintf(&newnetconfig[strlen(newnetconfig)], "%s\n", buf);
- }
- }
-
- // Do we need to send out a confirmation email?
- if ((action == SUBSCRIBE) && (!is_already_subscribed)) {
- generate_uuid(confirmation_token);
- sprintf(&newnetconfig[strlen(newnetconfig)], "subpending|%s|%s|%ld|%s", emailaddr, confirmation_token, time(NULL), url);
- send_subscribe_confirmation_email(CC->room.QRname, emailaddr, url, confirmation_token);
- }
- if ((action == UNSUBSCRIBE) && (is_already_subscribed)) {
- generate_uuid(confirmation_token);
- sprintf(&newnetconfig[strlen(newnetconfig)], "unsubpending|%s|%s|%ld|%s", emailaddr, confirmation_token, time(NULL), url);
- send_unsubscribe_confirmation_email(CC->room.QRname, emailaddr, url, confirmation_token);
- }
-
- // Write the new netconfig back to disk
- SaveRoomNetConfigFile(CC->room.QRnumber, newnetconfig);
- end_critical_section(S_NETCONFIGS);
- free(newnetconfig); // this was the new netconfig, free it because we're done with it
- free(oldnetconfig); // this was the old netconfig, free it even if we didn't do anything
-
- // Tell the client what happened.
- if ((action == SUBSCRIBE) && (is_already_subscribed)) {
- cprintf("%d This email address is already subscribed.\n", ERROR + ALREADY_EXISTS);
- }
- else if ((action == SUBSCRIBE) && (!is_already_subscribed)) {
- cprintf("%d Subscription was requested, and a confirmation email was sent.\n", CIT_OK);
- }
- else if ((action == UNSUBSCRIBE) && (!is_already_subscribed)) {
- cprintf("%d This email address is not subscribed.\n", ERROR + NO_SUCH_USER);
- }
- else if ((action == UNSUBSCRIBE) && (is_already_subscribed)) {
- cprintf("%d Unsubscription was requested, and a confirmation email was sent.\n", CIT_OK);
- }
- else {
- cprintf("%d Nothing happens.\n", ERROR);
- }
-}
-
-
-/*
- * Confirm a list subscription or unsubscription
- */
-void do_confirm(char *token) {
- int yes_subscribe = 0; // Set to 1 if the confirmation to subscribe is validated.
- int yes_unsubscribe = 0; // Set to 1 if the confirmation to unsubscribe is validated.