aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend')
-rw-r--r--addressbook/backend/idl/addressbook.idl12
-rw-r--r--addressbook/backend/pas/pas-backend-file.c52
-rw-r--r--addressbook/backend/pas/pas-backend-ldap.c19
-rw-r--r--addressbook/backend/pas/pas-book.c44
-rw-r--r--addressbook/backend/pas/pas-book.h11
5 files changed, 123 insertions, 15 deletions
diff --git a/addressbook/backend/idl/addressbook.idl b/addressbook/backend/idl/addressbook.idl
index b3bcb5ea87..9a7743f974 100644
--- a/addressbook/backend/idl/addressbook.idl
+++ b/addressbook/backend/idl/addressbook.idl
@@ -44,6 +44,18 @@ module Evolution {
VCard get_vcard (in CardId id);
/*
+ * Permissions. the first form is general write
+ * permission (whether or not the user can add or
+ * remove or modify any entry in the addressbook.)
+ *
+ * if can_write returns TRUE, can_write_card can still
+ * return FALSE if the user doesn't have permission to
+ * modify/remove that specific card.
+ */
+ boolean can_write ();
+ boolean can_write_card (in CardId Id);
+
+ /*
* Adding and deleting cards in the book.
*/
void create_card (in VCard vcard);
diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c
index 9de1b1c421..56a0fd4652 100644
--- a/addressbook/backend/pas/pas-backend-file.c
+++ b/addressbook/backend/pas/pas-backend-file.c
@@ -8,6 +8,7 @@
#include "config.h"
#include <gtk/gtksignal.h>
+#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#ifdef HAVE_DB_185_H
@@ -816,6 +817,45 @@ pas_backend_file_process_check_connection (PASBackend *backend,
pas_book_report_connection (book, bf->priv->file_db != NULL);
}
+static char *
+pas_backend_file_extract_path_from_uri (const char *uri)
+{
+ g_assert (strncasecmp (uri, "file:", 5) == 0);
+
+ return g_strdup (uri + 5);
+}
+
+static gboolean
+can_write (PASBackend *backend)
+{
+ PASBackendFile *bf = PAS_BACKEND_FILE (backend);
+ char *path = pas_backend_file_extract_path_from_uri (bf->priv->uri);
+ gboolean retval;
+
+ retval = (access (path, W_OK) != -1);
+
+ g_free (path);
+
+ return retval;
+}
+
+static gboolean
+pas_backend_file_can_write (PASBook *book)
+{
+ PASBackend* backend = pas_book_get_backend (book);
+
+ return can_write(backend);
+}
+
+static gboolean
+pas_backend_file_can_write_card (PASBook *book,
+ const char *id)
+{
+ PASBackend* backend = pas_book_get_backend (book);
+
+ return can_write(backend);
+}
+
static void
pas_backend_file_process_client_requests (PASBook *book)
{
@@ -895,14 +935,6 @@ pas_backend_file_get_vcard (PASBook *book, const char *id)
}
}
-static char *
-pas_backend_file_extract_path_from_uri (const char *uri)
-{
- g_assert (strncasecmp (uri, "file:", 5) == 0);
-
- return g_strdup (uri + 5);
-}
-
static gboolean
pas_backend_file_upgrade_db (PASBackendFile *bf, char *old_version)
{
@@ -1033,7 +1065,9 @@ pas_backend_file_add_client (PASBackend *backend,
book = pas_book_new (
backend, listener,
- pas_backend_file_get_vcard);
+ pas_backend_file_get_vcard,
+ pas_backend_file_can_write,
+ pas_backend_file_can_write_card);
if (!book) {
if (!bf->priv->clients)
diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c
index 845ef31e16..2f32661cca 100644
--- a/addressbook/backend/pas/pas-backend-ldap.c
+++ b/addressbook/backend/pas/pas-backend-ldap.c
@@ -207,6 +207,7 @@ pas_backend_ldap_build_all_cards_list(PASBackend *backend,
if (ldap) {
ldap->ld_sizelimit = LDAP_MAX_SEARCH_RESPONSES;
+ ldap->ld_deref = LDAP_DEREF_ALWAYS;
if ((ldap_error = ldap_search_s (ldap,
bl->priv->ldap_rootdn,
@@ -729,6 +730,7 @@ pas_backend_ldap_search (PASBackendLDAP *bl,
if (ldap) {
ldap->ld_sizelimit = LDAP_MAX_SEARCH_RESPONSES;
+ ldap->ld_deref = LDAP_DEREF_ALWAYS;
if ((view->search_msgid = ldap_search (ldap,
bl->priv->ldap_rootdn,
@@ -802,6 +804,19 @@ pas_backend_ldap_process_check_connection (PASBackend *backend,
pas_book_report_connection (book, bl->priv->connected);
}
+static gboolean
+pas_backend_ldap_can_write (PASBook *book)
+{
+ return FALSE; /* XXX */
+}
+
+static gboolean
+pas_backend_ldap_can_write_card (PASBook *book,
+ const char *id)
+{
+ return FALSE; /* XXX */
+}
+
static void
pas_backend_ldap_process_client_requests (PASBook *book)
{
@@ -927,7 +942,9 @@ pas_backend_ldap_add_client (PASBackend *backend,
book = pas_book_new (
backend, listener,
- pas_backend_ldap_get_vcard);
+ pas_backend_ldap_get_vcard,
+ pas_backend_ldap_can_write,
+ pas_backend_ldap_can_write_card);
if (!book) {
if (!bl->priv->clients)
diff --git a/addressbook/backend/pas/pas-book.c b/addressbook/backend/pas/pas-book.c
index 2601d3d9d0..55caf1dce7 100644
--- a/addressbook/backend/pas/pas-book.c
+++ b/addressbook/backend/pas/pas-book.c
@@ -23,6 +23,8 @@ struct _PASBookPrivate {
PASBackend *backend;
Evolution_BookListener listener;
PASBookGetVCardFn get_vcard;
+ PASBookCanWriteFn can_write;
+ PASBookCanWriteCardFn can_write_card;
GList *request_queue;
gint idle_id;
@@ -154,6 +156,31 @@ impl_Evolution_Book_get_vcard (PortableServer_Servant servant,
return retval;
}
+static CORBA_boolean
+impl_Evolution_Book_can_write (PortableServer_Servant servant,
+ CORBA_Environment *ev)
+{
+ PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
+ CORBA_boolean retval;
+
+ retval = (book->priv->can_write) (book);
+
+ return retval;
+}
+
+static CORBA_boolean
+impl_Evolution_Book_can_write_card (PortableServer_Servant servant,
+ const Evolution_CardId id,
+ CORBA_Environment *ev)
+{
+ PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
+ CORBA_boolean retval;
+
+ retval = (book->priv->can_write_card) (book, (const char *) id);
+
+ return retval;
+}
+
static void
impl_Evolution_Book_create_card (PortableServer_Servant servant,
const Evolution_VCard vcard,
@@ -452,7 +479,9 @@ static gboolean
pas_book_construct (PASBook *book,
PASBackend *backend,
Evolution_BookListener listener,
- PASBookGetVCardFn get_vcard)
+ PASBookGetVCardFn get_vcard,
+ PASBookCanWriteFn can_write,
+ PASBookCanWriteCardFn can_write_card)
{
POA_Evolution_Book *servant;
CORBA_Environment ev;
@@ -462,6 +491,8 @@ pas_book_construct (PASBook *book,
g_assert (PAS_IS_BOOK (book));
g_assert (listener != CORBA_OBJECT_NIL);
g_assert (get_vcard != NULL);
+ g_assert (can_write != NULL);
+ g_assert (can_write_card != NULL);
servant = (POA_Evolution_Book *) g_new0 (BonoboObjectServant, 1);
servant->vepv = &pas_book_vepv;
@@ -497,6 +528,8 @@ pas_book_construct (PASBook *book,
book->priv->listener = listener;
book->priv->get_vcard = get_vcard;
+ book->priv->can_write = can_write;
+ book->priv->can_write_card = can_write_card;
book->priv->backend = backend;
return TRUE;
@@ -508,7 +541,9 @@ pas_book_construct (PASBook *book,
PASBook *
pas_book_new (PASBackend *backend,
Evolution_BookListener listener,
- PASBookGetVCardFn get_vcard)
+ PASBookGetVCardFn get_vcard,
+ PASBookCanWriteFn can_write,
+ PASBookCanWriteCardFn can_write_card)
{
PASBook *book;
@@ -517,7 +552,8 @@ pas_book_new (PASBackend *backend,
book = gtk_type_new (pas_book_get_type ());
- if (! pas_book_construct (book, backend, listener, get_vcard)) {
+ if (! pas_book_construct (book, backend, listener,
+ get_vcard, can_write, can_write_card)) {
gtk_object_unref (GTK_OBJECT (book));
return NULL;
@@ -563,6 +599,8 @@ pas_book_get_epv (void)
epv = g_new0 (POA_Evolution_Book__epv, 1);
epv->get_vcard = impl_Evolution_Book_get_vcard;
+ epv->can_write = impl_Evolution_Book_can_write;
+ epv->can_write_card = impl_Evolution_Book_can_write_card;
epv->create_card = impl_Evolution_Book_create_card;
epv->remove_card = impl_Evolution_Book_remove_card;
epv->modify_card = impl_Evolution_Book_modify_card;
diff --git a/addressbook/backend/pas/pas-book.h b/addressbook/backend/pas/pas-book.h
index 094df79857..43a94b6600 100644
--- a/addressbook/backend/pas/pas-book.h
+++ b/addressbook/backend/pas/pas-book.h
@@ -52,11 +52,15 @@ typedef struct {
void (*requests_queued) (void);
} PASBookClass;
-typedef char * (*PASBookGetVCardFn) (PASBook *book, const char *id);
+typedef char * (*PASBookGetVCardFn) (PASBook *book, const char *id);
+typedef gboolean (*PASBookCanWriteFn) (PASBook *book);
+typedef gboolean (*PASBookCanWriteCardFn) (PASBook *book, const char *id);
PASBook *pas_book_new (PASBackend *backend,
Evolution_BookListener listener,
- PASBookGetVCardFn get_vcard);
+ PASBookGetVCardFn get_vcard,
+ PASBookCanWriteFn can_write,
+ PASBookCanWriteCardFn can_write_card);
PASBackend *pas_book_get_backend (PASBook *book);
Evolution_BookListener pas_book_get_listener (PASBook *book);
int pas_book_check_pending (PASBook *book);
@@ -80,6 +84,9 @@ void pas_book_respond_get_book_view (PASBook
void pas_book_report_connection (PASBook *book,
gboolean connected);
+gboolean pas_book_can_write (PASBook *book);
+gboolean pas_book_can_write_card (PASBook *book,
+ const char *id);
GtkType pas_book_get_type (void);
#define PAS_BOOK_TYPE (pas_book_get_type ())