* Try to delete 'cancel' messages locally after they've been distributed.
$Log$
+Revision 1.412 1999/11/05 03:53:47 ajc
+* Issue 'cancel' messages for vCard when a user is deleted.
+* Try to delete 'cancel' messages locally after they've been distributed.
+
Revision 1.411 1999/11/03 04:01:20 ajc
* Fixed buffer overrun problems in cmd_rchg(), cmd_hchg(), and cmd_uchg()
* Removed my email address as the feedback content from the docs; replaced
Fri Jul 10 1998 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
* Initial CVS import
+
"path",
"",
"rcpt",
- "",
+ "spec",
"time",
"subj",
"",
struct filterlist *filter = NULL;
struct syslist *slist = NULL;
+struct msglist *purgelist = NULL;
struct config config;
extern char bbs_home_directory[];
+
+/*
+ * Add a message to the list of messages to be deleted off the local server
+ * at the end of this run.
+ */
+void delete_locally(long msgid, char *roomname) {
+ struct msglist *mptr;
+
+ mptr = (struct msglist *) malloc(sizeof(struct msglist));
+ mptr->next = purgelist;
+ mptr->m_num = msgid;
+ strcpy(mptr->m_rmname, roomname);
+ purgelist = mptr;
+}
+
+
+
+/*
+ * Delete all messages on the purge list from the local server.
+ */
+void process_purgelist(void) {
+ char curr_rm[ROOMNAMELEN];
+ char buf[256];
+ struct msglist *mptr;
+
+
+ strcpy(curr_rm, "__nothing__");
+ while (purgelist != NULL) {
+ if (strcasecmp(curr_rm, purgelist->m_rmname)) {
+ sprintf(buf, "GOTO %s", purgelist->m_rmname);
+ serv_puts(buf);
+ serv_gets(buf);
+ if (buf[0] == '2') extract(curr_rm, &buf[4], 0);
+ }
+ if (strcasecmp(curr_rm, purgelist->m_rmname)) {
+ sprintf(buf, "DELE %ld", purgelist->m_num);
+ serv_puts(buf);
+ serv_gets(buf);
+ }
+ mptr = purgelist->next;
+ free(purgelist);
+ purgelist = mptr;
+ }
+}
+
+
+
+
/* spool list of messages to a file */
/* returns # of msgs spooled */
int spool_out(struct msglist *cmlist, FILE * destfp, char *sysname)
fprintf(destfp, "%s!", NODENAME);
if (a != 'C')
fwrite(fbuf, strlen(fbuf) + 1, 1, destfp);
+ if (a == 'S') if (!strcasecmp(fbuf, "CANCEL")) {
+ delete_locally(cmptr->m_num, cmptr->m_rmname);
+ }
}
if (a == 'M') {
fprintf(destfp, "C%s%c",
/* Update mail.sysinfo with new information we learned */
rewrite_syslist();
+ /* Delete any messages which need to be purged locally */
+ process_purgelist();
+
/* Close the use table */
purge_use_table(use_table);
gdbm_close(use_table);
}
+/*
+ * When a user is being deleted, we have to remove his/her vCard.
+ * This is accomplished by issuing a message with 'CANCEL' in the S (special)
+ * field, and the same Extended ID as the existing card.
+ */
+void vcard_purge(char *username, long usernum) {
+ struct CtdlMessage *msg;
+ char buf[256];
+
+ msg = (struct CtdlMessage *) mallok(sizeof(struct CtdlMessage));
+ if (msg == NULL) return;
+ memset(msg, 0, sizeof(struct CtdlMessage));
+ msg->cm_magic = CTDLMESSAGE_MAGIC;
+ msg->cm_anon_type = MES_NORMAL;
+ msg->cm_format_type = 0;
+ msg->cm_fields['A'] = strdoop(username);
+ msg->cm_fields['O'] = strdoop(ADDRESS_BOOK_ROOM);
+ msg->cm_fields['N'] = strdoop(NODENAME);
+ msg->cm_fields['M'] = strdoop("Purge this vCard\n");
+
+ sprintf(buf,
+ "Citadel vCard: personal card for %s at %s",
+ msg->cm_fields['A'], NODENAME);
+ msg->cm_fields['E'] = strdoop(buf);
+
+ msg->cm_fields['S'] = strdoop("CANCEL");
+
+ CtdlSaveMsg(msg, "", ADDRESS_BOOK_ROOM, MES_LOCAL, 1);
+ CtdlFreeMessage(msg);
+}
+
+
+
+
+/*
+ * Session startup, allocate some per-session data
+ */
void vcard_session_startup_hook(void) {
CtdlAllocUserData(SYM_VCARD, sizeof(struct vcard_internal_info));
}
-
char *Dynamic_Module_Init(void)
{
SYM_VCARD = CtdlGetDynamicSymbol();
CtdlRegisterMessageHook(vcard_upload_aftersave, EVT_AFTERSAVE);
CtdlRegisterProtoHook(cmd_regi, "REGI", "Enter registration info");
CtdlRegisterProtoHook(cmd_greg, "GREG", "Get registration info");
+ CtdlRegisterUserHook(vcard_purge, EVT_PURGEUSER);
create_room(ADDRESS_BOOK_ROOM, 0, "", 0);
return "$Id$";
}
+
+
+
network. Usually means that the message isn't really
a message, but rather some other network function:
-> "S" followed by "FILE" (followed by a null, of
- course) means that the message text is actually an
- IGnet/Open file transfer.
+ course) means that the message text is actually an
+ IGnet/Open file transfer.
+ -> "S" followed by "CANCEL" means that this message
+ should be deleted from the local message base once
+ it has been replicated to all network systems.
T Date/Time A 32-bit integer containing the date and time of
the message in standard UNIX format (the number
of seconds since January 1, 1970 GMT).