Blame src/goaidentity/goaidentityutils.c

Packit Service c6b9b0
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
Packit Service c6b9b0
/*
Packit Service c6b9b0
 * Copyright © 2012 – 2017 Red Hat, Inc.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * This library is free software; you can redistribute it and/or
Packit Service c6b9b0
 * modify it under the terms of the GNU Lesser General Public
Packit Service c6b9b0
 * License as published by the Free Software Foundation; either
Packit Service c6b9b0
 * version 2 of the License, or (at your option) any later version.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * This library is distributed in the hope that it will be useful,
Packit Service c6b9b0
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service c6b9b0
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service c6b9b0
 * Lesser General Public License for more details.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * You should have received a copy of the GNU Lesser General
Packit Service c6b9b0
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit Service c6b9b0
 */
Packit Service c6b9b0
Packit Service c6b9b0
#include "config.h"
Packit Service c6b9b0
Packit Service c6b9b0
#include "goaidentityutils.h"
Packit Service c6b9b0
Packit Service c6b9b0
#include <string.h>
Packit Service c6b9b0
Packit Service c6b9b0
#include <glib/gi18n.h>
Packit Service c6b9b0
#include <glib/gstdio.h>
Packit Service c6b9b0
#include <gio/gio.h>
Packit Service c6b9b0
Packit Service c6b9b0
void
Packit Service c6b9b0
goa_identity_utils_split_identifier (const char  *identifier,
Packit Service c6b9b0
                                     char       **user,
Packit Service c6b9b0
                                     char       **domain)
Packit Service c6b9b0
{
Packit Service c6b9b0
  char **components;
Packit Service c6b9b0
Packit Service c6b9b0
  if (user != NULL)
Packit Service c6b9b0
    *user = NULL;
Packit Service c6b9b0
Packit Service c6b9b0
  if (domain != NULL)
Packit Service c6b9b0
    *domain = NULL;
Packit Service c6b9b0
Packit Service c6b9b0
  components = g_strsplit (identifier, "@", -1);
Packit Service c6b9b0
Packit Service c6b9b0
  if (components[0] != NULL)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      if (user != NULL)
Packit Service c6b9b0
        *user = g_strdup (components[0]);
Packit Service c6b9b0
Packit Service c6b9b0
      if (components[1] != NULL && domain != NULL)
Packit Service c6b9b0
        *domain = g_strdup (components[1]);
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  g_strfreev (components);
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
char *
Packit Service c6b9b0
goa_identity_utils_escape_object_path (const char *data,
Packit Service c6b9b0
                                       gsize       length)
Packit Service c6b9b0
{
Packit Service c6b9b0
  const char *p;
Packit Service c6b9b0
  char *object_path;
Packit Service c6b9b0
  GString *string;
Packit Service c6b9b0
Packit Service c6b9b0
  g_return_val_if_fail (data != NULL, NULL);
Packit Service c6b9b0
Packit Service c6b9b0
  string = g_string_sized_new ((length + 1) * 6);
Packit Service c6b9b0
Packit Service c6b9b0
  for (p = data; *p != '\0'; p++)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      guchar character;
Packit Service c6b9b0
Packit Service c6b9b0
      character = (guchar) * p;
Packit Service c6b9b0
Packit Service c6b9b0
      if (((character >= ((guchar) 'a')) &&
Packit Service c6b9b0
           (character <= ((guchar) 'z'))) ||
Packit Service c6b9b0
          ((character >= ((guchar) 'A')) &&
Packit Service c6b9b0
           (character <= ((guchar) 'Z'))) ||
Packit Service c6b9b0
          ((character >= ((guchar) '0')) && (character <= ((guchar) '9'))))
Packit Service c6b9b0
        {
Packit Service c6b9b0
          g_string_append_c (string, (char) character);
Packit Service c6b9b0
          continue;
Packit Service c6b9b0
        }
Packit Service c6b9b0
Packit Service c6b9b0
      g_string_append_printf (string, "_%x_", character);
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  object_path = string->str;
Packit Service c6b9b0
Packit Service c6b9b0
  g_string_free (string, FALSE);
Packit Service c6b9b0
Packit Service c6b9b0
  return object_path;
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
static char *
Packit Service c6b9b0
dashed_string_to_studly_caps (const char *dashed_string)
Packit Service c6b9b0
{
Packit Service c6b9b0
  char *studly_string;
Packit Service c6b9b0
  size_t studly_string_length;
Packit Service c6b9b0
  size_t i;
Packit Service c6b9b0
Packit Service c6b9b0
  i = 0;
Packit Service c6b9b0
Packit Service c6b9b0
  studly_string = g_strdup (dashed_string);
Packit Service c6b9b0
  studly_string_length = strlen (studly_string);
Packit Service c6b9b0
Packit Service c6b9b0
  studly_string[i] = g_ascii_toupper (studly_string[i]);
Packit Service c6b9b0
  i++;
Packit Service c6b9b0
Packit Service c6b9b0
  while (i < studly_string_length)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      if (studly_string[i] == '-' || studly_string[i] == '_')
Packit Service c6b9b0
        {
Packit Service c6b9b0
          g_memmove (studly_string + i,
Packit Service c6b9b0
                     studly_string + i + 1,
Packit Service c6b9b0
                     studly_string_length - i - 1);
Packit Service c6b9b0
          studly_string_length--;
Packit Service c6b9b0
          if (g_ascii_isalpha (studly_string[i]))
Packit Service c6b9b0
            studly_string[i] = g_ascii_toupper (studly_string[i]);
Packit Service c6b9b0
        }
Packit Service c6b9b0
      i++;
Packit Service c6b9b0
    }
Packit Service c6b9b0
  studly_string[studly_string_length] = '\0';
Packit Service c6b9b0
Packit Service c6b9b0
  return studly_string;
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
static char *
Packit Service c6b9b0
dashed_string_to_dbus_error_string (const char *dashed_string,
Packit Service c6b9b0
                                    const char *old_prefix,
Packit Service c6b9b0
                                    const char *new_prefix,
Packit Service c6b9b0
                                    const char *suffix)
Packit Service c6b9b0
{
Packit Service c6b9b0
  char *studly_suffix;
Packit Service c6b9b0
  char *dbus_error_string;
Packit Service c6b9b0
  size_t dbus_error_string_length;
Packit Service c6b9b0
  size_t i;
Packit Service c6b9b0
Packit Service c6b9b0
  i = 0;
Packit Service c6b9b0
Packit Service c6b9b0
  if (g_str_has_prefix (dashed_string, old_prefix) &&
Packit Service c6b9b0
      (dashed_string[strlen (old_prefix)] == '-' ||
Packit Service c6b9b0
       dashed_string[strlen (old_prefix)] == '_'))
Packit Service c6b9b0
    dashed_string += strlen (old_prefix) + 1;
Packit Service c6b9b0
Packit Service c6b9b0
  studly_suffix = dashed_string_to_studly_caps (suffix);
Packit Service c6b9b0
  dbus_error_string =
Packit Service c6b9b0
    g_strdup_printf ("%s.%s.%s", new_prefix, dashed_string, studly_suffix);
Packit Service c6b9b0
  g_free (studly_suffix);
Packit Service c6b9b0
  i += strlen (new_prefix) + 1;
Packit Service c6b9b0
Packit Service c6b9b0
  dbus_error_string_length = strlen (dbus_error_string);
Packit Service c6b9b0
Packit Service c6b9b0
  dbus_error_string[i] = g_ascii_toupper (dbus_error_string[i]);
Packit Service c6b9b0
  i++;
Packit Service c6b9b0
Packit Service c6b9b0
  while (i < dbus_error_string_length)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      if (dbus_error_string[i] == '_' || dbus_error_string[i] == '-')
Packit Service c6b9b0
        {
Packit Service c6b9b0
          dbus_error_string[i] = '.';
Packit Service c6b9b0
Packit Service c6b9b0
          if (g_ascii_isalpha (dbus_error_string[i + 1]))
Packit Service c6b9b0
            dbus_error_string[i + 1] = g_ascii_toupper (dbus_error_string[i + 1]);
Packit Service c6b9b0
        }
Packit Service c6b9b0
Packit Service c6b9b0
      i++;
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  return dbus_error_string;
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
void
Packit Service c6b9b0
goa_identity_utils_register_error_domain (GQuark error_domain,
Packit Service c6b9b0
                                          GType  error_enum)
Packit Service c6b9b0
{
Packit Service c6b9b0
  const char *error_domain_string;
Packit Service c6b9b0
  char *type_name = NULL;
Packit Service c6b9b0
  GType type;
Packit Service c6b9b0
  GTypeClass *type_class = NULL;
Packit Service c6b9b0
  const GEnumClass *enum_class;
Packit Service c6b9b0
  guint i;
Packit Service c6b9b0
Packit Service c6b9b0
  error_domain_string = g_quark_to_string (error_domain);
Packit Service c6b9b0
  type_name = dashed_string_to_studly_caps (error_domain_string);
Packit Service c6b9b0
  type = g_type_from_name (type_name);
Packit Service c6b9b0
  type_class = g_type_class_ref (type);
Packit Service c6b9b0
Packit Service c6b9b0
  if (type_class == NULL)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      g_warning ("GoaIdentityUtils: Could not identity type %s", type_name);
Packit Service c6b9b0
      goto out;
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  enum_class = G_ENUM_CLASS (type_class);
Packit Service c6b9b0
Packit Service c6b9b0
  for (i = 0; i < enum_class->n_values; i++)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      char *dbus_error_string;
Packit Service c6b9b0
Packit Service c6b9b0
      dbus_error_string = dashed_string_to_dbus_error_string (error_domain_string,
Packit Service c6b9b0
                                                              "goa",
Packit Service c6b9b0
                                                              "org.gnome",
Packit Service c6b9b0
                                                              enum_class->values[i].
Packit Service c6b9b0
                                                              value_nick);
Packit Service c6b9b0
Packit Service c6b9b0
      g_debug ("GoaIdentityUtils: Registering dbus error %s", dbus_error_string);
Packit Service c6b9b0
      g_dbus_error_register_error (error_domain,
Packit Service c6b9b0
                                   enum_class->values[i].value, dbus_error_string);
Packit Service c6b9b0
      g_free (dbus_error_string);
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
 out:
Packit Service c6b9b0
  g_clear_pointer (&type_class, g_type_class_unref);
Packit Service c6b9b0
  g_free (type_name);
Packit Service c6b9b0
}