25 #include "dbus-transport-protected.h"
26 #include "dbus-transport-unix.h"
27 #include "dbus-transport-socket.h"
28 #include "dbus-connection-internal.h"
29 #include "dbus-watch.h"
30 #include "dbus-auth.h"
31 #include "dbus-address.h"
32 #include "dbus-credentials.h"
33 #include "dbus-mainloop.h"
34 #include "dbus-message.h"
35 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
36 #include "dbus-server-debug-pipe.h"
69 _dbus_verbose (
"Size counter value is now %d\n",
71 _dbus_verbose (
"Unix FD counter value is now %d\n",
164 transport->
vtable = vtable;
165 transport->
loader = loader;
166 transport->
auth = auth;
173 transport->
address = address_copy;
200 live_messages_notify,
204 _dbus_verbose (
"Initialized transport on address %s\n", transport->
address);
250 check_address (
const char *address,
DBusError *error)
261 for (i = 0; i < len; i++)
264 if (transport !=
NULL)
281 _dbus_transport_new_for_autolaunch (
const char *scope,
DBusError *error)
286 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
296 _DBUS_ASSERT_ERROR_IS_SET (error);
300 result = check_address (_dbus_string_get_const_data (&address), error);
302 _DBUS_ASSERT_ERROR_IS_SET (error);
304 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
311 static DBusTransportOpenResult
321 if (strcmp (method,
"autolaunch") == 0)
325 *transport_p = _dbus_transport_new_for_autolaunch (scope, error);
327 if (*transport_p ==
NULL)
329 _DBUS_ASSERT_ERROR_IS_SET (error);
330 return DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT;
334 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
335 return DBUS_TRANSPORT_OPEN_OK;
340 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
341 return DBUS_TRANSPORT_OPEN_NOT_HANDLED;
345 static const struct {
352 { _dbus_transport_open_autolaunch }
353 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
354 , { _dbus_transport_open_debug_pipe }
371 const char *expected_guid_orig;
376 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
382 if (expected_guid_orig !=
NULL && expected_guid ==
NULL)
384 _DBUS_SET_OOM (error);
390 DBusTransportOpenResult result;
392 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
393 result = (* open_funcs[i].func) (entry, &transport, &tmp_error);
397 case DBUS_TRANSPORT_OPEN_OK:
398 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
401 case DBUS_TRANSPORT_OPEN_NOT_HANDLED:
402 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
405 case DBUS_TRANSPORT_OPEN_BAD_ADDRESS:
406 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
409 case DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT:
410 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
418 if (transport ==
NULL)
423 "Unknown address type (examples of valid types are \"tcp\" and on UNIX \"unix\")");
425 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
431 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
485 _dbus_verbose (
"finalizing\n");
504 _dbus_verbose (
"start\n");
515 _dbus_verbose (
"end\n");
539 void *unix_user_data;
552 _dbus_verbose (
"unlock\n");
555 allow = (* unix_user_function) (connection,
559 _dbus_verbose (
"lock post unix user function\n");
569 " was rejected, disconnecting\n",
584 void *windows_user_data;
597 if (windows_sid ==
NULL)
603 _dbus_verbose (
"unlock\n");
606 allow = (* windows_user_function) (connection,
610 _dbus_verbose (
"lock post windows user function\n");
615 _dbus_verbose (
"Client SID '%s' authorized\n", windows_sid);
619 _dbus_verbose (
"Client SID '%s' was rejected, disconnecting\n",
642 if (our_identity ==
NULL)
654 _dbus_verbose (
"Client authorized as SID '%s'"
655 "matching our SID '%s'\n",
669 _dbus_verbose (
"Client authorized as SID '%s'"
670 " but our SID is '%s', disconnecting\n",
676 _dbus_verbose (
"Client authorized as UID "DBUS_UID_FORMAT
677 " but our UID is "DBUS_UID_FORMAT
", disconnecting\n",
738 maybe_authenticated =
742 if (maybe_authenticated)
746 case DBUS_AUTH_STATE_AUTHENTICATED:
750 maybe_authenticated =
FALSE;
756 if (maybe_authenticated && !transport->
is_server)
758 const char *server_guid;
766 _dbus_verbose (
"Client expected GUID '%s' and we got '%s' from the server\n",
776 if (maybe_authenticated && transport->
is_server)
791 allow = auth_via_unix_user_function (transport);
796 allow = auth_via_windows_user_function (transport);
800 allow = auth_via_default_rules (transport);
804 maybe_authenticated =
FALSE;
810 return maybe_authenticated;
845 return DBUS_TRANSPORT_CAN_SEND_UNIX_FD(transport);
891 unsigned int condition)
986 int timeout_milliseconds)
990 _dbus_verbose (
"Transport iteration flags 0x%x timeout %d connected = %d\n",
993 if ((flags & (DBUS_ITERATION_DO_WRITING |
994 DBUS_ITERATION_DO_READING)) == 0)
1002 timeout_milliseconds);
1005 _dbus_verbose (
"end\n");
1025 encoded, &plaintext))
1034 orig_len = _dbus_string_get_length (buffer);
1043 _dbus_verbose (
" %d unused bytes sent to message loader\n",
1044 _dbus_string_get_length (buffer) -
1064 orig_len = _dbus_string_get_length (buffer);
1073 _dbus_verbose (
" %d unused bytes sent to message loader\n",
1074 _dbus_string_get_length (buffer) -
1089 _dbus_verbose (
"Not enough memory to transfer unused bytes from auth conversation\n");
1110 DBUS_AUTH_STATE_WAITING_FOR_MEMORY)
1117 !recover_unused_bytes (transport))
1145 _dbus_verbose (
"_dbus_transport_queue_messages()\n");
1157 message = link->
data;
1159 _dbus_verbose (
"queueing received message %p\n", message);
1185 _dbus_verbose (
"Corrupted message stream, disconnecting\n");
1256 live_messages_notify,
1274 live_messages_notify,
1326 DBUS_CREDENTIAL_UNIX_USER_ID))
1359 DBUS_CREDENTIAL_UNIX_PROCESS_ID))
1392 DBUS_CREDENTIAL_ADT_AUDIT_DATA_ID))
1437 char **windows_sid_p)
1441 *windows_sid_p =
NULL;
1449 DBUS_CREDENTIAL_WINDOWS_SID))
1497 const char **mechanisms)
1515 #ifdef DBUS_ENABLE_STATS
1518 dbus_uint32_t *queue_bytes,
1519 dbus_uint32_t *queue_fds,
1520 dbus_uint32_t *peak_queue_bytes,
1521 dbus_uint32_t *peak_queue_fds)
1523 if (queue_bytes !=
NULL)
1526 if (queue_fds !=
NULL)
1529 if (peak_queue_bytes !=
NULL)
1530 *peak_queue_bytes = _dbus_counter_get_peak_size_value (transport->
live_messages);
1532 if (peak_queue_fds !=
NULL)
1533 *peak_queue_fds = _dbus_counter_get_peak_unix_fd_value (transport->
live_messages);