1 /* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
2 
3 #include "lib.h"
4 #include "hostpid.h"
5 #include "buffer.h"
6 #include "settings-parser.h"
7 #include "service-settings.h"
8 #include "login-settings.h"
9 #include "submission-login-settings.h"
10 
11 #include <stddef.h>
12 
13 static bool
14 submission_login_settings_check(void *_set, pool_t pool, const char **error_r);
15 
16 /* <settings checks> */
17 static struct inet_listener_settings submission_login_inet_listeners_array[] = {
18 	{ .name = "submission", .address = "", .port = 587  },
19 	{ .name = "submissions", .address = "", .port = 465, .ssl = TRUE }
20 };
21 static struct inet_listener_settings *submission_login_inet_listeners[] = {
22 	&submission_login_inet_listeners_array[0]
23 };
24 static buffer_t submission_login_inet_listeners_buf = {
25 	{ { submission_login_inet_listeners,
26 	    sizeof(submission_login_inet_listeners) } }
27 };
28 
29 /* </settings checks> */
30 struct service_settings submission_login_service_settings = {
31 	.name = "submission-login",
32 	.protocol = "submission",
33 	.type = "login",
34 	.executable = "submission-login",
35 	.user = "$default_login_user",
36 	.group = "",
37 	.privileged_group = "",
38 	.extra_groups = "",
39 	.chroot = "login",
40 
41 	.drop_priv_before_exec = FALSE,
42 
43 	.process_min_avail = 0,
44 	.process_limit = 0,
45 	.client_limit = 0,
46 	.service_count = 1,
47 	.idle_kill = 0,
48 	.vsz_limit = UOFF_T_MAX,
49 
50 	.unix_listeners = ARRAY_INIT,
51 	.fifo_listeners = ARRAY_INIT,
52 	.inet_listeners = { { &submission_login_inet_listeners_buf,
53 			      sizeof(submission_login_inet_listeners[0]) } }
54 };
55 
56 #undef DEF
57 #define DEF(type, name) \
58 	SETTING_DEFINE_STRUCT_##type(#name, name, struct submission_login_settings)
59 
60 static const struct setting_define submission_login_setting_defines[] = {
61 	DEF(STR, hostname),
62 
63 	DEF(SIZE, submission_max_mail_size),
64 	DEF(STR, submission_backend_capabilities),
65 
66 	SETTING_DEFINE_LIST_END
67 };
68 
69 static const struct submission_login_settings submission_login_default_settings = {
70 	.hostname = "",
71 
72 	.submission_max_mail_size = 0,
73 	.submission_backend_capabilities = NULL
74 };
75 
76 static const struct setting_parser_info *submission_login_setting_dependencies[] = {
77 	&login_setting_parser_info,
78 	NULL
79 };
80 
81 const struct setting_parser_info submission_login_setting_parser_info = {
82 	.module_name = "submission-login",
83 	.defines = submission_login_setting_defines,
84 	.defaults = &submission_login_default_settings,
85 
86 	.type_offset = SIZE_MAX,
87 	.struct_size = sizeof(struct submission_login_settings),
88 	.parent_offset = SIZE_MAX,
89 
90 #ifndef CONFIG_BINARY
91 	.check_func = submission_login_settings_check,
92 #endif
93 	.dependencies = submission_login_setting_dependencies
94 };
95 
96 const struct setting_parser_info *submission_login_setting_roots[] = {
97 	&login_setting_parser_info,
98 	&submission_login_setting_parser_info,
99 	NULL
100 };
101 
102 static bool
submission_login_settings_check(void * _set,pool_t pool,const char ** error_r ATTR_UNUSED)103 submission_login_settings_check(void *_set, pool_t pool,
104 			const char **error_r ATTR_UNUSED)
105 {
106 	struct submission_login_settings *set = _set;
107 
108 	if (*set->hostname == '\0')
109 		set->hostname = p_strdup(pool, my_hostdomain());
110 	return TRUE;
111 }
112