/* @Test */ void test_pop3(void) { struct list pop3_list; struct account *ac; struct pop3_server *pop3_server; struct pop3_dl_options dl_options = {0}; char *profile_path; char *pwd; debug_init(); debug_set_level(25); pwd = realpath(".", NULL); CU_ASSERT(pwd != NULL); profile_path = mycombinepath(pwd, "test-account-profile"); CU_ASSERT(profile_path != NULL); config_set_user_profile_directory(profile_path); CU_ASSERT(codesets_init() != 0); CU_ASSERT(progmon_init() != 0); CU_ASSERT(init_threads() != 0); CU_ASSERT(load_config() != 0); CU_ASSERT(init_folders() != 0); ac = account_malloc(); CU_ASSERT(ac != NULL); CU_ASSERT(ac->imap != NULL); CU_ASSERT(ac->pop != NULL); ac->recv_type = 0; if (ac->pop->name) free(ac->pop->name); ac->pop->name = mystrdup("localhost"); CU_ASSERT(ac->pop->name != NULL); if (ac->pop->login) free(ac->pop->login); ac->pop->login = mystrdup("test"); CU_ASSERT(ac->pop->login != NULL); if (ac->pop->passwd) free(ac->pop->passwd); ac->pop->passwd = mystrdup("test"); CU_ASSERT(ac->pop->passwd != NULL); ac->pop->ssl = 0; ac->pop->port = 10110; insert_config_account(ac); mails_test_account(ac, mails_test_account_callback); sleep(3); account_free(ac); cleanup_threads(); del_folders(); free_config(); progmon_deinit(); codesets_cleanup(); free(profile_path); free(pwd); }
/* * Setup CollectionLists. Build a context list on the fly from the config * variable and edit it. This won't include Incoming-Folders because that * is a pseudo collection, but that's ok since we can't do the operations * on it, anyway. Reset real config list at the end. */ void context_config_screen(struct pine *ps, CONT_SCR_S *cs, int edit_exceptions) { CONTEXT_S *top, **clist, *cp; CONF_S *ctmpa, *first_line, *heading; OPT_SCREEN_S screen; int i, readonly_warning, some_defined, ret; int reinit_contexts = 0, prime; char **lval, **lval1, **lval2, ***alval; struct variable fake_fspec_var, fake_nspec_var; struct variable *fake_fspec, *fake_nspec; ew = edit_exceptions ? ps_global->ew_for_except_vars : Main; if(ps->restricted) readonly_warning = 1; else{ PINERC_S *prc = NULL; switch(ew){ case Main: prc = ps->prc; break; case Post: prc = ps->post_prc; break; default: break; } readonly_warning = prc ? prc->readonly : 1; if(prc && prc->quit_to_edit){ quit_to_edit_msg(prc); return; } } go_again: top = NULL; ctmpa = NULL; first_line = NULL; some_defined = 0, prime = 0; fake_fspec = &fake_fspec_var; fake_nspec = &fake_nspec_var; memset((void *)fake_fspec, 0, sizeof(*fake_fspec)); memset((void *)fake_nspec, 0, sizeof(*fake_nspec)); /* so fixed_var() will work right */ fake_fspec->is_list = 1; fake_nspec->is_list = 1; if((ps->vars[V_FOLDER_SPEC]).is_fixed){ fake_fspec->is_fixed = 1; if((ps->vars[V_FOLDER_SPEC]).fixed_val.l && (ps->vars[V_FOLDER_SPEC]).fixed_val.l[0]){ fake_fspec->fixed_val.l = (char **) fs_get(2 * sizeof(char *)); fake_fspec->fixed_val.l[0] = cpystr((ps->vars[V_FOLDER_SPEC]).fixed_val.l[0]); fake_fspec->fixed_val.l[1] = NULL; } } if((ps->vars[V_NEWS_SPEC]).is_fixed){ fake_nspec->is_fixed = 1; if((ps->vars[V_NEWS_SPEC]).fixed_val.l && (ps->vars[V_NEWS_SPEC]).fixed_val.l[0]){ fake_nspec->fixed_val.l = (char **) fs_get(2 * sizeof(char *)); fake_nspec->fixed_val.l[0] = cpystr(INHERIT); fake_nspec->fixed_val.l[0] = cpystr((ps->vars[V_NEWS_SPEC]).fixed_val.l[0]); fake_nspec->fixed_val.l[1] = NULL; } } clist = ⊤ lval1 = LVAL(&ps->vars[V_FOLDER_SPEC], ew); lval2 = LVAL(&ps->vars[V_NEWS_SPEC], ew); alval = ALVAL(fake_fspec, ew); if(lval1) *alval = copy_list_array(lval1); else if(!edit_exceptions && ps->VAR_FOLDER_SPEC && ps->VAR_FOLDER_SPEC[0] && ps->VAR_FOLDER_SPEC[0][0]) *alval = copy_list_array(ps->VAR_FOLDER_SPEC); else fake_fspec = NULL; if(fake_fspec){ lval = LVAL(fake_fspec, ew); for(i = 0; lval && lval[i]; i++){ cp = NULL; if(i == 0 && !strcmp(lval[i], INHERIT)){ cp = (CONTEXT_S *)fs_get(sizeof(*cp)); memset((void *)cp, 0, sizeof(*cp)); cp->use = CNTXT_INHERIT; cp->label = cpystr("Default collections are inherited"); } else if((cp = new_context(lval[i], &prime)) != NULL){ cp->var.v = fake_fspec; cp->var.i = i; } if(cp){ *clist = cp; /* add it to list */ clist = &cp->next; /* prepare for next */ } } set_current_val(fake_fspec, FALSE, FALSE); } alval = ALVAL(fake_nspec, ew); if(lval2) *alval = copy_list_array(lval2); else if(!edit_exceptions && ps->VAR_NEWS_SPEC && ps->VAR_NEWS_SPEC[0] && ps->VAR_NEWS_SPEC[0][0]) *alval = copy_list_array(ps->VAR_NEWS_SPEC); else fake_nspec = NULL; if(fake_nspec){ lval = LVAL(fake_nspec, ew); for(i = 0; lval && lval[i]; i++){ cp = NULL; if(i == 0 && !strcmp(lval[i], INHERIT)){ cp = (CONTEXT_S *)fs_get(sizeof(*cp)); memset((void *)cp, 0, sizeof(*cp)); cp->use = CNTXT_INHERIT; cp->label = cpystr("Default collections are inherited"); } else if((cp = new_context(lval[i], &prime)) != NULL){ cp->var.v = fake_nspec; cp->var.i = i; } if(cp){ *clist = cp; /* add it to list */ clist = &cp->next; /* prepare for next */ } } set_current_val(fake_nspec, FALSE, FALSE); } for(cp = top; cp; cp = cp->next) if(!(cp->use & CNTXT_INHERIT)){ some_defined++; break; } if(edit_exceptions && !some_defined){ q_status_message(SM_ORDER, 3, 7, _("No exceptions to edit. First collection exception must be set by editing file")); free_contexts(&top); if(reinit_contexts){ free_contexts(&ps_global->context_list); init_folders(ps_global); } return; } /* fix up prev pointers */ for(cp = top; cp; cp = cp->next) if(cp->next) cp->next->prev = cp; new_confline(&ctmpa); /* blank line */ ctmpa->keymenu = cs->keymenu; ctmpa->help = cs->help.text; ctmpa->help_title = cs->help.title; ctmpa->tool = context_config_tool; ctmpa->flags |= (CF_NOSELECT | CF_B_LINE); for(cp = top; cp; cp = cp->next){ new_confline(&ctmpa); heading = ctmpa; if(!(cp->use & CNTXT_INHERIT)) ctmpa->value = cpystr(cp->nickname ? cp->nickname : cp->context); ctmpa->var = cp->var.v; ctmpa->keymenu = cs->keymenu; ctmpa->help = cs->help.text; ctmpa->help_title = cs->help.title; ctmpa->tool = context_config_tool; ctmpa->flags |= CF_STARTITEM; ctmpa->valoffset = 4; ctmpa->d.c.ct = cp; ctmpa->d.c.cs = cs; if(cp->use & CNTXT_INHERIT) ctmpa->flags |= CF_INHERIT | CF_NOSELECT; if((!first_line && !(cp->use & CNTXT_INHERIT)) || (!(cp->use & CNTXT_INHERIT) && cp->var.v && (cs->starting_var == cp->var.v) && (cs->starting_varmem == cp->var.i))) first_line = ctmpa; /* Add explanatory text */ new_confline(&ctmpa); ctmpa->value = cpystr(cp->label ? cp->label : "* * *"); ctmpa->keymenu = cs->keymenu; ctmpa->help = cs->help.text; ctmpa->help_title = cs->help.title; ctmpa->tool = context_config_tool; ctmpa->flags |= CF_NOSELECT; ctmpa->valoffset = 8; /* Always add blank line, make's shuffling a little easier */ new_confline(&ctmpa); heading->headingp = ctmpa; /* use headingp to mark end */ ctmpa->keymenu = cs->keymenu; ctmpa->help = cs->help.text; ctmpa->help_title = cs->help.title; ctmpa->tool = context_config_tool; ctmpa->flags |= CF_NOSELECT | CF_B_LINE; ctmpa->valoffset = 0; } cs->starting_var = NULL; memset(&screen, 0, sizeof(screen)); screen.ro_warning = readonly_warning; ret = conf_scroll_screen(ps, &screen, first_line, cs->title, cs->print_string, 0); free_contexts(&top); if(ret) reinit_contexts++; /* * 15 means the tool wants us to reset and go again. The config var * has been changed. The contexts will be built again from the * config variable and the real contexts will be rebuilt below. * This is easier and safer than having the tools rebuild the context * list and the display correct. It's difficult to do because of all * the inheriting and defaulting going on. */ if(ret == 15){ if(edit_exceptions && !LVAL(fake_fspec, ew) && !LVAL(fake_nspec, ew)){ if(want_to(_("Really delete last exceptional collection"), 'n', 'n', h_config_context_del_except, WT_FLUSH_IN) != 'y'){ free_variable_values(fake_fspec); free_variable_values(fake_nspec); goto go_again; } } /* resolve variable changes */ if((lval1 && !equal_list_arrays(lval1, LVAL(fake_fspec, ew))) || (fake_fspec && !equal_list_arrays(ps->VAR_FOLDER_SPEC, LVAL(fake_fspec, ew)))){ i = set_variable_list(V_FOLDER_SPEC, LVAL(fake_fspec, ew), TRUE, ew); set_current_val(&ps->vars[V_FOLDER_SPEC], TRUE, FALSE); if(i) q_status_message(SM_ORDER, 3, 3, _("Trouble saving change, cancelled")); else if(!edit_exceptions && lval1 && !LVAL(fake_fspec, ew)){ cs->starting_var = fake_fspec; cs->starting_varmem = 0; q_status_message(SM_ORDER, 3, 3, _("Deleted last Folder-Collection, reverting to default")); } else if(!edit_exceptions && !lval1 && !LVAL(fake_fspec, ew)){ cs->starting_var = fake_fspec; cs->starting_varmem = 0; q_status_message(SM_ORDER, 3, 3, _("Deleted default Folder-Collection, reverting back to default")); } } if((lval2 && !equal_list_arrays(lval2, LVAL(fake_nspec, ew))) || (fake_nspec && !equal_list_arrays(ps->VAR_NEWS_SPEC, LVAL(fake_nspec, ew)))){ i = set_variable_list(V_NEWS_SPEC, LVAL(fake_nspec, ew), TRUE, ew); set_news_spec_current_val(TRUE, FALSE); if(i) q_status_message(SM_ORDER, 3, 3, _("Trouble saving change, cancelled")); else if(!edit_exceptions && lval2 && !LVAL(fake_nspec, ew) && ps->VAR_NEWS_SPEC && ps->VAR_NEWS_SPEC[0] && ps->VAR_NEWS_SPEC[0][0]){ cs->starting_var = fake_nspec; cs->starting_varmem = 0; q_status_message(SM_ORDER, 3, 3, _("Deleted last News-Collection, reverting to default")); } else if(!edit_exceptions && !lval2 && !LVAL(fake_nspec, ew) && ps->VAR_NEWS_SPEC && ps->VAR_NEWS_SPEC[0] && ps->VAR_NEWS_SPEC[0][0]){ cs->starting_var = fake_nspec; cs->starting_varmem = 0; q_status_message(SM_ORDER, 3, 3, _("Deleted default News-Collection, reverting back to default")); } } free_variable_values(fake_fspec); free_variable_values(fake_nspec); goto go_again; } ps->mangled_screen = 1; /* make the real context list match the changed config variables */ if(reinit_contexts){ free_contexts(&ps_global->context_list); init_folders(ps_global); } }