comparison src/conf.c @ 317:55b7bde95d37

reworked allowed and denied addrs for routes The following refactorings had been made: - allowed_mail_locals + allowed_return_paths -> allowed_senders - not_allowed_mail_locals + not_allowed_return_paths -> denied_senders - allowed_rcpt_domains -> allowed_recipients - not_allowed_rcpt_domains -> denied_recipients The new options allow more consistent and more flexible matching.
author meillo@marmaro.de
date Thu, 28 Apr 2011 09:55:06 +0200
parents e230bcd0f1c6
children d41fb3b9ed3e
comparison
equal deleted inserted replaced
316:d596ac8b5afb 317:55b7bde95d37
140 p++; 140 p++;
141 } 141 }
142 return list; 142 return list;
143 } 143 }
144 144
145 /* Split the addrs at '@' into local_part and domain. Without an '@'
146 everything is local_part. Create address structs, which are put
147 into a list and returned.
148 This funktion is used for lists of addrs containing globbing chars (* and ?).
149 We don't need valid RFC821 addresses here, just patterns to match against.
150 */
145 static GList* 151 static GList*
146 parse_address_list(gchar * line, gboolean read_file) 152 parse_address_glob_list(gchar * line, gboolean read_file)
147 { 153 {
148 GList *plain_list = parse_list(line, read_file); 154 GList *plain_list = parse_list(line, read_file);
149 GList *node; 155 GList *node;
150 GList *list = NULL; 156 GList *list = NULL;
151 157
152 foreach(plain_list, node) { 158 foreach(plain_list, node) {
153 gchar *item = (gchar *) (node->data); 159 gchar *item = (gchar *) (node->data);
154 address *addr = create_address(item, TRUE); 160 char* at;
155 if (addr) 161 char* p;
156 list = g_list_append(list, addr); 162 address *addr = calloc(1, sizeof(address));
163
164 for (p=item+strlen(item)-1; isspace(*p) || *p=='>'; p--) {
165 *p = '\0';
166 }
167 for (p=item; isspace(*p) || *p=='<'; p++) {
168 }
169
170 addr->address = strdup(p);
171 at = strrchr(p, '@');
172 if (at) {
173 *at = '\0';
174 addr->local_part = strdup(p);
175 addr->domain = strdup(at+1);
176 } else {
177 addr->local_part = strdup(p);
178 addr->domain = "";
179 }
180 list = g_list_append(list, addr);
181 DEBUG(6) debugf("parse_address_glob_list: read pattern `%s' `%s'\n",
182 addr->local_part, addr->domain);
157 g_free(item); 183 g_free(item);
158 } 184 }
159 g_list_free(plain_list); 185 g_list_free(plain_list);
160
161 return list; 186 return list;
162 } 187 }
163 188
164 static GList* 189 static GList*
165 parse_resolve_list(gchar * line) 190 parse_resolve_list(gchar * line)
646 route->do_correct_helo = parse_boolean(rval); 671 route->do_correct_helo = parse_boolean(rval);
647 else if (strcmp(lval, "instant_helo") == 0) 672 else if (strcmp(lval, "instant_helo") == 0)
648 route->instant_helo = parse_boolean(rval); 673 route->instant_helo = parse_boolean(rval);
649 else if (strcmp(lval, "do_pipelining") == 0) 674 else if (strcmp(lval, "do_pipelining") == 0)
650 route->do_pipelining = parse_boolean(rval); 675 route->do_pipelining = parse_boolean(rval);
651 else if (strcmp(lval, "allowed_return_paths") == 0) 676
652 route->allowed_return_paths = parse_address_list(rval, TRUE); 677 else if (strcmp(lval, "allowed_senders") == 0)
653 else if (strcmp(lval, "allowed_mail_locals") == 0) 678 route->allowed_senders = parse_address_glob_list(rval, TRUE);
654 route->allowed_mail_locals = parse_list(rval, TRUE); 679 else if (strcmp(lval, "denied_senders") == 0)
655 else if (strcmp(lval, "not_allowed_return_paths") == 0) 680 route->denied_senders = parse_address_glob_list(rval, TRUE);
656 route->not_allowed_return_paths = parse_address_list(rval, TRUE); 681 else if (strcmp(lval, "allowed_recipients") == 0)
657 else if (strcmp(lval, "not_allowed_mail_locals") == 0) 682 route->allowed_recipients = parse_address_glob_list(rval, TRUE);
658 route->not_allowed_mail_locals = parse_list(rval, TRUE); 683 else if (strcmp(lval, "denied_recipients") == 0)
659 else if (strcmp(lval, "allowed_rcpt_domains") == 0) 684 route->denied_recipients = parse_address_glob_list(rval, TRUE);
660 route->allowed_rcpt_domains = parse_list(rval, TRUE); 685
661 else if (strcmp(lval, "not_allowed_rcpt_domains") == 0)
662 route->not_allowed_rcpt_domains = parse_list(rval, TRUE);
663 else if (strcmp(lval, "set_h_from_domain") == 0) 686 else if (strcmp(lval, "set_h_from_domain") == 0)
664 route->set_h_from_domain = g_strdup(rval); 687 route->set_h_from_domain = g_strdup(rval);
665 else if (strcmp(lval, "set_h_reply_to_domain") == 0) 688 else if (strcmp(lval, "set_h_reply_to_domain") == 0)
666 route->set_h_reply_to_domain = g_strdup(rval); 689 route->set_h_reply_to_domain = g_strdup(rval);
667 else if (strcmp(lval, "set_return_path_domain") == 0) 690 else if (strcmp(lval, "set_return_path_domain") == 0)
806 } 829 }
807 if (r->wrapper) 830 if (r->wrapper)
808 g_free(r->wrapper); 831 g_free(r->wrapper);
809 if (r->helo_name) 832 if (r->helo_name)
810 g_free(r->helo_name); 833 g_free(r->helo_name);
811 _g_list_free_all(r->allowed_mail_locals); 834 _g_list_free_all(r->allowed_senders);
812 _g_list_free_all(r->not_allowed_mail_locals); 835 _g_list_free_all(r->denied_senders);
813 _g_list_free_all(r->allowed_rcpt_domains); 836 _g_list_free_all(r->allowed_recipients);
814 _g_list_free_all(r->not_allowed_rcpt_domains); 837 _g_list_free_all(r->denied_recipients);
815 if (r->set_h_from_domain) 838 if (r->set_h_from_domain)
816 g_free(r->set_h_from_domain); 839 g_free(r->set_h_from_domain);
817 if (r->set_h_reply_to_domain) 840 if (r->set_h_reply_to_domain)
818 g_free(r->set_h_reply_to_domain); 841 g_free(r->set_h_reply_to_domain);
819 if (r->set_return_path_domain) 842 if (r->set_return_path_domain)