bus.c revision 68a3c593b9e77b33614726363c7b6fd85d113021
1/* -*- mode: C; c-file-style: "gnu" -*- */
2/* bus.c  message bus context object
3 *
4 * Copyright (C) 2003 Red Hat, Inc.
5 *
6 * Licensed under the Academic Free License version 1.2
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21 *
22 */
23
24#include "bus.h"
25#include "activation.h"
26#include "connection.h"
27#include "services.h"
28#include "utils.h"
29#include "policy.h"
30#include "config-parser.h"
31#include <dbus/dbus-list.h>
32#include <dbus/dbus-hash.h>
33#include <dbus/dbus-internals.h>
34
35struct BusContext
36{
37  int refcount;
38  char *type;
39  char *address;
40  char *pidfile;
41  DBusLoop *loop;
42  DBusList *servers;
43  BusConnections *connections;
44  BusActivation *activation;
45  BusRegistry *registry;
46  BusPolicy *policy;
47  DBusUserDatabase *user_database;
48  BusLimits limits;
49};
50
51static dbus_int32_t server_data_slot = -1;
52
53typedef struct
54{
55  BusContext *context;
56} BusServerData;
57
58#define BUS_SERVER_DATA(server) (dbus_server_get_data ((server), server_data_slot))
59
60static BusContext*
61server_get_context (DBusServer *server)
62{
63  BusContext *context;
64  BusServerData *bd;
65
66  if (!dbus_server_allocate_data_slot (&server_data_slot))
67    return NULL;
68
69  bd = BUS_SERVER_DATA (server);
70  if (bd == NULL)
71    {
72      dbus_server_free_data_slot (&server_data_slot);
73      return NULL;
74    }
75
76  context = bd->context;
77
78  dbus_server_free_data_slot (&server_data_slot);
79
80  return context;
81}
82
83static dbus_bool_t
84server_watch_callback (DBusWatch     *watch,
85                       unsigned int   condition,
86                       void          *data)
87{
88  /* FIXME this can be done in dbus-mainloop.c
89   * if the code in activation.c for the babysitter
90   * watch handler is fixed.
91   */
92
93  return dbus_watch_handle (watch, condition);
94}
95
96static dbus_bool_t
97add_server_watch (DBusWatch  *watch,
98                  void       *data)
99{
100  DBusServer *server = data;
101  BusContext *context;
102
103  context = server_get_context (server);
104
105  return _dbus_loop_add_watch (context->loop,
106                               watch, server_watch_callback, server,
107                               NULL);
108}
109
110static void
111remove_server_watch (DBusWatch  *watch,
112                     void       *data)
113{
114  DBusServer *server = data;
115  BusContext *context;
116
117  context = server_get_context (server);
118
119  _dbus_loop_remove_watch (context->loop,
120                           watch, server_watch_callback, server);
121}
122
123
124static void
125server_timeout_callback (DBusTimeout   *timeout,
126                         void          *data)
127{
128  /* can return FALSE on OOM but we just let it fire again later */
129  dbus_timeout_handle (timeout);
130}
131
132static dbus_bool_t
133add_server_timeout (DBusTimeout *timeout,
134                    void        *data)
135{
136  DBusServer *server = data;
137  BusContext *context;
138
139  context = server_get_context (server);
140
141  return _dbus_loop_add_timeout (context->loop,
142                                 timeout, server_timeout_callback, server, NULL);
143}
144
145static void
146remove_server_timeout (DBusTimeout *timeout,
147                       void        *data)
148{
149  DBusServer *server = data;
150  BusContext *context;
151
152  context = server_get_context (server);
153
154  _dbus_loop_remove_timeout (context->loop,
155                             timeout, server_timeout_callback, server);
156}
157
158static void
159new_connection_callback (DBusServer     *server,
160                         DBusConnection *new_connection,
161                         void           *data)
162{
163  BusContext *context = data;
164
165  if (!bus_connections_setup_connection (context->connections, new_connection))
166    {
167      _dbus_verbose ("No memory to setup new connection\n");
168
169      /* if we don't do this, it will get unref'd without
170       * being disconnected... kind of strange really
171       * that we have to do this, people won't get it right
172       * in general.
173       */
174      dbus_connection_disconnect (new_connection);
175    }
176
177  dbus_connection_set_max_received_size (new_connection,
178                                         context->limits.max_incoming_bytes);
179
180  dbus_connection_set_max_message_size (new_connection,
181                                        context->limits.max_message_size);
182
183  /* on OOM, we won't have ref'd the connection so it will die. */
184}
185
186static void
187free_server_data (void *data)
188{
189  BusServerData *bd = data;
190
191  dbus_free (bd);
192}
193
194static dbus_bool_t
195setup_server (BusContext *context,
196              DBusServer *server,
197              char      **auth_mechanisms,
198              DBusError  *error)
199{
200  BusServerData *bd;
201
202  bd = dbus_new0 (BusServerData, 1);
203  if (!dbus_server_set_data (server,
204                             server_data_slot,
205                             bd, free_server_data))
206    {
207      dbus_free (bd);
208      BUS_SET_OOM (error);
209      return FALSE;
210    }
211
212  bd->context = context;
213
214  if (!dbus_server_set_auth_mechanisms (server, (const char**) auth_mechanisms))
215    {
216      BUS_SET_OOM (error);
217      return FALSE;
218    }
219
220  dbus_server_set_new_connection_function (server,
221                                           new_connection_callback,
222                                           context, NULL);
223
224  if (!dbus_server_set_watch_functions (server,
225                                        add_server_watch,
226                                        remove_server_watch,
227                                        NULL,
228                                        server,
229                                        NULL))
230    {
231      BUS_SET_OOM (error);
232      return FALSE;
233    }
234
235  if (!dbus_server_set_timeout_functions (server,
236                                          add_server_timeout,
237                                          remove_server_timeout,
238                                          NULL,
239                                          server, NULL))
240    {
241      BUS_SET_OOM (error);
242      return FALSE;
243    }
244
245  return TRUE;
246}
247
248BusContext*
249bus_context_new (const DBusString *config_file,
250                 dbus_bool_t       force_fork,
251                 int               print_addr_fd,
252                 int               print_pid_fd,
253                 DBusError        *error)
254{
255  BusContext *context;
256  DBusList *link;
257  DBusList **addresses;
258  BusConfigParser *parser;
259  DBusString full_address;
260  const char *user, *pidfile;
261  char **auth_mechanisms;
262  DBusList **auth_mechanisms_list;
263  int len;
264
265  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
266
267  if (!_dbus_string_init (&full_address))
268    {
269      BUS_SET_OOM (error);
270      return NULL;
271    }
272
273  if (!dbus_server_allocate_data_slot (&server_data_slot))
274    {
275      BUS_SET_OOM (error);
276      _dbus_string_free (&full_address);
277      return NULL;
278    }
279
280  parser = NULL;
281  context = NULL;
282  auth_mechanisms = NULL;
283
284  parser = bus_config_load (config_file, TRUE, error);
285  if (parser == NULL)
286    goto failed;
287
288  /* Check for an existing pid file. Of course this is a race;
289   * we'd have to use fcntl() locks on the pid file to
290   * avoid that. But we want to check for the pid file
291   * before overwriting any existing sockets, etc.
292   */
293  pidfile = bus_config_parser_get_pidfile (parser);
294  if (pidfile != NULL)
295    {
296      DBusString u;
297      DBusStat stbuf;
298      DBusError tmp_error;
299
300      dbus_error_init (&tmp_error);
301      _dbus_string_init_const (&u, pidfile);
302
303      if (_dbus_stat (&u, &stbuf, &tmp_error))
304	{
305	  dbus_set_error (error, DBUS_ERROR_FAILED,
306			  "The pid file \"%s\" exists, if the message bus is not running, remove this file",
307			  pidfile);
308	  dbus_error_free (&tmp_error);
309	  goto failed;
310	}
311    }
312
313  context = dbus_new0 (BusContext, 1);
314  if (context == NULL)
315    {
316      BUS_SET_OOM (error);
317      goto failed;
318    }
319
320  context->refcount = 1;
321
322  /* get our limits and timeout lengths */
323  bus_config_parser_get_limits (parser, &context->limits);
324
325  /* we need another ref of the server data slot for the context
326   * to own
327   */
328  if (!dbus_server_allocate_data_slot (&server_data_slot))
329    _dbus_assert_not_reached ("second ref of server data slot failed");
330
331  context->user_database = _dbus_user_database_new ();
332  if (context->user_database == NULL)
333    {
334      BUS_SET_OOM (error);
335      goto failed;
336    }
337
338  context->loop = _dbus_loop_new ();
339  if (context->loop == NULL)
340    {
341      BUS_SET_OOM (error);
342      goto failed;
343    }
344
345  /* Build an array of auth mechanisms */
346
347  auth_mechanisms_list = bus_config_parser_get_mechanisms (parser);
348  len = _dbus_list_get_length (auth_mechanisms_list);
349
350  if (len > 0)
351    {
352      int i;
353
354      auth_mechanisms = dbus_new0 (char*, len + 1);
355      if (auth_mechanisms == NULL)
356        goto failed;
357
358      i = 0;
359      link = _dbus_list_get_first_link (auth_mechanisms_list);
360      while (link != NULL)
361        {
362          auth_mechanisms[i] = _dbus_strdup (link->data);
363          if (auth_mechanisms[i] == NULL)
364            goto failed;
365          link = _dbus_list_get_next_link (auth_mechanisms_list, link);
366        }
367    }
368  else
369    {
370      auth_mechanisms = NULL;
371    }
372
373  /* Listen on our addresses */
374
375  addresses = bus_config_parser_get_addresses (parser);
376
377  link = _dbus_list_get_first_link (addresses);
378  while (link != NULL)
379    {
380      DBusServer *server;
381
382      server = dbus_server_listen (link->data, error);
383      if (server == NULL)
384        goto failed;
385      else if (!setup_server (context, server, auth_mechanisms, error))
386        goto failed;
387
388      if (!_dbus_list_append (&context->servers, server))
389        {
390          BUS_SET_OOM (error);
391          goto failed;
392        }
393
394      link = _dbus_list_get_next_link (addresses, link);
395    }
396
397  /* note that type may be NULL */
398  context->type = _dbus_strdup (bus_config_parser_get_type (parser));
399
400  /* We have to build the address backward, so that
401   * <listen> later in the config file have priority
402   */
403  link = _dbus_list_get_last_link (&context->servers);
404  while (link != NULL)
405    {
406      char *addr;
407
408      addr = dbus_server_get_address (link->data);
409      if (addr == NULL)
410        {
411          BUS_SET_OOM (error);
412          goto failed;
413        }
414
415      if (_dbus_string_get_length (&full_address) > 0)
416        {
417          if (!_dbus_string_append (&full_address, ";"))
418            {
419              BUS_SET_OOM (error);
420              goto failed;
421            }
422        }
423
424      if (!_dbus_string_append (&full_address, addr))
425        {
426          BUS_SET_OOM (error);
427          goto failed;
428        }
429
430      dbus_free (addr);
431
432      link = _dbus_list_get_prev_link (&context->servers, link);
433    }
434
435  if (!_dbus_string_copy_data (&full_address, &context->address))
436    {
437      BUS_SET_OOM (error);
438      goto failed;
439    }
440
441  /* Note that we don't know whether the print_addr_fd is
442   * one of the sockets we're using to listen on, or some
443   * other random thing. But I think the answer is "don't do
444   * that then"
445   */
446  if (print_addr_fd >= 0)
447    {
448      DBusString addr;
449      const char *a = bus_context_get_address (context);
450      int bytes;
451
452      _dbus_assert (a != NULL);
453      if (!_dbus_string_init (&addr))
454        {
455          BUS_SET_OOM (error);
456          goto failed;
457        }
458
459      if (!_dbus_string_append (&addr, a) ||
460          !_dbus_string_append (&addr, "\n"))
461        {
462          _dbus_string_free (&addr);
463          BUS_SET_OOM (error);
464          goto failed;
465        }
466
467      bytes = _dbus_string_get_length (&addr);
468      if (_dbus_write (print_addr_fd, &addr, 0, bytes) != bytes)
469        {
470          dbus_set_error (error, DBUS_ERROR_FAILED,
471                          "Printing message bus address: %s\n",
472                          _dbus_strerror (errno));
473          _dbus_string_free (&addr);
474          goto failed;
475        }
476
477      if (print_addr_fd > 2)
478        _dbus_close (print_addr_fd, NULL);
479
480      _dbus_string_free (&addr);
481    }
482
483  /* Create activation subsystem */
484
485  context->activation = bus_activation_new (context, &full_address,
486                                            bus_config_parser_get_service_dirs (parser),
487                                            error);
488  if (context->activation == NULL)
489    {
490      _DBUS_ASSERT_ERROR_IS_SET (error);
491      goto failed;
492    }
493
494  context->connections = bus_connections_new (context);
495  if (context->connections == NULL)
496    {
497      BUS_SET_OOM (error);
498      goto failed;
499    }
500
501  context->registry = bus_registry_new (context);
502  if (context->registry == NULL)
503    {
504      BUS_SET_OOM (error);
505      goto failed;
506    }
507
508  context->policy = bus_config_parser_steal_policy (parser);
509  _dbus_assert (context->policy != NULL);
510
511  /* Now become a daemon if appropriate */
512  if (force_fork || bus_config_parser_get_fork (parser))
513    {
514      DBusString u;
515
516      if (pidfile)
517        _dbus_string_init_const (&u, pidfile);
518
519      if (!_dbus_become_daemon (pidfile ? &u : NULL, error))
520        goto failed;
521    }
522  else
523    {
524      /* Need to write PID file for ourselves, not for the child process */
525      if (pidfile != NULL)
526        {
527          DBusString u;
528
529          _dbus_string_init_const (&u, pidfile);
530
531          if (!_dbus_write_pid_file (&u, _dbus_getpid (), error))
532            goto failed;
533        }
534    }
535
536  /* keep around the pid filename so we can delete it later */
537  context->pidfile = _dbus_strdup (pidfile);
538
539  /* Write PID if requested */
540  if (print_pid_fd >= 0)
541    {
542      DBusString pid;
543      int bytes;
544
545      if (!_dbus_string_init (&pid))
546        {
547          BUS_SET_OOM (error);
548          goto failed;
549        }
550
551      if (!_dbus_string_append_int (&pid, _dbus_getpid ()) ||
552          !_dbus_string_append (&pid, "\n"))
553        {
554          _dbus_string_free (&pid);
555          BUS_SET_OOM (error);
556          goto failed;
557        }
558
559      bytes = _dbus_string_get_length (&pid);
560      if (_dbus_write (print_pid_fd, &pid, 0, bytes) != bytes)
561        {
562          dbus_set_error (error, DBUS_ERROR_FAILED,
563                          "Printing message bus PID: %s\n",
564                          _dbus_strerror (errno));
565          _dbus_string_free (&pid);
566          goto failed;
567        }
568
569      if (print_pid_fd > 2)
570        _dbus_close (print_pid_fd, NULL);
571
572      _dbus_string_free (&pid);
573    }
574
575  /* Here we change our credentials if required,
576   * as soon as we've set up our sockets and pidfile
577   */
578  user = bus_config_parser_get_user (parser);
579  if (user != NULL)
580    {
581      DBusCredentials creds;
582      DBusString u;
583
584      _dbus_string_init_const (&u, user);
585
586      if (!_dbus_credentials_from_username (&u, &creds) ||
587          creds.uid < 0 ||
588          creds.gid < 0)
589        {
590          dbus_set_error (error, DBUS_ERROR_FAILED,
591                          "Could not get UID and GID for username \"%s\"",
592                          user);
593          goto failed;
594        }
595
596      if (!_dbus_change_identity (creds.uid, creds.gid, error))
597        goto failed;
598    }
599
600  bus_config_parser_unref (parser);
601  _dbus_string_free (&full_address);
602  dbus_free_string_array (auth_mechanisms);
603  dbus_server_free_data_slot (&server_data_slot);
604
605  return context;
606
607 failed:
608  if (parser != NULL)
609    bus_config_parser_unref (parser);
610
611  if (context != NULL)
612    bus_context_unref (context);
613
614  _dbus_string_free (&full_address);
615  dbus_free_string_array (auth_mechanisms);
616
617  dbus_server_free_data_slot (&server_data_slot);
618
619  return NULL;
620}
621
622static void
623shutdown_server (BusContext *context,
624                 DBusServer *server)
625{
626  if (server == NULL ||
627      !dbus_server_get_is_connected (server))
628    return;
629
630  if (!dbus_server_set_watch_functions (server,
631                                        NULL, NULL, NULL,
632                                        context,
633                                        NULL))
634    _dbus_assert_not_reached ("setting watch functions to NULL failed");
635
636  if (!dbus_server_set_timeout_functions (server,
637                                          NULL, NULL, NULL,
638                                          context,
639                                          NULL))
640    _dbus_assert_not_reached ("setting timeout functions to NULL failed");
641
642  dbus_server_disconnect (server);
643}
644
645void
646bus_context_shutdown (BusContext  *context)
647{
648  DBusList *link;
649
650  link = _dbus_list_get_first_link (&context->servers);
651  while (link != NULL)
652    {
653      shutdown_server (context, link->data);
654
655      link = _dbus_list_get_next_link (&context->servers, link);
656    }
657}
658
659void
660bus_context_ref (BusContext *context)
661{
662  _dbus_assert (context->refcount > 0);
663  context->refcount += 1;
664}
665
666void
667bus_context_unref (BusContext *context)
668{
669  _dbus_assert (context->refcount > 0);
670  context->refcount -= 1;
671
672  if (context->refcount == 0)
673    {
674      DBusList *link;
675
676      _dbus_verbose ("Finalizing bus context %p\n", context);
677
678      bus_context_shutdown (context);
679
680      if (context->connections)
681        {
682          bus_connections_unref (context->connections);
683          context->connections = NULL;
684        }
685
686      if (context->registry)
687        {
688          bus_registry_unref (context->registry);
689          context->registry = NULL;
690        }
691
692      if (context->activation)
693        {
694          bus_activation_unref (context->activation);
695          context->activation = NULL;
696        }
697
698      link = _dbus_list_get_first_link (&context->servers);
699      while (link != NULL)
700        {
701          dbus_server_unref (link->data);
702
703          link = _dbus_list_get_next_link (&context->servers, link);
704        }
705      _dbus_list_clear (&context->servers);
706
707      if (context->policy)
708        {
709          bus_policy_unref (context->policy);
710          context->policy = NULL;
711        }
712
713      if (context->loop)
714        {
715          _dbus_loop_unref (context->loop);
716          context->loop = NULL;
717        }
718
719      dbus_free (context->type);
720      dbus_free (context->address);
721
722      if (context->pidfile)
723	{
724          DBusString u;
725          _dbus_string_init_const (&u, context->pidfile);
726
727          /* Deliberately ignore errors here, since there's not much
728	   * we can do about it, and we're exiting anyways.
729	   */
730	  _dbus_delete_file (&u, NULL);
731
732          dbus_free (context->pidfile);
733	}
734
735      _dbus_user_database_unref (context->user_database);
736
737      dbus_free (context);
738
739      dbus_server_free_data_slot (&server_data_slot);
740    }
741}
742
743/* type may be NULL */
744const char*
745bus_context_get_type (BusContext *context)
746{
747  return context->type;
748}
749
750const char*
751bus_context_get_address (BusContext *context)
752{
753  return context->address;
754}
755
756BusRegistry*
757bus_context_get_registry (BusContext  *context)
758{
759  return context->registry;
760}
761
762BusConnections*
763bus_context_get_connections (BusContext  *context)
764{
765  return context->connections;
766}
767
768BusActivation*
769bus_context_get_activation (BusContext  *context)
770{
771  return context->activation;
772}
773
774DBusLoop*
775bus_context_get_loop (BusContext *context)
776{
777  return context->loop;
778}
779
780DBusUserDatabase*
781bus_context_get_user_database (BusContext *context)
782{
783  return context->user_database;
784}
785
786dbus_bool_t
787bus_context_allow_user (BusContext   *context,
788                        unsigned long uid)
789{
790  return bus_policy_allow_user (context->policy,
791                                context->user_database,
792                                uid);
793}
794
795BusClientPolicy*
796bus_context_create_client_policy (BusContext      *context,
797                                  DBusConnection  *connection,
798                                  DBusError       *error)
799{
800  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
801  return bus_policy_create_client_policy (context->policy, connection,
802                                          error);
803}
804
805int
806bus_context_get_activation_timeout (BusContext *context)
807{
808
809  return context->limits.activation_timeout;
810}
811
812int
813bus_context_get_auth_timeout (BusContext *context)
814{
815  return context->limits.auth_timeout;
816}
817
818int
819bus_context_get_max_completed_connections (BusContext *context)
820{
821  return context->limits.max_completed_connections;
822}
823
824int
825bus_context_get_max_incomplete_connections (BusContext *context)
826{
827  return context->limits.max_incomplete_connections;
828}
829
830int
831bus_context_get_max_connections_per_user (BusContext *context)
832{
833  return context->limits.max_connections_per_user;
834}
835
836int
837bus_context_get_max_pending_activations (BusContext *context)
838{
839  return context->limits.max_pending_activations;
840}
841
842int
843bus_context_get_max_services_per_connection (BusContext *context)
844{
845  return context->limits.max_services_per_connection;
846}
847
848dbus_bool_t
849bus_context_check_security_policy (BusContext     *context,
850                                   DBusConnection *sender,
851                                   DBusConnection *recipient,
852                                   DBusMessage    *message,
853                                   DBusError      *error)
854{
855  BusClientPolicy *sender_policy;
856  BusClientPolicy *recipient_policy;
857
858  /* NULL sender/receiver means the bus driver */
859
860  if (sender != NULL)
861    {
862      if (bus_connection_is_active (sender))
863        {
864          sender_policy = bus_connection_get_policy (sender);
865          _dbus_assert (sender_policy != NULL);
866        }
867      else
868        {
869          /* Policy for inactive connections is that they can only send
870           * the hello message to the bus driver
871           */
872          if (recipient == NULL &&
873              dbus_message_is_method_call (message,
874                                           DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
875                                           "Hello"))
876            {
877              _dbus_verbose ("security check allowing %s message\n",
878                             "Hello");
879              return TRUE;
880            }
881          else
882            {
883              _dbus_verbose ("security check disallowing non-%s message\n",
884                             "Hello");
885
886              dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
887                              "Client tried to send a message other than %s without being registered",
888                              "Hello");
889
890              return FALSE;
891            }
892        }
893    }
894  else
895    sender_policy = NULL;
896
897  _dbus_assert ((sender != NULL && sender_policy != NULL) ||
898                (sender == NULL && sender_policy == NULL));
899
900  if (recipient != NULL)
901    {
902      /* only the bus driver can send to an inactive recipient (as it
903       * owns no services, so other apps can't address it). Inactive
904       * recipients can receive any message.
905       */
906      if (bus_connection_is_active (recipient))
907        {
908          recipient_policy = bus_connection_get_policy (recipient);
909          _dbus_assert (recipient_policy != NULL);
910        }
911      else if (sender == NULL)
912        {
913          _dbus_verbose ("security check using NULL recipient policy for message from bus\n");
914          recipient_policy = NULL;
915        }
916      else
917        {
918          _dbus_assert_not_reached ("a message was somehow sent to an inactive recipient from a source other than the message bus\n");
919          recipient_policy = NULL;
920        }
921    }
922  else
923    recipient_policy = NULL;
924
925  _dbus_assert ((recipient != NULL && recipient_policy != NULL) ||
926                (recipient != NULL && sender == NULL && recipient_policy == NULL) ||
927                (recipient == NULL && recipient_policy == NULL));
928
929  if (sender_policy &&
930      !bus_client_policy_check_can_send (sender_policy,
931                                         context->registry, recipient,
932                                         message))
933    {
934      const char *dest = dbus_message_get_destination (message);
935      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
936                      "A security policy in place prevents this sender "
937                      "from sending this message to this recipient, "
938                      "see message bus configuration file (rejected message "
939                      "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\")",
940                      dbus_message_get_interface (message) ?
941                      dbus_message_get_interface (message) : "(unset)",
942                      dbus_message_get_member (message) ?
943                      dbus_message_get_member (message) : "(unset)",
944                      dbus_message_get_error_name (message) ?
945                      dbus_message_get_error_name (message) : "(unset)",
946                      dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
947      _dbus_verbose ("security policy disallowing message due to sender policy\n");
948      return FALSE;
949    }
950
951  if (recipient_policy &&
952      !bus_client_policy_check_can_receive (recipient_policy,
953                                            context->registry, sender,
954                                            message))
955    {
956      const char *dest = dbus_message_get_destination (message);
957      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
958                      "A security policy in place prevents this recipient "
959                      "from receiving this message from this sender, "
960                      "see message bus configuration file (rejected message "
961                      "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\")",
962                      dbus_message_get_interface (message) ?
963                      dbus_message_get_interface (message) : "(unset)",
964                      dbus_message_get_member (message) ?
965                      dbus_message_get_member (message) : "(unset)",
966                      dbus_message_get_error_name (message) ?
967                      dbus_message_get_error_name (message) : "(unset)",
968                      dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
969      _dbus_verbose ("security policy disallowing message due to recipient policy\n");
970      return FALSE;
971    }
972
973  /* See if limits on size have been exceeded */
974  if (recipient &&
975      dbus_connection_get_outgoing_size (recipient) >
976      context->limits.max_outgoing_bytes)
977    {
978      const char *dest = dbus_message_get_destination (message);
979      dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
980                      "The destination service \"%s\" has a full message queue",
981                      dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
982      _dbus_verbose ("security policy disallowing message due to full message queue\n");
983      return FALSE;
984    }
985
986  _dbus_verbose ("security policy allowing message\n");
987  return TRUE;
988}
989