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"
70 _dbus_verbose (
"Size counter value is now %d\n",
72 _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)
257 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
262 for (i = 0; i < len; i++)
267 if (transport !=
NULL)
284 _dbus_transport_new_for_autolaunch (
const char *scope,
DBusError *error)
289 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
299 _DBUS_ASSERT_ERROR_IS_SET (error);
305 _DBUS_ASSERT_ERROR_IS_SET (error);
307 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
314 static DBusTransportOpenResult
324 if (strcmp (method,
"autolaunch") == 0)
328 *transport_p = _dbus_transport_new_for_autolaunch (scope, error);
330 if (*transport_p ==
NULL)
332 _DBUS_ASSERT_ERROR_IS_SET (error);
333 return DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT;
337 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
338 return DBUS_TRANSPORT_OPEN_OK;
343 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
344 return DBUS_TRANSPORT_OPEN_NOT_HANDLED;
348 static const struct {
355 { _dbus_transport_open_autolaunch }
356 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
357 , { _dbus_transport_open_debug_pipe }
374 const char *expected_guid_orig;
379 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
385 if (expected_guid_orig !=
NULL && expected_guid ==
NULL)
387 _DBUS_SET_OOM (error);
393 DBusTransportOpenResult result;
395 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
396 result = (* open_funcs[i].func) (entry, &transport, &tmp_error);
400 case DBUS_TRANSPORT_OPEN_OK:
401 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
404 case DBUS_TRANSPORT_OPEN_NOT_HANDLED:
405 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
408 case DBUS_TRANSPORT_OPEN_BAD_ADDRESS:
409 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
412 case DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT:
413 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
424 if (transport ==
NULL)
429 "Unknown address type (examples of valid types are \"tcp\" and on UNIX \"unix\")");
431 _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
437 _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
491 _dbus_verbose (
"finalizing\n");
510 _dbus_verbose (
"start\n");
521 _dbus_verbose (
"end\n");
545 void *unix_user_data;
558 _dbus_verbose (
"unlock\n");
561 allow = (* unix_user_function) (connection,
565 _dbus_verbose (
"lock post unix user function\n");
575 " was rejected, disconnecting\n",
590 void *windows_user_data;
603 if (windows_sid ==
NULL)
609 _dbus_verbose (
"unlock\n");
612 allow = (* windows_user_function) (connection,
616 _dbus_verbose (
"lock post windows user function\n");
621 _dbus_verbose (
"Client SID '%s' authorized\n", windows_sid);
625 _dbus_verbose (
"Client SID '%s' was rejected, disconnecting\n",
648 if (our_identity ==
NULL)
660 _dbus_verbose (
"Client authorized as SID '%s'"
661 "matching our SID '%s'\n",
675 _dbus_verbose (
"Client authorized as SID '%s'"
676 " but our SID is '%s', disconnecting\n",
682 _dbus_verbose (
"Client authorized as UID "DBUS_UID_FORMAT
683 " but our UID is "DBUS_UID_FORMAT
", disconnecting\n",
744 maybe_authenticated =
748 if (maybe_authenticated)
752 case DBUS_AUTH_STATE_AUTHENTICATED:
756 case DBUS_AUTH_STATE_WAITING_FOR_INPUT:
757 case DBUS_AUTH_STATE_WAITING_FOR_MEMORY:
758 case DBUS_AUTH_STATE_HAVE_BYTES_TO_SEND:
759 case DBUS_AUTH_STATE_NEED_DISCONNECT:
760 maybe_authenticated =
FALSE;
763 case DBUS_AUTH_STATE_INVALID:
771 if (maybe_authenticated && !transport->
is_server)
773 const char *server_guid;
781 _dbus_verbose (
"Client expected GUID '%s' and we got '%s' from the server\n",
791 if (maybe_authenticated && transport->
is_server)
806 allow = auth_via_unix_user_function (transport);
811 allow = auth_via_windows_user_function (transport);
815 allow = auth_via_default_rules (transport);
819 maybe_authenticated =
FALSE;
825 return maybe_authenticated;
860 return DBUS_TRANSPORT_CAN_SEND_UNIX_FD(transport);
906 unsigned int condition)
1001 int timeout_milliseconds)
1005 _dbus_verbose (
"Transport iteration flags 0x%x timeout %d connected = %d\n",
1006 flags, timeout_milliseconds, !transport->
disconnected);
1008 if ((flags & (DBUS_ITERATION_DO_WRITING |
1009 DBUS_ITERATION_DO_READING)) == 0)
1017 timeout_milliseconds);
1020 _dbus_verbose (
"end\n");
1040 encoded, &plaintext))
1060 _dbus_verbose (
" %d unused bytes sent to message loader\n",
1075 #ifdef DBUS_ENABLE_VERBOSE_MODE
1085 #ifdef DBUS_ENABLE_VERBOSE_MODE
1096 _dbus_verbose (
" %d unused bytes sent to message loader\n",
1112 _dbus_verbose (
"Not enough memory to transfer unused bytes from auth conversation\n");
1133 DBUS_AUTH_STATE_WAITING_FOR_MEMORY)
1140 !recover_unused_bytes (transport))
1168 _dbus_verbose (
"enter\n");
1180 message = link->
data;
1182 _dbus_verbose (
"queueing received message %p\n", message);
1208 _dbus_verbose (
"Corrupted message stream, disconnecting\n");
1279 live_messages_notify,
1297 live_messages_notify,
1349 DBUS_CREDENTIAL_UNIX_USER_ID))
1382 DBUS_CREDENTIAL_UNIX_PROCESS_ID))
1415 DBUS_CREDENTIAL_ADT_AUDIT_DATA_ID))
1452 _dbus_transport_get_linux_security_label (
DBusTransport *transport,
1465 DBUS_CREDENTIAL_LINUX_SECURITY_LABEL))
1487 char **windows_sid_p)
1491 *windows_sid_p =
NULL;
1499 DBUS_CREDENTIAL_WINDOWS_SID))
1547 const char **mechanisms)
1585 void (* callback) (
void *),
1592 #ifdef DBUS_ENABLE_STATS
1600 if (queue_bytes !=
NULL)
1603 if (queue_fds !=
NULL)
1606 if (peak_queue_bytes !=
NULL)
1607 *peak_queue_bytes = _dbus_counter_get_peak_size_value (transport->
live_messages);
1609 if (peak_queue_fds !=
NULL)
1610 *peak_queue_fds = _dbus_counter_get_peak_unix_fd_value (transport->
live_messages);