* A server-side module for Citadel which supports address book information
* using the standard vCard format.
*
- * Copyright (c) 1999-2017 by the citadel.org team
+ * Copyright (c) 1999-2018 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
if (CM_IsEmpty(msg, eAuthor)) return;
if (CM_IsEmpty(msg, eNodeName)) return;
- snprintf(citadel_address, sizeof citadel_address, "%s @ %s",
- msg->cm_fields[eAuthor], msg->cm_fields[eNodeName]);
+ snprintf(citadel_address, sizeof citadel_address, "%s @ %s", msg->cm_fields[eAuthor], msg->cm_fields[eNodeName]);
v = vcard_load(msg->cm_fields[eMesageText]);
if (v == NULL) return;
void extract_inet_email_addrs(char *emailaddrbuf, size_t emailaddrbuf_len,
char *secemailaddrbuf, size_t secemailaddrbuf_len,
struct vCard *v,
- int local_addrs_only)
-{
+ int local_addrs_only
+) {
struct CitContext *CCC = CC; /* put this on the stack, just for speed */
char *s, *k, *addr;
int instance = 0;
striplt(addr);
if (!IsEmptyStr(addr)) {
IsDirectoryAddress = IsDirectory(addr, 1);
+
+ syslog(LOG_DEBUG, "EVQ: addr=<%s> IsDirectoryAddress=<%d> local_addrs_only=<%d>", addr, IsDirectoryAddress, local_addrs_only);
+
if ( IsDirectoryAddress || !local_addrs_only)
{
++saved_instance;
if ( (!strcasecmp(cbtype, "text/x-vcard"))
|| (!strcasecmp(cbtype, "text/vcard")) ) {
- syslog(LOG_DEBUG, "Part %s contains a vCard! Loading...", partnum);
+ syslog(LOG_DEBUG, "vcard: part %s contains a vCard! Loading...", partnum);
if (*v != NULL) {
vcard_free(*v);
}
}
-
/*
* This handler detects whether the user is attempting to save a new
* vCard as part of his/her personal configuration, and handles the replace
if (!strcasecmp(who,"_SELF_")) strcpy(who,CCC->curr_user);
if ((CCC->user.axlevel < AxAideU) && (strcasecmp(who,CCC->curr_user))) {
- cprintf("%d Higher access required.\n",
- ERROR + HIGHER_ACCESS_REQUIRED);
+ cprintf("%d Higher access required.\n", ERROR + HIGHER_ACCESS_REQUIRED);
return;
}
cprintf("%ld\n", usbuf.usernum);
cprintf("%s\n", usbuf.password);
s = vcard_get_prop(v, "n", 1, 0, 0);
- cprintf("%s\n", s ? s : " "); /* name */
-
+ cprintf("%s\n", s ? s : " "); /* name */
s = vcard_get_prop(v, "adr", 1, 0, 0);
- snprintf(adr, sizeof adr, "%s", s ? s : " ");/* address... */
-
+ snprintf(adr, sizeof adr, "%s", s ? s : " "); /* address */
extract_token(buf, adr, 2, ';', sizeof buf);
cprintf("%s\n", buf); /* street */
extract_token(buf, adr, 3, ';', sizeof buf);
need_default_vcard =1;
vcard_fn_to_n(vname, usbuf->fullname, sizeof vname);
- syslog(LOG_DEBUG, "Converted <%s> to <%s>", usbuf->fullname, vname);
+ syslog(LOG_DEBUG, "vcard: converted <%s> to <%s>", usbuf->fullname, vname);
/* Create and save the vCard */
v = vcard_new();
if (getpwuid_r(usbuf->uid, &pwd, pwd_buffer, sizeof pwd_buffer) != NULL) {
#else // SOLARIS_GETPWUID
struct passwd *result = NULL;
- syslog(LOG_DEBUG, "Searching for uid %d", usbuf->uid);
+ syslog(LOG_DEBUG, "vcard: searching for uid %d", usbuf->uid);
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, CtdlGetConfigStr("c_fqdn"));
* into the user's vCard.
*/
if ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP) || (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD)) {
- //uid_t ldap_uid;
- int found_user;
- char ldap_cn[512];
- char ldap_dn[512];
- found_user = CtdlTryUserLDAP(usbuf->fullname, ldap_dn, sizeof ldap_dn, ldap_cn, sizeof ldap_cn, &usbuf->uid,1);
- if (found_user == 0) {
- if (Ctdl_LDAP_to_vCard(ldap_dn, v)) {
- /* Allow global address book and internet directory update without login long enough to write this. */
- CC->vcard_updated_by_ldap++; /* Otherwise we'll only update the user config. */
- need_default_vcard = 0;
- syslog(LOG_DEBUG, "LDAP Created Initial Vcard for %s\n",usbuf->fullname);
+ //uid_t ldap_uid;
+ int found_user;
+ char ldap_cn[512];
+ char ldap_dn[512];
+
+syslog(LOG_DEBUG, "\033[31m FIXME BORK BORK BORK try lookup by uid , or maybe dn?\033[0m");
+
+ found_user = CtdlTryUserLDAP(usbuf->fullname, ldap_dn, sizeof ldap_dn, ldap_cn, sizeof ldap_cn, &usbuf->uid);
+ if (found_user == 0) {
+ if (Ctdl_LDAP_to_vCard(ldap_dn, v)) {
+ /* Allow global address book and internet directory update without login long enough to write this. */
+ CC->vcard_updated_by_ldap++; /* Otherwise we'll only update the user config. */
+ need_default_vcard = 0;
+ syslog(LOG_DEBUG, "vcard: LDAP Created Initial vCard for %s\n",usbuf->fullname);
+ }
}
- }
}
#endif
if (need_default_vcard!=0) {
- /* 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);
- }
-
+ /* 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);
}
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);
+ 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);
}
}
-
/*
* Get Valid Screen Names
*/
cprintf("%d %s\n", CIT_OK, citadel_addr);
}
+
/*
* Query Directory, in fact an alias to match postfix tcp auth.
*/
time(&CC->lastcmd);
memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
if (client_getln(cmdbuf, sizeof cmdbuf) < 1) {
- syslog(LOG_CRIT, "vcard client disconnected: ending session.");
+ syslog(LOG_ERR, "vcard: client disconnected: ending session.");
CC->kill_me = KILLME_CLIENT_DISCONNECTED;
return;
}
extract_token(internet_addr, argbuf, 0, '|', sizeof internet_addr);
rcpt = validate_recipients(internet_addr, NULL, CHECK_EXISTANCE);
- if ((rcpt != NULL)&&
+ if ( (rcpt != NULL) &&
(
- (*rcpt->recp_local != '\0')||
- (*rcpt->recp_room != '\0')||
- (*rcpt->recp_ignet != '\0')))
- {
-
+ (*rcpt->recp_local != '\0') ||
+ (*rcpt->recp_room != '\0')
+ )
+ ) {
cprintf("200 OK %s\n", internet_addr);
- syslog(LOG_INFO, "sending 200 OK for the room %s", rcpt->display_recp);
+ syslog(LOG_INFO, "vcard: sending 200 OK for the room %s", rcpt->display_recp);
}
else
{
cprintf("500 REJECT noone here by that name.\n");
- syslog(LOG_INFO, "sending 500 REJECT no one here by that name: %s", internet_addr);
+ syslog(LOG_INFO, "vcard: sending 500 REJECT no one here by that name: %s", internet_addr);
}
if (rcpt != NULL)
free_recipients(rcpt);
}
else {
cprintf("500 REJECT invalid Query.\n");
- syslog(LOG_INFO, "sending 500 REJECT invalid query: %s", internet_addr);
+ syslog(LOG_INFO, "vcard: sending 500 REJECT invalid query: %s", internet_addr);
}
}
+
void check_get_greeting(void) {
-/* dummy function, we have no greeting in this verry simple protocol. */
+/* dummy function, we have no greeting in this very simple protocol. */
}
/* Set expiration policy to manual; otherwise objects will be lost! */
if (CtdlGetRoomLock(&qr, USERCONTACTSROOM)) {
- syslog(LOG_ERR, "Couldn't get the user CONTACTS room!");
+ syslog(LOG_ERR, "vcard: couldn't get the user CONTACTS room!");
return;
}
qr.QRep.expire_mode = EXPIRE_MANUAL;
if (v) {
if (Ctdl_LDAP_to_vCard(CCC->ldap_dn, v)) {
CCC->vcard_updated_by_ldap++; /* Make sure changes make it to the global address book and internet directory, not just the user config. */
- syslog(LOG_DEBUG, "LDAP Detected vcard change.\n");
+ syslog(LOG_DEBUG, "vcard: LDAP Detected vcard change");
vcard_write_user(&CCC->user, v);
}
}
}
-
/*
* This is called by store_harvested_addresses() to remove from the
* list any addresses we already have in our address book.
}
vcard_free(v);
- syslog(LOG_DEBUG, "Adding contact: %s", recipient);
+ syslog(LOG_DEBUG, "vcard: adding contact: %s", recipient);
CtdlSubmitMsg(vmsg, NULL, aptr->roomname, QP_EADDR);
CM_Free(vmsg);
}
CtdlRegisterSessionHook(vcard_session_login_hook, EVT_LOGIN, PRIO_LOGIN + 70);
CtdlRegisterMessageHook(vcard_upload_beforesave, EVT_BEFORESAVE);
CtdlRegisterMessageHook(vcard_upload_aftersave, EVT_AFTERSAVE);
- CtdlRegisterDeleteHook(vcard_delete_remove);
CtdlRegisterProtoHook(cmd_regi, "REGI", "Enter registration info");
CtdlRegisterProtoHook(cmd_greg, "GREG", "Get registration info");
CtdlRegisterProtoHook(cmd_qdir, "QDIR", "Query Directory");
CtdlRegisterProtoHook(cmd_gvea, "GVEA", "Get Valid Email Addresses");
CtdlRegisterProtoHook(cmd_dvca, "DVCA", "Dump VCard Addresses");
CtdlRegisterUserHook(vcard_newuser, EVT_NEWUSER);
- CtdlRegisterUserHook(vcard_purge, EVT_PURGEUSER);
- CtdlRegisterNetprocHook(vcard_extract_from_network);
+ CtdlRegisterUserHook(vcard_purge, EVT_PURGEUSER); // FIXME stop doing this
+ CtdlRegisterDeleteHook(vcard_delete_remove); // FIXME this is obsolete, right?
+ CtdlRegisterNetprocHook(vcard_extract_from_network); // FIXME this is obsolete, right?
CtdlRegisterSessionHook(store_harvested_addresses, EVT_TIMER, PRIO_CLEANUP + 470);
CtdlRegisterFixedOutputHook("text/x-vcard", vcard_fixed_output);
CtdlRegisterFixedOutputHook("text/vcard", vcard_fixed_output);
/* Set expiration policy to manual; otherwise objects will be lost! */
if (!CtdlGetRoomLock(&qr, ADDRESS_BOOK_ROOM)) {
qr.QRep.expire_mode = EXPIRE_MANUAL;
- qr.QRdefaultview = VIEW_ADDRESSBOOK; /* 2 = address book view */
+ qr.QRdefaultview = VIEW_ADDRESSBOOK; // 2 = address book view
CtdlPutRoomLock(&qr);
-
- /*
- * Also make sure it has a netconfig file, so the networker runs
- * on this room even if we don't share it with any other nodes.
- * This allows the CANCEL messages (i.e. "Purge this vCard") to be
- * purged.
- *
- * FIXME this no longer works
- *
- */
- //assoc_file_name(filename, sizeof filename, &qr, ctdl_netcfg_dir);
- //fp = fopen(filename, "a");
- //if (fp != NULL) {
- //fclose(fp);
- //rv = chown(filename, CTDLUID, (-1));
- //if (rv == -1) {
- //syslog(LOG_ERR, "Failed to adjust ownership of %s: %s", filename, strerror(errno));
- //}
- //rv = chmod(filename, 0600);
- //if (rv == -1) {
- //syslog(LOG_ERR, "Failed to adjust ownership of %s: %s", filename, strerror(errno));
- //}
- //}
- //else {
- //syslog(LOG_ERR, "Cannot create %s: %s", filename, strerror(errno));
- //}
}
/* for postfix tcpdict */
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_pftcpdict_port"), /* Postfix */
+ CtdlRegisterServiceHook(CtdlGetConfigInt("c_pftcpdict_port"), // Postfix
NULL,
check_get_greeting,
check_get,
NULL,
- CitadelServiceDICT_TCP);
+ CitadelServiceDICT_TCP
+ );
}
-
+
/* return our module name for the log */
return "vcard";
}