/*
This file is part of GNUnet.
- Copyright (C) 2016 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2016 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public Liceidentity as published
struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
const struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage *irm;
const struct GNUNET_IDENTITY_PROVIDER_ExchangeResultMessage *erm;
- const char *str;
+ char *str;
+ char *ticket_str;
+ char *token_str;
+ char *label_str;
uint16_t size;
+ uint64_t ticket_nonce;
if (NULL == msg)
{
return;
}
irm = (const struct GNUNET_IDENTITY_PROVIDER_IssueResultMessage *) msg;
- str = (const 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:
return;
}
erm = (const struct GNUNET_IDENTITY_PROVIDER_ExchangeResultMessage *) msg;
- str = (const char *) &erm[1];
+ str = (char *) &erm[1];
if ( (size > sizeof (struct GNUNET_IDENTITY_PROVIDER_ExchangeResultMessage)) &&
('\0' != str[size - sizeof (struct GNUNET_IDENTITY_PROVIDER_ExchangeResultMessage) - 1]) )
{
GNUNET_CLIENT_receive (h->client, &message_handler, h,
GNUNET_TIME_UNIT_FOREVER_REL);
token.data = str;
+ ticket_nonce = ntohl (erm->ticket_nonce);
if (NULL != op->ex_cb)
- op->ex_cb (op->cls, &token);
+ op->ex_cb (op->cls, &token, ticket_nonce);
GNUNET_free (op);
break;
slen);
em->aud_privkey = *aud_privkey;
memcpy (&em[1], ticket_str, slen);
+ GNUNET_free (ticket_str);
op->msg = &em->header;
GNUNET_CONTAINER_DLL_insert_tail (id->op_head,
id->op_tail,
GNUNET_free (h);
}
+/**
+ * Convenience API
+ */
+
+
+/**
+ * Destroy token
+ *
+ * @param token the token
+ */
+void
+GNUNET_IDENTITY_PROVIDER_token_destroy(struct GNUNET_IDENTITY_PROVIDER_Token *token)
+{
+ GNUNET_assert (NULL != token);
+ if (NULL != token->data)
+ GNUNET_free (token->data);
+ GNUNET_free (token);
+}
+
+/**
+ * Returns string representation of token. A JSON-Web-Token.
+ *
+ * @param token the token
+ * @return The JWT (must be freed)
+ */
+char *
+GNUNET_IDENTITY_PROVIDER_token_to_string (const struct GNUNET_IDENTITY_PROVIDER_Token *token)
+{
+ return GNUNET_strdup (token->data);
+}
+
+/**
+ * Returns string representation of ticket. Base64-Encoded
+ *
+ * @param ticket the ticket
+ * @return the Base64-Encoded ticket
+ */
+char *
+GNUNET_IDENTITY_PROVIDER_ticket_to_string (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
+{
+ return GNUNET_strdup (ticket->data);
+}
+
+/**
+ * Created a ticket from a string (Base64 encoded ticket)
+ *
+ * @param input Base64 encoded ticket
+ * @param ticket pointer where the ticket is stored
+ * @return GNUNET_OK
+ */
+int
+GNUNET_IDENTITY_PROVIDER_string_to_ticket (const char* input,
+ struct GNUNET_IDENTITY_PROVIDER_Ticket **ticket)
+{
+ *ticket = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
+ (*ticket)->data = GNUNET_strdup (input);
+ return GNUNET_OK;
+}
+
+
+/**
+ * Destroys a ticket
+ *
+ * @param ticket the ticket to destroy
+ */
+void
+GNUNET_IDENTITY_PROVIDER_ticket_destroy(struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
+{
+ GNUNET_assert (NULL != ticket);
+ if (NULL != ticket->data)
+ GNUNET_free (ticket->data);
+ GNUNET_free (ticket);
+}
+
+
+
+
+
/* end of identity_provider_api.c */