]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Moved settings from plugin {} section to proper imapc_* settings.
authorTimo Sirainen <tss@iki.fi>
Tue, 1 Feb 2011 17:05:54 +0000 (19:05 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 1 Feb 2011 17:05:54 +0000 (19:05 +0200)
src/lib-storage/index/imapc/Makefile.am
src/lib-storage/index/imapc/imapc-settings.c [new file with mode: 0644]
src/lib-storage/index/imapc/imapc-settings.h [new file with mode: 0644]
src/lib-storage/index/imapc/imapc-storage.c
src/lib-storage/index/imapc/imapc-storage.h

index 5f9e375992e909be75a477d52452eac20f0a97b3..beff91549147b895a462298e096b7fe94bf3ca3a 100644 (file)
@@ -3,6 +3,7 @@ noinst_LTLIBRARIES = libstorage_imapc.la
 AM_CPPFLAGS = \
        -I$(top_srcdir)/src/lib \
        -I$(top_srcdir)/src/lib-test \
+       -I$(top_srcdir)/src/lib-settings \
        -I$(top_srcdir)/src/lib-dns \
        -I$(top_srcdir)/src/lib-ssl-iostream \
        -I$(top_srcdir)/src/lib-mail \
@@ -20,6 +21,7 @@ libstorage_imapc_la_SOURCES = \
        imapc-save.c \
        imapc-search.c \
        imapc-seqmap.c \
+       imapc-settings.c \
        imapc-sync.c \
        imapc-storage.c
 
@@ -28,6 +30,7 @@ headers = \
        imapc-list.h \
        imapc-mail.h \
        imapc-seqmap.h \
+       imapc-settings.h \
        imapc-storage.h \
        imapc-sync.h
 
diff --git a/src/lib-storage/index/imapc/imapc-settings.c b/src/lib-storage/index/imapc/imapc-settings.c
new file mode 100644 (file)
index 0000000..1bed8c1
--- /dev/null
@@ -0,0 +1,79 @@
+/* Copyright (c) 2011 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "settings-parser.h"
+#include "mail-storage-settings.h"
+#include "imapc-settings.h"
+
+#include <stddef.h>
+
+#undef DEF
+#define DEF(type, name) \
+       { type, #name, offsetof(struct imapc_settings, name), NULL }
+
+static bool imapc_settings_check(void *_set, pool_t pool, const char **error_r);
+
+static const struct setting_define imapc_setting_defines[] = {
+       DEF(SET_STR, imapc_host),
+       DEF(SET_UINT, imapc_port),
+
+       DEF(SET_STR, imapc_user),
+       DEF(SET_STR, imapc_password),
+
+       DEF(SET_ENUM, imapc_ssl),
+       DEF(SET_STR, imapc_ssl_ca_dir),
+
+       SETTING_DEFINE_LIST_END
+};
+
+static const struct imapc_settings imapc_default_settings = {
+       .imapc_host = "",
+       .imapc_port = 143,
+
+       .imapc_user = "",
+       .imapc_password = "",
+
+       .imapc_ssl = "no:imaps:starttls",
+       .imapc_ssl_ca_dir = ""
+};
+
+static const struct setting_parser_info imapc_setting_parser_info = {
+       .module_name = "imapc",
+       .defines = imapc_setting_defines,
+       .defaults = &imapc_default_settings,
+
+       .type_offset = (size_t)-1,
+       .struct_size = sizeof(struct imapc_settings),
+
+       .parent_offset = (size_t)-1,
+       .parent = &mail_user_setting_parser_info,
+
+       .check_func = imapc_settings_check
+};
+
+const struct setting_parser_info *imapc_get_setting_parser_info(void)
+{
+       return &imapc_setting_parser_info;
+}
+
+/* <settings checks> */
+static bool imapc_settings_check(void *_set, pool_t pool ATTR_UNUSED,
+                                const char **error_r)
+{
+       struct imapc_settings *set = _set;
+
+       if (set->imapc_port == 0 || set->imapc_port > 65535) {
+               *error_r = "invalid imapc_port";
+               return FALSE;
+       }
+#ifndef CONFIG_BINARY
+       if (*set->imapc_ssl_ca_dir != '\0' &&
+           access(set->imapc_ssl_ca_dir, X_OK) < 0) {
+               *error_r = t_strdup_printf(
+                       "imapc_ssl_ca_dir: access(%s) failed: %m",
+                       set->imapc_ssl_ca_dir);
+               return FALSE;
+       }
+#endif
+       return TRUE;
+}
diff --git a/src/lib-storage/index/imapc/imapc-settings.h b/src/lib-storage/index/imapc/imapc-settings.h
new file mode 100644 (file)
index 0000000..26d9128
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef IMAPC_SETTINGS_H
+#define IMAPC_SETTINGS_H
+
+struct imapc_settings {
+       const char *imapc_host;
+       unsigned int imapc_port;
+
+       const char *imapc_user;
+       const char *imapc_password;
+
+       const char *imapc_ssl;
+       const char *imapc_ssl_ca_dir;
+};
+
+const struct setting_parser_info *imapc_get_setting_parser_info(void);
+
+#endif
index 1d1f1709355b362451c765c4dccf07287973791f..4605b3451afc60aec364086ac6ecec130745e413 100644 (file)
@@ -9,6 +9,7 @@
 #include "imapc-client.h"
 #include "imapc-list.h"
 #include "imapc-sync.h"
+#include "imapc-settings.h"
 #include "imapc-storage.h"
 
 #define DNS_CLIENT_SOCKET_NAME "dns-client"
@@ -163,30 +164,23 @@ imapc_storage_create(struct mail_storage *_storage,
 {
        struct imapc_storage *storage = (struct imapc_storage *)_storage;
        struct imapc_client_settings set;
-       const char *port, *value;
        string_t *str;
 
+       storage->set = mail_storage_get_driver_settings(_storage);
+
        memset(&set, 0, sizeof(set));
-       set.host = ns->list->set.root_dir;
-
-       port = mail_user_plugin_getenv(_storage->user, "imapc_port");
-       if (port == NULL)
-               set.port = 143;
-       else {
-               if (str_to_uint(port, &set.port) < 0 ||
-                   set.port == 0 || set.port >= 65536) {
-                       *error_r = t_strdup_printf("Invalid port: %s", port);
-                       return -1;
-               }
+       set.host = storage->set->imapc_host;
+       if (*set.host == '\0') {
+               *error_r = "missing imapc_host";
+               return -1;
        }
-
-       set.username = mail_user_plugin_getenv(_storage->user, "imapc_user");
-       if (set.username == NULL)
+       set.port = storage->set->imapc_port;
+       set.username = storage->set->imapc_user;
+       if (*set.username == '\0')
                set.username = _storage->user->username;
-
-       set.password = mail_user_plugin_getenv(_storage->user, "pass");
-       if (set.password == NULL) {
-               *error_r = "missing pass";
+       set.password = storage->set->imapc_password;
+       if (*set.password == '\0') {
+               *error_r = "missing imapc_password";
                return -1;
        }
        set.dns_client_socket_path =
@@ -196,15 +190,13 @@ imapc_storage_create(struct mail_storage *_storage,
        mail_user_set_get_temp_prefix(str, _storage->user->set);
        set.temp_path_prefix = str_c(str);
 
-       set.ssl_ca_dir = mail_user_plugin_getenv(_storage->user,
-                                                "imapc_ssl_ca_dir");
-       if (set.ssl_ca_dir != NULL) {
-               value = mail_user_plugin_getenv(_storage->user,
-                                               "imapc_ssl_starttls");
-               set.ssl_mode = value != NULL ?
-                       IMAPC_CLIENT_SSL_MODE_STARTTLS :
-                       IMAPC_CLIENT_SSL_MODE_IMMEDIATE;
-       }
+       set.ssl_ca_dir = storage->set->imapc_ssl_ca_dir;
+       if (strcmp(storage->set->imapc_ssl, "imaps") == 0)
+               set.ssl_mode = IMAPC_CLIENT_SSL_MODE_IMMEDIATE;
+       else if (strcmp(storage->set->imapc_ssl, "starttls") == 0)
+               set.ssl_mode = IMAPC_CLIENT_SSL_MODE_STARTTLS;
+       else
+               set.ssl_mode = IMAPC_CLIENT_SSL_MODE_NONE;
 
        storage->list = (struct imapc_mailbox_list *)ns->list;
        storage->list->storage = storage;
@@ -496,7 +488,7 @@ struct mail_storage imapc_storage = {
        .class_flags = 0,
 
        .v = {
-               NULL,
+               imapc_get_setting_parser_info,
                imapc_storage_alloc,
                imapc_storage_create,
                imapc_storage_destroy,
index 32cb180baf49c705a6170c9fb5b27cdbc03ce80b..e3400dae311f9ae1b87c4270b407d6579fa92e5e 100644 (file)
@@ -28,6 +28,8 @@ struct imapc_mailbox_event_callback {
 
 struct imapc_storage {
        struct mail_storage storage;
+       const struct imapc_settings *set;
+
        struct imapc_mailbox_list *list;
        struct imapc_client *client;