void ro_gui_401login_open(const char *url, const char *host, const char *realm, nserror (*cb)(bool proceed, void *pw), void *cbpw) { struct session_401 *session; wimp_w w; const char *auth; session = calloc(1, sizeof(struct session_401)); if (!session) { warn_user("NoMemory", 0); return; } session->url = strdup(url); if (!session->url) { free(session); warn_user("NoMemory", 0); return; } if (realm == NULL) realm = "Secure Area"; auth = urldb_get_auth_details(session->url, realm); if (auth == NULL) { session->uname[0] = '\0'; session->pwd[0] = '\0'; } else { const char *pwd; size_t pwd_len; pwd = strchr(auth, ':'); assert(pwd && pwd < auth + sizeof(session->uname)); memcpy(session->uname, auth, pwd - auth); session->uname[pwd - auth] = '\0'; ++pwd; pwd_len = strlen(pwd); assert(pwd_len < sizeof(session->pwd)); memcpy(session->pwd, pwd, pwd_len); session->pwd[pwd_len] = '\0'; } session->host = strdup(host); session->realm = strdup(realm); session->cb = cb; session->cbpw = cbpw; if ((!session->host) || (!session->realm)) { free(session->host); free(session->realm); free(session); warn_user("NoMemory", 0); return; } /* fill in download window icons */ dialog_401_template->icons[ICON_401LOGIN_HOST].data. indirected_text.text = session->host; dialog_401_template->icons[ICON_401LOGIN_HOST].data. indirected_text.size = strlen(session->host) + 1; dialog_401_template->icons[ICON_401LOGIN_REALM].data. indirected_text.text = session->realm; dialog_401_template->icons[ICON_401LOGIN_REALM].data. indirected_text.size = strlen(session->realm) + 1; dialog_401_template->icons[ICON_401LOGIN_USERNAME].data. indirected_text.text = session->uname; dialog_401_template->icons[ICON_401LOGIN_USERNAME].data. indirected_text.size = sizeof(session->uname); dialog_401_template->icons[ICON_401LOGIN_PASSWORD].data. indirected_text.text = session->pwd; dialog_401_template->icons[ICON_401LOGIN_PASSWORD].data. indirected_text.size = sizeof(session->pwd); /* create and open the window */ w = wimp_create_window(dialog_401_template); ro_gui_wimp_event_register_text_field(w, ICON_401LOGIN_USERNAME); ro_gui_wimp_event_register_text_field(w, ICON_401LOGIN_PASSWORD); ro_gui_wimp_event_register_cancel(w, ICON_401LOGIN_CANCEL); ro_gui_wimp_event_register_ok(w, ICON_401LOGIN_LOGIN, ro_gui_401login_apply); ro_gui_wimp_event_register_close_window(w, ro_gui_401login_close); ro_gui_wimp_event_set_user_data(w, session); ro_gui_dialog_open_persistent(NULL, w, false); }
/** * Set options specific for a fetch. * * \param f The fetch to set options on. * \return A curl result code. */ static CURLcode fetch_curl_set_options(struct curl_fetch_info *f) { CURLcode code; const char *auth; #undef SETOPT #define SETOPT(option, value) { \ code = curl_easy_setopt(f->curl_handle, option, value); \ if (code != CURLE_OK) \ return code; \ } SETOPT(CURLOPT_URL, nsurl_access(f->url)); SETOPT(CURLOPT_PRIVATE, f); SETOPT(CURLOPT_WRITEDATA, f); SETOPT(CURLOPT_WRITEHEADER, f); SETOPT(CURLOPT_PROGRESSDATA, f); SETOPT(CURLOPT_REFERER, fetch_get_referer_to_send(f->fetch_handle)); SETOPT(CURLOPT_HTTPHEADER, f->headers); if (f->post_urlenc) { SETOPT(CURLOPT_HTTPPOST, NULL); SETOPT(CURLOPT_HTTPGET, 0L); SETOPT(CURLOPT_POSTFIELDS, f->post_urlenc); } else if (f->post_multipart) { SETOPT(CURLOPT_POSTFIELDS, NULL); SETOPT(CURLOPT_HTTPGET, 0L); SETOPT(CURLOPT_HTTPPOST, f->post_multipart); } else { SETOPT(CURLOPT_POSTFIELDS, NULL); SETOPT(CURLOPT_HTTPPOST, NULL); SETOPT(CURLOPT_HTTPGET, 1L); } f->cookie_string = urldb_get_cookie(f->url, true); if (f->cookie_string) { SETOPT(CURLOPT_COOKIE, f->cookie_string); } else { SETOPT(CURLOPT_COOKIE, NULL); } if ((auth = urldb_get_auth_details(f->url, NULL)) != NULL) { SETOPT(CURLOPT_HTTPAUTH, CURLAUTH_ANY); SETOPT(CURLOPT_USERPWD, auth); } else { SETOPT(CURLOPT_USERPWD, NULL); } /* set up proxy options */ if (nsoption_bool(http_proxy) && (nsoption_charp(http_proxy_host) != NULL) && (strncmp(nsurl_access(f->url), "file:", 5) != 0)) { SETOPT(CURLOPT_PROXY, nsoption_charp(http_proxy_host)); SETOPT(CURLOPT_PROXYPORT, (long) nsoption_int(http_proxy_port)); #if LIBCURL_VERSION_NUM >= 0x071304 /* Added in 7.19.4 */ /* setup the omission list */ SETOPT(CURLOPT_NOPROXY, nsoption_charp(http_proxy_noproxy)); #endif if (nsoption_int(http_proxy_auth) != OPTION_HTTP_PROXY_AUTH_NONE) { SETOPT(CURLOPT_PROXYAUTH, nsoption_int(http_proxy_auth) == OPTION_HTTP_PROXY_AUTH_BASIC ? (long) CURLAUTH_BASIC : (long) CURLAUTH_NTLM); snprintf(fetch_proxy_userpwd, sizeof fetch_proxy_userpwd, "%s:%s", nsoption_charp(http_proxy_auth_user), nsoption_charp(http_proxy_auth_pass)); SETOPT(CURLOPT_PROXYUSERPWD, fetch_proxy_userpwd); } } else { SETOPT(CURLOPT_PROXY, NULL); } /* Disable SSL session ID caching, as some servers can't cope. */ SETOPT(CURLOPT_SSL_SESSIONID_CACHE, 0); if (urldb_get_cert_permissions(f->url)) { /* Disable certificate verification */ SETOPT(CURLOPT_SSL_VERIFYPEER, 0L); SETOPT(CURLOPT_SSL_VERIFYHOST, 0L); if (curl_with_openssl) { SETOPT(CURLOPT_SSL_CTX_FUNCTION, NULL); SETOPT(CURLOPT_SSL_CTX_DATA, NULL); } } else { /* do verification */ SETOPT(CURLOPT_SSL_VERIFYPEER, 1L); SETOPT(CURLOPT_SSL_VERIFYHOST, 2L); if (curl_with_openssl) { SETOPT(CURLOPT_SSL_CTX_FUNCTION, fetch_curl_sslctxfun); SETOPT(CURLOPT_SSL_CTX_DATA, f); } } return CURLE_OK; }