2004-10-29 Colin Walters <walters@redhat.com>
[platform/upstream/dbus.git] / bus / bus.c
1 /* -*- mode: C; c-file-style: "gnu" -*- */
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., 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 "signals.h"
32 #include "selinux.h"
33 #include <dbus/dbus-list.h>
34 #include <dbus/dbus-hash.h>
35 #include <dbus/dbus-internals.h>
36
37 struct BusContext
38 {
39   int refcount;
40   char *config_file;
41   char *type;
42   char *address;
43   char *pidfile;
44   char *user;
45   DBusLoop *loop;
46   DBusList *servers;
47   BusConnections *connections;
48   BusActivation *activation;
49   BusRegistry *registry;
50   BusPolicy *policy;
51   BusMatchmaker *matchmaker;
52   DBusUserDatabase *user_database;
53   BusLimits limits;
54   unsigned int fork : 1;
55 };
56
57 static dbus_int32_t server_data_slot = -1;
58
59 typedef struct
60 {
61   BusContext *context;
62 } BusServerData;
63
64 #define BUS_SERVER_DATA(server) (dbus_server_get_data ((server), server_data_slot))
65
66 static BusContext*
67 server_get_context (DBusServer *server)
68 {
69   BusContext *context;
70   BusServerData *bd;
71   
72   if (!dbus_server_allocate_data_slot (&server_data_slot))
73     return NULL;
74
75   bd = BUS_SERVER_DATA (server);
76   if (bd == NULL)
77     {
78       dbus_server_free_data_slot (&server_data_slot);
79       return NULL;
80     }
81
82   context = bd->context;
83
84   dbus_server_free_data_slot (&server_data_slot);
85
86   return context;
87 }
88
89 static dbus_bool_t
90 server_watch_callback (DBusWatch     *watch,
91                        unsigned int   condition,
92                        void          *data)
93 {
94   /* FIXME this can be done in dbus-mainloop.c
95    * if the code in activation.c for the babysitter
96    * watch handler is fixed.
97    */
98   
99   return dbus_watch_handle (watch, condition);
100 }
101
102 static dbus_bool_t
103 add_server_watch (DBusWatch  *watch,
104                   void       *data)
105 {
106   DBusServer *server = data;
107   BusContext *context;
108   
109   context = server_get_context (server);
110   
111   return _dbus_loop_add_watch (context->loop,
112                                watch, server_watch_callback, server,
113                                NULL);
114 }
115
116 static void
117 remove_server_watch (DBusWatch  *watch,
118                      void       *data)
119 {
120   DBusServer *server = data;
121   BusContext *context;
122   
123   context = server_get_context (server);
124   
125   _dbus_loop_remove_watch (context->loop,
126                            watch, server_watch_callback, server);
127 }
128
129
130 static void
131 server_timeout_callback (DBusTimeout   *timeout,
132                          void          *data)
133 {
134   /* can return FALSE on OOM but we just let it fire again later */
135   dbus_timeout_handle (timeout);
136 }
137
138 static dbus_bool_t
139 add_server_timeout (DBusTimeout *timeout,
140                     void        *data)
141 {
142   DBusServer *server = data;
143   BusContext *context;
144   
145   context = server_get_context (server);
146
147   return _dbus_loop_add_timeout (context->loop,
148                                  timeout, server_timeout_callback, server, NULL);
149 }
150
151 static void
152 remove_server_timeout (DBusTimeout *timeout,
153                        void        *data)
154 {
155   DBusServer *server = data;
156   BusContext *context;
157   
158   context = server_get_context (server);
159   
160   _dbus_loop_remove_timeout (context->loop,
161                              timeout, server_timeout_callback, server);
162 }
163
164 static void
165 new_connection_callback (DBusServer     *server,
166                          DBusConnection *new_connection,
167                          void           *data)
168 {
169   BusContext *context = data;
170   
171   if (!bus_connections_setup_connection (context->connections, new_connection))
172     {
173       _dbus_verbose ("No memory to setup new connection\n");
174
175       /* if we don't do this, it will get unref'd without
176        * being disconnected... kind of strange really
177        * that we have to do this, people won't get it right
178        * in general.
179        */
180       dbus_connection_disconnect (new_connection);
181     }
182
183   dbus_connection_set_max_received_size (new_connection,
184                                          context->limits.max_incoming_bytes);
185
186   dbus_connection_set_max_message_size (new_connection,
187                                         context->limits.max_message_size);
188   
189   /* on OOM, we won't have ref'd the connection so it will die. */
190 }
191
192 static void
193 free_server_data (void *data)
194 {
195   BusServerData *bd = data;  
196   
197   dbus_free (bd);
198 }
199
200 static dbus_bool_t
201 setup_server (BusContext *context,
202               DBusServer *server,
203               char      **auth_mechanisms,
204               DBusError  *error)
205 {
206   BusServerData *bd;
207
208   bd = dbus_new0 (BusServerData, 1);
209   if (!dbus_server_set_data (server,
210                              server_data_slot,
211                              bd, free_server_data))
212     {
213       dbus_free (bd);
214       BUS_SET_OOM (error);
215       return FALSE;
216     }
217
218   bd->context = context;
219   
220   if (!dbus_server_set_auth_mechanisms (server, (const char**) auth_mechanisms))
221     {
222       BUS_SET_OOM (error);
223       return FALSE;
224     }
225   
226   dbus_server_set_new_connection_function (server,
227                                            new_connection_callback,
228                                            context, NULL);
229   
230   if (!dbus_server_set_watch_functions (server,
231                                         add_server_watch,
232                                         remove_server_watch,
233                                         NULL,
234                                         server,
235                                         NULL))
236     {
237       BUS_SET_OOM (error);
238       return FALSE;
239     }
240
241   if (!dbus_server_set_timeout_functions (server,
242                                           add_server_timeout,
243                                           remove_server_timeout,
244                                           NULL,
245                                           server, NULL))
246     {
247       BUS_SET_OOM (error);
248       return FALSE;
249     }
250   
251   return TRUE;
252 }
253
254 /* This code only gets executed the first time the
255    config files are parsed.  It is not executed
256    when config files are reloaded.*/
257 static dbus_bool_t
258 process_config_first_time_only (BusContext      *context,
259                                 BusConfigParser *parser,
260                                 DBusError       *error)
261 {
262   DBusList *link;
263   DBusList **addresses;
264   const char *user, *pidfile;
265   char **auth_mechanisms;
266   DBusList **auth_mechanisms_list;
267   int len;
268   dbus_bool_t retval;
269
270   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
271
272   retval = FALSE;
273   auth_mechanisms = NULL;
274
275   /* Check for an existing pid file. Of course this is a race;
276    * we'd have to use fcntl() locks on the pid file to
277    * avoid that. But we want to check for the pid file
278    * before overwriting any existing sockets, etc.
279    */
280   pidfile = bus_config_parser_get_pidfile (parser);
281   if (pidfile != NULL)
282     {
283       DBusString u;
284       DBusStat stbuf;
285       
286       _dbus_string_init_const (&u, pidfile);
287       
288       if (_dbus_stat (&u, &stbuf, NULL))
289         {
290           dbus_set_error (error, DBUS_ERROR_FAILED,
291                           "The pid file \"%s\" exists, if the message bus is not running, remove this file",
292                           pidfile);
293           goto failed;
294         }
295     }
296   
297   /* keep around the pid filename so we can delete it later */
298   context->pidfile = _dbus_strdup (pidfile);
299
300   /* Build an array of auth mechanisms */
301   
302   auth_mechanisms_list = bus_config_parser_get_mechanisms (parser);
303   len = _dbus_list_get_length (auth_mechanisms_list);
304
305   if (len > 0)
306     {
307       int i;
308
309       auth_mechanisms = dbus_new0 (char*, len + 1);
310       if (auth_mechanisms == NULL)
311         {
312           BUS_SET_OOM (error);
313           goto failed;
314         }
315       
316       i = 0;
317       link = _dbus_list_get_first_link (auth_mechanisms_list);
318       while (link != NULL)
319         {
320           auth_mechanisms[i] = _dbus_strdup (link->data);
321           if (auth_mechanisms[i] == NULL)
322             {
323               BUS_SET_OOM (error);
324               goto failed;
325             }
326           link = _dbus_list_get_next_link (auth_mechanisms_list, link);
327         }
328     }
329   else
330     {
331       auth_mechanisms = NULL;
332     }
333
334   /* Listen on our addresses */
335   
336   addresses = bus_config_parser_get_addresses (parser);  
337   
338   link = _dbus_list_get_first_link (addresses);
339   while (link != NULL)
340     {
341       DBusServer *server;
342       
343       server = dbus_server_listen (link->data, error);
344       if (server == NULL)
345         {
346           _DBUS_ASSERT_ERROR_IS_SET (error);
347           goto failed;
348         }
349       else if (!setup_server (context, server, auth_mechanisms, error))
350         {
351           _DBUS_ASSERT_ERROR_IS_SET (error);
352           goto failed;
353         }
354
355       if (!_dbus_list_append (&context->servers, server))
356         {
357           BUS_SET_OOM (error);
358           goto failed;
359         }          
360       
361       link = _dbus_list_get_next_link (addresses, link);
362     }
363
364   /* note that type may be NULL */
365   context->type = _dbus_strdup (bus_config_parser_get_type (parser));
366   if (bus_config_parser_get_type (parser) != NULL && context->type == NULL)
367     {
368       BUS_SET_OOM (error);
369       goto failed;
370     }
371
372   user = bus_config_parser_get_user (parser);
373   if (user != NULL)
374     {
375       context->user = _dbus_strdup (user);
376       if (context->user == NULL)
377         {
378           BUS_SET_OOM (error);
379           goto failed;
380         }
381     }
382
383   context->fork = bus_config_parser_get_fork (parser);
384   
385   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
386   retval = TRUE;
387
388  failed:
389   dbus_free_string_array (auth_mechanisms);
390   return retval;
391 }
392
393 /* This code gets executed every time the config files
394    are parsed: both during BusContext construction
395    and on reloads. */
396 static dbus_bool_t
397 process_config_every_time (BusContext      *context,
398                            BusConfigParser *parser,
399                            dbus_bool_t      is_reload,
400                            DBusError       *error)
401 {
402   DBusString full_address;
403   DBusList *link;
404   DBusHashTable *service_sid_table;
405   
406   dbus_bool_t retval;
407
408   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
409
410   retval = FALSE;
411
412   if (!_dbus_string_init (&full_address))
413     {
414       BUS_SET_OOM (error);
415       return FALSE;
416     }
417
418   /* get our limits and timeout lengths */
419   bus_config_parser_get_limits (parser, &context->limits);
420
421   context->policy = bus_config_parser_steal_policy (parser);
422   _dbus_assert (context->policy != NULL);
423
424   /* We have to build the address backward, so that
425    * <listen> later in the config file have priority
426    */
427   link = _dbus_list_get_last_link (&context->servers);
428   while (link != NULL)
429     {
430       char *addr;
431       
432       addr = dbus_server_get_address (link->data);
433       if (addr == NULL)
434         {
435           BUS_SET_OOM (error);
436           goto failed;
437         }
438
439       if (_dbus_string_get_length (&full_address) > 0)
440         {
441           if (!_dbus_string_append (&full_address, ";"))
442             {
443               BUS_SET_OOM (error);
444               goto failed;
445             }
446         }
447
448       if (!_dbus_string_append (&full_address, addr))
449         {
450           BUS_SET_OOM (error);
451           goto failed;
452         }
453
454       dbus_free (addr);
455
456       link = _dbus_list_get_prev_link (&context->servers, link);
457     }
458
459   if (is_reload)
460     dbus_free (context->address);
461
462   if (!_dbus_string_copy_data (&full_address, &context->address))
463     {
464       BUS_SET_OOM (error);
465       goto failed;
466     }
467
468   /* Create activation subsystem */
469   
470   if (is_reload)
471     bus_activation_unref (context->activation);
472   
473   context->activation = bus_activation_new (context, &full_address,
474                                             bus_config_parser_get_service_dirs (parser),
475                                             error);
476   if (context->activation == NULL)
477     {
478       _DBUS_ASSERT_ERROR_IS_SET (error);
479       goto failed;
480     }
481
482   service_sid_table = bus_config_parser_steal_service_sid_table (parser);
483   bus_registry_set_service_sid_table (context->registry,
484                                       service_sid_table);
485   _dbus_hash_table_unref (service_sid_table);
486   
487   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
488   retval = TRUE;
489
490  failed:
491   _dbus_string_free (&full_address);
492   return retval;
493 }
494
495 static dbus_bool_t
496 load_config (BusContext *context,
497              dbus_bool_t is_reload,
498              DBusError  *error)
499 {
500   BusConfigParser *parser;
501   DBusString config_file;
502   dbus_bool_t retval;
503
504   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
505
506   retval = FALSE;
507   parser = NULL;
508
509   _dbus_string_init_const (&config_file, context->config_file);
510   parser = bus_config_load (&config_file, TRUE, NULL, error);
511   if (parser == NULL)
512     {
513       _DBUS_ASSERT_ERROR_IS_SET (error);
514       goto failed;
515     }
516   
517   if (!is_reload && !process_config_first_time_only (context, parser, error))
518     {
519       _DBUS_ASSERT_ERROR_IS_SET (error);
520       goto failed;
521     }
522
523   if (!process_config_every_time (context, parser, is_reload, error))
524     {
525       _DBUS_ASSERT_ERROR_IS_SET (error);
526       goto failed;
527     }
528
529   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
530   retval = TRUE;
531
532  failed:
533   if (parser)
534     bus_config_parser_unref (parser);
535   return retval;
536 }
537
538 BusContext*
539 bus_context_new (const DBusString *config_file,
540                  ForceForkSetting  force_fork,
541                  int               print_addr_fd,
542                  int               print_pid_fd,
543                  DBusError        *error)
544 {
545   BusContext *context;
546   
547   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
548
549   if (!dbus_server_allocate_data_slot (&server_data_slot))
550     {
551       BUS_SET_OOM (error);
552       return NULL;
553     }
554
555   context = dbus_new0 (BusContext, 1);
556   if (context == NULL)
557     {
558       BUS_SET_OOM (error);
559       goto failed;
560     }
561   context->refcount = 1;
562
563   if (!_dbus_string_copy_data (config_file, &context->config_file))
564     {
565       BUS_SET_OOM (error);
566       goto failed;
567     }
568
569   context->loop = _dbus_loop_new ();
570   if (context->loop == NULL)
571     {
572       BUS_SET_OOM (error);
573       goto failed;
574     }
575
576   context->registry = bus_registry_new (context);
577   if (context->registry == NULL)
578     {
579       BUS_SET_OOM (error);
580       goto failed;
581     }
582   
583   if (!load_config (context, FALSE, error))
584     {
585       _DBUS_ASSERT_ERROR_IS_SET (error);
586       goto failed;
587     }
588   
589   /* we need another ref of the server data slot for the context
590    * to own
591    */
592   if (!dbus_server_allocate_data_slot (&server_data_slot))
593     _dbus_assert_not_reached ("second ref of server data slot failed");
594
595   context->user_database = _dbus_user_database_new ();
596   if (context->user_database == NULL)
597     {
598       BUS_SET_OOM (error);
599       goto failed;
600     }
601   
602   /* Note that we don't know whether the print_addr_fd is
603    * one of the sockets we're using to listen on, or some
604    * other random thing. But I think the answer is "don't do
605    * that then"
606    */
607   if (print_addr_fd >= 0)
608     {
609       DBusString addr;
610       const char *a = bus_context_get_address (context);
611       int bytes;
612       
613       _dbus_assert (a != NULL);
614       if (!_dbus_string_init (&addr))
615         {
616           BUS_SET_OOM (error);
617           goto failed;
618         }
619       
620       if (!_dbus_string_append (&addr, a) ||
621           !_dbus_string_append (&addr, "\n"))
622         {
623           _dbus_string_free (&addr);
624           BUS_SET_OOM (error);
625           goto failed;
626         }
627
628       bytes = _dbus_string_get_length (&addr);
629       if (_dbus_write (print_addr_fd, &addr, 0, bytes) != bytes)
630         {
631           dbus_set_error (error, DBUS_ERROR_FAILED,
632                           "Printing message bus address: %s\n",
633                           _dbus_strerror (errno));
634           _dbus_string_free (&addr);
635           goto failed;
636         }
637
638       if (print_addr_fd > 2)
639         _dbus_close (print_addr_fd, NULL);
640
641       _dbus_string_free (&addr);
642     }
643   
644   context->connections = bus_connections_new (context);
645   if (context->connections == NULL)
646     {
647       BUS_SET_OOM (error);
648       goto failed;
649     }
650
651   context->matchmaker = bus_matchmaker_new ();
652   if (context->matchmaker == NULL)
653     {
654       BUS_SET_OOM (error);
655       goto failed;
656     }
657   
658   /* Now become a daemon if appropriate */
659   if ((force_fork != FORK_NEVER && context->fork) || force_fork == FORK_ALWAYS)
660     {
661       DBusString u;
662
663       if (context->pidfile)
664         _dbus_string_init_const (&u, context->pidfile);
665       
666       if (!_dbus_become_daemon (context->pidfile ? &u : NULL, 
667                                 print_pid_fd,
668                                 error))
669         {
670           _DBUS_ASSERT_ERROR_IS_SET (error);
671           goto failed;
672         }
673     }
674   else
675     {
676       /* Need to write PID file for ourselves, not for the child process */
677       if (context->pidfile != NULL)
678         {
679           DBusString u;
680
681           _dbus_string_init_const (&u, context->pidfile);
682           
683           if (!_dbus_write_pid_file (&u, _dbus_getpid (), error))
684             {
685               _DBUS_ASSERT_ERROR_IS_SET (error);
686               goto failed;
687             }
688         }
689     }
690
691   /* Write PID if requested */
692   if (print_pid_fd >= 0)
693     {
694       DBusString pid;
695       int bytes;
696
697       if (!_dbus_string_init (&pid))
698         {
699           BUS_SET_OOM (error);
700           goto failed;
701         }
702       
703       if (!_dbus_string_append_int (&pid, _dbus_getpid ()) ||
704           !_dbus_string_append (&pid, "\n"))
705         {
706           _dbus_string_free (&pid);
707           BUS_SET_OOM (error);
708           goto failed;
709         }
710
711       bytes = _dbus_string_get_length (&pid);
712       if (_dbus_write (print_pid_fd, &pid, 0, bytes) != bytes)
713         {
714           dbus_set_error (error, DBUS_ERROR_FAILED,
715                           "Printing message bus PID: %s\n",
716                           _dbus_strerror (errno));
717           _dbus_string_free (&pid);
718           goto failed;
719         }
720
721       if (print_pid_fd > 2)
722         _dbus_close (print_pid_fd, NULL);
723       
724       _dbus_string_free (&pid);
725     }
726   
727   /* Here we change our credentials if required,
728    * as soon as we've set up our sockets and pidfile
729    */
730   if (context->user != NULL)
731     {
732       DBusCredentials creds;
733       DBusString u;
734
735       _dbus_string_init_const (&u, context->user);
736
737       if (!_dbus_credentials_from_username (&u, &creds) ||
738           creds.uid < 0 ||
739           creds.gid < 0)
740         {
741           dbus_set_error (error, DBUS_ERROR_FAILED,
742                           "Could not get UID and GID for username \"%s\"",
743                           context->user);
744           goto failed;
745         }
746       
747       if (!_dbus_change_identity (creds.uid, creds.gid, error))
748         {
749           _DBUS_ASSERT_ERROR_IS_SET (error);
750           goto failed;
751         }
752     }
753   
754   dbus_server_free_data_slot (&server_data_slot);
755   
756   return context;
757   
758  failed:  
759   if (context != NULL)
760     bus_context_unref (context);
761
762   if (server_data_slot >= 0)
763     dbus_server_free_data_slot (&server_data_slot);
764   
765   return NULL;
766 }
767
768 dbus_bool_t
769 bus_context_reload_config (BusContext *context,
770                            DBusError  *error)
771 {
772   return load_config (context,
773                       TRUE, /* yes, we are re-loading */
774                       error);
775 }
776
777 static void
778 shutdown_server (BusContext *context,
779                  DBusServer *server)
780 {
781   if (server == NULL ||
782       !dbus_server_get_is_connected (server))
783     return;
784   
785   if (!dbus_server_set_watch_functions (server,
786                                         NULL, NULL, NULL,
787                                         context,
788                                         NULL))
789     _dbus_assert_not_reached ("setting watch functions to NULL failed");
790   
791   if (!dbus_server_set_timeout_functions (server,
792                                           NULL, NULL, NULL,
793                                           context,
794                                           NULL))
795     _dbus_assert_not_reached ("setting timeout functions to NULL failed");
796   
797   dbus_server_disconnect (server);
798 }
799
800 void
801 bus_context_shutdown (BusContext  *context)
802 {
803   DBusList *link;
804
805   link = _dbus_list_get_first_link (&context->servers);
806   while (link != NULL)
807     {
808       shutdown_server (context, link->data);
809
810       link = _dbus_list_get_next_link (&context->servers, link);
811     }
812 }
813
814 BusContext *
815 bus_context_ref (BusContext *context)
816 {
817   _dbus_assert (context->refcount > 0);
818   context->refcount += 1;
819
820   return context;
821 }
822
823 void
824 bus_context_unref (BusContext *context)
825 {
826   _dbus_assert (context->refcount > 0);
827   context->refcount -= 1;
828
829   if (context->refcount == 0)
830     {
831       DBusList *link;
832       
833       _dbus_verbose ("Finalizing bus context %p\n", context);
834       
835       bus_context_shutdown (context);
836
837       if (context->connections)
838         {
839           bus_connections_unref (context->connections);
840           context->connections = NULL;
841         }
842       
843       if (context->registry)
844         {
845           bus_registry_unref (context->registry);
846           context->registry = NULL;
847         }
848       
849       if (context->activation)
850         {
851           bus_activation_unref (context->activation);
852           context->activation = NULL;
853         }
854
855       link = _dbus_list_get_first_link (&context->servers);
856       while (link != NULL)
857         {
858           dbus_server_unref (link->data);
859           
860           link = _dbus_list_get_next_link (&context->servers, link);
861         }
862       _dbus_list_clear (&context->servers);
863
864       if (context->policy)
865         {
866           bus_policy_unref (context->policy);
867           context->policy = NULL;
868         }
869       
870       if (context->loop)
871         {
872           _dbus_loop_unref (context->loop);
873           context->loop = NULL;
874         }
875
876       if (context->matchmaker)
877         {
878           bus_matchmaker_unref (context->matchmaker);
879           context->matchmaker = NULL;
880         }
881       
882       dbus_free (context->config_file);
883       dbus_free (context->type);
884       dbus_free (context->address);
885       dbus_free (context->user);
886
887       if (context->pidfile)
888         {
889           DBusString u;
890           _dbus_string_init_const (&u, context->pidfile);
891
892           /* Deliberately ignore errors here, since there's not much
893            * we can do about it, and we're exiting anyways.
894            */
895           _dbus_delete_file (&u, NULL);
896
897           dbus_free (context->pidfile); 
898         }
899
900       if (context->user_database != NULL)
901         _dbus_user_database_unref (context->user_database);
902       
903       dbus_free (context);
904
905       dbus_server_free_data_slot (&server_data_slot);
906     }
907 }
908
909 /* type may be NULL */
910 const char*
911 bus_context_get_type (BusContext *context)
912 {
913   return context->type;
914 }
915
916 const char*
917 bus_context_get_address (BusContext *context)
918 {
919   return context->address;
920 }
921
922 BusRegistry*
923 bus_context_get_registry (BusContext  *context)
924 {
925   return context->registry;
926 }
927
928 BusConnections*
929 bus_context_get_connections (BusContext  *context)
930 {
931   return context->connections;
932 }
933
934 BusActivation*
935 bus_context_get_activation (BusContext  *context)
936 {
937   return context->activation;
938 }
939
940 BusMatchmaker*
941 bus_context_get_matchmaker (BusContext  *context)
942 {
943   return context->matchmaker;
944 }
945
946 DBusLoop*
947 bus_context_get_loop (BusContext *context)
948 {
949   return context->loop;
950 }
951
952 DBusUserDatabase*
953 bus_context_get_user_database (BusContext *context)
954 {
955   return context->user_database;
956 }
957
958 dbus_bool_t
959 bus_context_allow_user (BusContext   *context,
960                         unsigned long uid)
961 {
962   return bus_policy_allow_user (context->policy,
963                                 context->user_database,
964                                 uid);
965 }
966
967 BusPolicy *
968 bus_context_get_policy (BusContext *context)
969 {
970   return context->policy;
971 }
972
973 BusClientPolicy*
974 bus_context_create_client_policy (BusContext      *context,
975                                   DBusConnection  *connection,
976                                   DBusError       *error)
977 {
978   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
979   return bus_policy_create_client_policy (context->policy, connection,
980                                           error);
981 }
982
983 int
984 bus_context_get_activation_timeout (BusContext *context)
985 {
986   
987   return context->limits.activation_timeout;
988 }
989
990 int
991 bus_context_get_auth_timeout (BusContext *context)
992 {
993   return context->limits.auth_timeout;
994 }
995
996 int
997 bus_context_get_max_completed_connections (BusContext *context)
998 {
999   return context->limits.max_completed_connections;
1000 }
1001
1002 int
1003 bus_context_get_max_incomplete_connections (BusContext *context)
1004 {
1005   return context->limits.max_incomplete_connections;
1006 }
1007
1008 int
1009 bus_context_get_max_connections_per_user (BusContext *context)
1010 {
1011   return context->limits.max_connections_per_user;
1012 }
1013
1014 int
1015 bus_context_get_max_pending_activations (BusContext *context)
1016 {
1017   return context->limits.max_pending_activations;
1018 }
1019
1020 int
1021 bus_context_get_max_services_per_connection (BusContext *context)
1022 {
1023   return context->limits.max_services_per_connection;
1024 }
1025
1026 int
1027 bus_context_get_max_match_rules_per_connection (BusContext *context)
1028 {
1029   return context->limits.max_match_rules_per_connection;
1030 }
1031
1032 int
1033 bus_context_get_max_replies_per_connection (BusContext *context)
1034 {
1035   return context->limits.max_replies_per_connection;
1036 }
1037
1038 int
1039 bus_context_get_reply_timeout (BusContext *context)
1040 {
1041   return context->limits.reply_timeout;
1042 }
1043
1044 /*
1045  * addressed_recipient is the recipient specified in the message.
1046  *
1047  * proposed_recipient is the recipient we're considering sending
1048  * to right this second, and may be an eavesdropper.
1049  *
1050  * sender is the sender of the message.
1051  *
1052  * NULL for proposed_recipient or sender definitely means the bus driver.
1053  *
1054  * NULL for addressed_recipient may mean the bus driver, or may mean
1055  * no destination was specified in the message (e.g. a signal).
1056  */
1057 dbus_bool_t
1058 bus_context_check_security_policy (BusContext     *context,
1059                                    BusTransaction *transaction,
1060                                    DBusConnection *sender,
1061                                    DBusConnection *addressed_recipient,
1062                                    DBusConnection *proposed_recipient,
1063                                    DBusMessage    *message,
1064                                    DBusError      *error)
1065 {
1066   BusClientPolicy *sender_policy;
1067   BusClientPolicy *recipient_policy;
1068   int type;
1069   dbus_bool_t requested_reply;
1070   
1071   type = dbus_message_get_type (message);
1072   
1073   /* dispatch.c was supposed to ensure these invariants */
1074   _dbus_assert (dbus_message_get_destination (message) != NULL ||
1075                 type == DBUS_MESSAGE_TYPE_SIGNAL ||
1076                 (sender == NULL && !bus_connection_is_active (proposed_recipient)));
1077   _dbus_assert (type == DBUS_MESSAGE_TYPE_SIGNAL ||
1078                 addressed_recipient != NULL ||
1079                 strcmp (dbus_message_get_destination (message), DBUS_SERVICE_ORG_FREEDESKTOP_DBUS) == 0);
1080   
1081   switch (type)
1082     {
1083     case DBUS_MESSAGE_TYPE_METHOD_CALL:
1084     case DBUS_MESSAGE_TYPE_SIGNAL:
1085     case DBUS_MESSAGE_TYPE_METHOD_RETURN:
1086     case DBUS_MESSAGE_TYPE_ERROR:
1087       break;
1088       
1089     default:
1090       _dbus_verbose ("security check disallowing message of unknown type %d\n",
1091                      type);
1092
1093       dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1094                       "Message bus will not accept messages of unknown type\n");
1095               
1096       return FALSE;
1097     }
1098
1099   requested_reply = FALSE;
1100   
1101   if (sender != NULL)
1102     {
1103       /* First verify the SELinux access controls.  If allowed then
1104        * go on with the standard checks.
1105        */
1106       if (!bus_selinux_allows_send (sender, proposed_recipient))
1107         {
1108           const char *dest = dbus_message_get_destination (message);
1109           dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1110                           "An SELinux policy prevents this sender "
1111                           "from sending this message to this recipient "
1112                           "(rejected message had interface \"%s\" "
1113                           "member \"%s\" error name \"%s\" destination \"%s\")",
1114                           dbus_message_get_interface (message) ?
1115                           dbus_message_get_interface (message) : "(unset)",
1116                           dbus_message_get_member (message) ?
1117                           dbus_message_get_member (message) : "(unset)",
1118                           dbus_message_get_error_name (message) ?
1119                           dbus_message_get_error_name (message) : "(unset)",
1120                           dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
1121           _dbus_verbose ("SELinux security check denying send to service\n");
1122           return FALSE;
1123         }
1124        
1125       if (bus_connection_is_active (sender))
1126         {
1127           sender_policy = bus_connection_get_policy (sender);
1128           _dbus_assert (sender_policy != NULL);
1129           
1130           /* Fill in requested_reply variable with TRUE if this is a
1131            * reply and the reply was pending.
1132            */
1133           if (dbus_message_get_reply_serial (message) != 0)
1134             {
1135               if (proposed_recipient != NULL /* not to the bus driver */ &&
1136                   addressed_recipient == proposed_recipient /* not eavesdropping */)
1137                 {
1138                   DBusError error2;                  
1139                   
1140                   dbus_error_init (&error2);
1141                   requested_reply = bus_connections_check_reply (bus_connection_get_connections (sender),
1142                                                                  transaction,
1143                                                                  sender, addressed_recipient, message,
1144                                                                  &error2);
1145                   if (dbus_error_is_set (&error2))
1146                     {
1147                       dbus_move_error (&error2, error);
1148                       return FALSE;
1149                     }
1150                 }
1151             }
1152         }
1153       else
1154         {
1155           /* Policy for inactive connections is that they can only send
1156            * the hello message to the bus driver
1157            */
1158           if (proposed_recipient == NULL &&
1159               dbus_message_is_method_call (message,
1160                                            DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
1161                                            "Hello"))
1162             {
1163               _dbus_verbose ("security check allowing %s message\n",
1164                              "Hello");
1165               return TRUE;
1166             }
1167           else
1168             {
1169               _dbus_verbose ("security check disallowing non-%s message\n",
1170                              "Hello");
1171
1172               dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1173                               "Client tried to send a message other than %s without being registered",
1174                               "Hello");
1175               
1176               return FALSE;
1177             }
1178         }
1179     }
1180   else
1181     {
1182       sender_policy = NULL;
1183
1184       /* If the sender is the bus driver, we assume any reply was a
1185        * requested reply as bus driver won't send bogus ones
1186        */
1187       if (addressed_recipient == proposed_recipient /* not eavesdropping */ &&
1188           dbus_message_get_reply_serial (message) != 0)
1189         requested_reply = TRUE;
1190     }
1191
1192   _dbus_assert ((sender != NULL && sender_policy != NULL) ||
1193                 (sender == NULL && sender_policy == NULL));
1194   
1195   if (proposed_recipient != NULL)
1196     {
1197       /* only the bus driver can send to an inactive recipient (as it
1198        * owns no services, so other apps can't address it). Inactive
1199        * recipients can receive any message.
1200        */
1201       if (bus_connection_is_active (proposed_recipient))
1202         {
1203           recipient_policy = bus_connection_get_policy (proposed_recipient);
1204           _dbus_assert (recipient_policy != NULL);
1205         }
1206       else if (sender == NULL)
1207         {
1208           _dbus_verbose ("security check using NULL recipient policy for message from bus\n");
1209           recipient_policy = NULL;
1210         }
1211       else
1212         {
1213           _dbus_assert_not_reached ("a message was somehow sent to an inactive recipient from a source other than the message bus\n");
1214           recipient_policy = NULL;
1215         }
1216     }
1217   else
1218     recipient_policy = NULL;
1219   
1220   _dbus_assert ((proposed_recipient != NULL && recipient_policy != NULL) ||
1221                 (proposed_recipient != NULL && sender == NULL && recipient_policy == NULL) ||
1222                 (proposed_recipient == NULL && recipient_policy == NULL));
1223   
1224   if (sender_policy &&
1225       !bus_client_policy_check_can_send (sender_policy,
1226                                          context->registry,
1227                                          requested_reply,
1228                                          proposed_recipient,
1229                                          message))
1230     {
1231       const char *dest = dbus_message_get_destination (message);
1232       dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1233                       "A security policy in place prevents this sender "
1234                       "from sending this message to this recipient, "
1235                       "see message bus configuration file (rejected message "
1236                       "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\")",
1237                       dbus_message_get_interface (message) ?
1238                       dbus_message_get_interface (message) : "(unset)",
1239                       dbus_message_get_member (message) ?
1240                       dbus_message_get_member (message) : "(unset)",
1241                       dbus_message_get_error_name (message) ?
1242                       dbus_message_get_error_name (message) : "(unset)",
1243                       dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
1244       _dbus_verbose ("security policy disallowing message due to sender policy\n");
1245       return FALSE;
1246     }
1247
1248   if (recipient_policy &&
1249       !bus_client_policy_check_can_receive (recipient_policy,
1250                                             context->registry,
1251                                             requested_reply,
1252                                             sender,
1253                                             addressed_recipient, proposed_recipient,
1254                                             message))
1255     {
1256       const char *dest = dbus_message_get_destination (message);
1257       dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1258                       "A security policy in place prevents this recipient "
1259                       "from receiving this message from this sender, "
1260                       "see message bus configuration file (rejected message "
1261                       "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\" reply serial %u requested_reply=%d)",
1262                       dbus_message_get_interface (message) ?
1263                       dbus_message_get_interface (message) : "(unset)",
1264                       dbus_message_get_member (message) ?
1265                       dbus_message_get_member (message) : "(unset)",
1266                       dbus_message_get_error_name (message) ?
1267                       dbus_message_get_error_name (message) : "(unset)",
1268                       dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
1269                       dbus_message_get_reply_serial (message),
1270                       requested_reply);
1271       _dbus_verbose ("security policy disallowing message due to recipient policy\n");
1272       return FALSE;
1273     }
1274
1275   /* See if limits on size have been exceeded */
1276   if (proposed_recipient &&
1277       dbus_connection_get_outgoing_size (proposed_recipient) >
1278       context->limits.max_outgoing_bytes)
1279     {
1280       const char *dest = dbus_message_get_destination (message);
1281       dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
1282                       "The destination service \"%s\" has a full message queue",
1283                       dest ? dest : (proposed_recipient ?
1284                                      bus_connection_get_name (proposed_recipient) : 
1285                                      DBUS_SERVICE_ORG_FREEDESKTOP_DBUS));
1286       _dbus_verbose ("security policy disallowing message due to full message queue\n");
1287       return FALSE;
1288     }
1289
1290   if (type == DBUS_MESSAGE_TYPE_METHOD_CALL)
1291     {
1292       /* Record that we will allow a reply here in the future (don't
1293        * bother if the recipient is the bus). Only the addressed recipient
1294        * may reply.
1295        */
1296       if (sender && addressed_recipient &&
1297           !bus_connections_expect_reply (bus_connection_get_connections (sender),
1298                                          transaction,
1299                                          sender, addressed_recipient,
1300                                          message, error))
1301         {
1302           _dbus_verbose ("Failed to record reply expectation or problem with the message expecting a reply\n");
1303           return FALSE;
1304         }
1305     }
1306   
1307   _dbus_verbose ("security policy allowing message\n");
1308   return TRUE;
1309 }