/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* gnome-keyring.h - library for talking to the keyring daemon.

   Copyright (C) 2003 Red Hat, Inc

   The Gnome Keyring Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   The Gnome Keyring Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.

   Author: Alexander Larsson <alexl@redhat.com>
*/

#ifndef GNOME_KEYRING_H
#define GNOME_KEYRING_H

#include <glib.h>
#include <time.h>

typedef enum {
	GNOME_KEYRING_RESULT_OK,
	GNOME_KEYRING_RESULT_DENIED,
	GNOME_KEYRING_RESULT_NO_KEYRING_DAEMON,
	GNOME_KEYRING_RESULT_ALREADY_UNLOCKED,
	GNOME_KEYRING_RESULT_NO_SUCH_KEYRING,
	GNOME_KEYRING_RESULT_BAD_ARGUMENTS,
	GNOME_KEYRING_RESULT_IO_ERROR,
	GNOME_KEYRING_RESULT_CANCELLED,
	GNOME_KEYRING_RESULT_ALREADY_EXISTS,
} GnomeKeyringResult;

typedef enum {
	GNOME_KEYRING_ITEM_GENERIC_SECRET,
	GNOME_KEYRING_ITEM_NETWORK_PASSWORD,
	GNOME_KEYRING_ITEM_NOTE,
	
	GNOME_KEYRING_ITEM_LAST_TYPE,
	
	GNOME_KEYRING_ITEM_NO_TYPE = 0xffffffff,
} GnomeKeyringItemType;

typedef enum {
	GNOME_KEYRING_ACCESS_ASK,
	GNOME_KEYRING_ACCESS_DENY,
	GNOME_KEYRING_ACCESS_ALLOW
} GnomeKeyringAccessRestriction;

typedef enum {
	GNOME_KEYRING_ATTRIBUTE_TYPE_STRING,
	GNOME_KEYRING_ATTRIBUTE_TYPE_UINT32
} GnomeKeyringAttributeType;

typedef struct GnomeKeyringAccessControl GnomeKeyringAccessControl;
typedef struct GnomeKeyringApplicationRef GnomeKeyringApplicationRef;
typedef GArray GnomeKeyringAttributeList;

typedef enum {
	GNOME_KEYRING_ACCESS_READ = 1<<0,
	GNOME_KEYRING_ACCESS_WRITE = 1<<1,
	GNOME_KEYRING_ACCESS_REMOVE = 1<<2
} GnomeKeyringAccessType;

typedef struct GnomeKeyringInfo GnomeKeyringInfo;
typedef struct GnomeKeyringItemInfo GnomeKeyringItemInfo;

typedef struct {
	char *name;
	GnomeKeyringAttributeType type;
	union {
		char *string;
		guint32 integer;
	} value;
} GnomeKeyringAttribute;

typedef struct {
	char *keyring;
	guint item_id;
	GnomeKeyringAttributeList *attributes;
	char *secret;
} GnomeKeyringFound;

typedef void (*GnomeKeyringOperationDoneCallback)           (GnomeKeyringResult result,
							     gpointer           data);
typedef void (*GnomeKeyringOperationGetStringCallback)      (GnomeKeyringResult result,
							     const char        *string,
							     gpointer           data);
typedef void (*GnomeKeyringOperationGetIntCallback)         (GnomeKeyringResult result,
							     guint32            val,
							     gpointer           data);
typedef void (*GnomeKeyringOperationGetListCallback)        (GnomeKeyringResult result,
							     GList             *list,
							     gpointer           data);
typedef void (*GnomeKeyringOperationGetKeyringInfoCallback) (GnomeKeyringResult result,
							     GnomeKeyringInfo  *info,
							     gpointer           data);
typedef void (*GnomeKeyringOperationGetItemInfoCallback)    (GnomeKeyringResult   result,
							     GnomeKeyringItemInfo*info,
							     gpointer             data);
typedef void (*GnomeKeyringOperationGetAttributesCallback)  (GnomeKeyringResult   result,
							     GnomeKeyringAttributeList *attributes,
							     gpointer             data);

#define gnome_keyring_attribute_list_index(a, i) g_array_index ((a), GnomeKeyringAttribute, (i))
#define gnome_keyring_attribute_list_new() (g_array_new (FALSE, FALSE, sizeof (GnomeKeyringAttribute)))
void                       gnome_keyring_attribute_list_append_string (GnomeKeyringAttributeList *attributes,
								       const char                *attribute,
								       const char                *value);
void                       gnome_keyring_attribute_list_append_uint32 (GnomeKeyringAttributeList *attributes,
								       const char                *attribute,
								       guint32                    value);
void                       gnome_keyring_attribute_list_free          (GnomeKeyringAttributeList *attributes);
GnomeKeyringAttributeList *gnome_keyring_attribute_list_copy          (GnomeKeyringAttributeList *attributes);


gboolean gnome_keyring_is_available (void);

void gnome_keyring_free_password (char *password);

void gnome_keyring_found_free (GnomeKeyringFound *found);
void gnome_keyring_found_list_free (GList *found_list);

void gnome_keyring_cancel_request (gpointer request);

gpointer gnome_keyring_set_default_keyring (const char                             *keyring,
					    GnomeKeyringOperationDoneCallback       callback,
					    gpointer                                data,
					    GDestroyNotify                          destroy_data);
gpointer gnome_keyring_get_default_keyring (GnomeKeyringOperationGetStringCallback  callback,
					    gpointer                                data,
					    GDestroyNotify                          destroy_data);
gpointer gnome_keyring_list_keyring_names  (GnomeKeyringOperationGetListCallback    callback,
					    gpointer                                data,
					    GDestroyNotify                          destroy_data);
gpointer gnome_keyring_lock_all            (GnomeKeyringOperationDoneCallback       callback,
					    gpointer                                data,
					    GDestroyNotify                          destroy_data);


/* NULL password means ask user */
gpointer gnome_keyring_create        (const char                                  *keyring_name,
				      const char                                  *password,
				      GnomeKeyringOperationDoneCallback            callback,
				      gpointer                                     data,
				      GDestroyNotify                               destroy_data);
gpointer gnome_keyring_unlock        (const char                                  *keyring,
				      const char                                  *password,
				      GnomeKeyringOperationDoneCallback            callback,
				      gpointer                                     data,
				      GDestroyNotify                               destroy_data);
gpointer gnome_keyring_lock          (const char                                  *keyring,
				      GnomeKeyringOperationDoneCallback            callback,
				      gpointer                                     data,
				      GDestroyNotify                               destroy_data);
gpointer gnome_keyring_delete        (const char                                  *keyring,
				      GnomeKeyringOperationDoneCallback            callback,
				      gpointer                                     data,
				      GDestroyNotify                               destroy_data);
gpointer gnome_keyring_get_info      (const char                                  *keyring,
				      GnomeKeyringOperationGetKeyringInfoCallback  callback,
				      gpointer                                     data,
				      GDestroyNotify                               destroy_data);
gpointer gnome_keyring_set_info      (const char                                  *keyring,
				      GnomeKeyringInfo                            *info,
				      GnomeKeyringOperationDoneCallback            callback,
				      gpointer                                     data,
				      GDestroyNotify                               destroy_data);
gpointer gnome_keyring_list_item_ids (const char                                  *keyring,
				      GnomeKeyringOperationGetListCallback         callback,
				      gpointer                                     data,
				      GDestroyNotify                               destroy_data);


void              gnome_keyring_info_free             (GnomeKeyringInfo *keyring_info);
GnomeKeyringInfo *gnome_keyring_info_copy             (GnomeKeyringInfo *keyring_info);
void              gnome_keyring_info_set_lock_on_idle (GnomeKeyringInfo *keyring_info,
						       gboolean          value);
gboolean          gnome_keyring_info_get_lock_on_idle (GnomeKeyringInfo *keyring_info);
void              gnome_keyring_info_set_lock_timeout (GnomeKeyringInfo *keyring_info,
						       guint32           value);
guint32           gnome_keyring_info_get_lock_timeout (GnomeKeyringInfo *keyring_info);
time_t            gnome_keyring_info_get_mtime        (GnomeKeyringInfo *keyring_info);
time_t            gnome_keyring_info_get_ctime        (GnomeKeyringInfo *keyring_info);
gboolean          gnome_keyring_info_get_is_locked    (GnomeKeyringInfo *keyring_info);

gpointer gnome_keyring_find_items  (GnomeKeyringItemType                  type,
				    GnomeKeyringAttributeList            *attributes,
				    GnomeKeyringOperationGetListCallback  callback,
				    gpointer                              data,
				    GDestroyNotify                        destroy_data);
gpointer gnome_keyring_find_itemsv (GnomeKeyringItemType                  type,
				    GnomeKeyringOperationGetListCallback  callback,
				    gpointer                              data,
				    GDestroyNotify                        destroy_data,
				    ...);

GnomeKeyringResult gnome_keyring_find_items_sync  (GnomeKeyringItemType        type,
						   GnomeKeyringAttributeList  *attributes,
						   GList                     **found);
GnomeKeyringResult gnome_keyring_find_itemsv_sync (GnomeKeyringItemType        type,
						   GList                     **found,
						   ...);

gpointer           gnome_keyring_item_create         (const char                                 *keyring,
						      GnomeKeyringItemType                        type,
						      const char                                 *display_name,
						      GnomeKeyringAttributeList                  *attributes,
						      const char                                 *secret,
						      gboolean                                    update_if_exists,
						      GnomeKeyringOperationGetIntCallback         callback,
						      gpointer                                    data,
						      GDestroyNotify                              destroy_data);
GnomeKeyringResult gnome_keyring_item_create_sync    (const char                                 *keyring,
						      GnomeKeyringItemType                        type,
						      const char                                 *display_name,
						      GnomeKeyringAttributeList                  *attributes,
						      const char                                 *secret,
						      gboolean                                    update_if_exists,
						      guint32                                    *item_id);
gpointer           gnome_keyring_item_delete         (const char                                 *keyring,
						      guint32                                     id,
						      GnomeKeyringOperationDoneCallback           callback,
						      gpointer                                    data,
						      GDestroyNotify                              destroy_data);
gpointer           gnome_keyring_item_get_info       (const char                                 *keyring,
						      guint32                                     id,
						      GnomeKeyringOperationGetItemInfoCallback    callback,
						      gpointer                                    data,
						      GDestroyNotify                              destroy_data);
gpointer           gnome_keyring_item_set_info       (const char                                 *keyring,
						      guint32                                     id,
						      GnomeKeyringItemInfo                       *info,
						      GnomeKeyringOperationDoneCallback           callback,
						      gpointer                                    data,
						      GDestroyNotify                              destroy_data);
gpointer           gnome_keyring_item_get_attributes (const char                                 *keyring,
						      guint32                                     id,
						      GnomeKeyringOperationGetAttributesCallback  callback,
						      gpointer                                    data,
						      GDestroyNotify                              destroy_data);
gpointer           gnome_keyring_item_set_attributes (const char                                 *keyring,
						      guint32                                     id,
						      GnomeKeyringAttributeList                  *attributes,
						      GnomeKeyringOperationDoneCallback           callback,
						      gpointer                                    data,
						      GDestroyNotify                              destroy_data);
gpointer           gnome_keyring_item_get_acl        (const char                                 *keyring,
						      guint32                                     id,
						      GnomeKeyringOperationGetListCallback        callback,
						      gpointer                                    data,
						      GDestroyNotify                              destroy_data);
gpointer           gnome_keyring_item_set_acl        (const char                                 *keyring,
						      guint32                                     id,
						      GList                                      *acl,
						      GnomeKeyringOperationDoneCallback           callback,
						      gpointer                                    data,
						      GDestroyNotify                              destroy_data);



void                  gnome_keyring_item_info_free             (GnomeKeyringItemInfo *item_info);
GnomeKeyringItemInfo *gnome_keyring_item_info_new              (void);
GnomeKeyringItemInfo *gnome_keyring_item_info_copy             (GnomeKeyringItemInfo *item_info);
GnomeKeyringItemType  gnome_keyring_item_info_get_type         (GnomeKeyringItemInfo *item_info);
void                  gnome_keyring_item_info_set_type         (GnomeKeyringItemInfo *item_info,
								GnomeKeyringItemType  type);
char *                gnome_keyring_item_info_get_secret       (GnomeKeyringItemInfo *item_info);
void                  gnome_keyring_item_info_set_secret       (GnomeKeyringItemInfo *item_info,
								const char           *value);
char *                gnome_keyring_item_info_get_display_name (GnomeKeyringItemInfo *item_info);
void                  gnome_keyring_item_info_set_display_name (GnomeKeyringItemInfo *item_info,
								const char           *value);
time_t                gnome_keyring_item_info_get_mtime        (GnomeKeyringItemInfo *item_info);
time_t                gnome_keyring_item_info_get_ctime        (GnomeKeyringItemInfo *item_info);

GnomeKeyringApplicationRef * gnome_keyring_application_ref_new          (void);
GnomeKeyringApplicationRef * gnome_keyring_application_ref_copy         (const GnomeKeyringApplicationRef *app);
void                         gnome_keyring_application_ref_free         (GnomeKeyringApplicationRef       *app);

GnomeKeyringAccessControl *  gnome_keyring_access_control_new  (const GnomeKeyringApplicationRef *application,
                                  			       GnomeKeyringAccessType             types_allowed);
GnomeKeyringAccessControl *  gnome_keyring_access_control_copy (GnomeKeyringAccessControl        *ac);


void    gnome_keyring_access_control_free (GnomeKeyringAccessControl *ac);
GList * gnome_keyring_acl_copy            (GList                     *list);
void    gnome_keyring_acl_free            (GList                     *acl);


char *                gnome_keyring_item_ac_get_display_name   (GnomeKeyringAccessControl *ac);
void                  gnome_keyring_item_ac_set_display_name   (GnomeKeyringAccessControl *ac,
								const char           *value);

char *                gnome_keyring_item_ac_get_path_name      (GnomeKeyringAccessControl *ac);
void                  gnome_keyring_item_ac_set_path_name      (GnomeKeyringAccessControl *ac,
							        const char           *value);


GnomeKeyringAccessType gnome_keyring_item_ac_get_access_type   (GnomeKeyringAccessControl *ac);
void                   gnome_keyring_item_ac_set_access_type   (GnomeKeyringAccessControl *ac,
							        const GnomeKeyringAccessType value);

/* Specialized Helpers for network passwords items */

typedef struct {
	char *keyring;
	guint32 item_id;

	char *protocol;
	char *server;
	char *object;
	char *authtype;
	guint32 port;

	char *user;
	char *domain;
	char *password;
} GnomeKeyringNetworkPasswordData;

void gnome_keyring_network_password_free (GnomeKeyringNetworkPasswordData *data);
void gnome_keyring_network_password_list_free (GList *list);

gpointer           gnome_keyring_find_network_password      (const char                            *user,
							     const char                            *domain,
							     const char                            *server,
							     const char                            *object,
							     const char                            *protocol,
							     const char                            *authtype,
							     guint32                                port,
							     GnomeKeyringOperationGetListCallback   callback,
							     gpointer                               data,
							     GDestroyNotify                         destroy_data);
GnomeKeyringResult gnome_keyring_find_network_password_sync (const char                            *user,
							     const char                            *domain,
							     const char                            *server,
							     const char                            *object,
							     const char                            *protocol,
							     const char                            *authtype,
							     guint32                                port,
							     GList                                **result);
gpointer           gnome_keyring_set_network_password       (const char                            *keyring,
							     const char                            *user,
							     const char                            *domain,
							     const char                            *server,
							     const char                            *object,
							     const char                            *protocol,
							     const char                            *authtype,
							     guint32                                port,
							     const char                            *password,
							     GnomeKeyringOperationGetIntCallback    callback,
							     gpointer                               data,
							     GDestroyNotify                         destroy_data);
GnomeKeyringResult gnome_keyring_set_network_password_sync  (const char                            *keyring,
							     const char                            *user,
							     const char                            *domain,
							     const char                            *server,
							     const char                            *object,
							     const char                            *protocol,
							     const char                            *authtype,
							     guint32                                port,
							     const char                            *password,
							     guint32                               *item_id);


#endif /* GNOME_KEYRING_H */
