static struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage*
-create_issue_result_message (const char* ticket)
+create_issue_result_message (const char* label,
+ const char* ticket,
+ const char* token)
{
struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage *irm;
+ char *tmp_str;
- irm = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage) + strlen(ticket) + 1);
+ irm = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage)
+ + strlen (label) + 1
+ + strlen (ticket) + 1
+ + strlen (token) + 1);
irm->header.type = htons (GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_RESULT);
- irm->header.size = htons (sizeof (struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage) + strlen (ticket) + 1);
- memcpy (&irm[1], ticket, strlen (ticket) + 1);
+ irm->header.size = htons (sizeof (struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage)
+ + strlen (label) + 1
+ + strlen (ticket) + 1
+ + strlen (token) + 1);
+ GNUNET_asprintf (&tmp_str, "%s,%s,%s", label, ticket, token);
+ memcpy (&irm[1], tmp_str, strlen (tmp_str) + 1);
+ GNUNET_free (tmp_str);
return irm;
}
{
struct IssueHandle *handle = cls;
struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage *irm;
- char* token_ticket_str;
+ char *ticket_str;
+ char *token_str;
handle->ns_qe = NULL;
if (GNUNET_SYSERR == success)
{
}
if (GNUNET_OK != ticket_serialize (handle->ticket,
&handle->iss_key,
- &token_ticket_str))
+ &ticket_str))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
"Error serializing ticket\n");
GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
return;
}
- irm = create_issue_result_message (token_ticket_str);
+ if (GNUNET_OK != token_to_string (handle->token,
+ &handle->iss_key,
+ &token_str))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
+ "Error serializing token\n");
+ GNUNET_free (ticket_str);
+ cleanup_issue_handle (handle);
+ GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
+ return;
+ }
+ irm = create_issue_result_message (handle->label, ticket_str, token_str);
GNUNET_SERVER_notification_context_unicast (nc,
handle->client,
&irm->header,
GNUNET_SERVER_client_set_user_context (handle->client, NULL);
cleanup_issue_handle (handle);
GNUNET_free (irm);
- GNUNET_free (token_ticket_str);
+ GNUNET_free (ticket_str);
+ GNUNET_free (token_str);
}
/**
sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
{
char *tmp2 = GNUNET_STRINGS_data_to_string_alloc (aud_key,
- sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
//Audience does not match!
char *tmp = GNUNET_GNSRECORD_value_to_string (GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA,
- token_metadata_record->data,
- token_metadata_record->data_size);
+ token_metadata_record->data,
+ token_metadata_record->data_size);
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Token does not match audience %s vs %s. Moving on\n",
tmp2,
*/
struct GNUNET_MessageHeader header;
- /* followed by 0-terminated ticket */
+ /* followed by 0-terminated label,ticket,token */
};
const struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage *irm;
const struct GNUNET_IDENTITY_PROVIDER_ExchangeResultMessage *erm;
char *str;
+ char *ticket_str;
+ char *token_str;
+ char *label_str;
uint16_t size;
if (NULL == msg)
return;
}
irm = (const struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage *) msg;
- str = (char *) &irm[1];
+ str = GNUNET_strdup ((char *) &irm[1]);
if ( (size > sizeof (struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage)) &&
('\0' != str[size - sizeof (struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage) - 1]) )
{
+ GNUNET_free (str);
GNUNET_break (0);
reschedule_connect (h);
return;
}
if (size == sizeof (struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage))
+ {
+ GNUNET_free (str);
str = NULL;
-
+ }
+ label_str = strtok (str, ",");
+
+ if (NULL == label_str)
+ {
+ GNUNET_free (str);
+ GNUNET_break (0);
+ reschedule_connect (h);
+ return;
+ }
+ ticket_str = strtok (NULL, ",");
+ if (NULL == ticket_str)
+ {
+ GNUNET_free (str);
+ GNUNET_break (0);
+ reschedule_connect (h);
+ return;
+ }
+ token_str = strtok (NULL, ",");
+ if (NULL == token_str)
+ {
+ GNUNET_free (str);
+ GNUNET_break (0);
+ reschedule_connect (h);
+ return;
+ }
op = h->op_head;
GNUNET_CONTAINER_DLL_remove (h->op_head,
h->op_tail,
op);
GNUNET_CLIENT_receive (h->client, &message_handler, h,
GNUNET_TIME_UNIT_FOREVER_REL);
- ticket.data = str;
+ ticket.data = ticket_str;
+ token.data = token_str;
if (NULL != op->iss_cb)
- op->iss_cb (op->cls, &ticket);
+ op->iss_cb (op->cls, label_str, &ticket, &token);
+ GNUNET_free (str);
GNUNET_free (op);
break;
case GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE_RESULT:
#define GNUNET_REST_API_NS_IDENTITY_OAUTH2_TOKEN "/idp/token"
/**
- * The URL parameter name in which the ticket must be provided
+ * The parameter name in which the ticket must be provided
*/
#define GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET "ticket"
+/**
+ * The parameter name in which the ticket must be provided
+ */
+#define GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TOKEN "token"
+
+
/**
* The URL parameter name in which the nonce must be provided
*/
*/
static void
token_creat_cont (void *cls,
- const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
+ const char *label,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_PROVIDER_Token *token)
{
struct JsonApiResource *json_resource;
struct RequestHandle *handle = cls;
struct MHD_Response *resp;
- json_t *token_ticket_json;
+ json_t *ticket_json;
+ json_t *token_json;
char *ticket_str;
+ char *token_str;
char *result_str;
if (NULL == ticket)
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
-
+
handle->resp_object = GNUNET_REST_jsonapi_object_new ();
json_resource = GNUNET_REST_jsonapi_resource_new (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET,
- "tmpid"); //TODO
+ label);
ticket_str = GNUNET_IDENTITY_PROVIDER_ticket_to_string (ticket);
- token_ticket_json = json_string (ticket_str);
+ token_str = GNUNET_IDENTITY_PROVIDER_token_to_string (token);
+ ticket_json = json_string (ticket_str);
+ token_json = json_string (token_str);
GNUNET_REST_jsonapi_resource_add_attr (json_resource,
GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET,
- token_ticket_json);
+ ticket_json);
+ GNUNET_REST_jsonapi_resource_add_attr (json_resource,
+ GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TOKEN,
+ token_json);
GNUNET_free (ticket_str);
- json_decref (token_ticket_json);
+ GNUNET_free (token_str);
+ json_decref (ticket_json);
+ json_decref (token_json);
GNUNET_REST_jsonapi_object_resource_add (handle->resp_object, json_resource);
+
GNUNET_REST_jsonapi_data_serialize (handle->resp_object, &result_str);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
resp = GNUNET_REST_create_json_response (result_str);
{
const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
const char *egoname;
-
+
struct RequestHandle *handle = cls;
struct EgoEntry *ego_entry;
struct GNUNET_HashCode key;
GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST,
strlen (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST),
&key);
- if ( GNUNET_YES ==
+ if ( GNUNET_YES !=
GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
&key) )
{
root = json_object ();
token_str = GNUNET_IDENTITY_PROVIDER_token_to_string (token);
- json_object_set_new (root, "identity_token", json_string (token_str));
+ json_object_set_new (root, "token", json_string (token_str));
json_object_set_new (root, "token_type", json_string ("jwt"));
GNUNET_free (token_str);
* @return NULL on error, otherwise the plugin context
*/
void *
-libgnunet_plugin_rest_identity_token_init (void *cls)
+libgnunet_plugin_rest_identity_provider_init (void *cls)
{
static struct Plugin plugin;
struct GNUNET_REST_Plugin *api;
* @return always NULL
*/
void *
-libgnunet_plugin_rest_identity_token_done (void *cls)
+libgnunet_plugin_rest_identity_provider_done (void *cls)
{
struct GNUNET_REST_Plugin *api = cls;
struct Plugin *plugin = api->cls;
* token
*
* @param cls closure
+ * @param grant the label in GNS pointing to the token
* @param ticket the ticket
+ * @param token the issued token
* @param name name assigned by the user for this ego,
* NULL if the user just deleted the ego and it
* must thus no longer be used
*/
typedef void
(*GNUNET_IDENTITY_PROVIDER_IssueCallback)(void *cls,
- const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket);
+ const char *grant,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_PROVIDER_Token *token);
/**