From a683a80c409cc4f2e57ba6a3e60d52f91b8657d0 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sun, 21 Sep 2003 19:53:56 +0000 Subject: 2003-09-21 Havoc Pennington Get matching rules mostly working in the bus; only actually parsing the rule text remains. However, the client side of "signal connections" hasn't been started, this patch is only the bus side. * dbus/dispatch.c: fix for the matching rules changes * bus/driver.c (bus_driver_handle_remove_match) (bus_driver_handle_add_match): send an ack reply from these method calls * glib/dbus-gproxy.c (dbus_gproxy_begin_call): fix order of arguments, reported by Seth Nickell * bus/config-parser.c (append_rule_from_element): support eavesdrop=true|false attribute on policies so match rules can be prevented from snooping on the system bus. * bus/dbus-daemon-1.1.in: consistently use terminology "sender" and "destination" in attribute names; fix some docs bugs; add eavesdrop=true|false attribute * bus/driver.c (bus_driver_handle_add_match) (bus_driver_handle_remove_match): handle AddMatch, RemoveMatch messages * dbus/dbus-protocol.h (DBUS_SERVICE_ORG_FREEDESKTOP_BROADCAST): get rid of broadcast service concept, signals are just always broadcast * bus/signals.c, bus/dispatch.c, bus/connection.c, bus/bus.c: mostly implement matching rules stuff (currently only exposed as signal connections) --- bus/config-parser.c | 102 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 37 deletions(-) (limited to 'bus/config-parser.c') diff --git a/bus/config-parser.c b/bus/config-parser.c index cbc239f9..7b9b962d 100644 --- a/bus/config-parser.c +++ b/bus/config-parser.c @@ -334,6 +334,8 @@ bus_config_parser_new (const DBusString *basedir, parser->limits.max_pending_activations = 256; parser->limits.max_services_per_connection = 256; + + parser->limits.max_match_rules_per_connection = 128; parser->refcount = 1; @@ -837,15 +839,16 @@ append_rule_from_element (BusConfigParser *parser, const char *send_interface; const char *send_member; const char *send_error; - const char *send_service; + const char *send_destination; const char *send_path; const char *send_type; const char *receive_interface; const char *receive_member; const char *receive_error; - const char *receive_service; + const char *receive_sender; const char *receive_path; const char *receive_type; + const char *eavesdrop; const char *own; const char *user; const char *group; @@ -858,25 +861,26 @@ append_rule_from_element (BusConfigParser *parser, "send_interface", &send_interface, "send_member", &send_member, "send_error", &send_error, - "send_service", &send_service, + "send_destination", &send_destination, "send_path", &send_path, "send_type", &send_type, "receive_interface", &receive_interface, "receive_member", &receive_member, "receive_error", &receive_error, - "receive_service", &receive_service, + "receive_sender", &receive_sender, "receive_path", &receive_path, "receive_type", &receive_type, + "eavesdrop", &eavesdrop, "own", &own, "user", &user, "group", &group, NULL)) return FALSE; - if (!(send_interface || send_member || send_error || send_service || + if (!(send_interface || send_member || send_error || send_destination || send_type || send_path || - receive_interface || receive_member || receive_error || receive_service || - receive_type || receive_path || + receive_interface || receive_member || receive_error || receive_sender || + receive_type || receive_path || eavesdrop || own || user || group)) { dbus_set_error (error, DBUS_ERROR_FAILED, @@ -902,17 +906,20 @@ append_rule_from_element (BusConfigParser *parser, * interface + member * error * - * base send_ can combine with send_service, send_path, send_type - * base receive_ with receive_service, receive_path, receive_type + * base send_ can combine with send_destination, send_path, send_type + * base receive_ with receive_sender, receive_path, receive_type, eavesdrop * * user, group, own must occur alone + * + * Pretty sure the below stuff is broken, FIXME think about it more. */ if (((send_interface && send_error) || (send_interface && receive_interface) || (send_interface && receive_member) || (send_interface && receive_error) || - (send_interface && receive_service) || + (send_interface && receive_sender) || + (send_interface && eavesdrop) || (send_interface && own) || (send_interface && user) || (send_interface && group)) || @@ -921,7 +928,8 @@ append_rule_from_element (BusConfigParser *parser, (send_member && receive_interface) || (send_member && receive_member) || (send_member && receive_error) || - (send_member && receive_service) || + (send_member && receive_sender) || + (send_member && eavesdrop) || (send_member && own) || (send_member && user) || (send_member && group)) || @@ -929,23 +937,26 @@ append_rule_from_element (BusConfigParser *parser, ((send_error && receive_interface) || (send_error && receive_member) || (send_error && receive_error) || - (send_error && receive_service) || + (send_error && receive_sender) || + (send_error && eavesdrop) || (send_error && own) || (send_error && user) || (send_error && group)) || - ((send_service && receive_interface) || - (send_service && receive_member) || - (send_service && receive_error) || - (send_service && receive_service) || - (send_service && own) || - (send_service && user) || - (send_service && group)) || + ((send_destination && receive_interface) || + (send_destination && receive_member) || + (send_destination && receive_error) || + (send_destination && receive_sender) || + (send_destination && eavesdrop) || + (send_destination && own) || + (send_destination && user) || + (send_destination && group)) || ((send_type && receive_interface) || (send_type && receive_member) || (send_type && receive_error) || - (send_type && receive_service) || + (send_type && receive_sender) || + (send_type && eavesdrop) || (send_type && own) || (send_type && user) || (send_type && group)) || @@ -953,7 +964,8 @@ append_rule_from_element (BusConfigParser *parser, ((send_path && receive_interface) || (send_path && receive_member) || (send_path && receive_error) || - (send_path && receive_service) || + (send_path && receive_sender) || + (send_path && eavesdrop) || (send_path && own) || (send_path && user) || (send_path && group)) || @@ -967,19 +979,22 @@ append_rule_from_element (BusConfigParser *parser, (receive_member && own) || (receive_member && user) || (receive_member && group)) || - + ((receive_error && own) || (receive_error && user) || (receive_error && group)) || + ((eavesdrop && own) || + (eavesdrop && user) || + (eavesdrop && group)) || + ((own && user) || (own && group)) || ((user && group))) { dbus_set_error (error, DBUS_ERROR_FAILED, - "Invalid combination of attributes on element <%s>, " - "only send_foo/send_service or receive_foo/receive_service may be paired", + "Invalid combination of attributes on element <%s>", element_name); return FALSE; } @@ -991,7 +1006,7 @@ append_rule_from_element (BusConfigParser *parser, */ #define IS_WILDCARD(str) ((str) && ((str)[0]) == '*' && ((str)[1]) == '\0') - if (send_interface || send_member || send_error || send_service || + if (send_interface || send_member || send_error || send_destination || send_path || send_type) { int message_type; @@ -1002,8 +1017,8 @@ append_rule_from_element (BusConfigParser *parser, send_member = NULL; if (IS_WILDCARD (send_error)) send_error = NULL; - if (IS_WILDCARD (send_service)) - send_service = NULL; + if (IS_WILDCARD (send_destination)) + send_destination = NULL; if (IS_WILDCARD (send_path)) send_path = NULL; if (IS_WILDCARD (send_type)) @@ -1025,13 +1040,13 @@ append_rule_from_element (BusConfigParser *parser, rule = bus_policy_rule_new (BUS_POLICY_RULE_SEND, allow); if (rule == NULL) goto nomem; - + rule->d.send.message_type = message_type; rule->d.send.path = _dbus_strdup (send_path); rule->d.send.interface = _dbus_strdup (send_interface); rule->d.send.member = _dbus_strdup (send_member); rule->d.send.error = _dbus_strdup (send_error); - rule->d.send.destination = _dbus_strdup (send_service); + rule->d.send.destination = _dbus_strdup (send_destination); if (send_path && rule->d.send.path == NULL) goto nomem; if (send_interface && rule->d.send.interface == NULL) @@ -1040,11 +1055,11 @@ append_rule_from_element (BusConfigParser *parser, goto nomem; if (send_error && rule->d.send.error == NULL) goto nomem; - if (send_service && rule->d.send.destination == NULL) + if (send_destination && rule->d.send.destination == NULL) goto nomem; } - else if (receive_interface || receive_member || receive_error || receive_service || - receive_path || receive_type) + else if (receive_interface || receive_member || receive_error || receive_sender || + receive_path || receive_type || eavesdrop) { int message_type; @@ -1054,14 +1069,13 @@ append_rule_from_element (BusConfigParser *parser, receive_member = NULL; if (IS_WILDCARD (receive_error)) receive_error = NULL; - if (IS_WILDCARD (receive_service)) - receive_service = NULL; + if (IS_WILDCARD (receive_sender)) + receive_sender = NULL; if (IS_WILDCARD (receive_path)) receive_path = NULL; if (IS_WILDCARD (receive_type)) receive_type = NULL; - message_type = DBUS_MESSAGE_TYPE_INVALID; if (receive_type != NULL) { @@ -1074,17 +1088,31 @@ append_rule_from_element (BusConfigParser *parser, return FALSE; } } + + + if (eavesdrop && + !(strcmp (eavesdrop, "true") == 0 || + strcmp (eavesdrop, "false") == 0)) + { + dbus_set_error (error, DBUS_ERROR_FAILED, + "Bad value \"%s\" for eavesdrop attribute, must be true or false", + eavesdrop); + return FALSE; + } rule = bus_policy_rule_new (BUS_POLICY_RULE_RECEIVE, allow); if (rule == NULL) goto nomem; + if (eavesdrop) + rule->d.receive.eavesdrop = (strcmp (eavesdrop, "true") == 0); + rule->d.receive.message_type = message_type; rule->d.receive.path = _dbus_strdup (receive_path); rule->d.receive.interface = _dbus_strdup (receive_interface); rule->d.receive.member = _dbus_strdup (receive_member); rule->d.receive.error = _dbus_strdup (receive_error); - rule->d.receive.origin = _dbus_strdup (receive_service); + rule->d.receive.origin = _dbus_strdup (receive_sender); if (receive_path && rule->d.receive.path == NULL) goto nomem; if (receive_interface && rule->d.receive.interface == NULL) @@ -1093,7 +1121,7 @@ append_rule_from_element (BusConfigParser *parser, goto nomem; if (receive_error && rule->d.receive.error == NULL) goto nomem; - if (receive_service && rule->d.receive.origin == NULL) + if (receive_sender && rule->d.receive.origin == NULL) goto nomem; } else if (own) -- cgit