16
#define PROTVER2 LDAP_PROTOCOL_DETECT
18
#define PROTVER2 LDAP_VERSION2
22
#define PROTVER3 LDAP_PROTOCOL_DETECT
24
#define PROTVER3 LDAP_VERSION3
31
void putEntry(char* key, char* val) {
33
if (key==NULL || val==NULL) return;
35
if (!strcasecmp(key,"login")) {
39
if (!strcasecmp(key,"password")) {
43
if (!strcasecmp(key,"badheaders")) {
47
if (!strcasecmp(key,"blacklist")) {
51
if (!strcasecmp(key,"forceheader")) {
56
if (!strcasecmp(key,"forcefooter")) {
62
// val may not be NULL below
64
if (!strcasecmp(key,"map_field")) {
66
char **entry=splitString(val,1,' ');
69
if (entry[1]==NULL) return;
71
while(cfg.macro_attr[i]!=NULL) i++;
72
cfg.macro_attr=(char**)realloc(cfg.macro_attr,(i+2)*sizeof(char**));
73
cfg.macro_name=(char**)realloc(cfg.macro_name,(i+2)*sizeof(char**));
74
if (cfg.macro_attr==NULL || cfg.macro_name==NULL) oom();
75
cfg.macro_attr[i+1]=NULL;
76
cfg.macro_name[i+1]=NULL;
77
cfg.macro_attr[i]=entry[1];
78
cfg.macro_name[i]=entry[0];
83
if (!strcasecmp(key,"server")) {
87
if (!strcasecmp(key,"port")) {
91
if (!strcasecmp(key,"scope")) {
92
if (!strcasecmp(val,"base")) cfg.scope=LDAP_SCOPE_BASE;
93
if (!strcasecmp(val,"one")) cfg.scope=LDAP_SCOPE_ONELEVEL;
94
if (!strcasecmp(val,"sub")) cfg.scope=LDAP_SCOPE_SUBTREE;
97
if (!strcasecmp(key,"base")) {
101
if (!strcasecmp(key,"queryfilter")) {
105
if (!strcasecmp(key,"result")) {
109
if (!strcasecmp(key,"charset")) {
113
if (!strcasecmp(key,"map_sender")) {
117
if (!strcasecmp(key,"map_receiver")) {
118
cfg.map_receiver=val;
121
if (!strcasecmp(key,"blockfiles")) {
125
if (!strcasecmp(key,"blockexpire")) {
129
if (!strcasecmp(key,"mta")) {
130
char** tmp=splitString(val,1,' ');
133
if(tmp[0]!=NULL) cfg.mta=tmp[0];
134
if(tmp[1]!=NULL) cfg.mta_opts=tmp[1];
137
if (!strcasecmp(key,"recvheader")) {
139
char** tmp=splitString(val,-1,' ');
142
while(cfg.recv_header[i]!=NULL) {
143
free(cfg.recv_header[i]);
146
free(cfg.recv_header);
148
while(tmp[i]!=0) i++;
149
cfg.recv_header=(char**)malloc((i+1)*sizeof(char**));
153
if (!strcasecmp(key,"map_subject")) {
157
if (!strcasecmp(key,"maxreceivers")) {
158
cfg.maxmail=atoi(val);
161
if (!strcasecmp(key,"maxheader")) {
162
// Adding 2 is a cosmetical fix
163
cfg.maxheader=atoi(val)+2;
166
if (!strcasecmp(key,"loglevel")) {
170
if (!strcasecmp(key,"umask")) {
172
cfg.umask=(int)strtol(val,NULL,8);
175
if (!strcasecmp(key,"protocol")) {
177
case 2: {cfg.protver=PROTVER2; break;}
178
case 3: {cfg.protver=PROTVER3; break;}
183
syslog(LOG_MAIL|LOG_WARNING,"WARN/CFG Unknown config directive: %s",key);
186
void setDefaults(void) {
188
cfg.base=DEFAULT_BASE;
189
cfg.protver=LDAP_PROTOCOL_DETECT;
192
cfg.server=DEFAULT_SERVER;
193
cfg.qfilter=DEFAULT_QFILTER;
195
cfg.scope=LDAP_SCOPE_SUBTREE;
198
cfg.dbexp=DEFAULT_EXPIRE;
203
cfg.maxmail=DEFAULT_MAIL_LIMIT;
204
cfg.maxheader=DEFAULT_MAIL_LIMIT;
205
cfg.result=DEFAULT_MES;
206
cfg.map_sender=DEFAULT_MAP_SENDER;
207
cfg.map_receiver=DEFAULT_MAP_RECEIVER;
208
cfg.map_subject=DEFAULT_MAP_SUBJECT;
209
cfg.macro_attr=(char**)calloc(1,sizeof(char**));
210
cfg.macro_name=(char**)calloc(1,sizeof(char**));
211
cfg.recv_header=(char**)calloc(3,sizeof(char**));
212
cpyStr(&cfg.recv_header[0],"to");
213
cpyStr(&cfg.recv_header[1],"cc");
214
if (cfg.macro_attr==NULL || cfg.macro_name==NULL) oom();
217
void readConf(char *cfile) {
224
fptr=fopen(cfile,"r");
226
syslog(LOG_MAIL|LOG_ERR,"CRIT/IO %s",cfile);
229
while(((fgets(buf, (size_t)sizeof(buf), fptr)) && (buf != NULL))) {
230
if (!((buf[0]=='#') || (*buf=='\n'))) {
231
if (buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]=(char)NULL;
232
tmp=splitString(buf,1,' ');
233
//printf("%s:%s\n",tmp[0],tmp[1]);
234
putEntry(tmp[0],tmp[1]);
240
while(cfg.macro_attr[pos]!=NULL) pos++;
241
tmp=(char**)calloc(sizeof(char**)*2+pos*sizeof(char**),sizeof(char**));
242
if (tmp==NULL) oom();
243
memcpy(tmp,cfg.macro_attr,sizeof(char**)*pos);
245
free(cfg.macro_attr);