+
+ /**
+ * Signal a failed login. Will ban the IP if too many failures:
+ */
+ public static function banLoginFailed()
+ {
+ if (self::$banFile !== '') {
+ $ip = $_SERVER["REMOTE_ADDR"];
+ $gb = $GLOBALS['IPBANS'];
+
+ if (!isset($gb['FAILURES'][$ip])) {
+ $gb['FAILURES'][$ip] = 0;
+ }
+ $gb['FAILURES'][$ip]++;
+ if ($gb['FAILURES'][$ip] > (self::$banAfter - 1)) {
+ $gb['BANS'][$ip]= time() + self::$banDuration;
+ }
+
+ $GLOBALS['IPBANS'] = $gb;
+ file_put_contents(self::$banFile, "<?php\n\$GLOBALS['IPBANS']=".var_export($gb, true).";\n?>");
+ }
+ }
+
+ /**
+ * Signals a successful login. Resets failed login counter.
+ */
+ public static function banLoginOk()
+ {
+ if (self::$banFile !== '') {
+ $ip = $_SERVER["REMOTE_ADDR"];
+ $gb = $GLOBALS['IPBANS'];
+ unset($gb['FAILURES'][$ip]); unset($gb['BANS'][$ip]);
+ $GLOBALS['IPBANS'] = $gb;
+ file_put_contents(self::$banFile, "<?php\n\$GLOBALS['IPBANS']=".var_export($gb, true).";\n?>");
+ }
+ }
+
+ /**
+ * Ban init
+ */
+ public static function banInit()
+ {
+ if (self::$banFile !== '') {
+ if (!is_file(self::$banFile)) {
+ file_put_contents(self::$banFile, "<?php\n\$GLOBALS['IPBANS']=".var_export(array('FAILURES'=>array(), 'BANS'=>array()), true).";\n?>");
+ }
+ include self::$banFile;
+ }
+ }
+
+ /**
+ * Checks if the user CAN login. If 'true', the user can try to login.
+ *
+ * @return boolean true if user is banned, false otherwise
+ */
+ public static function banCanLogin()
+ {
+ if (self::$banFile !== '') {
+ $ip = $_SERVER["REMOTE_ADDR"];
+ $gb = $GLOBALS['IPBANS'];
+ if (isset($gb['BANS'][$ip])) {
+ // User is banned. Check if the ban has expired:
+ if ($gb['BANS'][$ip] <= time()) {
+ // Ban expired, user can try to login again.
+ unset($gb['FAILURES'][$ip]);
+ unset($gb['BANS'][$ip]);
+ file_put_contents(self::$banFile, "<?php\n\$GLOBALS['IPBANS']=".var_export($gb, true).";\n?>");
+
+ return true; // Ban has expired, user can login.
+ }
+
+ return false; // User is banned.
+ }
+ }
+
+ return true; // User is not banned.
+ }
+}