Merge remote-tracking branch 'origin/dbus-1.8'
[platform/upstream/dbus.git] / bus / bus.c
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* bus.c  message bus context object
3  *
4  * Copyright (C) 2003, 2004 Red Hat, Inc.
5  *
6  * Licensed under the Academic Free License version 2.1
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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  *
22  */
23
24 #include <config.h>
25 #include "bus.h"
26
27 #include <stdio.h>
28
29 #include "activation.h"
30 #include "connection.h"
31 #include "services.h"
32 #include "utils.h"
33 #include "policy.h"
34 #include "config-parser.h"
35 #include "signals.h"
36 #include "selinux.h"
37 #include "apparmor.h"
38 #include "dir-watch.h"
39 #include <dbus/dbus-list.h>
40 #include <dbus/dbus-hash.h>
41 #include <dbus/dbus-credentials.h>
42 #include <dbus/dbus-internals.h>
43 #include <dbus/dbus-server-protected.h>
44
45 #ifdef DBUS_CYGWIN
46 #include <signal.h>
47 #endif
48
49 struct BusContext
50 {
51   int refcount;
52   DBusGUID uuid;
53   char *config_file;
54   char *type;
55   char *servicehelper;
56   char *address;
57   char *pidfile;
58   char *user;
59   char *log_prefix;
60   DBusLoop *loop;
61   DBusList *servers;
62   BusConnections *connections;
63   BusActivation *activation;
64   BusRegistry *registry;
65   BusPolicy *policy;
66   BusMatchmaker *matchmaker;
67   BusLimits limits;
68   DBusRLimit *initial_fd_limit;
69   unsigned int fork : 1;
70   unsigned int syslog : 1;
71   unsigned int keep_umask : 1;
72   unsigned int allow_anonymous : 1;
73   unsigned int systemd_activation : 1;
74   dbus_bool_t watches_enabled;
75 };
76
77 static dbus_int32_t server_data_slot = -1;
78
79 typedef struct
80 {
81   BusContext *context;
82 } BusServerData;
83
84 #define BUS_SERVER_DATA(server) (dbus_server_get_data ((server), server_data_slot))
85
86 static BusContext*
87 server_get_context (DBusServer *server)
88 {
89   BusContext *context;
90   BusServerData *bd;
91
92   if (!dbus_server_allocate_data_slot (&server_data_slot))
93     return NULL;
94
95   bd = BUS_SERVER_DATA (server);
96   if (bd == NULL)
97     {
98       dbus_server_free_data_slot (&server_data_slot);
99       return NULL;
100     }
101
102   context = bd->context;
103
104   dbus_server_free_data_slot (&server_data_slot);
105
106   return context;
107 }
108
109 static dbus_bool_t
110 add_server_watch (DBusWatch  *watch,
111                   void       *data)
112 {
113   DBusServer *server = data;
114   BusContext *context;
115
116   context = server_get_context (server);
117
118   return _dbus_loop_add_watch (context->loop, watch);
119 }
120
121 static void
122 remove_server_watch (DBusWatch  *watch,
123                      void       *data)
124 {
125   DBusServer *server = data;
126   BusContext *context;
127
128   context = server_get_context (server);
129
130   _dbus_loop_remove_watch (context->loop, watch);
131 }
132
133 static void
134 toggle_server_watch (DBusWatch  *watch,
135                      void       *data)
136 {
137   DBusServer *server = data;
138   BusContext *context;
139
140   context = server_get_context (server);
141
142   _dbus_loop_toggle_watch (context->loop, watch);
143 }
144
145 static dbus_bool_t
146 add_server_timeout (DBusTimeout *timeout,
147                     void        *data)
148 {
149   DBusServer *server = data;
150   BusContext *context;
151
152   context = server_get_context (server);
153
154   return _dbus_loop_add_timeout (context->loop, timeout);
155 }
156
157 static void
158 remove_server_timeout (DBusTimeout *timeout,
159                        void        *data)
160 {
161   DBusServer *server = data;
162   BusContext *context;
163
164   context = server_get_context (server);
165
166   _dbus_loop_remove_timeout (context->loop, timeout);
167 }
168
169 static void
170 new_connection_callback (DBusServer     *server,
171                          DBusConnection *new_connection,
172                          void           *data)
173 {
174   BusContext *context = data;
175
176   if (!bus_connections_setup_connection (context->connections, new_connection))
177     {
178       _dbus_verbose ("No memory to setup new connection\n");
179
180       /* if we don't do this, it will get unref'd without
181        * being disconnected... kind of strange really
182        * that we have to do this, people won't get it right
183        * in general.
184        */
185       dbus_connection_close (new_connection);
186     }
187
188   dbus_connection_set_max_received_size (new_connection,
189                                          context->limits.max_incoming_bytes);
190
191   dbus_connection_set_max_message_size (new_connection,
192                                         context->limits.max_message_size);
193
194   dbus_connection_set_max_received_unix_fds (new_connection,
195                                          context->limits.max_incoming_unix_fds);
196
197   dbus_connection_set_max_message_unix_fds (new_connection,
198                                         context->limits.max_message_unix_fds);
199
200   dbus_connection_set_allow_anonymous (new_connection,
201                                        context->allow_anonymous);
202
203   /* on OOM, we won't have ref'd the connection so it will die. */
204 }
205
206 static void
207 free_server_data (void *data)
208 {
209   BusServerData *bd = data;
210
211   dbus_free (bd);
212 }
213
214 static dbus_bool_t
215 setup_server (BusContext *context,
216               DBusServer *server,
217               char      **auth_mechanisms,
218               DBusError  *error)
219 {
220   BusServerData *bd;
221
222   bd = dbus_new0 (BusServerData, 1);
223   if (bd == NULL || !dbus_server_set_data (server,
224                                            server_data_slot,
225                                            bd, free_server_data))
226     {
227       dbus_free (bd);
228       BUS_SET_OOM (error);
229       return FALSE;
230     }
231
232   bd->context = context;
233
234   if (!dbus_server_set_auth_mechanisms (server, (const char**) auth_mechanisms))
235     {
236       BUS_SET_OOM (error);
237       return FALSE;
238     }
239
240   dbus_server_set_new_connection_function (server,
241                                            new_connection_callback,
242                                            context, NULL);
243
244   if (!dbus_server_set_watch_functions (server,
245                                         add_server_watch,
246                                         remove_server_watch,
247                                         toggle_server_watch,
248                                         server,
249                                         NULL))
250     {
251       BUS_SET_OOM (error);
252       return FALSE;
253     }
254
255   if (!dbus_server_set_timeout_functions (server,
256                                           add_server_timeout,
257                                           remove_server_timeout,
258                                           NULL,
259                                           server, NULL))
260     {
261       BUS_SET_OOM (error);
262       return FALSE;
263     }
264
265   return TRUE;
266 }
267
268 /* This code only gets executed the first time the
269  * config files are parsed.  It is not executed
270  * when config files are reloaded.
271  */
272 static dbus_bool_t
273 process_config_first_time_only (BusContext       *context,
274                                 BusConfigParser  *parser,
275                                 const DBusString *address,
276                                 BusContextFlags   flags,
277                                 DBusError        *error)
278 {
279   DBusString log_prefix;
280   DBusList *link;
281   DBusList **addresses;
282   const char *user, *pidfile;
283   char **auth_mechanisms;
284   DBusList **auth_mechanisms_list;
285   int len;
286   dbus_bool_t retval;
287
288   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
289
290   retval = FALSE;
291   auth_mechanisms = NULL;
292   pidfile = NULL;
293
294   _dbus_init_system_log (TRUE);
295
296   if (flags & BUS_CONTEXT_FLAG_SYSTEMD_ACTIVATION)
297     context->systemd_activation = TRUE;
298   else
299     context->systemd_activation = FALSE;
300
301   /* Check for an existing pid file. Of course this is a race;
302    * we'd have to use fcntl() locks on the pid file to
303    * avoid that. But we want to check for the pid file
304    * before overwriting any existing sockets, etc.
305    */
306
307   if (flags & BUS_CONTEXT_FLAG_WRITE_PID_FILE)
308     pidfile = bus_config_parser_get_pidfile (parser);
309
310   if (pidfile != NULL)
311     {
312       DBusString u;
313       DBusStat stbuf;
314
315       _dbus_string_init_const (&u, pidfile);
316
317       if (_dbus_stat (&u, &stbuf, NULL))
318         {
319 #ifdef DBUS_CYGWIN
320           DBusString p;
321           long /* int */ pid;
322
323           _dbus_string_init (&p);
324           _dbus_file_get_contents(&p, &u, NULL);
325           _dbus_string_parse_int(&p, 0, &pid, NULL);
326           _dbus_string_free(&p);
327
328           if ((kill((int)pid, 0))) {
329             dbus_set_error(NULL, DBUS_ERROR_FILE_EXISTS,
330                            "pid %ld not running, removing stale pid file\n",
331                            pid);
332             _dbus_delete_file(&u, NULL);
333           } else {
334 #endif
335           dbus_set_error (error, DBUS_ERROR_FAILED,
336                                   "The pid file \"%s\" exists, if the message bus is not running, remove this file",
337                           pidfile);
338               goto failed;
339 #ifdef DBUS_CYGWIN
340           }
341 #endif
342         }
343     }
344
345   /* keep around the pid filename so we can delete it later */
346   context->pidfile = _dbus_strdup (pidfile);
347
348   /* note that type may be NULL */
349   context->type = _dbus_strdup (bus_config_parser_get_type (parser));
350   if (bus_config_parser_get_type (parser) != NULL && context->type == NULL)
351     goto oom;
352
353   user = bus_config_parser_get_user (parser);
354   if (user != NULL)
355     {
356       context->user = _dbus_strdup (user);
357       if (context->user == NULL)
358         goto oom;
359     }
360
361   /* Set up the prefix for syslog messages */
362   if (!_dbus_string_init (&log_prefix))
363     goto oom;
364   if (context->type && !strcmp (context->type, "system"))
365     {
366       if (!_dbus_string_append (&log_prefix, "[system] "))
367         goto oom;
368     }
369   else if (context->type && !strcmp (context->type, "session"))
370     {
371       DBusCredentials *credentials;
372
373       credentials = _dbus_credentials_new_from_current_process ();
374       if (!credentials)
375         goto oom;
376       if (!_dbus_string_append (&log_prefix, "[session "))
377         {
378           _dbus_credentials_unref (credentials);
379           goto oom;
380         }
381       if (!_dbus_credentials_to_string_append (credentials, &log_prefix))
382         {
383           _dbus_credentials_unref (credentials);
384           goto oom;
385         }
386       if (!_dbus_string_append (&log_prefix, "] "))
387         {
388           _dbus_credentials_unref (credentials);
389           goto oom;
390         }
391       _dbus_credentials_unref (credentials);
392     }
393   if (!_dbus_string_steal_data (&log_prefix, &context->log_prefix))
394     goto oom;
395   _dbus_string_free (&log_prefix);
396
397   /* Build an array of auth mechanisms */
398
399   auth_mechanisms_list = bus_config_parser_get_mechanisms (parser);
400   len = _dbus_list_get_length (auth_mechanisms_list);
401
402   if (len > 0)
403     {
404       int i;
405
406       auth_mechanisms = dbus_new0 (char*, len + 1);
407       if (auth_mechanisms == NULL)
408         goto oom;
409
410       i = 0;
411       link = _dbus_list_get_first_link (auth_mechanisms_list);
412       while (link != NULL)
413         {
414           auth_mechanisms[i] = _dbus_strdup (link->data);
415           if (auth_mechanisms[i] == NULL)
416             goto oom;
417           link = _dbus_list_get_next_link (auth_mechanisms_list, link);
418           i += 1;
419         }
420     }
421   else
422     {
423       auth_mechanisms = NULL;
424     }
425
426   /* Listen on our addresses */
427
428   if (address)
429     {
430       DBusServer *server;
431
432       server = dbus_server_listen (_dbus_string_get_const_data(address), error);
433       if (server == NULL)
434         {
435           _DBUS_ASSERT_ERROR_IS_SET (error);
436           goto failed;
437         }
438       else if (!setup_server (context, server, auth_mechanisms, error))
439         {
440           _DBUS_ASSERT_ERROR_IS_SET (error);
441           goto failed;
442         }
443
444       if (!_dbus_list_append (&context->servers, server))
445         goto oom;
446     }
447   else
448     {
449       addresses = bus_config_parser_get_addresses (parser);
450
451       link = _dbus_list_get_first_link (addresses);
452       while (link != NULL)
453         {
454           DBusServer *server;
455
456           server = dbus_server_listen (link->data, error);
457           if (server == NULL)
458             {
459               _DBUS_ASSERT_ERROR_IS_SET (error);
460               goto failed;
461             }
462           else if (!setup_server (context, server, auth_mechanisms, error))
463             {
464               _DBUS_ASSERT_ERROR_IS_SET (error);
465               goto failed;
466             }
467
468           if (!_dbus_list_append (&context->servers, server))
469             goto oom;
470
471           link = _dbus_list_get_next_link (addresses, link);
472         }
473     }
474
475   context->fork = bus_config_parser_get_fork (parser);
476   context->syslog = bus_config_parser_get_syslog (parser);
477   context->keep_umask = bus_config_parser_get_keep_umask (parser);
478   context->allow_anonymous = bus_config_parser_get_allow_anonymous (parser);
479
480   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
481   retval = TRUE;
482
483  failed:
484   dbus_free_string_array (auth_mechanisms);
485   return retval;
486
487  oom:
488   BUS_SET_OOM (error);
489   dbus_free_string_array (auth_mechanisms);
490   return FALSE;
491 }
492
493 /* This code gets executed every time the config files
494  * are parsed: both during BusContext construction
495  * and on reloads. This function is slightly screwy
496  * since it can do a "half reload" in out-of-memory
497  * situations. Realistically, unlikely to ever matter.
498  */
499 static dbus_bool_t
500 process_config_every_time (BusContext      *context,
501                            BusConfigParser *parser,
502                            dbus_bool_t      is_reload,
503                            DBusError       *error)
504 {
505   DBusString full_address;
506   DBusList *link;
507   DBusList **dirs;
508   char *addr;
509   const char *servicehelper;
510   char *s;
511
512   dbus_bool_t retval;
513
514   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
515
516   addr = NULL;
517   retval = FALSE;
518
519   if (!_dbus_string_init (&full_address))
520     {
521       BUS_SET_OOM (error);
522       return FALSE;
523     }
524
525   /* get our limits and timeout lengths */
526   bus_config_parser_get_limits (parser, &context->limits);
527
528   if (context->policy)
529     bus_policy_unref (context->policy);
530   context->policy = bus_config_parser_steal_policy (parser);
531   _dbus_assert (context->policy != NULL);
532
533   /* context->connections is NULL when creating new BusContext */
534   if (context->connections)
535     {
536       _dbus_verbose ("Reload policy rules for completed connections\n");
537       retval = bus_connections_reload_policy (context->connections, error);
538       if (!retval)
539         {
540           _DBUS_ASSERT_ERROR_IS_SET (error);
541           goto failed;
542         }
543     }
544
545   /* We have to build the address backward, so that
546    * <listen> later in the config file have priority
547    */
548   link = _dbus_list_get_last_link (&context->servers);
549   while (link != NULL)
550     {
551       addr = dbus_server_get_address (link->data);
552       if (addr == NULL)
553         {
554           BUS_SET_OOM (error);
555           goto failed;
556         }
557
558       if (_dbus_string_get_length (&full_address) > 0)
559         {
560           if (!_dbus_string_append (&full_address, ";"))
561             {
562               BUS_SET_OOM (error);
563               goto failed;
564             }
565         }
566
567       if (!_dbus_string_append (&full_address, addr))
568         {
569           BUS_SET_OOM (error);
570           goto failed;
571         }
572
573       dbus_free (addr);
574       addr = NULL;
575
576       link = _dbus_list_get_prev_link (&context->servers, link);
577     }
578
579   if (is_reload)
580     dbus_free (context->address);
581
582   if (!_dbus_string_copy_data (&full_address, &context->address))
583     {
584       BUS_SET_OOM (error);
585       goto failed;
586     }
587
588   /* get the service directories */
589   dirs = bus_config_parser_get_service_dirs (parser);
590
591   /* and the service helper */
592   servicehelper = bus_config_parser_get_servicehelper (parser);
593
594   s = _dbus_strdup(servicehelper);
595   if (s == NULL && servicehelper != NULL)
596     {
597       BUS_SET_OOM (error);
598       goto failed;
599     }
600   else
601     {
602       dbus_free(context->servicehelper);
603       context->servicehelper = s;
604     }
605
606   /* Create activation subsystem */
607   if (context->activation)
608     {
609       if (!bus_activation_reload (context->activation, &full_address, dirs, error))
610         goto failed;
611     }
612   else
613     {
614       context->activation = bus_activation_new (context, &full_address, dirs, error);
615     }
616
617   if (context->activation == NULL)
618     {
619       _DBUS_ASSERT_ERROR_IS_SET (error);
620       goto failed;
621     }
622
623   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
624   retval = TRUE;
625
626  failed:
627   _dbus_string_free (&full_address);
628
629   if (addr)
630     dbus_free (addr);
631
632   return retval;
633 }
634
635 static dbus_bool_t
636 list_concat_new (DBusList **a,
637                  DBusList **b,
638                  DBusList **result)
639 {
640   DBusList *link;
641
642   *result = NULL;
643
644   for (link = _dbus_list_get_first_link (a); link; link = _dbus_list_get_next_link (a, link))
645     {
646       if (!_dbus_list_append (result, link->data))
647         goto oom;
648     }
649   for (link = _dbus_list_get_first_link (b); link; link = _dbus_list_get_next_link (b, link))
650     {
651       if (!_dbus_list_append (result, link->data))
652         goto oom;
653     }
654
655   return TRUE;
656 oom:
657   _dbus_list_clear (result);
658   return FALSE;
659 }
660
661 static void
662 raise_file_descriptor_limit (BusContext      *context)
663 {
664 #ifdef DBUS_UNIX
665   DBusError error = DBUS_ERROR_INIT;
666
667   /* we only do this once */
668   if (context->initial_fd_limit != NULL)
669     return;
670
671   context->initial_fd_limit = _dbus_rlimit_save_fd_limit (&error);
672
673   if (context->initial_fd_limit == NULL)
674     {
675       bus_context_log (context, DBUS_SYSTEM_LOG_WARNING,
676                        "%s: %s", error.name, error.message);
677       dbus_error_free (&error);
678       return;
679     }
680
681   /* We used to compute a suitable rlimit based on the configured number
682    * of connections, but that breaks down as soon as we allow fd-passing,
683    * because each connection is allowed to pass 64 fds to us, and if
684    * they all did, we'd hit kernel limits. We now hard-code 64k as a
685    * good limit, like systemd does: that's enough to avoid DoS from
686    * anything short of multiple uids conspiring against us.
687    */
688   if (!_dbus_rlimit_raise_fd_limit_if_privileged (65536, &error))
689     {
690       bus_context_log (context, DBUS_SYSTEM_LOG_WARNING,
691                        "%s: %s", error.name, error.message);
692       dbus_error_free (&error);
693       return;
694     }
695 #endif
696 }
697
698 static dbus_bool_t
699 process_config_postinit (BusContext      *context,
700                          BusConfigParser *parser,
701                          DBusError       *error)
702 {
703   DBusHashTable *service_context_table;
704   DBusList *watched_dirs = NULL;
705
706   raise_file_descriptor_limit (context);
707
708   service_context_table = bus_config_parser_steal_service_context_table (parser);
709   if (!bus_registry_set_service_context_table (context->registry,
710                                                service_context_table))
711     {
712       BUS_SET_OOM (error);
713       return FALSE;
714     }
715
716   _dbus_hash_table_unref (service_context_table);
717
718   /* We need to monitor both the configuration directories and directories
719    * containing .service files.
720    */
721   if (!list_concat_new (bus_config_parser_get_conf_dirs (parser),
722                         bus_config_parser_get_service_dirs (parser),
723                         &watched_dirs))
724     {
725       BUS_SET_OOM (error);
726       return FALSE;
727     }
728
729   bus_set_watched_dirs (context, &watched_dirs);
730
731   _dbus_list_clear (&watched_dirs);
732
733   return TRUE;
734 }
735
736 BusContext*
737 bus_context_new (const DBusString *config_file,
738                  BusContextFlags   flags,
739                  DBusPipe         *print_addr_pipe,
740                  DBusPipe         *print_pid_pipe,
741                  const DBusString *address,
742                  DBusError        *error)
743 {
744   BusContext *context;
745   BusConfigParser *parser;
746
747   _dbus_assert ((flags & BUS_CONTEXT_FLAG_FORK_NEVER) == 0 ||
748                 (flags & BUS_CONTEXT_FLAG_FORK_ALWAYS) == 0);
749
750   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
751
752   context = NULL;
753   parser = NULL;
754
755   if (!dbus_server_allocate_data_slot (&server_data_slot))
756     {
757       BUS_SET_OOM (error);
758       return NULL;
759     }
760
761   context = dbus_new0 (BusContext, 1);
762   if (context == NULL)
763     {
764       BUS_SET_OOM (error);
765       goto failed;
766     }
767   context->refcount = 1;
768
769   _dbus_generate_uuid (&context->uuid);
770
771   if (!_dbus_string_copy_data (config_file, &context->config_file))
772     {
773       BUS_SET_OOM (error);
774       goto failed;
775     }
776
777   context->loop = _dbus_loop_new ();
778   if (context->loop == NULL)
779     {
780       BUS_SET_OOM (error);
781       goto failed;
782     }
783
784   context->watches_enabled = TRUE;
785
786   context->registry = bus_registry_new (context);
787   if (context->registry == NULL)
788     {
789       BUS_SET_OOM (error);
790       goto failed;
791     }
792
793   parser = bus_config_load (config_file, TRUE, NULL, error);
794   if (parser == NULL)
795     {
796       _DBUS_ASSERT_ERROR_IS_SET (error);
797       goto failed;
798     }
799
800   if (!process_config_first_time_only (context, parser, address, flags, error))
801     {
802       _DBUS_ASSERT_ERROR_IS_SET (error);
803       goto failed;
804     }
805   if (!process_config_every_time (context, parser, FALSE, error))
806     {
807       _DBUS_ASSERT_ERROR_IS_SET (error);
808       goto failed;
809     }
810
811   /* we need another ref of the server data slot for the context
812    * to own
813    */
814   if (!dbus_server_allocate_data_slot (&server_data_slot))
815     _dbus_assert_not_reached ("second ref of server data slot failed");
816
817   /* Note that we don't know whether the print_addr_pipe is
818    * one of the sockets we're using to listen on, or some
819    * other random thing. But I think the answer is "don't do
820    * that then"
821    */
822   if (print_addr_pipe != NULL && _dbus_pipe_is_valid (print_addr_pipe))
823     {
824       DBusString addr;
825       const char *a = bus_context_get_address (context);
826       int bytes;
827
828       _dbus_assert (a != NULL);
829       if (!_dbus_string_init (&addr))
830         {
831           BUS_SET_OOM (error);
832           goto failed;
833         }
834
835       if (!_dbus_string_append (&addr, a) ||
836           !_dbus_string_append (&addr, "\n"))
837         {
838           _dbus_string_free (&addr);
839           BUS_SET_OOM (error);
840           goto failed;
841         }
842
843       bytes = _dbus_string_get_length (&addr);
844       if (_dbus_pipe_write (print_addr_pipe, &addr, 0, bytes, error) != bytes)
845         {
846           /* pipe write returns an error on failure but not short write */
847           if (error != NULL && !dbus_error_is_set (error))
848             {
849               dbus_set_error (error, DBUS_ERROR_FAILED,
850                               "Printing message bus address: did not write all bytes\n");
851             }
852           _dbus_string_free (&addr);
853           goto failed;
854         }
855
856       if (!_dbus_pipe_is_stdout_or_stderr (print_addr_pipe))
857         _dbus_pipe_close (print_addr_pipe, NULL);
858
859       _dbus_string_free (&addr);
860     }
861
862   context->connections = bus_connections_new (context);
863   if (context->connections == NULL)
864     {
865       BUS_SET_OOM (error);
866       goto failed;
867     }
868
869   context->matchmaker = bus_matchmaker_new ();
870   if (context->matchmaker == NULL)
871     {
872       BUS_SET_OOM (error);
873       goto failed;
874     }
875
876   /* check user before we fork */
877   if (context->user != NULL)
878     {
879       if (!_dbus_verify_daemon_user (context->user))
880         {
881           dbus_set_error (error, DBUS_ERROR_FAILED,
882                           "Could not get UID and GID for username \"%s\"",
883                           context->user);
884           goto failed;
885         }
886     }
887
888   /* Now become a daemon if appropriate and write out pid file in any case */
889   {
890     DBusString u;
891
892     if (context->pidfile)
893       _dbus_string_init_const (&u, context->pidfile);
894
895     if (((flags & BUS_CONTEXT_FLAG_FORK_NEVER) == 0 && context->fork) ||
896         (flags & BUS_CONTEXT_FLAG_FORK_ALWAYS))
897       {
898         _dbus_verbose ("Forking and becoming daemon\n");
899
900         if (!_dbus_become_daemon (context->pidfile ? &u : NULL,
901                                   print_pid_pipe,
902                                   error,
903                                   context->keep_umask))
904           {
905             _DBUS_ASSERT_ERROR_IS_SET (error);
906             goto failed;
907           }
908       }
909     else
910       {
911         _dbus_verbose ("Fork not requested\n");
912
913         /* Need to write PID file and to PID pipe for ourselves,
914          * not for the child process. This is a no-op if the pidfile
915          * is NULL and print_pid_pipe is NULL.
916          */
917         if (!_dbus_write_pid_to_file_and_pipe (context->pidfile ? &u : NULL,
918                                                print_pid_pipe,
919                                                _dbus_getpid (),
920                                                error))
921           {
922             _DBUS_ASSERT_ERROR_IS_SET (error);
923             goto failed;
924           }
925       }
926   }
927
928   if (print_pid_pipe && _dbus_pipe_is_valid (print_pid_pipe) &&
929       !_dbus_pipe_is_stdout_or_stderr (print_pid_pipe))
930     _dbus_pipe_close (print_pid_pipe, NULL);
931
932   if (!bus_selinux_full_init ())
933     {
934       bus_context_log (context, DBUS_SYSTEM_LOG_FATAL, "SELinux enabled but D-Bus initialization failed; check system log\n");
935     }
936
937   if (!bus_apparmor_full_init (error))
938     {
939       _DBUS_ASSERT_ERROR_IS_SET (error);
940       goto failed;
941     }
942
943   if (bus_apparmor_enabled ())
944     {
945       /* Only print AppArmor mediation message when syslog support is enabled */
946       if (context->syslog)
947         bus_context_log (context, DBUS_SYSTEM_LOG_INFO,
948                          "AppArmor D-Bus mediation is enabled\n");
949     }
950
951   if (!process_config_postinit (context, parser, error))
952     {
953       _DBUS_ASSERT_ERROR_IS_SET (error);
954       goto failed;
955     }
956
957   if (parser != NULL)
958     {
959       bus_config_parser_unref (parser);
960       parser = NULL;
961     }
962
963   /* Here we change our credentials if required,
964    * as soon as we've set up our sockets and pidfile
965    */
966   if (context->user != NULL)
967     {
968       if (!_dbus_change_to_daemon_user (context->user, error))
969         {
970           _DBUS_ASSERT_ERROR_IS_SET (error);
971           goto failed;
972         }
973
974 #ifdef HAVE_SELINUX
975       /* FIXME - why not just put this in full_init() below? */
976       bus_selinux_audit_init ();
977 #endif
978 #ifdef HAVE_APPARMOR
979       bus_apparmor_audit_init ();
980 #endif
981     }
982
983   dbus_server_free_data_slot (&server_data_slot);
984
985   return context;
986
987  failed:
988   if (parser != NULL)
989     bus_config_parser_unref (parser);
990   if (context != NULL)
991     bus_context_unref (context);
992
993   if (server_data_slot >= 0)
994     dbus_server_free_data_slot (&server_data_slot);
995
996   return NULL;
997 }
998
999 dbus_bool_t
1000 bus_context_get_id (BusContext       *context,
1001                     DBusString       *uuid)
1002 {
1003   return _dbus_uuid_encode (&context->uuid, uuid);
1004 }
1005
1006 dbus_bool_t
1007 bus_context_reload_config (BusContext *context,
1008                            DBusError  *error)
1009 {
1010   BusConfigParser *parser;
1011   DBusString config_file;
1012   dbus_bool_t ret;
1013
1014   /* Flush the user database cache */
1015   _dbus_flush_caches ();
1016
1017   ret = FALSE;
1018   _dbus_string_init_const (&config_file, context->config_file);
1019   parser = bus_config_load (&config_file, TRUE, NULL, error);
1020   if (parser == NULL)
1021     {
1022       _DBUS_ASSERT_ERROR_IS_SET (error);
1023       goto failed;
1024     }
1025
1026   if (!process_config_every_time (context, parser, TRUE, error))
1027     {
1028       _DBUS_ASSERT_ERROR_IS_SET (error);
1029       goto failed;
1030     }
1031   if (!process_config_postinit (context, parser, error))
1032     {
1033       _DBUS_ASSERT_ERROR_IS_SET (error);
1034       goto failed;
1035     }
1036   ret = TRUE;
1037
1038   bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Reloaded configuration");
1039  failed:
1040   if (!ret)
1041     bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Unable to reload configuration: %s", error->message);
1042   if (parser != NULL)
1043     bus_config_parser_unref (parser);
1044   return ret;
1045 }
1046
1047 static void
1048 shutdown_server (BusContext *context,
1049                  DBusServer *server)
1050 {
1051   if (server == NULL ||
1052       !dbus_server_get_is_connected (server))
1053     return;
1054
1055   if (!dbus_server_set_watch_functions (server,
1056                                         NULL, NULL, NULL,
1057                                         context,
1058                                         NULL))
1059     _dbus_assert_not_reached ("setting watch functions to NULL failed");
1060
1061   if (!dbus_server_set_timeout_functions (server,
1062                                           NULL, NULL, NULL,
1063                                           context,
1064                                           NULL))
1065     _dbus_assert_not_reached ("setting timeout functions to NULL failed");
1066
1067   dbus_server_disconnect (server);
1068 }
1069
1070 void
1071 bus_context_shutdown (BusContext  *context)
1072 {
1073   DBusList *link;
1074
1075   link = _dbus_list_get_first_link (&context->servers);
1076   while (link != NULL)
1077     {
1078       shutdown_server (context, link->data);
1079
1080       link = _dbus_list_get_next_link (&context->servers, link);
1081     }
1082 }
1083
1084 BusContext *
1085 bus_context_ref (BusContext *context)
1086 {
1087   _dbus_assert (context->refcount > 0);
1088   context->refcount += 1;
1089
1090   return context;
1091 }
1092
1093 void
1094 bus_context_unref (BusContext *context)
1095 {
1096   _dbus_assert (context->refcount > 0);
1097   context->refcount -= 1;
1098
1099   if (context->refcount == 0)
1100     {
1101       DBusList *link;
1102
1103       _dbus_verbose ("Finalizing bus context %p\n", context);
1104
1105       bus_context_shutdown (context);
1106
1107       if (context->connections)
1108         {
1109           bus_connections_unref (context->connections);
1110           context->connections = NULL;
1111         }
1112
1113       if (context->registry)
1114         {
1115           bus_registry_unref (context->registry);
1116           context->registry = NULL;
1117         }
1118
1119       if (context->activation)
1120         {
1121           bus_activation_unref (context->activation);
1122           context->activation = NULL;
1123         }
1124
1125       link = _dbus_list_get_first_link (&context->servers);
1126       while (link != NULL)
1127         {
1128           dbus_server_unref (link->data);
1129
1130           link = _dbus_list_get_next_link (&context->servers, link);
1131         }
1132       _dbus_list_clear (&context->servers);
1133
1134       if (context->policy)
1135         {
1136           bus_policy_unref (context->policy);
1137           context->policy = NULL;
1138         }
1139
1140       if (context->loop)
1141         {
1142           _dbus_loop_unref (context->loop);
1143           context->loop = NULL;
1144         }
1145
1146       if (context->matchmaker)
1147         {
1148           bus_matchmaker_unref (context->matchmaker);
1149           context->matchmaker = NULL;
1150         }
1151
1152       dbus_free (context->config_file);
1153       dbus_free (context->log_prefix);
1154       dbus_free (context->type);
1155       dbus_free (context->address);
1156       dbus_free (context->user);
1157       dbus_free (context->servicehelper);
1158
1159       if (context->pidfile)
1160         {
1161           DBusString u;
1162           _dbus_string_init_const (&u, context->pidfile);
1163
1164           /* Deliberately ignore errors here, since there's not much
1165            * we can do about it, and we're exiting anyways.
1166            */
1167           _dbus_delete_file (&u, NULL);
1168
1169           dbus_free (context->pidfile);
1170         }
1171
1172       if (context->initial_fd_limit)
1173         _dbus_rlimit_free (context->initial_fd_limit);
1174
1175       dbus_free (context);
1176
1177       dbus_server_free_data_slot (&server_data_slot);
1178     }
1179 }
1180
1181 /* type may be NULL */
1182 const char*
1183 bus_context_get_type (BusContext *context)
1184 {
1185   return context->type;
1186 }
1187
1188 const char*
1189 bus_context_get_address (BusContext *context)
1190 {
1191   return context->address;
1192 }
1193
1194 const char*
1195 bus_context_get_servicehelper (BusContext *context)
1196 {
1197   return context->servicehelper;
1198 }
1199
1200 dbus_bool_t
1201 bus_context_get_systemd_activation (BusContext *context)
1202 {
1203   return context->systemd_activation;
1204 }
1205
1206 BusRegistry*
1207 bus_context_get_registry (BusContext  *context)
1208 {
1209   return context->registry;
1210 }
1211
1212 BusConnections*
1213 bus_context_get_connections (BusContext  *context)
1214 {
1215   return context->connections;
1216 }
1217
1218 BusActivation*
1219 bus_context_get_activation (BusContext  *context)
1220 {
1221   return context->activation;
1222 }
1223
1224 BusMatchmaker*
1225 bus_context_get_matchmaker (BusContext  *context)
1226 {
1227   return context->matchmaker;
1228 }
1229
1230 DBusLoop*
1231 bus_context_get_loop (BusContext *context)
1232 {
1233   return context->loop;
1234 }
1235
1236 dbus_bool_t
1237 bus_context_allow_unix_user (BusContext   *context,
1238                              unsigned long uid)
1239 {
1240   return bus_policy_allow_unix_user (context->policy,
1241                                      uid);
1242 }
1243
1244 /* For now this is never actually called because the default
1245  * DBusConnection behavior of 'same user that owns the bus can connect'
1246  * is all it would do.
1247  */
1248 dbus_bool_t
1249 bus_context_allow_windows_user (BusContext       *context,
1250                                 const char       *windows_sid)
1251 {
1252   return bus_policy_allow_windows_user (context->policy,
1253                                         windows_sid);
1254 }
1255
1256 BusPolicy *
1257 bus_context_get_policy (BusContext *context)
1258 {
1259   return context->policy;
1260 }
1261
1262 BusClientPolicy*
1263 bus_context_create_client_policy (BusContext      *context,
1264                                   DBusConnection  *connection,
1265                                   DBusError       *error)
1266 {
1267   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1268   return bus_policy_create_client_policy (context->policy, connection,
1269                                           error);
1270 }
1271
1272 int
1273 bus_context_get_activation_timeout (BusContext *context)
1274 {
1275
1276   return context->limits.activation_timeout;
1277 }
1278
1279 int
1280 bus_context_get_auth_timeout (BusContext *context)
1281 {
1282   return context->limits.auth_timeout;
1283 }
1284
1285 int
1286 bus_context_get_pending_fd_timeout (BusContext *context)
1287 {
1288   return context->limits.pending_fd_timeout;
1289 }
1290
1291 int
1292 bus_context_get_max_completed_connections (BusContext *context)
1293 {
1294   return context->limits.max_completed_connections;
1295 }
1296
1297 int
1298 bus_context_get_max_incomplete_connections (BusContext *context)
1299 {
1300   return context->limits.max_incomplete_connections;
1301 }
1302
1303 int
1304 bus_context_get_max_connections_per_user (BusContext *context)
1305 {
1306   return context->limits.max_connections_per_user;
1307 }
1308
1309 int
1310 bus_context_get_max_pending_activations (BusContext *context)
1311 {
1312   return context->limits.max_pending_activations;
1313 }
1314
1315 int
1316 bus_context_get_max_services_per_connection (BusContext *context)
1317 {
1318   return context->limits.max_services_per_connection;
1319 }
1320
1321 int
1322 bus_context_get_max_match_rules_per_connection (BusContext *context)
1323 {
1324   return context->limits.max_match_rules_per_connection;
1325 }
1326
1327 int
1328 bus_context_get_max_replies_per_connection (BusContext *context)
1329 {
1330   return context->limits.max_replies_per_connection;
1331 }
1332
1333 int
1334 bus_context_get_reply_timeout (BusContext *context)
1335 {
1336   return context->limits.reply_timeout;
1337 }
1338
1339 DBusRLimit *
1340 bus_context_get_initial_fd_limit (BusContext *context)
1341 {
1342   return context->initial_fd_limit;
1343 }
1344
1345 void
1346 bus_context_log (BusContext *context, DBusSystemLogSeverity severity, const char *msg, ...)
1347 {
1348   va_list args;
1349
1350   if (!context->syslog)
1351     {
1352       /* we're not syslogging; just output to stderr */
1353       va_start (args, msg);
1354       vfprintf (stderr, msg, args);
1355       fprintf (stderr, "\n");
1356       va_end (args);
1357
1358       if (severity == DBUS_SYSTEM_LOG_FATAL)
1359         _dbus_exit (1);
1360
1361       return;
1362     }
1363
1364   va_start (args, msg);
1365
1366   if (context->log_prefix)
1367     {
1368       DBusString full_msg;
1369
1370       if (!_dbus_string_init (&full_msg))
1371         goto out;
1372       if (!_dbus_string_append (&full_msg, context->log_prefix))
1373         goto oom_out;
1374       if (!_dbus_string_append_printf_valist (&full_msg, msg, args))
1375         goto oom_out;
1376
1377       _dbus_system_log (severity, "%s", _dbus_string_get_const_data (&full_msg));
1378     oom_out:
1379       _dbus_string_free (&full_msg);
1380     }
1381   else
1382     _dbus_system_logv (severity, msg, args);
1383
1384 out:
1385   va_end (args);
1386 }
1387
1388 static inline const char *
1389 nonnull (const char *maybe_null,
1390          const char *if_null)
1391 {
1392   return (maybe_null ? maybe_null : if_null);
1393 }
1394
1395 void
1396 bus_context_log_literal (BusContext            *context,
1397                          DBusSystemLogSeverity  severity,
1398                          const char            *msg)
1399 {
1400   if (!context->syslog)
1401     {
1402       fputs (msg, stderr);
1403       fputc ('\n', stderr);
1404
1405       if (severity == DBUS_SYSTEM_LOG_FATAL)
1406         _dbus_exit (1);
1407     }
1408   else
1409     {
1410       _dbus_system_log (severity, "%s%s", nonnull (context->log_prefix, ""),
1411                         msg);
1412     }
1413 }
1414
1415 void
1416 bus_context_log_and_set_error (BusContext            *context,
1417                                DBusSystemLogSeverity  severity,
1418                                DBusError             *error,
1419                                const char            *name,
1420                                const char            *msg,
1421                                ...)
1422 {
1423   DBusError stack_error = DBUS_ERROR_INIT;
1424   va_list args;
1425
1426   va_start (args, msg);
1427   _dbus_set_error_valist (&stack_error, name, msg, args);
1428   va_end (args);
1429
1430   /* If we hit OOM while setting the error, this will syslog "out of memory"
1431    * which is itself an indication that something is seriously wrong */
1432   bus_context_log_literal (context, DBUS_SYSTEM_LOG_SECURITY,
1433                            stack_error.message);
1434
1435   dbus_move_error (&stack_error, error);
1436 }
1437
1438 /*
1439  * Log something about a message, usually that it was rejected.
1440  */
1441 static void
1442 complain_about_message (BusContext     *context,
1443                         const char     *error_name,
1444                         const char     *complaint,
1445                         int             matched_rules,
1446                         DBusMessage    *message,
1447                         DBusConnection *sender,
1448                         DBusConnection *proposed_recipient,
1449                         dbus_bool_t     requested_reply,
1450                         dbus_bool_t     log,
1451                         DBusError      *error)
1452 {
1453   DBusError stack_error = DBUS_ERROR_INIT;
1454   const char *sender_name;
1455   const char *sender_loginfo;
1456   const char *proposed_recipient_loginfo;
1457
1458   if (error == NULL && !log)
1459     return;
1460
1461   if (sender != NULL)
1462     {
1463       sender_name = bus_connection_get_name (sender);
1464       sender_loginfo = bus_connection_get_loginfo (sender);
1465     }
1466   else
1467     {
1468       sender_name = "(unset)";
1469       sender_loginfo = "(bus)";
1470     }
1471
1472   if (proposed_recipient != NULL)
1473     proposed_recipient_loginfo = bus_connection_get_loginfo (proposed_recipient);
1474   else
1475     proposed_recipient_loginfo = "bus";
1476
1477   dbus_set_error (&stack_error, error_name,
1478       "%s, %d matched rules; type=\"%s\", sender=\"%s\" (%s) "
1479       "interface=\"%s\" member=\"%s\" error name=\"%s\" "
1480       "requested_reply=\"%d\" destination=\"%s\" (%s)",
1481       complaint,
1482       matched_rules,
1483       dbus_message_type_to_string (dbus_message_get_type (message)),
1484       sender_name,
1485       sender_loginfo,
1486       nonnull (dbus_message_get_interface (message), "(unset)"),
1487       nonnull (dbus_message_get_member (message), "(unset)"),
1488       nonnull (dbus_message_get_error_name (message), "(unset)"),
1489       requested_reply,
1490       nonnull (dbus_message_get_destination (message), DBUS_SERVICE_DBUS),
1491       proposed_recipient_loginfo);
1492
1493   /* If we hit OOM while setting the error, this will syslog "out of memory"
1494    * which is itself an indication that something is seriously wrong */
1495   if (log)
1496     bus_context_log_literal (context, DBUS_SYSTEM_LOG_SECURITY,
1497         stack_error.message);
1498
1499   dbus_move_error (&stack_error, error);
1500 }
1501
1502 /*
1503  * addressed_recipient is the recipient specified in the message.
1504  *
1505  * proposed_recipient is the recipient we're considering sending
1506  * to right this second, and may be an eavesdropper.
1507  *
1508  * sender is the sender of the message.
1509  *
1510  * NULL for proposed_recipient or sender definitely means the bus driver.
1511  *
1512  * NULL for addressed_recipient may mean the bus driver, or may mean
1513  * no destination was specified in the message (e.g. a signal).
1514  */
1515 dbus_bool_t
1516 bus_context_check_security_policy (BusContext     *context,
1517                                    BusTransaction *transaction,
1518                                    DBusConnection *sender,
1519                                    DBusConnection *addressed_recipient,
1520                                    DBusConnection *proposed_recipient,
1521                                    DBusMessage    *message,
1522                                    DBusError      *error)
1523 {
1524   const char *src, *dest;
1525   BusClientPolicy *sender_policy;
1526   BusClientPolicy *recipient_policy;
1527   dbus_int32_t toggles;
1528   dbus_bool_t log;
1529   int type;
1530   dbus_bool_t requested_reply;
1531
1532   type = dbus_message_get_type (message);
1533   src = dbus_message_get_sender (message);
1534   dest = dbus_message_get_destination (message);
1535
1536   /* dispatch.c was supposed to ensure these invariants */
1537   _dbus_assert (dest != NULL ||
1538                 type == DBUS_MESSAGE_TYPE_SIGNAL ||
1539                 (sender == NULL && !bus_connection_is_active (proposed_recipient)));
1540   _dbus_assert (type == DBUS_MESSAGE_TYPE_SIGNAL ||
1541                 addressed_recipient != NULL ||
1542                 strcmp (dest, DBUS_SERVICE_DBUS) == 0);
1543
1544   switch (type)
1545     {
1546     case DBUS_MESSAGE_TYPE_METHOD_CALL:
1547     case DBUS_MESSAGE_TYPE_SIGNAL:
1548     case DBUS_MESSAGE_TYPE_METHOD_RETURN:
1549     case DBUS_MESSAGE_TYPE_ERROR:
1550       break;
1551
1552     default:
1553       _dbus_verbose ("security check disallowing message of unknown type %d\n",
1554                      type);
1555
1556       dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1557                       "Message bus will not accept messages of unknown type\n");
1558
1559       return FALSE;
1560     }
1561
1562   requested_reply = FALSE;
1563
1564   if (sender != NULL)
1565     {
1566       if (bus_connection_is_active (sender))
1567         {
1568           sender_policy = bus_connection_get_policy (sender);
1569           _dbus_assert (sender_policy != NULL);
1570
1571           /* Fill in requested_reply variable with TRUE if this is a
1572            * reply and the reply was pending.
1573            */
1574           if (dbus_message_get_reply_serial (message) != 0)
1575             {
1576               if (proposed_recipient != NULL /* not to the bus driver */ &&
1577                   addressed_recipient == proposed_recipient /* not eavesdropping */)
1578                 {
1579                   DBusError error2;
1580
1581                   dbus_error_init (&error2);
1582                   requested_reply = bus_connections_check_reply (bus_connection_get_connections (sender),
1583                                                                  transaction,
1584                                                                  sender, addressed_recipient, message,
1585                                                                  &error2);
1586                   if (dbus_error_is_set (&error2))
1587                     {
1588                       dbus_move_error (&error2, error);
1589                       return FALSE;
1590                     }
1591                 }
1592             }
1593         }
1594       else
1595         {
1596           sender_policy = NULL;
1597         }
1598
1599       /* First verify the SELinux access controls.  If allowed then
1600        * go on with the standard checks.
1601        */
1602       if (!bus_selinux_allows_send (sender, proposed_recipient,
1603                                     dbus_message_type_to_string (dbus_message_get_type (message)),
1604                                     dbus_message_get_interface (message),
1605                                     dbus_message_get_member (message),
1606                                     dbus_message_get_error_name (message),
1607                                     dest ? dest : DBUS_SERVICE_DBUS, error))
1608         {
1609           if (error != NULL && !dbus_error_is_set (error))
1610             {
1611               /* don't syslog this, just set the error: avc_has_perm should
1612                * have already written to either the audit log or syslog */
1613               complain_about_message (context, DBUS_ERROR_ACCESS_DENIED,
1614                   "An SELinux policy prevents this sender from sending this "
1615                   "message to this recipient",
1616                   0, message, sender, proposed_recipient, FALSE, FALSE, error);
1617               _dbus_verbose ("SELinux security check denying send to service\n");
1618             }
1619
1620           return FALSE;
1621         }
1622
1623       /* next verify AppArmor access controls.  If allowed then
1624        * go on with the standard checks.
1625        */
1626       if (!bus_apparmor_allows_send (sender, proposed_recipient,
1627                                      requested_reply,
1628                                      bus_context_get_type (context),
1629                                      dbus_message_get_type (message),
1630                                      dbus_message_get_path (message),
1631                                      dbus_message_get_interface (message),
1632                                      dbus_message_get_member (message),
1633                                      dbus_message_get_error_name (message),
1634                                      dest ? dest : DBUS_SERVICE_DBUS,
1635                                      src ? src : DBUS_SERVICE_DBUS,
1636                                      error))
1637         return FALSE;
1638
1639       if (!bus_connection_is_active (sender))
1640         {
1641           /* Policy for inactive connections is that they can only send
1642            * the hello message to the bus driver
1643            */
1644           if (proposed_recipient == NULL &&
1645               dbus_message_is_method_call (message,
1646                                            DBUS_INTERFACE_DBUS,
1647                                            "Hello"))
1648             {
1649               _dbus_verbose ("security check allowing %s message\n",
1650                              "Hello");
1651               return TRUE;
1652             }
1653           else
1654             {
1655               _dbus_verbose ("security check disallowing non-%s message\n",
1656                              "Hello");
1657
1658               dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1659                               "Client tried to send a message other than %s without being registered",
1660                               "Hello");
1661
1662               return FALSE;
1663             }
1664         }
1665     }
1666   else
1667     {
1668       sender_policy = NULL;
1669
1670       /* If the sender is the bus driver, we assume any reply was a
1671        * requested reply as bus driver won't send bogus ones
1672        */
1673       if (addressed_recipient == proposed_recipient /* not eavesdropping */ &&
1674           dbus_message_get_reply_serial (message) != 0)
1675         requested_reply = TRUE;
1676     }
1677
1678   _dbus_assert ((sender != NULL && sender_policy != NULL) ||
1679                 (sender == NULL && sender_policy == NULL));
1680
1681   if (proposed_recipient != NULL)
1682     {
1683       /* only the bus driver can send to an inactive recipient (as it
1684        * owns no services, so other apps can't address it). Inactive
1685        * recipients can receive any message.
1686        */
1687       if (bus_connection_is_active (proposed_recipient))
1688         {
1689           recipient_policy = bus_connection_get_policy (proposed_recipient);
1690           _dbus_assert (recipient_policy != NULL);
1691         }
1692       else if (sender == NULL)
1693         {
1694           _dbus_verbose ("security check using NULL recipient policy for message from bus\n");
1695           recipient_policy = NULL;
1696         }
1697       else
1698         {
1699           _dbus_assert_not_reached ("a message was somehow sent to an inactive recipient from a source other than the message bus\n");
1700           recipient_policy = NULL;
1701         }
1702     }
1703   else
1704     recipient_policy = NULL;
1705
1706   _dbus_assert ((proposed_recipient != NULL && recipient_policy != NULL) ||
1707                 (proposed_recipient != NULL && sender == NULL && recipient_policy == NULL) ||
1708                 (proposed_recipient == NULL && recipient_policy == NULL));
1709
1710   log = FALSE;
1711   if (sender_policy &&
1712       !bus_client_policy_check_can_send (sender_policy,
1713                                          context->registry,
1714                                          requested_reply,
1715                                          proposed_recipient,
1716                                          message, &toggles, &log))
1717     {
1718       complain_about_message (context, DBUS_ERROR_ACCESS_DENIED,
1719           "Rejected send message", toggles,
1720           message, sender, proposed_recipient, requested_reply,
1721           (addressed_recipient == proposed_recipient), error);
1722       _dbus_verbose ("security policy disallowing message due to sender policy\n");
1723       return FALSE;
1724     }
1725
1726   if (log)
1727     {
1728       /* We want to drop this message, and are only not doing so for backwards
1729        * compatibility. */
1730       complain_about_message (context, DBUS_ERROR_ACCESS_DENIED,
1731           "Would reject message", toggles,
1732           message, sender, proposed_recipient, requested_reply,
1733           TRUE, NULL);
1734     }
1735
1736   if (recipient_policy &&
1737       !bus_client_policy_check_can_receive (recipient_policy,
1738                                             context->registry,
1739                                             requested_reply,
1740                                             sender,
1741                                             addressed_recipient, proposed_recipient,
1742                                             message, &toggles))
1743     {
1744       complain_about_message (context, DBUS_ERROR_ACCESS_DENIED,
1745           "Rejected receive message", toggles,
1746           message, sender, proposed_recipient, requested_reply,
1747           (addressed_recipient == proposed_recipient), error);
1748       _dbus_verbose ("security policy disallowing message due to recipient policy\n");
1749       return FALSE;
1750     }
1751
1752   /* See if limits on size have been exceeded */
1753   if (proposed_recipient &&
1754       ((dbus_connection_get_outgoing_size (proposed_recipient) > context->limits.max_outgoing_bytes) ||
1755        (dbus_connection_get_outgoing_unix_fds (proposed_recipient) > context->limits.max_outgoing_unix_fds)))
1756     {
1757       complain_about_message (context, DBUS_ERROR_LIMITS_EXCEEDED,
1758           "Rejected: destination has a full message queue",
1759           0, message, sender, proposed_recipient, requested_reply, TRUE,
1760           error);
1761       _dbus_verbose ("security policy disallowing message due to full message queue\n");
1762       return FALSE;
1763     }
1764
1765   /* Record that we will allow a reply here in the future (don't
1766    * bother if the recipient is the bus or this is an eavesdropping
1767    * connection). Only the addressed recipient may reply.
1768    */
1769   if (type == DBUS_MESSAGE_TYPE_METHOD_CALL &&
1770       sender &&
1771       addressed_recipient &&
1772       addressed_recipient == proposed_recipient && /* not eavesdropping */
1773       !bus_connections_expect_reply (bus_connection_get_connections (sender),
1774                                      transaction,
1775                                      sender, addressed_recipient,
1776                                      message, error))
1777     {
1778       _dbus_verbose ("Failed to record reply expectation or problem with the message expecting a reply\n");
1779       return FALSE;
1780     }
1781
1782   _dbus_verbose ("security policy allowing message\n");
1783   return TRUE;
1784 }
1785
1786 void
1787 bus_context_check_all_watches (BusContext *context)
1788 {
1789   DBusList *link;
1790   dbus_bool_t enabled = TRUE;
1791
1792   if (bus_connections_get_n_incomplete (context->connections) >=
1793       bus_context_get_max_incomplete_connections (context))
1794     {
1795       enabled = FALSE;
1796     }
1797
1798   if (context->watches_enabled == enabled)
1799     return;
1800
1801   context->watches_enabled = enabled;
1802
1803   for (link = _dbus_list_get_first_link (&context->servers);
1804        link != NULL;
1805        link = _dbus_list_get_next_link (&context->servers, link))
1806     {
1807       /* A BusContext might contains several DBusServer (if there are
1808        * several <listen> configuration items) and a DBusServer might
1809        * contain several DBusWatch in its DBusWatchList (if getaddrinfo
1810        * returns several addresses on a dual IPv4-IPv6 stack or if
1811        * systemd passes several fds).
1812        * We want to enable/disable them all.
1813        */
1814       DBusServer *server = link->data;
1815       _dbus_server_toggle_all_watches (server, enabled);
1816     }
1817 }