You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.5 KiB
50 lines
1.5 KiB
4 weeks ago
|
<?php
|
||
|
/**
|
||
|
* Plugin to integrate Roundcube into Mailcow-Dockerizeds' Fail2Ban
|
||
|
*
|
||
|
* @version 1.0
|
||
|
* @author Snep <snep@diskcat.com>
|
||
|
* @license MIT
|
||
|
* @url https://git.diskcat.com/Resneptacle/roundcube-mailcow-dockerized-fail2ban
|
||
|
*
|
||
|
* Inspired by https://github.com/mattrude/rc-plugin-fail2ban
|
||
|
*/
|
||
|
|
||
|
|
||
|
class mailcow_f2b extends rcube_plugin {
|
||
|
|
||
|
function init () {
|
||
|
$this -> add_hook ('login_failed', [ $this, 'log_failed_attempt' ]);
|
||
|
}
|
||
|
|
||
|
function log_failed_attempt ($args) {
|
||
|
// Try to get Redis connection data from Roundcube config
|
||
|
$redis_host = rcmail::get_instance () -> config -> get ('mailcow_f2b_redis_host');
|
||
|
$redis_port = rcmail::get_instance () -> config -> get ('mailcow_f2b_redis_port');
|
||
|
|
||
|
// Use MailCow defaults for Redis connection if not set in Roundcube config
|
||
|
if (is_null ($redis_host)) $redis_host = "redis-mailcow";
|
||
|
if (is_null ($redis_port)) $redis_port = 6379;
|
||
|
|
||
|
$log_entry = "roundcube: failed login from {$_SERVER['REMOTE_ADDR']} for user {$args['user']}";
|
||
|
|
||
|
// Write log entry to PHP error log
|
||
|
error_log ("{$log_entry}\n");
|
||
|
|
||
|
// Open Redis connection
|
||
|
$redis = new Redis ();
|
||
|
try {
|
||
|
$redis -> connect ($redis_host, $redis_port);
|
||
|
} catch (Exception $e) {
|
||
|
error_log ("roundcube: failed to connect to redis database at {$redis_host}:{$redis_port} because " . $e -> getMessage () . "\n");
|
||
|
}
|
||
|
|
||
|
// Write log entry to Redis DB
|
||
|
$redis -> publish ("F2B_CHANNEL", $log_entry);
|
||
|
|
||
|
// Close Redis connection
|
||
|
$redis -> close ();
|
||
|
}
|
||
|
|
||
|
}
|