Compare commits
17
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
61ddd3428c | ||
|
|
715dfad01e | ||
|
|
06a2616595 | ||
|
|
311ca3bdad | ||
|
|
7ec3f80305 | ||
|
|
61e9aed4be | ||
|
|
2afdc83164 | ||
|
|
45aa6e504b | ||
|
|
7e66141336 | ||
|
|
e0bc336890 | ||
|
|
2f90243356 | ||
|
|
964c53427d | ||
|
|
4300072952 | ||
|
|
094628753f | ||
|
|
d6a5e8a800 | ||
|
|
746f590746 | ||
|
|
eb878c1332 |
No files matched your search
@@ -5,6 +5,8 @@ Protects the Roundcube login page from bruteforce login attempts.
|
|||||||
Original concept from the roundcube "security" plugin by Lazlo Westerhof.
|
Original concept from the roundcube "security" plugin by Lazlo Westerhof.
|
||||||
Wanting to fix the shortfalls of that plugin led me to a rewrite.
|
Wanting to fix the shortfalls of that plugin led me to a rewrite.
|
||||||
|
|
||||||
|
Requires Roundcube 1.3 or higher.
|
||||||
|
|
||||||
FEATURES
|
FEATURES
|
||||||
-------------------
|
-------------------
|
||||||
- Bruteforce protection
|
- Bruteforce protection
|
||||||
@@ -13,9 +15,11 @@ FEATURES
|
|||||||
- Increasing ban duration by power of 4 for repeated offenders (2m, 8m, 32m, 8h32m, etc)
|
- Increasing ban duration by power of 4 for repeated offenders (2m, 8m, 32m, 8h32m, etc)
|
||||||
- Whitelist
|
- Whitelist
|
||||||
- Blacklist
|
- Blacklist
|
||||||
- Failed logins log
|
- Failed logins log [TODO: Logs are in DB, but no interface yet]
|
||||||
- Only accessible by administrator
|
- Only accessible by administrator
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
INSTALLATION
|
INSTALLATION
|
||||||
--------------------
|
--------------------
|
||||||
1. Change to plugins/ directory
|
1. Change to plugins/ directory
|
||||||
@@ -30,8 +34,13 @@ Create an issue ticket at https://github.com/stalks/roundcube-defense/issues
|
|||||||
|
|
||||||
HISTORY
|
HISTORY
|
||||||
--------------------
|
--------------------
|
||||||
|
10.12.2017 -- Version 1.0
|
||||||
|
|
||||||
21.02.2013 -- Version 0.1
|
21.02.2013 -- Version 0.1
|
||||||
- initial release, functional, still bug checking
|
- initial release, functional, still bug checking
|
||||||
|
|
||||||
===================
|
===================
|
||||||
|
|
||||||
Created by Steve Allison - https://www.nooblet.org/
|
Created by Steve Allison - https://www.nooblet.org/
|
||||||
|
|
||||||
|
Forked and upgraded by Inpos
|
||||||
+1
-1
@@ -52,8 +52,8 @@
|
|||||||
|
|
||||||
// Reset repeat offender count after this number of seconds or
|
// Reset repeat offender count after this number of seconds or
|
||||||
// multiply last ban period by <defense_repeat_multiplier>, whichever is greater
|
// multiply last ban period by <defense_repeat_multiplier>, whichever is greater
|
||||||
|
|
||||||
$rcmail_config['defense_repeat_reset'] = 86400;
|
$rcmail_config['defense_repeat_reset'] = 86400;
|
||||||
|
|
||||||
// Name of table in database
|
// Name of table in database
|
||||||
$rcmail_config['defense_db_table'] = 'defense';
|
$rcmail_config['defense_db_table'] = 'defense';
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -46,7 +46,7 @@ class defense extends rcube_plugin {
|
|||||||
*/
|
*/
|
||||||
private function debug($string) {
|
private function debug($string) {
|
||||||
if (!$this->debugEnabled) { return; }
|
if (!$this->debugEnabled) { return; }
|
||||||
write_log($this->logfile, $this->ipaddr . " # " . $string);
|
rcube::write_log($this->logfile, $this->ipaddr . " # " . $string);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Check if IP is matched against all IPs in array,
|
* Check if IP is matched against all IPs in array,
|
||||||
@@ -131,7 +131,7 @@ class defense extends rcube_plugin {
|
|||||||
return (((!preg_match('/^[\.\/:0-9a-f]+$/', strtolower($ip))) || (substr_count($ip, ':') < 2)) ? true : false);
|
return (((!preg_match('/^[\.\/:0-9a-f]+$/', strtolower($ip))) || (substr_count($ip, ':') < 2)) ? true : false);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Check string if it is IPv6
|
* Check string if it is IPv4
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
* ip address
|
* ip address
|
||||||
@@ -148,7 +148,7 @@ class defense extends rcube_plugin {
|
|||||||
// I can't seem to try/catch database entries so I have no details regarding error
|
// I can't seem to try/catch database entries so I have no details regarding error
|
||||||
$string = "Error communicating with database.";
|
$string = "Error communicating with database.";
|
||||||
$this->debug($string);
|
$this->debug($string);
|
||||||
write_log('error', 'plugin::defense: ' . $string);
|
rcube::write_log('error', 'plugin::defense: ' . $string);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Return true if IP matches config whitelist
|
* Return true if IP matches config whitelist
|
||||||
@@ -258,7 +258,7 @@ class defense extends rcube_plugin {
|
|||||||
$this->debugEnabled = $this->rc->config->get('defense_debug_enabled', false);
|
$this->debugEnabled = $this->rc->config->get('defense_debug_enabled', false);
|
||||||
|
|
||||||
// set client ip
|
// set client ip
|
||||||
$this->ipaddr = rcmail_remote_ip();
|
$this->ipaddr = rcube_utils::remote_ip();
|
||||||
|
|
||||||
// Roundcube event hooks
|
// Roundcube event hooks
|
||||||
$this->add_hook('template_object_loginform', array($this, 'hookLoginForm'));
|
$this->add_hook('template_object_loginform', array($this, 'hookLoginForm'));
|
||||||
@@ -347,7 +347,7 @@ class defense extends rcube_plugin {
|
|||||||
$this->debug($query . " [" . $result->rowCount() . "]");
|
$this->debug($query . " [" . $result->rowCount() . "]");
|
||||||
$row = $result->fetch();
|
$row = $result->fetch();
|
||||||
if (!$row) { $this->debug("Warning, SQL result empty: $query"); return false; } // No rows? Strange, abort.
|
if (!$row) { $this->debug("Warning, SQL result empty: $query"); return false; } // No rows? Strange, abort.
|
||||||
$this->debug("Found " . $row['n'] . " failed attempts in last " . $this->fail_reset . "s");
|
$this->debug("Found " . $row['n'] . " failed attempts in last " . (time() - $rTime) . "s");
|
||||||
if (($row['n'] >= $this->fail_max)) {
|
if (($row['n'] >= $this->fail_max)) {
|
||||||
$this->debug("IP banned.");
|
$this->debug("IP banned.");
|
||||||
// This IP is now banned
|
// This IP is now banned
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$labels = array();
|
||||||
|
$labels['ipbanned'] = 'Вы заблокированы на %s';
|
||||||
|
|
||||||
|
?>
|
||||||
+1
-1
@@ -8,7 +8,7 @@ CREATE TABLE IF NOT EXISTS `defense` (
|
|||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`epoch` int(11) NOT NULL,
|
`epoch` int(11) NOT NULL,
|
||||||
`type` tinyint(4) NOT NULL,
|
`type` tinyint(4) NOT NULL,
|
||||||
`ipaddr` varchar(40) NOT NULL,
|
`ipaddr` varchar(256) NOT NULL,
|
||||||
`data` text NOT NULL,
|
`data` text NOT NULL,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ;
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
CREATE SEQUENCE defense_seq;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS defense (
|
||||||
|
id int NOT NULL DEFAULT NEXTVAL ('defense_seq'),
|
||||||
|
epoch int NOT NULL,
|
||||||
|
type smallint NOT NULL,
|
||||||
|
ipaddr varchar(256) NOT NULL,
|
||||||
|
data text NOT NULL,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
) ;
|
||||||
|
|
||||||
|
ALTER SEQUENCE defense_seq RESTART WITH 30;
|
||||||
Reference in new issue
Block a user