free(con->ldap_dn);
con->ldap_dn = NULL;
}
-
+ FreeStrBuf(&con->StatusMessage);
FreeStrBuf(&con->MigrateBuf);
FreeStrBuf(&con->RecvBuf.Buf);
if (con->cached_msglist) {
int is_local_socket; /* set to 1 if client is on unix domain sock */
/* Redirect this session's output to a memory buffer? */
StrBuf *redirect_buffer; /* the buffer */
+ StrBuf *StatusMessage;
#ifdef HAVE_OPENSSL
SSL *ssl;
int redirect_ssl;
/*
* Add an Internet e-mail address to the directory for a user
*/
-void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
+int CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
char key[SIZ];
- if (IsDirectory(internet_addr, 0) == 0) return;
+ if (IsDirectory(internet_addr, 0) == 0)
+ return 0;
syslog(LOG_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr);
directory_key(key, internet_addr);
cdb_store(CDB_DIRECTORY, key, strlen(key), citadel_addr, strlen(citadel_addr)+1 );
+ return 1;
}
* (NOTE: we don't actually use or need the citadel_addr variable; it's merely
* here because the callback API expects to be able to send it.)
*/
-void CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) {
+int CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) {
char key[SIZ];
syslog(LOG_DEBUG, "Delete directory entry: %s --> %s\n", internet_addr, citadel_addr);
directory_key(key, internet_addr);
- cdb_delete(CDB_DIRECTORY, key, strlen(key) );
+ return cdb_delete(CDB_DIRECTORY, key, strlen(key) ) == 0;
}
int IsDirectory(char *addr, int allow_masq_domains);
void CtdlDirectoryInit(void);
-void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr);
-void CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr);
+int CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr);
+int CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr);
int CtdlDirectoryLookup(char *target, char *internet_addr, size_t targbuflen);
struct CtdlMessage *convert_internet_message(char *rfc822);
struct CtdlMessage *convert_internet_message_buf(StrBuf **rfc822);
* 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;
+ StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress again."), -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 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))
+ {
+ StrBufAppendBufPlain(CCC->StatusMessage, _("successfully addded emailaddress."), -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ return 1;
+ }
+ else
+ {
+ StrBufAppendBufPlain(CCC->StatusMessage, _("unable to add this emailaddress; its not matching our domain."), -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, internet_addr, -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 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)
+ {
+ StrBufAppendBufPlain(CCC->StatusMessage,
+ _("unable to add this emailaddress; its not matching our domain."), -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, addr, -1, 0);
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("|"), 0);
+ }
}
free(addr);
}
ptr = msg->cm_fields['M'];
if (ptr == NULL) return(0);
+
+ NewStrBufDupAppendFlush(&CC->StatusMessage, NULL, NULL, 0);
+
while (ptr != NULL) {
linelen = strcspn(ptr, "\n");
*/
void cmd_ent0(char *entargs)
{
+ struct CitContext *CCC = CC;
int post = 0;
char recp[SIZ];
char cc[SIZ];
char subject[SIZ];
int subject_required = 0;
int do_confirm = 0;
+ int verbose_reply = 0;
long msgnum;
int i, j;
char buf[256];
do_confirm = extract_int(entargs, 6);
extract_token(cc, entargs, 7, '|', sizeof cc);
extract_token(bcc, entargs, 8, '|', sizeof bcc);
+ verbose_reply = extract_int(entargs, 9);
switch(CC->room.QRdefaultview) {
case VIEW_NOTES:
case VIEW_WIKI:
/* Check some other permission type things. */
if (IsEmptyStr(newusername)) {
- strcpy(newusername, CC->user.fullname);
+ strcpy(newusername, CCC->user.fullname);
}
- if ( (CC->user.axlevel < AxAideU)
- && (strcasecmp(newusername, CC->user.fullname))
- && (strcasecmp(newusername, CC->cs_inet_fn))
+ if ( (CCC->user.axlevel < AxAideU)
+ && (strcasecmp(newusername, CCC->user.fullname))
+ && (strcasecmp(newusername, CCC->cs_inet_fn))
) {
cprintf("%d You don't have permission to author messages as '%s'.\n",
ERROR + HIGHER_ACCESS_REQUIRED,
}
if (!IsEmptyStr(newuseremail)) {
- if (!strcasecmp(newuseremail, CC->cs_inet_email)) {
+ if (!strcasecmp(newuseremail, CCC->cs_inet_email)) {
newuseremail_ok = 1;
}
- else if (!IsEmptyStr(CC->cs_inet_other_emails)) {
- j = num_tokens(CC->cs_inet_other_emails, '|');
+ else if (!IsEmptyStr(CCC->cs_inet_other_emails)) {
+ j = num_tokens(CCC->cs_inet_other_emails, '|');
for (i=0; i<j; ++i) {
- extract_token(buf, CC->cs_inet_other_emails, i, '|', sizeof buf);
+ extract_token(buf, CCC->cs_inet_other_emails, i, '|', sizeof buf);
if (!strcasecmp(newuseremail, buf)) {
newuseremail_ok = 1;
}
return;
}
- CC->cs_flags |= CS_POSTING;
+ CCC->cs_flags |= CS_POSTING;
/* In mailbox rooms we have to behave a little differently --
* make sure the user has specified at least one recipient. Then
* is the DRAFTS room which does not require recipients
*/
- if ( ( ( (CC->room.QRflags & QR_MAILBOX) && (!strcasecmp(&CC->room.QRname[11], MAILROOM)) )
- || ( (CC->room.QRflags & QR_MAILBOX) && (CC->curr_view == VIEW_MAILBOX) )
- ) && (strcasecmp(&CC->room.QRname[11], USERDRAFTROOM)) !=0 ) {
- if (CC->user.axlevel < AxProbU) {
+ if ( ( ( (CCC->room.QRflags & QR_MAILBOX) && (!strcasecmp(&CCC->room.QRname[11], MAILROOM)) )
+ || ( (CCC->room.QRflags & QR_MAILBOX) && (CCC->curr_view == VIEW_MAILBOX) )
+ ) && (strcasecmp(&CCC->room.QRname[11], USERDRAFTROOM)) !=0 ) {
+ if (CCC->user.axlevel < AxProbU) {
strcpy(recp, "sysop");
strcpy(cc, "");
strcpy(bcc, "");
}
if (valid_to->num_internet + valid_cc->num_internet + valid_bcc->num_internet > 0) {
- if (CtdlCheckInternetMailPermission(&CC->user)==0) {
+ if (CtdlCheckInternetMailPermission(&CCC->user)==0) {
cprintf("%d You do not have permission "
"to send Internet mail.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
}
if ( ( (valid_to->num_internet + valid_to->num_ignet + valid_cc->num_internet + valid_cc->num_ignet + valid_bcc->num_internet + valid_bcc->num_ignet) > 0)
- && (CC->user.axlevel < AxNetU) ) {
+ && (CCC->user.axlevel < AxNetU) ) {
cprintf("%d Higher access required for network mail.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
free_recipients(valid_to);
if ((RESTRICT_INTERNET == 1)
&& (valid_to->num_internet + valid_cc->num_internet + valid_bcc->num_internet > 0)
- && ((CC->user.flags & US_INTERNET) == 0)
- && (!CC->internal_pgm)) {
+ && ((CCC->user.flags & US_INTERNET) == 0)
+ && (!CCC->internal_pgm)) {
cprintf("%d You don't have access to Internet mail.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
free_recipients(valid_to);
/* Is this a room which has anonymous-only or anonymous-option? */
anonymous = MES_NORMAL;
- if (CC->room.QRflags & QR_ANONONLY) {
+ if (CCC->room.QRflags & QR_ANONONLY) {
anonymous = MES_ANONONLY;
}
- if (CC->room.QRflags & QR_ANONOPT) {
+ if (CCC->room.QRflags & QR_ANONOPT) {
if (anon_flag == 1) { /* only if the user requested it */
anonymous = MES_ANONOPT;
}
}
- if ((CC->room.QRflags & QR_MAILBOX) == 0) {
+ if ((CCC->room.QRflags & QR_MAILBOX) == 0) {
recp[0] = 0;
}
* strongly recommended in this room, if either the SUBJECTREQ flag
* is set, or if there is one or more Internet email recipients.
*/
- if (CC->room.QRflags2 & QR2_SUBJECTREQ) subject_required = 1;
+ if (CCC->room.QRflags2 & QR2_SUBJECTREQ) subject_required = 1;
if ((valid_to) && (valid_to->num_internet > 0)) subject_required = 1;
if ((valid_cc) && (valid_cc->num_internet > 0)) subject_required = 1;
if ((valid_bcc) && (valid_bcc->num_internet > 0)) subject_required = 1;
cprintf("%d send message\n", SEND_LISTING);
}
- msg = CtdlMakeMessage(&CC->user, recp, cc,
- CC->room.QRname, anonymous, format_type,
+ msg = CtdlMakeMessage(&CCC->user, recp, cc,
+ CCC->room.QRname, anonymous, format_type,
newusername, newuseremail, subject,
((!IsEmptyStr(supplied_euid)) ? supplied_euid : NULL),
NULL, references);
if (msg != NULL) {
msgnum = CtdlSubmitMsg(msg, valid, "", QP_EADDR);
+ if (verbose_reply)
+ {
+ if (StrLength(CCC->StatusMessage)>0)
+ {
+ StrBufAppendBufPlain(CCC->StatusMessage, HKEY("\n"), 0);
+ cputbuf(CCC->StatusMessage);
+ }
+ else
+ client_write(HKEY("\n"));
+ }
if (do_confirm) {
cprintf("%ld\n", msgnum);
if (msgnum >= 0L) {
- cprintf("Message accepted.\n");
+ client_write(HKEY("Message accepted.\n"));
}
else {
- cprintf("Internal error.\n");
+ client_write(HKEY("Internal error.\n"));
}
if (msg->cm_fields['E'] != NULL) {
cprintf("%s\n", msg->cm_fields['E']);
}
}
- sprintf(buf, "ENT0 1|||4||");
- serv_puts(buf);
- serv_getln(buf, sizeof buf);
- if (buf[0] != '4') {
+ Buf = NewStrBuf();
+ serv_write(HKEY("ENT0 1|||4||||||1\n"));
+ if (!StrBuf_ServGetln(Buf) && (GetServerStatus(Buf, NULL) != 4))
+ {
edit_vcard();
return;
}
/* Make a vCard structure out of the data supplied in the form */
- Buf = NewStrBuf();
StrBufPrintf(Buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
bstr("extrafields")
);
v = VCardLoad(Buf); /* Start with the extra fields */
- FreeStrBuf(&Buf);
if (v == NULL) {
AppendImportantMessage(_("An error has occurred."), -1);
edit_vcard();
+ FreeStrBuf(&Buf);
return;
}
if (serialized_vcard == NULL) {
AppendImportantMessage(_("An error has occurred."), -1);
edit_vcard();
+ FreeStrBuf(&Buf);
return;
}
- serv_puts("Content-type: text/x-vcard; charset=UTF-8");
- serv_puts("");
+ serv_write(HKEY("Content-type: text/x-vcard; charset=UTF-8\n"));
+ serv_write(HKEY("\n"));
serv_printf("%s\r\n", serialized_vcard);
- serv_puts("000");
+ serv_write(HKEY("000\n"));
free(serialized_vcard);
+ StrBuf_ServGetln(Buf);
+
if (!strcmp(bstr("return_to"), "select_user_to_edit")) {
select_user_to_edit(NULL);
}
else {
readloop(readnew, eUseDefault);
}
+ FreeStrBuf(&Buf);
}