[balsa/wip/gtk4: 220/351] server: Declare it derivable



commit 585119dc8157396bb331e397eef4eb3e0bc0357a
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Wed Mar 14 22:48:16 2018 -0400

    server: Declare it derivable
    
    Use G_DECLARE_DERIVABLE_TYPE for LibBalsaServer, make it
    private, and provide a complete set of getters and setters.
    
    Still need to check for leaked strings.

 libbalsa/imap-server.c                   |  149 +++++----
 libbalsa/imap/imap-commands.c            |    2 +-
 libbalsa/mailbox_imap.c                  |   46 ++--
 libbalsa/mailbox_pop3.c                  |   26 +-
 libbalsa/mailbox_remote.h                |    4 +-
 libbalsa/send.c                          |   14 +-
 libbalsa/server.c                        |  546 ++++++++++++++++++++----------
 libbalsa/server.h                        |   76 +++--
 libbalsa/smtp-server.c                   |   54 ++--
 libinit_balsa/assistant_page_directory.c |    4 +-
 libinit_balsa/assistant_page_user.c      |   14 +-
 src/balsa-app.c                          |   48 ++--
 src/folder-conf.c                        |   27 +-
 src/mailbox-conf.c                       |   89 +++---
 src/mailbox-node.c                       |   11 +-
 src/save-restore.c                       |   23 +-
 16 files changed, 681 insertions(+), 452 deletions(-)
---
diff --git a/libbalsa/imap-server.c b/libbalsa/imap-server.c
index 4426a23..ed20750 100644
--- a/libbalsa/imap-server.c
+++ b/libbalsa/imap-server.c
@@ -42,7 +42,7 @@
 #include "imap-commands.h"
 #include <glib/gi18n.h>
 
-#define REQ_SSL(s) (LIBBALSA_SERVER(s)->use_ssl)
+#define REQ_SSL(s) libbalsa_server_get_use_ssl(LIBBALSA_SERVER(s))
 
 /** wait 60 seconds for packets */
 #define IMAP_CMD_TIMEOUT (60*1000)
@@ -137,13 +137,14 @@ libbalsa_imap_server_get_type(void)
 static void libbalsa_imap_server_set_username(LibBalsaServer * server,
                                               const gchar * name)
 {
-    if(server->host && name) { /* we have been initialized... */
+    if(libbalsa_server_get_host(server) && name) { /* we have been initialized... */
         LibBalsaImapServer *imap_server = LIBBALSA_IMAP_SERVER(server);
         
         g_mutex_lock(&imap_servers_lock);
         g_hash_table_steal(imap_servers, imap_server->key);
         g_free(imap_server->key);
-        imap_server->key = g_strdup_printf("%s@%s", name, server->host);
+        imap_server->key =
+            g_strdup_printf("%s@%s", name, libbalsa_server_get_host(server));
         g_hash_table_insert(imap_servers, imap_server->key, imap_server);
         g_mutex_unlock(&imap_servers_lock);
     }
@@ -153,12 +154,13 @@ static void
 libbalsa_imap_server_set_host(LibBalsaServer * server,
                               const gchar * host, gboolean use_ssl)
 {
-    if(server->user && host) { /* we have been initialized... */
+    if(libbalsa_server_get_user(server) && host) { /* we have been initialized... */
         LibBalsaImapServer *imap_server = LIBBALSA_IMAP_SERVER(server);
         g_mutex_lock(&imap_servers_lock);
         g_hash_table_steal(imap_servers, imap_server->key);
         g_free(imap_server->key);
-        imap_server->key = g_strdup_printf("%s@%s", server->user, host);
+        imap_server->key =
+            g_strdup_printf("%s@%s", libbalsa_server_get_user(server), host);
         g_hash_table_insert(imap_servers, imap_server->key, imap_server);
         g_mutex_unlock(&imap_servers_lock);
     }
@@ -187,7 +189,7 @@ libbalsa_imap_server_class_init(LibBalsaImapServerClass * klass)
 static void
 libbalsa_imap_server_init(LibBalsaImapServer * imap_server)
 {
-    LIBBALSA_SERVER(imap_server)->protocol = "imap";
+    libbalsa_server_set_protocol(LIBBALSA_SERVER(imap_server), "imap");
     imap_server->key = NULL;
     g_mutex_init(&imap_server->lock);
     imap_server->max_connections = MAX_CONNECTIONS_PER_SERVER;
@@ -296,7 +298,7 @@ is_info_cb(ImapMboxHandle *h, ImapResponse rc, const gchar* str, void *arg)
     default:
         return;
     }
-    libbalsa_information(it, fmt, is->host, str);
+    libbalsa_information(it, fmt, libbalsa_server_get_host(is), str);
 }
 
 
@@ -319,14 +321,15 @@ lb_imap_server_info_new(LibBalsaServer *server)
     imap_handle_set_monitorcb(handle, monitor_cb, info);
     imap_handle_set_infocb(handle,    is_info_cb, server);
     imap_handle_set_usercb(handle,    libbalsa_server_user_cb, server);
-    switch(server->tls_mode) {
+    switch(libbalsa_server_get_tls_mode(server)) {
     case LIBBALSA_TLS_DISABLED: mode = IMAP_TLS_DISABLED; break;
     default:
     case LIBBALSA_TLS_ENABLED : mode = IMAP_TLS_ENABLED;  break;
     case LIBBALSA_TLS_REQUIRED: mode = IMAP_TLS_REQUIRED; break;
     }
     imap_handle_set_tls_mode(handle, mode);
-    imap_handle_set_option(handle, IMAP_OPT_ANONYMOUS, server->try_anonymous);
+    imap_handle_set_option(handle, IMAP_OPT_ANONYMOUS,
+                           libbalsa_server_get_try_anonymous(server));
     imap_handle_set_option(handle, IMAP_OPT_CLIENT_SORT, TRUE);
 #ifdef HAVE_GPGME
     /* binary fetches change encoding and the checksums, and
@@ -463,40 +466,47 @@ LibBalsaImapServer* libbalsa_imap_server_new(const gchar *username,
 LibBalsaImapServer*
 libbalsa_imap_server_new_from_config(void)
 {
-    LibBalsaServer tmp_server;
+    gchar *user;
+    gchar *host;
     LibBalsaImapServer *imap_server;
     LibBalsaServer *server;
     gboolean d, d1;
     gint tls_mode, conn_limit;
 
-    tmp_server.host = libbalsa_conf_get_string("Server");
-    if(strrchr(tmp_server.host, ':') == NULL) {
+    host = libbalsa_conf_get_string("Server");
+    if(strrchr(host, ':') == NULL) {
         gint port;
         port = libbalsa_conf_get_int_with_default("Port", &d);
         if (!d) {
-            gchar *newhost = g_strdup_printf("%s:%d", tmp_server.host, port);
-            g_free(tmp_server.host);
-            tmp_server.host = newhost;
+            gchar *newhost = g_strdup_printf("%s:%d", host, port);
+            g_free(host);
+            host = newhost;
         }
-    }       
-    tmp_server.user = libbalsa_conf_private_get_string("Username");
-    if (!tmp_server.user)
-        tmp_server.user = g_strdup(getenv("USER"));
+    }
+    user = libbalsa_conf_private_get_string("Username");
+    if (user == NULL)
+        user = g_strdup(getenv("USER"));
 
-    imap_server = get_or_create(tmp_server.user, tmp_server.host);
+    imap_server = get_or_create(user, host);
     server = LIBBALSA_SERVER(imap_server);
-    if (server->user) {
-        g_free(tmp_server.user);
-        g_free(tmp_server.host);
-    } else {
-        server->user = tmp_server.user;
-        server->host = tmp_server.host;
+
+    if (libbalsa_server_get_user(server) == NULL) {
+        gboolean use_ssl;
+
+        libbalsa_server_set_username(server, user);
+        use_ssl = libbalsa_conf_get_bool("SSL=false");
+        use_ssl = use_ssl || libbalsa_server_get_use_ssl(server);
+        libbalsa_server_set_host(server, host, use_ssl);
     }
+    g_free(user);
+    g_free(host);
+
     d1 = libbalsa_conf_get_bool_with_default("Anonymous", &d);
-    if(!d) server->try_anonymous = !!d1;
-    server->use_ssl |= libbalsa_conf_get_bool("SSL=false");
+    if(!d) libbalsa_server_set_try_anonymous(server, !!d1);
+
     tls_mode = libbalsa_conf_get_int_with_default("TLSMode", &d);
-    if(!d) server->tls_mode = tls_mode;
+    if(!d) libbalsa_server_set_tls_mode(server, tls_mode);
+
     conn_limit = libbalsa_conf_get_int_with_default("ConnectionLimit", &d);
     if(!d) imap_server->max_connections = conn_limit;
     d1 = libbalsa_conf_get_bool_with_default("PersistentCache", &d);
@@ -507,62 +517,71 @@ libbalsa_imap_server_new_from_config(void)
     if(!d) imap_server->use_status = !!d1;
     d1 = libbalsa_conf_get_bool_with_default("UseIdle", &d);
     if(!d) imap_server->use_idle = !!d1;
-    if (!server->passwd) {
-        server->remember_passwd = libbalsa_conf_get_bool("RememberPasswd=false");
-        if(server->remember_passwd) {
+
+    if (libbalsa_server_get_passwd(server) == NULL) {
+        gboolean remember_passwd;
+        gchar *passwd = NULL;
+
+        remember_passwd = libbalsa_conf_get_bool("RememberPasswd=false");
+        libbalsa_server_set_remember_passwd(server, remember_passwd);
+        if (remember_passwd) {
 #if defined(HAVE_LIBSECRET)
+            const gchar *const_host;
+            const gchar *const_user;
             GError *err = NULL;
 
-            server->passwd =
-                secret_password_lookup_sync(LIBBALSA_SERVER_SECRET_SCHEMA,
-                                            NULL, &err,
-                                            "protocol", server->protocol,
-                                            "server",   server->host,
-                                            "user",     server->user,
-                                            NULL);
+            const_host = libbalsa_server_get_host(server);
+            const_user = libbalsa_server_get_user(server);
+            passwd = secret_password_lookup_sync(LIBBALSA_SERVER_SECRET_SCHEMA,
+                                                 NULL, &err,
+                                                 "protocol",
+                                                 libbalsa_server_get_protocol(server),
+                                                 "server", const_host,
+                                                 "user",   const_user,
+                                                 NULL);
             if (err) {
-                libbalsa_free_password(server->passwd);
-                server->passwd = NULL;
+                libbalsa_free_password(passwd);
                 printf(_("Error looking up password for %s@%s: %s\n"),
-                       server->user, server->host, err->message);
+                       const_user, const_host, err->message);
                 printf(_("Falling back\n"));
                 g_clear_error(&err);
-                server->passwd =
-                    libbalsa_conf_private_get_string("Password");
-                if (server->passwd != NULL) {
-                    gchar *buff = libbalsa_rot(server->passwd);
-                    libbalsa_free_password(server->passwd);
-                    server->passwd = buff;
+
+                passwd = libbalsa_conf_private_get_string("Password");
+                if (passwd != NULL) {
+                    gchar *buff = libbalsa_rot(passwd);
+                    libbalsa_free_password(passwd);
+                    passwd = buff;
+
                     secret_password_store_sync
                         (LIBBALSA_SERVER_SECRET_SCHEMA, NULL,
-                         _("Balsa passwords"), server->passwd, NULL, &err,
-                         "protocol", server->protocol,
-                         "server",   server->host,
-                         "user",     server->user,
+                         _("Balsa passwords"), passwd, NULL, &err,
+                         "protocol", libbalsa_server_get_protocol(server),
+                         "server",   const_host,
+                         "user",     const_user,
                          NULL);
                     /* We could in principle clear the password in the
                      * config file here but we do not for the backward
                      * compatibility. */
                     if (err) {
                         printf(_("Error storing password for %s@%s: %s\n"),
-                               server->user, server->host, err->message);
+                               const_user, const_host, err->message);
                         g_error_free(err);
                     }
                 }
             }
 #else
-            server->passwd = libbalsa_conf_private_get_string("Password");
-           if (server->passwd != NULL) {
-               gchar *buff = libbalsa_rot(server->passwd);
-               libbalsa_free_password(server->passwd);
-               server->passwd = buff;
+            passwd = libbalsa_conf_private_get_string("Password");
+           if (passwd != NULL) {
+               gchar *buff = libbalsa_rot(passwd);
+               libbalsa_free_password(passwd);
+               passwd = buff;
            }
 #endif                          /* defined(HAVE_LIBSECRET) */
        }
-        if(server->passwd && server->passwd[0] == '\0') {
-            libbalsa_free_password(server->passwd);
-            server->passwd = NULL;
+        if (passwd != NULL && passwd[0] == '\0') {
+            g_clear_pointer(&passwd, libbalsa_free_password);
         }
+        libbalsa_server_set_password(server, passwd);
     }
     return imap_server;
 }
@@ -591,7 +610,7 @@ handle_connection_error(int rc, struct handle_info *info,
     case IMAP_CONNECT_FAILED:
         g_set_error(err, LIBBALSA_MAILBOX_ERROR,
                     LIBBALSA_MAILBOX_NETWORK_ERROR,
-                    _("Cannot connect to %s"), server->host);
+                    _("Cannot connect to %s"), libbalsa_server_get_host(server));
         break;
     case IMAP_AUTH_CANCELLED:
         g_set_error(err, LIBBALSA_MAILBOX_ERROR,
@@ -661,7 +680,7 @@ libbalsa_imap_server_get_handle(LibBalsaImapServer *imap_server, GError **err)
         if(imap_mbox_is_disconnected(info->handle)) {
             ImapResult rc;
 
-            rc=imap_mbox_handle_connect(info->handle, server->host,
+            rc=imap_mbox_handle_connect(info->handle, libbalsa_server_get_host(server),
                                         REQ_SSL(server));
             if(rc != IMAP_SUCCESS) {
                 handle_connection_error(rc, info, server, err);
@@ -751,7 +770,7 @@ libbalsa_imap_server_get_handle_with_user(LibBalsaImapServer *imap_server,
         g_set_error(err, LIBBALSA_MAILBOX_ERROR,
                     LIBBALSA_MAILBOX_TOOMANYOPEN_ERROR,
                     _("Exceeded the number of connections per server %s"),
-                    server->host);
+                    libbalsa_server_get_host(server));
         g_mutex_unlock(&imap_server->lock);
         return NULL;
     }
@@ -759,7 +778,7 @@ libbalsa_imap_server_get_handle_with_user(LibBalsaImapServer *imap_server,
     if (imap_mbox_is_disconnected(info->handle)) {
         ImapResult rc;
 
-        rc=imap_mbox_handle_connect(info->handle, server->host,
+        rc=imap_mbox_handle_connect(info->handle, libbalsa_server_get_host(server),
                                     REQ_SSL(server));
         if(rc != IMAP_SUCCESS) {
             handle_connection_error(rc, info, server, err);
diff --git a/libbalsa/imap/imap-commands.c b/libbalsa/imap/imap-commands.c
index 6cfbc9e..57f3838 100644
--- a/libbalsa/imap/imap-commands.c
+++ b/libbalsa/imap/imap-commands.c
@@ -1395,7 +1395,7 @@ imap_mbox_handle_fetch_body(ImapMboxHandle* handle,
                             ImapFetchBodyOptions options,
                             ImapFetchBodyCb body_cb, void *arg)
 {
-  char cmd[160];
+  char cmd[200];
   ImapFetchBodyInternalCb fcb;
   void          *farg;
   ImapResponse rc;
diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index 2bbb8ed..0433502 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -363,7 +363,7 @@ libbalsa_mailbox_imap_new(void)
 void
 libbalsa_mailbox_imap_update_url(LibBalsaMailboxImap* mailbox)
 {
-    LibBalsaServer *s = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+    LibBalsaServer *s = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
 
     g_free(LIBBALSA_MAILBOX(mailbox)->url);
     LIBBALSA_MAILBOX(mailbox)->url = libbalsa_imap_url(s, mailbox->path);
@@ -470,7 +470,7 @@ get_header_cache_path(LibBalsaMailboxImap *mimap)
     LibBalsaServer *s = LIBBALSA_MAILBOX_REMOTE(mimap)->server;
     gchar *cache_dir = get_cache_dir(TRUE); /* FIXME */
     gchar *header_file = g_strdup_printf("%s@%s-%s-%u-headers2",
-                                        s->user, s->host,
+                                        libbalsa_server_get_user(s), libbalsa_server_get_host(s),
                                         (mimap->path ? mimap->path : "INBOX"),
                                         mimap->uid_validity);
     gchar *encoded_path = libbalsa_urlencode(header_file);
@@ -495,7 +495,7 @@ get_cache_name_pair(LibBalsaMailboxImap* mailbox, const gchar *type,
 
     res[0] = get_cache_dir(is_persistent);
     fname = g_strdup_printf("%s@%s-%s-%u-%u-%s",
-                            s->user, s->host,
+                            libbalsa_server_get_user(s), libbalsa_server_get_host(s),
                             (mailbox->path ? mailbox->path : "INBOX"),
                             uid_validity, uid, type);
     res[1] = libbalsa_urlencode(fname);
@@ -566,7 +566,7 @@ clean_dir(const char *dir_name, off_t cache_size)
 static gboolean
 clean_cache(LibBalsaMailbox* mailbox)
 {
-    LibBalsaServer *s= LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+    LibBalsaServer *s= LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
     gboolean is_persistent =
         libbalsa_imap_server_has_persistent_cache(LIBBALSA_IMAP_SERVER(s));
     gchar* dir;
@@ -642,7 +642,7 @@ libbalsa_mailbox_imap_get_handle(LibBalsaMailboxImap *mimap, GError **err)
     g_return_val_if_fail(LIBBALSA_MAILBOX_IMAP(mimap), NULL);
 
     if(!mimap->handle) {
-        LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_SERVER(mimap);
+        LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mimap);
         LibBalsaImapServer *imap_server;
         if (!LIBBALSA_IS_IMAP_SERVER(server))
             return NULL;
@@ -657,7 +657,7 @@ libbalsa_mailbox_imap_get_handle(LibBalsaMailboxImap *mimap, GError **err)
 
 #define RELEASE_HANDLE(mailbox,handle) \
     libbalsa_imap_server_release_handle( \
-               LIBBALSA_IMAP_SERVER(LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox)),\
+               LIBBALSA_IMAP_SERVER(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox)),\
                handle)
 
 static void
@@ -979,7 +979,7 @@ libbalsa_mailbox_imap_get_selected_handle(LibBalsaMailboxImap *mimap,
 
     g_return_val_if_fail(LIBBALSA_MAILBOX_IMAP(mimap), NULL);
 
-    server = LIBBALSA_MAILBOX_REMOTE_SERVER(mimap);
+    server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mimap);
     if (!LIBBALSA_IS_IMAP_SERVER(server))
        return NULL;
     imap_server = LIBBALSA_IMAP_SERVER(server);
@@ -1285,7 +1285,7 @@ static gboolean
 lbm_imap_check(LibBalsaMailbox * mailbox)
 {
     LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
-    LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+    LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
     ImapMboxHandle *handle;
     gulong id;
 
@@ -1646,7 +1646,7 @@ libbalsa_mailbox_imap_save_config(LibBalsaMailbox * mailbox,
 
     libbalsa_conf_set_string("Path", mimap->path);
 
-    libbalsa_server_save_config(LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox));
+    libbalsa_server_save_config(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox));
 
     if (LIBBALSA_MAILBOX_CLASS(parent_class)->save_config)
        LIBBALSA_MAILBOX_CLASS(parent_class)->save_config(mailbox, prefix);
@@ -1750,15 +1750,14 @@ libbalsa_mailbox_imap_reconnect(LibBalsaMailboxImap* mimap)
 
     if (mimap->handle &&
         imap_mbox_is_disconnected (mimap->handle)) {
-        printf("Reconnecting %s (%u)\n",
-               LIBBALSA_MAILBOX_REMOTE_SERVER(mimap)->host,
-               (unsigned)time(NULL));
+        const gchar *host =
+            libbalsa_server_get_host(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mimap));
+
+        printf("Reconnecting %s (%u)\n", host, (unsigned)time(NULL));
         if (imap_mbox_handle_reconnect
             (mimap->handle, &(LIBBALSA_MAILBOX(mimap)->readonly))
             == IMAP_SUCCESS)
-            printf("Reconnected %s (%u)\n",
-                   LIBBALSA_MAILBOX_REMOTE_SERVER(mimap)->host,
-                   (unsigned)time(NULL));
+            printf("Reconnected %s (%u)\n", host, (unsigned)time(NULL));
     }
 }
 
@@ -1896,14 +1895,14 @@ libbalsa_imap_delete_folder(LibBalsaMailboxImap *mailbox, GError **err)
 gchar *
 libbalsa_imap_url(LibBalsaServer * server, const gchar * path)
 {
-    gchar *enc = libbalsa_urlencode(server->user);
+    gchar *enc = libbalsa_urlencode(libbalsa_server_get_user(server));
     gchar *url = g_strdup_printf("imap%s://%s@%s/%s",
 #ifdef USE_SSL_TO_SET_IMAPS_IN_URL
                                  server->use_ssl ? "s" : "",
 #else
                                  "",
 #endif
-                                 enc, server->host,
+                                 enc, libbalsa_server_get_host(server),
                                  path ? path : "");
     g_free(enc);
 
@@ -2236,7 +2235,7 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox *mailbox,
        something else, like "audio", "*" - we do not prefetch such
        parts yet. Also, we save some RTTS for very small messages by
        fetching them in their entirety. */
-    server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+    server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
     if(!imap_mbox_handle_can_do(mimap->handle, IMCAP_FETCHBODY) ||
        libbalsa_imap_server_has_bug(LIBBALSA_IMAP_SERVER(server),
                                     ISBUG_FETCH) ||
@@ -2997,8 +2996,8 @@ libbalsa_mailbox_imap_add_messages(LibBalsaMailbox * mailbox,
        struct append_to_cache_data atcd;
        gchar *cache_dir;
 
-       atcd.user = s->user;
-       atcd.host = s->host;
+       atcd.user = libbalsa_server_get_user(s);
+       atcd.host = libbalsa_server_get_host(s);
        atcd.path = mimap->path ? mimap->path : "INBOX";
        atcd.cache_dir = cache_dir = get_cache_dir(is_persistent);
        atcd.curr_name = macd.outfiles;
@@ -3350,7 +3349,7 @@ libbalsa_mailbox_imap_messages_copy(LibBalsaMailbox * mailbox,
                libbalsa_imap_server_has_persistent_cache(is);
            gchar *dir_name = get_cache_dir(is_persistent);
            gchar *src_prefix = g_strdup_printf("%s@%s-%s-%u-",
-                                               s->user, s->host,
+                                               libbalsa_server_get_user(s), libbalsa_server_get_host(s),
                                                (mimap->path 
                                                 ? mimap->path : "INBOX"),
                                                mimap->uid_validity);
@@ -3376,8 +3375,9 @@ libbalsa_mailbox_imap_messages_copy(LibBalsaMailbox * mailbox,
                                g_build_filename(dir_name, filename, NULL);
                            gchar *dst_prefix =
                                g_strdup_printf("%s@%s-%s-%u-%u%s",
-                                               s->user, s->host,
-                                               (dst_imap->path 
+                                               libbalsa_server_get_user(s),
+                                                libbalsa_server_get_host(s),
+                                               (dst_imap->path
                                                 ? dst_imap->path : "INBOX"),
                                                uid_sequence.uid_validity,
                                                nth, tail);
diff --git a/libbalsa/mailbox_pop3.c b/libbalsa/mailbox_pop3.c
index 6459404..2fe870a 100644
--- a/libbalsa/mailbox_pop3.c
+++ b/libbalsa/mailbox_pop3.c
@@ -468,10 +468,10 @@ libbalsa_mailbox_pop3_startup(LibBalsaServer            *server,
        guint allow_auth;
 
        /* create the mailbox connection */
-       if (server->security == NET_CLIENT_CRYPT_ENCRYPTED) {
-               pop = net_client_pop_new(server->host, 995U, server->security, mbox->enable_pipe);
+       if (libbalsa_server_get_security(server) == NET_CLIENT_CRYPT_ENCRYPTED) {
+               pop = net_client_pop_new(libbalsa_server_get_host(server), 995U, 
libbalsa_server_get_security(server), mbox->enable_pipe);
        } else {
-               pop = net_client_pop_new(server->host, 110U, server->security, mbox->enable_pipe);
+               pop = net_client_pop_new(libbalsa_server_get_host(server), 110U, 
libbalsa_server_get_security(server), mbox->enable_pipe);
        }
        if (pop == NULL) {
                return NULL;
@@ -488,10 +488,10 @@ libbalsa_mailbox_pop3_startup(LibBalsaServer            *server,
        net_client_set_timeout(NET_CLIENT(pop), 60U);
 
        /* load client certificate if configured */
-       if (server->client_cert) {
+       if (libbalsa_server_get_client_cert(server)) {
                g_signal_connect(G_OBJECT(pop), "cert-pass", G_CALLBACK(libbalsa_server_get_cert_pass), 
server);
-               if (!net_client_set_cert_from_file(NET_CLIENT(pop), server->cert_file, &error)) {
-                       libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("Cannot load certificate file %s: 
%s"), server->cert_file,
+               if (!net_client_set_cert_from_file(NET_CLIENT(pop), libbalsa_server_get_cert_file(server), 
&error)) {
+                       libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("Cannot load certificate file %s: 
%s"), libbalsa_server_get_cert_file(server),
                                error->message);
                        g_error_free(error);
                        g_object_unref(G_OBJECT(pop));
@@ -504,9 +504,9 @@ libbalsa_mailbox_pop3_startup(LibBalsaServer            *server,
        g_signal_connect(G_OBJECT(pop), "auth", G_CALLBACK(libbalsa_server_get_auth), server);
 
        /* connect server */
-       libbalsa_mailbox_progress_notify(LIBBALSA_MAILBOX(mbox), LIBBALSA_NTFY_INIT, INFINITY, _("Connecting 
%s…"), server->host);
+       libbalsa_mailbox_progress_notify(LIBBALSA_MAILBOX(mbox), LIBBALSA_NTFY_INIT, INFINITY, _("Connecting 
%s…"), libbalsa_server_get_host(server));
        if (!net_client_pop_connect(pop, NULL, &error)) {
-               libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("POP3 mailbox %s: cannot connect %s: %s"), 
name, server->host,
+               libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("POP3 mailbox %s: cannot connect %s: %s"), 
name, libbalsa_server_get_host(server),
                        error->message);
                g_error_free(error);
                net_client_shutdown(NET_CLIENT(pop));
@@ -542,7 +542,7 @@ update_msg_list(struct fetch_data         *fd,
 
        /* load uid's if messages shall be left on the server */
        if (!mbox->delete_from_server) {
-               uid_prefix = g_strconcat(server->user, "@", server->host, NULL);
+               uid_prefix = g_strconcat(libbalsa_server_get_user(server), "@", 
libbalsa_server_get_host(server), NULL);
                prefix_len = strlen(uid_prefix);
                uids = mp_load_uids(uid_prefix);
                *current_uids = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
@@ -623,7 +623,7 @@ libbalsa_mailbox_pop3_check(LibBalsaMailbox * mailbox)
                return;
        }
 
-       server = LIBBALSA_MAILBOX_REMOTE_SERVER(mbox);
+       server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mbox);
 
        /* open the mailbox connection and get the messages list (note: initiates the progress dialogue) */
        pop = libbalsa_mailbox_pop3_startup(server, mbox, mailbox->name, &msg_list);
@@ -674,7 +674,7 @@ libbalsa_mailbox_pop3_check(LibBalsaMailbox * mailbox)
 
                /* store uid list */
                if (result && !mbox->delete_from_server) {
-                       gchar *uid_prefix = g_strconcat(server->user, "@", server->host, NULL);
+                       gchar *uid_prefix = g_strconcat(libbalsa_server_get_user(server), "@", 
libbalsa_server_get_host(server), NULL);
 
                        mp_save_uids(current_uids, uid_prefix, &err);
                        g_free(uid_prefix);
@@ -709,7 +709,7 @@ libbalsa_mailbox_pop3_save_config(LibBalsaMailbox * mailbox,
 
     pop = LIBBALSA_MAILBOX_POP3(mailbox);
 
-    libbalsa_server_save_config(LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox));
+    libbalsa_server_save_config(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox));
 
     libbalsa_conf_set_bool("Check", pop->check);
     libbalsa_conf_set_bool("Delete", pop->delete_from_server);
@@ -734,7 +734,7 @@ libbalsa_mailbox_pop3_load_config(LibBalsaMailbox * mailbox,
 
     pop = LIBBALSA_MAILBOX_POP3(mailbox);
 
-    libbalsa_server_load_config(LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox));
+    libbalsa_server_load_config(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox));
 
     pop->check = libbalsa_conf_get_bool("Check=false");
     pop->delete_from_server = libbalsa_conf_get_bool("Delete=false");
diff --git a/libbalsa/mailbox_remote.h b/libbalsa/mailbox_remote.h
index 1e9594f..38749e9 100644
--- a/libbalsa/mailbox_remote.h
+++ b/libbalsa/mailbox_remote.h
@@ -46,8 +46,8 @@
 #define LIBBALSA_IS_MAILBOX_REMOTE_CLASS(klass) \
     (G_TYPE_CHECK_CLASS_TYPE ((klass), LIBBALSA_TYPE_MAILBOX_REMOTE))
 
-#define LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox) \
-    (LIBBALSA_SERVER(LIBBALSA_MAILBOX_REMOTE(mailbox)->server))
+#define LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox) \
+    ((LibBalsaServer *) LIBBALSA_MAILBOX_REMOTE(mailbox)->server)
 
 typedef struct _LibBalsaMailboxRemoteClass LibBalsaMailboxRemoteClass;
 
diff --git a/libbalsa/send.c b/libbalsa/send.c
index 97a1952..e23703c 100644
--- a/libbalsa/send.c
+++ b/libbalsa/send.c
@@ -646,7 +646,7 @@ lbs_check_reachable_cb(GObject  *object,
         libbalsa_information(LIBBALSA_INFORMATION_WARNING,
                              _("Cannot reach SMTP server %s (%s), any queued message will remain in %s."),
                                                         libbalsa_smtp_server_get_name(smtp_server),
-                                                        LIBBALSA_SERVER(smtp_server)->host,
+                                                        
libbalsa_server_get_host(LIBBALSA_SERVER(smtp_server)),
                                                         send_info->outbox->name);
        }
 
@@ -771,20 +771,20 @@ lbs_process_queue_init_session(LibBalsaServer* server)
 {
        NetClientSmtp* session;
 
-       if (server->security == NET_CLIENT_CRYPT_ENCRYPTED) {
-               session = net_client_smtp_new(server->host, 465U, server->security);
+       if (libbalsa_server_get_security(server) == NET_CLIENT_CRYPT_ENCRYPTED) {
+               session = net_client_smtp_new(libbalsa_server_get_host(server), 465U, 
libbalsa_server_get_security(server));
        } else {
                // FIXME - submission (587) is the standard, but most isp's use 25...
-               session = net_client_smtp_new(server->host, 587U, server->security);
+               session = net_client_smtp_new(libbalsa_server_get_host(server), 587U, 
libbalsa_server_get_security(server));
        }
 
        /* load client certificate if configured */
-       if (server->client_cert) {
+       if (libbalsa_server_get_client_cert(server)) {
                GError* error = NULL;
 
                g_signal_connect(G_OBJECT(session), "cert-pass", G_CALLBACK(libbalsa_server_get_cert_pass), 
server);
-               if (!net_client_set_cert_from_file(NET_CLIENT(session), server->cert_file, &error)) {
-                       libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("Cannot load certificate file %s: 
%s"), server->cert_file,
+               if (!net_client_set_cert_from_file(NET_CLIENT(session), 
libbalsa_server_get_cert_file(server), &error)) {
+                       libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("Cannot load certificate file %s: 
%s"), libbalsa_server_get_cert_file(server),
                                error->message);
                        g_error_free(error);
                        g_object_unref(session);
diff --git a/libbalsa/server.c b/libbalsa/server.c
index acea0dd..ac51f74 100644
--- a/libbalsa/server.c
+++ b/libbalsa/server.c
@@ -51,7 +51,6 @@ static const SecretSchema server_schema = {
 const SecretSchema *LIBBALSA_SERVER_SECRET_SCHEMA = &server_schema;
 #endif                          /* defined(HAVE_LIBSECRET) */
 
-static GObjectClass *parent_class = NULL;
 static void libbalsa_server_class_init(LibBalsaServerClass * klass);
 static void libbalsa_server_init(LibBalsaServer * server);
 static void libbalsa_server_finalize(GObject * object);
@@ -64,8 +63,6 @@ static void libbalsa_server_real_set_host(LibBalsaServer * server,
 /* static gchar* libbalsa_server_real_get_password(LibBalsaServer *server); */
 
 enum {
-    SET_USERNAME,
-    SET_HOST,
     CONFIG_CHANGED,
     GET_PASSWORD,
     LAST_SIGNAL
@@ -73,31 +70,27 @@ enum {
 
 static guint libbalsa_server_signals[LAST_SIGNAL];
 
-GType
-libbalsa_server_get_type(void)
-{
-    static GType server_type = 0;
-
-    if (!server_type) {
-        static const GTypeInfo server_info = {
-            sizeof(LibBalsaServerClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-            (GClassInitFunc) libbalsa_server_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-            sizeof(LibBalsaServer),
-            0,                  /* n_preallocs */
-            (GInstanceInitFunc) libbalsa_server_init
-        };
-
-        server_type =
-            g_type_register_static(G_TYPE_OBJECT, "LibBalsaServer",
-                                   &server_info, 0);
-    }
+typedef struct {
+    GObject object;
+    gchar *protocol; /**< type of the server: imap, pop3, or smtp. */
 
-    return server_type;
-}
+    gchar *host;
+    gchar *user;
+    gchar *passwd;
+    NetClientCryptMode security;
+    gboolean client_cert;
+    gchar *cert_file;
+    gchar *cert_passphrase;
+    /* We include SSL support in UI unconditionally to preserve config
+     * between SSL and non-SSL builds. We just fail if SSL is requested
+     * in non-SSL build. */
+    LibBalsaTlsMode tls_mode;
+    unsigned use_ssl:1;
+    unsigned remember_passwd:1;
+    unsigned try_anonymous:1; /* user wants anonymous access */
+} LibBalsaServerPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE(LibBalsaServer, libbalsa_server, G_TYPE_OBJECT)
 
 static void
 libbalsa_server_class_init(LibBalsaServerClass * klass)
@@ -106,31 +99,8 @@ libbalsa_server_class_init(LibBalsaServerClass * klass)
 
     object_class = G_OBJECT_CLASS(klass);
 
-    parent_class = g_type_class_peek_parent(klass);
-
     object_class->finalize = libbalsa_server_finalize;
 
-    libbalsa_server_signals[SET_USERNAME] =
-       g_signal_new("set-username",
-                     G_TYPE_FROM_CLASS(object_class),
-                     G_SIGNAL_RUN_FIRST,
-                    G_STRUCT_OFFSET(LibBalsaServerClass,
-                                    set_username),
-                     NULL, NULL,
-                     g_cclosure_marshal_VOID__STRING,
-                     G_TYPE_NONE, 1,
-                    G_TYPE_STRING);
-    libbalsa_server_signals[SET_HOST] =
-       g_signal_new("set-host",
-                     G_TYPE_FROM_CLASS(object_class),
-                     G_SIGNAL_RUN_FIRST,
-                    G_STRUCT_OFFSET(LibBalsaServerClass,
-                                     set_host),
-                     NULL, NULL,
-                     libbalsa_VOID__POINTER_INT,
-                     G_TYPE_NONE, 2,
-                     G_TYPE_POINTER, G_TYPE_INT
-                    );
     libbalsa_server_signals[CONFIG_CHANGED] =
        g_signal_new("config-changed",
                      G_TYPE_FROM_CLASS(object_class),
@@ -154,47 +124,48 @@ libbalsa_server_class_init(LibBalsaServerClass * klass)
                      LIBBALSA_TYPE_MAILBOX);
 
     klass->set_username = libbalsa_server_real_set_username;
-    klass->set_host = libbalsa_server_real_set_host;
+    klass->set_host     = libbalsa_server_real_set_host;
     klass->get_password = NULL;        /* libbalsa_server_real_get_password; */
 }
 
 static void
 libbalsa_server_init(LibBalsaServer * server)
 {
-    server->protocol = "pop3"; /* Is this a sane default value? */
-    server->host = NULL;
-    server->user = NULL;
-    server->passwd = NULL;
-    server->remember_passwd = TRUE;
-    server->use_ssl         = FALSE;
-    server->tls_mode        = LIBBALSA_TLS_ENABLED;
-    server->security           = NET_CLIENT_CRYPT_STARTTLS;
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    priv->protocol        = "pop3"; /* Is this a sane default value? */
+    priv->host            = NULL;
+    priv->user            = NULL;
+    priv->passwd          = NULL;
+    priv->remember_passwd = TRUE;
+    priv->use_ssl         = FALSE;
+    priv->tls_mode        = LIBBALSA_TLS_ENABLED;
+    priv->security        = NET_CLIENT_CRYPT_STARTTLS;
 }
 
 static void
 libbalsa_server_finalize(GObject * object)
 {
-    LibBalsaServer *server;
-
-    g_return_if_fail(LIBBALSA_IS_SERVER(object));
+    LibBalsaServer *server = (LibBalsaServer *) object;
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
 
-    server = LIBBALSA_SERVER(object);
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
 
-    g_free(server->host);
-    g_free(server->user);
-    g_free(server->cert_file);
+    g_free(priv->host);
+    g_free(priv->user);
+    g_free(priv->cert_file);
 
-    if (server->passwd != NULL) {
-       memset(server->passwd, 0, strlen(server->passwd));
+    if (priv->passwd != NULL) {
+       memset(priv->passwd, 0, strlen(priv->passwd));
     }
-    libbalsa_free_password(server->passwd);
+    libbalsa_free_password(priv->passwd);
 
-    if (server->cert_passphrase != NULL) {
-       memset(server->cert_passphrase, 0, strlen(server->cert_passphrase));
+    if (priv->cert_passphrase != NULL) {
+       memset(priv->cert_passphrase, 0, strlen(priv->cert_passphrase));
     }
-    g_free(server->cert_passphrase);
+    g_free(priv->cert_passphrase);
 
-    G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(libbalsa_server_parent_class)->finalize(object);
 }
 
 LibBalsaServer *
@@ -214,18 +185,19 @@ libbalsa_server_set_username(LibBalsaServer * server,
     g_return_if_fail(server != NULL);
     g_return_if_fail(LIBBALSA_IS_SERVER(server));
 
-    g_signal_emit(G_OBJECT(server),
-                 libbalsa_server_signals[SET_USERNAME], 0, username);
+    LIBBALSA_SERVER_GET_CLASS(server)->set_username(server, username);
 }
 
 void
 libbalsa_server_set_password(LibBalsaServer * server,
                              const gchar * passwd)
 {
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
     g_return_if_fail(LIBBALSA_IS_SERVER(server));
 
-    libbalsa_free_password(server->passwd);
-    server->passwd = g_strdup(passwd);
+    libbalsa_free_password(priv->passwd);
+    priv->passwd = g_strdup(passwd);
 }
 
 void
@@ -235,9 +207,7 @@ libbalsa_server_set_host(LibBalsaServer * server, const gchar * host,
     g_return_if_fail(server != NULL);
     g_return_if_fail(LIBBALSA_IS_SERVER(server));
 
-    g_signal_emit(G_OBJECT(server), libbalsa_server_signals[SET_HOST],
-                 0, host, use_ssl);
-
+    LIBBALSA_SERVER_GET_CLASS(server)->set_host(server, host, use_ssl);
 }
 
 void
@@ -268,21 +238,25 @@ static void
 libbalsa_server_real_set_username(LibBalsaServer * server,
                                  const gchar * username)
 {
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
     g_return_if_fail(LIBBALSA_IS_SERVER(server));
 
-    g_free(server->user);
-    server->user = g_strdup(username);
+    g_free(priv->user);
+    priv->user = g_strdup(username);
 }
 
 static void
 libbalsa_server_real_set_host(LibBalsaServer * server, const gchar * host,
                               gboolean use_ssl)
 {
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
     g_return_if_fail(LIBBALSA_IS_SERVER(server));
 
-    g_free(server->host);
-    server->host = g_strdup(host);
-    server->use_ssl = use_ssl;
+    g_free(priv->host);
+    priv->host = g_strdup(host);
+    priv->use_ssl = use_ssl;
 }
 
 
@@ -290,9 +264,11 @@ libbalsa_server_real_set_host(LibBalsaServer * server, const gchar * host,
 static gchar *
 libbalsa_server_real_get_password(LibBalsaServer * server)
 {
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
     g_return_val_if_fail(LIBBALSA_IS_SERVER(server), NULL);
 
-    return g_strdup(server->passwd);
+    return g_strdup(priv->passwd);
 }
 #endif
 
@@ -306,98 +282,105 @@ libbalsa_server_real_get_password(LibBalsaServer * server)
 void
 libbalsa_server_load_config(LibBalsaServer * server)
 {
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
     gboolean d;
-    server->host = libbalsa_conf_get_string("Server");
-    if(server->host && strrchr(server->host, ':') == NULL) {
+
+    priv->host = libbalsa_conf_get_string("Server");
+    if(priv->host != NULL && strrchr(priv->host, ':') == NULL) {
         gint port;
         port = libbalsa_conf_get_int_with_default("Port", &d);
         if (!d) {
-            gchar *newhost = g_strdup_printf("%s:%d", server->host, port);
-            g_free(server->host);
-            server->host = newhost;
+            gchar *newhost = g_strdup_printf("%s:%d", priv->host, port);
+            g_free(priv->host);
+            priv->host = newhost;
         }
-    }       
-    server->use_ssl = libbalsa_conf_get_bool("SSL=false");
+    }
+
+    priv->use_ssl = libbalsa_conf_get_bool("SSL=false");
+
     d = FALSE;
-    server->tls_mode = libbalsa_conf_get_int_with_default("TLSMode", &d);
-    if(d) server->tls_mode = LIBBALSA_TLS_ENABLED;
+    priv->tls_mode = libbalsa_conf_get_int_with_default("TLSMode", &d);
+    if (d)
+        priv->tls_mode = LIBBALSA_TLS_ENABLED;
+
     d = FALSE;
-    server->security = libbalsa_conf_get_int_with_default("Security", &d);
+    priv->security = libbalsa_conf_get_int_with_default("Security", &d);
     if (d) {
-       server->security = NET_CLIENT_CRYPT_STARTTLS;
+       priv->security = NET_CLIENT_CRYPT_STARTTLS;
     }
-    server->user = libbalsa_conf_private_get_string("Username");
-    if (!server->user)
-       server->user = g_strdup(getenv("USER"));
 
-    server->try_anonymous = libbalsa_conf_get_bool("Anonymous=false");
-    server->remember_passwd = libbalsa_conf_get_bool("RememberPasswd=false");
+    priv->user = libbalsa_conf_private_get_string("Username");
+    if (priv->user == NULL)
+       priv->user = g_strdup(getenv("USER"));
+
+    priv->try_anonymous = libbalsa_conf_get_bool("Anonymous=false");
+    priv->remember_passwd = libbalsa_conf_get_bool("RememberPasswd=false");
 
-    if(server->remember_passwd) {
+    if(priv->remember_passwd) {
 #if defined(HAVE_LIBSECRET)
         GError *err = NULL;
 
-        server->passwd =
+        priv->passwd =
             secret_password_lookup_sync(LIBBALSA_SERVER_SECRET_SCHEMA,
                                         NULL, &err,
-                                        "protocol", server->protocol,
-                                        "server",   server->host,
-                                        "user",     server->user,
+                                        "protocol", priv->protocol,
+                                        "server",   priv->host,
+                                        "user",     priv->user,
                                         NULL);
         if (err) {
-            libbalsa_free_password(server->passwd);
-            server->passwd = NULL;
+            libbalsa_free_password(priv->passwd);
+            priv->passwd = NULL;
             printf(_("Error looking up password for %s@%s: %s\n"),
-                   server->user, server->host, err->message);
+                   priv->user, priv->host, err->message);
             printf(_("Falling back\n"));
             g_clear_error(&err);
-            server->passwd = libbalsa_conf_private_get_string("Password");
-            if (server->passwd != NULL) {
-                gchar *buff = libbalsa_rot(server->passwd);
-                libbalsa_free_password(server->passwd);
-                server->passwd = buff;
+            priv->passwd = libbalsa_conf_private_get_string("Password");
+            if (priv->passwd != NULL) {
+                gchar *buff = libbalsa_rot(priv->passwd);
+                libbalsa_free_password(priv->passwd);
+                priv->passwd = buff;
                 secret_password_store_sync
                     (LIBBALSA_SERVER_SECRET_SCHEMA, NULL,
-                     _("Balsa passwords"), server->passwd, NULL, &err,
-                     "protocol", server->protocol,
-                     "server",   server->host,
-                     "user",     server->user,
+                     _("Balsa passwords"), priv->passwd, NULL, &err,
+                     "protocol", priv->protocol,
+                     "server",   priv->host,
+                     "user",     priv->user,
                      NULL);
                 /* We could in principle clear the password in the
                  * config file here but we do not for the backward
                  * compatibility. */
                 if (err) {
                     printf(_("Error storing password for %s@%s: %s\n"),
-                           server->user, server->host, err->message);
+                           priv->user, priv->host, err->message);
                     g_error_free(err);
                 }
             }
         }
 #else
-       server->passwd = libbalsa_conf_private_get_string("Password");
-       if (server->passwd != NULL) {
-           gchar *buff = libbalsa_rot(server->passwd);
-           libbalsa_free_password(server->passwd);
-           server->passwd = buff;
+       priv->passwd = libbalsa_conf_private_get_string("Password");
+       if (priv->passwd != NULL) {
+           gchar *buff = libbalsa_rot(priv->passwd);
+           libbalsa_free_password(priv->passwd);
+           priv->passwd = buff;
        }
 #endif
     }
-    if(server->passwd && server->passwd[0] == '\0') {
-       libbalsa_free_password(server->passwd);
-       server->passwd = NULL;
+    if(priv->passwd && priv->passwd[0] == '\0') {
+       libbalsa_free_password(priv->passwd);
+       priv->passwd = NULL;
     }
 
-    server->client_cert = libbalsa_conf_get_bool("NeedClientCert=false");
-    server->cert_file = libbalsa_conf_get_string("UserCertificateFile");
-    server->cert_passphrase = libbalsa_conf_private_get_string("CertificatePassphrase");
-    if ((server->cert_passphrase != NULL) && (server->cert_passphrase[0] != '\0')) {
-        gchar *tmp = libbalsa_rot(server->cert_passphrase);
+    priv->client_cert = libbalsa_conf_get_bool("NeedClientCert=false");
+    priv->cert_file = libbalsa_conf_get_string("UserCertificateFile");
+    priv->cert_passphrase = libbalsa_conf_private_get_string("CertificatePassphrase");
+    if ((priv->cert_passphrase != NULL) && (priv->cert_passphrase[0] != '\0')) {
+        gchar *tmp = libbalsa_rot(priv->cert_passphrase);
 
-        g_free(server->cert_passphrase);
-        server->cert_passphrase = tmp;
+        g_free(priv->cert_passphrase);
+        priv->cert_passphrase = tmp;
     } else {
-       g_free(server->cert_passphrase);
-       server->cert_passphrase = NULL;
+       g_free(priv->cert_passphrase);
+       priv->cert_passphrase = NULL;
     }
 }
 
@@ -410,49 +393,51 @@ libbalsa_server_load_config(LibBalsaServer * server)
 void
 libbalsa_server_save_config(LibBalsaServer * server)
 {
-    libbalsa_conf_set_string("Server", server->host);
-    libbalsa_conf_private_set_string("Username", server->user);
-    libbalsa_conf_set_bool("Anonymous",          server->try_anonymous);
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    libbalsa_conf_set_string("Server", priv->host);
+    libbalsa_conf_private_set_string("Username", priv->user);
+    libbalsa_conf_set_bool("Anonymous",          priv->try_anonymous);
     libbalsa_conf_set_bool("RememberPasswd", 
-                          server->remember_passwd && server->passwd != NULL);
+                          priv->remember_passwd && priv->passwd != NULL);
 
-    if (server->remember_passwd && server->passwd != NULL) {
+    if (priv->remember_passwd && priv->passwd != NULL) {
 #if defined(HAVE_LIBSECRET)
         GError *err = NULL;
 
         secret_password_store_sync(LIBBALSA_SERVER_SECRET_SCHEMA, NULL,
-                                   _("Balsa passwords"), server->passwd,
+                                   _("Balsa passwords"), priv->passwd,
                                    NULL, &err,
-                                   "protocol", server->protocol,
-                                   "server",   server->host,
-                                   "user",     server->user,
+                                   "protocol", priv->protocol,
+                                   "server",   priv->host,
+                                   "user",     priv->user,
                                    NULL);
         if (err) {
             printf(_("Error storing password for %s@%s: %s\n"),
-                   server->user, server->host, err->message);
+                   priv->user, priv->host, err->message);
             g_error_free(err);
         }
 #else
-       gchar *buff = libbalsa_rot(server->passwd);
+       gchar *buff = libbalsa_rot(priv->passwd);
        libbalsa_conf_private_set_string("Password", buff);
        g_free(buff);
 #endif                          /* defined(HAVE_LIBSECRET) */
     }
 
-    libbalsa_conf_set_bool("NeedClientCert", server->client_cert);
-    if (server->cert_file != NULL) {
-       libbalsa_conf_set_string("UserCertificateFile", server->cert_file);
+    libbalsa_conf_set_bool("NeedClientCert", priv->client_cert);
+    if (priv->cert_file != NULL) {
+       libbalsa_conf_set_string("UserCertificateFile", priv->cert_file);
     }
-    if (server->cert_passphrase != NULL) {
-        gchar *tmp = libbalsa_rot(server->cert_passphrase);
+    if (priv->cert_passphrase != NULL) {
+        gchar *tmp = libbalsa_rot(priv->cert_passphrase);
 
         libbalsa_conf_private_set_string("CertificatePassphrase", tmp);
         g_free(tmp);
     }
 
-    libbalsa_conf_set_bool("SSL", server->use_ssl);
-    libbalsa_conf_set_int("TLSMode", server->tls_mode);
-    libbalsa_conf_set_int("Security", server->security);
+    libbalsa_conf_set_bool("SSL", priv->use_ssl);
+    libbalsa_conf_set_int("TLSMode", priv->tls_mode);
+    libbalsa_conf_set_int("Security", priv->security);
 }
 
 void
@@ -461,6 +446,7 @@ libbalsa_server_user_cb(ImapUserEventType ue, void *arg, ...)
     va_list alist;
     int *ok;
     LibBalsaServer *is = LIBBALSA_SERVER(arg);
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(is);
 
     va_start(alist, arg);
     switch(ue) {
@@ -469,17 +455,17 @@ libbalsa_server_user_cb(ImapUserEventType ue, void *arg, ...)
         gchar **user = va_arg(alist, gchar**);
         gchar **pass = va_arg(alist, gchar**);
         ok = va_arg(alist, int*);
-        if(!is->passwd) {
-            is->passwd = libbalsa_server_get_password(is, NULL);
+        if(!priv->passwd) {
+            priv->passwd = libbalsa_server_get_password(is, NULL);
         }
-        *ok = is->passwd != NULL;
+        *ok = priv->passwd != NULL;
         if(*ok) {
-            g_free(*user); *user = g_strdup(is->user);
-            g_free(*pass); *pass = g_strdup(is->passwd);
+            g_free(*user); *user = g_strdup(priv->user);
+            g_free(*pass); *pass = g_strdup(priv->passwd);
             libbalsa_information(LIBBALSA_INFORMATION_DEBUG,
                                  /* host, authentication method */
                                  _("Logging in to %s using %s"), 
-                                   is->host, method);
+                                   priv->host, method);
         }
         break;
     }
@@ -489,7 +475,7 @@ libbalsa_server_user_cb(ImapUserEventType ue, void *arg, ...)
         user = va_arg(alist, gchar**);
         ok = va_arg(alist, int*);
         *ok = 1; /* consider popping up a dialog window here */
-        g_free(*user); *user = g_strdup(is->user);
+        g_free(*user); *user = g_strdup(priv->user);
         break;
     }
     case IME_TLS_VERIFY_ERROR:  {
@@ -523,7 +509,7 @@ libbalsa_server_user_cb(ImapUserEventType ue, void *arg, ...)
     }
     case IME_TIMEOUT: {
         ok = va_arg(alist, int*); *ok = 1;
-        /* *ok = libbalsa_abort_on_timeout(is->host); */
+        /* *ok = libbalsa_abort_on_timeout(priv->host); */
         /* For now, always timeout. The UI needs some work. */
         break;
     }
@@ -537,8 +523,8 @@ libbalsa_server_user_cb(ImapUserEventType ue, void *arg, ...)
  * popped up the corresponding number of times, so we'll ignore the
  * request if a callback is already connected. */
 void
-libbalsa_server_connect_signals(LibBalsaServer * server, GCallback cb,
-                                gpointer cb_data)
+libbalsa_server_connect_get_password(LibBalsaServer * server, GCallback cb,
+                                     gpointer cb_data)
 {
     if (!g_signal_has_handler_pending(server,
                                       libbalsa_server_signals
@@ -553,16 +539,17 @@ libbalsa_server_get_auth(NetClient *client,
                                         gpointer   user_data)
 {
     LibBalsaServer *server = LIBBALSA_SERVER(user_data);
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
     gchar **result = NULL;
 
     g_debug("%s: %p %p: encrypted = %d", __func__, client, user_data,
             net_client_is_encrypted(client));
-    if (server->try_anonymous == 0U) {
+    if (priv->try_anonymous == 0U) {
         result = g_new0(gchar *, 3U);
-        result[0] = g_strdup(server->user);
+        result[0] = g_strdup(priv->user);
         if (need_passwd) {
-               if ((server->passwd != NULL) && (server->passwd[0] != '\0')) {
-                       result[1] = g_strdup(server->passwd);
+               if ((priv->passwd != NULL) && (priv->passwd[0] != '\0')) {
+                       result[1] = g_strdup(priv->passwd);
                } else {
                        result[1] = libbalsa_server_get_password(server, NULL);
                }
@@ -630,8 +617,11 @@ libbalsa_server_get_cert_pass(NetClient        *client,
                                                          const GByteArray *cert_der,
                                                          gpointer          user_data)
 {
+    LibBalsaServer *server = LIBBALSA_SERVER(user_data);
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
        /* FIXME - we just return the passphrase from the config, but we may also want to show a dialogue 
here... */
-       return g_strdup(LIBBALSA_SERVER(user_data)->cert_passphrase);
+       return g_strdup(priv->cert_passphrase);
 }
 
 /* Test whether a server is reachable */
@@ -663,6 +653,7 @@ libbalsa_server_test_can_reach_full(LibBalsaServer           * server,
                                     gpointer                   cb_data,
                                     GObject                  * source_object)
 {
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
     CanReachInfo *info;
     gchar *host;
     gchar *colon;
@@ -676,7 +667,7 @@ libbalsa_server_test_can_reach_full(LibBalsaServer           * server,
 
     monitor = g_network_monitor_get_default();
 
-    host = g_strdup(server->host);
+    host = g_strdup(priv->host);
     colon = strchr(host, ':');
     if (colon != NULL) {
        colon[0] = '\0';
@@ -695,3 +686,214 @@ libbalsa_server_test_can_reach(LibBalsaServer           * server,
 {
     libbalsa_server_test_can_reach_full(server, cb, cb_data, (GObject *) server);
 }
+
+/*
+ * Getters
+ */
+
+LibBalsaTlsMode
+libbalsa_server_get_tls_mode(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), (LibBalsaTlsMode) 0);
+
+    return priv->tls_mode;
+}
+
+NetClientCryptMode
+libbalsa_server_get_security(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), (NetClientCryptMode) 0);
+
+    return priv->security;
+}
+
+gboolean
+libbalsa_server_get_use_ssl(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), FALSE);
+
+    return priv->use_ssl;
+}
+
+gboolean
+libbalsa_server_get_client_cert(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), FALSE);
+
+    return priv->client_cert;
+}
+
+gboolean
+libbalsa_server_get_try_anonymous(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), FALSE);
+
+    return priv->try_anonymous;
+}
+
+gboolean
+libbalsa_server_get_remember_passwd(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), FALSE);
+
+    return priv->remember_passwd;
+}
+
+const gchar *
+libbalsa_server_get_user(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), NULL);
+
+    return priv->user;
+}
+
+const gchar *
+libbalsa_server_get_host(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), NULL);
+
+    return priv->host;
+}
+
+const gchar *
+libbalsa_server_get_protocol(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), NULL);
+
+    return priv->protocol;
+}
+
+const gchar *
+libbalsa_server_get_cert_file(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), NULL);
+
+    return priv->cert_file;
+}
+
+const gchar *
+libbalsa_server_get_cert_passphrase(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), NULL);
+
+    return priv->cert_passphrase;
+}
+
+const gchar *
+libbalsa_server_get_passwd(LibBalsaServer * server)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_val_if_fail(LIBBALSA_IS_SERVER(server), NULL);
+
+    return priv->passwd;
+}
+
+/*
+ * Setters
+ */
+
+void
+libbalsa_server_set_tls_mode(LibBalsaServer * server, LibBalsaTlsMode tls_mode)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
+
+    priv->tls_mode = tls_mode;
+}
+
+void
+libbalsa_server_set_security(LibBalsaServer * server, NetClientCryptMode security)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
+
+    priv->security = security;
+}
+
+void
+libbalsa_server_set_try_anonymous(LibBalsaServer * server, gboolean try_anonymous)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
+
+    priv->try_anonymous = try_anonymous;
+}
+
+void
+libbalsa_server_set_remember_passwd(LibBalsaServer * server, gboolean remember_passwd)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
+
+    priv->remember_passwd = remember_passwd;
+}
+
+void
+libbalsa_server_set_client_cert(LibBalsaServer * server, gboolean client_cert)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
+
+    priv->client_cert = client_cert;
+}
+
+void
+libbalsa_server_set_protocol(LibBalsaServer * server, const gchar * protocol)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
+
+    g_free(priv->protocol);
+    priv->protocol = g_strdup(protocol);
+}
+
+void
+libbalsa_server_set_cert_file(LibBalsaServer * server, const gchar * cert_file)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
+
+    g_free(priv->cert_file);
+    priv->cert_file = g_strdup(cert_file);
+}
+
+void
+libbalsa_server_set_cert_passphrase(LibBalsaServer * server, const gchar * cert_passphrase)
+{
+    LibBalsaServerPrivate *priv = libbalsa_server_get_instance_private(server);
+
+    g_return_if_fail(LIBBALSA_IS_SERVER(server));
+
+    g_free(priv->cert_passphrase);
+    priv->cert_passphrase = g_strdup(cert_passphrase);
+}
diff --git a/libbalsa/server.h b/libbalsa/server.h
index 2f47088..f76892a 100644
--- a/libbalsa/server.h
+++ b/libbalsa/server.h
@@ -37,21 +37,13 @@ extern const SecretSchema *LIBBALSA_SERVER_SECRET_SCHEMA;
 #define libbalsa_free_password g_free
 #endif                          /* defined(HAVE_LIBSECRET) */
 
-#define LIBBALSA_TYPE_SERVER \
-    (libbalsa_server_get_type())
-#define LIBBALSA_SERVER(obj) \
-    (G_TYPE_CHECK_INSTANCE_CAST (obj, LIBBALSA_TYPE_SERVER, LibBalsaServer))
-#define LIBBALSA_SERVER_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_CAST (klass, LIBBALSA_TYPE_SERVER, \
-                              LibBalsaServerClass))
-#define LIBBALSA_IS_SERVER(obj) \
-    (G_TYPE_CHECK_INSTANCE_TYPE (obj, LIBBALSA_TYPE_SERVER))
-#define LIBBALSA_IS_SERVER_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_TYPE (klass, LIBBALSA_TYPE_SERVER))
-
-GType libbalsa_server_get_type(void);
-
-typedef struct _LibBalsaServerClass LibBalsaServerClass;
+#define LIBBALSA_TYPE_SERVER (libbalsa_server_get_type())
+
+G_DECLARE_DERIVABLE_TYPE(LibBalsaServer,
+                         libbalsa_server,
+                         LIBBALSA,
+                         SERVER,
+                         GObject)
 
 typedef enum {
     LIBBALSA_TLS_DISABLED,
@@ -59,26 +51,6 @@ typedef enum {
     LIBBALSA_TLS_REQUIRED
 } LibBalsaTlsMode;
 
-struct _LibBalsaServer {
-    GObject object;
-    const gchar *protocol; /**< type of the server: imap, pop3, or smtp. */
-
-    gchar *host;
-    gchar *user;
-    gchar *passwd;
-    NetClientCryptMode security;
-    gboolean client_cert;
-    gchar *cert_file;
-    gchar *cert_passphrase;
-    /* We include SSL support in UI unconditionally to preserve config
-     * between SSL and non-SSL builds. We just fail if SSL is requested
-     * in non-SSL build. */
-    LibBalsaTlsMode tls_mode;
-    unsigned use_ssl:1;
-    unsigned remember_passwd:1;
-    unsigned try_anonymous:1; /* user wants anonymous access */
-};
-
 struct _LibBalsaServerClass {
     GObjectClass parent_class;
 
@@ -119,8 +91,8 @@ gchar *libbalsa_server_get_cert_pass(NetClient        *client,
                                                                         const GByteArray *cert_der,
                                                                         gpointer          user_data);
 
-void libbalsa_server_connect_signals(LibBalsaServer * server, GCallback cb,
-                                     gpointer cb_data);
+void libbalsa_server_connect_get_password(LibBalsaServer * server, GCallback cb,
+                                          gpointer cb_data);
 
 /* Check whether a server can be reached */
 
@@ -134,4 +106,34 @@ void libbalsa_server_test_can_reach_full(LibBalsaServer           * server,
                                          gpointer                   cb_data,
                                          GObject                  * source_object);
 
+/*
+ * Getters
+ */
+
+LibBalsaTlsMode libbalsa_server_get_tls_mode(LibBalsaServer * server);
+NetClientCryptMode libbalsa_server_get_security(LibBalsaServer * server);
+gboolean libbalsa_server_get_use_ssl(LibBalsaServer * server);
+gboolean libbalsa_server_get_client_cert(LibBalsaServer * server);
+gboolean libbalsa_server_get_try_anonymous(LibBalsaServer * server);
+gboolean libbalsa_server_get_remember_passwd(LibBalsaServer * server);
+const gchar * libbalsa_server_get_user(LibBalsaServer * server);
+const gchar * libbalsa_server_get_host(LibBalsaServer * server);
+const gchar * libbalsa_server_get_protocol(LibBalsaServer * server);
+const gchar * libbalsa_server_get_cert_file(LibBalsaServer * server);
+const gchar * libbalsa_server_get_cert_passphrase(LibBalsaServer * server);
+const gchar * libbalsa_server_get_passwd(LibBalsaServer * server);
+
+/*
+ * Setters
+ */
+
+void libbalsa_server_set_tls_mode(LibBalsaServer * server, LibBalsaTlsMode tls_mode);
+void libbalsa_server_set_security(LibBalsaServer * server, NetClientCryptMode security);
+void libbalsa_server_set_try_anonymous(LibBalsaServer * server, gboolean try_anonymous);
+void libbalsa_server_set_remember_passwd(LibBalsaServer * server, gboolean remember_passwd);
+void libbalsa_server_set_client_cert(LibBalsaServer * server, gboolean client_cert);
+void libbalsa_server_set_protocol(LibBalsaServer * server, const gchar * protocol);
+void libbalsa_server_set_cert_file(LibBalsaServer * server, const gchar * cert_file);
+void libbalsa_server_set_cert_passphrase(LibBalsaServer * server, const gchar * cert_passphrase);
+
 #endif                         /* __LIBBALSA_SERVER_H__ */
diff --git a/libbalsa/smtp-server.c b/libbalsa/smtp-server.c
index 7020018..c4f59db 100644
--- a/libbalsa/smtp-server.c
+++ b/libbalsa/smtp-server.c
@@ -86,7 +86,7 @@ libbalsa_smtp_server_class_init(LibBalsaSmtpServerClass * klass)
 static void
 libbalsa_smtp_server_init(LibBalsaSmtpServer * smtp_server)
 {
-    LIBBALSA_SERVER(smtp_server)->protocol = "smtp";
+    libbalsa_server_set_protocol(LIBBALSA_SERVER(smtp_server), "smtp");
 }
 
 /* Class boilerplate */
@@ -136,7 +136,7 @@ libbalsa_smtp_server_new(void)
     smtp_server = g_object_new(LIBBALSA_TYPE_SMTP_SERVER, NULL);
 
     /* Change the default. */
-    LIBBALSA_SERVER(smtp_server)->remember_passwd = TRUE;
+    libbalsa_server_set_remember_passwd(LIBBALSA_SERVER(smtp_server), TRUE);
 
     return smtp_server;
 }
@@ -296,7 +296,7 @@ smtp_server_tls_widget(LibBalsaSmtpServer * smtp_server)
     gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), _("TLS if possible (not recommended)"));
     gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), _("None (not recommended)"));
 
-    gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), (gint) server->security - 1);
+    gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), (gint) libbalsa_server_get_security(server) - 1);
 
     return combo_box;
 }
@@ -327,20 +327,27 @@ smtp_server_response(GtkDialog * dialog, gint response,
         libbalsa_server_set_host(server,
                                  gtk_entry_get_text(GTK_ENTRY(sdi->host)),
                                  FALSE);
-        server->try_anonymous = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sdi->auth_button)) ? 0U : 1U;
+        libbalsa_server_set_try_anonymous
+            (server,
+             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sdi->auth_button)) ? 0U : 1U);
         libbalsa_server_set_username(server,
                                      gtk_entry_get_text(GTK_ENTRY
                                                         (sdi->user)));
         libbalsa_server_set_password(server,
                                      gtk_entry_get_text(GTK_ENTRY
                                                         (sdi->pass)));
-        server->security = (NetClientCryptMode) (gtk_combo_box_get_active(GTK_COMBO_BOX(sdi->tlsm)) + 1);
-        server->client_cert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sdi->cert_button));
-        g_free(server->cert_file);
-        server->cert_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(sdi->cert_file));
-        g_free(server->cert_passphrase);
-        server->cert_passphrase =
-            gtk_editable_get_chars(GTK_EDITABLE(sdi->cert_pass), 0, -1);
+        libbalsa_server_set_security
+            (server,
+             (NetClientCryptMode) (gtk_combo_box_get_active(GTK_COMBO_BOX(sdi->tlsm)) + 1));
+        libbalsa_server_set_client_cert
+            (server,
+             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sdi->cert_button)));
+        libbalsa_server_set_cert_file
+            (server,
+             gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(sdi->cert_file)));
+        libbalsa_server_set_cert_passphrase
+            (server,
+             gtk_editable_get_chars(GTK_EDITABLE(sdi->cert_pass), 0, -1));
         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sdi->split_button))) {
             /* big_message is stored in kB, but the widget is in MB. */
                sdi->smtp_server->big_message =
@@ -496,8 +503,8 @@ libbalsa_smtp_server_dialog(LibBalsaSmtpServer * smtp_server,
     /* host and port */
     sdi->host = gtk_entry_new();
     smtp_server_add_widget(grid, ++row, _("_Server:"), sdi->host);
-    if (server->host != NULL) {
-        gtk_entry_set_text(GTK_ENTRY(sdi->host), server->host);
+    if (libbalsa_server_get_host(server) != NULL) {
+        gtk_entry_set_text(GTK_ENTRY(sdi->host), libbalsa_server_get_host(server));
     }
     g_signal_connect(sdi->host, "changed", G_CALLBACK(smtp_server_changed), sdi);
 
@@ -510,13 +517,14 @@ libbalsa_smtp_server_dialog(LibBalsaSmtpServer * smtp_server,
     sdi->auth_button = gtk_check_button_new_with_mnemonic(_("Server requires authentication"));
     smtp_server_add_widget(grid, ++row, _("_Authentication:"), sdi->auth_button);
     g_signal_connect(sdi->auth_button, "toggled", G_CALLBACK(smtp_server_changed), sdi);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sdi->auth_button), server->try_anonymous == 0U);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sdi->auth_button),
+                                 libbalsa_server_get_try_anonymous(server) == 0U);
 
     /* user name and password */
     sdi->user = gtk_entry_new();
     smtp_server_add_widget(grid, ++row, _("_User Name:"), sdi->user);
-    if (server->user != NULL) {
-        gtk_entry_set_text(GTK_ENTRY(sdi->user), server->user);
+    if (libbalsa_server_get_user(server) != NULL) {
+        gtk_entry_set_text(GTK_ENTRY(sdi->user), libbalsa_server_get_user(server));
     }
     g_signal_connect(sdi->user, "changed", G_CALLBACK(smtp_server_changed), sdi);
 
@@ -524,8 +532,8 @@ libbalsa_smtp_server_dialog(LibBalsaSmtpServer * smtp_server,
     smtp_server_add_widget(grid, ++row, _("_Pass Phrase:"), sdi->pass);
     g_object_set(G_OBJECT(sdi->pass), "input-purpose", GTK_INPUT_PURPOSE_PASSWORD, NULL);
     gtk_entry_set_visibility(GTK_ENTRY(sdi->pass), FALSE);
-    if (server->passwd != NULL) {
-        gtk_entry_set_text(GTK_ENTRY(sdi->pass), server->passwd);
+    if (libbalsa_server_get_passwd(server) != NULL) {
+        gtk_entry_set_text(GTK_ENTRY(sdi->pass), libbalsa_server_get_passwd(server));
     }
     g_signal_connect(sdi->pass, "changed", G_CALLBACK(smtp_server_changed), sdi);
 
@@ -540,13 +548,13 @@ libbalsa_smtp_server_dialog(LibBalsaSmtpServer * smtp_server,
     sdi->cert_button = gtk_check_button_new_with_mnemonic(_("Server requires client certificate"));
     smtp_server_add_widget(grid, row, _("_Client Certificate:"), sdi->cert_button);
     g_signal_connect(sdi->cert_button, "toggled", G_CALLBACK(smtp_server_changed), sdi);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sdi->cert_button), server->client_cert);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sdi->cert_button), 
libbalsa_server_get_client_cert(server));
 
     sdi->cert_file = gtk_file_chooser_button_new(_("Choose Client Certificate"), 
GTK_FILE_CHOOSER_ACTION_OPEN);
     gtk_widget_set_hexpand(sdi->cert_file, TRUE);
     smtp_server_add_widget(grid, ++row, _("Certificate _File:"), sdi->cert_file);
-    if (server->cert_file != NULL) {
-       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(sdi->cert_file), server->cert_file);
+    if (libbalsa_server_get_cert_file(server) != NULL) {
+       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(sdi->cert_file), 
libbalsa_server_get_cert_file(server));
     }
     g_signal_connect(sdi->cert_file, "file-set", G_CALLBACK(smtp_server_changed), sdi);
 
@@ -554,8 +562,8 @@ libbalsa_smtp_server_dialog(LibBalsaSmtpServer * smtp_server,
     smtp_server_add_widget(grid, ++row, _("Certificate _Pass Phrase:"), sdi->cert_pass);
     g_object_set(G_OBJECT(sdi->cert_pass), "input-purpose", GTK_INPUT_PURPOSE_PASSWORD, NULL);
     gtk_entry_set_visibility(GTK_ENTRY(sdi->cert_pass), FALSE);
-    if (server->cert_passphrase != NULL) {
-        gtk_entry_set_text(GTK_ENTRY(sdi->cert_pass), server->cert_passphrase);
+    if (libbalsa_server_get_cert_passphrase(server) != NULL) {
+        gtk_entry_set_text(GTK_ENTRY(sdi->cert_pass), libbalsa_server_get_cert_passphrase(server));
     }
     g_signal_connect(sdi->cert_pass, "changed", G_CALLBACK(smtp_server_changed), sdi);
 
diff --git a/libinit_balsa/assistant_page_directory.c b/libinit_balsa/assistant_page_directory.c
index 4606ab7..405c07f 100644
--- a/libinit_balsa/assistant_page_directory.c
+++ b/libinit_balsa/assistant_page_directory.c
@@ -128,9 +128,9 @@ unconditional_mailbox(const gchar * path, const gchar * prettyname,
     }
 
     if (is_remote) {
-        libbalsa_server_set_host(LIBBALSA_MAILBOX_REMOTE_SERVER(*box),
+        libbalsa_server_set_host(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(*box),
                                  url.host, ssl);
-        libbalsa_server_set_username(LIBBALSA_MAILBOX_REMOTE_SERVER(*box),
+        libbalsa_server_set_username(LIBBALSA_MAILBOX_REMOTE_GET_SERVER(*box),
                                      getenv("USER"));
     }
     g_free(dup);
diff --git a/libinit_balsa/assistant_page_user.c b/libinit_balsa/assistant_page_user.c
index e363330..1c10402 100644
--- a/libinit_balsa/assistant_page_user.c
+++ b/libinit_balsa/assistant_page_user.c
@@ -200,13 +200,13 @@ create_pop3_mbx(const gchar *name, const gchar* host, gint security,
 {
     LibBalsaMailboxPop3 *pop = libbalsa_mailbox_pop3_new();
     LibBalsaMailbox *mbx   = LIBBALSA_MAILBOX(pop);
-    LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_SERVER(pop);
+    LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(pop);
 
     libbalsa_server_set_username(server, login);
     libbalsa_server_set_password(server, passwd);
     libbalsa_server_set_host(server, host, FALSE);
-    server->security        = security;
-    server->remember_passwd = remember;
+    libbalsa_server_set_security(server, security);
+    libbalsa_server_set_remember_passwd(server, remember);
     mbx->name               = g_strdup(name && *name ? name : host);
     pop->check              = TRUE;
     pop->disable_apop       = FALSE;
@@ -230,15 +230,15 @@ create_imap_mbx(const gchar *name, const gchar* host, gint security,
     libbalsa_server_set_host(server, host, security == NET_CLIENT_CRYPT_ENCRYPTED);
     switch (security) {
     case NET_CLIENT_CRYPT_STARTTLS:
-       server->tls_mode   = LIBBALSA_TLS_REQUIRED;
+     libbalsa_server_set_tls_mode(server, LIBBALSA_TLS_REQUIRED);
        break;
     case NET_CLIENT_CRYPT_STARTTLS_OPT:
-       server->tls_mode   = LIBBALSA_TLS_ENABLED;
+     libbalsa_server_set_tls_mode(server, LIBBALSA_TLS_ENABLED);
        break;
     default:
-       server->tls_mode   = LIBBALSA_TLS_DISABLED;
+     libbalsa_server_set_tls_mode(server, LIBBALSA_TLS_DISABLED);
     }
-    server->remember_passwd = remember;
+    libbalsa_server_set_remember_passwd(server, remember);
     mbnode = balsa_mailbox_node_new_imap_folder(server, NULL);
     mbnode->name = g_strdup(name && *name ? name : host);
 
diff --git a/src/balsa-app.c b/src/balsa-app.c
index 5df0232..f5d9505 100644
--- a/src/balsa-app.c
+++ b/src/balsa-app.c
@@ -72,11 +72,11 @@ ask_password_real(LibBalsaServer * server, LibBalsaMailbox * mbox)
        prompt =
            g_strdup_printf(_("Opening remote mailbox %s.\n"
                               "The _password for %s@%s:"),
-                           mbox->name, server->user, server->host);
+                           mbox->name, libbalsa_server_get_user(server), libbalsa_server_get_host(server));
     else
        prompt =
-           g_strdup_printf(_("_Password for %s@%s (%s):"), server->user,
-                           server->host, server->protocol);
+           g_strdup_printf(_("_Password for %s@%s (%s):"), libbalsa_server_get_user(server),
+                           libbalsa_server_get_host(server), libbalsa_server_get_protocol(server));
 
     dialog = gtk_dialog_new_with_buttons(_("Password needed"),
                                          GTK_WINDOW(balsa_app.main_window),
@@ -101,7 +101,7 @@ ask_password_real(LibBalsaServer * server, LibBalsaMailbox * mbox)
 
     rememb =  gtk_check_button_new_with_mnemonic(_(remember_password_message));
     gtk_box_pack_start(GTK_BOX(content_area), rememb);
-    if(server->remember_passwd)
+    if(libbalsa_server_get_remember_passwd(server))
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rememb), TRUE);
 
     gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
@@ -109,12 +109,12 @@ ask_password_real(LibBalsaServer * server, LibBalsaMailbox * mbox)
     gtk_widget_grab_focus (entry);
 
     if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) {
-        unsigned old_rem = server->remember_passwd;
+        unsigned old_rem = libbalsa_server_get_remember_passwd(server);
         passwd = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
-        server->remember_passwd =
-            !!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rememb));
+        libbalsa_server_set_remember_passwd(server,
+            !!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rememb)));
         libbalsa_server_set_password(server, passwd);
-        if( server->remember_passwd || old_rem )
+        if( libbalsa_server_get_remember_passwd(server) || old_rem )
             libbalsa_server_config_changed(server);
     }
     gtk_widget_destroy(dialog);
@@ -190,31 +190,29 @@ set_passwd_from_matching_server(GtkTreeModel *model,
         g_return_val_if_fail(LIBBALSA_IS_MAILBOX(mbox), FALSE);
 
         if (!LIBBALSA_IS_MAILBOX_REMOTE(mbox)) return FALSE;
-        server = LIBBALSA_MAILBOX_REMOTE_SERVER(mbox);
+        server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mbox);
         g_return_val_if_fail(server != NULL, FALSE);
     }
-    g_return_val_if_fail(server->host != NULL, FALSE);
-    g_return_val_if_fail(server->user != NULL, FALSE);
-    if (server->passwd == NULL) return FALSE;
+    g_return_val_if_fail(libbalsa_server_get_host(server) != NULL, FALSE);
+    g_return_val_if_fail(libbalsa_server_get_user(server) != NULL, FALSE);
+    if (libbalsa_server_get_passwd(server) == NULL) return FALSE;
 
     master = (LibBalsaServer *)data;
     g_return_val_if_fail(LIBBALSA_IS_SERVER(master), FALSE);
     if (master == server) return FALSE;
 
-    g_return_val_if_fail(server->host != NULL, FALSE);
-    g_return_val_if_fail(server->user != NULL, FALSE);
+    g_return_val_if_fail(libbalsa_server_get_host(server) != NULL, FALSE);
+    g_return_val_if_fail(libbalsa_server_get_user(server) != NULL, FALSE);
 
-    if ((strcmp(server->host, master->host) == 0) &&
-       (strcmp(server->user, master->user) == 0)) {
-       g_free(master->passwd);
-       master->passwd = g_strdup(server->passwd);
+    if ((strcmp(libbalsa_server_get_host(server), libbalsa_server_get_host(master)) == 0) &&
+       (strcmp(libbalsa_server_get_user(server), libbalsa_server_get_user(master)) == 0)) {
+       libbalsa_server_set_password(master, libbalsa_server_get_passwd(server));
        return TRUE;
     };
-    
+
     return FALSE;
 }
 /* ask_password:
-   when called from thread, gdk lock must not be held.
 */
 gchar *
 ask_password(LibBalsaServer *server, LibBalsaMailbox *mbox)
@@ -222,16 +220,16 @@ ask_password(LibBalsaServer *server, LibBalsaMailbox *mbox)
     gchar *password;
 
     g_return_val_if_fail(server != NULL, NULL);
-    
+
     password = NULL;
     if (mbox) {
        gtk_tree_model_foreach(GTK_TREE_MODEL(balsa_app.mblist_tree_store),
                               (GtkTreeModelForeachFunc)
                               set_passwd_from_matching_server, server);
 
-       if (server->passwd != NULL) {
-           password = server->passwd;
-           server->passwd = NULL;
+       if (libbalsa_server_get_passwd(server) != NULL) {
+           password = g_strdup(libbalsa_server_get_passwd(server));
+           libbalsa_server_set_password(server, NULL);
        }
     }
 
@@ -698,7 +696,7 @@ balsa_get_short_mailbox_name(const gchar *url)
 
     if ((mbnode = balsa_find_url(url)) && mbnode->mailbox) {
         if (mbnode->server) {
-            return g_strconcat(mbnode->server->host, ":",
+            return g_strconcat(libbalsa_server_get_host(mbnode->server), ":",
                                mbnode->mailbox->name, NULL);
         } else {
             return g_strdup(mbnode->mailbox->name);
diff --git a/src/folder-conf.c b/src/folder-conf.c
index 3c04206..69d7274 100644
--- a/src/folder-conf.c
+++ b/src/folder-conf.c
@@ -184,11 +184,10 @@ folder_conf_clicked_ok(FolderDialogData * fcw)
     } else {
         insert = TRUE;
        s = LIBBALSA_SERVER(libbalsa_imap_server_new(username, host));
-        g_signal_connect(G_OBJECT(s), "get-password",
-                         G_CALLBACK(ask_password), NULL);
+        libbalsa_server_connect_get_password(s, G_CALLBACK(ask_password), NULL);
     }
 
-    s->tls_mode = balsa_server_conf_get_tls_mode(&fcw->bsc);
+    libbalsa_server_set_tls_mode(s, balsa_server_conf_get_tls_mode(&fcw->bsc));
     libbalsa_imap_server_set_max_connections
         (LIBBALSA_IMAP_SERVER(s),
          gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON
@@ -206,10 +205,10 @@ folder_conf_clicked_ok(FolderDialogData * fcw)
         (LIBBALSA_IMAP_SERVER(s),
          gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fcw->use_status)));
     libbalsa_server_set_username(s, username);
-    s->try_anonymous =
-        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fcw->anonymous));
-    s->remember_passwd =
-        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fcw->remember));
+    libbalsa_server_set_try_anonymous(s,
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fcw->anonymous)));
+    libbalsa_server_set_remember_passwd(s,
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fcw->remember)));
     libbalsa_server_set_password(s,
                                  gtk_entry_get_text(GTK_ENTRY
                                                     (fcw->password)));
@@ -372,7 +371,7 @@ folder_conf_imap_node(BalsaMailboxNode *mn)
     label = libbalsa_create_grid_label(_("_Server:"), grid, 1);
     fcw->bsc.server =
         libbalsa_create_grid_entry(grid, G_CALLBACK(validate_folder),
-                                   fcw, r++, s ? s->host : default_server,
+                                   fcw, r++, s ? libbalsa_server_get_host(s) : default_server,
                                    label);
     fcw->bsc.default_ports = IMAP_DEFAULT_PORTS;
     g_free(default_server);
@@ -380,23 +379,23 @@ folder_conf_imap_node(BalsaMailboxNode *mn)
     label= libbalsa_create_grid_label(_("Use_r name:"), grid, r);
     fcw->username =
         libbalsa_create_grid_entry(grid, G_CALLBACK(validate_folder),
-                                   fcw, r++, s ? s->user : g_get_user_name(),
+                                   fcw, r++, s ? libbalsa_server_get_user(s) : g_get_user_name(),
                                    label);
 
     label = libbalsa_create_grid_label(_("_Password:"), grid, r);
     fcw->password =
         libbalsa_create_grid_entry(grid, NULL, NULL, r++,
-                                   s ? s->passwd : NULL, label);
+                                   s ? libbalsa_server_get_passwd(s) : NULL, label);
     gtk_entry_set_visibility(GTK_ENTRY(fcw->password), FALSE);
 
     fcw->anonymous =
         libbalsa_create_grid_check(_("_Anonymous access"), grid, r++,
-                                   s ? s->try_anonymous : FALSE);
+                                   s ? libbalsa_server_get_try_anonymous(s) : FALSE);
     g_signal_connect(G_OBJECT(fcw->anonymous), "toggled",
                      G_CALLBACK(anonymous_cb), fcw);
     fcw->remember =
         libbalsa_create_grid_check(_(remember_password_message), grid, r++,
-                                   s ? s->remember_passwd : TRUE);
+                                   s ? libbalsa_server_get_remember_passwd(s) : TRUE);
     g_signal_connect(G_OBJECT(fcw->remember), "toggled",
                      G_CALLBACK(remember_cb), fcw);
 
@@ -502,7 +501,7 @@ browse_button_response(GtkDialog * dialog, gint response,
                                mbnode->dir);
         if(mbnode->server)
             gtk_label_set_label(GTK_LABEL(bbd->sdd->host_label),
-                                mbnode->server->host);
+                                libbalsa_server_get_host(mbnode->server));
     }
     validate_sub_folder(NULL, bbd->sdd);
     gtk_widget_set_sensitive(bbd->button, TRUE);
@@ -836,7 +835,7 @@ folder_conf_imap_sub_node(BalsaMailboxNode * mn)
     (void) libbalsa_create_grid_label(_("Host:"), grid, row);
     sdd->host_label =
         gtk_label_new(sdd->mbnode && sdd->mbnode->server
-                      ? sdd->mbnode->server->host : "");
+                      ? libbalsa_server_get_host(sdd->mbnode->server) : "");
     gtk_widget_set_halign(sdd->host_label, GTK_ALIGN_START);
     gtk_widget_set_hexpand(sdd->host_label, TRUE);
     gtk_grid_attach(GTK_GRID(grid), sdd->host_label, 1, row, 1, 1);
diff --git a/src/mailbox-conf.c b/src/mailbox-conf.c
index aca5cfd..d6226c3 100644
--- a/src/mailbox-conf.c
+++ b/src/mailbox-conf.c
@@ -211,7 +211,7 @@ balsa_server_conf_get_advanced_widget(BalsaServerConf *bsc, LibBalsaServer *s,
     };
     GtkWidget *label;
     GtkWidget *box;
-    gboolean use_ssl = s && s->use_ssl;
+    gboolean use_ssl = s && libbalsa_server_get_use_ssl(s);
 
     box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
 
@@ -233,7 +233,7 @@ balsa_server_conf_get_advanced_widget(BalsaServerConf *bsc, LibBalsaServer *s,
     mailbox_conf_combo_box_make(GTK_COMBO_BOX_TEXT(bsc->tls_option),
                                 G_N_ELEMENTS(tls_menu), tls_menu);
     gtk_combo_box_set_active(GTK_COMBO_BOX(bsc->tls_option),
-                             s ? s->tls_mode : LIBBALSA_TLS_ENABLED);
+                             s ? libbalsa_server_get_tls_mode(s) : LIBBALSA_TLS_ENABLED);
     gtk_grid_attach(bsc->grid, bsc->tls_option, 1, 1, 1, 1);
     gtk_label_set_mnemonic_widget(GTK_LABEL(label), bsc->tls_option);
 
@@ -309,10 +309,10 @@ balsa_server_conf_set_values(BalsaServerConf *bsc, LibBalsaServer *server)
     g_return_if_fail(server);
 
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bsc->use_ssl), 
-                                 server->use_ssl);
+                                 libbalsa_server_get_use_ssl(server));
     gtk_combo_box_set_active(GTK_COMBO_BOX(bsc->tls_option),
-                             server->tls_mode);
-    gtk_widget_set_sensitive(bsc->tls_option, !server->use_ssl);
+                             libbalsa_server_get_tls_mode(server));
+    gtk_widget_set_sensitive(bsc->tls_option, !libbalsa_server_get_use_ssl(server));
 }
 
 
@@ -681,20 +681,20 @@ mailbox_conf_set_values_pop3(LibBalsaMailbox   *mailbox,
        gboolean sensitive;
 
        pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
-       server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+       server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
 
        /* basic settings */
-       if (server->host != NULL) {
-               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server), server->host);
+       if (libbalsa_server_get_host(server) != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server), libbalsa_server_get_host(server));
        }
-       gtk_combo_box_set_active(GTK_COMBO_BOX(mcw->mb_data.pop3.security), server->security - 1);
+       gtk_combo_box_set_active(GTK_COMBO_BOX(mcw->mb_data.pop3.security), 
libbalsa_server_get_security(server) - 1);
 
-       if (server->user != NULL) {
-               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.username), server->user);
+       if (libbalsa_server_get_user(server) != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.username), libbalsa_server_get_user(server));
        }
 
-       if (server->passwd != NULL) {
-               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.password), server->passwd);
+       if (libbalsa_server_get_passwd(server) != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.password), libbalsa_server_get_passwd(server));
        }
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.delete_from_server), 
pop3->delete_from_server);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.check), pop3->check);
@@ -705,18 +705,18 @@ mailbox_conf_set_values_pop3(LibBalsaMailbox   *mailbox,
        gtk_widget_set_sensitive(mcw->mb_data.pop3.filter_cmd, pop3->filter);
 
        /* advanced settings */
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.bsc.need_client_cert), 
server->client_cert);
-       sensitive = (server->security != NET_CLIENT_CRYPT_NONE);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.bsc.need_client_cert), 
libbalsa_server_get_client_cert(server));
+       sensitive = (libbalsa_server_get_security(server) != NET_CLIENT_CRYPT_NONE);
        gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.need_client_cert, sensitive);
-       sensitive = sensitive & server->client_cert;
+       sensitive = sensitive & libbalsa_server_get_client_cert(server);
 
-    if (server->cert_file != NULL) {
-       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(mcw->mb_data.pop3.bsc.client_cert_file), 
server->cert_file);
+    if (libbalsa_server_get_cert_file(server) != NULL) {
+       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(mcw->mb_data.pop3.bsc.client_cert_file), 
libbalsa_server_get_cert_file(server));
     }
     gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.client_cert_file, sensitive);
 
-       if (server->cert_passphrase != NULL) {
-               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.client_cert_passwd), 
server->cert_passphrase);
+       if (libbalsa_server_get_cert_passphrase(server) != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.client_cert_passwd), 
libbalsa_server_get_cert_passphrase(server));
        }
        gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.client_cert_passwd, sensitive);
 
@@ -757,23 +757,23 @@ mailbox_conf_set_values(MailboxConfWindow *mcw)
                LibBalsaServer *server;
                const gchar *path;
                imap = LIBBALSA_MAILBOX_IMAP(mailbox);
-               server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+               server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
 
-               if (server->host)
+               if (libbalsa_server_get_host(server))
                        gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.bsc.server),
-                               server->host);
-               if (server->user)
+                               libbalsa_server_get_host(server));
+               if (libbalsa_server_get_user(server))
                        gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.username),
-                               server->user);
+                               libbalsa_server_get_user(server));
                gtk_toggle_button_set_active
                (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.anonymous),
-                       server->try_anonymous);
+                       libbalsa_server_get_try_anonymous(server));
                gtk_toggle_button_set_active
                (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.remember),
-                       server->remember_passwd);
-               if (server->passwd)
+                       libbalsa_server_get_remember_passwd(server));
+               if (libbalsa_server_get_passwd(server))
                        gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.password),
-                               server->passwd);
+                               libbalsa_server_get_passwd(server));
                path = libbalsa_mailbox_imap_get_path(imap);
                if (path)
                        gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.folderpath),
@@ -789,10 +789,10 @@ mailbox_conf_set_values(MailboxConfWindow *mcw)
                        gtk_toggle_button_set_active
                        (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.has_bugs),
                                TRUE);
-               if(!server->try_anonymous)
+               if(!libbalsa_server_get_try_anonymous(server))
                        gtk_widget_set_sensitive(GTK_WIDGET(mcw->mb_data.imap.anonymous),
                                FALSE);
-               if(!server->remember_passwd)
+               if(!libbalsa_server_get_remember_passwd(server))
                        gtk_widget_set_sensitive(GTK_WIDGET(mcw->mb_data.imap.password),
                                FALSE);
        }
@@ -892,7 +892,7 @@ update_pop_mailbox(MailboxConfWindow *mcw)
        BalsaServerConf *bsc;
 
        mailbox = LIBBALSA_MAILBOX_POP3(mcw->mailbox);
-       server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+       server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
        bsc = &mcw->mb_data.pop3.bsc;
 
        /* basic data */
@@ -901,7 +901,7 @@ update_pop_mailbox(MailboxConfWindow *mcw)
             gtk_editable_get_chars(GTK_EDITABLE(mcw->mailbox_name), 0, -1);
 
        libbalsa_server_set_host(server, gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server)), FALSE);
-       server->security = gtk_combo_box_get_active(GTK_COMBO_BOX(mcw->mb_data.pop3.security)) + 1;
+ libbalsa_server_set_security(server, gtk_combo_box_get_active(GTK_COMBO_BOX(mcw->mb_data.pop3.security)) + 
1);
 
        libbalsa_server_set_username(server, gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.username)));
        libbalsa_server_set_password(server, gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.password)));
@@ -915,11 +915,9 @@ update_pop_mailbox(MailboxConfWindow *mcw)
             gtk_editable_get_chars(GTK_EDITABLE(mcw->mb_data.pop3.filter_cmd), 0, -1);
 
        /* advanced settings */
-       server->client_cert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bsc->need_client_cert));
-       g_free(server->cert_file);
-       server->cert_file = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(bsc->client_cert_file)));;
-       g_free(server->cert_passphrase);
-       server->cert_passphrase = gtk_editable_get_chars(GTK_EDITABLE(bsc->client_cert_passwd), 0, -1);
+ libbalsa_server_set_client_cert(server, 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bsc->need_client_cert)));
+ libbalsa_server_set_cert_file(server, 
g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(bsc->client_cert_file))));;
+ libbalsa_server_set_cert_passphrase(server, gtk_editable_get_chars(GTK_EDITABLE(bsc->client_cert_passwd), 
0, -1));
        mailbox->disable_apop = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.disable_apop));
        mailbox->enable_pipe = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.enable_pipe));
 }
@@ -935,7 +933,7 @@ update_imap_mailbox(MailboxConfWindow *mcw)
     LibBalsaServer* server;
 
     mailbox = LIBBALSA_MAILBOX_IMAP(mcw->mailbox);
-    server  = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+    server  = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
     if (!server) {
        server = LIBBALSA_SERVER(libbalsa_imap_server_new("",""));
        libbalsa_mailbox_remote_set_server(LIBBALSA_MAILBOX_REMOTE(mailbox),
@@ -949,13 +947,13 @@ update_imap_mailbox(MailboxConfWindow *mcw)
     libbalsa_server_set_username(server,
                                 gtk_entry_get_text(GTK_ENTRY
                                                    (mcw->mb_data.imap.username)));
-    server->try_anonymous = 
+    libbalsa_server_set_try_anonymous(server,
         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->
-                                                       mb_data.imap.anonymous));
-    server->remember_passwd = 
+                                                       mb_data.imap.anonymous)));
+    libbalsa_server_set_remember_passwd(server,
         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->
-                                                       mb_data.imap.remember));
-    server->tls_mode = balsa_server_conf_get_tls_mode(&mcw->mb_data.imap.bsc);
+                                                       mb_data.imap.remember)));
+    libbalsa_server_set_tls_mode(server, balsa_server_conf_get_tls_mode(&mcw->mb_data.imap.bsc));
     libbalsa_server_set_password(server,
                                 gtk_entry_get_text(GTK_ENTRY
                                                    (mcw->mb_data.imap.password)));
@@ -975,8 +973,7 @@ update_imap_mailbox(MailboxConfWindow *mcw)
                              balsa_server_conf_get_use_ssl
                              (&mcw->mb_data.imap.bsc));
     libbalsa_server_config_changed(server);
-    g_signal_connect(G_OBJECT(server), "get-password",
-                     G_CALLBACK(ask_password), mailbox);
+    libbalsa_server_connect_get_password(server, G_CALLBACK(ask_password), mailbox);
 
     libbalsa_mailbox_imap_set_path(mailbox,
                                   (path == NULL || path[0] == '\0') 
diff --git a/src/mailbox-node.c b/src/mailbox-node.c
index e4e90d1..fcaf96e 100644
--- a/src/mailbox-node.c
+++ b/src/mailbox-node.c
@@ -512,7 +512,7 @@ imap_dir_cb(BalsaMailboxNode* mb)
                              ? _("Scanning of %s failed: %s\n"
                                  "Check network connectivity.")
                              : _("Scanning of %s failed: %s"),
-                             mb->server->host,
+                             libbalsa_server_get_host(mb->server),
                              error->message);
         g_error_free(error);
         imap_scan_destroy_tree(&imap_tree);
@@ -605,16 +605,17 @@ balsa_mailbox_node_new_from_config(const gchar* group)
     folder->server = LIBBALSA_SERVER(libbalsa_imap_server_new_from_config());
 
     if(balsa_app.debug)
-       printf("Server loaded, host: %s, %s.\n", folder->server->host,
-              folder->server->use_ssl ? "SSL" : "no SSL");
+       printf("Server loaded, host: %s, %s.\n",
+               libbalsa_server_get_host(folder->server),
+              libbalsa_server_get_use_ssl(folder->server) ? "SSL" : "no SSL");
     g_signal_connect_swapped(G_OBJECT(folder->server), "config-changed", 
                              G_CALLBACK(config_folder_update), folder);
     g_signal_connect(G_OBJECT(folder), "show-prop-dialog", 
                     G_CALLBACK(folder_conf_imap_node), NULL);
     g_signal_connect(G_OBJECT(folder), "append-subtree", 
                     G_CALLBACK(imap_dir_cb), NULL);
-    libbalsa_server_connect_signals(folder->server,
-                                    G_CALLBACK(ask_password), NULL);
+    libbalsa_server_connect_get_password(folder->server,
+                                         G_CALLBACK(ask_password), NULL);
     balsa_mailbox_node_load_config(folder, group);
 
     folder->dir = libbalsa_conf_get_string("Directory");
diff --git a/src/save-restore.c b/src/save-restore.c
index 98fe1b8..5bc287f 100644
--- a/src/save-restore.c
+++ b/src/save-restore.c
@@ -385,9 +385,9 @@ config_mailbox_init(const gchar * prefix)
     if (mailbox == NULL)
        return FALSE;
     if (LIBBALSA_IS_MAILBOX_REMOTE(mailbox)) {
-       LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
-        libbalsa_server_connect_signals(server,
-                                        G_CALLBACK(ask_password), mailbox);
+       LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
+        libbalsa_server_connect_get_password(server,
+                                             G_CALLBACK(ask_password), mailbox);
        g_signal_connect_swapped(server, "config-changed",
                                  G_CALLBACK(config_mailbox_update),
                                 mailbox);
@@ -467,8 +467,8 @@ config_load_smtp_server(const gchar * key, const gchar * value, gpointer data)
 
     libbalsa_conf_push_group(key);
     smtp_server = libbalsa_smtp_server_new_from_config(value);
-    libbalsa_server_connect_signals(LIBBALSA_SERVER(smtp_server),
-                                   G_CALLBACK(ask_password), NULL);
+    libbalsa_server_connect_get_password(LIBBALSA_SERVER(smtp_server),
+                                         G_CALLBACK(ask_password), NULL);
     libbalsa_conf_pop_group();
     libbalsa_smtp_server_add_to_list(smtp_server, smtp_servers);
 
@@ -912,6 +912,7 @@ config_global_load(void)
        LibBalsaSmtpServer *smtp_server;
        LibBalsaServer *server;
        gchar *passphrase, *hostname;
+        gchar *esmtp_user;
 
        smtp_server = libbalsa_smtp_server_new();
        libbalsa_smtp_server_set_name(smtp_server,
@@ -925,8 +926,10 @@ config_global_load(void)
                                                   &def_used);
        libbalsa_server_set_host(server, hostname, FALSE);
         g_free(hostname);
-       libbalsa_server_set_username(server,
-               libbalsa_conf_get_string("ESMTPUser"));
+
+        esmtp_user = libbalsa_conf_get_string("ESMTPUser");
+       libbalsa_server_set_username(server, esmtp_user);
+        g_free(esmtp_user);
 
         passphrase = libbalsa_conf_private_get_string("ESMTPPassphrase");
        if (passphrase) {
@@ -937,15 +940,15 @@ config_global_load(void)
         }
 
         /* default set to "Use TLS if possible" */
-       server->tls_mode = libbalsa_conf_get_int("ESMTPTLSMode=1");
+        libbalsa_server_set_tls_mode(server, libbalsa_conf_get_int("ESMTPTLSMode=1"));
 
        passphrase =
            libbalsa_conf_private_get_string("ESMTPCertificatePassphrase");
        if (passphrase) {
             gchar* passphrase_rot = libbalsa_rot(passphrase);
             g_free(passphrase);
-           g_free(server->cert_passphrase);
-           server->cert_passphrase = passphrase_rot;
+           libbalsa_server_set_cert_passphrase(server, passphrase_rot);
+            g_free(passphrase_rot);
        }
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]