X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserv_vcard.c;h=b3bb09b1e72fb8b158b6a380cfb4329a0c7b35f7;hb=27d35cf620da260472336afd096787cf5e5558d3;hp=dd9af715188092b81c3c2063d8e494253bd3687c;hpb=c59c819353e018597282023707c4a7440b46d520;p=citadel.git diff --git a/citadel/serv_vcard.c b/citadel/serv_vcard.c index dd9af7151..b3bb09b1e 100644 --- a/citadel/serv_vcard.c +++ b/citadel/serv_vcard.c @@ -54,7 +54,7 @@ #include "support.h" #include "config.h" #include "control.h" -#include "dynloader.h" +#include "serv_extensions.h" #include "room_ops.h" #include "user_ops.h" #include "policy.h" @@ -73,6 +73,19 @@ unsigned long SYM_VCARD; #define VC ((struct vcard_internal_info *)CtdlGetUserData(SYM_VCARD)) +/* + * set global flag calling for an aide to validate new users + */ +void set_mm_valid(void) { + begin_critical_section(S_CONTROL); + get_control(); + CitControl.MMflags = CitControl.MMflags | MM_VALID ; + put_control(); + end_critical_section(S_CONTROL); +} + + + /* * Extract Internet e-mail addresses from a message containing a vCard, and * perform a callback for any found. @@ -172,10 +185,10 @@ void cmd_igab(char *argbuf) { if (CtdlAccessCheck(ac_aide)) return; - strcpy(hold_rm, CC->quickroom.QRname); /* save current room */ + strcpy(hold_rm, CC->room.QRname); /* save current room */ - if (getroom(&CC->quickroom, ADDRESS_BOOK_ROOM) != 0) { - getroom(&CC->quickroom, hold_rm); + if (getroom(&CC->room, ADDRESS_BOOK_ROOM) != 0) { + getroom(&CC->room, hold_rm); cprintf("%d cannot get address book room\n", ERROR); return; } @@ -185,11 +198,11 @@ void cmd_igab(char *argbuf) { CtdlDirectoryInit(); /* We want the last (and probably only) vcard in this room */ - CtdlForEachMessage(MSGS_ALL, 0, (-127), "text/x-vcard", + CtdlForEachMessage(MSGS_ALL, 0, "text/x-vcard", NULL, vcard_add_to_directory, NULL); - getroom(&CC->quickroom, hold_rm); /* return to saved room */ - cprintf("%d Directory has been rebuilt.\n", OK); + getroom(&CC->room, hold_rm); /* return to saved room */ + cprintf("%d Directory has been rebuilt.\n", CIT_OK); } @@ -197,21 +210,13 @@ void cmd_igab(char *argbuf) { /* * See if there is a valid Internet address in a vCard to use for outbound - * Interet messages. If there is, stick it in CC->cs_inet_email. + * Internet messages. If there is, stick it in CC->cs_inet_email. */ void vcard_populate_cs_inet_email(struct vCard *v) { char *s, *addr; int continue_searching = 1; int instance = 0; - /* - * Clear whatever was in there previously. - */ - if (CC->cs_inet_email != NULL) { - phree(CC->cs_inet_email); - CC->cs_inet_email = NULL; - } - /* Go through the vCard searching for *all* instances of * the "email;internet" key */ @@ -224,7 +229,10 @@ void vcard_populate_cs_inet_email(struct vCard *v) { if (strlen(addr) > 0) { if (IsDirectory(addr)) { continue_searching = 0; - CC->cs_inet_email = strdoop(addr); + safestrncpy(CC->cs_inet_email, + addr, + sizeof(CC->cs_inet_email) + ); } } phree(addr); @@ -247,14 +255,14 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { char *ptr; int linelen; char buf[SIZ]; - struct usersupp usbuf; + struct ctdluser usbuf; long what_user; if (!CC->logged_in) return(0); /* Only do this if logged in. */ /* If this isn't a "My Citadel Config" room, don't bother. */ - if ( (CC->quickroom.QRflags && QR_MAILBOX) - && (!strcasecmp(&CC->quickroom.QRname[11], USERCONFIGROOM)) ) { + if ( (CC->room.QRflags && QR_MAILBOX) + && (!strcasecmp(&CC->room.QRname[11], USERCONFIGROOM)) ) { /* Yes, we want to do this */ } else { @@ -278,12 +286,12 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { * delete the old one. First, figure out which user * is being re-registered... */ - what_user = atol(CC->quickroom.QRname); + what_user = atol(CC->room.QRname); - if (what_user == CC->usersupp.usernum) { + if (what_user == CC->user.usernum) { /* It's the logged in user. That was easy. */ - memcpy(&usbuf, &CC->usersupp, - sizeof(struct usersupp) ); + memcpy(&usbuf, &CC->user, + sizeof(struct ctdluser) ); } else if (getuserbynumber(&usbuf, what_user) == 0) { @@ -300,7 +308,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { * want to make sure there is absolutely only one * vCard in the user's config room at all times. */ - CtdlDeleteMessages(CC->quickroom.QRname, + CtdlDeleteMessages(CC->room.QRname, 0L, "text/x-vcard"); /* Set the Extended-ID to a standardized one so the @@ -379,6 +387,16 @@ int vcard_upload_aftersave(struct CtdlMessage *msg) { vcard_populate_cs_inet_email(v); vcard_free(v); + /* Some sites want an Aide to be notified when a + * user registers or re-registers... + */ + set_mm_valid(); + + /* ...which also means we need to flag the user */ + lgetuser(&CC->user, CC->curr_user); + CC->user.flags |= (US_REGIS|US_NEEDVALID); + lputuser(&CC->user); + return(0); } @@ -403,25 +421,25 @@ void vcard_gu_backend(long msgnum, void *userdata) { * If this user has a vcard on disk, read it into memory, otherwise allocate * and return an empty vCard. */ -struct vCard *vcard_get_user(struct usersupp *u) { +struct vCard *vcard_get_user(struct ctdluser *u) { char hold_rm[ROOMNAMELEN]; char config_rm[ROOMNAMELEN]; struct CtdlMessage *msg; struct vCard *v; - strcpy(hold_rm, CC->quickroom.QRname); /* save current room */ + strcpy(hold_rm, CC->room.QRname); /* save current room */ MailboxName(config_rm, sizeof config_rm, u, USERCONFIGROOM); - if (getroom(&CC->quickroom, config_rm) != 0) { - getroom(&CC->quickroom, hold_rm); + if (getroom(&CC->room, config_rm) != 0) { + getroom(&CC->room, hold_rm); return vcard_new(); } /* We want the last (and probably only) vcard in this room */ VC->msgnum = (-1); - CtdlForEachMessage(MSGS_LAST, 1, (-127), "text/x-vcard", + CtdlForEachMessage(MSGS_LAST, 1, "text/x-vcard", NULL, vcard_gu_backend, NULL); - getroom(&CC->quickroom, hold_rm); /* return to saved room */ + getroom(&CC->room, hold_rm); /* return to saved room */ if (VC->msgnum < 0L) return vcard_new(); @@ -440,7 +458,7 @@ struct vCard *vcard_get_user(struct usersupp *u) { /* * Write our config to disk */ -void vcard_write_user(struct usersupp *u, struct vCard *v) { +void vcard_write_user(struct ctdluser *u, struct vCard *v) { char temp[PATH_MAX]; FILE *fp; char *ser; @@ -499,7 +517,7 @@ void cmd_regi(char *argbuf) { return; } - my_vcard = vcard_get_user(&CC->usersupp); + my_vcard = vcard_get_user(&CC->user); strcpy(tmpaddr, ""); strcpy(tmpcity, ""); strcpy(tmpstate, ""); @@ -531,29 +549,17 @@ void cmd_regi(char *argbuf) { snprintf(tmpaddress, sizeof tmpaddress, ";;%s;%s;%s;%s;%s", tmpaddr, tmpcity, tmpstate, tmpzip, tmpcountry); vcard_set_prop(my_vcard, "adr", tmpaddress, 0); - vcard_write_user(&CC->usersupp, my_vcard); + vcard_write_user(&CC->user, my_vcard); vcard_free(my_vcard); - - lgetuser(&CC->usersupp, CC->curr_user); - CC->usersupp.flags=(CC->usersupp.flags|US_REGIS|US_NEEDVALID); - lputuser(&CC->usersupp); - - /* set global flag calling for validation */ - begin_critical_section(S_CONTROL); - get_control(); - CitControl.MMflags = CitControl.MMflags | MM_VALID ; - put_control(); - end_critical_section(S_CONTROL); } - /* * Protocol command to fetch registration info for a user */ void cmd_greg(char *argbuf) { - struct usersupp usbuf; + struct ctdluser usbuf; struct vCard *v; char *s; char who[SIZ]; @@ -569,7 +575,7 @@ void cmd_greg(char *argbuf) if (!strcasecmp(who,"_SELF_")) strcpy(who,CC->curr_user); - if ((CC->usersupp.axlevel < 6) && (strcasecmp(who,CC->curr_user))) { + if ((CC->user.axlevel < 6) && (strcasecmp(who,CC->curr_user))) { cprintf("%d Higher access required.\n", ERROR+HIGHER_ACCESS_REQUIRED); return; @@ -643,7 +649,8 @@ void vcard_purge(char *username, long usernum) { msg->cm_fields['N'] = strdoop(NODENAME); msg->cm_fields['M'] = strdoop("Purge this vCard\n"); - snprintf(buf, sizeof buf, VCARD_EXT_FORMAT, msg->cm_fields['A'], NODENAME); + snprintf(buf, sizeof buf, VCARD_EXT_FORMAT, + msg->cm_fields['A'], NODENAME); msg->cm_fields['E'] = strdoop(buf); msg->cm_fields['S'] = strdoop("CANCEL"); @@ -718,7 +725,8 @@ void vcard_delete_remove(char *room, long msgnum) { if (!strncasecmp(ptr, "Content-type: text/x-vcard", 26)) { /* Bingo! A vCard is being deleted. */ - vcard_extract_internet_addresses(msg, CtdlDirectoryDelUser); + vcard_extract_internet_addresses(msg, + CtdlDirectoryDelUser); } ptr = strchr((char *)ptr, '\n'); if (ptr != NULL) ++ptr; @@ -746,7 +754,7 @@ void cmd_qdir(char *argbuf) { return; } - cprintf("%d %s\n", OK, citadel_addr); + cprintf("%d %s\n", CIT_OK, citadel_addr); } @@ -766,30 +774,19 @@ void vcard_session_startup_hook(void) { void vcard_session_login_hook(void) { struct vCard *v; - v = vcard_get_user(&CC->usersupp); + v = vcard_get_user(&CC->user); vcard_populate_cs_inet_email(v); vcard_free(v); } -/* - * When a user logs out... - */ -void vcard_session_logout_hook(void) { - if (CC->cs_inet_email != NULL) { - phree(CC->cs_inet_email); - CC->cs_inet_email = NULL; - } -} - -char *Dynamic_Module_Init(void) +char *serv_vcard_init(void) { SYM_VCARD = CtdlGetDynamicSymbol(); CtdlRegisterSessionHook(vcard_session_startup_hook, EVT_START); CtdlRegisterSessionHook(vcard_session_login_hook, EVT_LOGIN); - CtdlRegisterSessionHook(vcard_session_logout_hook, EVT_LOGOUT); CtdlRegisterMessageHook(vcard_upload_beforesave, EVT_BEFORESAVE); CtdlRegisterMessageHook(vcard_upload_aftersave, EVT_AFTERSAVE); CtdlRegisterDeleteHook(vcard_delete_remove); @@ -800,6 +797,6 @@ char *Dynamic_Module_Init(void) CtdlRegisterProtoHook(cmd_qdir, "QDIR", "Query Directory"); CtdlRegisterUserHook(vcard_purge, EVT_PURGEUSER); CtdlRegisterNetprocHook(vcard_extract_from_network); - create_room(ADDRESS_BOOK_ROOM, 3, "", 0, 1); + create_room(ADDRESS_BOOK_ROOM, 3, "", 0, 1, 0); return "$Id$"; }