* Copyright (c) 1999-2002 / released under the GNU General Public License
*/
-/*
- * Where we keep messages containing the vCards that source our directory. It
- * makes no sense to change this, because you'd have to change it on every
- * system on the network. That would be stupid.
- */
-#define ADDRESS_BOOK_ROOM "Global Address Book"
-
/*
* Format of the "Exclusive ID" field of the message containing a user's
* vCard. Doesn't matter what it really looks like as long as it's both
#include "vcard.h"
#include "serv_ldap.h"
-struct vcard_internal_info {
- long msgnum;
-};
-
-/* Message number symbol used internally by these functions */
-#define VC ((struct vcard_internal_info *)CtdlGetUserData(SYM_VCARD))
-
-
/*
* set global flag calling for an aide to validate new users
*/
/*
* Callback for vcard_add_to_directory()
* (Lotsa ugly nested callbacks. Oh well.)
- * This little shim function makes sure we're not
*/
void vcard_directory_add_user(char *internet_addr, char *citadel_addr) {
char buf[SIZ];
*/
if (CC->logged_in) {
lprintf(CTDL_DEBUG, "Checking for <%s>...\n", internet_addr);
- if (CtdlDirectoryLookup(buf, internet_addr) == 0) {
+ if (CtdlDirectoryLookup(buf, internet_addr, sizeof buf) == 0) {
if (strcasecmp(buf, citadel_addr)) {
/* This address belongs to someone else.
* Bail out silently without saving.
* vCard in the user's config room at all times.
*/
CtdlDeleteMessages(CC->room.QRname,
- 0L, "text/x-vcard");
+ 0L, "text/x-vcard", 1);
/* Make the author of the message the name of the user.
*/
/*
* Set the EUID of the message to the UID of the vCard.
- * Also set the Subject if there isn't already one.
*/
if (msg->cm_fields['E'] != NULL) free(msg->cm_fields['E']);
s = vcard_get_prop(v, "UID", 0, 0, 0);
}
}
+ /*
+ * Set the Subject to the name in the vCard.
+ */
+ s = vcard_get_prop(v, "FN", 0, 0, 0);
+ if (s == NULL) {
+ s = vcard_get_prop(v, "N", 0, 0, 0);
+ }
+ if (s != NULL) {
+ if (msg->cm_fields['U'] != NULL) {
+ free(msg->cm_fields['U']);
+ }
+ msg->cm_fields['U'] = strdup(s);
+ }
+
/* Re-serialize it back into the msg body */
ser = vcard_serialize(v);
if (ser != NULL) {
/*
* back end function used for callbacks
*/
-void vcard_gu_backend(long msgnum, void *userdata) {
- VC->msgnum = msgnum;
+void vcard_gu_backend(long supplied_msgnum, void *userdata) {
+ long *msgnum;
+
+ msgnum = (long *) userdata;
+ *msgnum = supplied_msgnum;
}
char config_rm[ROOMNAMELEN];
struct CtdlMessage *msg;
struct vCard *v;
+ long VCmsgnum;
strcpy(hold_rm, CC->room.QRname); /* save current room */
MailboxName(config_rm, sizeof config_rm, u, USERCONFIGROOM);
}
/* We want the last (and probably only) vcard in this room */
- VC->msgnum = (-1);
+ VCmsgnum = (-1);
CtdlForEachMessage(MSGS_LAST, 1, "text/x-vcard",
- NULL, vcard_gu_backend, NULL);
+ NULL, vcard_gu_backend, (void *)&VCmsgnum );
getroom(&CC->room, hold_rm); /* return to saved room */
- if (VC->msgnum < 0L) return vcard_new();
+ if (VCmsgnum < 0L) return vcard_new();
- msg = CtdlFetchMessage(VC->msgnum, 1);
+ msg = CtdlFetchMessage(VCmsgnum, 1);
if (msg == NULL) return vcard_new();
v = vcard_load(msg->cm_fields['M']);
struct ctdluser usbuf;
struct vCard *v;
char *s;
- char who[SIZ];
- char adr[SIZ];
- char buf[SIZ];
+ char who[USERNAME_SIZE];
+ char adr[256];
+ char buf[256];
- extract(who, argbuf, 0);
+ extract_token(who, argbuf, 0, '|', sizeof who);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
s = vcard_get_prop(v, "adr", 0, 0, 0);
snprintf(adr, sizeof adr, "%s", s ? s : " ");/* address... */
- extract_token(buf, adr, 2, ';');
+ extract_token(buf, adr, 2, ';', sizeof buf);
cprintf("%s\n", buf); /* street */
- extract_token(buf, adr, 3, ';');
+ extract_token(buf, adr, 3, ';', sizeof buf);
cprintf("%s\n", buf); /* city */
- extract_token(buf, adr, 4, ';');
+ extract_token(buf, adr, 4, ';', sizeof buf);
cprintf("%s\n", buf); /* state */
- extract_token(buf, adr, 5, ';');
+ extract_token(buf, adr, 5, ';', sizeof buf);
cprintf("%s\n", buf); /* zip */
s = vcard_get_prop(v, "tel;home", 0, 0, 0);
s = vcard_get_prop(v, "adr", 0, 0, 0);
snprintf(adr, sizeof adr, "%s", s ? s : " ");/* address... */
- extract_token(buf, adr, 6, ';');
+ extract_token(buf, adr, 6, ';', sizeof buf);
cprintf("%s\n", buf); /* country */
cprintf("000\n");
}
* When a user is being created, create his/her vCard.
*/
void vcard_newuser(struct ctdluser *usbuf) {
- char buf[SIZ];
- char vname[SIZ];
+ char buf[256];
+ char vname[256];
- char lastname[SIZ];
- char firstname[SIZ];
- char middlename[SIZ];
- char honorific_prefixes[SIZ];
- char honorific_suffixes[SIZ];
+ char lastname[256];
+ char firstname[256];
+ char middlename[256];
+ char honorific_prefixes[256];
+ char honorific_suffixes[256];
struct vCard *v;
int i;
* fully expanded vCard name based on the number of
* words in the name
*/
- strcpy(lastname, "");
- strcpy(firstname, "");
- strcpy(middlename, "");
- strcpy(honorific_prefixes, "");
- strcpy(honorific_suffixes, "");
+ safestrncpy(lastname, "", sizeof lastname);
+ safestrncpy(firstname, "", sizeof firstname);
+ safestrncpy(middlename, "", sizeof middlename);
+ safestrncpy(honorific_prefixes, "", sizeof honorific_prefixes);
+ safestrncpy(honorific_suffixes, "", sizeof honorific_suffixes);
- strcpy(buf, usbuf->fullname);
+ safestrncpy(buf, usbuf->fullname, sizeof buf);
/* Honorific suffixes */
if (num_tokens(buf, ',') > 1) {
- extract_token(honorific_suffixes, buf, (num_tokens(buf, ' ') - 1), ',');
+ extract_token(honorific_suffixes, buf, (num_tokens(buf, ' ') - 1), ',',
+ sizeof honorific_suffixes);
remove_token(buf, (num_tokens(buf, ',') - 1), ',');
}
/* Find a last name */
- extract_token(lastname, buf, (num_tokens(buf, ' ') - 1), ' ');
+ extract_token(lastname, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof lastname);
remove_token(buf, (num_tokens(buf, ' ') - 1), ' ');
/* Find honorific prefixes */
if (num_tokens(buf, ' ') > 2) {
- extract_token(honorific_prefixes, buf, 0, ' ');
+ extract_token(honorific_prefixes, buf, 0, ' ', sizeof honorific_prefixes);
remove_token(buf, 0, ' ');
}
/* Find a middle name */
if (num_tokens(buf, ' ') > 1) {
- extract_token(middlename, buf, (num_tokens(buf, ' ') - 1), ' ');
+ extract_token(middlename, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof middlename);
remove_token(buf, (num_tokens(buf, ' ') - 1), ' ');
}
/* Anything left is probably the first name */
- strcpy(firstname, buf);
+ safestrncpy(firstname, buf, sizeof firstname);
striplt(firstname);
/* Compose the structured name */
- sprintf(vname, "%s;%s;%s;%s;%s", lastname, firstname, middlename,
+ snprintf(vname, sizeof vname, "%s;%s;%s;%s;%s", lastname, firstname, middlename,
honorific_prefixes, honorific_suffixes);
lprintf(CTDL_DEBUG, "Converted <%s> to <%s>\n", usbuf->fullname, vname);
* Query Directory
*/
void cmd_qdir(char *argbuf) {
- char citadel_addr[SIZ];
- char internet_addr[SIZ];
+ char citadel_addr[256];
+ char internet_addr[256];
if (CtdlAccessCheck(ac_logged_in)) return;
- extract(internet_addr, argbuf, 0);
+ extract_token(internet_addr, argbuf, 0, '|', sizeof internet_addr);
- if (CtdlDirectoryLookup(citadel_addr, internet_addr) != 0) {
+ if (CtdlDirectoryLookup(citadel_addr, internet_addr, sizeof citadel_addr) != 0) {
cprintf("%d %s was not found.\n",
ERROR + NO_SUCH_USER, internet_addr);
return;
-/*
- * Session startup, allocate some per-session data
- */
-void vcard_session_startup_hook(void) {
- CtdlAllocUserData(SYM_VCARD, sizeof(struct vcard_internal_info));
-}
-
-
/*
* When a user logs in...
*/
{
struct ctdlroom qr;
- CtdlRegisterSessionHook(vcard_session_startup_hook, EVT_START);
CtdlRegisterSessionHook(vcard_session_login_hook, EVT_LOGIN);
CtdlRegisterMessageHook(vcard_upload_beforesave, EVT_BEFORESAVE);
CtdlRegisterMessageHook(vcard_upload_aftersave, EVT_AFTERSAVE);