2003-02-18 Joe Shaw <joe@assbarn.com>

* dbus/dbus-auth.c (handle_server_data_stupid_test_mech): Just get
	credentials from our currently running process.
	(get_word): Fix a buglet where we were copying the entire length
	instead of relative to our position.

	* dbus/dbus-hash.c (_dbus_hash_test): Don't try to allocate the
	keys on the stack... it's 640k of data.

	* dbus/dbus-sysdeps.c (_dbus_read_credentials_unix_socket): Always
	read the credentials byte off the socket, even if we don't have
	SO_PEERCRED.
	(_dbus_poll): Implement poll() using select() for systems which
	don't have it.

	* glib/test-dbus-glib.c (main): Print out an error if no
	parameters are given.

	* test/data/auth/fallback.auth-script: Added.  Tests that a client
	can fallback to a secondary auth mechanism if the first fails.
This commit is contained in:
Joe Shaw 2003-02-18 22:51:35 +00:00
parent 9e1b2fe28e
commit 9ada6e2cad
7 changed files with 165 additions and 44 deletions

View file

@ -2,4 +2,5 @@ Anders Carlsson <andersca@codefactory.se>
Alex Larsson <alexl@redhat.com>
Havoc Pennington <hp@redhat.com>
Harri Porten <porten@kde.org>
Zack Rusin <zack@kde.org>
Zack Rusin <zack@kde.org>
Joe Shaw <joe@assbarn.com>

View file

@ -1,3 +1,25 @@
2003-02-18 Joe Shaw <joe@assbarn.com>
* dbus/dbus-auth.c (handle_server_data_stupid_test_mech): Just get
credentials from our currently running process.
(get_word): Fix a buglet where we were copying the entire length
instead of relative to our position.
* dbus/dbus-hash.c (_dbus_hash_test): Don't try to allocate the
keys on the stack... it's 640k of data.
* dbus/dbus-sysdeps.c (_dbus_read_credentials_unix_socket): Always
read the credentials byte off the socket, even if we don't have
SO_PEERCRED.
(_dbus_poll): Implement poll() using select() for systems which
don't have it.
* glib/test-dbus-glib.c (main): Print out an error if no
parameters are given.
* test/data/auth/fallback.auth-script: Added. Tests that a client
can fallback to a secondary auth mechanism if the first fails.
2003-02-18 Havoc Pennington <hp@pobox.com>
* AUTHORS: add Alex

View file

@ -321,6 +321,8 @@ handle_server_data_stupid_test_mech (DBusAuth *auth,
"OK\r\n"))
return FALSE;
_dbus_credentials_from_current_process (&auth->authorized_identity);
auth->authenticated_pending_begin = TRUE;
return TRUE;
@ -799,7 +801,7 @@ get_word (const DBusString *str,
if (i > *start)
{
if (!_dbus_string_copy_len (str, *start, i, word, 0))
if (!_dbus_string_copy_len (str, *start, i - *start, word, 0))
return FALSE;
*start = i;

View file

@ -1318,7 +1318,20 @@ _dbus_hash_test (void)
DBusHashTable *table2;
DBusHashIter iter;
#define N_HASH_KEYS 5000
char keys[N_HASH_KEYS][128];
char **keys;
dbus_bool_t ret = FALSE;
keys = dbus_new (char *, N_HASH_KEYS);
if (keys == NULL)
_dbus_assert_not_reached ("no memory");
for (i = 0; i < N_HASH_KEYS; i++)
{
keys[i] = dbus_malloc (128);
if (keys[i] == NULL)
_dbus_assert_not_reached ("no memory");
}
printf ("Computing test hash keys...\n");
i = 0;
@ -1332,12 +1345,12 @@ _dbus_hash_test (void)
table1 = _dbus_hash_table_new (DBUS_HASH_STRING,
dbus_free, dbus_free);
if (table1 == NULL)
return FALSE;
goto out;
table2 = _dbus_hash_table_new (DBUS_HASH_INT,
NULL, dbus_free);
if (table2 == NULL)
return FALSE;
goto out;
/* Insert and remove a bunch of stuff, counting the table in between
* to be sure it's not broken and that iteration works
@ -1350,22 +1363,22 @@ _dbus_hash_test (void)
key = _dbus_strdup (keys[i]);
if (key == NULL)
return FALSE;
goto out;
value = _dbus_strdup ("Value!");
if (value == NULL)
return FALSE;
goto out;
if (!_dbus_hash_table_insert_string (table1,
key, value))
return FALSE;
goto out;
value = _dbus_strdup (keys[i]);
if (value == NULL)
return FALSE;
goto out;
if (!_dbus_hash_table_insert_int (table2,
i, value))
return FALSE;
goto out;
_dbus_assert (count_entries (table1) == i + 1);
_dbus_assert (count_entries (table2) == i + 1);
@ -1410,12 +1423,12 @@ _dbus_hash_test (void)
table1 = _dbus_hash_table_new (DBUS_HASH_STRING,
dbus_free, dbus_free);
if (table1 == NULL)
return FALSE;
goto out;
table2 = _dbus_hash_table_new (DBUS_HASH_INT,
NULL, dbus_free);
if (table2 == NULL)
return FALSE;
goto out;
i = 0;
while (i < 5000)
@ -1425,22 +1438,22 @@ _dbus_hash_test (void)
key = _dbus_strdup (keys[i]);
if (key == NULL)
return FALSE;
goto out;
value = _dbus_strdup ("Value!");
if (value == NULL)
return FALSE;
goto out;
if (!_dbus_hash_table_insert_string (table1,
key, value))
return FALSE;
goto out;
value = _dbus_strdup (keys[i]);
if (value == NULL)
return FALSE;
goto out;
if (!_dbus_hash_table_insert_int (table2,
i, value))
return FALSE;
goto out;
_dbus_assert (count_entries (table1) == i + 1);
_dbus_assert (count_entries (table2) == i + 1);
@ -1461,7 +1474,7 @@ _dbus_hash_test (void)
value = _dbus_strdup ("Different value!");
if (value == NULL)
return FALSE;
goto out;
_dbus_hash_iter_set_value (&iter, value);
@ -1489,7 +1502,7 @@ _dbus_hash_test (void)
value = _dbus_strdup ("Different value!");
if (value == NULL)
return FALSE;
goto out;
_dbus_hash_iter_set_value (&iter, value);
@ -1516,15 +1529,15 @@ _dbus_hash_test (void)
key = _dbus_strdup (keys[i]);
if (key == NULL)
return FALSE;
goto out;
value = _dbus_strdup ("Value!");
if (value == NULL)
return FALSE;
goto out;
if (!_dbus_hash_table_insert_string (table1,
key, value))
return FALSE;
goto out;
++i;
}
@ -1537,20 +1550,20 @@ _dbus_hash_test (void)
key = _dbus_strdup (keys[i]);
if (key == NULL)
return FALSE;
goto out;
value = _dbus_strdup ("Value!");
if (value == NULL)
return FALSE;
goto out;
if (!_dbus_hash_table_remove_string (table1, keys[i]))
return FALSE;
goto out;
if (!_dbus_hash_table_insert_string (table1,
key, value))
return FALSE;
goto out;
if (!_dbus_hash_table_remove_string (table1, keys[i]))
return FALSE;
goto out;
_dbus_assert (_dbus_hash_table_get_n_entries (table1) == i);
@ -1568,12 +1581,12 @@ _dbus_hash_test (void)
table1 = _dbus_hash_table_new (DBUS_HASH_STRING,
dbus_free, dbus_free);
if (table1 == NULL)
return FALSE;
goto out;
table2 = _dbus_hash_table_new (DBUS_HASH_INT,
NULL, dbus_free);
if (table2 == NULL)
return FALSE;
goto out;
i = 0;
while (i < 3000)
@ -1583,24 +1596,24 @@ _dbus_hash_test (void)
key = _dbus_strdup (keys[i]);
if (key == NULL)
return FALSE;
goto out;
value = _dbus_strdup ("Value!");
if (value == NULL)
return FALSE;
goto out;
if (!_dbus_hash_iter_lookup (table1,
key, TRUE, &iter))
return FALSE;
goto out;
_dbus_assert (_dbus_hash_iter_get_value (&iter) == NULL);
_dbus_hash_iter_set_value (&iter, value);
value = _dbus_strdup (keys[i]);
if (value == NULL)
return FALSE;
goto out;
if (!_dbus_hash_iter_lookup (table2,
_DBUS_INT_TO_POINTER (i), TRUE, &iter))
return FALSE;
goto out;
_dbus_assert (_dbus_hash_iter_get_value (&iter) == NULL);
_dbus_hash_iter_set_value (&iter, value);
@ -1608,7 +1621,7 @@ _dbus_hash_test (void)
_dbus_assert (count_entries (table2) == i + 1);
if (!_dbus_hash_iter_lookup (table1, keys[i], FALSE, &iter))
return FALSE;
goto out;
value = _dbus_hash_iter_get_value (&iter);
_dbus_assert (value != NULL);
@ -1621,7 +1634,7 @@ _dbus_hash_test (void)
;
if (!_dbus_hash_iter_lookup (table2, _DBUS_INT_TO_POINTER (i), FALSE, &iter))
return FALSE;
goto out;
value = _dbus_hash_iter_get_value (&iter);
_dbus_assert (value != NULL);
@ -1656,8 +1669,15 @@ _dbus_hash_test (void)
_dbus_hash_table_unref (table1);
_dbus_hash_table_unref (table2);
ret = TRUE;
out:
for (i = 0; i < N_HASH_KEYS; i++)
dbus_free (keys[i]);
dbus_free (keys);
return TRUE;
return ret;
}
#endif /* DBUS_BUILD_TESTS */

View file

@ -503,9 +503,9 @@ _dbus_read_credentials_unix_socket (int client_fd,
credentials->uid = -1;
credentials->gid = -1;
#ifdef SO_PEERCRED
if (read_credentials_byte (client_fd, result))
{
#ifdef SO_PEERCRED
struct ucred cr;
int cr_len = sizeof (cr);
@ -525,15 +525,14 @@ _dbus_read_credentials_unix_socket (int client_fd,
_dbus_verbose ("Failed to getsockopt() credentials, returned len %d/%d: %s\n",
cr_len, (int) sizeof (cr), _dbus_strerror (errno));
}
#else /* !SO_PEERCRED */
_dbus_verbose ("Socket credentials not supported on this OS\n");
#endif
return TRUE;
}
else
return FALSE;
#else /* !SO_PEERCRED */
_dbus_verbose ("Socket credentials not supported on this OS\n");
return TRUE;
#endif
}
/**
@ -1052,8 +1051,57 @@ _dbus_poll (DBusPollFD *fds,
return -1;
}
#else /* ! HAVE_POLL */
_dbus_warn ("need to implement select() fallback for systems with no poll()\n");
return -1;
fd_set read_set, write_set, err_set;
int max_fd;
int i;
struct timeval tv;
int ready;
FD_ZERO (&read_set);
FD_ZERO (&write_set);
FD_ZERO (&err_set);
for (i = 0; i < n_fds; i++)
{
DBusPollFD f = fds[i];
if (f.events & _DBUS_POLLIN)
FD_SET (f.fd, &read_set);
if (f.events & _DBUS_POLLOUT)
FD_SET (f.fd, &write_set);
FD_SET (f.fd, &err_set);
max_fd = MAX (max_fd, f.fd);
}
tv.tv_sec = timeout_milliseconds / 1000;
tv.tv_usec = (timeout_milliseconds % 1000) * 1000;
ready = select (max_fd + 1, &read_set, &write_set, &err_set, &tv);
if (ready > 0)
{
for (i = 0; i < n_fds; i++)
{
DBusPollFD f = fds[i];
f.revents = 0;
if (FD_ISSET (f.fd, &read_set))
f.revents |= _DBUS_POLLIN;
if (FD_ISSET (f.fd, &write_set))
f.revents |= _DBUS_POLLOUT;
if (FD_ISSET (f.fd, &err_set))
f.revents |= _DBUS_POLLERR;
}
}
return ready;
#endif
}

View file

@ -1,3 +1,4 @@
/* -*- mode: C; c-file-style: "gnu" -*- */
#include "dbus-glib.h"
#include <stdio.h>
@ -10,6 +11,12 @@ main (int argc, char **argv)
GMainLoop *loop;
if (argc < 2)
{
fprintf (stderr, "Give the server address as an argument\n");
return 1;
}
loop = g_main_loop_new (NULL, FALSE);
connection = dbus_connection_open (argv[1], &result);

View file

@ -0,0 +1,21 @@
## this tests that a client can fallback to a secondary auth mech
CLIENT
## Will try EXTERNAL by default first without first calling AUTH alone.
EXPECT_COMMAND AUTH
SEND 'REJECTED EXTERNAL DBUS_STUPID_TEST_MECH'
## Will try EXTERNAL again.
EXPECT_COMMAND AUTH
SEND 'REJECTED EXTERNAL DBUS_STUPID_TEST_MECH'
## And this time we get DBUS_STUPID_TEST_MECH.
EXPECT_COMMAND AUTH
SEND 'OK'
EXPECT_COMMAND BEGIN
EXPECT_STATE AUTHENTICATED