Lines 1-11
Link Here
|
1 |
/* $Cambridge: exim/exim-src/src/srs.c,v 1.4 2005/02/17 11:58:26 ph10 Exp $ */ |
|
|
2 |
|
3 |
/************************************************* |
1 |
/************************************************* |
4 |
* Exim - an Internet mail transport agent * |
2 |
* Exim - an Internet mail transport agent * |
5 |
*************************************************/ |
3 |
*************************************************/ |
6 |
|
4 |
|
7 |
/* SRS - Sender rewriting scheme support |
5 |
/* SRS - Sender rewriting scheme support |
8 |
©2004 Miles Wilton <miles@mirtol.com> |
6 |
(C)2004 Miles Wilton <miles@mirtol.com> |
|
|
7 |
|
8 |
SRS Support Version: 1.0 |
9 |
|
9 |
License: GPL */ |
10 |
License: GPL */ |
10 |
|
11 |
|
11 |
#include "exim.h" |
12 |
#include "exim.h" |
Lines 24-95
Link Here
|
24 |
|
25 |
|
25 |
int eximsrs_init() |
26 |
int eximsrs_init() |
26 |
{ |
27 |
{ |
27 |
int co; |
|
|
28 |
uschar *list = srs_config; |
28 |
uschar *list = srs_config; |
29 |
char secret_buf[SRS_MAX_SECRET_LENGTH]; |
29 |
char secret_buf[SRS_MAX_SECRET_LENGTH]; |
30 |
char *secret; |
30 |
char *secret; |
31 |
char sbuf[4]; |
31 |
char sbuf[4]; |
32 |
char *sbufp; |
32 |
char *sbufp; |
33 |
int hashlen, maxage; |
|
|
34 |
|
35 |
|
33 |
|
|
|
34 |
// Check if this instance of Exim has not initialized SRS |
36 |
if(!srs) |
35 |
if(!srs) |
37 |
{ |
36 |
{ |
38 |
/* Check config */ |
37 |
int co = 0; |
39 |
if(!srs_config) |
38 |
int hashlen, maxage; |
|
|
39 |
BOOL usetimestamp, usehash; |
40 |
|
41 |
/* Copy config vars */ |
42 |
hashlen = srs_hashlength; |
43 |
maxage = srs_maxage; |
44 |
usetimestamp = srs_usetimestamp; |
45 |
usehash = srs_usehash; |
46 |
|
47 |
/* Pass srs_config var (overrides new config vars) */ |
48 |
co = 0; |
49 |
if(srs_config) |
40 |
{ |
50 |
{ |
41 |
log_write(0, LOG_MAIN | LOG_PANIC, |
51 |
secret = string_nextinlist(&list, &co, secret_buf, SRS_MAX_SECRET_LENGTH); |
42 |
"SRS Configuration Error"); |
52 |
|
43 |
return DEFER; |
53 |
if((sbufp = string_nextinlist(&list, &co, sbuf, sizeof(sbuf))) != NULL) |
|
|
54 |
maxage = atoi(sbuf); |
55 |
|
56 |
if((sbufp = string_nextinlist(&list, &co, sbuf, sizeof(sbuf))) != NULL) |
57 |
hashlen = atoi(sbuf); |
58 |
|
59 |
if((sbufp = string_nextinlist(&list, &co, sbuf, sizeof(sbuf))) != NULL) |
60 |
usetimestamp = atoi(sbuf); |
61 |
|
62 |
if((sbufp = string_nextinlist(&list, &co, sbuf, sizeof(sbuf))) != NULL) |
63 |
usehash = atoi(sbuf); |
44 |
} |
64 |
} |
|
|
65 |
|
66 |
if(srs_hashmin == -1) |
67 |
srs_hashmin = hashlen; |
45 |
|
68 |
|
46 |
/* Get config */ |
69 |
/* First secret specified in secrets? */ |
47 |
co = 0; |
70 |
co = 0; |
48 |
if((secret = string_nextinlist(&list, &co, secret_buf, |
71 |
list = srs_secrets; |
49 |
SRS_MAX_SECRET_LENGTH)) == NULL) |
72 |
if(secret == NULL) |
50 |
{ |
73 |
{ |
51 |
log_write(0, LOG_MAIN | LOG_PANIC, |
74 |
if((secret = string_nextinlist(&list, &co, secret_buf, SRS_MAX_SECRET_LENGTH)) == NULL) |
52 |
"SRS Configuration Error: No secret specified"); |
75 |
{ |
53 |
return DEFER; |
76 |
log_write(0, LOG_MAIN | LOG_PANIC, |
|
|
77 |
"SRS Configuration Error: No secret specified"); |
78 |
return DEFER; |
79 |
} |
54 |
} |
80 |
} |
55 |
|
81 |
|
56 |
if((sbufp = string_nextinlist(&list, &co, sbuf, sizeof(sbuf))) == NULL) |
82 |
/* Check config */ |
57 |
maxage = 31; |
|
|
58 |
else |
59 |
maxage = atoi(sbuf); |
60 |
if(maxage < 0 || maxage > 365) |
83 |
if(maxage < 0 || maxage > 365) |
61 |
{ |
84 |
{ |
62 |
log_write(0, LOG_MAIN | LOG_PANIC, |
85 |
log_write(0, LOG_MAIN | LOG_PANIC, |
63 |
"SRS Configuration Error: Invalid maximum timestamp age"); |
86 |
"SRS Configuration Error: Invalid maximum timestamp age"); |
64 |
return DEFER; |
87 |
return DEFER; |
65 |
} |
88 |
} |
66 |
|
89 |
if(hashlen < 1 || hashlen > 20 || srs_hashmin < 1 || srs_hashmin > 20) |
67 |
if((sbufp = string_nextinlist(&list, &co, sbuf, sizeof(sbuf))) == NULL) |
|
|
68 |
hashlen = 6; |
69 |
else |
70 |
hashlen = atoi(sbuf); |
71 |
if(hashlen < 1 || hashlen > 20) |
72 |
{ |
90 |
{ |
73 |
log_write(0, LOG_MAIN | LOG_PANIC, |
91 |
log_write(0, LOG_MAIN | LOG_PANIC, |
74 |
"SRS Configuration Error: Invalid hash length"); |
92 |
"SRS Configuration Error: Invalid hash length"); |
75 |
return DEFER; |
93 |
return DEFER; |
76 |
} |
94 |
} |
77 |
|
95 |
|
78 |
|
|
|
79 |
if((srs = srs_open(secret, strnlen(secret, SRS_MAX_SECRET_LENGTH), |
96 |
if((srs = srs_open(secret, strnlen(secret, SRS_MAX_SECRET_LENGTH), |
80 |
maxage, hashlen, hashlen)) == NULL) |
97 |
maxage, hashlen, srs_hashmin)) == NULL) |
81 |
{ |
98 |
{ |
82 |
log_write(0, LOG_MAIN | LOG_PANIC, |
99 |
log_write(0, LOG_MAIN | LOG_PANIC, |
83 |
"Failed to allocate SRS memory"); |
100 |
"Failed to allocate SRS memory"); |
84 |
return DEFER; |
101 |
return DEFER; |
85 |
} |
102 |
} |
86 |
|
103 |
|
|
|
104 |
srs_set_option(srs, SRS_OPTION_USETIMESTAMP, usetimestamp); |
105 |
srs_set_option(srs, SRS_OPTION_USEHASH, usehash); |
87 |
|
106 |
|
88 |
if((sbufp = string_nextinlist(&list, &co, sbuf, sizeof(sbuf))) != NULL) |
107 |
/* Extra secrets? */ |
89 |
srs_set_option(srs, SRS_OPTION_USETIMESTAMP, atoi(sbuf)); |
108 |
while((secret = string_nextinlist(&list, &co, secret_buf, SRS_MAX_SECRET_LENGTH)) != NULL) |
90 |
|
109 |
srs_add_secret(srs, secret, strnlen(secret, SRS_MAX_SECRET_LENGTH)); |
91 |
if((sbufp = string_nextinlist(&list, &co, sbuf, sizeof(sbuf))) != NULL) |
|
|
92 |
srs_set_option(srs, SRS_OPTION_USEHASH, atoi(sbuf)); |
93 |
|
110 |
|
94 |
DEBUG(D_any) |
111 |
DEBUG(D_any) |
95 |
debug_printf("SRS initialized\n"); |
112 |
debug_printf("SRS initialized\n"); |
Lines 151-161
Link Here
|
151 |
int eximsrs_db_set(BOOL reverse, uschar *srs_db) |
168 |
int eximsrs_db_set(BOOL reverse, uschar *srs_db) |
152 |
{ |
169 |
{ |
153 |
if(reverse) |
170 |
if(reverse) |
154 |
srs_db_reverse = string_copy(srs_db); |
171 |
srs_db_reverse = (srs_db == NULL ? NULL : string_copy(srs_db)); |
155 |
else |
172 |
else |
156 |
srs_db_forward = string_copy(srs_db); |
173 |
srs_db_forward = (srs_db == NULL ? NULL : string_copy(srs_db)); |
157 |
|
174 |
|
158 |
if(srs_set_db_functions(srs, eximsrs_db_insert, eximsrs_db_lookup) * SRS_RESULT_FAIL) |
175 |
if(srs_set_db_functions(srs, (srs_db_forward ? eximsrs_db_insert : NULL), |
|
|
176 |
(srs_db_reverse ? eximsrs_db_lookup : NULL)) & SRS_RESULT_FAIL) |
159 |
return DEFER; |
177 |
return DEFER; |
160 |
|
178 |
|
161 |
return OK; |
179 |
return OK; |
Lines 167-175
Link Here
|
167 |
uschar *res; |
185 |
uschar *res; |
168 |
char buf[64]; |
186 |
char buf[64]; |
169 |
|
187 |
|
|
|
188 |
if(!srs_db_forward) |
189 |
return SRS_RESULT_DBERROR; |
190 |
|
170 |
srs_db_address = string_copyn(data, data_len); |
191 |
srs_db_address = string_copyn(data, data_len); |
171 |
if(srs_generate_unique_id(srs, srs_db_address, buf, 64) & SRS_RESULT_FAIL) |
192 |
if(srs_generate_unique_id(srs, srs_db_address, buf, 64) & SRS_RESULT_FAIL) |
172 |
return DEFER; |
193 |
return SRS_RESULT_DBERROR; |
173 |
|
194 |
|
174 |
srs_db_key = string_copyn(buf, 16); |
195 |
srs_db_key = string_copyn(buf, 16); |
175 |
|
196 |
|
Lines 188-193
Link Here
|
188 |
srs_result eximsrs_db_lookup(srs_t *srs, char *data, uint data_len, char *result, uint result_len) |
209 |
srs_result eximsrs_db_lookup(srs_t *srs, char *data, uint data_len, char *result, uint result_len) |
189 |
{ |
210 |
{ |
190 |
uschar *res; |
211 |
uschar *res; |
|
|
212 |
|
213 |
if(!srs_db_reverse) |
214 |
return SRS_RESULT_DBERROR; |
191 |
|
215 |
|
192 |
srs_db_key = string_copyn(data, data_len); |
216 |
srs_db_key = string_copyn(data, data_len); |
193 |
if((res = expand_string(srs_db_reverse)) == NULL) |
217 |
if((res = expand_string(srs_db_reverse)) == NULL) |