Exemple #1
0
static CockpitAuthenticated *
authenticated_for_headers (CockpitAuth *self,
                           GHashTable *in_headers)
{
  gchar *cookie = NULL;
  gchar *raw = NULL;
  const char *prefix = "v=2;k=";
  CockpitAuthenticated *ret = NULL;

  g_return_val_if_fail (self != NULL, FALSE);
  g_return_val_if_fail (in_headers != NULL, FALSE);

  raw = cockpit_web_server_parse_cookie (in_headers, "cockpit");
  if (raw)
    {
      cookie = base64_decode_string (raw);
      if (cookie != NULL)
        {
          if (g_str_has_prefix (cookie, prefix))
            ret = g_hash_table_lookup (self->authenticated, cookie);
          else
            g_debug ("invalid or unsupported cookie: %s", cookie);
          g_free (cookie);
        }
      g_free (raw);
    }

  return ret;
}
Exemple #2
0
static CockpitAuthenticated *
authenticated_for_headers (CockpitAuth *self,
                           GHashTable *in_headers)
{
  gs_unref_hashtable GHashTable *cookies = NULL;
  gs_free gchar *cookie = NULL;
  const char *prefix = "v=2;k=";

  g_return_val_if_fail (self != NULL, FALSE);
  g_return_val_if_fail (in_headers != NULL, FALSE);

  if (!cockpit_web_server_parse_cookies (in_headers, &cookies, NULL))
    return NULL;

  cookie = base64_decode_string (g_hash_table_lookup (cookies, "CockpitAuth"));
  if (cookie == NULL)
    return NULL;

  if (!g_str_has_prefix (cookie, prefix))
    {
      g_debug ("invalid or unsupported cookie: %s", cookie);
      return NULL;
    }

  return g_hash_table_lookup (self->authenticated, cookie);
}
Exemple #3
0
CockpitCreds *
cockpit_auth_check_cookie (CockpitAuth *auth,
                           GHashTable *in_headers)
{
  gs_unref_hashtable GHashTable *cookies = NULL;
  gs_free gchar *auth_cookie = NULL;

  g_return_val_if_fail (auth != NULL, FALSE);
  g_return_val_if_fail (in_headers != NULL, FALSE);

  if (!cockpit_web_server_parse_cookies (in_headers, &cookies, NULL))
    return NULL;

  auth_cookie = base64_decode_string (g_hash_table_lookup (cookies, "CockpitAuth"));
  if (auth_cookie == NULL)
    return NULL;

  return cookie_to_creds (auth, auth_cookie);
}
Exemple #4
0
gboolean
cockpit_auth_check_headers (CockpitAuth *auth,
                            GHashTable *headers,
                            char **out_user,
                            char **out_password)
{
  gs_unref_hashtable GHashTable *cookies = NULL;
  gs_free gchar *auth_cookie = NULL;
  const char *prefix = "v=2;k=";

  if (out_user)
    *out_user = NULL;
  if (out_password)
    *out_password = NULL;

  if (auth == NULL)
    {
      *out_user = g_strdup (g_get_user_name ());
      *out_password = g_strdup ("<noauth>");
      return TRUE;
    }

  if (!cockpit_web_server_parse_cookies (headers, &cookies, NULL))
    return FALSE;

  auth_cookie = base64_decode_string (g_hash_table_lookup (cookies, "CockpitAuth"));
  if (auth_cookie == NULL)
    return FALSE;

  if (!g_str_has_prefix (auth_cookie, prefix))
    {
      g_debug ("invalid or unsupported cookie: %s", auth_cookie);
      return FALSE;
    }

  return authenticated_id_to_user (auth, auth_cookie + strlen (prefix),
                                   out_user, out_password);
}
Exemple #5
0
static int
_httpd_decode_authorization(const char *value, char **user, char **pass)
{
  unsigned char *tmp, *tmp2;
  size_t len;

  len = strlen(value) * 2;
  if (!(tmp = (char *) calloc(1, len)))
  {
    log_error("calloc failed (%s)", strerror(errno));
    return -1;
  }

  value = strstr(value, " ") + 1;

  log_verbose("Authorization (base64) = \"%s\"", value);

  base64_decode_string(value, tmp);

  log_verbose("Authorization (ascii) = \"%s\"", tmp);

  if ((tmp2 = strstr(tmp, ":")))
  {
    *tmp2++ = '\0';
    *pass = strdup(tmp2);
  }
  else
  {
    *pass = strdup("");
  }
  *user = strdup(tmp);

  free(tmp);

  return 0;
}
Exemple #6
0
/** Try to convert a string to the given OmlValueT and store it an OmlValueU.
 *
 * Storage for value should have already been cleared (e.g., with
 * oml_value_set_type(), oml_value_reset() omlc_reset_string() or
 * omlc_reset_blob() if appropriate).
 *
 * Assumes the destination OmlValueU has been properly reset.
 *
 * \param value pointer to output OmlValue
 * \param type type of data to get from the string
 * \param value_s input string
 * \return  0 on success, -1 otherwise (e.g., conversion error)
 * \see oml_value_from_s, oml_value_from_typed_s
 * \see oml_value_set_type, oml_value_reset, omlc_reset_string, omlc_reset_blob
 */
static int
oml_value_ut_from_s (OmlValueU *value, OmlValueT type, const char *value_s)
{
    char *s, *eptr;
    ssize_t n;
    size_t s_sz, blob_sz, nof_elts, bytes;
    uint8_t *blob;
    oml_guid_t c;
    char *p;
    char *q;

    errno = 0; /* Not all paths manipulate errno, so make sure its value is reset */

    switch (type) {
    case OML_LONG_VALUE:
        logwarn("%s(): OML_LONG_VALUE is deprecated, please use OML_INT32_VALUE instead\n", __FUNCTION__);
        omlc_set_long (*value, strtol (value_s, NULL, 0));
        break;

    case OML_INT32_VALUE:
        omlc_set_int32 (*value, strtol (value_s, NULL, 0));
        break;
    case OML_UINT32_VALUE:
        omlc_set_uint32 (*value, strtoul (value_s, NULL, 0));
        break;
    case OML_INT64_VALUE:
        omlc_set_int64 (*value, strtoll (value_s, NULL, 0));
        break;
    case OML_UINT64_VALUE:
        omlc_set_uint64 (*value, strtoull (value_s, NULL, 0));
        break;
    case OML_DOUBLE_VALUE:  {
        omlc_set_double (*value, strtod (value_s, &eptr));
        if (eptr == value_s) {
            omlc_set_double (*value, NAN);
        }
        break;
    }
    case OML_STRING_VALUE:
        s = oml_malloc(strlen(value_s)+1);
        n = backslash_decode(value_s, s);
        omlc_reset_string(*value);
        omlc_set_string(*value, s);
        omlc_set_string_size(*value,n+1);
        break;

    case OML_DATETIME_VALUE:
        s = oml_malloc(strlen(value_s)+1);
        n = backslash_decode(value_s, s);
        omlc_reset_string(*value);
        omlc_set_string(*value, s);
        omlc_set_string_size(*value,n+1);
        break;

    case OML_BLOB_VALUE:
        omlc_reset_blob(*value);
        s_sz = base64_validate_string(value_s);
        if(s_sz != -1) {
            blob_sz = base64_size_blob(s_sz);
            blob = oml_malloc(blob_sz);
            base64_decode_string(s_sz, value_s, blob_sz, blob);
            omlc_set_blob_ptr(*value, blob);
            omlc_set_blob_length(*value, blob_sz);
            omlc_set_blob_size(*value, blob_sz);
        }
        break;

    case OML_GUID_VALUE:
        omlc_string_to_guid(value_s, &c);
        omlc_set_guid(*value, c);
        break;

    case OML_BOOL_VALUE:
        omlc_set_bool(*value, oml_value_string_to_bool(value_s));
        break;

    case OML_VECTOR_DOUBLE_VALUE:
        omlc_reset_vector(*value);
        nof_elts = strtod(value_s, &p);
        if(p - value_s) {
            size_t i, bytes;
            double *elts = oml_calloc(nof_elts, sizeof(double));
            if(elts) {
                for(i = 0; i < nof_elts; i++) {
                    elts[i] = strtod(p, &q);
                    if(q - p)
                        p = q;
                    else {
                        oml_free(elts);
                        logerror("%s(): bad [double] vector element '%s'\n", __FUNCTION__, p);
                        return -1;
                    }
                }
                bytes = nof_elts * sizeof(double);
                omlc_set_vector_ptr(*value, elts);
                omlc_set_vector_length(*value, bytes);
                omlc_set_vector_size(*value, bytes);
                omlc_set_vector_nof_elts(*value, nof_elts);
                omlc_set_vector_elt_size(*value, sizeof(double));
            } else {
                logerror("%s(): out of memory reading [double] of size %zu\n", __FUNCTION__, nof_elts);
                return -1;
            }
        } else {
            logerror("%s(): bad [double] size '%s'\n", __FUNCTION__, value_s);
            return -1;
        }
        break;

    case OML_VECTOR_INT32_VALUE:
        omlc_reset_vector(*value);
        nof_elts = strtol(value_s, &p, 0);
        if(p - value_s) {
            size_t i;
            int32_t *elts = oml_calloc(nof_elts, sizeof(int32_t));
            if(elts) {
                for(i = 0; i < nof_elts; i++) {
                    elts[i] = strtol(p, &q, 0);
                    if(q - p)
                        p = q;
                    else {
                        oml_free(elts);
                        logerror("%s(): bad [int32] vector element '%s'\n", __FUNCTION__, p);
                        return -1;
                    }
                }
                bytes = nof_elts * sizeof(int32_t);
                omlc_set_vector_ptr(*value, elts);
                omlc_set_vector_length(*value, bytes);
                omlc_set_vector_size(*value, bytes);
                omlc_set_vector_nof_elts(*value, nof_elts);
                omlc_set_vector_elt_size(*value, sizeof(int32_t));
            } else {
                logerror("%s(): out of memory reading [int32] of size %zu\n", __FUNCTION__, nof_elts);
                return -1;
            }
        } else {
            logerror("%s(): bad [int32] size '%s'\n", __FUNCTION__, value_s);
            return -1;
        }
        break;

    case OML_VECTOR_UINT32_VALUE:
        omlc_reset_vector(*value);
        nof_elts = strtoul(value_s, &p, 0);
        if(p - value_s) {
            size_t i;
            uint32_t *elts = oml_calloc(nof_elts, sizeof(uint32_t));
            if(elts) {
                for(i = 0; i < nof_elts; i++) {
                    elts[i] = strtoul(p, &q, 0);
                    if(q - p)
                        p = q;
                    else {
                        oml_free(elts);
                        logerror("%s(): bad [uint32] vector element '%s'\n", __FUNCTION__, p);
                        return -1;
                    }
                }
                bytes = nof_elts * sizeof(uint32_t);
                omlc_set_vector_ptr(*value, elts);
                omlc_set_vector_length(*value, bytes);
                omlc_set_vector_size(*value, bytes);
                omlc_set_vector_nof_elts(*value, nof_elts);
                omlc_set_vector_elt_size(*value, sizeof(uint32_t));
            } else {
                logerror("%s(): out of memory reading [uint32] of size %zu\n", __FUNCTION__, nof_elts);
                return -1;
            }
        } else {
            logerror("%s(): bad [uint32] size '%s'\n", __FUNCTION__, value_s);
            return -1;
        }
        break;

    case OML_VECTOR_INT64_VALUE:
        omlc_reset_vector(*value);
        nof_elts = strtoll(value_s, &p, 0);
        if(p - value_s) {
            size_t i;
            int64_t *elts = oml_calloc(nof_elts, sizeof(int64_t));
            if(elts) {
                for(i = 0; i < nof_elts; i++) {
                    elts[i] = strtoll(p, &q, 0);
                    if(q - p)
                        p = q;
                    else {
                        oml_free(elts);
                        logerror("%s(): bad [int64] vector element '%s'\n", __FUNCTION__, p);
                        return -1;
                    }
                }
                bytes = nof_elts * sizeof(int64_t);
                omlc_set_vector_ptr(*value, elts);
                omlc_set_vector_length(*value, bytes);
                omlc_set_vector_size(*value, bytes);
                omlc_set_vector_nof_elts(*value, nof_elts);
                omlc_set_vector_elt_size(*value, sizeof(int64_t));
            } else {
                logerror("%s(): out of memory reading [int64] of size %zu\n", __FUNCTION__, nof_elts);
                return -1;
            }
        } else {
            logerror("%s(): bad [int64] size '%s'\n", __FUNCTION__, value_s);
            return -1;
        }
        break;

    case OML_VECTOR_UINT64_VALUE:
        omlc_reset_vector(*value);
        nof_elts = strtoull(value_s, &p, 0);
        if(p - value_s) {
            size_t i;
            uint64_t *elts = oml_calloc(nof_elts, sizeof(uint64_t));
            if(elts) {
                for(i = 0; i < nof_elts; i++) {
                    elts[i] = strtoull(p, &q, 0);
                    if(q - p)
                        p = q;
                    else {
                        oml_free(elts);
                        logerror("%s(): bad [uint64] vector element '%s'\n", __FUNCTION__, p);
                        return -1;
                    }
                }
                bytes = nof_elts * sizeof(uint64_t);
                omlc_set_vector_ptr(*value, elts);
                omlc_set_vector_length(*value, bytes);
                omlc_set_vector_size(*value, bytes);
                omlc_set_vector_nof_elts(*value, nof_elts);
                omlc_set_vector_elt_size(*value, sizeof(uint64_t));
            } else {
                logerror("%s(): out of memory reading [uint64] of size %zu\n", __FUNCTION__, nof_elts);
                return -1;
            }
        } else {
            logerror("%s(): bad [uint64] size '%s'\n", __FUNCTION__, value_s);
            return -1;
        }
        break;

    case OML_VECTOR_BOOL_VALUE:
        omlc_reset_vector(*value);
        nof_elts = strtoul(value_s, &p, 0);
        if(p - value_s) {
            char *n;
            size_t i;
            bool *elts = oml_calloc(nof_elts, sizeof(bool));
            if(elts) {
                for(i = 0; i < nof_elts; i++) {
                    char *v = strtok_r(p, " ", &n);
                    if(v) {
                        elts[i] = strncasecmp(v, "false", strlen(v));
                        p = n;
                    } else {
                        oml_free(elts);
                        logerror("%s(): bad [bool] '%s'\n", __FUNCTION__, p);
                        return -1;
                    }
                }
                omlc_set_vector_bool(*value, elts, nof_elts);
                bytes = nof_elts * sizeof(bool);
                omlc_set_vector_ptr(*value, elts);
                omlc_set_vector_length(*value, bytes);
                omlc_set_vector_size(*value, bytes);
                omlc_set_vector_nof_elts(*value, nof_elts);
                omlc_set_vector_elt_size(*value, sizeof(bool));
            } else {
                logerror("%s(): out of memory reading [bool] of size %zu\n", __FUNCTION__, nof_elts);
                return -1;
            }
        } else {
            logerror("%s(): bad [bool] size '%s'\n", __FUNCTION__, value_s);
            return -1;
        }
        break;

    default:
        logerror("%s() for type '%d' not implemented to convert '%s'\n", __FUNCTION__, type, value_s);
        return -1;
    }

    if (errno == ERANGE) {
        logerror("%s(): underflow or overlow converting value from string '%s'\n", __FUNCTION__, value_s);
        return -1;
    }

    return 0;
}