@@ -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