예제 #1
0
파일: task.c 프로젝트: LonePhalcon/rspamd
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
}
예제 #2
0
/* 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;
}
예제 #3
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;
}
예제 #4
0
파일: gmimex.c 프로젝트: swerter/gmimex
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);
    }
  }
}
예제 #5
0
파일: mu-cmd-find.c 프로젝트: migadu/mu
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));
  }
}
예제 #6
0
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);
  }
}
예제 #7
0
/* 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;
}
예제 #8
0
/* 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;
}
예제 #9
0
파일: mu-msg.c 프로젝트: bonega/mu
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;
	}
}
예제 #10
0
/* 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);
	}
    }
}
예제 #11
0
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;
}
예제 #12
0
파일: test-headers.c 프로젝트: GNOME/gmime
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);
}
예제 #13
0
파일: main.c 프로젝트: jstedfast/spruce
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;
}