113498266Sopenharmony_ci/*************************************************************************** 213498266Sopenharmony_ci * _ _ ____ _ 313498266Sopenharmony_ci * Project ___| | | | _ \| | 413498266Sopenharmony_ci * / __| | | | |_) | | 513498266Sopenharmony_ci * | (__| |_| | _ <| |___ 613498266Sopenharmony_ci * \___|\___/|_| \_\_____| 713498266Sopenharmony_ci * 813498266Sopenharmony_ci * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 913498266Sopenharmony_ci * 1013498266Sopenharmony_ci * This software is licensed as described in the file COPYING, which 1113498266Sopenharmony_ci * you should have received as part of this distribution. The terms 1213498266Sopenharmony_ci * are also available at https://curl.se/docs/copyright.html. 1313498266Sopenharmony_ci * 1413498266Sopenharmony_ci * You may opt to use, copy, modify, merge, publish, distribute and/or sell 1513498266Sopenharmony_ci * copies of the Software, and permit persons to whom the Software is 1613498266Sopenharmony_ci * furnished to do so, under the terms of the COPYING file. 1713498266Sopenharmony_ci * 1813498266Sopenharmony_ci * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 1913498266Sopenharmony_ci * KIND, either express or implied. 2013498266Sopenharmony_ci * 2113498266Sopenharmony_ci * SPDX-License-Identifier: curl 2213498266Sopenharmony_ci * 2313498266Sopenharmony_ci ***************************************************************************/ 2413498266Sopenharmony_ci/* argv1 = URL 2513498266Sopenharmony_ci * argv2 = main auth type 2613498266Sopenharmony_ci * argv3 = second auth type 2713498266Sopenharmony_ci */ 2813498266Sopenharmony_ci 2913498266Sopenharmony_ci#include "test.h" 3013498266Sopenharmony_ci#include "memdebug.h" 3113498266Sopenharmony_ci 3213498266Sopenharmony_cistatic CURLcode send_request(CURL *curl, const char *url, int seq, 3313498266Sopenharmony_ci long auth_scheme, const char *userpwd) 3413498266Sopenharmony_ci{ 3513498266Sopenharmony_ci CURLcode res; 3613498266Sopenharmony_ci size_t len = strlen(url) + 4 + 1; 3713498266Sopenharmony_ci char *full_url = malloc(len); 3813498266Sopenharmony_ci if(!full_url) { 3913498266Sopenharmony_ci fprintf(stderr, "Not enough memory for full url\n"); 4013498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 4113498266Sopenharmony_ci } 4213498266Sopenharmony_ci 4313498266Sopenharmony_ci msnprintf(full_url, len, "%s%04d", url, seq); 4413498266Sopenharmony_ci fprintf(stderr, "Sending new request %d to %s with credential %s " 4513498266Sopenharmony_ci "(auth %ld)\n", seq, full_url, userpwd, auth_scheme); 4613498266Sopenharmony_ci test_setopt(curl, CURLOPT_URL, full_url); 4713498266Sopenharmony_ci test_setopt(curl, CURLOPT_VERBOSE, 1L); 4813498266Sopenharmony_ci test_setopt(curl, CURLOPT_HEADER, 1L); 4913498266Sopenharmony_ci test_setopt(curl, CURLOPT_HTTPGET, 1L); 5013498266Sopenharmony_ci test_setopt(curl, CURLOPT_USERPWD, userpwd); 5113498266Sopenharmony_ci test_setopt(curl, CURLOPT_HTTPAUTH, auth_scheme); 5213498266Sopenharmony_ci 5313498266Sopenharmony_ci res = curl_easy_perform(curl); 5413498266Sopenharmony_ci 5513498266Sopenharmony_citest_cleanup: 5613498266Sopenharmony_ci free(full_url); 5713498266Sopenharmony_ci return res; 5813498266Sopenharmony_ci} 5913498266Sopenharmony_ci 6013498266Sopenharmony_cistatic CURLcode send_wrong_password(CURL *curl, const char *url, int seq, 6113498266Sopenharmony_ci long auth_scheme) 6213498266Sopenharmony_ci{ 6313498266Sopenharmony_ci return send_request(curl, url, seq, auth_scheme, "testuser:wrongpass"); 6413498266Sopenharmony_ci} 6513498266Sopenharmony_ci 6613498266Sopenharmony_cistatic CURLcode send_right_password(CURL *curl, const char *url, int seq, 6713498266Sopenharmony_ci long auth_scheme) 6813498266Sopenharmony_ci{ 6913498266Sopenharmony_ci return send_request(curl, url, seq, auth_scheme, "testuser:testpass"); 7013498266Sopenharmony_ci} 7113498266Sopenharmony_ci 7213498266Sopenharmony_cistatic long parse_auth_name(const char *arg) 7313498266Sopenharmony_ci{ 7413498266Sopenharmony_ci if(!arg) 7513498266Sopenharmony_ci return CURLAUTH_NONE; 7613498266Sopenharmony_ci if(curl_strequal(arg, "basic")) 7713498266Sopenharmony_ci return CURLAUTH_BASIC; 7813498266Sopenharmony_ci if(curl_strequal(arg, "digest")) 7913498266Sopenharmony_ci return CURLAUTH_DIGEST; 8013498266Sopenharmony_ci if(curl_strequal(arg, "ntlm")) 8113498266Sopenharmony_ci return CURLAUTH_NTLM; 8213498266Sopenharmony_ci return CURLAUTH_NONE; 8313498266Sopenharmony_ci} 8413498266Sopenharmony_ci 8513498266Sopenharmony_ciint test(char *url) 8613498266Sopenharmony_ci{ 8713498266Sopenharmony_ci CURLcode res; 8813498266Sopenharmony_ci CURL *curl = NULL; 8913498266Sopenharmony_ci 9013498266Sopenharmony_ci long main_auth_scheme = parse_auth_name(libtest_arg2); 9113498266Sopenharmony_ci long fallback_auth_scheme = parse_auth_name(libtest_arg3); 9213498266Sopenharmony_ci 9313498266Sopenharmony_ci if(main_auth_scheme == CURLAUTH_NONE || 9413498266Sopenharmony_ci fallback_auth_scheme == CURLAUTH_NONE) { 9513498266Sopenharmony_ci fprintf(stderr, "auth schemes not found on commandline\n"); 9613498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 9713498266Sopenharmony_ci } 9813498266Sopenharmony_ci 9913498266Sopenharmony_ci if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { 10013498266Sopenharmony_ci fprintf(stderr, "curl_global_init() failed\n"); 10113498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 10213498266Sopenharmony_ci } 10313498266Sopenharmony_ci 10413498266Sopenharmony_ci /* Send wrong password, then right password */ 10513498266Sopenharmony_ci 10613498266Sopenharmony_ci curl = curl_easy_init(); 10713498266Sopenharmony_ci if(!curl) { 10813498266Sopenharmony_ci fprintf(stderr, "curl_easy_init() failed\n"); 10913498266Sopenharmony_ci curl_global_cleanup(); 11013498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 11113498266Sopenharmony_ci } 11213498266Sopenharmony_ci 11313498266Sopenharmony_ci res = send_wrong_password(curl, url, 100, main_auth_scheme); 11413498266Sopenharmony_ci if(res != CURLE_OK) 11513498266Sopenharmony_ci goto test_cleanup; 11613498266Sopenharmony_ci 11713498266Sopenharmony_ci res = send_right_password(curl, url, 200, fallback_auth_scheme); 11813498266Sopenharmony_ci if(res != CURLE_OK) 11913498266Sopenharmony_ci goto test_cleanup; 12013498266Sopenharmony_ci 12113498266Sopenharmony_ci curl_easy_cleanup(curl); 12213498266Sopenharmony_ci 12313498266Sopenharmony_ci /* Send wrong password twice, then right password */ 12413498266Sopenharmony_ci curl = curl_easy_init(); 12513498266Sopenharmony_ci if(!curl) { 12613498266Sopenharmony_ci fprintf(stderr, "curl_easy_init() failed\n"); 12713498266Sopenharmony_ci curl_global_cleanup(); 12813498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 12913498266Sopenharmony_ci } 13013498266Sopenharmony_ci 13113498266Sopenharmony_ci res = send_wrong_password(curl, url, 300, main_auth_scheme); 13213498266Sopenharmony_ci if(res != CURLE_OK) 13313498266Sopenharmony_ci goto test_cleanup; 13413498266Sopenharmony_ci 13513498266Sopenharmony_ci res = send_wrong_password(curl, url, 400, fallback_auth_scheme); 13613498266Sopenharmony_ci if(res != CURLE_OK) 13713498266Sopenharmony_ci goto test_cleanup; 13813498266Sopenharmony_ci 13913498266Sopenharmony_ci res = send_right_password(curl, url, 500, fallback_auth_scheme); 14013498266Sopenharmony_ci if(res != CURLE_OK) 14113498266Sopenharmony_ci goto test_cleanup; 14213498266Sopenharmony_ci 14313498266Sopenharmony_citest_cleanup: 14413498266Sopenharmony_ci 14513498266Sopenharmony_ci curl_easy_cleanup(curl); 14613498266Sopenharmony_ci curl_global_cleanup(); 14713498266Sopenharmony_ci 14813498266Sopenharmony_ci return (int)res; 14913498266Sopenharmony_ci} 150