static int ui_write(UI *ui, UI_STRING *uis) { struct ui_data *ui_data = UI_get0_user_data(ui); struct ui_form_opt *opt; switch (UI_get_string_type(uis)) { case UIT_ERROR: ui_data->form.error = (char *)UI_get0_output_string(uis); break; case UIT_INFO: ui_data->form.message = (char *)UI_get0_output_string(uis); break; case UIT_PROMPT: opt = malloc(sizeof(*opt)); if (!opt) return 1; memset(opt, 0, sizeof(*opt)); opt->uis = uis; opt->opt.label = opt->opt.name = (char *)UI_get0_output_string(uis); if (UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO) opt->opt.type = OC_FORM_OPT_TEXT; else opt->opt.type = OC_FORM_OPT_PASSWORD; *(ui_data->last_opt) = &opt->opt; ui_data->last_opt = &opt->opt.next; break; default: fprintf(stderr, "Unhandled SSL UI request type %d\n", UI_get_string_type(uis)); return 0; } return 1; }
static int ui_read(UI *ui, UI_STRING *uis) { switch (UI_get_string_type(uis)) { case UIT_PROMPT: { char result[PEM_BUFSIZE]; const struct pem_password_cb_data *data = UI_method_get_ex_data(UI_get_method(ui), ui_method_data_index); int maxsize = UI_get_result_maxsize(uis); int len = data->cb(result, maxsize > PEM_BUFSIZE ? PEM_BUFSIZE : maxsize, data->rwflag, UI_get0_user_data(ui)); if (len <= 0) return len; if (UI_set_result(ui, uis, result) >= 0) return 1; return 0; } case UIT_VERIFY: case UIT_NONE: case UIT_BOOLEAN: case UIT_INFO: case UIT_ERROR: break; } return 1; }
NOEXPORT int pin_cb(UI *ui, UI_STRING *uis) { ui_data=UI_get0_user_data(ui); /* was: ui_data=UI_get_app_data(ui); */ if(!ui_data) { s_log(LOG_ERR, "INTERNAL ERROR: user data data pointer"); return 0; } if(!DialogBox(ghInst, TEXT("PassBox"), hwnd, (DLGPROC)pass_proc)) return 0; /* error */ UI_set_result(ui, uis, ui_data->pass); return 1; }
static int ui_write(UI *ui, UI_STRING *uis) { if (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD && UI_get0_user_data(ui)) { switch(UI_get_string_type(uis)) { case UIT_PROMPT: case UIT_VERIFY: { const char *password = (const char*) ((PW_CB_DATA *)UI_get0_user_data(ui))->password; if (password && password[0] != '\0') return 1; } default: break; } } return UI_method_get_writer(UI_OpenSSL())(ui, uis); }
static int ui_close(UI *ui) { struct ui_data *ui_data = UI_get0_user_data(ui); struct ui_form_opt *opt, *next_opt; opt = (struct ui_form_opt *)ui_data->form.opts; while (opt) { next_opt = (struct ui_form_opt *)opt->opt.next; if (opt->opt.value) free(opt->opt.value); free(opt); opt = next_opt; } free(ui_data); UI_add_user_data(ui, NULL); return 1; }
static int ui_flush(UI *ui) { struct ui_data *ui_data = UI_get0_user_data(ui); struct openconnect_info *vpninfo = ui_data->vpninfo; struct ui_form_opt *opt; int ret; ret = process_auth_form(vpninfo, &ui_data->form); if (ret) return 0; for (opt = (struct ui_form_opt *)ui_data->form.opts; opt; opt = (struct ui_form_opt *)opt->opt.next) { if (opt->opt.value && opt->uis) UI_set_result(ui, opt->uis, opt->opt.value); } return 1; }