Beispiel #1
0
static int ldbus_connection_get_is_authenticated(lua_State *L) {
	DBusConnection *connection = check_DBusConnection(L, 1);

	lua_pushboolean(L, dbus_connection_get_is_authenticated(connection));

	return 1;
}
Beispiel #2
0
gboolean
ibus_connection_is_authenticated (IBusConnection *connection)
{
    IBusConnectionPrivate *priv;
    priv = IBUS_CONNECTION_GET_PRIVATE (connection);

    if (priv->connection == NULL) {
        return FALSE;
    }
    return dbus_connection_get_is_authenticated (priv->connection);
}
Beispiel #3
0
static int sync_auth(DBusConnection *bus, DBusError *error) {
        usec_t begin, tstamp;

        assert(bus);

        /* This complexity should probably move into D-Bus itself:
         *
         * https://bugs.freedesktop.org/show_bug.cgi?id=35189 */

        begin = tstamp = now(CLOCK_MONOTONIC);
        for (;;) {

                if (tstamp > begin + DEFAULT_TIMEOUT_USEC)
                        break;

                if (dbus_connection_get_is_authenticated(bus))
                        break;

                if (!dbus_connection_read_write_dispatch(bus, ((begin + DEFAULT_TIMEOUT_USEC - tstamp) + USEC_PER_MSEC - 1) / USEC_PER_MSEC))
                        break;

                tstamp = now(CLOCK_MONOTONIC);
        }

        if (!dbus_connection_get_is_connected(bus)) {
                dbus_set_error_const(error, DBUS_ERROR_NO_SERVER, "Connection terminated during authentication.");
                return -ECONNREFUSED;
        }

        if (!dbus_connection_get_is_authenticated(bus)) {
                dbus_set_error_const(error, DBUS_ERROR_TIMEOUT, "Failed to authenticate in time.");
                return -EACCES;
        }

        return 0;
}
Beispiel #4
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;
}