= self::LIMIT && (int) $m[ $k ][1] > time() ) { self::note( 'xmlrpc_login', $ip ); return new WP_Error( 'rabbitproof_refused', __( 'Too many failed sign-ins. Try again later.', 'rabbitproof' ) ); } return $user; } public static function failed( $username = '' ) { unset( $username ); if ( ! self::xmlrpc() ) { return; } $ip = self::ip(); $now = time(); $m = self::memory(); $k = md5( $ip ); $m[ $k ] = isset( $m[ $k ] ) && (int) $m[ $k ][1] > $now ? array( (int) $m[ $k ][0] + 1, (int) $m[ $k ][1] ) : array( 1, $now + self::WINDOW ); if ( count( $m ) > self::MAX ) { uasort( $m, function ( $a, $b ) { return (int) $a[1] - (int) $b[1]; } ); $m = array_slice( $m, -self::MAX, null, true ); } update_option( self::MEMORY, $m, false ); if ( $m[ $k ][0] >= self::LIMIT && self::enforcing() ) { self::note( 'xmlrpc_login', $ip ); } } private static function memory() { $now = time(); $m = get_option( self::MEMORY, array() ); return is_array( $m ) ? array_filter( $m, function ( $e ) use ( $now ) { return is_array( $e ) && isset( $e[0], $e[1] ) && (int) $e[1] > $now; } ) : array(); } public static function none( $methods ) { unset( $methods ); if ( self::xmlrpc() ) { self::note( 'xmlrpc_off', self::ip() ); } return array(); } public static function no_pingback( $headers ) { unset( $headers['X-Pingback'] ); return $headers; } private static function note( $kind, $ip ) { if ( isset( self::$logged[ $kind ] ) ) { return; } self::$logged[ $kind ] = true; Rabbitproof_Probes::add( $kind, $ip, '/xmlrpc.php' ); } }