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)
260 for (i = 0; i < len; i++)
263 if (transport !=
NULL)
279 _dbus_transport_new_for_autolaunch (
const char *scope,
DBusError *error)
284 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
294 _DBUS_ASSERT_ERROR_IS_SET (error);
298 result = check_address (_dbus_string_get_const_data (&address), error);
300 _DBUS_ASSERT_ERROR_IS_SET (error);
302 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
309 static DBusTransportOpenResult
319 if (strcmp (method,
"autolaunch") == 0)
323 *transport_p = _dbus_transport_new_for_autolaunch (scope, error);
325 if (*transport_p ==
NULL)
327 _DBUS_ASSERT_ERROR_IS_SET (error);
328 return DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT;
332 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
333 return DBUS_TRANSPORT_OPEN_OK;
338 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
339 return DBUS_TRANSPORT_OPEN_NOT_HANDLED;
343 static const struct {
350 { _dbus_transport_open_autolaunch }
351 #ifdef DBUS_BUILD_TESTS
352 , { _dbus_transport_open_debug_pipe }
369 const char *expected_guid_orig;
374 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
380 if (expected_guid_orig !=
NULL && expected_guid ==
NULL)
382 _DBUS_SET_OOM (error);
388 DBusTransportOpenResult result;
390 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
391 result = (* open_funcs[i].func) (entry, &transport, &tmp_error);
395 case DBUS_TRANSPORT_OPEN_OK:
396 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
399 case DBUS_TRANSPORT_OPEN_NOT_HANDLED:
400 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
403 case DBUS_TRANSPORT_OPEN_BAD_ADDRESS:
404 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
407 case DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT:
408 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
416 if (transport ==
NULL)
421 "Unknown address type (examples of valid types are \"tcp\" and on UNIX \"unix\")");
423 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
429 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
483 _dbus_verbose (
"finalizing\n");
502 _dbus_verbose (
"start\n");
513 _dbus_verbose (
"end\n");
537 void *unix_user_data;
550 _dbus_verbose (
"unlock\n");
553 allow = (* unix_user_function) (connection,
557 _dbus_verbose (
"lock post unix user function\n");
567 " was rejected, disconnecting\n",
582 void *windows_user_data;
595 if (windows_sid ==
NULL)
601 _dbus_verbose (
"unlock\n");
604 allow = (* windows_user_function) (connection,
608 _dbus_verbose (
"lock post windows user function\n");
613 _dbus_verbose (
"Client SID '%s' authorized\n", windows_sid);
617 _dbus_verbose (
"Client SID '%s' was rejected, disconnecting\n",
640 if (our_identity ==
NULL)
652 _dbus_verbose (
"Client authorized as SID '%s'"
653 "matching our SID '%s'\n",
667 _dbus_verbose (
"Client authorized as SID '%s'"
668 " but our SID is '%s', disconnecting\n",
674 _dbus_verbose (
"Client authorized as UID "DBUS_UID_FORMAT
675 " but our UID is "DBUS_UID_FORMAT
", disconnecting\n",
713 maybe_authenticated =
717 if (maybe_authenticated)
721 case DBUS_AUTH_STATE_AUTHENTICATED:
725 maybe_authenticated =
FALSE;
731 if (maybe_authenticated && !transport->
is_server)
733 const char *server_guid;
741 _dbus_verbose (
"Client expected GUID '%s' and we got '%s' from the server\n",
751 if (maybe_authenticated && transport->
is_server)
766 allow = auth_via_unix_user_function (transport);
771 allow = auth_via_windows_user_function (transport);
775 allow = auth_via_default_rules (transport);
779 maybe_authenticated =
FALSE;
785 return maybe_authenticated;
820 return DBUS_TRANSPORT_CAN_SEND_UNIX_FD(transport);
866 unsigned int condition)
961 int timeout_milliseconds)
965 _dbus_verbose (
"Transport iteration flags 0x%x timeout %d connected = %d\n",
968 if ((flags & (DBUS_ITERATION_DO_WRITING |
969 DBUS_ITERATION_DO_READING)) == 0)
977 timeout_milliseconds);
980 _dbus_verbose (
"end\n");
1000 encoded, &plaintext))
1009 orig_len = _dbus_string_get_length (buffer);
1018 _dbus_verbose (
" %d unused bytes sent to message loader\n",
1019 _dbus_string_get_length (buffer) -
1024 _dbus_string_get_length (buffer) -
1041 orig_len = _dbus_string_get_length (buffer);
1050 _dbus_verbose (
" %d unused bytes sent to message loader\n",
1051 _dbus_string_get_length (buffer) -
1056 _dbus_string_get_length (buffer) -
1068 _dbus_verbose (
"Not enough memory to transfer unused bytes from auth conversation\n");
1089 DBUS_AUTH_STATE_WAITING_FOR_MEMORY)
1096 !recover_unused_bytes (transport))
1124 _dbus_verbose (
"_dbus_transport_queue_messages()\n");
1136 message = link->
data;
1138 _dbus_verbose (
"queueing received message %p\n", message);
1164 _dbus_verbose (
"Corrupted message stream, disconnecting\n");
1235 live_messages_notify,
1253 live_messages_notify,
1305 DBUS_CREDENTIAL_UNIX_USER_ID))
1338 DBUS_CREDENTIAL_UNIX_PROCESS_ID))
1371 DBUS_CREDENTIAL_ADT_AUDIT_DATA_ID))
1416 char **windows_sid_p)
1420 *windows_sid_p =
NULL;
1428 DBUS_CREDENTIAL_WINDOWS_SID))
1476 const char **mechanisms)
1514 void (* callback) (
void *),
1521 #ifdef DBUS_ENABLE_STATS
1524 dbus_uint32_t *queue_bytes,
1525 dbus_uint32_t *queue_fds,
1526 dbus_uint32_t *peak_queue_bytes,
1527 dbus_uint32_t *peak_queue_fds)
1529 if (queue_bytes !=
NULL)
1532 if (queue_fds !=
NULL)
1535 if (peak_queue_bytes !=
NULL)
1536 *peak_queue_bytes = _dbus_counter_get_peak_size_value (transport->
live_messages);
1538 if (peak_queue_fds !=
NULL)
1539 *peak_queue_fds = _dbus_counter_get_peak_unix_fd_value (transport->
live_messages);