@@ -180,6 +180,16 @@ test_get_user_pass_inline_creds(void **state)
180180
181181 reset_user_pass (& up );
182182
183+ /*FIXME: query_user_exec() called even though nothing queued */
184+ will_return (query_user_exec_builtin , true);
185+ /*FIXME: silently removes control characters but does not error out */
186+ assert_true (get_user_pass_cr (& up , "\t\n\t" , "UT" , flags , NULL ));
187+ assert_true (up .defined );
188+ assert_string_equal (up .username , "" );
189+ assert_string_equal (up .password , "" );
190+
191+ reset_user_pass (& up );
192+
183193 expect_string (query_user_exec_builtin , query_user [i ].prompt , "Enter UT Password:" );
184194 will_return (query_user_exec_builtin , "cpassword" );
185195 will_return (query_user_exec_builtin , true);
@@ -212,6 +222,25 @@ test_get_user_pass_inline_creds(void **state)
212222 assert_string_equal (up .password , "cpassword" );
213223}
214224
225+ /* NOTE: expect_assert_failure does not seem to work with MSVC */
226+ #ifndef _MSC_VER
227+ /* NOTE: leaks gc memory */
228+ static void
229+ test_get_user_pass_inline_creds_assertions (void * * state )
230+ {
231+ struct user_pass up = { 0 };
232+ reset_user_pass (& up );
233+ unsigned int flags = GET_USER_PASS_INLINE_CREDS ;
234+
235+ reset_user_pass (& up );
236+
237+ /*FIXME: query_user_exec() called even though nothing queued */
238+ /*FIXME? username error thrown very late in stdin handling */
239+ will_return (query_user_exec_builtin , true);
240+ expect_assert_failure (get_user_pass_cr (& up , "\nipassword\n" , "UT" , flags , NULL ));
241+ }
242+ #endif
243+
215244static void
216245test_get_user_pass_authfile_stdin (void * * state )
217246{
@@ -239,8 +268,39 @@ test_get_user_pass_authfile_stdin(void **state)
239268 assert_true (up .defined );
240269 assert_string_equal (up .username , "user" );
241270 assert_string_equal (up .password , "cpassword" );
271+
272+ reset_user_pass (& up );
273+
274+ flags |= GET_USER_PASS_PASSWORD_ONLY ;
275+ expect_string (query_user_exec_builtin , query_user [i ].prompt , "Enter UT Password:" );
276+ will_return (query_user_exec_builtin , "" );
277+ will_return (query_user_exec_builtin , true);
278+ /*FIXME? does not error out on empty password */
279+ assert_true (get_user_pass_cr (& up , "stdin" , "UT" , flags , NULL ));
280+ assert_true (up .defined );
281+ assert_string_equal (up .username , "user" );
282+ assert_string_equal (up .password , "" );
242283}
243284
285+ /* NOTE: expect_assert_failure does not seem to work with MSVC */
286+ #ifndef _MSC_VER
287+ /* NOTE: leaks gc memory */
288+ static void
289+ test_get_user_pass_authfile_stdin_assertions (void * * state )
290+ {
291+ struct user_pass up = { 0 };
292+ reset_user_pass (& up );
293+ unsigned int flags = 0 ;
294+
295+ expect_string (query_user_exec_builtin , query_user [i ].prompt , "Enter UT Username:" );
296+ expect_string (query_user_exec_builtin , query_user [i ].prompt , "Enter UT Password:" );
297+ will_return (query_user_exec_builtin , "" );
298+ will_return (query_user_exec_builtin , "cpassword" );
299+ will_return (query_user_exec_builtin , true);
300+ expect_assert_failure (get_user_pass_cr (& up , "stdin" , "UT" , flags , NULL ));
301+ }
302+ #endif
303+
244304static void
245305test_get_user_pass_authfile_file (void * * state )
246306{
@@ -260,6 +320,17 @@ test_get_user_pass_authfile_file(void **state)
260320
261321 reset_user_pass (& up );
262322
323+ openvpn_test_get_srcdir_dir (authfile , PATH_MAX , "input/appears_empty.txt" );
324+ /*FIXME: query_user_exec() called even though nothing queued */
325+ will_return (query_user_exec_builtin , true);
326+ /*FIXME? does not error out */
327+ assert_true (get_user_pass_cr (& up , authfile , "UT" , flags , NULL ));
328+ assert_true (up .defined );
329+ assert_string_equal (up .username , "" );
330+ assert_string_equal (up .password , "" );
331+
332+ reset_user_pass (& up );
333+
263334 openvpn_test_get_srcdir_dir (authfile , PATH_MAX , "input/user_only.txt" );
264335 expect_string (query_user_exec_builtin , query_user [i ].prompt , "Enter UT Password:" );
265336 will_return (query_user_exec_builtin , "cpassword" );
@@ -361,6 +432,29 @@ test_get_user_pass_static_challenge(void **state)
361432}
362433#endif /* ENABLE_MANAGEMENT */
363434
435+ /* NOTE: expect_assert_failure does not seem to work with MSVC */
436+ #ifndef _MSC_VER
437+ /* NOTE: leaks gc memory */
438+ static void
439+ test_get_user_pass_authfile_file_assertions (void * * state )
440+ {
441+ struct user_pass up = { 0 };
442+ reset_user_pass (& up );
443+ unsigned int flags = 0 ;
444+
445+ char authfile [PATH_MAX ] = { 0 };
446+
447+ openvpn_test_get_srcdir_dir (authfile , PATH_MAX , "input/empty.txt" );
448+ expect_assert_failure (get_user_pass_cr (& up , authfile , "UT" , flags , NULL ));
449+
450+ reset_user_pass (& up );
451+
452+ flags |= GET_USER_PASS_PASSWORD_ONLY ;
453+ openvpn_test_get_srcdir_dir (authfile , PATH_MAX , "input/empty.txt" );
454+ expect_assert_failure (get_user_pass_cr (& up , authfile , "UT" , flags , NULL ));
455+ }
456+ #endif /* ifndef _MSC_VER */
457+
364458const struct CMUnitTest user_pass_tests [] = {
365459 cmocka_unit_test (test_get_user_pass_defined ),
366460 cmocka_unit_test (test_get_user_pass_needok ),
@@ -371,6 +465,11 @@ const struct CMUnitTest user_pass_tests[] = {
371465 cmocka_unit_test (test_get_user_pass_dynamic_challenge ),
372466 cmocka_unit_test (test_get_user_pass_static_challenge ),
373467#endif /* ENABLE_MANAGEMENT */
468+ #ifndef _MSC_VER
469+ cmocka_unit_test (test_get_user_pass_inline_creds_assertions ),
470+ cmocka_unit_test (test_get_user_pass_authfile_stdin_assertions ),
471+ cmocka_unit_test (test_get_user_pass_authfile_file_assertions ),
472+ #endif
374473};
375474
376475int
0 commit comments