1 #ifndef __ISDS_ISDS_H__
2 #define __ISDS_ISDS_H__
4 /* Public interface for libisds.
5 * Private declarations in isds_priv.h. */
7 #include <stdlib.h> /* For size_t */
8 #include <time.h> /* For struct tm */
9 #include <sys/time.h> /* For struct timeval */
10 #include <libxml/tree.h> /* For xmlDoc and xmlNodePtr */
12 #ifdef __cplusplus /* For C++ linker sake */
16 /* _deprecated macro marks library symbols as deprecated. Application should
17 * avoid using such function as soon as possible. */
19 #define _deprecated __attribute__((deprecated))
24 /* Service locators */
25 /* Base URL of production ISDS instance */
26 extern const char isds_locator
[]; /* Without client certificate auth. */
27 extern const char isds_cert_locator
[]; /* With client certificate auth. */
28 extern const char isds_otp_locator
[]; /* With OTP authentication */
29 /* Base URL of testing ISDS instance */
30 extern const char isds_testing_locator
[]; /* Without client certificate */
31 extern const char isds_cert_testing_locator
[]; /* With client certificate */
32 extern const char isds_otp_testing_locator
[]; /* With OTP authentication */
35 struct isds_ctx
; /* Context for specific ISDS box */
38 IE_SUCCESS
= 0, /* No error, just for C convenience (0 means Ok) */
39 IE_ERROR
, /* Unspecified error */
85 /* Return text description of ISDS error */
86 const char *isds_strerror(const isds_error error
);
90 IOPT_TLS_VERIFY_SERVER
, /* _Bool: Verify server identity?
91 Default value is true. */
92 IOPT_TLS_CA_FILE
, /* char *: File name with CA certificates.
93 Default value depends on cryptographic
95 IOPT_TLS_CA_DIRECTORY
, /* char *: Directory name with CA certificates.
96 Default value depends on cryptographic
98 IOPT_TLS_CRL_FILE
, /* char *: File name with CRL in PEM format.
99 Default value depends on cryptographic
101 IOPT_NORMALIZE_MIME_TYPE
, /* _Bool: Normalize MIME type values?
102 Default value is false. */
105 /* TLS libisds options */
107 ITLS_VERIFY_SERVER
, /* _Bool: Verify server identity? */
108 ITLS_CA_FILE
, /* char *: File name with CA certificates */
109 ITLS_CA_DIRECTORY
, /* char *: Directory name with CA certificates */
110 ITLS_CRL_FILE
/* char *: File name with CRL in PEM format */
113 /* Cryptographic material encoding */
115 PKI_FORMAT_PEM
, /* PEM format */
116 PKI_FORMAT_DER
, /* DER format */
117 PKI_FORMAT_ENG
/* Stored in crypto engine */
120 /* Public key crypto material to authenticate client */
121 struct isds_pki_credentials
{
122 char *engine
; /* String identifier of crypto engine to use
123 (where key is stored). Use NULL for no engine */
124 isds_pki_format certificate_format
; /* Certificate format */
125 char *certificate
; /* Path to client certificate, or certificate
126 nickname in case of NSS as curl back-end,
127 or key slot identifier inside crypto engine.
128 Some crypto engines can pair certificate with
129 key automatically (NULL value) */
130 isds_pki_format key_format
; /* Private key format */
131 char *key
; /* Path to client private key, or key identifier
132 in case of used engine */
133 char *passphrase
; /* Zero terminated string with password for
134 decrypting private key, or engine PIN.
135 Use NULL for no pass-phrase or question by
139 /* One-time password authentication method */
141 OTP_HMAC
= 0, /* HMAC-based OTP method */
142 OTP_TIME
/* Time-based OTP method */
145 /* One-time passwed authentication resolution */
147 OTP_RESOLUTION_SUCCESS
= 0, /* Authentication succeded */
148 OTP_RESOLUTION_UNKNOWN
, /* Status is unkown */
149 OTP_RESOLUTION_BAD_AUTHENTICATION
, /* Bad log-in, retry */
150 OTP_RESOLUTION_ACCESS_BLOCKED
, /* Access blocked for 60 minutes
151 (brute force attack detected) */
152 OTP_RESOLUTION_PASSWORD_EXPIRED
, /* Password has expired.
153 ???: OTP or regular password
155 OTP_RESOLUTION_TO_FAST
, /* OTP cannot be sent repeatedly
156 at this rate (minimal delay
157 depends on TOTP window setting) */
158 OTP_RESOLUTION_UNAUTHORIZED
, /* User name is not allowed to
159 access requested URI */
160 OTP_RESOLUTION_TOTP_SENT
, /* OTP has been generated and sent by
162 OTP_RESOLUTION_TOTP_NOT_SENT
, /* OTP could not been sent.
164 } isds_otp_resolution
;
166 /* One-time password to authenticate client */
169 isds_otp_method method
; /* Select OTP method to use */
170 char *otp_code
; /* One-time password to use. Pass NULL,
171 if you do not know it yet (e.g. in case
172 of first phase of time-based OTP to
173 request new code from ISDS.) */
175 isds_otp_resolution resolution
; /* Fine-grade resolution of OTP
176 authentication attempt. */
181 DBTYPE_SYSTEM
= 0, /* This is special sender value for messages
184 DBTYPE_OVM_NOTAR
= 11,
185 DBTYPE_OVM_EXEKUT
= 12,
191 DBTYPE_PFO_ADVOK
= 31,
192 DBTYPE_PFO_DANPOR
= 32,
193 DBTYPE_PFO_INSSPR
= 33,
197 /* Box status from point of view of accessibility */
199 DBSTATE_ACCESSIBLE
= 1,
200 DBSTATE_TEMP_UNACCESSIBLE
= 2,
201 DBSTATE_NOT_YET_ACCESSIBLE
= 3,
202 DBSTATE_PERM_UNACCESSIBLE
= 4,
206 /* User permissions from point of view of ISDS.
207 * Instances can be bitmaps of any discrete values. */
209 PRIVIL_READ_NON_PERSONAL
= 0x1, /* Can download and read messages with
210 dmPersonalDelivery == false */
211 PRIVIL_READ_ALL
= 0x2, /* Can download and read messages with
212 dmPersonalDelivery == true */
213 PRIVIL_CREATE_DM
= 0x4, /* Can create and sent messages,
214 can download outgoing (sent) messages */
215 PRIVIL_VIEW_INFO
= 0x8, /* Can list messages and data about
217 PRIVIL_SEARCH_DB
= 0x10, /* Can search for boxes */
218 PRIVIL_OWNER_ADM
= 0x20, /* Can administer his box (add/remove
219 permitted users and theirs
221 PRIVIL_READ_VAULT
= 0x40, /* Can read message stored in long term
222 storage (does not exists since
224 PRIVIL_ERASE_VAULT
= 0x80 /* Can delete messages from long term
230 MESSAGESTATE_SENT
= 0x2, /* Message has been put into ISDS */
231 MESSAGESTATE_STAMPED
= 0x4, /* Message stamped by TSA */
232 MESSAGESTATE_INFECTED
= 0x8, /* Message included viruses,
233 infected document has been removed */
234 MESSAGESTATE_DELIVERED
= 0x10, /* Message delivered
235 (dmDeliveryTime stored) */
236 MESSAGESTATE_SUBSTITUTED
= 0x20, /* Message delivered through fiction,
237 dmAcceptanceTime stored */
238 MESSAGESTATE_RECEIVED
= 0x40, /* Message accepted (by user log-in or
239 user explicit request),
240 dmAcceptanceTime stored */
241 MESSAGESTATE_READ
= 0x80, /* Message has been read by user */
242 MESSAGESTATE_UNDELIVERABLE
= 0x100, /* Message could not been delivered
243 (e.g. recipient box has been made
244 inaccessible meantime) */
245 MESSAGESTATE_REMOVED
= 0x200, /* Message content deleted */
246 MESSAGESTATE_IN_SAFE
= 0x400 /* Message stored in long term storage */
247 } isds_message_status
;
248 #define MESSAGESTATE_ANY 0x7FE /* Union of all isds_message_status
251 /* Hash algorithm types */
254 HASH_ALGORITHM_SHA_1
,
255 HASH_ALGORITHM_SHA_224
,
256 HASH_ALGORITHM_SHA_256
,
257 HASH_ALGORITHM_SHA_384
,
258 HASH_ALGORITHM_SHA_512
,
259 } isds_hash_algorithm
;
261 /* Buffer storage strategy.
262 * How function should embed application provided buffer into raw element of
263 * output structure. */
265 BUFFER_DONT_STORE
, /* Don't fill raw member */
266 BUFFER_COPY
, /* Copy buffer content into newly allocated raw */
267 BUFFER_MOVE
/* Just copy pointer.
268 But leave deallocation to isds_*_free(). */
269 } isds_buffer_strategy
;
271 /* Hash value storage */
273 isds_hash_algorithm algorithm
; /* Hash algorithm */
274 size_t length
; /* Hash value length in bytes */
275 void *value
; /* Hash value */
279 struct isds_PersonName
{
283 char *pnLastNameAtBirth
;
286 /* Date and place of birth */
287 struct isds_BirthInfo
{
288 struct tm
*biDate
; /* Date of Birth in local time at birth place,
289 only tm_year, tm_mon and tm_mday carry sane
292 char *biCounty
; /* German: Bezirk, Czech: okres */
297 struct isds_Address
{
300 char *adNumberInStreet
;
301 char *adNumberInMunicipality
;
306 /* Data about box and his owner.
307 * NULL pointer means undefined value */
308 struct isds_DbOwnerInfo
{
309 char *dbID
; /* Box ID [Max. 7 chars] */
310 isds_DbType
*dbType
; /* Box Type */
312 struct isds_PersonName
*personName
; /* Name of person */
313 char *firmName
; /* Name of firm */
314 struct isds_BirthInfo
*birthInfo
; /* Birth of person */
315 struct isds_Address
*address
; /* Post address */
319 char *identifier
; /* External box identifier for data
320 provider (OVM, PO, maybe PFO)
322 char *registryCode
; /* PFO External registry code
324 long int *dbState
; /* Box state; 1 <=> active box;
325 long int because xsd:integer
327 _Bool
*dbEffectiveOVM
; /* Box has OVM role (§ 5a) */
328 _Bool
*dbOpenAddressing
; /* Non-OVM Box is free to receive
329 messages from anybody */
334 USERTYPE_PRIMARY
, /* Owner of the box */
335 USERTYPE_ENTRUSTED
, /* User with limited access to the box */
336 USERTYPE_ADMINISTRATOR
, /* User to manage ENTRUSTED_USERs */
337 USERTYPE_OFFICIAL
, /* ??? */
338 USERTYPE_OFFICIAL_CERT
, /* ??? */
339 USERTYPE_LIQUIDATOR
/* Company liquidator */
343 * NULL pointer means undefined value */
344 struct isds_DbUserInfo
{
345 char *userID
; /* User ID [Min. 6, max. 12 characters] */
346 isds_UserType
*userType
; /* User type */
347 long int *userPrivils
; /* Set of user permissions */
348 struct isds_PersonName
*personName
; /* Name of the person */
349 struct isds_Address
*address
; /* Post address */
350 struct tm
*biDate
; /* Date of birth in local time,
351 only tm_year, tm_mon and tm_mday carry sane
353 char *ic
; /* ID of a supervising firm [Max. 8 chars] */
354 char *firmName
; /* Name of a supervising firm
356 char *caStreet
; /* Street and number of contact address */
357 char *caCity
; /* Czech City of contact address */
358 char *caZipCode
; /* Post office code of contact address */
359 char *caState
; /* Abbreviated country of contact address;
360 Implicit value is "CZ"; Optional. */
361 char *aifo_ticket
; /* AIFO ticket; Optional. */
364 /* Message event type */
366 EVENT_UKNOWN
, /* Event unknown to this library */
367 EVENT_ACCEPTED_BY_RECIPIENT
, /* Message has been delivered and accepted
368 by recipient action */
369 EVENT_ACCEPTED_BY_FICTION
, /* Message has been delivered, acceptance
370 timed out, considered as accepted */
371 EVENT_UNDELIVERABLE
, /* Recipient box made inaccessible,
372 thus message is undeliverable */
373 EVENT_COMMERCIAL_ACCEPTED
, /* Recipient confirmed acceptance of
374 commercial message */
375 EVENT_ENTERED_SYSTEM
, /* Message entered ISDS, i.e. has been just
377 EVENT_DELIVERED
, /* Message has been delivered */
378 EVENT_PRIMARY_LOGIN
, /* Primary user has logged in */
379 EVENT_ENTRUSTED_LOGIN
, /* Entrusted user with capability to read
381 EVENT_SYSCERT_LOGIN
/* Application authenticated by `system'
382 certificate has logged in */
386 * All members are optional as specification states so. */
388 struct timeval
*time
; /* When the event occurred */
389 isds_event_type
*type
; /* Type of the event */
390 char *description
; /* Human readable event description
391 generated by ISDS (Czech) */
395 * Be ware that the string length constraints are forced only on output
396 * members transmitted to ISDS. The other direction (downloaded from ISDS)
397 * can break these rules. It should not happen, but nobody knows how much
398 * incompatible new version of ISDS protocol will be. This is the gold
399 * Internet rule: be strict on what you put, be tolerant on what you get. */
400 struct isds_envelope
{
401 /* Following members apply to incoming messages only: */
402 char *dmID
; /* Message ID.
403 Maximal length is 20 characters. */
404 char *dbIDSender
; /* Box ID of sender.
405 Special value "aaaaaaa" means sent by
407 Maximal length is 7 characters. */
408 char *dmSender
; /* Sender name;
409 Maximal length is 100 characters. */
410 char *dmSenderAddress
; /* Postal address of sender;
411 Maximal length is 100 characters. */
412 long int *dmSenderType
; /* Gross Box type of sender
413 TODO: isds_DbType ? */
414 char *dmRecipient
; /* Recipient name;
415 Maximal length is 100 characters. */
416 char *dmRecipientAddress
; /* Postal address of recipient;
417 Maximal length is 100 characters. */
418 _Bool
*dmAmbiguousRecipient
; /* Recipient has OVM role */
420 /* Following members are assigned by ISDS in different phases of message
422 unsigned long int *dmOrdinal
; /* Ordinal number in list of
423 incoming/outgoing messages */
424 isds_message_status
*dmMessageStatus
; /* Message state */
425 long int *dmAttachmentSize
; /* Size of message documents in
426 kilobytes (rounded). */
427 struct timeval
*dmDeliveryTime
; /* Time of delivery into a box
428 NULL, if message has not been
430 struct timeval
*dmAcceptanceTime
; /* Time of acceptance of the message
431 by an user. NULL if message has not
432 been accepted yet. */
433 struct isds_hash
*hash
; /* Message hash.
434 This is hash of isds:dmDM subtree. */
435 void *timestamp
; /* Qualified time stamp; Optional. */
436 size_t timestamp_length
; /* Length of timestamp in bytes */
437 struct isds_list
*events
; /* Events message passed trough;
438 List of isds_event's. */
441 /* Following members apply to both outgoing and incoming messages: */
442 char *dmSenderOrgUnit
; /* Organisation unit of sender as string;
444 long int *dmSenderOrgUnitNum
; /* Organisation unit of sender as number;
446 char *dbIDRecipient
; /* Box ID of recipient; Mandatory.
447 Maximal length is 7 characters. */
448 char *dmRecipientOrgUnit
; /* Organisation unit of recipient as
450 long int *dmRecipientOrgUnitNum
; /* Organisation unit of recipient as
452 char *dmToHands
; /* Person in recipient organisation;
454 char *dmAnnotation
; /* Subject (title) of the message.
455 Maximal length is 255 characters. */
456 char *dmRecipientRefNumber
; /* Czech: číslo jednací příjemce; Optional.
457 Maximal length is 50 characters. */
458 char *dmSenderRefNumber
; /* Czech: číslo jednací odesílatele;
459 Optional. Maximal length is 50 chars. */
460 char *dmRecipientIdent
; /* Czech: spisová značka příjemce; Optional.
461 Maximal length is 50 characters. */
462 char *dmSenderIdent
; /* Czech: spisová značka odesílatele;
463 Optional. Maximal length is 50 chars. */
465 /* Act addressing in Czech Republic:
466 * Point (Paragraph) § Section Law/Year Coll. */
467 long int *dmLegalTitleLaw
; /* Number of act mandating authority */
468 long int *dmLegalTitleYear
; /* Year of act issue mandating authority */
469 char *dmLegalTitleSect
; /* Section of act mandating authority.
471 char *dmLegalTitlePar
; /* Paragraph of act mandating authority.
473 char *dmLegalTitlePoint
; /* Point of act mandating authority.
476 _Bool
*dmPersonalDelivery
; /* If true, only person with higher
477 privileges can read this message */
478 _Bool
*dmAllowSubstDelivery
; /* Allow delivery through fiction.
479 I.e. Even if recipient did not read this
480 message, message is considered as
481 delivered after (currently) 10 days.
482 This is delivery through fiction.
483 Applies only to OVM dbType sender. */
484 char *dmType
; /* Message type (commercial subtypes or
486 Input values (when sending a message):
487 "I" is commercial message offering
488 paying the response (initiatory
490 it's necessary to define
492 "K" is commercial message paid by sender
494 "O" is commercial response paid by
495 sender of initiatory message; it's
496 necessary to copy value from
497 dmSenderRefNumber of initiatory
498 message to dmRecipientRefNumber
500 "V" is noncommercial government message
501 Default value while sending is undefined
502 which has the same meaning as "V".
503 Output values (when retrieving
505 "A" is subsidized initiatory commercial
506 message which can pay a response
507 "B" is subsidized initiatory commercial
508 message which has already paid the
510 "C" is subsidized initiatory commercial
511 message where the response offer has
513 "D" is externally subsidized commercial
515 "E" is commercial message prepaid by
517 "G" is commerical message paid by
523 "X" is initiatory commercial message
524 where the response offer has expired
525 "Y" initiatory commercial message which
526 has already paid the response
527 "Z" is limitedly subsidized commercial
529 Length: Exactly 1 UTF-8 character if
532 /* Following members apply to outgoing messages only: */
533 _Bool
*dmOVM
; /* OVM sending mode.
534 Non-OVM dbType boxes that has
535 dbEffectiveOVM == true MUST select
536 between true (OVM mode) and
537 false (non-OVM mode).
538 Optional; Implicit value is true. */
539 _Bool
*dmPublishOwnID
; /* Allow sender to express his name shall
540 be available to recipient by
541 isds_get_message_sender(). Sender type
542 will be always available.
543 Optional; Default value is false. */
547 /* Document type from point of hierarchy */
549 FILEMETATYPE_MAIN
, /* Main document */
550 FILEMETATYPE_ENCLOSURE
, /* Appendix */
551 FILEMETATYPE_SIGNATURE
, /* Digital signature of other document */
552 FILEMETATYPE_META
/* XML document for ESS (electronic
553 document information system) purposes */
557 struct isds_document
{
558 _Bool is_xml
; /* True if document is ISDS XML document.
559 False if document is ISDS binary
561 xmlNodePtr xml_node_list
; /* XML node-set presenting current XML
562 document content. This is pointer to
563 first node of the document in
564 isds_message.xml tree. Use `children'
565 and `next' members to iterate the
567 It will be NULL if document is empty.
568 Valid only if is_xml is true. */
569 void *data
; /* Document content.
570 The encoding and interpretation depends
572 Valid only if is_xml is false. */
573 size_t data_length
; /* Length of the data in bytes.
574 Valid only if is_xml is false. */
576 char *dmMimeType
; /* MIME type of data; Mandatory. */
577 isds_FileMetaType dmFileMetaType
; /* Document type to create hierarchy */
578 char *dmFileGuid
; /* Message-local document identifier;
580 char *dmUpFileGuid
; /* Reference to upper document identifier
581 (dmFileGuid); Optional. */
582 char *dmFileDescr
; /* Document name (title). E.g. file name;
584 char *dmFormat
; /* Reference to XML form definition;
585 Defines how to interpret XML document;
589 /* Raw message representation content type.
590 * This is necessary to distinguish between different representations without
591 * expensive repeated detection.
593 * PLAIN_SIGNED data are XML with namespace mangled to signed alternative
594 * CMS_SIGNED data are XML with signed namespace encapsulated in CMS */
596 RAWTYPE_INCOMING_MESSAGE
,
597 RAWTYPE_PLAIN_SIGNED_INCOMING_MESSAGE
,
598 RAWTYPE_CMS_SIGNED_INCOMING_MESSAGE
,
599 RAWTYPE_PLAIN_SIGNED_OUTGOING_MESSAGE
,
600 RAWTYPE_CMS_SIGNED_OUTGOING_MESSAGE
,
601 RAWTYPE_DELIVERYINFO
,
602 RAWTYPE_PLAIN_SIGNED_DELIVERYINFO
,
603 RAWTYPE_CMS_SIGNED_DELIVERYINFO
607 struct isds_message
{
608 void *raw
; /* Raw message in XML format as send to or
609 from the ISDS. You can use it to store
610 local copy. This is binary buffer. */
611 size_t raw_length
; /* Length of raw message in bytes */
612 isds_raw_type raw_type
; /* Content type of raw representation
613 Meaningful only with non-NULL raw
615 xmlDocPtr xml
; /* Parsed XML document with attached ISDS
616 message XML documents.
617 Can be NULL. May be freed AFTER deallocating
618 documents member structure. */
619 struct isds_envelope
*envelope
; /* Message envelope */
620 struct isds_list
*documents
; /* List of isds_document's.
621 Valid message must contain exactly one
622 document of type FILEMETATYPE_MAIN and
623 can contain any number of other type
624 documents. Total size of documents
625 must not exceed 10 MB. */
628 /* Message copy recipient and assigned message ID */
629 struct isds_message_copy
{
630 /* Input members defined by application */
631 char *dbIDRecipient
; /* Box ID of recipient; Mandatory.
632 Maximal length is 7 characters. */
633 char *dmRecipientOrgUnit
; /* Organisation unit of recipient as
635 long int *dmRecipientOrgUnitNum
; /* Organisation unit of recipient as
637 char *dmToHands
; /* Person in recipient organisation;
640 /* Output members returned from ISDS */
641 isds_error error
; /* libisds compatible error of delivery to o ne recipient */
642 char *dmStatus
; /* Error description returned by ISDS;
644 char *dmID
; /* Assigned message ID; Meaningful only
645 for error == IE_SUCCESS */
648 /* Message state change event */
649 struct isds_message_status_change
{
650 char *dmID
; /* Message ID. */
651 isds_message_status
*dmMessageStatus
; /* Message state */
652 struct timeval
*time
; /* When the state changed */
655 /* How outgoing commercial message gets paid */
657 PAYMENT_SENDER
, /* Payed by a sender */
658 PAYMENT_STAMP
, /* Pre-paid by a sender */
659 PAYMENT_SPONSOR
, /* A sponsor pays all messages */
660 PAYMENT_RESPONSE
, /* Recipient pays a response */
661 PAYMENT_SPONSOR_LIMITED
, /* Undocumented */
662 PAYMENT_SPONSOR_EXTERNAL
/* Undocomented */
665 /* Permission to send commercial message */
666 struct isds_commercial_permission
{
667 isds_payment_type type
; /* Payment method */
668 char *recipient
; /* Send to this box ID only;
669 NULL means to anybody. */
670 char *payer
; /* Owner of this box ID pays */
671 struct timeval
*expiration
; /* This permissions is valid until;
672 NULL means indefinitivly. */
673 unsigned long int *count
; /* Number of messages that can be sent
675 NULL means unlimited. */
676 char *reply_identifier
; /* Identifier to pair request and response
677 message. Meaningful only with type
681 /* Type of credit change event */
683 ISDS_CREDIT_CHARGED
, /* Credit has been charged */
684 ISDS_CREDIT_DISCHARGED
, /* Credit has been discharged */
685 ISDS_CREDIT_MESSAGE_SENT
, /* Credit has been spent for sending
686 a commerical message */
687 ISDS_CREDIT_STORAGE_SET
, /* Credit has been spent for setting
688 a long-term storage */
689 ISDS_CREDIT_EXPIRED
/* Credit has expired */
690 } isds_credit_event_type
;
692 /* Data specific for ISDS_CREDIT_CHARGED isds_credit_event_type */
693 struct isds_credit_event_charged
{
694 char *transaction
; /* Transaction identifier;
695 NULL-terminated string. */
698 /* Data specific for ISDS_CREDIT_DISCHARGED isds_credit_event_type */
699 struct isds_credit_event_discharged
{
700 char *transaction
; /* Transaction identifier;
701 NULL-terminated string. */
704 /* Data specific for ISDS_CREDIT_MESSAGE_SENT isds_credit_event_type */
705 struct isds_credit_event_message_sent
{
706 char *recipient
; /* Recipent's box ID of the sent message */
707 char *message_id
; /* ID of the sent message */
710 /* Data specific for ISDS_CREDIT_STORAGE_SET isds_credit_event_type */
711 struct isds_credit_event_storage_set
{
712 long int new_capacity
; /* New storage capacity. The unit is
714 struct tm
*new_valid_from
; /* The new capacity is available since
716 struct tm
*new_valid_to
; /* The new capacity expires on date. */
717 long int *old_capacity
; /* Previous storage capacity; Optional.
718 The unit is a message. */
719 struct tm
*old_valid_from
; /* Date; Optional; Only tm_year,
720 tm_mon, and tm_mday carry sane value. */
721 struct tm
*old_valid_to
; /* Date; Optional. */
722 char *initiator
; /* Name of a user who initiated this
726 /* Event about change of credit for sending commerical services */
727 struct isds_credit_event
{
729 struct timeval
*time
; /* When the credit was changed. */
730 long int credit_change
; /* Difference in credit value caused by
731 this event. The unit is 1/100 CZK. */
732 long int new_credit
; /* Credit value after this event.
733 The unit is 1/100 CZK. */
734 isds_credit_event_type type
; /* Type of the event */
736 /* Datails specific for the type */
738 struct isds_credit_event_charged charged
;
739 /* ISDS_CREDIT_CHARGED */
740 struct isds_credit_event_discharged discharged
;
741 /* ISDS_CREDIT_DISCHAGED */
742 struct isds_credit_event_message_sent message_sent
;
743 /* ISDS_CREDIT_MESSAGE_SENT */
744 struct isds_credit_event_storage_set storage_set
;
745 /* ISDS_CREDIT_STORAGE_SET */
749 /* General linked list */
751 struct isds_list
*next
; /* Next list item,
752 or NULL if current is last */
753 void *data
; /* Payload */
754 void (*destructor
) (void **); /* Payload deallocator;
755 Use NULL to have static data member. */
758 /* External box approval */
759 struct isds_approval
{
760 _Bool approved
; /* True if request for box has been
761 approved out of ISDS */
762 char *refference
; /* Identifier of the approval */
765 /* Message sender type.
766 * Similar but not equivalent to isds_UserType. */
768 SENDERTYPE_PRIMARY
, /* Owner of the box */
769 SENDERTYPE_ENTRUSTED
, /* User with limited access to the box */
770 SENDERTYPE_ADMINISTRATOR
, /* User to manage ENTRUSTED_USERs */
771 SENDERTYPE_OFFICIAL
, /* ISDS; sender of system message */
772 SENDERTYPE_VIRTUAL
, /* An application (e.g. document
773 information system) */
774 SENDERTYPE_OFFICIAL_CERT
, /* ???; Non-normative */
775 SENDERTYPE_LIQUIDATOR
/* Liquidator of the company; Non-normative */
778 /* Digital delivery of credentials */
779 struct isds_credentials_delivery
{
781 char *email
; /* e-mail address where to send
782 notification with link to service where
783 user can get know his new credentials */
785 char *token
; /* token user needs to use to authorize on
786 the web server to view his new
788 char *new_user_name
; /* user's log-in name that ISDS created/
789 changed up on a call. */
792 /* Box attribute to search while performing full-text search */
794 FULLTEXT_ALL
, /* search in address, organization identifier, and
796 FULLTEXT_ADDRESS
, /* search in address */
797 FULLTEXT_IC
, /* search in organization identifier */
798 FULLTEXT_BOX_ID
/* search in box ID */
799 } isds_fulltext_target
;
801 /* A box matching full-text search */
802 struct isds_fulltext_result
{
803 char *dbID
; /* Box ID */
804 isds_DbType dbType
; /* Box Type */
805 char *name
; /* Subject owning the box */
806 struct isds_list
*name_match_start
; /* List of pointers into `name'
807 field string. Point to first
808 characters of a matched query
810 struct isds_list
*name_match_end
; /* List of pointers into `name'
811 field string. Point after last
812 characters of a matched query
814 char *address
; /* Post address */
815 struct isds_list
*address_match_start
; /* List of pointers into `address'
816 field string. Point to first
817 characters of a matched query
819 struct isds_list
*address_match_end
; /* List of pointers into `address'
820 field string. Point after last
821 characters of a matched query
823 char *ic
; /* Organization identifier */
824 struct tm
*biDate
; /* Date of birth in local time at birth place,
825 only tm_year, tm_mon and tm_mday carry sane
827 _Bool dbEffectiveOVM
; /* Box has OVM role (§ 5a) */
828 _Bool active
; /* Box is active */
829 _Bool public_sending
; /* Current box can send non-commercial
830 messages into this box */
831 _Bool commercial_sending
; /* Current box can send commercial messages
835 /* Initialize ISDS library.
836 * Global function, must be called before other functions.
837 * If it fails you can not use ISDS library and must call isds_cleanup() to
838 * free partially initialized global variables. */
839 isds_error
isds_init(void);
841 /* Deinitialize ISDS library.
842 * Global function, must be called as last library function. */
843 isds_error
isds_cleanup(void);
845 /* Return version string of this library. Version of dependencies can be
846 * embedded. Do no try to parse it. You must free it. */
847 char *isds_version(void);
849 /* Create ISDS context.
850 * Each context can be used for different sessions to (possibly) different
851 * ISDS server with different credentials.
852 * Returns new context, or NULL */
853 struct isds_ctx
*isds_ctx_create(void);
855 /* Destroy ISDS context and free memory.
856 * @context will be NULLed on success. */
857 isds_error
isds_ctx_free(struct isds_ctx
**context
);
859 /* Return long message text produced by library function, e.g. detailed error
860 * message. Returned pointer is only valid until new library function is
861 * called for the same context. Could be NULL, especially if NULL context is
862 * supplied. Return string is locale encoded. */
863 char *isds_long_message(const struct isds_ctx
*context
);
866 * @facilities is bit mask of isds_log_facility values,
867 * @level is verbosity level. */
868 void isds_set_logging(const unsigned int facilities
,
869 const isds_log_level level
);
871 /* Function provided by application libisds will call to pass log message.
872 * The message is usually locale encoded, but raw strings (UTF-8 usually) can
873 * occur when logging raw communication with ISDS servers. Infixed zero byte
874 * is not excluded, but should not present. Use @length argument to get real
875 * length of the message.
876 * TODO: We will try to fix the encoding issue
877 * @facility is log message class
878 * @level is log message severity
879 * @message is string with zero byte terminator. This can be any arbitrary
880 * chunk of a sentence with or without new line, a sentence can be splitted
881 * into more messages. However it should not happen. If you discover message
882 * without new line, report it as a bug.
883 * @length is size of @message string in bytes excluding trailing zero
884 * @data is pointer that will be passed unchanged to this function at run-time
886 typedef void (*isds_log_callback
)(
887 isds_log_facility facility
, isds_log_level level
,
888 const char *message
, int length
, void *data
);
890 /* Register callback function libisds calls when new global log message is
891 * produced by library. Library logs to stderr by default.
892 * @callback is function provided by application libisds will call. See type
893 * definition for @callback argument explanation. Pass NULL to revert logging to
895 * @data is application specific data @callback gets as last argument */
896 void isds_set_log_callback(isds_log_callback callback
, void *data
);
898 /* Set timeout in milliseconds for each network job like connecting to server
899 * or sending message. Use 0 to disable timeout limits. */
900 isds_error
isds_set_timeout(struct isds_ctx
*context
,
901 const unsigned int timeout
);
903 /* Function provided by application libisds will call with
904 * following five arguments. Value zero of any argument means the value is
906 * @upload_total is expected total upload,
907 * @upload_current is cumulative current upload progress
908 * @dowload_total is expected total download
909 * @download_current is cumulative current download progress
910 * @data is pointer that will be passed unchanged to this function at run-time
911 * @return 0 to continue HTTP transfer, or non-zero to abort transfer */
912 typedef int (*isds_progress_callback
)(
913 double upload_total
, double upload_current
,
914 double download_total
, double download_current
,
917 /* Register callback function libisds calls periodically during HTTP data
919 * @context is session context
920 * @callback is function provided by application libisds will call. See type
921 * definition for @callback argument explanation.
922 * @data is application specific data @callback gets as last argument */
923 isds_error
isds_set_progress_callback(struct isds_ctx
*context
,
924 isds_progress_callback callback
, void *data
);
926 /* Change context settings.
927 * @context is context which setting will be applied to
928 * @option is name of option. It determines the type of last argument. See
929 * isds_option definition for more info.
930 * @... is value of new setting. Type is determined by @option
932 isds_error
isds_set_opt(struct isds_ctx
*context
, const isds_option option
,
935 /* Connect and log into ISDS server.
936 * All required arguments will be copied, you do not have to keep them after
938 * ISDS supports six different authentication methods. Exact method is
939 * selected on @username, @password, @pki_credentials, and @otp arguments:
940 * - If @pki_credentials == NULL, @username and @password must be supplied
942 * - If @otp == NULL, simple authentication by username and password will
944 * - If @otp != NULL, authentication by username and password and OTP
946 * - If @pki_credentials != NULL, then
947 * - If @username == NULL, only certificate will be used
948 * - If @username != NULL, then
949 * - If @password == NULL, then certificate will be used and
950 * @username shifts meaning to box ID. This is used for hosted
952 * - Otherwise all three arguments will be used.
953 * Please note, that different cases require different certificate type
954 * (system qualified one or commercial non qualified one). This library
955 * does not check such political issues. Please see ISDS Specification
957 * @url is base address of ISDS web service. Pass extern isds_locator
958 * variable to use production ISDS instance without client certificate
959 * authentication (or extern isds_cert_locator with client certificate
960 * authentication or extern isds_otp_locators with OTP authentication).
961 * Passing NULL has the same effect, autoselection between isds_locator,
962 * isds_cert_locator, and isds_otp_locator is performed in addition. You can
963 * pass extern isds_testing_locator (or isds_cert_testing_locator or
964 * isds_otp_testing_locator) variable to select testing instance.
965 * @username is user name of ISDS user or box ID
966 * @password is user's secret password
967 * @pki_credentials defines public key cryptographic material to use in client
969 * @otp selects one-time password authentication method to use, defines OTP
970 * code (if known) and returns fine grade resolution of OTP procedure.
972 * IE_SUCCESS if authentication succeeds
973 * IE_NOT_LOGGED_IN if authentication fails. If OTP authentication has been
974 * requested, fine grade reason will be set into @otp->resolution. Error
975 * message from server can be obtained by isds_long_message() call.
976 * IE_PARTIAL_SUCCESS if time-based OTP authentication has been requested and
977 * server has sent OTP code through side channel. Application is expected to
978 * fill the code into @otp->otp_code, keep other arguments unchanged, and retry
979 * this call to complete second phase of TOTP authentication;
980 * or other appropriate error. */
981 isds_error
isds_login(struct isds_ctx
*context
, const char *url
,
982 const char *username
, const char *password
,
983 const struct isds_pki_credentials
*pki_credentials
,
984 struct isds_otp
*otp
);
986 /* Log out from ISDS server and close connection. */
987 isds_error
isds_logout(struct isds_ctx
*context
);
989 /* Verify connection to ISDS is alive and server is responding.
990 * Send dummy request to ISDS and expect dummy response. */
991 isds_error
isds_ping(struct isds_ctx
*context
);
993 /* Get data about logged in user and his box. */
994 isds_error
isds_GetOwnerInfoFromLogin(struct isds_ctx
*context
,
995 struct isds_DbOwnerInfo
**db_owner_info
);
997 /* Get data about logged in user. */
998 isds_error
isds_GetUserInfoFromLogin(struct isds_ctx
*context
,
999 struct isds_DbUserInfo
**db_user_info
);
1001 /* Get expiration time of current password
1002 * @context is session context
1003 * @expiration is automatically reallocated time when password expires. If
1004 * password expiration is disabled, NULL will be returned. In case of error
1005 * it will be nulled too. */
1006 isds_error
isds_get_password_expiration(struct isds_ctx
*context
,
1007 struct timeval
**expiration
);
1009 /* Change user password in ISDS.
1010 * User must supply old password, new password will takes effect after some
1011 * time, current session can continue. Password must fulfill some constraints.
1012 * @context is session context
1013 * @old_password is current password.
1014 * @new_password is requested new password
1015 * @otp auxiliary data required if one-time password authentication is in use,
1016 * defines OTP code (if known) and returns fine grade resolution of OTP
1017 * procedure. Pass NULL, if one-time password authentication is not needed.
1018 * Please note the @otp argument must match OTP method used at log-in time. See
1019 * isds_login() function for more details.
1020 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1021 * NULL, if you don't care.
1022 * @return IE_SUCCESS, if password has been changed. Or returns appropriate
1023 * error code. It can return IE_PARTIAL_SUCCESS if OTP is in use and server is
1024 * awaiting OTP code that has been delivered by side channel to the user. */
1025 isds_error
isds_change_password(struct isds_ctx
*context
,
1026 const char *old_password
, const char *new_password
,
1027 struct isds_otp
*otp
, char **refnumber
);
1030 * @context is session context
1031 * @box is box description to create including single primary user (in case of
1032 * FO box type). It outputs box ID assigned by ISDS in dbID element.
1033 * @users is list of struct isds_DbUserInfo (primary users in case of non-FO
1034 * box, or contact address of PFO box owner)
1035 * @former_names is optional former name of box owner. Pass NULL if you don't care.
1036 * @upper_box_id is optional ID of supper box if currently created box is
1038 * @ceo_label is optional title of OVM box owner (e.g. mayor)
1039 * @credentials_delivery is NULL if new password should be delivered off-line
1040 * to box owner. It is valid pointer if owner should obtain new password on-line
1041 * on dedicated web server. Then input @credentials_delivery.email value is
1042 * his e-mail address he must provide to dedicated web server together
1043 * with output reallocated @credentials_delivery.token member. Output
1044 * member @credentials_delivery.new_user_name is unused up on this call.
1045 * @approval is optional external approval of box manipulation
1046 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1047 * NULL, if you don't care.*/
1048 isds_error
isds_add_box(struct isds_ctx
*context
,
1049 struct isds_DbOwnerInfo
*box
, const struct isds_list
*users
,
1050 const char *former_names
, const char *upper_box_id
,
1051 const char *ceo_label
,
1052 struct isds_credentials_delivery
*credentials_delivery
,
1053 const struct isds_approval
*approval
, char **refnumber
);
1055 /* Notify ISDS about new PFO entity.
1056 * This function has no real effect.
1057 * @context is session context
1058 * @box is PFO description including single primary user.
1059 * @users is list of struct isds_DbUserInfo (contact address of PFO box owner)
1060 * @former_names is optional undocumented string. Pass NULL if you don't care.
1061 * @upper_box_id is optional ID of supper box if currently created box is
1063 * @ceo_label is optional title of OVM box owner (e.g. mayor)
1064 * @approval is optional external approval of box manipulation
1065 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1066 * NULL, if you don't care.*/
1067 isds_error
isds_add_pfoinfo(struct isds_ctx
*context
,
1068 const struct isds_DbOwnerInfo
*box
, const struct isds_list
*users
,
1069 const char *former_names
, const char *upper_box_id
,
1070 const char *ceo_label
, const struct isds_approval
*approval
,
1073 /* Remove given box permanently.
1074 * @context is session context
1075 * @box is box description to delete
1076 * @since is date of box owner cancellation. Only tm_year, tm_mon and tm_mday
1078 * @approval is optional external approval of box manipulation
1079 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1080 * NULL, if you don't care.*/
1081 isds_error
isds_delete_box(struct isds_ctx
*context
,
1082 const struct isds_DbOwnerInfo
*box
, const struct tm
*since
,
1083 const struct isds_approval
*approval
, char **refnumber
);
1085 /* Undocumented function.
1086 * @context is session context
1087 * @box is box description to delete
1088 * @approval is optional external approval of box manipulation
1089 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1090 * NULL, if you don't care.*/
1091 isds_error
isds_delete_box_promptly(struct isds_ctx
*context
,
1092 const struct isds_DbOwnerInfo
*box
,
1093 const struct isds_approval
*approval
, char **refnumber
);
1095 /* Update data about given box.
1096 * @context is session context
1097 * @old_box current box description
1098 * @new_box are updated data about @old_box
1099 * @approval is optional external approval of box manipulation
1100 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1101 * NULL, if you don't care.*/
1102 isds_error
isds_UpdateDataBoxDescr(struct isds_ctx
*context
,
1103 const struct isds_DbOwnerInfo
*old_box
,
1104 const struct isds_DbOwnerInfo
*new_box
,
1105 const struct isds_approval
*approval
, char **refnumber
);
1107 /* Get data about all users assigned to given box.
1108 * @context is session context
1110 * @users is automatically reallocated list of struct isds_DbUserInfo */
1111 isds_error
isds_GetDataBoxUsers(struct isds_ctx
*context
, const char *box_id
,
1112 struct isds_list
**users
);
1114 /* Update data about user assigned to given box.
1115 * @context is session context
1116 * @box is box identification
1117 * @old_user identifies user to update, aifo_ticket member is ignored
1118 * @new_user are updated data about @old_user, aifo_ticket member is ignored
1119 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1120 * NULL, if you don't care.*/
1121 isds_error
isds_UpdateDataBoxUser(struct isds_ctx
*context
,
1122 const struct isds_DbOwnerInfo
*box
,
1123 const struct isds_DbUserInfo
*old_user
,
1124 const struct isds_DbUserInfo
*new_user
,
1127 /* Undocumented function.
1128 * @context is session context
1129 * @box_id is UTF-8 encoded box identifier
1130 * @token is UTF-8 encoded temporary password
1131 * @user_id outputs UTF-8 encoded reallocated user identifier
1132 * @password outpus UTF-8 encoded reallocated user password
1133 * Output arguments will be nulled in case of error */
1134 isds_error
isds_activate(struct isds_ctx
*context
,
1135 const char *box_id
, const char *token
,
1136 char **user_id
, char **password
);
1138 /* Reset credentials of user assigned to given box.
1139 * @context is session context
1140 * @box is box identification
1141 * @user identifies user to reset password, aifo_ticket member is ignored
1142 * @fee_paid is true if fee has been paid, false otherwise
1143 * @approval is optional external approval of box manipulation
1144 * @credentials_delivery is NULL if new password should be delivered off-line
1145 * to the user. It is valid pointer if user should obtain new password on-line
1146 * on dedicated web server. Then input @credentials_delivery.email value is
1147 * user's e-mail address user must provide to dedicated web server together
1148 * with @credentials_delivery.token. The output reallocated token user needs
1149 * to use to authorize on the web server to view his new password. Output
1150 * reallocated @credentials_delivery.new_user_name is user's log-in name that
1151 * ISDS changed up on this call. (No reason why server could change the name
1153 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1154 * NULL, if you don't care.*/
1155 isds_error
isds_reset_password(struct isds_ctx
*context
,
1156 const struct isds_DbOwnerInfo
*box
,
1157 const struct isds_DbUserInfo
*user
,
1158 const _Bool fee_paid
, const struct isds_approval
*approval
,
1159 struct isds_credentials_delivery
*credentials_delivery
,
1162 /* Assign new user to given box.
1163 * @context is session context
1164 * @box is box identification
1165 * @user defines new user to add
1166 * @credentials_delivery is NULL if new user's password should be delivered
1167 * off-line to the user. It is valid pointer if user should obtain new
1168 * password on-line on dedicated web server. Then input
1169 * @credentials_delivery.email value is user's e-mail address user must
1170 * provide to dedicated web server together with @credentials_delivery.token.
1171 * The output reallocated token user needs to use to authorize on the web
1172 * server to view his new password. Output reallocated
1173 * @credentials_delivery.new_user_name is user's log-in name that ISDS
1174 * assingned up on this call.
1175 * @approval is optional external approval of box manipulation
1176 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1177 * NULL, if you don't care.*/
1178 isds_error
isds_add_user(struct isds_ctx
*context
,
1179 const struct isds_DbOwnerInfo
*box
, const struct isds_DbUserInfo
*user
,
1180 struct isds_credentials_delivery
*credentials_delivery
,
1181 const struct isds_approval
*approval
, char **refnumber
);
1183 /* Remove user assigned to given box.
1184 * @context is session context
1185 * @box is box identification
1186 * @user identifies user to remove, aifo_ticket member is ignored
1187 * @approval is optional external approval of box manipulation
1188 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1189 * NULL, if you don't care.*/
1190 isds_error
isds_delete_user(struct isds_ctx
*context
,
1191 const struct isds_DbOwnerInfo
*box
, const struct isds_DbUserInfo
*user
,
1192 const struct isds_approval
*approval
, char **refnumber
);
1194 /* Get list of boxes in ZIP archive.
1195 * @context is session context
1196 * @list_identifier is UTF-8 encoded string identifying boxes of interrest.
1197 * System recognizes following values currently: ALL (all boxes), UPG
1198 * (effectively OVM boxes), POA (active boxes allowing receiving commercial
1199 * messages), OVM (OVM gross type boxes), OPN (boxes allowing receiving
1200 * commercial messages). This argument is a string because specification
1201 * states new values can appear in the future. Not all list types are
1202 * available to all users.
1203 * @buffer is automatically reallocated memory to store the list of boxes. The
1204 * list is zipped CSV file.
1205 * @buffer_length is size of @buffer data in bytes.
1206 * In case of error @buffer will be freed and @buffer_length will be
1208 isds_error
isds_get_box_list_archive(struct isds_ctx
*context
,
1209 const char *list_identifier
, void **buffer
, size_t *buffer_length
);
1211 /* Find boxes suiting given criteria.
1212 * @context is ISDS session context.
1213 * @criteria is filter. You should fill in at least some members.
1214 * @boxes is automatically reallocated list of isds_DbOwnerInfo structures,
1215 * possibly empty. Input NULL or valid old structure.
1217 * IE_SUCCESS if search succeeded, @boxes contains useful data
1218 * IE_NOEXIST if no such box exists, @boxes will be NULL
1219 * IE_2BIG if too much boxes exist and server truncated the results, @boxes
1220 * contains still valid data
1221 * other code if something bad happens. @boxes will be NULL. */
1222 isds_error
isds_FindDataBox(struct isds_ctx
*context
,
1223 const struct isds_DbOwnerInfo
*criteria
,
1224 struct isds_list
**boxes
);
1226 /* Find boxes matching a given full-text criteria.
1227 * @context is a session context
1228 * @query is a non-empty string which consists of words to search
1229 * @target selects box attributes to search for @query words. Pass NULL if you
1231 * @box_type restricts searching to given box type. Value DBTYPE_SYSTEM means
1232 * to search in all box types. Pass NULL to let server to use default value
1233 * which is DBTYPE_SYSTEM.
1234 * @page_size defines count of boxes to constitute a response page. It counts
1235 * from zero. Pass NULL to let server to use a default value (50 now).
1236 * @page_number defines ordinar number of the response page to return. It
1237 * counts from zero. Pass NULL to let server to use a default value (0 now).
1238 * @track_matches points to true for marking @query words found in the box
1239 * attributes. It points to false for not marking. Pass NULL to let the server
1240 * to use default value (false now).
1241 * @total_matching_boxes outputs reallocated number of all boxes matching the
1242 * query. Will be pointer to NULL if server did not provide the value.
1243 * Pass NULL if you don't care.
1244 * @current_page_beginning outputs reallocated ordinar number of the first box
1245 * in this @boxes page. It counts from zero. It will be pointer to NULL if the
1246 * server did not provide the value. Pass NULL if you don't care.
1247 * @current_page_size outputs reallocated count of boxes in the this @boxes
1248 * page. It will be pointer to NULL if the server did not provide the value.
1249 * Pass NULL if you don't care.
1250 * @last_page outputs pointer to reallocated boolean. True if this @boxes page
1251 * is the last one, false if more boxes match, NULL if the server did not
1252 * provude the value. Pass NULL if you don't care.
1253 * @boxes outputs reallocated list of isds_fulltext_result structures,
1256 * IE_SUCCESS if search succeeded
1257 * IE_2BIG if @page_size is too large
1258 * other code if something bad happens; output arguments will be NULL. */
1259 isds_error
isds_find_box_by_fulltext(struct isds_ctx
*context
,
1261 const isds_fulltext_target
*target
,
1262 const isds_DbType
*box_type
,
1263 const unsigned long int *page_size
,
1264 const unsigned long int *page_number
,
1265 const _Bool
*track_matches
,
1266 unsigned long int **total_matching_boxes
,
1267 unsigned long int **current_page_beginning
,
1268 unsigned long int **current_page_size
,
1270 struct isds_list
**boxes
);
1272 /* Get status of a box.
1273 * @context is ISDS session context.
1274 * @box_id is UTF-8 encoded box identifier as zero terminated string
1275 * @box_status is return value of box status.
1277 * IE_SUCCESS if box has been found and its status retrieved
1278 * IE_NOEXIST if box is not known to ISDS server
1279 * or other appropriate error.
1280 * You can use isds_DbState to enumerate box status. However out of enum
1281 * range value can be returned too. This is feature because ISDS
1282 * specification leaves the set of values open.
1283 * Be ware that status DBSTATE_REMOVED is signaled as IE_SUCCESS. That means
1284 * the box has been deleted, but ISDS still lists its former existence. */
1285 isds_error
isds_CheckDataBox(struct isds_ctx
*context
, const char *box_id
,
1286 long int *box_status
);
1288 /* Get list of permissions to send commercial messages.
1289 * @context is ISDS session context.
1290 * @box_id is UTF-8 encoded sender box identifier as zero terminated string
1291 * @permissions is a reallocated list of permissions (struct
1292 * isds_commercial_permission*) to send commercial messages from @box_id. The
1293 * order of permissions is significant as the server applies the permissions
1294 * and associated pre-paid credits in the order. Empty list means no
1297 * IE_SUCCESS if the list has been obtained correctly,
1298 * or other appropriate error. */
1299 isds_error
isds_get_commercial_permissions(struct isds_ctx
*context
,
1300 const char *box_id
, struct isds_list
**permissions
);
1302 /* Get details about credit for sending pre-paid commercial messages.
1303 * @context is ISDS session context.
1304 * @box_id is UTF-8 encoded sender box identifier as zero terminated string.
1305 * @from_date is first day of credit history to return in @history. Only
1306 * tm_year, tm_mon and tm_mday carry sane value.
1307 * @to_date is last day of credit history to return in @history. Only
1308 * tm_year, tm_mon and tm_mday carry sane value.
1309 * @credit outputs current credit value into pre-allocated memory. Pass NULL
1310 * if you don't care. This and all other credit values are integers in
1311 * hundredths of Czech Crowns.
1312 * @email outputs notification e-mail address where notifications about credit
1313 * are sent. This is automatically reallocated string. Pass NULL if you don't
1314 * care. It can return NULL if no address is defined.
1315 * @history outputs auto-reallocated list of pointers to struct
1316 * isds_credit_event. Events in closed interval @from_time to @to_time are
1317 * returned. Pass NULL @to_time and @from_time if you don't care. The events
1318 * are sorted by time.
1320 * IE_SUCCESS if the credit details have been obtained correctly,
1321 * or other appropriate error. Please note that server allows to retrieve
1322 * only limited history of events. */
1323 isds_error
isds_get_commercial_credit(struct isds_ctx
*context
,
1325 const struct tm
*from_date
, const struct tm
*to_date
,
1326 long int *credit
, char **email
, struct isds_list
**history
);
1328 /* Switch box into state where box can receive commercial messages (off by
1330 * @context is ISDS session context.
1331 * @box_id is UTF-8 encoded box identifier as zero terminated string
1332 * @allow is true for enable, false for disable commercial messages income
1333 * @approval is optional external approval of box manipulation
1334 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1335 * NULL, if you don't care. */
1336 isds_error
isds_switch_commercial_receiving(struct isds_ctx
*context
,
1337 const char *box_id
, const _Bool allow
,
1338 const struct isds_approval
*approval
, char **refnumber
);
1340 /* Switch box into / out of state where non-OVM box can act as OVM (e.g. force
1341 * message acceptance). This is just a box permission. Sender must apply
1342 * such role by sending each message.
1343 * @context is ISDS session context.
1344 * @box_id is UTF-8 encoded box identifier as zero terminated string
1345 * @allow is true for enable, false for disable OVM role permission
1346 * @approval is optional external approval of box manipulation
1347 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1348 * NULL, if you don't care. */
1349 isds_error
isds_switch_effective_ovm(struct isds_ctx
*context
,
1350 const char *box_id
, const _Bool allow
,
1351 const struct isds_approval
*approval
, char **refnumber
);
1353 /* Switch box accessibility state on request of box owner.
1354 * Despite the name, owner must do the request off-line. This function is
1355 * designed for such off-line meeting points (e.g. Czech POINT).
1356 * @context is ISDS session context.
1357 * @box identifies box to switch accessibility state.
1358 * @allow is true for making accessible, false to disallow access.
1359 * @approval is optional external approval of box manipulation
1360 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1361 * NULL, if you don't care. */
1362 isds_error
isds_switch_box_accessibility_on_owner_request(
1363 struct isds_ctx
*context
, const struct isds_DbOwnerInfo
*box
,
1364 const _Bool allow
, const struct isds_approval
*approval
,
1367 /* Disable box accessibility on law enforcement (e.g. by prison) since exact
1369 * @context is ISDS session context.
1370 * @box identifies box to switch accessibility state.
1371 * @since is date since accessibility has been denied. This can be past too.
1372 * Only tm_year, tm_mon and tm_mday carry sane value.
1373 * @approval is optional external approval of box manipulation
1374 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1375 * NULL, if you don't care. */
1376 isds_error
isds_disable_box_accessibility_externaly(
1377 struct isds_ctx
*context
, const struct isds_DbOwnerInfo
*box
,
1378 const struct tm
*since
, const struct isds_approval
*approval
,
1381 /* Send a message via ISDS to a recipient
1382 * @context is session context
1383 * @outgoing_message is message to send; Some members are mandatory (like
1384 * dbIDRecipient), some are optional and some are irrelevant (especially data
1385 * about sender). Included pointer to isds_list documents must contain at
1386 * least one document of FILEMETATYPE_MAIN. This is read-write structure, some
1387 * members will be filled with valid data from ISDS. Exact list of write
1388 * members is subject to change. Currently dmID is changed.
1389 * @return ISDS_SUCCESS, or other error code if something goes wrong. */
1390 isds_error
isds_send_message(struct isds_ctx
*context
,
1391 struct isds_message
*outgoing_message
);
1393 /* Send a message via ISDS to a multiple recipients
1394 * @context is session context
1395 * @outgoing_message is message to send; Some members are mandatory,
1396 * some are optional and some are irrelevant (especially data
1397 * about sender). Data about recipient will be substituted by ISDS from
1398 * @copies. Included pointer to isds_list documents must
1399 * contain at least one document of FILEMETATYPE_MAIN.
1400 * @copies is list of isds_message_copy structures addressing all desired
1401 * recipients. This is read-write structure, some members will be filled with
1402 * valid data from ISDS (message IDs, error codes, error descriptions).
1404 * ISDS_SUCCESS if all messages have been sent
1405 * ISDS_PARTIAL_SUCCESS if sending of some messages has failed (failed and
1406 * succeeded messages can be identified by copies->data->error),
1407 * or other error code if something other goes wrong. */
1408 isds_error
isds_send_message_to_multiple_recipients(struct isds_ctx
*context
,
1409 const struct isds_message
*outgoing_message
,
1410 struct isds_list
*copies
);
1412 /* Get list of outgoing (already sent) messages.
1413 * Any criterion argument can be NULL, if you don't care about it.
1414 * @context is session context. Must not be NULL.
1415 * @from_time is minimal time and date of message sending inclusive.
1416 * @to_time is maximal time and date of message sending inclusive
1417 * @dmSenderOrgUnitNum is the same as isds_envelope.dmSenderOrgUnitNum
1418 * @status_filter is bit field of isds_message_status values. Use special
1419 * value MESSAGESTATE_ANY to signal you don't care. (It's defined as union of
1420 * all values, you can use bit-wise arithmetic if you want.)
1421 * @offset is index of first message we are interested in. First message is 1.
1422 * Set to 0 (or 1) if you don't care.
1423 * @number is maximal length of list you want to get as input value, outputs
1424 * number of messages matching these criteria. Can be NULL if you don't care
1425 * (applies to output value either).
1426 * @messages is automatically reallocated list of isds_message's. Be ware that
1427 * it returns only brief overview (envelope and some other fields) about each
1428 * message, not the complete message. FIXME: Specify exact fields.
1429 * The list is sorted by delivery time in ascending order.
1430 * Use NULL if you don't care about the meta data (useful if you want to know
1431 * only the @number). If you provide &NULL, list will be allocated on heap,
1432 * if you provide pointer to non-NULL, list will be freed automatically at
1433 * first. Also in case of error the list will be NULLed.
1434 * @return IE_SUCCESS or appropriate error code. */
1435 isds_error
isds_get_list_of_sent_messages(struct isds_ctx
*context
,
1436 const struct timeval
*from_time
, const struct timeval
*to_time
,
1437 const long int *dmSenderOrgUnitNum
, const unsigned int status_filter
,
1438 const unsigned long int offset
, unsigned long int *number
,
1439 struct isds_list
**messages
);
1441 /* Get list of incoming (addressed to you) messages.
1442 * Any criterion argument can be NULL, if you don't care about it.
1443 * @context is session context. Must not be NULL.
1444 * @from_time is minimal time and date of message sending inclusive.
1445 * @to_time is maximal time and date of message sending inclusive
1446 * @dmRecipientOrgUnitNum is the same as isds_envelope.dmRecipientOrgUnitNum
1447 * @status_filter is bit field of isds_message_status values. Use special
1448 * value MESSAGESTATE_ANY to signal you don't care. (It's defined as union of
1449 * all values, you can use bit-wise arithmetic if you want.)
1450 * @offset is index of first message we are interested in. First message is 1.
1451 * Set to 0 (or 1) if you don't care.
1452 * @number is maximal length of list you want to get as input value, outputs
1453 * number of messages matching these criteria. Can be NULL if you don't care
1454 * (applies to output value either).
1455 * @messages is automatically reallocated list of isds_message's. Be ware that
1456 * it returns only brief overview (envelope and some other fields) about each
1457 * message, not the complete message. FIXME: Specify exact fields.
1458 * Use NULL if you don't care about the meta data (useful if you want to know
1459 * only the @number). If you provide &NULL, list will be allocated on heap,
1460 * if you provide pointer to non-NULL, list will be freed automatically at
1461 * first. Also in case of error the list will be NULLed.
1462 * @return IE_SUCCESS or appropriate error code. */
1463 isds_error
isds_get_list_of_received_messages(struct isds_ctx
*context
,
1464 const struct timeval
*from_time
, const struct timeval
*to_time
,
1465 const long int *dmRecipientOrgUnitNum
,
1466 const unsigned int status_filter
,
1467 const unsigned long int offset
, unsigned long int *number
,
1468 struct isds_list
**messages
);
1470 /* Get list of sent message state changes.
1471 * Any criterion argument can be NULL, if you don't care about it.
1472 * @context is session context. Must not be NULL.
1473 * @from_time is minimal time and date of status changes inclusive
1474 * @to_time is maximal time and date of status changes inclusive
1475 * @changed_states is automatically reallocated list of
1476 * isds_message_status_change's. If you provide &NULL, list will be allocated
1477 * on heap, if you provide pointer to non-NULL, list will be freed
1478 * automatically at first. Also in case of error the list will be NULLed.
1479 * XXX: The list item ordering is not specified.
1480 * XXX: Server provides only `recent' changes.
1481 * @return IE_SUCCESS or appropriate error code. */
1482 isds_error
isds_get_list_of_sent_message_state_changes(
1483 struct isds_ctx
*context
,
1484 const struct timeval
*from_time
, const struct timeval
*to_time
,
1485 struct isds_list
**changed_states
);
1487 /* Download incoming message envelope identified by ID.
1488 * @context is session context
1489 * @message_id is message identifier (you can get them from
1490 * isds_get_list_of_received_messages())
1491 * @message is automatically reallocated message retrieved from ISDS.
1492 * It will miss documents per se. Use isds_get_received_message(), if you are
1493 * interested in documents (content) too.
1494 * Returned hash and timestamp require documents to be verifiable. */
1495 isds_error
isds_get_received_envelope(struct isds_ctx
*context
,
1496 const char *message_id
, struct isds_message
**message
);
1498 /* Download signed delivery info-sheet of given message identified by ID.
1499 * @context is session context
1500 * @message_id is message identifier (you can get them from
1501 * isds_get_list_of_{sent,received}_messages())
1502 * @message is automatically reallocated message retrieved from ISDS.
1503 * It will miss documents per se. Use isds_get_signed_received_message(),
1504 * if you are interested in documents (content). OTOH, only this function
1505 * can get list events message has gone through. */
1506 isds_error
isds_get_signed_delivery_info(struct isds_ctx
*context
,
1507 const char *message_id
, struct isds_message
**message
);
1509 /* Load delivery info of any format from buffer.
1510 * @context is session context
1511 * @raw_type advertises format of @buffer content. Only delivery info types
1513 * @buffer is DER encoded PKCS#7 structure with signed delivery info. You can
1514 * retrieve such data from message->raw after calling
1515 * isds_get_signed_delivery_info().
1516 * @length is length of buffer in bytes.
1517 * @message is automatically reallocated message parsed from @buffer.
1518 * @strategy selects how buffer will be attached into raw isds_message member.
1520 isds_error
isds_load_delivery_info(struct isds_ctx
*context
,
1521 const isds_raw_type raw_type
,
1522 const void *buffer
, const size_t length
,
1523 struct isds_message
**message
, const isds_buffer_strategy strategy
);
1525 /* Download delivery info-sheet of given message identified by ID.
1526 * @context is session context
1527 * @message_id is message identifier (you can get them from
1528 * isds_get_list_of_{sent,received}_messages())
1529 * @message is automatically reallocated message retrieved from ISDS.
1530 * It will miss documents per se. Use isds_get_received_message(), if you are
1531 * interested in documents (content). OTOH, only this function can get list
1532 * of events message has gone through. */
1533 isds_error
isds_get_delivery_info(struct isds_ctx
*context
,
1534 const char *message_id
, struct isds_message
**message
);
1536 /* Download incoming message identified by ID.
1537 * @context is session context
1538 * @message_id is message identifier (you can get them from
1539 * isds_get_list_of_received_messages())
1540 * @message is automatically reallocated message retrieved from ISDS */
1541 isds_error
isds_get_received_message(struct isds_ctx
*context
,
1542 const char *message_id
, struct isds_message
**message
);
1544 /* Load message of any type from buffer.
1545 * @context is session context
1546 * @raw_type defines content type of @buffer. Only message types are allowed.
1547 * @buffer is message raw representation. Format (CMS, plain signed,
1548 * message direction) is defined in @raw_type. You can retrieve such data
1549 * from message->raw after calling isds_get_[signed]{received,sent}_message().
1550 * @length is length of buffer in bytes.
1551 * @message is automatically reallocated message parsed from @buffer.
1552 * @strategy selects how buffer will be attached into raw isds_message member.
1554 isds_error
isds_load_message(struct isds_ctx
*context
,
1555 const isds_raw_type raw_type
, const void *buffer
, const size_t length
,
1556 struct isds_message
**message
, const isds_buffer_strategy strategy
);
1558 /* Determine type of raw message or delivery info according some heuristics.
1559 * It does not validate the raw blob.
1560 * @context is session context
1561 * @raw_type returns content type of @buffer. Valid only if exit code of this
1562 * function is IE_SUCCESS. The pointer must be valid. This is no automatically
1563 * reallocated memory.
1564 * @buffer is message raw representation.
1565 * @length is length of buffer in bytes. */
1566 isds_error
isds_guess_raw_type(struct isds_ctx
*context
,
1567 isds_raw_type
*raw_type
, const void *buffer
, const size_t length
);
1569 /* Download signed incoming message identified by ID.
1570 * @context is session context
1571 * @message_id is message identifier (you can get them from
1572 * isds_get_list_of_received_messages())
1573 * @message is automatically reallocated message retrieved from ISDS. The raw
1574 * member will be filled with PKCS#7 structure in DER format. */
1575 isds_error
isds_get_signed_received_message(struct isds_ctx
*context
,
1576 const char *message_id
, struct isds_message
**message
);
1578 /* Download signed outgoing message identified by ID.
1579 * @context is session context
1580 * @message_id is message identifier (you can get them from
1581 * isds_get_list_of_sent_messages())
1582 * @message is automatically reallocated message retrieved from ISDS. The raw
1583 * member will be filled with PKCS#7 structure in DER format. */
1584 isds_error
isds_get_signed_sent_message(struct isds_ctx
*context
,
1585 const char *message_id
, struct isds_message
**message
);
1587 /* Get type and name of user who sent a message identified by ID.
1588 * @context is session context
1589 * @message_id is message identifier
1590 * @sender_type is pointer to automatically allocated type of sender detected
1591 * from @raw_sender_type string. If @raw_sender_type is unknown to this
1592 * library or to the server, NULL will be returned. Pass NULL if you don't
1594 * @raw_sender_type is automatically reallocated UTF-8 string describing
1595 * sender type or NULL if not known to server. Pass NULL if you don't care.
1596 * @sender_name is automatically reallocated UTF-8 name of user who sent the
1597 * message, or NULL if not known to ISDS. Pass NULL if you don't care. */
1598 isds_error
isds_get_message_sender(struct isds_ctx
*context
,
1599 const char *message_id
, isds_sender_type
**sender_type
,
1600 char **raw_sender_type
, char **sender_name
);
1602 /* Retrieve hash of message identified by ID stored in ISDS.
1603 * @context is session context
1604 * @message_id is message identifier
1605 * @hash is automatically reallocated message hash downloaded from ISDS.
1606 * Message must exist in system and must not be deleted. */
1607 isds_error
isds_download_message_hash(struct isds_ctx
*context
,
1608 const char *message_id
, struct isds_hash
**hash
);
1610 /* Compute hash of message from raw representation and store it into envelope.
1611 * Original hash structure will be destroyed in envelope.
1612 * @context is session context
1613 * @message is message carrying raw XML message blob
1614 * @algorithm is desired hash algorithm to use */
1615 isds_error
isds_compute_message_hash(struct isds_ctx
*context
,
1616 struct isds_message
*message
, const isds_hash_algorithm algorithm
);
1618 /* Compare two hashes.
1620 * @h2 is another hash
1622 * IE_SUCCESS if hashes equal
1623 * IE_NOTUNIQ if hashes are comparable, but they don't equal
1624 * IE_ENUM if not comparable, but both structures defined
1625 * IE_INVAL if some of the structures are undefined (NULL)
1626 * IE_ERROR if internal error occurs */
1627 isds_error
isds_hash_cmp(const struct isds_hash
*h1
,
1628 const struct isds_hash
*h2
);
1630 /* Check message has gone through ISDS by comparing message hash stored in
1631 * ISDS and locally computed hash. You must provide message with valid raw
1632 * member (do not use isds_load_message(..., BUFFER_DONT_STORE)).
1633 * This is convenient wrapper for isds_download_message_hash(),
1634 * isds_compute_message_hash(), and isds_hash_cmp() sequence.
1635 * @context is session context
1636 * @message is message with valid raw and envelope member; envelope->hash
1637 * member will be changed during function run. Use envelope on heap only.
1639 * IE_SUCCESS if message originates in ISDS
1640 * IE_NOTEQUAL if message is unknown to ISDS
1641 * other code for other errors */
1642 isds_error
isds_verify_message_hash(struct isds_ctx
*context
,
1643 struct isds_message
*message
);
1645 /* Submit CMS signed message to ISDS to verify its originality. This is
1646 * stronger form of isds_verify_message_hash() because ISDS does more checks
1647 * than simple one (potentialy old weak) hash comparison.
1648 * @context is session context
1649 * @message is memory with raw CMS signed message bit stream
1650 * @length is @message size in bytes
1652 * IE_SUCCESS if message originates in ISDS
1653 * IE_NOTEQUAL if message is unknown to ISDS
1654 * other code for other errors */
1655 isds_error
isds_authenticate_message(struct isds_ctx
*context
,
1656 const void *message
, size_t length
);
1658 /* Submit CMS signed message or delivery info to ISDS to re-sign the content
1659 * including adding new CMS time stamp. Only CMS blobs without time stamp can
1661 * @context is session context
1662 * @input_data is memory with raw CMS signed message or delivery info bit
1664 * @input_length is @input_data size in bytes
1665 * @output_data is pointer to auto-allocated memory where to store re-signed
1666 * input data blob. Caller must free it.
1667 * @output_data is pointer where to store @output_data size in bytes
1668 * @valid_to is pointer to auto-allocated date of time stamp expiration.
1669 * Only tm_year, tm_mon and tm_mday will be set. Pass NULL, if you don't care.
1671 * IE_SUCCESS if CMS blob has been re-signed successfully
1672 * other code for other errors */
1673 isds_error
isds_resign_message(struct isds_ctx
*context
,
1674 const void *input_data
, size_t input_length
,
1675 void **output_data
, size_t *output_length
, struct tm
**valid_to
);
1677 /* Erase message specified by @message_id from long term storage. Other
1678 * message cannot be erased on user request.
1679 * @context is session context
1680 * @message_id is message identifier.
1681 * @incoming is true for incoming message, false for outgoing message.
1683 * IE_SUCCESS if message has ben removed
1684 * IE_INVAL if message does not exist in long term storage or message
1685 * belongs to different box
1686 * TODO: IE_NOEPRM if user has no permission to erase a message */
1687 isds_error
isds_delete_message_from_storage(struct isds_ctx
*context
,
1688 const char *message_id
, _Bool incoming
);
1690 /* Mark message as read. This is a transactional commit function to acknowledge
1691 * to ISDS the message has been downloaded and processed by client properly.
1692 * @context is session context
1693 * @message_id is message identifier. */
1694 isds_error
isds_mark_message_read(struct isds_ctx
*context
,
1695 const char *message_id
);
1697 /* Mark message as received by recipient. This is applicable only to
1698 * commercial message. Use envelope->dmType message member to distinguish
1699 * commercial message from government message. Government message is
1700 * received automatically (by law), commercial message on recipient request.
1701 * @context is session context
1702 * @message_id is message identifier. */
1703 isds_error
isds_mark_message_received(struct isds_ctx
*context
,
1704 const char *message_id
);
1706 /* Send bogus request to ISDS.
1707 * Just for test purposes */
1708 isds_error
isds_bogus_request(struct isds_ctx
*context
);
1710 /* Send document for authorized conversion into Czech POINT system.
1711 * This is public anonymous service, no log-in necessary. Special context is
1712 * used to reuse keep-a-live HTTPS connection.
1713 * @context is Czech POINT session context. DO NOT use context connected to
1714 * ISDS server. Use new context or context used by this function previously.
1715 * @document is document to convert. Only data, data_length, dmFileDescr and
1716 * is_xml members are significant. Be ware that not all document formats can be
1717 * converted (signed PDF 1.3 and higher only (2010-02 state)).
1718 * @id is reallocated identifier assigned by Czech POINT system to
1719 * your document on submit. Use is to tell it to Czech POINT officer.
1720 * @date is reallocated document submit date (submitted documents
1721 * expires after some period). Only tm_year, tm_mon and tm_mday carry sane
1723 isds_error
czp_convert_document(struct isds_ctx
*context
,
1724 const struct isds_document
*document
,
1725 char **id
, struct tm
**date
);
1727 /* Close possibly opened connection to Czech POINT document deposit.
1728 * @context is Czech POINT session context. */
1729 isds_error
czp_close_connection(struct isds_ctx
*context
);
1731 /* Send request for new box creation in testing ISDS instance.
1732 * It's not possible to request for a production box currently, as it
1733 * communicates via e-mail.
1734 * XXX: This function does not work either. Server complains about invalid
1736 * XXX: Remove context->type hacks in isds.c and validator.c when removing
1738 * @context is special session context for box creation request. DO NOT use
1739 * standard context as it could reveal your password. Use fresh new context or
1740 * context previously used by this function.
1741 * @box is box description to create including single primary user (in case of
1742 * FO box type). It outputs box ID assigned by ISDS in dbID element.
1743 * @users is list of struct isds_DbUserInfo (primary users in case of non-FO
1744 * box, or contact address of PFO box owner). The email member is mandatory as
1745 * it will be used to deliver credentials.
1746 * @former_names is optional undocumented string. Pass NULL if you don't care.
1747 * @approval is optional external approval of box manipulation
1748 * @refnumber is reallocated serial number of request assigned by ISDS. Use
1749 * NULL, if you don't care.*/
1750 isds_error
isds_request_new_testing_box(struct isds_ctx
*context
,
1751 struct isds_DbOwnerInfo
*box
, const struct isds_list
*users
,
1752 const char *former_names
, const struct isds_approval
*approval
,
1755 /* Search for document by document ID in list of documents. IDs are compared
1757 * @documents is list of isds_documents
1758 * @id is document identifier
1759 * @return first matching document or NULL. */
1760 const struct isds_document
*isds_find_document_by_id(
1761 const struct isds_list
*documents
, const char *id
);
1763 /* Normalize @mime_type to be proper MIME type.
1764 * ISDS servers pass invalid MIME types (e.g. "pdf"). This function tries to
1765 * guess regular MIME type (e.g. "application/pdf").
1766 * @mime_type is UTF-8 encoded MIME type to fix
1767 * @return original @mime_type if no better interpretation exists, or
1768 * constant static UTF-8 encoded string with proper MIME type. */
1769 const char *isds_normalize_mime_type(const char *mime_type
);
1771 /* Deallocate structure isds_pki_credentials and NULL it.
1772 * Pass-phrase is discarded.
1773 * @pki credentials to to free */
1774 void isds_pki_credentials_free(struct isds_pki_credentials
**pki
);
1776 /* Free isds_list with all member data.
1777 * @list list to free, on return will be NULL */
1778 void isds_list_free(struct isds_list
**list
);
1780 /* Deallocate structure isds_hash and NULL it.
1781 * @hash hash to to free */
1782 void isds_hash_free(struct isds_hash
**hash
);
1784 /* Deallocate structure isds_PersonName recursively and NULL it */
1785 void isds_PersonName_free(struct isds_PersonName
**person_name
);
1787 /* Deallocate structure isds_BirthInfo recursively and NULL it */
1788 void isds_BirthInfo_free(struct isds_BirthInfo
**birth_info
);
1790 /* Deallocate structure isds_Address recursively and NULL it */
1791 void isds_Address_free(struct isds_Address
**address
);
1793 /* Deallocate structure isds_DbOwnerInfo recursively and NULL it */
1794 void isds_DbOwnerInfo_free(struct isds_DbOwnerInfo
**db_owner_info
);
1796 /* Deallocate structure isds_DbUserInfo recursively and NULL it */
1797 void isds_DbUserInfo_free(struct isds_DbUserInfo
**db_user_info
);
1799 /* Deallocate struct isds_event recursively and NULL it */
1800 void isds_event_free(struct isds_event
**event
);
1802 /* Deallocate struct isds_envelope recursively and NULL it */
1803 void isds_envelope_free(struct isds_envelope
**envelope
);
1805 /* Deallocate struct isds_document recursively and NULL it */
1806 void isds_document_free(struct isds_document
**document
);
1808 /* Deallocate struct isds_message recursively and NULL it */
1809 void isds_message_free(struct isds_message
**message
);
1811 /* Deallocate struct isds_message_copy recursively and NULL it */
1812 void isds_message_copy_free(struct isds_message_copy
**copy
);
1814 /* Deallocate struct isds_message_status_change recursively and NULL it */
1815 void isds_message_status_change_free(
1816 struct isds_message_status_change
**message_status_change
);
1818 /* Deallocate struct isds_approval recursively and NULL it */
1819 void isds_approval_free(struct isds_approval
**approval
);
1821 /* Deallocate struct isds_commercial_permission recursively and NULL it */
1822 void isds_commercial_permission_free(
1823 struct isds_commercial_permission
**permission
);
1825 /* Deallocate struct isds_credit_event recursively and NULL it */
1826 void isds_credit_event_free(struct isds_credit_event
**event
);
1828 /* Deallocate struct isds_credentials_delivery recursively and NULL it.
1829 * The email string is deallocated too. */
1830 void isds_credentials_delivery_free(
1831 struct isds_credentials_delivery
**credentials_delivery
);
1833 /* Deallocate struct isds_fulltext_result recursively and NULL it */
1834 void isds_fulltext_result_free(
1835 struct isds_fulltext_result
**result
);
1837 /* Copy structure isds_PersonName recursively */
1838 struct isds_PersonName
*isds_PersonName_duplicate(
1839 const struct isds_PersonName
*src
);
1841 /* Copy structure isds_Address recursively */
1842 struct isds_Address
*isds_Address_duplicate(
1843 const struct isds_Address
*src
);
1845 /* Copy structure isds_DbOwnerInfo recursively */
1846 struct isds_DbOwnerInfo
*isds_DbOwnerInfo_duplicate(
1847 const struct isds_DbOwnerInfo
*src
);
1849 /* Copy structure isds_DbUserInfo recursively */
1850 struct isds_DbUserInfo
*isds_DbUserInfo_duplicate(
1851 const struct isds_DbUserInfo
*src
);
1853 #ifdef __cplusplus /* For C++ linker sake */