1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2000-2012 Jeffrey Stedfast
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public License
7 * as published by the Free Software Foundation; either version 2.1
8 * of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free
17 * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
28 #include "gmime-signature.h"
32 * SECTION: gmime-signature
33 * @title: GMimeSignature
34 * @short_description: Digital signatures
37 * A #GMimeSignature is an object containing useful information about a
38 * digital signature as used in signing and encrypting data.
42 static void g_mime_signature_class_init (GMimeSignatureClass *klass);
43 static void g_mime_signature_init (GMimeSignature *sig, GMimeSignatureClass *klass);
44 static void g_mime_signature_finalize (GObject *object);
46 static GObjectClass *parent_class = NULL;
50 g_mime_signature_get_type (void)
52 static GType type = 0;
55 static const GTypeInfo info = {
56 sizeof (GMimeSignatureClass),
57 NULL, /* base_class_init */
58 NULL, /* base_class_finalize */
59 (GClassInitFunc) g_mime_signature_class_init,
60 NULL, /* class_finalize */
61 NULL, /* class_data */
62 sizeof (GMimeSignature),
64 (GInstanceInitFunc) g_mime_signature_init,
67 type = g_type_register_static (G_TYPE_OBJECT, "GMimeSignature", &info, 0);
74 g_mime_signature_class_init (GMimeSignatureClass *klass)
76 GObjectClass *object_class = G_OBJECT_CLASS (klass);
78 parent_class = g_type_class_ref (G_TYPE_OBJECT);
80 object_class->finalize = g_mime_signature_finalize;
84 g_mime_signature_init (GMimeSignature *sig, GMimeSignatureClass *klass)
86 sig->status = GMIME_SIGNATURE_STATUS_GOOD;
87 sig->errors = GMIME_SIGNATURE_ERROR_NONE;
88 sig->cert = g_mime_certificate_new ();
89 sig->created = (time_t) -1;
90 sig->expires = (time_t) -1;
94 g_mime_signature_finalize (GObject *object)
96 GMimeSignature *sig = (GMimeSignature *) object;
99 g_object_unref (sig->cert);
101 G_OBJECT_CLASS (parent_class)->finalize (object);
106 * g_mime_signature_new:
108 * Creates a new #GMimeSignature object.
110 * Returns: a new #GMimeSignature object.
113 g_mime_signature_new (void)
115 return g_object_newv (GMIME_TYPE_SIGNATURE, 0, NULL);
120 * g_mime_signature_set_status:
121 * @sig: a #GMimeSignature
122 * @status: a #GMimeSignatureStatus
124 * Set the status on the signature.
127 g_mime_signature_set_status (GMimeSignature *sig, GMimeSignatureStatus status)
129 g_return_if_fail (GMIME_IS_SIGNATURE (sig));
131 sig->status = status;
136 * g_mime_signature_get_status:
137 * @sig: a #GMimeSignature
139 * Get the signature status.
141 * Returns: the signature status.
144 g_mime_signature_get_status (GMimeSignature *sig)
146 g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), GMIME_SIGNATURE_STATUS_BAD);
153 * g_mime_signature_set_errors:
154 * @sig: a #GMimeSignature
155 * @errors: a #GMimeSignatureError
157 * Set the errors on the signature.
160 g_mime_signature_set_errors (GMimeSignature *sig, GMimeSignatureError errors)
162 g_return_if_fail (GMIME_IS_SIGNATURE (sig));
164 sig->errors = errors;
169 * g_mime_signature_get_errors:
170 * @sig: a #GMimeSignature
172 * Get the signature errors. If the #GMimeSignatureStatus returned from
173 * g_mime_signature_get_status() is not #GMIME_SIGNATURE_STATUS_GOOD, then the
174 * errors may provide a clue as to why.
176 * Returns: a bitfield of errors.
179 g_mime_signature_get_errors (GMimeSignature *sig)
181 g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), GMIME_SIGNATURE_ERROR_NONE);
188 * g_mime_signature_set_certificate:
189 * @sig: a #GMimeSignature
190 * @cert: a #GMimeCertificate
192 * Set the signature's certificate.
195 g_mime_signature_set_certificate (GMimeSignature *sig, GMimeCertificate *cert)
197 g_return_if_fail (GMIME_IS_SIGNATURE (sig));
198 g_return_if_fail (GMIME_IS_CERTIFICATE (cert));
200 if (sig->cert == cert)
203 if (sig->cert != NULL)
204 g_object_unref (sig->cert);
214 * g_mime_signature_get_certificate:
215 * @sig: a #GMimeSignature
217 * Get the signature's certificate.
219 * Returns: the signature's certificate.
222 g_mime_signature_get_certificate (GMimeSignature *sig)
224 g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), NULL);
231 * g_mime_signature_set_created:
232 * @sig: a #GMimeSignature
233 * @created: creation date
235 * Set the creation date of the signature.
238 g_mime_signature_set_created (GMimeSignature *sig, time_t created)
240 g_return_if_fail (GMIME_IS_SIGNATURE (sig));
242 sig->created = created;
247 * g_mime_signature_get_created:
248 * @sig: a #GMimeSignature
250 * Get the creation date of the signature.
252 * Returns: the creation date of the signature or %-1 if unknown.
255 g_mime_signature_get_created (GMimeSignature *sig)
257 g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), (time_t) -1);
264 * g_mime_signature_set_expires:
265 * @sig: a #GMimeSignature
266 * @expires: expiration date
268 * Set the expiration date of the signature.
271 g_mime_signature_set_expires (GMimeSignature *sig, time_t expires)
273 g_return_if_fail (GMIME_IS_SIGNATURE (sig));
275 sig->expires = expires;
280 * g_mime_signature_get_expires:
281 * @sig: a #GMimeSignature
283 * Get the expiration date of the signature.
285 * Returns: the expiration date of the signature or %-1 if unknown.
288 g_mime_signature_get_expires (GMimeSignature *sig)
290 g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), (time_t) -1);
296 static void g_mime_signature_list_class_init (GMimeSignatureListClass *klass);
297 static void g_mime_signature_list_init (GMimeSignatureList *list, GMimeSignatureListClass *klass);
298 static void g_mime_signature_list_finalize (GObject *object);
301 static GObjectClass *list_parent_class = NULL;
305 g_mime_signature_list_get_type (void)
307 static GType type = 0;
310 static const GTypeInfo info = {
311 sizeof (GMimeSignatureListClass),
312 NULL, /* base_class_init */
313 NULL, /* base_class_finalize */
314 (GClassInitFunc) g_mime_signature_list_class_init,
315 NULL, /* class_finalize */
316 NULL, /* class_data */
317 sizeof (GMimeSignatureList),
319 (GInstanceInitFunc) g_mime_signature_list_init,
322 type = g_type_register_static (G_TYPE_OBJECT, "GMimeSignatureList", &info, 0);
330 g_mime_signature_list_class_init (GMimeSignatureListClass *klass)
332 GObjectClass *object_class = G_OBJECT_CLASS (klass);
334 list_parent_class = g_type_class_ref (G_TYPE_OBJECT);
336 object_class->finalize = g_mime_signature_list_finalize;
340 g_mime_signature_list_init (GMimeSignatureList *list, GMimeSignatureListClass *klass)
342 list->array = g_ptr_array_new ();
346 g_mime_signature_list_finalize (GObject *object)
348 GMimeSignatureList *list = (GMimeSignatureList *) object;
352 for (i = 0; i < list->array->len; i++) {
353 sig = (GMimeSignature *) list->array->pdata[i];
354 g_object_unref (sig);
357 g_ptr_array_free (list->array, TRUE);
359 G_OBJECT_CLASS (list_parent_class)->finalize (object);
364 * g_mime_signature_list_new:
366 * Creates a new #GMimeSignatureList.
368 * Returns: a new #GMimeSignatureList.
371 g_mime_signature_list_new (void)
373 return g_object_newv (GMIME_TYPE_SIGNATURE_LIST, 0, NULL);
378 * g_mime_signature_list_length:
379 * @list: a #GMimeSignatureList
381 * Gets the length of the list.
383 * Returns: the number of #GMimeSignature objects in the list.
386 g_mime_signature_list_length (GMimeSignatureList *list)
388 g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), -1);
390 return list->array->len;
395 * g_mime_signature_list_clear:
396 * @list: a #GMimeSignatureList
398 * Clears the list of addresses.
401 g_mime_signature_list_clear (GMimeSignatureList *list)
406 g_return_if_fail (GMIME_IS_SIGNATURE_LIST (list));
408 for (i = 0; i < list->array->len; i++) {
409 sig = (GMimeSignature *) list->array->pdata[i];
410 g_object_unref (sig);
413 g_ptr_array_set_size (list->array, 0);
418 * g_mime_signature_list_add:
419 * @list: a #GMimeSignatureList
420 * @sig: a #GMimeSignature
422 * Adds a #GMimeSignature to the #GMimeSignatureList.
424 * Returns: the index of the added #GMimeSignature.
427 g_mime_signature_list_add (GMimeSignatureList *list, GMimeSignature *sig)
431 g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), -1);
432 g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), -1);
434 index = list->array->len;
435 g_ptr_array_add (list->array, sig);
443 * g_mime_signature_list_insert:
444 * @list: a #GMimeSignatureList
445 * @index: index to insert at
446 * @sig: a #GMimeSignature
448 * Inserts a #GMimeSignature into the #GMimeSignatureList at the specified
452 g_mime_signature_list_insert (GMimeSignatureList *list, int index, GMimeSignature *sig)
457 g_return_if_fail (GMIME_IS_SIGNATURE_LIST (list));
458 g_return_if_fail (GMIME_IS_SIGNATURE (sig));
459 g_return_if_fail (index >= 0);
461 if ((guint) index < list->array->len) {
462 g_ptr_array_set_size (list->array, list->array->len + 1);
464 dest = ((char *) list->array->pdata) + (sizeof (void *) * (index + 1));
465 src = ((char *) list->array->pdata) + (sizeof (void *) * index);
466 n = list->array->len - index - 1;
468 g_memmove (dest, src, (sizeof (void *) * n));
469 list->array->pdata[index] = sig;
472 g_ptr_array_add (list->array, sig);
480 * g_mime_signature_list_remove:
481 * @list: a #GMimeSignatureList
482 * @sig: a #GMimeSignature
484 * Removes a #GMimeSignature from the #GMimeSignatureList.
486 * Returns: %TRUE if the specified #GMimeSignature was removed or %FALSE
490 g_mime_signature_list_remove (GMimeSignatureList *list, GMimeSignature *sig)
494 g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), FALSE);
495 g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), FALSE);
497 if ((index = g_mime_signature_list_index_of (list, sig)) == -1)
500 g_mime_signature_list_remove_at (list, index);
507 * g_mime_signature_list_remove_at:
508 * @list: a #GMimeSignatureList
509 * @index: index to remove
511 * Removes a #GMimeSignature from the #GMimeSignatureList at the specified
514 * Returns: %TRUE if an #GMimeSignature was removed or %FALSE otherwise.
517 g_mime_signature_list_remove_at (GMimeSignatureList *list, int index)
521 g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), FALSE);
522 g_return_val_if_fail (index >= 0, FALSE);
524 if ((guint) index >= list->array->len)
527 sig = list->array->pdata[index];
528 g_ptr_array_remove_index (list->array, index);
529 g_object_unref (sig);
536 * g_mime_signature_list_contains:
537 * @list: a #GMimeSignatureList
538 * @sig: a #GMimeSignature
540 * Checks whether or not the specified #GMimeSignature is contained within
541 * the #GMimeSignatureList.
543 * Returns: %TRUE if the specified #GMimeSignature is contained within the
544 * specified #GMimeSignatureList or %FALSE otherwise.
547 g_mime_signature_list_contains (GMimeSignatureList *list, GMimeSignature *sig)
549 return g_mime_signature_list_index_of (list, sig) != -1;
554 * g_mime_signature_list_index_of:
555 * @list: a #GMimeSignatureList
556 * @sig: a #GMimeSignature
558 * Gets the index of the specified #GMimeSignature inside the
559 * #GMimeSignatureList.
561 * Returns: the index of the requested #GMimeSignature within the
562 * #GMimeSignatureList or %-1 if it is not contained within the
563 * #GMimeSignatureList.
566 g_mime_signature_list_index_of (GMimeSignatureList *list, GMimeSignature *sig)
570 g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), -1);
571 g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), -1);
573 for (i = 0; i < list->array->len; i++) {
574 if (list->array->pdata[i] == sig)
583 * g_mime_signature_list_get_signature:
584 * @list: a #GMimeSignatureList
585 * @index: index of #GMimeSignature to get
587 * Gets the #GMimeSignature at the specified index.
589 * Returns: the #GMimeSignature at the specified index or %NULL if
590 * the index is out of range.
593 g_mime_signature_list_get_signature (GMimeSignatureList *list, int index)
595 g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), NULL);
596 g_return_val_if_fail (index >= 0, NULL);
598 if ((guint) index >= list->array->len)
601 return list->array->pdata[index];
606 * g_mime_signature_list_set_signature:
607 * @list: a #GMimeSignatureList
608 * @index: index of #GMimeSignature to set
609 * @sig: a #GMimeSignature
611 * Sets the #GMimeSignature at the specified index to @sig.
614 g_mime_signature_list_set_signature (GMimeSignatureList *list, int index, GMimeSignature *sig)
618 g_return_if_fail (GMIME_IS_SIGNATURE_LIST (list));
619 g_return_if_fail (GMIME_IS_SIGNATURE (sig));
620 g_return_if_fail (index >= 0);
622 if ((guint) index > list->array->len)
625 if ((guint) index == list->array->len) {
626 g_mime_signature_list_add (list, sig);
630 if ((old = list->array->pdata[index]) == sig)
633 list->array->pdata[index] = sig;
634 g_object_unref (old);