2004-09-12 David Zeuthen <david@fubar.dk>
[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, error))
667         {
668           _DBUS_ASSERT_ERROR_IS_SET (error);
669           goto failed;
670         }
671     }
672   else
673     {
674       /* Need to write PID file for ourselves, not for the child process */
675       if (context->pidfile != NULL)
676         {
677           DBusString u;
678
679           _dbus_string_init_const (&u, context->pidfile);
680           
681           if (!_dbus_write_pid_file (&u, _dbus_getpid (), error))
682             {
683               _DBUS_ASSERT_ERROR_IS_SET (error);
684               goto failed;
685             }
686         }
687     }
688
689   /* Write PID if requested */
690   if (print_pid_fd >= 0)
691     {
692       DBusString pid;
693       int bytes;
694
695       if (!_dbus_string_init (&pid))
696         {
697           BUS_SET_OOM (error);
698           goto failed;
699         }
700       
701       if (!_dbus_string_append_int (&pid, _dbus_getpid ()) ||
702           !_dbus_string_append (&pid, "\n"))
703         {
704           _dbus_string_free (&pid);
705           BUS_SET_OOM (error);
706           goto failed;
707         }
708
709       bytes = _dbus_string_get_length (&pid);
710       if (_dbus_write (print_pid_fd, &pid, 0, bytes) != bytes)
711         {
712           dbus_set_error (error, DBUS_ERROR_FAILED,
713                           "Printing message bus PID: %s\n",
714                           _dbus_strerror (errno));
715           _dbus_string_free (&pid);
716           goto failed;
717         }
718
719       if (print_pid_fd > 2)
720         _dbus_close (print_pid_fd, NULL);
721       
722       _dbus_string_free (&pid);
723     }
724   
725   /* Here we change our credentials if required,
726    * as soon as we've set up our sockets and pidfile
727    */
728   if (context->user != NULL)
729     {
730       DBusCredentials creds;
731       DBusString u;
732
733       _dbus_string_init_const (&u, context->user);
734
735       if (!_dbus_credentials_from_username (&u, &creds) ||
736           creds.uid < 0 ||
737           creds.gid < 0)
738         {
739           dbus_set_error (error, DBUS_ERROR_FAILED,
740                           "Could not get UID and GID for username \"%s\"",
741                           context->user);
742           goto failed;
743         }
744       
745       if (!_dbus_change_identity (creds.uid, creds.gid, error))
746         {
747           _DBUS_ASSERT_ERROR_IS_SET (error);
748           goto failed;
749         }
750     }
751   
752   dbus_server_free_data_slot (&server_data_slot);
753   
754   return context;
755   
756  failed:  
757   if (context != NULL)
758     bus_context_unref (context);
759
760   if (server_data_slot >= 0)
761     dbus_server_free_data_slot (&server_data_slot);
762   
763   return NULL;
764 }
765
766 dbus_bool_t
767 bus_context_reload_config (BusContext *context,
768                            DBusError  *error)
769 {
770   return load_config (context,
771                       TRUE, /* yes, we are re-loading */
772                       error);
773 }
774
775 static void
776 shutdown_server (BusContext *context,
777                  DBusServer *server)
778 {
779   if (server == NULL ||
780       !dbus_server_get_is_connected (server))
781     return;
782   
783   if (!dbus_server_set_watch_functions (server,
784                                         NULL, NULL, NULL,
785                                         context,
786                                         NULL))
787     _dbus_assert_not_reached ("setting watch functions to NULL failed");
788   
789   if (!dbus_server_set_timeout_functions (server,
790                                           NULL, NULL, NULL,
791                                           context,
792                                           NULL))
793     _dbus_assert_not_reached ("setting timeout functions to NULL failed");
794   
795   dbus_server_disconnect (server);
796 }
797
798 void
799 bus_context_shutdown (BusContext  *context)
800 {
801   DBusList *link;
802
803   link = _dbus_list_get_first_link (&context->servers);
804   while (link != NULL)
805     {
806       shutdown_server (context, link->data);
807
808       link = _dbus_list_get_next_link (&context->servers, link);
809     }
810 }
811
812 BusContext *
813 bus_context_ref (BusContext *context)
814 {
815   _dbus_assert (context->refcount > 0);
816   context->refcount += 1;
817
818   return context;
819 }
820
821 void
822 bus_context_unref (BusContext *context)
823 {
824   _dbus_assert (context->refcount > 0);
825   context->refcount -= 1;
826
827   if (context->refcount == 0)
828     {
829       DBusList *link;
830       
831       _dbus_verbose ("Finalizing bus context %p\n", context);
832       
833       bus_context_shutdown (context);
834
835       if (context->connections)
836         {
837           bus_connections_unref (context->connections);
838           context->connections = NULL;
839         }
840       
841       if (context->registry)
842         {
843           bus_registry_unref (context->registry);
844           context->registry = NULL;
845         }
846       
847       if (context->activation)
848         {
849           bus_activation_unref (context->activation);
850           context->activation = NULL;
851         }
852
853       link = _dbus_list_get_first_link (&context->servers);
854       while (link != NULL)
855         {
856           dbus_server_unref (link->data);
857           
858           link = _dbus_list_get_next_link (&context->servers, link);
859         }
860       _dbus_list_clear (&context->servers);
861
862       if (context->policy)
863         {
864           bus_policy_unref (context->policy);
865           context->policy = NULL;
866         }
867       
868       if (context->loop)
869         {
870           _dbus_loop_unref (context->loop);
871           context->loop = NULL;
872         }
873
874       if (context->matchmaker)
875         {
876           bus_matchmaker_unref (context->matchmaker);
877           context->matchmaker = NULL;
878         }
879       
880       dbus_free (context->config_file);
881       dbus_free (context->type);
882       dbus_free (context->address);
883       dbus_free (context->user);
884
885       if (context->pidfile)
886         {
887           DBusString u;
888           _dbus_string_init_const (&u, context->pidfile);
889
890           /* Deliberately ignore errors here, since there's not much
891            * we can do about it, and we're exiting anyways.
892            */
893           _dbus_delete_file (&u, NULL);
894
895           dbus_free (context->pidfile); 
896         }
897
898       if (context->user_database != NULL)
899         _dbus_user_database_unref (context->user_database);
900       
901       dbus_free (context);
902
903       dbus_server_free_data_slot (&server_data_slot);
904     }
905 }
906
907 /* type may be NULL */
908 const char*
909 bus_context_get_type (BusContext *context)
910 {
911   return context->type;
912 }
913
914 const char*
915 bus_context_get_address (BusContext *context)
916 {
917   return context->address;
918 }
919
920 BusRegistry*
921 bus_context_get_registry (BusContext  *context)
922 {
923   return context->registry;
924 }
925
926 BusConnections*
927 bus_context_get_connections (BusContext  *context)
928 {
929   return context->connections;
930 }
931
932 BusActivation*
933 bus_context_get_activation (BusContext  *context)
934 {
935   return context->activation;
936 }
937
938 BusMatchmaker*
939 bus_context_get_matchmaker (BusContext  *context)
940 {
941   return context->matchmaker;
942 }
943
944 DBusLoop*
945 bus_context_get_loop (BusContext *context)
946 {
947   return context->loop;
948 }
949
950 DBusUserDatabase*
951 bus_context_get_user_database (BusContext *context)
952 {
953   return context->user_database;
954 }
955
956 dbus_bool_t
957 bus_context_allow_user (BusContext   *context,
958                         unsigned long uid)
959 {
960   return bus_policy_allow_user (context->policy,
961                                 context->user_database,
962                                 uid);
963 }
964
965 BusPolicy *
966 bus_context_get_policy (BusContext *context)
967 {
968   return context->policy;
969 }
970
971 BusClientPolicy*
972 bus_context_create_client_policy (BusContext      *context,
973                                   DBusConnection  *connection,
974                                   DBusError       *error)
975 {
976   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
977   return bus_policy_create_client_policy (context->policy, connection,
978                                           error);
979 }
980
981 int
982 bus_context_get_activation_timeout (BusContext *context)
983 {
984   
985   return context->limits.activation_timeout;
986 }
987
988 int
989 bus_context_get_auth_timeout (BusContext *context)
990 {
991   return context->limits.auth_timeout;
992 }
993
994 int
995 bus_context_get_max_completed_connections (BusContext *context)
996 {
997   return context->limits.max_completed_connections;
998 }
999
1000 int
1001 bus_context_get_max_incomplete_connections (BusContext *context)
1002 {
1003   return context->limits.max_incomplete_connections;
1004 }
1005
1006 int
1007 bus_context_get_max_connections_per_user (BusContext *context)
1008 {
1009   return context->limits.max_connections_per_user;
1010 }
1011
1012 int
1013 bus_context_get_max_pending_activations (BusContext *context)
1014 {
1015   return context->limits.max_pending_activations;
1016 }
1017
1018 int
1019 bus_context_get_max_services_per_connection (BusContext *context)
1020 {
1021   return context->limits.max_services_per_connection;
1022 }
1023
1024 int
1025 bus_context_get_max_match_rules_per_connection (BusContext *context)
1026 {
1027   return context->limits.max_match_rules_per_connection;
1028 }
1029
1030 int
1031 bus_context_get_max_replies_per_connection (BusContext *context)
1032 {
1033   return context->limits.max_replies_per_connection;
1034 }
1035
1036 int
1037 bus_context_get_reply_timeout (BusContext *context)
1038 {
1039   return context->limits.reply_timeout;
1040 }
1041
1042 /*
1043  * addressed_recipient is the recipient specified in the message.
1044  *
1045  * proposed_recipient is the recipient we're considering sending
1046  * to right this second, and may be an eavesdropper.
1047  *
1048  * sender is the sender of the message.
1049  *
1050  * NULL for proposed_recipient or sender definitely means the bus driver.
1051  *
1052  * NULL for addressed_recipient may mean the bus driver, or may mean
1053  * no destination was specified in the message (e.g. a signal).
1054  */
1055 dbus_bool_t
1056 bus_context_check_security_policy (BusContext     *context,
1057                                    BusTransaction *transaction,
1058                                    DBusConnection *sender,
1059                                    DBusConnection *addressed_recipient,
1060                                    DBusConnection *proposed_recipient,
1061                                    DBusMessage    *message,
1062                                    DBusError      *error)
1063 {
1064   BusClientPolicy *sender_policy;
1065   BusClientPolicy *recipient_policy;
1066   int type;
1067   dbus_bool_t requested_reply;
1068   
1069   type = dbus_message_get_type (message);
1070   
1071   /* dispatch.c was supposed to ensure these invariants */
1072   _dbus_assert (dbus_message_get_destination (message) != NULL ||
1073                 type == DBUS_MESSAGE_TYPE_SIGNAL ||
1074                 (sender == NULL && !bus_connection_is_active (proposed_recipient)));
1075   _dbus_assert (type == DBUS_MESSAGE_TYPE_SIGNAL ||
1076                 addressed_recipient != NULL ||
1077                 strcmp (dbus_message_get_destination (message), DBUS_SERVICE_ORG_FREEDESKTOP_DBUS) == 0);
1078   
1079   switch (type)
1080     {
1081     case DBUS_MESSAGE_TYPE_METHOD_CALL:
1082     case DBUS_MESSAGE_TYPE_SIGNAL:
1083     case DBUS_MESSAGE_TYPE_METHOD_RETURN:
1084     case DBUS_MESSAGE_TYPE_ERROR:
1085       break;
1086       
1087     default:
1088       _dbus_verbose ("security check disallowing message of unknown type %d\n",
1089                      type);
1090
1091       dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1092                       "Message bus will not accept messages of unknown type\n");
1093               
1094       return FALSE;
1095     }
1096
1097   requested_reply = FALSE;
1098   
1099   if (sender != NULL)
1100     {
1101       /* First verify the SELinux access controls.  If allowed then
1102        * go on with the standard checks.
1103        */
1104       if (!bus_selinux_allows_send (sender, proposed_recipient))
1105         {
1106           const char *dest = dbus_message_get_destination (message);
1107           dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1108                           "An SELinux policy prevents this sender "
1109                           "from sending this message to this recipient "
1110                           "(rejected message had interface \"%s\" "
1111                           "member \"%s\" error name \"%s\" destination \"%s\")",
1112                           dbus_message_get_interface (message) ?
1113                           dbus_message_get_interface (message) : "(unset)",
1114                           dbus_message_get_member (message) ?
1115                           dbus_message_get_member (message) : "(unset)",
1116                           dbus_message_get_error_name (message) ?
1117                           dbus_message_get_error_name (message) : "(unset)",
1118                           dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
1119           _dbus_verbose ("SELinux security check denying send to service\n");
1120           return FALSE;
1121         }
1122        
1123       if (bus_connection_is_active (sender))
1124         {
1125           sender_policy = bus_connection_get_policy (sender);
1126           _dbus_assert (sender_policy != NULL);
1127           
1128           /* Fill in requested_reply variable with TRUE if this is a
1129            * reply and the reply was pending.
1130            */
1131           if (dbus_message_get_reply_serial (message) != 0)
1132             {
1133               if (proposed_recipient != NULL /* not to the bus driver */ &&
1134                   addressed_recipient == proposed_recipient /* not eavesdropping */)
1135                 {
1136                   DBusError error2;                  
1137                   
1138                   dbus_error_init (&error2);
1139                   requested_reply = bus_connections_check_reply (bus_connection_get_connections (sender),
1140                                                                  transaction,
1141                                                                  sender, addressed_recipient, message,
1142                                                                  &error2);
1143                   if (dbus_error_is_set (&error2))
1144                     {
1145                       dbus_move_error (&error2, error);
1146                       return FALSE;
1147                     }
1148                 }
1149             }
1150         }
1151       else
1152         {
1153           /* Policy for inactive connections is that they can only send
1154            * the hello message to the bus driver
1155            */
1156           if (proposed_recipient == NULL &&
1157               dbus_message_is_method_call (message,
1158                                            DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
1159                                            "Hello"))
1160             {
1161               _dbus_verbose ("security check allowing %s message\n",
1162                              "Hello");
1163               return TRUE;
1164             }
1165           else
1166             {
1167               _dbus_verbose ("security check disallowing non-%s message\n",
1168                              "Hello");
1169
1170               dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1171                               "Client tried to send a message other than %s without being registered",
1172                               "Hello");
1173               
1174               return FALSE;
1175             }
1176         }
1177     }
1178   else
1179     {
1180       sender_policy = NULL;
1181
1182       /* If the sender is the bus driver, we assume any reply was a
1183        * requested reply as bus driver won't send bogus ones
1184        */
1185       if (addressed_recipient == proposed_recipient /* not eavesdropping */ &&
1186           dbus_message_get_reply_serial (message) != 0)
1187         requested_reply = TRUE;
1188     }
1189
1190   _dbus_assert ((sender != NULL && sender_policy != NULL) ||
1191                 (sender == NULL && sender_policy == NULL));
1192   
1193   if (proposed_recipient != NULL)
1194     {
1195       /* only the bus driver can send to an inactive recipient (as it
1196        * owns no services, so other apps can't address it). Inactive
1197        * recipients can receive any message.
1198        */
1199       if (bus_connection_is_active (proposed_recipient))
1200         {
1201           recipient_policy = bus_connection_get_policy (proposed_recipient);
1202           _dbus_assert (recipient_policy != NULL);
1203         }
1204       else if (sender == NULL)
1205         {
1206           _dbus_verbose ("security check using NULL recipient policy for message from bus\n");
1207           recipient_policy = NULL;
1208         }
1209       else
1210         {
1211           _dbus_assert_not_reached ("a message was somehow sent to an inactive recipient from a source other than the message bus\n");
1212           recipient_policy = NULL;
1213         }
1214     }
1215   else
1216     recipient_policy = NULL;
1217   
1218   _dbus_assert ((proposed_recipient != NULL && recipient_policy != NULL) ||
1219                 (proposed_recipient != NULL && sender == NULL && recipient_policy == NULL) ||
1220                 (proposed_recipient == NULL && recipient_policy == NULL));
1221   
1222   if (sender_policy &&
1223       !bus_client_policy_check_can_send (sender_policy,
1224                                          context->registry,
1225                                          requested_reply,
1226                                          proposed_recipient,
1227                                          message))
1228     {
1229       const char *dest = dbus_message_get_destination (message);
1230       dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1231                       "A security policy in place prevents this sender "
1232                       "from sending this message to this recipient, "
1233                       "see message bus configuration file (rejected message "
1234                       "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\")",
1235                       dbus_message_get_interface (message) ?
1236                       dbus_message_get_interface (message) : "(unset)",
1237                       dbus_message_get_member (message) ?
1238                       dbus_message_get_member (message) : "(unset)",
1239                       dbus_message_get_error_name (message) ?
1240                       dbus_message_get_error_name (message) : "(unset)",
1241                       dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
1242       _dbus_verbose ("security policy disallowing message due to sender policy\n");
1243       return FALSE;
1244     }
1245
1246   if (recipient_policy &&
1247       !bus_client_policy_check_can_receive (recipient_policy,
1248                                             context->registry,
1249                                             requested_reply,
1250                                             sender,
1251                                             addressed_recipient, proposed_recipient,
1252                                             message))
1253     {
1254       const char *dest = dbus_message_get_destination (message);
1255       dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1256                       "A security policy in place prevents this recipient "
1257                       "from receiving this message from this sender, "
1258                       "see message bus configuration file (rejected message "
1259                       "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\" reply serial %u requested_reply=%d)",
1260                       dbus_message_get_interface (message) ?
1261                       dbus_message_get_interface (message) : "(unset)",
1262                       dbus_message_get_member (message) ?
1263                       dbus_message_get_member (message) : "(unset)",
1264                       dbus_message_get_error_name (message) ?
1265                       dbus_message_get_error_name (message) : "(unset)",
1266                       dest ? dest : DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
1267                       dbus_message_get_reply_serial (message),
1268                       requested_reply);
1269       _dbus_verbose ("security policy disallowing message due to recipient policy\n");
1270       return FALSE;
1271     }
1272
1273   /* See if limits on size have been exceeded */
1274   if (proposed_recipient &&
1275       dbus_connection_get_outgoing_size (proposed_recipient) >
1276       context->limits.max_outgoing_bytes)
1277     {
1278       const char *dest = dbus_message_get_destination (message);
1279       dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
1280                       "The destination service \"%s\" has a full message queue",
1281                       dest ? dest : (proposed_recipient ?
1282                                      bus_connection_get_name (proposed_recipient) : 
1283                                      DBUS_SERVICE_ORG_FREEDESKTOP_DBUS));
1284       _dbus_verbose ("security policy disallowing message due to full message queue\n");
1285       return FALSE;
1286     }
1287
1288   if (type == DBUS_MESSAGE_TYPE_METHOD_CALL)
1289     {
1290       /* Record that we will allow a reply here in the future (don't
1291        * bother if the recipient is the bus). Only the addressed recipient
1292        * may reply.
1293        */
1294       if (sender && addressed_recipient &&
1295           !bus_connections_expect_reply (bus_connection_get_connections (sender),
1296                                          transaction,
1297                                          sender, addressed_recipient,
1298                                          message, error))
1299         {
1300           _dbus_verbose ("Failed to record reply expectation or problem with the message expecting a reply\n");
1301           return FALSE;
1302         }
1303     }
1304   
1305   _dbus_verbose ("security policy allowing message\n");
1306   return TRUE;
1307 }