]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
2003-02-18 Joe Shaw <joe@assbarn.com>
authorJoe Shaw <joeshaw@novell.com>
Tue, 18 Feb 2003 22:51:35 +0000 (22:51 +0000)
committerJoe Shaw <joeshaw@novell.com>
Tue, 18 Feb 2003 22:51:35 +0000 (22:51 +0000)
* 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.

AUTHORS
ChangeLog
dbus/dbus-auth.c
dbus/dbus-hash.c
dbus/dbus-sysdeps.c
glib/test-dbus-glib.c
test/data/auth/fallback.auth-script [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index 2433009c22adf3e84c6e0d26985a78ccdb5a62bf..649a1703aac77075556135c0ee3a11b4d1ae9354 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -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>
\ No newline at end of file
+Zack Rusin <zack@kde.org>
+Joe Shaw <joe@assbarn.com>
\ No newline at end of file
index 7a0b1f11b78dbd8a82bbc7c2945ac66104da7d0c..7e41a82e9fb590bbca4caf1d41ff2726babb7256 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index dca83ba31f32a46bef457a8b26e6220810327da5..c4e1c5e85056f46bc7f5df7d11b5d83301cc67cb 100644 (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;
index d7791d2ac880009f5534e5e49e577a94db96ead5..a53c5020357fbe6bfaf4c1a5b7c43e2d074ea59b 100644 (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 */
index 1308a6babeaeb54814d43f4a4f54dba2fd55e919..f76c6bd013ce186efd5033285164819f53733ea6 100644 (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
 }
 
index 085e856c2a9947d45bca255727b936909e270326..b1ca2d3cd22e8e1e7b80fca51440cc45d86060c3 100644 (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);
diff --git a/test/data/auth/fallback.auth-script b/test/data/auth/fallback.auth-script
new file mode 100644 (file)
index 0000000..1b8c40f
--- /dev/null
@@ -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