/*
This file is part of GNUnet
Copyright (C) 2013 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
/**
* @file credential/plugin_gnsrecord_credential.c
* @brief gnsrecord plugin to provide the API for CREDENTIAL records
* @author Martin Schanzenbach
*/
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_gnsrecord_lib.h"
#include "gnunet_credential_service.h"
#include "gnunet_gnsrecord_plugin.h"
#include "gnunet_signatures.h"
#include "credential_serialization.h"
#include "credential_misc.h"
/**
* Convert the 'value' of a record to a string.
*
* @param cls closure, unused
* @param type type of the record
* @param data value in binary encoding
* @param data_size number of bytes in @a data
* @return NULL on error, otherwise human-readable representation of the value
*/
static char *
credential_value_to_string (void *cls,
uint32_t type,
const void *data,
size_t data_size)
{
const char *cdata;
switch (type)
{
case GNUNET_GNSRECORD_TYPE_ATTRIBUTE:
{
struct GNUNET_CREDENTIAL_DelegationRecord sets;
char *attr_str;
char *subject_pkey;
char *tmp_str;
int i;
if (data_size < sizeof (struct GNUNET_CREDENTIAL_DelegationRecord))
return NULL; /* malformed */
GNUNET_memcpy (&sets,
data,
sizeof (sets));
cdata = data;
struct GNUNET_CREDENTIAL_DelegationSet set[ntohl(sets.set_count)];
if (GNUNET_OK != GNUNET_CREDENTIAL_delegation_set_deserialize (GNUNET_ntohll (sets.data_size),
&cdata[sizeof (sets)],
ntohl (sets.set_count),
set))
return NULL;
for (i=0;iset_count = htonl (entries);
sets->data_size = GNUNET_htonll (tmp_data_size);
GNUNET_free (tmp_str);
return GNUNET_OK;
}
case GNUNET_GNSRECORD_TYPE_CREDENTIAL:
{
struct GNUNET_CREDENTIAL_Credential *cred;
cred = GNUNET_CREDENTIAL_credential_from_string (s);
*data_size = GNUNET_CREDENTIAL_credential_serialize (cred,
(char**)data);
return GNUNET_OK;
}
case GNUNET_GNSRECORD_TYPE_POLICY:
{
*data_size = strlen (s);
*data = GNUNET_strdup (s);
return GNUNET_OK;
}
default:
return GNUNET_SYSERR;
}
}
/**
* Mapping of record type numbers to human-readable
* record type names.
*/
static struct {
const char *name;
uint32_t number;
} name_map[] = {
{ "CRED", GNUNET_GNSRECORD_TYPE_CREDENTIAL },
{ "ATTR", GNUNET_GNSRECORD_TYPE_ATTRIBUTE },
{ "POLICY", GNUNET_GNSRECORD_TYPE_POLICY },
{ NULL, UINT32_MAX }
};
/**
* Convert a type name (i.e. "AAAA") to the corresponding number.
*
* @param cls closure, unused
* @param gns_typename name to convert
* @return corresponding number, UINT32_MAX on error
*/
static uint32_t
credential_typename_to_number (void *cls,
const char *gns_typename)
{
unsigned int i;
i=0;
while ( (name_map[i].name != NULL) &&
(0 != strcasecmp (gns_typename, name_map[i].name)) )
i++;
return name_map[i].number;
}
/**
* Convert a type number (i.e. 1) to the corresponding type string (i.e. "A")
*
* @param cls closure, unused
* @param type number of a type to convert
* @return corresponding typestring, NULL on error
*/
static const char *
credential_number_to_typename (void *cls,
uint32_t type)
{
unsigned int i;
i=0;
while ( (name_map[i].name != NULL) &&
(type != name_map[i].number) )
i++;
return name_map[i].name;
}
/**
* Entry point for the plugin.
*
* @param cls NULL
* @return the exported block API
*/
void *
libgnunet_plugin_gnsrecord_credential_init (void *cls)
{
struct GNUNET_GNSRECORD_PluginFunctions *api;
api = GNUNET_new (struct GNUNET_GNSRECORD_PluginFunctions);
api->value_to_string = &credential_value_to_string;
api->string_to_value = &credential_string_to_value;
api->typename_to_number = &credential_typename_to_number;
api->number_to_typename = &credential_number_to_typename;
return api;
}
/**
* Exit point from the plugin.
*
* @param cls the return value from #libgnunet_plugin_block_test_init
* @return NULL
*/
void *
libgnunet_plugin_gnsrecord_credential_done (void *cls)
{
struct GNUNET_GNSRECORD_PluginFunctions *api = cls;
GNUNET_free (api);
return NULL;
}
/* end of plugin_gnsrecord_credential.c */