static InternetAddress* lbabl_get_internet_address(LDAP *dir, LDAPMessage * e) { InternetAddress *ia; BerElement *ber = NULL; char *attr; struct berval **vals; int i; gchar *email = NULL, *sn = NULL, *cn = NULL, *first = NULL; for (attr = ldap_first_attribute(dir, e, &ber); attr != NULL; attr = ldap_next_attribute(dir, e, ber)) { /* * For each attribute, get the attribute name and values. */ if ((vals = ldap_get_values_len(dir, e, attr)) != NULL) { for (i = 0; vals[i] != NULL; i++) { if ((g_ascii_strcasecmp(attr, "sn") == 0) && (!sn)) sn = g_strndup(vals[i]->bv_val, vals[i]->bv_len); if ((g_ascii_strcasecmp(attr, "cn") == 0) && (!cn)) cn = g_strndup(vals[i]->bv_val, vals[i]->bv_len); if ((g_ascii_strcasecmp(attr, "givenName") == 0) && (!first)) first = g_strndup(vals[i]->bv_val, vals[i]->bv_len); if ((g_ascii_strcasecmp(attr, "mail") == 0) && (!email)) email = g_strndup(vals[i]->bv_val, vals[i]->bv_len); } ldap_value_free_len(vals); } ldap_memfree(attr); } /* * Record will have e-mail (searched) */ if(email == NULL) email = g_strdup("none"); g_return_val_if_fail(email != NULL, NULL); if(!cn) cn = create_name(first, sn); ia = internet_address_mailbox_new(cn, email); g_free(email); g_free(sn); g_free(cn); g_free(first); return ia; }
gboolean rspamd_task_add_sender (struct rspamd_task *task, const gchar *sender) { InternetAddressList *tmp_addr; if (task->from_envelope == NULL) { task->from_envelope = internet_address_list_new (); #ifdef GMIME24 rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t) g_object_unref, task->from_envelope); #else rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t) internet_address_list_destroy, task->from_envelope); #endif } if (strcmp (sender, "<>") == 0) { /* Workaround for gmime */ internet_address_list_add (task->from_envelope, internet_address_mailbox_new ("", "")); return TRUE; } else { tmp_addr = internet_address_list_parse_string (sender); if (tmp_addr) { internet_address_list_append (task->from_envelope, tmp_addr); #ifdef GMIME24 g_object_unref (tmp_addr); #else internet_address_list_destroy (tmp_addr); #endif return TRUE; } } return FALSE; }
static void print_mailbox (const search_context_t *ctx, const mailbox_t *mailbox) { const char *name = mailbox->name; const char *addr = mailbox->addr; int count = mailbox->count; sprinter_t *format = ctx->format; InternetAddress *ia = internet_address_mailbox_new (name, addr); char *name_addr; /* name_addr has the name part quoted if necessary. Compare * 'John Doe <*****@*****.**>' vs. '"Doe, John" <*****@*****.**>' */ name_addr = internet_address_to_string (ia, FALSE); if (format->is_text_printer) { if (ctx->output & OUTPUT_COUNT) { format->integer (format, count); format->string (format, "\t"); } format->string (format, name_addr); format->separator (format); } else { format->begin_map (format); format->map_key (format, "name"); format->string (format, name); format->map_key (format, "address"); format->string (format, addr); format->map_key (format, "name-addr"); format->string (format, name_addr); if (ctx->output & OUTPUT_COUNT) { format->map_key (format, "count"); format->integer (format, count); } format->end (format); format->separator (format); } g_object_unref (ia); g_free (name_addr); }
static GtkWidget * balsa_vevent_widget(LibBalsaVEvent * event, gboolean may_reply, InternetAddress * sender) { GtkGrid *grid; int row = 0; LibBalsaIdentity *vevent_ident = NULL; grid = GTK_GRID(gtk_grid_new()); gtk_grid_set_row_spacing(grid, 6); gtk_grid_set_column_spacing(grid, 12); GRID_ATTACH(grid, event->summary, _("Summary:")); GRID_ATTACH_ADDRESS(grid, event->organizer, _("Organizer:")); GRID_ATTACH_DATE(grid, event->start, _("Start:")); GRID_ATTACH_DATE(grid, event->end, _("End:")); GRID_ATTACH(grid, event->location, _("Location:")); if (event->attendee) { GList *att; GString *all_atts = NULL; for (att = event->attendee; att; att = att->next) { LibBalsaAddress *lba = LIBBALSA_ADDRESS(att->data); gchar *this_att = libbalsa_vcal_attendee_to_str(lba); if (all_atts) g_string_append_printf(all_atts, "\n%s", this_att); else all_atts = g_string_new(this_att); g_free(this_att); if (may_reply && libbalsa_vcal_attendee_rsvp(lba)) { InternetAddress *ia = internet_address_mailbox_new(NULL, lba->address_list->data); GList *list; for (list = balsa_app.identities; list; list = list->next) { LibBalsaIdentity *ident = list->data; if (libbalsa_ia_rfc2821_equal(ident->ia, ia)) { vevent_ident = ident; break; } } g_object_unref(ia); } } GRID_ATTACH(grid, all_atts->str, ngettext("Attendee:", "Attendees:", g_list_length(event->attendee))); g_string_free(all_atts, TRUE); } GRID_ATTACH_TEXT(grid, event->description, _("Description:")); if (sender && vevent_ident) { GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); GtkWidget *label; GtkWidget *bbox; GtkWidget *button; /* add the callback data to the event object */ g_object_ref(event); g_object_ref(sender); g_object_set_data_full(G_OBJECT(event), "ev:sender", internet_address_to_string(sender, FALSE), (GDestroyNotify) g_free); g_object_set_data_full(G_OBJECT(event), "ev:ident", g_object_ref(vevent_ident), (GDestroyNotify) g_object_unref); /* pack everything into a box */ gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(grid)); label = gtk_label_new(_("The sender asks you for a reply to this request:")); gtk_container_add(GTK_CONTAINER(box), label); bbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); gtk_container_add(GTK_CONTAINER(box), bbox); button = gtk_button_new_with_label(_("Accept")); g_object_set_data_full(G_OBJECT(button), "event", event, (GDestroyNotify) g_object_unref); g_object_set_data(G_OBJECT(button), "mode", GINT_TO_POINTER(VCAL_PSTAT_ACCEPTED)); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(vevent_reply), bbox); gtk_container_add(GTK_CONTAINER(bbox), button); button = gtk_button_new_with_label(_("Accept tentatively")); g_object_set_data(G_OBJECT(button), "event", event); g_object_set_data(G_OBJECT(button), "mode", GINT_TO_POINTER(VCAL_PSTAT_TENTATIVE)); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(vevent_reply), bbox); gtk_container_add(GTK_CONTAINER(bbox), button); button = gtk_button_new_with_label(_("Decline")); g_object_set_data(G_OBJECT(button), "event", event); g_object_set_data(G_OBJECT(button), "mode", GINT_TO_POINTER(VCAL_PSTAT_DECLINED)); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(vevent_reply), bbox); gtk_container_add(GTK_CONTAINER(bbox), button); return box; } else return GTK_WIDGET(grid); }
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 envelope_decode_address (SpruceIMAPEngine *engine, GString *addrs, GError **err) { char *addr, *name = NULL, *user = NULL; unsigned char *literal = NULL; spruce_imap_token_t token; const char *domain = NULL; InternetAddress *ia; int part = 0; size_t n; if (spruce_imap_engine_next_token (engine, &token, err) == -1) return -1; if (token.token == SPRUCE_IMAP_TOKEN_NIL) { return 0; } else if (token.token != '(') { spruce_imap_utils_set_unexpected_token_error (err, engine, &token); return -1; } if (addrs->len > 0) g_string_append (addrs, ", "); do { if (spruce_imap_engine_next_token (engine, &token, err) == -1) goto exception; literal = NULL; switch (token.token) { case SPRUCE_IMAP_TOKEN_NIL: break; case SPRUCE_IMAP_TOKEN_ATOM: case SPRUCE_IMAP_TOKEN_QSTRING: switch (part) { case 0: name = g_mime_utils_header_decode_phrase (token.v.qstring); break; case 2: user = g_strdup (token.v.qstring); break; case 3: domain = token.v.qstring; break; } break; case SPRUCE_IMAP_TOKEN_LITERAL: if (spruce_imap_engine_literal (engine, &literal, &n, err) == -1) goto exception; switch (part) { case 0: name = g_mime_utils_header_decode_phrase ((char *) literal); g_free (literal); break; case 2: user = (char *) literal; break; case 3: domain = (char *) literal; break; } break; default: spruce_imap_utils_set_unexpected_token_error (err, engine, &token); goto exception; } part++; } while (part < 4); addr = g_strdup_printf ("%s@%s", user, domain); g_free (literal); g_free (user); ia = internet_address_mailbox_new (name, addr); g_free (name); g_free (addr); addr = internet_address_to_string (ia, FALSE); g_object_unref (ia); g_string_append (addrs, addr); g_free (addr); if (spruce_imap_engine_next_token (engine, &token, err) == -1) return -1; if (token.token != ')') { spruce_imap_utils_set_unexpected_token_error (err, engine, &token); return -1; } return 0; exception: g_free (name); g_free (user); return -1; }
/* -- helpers -- */ static LibBalsaABErr lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica, xmlDocPtr * docptr) { LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica); struct stat stat_buf; int fd; xmlDocPtr doc = NULL; xmlNodePtr root_element = NULL; GList *completion_list; CompletionData *cmp_data; GSList *list; /* init the return pointer (if any) */ if (docptr) *docptr = NULL; /* eject if the file did not change on disk and no document result pointer is passed */ if (!docptr && stat(ab_text->path, &stat_buf) == 0) { if (stat_buf.st_mtime == ab_text->mtime) return LBABERR_OK; else ab_text->mtime = stat_buf.st_mtime; } /* free old data */ g_slist_foreach(ab_text->item_list, (GFunc) g_object_unref, NULL); g_slist_free(ab_text->item_list); ab_text->item_list = NULL; g_list_foreach(ab_text->name_complete->items, (GFunc) completion_data_free, NULL); libbalsa_completion_clear_items(ab_text->name_complete); /* try to read the address book */ if ((fd = open(ab_text->path, O_RDONLY)) == -1) return LBABERR_CANNOT_READ; if (libbalsa_lock_file(ab_text->path, fd, FALSE, TRUE, FALSE) < 0) { close(fd); return LBABERR_CANNOT_READ; } doc = xmlParseFile(ab_text->path); libbalsa_unlock_file(ab_text->path, fd, FALSE); close(fd); if (!doc) return LBABERR_CANNOT_READ; /* Get the root element node and extract cards if it is a Rubrica book */ root_element = xmlDocGetRootElement(doc); if (!xmlStrcmp(root_element->name, CXMLCHARP("Rubrica"))) ab_text->item_list = extract_cards(root_element->children); /* return the document if requested of free it */ if (docptr) *docptr = doc; else xmlFreeDoc(doc); /* build the completion list */ // FIXME - Rubrica provides groups... completion_list = NULL; for (list = ab_text->item_list; list; list = list->next) { LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data); GList *l; if (!address) continue; if (address->address_list->next && LIBBALSA_ADDRESS_BOOK(ab_rubrica)->dist_list_mode) { /* Create a group address. */ InternetAddress *ia = internet_address_group_new(address->full_name); InternetAddressGroup *group = (InternetAddressGroup *) ia; for (l = address->address_list; l; l = l->next) { InternetAddress *member = internet_address_mailbox_new(NULL, l->data); internet_address_group_add_member(group, member); g_object_unref(member); } cmp_data = completion_data_new(ia, address->nick_name); completion_list = g_list_prepend(completion_list, cmp_data); g_object_unref(ia); } else { /* Create name addresses. */ GList *l; for (l = address->address_list; l; l = l->next) { InternetAddress *ia = internet_address_mailbox_new(address->full_name, l->data); cmp_data = completion_data_new(ia, address->nick_name); completion_list = g_list_prepend(completion_list, cmp_data); g_object_unref(ia); } } } completion_list = g_list_reverse(completion_list); libbalsa_completion_add_items(ab_text->name_complete, completion_list); g_list_free(completion_list); return LBABERR_OK; }