1 /***************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
9  *
10  * This software is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution. The terms
12  * are also available at https://curl.se/docs/copyright.html.
13  *
14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15  * copies of the Software, and permit persons to whom the Software is
16  * furnished to do so, under the terms of the COPYING file.
17  *
18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19  * KIND, either express or implied.
20  *
21  ***************************************************************************/
22 #include "curlcheck.h"
23 #include "netrc.h"
24 #include "memdebug.h" /* LAST include file */
25 
26 static char *login;
27 static char *password;
28 static char filename[64];
29 
unit_setup(void)30 static CURLcode unit_setup(void)
31 {
32   password = strdup("");
33   login = strdup("");
34   if(!password || !login) {
35     Curl_safefree(password);
36     Curl_safefree(login);
37     return CURLE_OUT_OF_MEMORY;
38   }
39   return CURLE_OK;
40 }
41 
unit_stop(void)42 static void unit_stop(void)
43 {
44   Curl_safefree(password);
45   Curl_safefree(login);
46 }
47 
48 UNITTEST_START
49   int result;
50   bool login_changed;
51   bool password_changed;
52 
53   static const char * const filename1 = "log/netrc1304";
54   memcpy(filename, filename1, strlen(filename1));
55 
56   /*
57    * Test a non existent host in our netrc file.
58    */
59   result = Curl_parsenetrc("test.example.com", &login, &password,
60              &login_changed, &password_changed, filename);
61   fail_unless(result == 1, "Host not found should return 1");
62   abort_unless(password != NULL, "returned NULL!");
63   fail_unless(password[0] == 0, "password should not have been changed");
64   abort_unless(login != NULL, "returned NULL!");
65   fail_unless(login[0] == 0, "login should not have been changed");
66 
67   /*
68    * Test a non existent login in our netrc file.
69    */
70   free(login);
71   login = strdup("me");
72   abort_unless(login != NULL, "returned NULL!");
73   result = Curl_parsenetrc("example.com", &login, &password,
74              &login_changed, &password_changed, filename);
75   fail_unless(result == 0, "Host should have been found");
76   abort_unless(password != NULL, "returned NULL!");
77   fail_unless(password[0] == 0, "password should not have been changed");
78   fail_unless(!password_changed, "password should not have been changed");
79   abort_unless(login != NULL, "returned NULL!");
80   fail_unless(strncmp(login, "me", 2) == 0,
81               "login should not have been changed");
82   fail_unless(!login_changed, "login should not have been changed");
83 
84   /*
85    * Test a non existent login and host in our netrc file.
86    */
87   free(login);
88   login = strdup("me");
89   abort_unless(login != NULL, "returned NULL!");
90   result = Curl_parsenetrc("test.example.com", &login, &password,
91              &login_changed, &password_changed, filename);
92   fail_unless(result == 1, "Host not found should return 1");
93   abort_unless(password != NULL, "returned NULL!");
94   fail_unless(password[0] == 0, "password should not have been changed");
95   abort_unless(login != NULL, "returned NULL!");
96   fail_unless(strncmp(login, "me", 2) == 0,
97               "login should not have been changed");
98 
99   /*
100    * Test a non existent login (substring of an existing one) in our
101    * netrc file.
102    */
103   free(login);
104   login = strdup("admi");
105   abort_unless(login != NULL, "returned NULL!");
106   result = Curl_parsenetrc("example.com", &login, &password,
107              &login_changed, &password_changed, filename);
108   fail_unless(result == 0, "Host should have been found");
109   abort_unless(password != NULL, "returned NULL!");
110   fail_unless(password[0] == 0, "password should not have been changed");
111   fail_unless(!password_changed, "password should not have been changed");
112   abort_unless(login != NULL, "returned NULL!");
113   fail_unless(strncmp(login, "admi", 4) == 0,
114               "login should not have been changed");
115   fail_unless(!login_changed, "login should not have been changed");
116 
117   /*
118    * Test a non existent login (superstring of an existing one)
119    * in our netrc file.
120    */
121   free(login);
122   login = strdup("adminn");
123   abort_unless(login != NULL, "returned NULL!");
124   result = Curl_parsenetrc("example.com", &login, &password,
125              &login_changed, &password_changed, filename);
126   fail_unless(result == 0, "Host should have been found");
127   abort_unless(password != NULL, "returned NULL!");
128   fail_unless(password[0] == 0, "password should not have been changed");
129   fail_unless(!password_changed, "password should not have been changed");
130   abort_unless(login != NULL, "returned NULL!");
131   fail_unless(strncmp(login, "adminn", 6) == 0,
132               "login should not have been changed");
133   fail_unless(!login_changed, "login should not have been changed");
134 
135   /*
136    * Test for the first existing host in our netrc file
137    * with login[0] = 0.
138    */
139   free(login);
140   login = strdup("");
141   abort_unless(login != NULL, "returned NULL!");
142   result = Curl_parsenetrc("example.com", &login, &password,
143              &login_changed, &password_changed, filename);
144   fail_unless(result == 0, "Host should have been found");
145   abort_unless(password != NULL, "returned NULL!");
146   fail_unless(strncmp(password, "passwd", 6) == 0,
147               "password should be 'passwd'");
148   fail_unless(password_changed, "password should have been changed");
149   abort_unless(login != NULL, "returned NULL!");
150   fail_unless(strncmp(login, "admin", 5) == 0, "login should be 'admin'");
151   fail_unless(login_changed, "login should have been changed");
152 
153   /*
154    * Test for the first existing host in our netrc file
155    * with login[0] != 0.
156    */
157   free(password);
158   password = strdup("");
159   abort_unless(password != NULL, "returned NULL!");
160   result = Curl_parsenetrc("example.com", &login, &password,
161              &login_changed, &password_changed, filename);
162   fail_unless(result == 0, "Host should have been found");
163   abort_unless(password != NULL, "returned NULL!");
164   fail_unless(strncmp(password, "passwd", 6) == 0,
165               "password should be 'passwd'");
166   fail_unless(password_changed, "password should have been changed");
167   abort_unless(login != NULL, "returned NULL!");
168   fail_unless(strncmp(login, "admin", 5) == 0, "login should be 'admin'");
169   fail_unless(!login_changed, "login should not have been changed");
170 
171   /*
172    * Test for the second existing host in our netrc file
173    * with login[0] = 0.
174    */
175   free(password);
176   password = strdup("");
177   abort_unless(password != NULL, "returned NULL!");
178   free(login);
179   login = strdup("");
180   abort_unless(login != NULL, "returned NULL!");
181   result = Curl_parsenetrc("curl.example.com", &login, &password,
182              &login_changed, &password_changed, filename);
183   fail_unless(result == 0, "Host should have been found");
184   abort_unless(password != NULL, "returned NULL!");
185   fail_unless(strncmp(password, "none", 4) == 0,
186               "password should be 'none'");
187   fail_unless(password_changed, "password should have been changed");
188   abort_unless(login != NULL, "returned NULL!");
189   fail_unless(strncmp(login, "none", 4) == 0, "login should be 'none'");
190   fail_unless(login_changed, "login should have been changed");
191 
192   /*
193    * Test for the second existing host in our netrc file
194    * with login[0] != 0.
195    */
196   free(password);
197   password = strdup("");
198   abort_unless(password != NULL, "returned NULL!");
199   result = Curl_parsenetrc("curl.example.com", &login, &password,
200              &login_changed, &password_changed, filename);
201   fail_unless(result == 0, "Host should have been found");
202   abort_unless(password != NULL, "returned NULL!");
203   fail_unless(strncmp(password, "none", 4) == 0,
204               "password should be 'none'");
205   fail_unless(password_changed, "password should have been changed");
206   abort_unless(login != NULL, "returned NULL!");
207   fail_unless(strncmp(login, "none", 4) == 0, "login should be 'none'");
208   fail_unless(!login_changed, "login should not have been changed");
209 
210 UNITTEST_STOP
211