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 \
imapc-save.c \
imapc-search.c \
imapc-seqmap.c \
+ imapc-settings.c \
imapc-sync.c \
imapc-storage.c
imapc-list.h \
imapc-mail.h \
imapc-seqmap.h \
+ imapc-settings.h \
imapc-storage.h \
imapc-sync.h
--- /dev/null
+/* 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;
+}
--- /dev/null
+#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
#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"
{
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 =
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;
.class_flags = 0,
.v = {
- NULL,
+ imapc_get_setting_parser_info,
imapc_storage_alloc,
imapc_storage_create,
imapc_storage_destroy,
struct imapc_storage {
struct mail_storage storage;
+ const struct imapc_settings *set;
+
struct imapc_mailbox_list *list;
struct imapc_client *client;