summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-02-13 02:33:32 +0000
committerHavoc Pennington <hp@redhat.com>2003-02-13 02:33:32 +0000
commitc9ea8fac502c6109713aa372c4c8cfafd0b86858 (patch)
treebf6440f13fdf3d49bdca498f829cc464f3f8669a
parent32dc75ee6b1bb06e8cc1b956e7d80b54f24b5df6 (diff)
2003-02-12 Havoc Pennington <hp@pobox.com>
* dbus/dbus-string.c (_dbus_string_pop_line): fix to also strip \r off of popped lines * dbus/dbus-auth.c (_dbus_auth_test): write code to run auth scripts * dbus/dbus-auth-script.c (_dbus_auth_script_run): when doing a SEND, append \r\n
-rw-r--r--ChangeLog11
-rw-r--r--dbus/dbus-auth-script.c22
-rw-r--r--dbus/dbus-auth.c131
-rw-r--r--dbus/dbus-string.c27
-rw-r--r--test/data/auth/invalid-command.auth-script7
-rw-r--r--test/data/auth/mechanisms.auth-script8
6 files changed, 195 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index c8ce5448..14ea9678 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2003-02-12 Havoc Pennington <hp@pobox.com>
+ * dbus/dbus-string.c (_dbus_string_pop_line): fix to also strip
+ \r off of popped lines
+
+ * dbus/dbus-auth.c (_dbus_auth_test): write code to run auth
+ scripts
+
+ * dbus/dbus-auth-script.c (_dbus_auth_script_run): when doing a
+ SEND, append \r\n
+
+2003-02-12 Havoc Pennington <hp@pobox.com>
+
* dbus/Makefile.am: remove break-loader from the build, since it
moved.
diff --git a/dbus/dbus-auth-script.c b/dbus/dbus-auth-script.c
index a9df6d90..6c5009a5 100644
--- a/dbus/dbus-auth-script.c
+++ b/dbus/dbus-auth-script.c
@@ -82,8 +82,6 @@ append_quoted_string (DBusString *dest,
++i;
}
- if (!_dbus_string_append_byte (dest, '\0'))
- return FALSE;
return TRUE;
}
@@ -280,6 +278,20 @@ _dbus_auth_script_run (const DBusString *filename)
goto out;
}
+ {
+ const char *s4;
+ _dbus_string_get_const_data (&to_send, &s4);
+ _dbus_verbose ("Sending '%s'\n", s4);
+ }
+
+ if (!_dbus_string_append (&to_send, "\r\n"))
+ {
+ _dbus_warn ("failed to append \r\n from line %d\n",
+ line_no);
+ _dbus_string_free (&to_send);
+ goto out;
+ }
+
if (!_dbus_auth_bytes_received (auth, &to_send))
{
_dbus_warn ("not enough memory to call bytes_received\n");
@@ -340,8 +352,8 @@ _dbus_auth_script_run (const DBusString *filename)
const char *s1, *s2;
_dbus_string_get_const_data (&line, &s1);
_dbus_string_get_const_data (&received, &s2);
- _dbus_warn ("expected command '%s' and got '%s' line %d\n",
- s1, s2, line_no);
+ _dbus_warn ("line %d expected command '%s' and got '%s'\n",
+ line_no, s1, s2);
_dbus_string_free (&received);
goto out;
}
@@ -386,7 +398,7 @@ _dbus_auth_script_run (const DBusString *filename)
_dbus_auth_unref (auth);
_dbus_string_free (&file);
- _dbus_string_free (&file);
+ _dbus_string_free (&line);
_dbus_string_free (&from_auth);
return retval;
diff --git a/dbus/dbus-auth.c b/dbus/dbus-auth.c
index 697723b1..071e3416 100644
--- a/dbus/dbus-auth.c
+++ b/dbus/dbus-auth.c
@@ -1061,6 +1061,8 @@ process_command (DBusAuth *auth)
int i, j;
dbus_bool_t retval;
+ _dbus_verbose (" trying process_command()\n");
+
retval = FALSE;
eol = 0;
@@ -1596,12 +1598,141 @@ _dbus_auth_get_identity (DBusAuth *auth,
#ifdef DBUS_BUILD_TESTS
#include "dbus-test.h"
+#include "dbus-auth-script.h"
#include <stdio.h>
+static dbus_bool_t
+process_test_subdir (const DBusString *test_base_dir,
+ const char *subdir)
+{
+ DBusString test_directory;
+ DBusString filename;
+ DBusDirIter *dir;
+ dbus_bool_t retval;
+ DBusResultCode result;
+
+ retval = FALSE;
+ dir = NULL;
+
+ if (!_dbus_string_init (&test_directory, _DBUS_INT_MAX))
+ _dbus_assert_not_reached ("didn't allocate test_directory\n");
+
+ _dbus_string_init_const (&filename, subdir);
+
+ if (!_dbus_string_copy (test_base_dir, 0,
+ &test_directory, 0))
+ _dbus_assert_not_reached ("couldn't copy test_base_dir to test_directory");
+
+ if (!_dbus_concat_dir_and_file (&test_directory, &filename))
+ _dbus_assert_not_reached ("couldn't allocate full path");
+
+ _dbus_string_free (&filename);
+ if (!_dbus_string_init (&filename, _DBUS_INT_MAX))
+ _dbus_assert_not_reached ("didn't allocate filename string\n");
+
+ dir = _dbus_directory_open (&test_directory, &result);
+ if (dir == NULL)
+ {
+ const char *s;
+ _dbus_string_get_const_data (&test_directory, &s);
+ _dbus_warn ("Could not open %s: %s\n", s,
+ dbus_result_to_string (result));
+ goto failed;
+ }
+
+ printf ("Testing:\n");
+
+ result = DBUS_RESULT_SUCCESS;
+ next:
+ while (_dbus_directory_get_next_file (dir, &filename, &result))
+ {
+ DBusString full_path;
+
+ if (!_dbus_string_init (&full_path, _DBUS_INT_MAX))
+ _dbus_assert_not_reached ("couldn't init string");
+
+ if (!_dbus_string_copy (&test_directory, 0, &full_path, 0))
+ _dbus_assert_not_reached ("couldn't copy dir to full_path");
+
+ if (!_dbus_concat_dir_and_file (&full_path, &filename))
+ _dbus_assert_not_reached ("couldn't concat file to dir");
+
+ if (!_dbus_string_ends_with_c_str (&filename, ".auth-script"))
+ {
+ const char *filename_c;
+ _dbus_string_get_const_data (&filename, &filename_c);
+ _dbus_verbose ("Skipping non-.auth-script file %s\n",
+ filename_c);
+ goto next;
+ }
+
+ {
+ const char *s;
+ _dbus_string_get_const_data (&filename, &s);
+ printf (" %s\n", s);
+ }
+
+ if (!_dbus_auth_script_run (&full_path))
+ {
+ _dbus_string_free (&full_path);
+ goto failed;
+ }
+ else
+ _dbus_string_free (&full_path);
+ }
+
+ if (result != DBUS_RESULT_SUCCESS)
+ {
+ const char *s;
+ _dbus_string_get_const_data (&test_directory, &s);
+ _dbus_warn ("Could not get next file in %s: %s\n",
+ s, dbus_result_to_string (result));
+ goto failed;
+ }
+
+ retval = TRUE;
+
+ failed:
+
+ if (dir)
+ _dbus_directory_close (dir);
+ _dbus_string_free (&test_directory);
+ _dbus_string_free (&filename);
+
+ return retval;
+}
+
+static dbus_bool_t
+process_test_dirs (const char *test_data_dir)
+{
+ DBusString test_directory;
+ dbus_bool_t retval;
+
+ retval = FALSE;
+
+ _dbus_string_init_const (&test_directory, test_data_dir);
+
+ if (!process_test_subdir (&test_directory, "auth"))
+ goto failed;
+
+ retval = TRUE;
+
+ failed:
+
+ _dbus_string_free (&test_directory);
+
+ return retval;
+}
+
dbus_bool_t
_dbus_auth_test (const char *test_data_dir)
{
+ if (test_data_dir == NULL)
+ return TRUE;
+
+ if (!process_test_dirs (test_data_dir))
+ return FALSE;
return TRUE;
}
diff --git a/dbus/dbus-string.c b/dbus/dbus-string.c
index ded726fa..daa4297d 100644
--- a/dbus/dbus-string.c
+++ b/dbus/dbus-string.c
@@ -1416,10 +1416,10 @@ _dbus_string_skip_blank (const DBusString *str,
}
/**
- * Assigns a newline-terminated line from the front of the string
- * to the given dest string. The dest string's previous contents are
- * deleted. If the source string contains no newline, moves the
- * entire source string to the dest string.
+ * Assigns a newline-terminated or \r\n-terminated line from the front
+ * of the string to the given dest string. The dest string's previous
+ * contents are deleted. If the source string contains no newline,
+ * moves the entire source string to the dest string.
*
* @param source the source string
* @param dest the destination string (contents are replaced)
@@ -1455,12 +1455,23 @@ _dbus_string_pop_line (DBusString *source,
return FALSE;
}
- /* dump the newline */
+ /* dump the newline and the \r if we have one */
if (have_newline)
{
+ dbus_bool_t have_cr;
+
_dbus_assert (_dbus_string_get_length (dest) > 0);
+
+ if (_dbus_string_get_length (dest) > 1 &&
+ _dbus_string_get_byte (dest,
+ _dbus_string_get_length (dest) - 2) == '\r')
+ have_cr = TRUE;
+ else
+ have_cr = FALSE;
+
_dbus_string_set_length (dest,
- _dbus_string_get_length (dest) - 1);
+ _dbus_string_get_length (dest) -
+ (have_cr ? 2 : 1));
}
return TRUE;
@@ -2542,6 +2553,10 @@ _dbus_string_test (void)
_dbus_assert_not_reached ("didn't find 'He'");
_dbus_assert (i == 0);
+ if (!_dbus_string_find (&str, 0, "Hello", &i))
+ _dbus_assert_not_reached ("didn't find 'Hello'");
+ _dbus_assert (i == 0);
+
if (!_dbus_string_find (&str, 0, "ello", &i))
_dbus_assert_not_reached ("didn't find 'ello'");
_dbus_assert (i == 1);
diff --git a/test/data/auth/invalid-command.auth-script b/test/data/auth/invalid-command.auth-script
new file mode 100644
index 00000000..c49cb8d3
--- /dev/null
+++ b/test/data/auth/invalid-command.auth-script
@@ -0,0 +1,7 @@
+## this tests that receiving a nonexistent command is handled properly
+## by a server
+
+SERVER
+SEND 'NONEXISTENT_COMMAND foo bar baz blah blah'
+EXPECT_COMMAND ERROR
+EXPECT_STATE WAITING_FOR_INPUT
diff --git a/test/data/auth/mechanisms.auth-script b/test/data/auth/mechanisms.auth-script
new file mode 100644
index 00000000..be447916
--- /dev/null
+++ b/test/data/auth/mechanisms.auth-script
@@ -0,0 +1,8 @@
+## this tests that the server sends a list of mechanisms
+## in response to blank AUTH
+
+SERVER
+SEND AUTH
+EXPECT_COMMAND REJECTED
+EXPECT_STATE WAITING_FOR_INPUT
+