const gchar * rspamd_task_get_sender (struct rspamd_task *task) { InternetAddress *iaelt = NULL; #ifdef GMIME24 InternetAddressMailbox *imb; if (task->from_envelope != NULL) { iaelt = internet_address_list_get_address (task->from_envelope, 0); } else if (task->from_mime != NULL) { iaelt = internet_address_list_get_address (task->from_mime, 0); } imb = INTERNET_ADDRESS_IS_MAILBOX(iaelt) ? INTERNET_ADDRESS_MAILBOX (iaelt) : NULL; return (imb ? internet_address_mailbox_get_addr (imb) : NULL); #else if (task->from_envelope != NULL) { iaelt = internet_address_list_get_address (task->from_envelope); } else if (task->from_mime != NULL) { iaelt = internet_address_list_get_address (task->from_mime); } return (iaelt != NULL ? internet_address_get_addr (iaelt) : NULL); #endif }
/* Does the address in the Reply-To header of 'message' already appear * in either the 'To' or 'Cc' header of the message? */ static int reply_to_header_is_redundant (notmuch_message_t *message) { const char *reply_to, *to, *cc, *addr; InternetAddressList *list; InternetAddress *address; InternetAddressMailbox *mailbox; reply_to = notmuch_message_get_header (message, "reply-to"); if (reply_to == NULL || *reply_to == '\0') return 0; list = internet_address_list_parse_string (reply_to); if (internet_address_list_length (list) != 1) return 0; address = internet_address_list_get_address (list, 0); if (INTERNET_ADDRESS_IS_GROUP (address)) return 0; mailbox = INTERNET_ADDRESS_MAILBOX (address); addr = internet_address_mailbox_get_addr (mailbox); to = notmuch_message_get_header (message, "to"); cc = notmuch_message_get_header (message, "cc"); if ((to && strstr (to, addr) != 0) || (cc && strstr (cc, addr) != 0)) { return 1; } return 0; }
/* Extract just the email address from the contents of a From: * header. */ static const char * _extract_email_address (const void *ctx, const char *from) { InternetAddressList *addresses; InternetAddress *address; InternetAddressMailbox *mailbox; const char *email = "MAILER-DAEMON"; addresses = internet_address_list_parse_string (from); /* Bail if there is no address here. */ if (addresses == NULL || internet_address_list_length (addresses) < 1) goto DONE; /* Otherwise, just use the first address. */ address = internet_address_list_get_address (addresses, 0); /* The From header should never contain an address group rather * than a mailbox. So bail if it does. */ if (! INTERNET_ADDRESS_IS_MAILBOX (address)) goto DONE; mailbox = INTERNET_ADDRESS_MAILBOX (address); email = internet_address_mailbox_get_addr (mailbox); email = talloc_strdup (ctx, email); DONE: if (addresses) g_object_unref (addresses); return email; }
static void collect_addresses_into(InternetAddressList *ilist, AddressesList *addr_list, guint size) { g_return_if_fail(ilist != NULL); g_return_if_fail(addr_list != NULL); g_return_if_fail(size != 0); guint i; for (i = 0; i < size; i++) { InternetAddress *address = internet_address_list_get_address(ilist, i); // transfer none if (INTERNET_ADDRESS_IS_GROUP(address)) { InternetAddressGroup *group = INTERNET_ADDRESS_GROUP(address); InternetAddressList *group_list = internet_address_group_get_members(group); // transer none if (group_list) { guint gsize = internet_address_list_length(group_list); if (gsize) collect_addresses_into(group_list, addr_list, gsize); } } else if (INTERNET_ADDRESS_IS_MAILBOX(address)) { InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX(address); const gchar *name = internet_address_get_name(address); const gchar *address = internet_address_mailbox_get_addr(mailbox); Address *addr = new_address(address, name); addresses_list_add(addr_list, addr); } } }
static void json_add_address_list (JsonBuilder *builder, InternetAddressList* list) { int size; int i; if (list) { size = internet_address_list_length(list); for (i = 0; i < size; i++) json_add_address(builder, internet_address_list_get_address(list, i)); } }
void extract_addresses(InternetAddressList *address_list, GMimeStream *out_stream) { int i; for (i=0; i<internet_address_list_length(address_list); i++) { if (i > 0) { g_mime_stream_printf (out_stream, ", "); } InternetAddress *address; char *address_string; address = internet_address_list_get_address(address_list, i); address_string = internet_address_to_string(address, TRUE); address_string = str_replace(address_string, "\"", "\\\""); g_mime_stream_printf (out_stream, "\"%s\"", address_string); } }
/* Scan addresses in 'list'. * * If 'message' is non-NULL, then for each address in 'list' that is * not configured as one of the user's addresses in 'config', add that * address to 'message' as an address of 'type'. * * If 'user_from' is non-NULL and *user_from is NULL, *user_from will * be set to the first address encountered in 'list' that is the * user's address. * * Return the number of addresses added to 'message'. (If 'message' is * NULL, the function returns 0 by definition.) */ static unsigned int scan_address_list (InternetAddressList *list, notmuch_config_t *config, GMimeMessage *message, GMimeRecipientType type, const char **user_from) { InternetAddress *address; int i; unsigned int n = 0; for (i = 0; i < internet_address_list_length (list); i++) { address = internet_address_list_get_address (list, i); if (INTERNET_ADDRESS_IS_GROUP (address)) { InternetAddressGroup *group; InternetAddressList *group_list; group = INTERNET_ADDRESS_GROUP (address); group_list = internet_address_group_get_members (group); if (group_list == NULL) continue; n += scan_address_list (group_list, config, message, type, user_from); } else { InternetAddressMailbox *mailbox; const char *name; const char *addr; mailbox = INTERNET_ADDRESS_MAILBOX (address); name = internet_address_get_name (address); addr = internet_address_mailbox_get_addr (mailbox); if (address_is_users (addr, config)) { if (user_from && *user_from == NULL) *user_from = addr; } else if (message) { g_mime_message_add_recipient (message, type, name, addr); n++; } } } return n; }
/* For each address in 'list' that is not configured as one of the * user's addresses in 'config', add that address to 'message' as an * address of 'type'. * * The first address encountered that *is* the user's address will be * returned, (otherwise NULL is returned). */ static const char * add_recipients_for_address_list (GMimeMessage *message, notmuch_config_t *config, GMimeRecipientType type, InternetAddressList *list) { InternetAddress *address; int i; const char *ret = NULL; for (i = 0; i < internet_address_list_length (list); i++) { address = internet_address_list_get_address (list, i); if (INTERNET_ADDRESS_IS_GROUP (address)) { InternetAddressGroup *group; InternetAddressList *group_list; group = INTERNET_ADDRESS_GROUP (address); group_list = internet_address_group_get_members (group); if (group_list == NULL) continue; add_recipients_for_address_list (message, config, type, group_list); } else { InternetAddressMailbox *mailbox; const char *name; const char *addr; mailbox = INTERNET_ADDRESS_MAILBOX (address); name = internet_address_get_name (address); addr = internet_address_mailbox_get_addr (mailbox); if (address_is_users (addr, config)) { if (ret == NULL) ret = addr; } else { g_mime_message_add_recipient (message, type, name, addr); } } } return ret; }
static void address_list_foreach (InternetAddressList *addrlist, MuMsgContactType ctype, MuMsgContactForeachFunc func, gpointer user_data) { int i, len; if (!addrlist) return; len = internet_address_list_length(addrlist); for (i = 0; i != len; ++i) { MuMsgContact contact; if (!fill_contact(&contact, internet_address_list_get_address (addrlist, i), ctype)) continue; if (!(func)(&contact, user_data)) break; } }
/* Print or prepare for printing addresses from InternetAddressList. */ static void process_address_list (const search_context_t *ctx, InternetAddressList *list) { InternetAddress *address; int i; for (i = 0; i < internet_address_list_length (list); i++) { address = internet_address_list_get_address (list, i); if (INTERNET_ADDRESS_IS_GROUP (address)) { InternetAddressGroup *group; InternetAddressList *group_list; group = INTERNET_ADDRESS_GROUP (address); group_list = internet_address_group_get_members (group); if (group_list == NULL) continue; process_address_list (ctx, group_list); } else { InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX (address); mailbox_t mbx = { .name = internet_address_get_name (address), .addr = internet_address_mailbox_get_addr (mailbox), }; /* OUTPUT_COUNT only works with deduplication */ if (ctx->dedup != DEDUP_NONE && is_duplicate (ctx, mbx.name, mbx.addr)) continue; /* OUTPUT_COUNT and DEDUP_ADDRESS require a full pass. */ if (ctx->output & OUTPUT_COUNT || ctx->dedup == DEDUP_ADDRESS) continue; print_mailbox (ctx, &mbx); } } }
BalsaMimeWidget * balsa_mime_widget_new_vcalendar(BalsaMessage * bm, LibBalsaMessageBody * mime_body, const gchar * content_type, gpointer data) { LibBalsaVCal *vcal_obj; BalsaMimeWidget *mw; GtkWidget *label; gchar *text; GList *l; LibBalsaMessage *lbm = bm->message; gboolean may_reply = FALSE; InternetAddress *sender = NULL;; g_return_val_if_fail(mime_body != NULL, NULL); g_return_val_if_fail(content_type != NULL, NULL); g_return_val_if_fail(lbm != NULL, NULL); vcal_obj = libbalsa_vcal_new_from_body(mime_body); if (!vcal_obj) return NULL; mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL); mw->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12); text = g_strdup_printf(_("This is an iTIP calendar “%s” message."), libbalsa_vcal_method_to_str(vcal_obj->method)); label = gtk_label_new(text); g_free(text); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_widget_set_valign(label, GTK_ALIGN_START); gtk_container_add(GTK_CONTAINER(mw->widget), label); /* a reply may be created only for unread requests */ if ((vcal_obj->method == ITIP_REQUEST) && LIBBALSA_MESSAGE_IS_UNREAD(lbm)) { may_reply = TRUE; if (lbm->headers) { if (lbm->headers->reply_to) sender = internet_address_list_get_address(lbm->headers-> reply_to, 0); else if (lbm->headers && lbm->headers->from) sender = internet_address_list_get_address(lbm->headers->from, 0); } else if (lbm->sender) sender = internet_address_list_get_address(lbm->sender, 0); } /* add events */ for (l = vcal_obj->vevent; l; l = g_list_next(l)) { GtkWidget *event = balsa_vevent_widget((LibBalsaVEvent *) l->data, may_reply, sender); gtk_container_add(GTK_CONTAINER(mw->widget), event); } g_object_unref(vcal_obj); return mw; }
static void test_address_sync (void) { const char *raw_value, *value; InternetAddress *addr, *ia; InternetAddressList *list; GMimeHeaderList *headers; GMimeMessage *message; GMimeObject *object; GMimeHeader *header; message = g_mime_message_new (TRUE); list = g_mime_message_get_addresses (message, GMIME_ADDRESS_TYPE_TO); object = (GMimeObject *) message; headers = object->headers; testsuite_check ("address header synchronization"); try { /* first, check that the To recipients are empty */ if (list == NULL || internet_address_list_length (list) != 0) throw (exception_new ("unexpected initial internet address list")); /* now check that the initial header value is null */ if ((value = g_mime_object_get_header (object, "To")) != NULL) throw (exception_new ("unexpected initial value")); header = g_mime_header_list_get_header (headers, "To"); if ((raw_value = g_mime_header_get_raw_value (header)) != NULL) throw (exception_new ("unexpected initial raw_value")); /* now try adding an address */ addr = internet_address_mailbox_new ("Tester", "*****@*****.**"); internet_address_list_add (list, addr); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after adding recipient")); if (strcmp ("Tester <*****@*****.**>", value) != 0) throw (exception_new ("unexpected address list header after adding recipient")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after adding recipient")); if (strcmp (" Tester <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after adding recipient: %s", raw_value)); /* now let's try changing the address name to make sure signals properly chain up */ internet_address_set_name (addr, "Eva Lucy-Ann Tester"); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after changing name")); if (strcmp ("Eva Lucy-Ann Tester <*****@*****.**>", value) != 0) throw (exception_new ("unexpected address list header after changing name: %s", value)); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after changing name")); if (strcmp (" Eva Lucy-Ann Tester <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after changing name")); /* now let's try changing the address mailbox... */ internet_address_mailbox_set_addr ((InternetAddressMailbox *) addr, "*****@*****.**"); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after changing mailbox")); if (strcmp ("Eva Lucy-Ann Tester <*****@*****.**>", value) != 0) throw (exception_new ("unexpected address list header after changing mailbox")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after changing mailbox")); if (strcmp (" Eva Lucy-Ann Tester <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after changing mailbox")); /* now let's try inserting a group address */ g_object_unref (addr); addr = internet_address_group_new ("Group"); internet_address_list_insert (list, 0, addr); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after inserting group")); if (strcmp ("Group: ;, Eva Lucy-Ann Tester <*****@*****.**>", value) != 0) throw (exception_new ("unexpected address list header after inserting group")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after inserting group")); if (strcmp (" Group: ;, Eva Lucy-Ann Tester <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after inserting group")); /* now let's try removing the original recipient */ internet_address_list_remove_at (list, 1); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after removing recipient")); if (strcmp ("Group: ;", value) != 0) throw (exception_new ("unexpected address list header after removing recipient")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after removing recipient")); if (strcmp (" Group: ;\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after removing recipient")); /* now let's try adding an address to the group... */ ia = internet_address_mailbox_new ("Tester", "*****@*****.**"); internet_address_list_add (((InternetAddressGroup *) addr)->members, ia); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after adding addr to group")); if (strcmp ("Group: Tester <*****@*****.**>;", value) != 0) throw (exception_new ("unexpected address list header after adding addr to group")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after adding addr to group")); if (strcmp (" Group: Tester <*****@*****.**>;\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after adding addr to group")); /* let's try this in reverse... set the header value and make sure InternetAddressList gets updated */ g_mime_object_set_header (object, "To", "[email protected] (=?iso-8859-1?q?Fran=E7ois?= Pons)", NULL); if (internet_address_list_length (list) != 1) throw (exception_new ("unexpected number of addresses in addrlist after setting header value")); ia = internet_address_list_get_address (list, 0); value = internet_address_get_name (ia); if (strcmp ("Fran\xc3\xa7ois Pons", value) != 0) throw (exception_new ("unexpected name after setting header value")); value = internet_address_mailbox_get_addr ((InternetAddressMailbox *) ia); if (strcmp ("*****@*****.**", value) != 0) throw (exception_new ("unexpected addr after setting header value")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after setting header value")); if (strcmp (" =?iso-8859-1?q?Fran=E7ois?= Pons <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after setting header value: %s", raw_value)); testsuite_check_passed (); } catch (ex) { testsuite_check_failed ("address header not synchronized: %s", ex->message); } finally; g_object_unref (message); }
static int display_message_list (SpruceFolder *folder, GPtrArray *uids, int first, int last, int cursor) { char padding[40]; char flag; char cur; int i; fprintf (stdout, "%s: %d messages, %d new\n", folder->name, spruce_folder_get_message_count (folder), spruce_folder_get_unread_message_count (folder)); memset (padding, ' ', sizeof (padding) - 1); padding[sizeof (padding) - 1] = '\0'; for (i = first; i < last; i++) { SpruceMessageInfo *info; if ((info = spruce_folder_get_message_info (folder, uids->pdata[i]))) { char *from, frombuf[21], date[17]; int subjlen, fromlen, frommax, n; InternetAddressList *list; InternetAddress *ia; if ((list = internet_address_list_parse_string (info->from))) { ia = internet_address_list_get_address (list, 0); if (INTERNET_ADDRESS_IS_MAILBOX (ia)) from = INTERNET_ADDRESS_MAILBOX (ia)->addr; else from = ia->name; } else from = ""; strftime (date, sizeof (date), "%a %b %e %H:%M", localtime (&info->date_sent)); frommax = 20; if ((n = num_digits (i + 1)) > 2) { /*fprintf (stderr, "%d > 2 digits (%d digits)\n", i + 1, n);*/ frommax -= n - 2; } fromlen = MIN (frommax, strlen (from)); memcpy (frombuf, from, fromlen); for (n = 0; n < fromlen; n++) if (!isprint (frombuf[n])) frombuf[n] = 'x'; while (fromlen < frommax) frombuf[fromlen++] = ' '; frombuf[fromlen] = '\0'; subjlen = 23; if ((n = (num_digits (info->lines))) > 2) subjlen -= n - 2; if ((n = (num_digits (info->size))) > 4) subjlen -= n - 4; if ((info->flags & SPRUCE_MESSAGE_DELETED)) flag = 'D'; else if ((info->flags & SPRUCE_MESSAGE_ANSWERED)) flag = 'A'; else if ((info->flags & SPRUCE_MESSAGE_SEEN)) flag = 'O'; else if ((info->flags & SPRUCE_MESSAGE_RECENT)) flag = 'N'; else flag = 'U'; if ((cursor >= 0 && cursor == i) || (cursor == -1 && flag == 'N')) { cursor = i; cur = '>'; } else cur = ' '; fprintf (stdout, "%c%c %s%d %s %.16s %.2u/%.4zu %.*s\n", cur, flag, (i + 1) < 10 ? " " : "", i + 1, frombuf, date, info->lines, info->size, subjlen, info->subject ? info->subject : EMPTY_SUBJECT); g_object_unref (list); spruce_folder_free_message_info (folder, info); } } return cursor == -1 ? first : cursor; }