ADDRESS * address_from_ldap(LDAP_CHOOSE_S *winning_e) { ADDRESS *ret_a = NULL; if(winning_e){ char *a; BerElement *ber; ret_a = mail_newaddr(); for(a = ldap_first_attribute(winning_e->ld, winning_e->selected_entry, &ber); a != NULL; a = ldap_next_attribute(winning_e->ld, winning_e->selected_entry, ber)){ int i; char *p; char **vals; dprint((9, "attribute: %s\n", a ? a : "?")); if(!ret_a->personal && strcmp(a, winning_e->info_used->cnattr) == 0){ dprint((9, "Got cnattr:")); vals = ldap_get_values(winning_e->ld, winning_e->selected_entry, a); for(i = 0; vals[i] != NULL; i++) dprint((9, " %s\n", vals[i] ? vals[i] : "?")); if(vals && vals[0]) ret_a->personal = cpystr(vals[0]); ldap_value_free(vals); } else if(!ret_a->mailbox && strcmp(a, winning_e->info_used->mailattr) == 0){ dprint((9, "Got mailattr:")); vals = ldap_get_values(winning_e->ld, winning_e->selected_entry, a); for(i = 0; vals[i] != NULL; i++) dprint((9, " %s\n", vals[i] ? vals[i] : "?")); /* use first one */ if(vals && vals[0]){ if((p = strindex(vals[0], '@')) != NULL){ ret_a->host = cpystr(p+1); *p = '\0'; } ret_a->mailbox = cpystr(vals[0]); } ldap_value_free(vals); } our_ldap_memfree(a); } } return(ret_a); }
mail_address* create_mail_address(String& aName, String& aMailbox, String& aHost) { mail_address* address = mail_newaddr(); encodeStringForEMailHeader(aName, address->personal); encodeStringForEMailHeader(aMailbox, address->mailbox); encodeStringForEMailHeader(aHost, address->host); return address; }
ADDRESS *create_imap_address( FeriteScript* script, FeriteVariable* fe_object){ ADDRESS *root=NULL, *newaddr; FeriteVariable *fe_list,*v,*fe_addr; int i; RETURN_IF_NULL(fe_object && VAO(fe_object)); fe_list = ferite_hash_get( script, VAO(fe_object)->variables->variables, "list" ); RETURN_IF_NULL(fe_list); for( i=0; i< VAUA(fe_list)->size; i++ ){ fe_addr = ferite_uarray_get_index( script, VAUA(fe_list) , i ); RETURN_IF_NULL(fe_addr); if(root == NULL) root = newaddr = mail_newaddr(); else newaddr = newaddr->next = mail_newaddr(); v = ferite_hash_get( script, VAO(fe_addr)->variables->variables , "mailbox"); RETURN_IF_NULL(v); if(VAS(v)->data) newaddr->mailbox = cpystr(VAS(v)->data); v = ferite_hash_get( script, VAO(fe_addr)->variables->variables , "host"); RETURN_IF_NULL(v); if(VAS(v)->data) newaddr->host = cpystr(VAS(v)->data); v = ferite_hash_get( script, VAO(fe_addr)->variables->variables , "name"); RETURN_IF_NULL(v); if(VAS(v)->data) newaddr->personal = cpystr(VAS(v)->data); } return root; }
/* * This function does white pages lookups. * * Args string -- the string to use in the lookup * * Returns NULL -- lookup failed * Address -- A single address is returned if lookup was successfull. */ ADDRESS * wp_lookups(char *string, WP_ERR_S *wp_err, int recursing) { ADDRESS *ret_a = NULL; char ebuf[200]; #ifdef ENABLE_LDAP LDAP_SERV_RES_S *free_when_done = NULL; LDAPLookupStyle style; LDAP_CHOOSE_S *winning_e = NULL; LDAP_SERV_S *info = NULL; static char *fakedomain = "@"; char *tmp_a_string; int auwe_rv = 0; /* * Runtime ldap lookup of addrbook entry. */ if(!strncmp(string, RUN_LDAP, LEN_RL)){ LDAP_SERV_RES_S *head_of_result_list; info = break_up_ldap_server(string+LEN_RL); head_of_result_list = ldap_lookup(info, "", NULL, wp_err, 1); if(head_of_result_list){ if(!wp_exit) auwe_rv = ask_user_which_entry(head_of_result_list, string, &winning_e, wp_err, wp_err->wp_err_occurred ? DisplayIfOne : DisplayIfTwo); if(auwe_rv != -5) free_when_done = head_of_result_list; } else{ wp_err->wp_err_occurred = 1; if(wp_err->error){ q_status_message(SM_ORDER, 3, 5, wp_err->error); display_message('x'); fs_give((void **)&wp_err->error); } /* try using backup email address */ if(info && info->mail && *info->mail){ tmp_a_string = cpystr(info->mail); rfc822_parse_adrlist(&ret_a, tmp_a_string, fakedomain); fs_give((void **)&tmp_a_string); wp_err->error = cpystr(_("Directory lookup failed, using backup email address")); } else{ /* * Do this so the awful LDAP: ... string won't show up * in the composer. This shouldn't actually happen in * real life, so we're not too concerned about it. If we * were we'd want to recover the nickname we started with * somehow, or something like that. */ ret_a = mail_newaddr(); ret_a->mailbox = cpystr("missing-username"); wp_err->error = cpystr(_("Directory lookup failed, no backup email address available")); } q_status_message(SM_ORDER, 3, 5, wp_err->error); display_message('x'); } } else{ style = F_ON(F_COMPOSE_REJECTS_UNQUAL, ps_global) ? DisplayIfOne : DisplayIfTwo; auwe_rv = ldap_lookup_all(string, as.n_serv, recursing, style, NULL, &winning_e, wp_err, &free_when_done); } if(winning_e && auwe_rv != -5){ ret_a = address_from_ldap(winning_e); if(pith_opt_save_ldap_entry && ret_a && F_ON(F_ADD_LDAP_TO_ABOOK, ps_global) && !info) (*pith_opt_save_ldap_entry)(ps_global, winning_e, 1); fs_give((void **)&winning_e); } /* Info's only set in the RUN_LDAP case */ if(info){ if(ret_a && ret_a->host){ ADDRESS *backup = NULL; if(info->mail && *info->mail) rfc822_parse_adrlist(&backup, info->mail, fakedomain); if(!backup || !address_is_same(ret_a, backup)){ if(wp_err->error){ q_status_message(SM_ORDER, 3, 5, wp_err->error); display_message('x'); fs_give((void **)&wp_err->error); } snprintf(ebuf, sizeof(ebuf), _("Warning: current address different from saved address (%s)"), info->mail); wp_err->error = cpystr(ebuf); q_status_message(SM_ORDER, 3, 5, wp_err->error); display_message('x'); } if(backup) mail_free_address(&backup); } free_ldap_server_info(&info); } if(free_when_done) free_ldap_result_list(&free_when_done); #endif /* ENABLE_LDAP */ if(ret_a){ if(ret_a->mailbox){ /* indicates there was a MAIL attribute */ if(!ret_a->host || !ret_a->host[0]){ if(ret_a->host) fs_give((void **)&ret_a->host); ret_a->host = cpystr("missing-hostname"); wp_err->wp_err_occurred = 1; if(wp_err->error) fs_give((void **)&wp_err->error); wp_err->error = cpystr(_("Missing hostname in LDAP address")); q_status_message(SM_ORDER, 3, 5, wp_err->error); display_message('x'); } if(!ret_a->mailbox[0]){ if(ret_a->mailbox) fs_give((void **)&ret_a->mailbox); ret_a->mailbox = cpystr("missing-username"); wp_err->wp_err_occurred = 1; if(wp_err->error) fs_give((void **)&wp_err->error); wp_err->error = cpystr(_("Missing username in LDAP address")); q_status_message(SM_ORDER, 3, 5, wp_err->error); display_message('x'); } } else{ wp_err->wp_err_occurred = 1; if(wp_err->error) fs_give((void **)&wp_err->error); snprintf(ebuf, sizeof(ebuf), _("No email address available for \"%s\""), (ret_a->personal && *ret_a->personal) ? ret_a->personal : "selected entry"); wp_err->error = cpystr(ebuf); q_status_message(SM_ORDER, 3, 5, wp_err->error); display_message('x'); mail_free_address(&ret_a); ret_a = NULL; } } return(ret_a); }