1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 27652304bff969afb3969603149bb385efe861fe8John (J/* dbus-transport.c DBusTransport object (internal to D-Bus implementation) 3041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 4502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * Copyright (C) 2002, 2003 Red Hat Inc. 5041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 7041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 8041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is free software; you can redistribute it and/or modify 9041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * it under the terms of the GNU General Public License as published by 10041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 11041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * (at your option) any later version. 12041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 13041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is distributed in the hope that it will be useful, 14041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 15041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * GNU General Public License for more details. 17041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 18041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * You should have received a copy of the GNU General Public License 19041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * along with this program; if not, write to the Free Software 205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 22041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 23041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h> 25041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-transport-protected.h" 26041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-transport-unix.h" 278027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-transport-socket.h" 28041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-connection-internal.h" 29d4b870e7f91b7018524f7b85dc00b90cc64453bfHavoc Pennington#include "dbus-watch.h" 30ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington#include "dbus-auth.h" 315ebb5748c2a7587c734eeed9c66f2a1fc0635d09Anders Carlsson#include "dbus-address.h" 3223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington#include "dbus-credentials.h" 33a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#include "dbus-message-private.h" 34a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#include "dbus-marshal-header.h" 35dec1fa3bd5f106ba5b2c749372231e3dd4bf9e7bAnders Carlsson#ifdef DBUS_BUILD_TESTS 36169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington#include "dbus-server-debug-pipe.h" 37dec1fa3bd5f106ba5b2c749372231e3dd4bf9e7bAnders Carlsson#endif 38041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 39041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 40041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @defgroup DBusTransport DBusTransport object 41041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @ingroup DBusInternals 42041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @brief "Backend" for a DBusConnection. 43041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 44041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Types and functions related to DBusTransport. A transport is an 45041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * abstraction that can send and receive data via various kinds of 46041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * network connections or other IPC mechanisms. 47041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 48041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{ 49041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 50041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 51041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 52041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @typedef DBusTransport 53041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 54041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Opaque object representing a way message stream. 55041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * DBusTransport abstracts various kinds of actual 56041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * transport mechanism, such as different network protocols, 57041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * or encryption schemes. 58041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 59041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 60502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonstatic void 61bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringlive_messages_notify (DBusCounter *counter, 62502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington void *user_data) 63502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 64502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington DBusTransport *transport = user_data; 65502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 66fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_transport_ref (transport); 67502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 68502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington#if 0 69bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_verbose ("Size counter value is now %d\n", 70bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering (int) _dbus_counter_get_size_value (counter)); 71bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_verbose ("Unix FD counter value is now %d\n", 72bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering (int) _dbus_counter_get_unix_fd_value (counter)); 73502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington#endif 74502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 75502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington /* disable or re-enable the read watch for the transport if 76502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * required. 77502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 785ee4ac1a303b3c66ff300eef55abd5f5d312cc0aJohn (J if (transport->vtable->live_messages_changed) 79502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington (* transport->vtable->live_messages_changed) (transport); 80502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 81fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_transport_unref (transport); 82502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 83ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 84ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington/** 85ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * Initializes the base class members of DBusTransport. Chained up to 86ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * by subclasses in their constructor. The server GUID is the 87ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * globally unique ID for the server creating this connection 88ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * and will be #NULL for the client side of a connection. The GUID 89ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * is in hex format. 90041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 91041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport being created. 92041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param vtable the subclass vtable. 93ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * @param server_guid non-#NULL if this transport is on the server side of a connection 9429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * @param address the address of the transport 95041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns #TRUE on success. 96041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 97041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_bool_t 98041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_init_base (DBusTransport *transport, 99ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington const DBusTransportVTable *vtable, 100ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington const DBusString *server_guid, 10129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington const DBusString *address) 102041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 103041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBusMessageLoader *loader; 104ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington DBusAuth *auth; 105502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington DBusCounter *counter; 10629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington char *address_copy; 10723832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington DBusCredentials *creds; 108ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 109041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader = _dbus_message_loader_new (); 110041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (loader == NULL) 111041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return FALSE; 112502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 113ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington if (server_guid) 114ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington auth = _dbus_auth_server_new (server_guid); 115ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington else 116ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington auth = _dbus_auth_client_new (); 117ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington if (auth == NULL) 118ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington { 119ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_message_loader_unref (loader); 120ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington return FALSE; 121ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington } 122502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 123502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington counter = _dbus_counter_new (); 124502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington if (counter == NULL) 125502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington { 126502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington _dbus_auth_unref (auth); 127502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington _dbus_message_loader_unref (loader); 128502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington return FALSE; 12929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 13023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington 13123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington creds = _dbus_credentials_new (); 13223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington if (creds == NULL) 13323832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington { 13423832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington _dbus_counter_unref (counter); 13523832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington _dbus_auth_unref (auth); 13623832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington _dbus_message_loader_unref (loader); 13723832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington return FALSE; 13823832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington } 13929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 140ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington if (server_guid) 14129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 14229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_assert (address == NULL); 14329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington address_copy = NULL; 14429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 14529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington else 14629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 14729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_assert (address != NULL); 14829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 14929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (!_dbus_string_copy_data (address, &address_copy)) 15029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 15123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington _dbus_credentials_unref (creds); 15229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_counter_unref (counter); 15329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_auth_unref (auth); 15429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_message_loader_unref (loader); 15529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return FALSE; 15629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 157502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington } 158041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 159041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington transport->refcount = 1; 160041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington transport->vtable = vtable; 161041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington transport->loader = loader; 162ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington transport->auth = auth; 163bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering transport->live_messages = counter; 164ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington transport->authenticated = FALSE; 165ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington transport->disconnected = FALSE; 166ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington transport->is_server = (server_guid != NULL); 167ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington transport->send_credentials_pending = !transport->is_server; 168ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington transport->receive_credentials_pending = transport->is_server; 16929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington transport->address = address_copy; 17029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 171b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington transport->unix_user_function = NULL; 172b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington transport->unix_user_data = NULL; 173b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington transport->free_unix_user_data = NULL; 1744db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington 1757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington transport->windows_user_function = NULL; 1767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington transport->windows_user_data = NULL; 1777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington transport->free_windows_user_data = NULL; 1787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 1794db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington transport->expected_guid = NULL; 180b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 181502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington /* Try to default to something that won't totally hose the system, 182502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * but doesn't impose too much of a limitation. 183502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 184502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington transport->max_live_messages_size = _DBUS_ONE_MEGABYTE * 63; 185502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 186bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering /* On Linux RLIMIT_NOFILE defaults to 1024, so allowing 4096 fds live 187bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering should be more than enough */ 188bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering transport->max_live_messages_unix_fds = 4096; 189bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering 19023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington /* credentials read from socket if any */ 19123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington transport->credentials = creds; 192a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 193bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_set_notify (transport->live_messages, 194502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington transport->max_live_messages_size, 195bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering transport->max_live_messages_unix_fds, 196bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering live_messages_notify, 197502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington transport); 19829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 19929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (transport->address) 20029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_verbose ("Initialized transport on address %s\n", transport->address); 201a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 202041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return TRUE; 203041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 204041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 205041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 206041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Finalizes base class members of DBusTransport. 207041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Chained up to from subclass finalizers. 208041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 209041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport. 210041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 211041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 212041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_finalize_base (DBusTransport *transport) 213041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 214041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (!transport->disconnected) 215041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_transport_disconnect (transport); 216b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 217b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington if (transport->free_unix_user_data != NULL) 218b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington (* transport->free_unix_user_data) (transport->unix_user_data); 2197be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 2207be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (transport->free_windows_user_data != NULL) 2217be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington (* transport->free_windows_user_data) (transport->windows_user_data); 222502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 223041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_message_loader_unref (transport->loader); 224ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_auth_unref (transport->auth); 225bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_set_notify (transport->live_messages, 226bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering 0, 0, NULL, NULL); 227bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_unref (transport->live_messages); 22829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington dbus_free (transport->address); 2294db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington dbus_free (transport->expected_guid); 23023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington if (transport->credentials) 23123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington _dbus_credentials_unref (transport->credentials); 232041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 233041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 234f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 235f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira/** 236f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * Verifies if a given D-Bus address is a valid address 237f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * by attempting to connect to it. If it is, returns the 238f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * opened DBusTransport object. If it isn't, returns #NULL 239f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * and sets @p error. 240f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * 241f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * @param error address where an error can be returned. 242f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * @returns a new transport, or #NULL on failure. 243f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira */ 244f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieirastatic DBusTransport* 245f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieiracheck_address (const char *address, DBusError *error) 246f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira{ 247f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira DBusAddressEntry **entries; 248f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira DBusTransport *transport = NULL; 249f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira int len, i; 250f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 251f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _dbus_assert (address != NULL); 252f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _dbus_assert (*address != '\0'); 253f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 254f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira if (!dbus_parse_address (address, &entries, &len, error)) 2553c89788fa483ebda858ab66797e2834af94b798fKjartan Maraas return NULL; /* not a valid address */ 256f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 257f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira for (i = 0; i < len; i++) 258f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { 259f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira transport = _dbus_transport_open (entries[i], error); 260f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira if (transport != NULL) 261f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira break; 262f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira } 263f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 264f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira dbus_address_entries_free (entries); 265f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira return transport; 266f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira} 267f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 268f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira/** 269f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * Creates a new transport for the "autostart" method. 270f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * This creates a client-side of a transport. 271f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * 272f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * @param error address where an error can be returned. 273f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira * @returns a new transport, or #NULL on failure. 274f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira */ 275f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieirastatic DBusTransport* 276f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira_dbus_transport_new_for_autolaunch (DBusError *error) 277f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira{ 278f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira DBusString address; 279f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira DBusTransport *result = NULL; 280f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 281f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _DBUS_ASSERT_ERROR_IS_CLEAR (error); 282f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 283f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira if (!_dbus_string_init (&address)) 284f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { 285f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 286f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira return NULL; 287f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira } 288f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 289f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira if (!_dbus_get_autolaunch_address (&address, error)) 290f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { 291f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _DBUS_ASSERT_ERROR_IS_SET (error); 292f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira goto out; 293f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira } 294f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 295f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira result = check_address (_dbus_string_get_const_data (&address), error); 296f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira if (result == NULL) 297f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _DBUS_ASSERT_ERROR_IS_SET (error); 298f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira else 299f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _DBUS_ASSERT_ERROR_IS_CLEAR (error); 300f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 301f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira out: 302f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _dbus_string_free (&address); 303f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira return result; 304f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira} 305f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 306f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieirastatic DBusTransportOpenResult 307f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira_dbus_transport_open_autolaunch (DBusAddressEntry *entry, 308f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira DBusTransport **transport_p, 309f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira DBusError *error) 310f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira{ 311f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira const char *method; 312f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 313f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira method = dbus_address_entry_get_method (entry); 314f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _dbus_assert (method != NULL); 315f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 316f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira if (strcmp (method, "autolaunch") == 0) 317f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { 318f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira *transport_p = _dbus_transport_new_for_autolaunch (error); 319f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 320f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira if (*transport_p == NULL) 321f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { 322f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _DBUS_ASSERT_ERROR_IS_SET (error); 323f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira return DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT; 324f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira } 325f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira else 326f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { 327f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _DBUS_ASSERT_ERROR_IS_CLEAR (error); 328f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira return DBUS_TRANSPORT_OPEN_OK; 329f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira } 330f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira } 331f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira else 332f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { 333f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira _DBUS_ASSERT_ERROR_IS_CLEAR (error); 334f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira return DBUS_TRANSPORT_OPEN_NOT_HANDLED; 335f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira } 336f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira} 337f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 338fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Penningtonstatic const struct { 339fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington DBusTransportOpenResult (* func) (DBusAddressEntry *entry, 340fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington DBusTransport **transport_p, 341fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington DBusError *error); 342fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington} open_funcs[] = { 343fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington { _dbus_transport_open_socket }, 344f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { _dbus_transport_open_platform_specific }, 345f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira { _dbus_transport_open_autolaunch } 346fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington#ifdef DBUS_BUILD_TESTS 347fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington , { _dbus_transport_open_debug_pipe } 348fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington#endif 349fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington}; 350fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington 351041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 352ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * Try to open a new transport for the given address entry. (This 353ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * opens a client-side-of-the-connection transport.) 354041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 355ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington * @param entry the address entry 356ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @param error location to store reason for failure. 357041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns new transport of #NULL on failure. 358041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 359041b0767b284034aee09e9a0de2a3844b8cc546aHavoc PenningtonDBusTransport* 360ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington_dbus_transport_open (DBusAddressEntry *entry, 361ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington DBusError *error) 362041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 363041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBusTransport *transport; 3644db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington const char *expected_guid_orig; 3654db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington char *expected_guid; 366fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington int i; 367f55897af74ac072d3447e5cf513d0f4718b142c7Simon McVittie DBusError tmp_error = DBUS_ERROR_INIT; 368f55897af74ac072d3447e5cf513d0f4718b142c7Simon McVittie 36951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 37051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 3715ebb5748c2a7587c734eeed9c66f2a1fc0635d09Anders Carlsson transport = NULL; 3724db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington expected_guid_orig = dbus_address_entry_get_value (entry, "guid"); 3734db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington expected_guid = _dbus_strdup (expected_guid_orig); 3744db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington 3754db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington if (expected_guid_orig != NULL && expected_guid == NULL) 3764db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington { 3774db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington _DBUS_SET_OOM (error); 3784db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington return NULL; 3794db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington } 380a70b042f0dcebb10689975c65a2c45b52b7a4437Havoc Pennington 381fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington for (i = 0; i < (int) _DBUS_N_ELEMENTS (open_funcs); ++i) 382ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington { 383fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington DBusTransportOpenResult result; 3846180d6954c41a2412c166e5a9e8a2851cf39c6d1Mikael Hallendal 3850d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error); 386fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington result = (* open_funcs[i].func) (entry, &transport, &tmp_error); 387169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 388fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington switch (result) 389ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington { 390fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington case DBUS_TRANSPORT_OPEN_OK: 3910d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error); 392fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington goto out; 393fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington break; 394fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington case DBUS_TRANSPORT_OPEN_NOT_HANDLED: 3950d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error); 396fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington /* keep going through the loop of open funcs */ 397fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington break; 398fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington case DBUS_TRANSPORT_OPEN_BAD_ADDRESS: 3990d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&tmp_error); 400fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington goto out; 401fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington break; 402fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington case DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT: 4030d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&tmp_error); 404fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington goto out; 405fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington break; 406ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington } 40751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 408ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington 409fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington out: 410fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington 411ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington if (transport == NULL) 4124db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington { 413fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington if (!dbus_error_is_set (&tmp_error)) 414fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington _dbus_set_bad_address (&tmp_error, 415fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington NULL, NULL, 416fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington "Unknown address type (examples of valid types are \"tcp\" and on UNIX \"unix\")"); 417fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington 4180d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&tmp_error); 419fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington dbus_move_error(&tmp_error, error); 4204db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington dbus_free (expected_guid); 4214db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington } 4224db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington else 4234db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington { 4240d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error); 425ca87b90981e88623589b7d1d42ce5bafcb644213John (J 426ca87b90981e88623589b7d1d42ce5bafcb644213John (J /* In the case of autostart the initial guid is NULL 427ca87b90981e88623589b7d1d42ce5bafcb644213John (J * and the autostart transport recursively calls 428ca87b90981e88623589b7d1d42ce5bafcb644213John (J * _dbus_open_transport wich returns a transport 429ca87b90981e88623589b7d1d42ce5bafcb644213John (J * with a guid. That guid is the definitive one. 430ca87b90981e88623589b7d1d42ce5bafcb644213John (J * 431ca87b90981e88623589b7d1d42ce5bafcb644213John (J * FIXME: if more transports are added they may have 432ca87b90981e88623589b7d1d42ce5bafcb644213John (J * an effect on the expected_guid semantics (i.e. 433ca87b90981e88623589b7d1d42ce5bafcb644213John (J * expected_guid and transport->expected_guid may 434ca87b90981e88623589b7d1d42ce5bafcb644213John (J * both have values). This is very unlikely though 435ca87b90981e88623589b7d1d42ce5bafcb644213John (J * we should either throw asserts here for those 436ca87b90981e88623589b7d1d42ce5bafcb644213John (J * corner cases or refactor the code so it is 437ca87b90981e88623589b7d1d42ce5bafcb644213John (J * clearer on what is expected and what is not 438ca87b90981e88623589b7d1d42ce5bafcb644213John (J */ 439ca87b90981e88623589b7d1d42ce5bafcb644213John (J if(expected_guid) 440ca87b90981e88623589b7d1d42ce5bafcb644213John (J transport->expected_guid = expected_guid; 4414db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington } 4425ebb5748c2a7587c734eeed9c66f2a1fc0635d09Anders Carlsson 443fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington return transport; 444041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 445041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 446041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 447041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Increments the reference count for the transport. 448041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 449041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport. 4509f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal * @returns the transport. 451041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 4529f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalDBusTransport * 453041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_ref (DBusTransport *transport) 454041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 455b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_assert (transport->refcount > 0); 456b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 457041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington transport->refcount += 1; 4589f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal 4599f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal return transport; 460041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 461041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 462041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 463041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Decrements the reference count for the transport. 464041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Disconnects and finalizes the transport if 465041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the reference count reaches zero. 466041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 467041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport. 468041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 469041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 470041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_unref (DBusTransport *transport) 471041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 472041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (transport != NULL); 473041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (transport->refcount > 0); 474f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington 475041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington transport->refcount -= 1; 476041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (transport->refcount == 0) 477041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington { 478d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("finalizing\n"); 479f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington 480041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (transport->vtable->finalize != NULL); 481041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 482041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington (* transport->vtable->finalize) (transport); 483041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington } 484041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 485041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 486041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 487041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Closes our end of the connection to a remote application. Further 488041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * attempts to use this transport will fail. Only the first call to 489041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * _dbus_transport_disconnect() will have an effect. 490041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 491041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport. 492041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 493041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 494041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 495041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_disconnect (DBusTransport *transport) 496041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 497d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("start\n"); 498f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington 499041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (transport->vtable->disconnect != NULL); 500f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington 501041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (transport->disconnected) 502041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return; 503ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 504041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington (* transport->vtable->disconnect) (transport); 50501af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington 506041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington transport->disconnected = TRUE; 507f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington 508d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("end\n"); 509041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 510041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 511041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 512041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Returns #TRUE if the transport has not been disconnected. 513041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Disconnection can result from _dbus_transport_disconnect() 514041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * or because the server drops its end of the connection. 515041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 516041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport. 517ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @returns whether we're connected 518041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 519041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_bool_t 520041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_get_is_connected (DBusTransport *transport) 521041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 522041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return !transport->disconnected; 523041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 524041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 5257be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonstatic dbus_bool_t 5267be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonauth_via_unix_user_function (DBusTransport *transport) 5277be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{ 5287be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusCredentials *auth_identity; 5297be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_bool_t allow; 5307be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusConnection *connection; 5317be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusAllowUnixUserFunction unix_user_function; 5327be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington void *unix_user_data; 5337be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_uid_t uid; 5347be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5357be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* Dropping the lock here probably isn't that safe. */ 5367be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5377be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington auth_identity = _dbus_auth_get_identity (transport->auth); 5387be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_assert (auth_identity != NULL); 5397be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5407be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington connection = transport->connection; 5417be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unix_user_function = transport->unix_user_function; 5427be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unix_user_data = transport->unix_user_data; 543e3d30a03225dd1d26012ecd39b09e4ccf91befb5Havoc Pennington uid = _dbus_credentials_get_unix_uid (auth_identity); 5447be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 545d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("unlock\n"); 5467be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_connection_unlock (connection); 5477be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5487be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow = (* unix_user_function) (connection, 5497be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington uid, 5507be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unix_user_data); 5517be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 552d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("lock post unix user function\n"); 5537be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_connection_lock (connection); 5547be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5557be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (allow) 5567be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 5577be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_verbose ("Client UID "DBUS_UID_FORMAT" authorized\n", uid); 5587be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 5597be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington else 5607be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 5617be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_verbose ("Client UID "DBUS_UID_FORMAT 5627be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington " was rejected, disconnecting\n", 5637be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_credentials_get_unix_uid (auth_identity)); 5647be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_transport_disconnect (transport); 5657be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 5667be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5677be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return allow; 5687be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington} 5697be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5707be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonstatic dbus_bool_t 5717be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonauth_via_windows_user_function (DBusTransport *transport) 5727be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{ 5737be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusCredentials *auth_identity; 5747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_bool_t allow; 5757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusConnection *connection; 5767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusAllowWindowsUserFunction windows_user_function; 5777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington void *windows_user_data; 5787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington char *windows_sid; 5797be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5807be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* Dropping the lock here probably isn't that safe. */ 5817be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5827be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington auth_identity = _dbus_auth_get_identity (transport->auth); 5837be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_assert (auth_identity != NULL); 5847be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5857be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington connection = transport->connection; 5867be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington windows_user_function = transport->windows_user_function; 5877be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington windows_user_data = transport->unix_user_data; 5887be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington windows_sid = _dbus_strdup (_dbus_credentials_get_windows_sid (auth_identity)); 5897be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5907be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (windows_sid == NULL) 5917be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 5927be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* OOM */ 5937be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return FALSE; 5947be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 5957be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 596d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("unlock\n"); 5977be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_connection_unlock (connection); 5987be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 5997be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow = (* windows_user_function) (connection, 6007be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington windows_sid, 6017be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington windows_user_data); 6027be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 603d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("lock post windows user function\n"); 6047be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_connection_lock (connection); 6057be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6067be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (allow) 6077be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 6087be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_verbose ("Client SID '%s' authorized\n", windows_sid); 6097be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 6107be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington else 6117be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 6127be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_verbose ("Client SID '%s' was rejected, disconnecting\n", 6137be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_credentials_get_windows_sid (auth_identity)); 6147be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_transport_disconnect (transport); 6157be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 6167be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6177be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return allow; 6187be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington} 6197be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6207be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonstatic dbus_bool_t 6217be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonauth_via_default_rules (DBusTransport *transport) 6227be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{ 6237be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusCredentials *auth_identity; 6247be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusCredentials *our_identity; 6257be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_bool_t allow; 6267be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6277be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington auth_identity = _dbus_auth_get_identity (transport->auth); 6287be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_assert (auth_identity != NULL); 6297be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 63094125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington /* By default, connection is allowed if the client is 1) root or 2) 63194125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * has the same UID as us or 3) anonymous is allowed. 6327be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */ 63394125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington 6347be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington our_identity = _dbus_credentials_new_from_current_process (); 6357be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (our_identity == NULL) 6367be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 6377be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* OOM */ 6387be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return FALSE; 6397be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 6407be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 64194125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington if (transport->allow_anonymous || 64294125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington _dbus_credentials_get_unix_uid (auth_identity) == 0 || 6437be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_credentials_same_user (our_identity, 6447be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington auth_identity)) 6457be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 64662c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker if (_dbus_credentials_include(our_identity,DBUS_CREDENTIAL_WINDOWS_SID)) 64762c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_verbose ("Client authorized as SID '%s'" 64862c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker "matching our SID '%s'\n", 64962c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_credentials_get_windows_sid(auth_identity), 65062c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_credentials_get_windows_sid(our_identity)); 65162c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker else 65262c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_verbose ("Client authorized as UID "DBUS_UID_FORMAT 65362c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker " matching our UID "DBUS_UID_FORMAT"\n", 65462c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_credentials_get_unix_uid(auth_identity), 65562c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_credentials_get_unix_uid(our_identity)); 6567be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* We have authenticated! */ 6577be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow = TRUE; 6587be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 6597be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington else 6607be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 66162c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker if (_dbus_credentials_include(our_identity,DBUS_CREDENTIAL_WINDOWS_SID)) 66262c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_verbose ("Client authorized as SID '%s'" 66362c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker " but our SID is '%s', disconnecting\n", 6648c5456c337c65d43f0a2bc1be14beb6391441239Tor Lillqvist (_dbus_credentials_get_windows_sid(auth_identity) ? 6658c5456c337c65d43f0a2bc1be14beb6391441239Tor Lillqvist _dbus_credentials_get_windows_sid(auth_identity) : "<null>"), 6668c5456c337c65d43f0a2bc1be14beb6391441239Tor Lillqvist (_dbus_credentials_get_windows_sid(our_identity) ? 6678c5456c337c65d43f0a2bc1be14beb6391441239Tor Lillqvist _dbus_credentials_get_windows_sid(our_identity) : "<null>")); 66862c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker else 66962c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_verbose ("Client authorized as UID "DBUS_UID_FORMAT 67062c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker " but our UID is "DBUS_UID_FORMAT", disconnecting\n", 671ef86bcedc8ec33b77b710a0e1ff84b4ae2539bc1Tor Lillqvist _dbus_credentials_get_unix_uid(auth_identity), 67262c638249ecc1a3ae3e4388fc9f4a45a80e34587Ralf Habacker _dbus_credentials_get_unix_uid(our_identity)); 6737be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_transport_disconnect (transport); 6747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow = FALSE; 6757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 6767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_credentials_unref (our_identity); 6787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6797be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return allow; 6807be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington} 6817be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6827be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 683041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 684ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * Returns #TRUE if we have been authenticated. Will return #TRUE 685ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * even if the transport is disconnected. 686ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * 687f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington * @todo we drop connection->mutex when calling the unix_user_function, 6887be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * and windows_user_function, which may not be safe really. 689b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * 690ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @param transport the transport 691ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @returns whether we're authenticated 692ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington */ 693ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Penningtondbus_bool_t 694ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington_dbus_transport_get_is_authenticated (DBusTransport *transport) 69523832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington{ 696ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington if (transport->authenticated) 697ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington return TRUE; 698ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington else 699ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington { 700a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington dbus_bool_t maybe_authenticated; 701a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 70201af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington if (transport->disconnected) 70301af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington return FALSE; 704f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington 705f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington /* paranoia ref since we call user callbacks sometimes */ 706f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington _dbus_connection_ref_unlocked (transport->connection); 70701af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington 708a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington maybe_authenticated = 70901af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington (!(transport->send_credentials_pending || 710777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington transport->receive_credentials_pending)); 711ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 712777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (maybe_authenticated) 713777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington { 714777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington switch (_dbus_auth_do_work (transport->auth)) 715777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington { 716777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington case DBUS_AUTH_STATE_AUTHENTICATED: 717777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* leave as maybe_authenticated */ 718777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington break; 719777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington default: 720777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington maybe_authenticated = FALSE; 721777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington } 722777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington } 7234db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington 7247be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* If we're the client, verify the GUID 7257be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */ 7264db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington if (maybe_authenticated && !transport->is_server) 7274db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington { 7284db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington const char *server_guid; 7294db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington 7304db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington server_guid = _dbus_auth_get_guid_from_server (transport->auth); 7314db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington _dbus_assert (server_guid != NULL); 7324db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington 7334db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington if (transport->expected_guid && 7344db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington strcmp (transport->expected_guid, server_guid) != 0) 7354db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington { 7364db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington _dbus_verbose ("Client expected GUID '%s' and we got '%s' from the server\n", 7374db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington transport->expected_guid, server_guid); 7384db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington _dbus_transport_disconnect (transport); 7394db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington _dbus_connection_unref_unlocked (transport->connection); 7404db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington return FALSE; 7414db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington } 7424db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington 7434db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington if (transport->expected_guid == NULL) 7444db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington { 7454db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington transport->expected_guid = _dbus_strdup (server_guid); 7464db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington 7474db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington if (transport->expected_guid == NULL) 7484db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington { 749d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("No memory to complete auth\n"); 7504db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington return FALSE; 7514db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington } 7524db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington } 7534db285c800a68245ad7593e606ca8cb2c21a1329Havoc Pennington } 7547be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 7557be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* If we're the server, see if we want to allow this identity to proceed. 75601af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington */ 757a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (maybe_authenticated && transport->is_server) 75801af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington { 7597be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_bool_t allow; 76023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington DBusCredentials *auth_identity; 7617be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 76223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington auth_identity = _dbus_auth_get_identity (transport->auth); 76323832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington _dbus_assert (auth_identity != NULL); 7647be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 7657be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* If we have an auth'd user and a user function, delegate 7667be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * deciding whether auth credentials are good enough to the 7677be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * app; otherwise, use our default decision process. 76823832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington */ 76923832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington if (transport->unix_user_function != NULL && 77023832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington _dbus_credentials_include (auth_identity, DBUS_CREDENTIAL_UNIX_USER_ID)) 77101af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington { 7727be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow = auth_via_unix_user_function (transport); 77301af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington } 7747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington else if (transport->windows_user_function != NULL && 7757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington _dbus_credentials_include (auth_identity, DBUS_CREDENTIAL_WINDOWS_SID)) 7767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 7777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow = auth_via_windows_user_function (transport); 7787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 77901af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington else 78001af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington { 7817be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow = auth_via_default_rules (transport); 78201af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington } 7837be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 7847be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (!allow) 7857be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington maybe_authenticated = FALSE; 78601af5ff4101e540a6456bca01d56272e701bea78Havoc Pennington } 7877be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 788a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington transport->authenticated = maybe_authenticated; 789f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington 790f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington _dbus_connection_unref_unlocked (transport->connection); 791f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington return maybe_authenticated; 792ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington } 793ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington} 794ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 795ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington/** 79694125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * See dbus_connection_get_is_anonymous(). 79794125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * 79894125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * @param transport the transport 79994125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * @returns #TRUE if not authenticated or authenticated as anonymous 80094125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington */ 80194125e89b6be74cb20100d5321a98aa6529187a9Havoc Penningtondbus_bool_t 80294125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington_dbus_transport_get_is_anonymous (DBusTransport *transport) 80394125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington{ 80494125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington DBusCredentials *auth_identity; 80594125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington 80694125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington if (!transport->authenticated) 80794125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington return TRUE; 80894125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington 80994125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington auth_identity = _dbus_auth_get_identity (transport->auth); 81094125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington 81194125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington if (_dbus_credentials_are_anonymous (auth_identity)) 81294125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington return TRUE; 81394125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington else 81494125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington return FALSE; 81594125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington} 81694125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington 81794125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington/** 818a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * Returns TRUE if the transport supports sending unix fds. 819a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 820a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param transport the transport 821a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @returns #TRUE if TRUE it is possible to send unix fds across the transport. 822a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering */ 823a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringdbus_bool_t 824a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering_dbus_transport_can_pass_unix_fd(DBusTransport *transport) 825a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{ 826a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return DBUS_TRANSPORT_CAN_SEND_UNIX_FD(transport); 827a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering} 828a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 829a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering/** 83029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * Gets the address of a transport. It will be 83129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * #NULL for a server-side transport. 83229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * 83329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * @param transport the transport 83429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington * @returns transport's address 83529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington */ 83629c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonconst char* 83729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington_dbus_transport_get_address (DBusTransport *transport) 83829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington{ 83929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return transport->address; 84029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington} 84129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 84229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington/** 84354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * Gets the id of the server we are connected to (see 84454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * dbus_server_get_id()). Only works on client side. 84554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * 84654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * @param transport the transport 84754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington * @returns transport's server's id or #NULL if we are the server side 84854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington */ 84954b943432c7c947db88066751dd36a372cc9a618Havoc Penningtonconst char* 85054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington_dbus_transport_get_server_id (DBusTransport *transport) 85154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington{ 85254b943432c7c947db88066751dd36a372cc9a618Havoc Pennington if (transport->is_server) 85354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington return NULL; 85454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington else 85554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington return transport->expected_guid; 85654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington} 85754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington 85854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington/** 859041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Handles a watch by reading data, writing data, or disconnecting 860041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the transport, as appropriate for the given condition. 861041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 862041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport. 863041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param watch the watch. 864041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param condition the current state of the watched file descriptor. 865b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington * @returns #FALSE if not enough memory to fully handle the watch 866041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 867b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtondbus_bool_t 868041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_handle_watch (DBusTransport *transport, 869041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBusWatch *watch, 870041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington unsigned int condition) 871041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 872b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington dbus_bool_t retval; 873b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 874041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (transport->vtable->handle_watch != NULL); 875041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 876041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (transport->disconnected) 877b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington return TRUE; 878041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 87998f19852078cf03f8b50a93d49d83b85c0dd400bHavoc Pennington if (dbus_watch_get_socket (watch) < 0) 880ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington { 881f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington _dbus_warn_check_failed ("Tried to handle an invalidated watch; this watch should have been removed\n"); 882b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington return TRUE; 883ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington } 884041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 885ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_watch_sanitize_condition (watch, &condition); 886ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 887fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_transport_ref (transport); 888ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_watch_ref (watch); 889b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington retval = (* transport->vtable->handle_watch) (transport, watch, condition); 890ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_watch_unref (watch); 891fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_transport_unref (transport); 892b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 893b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington return retval; 894041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 895041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 896041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 897041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Sets the connection using this transport. Allows the transport 898041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * to add watches to the connection, queue incoming messages, 899041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * and pull outgoing messages. 900041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 901041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport. 902041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param connection the connection. 903f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington * @returns #FALSE if not enough memory 904041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 905f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Penningtondbus_bool_t 906041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_set_connection (DBusTransport *transport, 907041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBusConnection *connection) 908041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 909041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (transport->vtable->connection_set != NULL); 910041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (transport->connection == NULL); 911041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 912041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington transport->connection = connection; 913041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 914fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_transport_ref (transport); 915f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington if (!(* transport->vtable->connection_set) (transport)) 916f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington transport->connection = NULL; 917fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_transport_unref (transport); 918f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 919f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington return transport->connection != NULL; 920041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 921041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 922041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 9238027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Get the socket file descriptor, if any. 9241e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * 9251e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * @param transport the transport 9261e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * @param fd_p pointer to fill in with the descriptor 9271e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * @returns #TRUE if a descriptor was available 9281e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington */ 9291e9b185b0c274ef0d684b1e43418388225321e72Havoc Penningtondbus_bool_t 9308027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_transport_get_socket_fd (DBusTransport *transport, 9318027efc97b4bec85f674570f878919cb72456745Havoc Pennington int *fd_p) 9321e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington{ 9331e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington dbus_bool_t retval; 9341e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 9358027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (transport->vtable->get_socket_fd == NULL) 9361e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 9371e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 9381e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (transport->disconnected) 9391e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 9401e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 9411e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington _dbus_transport_ref (transport); 9421e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 9438027efc97b4bec85f674570f878919cb72456745Havoc Pennington retval = (* transport->vtable->get_socket_fd) (transport, 9448027efc97b4bec85f674570f878919cb72456745Havoc Pennington fd_p); 9451e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 9461e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington _dbus_transport_unref (transport); 9471e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 9481e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return retval; 9491e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington} 9501e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 9511e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington/** 952041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Performs a single poll()/select() on the transport's file 953041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * descriptors and then reads/writes data as appropriate, 954041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * queueing incoming messages and sending outgoing messages. 955041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This is the backend for _dbus_connection_do_iteration(). 956041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * See _dbus_connection_do_iteration() for full details. 957041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 958041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param transport the transport. 959041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param flags indicates whether to read or write, and whether to block. 960041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param timeout_milliseconds if blocking, timeout or -1 for no timeout. 961041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 962041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 963041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_transport_do_iteration (DBusTransport *transport, 964041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington unsigned int flags, 965041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington int timeout_milliseconds) 966041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 967041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (transport->vtable->do_iteration != NULL); 968041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 9697265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington _dbus_verbose ("Transport iteration flags 0x%x timeout %d connected = %d\n", 9707265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington flags, timeout_milliseconds, !transport->disconnected); 9717265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington 972041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if ((flags & (DBUS_ITERATION_DO_WRITING | 973041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBUS_ITERATION_DO_READING)) == 0) 974041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return; /* Nothing to do */ 975041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 976041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (transport->disconnected) 9770363701c341796278041fb9ea7de80eaaf41479aHavoc Pennington return; 978ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 979fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_transport_ref (transport); 980041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington (* transport->vtable->do_iteration) (transport, flags, 981041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington timeout_milliseconds); 982fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson _dbus_transport_unref (transport); 983f349e6b8c50ea6faa48c8261198cf1b07bf59a79Havoc Pennington 984d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("end\n"); 985041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 986041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 987b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 988b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonrecover_unused_bytes (DBusTransport *transport) 989b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington{ 990b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington if (_dbus_auth_needs_decoding (transport->auth)) 991b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington { 992b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington DBusString plaintext; 993b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington const DBusString *encoded; 994b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington DBusString *buffer; 995b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington int orig_len; 996b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 997fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&plaintext)) 998b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington goto nomem; 999b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1000b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_auth_get_unused_bytes (transport->auth, 1001b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington &encoded); 1002b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1003b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington if (!_dbus_auth_decode_data (transport->auth, 1004b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington encoded, &plaintext)) 1005b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington { 1006b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_string_free (&plaintext); 1007b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington goto nomem; 1008b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington } 1009b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1010b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_message_loader_get_buffer (transport->loader, 1011b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington &buffer); 1012b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1013b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington orig_len = _dbus_string_get_length (buffer); 1014b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1015b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington if (!_dbus_string_move (&plaintext, 0, buffer, 1016b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington orig_len)) 1017b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington { 1018b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_string_free (&plaintext); 1019b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington goto nomem; 1020b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington } 1021b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1022b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_verbose (" %d unused bytes sent to message loader\n", 1023b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_string_get_length (buffer) - 1024b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington orig_len); 1025b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1026b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_message_loader_return_buffer (transport->loader, 1027b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington buffer, 1028b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_string_get_length (buffer) - 1029b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington orig_len); 1030b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1031b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_auth_delete_unused_bytes (transport->auth); 1032b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1033b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_string_free (&plaintext); 1034b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington } 1035b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington else 1036b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington { 1037b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington const DBusString *bytes; 1038b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington DBusString *buffer; 1039b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington int orig_len; 1040b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington dbus_bool_t succeeded; 1041b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1042b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_message_loader_get_buffer (transport->loader, 1043b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington &buffer); 1044b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1045b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington orig_len = _dbus_string_get_length (buffer); 1046b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1047b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_auth_get_unused_bytes (transport->auth, 1048b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington &bytes); 1049b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1050b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington succeeded = TRUE; 1051b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington if (!_dbus_string_copy (bytes, 0, buffer, _dbus_string_get_length (buffer))) 1052b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington succeeded = FALSE; 1053b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1054b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_verbose (" %d unused bytes sent to message loader\n", 1055b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_string_get_length (buffer) - 1056b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington orig_len); 1057b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1058b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_message_loader_return_buffer (transport->loader, 1059b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington buffer, 1060b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_string_get_length (buffer) - 1061b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington orig_len); 1062b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1063b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington if (succeeded) 1064b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_auth_delete_unused_bytes (transport->auth); 1065b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington else 1066b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington goto nomem; 1067b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington } 1068b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1069b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington return TRUE; 1070b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1071b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington nomem: 1072b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington _dbus_verbose ("Not enough memory to transfer unused bytes from auth conversation\n"); 1073b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington return FALSE; 1074b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington} 1075b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1076502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 1077ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * Reports our current dispatch status (whether there's buffered 1078ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * data to be queued as messages, or not, or we need memory). 1079ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * 1080ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @param transport the transport 1081ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @returns current status 1082ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington */ 1083ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc PenningtonDBusDispatchStatus 1084ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington_dbus_transport_get_dispatch_status (DBusTransport *transport) 1085ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington{ 1086bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering if (_dbus_counter_get_size_value (transport->live_messages) >= transport->max_live_messages_size || 1087bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_get_unix_fd_value (transport->live_messages) >= transport->max_live_messages_unix_fds) 1088ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return DBUS_DISPATCH_COMPLETE; /* complete for now */ 1089ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1090b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington if (!_dbus_transport_get_is_authenticated (transport)) 1091b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington { 1092777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (_dbus_auth_do_work (transport->auth) == 1093777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBUS_AUTH_STATE_WAITING_FOR_MEMORY) 1094777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return DBUS_DISPATCH_NEED_MEMORY; 1095e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington else if (!_dbus_transport_get_is_authenticated (transport)) 1096777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return DBUS_DISPATCH_COMPLETE; 1097b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington } 1098777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1099777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!transport->unused_bytes_recovered && 1100777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington !recover_unused_bytes (transport)) 1101777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return DBUS_DISPATCH_NEED_MEMORY; 1102777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1103777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington transport->unused_bytes_recovered = TRUE; 1104b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 1105ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington if (!_dbus_message_loader_queue_messages (transport->loader)) 1106ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return DBUS_DISPATCH_NEED_MEMORY; 1107ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1108ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington if (_dbus_message_loader_peek_message (transport->loader) != NULL) 1109ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return DBUS_DISPATCH_DATA_REMAINS; 1110ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington else 1111ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return DBUS_DISPATCH_COMPLETE; 1112ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington} 1113ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1114ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington/** 1115ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * Processes data we've read while handling a watch, potentially 1116ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * converting some of it to messages and queueing those messages on 1117ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * the connection. 1118ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * 1119ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @param transport the transport 1120ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @returns #TRUE if we had enough memory to queue all messages 1121ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington */ 1122ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Penningtondbus_bool_t 1123ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington_dbus_transport_queue_messages (DBusTransport *transport) 1124ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington{ 1125ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington DBusDispatchStatus status; 112651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 1127a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#if 0 112851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("_dbus_transport_queue_messages()\n"); 1129a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#endif 1130ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1131ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington /* Queue any messages */ 1132ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington while ((status = _dbus_transport_get_dispatch_status (transport)) == DBUS_DISPATCH_DATA_REMAINS) 1133ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington { 1134ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington DBusMessage *message; 1135ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington DBusList *link; 1136ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1137ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington link = _dbus_message_loader_pop_message_link (transport->loader); 1138ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington _dbus_assert (link != NULL); 1139ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1140ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington message = link->data; 1141ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1142ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington _dbus_verbose ("queueing received message %p\n", message); 1143ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1144bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering if (!_dbus_message_add_counter (message, transport->live_messages)) 11454b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington { 11464b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington _dbus_message_loader_putback_message_link (transport->loader, 11474b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington link); 11484b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington status = DBUS_DISPATCH_NEED_MEMORY; 11494b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington break; 11504b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington } 11514b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington else 11524b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington { 11534b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington /* pass ownership of link and message ref to connection */ 11544b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington _dbus_connection_queue_received_message_link (transport->connection, 11554b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington link); 11564b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington } 1157ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington } 1158ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1159ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington if (_dbus_message_loader_get_is_corrupted (transport->loader)) 1160ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington { 1161ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington _dbus_verbose ("Corrupted message stream, disconnecting\n"); 1162ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington _dbus_transport_disconnect (transport); 1163ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington } 1164ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1165ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return status != DBUS_DISPATCH_NEED_MEMORY; 1166ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington} 1167ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 1168ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington/** 1169502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * See dbus_connection_set_max_message_size(). 1170502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 1171502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param transport the transport 1172502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param size the max size of a single message 1173502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 1174502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonvoid 1175502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington_dbus_transport_set_max_message_size (DBusTransport *transport, 1176502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington long size) 1177502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 1178502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington _dbus_message_loader_set_max_message_size (transport->loader, size); 1179502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 1180502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 1181502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 1182bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * See dbus_connection_set_max_message_unix_fds(). 1183bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * 1184bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param transport the transport 1185bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param n the max number of unix fds of a single message 1186bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering */ 1187bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringvoid 1188bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_transport_set_max_message_unix_fds (DBusTransport *transport, 1189bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering long n) 1190bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering{ 1191bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_message_loader_set_max_message_unix_fds (transport->loader, n); 1192bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering} 1193bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering 1194bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering/** 1195502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * See dbus_connection_get_max_message_size(). 1196502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 1197502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param transport the transport 1198502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @returns max message size 1199502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 1200502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonlong 1201502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington_dbus_transport_get_max_message_size (DBusTransport *transport) 1202502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 1203502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington return _dbus_message_loader_get_max_message_size (transport->loader); 1204502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 1205502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 1206502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 1207bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * See dbus_connection_get_max_message_unix_fds(). 1208bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * 1209bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param transport the transport 1210bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @returns max message unix fds 1211bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering */ 1212bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringlong 1213bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_transport_get_max_message_unix_fds (DBusTransport *transport) 1214bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering{ 1215bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering return _dbus_message_loader_get_max_message_unix_fds (transport->loader); 1216bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering} 1217bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering 1218bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering/** 12194b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * See dbus_connection_set_max_received_size(). 1220502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 1221502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param transport the transport 1222502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param size the max size of all incoming messages 1223502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 1224502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonvoid 12254b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington_dbus_transport_set_max_received_size (DBusTransport *transport, 12264b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington long size) 1227502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 1228502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington transport->max_live_messages_size = size; 1229bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_set_notify (transport->live_messages, 1230502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington transport->max_live_messages_size, 1231bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering transport->max_live_messages_unix_fds, 1232bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering live_messages_notify, 1233502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington transport); 1234502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 1235502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 1236bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering/** 1237bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * See dbus_connection_set_max_received_unix_fds(). 1238bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * 1239bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param transport the transport 1240bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param n the max unix fds of all incoming messages 1241bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering */ 1242bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringvoid 1243bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_transport_set_max_received_unix_fds (DBusTransport *transport, 1244bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering long n) 1245bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering{ 1246bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering transport->max_live_messages_unix_fds = n; 1247bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_set_notify (transport->live_messages, 1248bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering transport->max_live_messages_size, 1249bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering transport->max_live_messages_unix_fds, 1250bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering live_messages_notify, 1251bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering transport); 1252bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering} 1253502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 1254502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 12554b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * See dbus_connection_get_max_received_size(). 1256502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 1257502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param transport the transport 1258502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @returns max bytes for all live messages 1259502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 1260502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonlong 12614b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington_dbus_transport_get_max_received_size (DBusTransport *transport) 1262502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 1263502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington return transport->max_live_messages_size; 1264502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 1265502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 1266b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington/** 1267bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * See dbus_connection_set_max_received_unix_fds(). 1268bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * 1269bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @param transport the transport 1270bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * @returns max unix fds for all live messages 1271bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering */ 1272bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringlong 1273bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_transport_get_max_received_unix_fds (DBusTransport *transport) 1274bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering{ 1275bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering return transport->max_live_messages_unix_fds; 1276bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering} 1277bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering 1278bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering/** 1279b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * See dbus_connection_get_unix_user(). 1280b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * 1281b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param transport the transport 1282b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param uid return location for the user ID 1283b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @returns #TRUE if uid is filled in with a valid user ID 1284b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington */ 1285b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Penningtondbus_bool_t 1286b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington_dbus_transport_get_unix_user (DBusTransport *transport, 1287b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington unsigned long *uid) 1288b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington{ 128923832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington DBusCredentials *auth_identity; 1290b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 12913ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *uid = _DBUS_INT32_MAX; /* better than some root or system user in 12923ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * case of bugs in the caller. Caller should 12933ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * never use this value on purpose, however. 12943ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */ 1295b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 1296b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington if (!transport->authenticated) 1297b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington return FALSE; 1298b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 129923832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington auth_identity = _dbus_auth_get_identity (transport->auth); 1300b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 130123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington if (_dbus_credentials_include (auth_identity, 130223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington DBUS_CREDENTIAL_UNIX_USER_ID)) 1303b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington { 130423832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington *uid = _dbus_credentials_get_unix_uid (auth_identity); 1305b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington return TRUE; 1306b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington } 1307b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington else 1308b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington return FALSE; 1309b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington} 1310b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 1311b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington/** 1312c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * See dbus_connection_get_unix_process_id(). 1313c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * 1314c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * @param transport the transport 1315c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * @param pid return location for the process ID 1316c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * @returns #TRUE if uid is filled in with a valid process ID 1317c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen */ 1318c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthendbus_bool_t 1319c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen_dbus_transport_get_unix_process_id (DBusTransport *transport, 1320c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen unsigned long *pid) 1321c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{ 132223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington DBusCredentials *auth_identity; 1323c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1324c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen *pid = DBUS_PID_UNSET; /* Caller should never use this value on purpose, 1325c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * but we set it to a safe number, INT_MAX, 1326c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * just to root out possible bugs in bad callers. 1327c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen */ 1328c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1329c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!transport->authenticated) 1330c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return FALSE; 1331c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 133223832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington auth_identity = _dbus_auth_get_identity (transport->auth); 1333c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 133423832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington if (_dbus_credentials_include (auth_identity, 133523832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington DBUS_CREDENTIAL_UNIX_PROCESS_ID)) 1336c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 133723832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington *pid = _dbus_credentials_get_unix_pid (auth_identity); 1338c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return TRUE; 1339c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1340c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen else 1341c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return FALSE; 1342c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen} 1343c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1344c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen/** 1345ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * See dbus_connection_get_adt_audit_session_data(). 1346ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * 1347ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * @param transport the transport 1348ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * @param data return location for the ADT audit data 1349ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * @param data_size return length of audit data 1350ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters * @returns #TRUE if audit data is filled in with a valid ucred 1351ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters */ 1352ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Waltersdbus_bool_t 1353ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters_dbus_transport_get_adt_audit_session_data (DBusTransport *transport, 1354ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters void **data, 1355ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters int *data_size) 1356ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters{ 1357ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters DBusCredentials *auth_identity; 1358ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters 1359ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters *data = NULL; 1360ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters *data_size = 0; 1361ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters 1362ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters if (!transport->authenticated) 1363ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters return FALSE; 1364ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters 1365ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters auth_identity = _dbus_auth_get_identity (transport->auth); 1366ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters 1367ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters if (_dbus_credentials_include (auth_identity, 1368ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters DBUS_CREDENTIAL_ADT_AUDIT_DATA_ID)) 1369ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters { 1370ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters *data = (void *) _dbus_credentials_get_adt_audit_data (auth_identity); 1371ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters *data_size = _dbus_credentials_get_adt_audit_data_size (auth_identity); 1372ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters return TRUE; 1373ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters } 1374ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters else 1375ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters return FALSE; 1376ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters} 1377ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters 1378ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters/** 1379b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * See dbus_connection_set_unix_user_function(). 1380b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * 1381b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param transport the transport 1382b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param function the predicate 1383b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param data data to pass to the predicate 1384b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param free_data_function function to free the data 1385b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param old_data the old user data to be freed 1386b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington * @param old_free_data_function old free data function to free it with 1387b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington */ 1388b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Penningtonvoid 1389b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington_dbus_transport_set_unix_user_function (DBusTransport *transport, 1390b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington DBusAllowUnixUserFunction function, 1391b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington void *data, 1392b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington DBusFreeFunction free_data_function, 1393b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington void **old_data, 1394b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington DBusFreeFunction *old_free_data_function) 1395b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington{ 1396b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington *old_data = transport->unix_user_data; 1397b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington *old_free_data_function = transport->free_unix_user_data; 1398b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 1399b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington transport->unix_user_function = function; 1400b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington transport->unix_user_data = data; 1401b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington transport->free_unix_user_data = free_data_function; 1402b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington} 1403b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington 140444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington/** 14057be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * See dbus_connection_get_windows_user(). 14067be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * 14077be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param transport the transport 14087be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param windows_sid_p return location for the user ID 14097be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @returns #TRUE if user is available; the returned value may still be #NULL if no memory to copy it 14107be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */ 14117be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtondbus_bool_t 14127be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington_dbus_transport_get_windows_user (DBusTransport *transport, 14137be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington char **windows_sid_p) 14147be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{ 14157be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusCredentials *auth_identity; 14167be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14177be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington *windows_sid_p = NULL; 14187be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14197be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (!transport->authenticated) 14207be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return FALSE; 14217be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14227be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington auth_identity = _dbus_auth_get_identity (transport->auth); 14237be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14247be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (_dbus_credentials_include (auth_identity, 14257be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBUS_CREDENTIAL_WINDOWS_SID)) 14267be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington { 14277be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* If no memory, we are supposed to return TRUE and set NULL */ 14287be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington *windows_sid_p = _dbus_strdup (_dbus_credentials_get_windows_sid (auth_identity)); 14297be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14307be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return TRUE; 14317be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington } 14327be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington else 14337be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return FALSE; 14347be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington} 14357be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14367be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington/** 14377be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * See dbus_connection_set_windows_user_function(). 14387be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * 14397be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param transport the transport 14407be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param function the predicate 14417be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param data data to pass to the predicate 14427be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param free_data_function function to free the data 14437be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param old_data the old user data to be freed 14447be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * @param old_free_data_function old free data function to free it with 14457be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */ 14467be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14477be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonvoid 14487be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington_dbus_transport_set_windows_user_function (DBusTransport *transport, 14497be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusAllowWindowsUserFunction function, 14507be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington void *data, 14517be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusFreeFunction free_data_function, 14527be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington void **old_data, 14537be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusFreeFunction *old_free_data_function) 14547be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{ 14557be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington *old_data = transport->windows_user_data; 14567be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington *old_free_data_function = transport->free_windows_user_data; 14577be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14587be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington transport->windows_user_function = function; 14597be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington transport->windows_user_data = data; 14607be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington transport->free_windows_user_data = free_data_function; 14617be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington} 14627be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 14637be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington/** 146444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * Sets the SASL authentication mechanisms supported by this transport. 146544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * 146644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param transport the transport 146744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param mechanisms the #NULL-terminated array of mechanisms 146844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * 146944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @returns #FALSE if no memory 147044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington */ 147144ed933284589134603913b05f55ca55e8c5a566Havoc Penningtondbus_bool_t 147244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington_dbus_transport_set_auth_mechanisms (DBusTransport *transport, 147344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington const char **mechanisms) 147444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{ 147544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return _dbus_auth_set_mechanisms (transport->auth, mechanisms); 147644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington} 147744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 147894125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington/** 147994125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * See dbus_connection_set_allow_anonymous() 148094125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * 148194125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * @param transport the transport 148294125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington * @param value #TRUE to allow anonymous connection 148394125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington */ 148494125e89b6be74cb20100d5321a98aa6529187a9Havoc Penningtonvoid 148594125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington_dbus_transport_set_allow_anonymous (DBusTransport *transport, 148694125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington dbus_bool_t value) 148794125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington{ 148894125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington transport->allow_anonymous = value != FALSE; 148994125e89b6be74cb20100d5321a98aa6529187a9Havoc Pennington} 149044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 1491041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** @} */ 1492