GNUnet 0.21.1
gnunet-service-reclaim.c File Reference
Include dependency graph for gnunet-service-reclaim.c:

Go to the source code of this file.

Data Structures

struct  TicketIteration
 A ticket iteration operation. More...
 
struct  Iterator
 An attribute iteration operation. More...
 
struct  IdpClient
 An idp client. More...
 
struct  AttributeDeleteHandle
 Handle for attribute deletion request. More...
 
struct  AttributeStoreHandle
 Handle for attribute store request. More...
 
struct  ConsumeTicketOperation
 Handle for ticket consume request. More...
 
struct  TicketRevocationOperation
 Ticket revocation request handle. More...
 
struct  TicketIssueOperation
 Ticket issue operation handle. More...
 

Functions

static void cleanup_adh (struct AttributeDeleteHandle *adh)
 Cleanup attribute delete handle. More...
 
static void cleanup_as_handle (struct AttributeStoreHandle *ash)
 Cleanup attribute store handle. More...
 
static void cleanup_client (struct IdpClient *idp)
 Cleanup client. More...
 
static void cleanup ()
 Cleanup task. More...
 
static void do_shutdown (void *cls)
 Shutdown task. More...
 
static void send_ticket_result (const struct IdpClient *client, uint32_t r_id, const struct GNUNET_RECLAIM_Ticket *ticket, const struct GNUNET_RECLAIM_PresentationList *presentations, uint32_t success)
 Sends a ticket result message to the client. More...
 
static void issue_ticket_result_cb (void *cls, struct GNUNET_RECLAIM_Ticket *ticket, struct GNUNET_RECLAIM_PresentationList *presentations, int32_t success, const char *emsg)
 Issue ticket result. More...
 
static int check_issue_ticket_message (void *cls, const struct IssueTicketMessage *im)
 Check issue ticket message. More...
 
static void handle_issue_ticket_message (void *cls, const struct IssueTicketMessage *im)
 Handle ticket issue message. More...
 
static void revoke_result_cb (void *cls, int32_t success)
 Handles revocation result. More...
 
static int check_revoke_ticket_message (void *cls, const struct RevokeTicketMessage *rm)
 Check revocation message format. More...
 
static void handle_revoke_ticket_message (void *cls, const struct RevokeTicketMessage *rm)
 Handle a revocation message to a ticket. More...
 
static void consume_result_cb (void *cls, const struct GNUNET_CRYPTO_PublicKey *identity, const struct GNUNET_RECLAIM_AttributeList *attrs, const struct GNUNET_RECLAIM_PresentationList *presentations, int32_t success, const char *emsg)
 Handle a ticket consume result. More...
 
static int check_consume_ticket_message (void *cls, const struct ConsumeTicketMessage *cm)
 Check a consume ticket message. More...
 
static void handle_consume_ticket_message (void *cls, const struct ConsumeTicketMessage *cm)
 Handle a consume ticket message. More...
 
static void attr_store_cont (void *cls, enum GNUNET_ErrorCode ec)
 Attribute store result handler. More...
 
static void attr_store_task (void *cls)
 Add a new attribute. More...
 
static int check_attribute_store_message (void *cls, const struct AttributeStoreMessage *sam)
 Check an attribute store message. More...
 
static void handle_attribute_store_message (void *cls, const struct AttributeStoreMessage *sam)
 Handle an attribute store message. More...
 
static void cred_store_cont (void *cls, enum GNUNET_ErrorCode ec)
 Credential store result handler. More...
 
static void cred_error (void *cls)
 Error looking up potential credential. More...
 
static void cred_add_cb (void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Check for existing record before storing credential. More...
 
static void cred_store_task (void *cls)
 Add a new credential. More...
 
static int check_credential_store_message (void *cls, const struct AttributeStoreMessage *sam)
 Check an credential store message. More...
 
static void handle_credential_store_message (void *cls, const struct AttributeStoreMessage *sam)
 Handle a credential store message. More...
 
static void send_delete_response (struct AttributeDeleteHandle *adh, int32_t success)
 Send a deletion success response. More...
 
static void consistency_iter (void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Namestore iteration within attribute deletion. More...
 
static void update_tickets (void *cls)
 Recursion prototype for function. More...
 
static void ticket_updated (void *cls, enum GNUNET_ErrorCode ec)
 Callback called when a ticket was updated. More...
 
static void purge_attributes (void *cls)
 Delete all attributes which reference credentials that no longer exist. More...
 
static void offending_attr_delete_cont (void *cls, enum GNUNET_ErrorCode ec)
 
static void consistency_iter_fin (void *cls)
 Done collecting affected tickets, start updating. More...
 
static void consistency_iter_err (void *cls)
 Error collecting affected tickets. More...
 
static void start_consistency_update (void *cls)
 Start processing tickets which may still contain reference to deleted attribute. More...
 
static void attr_delete_cont (void *cls, enum GNUNET_ErrorCode ec)
 Attribute deleted callback. More...
 
static int check_attribute_delete_message (void *cls, const struct AttributeDeleteMessage *dam)
 Check attribute delete message format. More...
 
static void handle_attribute_delete_message (void *cls, const struct AttributeDeleteMessage *dam)
 Handle attribute deletion. More...
 
static void cred_delete_cont (void *cls, enum GNUNET_ErrorCode ec)
 Credential deleted callback. More...
 
static int check_credential_delete_message (void *cls, const struct AttributeDeleteMessage *dam)
 Check credential delete message format. More...
 
static void handle_credential_delete_message (void *cls, const struct AttributeDeleteMessage *dam)
 Handle credential deletion. More...
 
static void attr_iter_finished (void *cls)
 Done iterating over attributes. More...
 
static void attr_iter_error (void *cls)
 Error iterating over attributes. More...
 
static void attr_iter_cb (void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Got record. More...
 
static enum GNUNET_GenericReturnValue check_iteration_start (void *cls, const struct AttributeIterationStartMessage *ais_msg)
 
static void handle_iteration_start (void *cls, const struct AttributeIterationStartMessage *ais_msg)
 Iterate over zone to get attributes. More...
 
static void handle_iteration_stop (void *cls, const struct AttributeIterationStopMessage *ais_msg)
 Handle iteration stop message from client. More...
 
static void handle_iteration_next (void *cls, const struct AttributeIterationNextMessage *ais_msg)
 Client requests next attribute from iterator. More...
 
static void cred_iter_finished (void *cls)
 Done iterating over credentials. More...
 
static void cred_iter_error (void *cls)
 Error iterating over credentials. More...
 
static void cred_iter_cb (void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Got record. More...
 
static enum GNUNET_GenericReturnValue check_credential_iteration_start (void *cls, const struct CredentialIterationStartMessage *cis_msg)
 
static void handle_credential_iteration_start (void *cls, const struct CredentialIterationStartMessage *ais_msg)
 Iterate over zone to get attributes. More...
 
static void handle_credential_iteration_stop (void *cls, const struct CredentialIterationStopMessage *ais_msg)
 Handle iteration stop message from client. More...
 
static void handle_credential_iteration_next (void *cls, const struct CredentialIterationNextMessage *ais_msg)
 Client requests next credential from iterator. More...
 
static void ticket_iter_cb (void *cls, struct GNUNET_RECLAIM_Ticket *ticket)
 Got a ticket. More...
 
static enum GNUNET_GenericReturnValue check_ticket_iteration_start (void *cls, const struct TicketIterationStartMessage *tis_msg)
 
static void handle_ticket_iteration_start (void *cls, const struct TicketIterationStartMessage *tis_msg)
 Client requests a ticket iteration. More...
 
static void handle_ticket_iteration_stop (void *cls, const struct TicketIterationStopMessage *tis_msg)
 Client has had enough tickets. More...
 
static void handle_ticket_iteration_next (void *cls, const struct TicketIterationNextMessage *tis_msg)
 Client requests next result. More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *server)
 Main function that will be run. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
 Called whenever a client is disconnected. More...
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 Add a client to our list of active clients. More...
 
 GNUNET_SERVICE_MAIN ("reclaim", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_var_size(attribute_store_message, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_STORE, struct AttributeStoreMessage, NULL), GNUNET_MQ_hd_var_size(credential_store_message, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_STORE, struct AttributeStoreMessage, NULL), GNUNET_MQ_hd_var_size(attribute_delete_message, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_DELETE, struct AttributeDeleteMessage, NULL), GNUNET_MQ_hd_var_size(credential_delete_message, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_DELETE, struct AttributeDeleteMessage, NULL), GNUNET_MQ_hd_var_size(iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_START, struct AttributeIterationStartMessage, NULL), GNUNET_MQ_hd_fixed_size(iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_NEXT, struct AttributeIterationNextMessage, NULL), GNUNET_MQ_hd_fixed_size(iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_STOP, struct AttributeIterationStopMessage, NULL), GNUNET_MQ_hd_var_size(credential_iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_START, struct CredentialIterationStartMessage, NULL), GNUNET_MQ_hd_fixed_size(credential_iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_NEXT, struct CredentialIterationNextMessage, NULL), GNUNET_MQ_hd_fixed_size(credential_iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_STOP, struct CredentialIterationStopMessage, NULL), GNUNET_MQ_hd_var_size(issue_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_ISSUE_TICKET, struct IssueTicketMessage, NULL), GNUNET_MQ_hd_var_size(consume_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET, struct ConsumeTicketMessage, NULL), GNUNET_MQ_hd_var_size(ticket_iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_START, struct TicketIterationStartMessage, NULL), GNUNET_MQ_hd_fixed_size(ticket_iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_NEXT, struct TicketIterationNextMessage, NULL), GNUNET_MQ_hd_fixed_size(ticket_iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_STOP, struct TicketIterationStopMessage, NULL), GNUNET_MQ_hd_var_size(revoke_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET, struct RevokeTicketMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro. More...
 

Variables

static struct GNUNET_NAMESTORE_Handlensh
 Namestore handle. More...
 
static struct GNUNET_SCHEDULER_Tasktimeout_task
 Timeout task. More...
 
static const struct GNUNET_CONFIGURATION_Handlecfg
 Our configuration. More...
 
static struct IdpClientclient_list_head = NULL
 Client list. More...
 
static struct IdpClientclient_list_tail = NULL
 Client list. More...
 

Function Documentation

◆ cleanup_adh()

static void cleanup_adh ( struct AttributeDeleteHandle adh)
static

Cleanup attribute delete handle.

Parameters
adhthe attribute to cleanup

Definition at line 486 of file gnunet-service-reclaim.c.

487{
488 struct TicketRecordsEntry *le;
489
490 if (NULL != adh->ns_it)
492 if (NULL != adh->ns_qe)
494 if (NULL != adh->label)
495 GNUNET_free (adh->label);
496 if (NULL != adh->claim)
497 GNUNET_free (adh->claim);
498 if (NULL != adh->credential)
499 GNUNET_free (adh->credential);
500 if (NULL != adh->existing_credentials)
502 if (NULL != adh->existing_attributes)
504 while (NULL != (le = adh->tickets_to_update_head))
505 {
508 le);
509 if (NULL != le->label)
510 GNUNET_free (le->label);
511 if (NULL != le->data)
512 GNUNET_free (le->data);
513 GNUNET_free (le);
514 }
515 GNUNET_free (adh);
516}
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_NAMESTORE_cancel(struct GNUNET_NAMESTORE_QueueEntry *qe)
Cancel a namestore operation.
void GNUNET_NAMESTORE_zone_iteration_stop(struct GNUNET_NAMESTORE_ZoneIterator *it)
Stops iteration and releases the namestore handle for further calls.
void GNUNET_RECLAIM_attribute_list_destroy(struct GNUNET_RECLAIM_AttributeList *attrs)
Destroy claim list.
void GNUNET_RECLAIM_credential_list_destroy(struct GNUNET_RECLAIM_CredentialList *credentials)
Destroy credential list.
struct GNUNET_RECLAIM_CredentialList * existing_credentials
Existing credentials.
struct TicketRecordsEntry * tickets_to_update_tail
Tickets to update.
struct GNUNET_RECLAIM_Attribute * claim
The attribute to delete.
char * label
Attribute label.
struct GNUNET_NAMESTORE_ZoneIterator * ns_it
Iterator.
struct GNUNET_RECLAIM_AttributeList * existing_attributes
Existing attributes.
struct GNUNET_NAMESTORE_QueueEntry * ns_qe
QueueEntry.
struct GNUNET_RECLAIM_Credential * credential
The credential to delete.
struct TicketRecordsEntry * tickets_to_update_head
Tickets to update.

References AttributeDeleteHandle::claim, AttributeDeleteHandle::credential, TicketRecordsEntry::data, AttributeDeleteHandle::existing_attributes, AttributeDeleteHandle::existing_credentials, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_NAMESTORE_cancel(), GNUNET_NAMESTORE_zone_iteration_stop(), GNUNET_RECLAIM_attribute_list_destroy(), GNUNET_RECLAIM_credential_list_destroy(), AttributeDeleteHandle::label, TicketRecordsEntry::label, AttributeDeleteHandle::ns_it, AttributeDeleteHandle::ns_qe, AttributeDeleteHandle::tickets_to_update_head, and AttributeDeleteHandle::tickets_to_update_tail.

Referenced by attr_delete_cont(), cleanup_client(), consistency_iter_err(), cred_delete_cont(), offending_attr_delete_cont(), and update_tickets().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cleanup_as_handle()

static void cleanup_as_handle ( struct AttributeStoreHandle ash)
static

Cleanup attribute store handle.

Parameters
ashhandle to clean up

Definition at line 525 of file gnunet-service-reclaim.c.

526{
527 if (NULL != ash->ns_qe)
529 if (NULL != ash->claim)
530 GNUNET_free (ash->claim);
531 if (NULL != ash->credential)
532 GNUNET_free (ash->credential);
533 GNUNET_free (ash);
534}
struct GNUNET_NAMESTORE_QueueEntry * ns_qe
QueueEntry.
struct GNUNET_RECLAIM_Credential * credential
The credential to store.
struct GNUNET_RECLAIM_Attribute * claim
The attribute to store.

References AttributeStoreHandle::claim, AttributeStoreHandle::credential, GNUNET_free, GNUNET_NAMESTORE_cancel(), and AttributeStoreHandle::ns_qe.

Referenced by attr_store_cont(), cleanup_client(), cred_error(), and cred_store_cont().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cleanup_client()

static void cleanup_client ( struct IdpClient idp)
static

Cleanup client.

Parameters
idpthe client to clean up

Definition at line 543 of file gnunet-service-reclaim.c.

544{
545 struct Iterator *ai;
546 struct TicketIteration *ti;
547 struct TicketRevocationOperation *rop;
548 struct TicketIssueOperation *iss;
549 struct ConsumeTicketOperation *ct;
550 struct AttributeStoreHandle *as;
551 struct AttributeDeleteHandle *adh;
552
553 while (NULL != (iss = idp->issue_op_head))
554 {
555 GNUNET_CONTAINER_DLL_remove (idp->issue_op_head, idp->issue_op_tail, iss);
556 GNUNET_free (iss);
557 }
558 while (NULL != (ct = idp->consume_op_head))
559 {
560 GNUNET_CONTAINER_DLL_remove (idp->consume_op_head,
561 idp->consume_op_tail,
562 ct);
563 if (NULL != ct->ch)
565 GNUNET_free (ct);
566 }
567 while (NULL != (as = idp->store_op_head))
568 {
569 GNUNET_CONTAINER_DLL_remove (idp->store_op_head, idp->store_op_tail, as);
571 }
572 while (NULL != (adh = idp->delete_op_head))
573 {
574 GNUNET_CONTAINER_DLL_remove (idp->delete_op_head, idp->delete_op_tail, adh);
575 cleanup_adh (adh);
576 }
577
578 while (NULL != (ai = idp->attr_iter_head))
579 {
580 GNUNET_CONTAINER_DLL_remove (idp->attr_iter_head, idp->attr_iter_tail, ai);
581 GNUNET_free (ai);
582 }
583 while (NULL != (ai = idp->cred_iter_head))
584 {
585 GNUNET_CONTAINER_DLL_remove (idp->cred_iter_head, idp->cred_iter_tail,
586 ai);
587 GNUNET_free (ai);
588 }
589
590 while (NULL != (rop = idp->revoke_op_head))
591 {
592 GNUNET_CONTAINER_DLL_remove (idp->revoke_op_head, idp->revoke_op_tail, rop);
593 if (NULL != rop->rh)
595 GNUNET_free (rop);
596 }
597 while (NULL != (ti = idp->ticket_iter_head))
598 {
599 GNUNET_CONTAINER_DLL_remove (idp->ticket_iter_head,
600 idp->ticket_iter_tail,
601 ti);
602 if (NULL != ti->iter)
604 GNUNET_free (ti);
605 }
607}
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
static void cleanup_adh(struct AttributeDeleteHandle *adh)
Cleanup attribute delete handle.
static void cleanup_as_handle(struct AttributeStoreHandle *ash)
Cleanup attribute store handle.
void RECLAIM_TICKETS_iteration_stop(struct RECLAIM_TICKETS_Iterator *iter)
Stop a running ticket iteration.
void RECLAIM_TICKETS_consume_cancel(struct RECLAIM_TICKETS_ConsumeHandle *cth)
Cancel a consume operation.
void RECLAIM_TICKETS_revoke_cancel(struct RECLAIM_TICKETS_RevokeHandle *rh)
Cancel a revocation.
static struct GNUNET_RECLAIM_Handle * idp
Identity Provider.
Handle for attribute deletion request.
Handle for attribute store request.
Handle for ticket consume request.
struct RECLAIM_TICKETS_ConsumeHandle * ch
Ticket consume handle.
An attribute iteration operation.
Ticket issue operation handle.
A ticket iteration operation.
struct RECLAIM_TICKETS_Iterator * iter
The ticket iterator.
Ticket revocation request handle.
struct RECLAIM_TICKETS_RevokeHandle * rh
Revocation handle.

References ai, ConsumeTicketOperation::ch, cleanup_adh(), cleanup_as_handle(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, idp, TicketIteration::iter, RECLAIM_TICKETS_consume_cancel(), RECLAIM_TICKETS_iteration_stop(), RECLAIM_TICKETS_revoke_cancel(), and TicketRevocationOperation::rh.

Referenced by client_disconnect_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cleanup()

static void cleanup ( )
static

Cleanup task.

Definition at line 614 of file gnunet-service-reclaim.c.

615{
616 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Cleaning up\n");
617
619 if (NULL != timeout_task)
621 if (NULL != nsh)
623}
static struct GNUNET_NAMESTORE_Handle * nsh
Namestore handle.
static struct GNUNET_SCHEDULER_Task * timeout_task
Timeout task.
void RECLAIM_TICKETS_deinit(void)
Close handles and clean up.
#define GNUNET_log(kind,...)
@ GNUNET_ERROR_TYPE_DEBUG
void GNUNET_NAMESTORE_disconnect(struct GNUNET_NAMESTORE_Handle *h)
Disconnect from the namestore service (and free associated resources).
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:981

References GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NAMESTORE_disconnect(), GNUNET_SCHEDULER_cancel(), nsh, RECLAIM_TICKETS_deinit(), and timeout_task.

Referenced by do_shutdown().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_shutdown()

static void do_shutdown ( void *  cls)
static

Shutdown task.

Parameters
clsNULL

Definition at line 632 of file gnunet-service-reclaim.c.

633{
634 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Shutting down...\n");
635 cleanup ();
636}
static void cleanup()
Cleanup task.
@ GNUNET_ERROR_TYPE_INFO

References cleanup(), GNUNET_ERROR_TYPE_INFO, and GNUNET_log.

Referenced by attr_store_cont(), cred_error(), cred_store_cont(), and run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_ticket_result()

static void send_ticket_result ( const struct IdpClient client,
uint32_t  r_id,
const struct GNUNET_RECLAIM_Ticket ticket,
const struct GNUNET_RECLAIM_PresentationList presentations,
uint32_t  success 
)
static

Sends a ticket result message to the client.

Parameters
clientthe client to send to
r_idthe request message ID to reply to
ticketthe ticket to include (may be NULL)
successthe success status of the request

Definition at line 648 of file gnunet-service-reclaim.c.

653{
654 struct TicketResultMessage *irm;
655 struct GNUNET_MQ_Envelope *env;
656 size_t pres_len = 0;
657 size_t tkt_len = 0;
658 ssize_t written;
659 char *buf;
660
661 if (NULL != presentations)
662 {
663 pres_len =
665 }
666 if (NULL != ticket)
669 pres_len + tkt_len,
671 buf = (char*) &irm[1];
672 if (NULL != ticket)
673 {
674 written = GNUNET_RECLAIM_write_ticket_to_buffer (ticket, buf, tkt_len);
675 GNUNET_assert (0 <= written);
676 buf += written;
677 }
678 // TODO add success member
679 irm->id = htonl (r_id);
680 irm->tkt_len = htons (tkt_len);
681 irm->presentations_len = htons (pres_len);
682 if (NULL != presentations)
683 {
685 buf);
686 }
687 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending TICKET_RESULT message\n");
688 GNUNET_MQ_send (client->mq, env);
689}
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct GNUNET_RECLAIM_Ticket ticket
Ticket to consume.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:304
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
Definition: gnunet_mq_lib.h:63
#define GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT
size_t GNUNET_RECLAIM_presentation_list_serialize(const struct GNUNET_RECLAIM_PresentationList *presentations, char *result)
Serialize a presentation list.
size_t GNUNET_RECLAIM_presentation_list_serialize_get_size(const struct GNUNET_RECLAIM_PresentationList *presentations)
Get required size for serialization buffer.
ssize_t GNUNET_RECLAIM_write_ticket_to_buffer(const struct GNUNET_RECLAIM_Ticket *tkt, void *buffer, size_t len)
Serializes a ticket.
Definition: reclaim_api.c:1785
size_t GNUNET_RECLAIM_ticket_serialize_get_size(const struct GNUNET_RECLAIM_Ticket *tkt)
Get serialized ticket size.
Definition: reclaim_api.c:1742
struct GNUNET_MQ_Handle * mq
Message queue for transmission to client.
Ticket result message.
Definition: reclaim.h:492
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:501
uint16_t presentations_len
Length of new presentations created.
Definition: reclaim.h:511
uint16_t tkt_len
Ticket length.
Definition: reclaim.h:506

References env, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_RECLAIM_presentation_list_serialize(), GNUNET_RECLAIM_presentation_list_serialize_get_size(), GNUNET_RECLAIM_ticket_serialize_get_size(), GNUNET_RECLAIM_write_ticket_to_buffer(), TicketResultMessage::id, IdpClient::mq, TicketResultMessage::presentations_len, ticket, and TicketResultMessage::tkt_len.

Referenced by issue_ticket_result_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ issue_ticket_result_cb()

static void issue_ticket_result_cb ( void *  cls,
struct GNUNET_RECLAIM_Ticket ticket,
struct GNUNET_RECLAIM_PresentationList presentations,
int32_t  success,
const char *  emsg 
)
static

Issue ticket result.

Parameters
clsout ticket issue operation handle
ticketthe issued ticket
presentationsnewly created credential presentations (NULL on error)
successissue success status (GNUNET_OK if successful)
emsgerror message (NULL of success is GNUNET_OK)

Definition at line 702 of file gnunet-service-reclaim.c.

707{
708 struct TicketIssueOperation *tio = cls;
709
710 if (GNUNET_OK != success)
711 {
712 send_ticket_result (tio->client, tio->r_id, NULL, NULL, GNUNET_SYSERR);
713 GNUNET_CONTAINER_DLL_remove (tio->client->issue_op_head,
714 tio->client->issue_op_tail,
715 tio);
717 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error issuing ticket: %s\n", emsg);
718 return;
719 }
720 send_ticket_result (tio->client, tio->r_id,
721 ticket, presentations, GNUNET_SYSERR);
722 GNUNET_CONTAINER_DLL_remove (tio->client->issue_op_head,
723 tio->client->issue_op_tail,
724 tio);
726}
static struct GNUNET_CADET_ListTunnels * tio
Active tunnel listing operation.
Definition: gnunet-cadet.c:112
static void send_ticket_result(const struct IdpClient *client, uint32_t r_id, const struct GNUNET_RECLAIM_Ticket *ticket, const struct GNUNET_RECLAIM_PresentationList *presentations, uint32_t success)
Sends a ticket result message to the client.
@ GNUNET_OK
@ GNUNET_SYSERR
@ GNUNET_ERROR_TYPE_ERROR

References GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_SYSERR, send_ticket_result(), ticket, and tio.

Referenced by handle_issue_ticket_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_issue_ticket_message()

static int check_issue_ticket_message ( void *  cls,
const struct IssueTicketMessage im 
)
static

Check issue ticket message.

Parameters
clsunused
immessage to check
Returns
GNUNET_OK if message is ok

Definition at line 737 of file gnunet-service-reclaim.c.

738{
739 uint16_t size;
740 size_t attrs_len;
741 size_t key_len;
742 size_t pkey_len;
743
744 size = ntohs (im->header.size);
745 attrs_len = ntohs (im->attr_len);
746 key_len = ntohs (im->key_len);
747 pkey_len = ntohs (im->pkey_len);
748 if (size != attrs_len + key_len + pkey_len + sizeof(struct
750 {
751 GNUNET_break (0);
752 return GNUNET_SYSERR;
753 }
754 return GNUNET_OK;
755}
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
static unsigned int size
Size of the "table".
Definition: peer.c:68
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
Ticket issue message.
Definition: reclaim.h:396
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_RECLAIM_ISSUE_TICKET.
Definition: reclaim.h:400
uint16_t pkey_len
The length of the relying party public key.
Definition: reclaim.h:425
uint16_t key_len
The length of the identity private key.
Definition: reclaim.h:420
uint16_t attr_len
length of serialized attribute list
Definition: reclaim.h:415

References IssueTicketMessage::attr_len, GNUNET_break, GNUNET_OK, GNUNET_SYSERR, IssueTicketMessage::header, IssueTicketMessage::key_len, IssueTicketMessage::pkey_len, GNUNET_MessageHeader::size, and size.

◆ handle_issue_ticket_message()

static void handle_issue_ticket_message ( void *  cls,
const struct IssueTicketMessage im 
)
static

Handle ticket issue message.

Parameters
clsour client
imthe message

Definition at line 765 of file gnunet-service-reclaim.c.

766{
768 struct IdpClient *idp = cls;
769 struct GNUNET_RECLAIM_AttributeList *attrs;
773 size_t attrs_len;
774 size_t key_len;
775 size_t pkey_len;
776 size_t read;
777 char *buf;
778
779 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ISSUE_TICKET message\n");
780 key_len = ntohs (im->key_len);
781 buf = (char *) &im[1];
782 if ((GNUNET_SYSERR ==
784 &identity, &read)) ||
785 (read != key_len))
786 {
788 "Failed to read private key\n");
790 return;
791 }
792 buf += read;
793 pkey_len = ntohs (im->pkey_len);
794 if ((GNUNET_SYSERR ==
796 &rp, &read)) ||
797 (read != pkey_len))
798 {
800 "Failed to read public key\n");
802 return;
803 }
804 buf += read;
806 attrs_len = ntohs (im->attr_len);
808 attrs_len);
809 for (le = attrs->list_head; NULL != le; le = le->next)
811 "List entry: %s\n", le->attribute->name);
812
813 tio->r_id = ntohl (im->id);
814 tio->client = idp;
815 GNUNET_CONTAINER_DLL_insert (idp->issue_op_head, idp->issue_op_tail, tio);
817 attrs,
818 &rp,
820 tio);
823}
static struct GNUNET_IDENTITY_Handle * identity
Which namespace do we publish to? NULL if we do not publish to a namespace.
static char * rp
Relying party.
static void issue_ticket_result_cb(void *cls, struct GNUNET_RECLAIM_Ticket *ticket, struct GNUNET_RECLAIM_PresentationList *presentations, int32_t success, const char *emsg)
Issue ticket result.
void RECLAIM_TICKETS_issue(const struct GNUNET_CRYPTO_PrivateKey *identity, const struct GNUNET_RECLAIM_AttributeList *attrs, const struct GNUNET_CRYPTO_PublicKey *audience, RECLAIM_TICKETS_TicketResult cb, void *cb_cls)
Issue a new reclaim ticket, thereby authorizing the audience to access the set of provided attributes...
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_read_public_key_from_buffer(const void *buffer, size_t len, struct GNUNET_CRYPTO_PublicKey *key, size_t *read)
Reads a GNUNET_CRYPTO_PublicKey from a compact buffer.
Definition: crypto_pkey.c:103
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_read_private_key_from_buffer(const void *buffer, size_t len, struct GNUNET_CRYPTO_PrivateKey *key, size_t *read)
Reads a GNUNET_CRYPTO_PrivateKey from a compact buffer.
Definition: crypto_pkey.c:146
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_RECLAIM_AttributeList * GNUNET_RECLAIM_attribute_list_deserialize(const char *data, size_t data_size)
Deserialize an attribute list.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2489
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2408
A private key for an identity as per LSD0001.
An identity key as per LSD0001.
struct GNUNET_RECLAIM_Attribute * attribute
The attribute claim.
struct GNUNET_RECLAIM_AttributeListEntry * next
DLL.
A list of GNUNET_RECLAIM_Attribute structures.
struct GNUNET_RECLAIM_AttributeListEntry * list_head
List head.
const char * name
The name of the attribute.
struct GNUNET_CLIENT_Connection * client
Socket (if available).
Definition: reclaim_api.c:325
An idp client.
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:405

References IssueTicketMessage::attr_len, GNUNET_RECLAIM_AttributeListEntry::attribute, GNUNET_RECLAIM_Handle::client, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_CRYPTO_read_public_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_new, GNUNET_RECLAIM_attribute_list_deserialize(), GNUNET_RECLAIM_attribute_list_destroy(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, IssueTicketMessage::id, identity, idp, issue_ticket_result_cb(), IssueTicketMessage::key_len, GNUNET_RECLAIM_AttributeList::list_head, GNUNET_RECLAIM_Attribute::name, GNUNET_RECLAIM_AttributeListEntry::next, IssueTicketMessage::pkey_len, RECLAIM_TICKETS_issue(), rp, and tio.

Here is the call graph for this function:

◆ revoke_result_cb()

static void revoke_result_cb ( void *  cls,
int32_t  success 
)
static

Handles revocation result.

Parameters
clsour revocation operation handle
successrevocation result (GNUNET_OK if successful)

Definition at line 837 of file gnunet-service-reclaim.c.

838{
839 struct TicketRevocationOperation *rop = cls;
840 struct GNUNET_MQ_Envelope *env;
841 struct RevokeTicketResultMessage *trm;
842
844 "Sending REVOKE_TICKET_RESULT message\n");
845 rop->rh = NULL;
847 trm->id = htonl (rop->r_id);
848 trm->success = htonl (success);
849 GNUNET_MQ_send (rop->client->mq, env);
852 rop);
853 GNUNET_free (rop);
854}
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:78
#define GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET_RESULT
struct TicketRevocationOperation * revoke_op_head
Head of DLL of ticket revocation ops.
struct TicketRevocationOperation * revoke_op_tail
Tail of DLL of ticket revocation ops.
Ticket revoke message.
Definition: reclaim.h:470
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:479
uint32_t success
Revocation result.
Definition: reclaim.h:484
struct IdpClient * client
Client connection.

References TicketRevocationOperation::client, env, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET_RESULT, GNUNET_MQ_msg, GNUNET_MQ_send(), RevokeTicketResultMessage::id, IdpClient::mq, TicketRevocationOperation::r_id, IdpClient::revoke_op_head, IdpClient::revoke_op_tail, TicketRevocationOperation::rh, and RevokeTicketResultMessage::success.

Referenced by handle_revoke_ticket_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_revoke_ticket_message()

static int check_revoke_ticket_message ( void *  cls,
const struct RevokeTicketMessage rm 
)
static

Check revocation message format.

Parameters
clsunused
rmthe message to check
Returns
GNUNET_OK if message is ok

Definition at line 865 of file gnunet-service-reclaim.c.

866{
867 uint16_t size;
868 size_t key_len;
869 size_t tkt_len;
870
871 size = ntohs (rm->header.size);
872 key_len = ntohs (rm->key_len);
873 tkt_len = ntohs (rm->tkt_len);
874
875 if (size != sizeof(struct RevokeTicketMessage) + key_len + tkt_len)
876 {
877 GNUNET_break (0);
878 return GNUNET_SYSERR;
879 }
880 return GNUNET_OK;
881}
Ticket revoke message.
Definition: reclaim.h:438
uint16_t key_len
The length of the private key.
Definition: reclaim.h:452
uint16_t tkt_len
The length of the ticket.
Definition: reclaim.h:457
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET.
Definition: reclaim.h:442

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, RevokeTicketMessage::header, RevokeTicketMessage::key_len, GNUNET_MessageHeader::size, size, and RevokeTicketMessage::tkt_len.

◆ handle_revoke_ticket_message()

static void handle_revoke_ticket_message ( void *  cls,
const struct RevokeTicketMessage rm 
)
static

Handle a revocation message to a ticket.

Parameters
clsour client
rmthe message to handle

Definition at line 891 of file gnunet-service-reclaim.c.

892{
893 struct TicketRevocationOperation *rop;
894 struct IdpClient *idp = cls;
897 size_t key_len;
898 size_t tkt_len;
899 size_t read;
900 char *buf;
901
902 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received REVOKE_TICKET message\n");
903 key_len = ntohs (rm->key_len);
904 buf = (char *) &rm[1];
905 if ((GNUNET_SYSERR ==
907 &identity, &read)) ||
908 (read != key_len))
909 {
911 "Failed to read private key\n");
913 return;
914 }
915 buf += read;
916 tkt_len = ntohs (rm->tkt_len);
917 if ((GNUNET_SYSERR ==
919 &ticket, &read)) ||
920 (read != tkt_len))
921 {
923 "Failed to read ticket\n");
925 return;
926 }
928 rop->r_id = ntohl (rm->id);
929 rop->client = idp;
930 GNUNET_CONTAINER_DLL_insert (idp->revoke_op_head, idp->revoke_op_tail, rop);
931 rop->rh
934}
static void revoke_result_cb(void *cls, int32_t success)
Handles revocation result.
struct RECLAIM_TICKETS_RevokeHandle * RECLAIM_TICKETS_revoke(const struct GNUNET_RECLAIM_Ticket *ticket, const struct GNUNET_CRYPTO_PrivateKey *identity, RECLAIM_TICKETS_RevokeCallback cb, void *cb_cls)
Revoke a ticket.
enum GNUNET_GenericReturnValue GNUNET_RECLAIM_read_ticket_from_buffer(const void *buffer, size_t len, struct GNUNET_RECLAIM_Ticket *tkt, size_t *tb_read)
Deserializes a ticket.
Definition: reclaim_api.c:1752
The authorization ticket.
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:447

References TicketRevocationOperation::client, GNUNET_RECLAIM_Handle::client, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_new, GNUNET_RECLAIM_read_ticket_from_buffer(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, RevokeTicketMessage::id, identity, idp, RevokeTicketMessage::key_len, TicketRevocationOperation::r_id, RECLAIM_TICKETS_revoke(), revoke_result_cb(), TicketRevocationOperation::rh, ticket, and RevokeTicketMessage::tkt_len.

Here is the call graph for this function:

◆ consume_result_cb()

static void consume_result_cb ( void *  cls,
const struct GNUNET_CRYPTO_PublicKey identity,
const struct GNUNET_RECLAIM_AttributeList attrs,
const struct GNUNET_RECLAIM_PresentationList presentations,
int32_t  success,
const char *  emsg 
)
static

Handle a ticket consume result.

Parameters
clsour consume ticket operation handle
identitythe attribute authority
attrsthe attribute/claim list
successGNUNET_OK if successful
emsgerror message (NULL if success=GNUNET_OK)

Definition at line 947 of file gnunet-service-reclaim.c.

953{
954 struct ConsumeTicketOperation *cop = cls;
955 struct ConsumeTicketResultMessage *crm;
956 struct GNUNET_MQ_Envelope *env;
957 char *data_tmp;
958 size_t attrs_len = 0;
959 size_t pres_len = 0;
960 size_t key_len;
961 ssize_t written;
962
963 if (GNUNET_OK != success)
964 {
965 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error consuming ticket: %s\n", emsg);
966 }
969 presentations);
972 "Sending CONSUME_TICKET_RESULT message\n");
974 attrs_len + pres_len + key_len,
976 crm->id = htonl (cop->r_id);
977 crm->attrs_len = htons (attrs_len);
978 crm->presentations_len = htons (pres_len);
979 crm->key_len = htons (key_len);
980 crm->result = htons (success);
981 data_tmp = (char *) &crm[1];
983 data_tmp,
984 key_len);
985 GNUNET_assert (0 <= written);
986 data_tmp += written;
988 data_tmp += attrs_len;
989 GNUNET_RECLAIM_presentation_list_serialize (presentations, data_tmp);
990 GNUNET_MQ_send (cop->client->mq, env);
993 cop);
994 GNUNET_free (cop);
995}
ssize_t GNUNET_CRYPTO_public_key_get_length(const struct GNUNET_CRYPTO_PublicKey *key)
Get the compacted length of a GNUNET_CRYPTO_PublicKey.
Definition: crypto_pkey.c:68
ssize_t GNUNET_CRYPTO_write_public_key_to_buffer(const struct GNUNET_CRYPTO_PublicKey *key, void *buffer, size_t len)
Writes a GNUNET_CRYPTO_PublicKey to a compact buffer.
Definition: crypto_pkey.c:128
#define GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET_RESULT
size_t GNUNET_RECLAIM_attribute_list_serialize(const struct GNUNET_RECLAIM_AttributeList *attrs, char *result)
Serialize an attribute list.
size_t GNUNET_RECLAIM_attribute_list_serialize_get_size(const struct GNUNET_RECLAIM_AttributeList *attrs)
Get required size for serialization buffer.
struct IdpClient * client
Client connection.
Attribute list is returned from the idp.
Definition: reclaim.h:554
uint16_t attrs_len
Length of serialized attribute data.
Definition: reclaim.h:578
uint16_t presentations_len
Length of presentation data.
Definition: reclaim.h:583
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:563
uint16_t key_len
The length of the private key.
Definition: reclaim.h:588
uint32_t result
Result.
Definition: reclaim.h:568
struct ConsumeTicketOperation * consume_op_head
Head of DLL of ticket consume ops.
struct ConsumeTicketOperation * consume_op_tail
Tail of DLL of ticket consume ops.

References ConsumeTicketResultMessage::attrs_len, ConsumeTicketOperation::client, IdpClient::consume_op_head, IdpClient::consume_op_tail, env, GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_CRYPTO_public_key_get_length(), GNUNET_CRYPTO_write_public_key_to_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET_RESULT, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_OK, GNUNET_RECLAIM_attribute_list_serialize(), GNUNET_RECLAIM_attribute_list_serialize_get_size(), GNUNET_RECLAIM_presentation_list_serialize(), GNUNET_RECLAIM_presentation_list_serialize_get_size(), ConsumeTicketResultMessage::id, identity, ConsumeTicketResultMessage::key_len, IdpClient::mq, ConsumeTicketResultMessage::presentations_len, ConsumeTicketOperation::r_id, and ConsumeTicketResultMessage::result.

Referenced by handle_consume_ticket_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_consume_ticket_message()

static int check_consume_ticket_message ( void *  cls,
const struct ConsumeTicketMessage cm 
)
static

Check a consume ticket message.

Parameters
clsunused
cmthe message to handle

Definition at line 1005 of file gnunet-service-reclaim.c.

1006{
1007 uint16_t size;
1008
1009 size = ntohs (cm->header.size);
1010 if (size <= sizeof(struct ConsumeTicketMessage))
1011 {
1012 GNUNET_break (0);
1013 return GNUNET_SYSERR;
1014 }
1015 return GNUNET_OK;
1016}
Ticket consume message.
Definition: reclaim.h:523
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET.
Definition: reclaim.h:527

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, ConsumeTicketMessage::header, GNUNET_MessageHeader::size, and size.

◆ handle_consume_ticket_message()

static void handle_consume_ticket_message ( void *  cls,
const struct ConsumeTicketMessage cm 
)
static

Handle a consume ticket message.

Parameters
clsour client handle
cmthe message to handle

Definition at line 1026 of file gnunet-service-reclaim.c.

1027{
1028 struct ConsumeTicketOperation *cop;
1029 struct IdpClient *idp = cls;
1032 size_t key_len;
1033 size_t tkt_len;
1034 size_t read;
1035 char *buf;
1036
1037 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CONSUME_TICKET message\n");
1038 key_len = ntohs (cm->key_len);
1039 buf = (char *) &cm[1];
1040 if ((GNUNET_SYSERR ==
1042 &identity, &read)) ||
1043 (read != key_len))
1044 {
1046 "Failed to read private key\n");
1048 return;
1049 }
1050 buf += read;
1051 tkt_len = ntohs (cm->tkt_len);
1052 if ((GNUNET_SYSERR ==
1054 &ticket, &read)) ||
1055 (read != tkt_len))
1056 {
1058 "Failed to read ticket\n");
1060 return;
1061 }
1062 cop = GNUNET_new (struct ConsumeTicketOperation);
1063 cop->r_id = ntohl (cm->id);
1064 cop->client = idp;
1065 cop->ch
1067 cop);
1068 GNUNET_CONTAINER_DLL_insert (idp->consume_op_head, idp->consume_op_tail, cop);
1070}
static void consume_result_cb(void *cls, const struct GNUNET_CRYPTO_PublicKey *identity, const struct GNUNET_RECLAIM_AttributeList *attrs, const struct GNUNET_RECLAIM_PresentationList *presentations, int32_t success, const char *emsg)
Handle a ticket consume result.
struct RECLAIM_TICKETS_ConsumeHandle * RECLAIM_TICKETS_consume(const struct GNUNET_CRYPTO_PrivateKey *id, const struct GNUNET_RECLAIM_Ticket *ticket, RECLAIM_TICKETS_ConsumeCallback cb, void *cb_cls)
Consume a ticket.
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:532
uint16_t key_len
The length of the private key.
Definition: reclaim.h:537
uint16_t tkt_len
The length of the ticket.
Definition: reclaim.h:542

References ConsumeTicketOperation::ch, ConsumeTicketOperation::client, GNUNET_RECLAIM_Handle::client, consume_result_cb(), GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_new, GNUNET_RECLAIM_read_ticket_from_buffer(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, ConsumeTicketMessage::id, identity, idp, ConsumeTicketMessage::key_len, ConsumeTicketOperation::r_id, RECLAIM_TICKETS_consume(), ticket, and ConsumeTicketMessage::tkt_len.

Here is the call graph for this function:

◆ attr_store_cont()

static void attr_store_cont ( void *  cls,
enum GNUNET_ErrorCode  ec 
)
static

Attribute store result handler.

Parameters
clsour attribute store handle
successGNUNET_OK if successful
emsgerror message (NULL if success=GNUNET_OK)

Definition at line 1086 of file gnunet-service-reclaim.c.

1087{
1088 struct AttributeStoreHandle *ash = cls;
1089 struct GNUNET_MQ_Envelope *env;
1090 struct SuccessResultMessage *acr_msg;
1091
1092 ash->ns_qe = NULL;
1094 ash->client->store_op_tail,
1095 ash);
1096
1097 if (GNUNET_EC_NONE != ec)
1098 {
1100 "Failed to store attribute %s\n",
1102 cleanup_as_handle (ash);
1104 return;
1105 }
1106
1107 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending SUCCESS_RESPONSE message\n");
1109 acr_msg->id = htonl (ash->r_id);
1110 acr_msg->op_result = htonl (GNUNET_OK);
1111 GNUNET_MQ_send (ash->client->mq, env);
1112 cleanup_as_handle (ash);
1113}
static void do_shutdown(void *cls)
Shutdown task.
#define GNUNET_MESSAGE_TYPE_RECLAIM_SUCCESS_RESPONSE
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1305
const char * GNUNET_ErrorCode_get_hint(enum GNUNET_ErrorCode ec)
Returns a hint for a given error code.
@ GNUNET_EC_NONE
No error (success).
struct IdpClient * client
Client connection.
struct AttributeStoreHandle * store_op_head
Head of DLL of attribute store ops.
struct AttributeStoreHandle * store_op_tail
Tail of DLL of attribute store ops.
Attribute store/delete response message.
Definition: reclaim.h:106
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:115
int32_t op_result
GNUNET_SYSERR on failure, GNUNET_OK on success
Definition: reclaim.h:120

References cleanup_as_handle(), AttributeStoreHandle::client, do_shutdown(), env, GNUNET_CONTAINER_DLL_remove, GNUNET_EC_NONE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ErrorCode_get_hint(), GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_SUCCESS_RESPONSE, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_OK, GNUNET_SCHEDULER_add_now(), SuccessResultMessage::id, IdpClient::mq, AttributeStoreHandle::ns_qe, SuccessResultMessage::op_result, AttributeStoreHandle::r_id, IdpClient::store_op_head, and IdpClient::store_op_tail.

Referenced by attr_store_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ attr_store_task()

static void attr_store_task ( void *  cls)
static

Add a new attribute.

Parameters
clsthe AttributeStoreHandle

Definition at line 1122 of file gnunet-service-reclaim.c.

1123{
1124 struct AttributeStoreHandle *ash = cls;
1125 struct GNUNET_GNSRECORD_Data rd[1];
1126 char *buf;
1127 char *label;
1128 size_t buf_size;
1129
1130 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Storing attribute\n");
1132 buf = GNUNET_malloc (buf_size);
1133 // Give the ash a new id if unset
1137 label
1139 sizeof (ash->claim->id));
1140 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Encrypting with label %s\n", label);
1141
1142 rd[0].data_size = buf_size;
1143 rd[0].data = buf;
1148 &ash->identity,
1149 label,
1150 1,
1151 rd,
1153 ash);
1154 GNUNET_free (buf);
1155 GNUNET_free (label);
1156}
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
static void attr_store_cont(void *cls, enum GNUNET_ErrorCode ec)
Attribute store result handler.
@ GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION
This expiration time of the record is a relative time (not an absolute time).
@ GNUNET_YES
#define GNUNET_malloc(size)
Wrapper around malloc.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_record_set_store(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *pkey, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, GNUNET_NAMESTORE_ContinuationWithStatus cont, void *cont_cls)
Store an item in the namestore.
#define GNUNET_RECLAIM_id_is_zero(a)
#define GNUNET_RECLAIM_id_generate(id)
size_t GNUNET_RECLAIM_attribute_serialize_get_size(const struct GNUNET_RECLAIM_Attribute *attr)
Get required size for serialization buffer.
size_t GNUNET_RECLAIM_attribute_serialize(const struct GNUNET_RECLAIM_Attribute *attr, char *result)
Serialize an attribute.
char * GNUNET_STRINGS_data_to_string_alloc(const void *buf, size_t size)
Return the base32crockford encoding of the given buffer.
Definition: strings.c:764
#define GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE
identity attribute
struct GNUNET_CRYPTO_PrivateKey identity
Identity.
struct GNUNET_TIME_Relative exp
The attribute expiration interval.
uint32_t record_type
Type of the GNS/DNS record.
const void * data
Binary value stored in the DNS record.
size_t data_size
Number of bytes in data.
enum GNUNET_GNSRECORD_Flags flags
Flags for the record.
uint64_t expiration_time
Expiration time for the DNS record.
struct GNUNET_RECLAIM_Identifier id
ID.
uint64_t rel_value_us
The actual value.

References attr_store_cont(), AttributeStoreHandle::claim, GNUNET_GNSRECORD_Data::data, GNUNET_GNSRECORD_Data::data_size, AttributeStoreHandle::exp, GNUNET_GNSRECORD_Data::expiration_time, GNUNET_GNSRECORD_Data::flags, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION, GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE, GNUNET_log, GNUNET_malloc, GNUNET_NAMESTORE_record_set_store(), GNUNET_RECLAIM_attribute_serialize(), GNUNET_RECLAIM_attribute_serialize_get_size(), GNUNET_RECLAIM_id_generate, GNUNET_RECLAIM_id_is_zero, GNUNET_STRINGS_data_to_string_alloc(), GNUNET_YES, GNUNET_RECLAIM_Attribute::id, AttributeStoreHandle::identity, AttributeStoreHandle::ns_qe, nsh, rd, GNUNET_GNSRECORD_Data::record_type, and GNUNET_TIME_Relative::rel_value_us.

Referenced by handle_attribute_store_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_attribute_store_message()

static int check_attribute_store_message ( void *  cls,
const struct AttributeStoreMessage sam 
)
static

Check an attribute store message.

Parameters
clsunused
samthe message to check

Definition at line 1166 of file gnunet-service-reclaim.c.

1168{
1169 uint16_t size;
1170
1171 size = ntohs (sam->header.size);
1172 if (size <= sizeof(struct AttributeStoreMessage))
1173 {
1174 GNUNET_break (0);
1175 return GNUNET_SYSERR;
1176 }
1177 return GNUNET_OK;
1178}
Use to store an identity attribute.
Definition: reclaim.h:41
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT.
Definition: reclaim.h:45

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, AttributeStoreMessage::header, GNUNET_MessageHeader::size, and size.

◆ handle_attribute_store_message()

static void handle_attribute_store_message ( void *  cls,
const struct AttributeStoreMessage sam 
)
static

Handle an attribute store message.

Parameters
clsour client
samthe message to handle

Definition at line 1188 of file gnunet-service-reclaim.c.

1190{
1191 struct AttributeStoreHandle *ash;
1192 struct IdpClient *idp = cls;
1194 size_t data_len;
1195 size_t key_len;
1196 size_t read;
1197 char *buf;
1198
1199 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ATTRIBUTE_STORE message\n");
1200
1201 data_len = ntohs (sam->attr_len);
1202 key_len = ntohs (sam->key_len);
1203 buf = (char *) &sam[1];
1204 if ((GNUNET_SYSERR ==
1206 &identity, &read)) ||
1207 (read != key_len))
1208 {
1210 "Failed to read private key\n");
1212 return;
1213 }
1214 buf += read;
1215 ash = GNUNET_new (struct AttributeStoreHandle);
1217 data_len,
1218 &ash->claim);
1219
1220 ash->r_id = ntohl (sam->id);
1221 ash->identity = identity;
1222 ash->exp.rel_value_us = GNUNET_ntohll (sam->exp);
1224
1226 ash->client = idp;
1227 GNUNET_CONTAINER_DLL_insert (idp->store_op_head, idp->store_op_tail, ash);
1229}
static void attr_store_task(void *cls)
Add a new attribute.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_key_get_public(const struct GNUNET_CRYPTO_PrivateKey *privkey, struct GNUNET_CRYPTO_PublicKey *key)
Retrieves the public key representation of a private key.
Definition: crypto_pkey.c:602
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
Definition: common_endian.c:54
ssize_t GNUNET_RECLAIM_attribute_deserialize(const char *data, size_t data_size, struct GNUNET_RECLAIM_Attribute **attr)
Deserialize an attribute.
struct GNUNET_CRYPTO_PublicKey identity_pkey
Identity pubkey.
uint64_t exp
The expiration interval of the attribute.
Definition: reclaim.h:50
uint16_t key_len
The length of the private key.
Definition: reclaim.h:65
uint16_t attr_len
The length of the attribute.
Definition: reclaim.h:60
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:55

References AttributeStoreMessage::attr_len, attr_store_task(), AttributeStoreHandle::claim, AttributeStoreHandle::client, GNUNET_RECLAIM_Handle::client, AttributeStoreHandle::exp, AttributeStoreMessage::exp, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_key_get_public(), GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_new, GNUNET_ntohll(), GNUNET_RECLAIM_attribute_deserialize(), GNUNET_SCHEDULER_add_now(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, AttributeStoreMessage::id, identity, AttributeStoreHandle::identity, AttributeStoreHandle::identity_pkey, idp, AttributeStoreMessage::key_len, AttributeStoreHandle::r_id, and GNUNET_TIME_Relative::rel_value_us.

Here is the call graph for this function:

◆ cred_store_cont()

static void cred_store_cont ( void *  cls,
enum GNUNET_ErrorCode  ec 
)
static

Credential store result handler.

Parameters
clsour attribute store handle
successGNUNET_OK if successful
emsgerror message (NULL if success=GNUNET_OK)

Definition at line 1240 of file gnunet-service-reclaim.c.

1241{
1242 struct AttributeStoreHandle *ash = cls;
1243 struct GNUNET_MQ_Envelope *env;
1244 struct SuccessResultMessage *acr_msg;
1245
1246 ash->ns_qe = NULL;
1248 ash->client->store_op_tail,
1249 ash);
1250
1251 if (GNUNET_EC_NONE != ec)
1252 {
1254 "Failed to store credential: %s\n",
1256 cleanup_as_handle (ash);
1258 return;
1259 }
1260
1261 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending SUCCESS_RESPONSE message\n");
1263 acr_msg->id = htonl (ash->r_id);
1264 acr_msg->op_result = htonl (GNUNET_OK);
1265 GNUNET_MQ_send (ash->client->mq, env);
1266 cleanup_as_handle (ash);
1267}

References cleanup_as_handle(), AttributeStoreHandle::client, do_shutdown(), env, GNUNET_CONTAINER_DLL_remove, GNUNET_EC_NONE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ErrorCode_get_hint(), GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_SUCCESS_RESPONSE, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_OK, GNUNET_SCHEDULER_add_now(), SuccessResultMessage::id, IdpClient::mq, AttributeStoreHandle::ns_qe, SuccessResultMessage::op_result, AttributeStoreHandle::r_id, IdpClient::store_op_head, and IdpClient::store_op_tail.

Referenced by cred_add_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cred_error()

static void cred_error ( void *  cls)
static

Error looking up potential credential.

Abort.

Parameters
clsour attribute store handle

Definition at line 1276 of file gnunet-service-reclaim.c.

1277{
1278 struct AttributeStoreHandle *ash = cls;
1280 "Failed to check for existing credential.\n");
1281 cleanup_as_handle (ash);
1283 return;
1284}

References cleanup_as_handle(), do_shutdown(), GNUNET_ERROR_TYPE_ERROR, GNUNET_log, and GNUNET_SCHEDULER_add_now().

Referenced by cred_store_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cred_add_cb()

static void cred_add_cb ( void *  cls,
const struct GNUNET_CRYPTO_PrivateKey zone,
const char *  label,
unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Check for existing record before storing credential.

Parameters
clsour attribute store handle
zonezone we are iterating
labellabel of the records
rd_countrecord count
rdrecords

Definition at line 1297 of file gnunet-service-reclaim.c.

1302{
1303 struct AttributeStoreHandle *ash = cls;
1304 struct GNUNET_GNSRECORD_Data rd_new[1];
1305 char *buf;
1306 size_t buf_size;
1307
1309 buf = GNUNET_malloc (buf_size);
1312 "Storing new credential under `%s'.\n",
1313 label);
1314 rd_new[0].data_size = buf_size;
1315 rd_new[0].data = buf;
1316 rd_new[0].record_type = GNUNET_GNSRECORD_TYPE_RECLAIM_CREDENTIAL;
1318 rd_new[0].expiration_time = ash->exp.rel_value_us;
1320 &ash->identity,
1321 label,
1322 1,
1323 rd_new,
1325 ash);
1326 GNUNET_free (buf);
1327 return;
1328}
static void cred_store_cont(void *cls, enum GNUNET_ErrorCode ec)
Credential store result handler.
size_t GNUNET_RECLAIM_credential_serialize(const struct GNUNET_RECLAIM_Credential *credential, char *result)
Serialize an credential.
size_t GNUNET_RECLAIM_credential_serialize_get_size(const struct GNUNET_RECLAIM_Credential *credential)
Get required size for serialization buffer.
#define GNUNET_GNSRECORD_TYPE_RECLAIM_CREDENTIAL
Record type for an attribute attestation (e.g.

References cred_store_cont(), AttributeStoreHandle::credential, GNUNET_GNSRECORD_Data::data, GNUNET_GNSRECORD_Data::data_size, AttributeStoreHandle::exp, GNUNET_GNSRECORD_Data::expiration_time, GNUNET_GNSRECORD_Data::flags, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION, GNUNET_GNSRECORD_TYPE_RECLAIM_CREDENTIAL, GNUNET_log, GNUNET_malloc, GNUNET_NAMESTORE_record_set_store(), GNUNET_RECLAIM_credential_serialize(), GNUNET_RECLAIM_credential_serialize_get_size(), AttributeStoreHandle::identity, AttributeStoreHandle::ns_qe, nsh, GNUNET_GNSRECORD_Data::record_type, and GNUNET_TIME_Relative::rel_value_us.

Referenced by cred_store_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cred_store_task()

static void cred_store_task ( void *  cls)
static

Add a new credential.

Parameters
clsthe AttributeStoreHandle

Definition at line 1337 of file gnunet-service-reclaim.c.

1338{
1339 struct AttributeStoreHandle *ash = cls;
1340 char *label;
1341
1342 // Give the ash a new id if unset
1346 sizeof (ash->credential->id));
1348 "Looking up existing data under label `%s'\n", label);
1350 &ash->identity,
1351 label,
1352 &cred_error,
1353 ash,
1354 &cred_add_cb,
1355 ash);
1356 GNUNET_free (label);
1357}
static void cred_error(void *cls)
Error looking up potential credential.
static void cred_add_cb(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Check for existing record before storing credential.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_records_lookup(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *pkey, const char *label, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor rm, void *rm_cls)
Lookup an item in the namestore.
struct GNUNET_RECLAIM_Identifier id
ID.

References cred_add_cb(), cred_error(), AttributeStoreHandle::credential, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_NAMESTORE_records_lookup(), GNUNET_RECLAIM_id_generate, GNUNET_RECLAIM_id_is_zero, GNUNET_STRINGS_data_to_string_alloc(), GNUNET_YES, GNUNET_RECLAIM_Credential::id, AttributeStoreHandle::identity, AttributeStoreHandle::ns_qe, and nsh.

Referenced by handle_credential_store_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_credential_store_message()

static int check_credential_store_message ( void *  cls,
const struct AttributeStoreMessage sam 
)
static

Check an credential store message.

Parameters
clsunused
samthe message to check

Definition at line 1367 of file gnunet-service-reclaim.c.

1369{
1370 uint16_t size;
1371
1372 size = ntohs (sam->header.size);
1373 if (size <= sizeof(struct AttributeStoreMessage))
1374 {
1375 GNUNET_break (0);
1376 return GNUNET_SYSERR;
1377 }
1378 return GNUNET_OK;
1379}

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, AttributeStoreMessage::header, GNUNET_MessageHeader::size, and size.

◆ handle_credential_store_message()

static void handle_credential_store_message ( void *  cls,
const struct AttributeStoreMessage sam 
)
static

Handle a credential store message.

Parameters
clsour client
samthe message to handle

Definition at line 1389 of file gnunet-service-reclaim.c.

1391{
1392 struct AttributeStoreHandle *ash;
1393 struct IdpClient *idp = cls;
1395 size_t data_len;
1396 size_t key_len;
1397 size_t read;
1398 char *buf;
1399
1400 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CREDENTIAL_STORE message\n");
1401
1402 data_len = ntohs (sam->attr_len);
1403 key_len = ntohs (sam->key_len);
1404 buf = (char *) &sam[1];
1405 if ((GNUNET_SYSERR ==
1407 &identity, &read)) ||
1408 (read != key_len))
1409 {
1411 "Failed to read private key\n");
1413 return;
1414 }
1415 buf += read;
1416 ash = GNUNET_new (struct AttributeStoreHandle);
1418 data_len);
1419
1420 ash->r_id = ntohl (sam->id);
1421 ash->identity = identity;
1422 ash->exp.rel_value_us = GNUNET_ntohll (sam->exp);
1424
1426 ash->client = idp;
1427 GNUNET_CONTAINER_DLL_insert (idp->store_op_head, idp->store_op_tail, ash);
1429}
static void cred_store_task(void *cls)
Add a new credential.
struct GNUNET_RECLAIM_Credential * GNUNET_RECLAIM_credential_deserialize(const char *data, size_t data_size)
Deserialize an credential.

References AttributeStoreMessage::attr_len, AttributeStoreHandle::client, GNUNET_RECLAIM_Handle::client, cred_store_task(), AttributeStoreHandle::credential, AttributeStoreHandle::exp, AttributeStoreMessage::exp, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_key_get_public(), GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_new, GNUNET_ntohll(), GNUNET_RECLAIM_credential_deserialize(), GNUNET_SCHEDULER_add_now(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, AttributeStoreMessage::id, identity, AttributeStoreHandle::identity, AttributeStoreHandle::identity_pkey, idp, AttributeStoreMessage::key_len, AttributeStoreHandle::r_id, and GNUNET_TIME_Relative::rel_value_us.

Here is the call graph for this function:

◆ send_delete_response()

static void send_delete_response ( struct AttributeDeleteHandle adh,
int32_t  success 
)
static

Send a deletion success response.

Parameters
adhour attribute deletion handle
successthe success status

Definition at line 1439 of file gnunet-service-reclaim.c.

1440{
1441 struct GNUNET_MQ_Envelope *env;
1442 struct SuccessResultMessage *acr_msg;
1443
1445 adh->client->delete_op_tail,
1446 adh);
1447
1448 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending SUCCESS_RESPONSE message\n");
1450 acr_msg->id = htonl (adh->r_id);
1451 acr_msg->op_result = htonl (success);
1452 GNUNET_MQ_send (adh->client->mq, env);
1453}
struct IdpClient * client
Client connection.
struct AttributeDeleteHandle * delete_op_tail
Tail of DLL of attribute delete ops.
struct AttributeDeleteHandle * delete_op_head
Head of DLL of attribute delete ops.

References AttributeDeleteHandle::client, IdpClient::delete_op_head, IdpClient::delete_op_tail, env, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_SUCCESS_RESPONSE, GNUNET_MQ_msg, GNUNET_MQ_send(), SuccessResultMessage::id, IdpClient::mq, SuccessResultMessage::op_result, and AttributeDeleteHandle::r_id.

Referenced by attr_delete_cont(), consistency_iter_err(), cred_delete_cont(), offending_attr_delete_cont(), and update_tickets().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ consistency_iter()

static void consistency_iter ( void *  cls,
const struct GNUNET_CRYPTO_PrivateKey zone,
const char *  label,
unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Namestore iteration within attribute deletion.

We need to reissue tickets with the deleted attribute removed.

Parameters
clsour attribute deletion handle
zonethe private key of the ticket issuer
labelthe label of the record
rd_countnumber of records
rdrecord data

Definition at line 1467 of file gnunet-service-reclaim.c.

1472{
1473 struct AttributeDeleteHandle *adh = cls;
1474 struct TicketRecordsEntry *le;
1477 int is_ticket = GNUNET_NO;
1478 for (int i = 0; i < rd_count; i++)
1479 {
1480 switch (rd[i].record_type)
1481 {
1485 rd[i].data_size,
1486 &ale->attribute);
1489 ale);
1490 break;
1494 rd[i].data_size);
1497 cle);
1498 break;
1501 "Ticket to delete found (%s)\n",
1502 label);
1503 is_ticket = GNUNET_YES;
1504 break;
1505 default:
1506 break;
1507 }
1508 if (GNUNET_YES == is_ticket)
1509 break;
1510 }
1511 if (GNUNET_YES == is_ticket)
1512 {
1513 le = GNUNET_new (struct TicketRecordsEntry);
1515 le->data = GNUNET_malloc (le->data_size);
1516 le->rd_count = rd_count;
1517 le->label = GNUNET_strdup (label);
1521 le);
1522 }
1524}
static char * data
The data to insert into the dht.
static unsigned int rd_count
Number of records for currently parsed set.
static size_t data_size
Number of bytes in data.
ssize_t GNUNET_GNSRECORD_records_serialize(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, size_t dest_size, char *dest)
Serialize the given records to the given destination buffer.
ssize_t GNUNET_GNSRECORD_records_get_size(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Calculate how many bytes we will need to serialize the given records.
@ GNUNET_NO
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void GNUNET_NAMESTORE_zone_iterator_next(struct GNUNET_NAMESTORE_ZoneIterator *it, uint64_t limit)
Calls the record processor specified in GNUNET_NAMESTORE_zone_iteration_start for the next record.
#define GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET
local ticket reference
struct GNUNET_RECLAIM_AttributeListEntry * list_tail
List tail.
struct GNUNET_RECLAIM_Credential * credential
The credential.
struct GNUNET_RECLAIM_CredentialListEntry * list_head
List head.
struct GNUNET_RECLAIM_CredentialListEntry * list_tail
List tail.
unsigned int rd_count
Record count.

References GNUNET_RECLAIM_AttributeListEntry::attribute, GNUNET_RECLAIM_CredentialListEntry::credential, data, TicketRecordsEntry::data, data_size, TicketRecordsEntry::data_size, AttributeDeleteHandle::existing_attributes, AttributeDeleteHandle::existing_credentials, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_GNSRECORD_records_get_size(), GNUNET_GNSRECORD_records_serialize(), GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE, GNUNET_GNSRECORD_TYPE_RECLAIM_CREDENTIAL, GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET, GNUNET_log, GNUNET_malloc, GNUNET_NAMESTORE_zone_iterator_next(), GNUNET_new, GNUNET_NO, GNUNET_RECLAIM_attribute_deserialize(), GNUNET_RECLAIM_credential_deserialize(), GNUNET_strdup, GNUNET_YES, TicketRecordsEntry::label, GNUNET_RECLAIM_AttributeList::list_head, GNUNET_RECLAIM_CredentialList::list_head, GNUNET_RECLAIM_AttributeList::list_tail, GNUNET_RECLAIM_CredentialList::list_tail, AttributeDeleteHandle::ns_it, rd, rd_count, TicketRecordsEntry::rd_count, AttributeDeleteHandle::tickets_to_update_head, and AttributeDeleteHandle::tickets_to_update_tail.

Referenced by start_consistency_update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_tickets()

static void update_tickets ( void *  cls)
static

Recursion prototype for function.

Update tickets: Remove shared attribute which has just been deleted.

Parameters
clsour deletion handle

This method is called recursively until all tickets are processed. Eventually, the updated tickets are stored using `‘update_tickets’'.

Parameters
clsour attribute deletion handle

Definition at line 1560 of file gnunet-service-reclaim.c.

1561{
1562 struct AttributeDeleteHandle *adh = cls;
1563 struct TicketRecordsEntry *le;
1564
1565 if (NULL == adh->tickets_to_update_head)
1566 {
1568 "Finished updating tickets, success\n");
1570 cleanup_adh (adh);
1571 return;
1572 }
1573 le = adh->tickets_to_update_head;
1576 le);
1577 struct GNUNET_GNSRECORD_Data rd[le->rd_count];
1578 struct GNUNET_GNSRECORD_Data rd_new[le->rd_count - 1];
1580 le->data,
1581 le->rd_count,
1582 rd))
1583 {
1585 "Unable to deserialize record data!\n");
1587 cleanup_adh (adh);
1588 return;
1589 }
1590 int j = 0;
1591 int i = 0;
1594 struct GNUNET_RECLAIM_Presentation *presentation;
1595 for (i = 0; i < le->rd_count; i++)
1596 {
1597 switch (rd[i].record_type)
1598 {
1600 for (ale = adh->existing_attributes->list_head; NULL != ale; ale =
1601 ale->next)
1602 {
1604 &ale->attribute->id))
1605 {
1607 "Found attribute %s, readding...\n",
1608 ale->attribute->name);
1609 rd_new[j] = rd[i];
1610 j++;
1611 break; // Found and added
1612 }
1613 }
1614 break;
1617 rd[i].data_size);
1618 for (cle = adh->existing_credentials->list_head; NULL != cle; cle =
1619 cle->next)
1620 {
1622 &presentation->credential_id,
1623 &cle->credential->id))
1624 {
1626 "Found presentation for credential %s, readding...\n",
1627 cle->credential->name);
1628 rd_new[j] = rd[i];
1629 j++;
1630 break; // Found and added
1631 }
1632 }
1633 GNUNET_free (presentation);
1634 break;
1636 rd_new[j] = rd[i];
1637 j++;
1638 break; // Found and added
1639 default:
1640 GNUNET_break (0);
1641 }
1642 }
1644 "Updating ticket with %d entries (%d before)...\n",
1645 j, i);
1647 &adh->identity,
1648 le->label,
1649 j,
1650 rd_new,
1652 adh);
1653 GNUNET_free (le->label);
1654 GNUNET_free (le->data);
1655 GNUNET_free (le);
1656}
static void send_delete_response(struct AttributeDeleteHandle *adh, int32_t success)
Send a deletion success response.
static void ticket_updated(void *cls, enum GNUNET_ErrorCode ec)
Callback called when a ticket was updated.
int GNUNET_GNSRECORD_records_deserialize(size_t len, const char *src, unsigned int rd_count, struct GNUNET_GNSRECORD_Data *dest)
Deserialize the given records to the given destination.
#define GNUNET_RECLAIM_id_is_equal(a, b)
struct GNUNET_RECLAIM_Presentation * GNUNET_RECLAIM_presentation_deserialize(const char *data, size_t data_size)
Deserialize a presentation.
#define GNUNET_GNSRECORD_TYPE_RECLAIM_PRESENTATION
Record type for a presentation of a credential.
#define GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE_REF
for reclaim records
struct GNUNET_CRYPTO_PrivateKey identity
Identity.
struct GNUNET_RECLAIM_CredentialListEntry * next
DLL.
const char * name
The name of the credential.
A credential presentation.
struct GNUNET_RECLAIM_Identifier credential_id
The credential id of which this is a presentation.

References GNUNET_RECLAIM_AttributeListEntry::attribute, cleanup_adh(), GNUNET_RECLAIM_CredentialListEntry::credential, GNUNET_RECLAIM_Presentation::credential_id, data, TicketRecordsEntry::data, data_size, TicketRecordsEntry::data_size, AttributeDeleteHandle::existing_attributes, AttributeDeleteHandle::existing_credentials, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_GNSRECORD_records_deserialize(), GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE_REF, GNUNET_GNSRECORD_TYPE_RECLAIM_PRESENTATION, GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET, GNUNET_log, GNUNET_NAMESTORE_record_set_store(), GNUNET_OK, GNUNET_RECLAIM_id_is_equal, GNUNET_RECLAIM_presentation_deserialize(), GNUNET_SYSERR, GNUNET_YES, GNUNET_RECLAIM_Attribute::id, GNUNET_RECLAIM_Credential::id, AttributeDeleteHandle::identity, TicketRecordsEntry::label, GNUNET_RECLAIM_AttributeList::list_head, GNUNET_RECLAIM_CredentialList::list_head, GNUNET_RECLAIM_Attribute::name, GNUNET_RECLAIM_Credential::name, GNUNET_RECLAIM_AttributeListEntry::next, GNUNET_RECLAIM_CredentialListEntry::next, AttributeDeleteHandle::ns_qe, nsh, rd, rd_count, TicketRecordsEntry::rd_count, send_delete_response(), ticket_updated(), AttributeDeleteHandle::tickets_to_update_head, and AttributeDeleteHandle::tickets_to_update_tail.

Referenced by purge_attributes(), and ticket_updated().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ticket_updated()

static void ticket_updated ( void *  cls,
enum GNUNET_ErrorCode  ec 
)
static

Callback called when a ticket was updated.

Parameters
clsour attribute deletion handle
successGNUNET_OK if successful
emsgerror message (NULL if success=GNUNET_OK)

Definition at line 1543 of file gnunet-service-reclaim.c.

1544{
1545 struct AttributeDeleteHandle *adh = cls;
1546
1547 adh->ns_qe = NULL;
1549}
static void update_tickets(void *cls)
Recursion prototype for function.

References GNUNET_SCHEDULER_add_now(), AttributeDeleteHandle::ns_qe, and update_tickets().

Referenced by update_tickets().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ purge_attributes()

static void purge_attributes ( void *  cls)
static

Delete all attributes which reference credentials that no longer exist.

Definition at line 1691 of file gnunet-service-reclaim.c.

1692{
1693 struct AttributeDeleteHandle *adh = cls;
1696
1697 for (ale = adh->existing_attributes->list_head; NULL != ale; ale = ale->next)
1698 {
1699 if (GNUNET_YES ==
1701 continue;
1702
1703 for (cle = adh->existing_credentials->list_head;
1704 NULL != cle; cle = cle->next)
1705 {
1706 if (GNUNET_YES !=
1708 &ale->attribute->credential))
1709 continue;
1710 break;
1711 }
1712 if (NULL == cle)
1713 {
1715 "Found attribute with missing credential\n");
1716 break;
1717 }
1718 }
1719 if (NULL == ale)
1720 {
1722 "Attributes consistent, updating tickets.\n");
1724 return;
1725 }
1727 "Attributes inconsistent, deleting offending attribute.\n");
1728 char *label
1730 sizeof(ale->attribute->id));
1731
1733 &adh->identity,
1734 label,
1735 0,
1736 NULL,
1738 adh);
1741 ale);
1742 GNUNET_free (ale);
1743 GNUNET_free (label);
1744}
static void offending_attr_delete_cont(void *cls, enum GNUNET_ErrorCode ec)
@ GNUNET_ERROR_TYPE_WARNING
struct GNUNET_RECLAIM_Identifier credential
Referenced ID of credential (may be GNUNET_RECLAIM_ID_ZERO if self-creded)

References GNUNET_RECLAIM_AttributeListEntry::attribute, GNUNET_RECLAIM_Attribute::credential, GNUNET_RECLAIM_CredentialListEntry::credential, AttributeDeleteHandle::existing_attributes, AttributeDeleteHandle::existing_credentials, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_NAMESTORE_record_set_store(), GNUNET_RECLAIM_id_is_equal, GNUNET_RECLAIM_id_is_zero, GNUNET_SCHEDULER_add_now(), GNUNET_STRINGS_data_to_string_alloc(), GNUNET_YES, GNUNET_RECLAIM_Attribute::id, GNUNET_RECLAIM_Credential::id, AttributeDeleteHandle::identity, GNUNET_RECLAIM_AttributeList::list_head, GNUNET_RECLAIM_CredentialList::list_head, GNUNET_RECLAIM_AttributeList::list_tail, GNUNET_RECLAIM_AttributeListEntry::next, GNUNET_RECLAIM_CredentialListEntry::next, AttributeDeleteHandle::ns_qe, nsh, offending_attr_delete_cont(), and update_tickets().

Referenced by consistency_iter_fin(), and offending_attr_delete_cont().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ offending_attr_delete_cont()

static void offending_attr_delete_cont ( void *  cls,
enum GNUNET_ErrorCode  ec 
)
static

Definition at line 1667 of file gnunet-service-reclaim.c.

1668{
1669 struct AttributeDeleteHandle *adh = cls;
1670
1671 adh->ns_qe = NULL;
1672 if (GNUNET_EC_NONE != ec)
1673 {
1675 "Error deleting attribute %s\n",
1676 adh->label);
1678 cleanup_adh (adh);
1679 return;
1680 }
1681 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Continuing consistency check...\n");
1683}
static void purge_attributes(void *cls)
Delete all attributes which reference credentials that no longer exist.

References cleanup_adh(), GNUNET_EC_NONE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SCHEDULER_add_now(), GNUNET_SYSERR, AttributeDeleteHandle::label, AttributeDeleteHandle::ns_qe, purge_attributes(), and send_delete_response().

Referenced by purge_attributes().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ consistency_iter_fin()

static void consistency_iter_fin ( void *  cls)
static

Done collecting affected tickets, start updating.

Parameters
clsour attribute deletion handle

Definition at line 1753 of file gnunet-service-reclaim.c.

1754{
1755 struct AttributeDeleteHandle *adh = cls;
1756 adh->ns_it = NULL;
1758}

References GNUNET_SCHEDULER_add_now(), AttributeDeleteHandle::ns_it, and purge_attributes().

Referenced by start_consistency_update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ consistency_iter_err()

static void consistency_iter_err ( void *  cls)
static

Error collecting affected tickets.

Abort.

Parameters
clsour attribute deletion handle

Definition at line 1767 of file gnunet-service-reclaim.c.

1768{
1769 struct AttributeDeleteHandle *adh = cls;
1770
1771 adh->ns_it = NULL;
1773 "Namestore error on consistency check\n");
1775 cleanup_adh (adh);
1776}

References cleanup_adh(), GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SYSERR, AttributeDeleteHandle::ns_it, and send_delete_response().

Referenced by start_consistency_update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ start_consistency_update()

static void start_consistency_update ( void *  cls)
static

Start processing tickets which may still contain reference to deleted attribute.

Parameters
clsattribute deletion handle

Definition at line 1786 of file gnunet-service-reclaim.c.

1787{
1788 struct AttributeDeleteHandle *adh = cls;
1789
1792
1794 &adh->identity,
1796 adh,
1798 adh,
1800 adh);
1801}
static void consistency_iter(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Namestore iteration within attribute deletion.
static void consistency_iter_err(void *cls)
Error collecting affected tickets.
static void consistency_iter_fin(void *cls)
Done collecting affected tickets, start updating.
struct GNUNET_NAMESTORE_ZoneIterator * GNUNET_NAMESTORE_zone_iteration_start(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *zone, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor proc, void *proc_cls, GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls)
A list of GNUNET_RECLAIM_Credential structures.

References consistency_iter(), consistency_iter_err(), consistency_iter_fin(), AttributeDeleteHandle::existing_attributes, AttributeDeleteHandle::existing_credentials, GNUNET_NAMESTORE_zone_iteration_start(), GNUNET_new, AttributeDeleteHandle::identity, AttributeDeleteHandle::ns_it, and nsh.

Referenced by attr_delete_cont(), and cred_delete_cont().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ attr_delete_cont()

static void attr_delete_cont ( void *  cls,
enum GNUNET_ErrorCode  ec 
)
static

Attribute deleted callback.

Parameters
clsour handle
successsuccess status
emsgerror message (NULL if success=GNUNET_OK)

Definition at line 1812 of file gnunet-service-reclaim.c.

1813{
1814 struct AttributeDeleteHandle *adh = cls;
1815
1816 adh->ns_qe = NULL;
1817 if (GNUNET_EC_NONE != ec)
1818 {
1820 "Error deleting attribute %s\n",
1821 adh->label);
1823 cleanup_adh (adh);
1824 return;
1825 }
1826 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating tickets...\n");
1828}
static void start_consistency_update(void *cls)
Start processing tickets which may still contain reference to deleted attribute.

References cleanup_adh(), GNUNET_EC_NONE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SCHEDULER_add_now(), GNUNET_SYSERR, AttributeDeleteHandle::label, AttributeDeleteHandle::ns_qe, send_delete_response(), and start_consistency_update().

Referenced by handle_attribute_delete_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_attribute_delete_message()

static int check_attribute_delete_message ( void *  cls,
const struct AttributeDeleteMessage dam 
)
static

Check attribute delete message format.

Parameters
clsunused
dammessage to check

Definition at line 1838 of file gnunet-service-reclaim.c.

1840{
1841 uint16_t size;
1842
1843 size = ntohs (dam->header.size);
1844 if (size <= sizeof(struct AttributeDeleteMessage))
1845 {
1846 GNUNET_break (0);
1847 return GNUNET_SYSERR;
1848 }
1849 return GNUNET_OK;
1850}
Use to delete an identity attribute.
Definition: reclaim.h:77
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT.
Definition: reclaim.h:81

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, AttributeDeleteMessage::header, GNUNET_MessageHeader::size, and size.

◆ handle_attribute_delete_message()

static void handle_attribute_delete_message ( void *  cls,
const struct AttributeDeleteMessage dam 
)
static

Handle attribute deletion.

Parameters
clsour client
damdeletion message

Definition at line 1860 of file gnunet-service-reclaim.c.

1862{
1863 struct AttributeDeleteHandle *adh;
1864 struct IdpClient *idp = cls;
1866 size_t data_len;
1867 size_t key_len;
1868 size_t read;
1869 char *buf;
1870
1871 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ATTRIBUTE_DELETE message\n");
1872
1873 data_len = ntohs (dam->attr_len);
1874 key_len = ntohs (dam->key_len);
1875 buf = (char *) &dam[1];
1876 if ((GNUNET_SYSERR ==
1878 &identity, &read)) ||
1879 (read != key_len))
1880 {
1882 "Failed to read private key\n");
1884 return;
1885 }
1886 buf += read;
1887 adh = GNUNET_new (struct AttributeDeleteHandle);
1889 data_len,
1890 &adh->claim);
1891 adh->credential = NULL;
1892
1893 adh->r_id = ntohl (dam->id);
1894 adh->identity = identity;
1895 adh->label
1897 sizeof(adh->claim->id));
1899 adh->client = idp;
1900 GNUNET_CONTAINER_DLL_insert (idp->delete_op_head, idp->delete_op_tail, adh);
1902 &adh->identity,
1903 adh->label,
1904 0,
1905 NULL,
1907 adh);
1908}
static void attr_delete_cont(void *cls, enum GNUNET_ErrorCode ec)
Attribute deleted callback.
uint16_t key_len
The length of the private key.
Definition: reclaim.h:96
uint16_t attr_len
The length of the attribute.
Definition: reclaim.h:91
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:86

References attr_delete_cont(), AttributeDeleteMessage::attr_len, AttributeDeleteHandle::claim, AttributeDeleteHandle::client, GNUNET_RECLAIM_Handle::client, AttributeDeleteHandle::credential, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_NAMESTORE_record_set_store(), GNUNET_new, GNUNET_RECLAIM_attribute_deserialize(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_STRINGS_data_to_string_alloc(), GNUNET_SYSERR, GNUNET_RECLAIM_Attribute::id, AttributeDeleteMessage::id, identity, AttributeDeleteHandle::identity, idp, AttributeDeleteMessage::key_len, AttributeDeleteHandle::label, AttributeDeleteHandle::ns_qe, nsh, and AttributeDeleteHandle::r_id.

Here is the call graph for this function:

◆ cred_delete_cont()

static void cred_delete_cont ( void *  cls,
enum GNUNET_ErrorCode  ec 
)
static

Credential deleted callback.

Parameters
clsour handle
successsuccess status
emsgerror message (NULL if success=GNUNET_OK)

Definition at line 1919 of file gnunet-service-reclaim.c.

1920{
1921 struct AttributeDeleteHandle *adh = cls;
1922
1923 adh->ns_qe = NULL;
1924 if (GNUNET_EC_NONE != ec)
1925 {
1927 "Error deleting credential `%s'\n",
1928 adh->label);
1930 cleanup_adh (adh);
1931 return;
1932 }
1933 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating tickets...\n");
1935}

References cleanup_adh(), GNUNET_EC_NONE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SCHEDULER_add_now(), GNUNET_SYSERR, AttributeDeleteHandle::label, AttributeDeleteHandle::ns_qe, send_delete_response(), and start_consistency_update().

Referenced by handle_credential_delete_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_credential_delete_message()

static int check_credential_delete_message ( void *  cls,
const struct AttributeDeleteMessage dam 
)
static

Check credential delete message format.

Parameters
clsunused
dammessage to check

Definition at line 1945 of file gnunet-service-reclaim.c.

1947{
1948 uint16_t size;
1949
1950 size = ntohs (dam->header.size);
1951 if (size <= sizeof(struct AttributeDeleteMessage))
1952 {
1953 GNUNET_break (0);
1954 return GNUNET_SYSERR;
1955 }
1956 return GNUNET_OK;
1957}

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, AttributeDeleteMessage::header, GNUNET_MessageHeader::size, and size.

◆ handle_credential_delete_message()

static void handle_credential_delete_message ( void *  cls,
const struct AttributeDeleteMessage dam 
)
static

Handle credential deletion.

Parameters
clsour client
damdeletion message

Definition at line 1967 of file gnunet-service-reclaim.c.

1969{
1970 struct AttributeDeleteHandle *adh;
1971 struct IdpClient *idp = cls;
1973 size_t data_len;
1974 size_t key_len;
1975 size_t read;
1976 char *buf;
1977
1978 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CREDENTIAL_DELETE message\n");
1979
1980 data_len = ntohs (dam->attr_len);
1981 key_len = ntohs (dam->key_len);
1982 buf = (char *) &dam[1];
1983 if ((GNUNET_SYSERR ==
1985 &identity, &read)) ||
1986 (read != key_len))
1987 {
1989 "Failed to read private key\n");
1991 return;
1992 }
1993 buf += read;
1994 adh = GNUNET_new (struct AttributeDeleteHandle);
1996 data_len);
1997 adh->claim = NULL;
1998
1999 adh->r_id = ntohl (dam->id);
2000 adh->identity = identity;
2001 adh->label
2003 sizeof(adh->credential->id));
2005 adh->client = idp;
2006 GNUNET_CONTAINER_DLL_insert (idp->delete_op_head, idp->delete_op_tail, adh);
2008 &adh->identity,
2009 adh->label,
2010 0,
2011 NULL,
2013 adh);
2014}
static void cred_delete_cont(void *cls, enum GNUNET_ErrorCode ec)
Credential deleted callback.

References AttributeDeleteMessage::attr_len, AttributeDeleteHandle::claim, AttributeDeleteHandle::client, GNUNET_RECLAIM_Handle::client, cred_delete_cont(), AttributeDeleteHandle::credential, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_NAMESTORE_record_set_store(), GNUNET_new, GNUNET_RECLAIM_credential_deserialize(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_STRINGS_data_to_string_alloc(), GNUNET_SYSERR, GNUNET_RECLAIM_Credential::id, AttributeDeleteMessage::id, identity, AttributeDeleteHandle::identity, idp, AttributeDeleteMessage::key_len, AttributeDeleteHandle::label, AttributeDeleteHandle::ns_qe, nsh, and AttributeDeleteHandle::r_id.

Here is the call graph for this function:

◆ attr_iter_finished()

static void attr_iter_finished ( void *  cls)
static

Done iterating over attributes.

Parameters
clsour iterator handle

Definition at line 2028 of file gnunet-service-reclaim.c.

2029{
2030 struct Iterator *ai = cls;
2031 struct GNUNET_MQ_Envelope *env;
2032 struct AttributeResultMessage *arm;
2033
2034 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending ATTRIBUTE_RESULT message\n");
2036 arm->id = htonl (ai->request_id);
2037 arm->attr_len = htons (0);
2038 arm->pkey_len = htons (0);
2039 GNUNET_MQ_send (ai->client->mq, env);
2040 GNUNET_CONTAINER_DLL_remove (ai->client->attr_iter_head,
2041 ai->client->attr_iter_tail,
2042 ai);
2043 GNUNET_free (ai);
2044}
#define GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_RESULT
Attribute is returned from the idp.
Definition: reclaim.h:127
uint16_t attr_len
Length of serialized attribute data.
Definition: reclaim.h:146
uint16_t pkey_len
The length of the public key.
Definition: reclaim.h:156
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:136

References ai, AttributeResultMessage::attr_len, env, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_RESULT, GNUNET_MQ_msg, GNUNET_MQ_send(), AttributeResultMessage::id, and AttributeResultMessage::pkey_len.

Referenced by attr_iter_error(), and handle_iteration_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ attr_iter_error()

static void attr_iter_error ( void *  cls)
static

Error iterating over attributes.

Abort.

Parameters
clsour attribute iteration handle

Definition at line 2053 of file gnunet-service-reclaim.c.

2054{
2055 struct Iterator *ai = cls;
2056
2057 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to iterate over attributes\n");
2059}
static void attr_iter_finished(void *cls)
Done iterating over attributes.

References ai, attr_iter_finished(), GNUNET_ERROR_TYPE_ERROR, and GNUNET_log.

Referenced by handle_iteration_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ attr_iter_cb()

static void attr_iter_cb ( void *  cls,
const struct GNUNET_CRYPTO_PrivateKey zone,
const char *  label,
unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Got record.

Return if it is an attribute.

Parameters
clsour attribute iterator
zonezone we are iterating
labellabel of the records
rd_countrecord count
rdrecords

Definition at line 2072 of file gnunet-service-reclaim.c.

2077{
2078 struct Iterator *ai = cls;
2079 struct GNUNET_MQ_Envelope *env;
2081 char *data_tmp;
2082 size_t key_len;
2083 ssize_t written;
2084
2085 if ((rd_count != 1) ||
2087 {
2089 return;
2090 }
2091 struct AttributeResultMessage *arm;
2092 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found attribute under: %s\n",
2093 label);
2095 "Sending ATTRIBUTE_RESULT message\n");
2098 env = GNUNET_MQ_msg_extra (arm,
2099 rd->data_size + key_len,
2101 arm->id = htonl (ai->request_id);
2102 arm->attr_len = htons (rd->data_size);
2103 data_tmp = (char *) &arm[1];
2104 arm->pkey_len = htons (key_len);
2106 data_tmp,
2107 key_len);
2108 GNUNET_assert (0 <= written);
2109 data_tmp += written;
2110 GNUNET_memcpy (data_tmp, rd->data, rd->data_size);
2111 GNUNET_MQ_send (ai->client->mq, env);
2112}
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.

References ai, AttributeResultMessage::attr_len, GNUNET_GNSRECORD_Data::data, GNUNET_GNSRECORD_Data::data_size, env, GNUNET_assert, GNUNET_CRYPTO_key_get_public(), GNUNET_CRYPTO_public_key_get_length(), GNUNET_CRYPTO_write_public_key_to_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE, GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_RESULT, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_NAMESTORE_zone_iterator_next(), AttributeResultMessage::id, identity, AttributeResultMessage::pkey_len, rd, rd_count, and GNUNET_GNSRECORD_Data::record_type.

Referenced by handle_iteration_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_iteration_start()

static enum GNUNET_GenericReturnValue check_iteration_start ( void *  cls,
const struct AttributeIterationStartMessage ais_msg 
)
static

Definition at line 2116 of file gnunet-service-reclaim.c.

2119{
2120 uint16_t size;
2121 size_t key_len;
2122
2123 size = ntohs (ais_msg->header.size);
2124 key_len = ntohs (ais_msg->key_len);
2125
2126 if (size < key_len + sizeof(*ais_msg))
2127 {
2128 GNUNET_break (0);
2129 return GNUNET_SYSERR;
2130 }
2131 return GNUNET_OK;
2132}
uint16_t key_len
The length of the private key.
Definition: reclaim.h:221
struct GNUNET_MessageHeader header
Message.
Definition: reclaim.h:206

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, AttributeIterationStartMessage::header, AttributeIterationStartMessage::key_len, GNUNET_MessageHeader::size, and size.

◆ handle_iteration_start()

static void handle_iteration_start ( void *  cls,
const struct AttributeIterationStartMessage ais_msg 
)
static

Iterate over zone to get attributes.

Parameters
clsour client
ais_msgthe iteration message to start

Definition at line 2142 of file gnunet-service-reclaim.c.

2144{
2145 struct IdpClient *idp = cls;
2146 struct Iterator *ai;
2148 size_t key_len;
2149 size_t read;
2150
2152 "Received ATTRIBUTE_ITERATION_START message\n");
2153 key_len = ntohs (ais_msg->key_len);
2154 if ((GNUNET_SYSERR ==
2156 key_len,
2157 &identity,
2158 &read)) ||
2159 (read != key_len))
2160 {
2162 "Failed to read private key.\n");
2164 return;
2165 }
2166 ai = GNUNET_new (struct Iterator);
2167 ai->request_id = ntohl (ais_msg->id);
2168 ai->client = idp;
2169 ai->identity = identity;
2170
2171 GNUNET_CONTAINER_DLL_insert (idp->attr_iter_head, idp->attr_iter_tail, ai);
2173 &ai->identity,
2175 ai,
2176 &attr_iter_cb,
2177 ai,
2179 ai);
2181}
static void attr_iter_cb(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Got record.
static void attr_iter_error(void *cls)
Error iterating over attributes.
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:211

References ai, attr_iter_cb(), attr_iter_error(), attr_iter_finished(), GNUNET_RECLAIM_Handle::client, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_NAMESTORE_zone_iteration_start(), GNUNET_new, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, AttributeIterationStartMessage::id, identity, idp, AttributeIterationStartMessage::key_len, and nsh.

Here is the call graph for this function:

◆ handle_iteration_stop()

static void handle_iteration_stop ( void *  cls,
const struct AttributeIterationStopMessage ais_msg 
)
static

Handle iteration stop message from client.

Parameters
clsthe client
ais_msgthe stop message

Definition at line 2191 of file gnunet-service-reclaim.c.

2193{
2194 struct IdpClient *idp = cls;
2195 struct Iterator *ai;
2196 uint32_t rid;
2197
2199 "Received `%s' message\n",
2200 "ATTRIBUTE_ITERATION_STOP");
2201 rid = ntohl (ais_msg->id);
2202 for (ai = idp->attr_iter_head; NULL != ai; ai = ai->next)
2203 if (ai->request_id == rid)
2204 break;
2205 if (NULL == ai)
2206 {
2207 GNUNET_break (0);
2209 return;
2210 }
2211 GNUNET_CONTAINER_DLL_remove (idp->attr_iter_head, idp->attr_iter_tail, ai);
2212 GNUNET_free (ai);
2214}
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:324
struct GNUNET_TRANSPORT_AddressIdentifier * next
Kept in a DLL.

References ai, GNUNET_RECLAIM_Handle::client, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), AttributeIterationStopMessage::id, idp, and GNUNET_TRANSPORT_AddressIdentifier::next.

Here is the call graph for this function:

◆ handle_iteration_next()

static void handle_iteration_next ( void *  cls,
const struct AttributeIterationNextMessage ais_msg 
)
static

Client requests next attribute from iterator.

Parameters
clsthe client
ais_msgthe message

Definition at line 2224 of file gnunet-service-reclaim.c.

2226{
2227 struct IdpClient *idp = cls;
2228 struct Iterator *ai;
2229 uint32_t rid;
2230
2232 "Received ATTRIBUTE_ITERATION_NEXT message\n");
2233 rid = ntohl (ais_msg->id);
2234 for (ai = idp->attr_iter_head; NULL != ai; ai = ai->next)
2235 if (ai->request_id == rid)
2236 break;
2237 if (NULL == ai)
2238 {
2239 GNUNET_break (0);
2241 return;
2242 }
2245}
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:242

References ai, GNUNET_RECLAIM_Handle::client, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NAMESTORE_zone_iterator_next(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), AttributeIterationNextMessage::id, idp, and GNUNET_TRANSPORT_AddressIdentifier::next.

Here is the call graph for this function:

◆ cred_iter_finished()

static void cred_iter_finished ( void *  cls)
static

Done iterating over credentials.

Parameters
clsour iterator handle

Definition at line 2259 of file gnunet-service-reclaim.c.

2260{
2261 struct Iterator *ai = cls;
2262 struct GNUNET_MQ_Envelope *env;
2263 struct CredentialResultMessage *arm;
2264
2265 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending CREDENTIAL_RESULT message\n");
2267 arm->id = htonl (ai->request_id);
2268 arm->credential_len = htons (0);
2269 arm->key_len = htons (0);
2270 GNUNET_MQ_send (ai->client->mq, env);
2271 GNUNET_CONTAINER_DLL_remove (ai->client->cred_iter_head,
2272 ai->client->cred_iter_tail,
2273 ai);
2274 GNUNET_free (ai);
2275}
#define GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_RESULT
Credential is returned from the idp.
Definition: reclaim.h:169
uint16_t credential_len
Length of serialized attribute data.
Definition: reclaim.h:183
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:178
uint16_t key_len
The length of the public key.
Definition: reclaim.h:188

References ai, CredentialResultMessage::credential_len, env, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_RESULT, GNUNET_MQ_msg, GNUNET_MQ_send(), CredentialResultMessage::id, and CredentialResultMessage::key_len.

Referenced by cred_iter_error(), and handle_credential_iteration_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cred_iter_error()

static void cred_iter_error ( void *  cls)
static

Error iterating over credentials.

Abort.

Parameters
clsour attribute iteration handle

Definition at line 2284 of file gnunet-service-reclaim.c.

2285{
2286 struct Iterator *ai = cls;
2287
2288 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to iterate over credentials\n");
2290}
static void cred_iter_finished(void *cls)
Done iterating over credentials.

References ai, cred_iter_finished(), GNUNET_ERROR_TYPE_ERROR, and GNUNET_log.

Referenced by handle_credential_iteration_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cred_iter_cb()

static void cred_iter_cb ( void *  cls,
const struct GNUNET_CRYPTO_PrivateKey zone,
const char *  label,
unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Got record.

Return credential.

Parameters
clsour attribute iterator
zonezone we are iterating
labellabel of the records
rd_countrecord count
rdrecords

Definition at line 2303 of file gnunet-service-reclaim.c.

2308{
2309 struct Iterator *ai = cls;
2310 struct GNUNET_MQ_Envelope *env;
2311 struct CredentialResultMessage *arm;
2313 char *data_tmp;
2314 size_t key_len;
2315 ssize_t written;
2316
2317 if ((rd_count != 1) ||
2319 {
2321 return;
2322 }
2323 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found credential under: %s\n",
2324 label);
2326 "Sending CREDENTIAL_RESULT message\n");
2329 env = GNUNET_MQ_msg_extra (arm,
2330 rd->data_size + key_len,
2332 arm->id = htonl (ai->request_id);
2333 arm->credential_len = htons (rd->data_size);
2334 arm->key_len = htons (key_len);
2335 data_tmp = (char *) &arm[1];
2337 data_tmp,
2338 key_len);
2339 GNUNET_assert (written >= 0);
2340 data_tmp += written;
2341 GNUNET_memcpy (data_tmp, rd->data, rd->data_size);
2342 GNUNET_MQ_send (ai->client->mq, env);
2343}

References ai, CredentialResultMessage::credential_len, GNUNET_GNSRECORD_Data::data, GNUNET_GNSRECORD_Data::data_size, env, GNUNET_assert, GNUNET_CRYPTO_key_get_public(), GNUNET_CRYPTO_public_key_get_length(), GNUNET_CRYPTO_write_public_key_to_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_GNSRECORD_TYPE_RECLAIM_CREDENTIAL, GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_RESULT, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_NAMESTORE_zone_iterator_next(), CredentialResultMessage::id, identity, CredentialResultMessage::key_len, rd, rd_count, and GNUNET_GNSRECORD_Data::record_type.

Referenced by handle_credential_iteration_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_credential_iteration_start()

static enum GNUNET_GenericReturnValue check_credential_iteration_start ( void *  cls,
const struct CredentialIterationStartMessage cis_msg 
)
static

Definition at line 2347 of file gnunet-service-reclaim.c.

2350{
2351 uint16_t size;
2352 size_t key_len;
2353
2354 size = ntohs (cis_msg->header.size);
2355 key_len = ntohs (cis_msg->key_len);
2356
2357 if (size < key_len + sizeof(*cis_msg))
2358 {
2359 GNUNET_break (0);
2360 return GNUNET_SYSERR;
2361 }
2362 return GNUNET_OK;
2363}
struct GNUNET_MessageHeader header
Message.
Definition: reclaim.h:254
uint16_t key_len
The length of the private key.
Definition: reclaim.h:269

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, CredentialIterationStartMessage::header, CredentialIterationStartMessage::key_len, GNUNET_MessageHeader::size, and size.

◆ handle_credential_iteration_start()

static void handle_credential_iteration_start ( void *  cls,
const struct CredentialIterationStartMessage ais_msg 
)
static

Iterate over zone to get attributes.

Parameters
clsour client
ais_msgthe iteration message to start

Definition at line 2373 of file gnunet-service-reclaim.c.

2376{
2377 struct IdpClient *idp = cls;
2378 struct Iterator *ai;
2380 size_t key_len;
2381 size_t read;
2382
2384 "Received CREDENTIAL_ITERATION_START message\n");
2385 key_len = ntohs (ais_msg->key_len);
2386 if ((GNUNET_SYSERR ==
2388 key_len,
2389 &identity,
2390 &read)) ||
2391 (read != key_len))
2392 {
2394 "Failed to read private key.\n");
2396 return;
2397 }
2398 ai = GNUNET_new (struct Iterator);
2399 ai->request_id = ntohl (ais_msg->id);
2400 ai->client = idp;
2401 ai->identity = identity;
2402
2403 GNUNET_CONTAINER_DLL_insert (idp->cred_iter_head, idp->cred_iter_tail,
2404 ai);
2406 &ai->identity,
2408 ai,
2409 &cred_iter_cb,
2410 ai,
2412 ai);
2414}
static void cred_iter_error(void *cls)
Error iterating over credentials.
static void cred_iter_cb(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Got record.
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:259

References ai, GNUNET_RECLAIM_Handle::client, cred_iter_cb(), cred_iter_error(), cred_iter_finished(), GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_NAMESTORE_zone_iteration_start(), GNUNET_new, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, CredentialIterationStartMessage::id, identity, idp, CredentialIterationStartMessage::key_len, and nsh.

Here is the call graph for this function:

◆ handle_credential_iteration_stop()

static void handle_credential_iteration_stop ( void *  cls,
const struct CredentialIterationStopMessage ais_msg 
)
static

Handle iteration stop message from client.

Parameters
clsthe client
ais_msgthe stop message

Definition at line 2424 of file gnunet-service-reclaim.c.

2427{
2428 struct IdpClient *idp = cls;
2429 struct Iterator *ai;
2430 uint32_t rid;
2431
2433 "Received `%s' message\n",
2434 "CREDENTIAL_ITERATION_STOP");
2435 rid = ntohl (ais_msg->id);
2436 for (ai = idp->cred_iter_head; NULL != ai; ai = ai->next)
2437 if (ai->request_id == rid)
2438 break;
2439 if (NULL == ai)
2440 {
2441 GNUNET_break (0);
2443 return;
2444 }
2445 GNUNET_CONTAINER_DLL_remove (idp->cred_iter_head, idp->cred_iter_tail,
2446 ai);
2447 GNUNET_free (ai);
2449}
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:307

References ai, GNUNET_RECLAIM_Handle::client, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), CredentialIterationStopMessage::id, idp, and GNUNET_TRANSPORT_AddressIdentifier::next.

Here is the call graph for this function:

◆ handle_credential_iteration_next()

static void handle_credential_iteration_next ( void *  cls,
const struct CredentialIterationNextMessage ais_msg 
)
static

Client requests next credential from iterator.

Parameters
clsthe client
ais_msgthe message

Definition at line 2459 of file gnunet-service-reclaim.c.

2462{
2463 struct IdpClient *idp = cls;
2464 struct Iterator *ai;
2465 uint32_t rid;
2466
2468 "Received CREDENTIAL_ITERATION_NEXT message\n");
2469 rid = ntohl (ais_msg->id);
2470 for (ai = idp->cred_iter_head; NULL != ai; ai = ai->next)
2471 if (ai->request_id == rid)
2472 break;
2473 if (NULL == ai)
2474 {
2475 GNUNET_break (0);
2477 return;
2478 }
2481}
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:290

References ai, GNUNET_RECLAIM_Handle::client, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NAMESTORE_zone_iterator_next(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), CredentialIterationNextMessage::id, idp, and GNUNET_TRANSPORT_AddressIdentifier::next.

Here is the call graph for this function:

◆ ticket_iter_cb()

static void ticket_iter_cb ( void *  cls,
struct GNUNET_RECLAIM_Ticket ticket 
)
static

Got a ticket.

Return to client

Parameters
clsour ticket iterator
ticketthe ticket

Definition at line 2495 of file gnunet-service-reclaim.c.

2496{
2497 struct TicketIteration *ti = cls;
2498 struct GNUNET_MQ_Envelope *env;
2499 struct TicketResultMessage *trm;
2500 size_t tkt_len;
2501
2502 if (NULL == ticket)
2503 tkt_len = 0;
2504 else
2506
2507 env = GNUNET_MQ_msg_extra (trm,
2508 tkt_len,
2510 if (NULL == ticket)
2511 {
2512 /* send empty response to indicate end of list */
2515 ti);
2516 }
2517 else
2518 {
2520 &trm[1],
2521 tkt_len);
2522 }
2523 trm->id = htonl (ti->r_id);
2524 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending TICKET_RESULT message\n");
2525 trm->tkt_len = htons (tkt_len);
2526 trm->presentations_len = htons (0);
2527 GNUNET_MQ_send (ti->client->mq, env);
2528 if (NULL == ticket)
2529 GNUNET_free (ti);
2530}
struct TicketIteration * ticket_iter_tail
Tail of DLL of ticket iteration ops.
struct TicketIteration * ticket_iter_head
Head of DLL of ticket iteration ops.
struct IdpClient * client
Client which intiated this zone iteration.
uint32_t r_id
The operation id for the iteration in the response for the client.

References TicketIteration::client, env, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_RECLAIM_ticket_serialize_get_size(), GNUNET_RECLAIM_write_ticket_to_buffer(), TicketResultMessage::id, IdpClient::mq, TicketResultMessage::presentations_len, TicketIteration::r_id, ticket, IdpClient::ticket_iter_head, IdpClient::ticket_iter_tail, and TicketResultMessage::tkt_len.

Referenced by handle_ticket_iteration_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_ticket_iteration_start()

static enum GNUNET_GenericReturnValue check_ticket_iteration_start ( void *  cls,
const struct TicketIterationStartMessage tis_msg 
)
static

Definition at line 2534 of file gnunet-service-reclaim.c.

2537{
2538 uint16_t size;
2539 size_t key_len;
2540
2541 size = ntohs (tis_msg->header.size);
2542 key_len = ntohs (tis_msg->key_len);
2543
2544 if (size < key_len + sizeof(*tis_msg))
2545 {
2546 GNUNET_break (0);
2547 return GNUNET_SYSERR;
2548 }
2549 return GNUNET_OK;
2550}
uint16_t key_len
The length of the private key.
Definition: reclaim.h:350
struct GNUNET_MessageHeader header
Message.
Definition: reclaim.h:335

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, TicketIterationStartMessage::header, TicketIterationStartMessage::key_len, GNUNET_MessageHeader::size, and size.

◆ handle_ticket_iteration_start()

static void handle_ticket_iteration_start ( void *  cls,
const struct TicketIterationStartMessage tis_msg 
)
static

Client requests a ticket iteration.

Parameters
clsthe client
tis_msgthe iteration request message

Definition at line 2560 of file gnunet-service-reclaim.c.

2563{
2565 struct IdpClient *client = cls;
2566 struct TicketIteration *ti;
2567 size_t key_len;
2568 size_t read;
2569
2571 "Received TICKET_ITERATION_START message\n");
2572 key_len = ntohs (tis_msg->key_len);
2573 if ((GNUNET_SYSERR ==
2575 key_len,
2576 &identity,
2577 &read)) ||
2578 (read != key_len))
2579 {
2581 "Failed to read private key\n");
2583 return;
2584 }
2585 ti = GNUNET_new (struct TicketIteration);
2586 ti->r_id = ntohl (tis_msg->id);
2587 ti->client = client;
2590 ti);
2591 ti->iter
2594}
static void ticket_iter_cb(void *cls, struct GNUNET_RECLAIM_Ticket *ticket)
Got a ticket.
struct RECLAIM_TICKETS_Iterator * RECLAIM_TICKETS_iteration_start(const struct GNUNET_CRYPTO_PrivateKey *identity, RECLAIM_TICKETS_TicketIter cb, void *cb_cls)
Iterate over all tickets issued by an identity.
struct GNUNET_SERVICE_Client * client
The client.
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:340

References TicketIteration::client, IdpClient::client, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_read_private_key_from_buffer(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_new, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SYSERR, TicketIterationStartMessage::id, identity, TicketIteration::iter, TicketIterationStartMessage::key_len, TicketIteration::r_id, RECLAIM_TICKETS_iteration_start(), ticket_iter_cb(), IdpClient::ticket_iter_head, and IdpClient::ticket_iter_tail.

Here is the call graph for this function:

◆ handle_ticket_iteration_stop()

static void handle_ticket_iteration_stop ( void *  cls,
const struct TicketIterationStopMessage tis_msg 
)
static

Client has had enough tickets.

Parameters
clsthe client
tis_msgthe stop message

Definition at line 2604 of file gnunet-service-reclaim.c.

2606{
2607 struct IdpClient *client = cls;
2608 struct TicketIteration *ti;
2609 uint32_t rid;
2610
2612 "Received `%s' message\n",
2613 "TICKET_ITERATION_STOP");
2614 rid = ntohl (tis_msg->id);
2615 for (ti = client->ticket_iter_head; NULL != ti; ti = ti->next)
2616 if (ti->r_id == rid)
2617 break;
2618 if (NULL == ti)
2619 {
2620 GNUNET_break (0);
2622 return;
2623 }
2627 ti);
2628 GNUNET_free (ti);
2630}
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:388
struct TicketIteration * next
DLL.

References TicketIteration::client, IdpClient::client, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), TicketIterationStopMessage::id, TicketIteration::iter, TicketIteration::next, TicketIteration::r_id, RECLAIM_TICKETS_iteration_stop(), IdpClient::ticket_iter_head, and IdpClient::ticket_iter_tail.

Here is the call graph for this function:

◆ handle_ticket_iteration_next()

static void handle_ticket_iteration_next ( void *  cls,
const struct TicketIterationNextMessage tis_msg 
)
static

Client requests next result.

Parameters
clsthe client
tis_msgthe message

Definition at line 2640 of file gnunet-service-reclaim.c.

2642{
2643 struct IdpClient *client = cls;
2644 struct TicketIteration *ti;
2645 uint32_t rid;
2646
2648 "Received TICKET_ITERATION_NEXT message\n");
2649 rid = ntohl (tis_msg->id);
2650 for (ti = client->ticket_iter_head; NULL != ti; ti = ti->next)
2651 if (ti->r_id == rid)
2652 break;
2653 if (NULL == ti)
2654 {
2655 GNUNET_break (0);
2657 return;
2658 }
2661}
void RECLAIM_TICKETS_iteration_next(struct RECLAIM_TICKETS_Iterator *iter)
Continue ticket iteration.
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:371

References TicketIteration::client, IdpClient::client, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), TicketIterationNextMessage::id, TicketIteration::iter, TicketIteration::next, TicketIteration::r_id, RECLAIM_TICKETS_iteration_next(), and IdpClient::ticket_iter_head.

Here is the call graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle c,
struct GNUNET_SERVICE_Handle server 
)
static

Main function that will be run.

Parameters
clsclosure
cthe configuration used
serverthe service handle

Definition at line 2672 of file gnunet-service-reclaim.c.

2675{
2676 cfg = c;
2677
2679 {
2681 "Unable to initialize TICKETS subsystem.\n");
2683 return;
2684 }
2685 // Connect to identity and namestore services
2687 if (NULL == nsh)
2688 {
2690 "error connecting to namestore");
2691 }
2692
2694}
static const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
int RECLAIM_TICKETS_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize tickets component.
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
struct GNUNET_NAMESTORE_Handle * GNUNET_NAMESTORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the namestore service.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:567
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1340

References cfg, do_shutdown(), GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_log_strerror, GNUNET_NAMESTORE_connect(), GNUNET_OK, GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), nsh, and RECLAIM_TICKETS_init().

Here is the call graph for this function:

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  app_ctx 
)
static

Called whenever a client is disconnected.

Parameters
clsclosure
clientidentification of the client
app_ctxclient

Definition at line 2705 of file gnunet-service-reclaim.c.

2708{
2709 struct IdpClient *idp = app_ctx;
2710
2711 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p disconnected\n", client);
2714 idp);
2716}
static struct IdpClient * client_list_tail
Client list.
static struct IdpClient * client_list_head
Client list.
static void cleanup_client(struct IdpClient *idp)
Cleanup client.

References cleanup_client(), IdpClient::client, client_list_head, client_list_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, and idp.

Here is the call graph for this function:

◆ client_connect_cb()

static void * client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

Add a client to our list of active clients.

Parameters
clsNULL
clientclient to add
mqmessage queue for client
Returns
internal namestore client structure for this client

Definition at line 2728 of file gnunet-service-reclaim.c.

2731{
2732 struct IdpClient *idp;
2733
2734 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p connected\n", client);
2735 idp = GNUNET_new (struct IdpClient);
2736 idp->client = client;
2737 idp->mq = mq;
2740 idp);
2741 return idp;
2742}
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
struct GNUNET_MQ_Handle * mq
Connection to service (if available).
Definition: reclaim_api.c:390

References IdpClient::client, GNUNET_RECLAIM_Handle::client, client_list_head, client_list_tail, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, idp, mq, and GNUNET_RECLAIM_Handle::mq.

◆ GNUNET_SERVICE_MAIN()

GNUNET_SERVICE_MAIN ( "reclaim"  ,
GNUNET_SERVICE_OPTION_NONE  ,
run,
client_connect_cb,
client_disconnect_cb,
NULL  ,
GNUNET_MQ_hd_var_size(attribute_store_message, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_STORE, struct AttributeStoreMessage, NULL)  ,
GNUNET_MQ_hd_var_size(credential_store_message, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_STORE, struct AttributeStoreMessage, NULL)  ,
GNUNET_MQ_hd_var_size(attribute_delete_message, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_DELETE, struct AttributeDeleteMessage, NULL)  ,
GNUNET_MQ_hd_var_size(credential_delete_message, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_DELETE, struct AttributeDeleteMessage, NULL)  ,
GNUNET_MQ_hd_var_size(iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_START, struct AttributeIterationStartMessage, NULL)  ,
GNUNET_MQ_hd_fixed_size(iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_NEXT, struct AttributeIterationNextMessage, NULL)  ,
GNUNET_MQ_hd_fixed_size(iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_STOP, struct AttributeIterationStopMessage, NULL)  ,
GNUNET_MQ_hd_var_size(credential_iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_START, struct CredentialIterationStartMessage, NULL)  ,
GNUNET_MQ_hd_fixed_size(credential_iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_NEXT, struct CredentialIterationNextMessage, NULL)  ,
GNUNET_MQ_hd_fixed_size(credential_iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_STOP, struct CredentialIterationStopMessage, NULL)  ,
GNUNET_MQ_hd_var_size(issue_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_ISSUE_TICKET, struct IssueTicketMessage, NULL)  ,
GNUNET_MQ_hd_var_size(consume_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET, struct ConsumeTicketMessage, NULL)  ,
GNUNET_MQ_hd_var_size(ticket_iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_START, struct TicketIterationStartMessage, NULL)  ,
GNUNET_MQ_hd_fixed_size(ticket_iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_NEXT, struct TicketIterationNextMessage, NULL)  ,
GNUNET_MQ_hd_fixed_size(ticket_iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_STOP, struct TicketIterationStopMessage, NULL)  ,
GNUNET_MQ_hd_var_size(revoke_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET, struct RevokeTicketMessage, NULL)  ,
GNUNET_MQ_handler_end()   
)

Define "main" method using service macro.

Variable Documentation

◆ nsh

◆ timeout_task

struct GNUNET_SCHEDULER_Task* timeout_task
static

Timeout task.

Definition at line 43 of file gnunet-service-reclaim.c.

Referenced by cleanup().

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

Our configuration.

Definition at line 48 of file gnunet-service-reclaim.c.

Referenced by run().

◆ client_list_head

struct IdpClient* client_list_head = NULL
static

Client list.

Definition at line 472 of file gnunet-service-reclaim.c.

Referenced by client_connect_cb(), and client_disconnect_cb().

◆ client_list_tail

struct IdpClient* client_list_tail = NULL
static

Client list.

Definition at line 477 of file gnunet-service-reclaim.c.

Referenced by client_connect_cb(), and client_disconnect_cb().