1 /* Copyright (c) 2011-2018 Dovecot authors, see the included COPYING file */
2
3 #include "lib.h"
4 #include "settings-parser.h"
5 #include "mail-storage-settings.h"
6 #include "pop3c-settings.h"
7
8 #include <stddef.h>
9
10 #undef DEF
11 #define DEF(type, name) \
12 SETTING_DEFINE_STRUCT_##type(#name, name, struct pop3c_settings)
13
14 static const struct setting_define pop3c_setting_defines[] = {
15 DEF(STR, pop3c_host),
16 DEF(IN_PORT, pop3c_port),
17
18 DEF(STR_VARS, pop3c_user),
19 DEF(STR_VARS, pop3c_master_user),
20 DEF(STR, pop3c_password),
21
22 DEF(ENUM, pop3c_ssl),
23 DEF(BOOL, pop3c_ssl_verify),
24
25 DEF(STR, pop3c_rawlog_dir),
26 DEF(BOOL, pop3c_quick_received_date),
27
28 DEF(STR, pop3c_features),
29
30 SETTING_DEFINE_LIST_END
31 };
32
33 static const struct pop3c_settings pop3c_default_settings = {
34 .pop3c_host = "",
35 .pop3c_port = 110,
36
37 .pop3c_user = "%u",
38 .pop3c_master_user = "",
39 .pop3c_password = "",
40
41 .pop3c_ssl = "no:pop3s:starttls",
42 .pop3c_ssl_verify = TRUE,
43
44 .pop3c_rawlog_dir = "",
45 .pop3c_quick_received_date = FALSE,
46
47 .pop3c_features = ""
48 };
49
50 /* <settings checks> */
51 struct pop3c_feature_list {
52 const char *name;
53 enum pop3c_features num;
54 };
55
56 static const struct pop3c_feature_list pop3c_feature_list[] = {
57 { "no-pipelining", POP3C_FEATURE_NO_PIPELINING },
58 { NULL, 0 }
59 };
60
61 static int
pop3c_settings_parse_features(struct pop3c_settings * set,const char ** error_r)62 pop3c_settings_parse_features(struct pop3c_settings *set,
63 const char **error_r)
64 {
65 enum pop3c_features features = 0;
66 const struct pop3c_feature_list *list;
67 const char *const *str;
68
69 str = t_strsplit_spaces(set->pop3c_features, " ,");
70 for (; *str != NULL; str++) {
71 list = pop3c_feature_list;
72 for (; list->name != NULL; list++) {
73 if (strcasecmp(*str, list->name) == 0) {
74 features |= list->num;
75 break;
76 }
77 }
78 if (list->name == NULL) {
79 *error_r = t_strdup_printf("pop3c_features: "
80 "Unknown feature: %s", *str);
81 return -1;
82 }
83 }
84 set->parsed_features = features;
85 return 0;
86 }
87
pop3c_settings_check(void * _set,pool_t pool ATTR_UNUSED,const char ** error_r)88 static bool pop3c_settings_check(void *_set, pool_t pool ATTR_UNUSED,
89 const char **error_r)
90 {
91 struct pop3c_settings *set = _set;
92
93 if (pop3c_settings_parse_features(set, error_r) < 0)
94 return FALSE;
95 return TRUE;
96 }
97 /* </settings checks> */
98
99 static const struct setting_parser_info pop3c_setting_parser_info = {
100 .module_name = "pop3c",
101 .defines = pop3c_setting_defines,
102 .defaults = &pop3c_default_settings,
103
104 .type_offset = SIZE_MAX,
105 .struct_size = sizeof(struct pop3c_settings),
106
107 .parent_offset = SIZE_MAX,
108 .parent = &mail_user_setting_parser_info,
109
110 .check_func = pop3c_settings_check
111 };
112
pop3c_get_setting_parser_info(void)113 const struct setting_parser_info *pop3c_get_setting_parser_info(void)
114 {
115 return &pop3c_setting_parser_info;
116 }
117