* Extract Internet e-mail addresses from a message containing a vCard, and
* perform a callback for any found.
*/
-void vcard_extract_internet_addresses(struct CtdlMessage *msg, void (*callback)(char *, char *) ) {
+void vcard_extract_internet_addresses(struct CtdlMessage *msg, int (*callback)(char *, char *) ) {
struct vCard *v;
char *s;
char *k;
vcard_free(v);
}
-
-
+///TODO: gettext!
+#define _(a) a
/*
* Callback for vcard_add_to_directory()
* (Lotsa ugly nested callbacks. Oh well.)
*/
-void vcard_directory_add_user(char *internet_addr, char *citadel_addr) {
+int vcard_directory_add_user(char *internet_addr, char *citadel_addr) {
+ struct CitContext *CCC = CC;
char buf[SIZ];
/* We have to validate that we're not stepping on someone else's
* email address ... but only if we're logged in. Otherwise it's
* probably just the networker or something.
*/
- if (CC->logged_in) {
+ if (CCC->logged_in) {
syslog(LOG_DEBUG, "Checking for <%s>...\n", internet_addr);
if (CtdlDirectoryLookup(buf, internet_addr, sizeof buf) == 0) {
if (strcasecmp(buf, citadel_addr)) {
* Bail out silently without saving.
*/
syslog(LOG_DEBUG, "DOOP!\n");
- return;
+
+ StrBufAppendPrintf(CCC->StatusMessage, "\n%d|", ERROR+ALREADY_EXISTS);
+ StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress again."), -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("\n"), 0);
+ return 0;
}
}
}
syslog(LOG_INFO, "Adding %s (%s) to directory\n", citadel_addr, internet_addr);
- CtdlDirectoryAddUser(internet_addr, citadel_addr);
+ if (CtdlDirectoryAddUser(internet_addr, citadel_addr))
+ {
+ StrBufAppendPrintf(CCC->StatusMessage, "\n%d|", CIT_OK);
+ StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, _("successfully addded emailaddress."), -1, 0);
+ return 1;
+ }
+ else
+ {
+ StrBufAppendPrintf(CCC->StatusMessage, "\n%d|", ERROR+ ILLEGAL_VALUE);
+ StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress; its not matching our domain."), -1, 0);
+ return 0;
+ }
}
CtdlDirectoryInit();
/* We want *all* vCards in this room */
+ NewStrBufDupAppendFlush(&CC->StatusMessage, NULL, NULL, 0);
CtdlForEachMessage(MSGS_ALL, 0, NULL, "[Tt][Ee][Xx][Tt]/.*[Vv][Cc][Aa][Rr][Dd]$",
NULL, vcard_add_to_directory, NULL);
* Internet messages. If there is, stick it in the buffer.
*/
void extract_inet_email_addrs(char *emailaddrbuf, size_t emailaddrbuf_len,
- char *secemailaddrbuf, size_t secemailaddrbuf_len,
- struct vCard *v, int local_addrs_only) {
+ char *secemailaddrbuf, size_t secemailaddrbuf_len,
+ struct vCard *v,
+ int local_addrs_only)
+{
+ struct CitContext *CCC = CC; /* put this on the stack, just for speed */
char *s, *k, *addr;
int instance = 0;
+ int IsDirectoryAddress;
int saved_instance = 0;
/* Go through the vCard searching for *all* Internet email addresses
addr = strdup(s);
striplt(addr);
if (!IsEmptyStr(addr)) {
- if ( (IsDirectory(addr, 1)) ||
- (!local_addrs_only) ) {
+ IsDirectoryAddress = IsDirectory(addr, 1);
+ if ( IsDirectoryAddress || !local_addrs_only)
+ {
++saved_instance;
if ((saved_instance == 1) && (emailaddrbuf != NULL)) {
safestrncpy(emailaddrbuf, addr, emailaddrbuf_len);
}
}
}
+ if (!IsDirectoryAddress && local_addrs_only)
+ {
+ StrBufAppendPrintf(CCC->StatusMessage, "\n%d|", ERROR+ ILLEGAL_VALUE);
+ StrBufAppendBufPlain(CCC->StatusMessage, addr, -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress; its not matching our domain."), -1, 0);
+ }
}
free(addr);
}
}
s = vcard_get_prop(v, "fn", 1, 0, 0);
- if (s) syslog(LOG_DEBUG, "vCard beforesave hook running for <%s>\n", s);
if (yes_my_citadel_config) {
/* Bingo! The user is uploading a new vCard, so
ptr = msg->cm_fields['M'];
if (ptr == NULL) return(0);
+
+ NewStrBufDupAppendFlush(&CC->StatusMessage, NULL, NULL, 0);
+
+ StrBufPrintf(CC->StatusMessage, "%d\n", LISTING_FOLLOWS);
+
while (ptr != NULL) {
linelen = strcspn(ptr, "\n");
* copy it to the Global Address Book room.
*/
- I = atol(msg->cm_fields['I']);
- if (I < 0L) return(0);
+ I = atol(msg->cm_fields['3']);
+ if (I <= 0L) return(0);
/* Store our Internet return address in memory */
if (is_MY_UserConf) {
*/
void store_this_ha(struct addresses_to_be_filed *aptr) {
struct CtdlMessage *vmsg = NULL;
- long vmsgnum = (-1L);
char *ser = NULL;
struct vCard *v = NULL;
char recipient[256];
vcard_free(v);
syslog(LOG_DEBUG, "Adding contact: %s\n", recipient);
- vmsgnum = CtdlSubmitMsg(vmsg, NULL, aptr->roomname, QP_EADDR);
+ CtdlSubmitMsg(vmsg, NULL, aptr->roomname, QP_EADDR);
CtdlFreeMessage(vmsg);
}
}
fp = fopen(filename, "a");
if (fp != NULL) fclose(fp);
rv = chown(filename, CTDLUID, (-1));
+ if (rv == -1)
+ syslog(LOG_EMERG, "Failed to adjust ownership of: %s [%s]\n",
+ filename, strerror(errno));
}
/* for postfix tcpdict */