示例#1
0
文件: realms.c 项目: pdonlon/cockpit
static gboolean
handle_op (CockpitRealms *object,
           GDBusMethodInvocation *invocation,
           const gchar *op,
           const gchar *arg_name,
           GVariant *arg_creds,
           GVariant *arg_options)
{
  Realms *realms = REALMS (object);

  if (!set_invocation (realms, invocation, op, arg_name, arg_creds, arg_options))
    return TRUE;

  GVariantBuilder discover_options;
  g_variant_builder_init (&discover_options, G_VARIANT_TYPE ("a{sv}"));

  copy_option (&discover_options, arg_options, "client-software");
  copy_option (&discover_options, arg_options, "server-software");
  g_variant_builder_add (&discover_options, "{sv}",
                         "operation", g_variant_new_string (realms->op_id));

  g_dbus_proxy_call (realms->realmd,
                     "Discover",
                     g_variant_new ("(sa{sv})", arg_name, &discover_options),
                     G_DBUS_CALL_FLAGS_NONE,
                     G_MAXINT,
                     NULL,
                     on_discover_for_op_done,
                     realms);

  return TRUE;
}
示例#2
0
文件: realms.c 项目: pdonlon/cockpit
static gboolean
handle_discover (CockpitRealms *object,
                 GDBusMethodInvocation *invocation,
                 const gchar *arg_name,
                 GVariant *arg_options)
{
  Realms *realms = REALMS (object);

  if (!auth_check_sender_role (invocation, COCKPIT_ROLE_REALM_ADMIN))
    return TRUE;

  GVariantBuilder discover_options;
  g_variant_builder_init (&discover_options, G_VARIANT_TYPE ("a{sv}"));

  copy_option (&discover_options, arg_options, "client-software");
  copy_option (&discover_options, arg_options, "server-software");

  struct DiscoverData *data = g_new0(struct DiscoverData, 1);
  data->realms = realms;
  data->invocation = invocation;

  g_dbus_proxy_call (realms->realmd,
                     "Discover",
                     g_variant_new ("(sa{sv})", arg_name, &discover_options),
                     G_DBUS_CALL_FLAGS_NONE,
                     G_MAXINT,
                     NULL,
                     on_discover_done,
                     data);

  return TRUE;
}
示例#3
0
文件: domain.c 项目: Efreak/elinks
/* Return the shadow shadow tree for the given domain name, and
 * if the domain does not yet have a shadow tree, create it. */
struct option *
get_domain_tree(unsigned char *domain_name)
{
	struct domain_tree *domain;
	int domain_len;

	assert(domain_name);
	assert(*domain_name);

	foreach (domain, domain_trees)
		if (!strcasecmp(domain->name, domain_name))
			return domain->tree;

	domain_len = strlen(domain_name);
	/* One byte is reserved for domain in struct domain_tree. */
	domain = mem_alloc(sizeof(*domain) + domain_len);
	if (!domain) return NULL;

	domain->tree = copy_option(config_options, CO_SHALLOW
	                                            | CO_NO_LISTBOX_ITEM);
	if (!domain->tree) {
		mem_free(domain);
		return NULL;
	}

	memcpy(domain->name, domain_name, domain_len + 1);
	domain->len = domain_len;

	add_to_list(domain_trees, domain);

	return domain->tree;
}
示例#4
0
/**
 * grl_operation_options_copy:
 * @options: a #GrlOperationOptions instance
 *
 * Returns: (transfer full): a new #GrlOperationOptions instance with its values being copies of
 * the values of @options.
 *
 * Since: 0.2.0
 */
GrlOperationOptions *
grl_operation_options_copy (GrlOperationOptions *options)
{
  GrlOperationOptions *copy = grl_operation_options_new (options->priv->caps);

  copy_option (options, copy, GRL_OPERATION_OPTION_SKIP);
  copy_option (options, copy, GRL_OPERATION_OPTION_COUNT);
  copy_option (options, copy, GRL_OPERATION_OPTION_RESOLUTION_FLAGS);
  copy_option (options, copy, GRL_OPERATION_OPTION_TYPE_FILTER);

  g_hash_table_foreach (options->priv->key_filter,
                        (GHFunc) key_filter_dup,
                        copy->priv->key_filter);

  g_hash_table_foreach (options->priv->key_range_filter,
                        (GHFunc) key_range_filter_dup,
                        copy->priv->key_range_filter);

  return copy;
}
示例#5
0
文件: realms.c 项目: pdonlon/cockpit
static void
on_discover_for_op_done (GObject *object,
                         GAsyncResult *res,
                         gpointer user_data)
{
  Realms *realms = REALMS (user_data);

  if (realms->op_cancelled)
    {
      end_invocation_with_error (realms, COCKPIT_ERROR_CANCELLED,
                                 "Cancelled");
      return;
    }

  GError *error = NULL;
  gs_unref_variant GVariant *discover_result = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error);
  if (error)
    {
      end_invocation_take_gerror (realms, error);
      return;
    }

  gs_free_variant_iter GVariantIter *object_paths = NULL;
  g_variant_get (discover_result, "(iao)", NULL, &object_paths);

  const gchar *first_object = NULL;
  if (!g_variant_iter_next (object_paths, "&o", &first_object))
    {
      end_invocation_with_error (realms, COCKPIT_ERROR_NO_SUCH_REALM,
                                 "No such realm: %s", realms->op_name);
      return;
    }

  gs_unref_object GDBusProxy *kerberos =
    g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
                                   (G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES
                                    | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS),
                                   NULL,
                                   "org.freedesktop.realmd",
                                   first_object,
                                   "org.freedesktop.realmd.KerberosMembership",
                                   NULL,
                                   &error);
  if (error)
    {
      end_invocation_take_gerror (realms, error);
      return;
    }

  GVariant *creds = translate_kerberos_credentials (realms->op_creds);

  GVariantBuilder options;
  g_variant_builder_init (&options, G_VARIANT_TYPE ("a{sv}"));

  copy_option (&options, realms->op_options, "computer-ou");
  g_variant_builder_add (&options, "{sv}",
                         "operation", g_variant_new_string (realms->op_id));

  g_dbus_proxy_call (kerberos,
                     realms->op,
                     g_variant_new ("(@(ssv)a{sv})", creds, &options),
                     G_DBUS_CALL_FLAGS_NONE,
                     G_MAXINT,
                     NULL,
                     on_op_done,
                     realms);
}
示例#6
0
/**
 * grl_operation_options_obey_caps:
 * @options: a #GrlOperationOptions instance
 * @caps: capabilities against which we want to test @options
 * @supported_options: (out callee-allocates): if not %NULL, will contain a
 * newly-allocated #GrlOperationOptions instance containing all the values of
 * @options that match @caps.
 * @unsupported_options: (out callee-allocates): if not %NULL, will contain a
 * newly-allocated #GrlOperationOptions instance containing all the values of
 * @options that do not match @caps.
 *
 * Check whether @options obey to @caps.
 * Optionally provide the options that match (respectively don't match) @caps
 * in @supported_options (respectively @unsupported_options).
 * This would typically (but not necessarily) be used with a
 * #GrlOperationOptions instance that was created with %NULL caps.
 *
 * Returns: %TRUE if @options obey to @caps, %FALSE otherwise.
 *
 * Since: 0.2.0
 */
gboolean
grl_operation_options_obey_caps (GrlOperationOptions *options,
                                 GrlCaps *caps,
                                 GrlOperationOptions **supported_options,
                                 GrlOperationOptions **unsupported_options)
{
  gboolean ret = TRUE;
  GHashTableIter table_iter;
  gpointer key_ptr;
  GValue *value;
  GrlRangeValue *range_value;

  if (supported_options) {
    *supported_options = grl_operation_options_new (caps);

    /* these options are always supported */
    copy_option (options, *supported_options, GRL_OPERATION_OPTION_SKIP);
    copy_option (options, *supported_options, GRL_OPERATION_OPTION_COUNT);
    copy_option (options, *supported_options, GRL_OPERATION_OPTION_RESOLUTION_FLAGS);
  }

  if (unsupported_options)
    *unsupported_options = grl_operation_options_new (NULL);

  ret &= check_and_copy_option (options,
                                caps,
                                GRL_OPERATION_OPTION_TYPE_FILTER,
                                supported_options,
                                unsupported_options);

  /* Check filter-by-equal-key */
  g_hash_table_iter_init (&table_iter, options->priv->key_filter);
  while (g_hash_table_iter_next (&table_iter, &key_ptr, (gpointer *)&value)) {
    GrlKeyID key_id = GRLPOINTER_TO_KEYID (key_ptr);
    if (grl_caps_is_key_filter (caps, key_id)) {
      if (supported_options) {
        g_hash_table_insert ((*supported_options)->priv->key_filter,
                             key_ptr,
                             grl_g_value_dup (value));
      }
    } else {
      ret = FALSE;
      if (unsupported_options) {
        g_hash_table_insert ((*unsupported_options)->priv->key_filter,
                             key_ptr,
                             grl_g_value_dup (value));
      }
    }
  }

  /* Check filter-by-range-key */
  g_hash_table_iter_init (&table_iter, options->priv->key_range_filter);
  while (g_hash_table_iter_next (&table_iter, &key_ptr, (gpointer *)&range_value)) {
    GrlKeyID key_id = GRLPOINTER_TO_KEYID (key_ptr);
    if (grl_caps_is_key_range_filter (caps, key_id)) {
      if (supported_options) {
        g_hash_table_insert ((*supported_options)->priv->key_range_filter,
                             key_ptr,
                             grl_range_value_dup (range_value));
      }
    } else {
      ret = FALSE;
      if (unsupported_options) {
        g_hash_table_insert ((*unsupported_options)->priv->key_range_filter,
                             key_ptr,
                             grl_range_value_dup (range_value));
      }
    }
  }

  return ret;
}