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_BUILD_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);
249 check_address (
const char *address,
DBusError *error)
261 for (i = 0; i < len; i++)
264 if (transport !=
NULL)
280 _dbus_transport_new_for_autolaunch (
const char *scope,
DBusError *error)
285 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
295 _DBUS_ASSERT_ERROR_IS_SET (error);
299 result = check_address (_dbus_string_get_const_data (&address), error);
301 _DBUS_ASSERT_ERROR_IS_SET (error);
303 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
310 static DBusTransportOpenResult
320 if (strcmp (method,
"autolaunch") == 0)
324 *transport_p = _dbus_transport_new_for_autolaunch (scope, error);
326 if (*transport_p ==
NULL)
328 _DBUS_ASSERT_ERROR_IS_SET (error);
329 return DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT;
333 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
334 return DBUS_TRANSPORT_OPEN_OK;
339 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
340 return DBUS_TRANSPORT_OPEN_NOT_HANDLED;
344 static const struct {
351 { _dbus_transport_open_autolaunch }
352 #ifdef DBUS_BUILD_TESTS
353 , { _dbus_transport_open_debug_pipe }
370 const char *expected_guid_orig;
375 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
381 if (expected_guid_orig !=
NULL && expected_guid ==
NULL)
383 _DBUS_SET_OOM (error);
389 DBusTransportOpenResult result;
391 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
392 result = (* open_funcs[i].func) (entry, &transport, &tmp_error);
396 case DBUS_TRANSPORT_OPEN_OK:
397 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
400 case DBUS_TRANSPORT_OPEN_NOT_HANDLED:
401 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
404 case DBUS_TRANSPORT_OPEN_BAD_ADDRESS:
405 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
408 case DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT:
409 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
417 if (transport ==
NULL)
422 "Unknown address type (examples of valid types are \"tcp\" and on UNIX \"unix\")");
424 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
430 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
484 _dbus_verbose (
"finalizing\n");
503 _dbus_verbose (
"start\n");
514 _dbus_verbose (
"end\n");
538 void *unix_user_data;
551 _dbus_verbose (
"unlock\n");
554 allow = (* unix_user_function) (connection,
558 _dbus_verbose (
"lock post unix user function\n");
568 " was rejected, disconnecting\n",
583 void *windows_user_data;
596 if (windows_sid ==
NULL)
602 _dbus_verbose (
"unlock\n");
605 allow = (* windows_user_function) (connection,
609 _dbus_verbose (
"lock post windows user function\n");
614 _dbus_verbose (
"Client SID '%s' authorized\n", windows_sid);
618 _dbus_verbose (
"Client SID '%s' was rejected, disconnecting\n",
641 if (our_identity ==
NULL)
653 _dbus_verbose (
"Client authorized as SID '%s'"
654 "matching our SID '%s'\n",
668 _dbus_verbose (
"Client authorized as SID '%s'"
669 " but our SID is '%s', disconnecting\n",
675 _dbus_verbose (
"Client authorized as UID "DBUS_UID_FORMAT
676 " but our UID is "DBUS_UID_FORMAT
", disconnecting\n",
714 maybe_authenticated =
718 if (maybe_authenticated)
722 case DBUS_AUTH_STATE_AUTHENTICATED:
726 maybe_authenticated =
FALSE;
732 if (maybe_authenticated && !transport->
is_server)
734 const char *server_guid;
742 _dbus_verbose (
"Client expected GUID '%s' and we got '%s' from the server\n",
752 if (maybe_authenticated && transport->
is_server)
767 allow = auth_via_unix_user_function (transport);
772 allow = auth_via_windows_user_function (transport);
776 allow = auth_via_default_rules (transport);
780 maybe_authenticated =
FALSE;
786 return maybe_authenticated;
821 return DBUS_TRANSPORT_CAN_SEND_UNIX_FD(transport);
867 unsigned int condition)
962 int timeout_milliseconds)
966 _dbus_verbose (
"Transport iteration flags 0x%x timeout %d connected = %d\n",
969 if ((flags & (DBUS_ITERATION_DO_WRITING |
970 DBUS_ITERATION_DO_READING)) == 0)
978 timeout_milliseconds);
981 _dbus_verbose (
"end\n");
1001 encoded, &plaintext))
1010 orig_len = _dbus_string_get_length (buffer);
1019 _dbus_verbose (
" %d unused bytes sent to message loader\n",
1020 _dbus_string_get_length (buffer) -
1025 _dbus_string_get_length (buffer) -
1042 orig_len = _dbus_string_get_length (buffer);
1051 _dbus_verbose (
" %d unused bytes sent to message loader\n",
1052 _dbus_string_get_length (buffer) -
1057 _dbus_string_get_length (buffer) -
1069 _dbus_verbose (
"Not enough memory to transfer unused bytes from auth conversation\n");
1090 DBUS_AUTH_STATE_WAITING_FOR_MEMORY)
1097 !recover_unused_bytes (transport))
1125 _dbus_verbose (
"_dbus_transport_queue_messages()\n");
1137 message = link->
data;
1139 _dbus_verbose (
"queueing received message %p\n", message);
1165 _dbus_verbose (
"Corrupted message stream, disconnecting\n");
1236 live_messages_notify,
1254 live_messages_notify,
1306 DBUS_CREDENTIAL_UNIX_USER_ID))
1339 DBUS_CREDENTIAL_UNIX_PROCESS_ID))
1372 DBUS_CREDENTIAL_ADT_AUDIT_DATA_ID))
1417 char **windows_sid_p)
1421 *windows_sid_p =
NULL;
1429 DBUS_CREDENTIAL_WINDOWS_SID))
1477 const char **mechanisms)
1495 #ifdef DBUS_ENABLE_STATS
1498 dbus_uint32_t *queue_bytes,
1499 dbus_uint32_t *queue_fds,
1500 dbus_uint32_t *peak_queue_bytes,
1501 dbus_uint32_t *peak_queue_fds)
1503 if (queue_bytes !=
NULL)
1506 if (queue_fds !=
NULL)
1509 if (peak_queue_bytes !=
NULL)
1510 *peak_queue_bytes = _dbus_counter_get_peak_size_value (transport->
live_messages);
1512 if (peak_queue_fds !=
NULL)
1513 *peak_queue_fds = _dbus_counter_get_peak_unix_fd_value (transport->
live_messages);