- /* Everyone gets an email address based on their display name */
- snprintf(buf, sizeof buf, "%s@%s", usbuf->fullname, CtdlGetConfigStr("c_fqdn"));
- for (i=0; buf[i]; ++i) {
- if (buf[i] == ' ') buf[i] = '_';
- }
- vcard_add_prop(v, "email;internet", buf);
- }
-
- vcard_write_user(usbuf, v);
- vcard_free(v);
-}
-
-
-/*
- * 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 Exclusive ID as the existing card.
- */
-void vcard_purge(struct ctdluser *usbuf) {
- struct CtdlMessage *msg;
- char buf[SIZ];
- long len;
-
- msg = (struct CtdlMessage *) malloc(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;
- if (!IsEmptyStr(usbuf->fullname)) {
- CM_SetField(msg, eAuthor, usbuf->fullname, strlen(usbuf->fullname));
- }
- CM_SetField(msg, eOriginalRoom, HKEY(ADDRESS_BOOK_ROOM));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
- CM_SetField(msg, eMesageText, HKEY("Purge this vCard\n"));
-
- len = snprintf(buf, sizeof buf, VCARD_EXT_FORMAT,
- msg->cm_fields[eAuthor], NODENAME);
- CM_SetField(msg, eExclusiveID, buf, len);
-
- CM_SetField(msg, eSpecialField, HKEY("CANCEL"));
-
- CtdlSubmitMsg(msg, NULL, ADDRESS_BOOK_ROOM, QP_EADDR);
- CM_Free(msg);
-}
-
-
-/*
- * Grab vCard directory stuff out of incoming network messages
- */
-int vcard_extract_from_network(struct CtdlMessage *msg, char *target_room) {
- char *ptr;
- int linelen;
-
- if (msg == NULL) return(0);
-
- if (strcasecmp(target_room, ADDRESS_BOOK_ROOM)) {
- return(0);
- }
-
- if (msg->cm_format_type != 4) return(0);
-
- if (CM_IsEmpty(msg, eMesageText))
- return 0;
-
- ptr = msg->cm_fields[eMesageText];
-
- while (ptr != NULL) {
-
- linelen = strcspn(ptr, "\n");
- if (linelen == 0) return(0); /* end of headers */
-
- if ( (!strncasecmp(ptr, "Content-type: text/x-vcard", 26))
- || (!strncasecmp(ptr, "Content-type: text/vcard", 24)) ) {
- /* It's a vCard. Add it to the directory. */
- vcard_extract_internet_addresses(msg, CtdlDirectoryAddUser);
- return(0);
- }
-
- ptr = strchr((char *)ptr, '\n');
- if (ptr != NULL) ++ptr;
- }
-
- return(0);
-}
-
-
-
-/*
- * When a vCard is being removed from the Global Address Book room, remove it
- * from the directory as well.
- */
-void vcard_delete_remove(char *room, long msgnum) {
- struct CtdlMessage *msg;
- char *ptr;
- int linelen;
-
- if (msgnum <= 0L) return;
-
- if (room == NULL) return;
-
- if (strcasecmp(room, ADDRESS_BOOK_ROOM)) {
- return;
- }
-
- msg = CtdlFetchMessage(msgnum, 1, 1);
- if (msg == NULL) return;
-
- if (CM_IsEmpty(msg, eMesageText))
- goto EOH;
-
- ptr = msg->cm_fields[eMesageText];
-
- while (ptr != NULL) {
- linelen = strcspn(ptr, "\n");
- if (linelen == 0) goto EOH;
-
- if ( (!strncasecmp(ptr, "Content-type: text/x-vcard", 26))
- || (!strncasecmp(ptr, "Content-type: text/vcard", 24)) ) {
- /* Bingo! A vCard is being deleted. */
- vcard_extract_internet_addresses(msg, CtdlDirectoryDelUser);