Skip to content

Commit 7805e19

Browse files
author
Florian Schaal
committed
Use preg_match/preg_replace when adding/removing keys to amavis to avoid duplicate keys with different selectors. Prevent restarting amavis more then one time.
1 parent deb3716 commit 7805e19

File tree

1 file changed

+42
-40
lines changed

1 file changed

+42
-40
lines changed

server/plugins-available/mail_plugin_dkim.inc.php

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -195,17 +195,21 @@ function remove_dkim_key($key_file, $key_domain) {
195195
*/
196196
function add_to_amavis($key_domain) {
197197
global $app, $mail_config;
198+
199+
$restart = false;
200+
$selector = 'default';
198201
$amavis_config = file_get_contents($this->get_amavis_config());
199-
$key_value="dkim_key('".$key_domain."', 'default', '".$mail_config['dkim_path']."/".$key_domain.".private');\n";
200-
if(strpos($amavis_config, $key_value) === false) {
201-
$amavis_config = str_replace($key_value, '', $amavis_config);
202-
if (!file_put_contents($this->get_amavis_config(), $key_value, FILE_APPEND) === false) {
203-
$app->log('Adding DKIM Private-key to amavis-config.', LOGLEVEL_DEBUG);
204-
$this->restart_amavis();
205-
}
202+
$key_value="dkim_key('".$key_domain."', '".$selector."', '".$mail_config['dkim_path']."/".$key_domain.".private');\n";
203+
$amavis_config = preg_replace("/(\n|\r)?dkim_key.*".$key_domain.".*/", '', $amavis_config).$key_value;
204+
205+
if (file_put_contents($this->get_amavis_config(), $amavis_config)) {
206+
$app->log('Adding DKIM Private-key to amavis-config.', LOGLEVEL_DEBUG);
207+
$restart = true;
206208
} else {
207-
$app->log('DKIM Private-key already in amavis-config.',LOGLEVEL_DEBUG);
209+
$app->log('Unable to add DKIM Private-key for '.$key_domain.' to amavis-config.', LOGLEVEL_ERROR);
208210
}
211+
212+
return $restart;
209213
}
210214

211215
/**
@@ -214,20 +218,18 @@ function add_to_amavis($key_domain) {
214218
*/
215219
function remove_from_amavis($key_domain) {
216220
global $app;
217-
$amavis_config = file($this->get_amavis_config());
218-
$i=0;$found=false;
219-
foreach($amavis_config as $line) {
220-
if (preg_match("/^\bdkim_key\b.*\b".$key_domain."\b/", $line)) {
221-
unset($amavis_config[$i]);
222-
$found=true;
223-
}
224-
$i++;
225-
}
226-
if ($found) {
221+
222+
$restart = false;
223+
$amavis_config = file_get_contents($this->get_amavis_config());
224+
225+
if (preg_match("/(\n|\r)?dkim_key.*".$key_domain.".*/", $amavis_config)) {
226+
$amavis_config = preg_replace("/(\n|\r)?dkim_key.*".$key_domain.".*(\n|\r)?/", '', $amavis_config);
227227
file_put_contents($this->get_amavis_config(), $amavis_config);
228228
$app->log('Deleted the DKIM settings from amavis-config for '.$key_domain.'.', LOGLEVEL_DEBUG);
229-
$this->restart_amavis();
230-
} else $app->log('Unable to delete the DKIM settings from amavis-config for '.$key_domain.'.', LOGLEVEL_DEBUG);
229+
$restart = true;
230+
}
231+
232+
return $restart;
231233
}
232234

233235
/**
@@ -241,7 +243,11 @@ function add_dkim($data) {
241243
if ( substr($mail_config['dkim_path'], strlen($mail_config['dkim_path'])-1) == '/' )
242244
$mail_config['dkim_path'] = substr($mail_config['dkim_path'], 0, strlen($mail_config['dkim_path'])-1);
243245
if ($this->write_dkim_key($mail_config['dkim_path']."/".$data['new']['domain'], $data['new']['dkim_private'], $data['new']['domain'])) {
244-
$this->add_to_amavis($data['new']['domain']);
246+
if ($this->add_to_amavis($data['new']['domain'])) {
247+
$this->restart_amavis();
248+
} else {
249+
$this->remove_dkim_key($mail_config['dkim_path']."/".$data['new']['domain'], $data['new']['domain']);
250+
}
245251
} else {
246252
$app->log('Error saving the DKIM Private-key for '.$data['new']['domain'].' - DKIM is not enabled for the domain.', LOGLEVEL_ERROR);
247253
}
@@ -262,25 +268,26 @@ function remove_dkim($_data) {
262268
if ( substr($mail_config['dkim_path'], strlen($mail_config['dkim_path'])-1) == '/' )
263269
$mail_config['dkim_path'] = substr($mail_config['dkim_path'], 0, strlen($mail_config['dkim_path'])-1);
264270
$this->remove_dkim_key($mail_config['dkim_path']."/".$_data['domain'], $_data['domain']);
265-
$this->remove_from_amavis($_data['domain']);
271+
if ($this->remove_from_amavis($_data['domain']))
272+
$this->restart_amavis();
266273
}
267274

268275
/**
269276
* Function called by onLoad
270277
* deletes dkim-keys
271278
*/
272279
function domain_dkim_delete($event_name, $data) {
273-
if (isset($data['old']['dkim']) && $data['old']['dkim'] == 'y' && $data['old']['active'] == 'y') $this->remove_dkim($data['old']);
280+
if (isset($data['old']['dkim']) && $data['old']['dkim'] == 'y' && $data['old']['active'] == 'y')
281+
$this->remove_dkim($data['old']);
274282
}
275283

276284
/**
277285
* Function called by onLoad
278286
* insert dkim-keys
279287
*/
280288
function domain_dkim_insert($event_name, $data) {
281-
if (isset($data['new']['dkim']) && $data['new']['dkim']=='y' && $this->check_system($data)) {
289+
if (isset($data['new']['dkim']) && $data['new']['dkim']=='y' && $this->check_system($data))
282290
$this->add_dkim($data);
283-
}
284291
}
285292

286293
/**
@@ -291,22 +298,13 @@ function domain_dkim_update($event_name, $data) {
291298
global $app;
292299
if ($this->check_system($data)) {
293300
/* maildomain disabled */
294-
if ($data['new']['active'] == 'n' && $data['old']['active'] == 'y') {
301+
if ($data['new']['active'] == 'n' && $data['old']['active'] == 'y' && $data['new']['dkim']=='y') {
295302
$app->log('Maildomain '.$data['new']['domain'].' disabled - remove DKIM-settings', LOGLEVEL_DEBUG);
296-
if ($data['new']['dkim']=='y') {
297-
$this->remove_dkim($data['new']);
298-
}
299-
if ($data['old']['dkim']=='y') {
300-
$this->remove_dkim($data['old']);
301-
}
303+
$this->remove_dkim($data['new']);
302304
}
303-
304305
/* maildomain re-enabled */
305-
if ($data['new']['active'] == 'y' && $data['old']['active'] == 'n') {
306-
if ($data['new']['dkim']=='y') {
307-
$this->add_dkim($data);
308-
}
309-
}
306+
if ($data['new']['active'] == 'y' && $data['old']['active'] == 'n' && $data['new']['dkim']=='y')
307+
$this->add_dkim($data);
310308

311309
/* maildomain active - only dkim changes */
312310
if ($data['new']['active'] == 'y' && $data['old']['active'] == 'y') {
@@ -318,8 +316,12 @@ function domain_dkim_update($event_name, $data) {
318316
elseif ($data['new']['dkim'] != $data['old']['dkim'] && $data['new']['dkim'] == 'y') {
319317
$this->add_dkim($data);
320318
}
321-
/* new private-key or new domain-name */
322-
if ($data['new']['dkim_private'] != $data['old']['dkim_private'] || $data['new']['domain'] != $data['old']['domain']) {
319+
/* new private-key */
320+
if ($data['new']['dkim_private'] != $data['old']['dkim_private'] && $data['new']['dkim'] == 'y') {
321+
$this->add_dkim($data);
322+
}
323+
/* new domain-name */
324+
if ($data['new']['domain'] != $data['old']['domain']) {
323325
$this->remove_dkim($data['old']);
324326
$this->add_dkim($data);
325327
}

0 commit comments

Comments
 (0)