Beispiel #1
0
dbus_bool_t
bus_registry_list_services (BusRegistry *registry,
                            char      ***listp,
                            int         *array_len)
{
  int i, j, len;
  char **retval;
  DBusHashIter iter;
   
  len = _dbus_hash_table_get_n_entries (registry->service_hash);
  retval = dbus_new (char *, len + 1);

  if (retval == NULL)
    return FALSE;

  _dbus_hash_iter_init (registry->service_hash, &iter);
  i = 0;
  while (_dbus_hash_iter_next (&iter))
    {
      BusService *service = _dbus_hash_iter_get_value (&iter);

      retval[i] = _dbus_strdup (service->name);
      if (retval[i] == NULL)
	goto error;

      i++;
    }

  retval[i] = NULL;
  
  if (array_len)
    *array_len = len;
  
  *listp = retval;
  return TRUE;
  
 error:
  for (j = 0; j < i; j++)
    dbus_free (retval[j]);
  dbus_free (retval);

  return FALSE;
}
Beispiel #2
0
BusClientPolicy*
bus_policy_create_client_policy (BusPolicy      *policy,
                                 DBusConnection *connection,
                                 DBusError      *error)
{
    BusClientPolicy *client;
    dbus_uid_t uid;
    dbus_bool_t at_console;

    _dbus_assert (dbus_connection_get_is_authenticated (connection));
    _DBUS_ASSERT_ERROR_IS_CLEAR (error);

    client = bus_client_policy_new ();
    if (client == NULL)
        goto nomem;

    if (!add_list_to_client (&policy->default_rules,
                             client))
        goto nomem;

    /* we avoid the overhead of looking up user's groups
     * if we don't have any group rules anyway
     */
    if (_dbus_hash_table_get_n_entries (policy->rules_by_gid) > 0)
    {
        unsigned long *groups;
        int n_groups;
        int i;

        if (!bus_connection_get_groups (connection, &groups, &n_groups, error))
            goto failed;

        i = 0;
        while (i < n_groups)
        {
            DBusList **list;

            list = _dbus_hash_table_lookup_ulong (policy->rules_by_gid,
                                                  groups[i]);

            if (list != NULL)
            {
                if (!add_list_to_client (list, client))
                {
                    dbus_free (groups);
                    goto nomem;
                }
            }

            ++i;
        }

        dbus_free (groups);
    }

    if (!dbus_connection_get_unix_user (connection, &uid))
    {
        dbus_set_error (error, DBUS_ERROR_FAILED,
                        "No user ID known for connection, cannot determine security policy\n");
        goto failed;
    }

    if (_dbus_hash_table_get_n_entries (policy->rules_by_uid) > 0)
    {
        DBusList **list;

        list = _dbus_hash_table_lookup_ulong (policy->rules_by_uid,
                                              uid);

        if (list != NULL)
        {
            if (!add_list_to_client (list, client))
                goto nomem;
        }
    }

    /* Add console rules */
    at_console = _dbus_is_console_user (uid, error);

    if (at_console)
    {
        if (!add_list_to_client (&policy->at_console_true_rules, client))
            goto nomem;
    }
    else if (dbus_error_is_set (error) == TRUE)
    {
        goto failed;
    }
    else if (!add_list_to_client (&policy->at_console_false_rules, client))
    {
        goto nomem;
    }

    if (!add_list_to_client (&policy->mandatory_rules,
                             client))
        goto nomem;

    bus_client_policy_optimize (client);

    return client;

nomem:
    BUS_SET_OOM (error);
failed:
    _DBUS_ASSERT_ERROR_IS_SET (error);
    if (client)
        bus_client_policy_unref (client);
    return NULL;
}