X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fvcard%2Fserv_vcard.c;h=8561d43cec9ae7747a7208ceb6c05ed40c120e5a;hb=1083c2a818cda51f81c908a801bd5f922f99149e;hp=fc610c79cd20404d96cc28e1e7f6fcc37e72b969;hpb=3faf301cf0711139536f237f6cf69a22a71ee370;p=citadel.git diff --git a/citadel/modules/vcard/serv_vcard.c b/citadel/modules/vcard/serv_vcard.c index fc610c79c..8561d43ce 100644 --- a/citadel/modules/vcard/serv_vcard.c +++ b/citadel/modules/vcard/serv_vcard.c @@ -310,7 +310,7 @@ void ctdl_vcard_to_directory(struct CtdlMessage *msg, int op) { (void) CtdlDoDirectoryServiceFunc(ldap_dn, NULL, &objectlist, "ldap", DIRECTORY_SAVE_OBJECT); (void) CtdlDoDirectoryServiceFunc(NULL, NULL, &objectlist, "ldap", DIRECTORY_FREE_OBJECT); - lprintf(CTDL_DEBUG, "Directory Services write operation complete.\n"); + CtdlLogPrintf(CTDL_DEBUG, "Directory Services write operation complete.\n"); } @@ -327,18 +327,18 @@ void vcard_directory_add_user(char *internet_addr, char *citadel_addr) { * probably just the networker or something. */ if (CC->logged_in) { - lprintf(CTDL_DEBUG, "Checking for <%s>...\n", internet_addr); + CtdlLogPrintf(CTDL_DEBUG, "Checking for <%s>...\n", internet_addr); if (CtdlDirectoryLookup(buf, internet_addr, sizeof buf) == 0) { if (strcasecmp(buf, citadel_addr)) { /* This address belongs to someone else. * Bail out silently without saving. */ - lprintf(CTDL_DEBUG, "DOOP!\n"); + CtdlLogPrintf(CTDL_DEBUG, "DOOP!\n"); return; } } } - lprintf(CTDL_INFO, "Adding %s (%s) to directory\n", + CtdlLogPrintf(CTDL_INFO, "Adding %s (%s) to directory\n", citadel_addr, internet_addr); CtdlDirectoryAddUser(internet_addr, citadel_addr); } @@ -458,14 +458,14 @@ void extract_friendly_name(char *namebuf, size_t namebuf_len, struct vCard *v) */ void vcard_extract_vcard(char *name, char *filename, char *partnum, char *disp, void *content, char *cbtype, char *cbcharset, size_t length, - char *encoding, void *cbuserdata) + char *encoding, char *cbid, void *cbuserdata) { struct vCard **v = (struct vCard **) cbuserdata; if ( (!strcasecmp(cbtype, "text/x-vcard")) || (!strcasecmp(cbtype, "text/vcard")) ) { - lprintf(CTDL_DEBUG, "Part %s contains a vCard! Loading...\n", partnum); + CtdlLogPrintf(CTDL_DEBUG, "Part %s contains a vCard! Loading...\n", partnum); if (*v != NULL) { vcard_free(*v); } @@ -543,7 +543,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { } s = vcard_get_prop(v, "FN", 0, 0, 0); - if (s) lprintf(CTDL_DEBUG, "vCard beforesave hook running for <%s>\n", s); + if (s) CtdlLogPrintf(CTDL_DEBUG, "vCard beforesave hook running for <%s>\n", s); if (yes_my_citadel_config) { /* Bingo! The user is uploading a new vCard, so @@ -610,7 +610,11 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) { /* * Set the EUID of the message to the UID of the vCard. */ - if (msg->cm_fields['E'] != NULL) free(msg->cm_fields['E']); + if (msg->cm_fields['E'] != NULL) + { + free(msg->cm_fields['E']); + msg->cm_fields['E'] = NULL; + } s = vcard_get_prop(v, "UID", 0, 0, 0); if (s != NULL) { msg->cm_fields['E'] = strdup(s); @@ -710,8 +714,13 @@ int vcard_upload_aftersave(struct CtdlMessage *msg) { vcard_add_to_directory(I, NULL); /* Some sites want an Aide to be notified when a - * user registers or re-registers... + * user registers or re-registers + * But if the user was an Aide or was edited by an Aide then we can + * Assume they don't need validating. */ + if (CC->user.axlevel >= 6) + return (0); + set_mm_valid(); /* ...which also means we need to flag the user */ @@ -785,22 +794,13 @@ struct vCard *vcard_get_user(struct ctdluser *u) { * Write our config to disk */ void vcard_write_user(struct ctdluser *u, struct vCard *v) { - char temp[PATH_MAX]; - FILE *fp; char *ser; - CtdlMakeTempFileName(temp, sizeof temp); ser = vcard_serialize(v); - - fp = fopen(temp, "w"); - if (fp == NULL) return; if (ser == NULL) { - fprintf(fp, "begin:vcard\r\nend:vcard\r\n"); - } else { - fwrite(ser, strlen(ser), 1, fp); - free(ser); + ser = strdup("begin:vcard\r\nend:vcard\r\n"); } - fclose(fp); + if (!ser) return; /* This handy API function does all the work for us. * NOTE: normally we would want to set that last argument to 1, to @@ -808,15 +808,16 @@ void vcard_write_user(struct ctdluser *u, struct vCard *v) { * have to, because the vcard_upload_beforesave() hook above * is going to notice what we're trying to do, and delete the old vCard. */ - CtdlWriteObject(USERCONFIGROOM, /* which room */ - VCARD_MIME_TYPE,/* MIME type */ - temp, /* temp file */ - u, /* which user */ - 0, /* not binary */ - 0, /* don't delete others of this type */ - 0); /* no flags */ - - unlink(temp); + CtdlWriteObject(USERCONFIGROOM, /* which room */ + VCARD_MIME_TYPE, /* MIME type */ + ser, /* data */ + strlen(ser)+1, /* length */ + u, /* which user */ + 0, /* not binary */ + 0, /* don't delete others of this type */ + 0); /* no flags */ + + free(ser); } @@ -974,19 +975,41 @@ void vcard_newuser(struct ctdluser *usbuf) { struct vCard *v; vcard_fn_to_n(vname, usbuf->fullname, sizeof vname); - lprintf(CTDL_DEBUG, "Converted <%s> to <%s>\n", usbuf->fullname, vname); + CtdlLogPrintf(CTDL_DEBUG, "Converted <%s> to <%s>\n", usbuf->fullname, vname); /* Create and save the vCard */ v = vcard_new(); if (v == NULL) return; - sprintf(buf, "%s@%s", usbuf->fullname, config.c_fqdn); - for (i=0; buf[i]; ++i) { - if (buf[i] == ' ') buf[i] = '_'; - } vcard_add_prop(v, "fn", usbuf->fullname); vcard_add_prop(v, "n", vname); vcard_add_prop(v, "adr", "adr:;;_;_;_;00000;__"); + +#ifdef HAVE_GETPWUID_R + /* If using host auth mode, we add an email address based on the login */ + if (config.c_auth_mode == AUTHMODE_HOST) { + struct passwd pwd; + char pwd_buffer[SIZ]; + +#ifdef SOLARIS_GETPWUID + if (getpwuid_r(usbuf->uid, &pwd, pwd_buffer, sizeof pwd_buffer) != NULL) { +#else // SOLARIS_GETPWUID + struct passwd **result = NULL; + if (getpwuid_r(usbuf->uid, &pwd, pwd_buffer, sizeof pwd_buffer, result) == 0) { +#endif // HAVE_GETPWUID_R + snprintf(buf, sizeof buf, "%s@%s", pwd.pw_name, config.c_fqdn); + vcard_add_prop(v, "email;internet", buf); + } + } +#endif + + /* Everyone gets an email address based on their display name */ + snprintf(buf, sizeof buf, "%s@%s", usbuf->fullname, config.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); } @@ -1019,7 +1042,7 @@ void vcard_purge(struct ctdluser *usbuf) { msg->cm_fields['S'] = strdup("CANCEL"); - CtdlSubmitMsg(msg, NULL, ADDRESS_BOOK_ROOM); + CtdlSubmitMsg(msg, NULL, ADDRESS_BOOK_ROOM, QP_EADDR); CtdlFreeMessage(msg); } @@ -1153,7 +1176,7 @@ void cmd_gvea(char *argbuf) */ void dvca_mime_callback(char *name, char *filename, char *partnum, char *disp, void *content, char *cbtype, char *cbcharset, size_t length, char *encoding, - void *cbuserdata) { + char *cbid, void *cbuserdata) { struct vCard *v; char displayname[256]; @@ -1258,11 +1281,11 @@ void check_get(void) { time(&CC->lastcmd); memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */ if (client_getln(cmdbuf, sizeof cmdbuf) < 1) { - lprintf(CTDL_CRIT, "Client disconnected: ending session.\n"); + CtdlLogPrintf(CTDL_CRIT, "Client disconnected: ending session.\n"); CC->kill_me = 1; return; } - lprintf(CTDL_INFO, ": %s\n", cmdbuf); + CtdlLogPrintf(CTDL_INFO, ": %s\n", cmdbuf); while (strlen(cmdbuf) < 3) strcat(cmdbuf, " "); if (strcasecmp(cmdbuf, "GET ")); @@ -1271,7 +1294,7 @@ void check_get(void) { char *argbuf = &cmdbuf[4]; extract_token(internet_addr, argbuf, 0, '|', sizeof internet_addr); - rcpt = validate_recipients(internet_addr, CHECK_EXISTANCE); + rcpt = validate_recipients(internet_addr, NULL, CHECK_EXISTANCE); if ((rcpt != NULL)&& ( (*rcpt->recp_local != '\0')|| @@ -1280,13 +1303,13 @@ void check_get(void) { { cprintf("200 OK %s\n", internet_addr); - lprintf(CTDL_INFO, "sending 200 OK for the room %s\n", rcpt->display_recp); + CtdlLogPrintf(CTDL_INFO, "sending 200 OK for the room %s\n", rcpt->display_recp); } else { cprintf("500 REJECT noone here by that name.\n"); - lprintf(CTDL_INFO, "sending 500 REJECT noone here by that name: %s\n", internet_addr); + CtdlLogPrintf(CTDL_INFO, "sending 500 REJECT noone here by that name: %s\n", internet_addr); } if (rcpt != NULL) free_recipients(rcpt); } @@ -1310,7 +1333,7 @@ void vcard_create_room(void) /* Set expiration policy to manual; otherwise objects will be lost! */ if (lgetroom(&qr, USERCONTACTSROOM)) { - lprintf(CTDL_ERR, "Couldn't get the user CONTACTS room!\n"); + CtdlLogPrintf(CTDL_ERR, "Couldn't get the user CONTACTS room!\n"); return; } qr.QRep.expire_mode = EXPIRE_MANUAL; @@ -1459,8 +1482,8 @@ void store_this_ha(struct addresses_to_be_filed *aptr) { } vcard_free(v); - lprintf(CTDL_DEBUG, "Adding contact: %s\n", recipient); - vmsgnum = CtdlSubmitMsg(vmsg, NULL, aptr->roomname); + CtdlLogPrintf(CTDL_DEBUG, "Adding contact: %s\n", recipient); + vmsgnum = CtdlSubmitMsg(vmsg, NULL, aptr->roomname, QP_EADDR); CtdlFreeMessage(vmsg); } }