Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
35b00ac485 | |||
d5a947cfbb | |||
b5a6cdf026 | |||
2f55ada8e5 | |||
57e2870904 | |||
e7e2ef639c | |||
036c1927fd | |||
25b16746b2 | |||
e80040fb7e | |||
f1e9ee0fbe | |||
ff11cdc931 | |||
993d0dd54c | |||
f8ab4214de | |||
0c9e63b7ee | |||
19644dd62b | |||
1e0659e649 | |||
bff28ce85b | |||
5d751e2dc6 |
53
README.md
53
README.md
@ -1,8 +1,8 @@
|
|||||||
# Statify Blacklist #
|
# Statify Blacklist #
|
||||||
* Contributors: Stefan Kalscheuer
|
* Contributors: Stefan Kalscheuer
|
||||||
* Requires at least: 3.9
|
* Requires at least: 3.9
|
||||||
* Tested up to: 4.5.3
|
* Tested up to: 4.7
|
||||||
* Stable tag: 1.1.1
|
* Stable tag: 1.3.1
|
||||||
* License: GPLv3 or later
|
* License: GPLv3 or later
|
||||||
* License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
* License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
||||||
|
|
||||||
@ -13,13 +13,13 @@ This plugin adds customizable blacklist to Statify to allow blocking of referer
|
|||||||
|
|
||||||
### Current Features ##
|
### Current Features ##
|
||||||
#### Referer Blacklist ####
|
#### Referer Blacklist ####
|
||||||
Add a list of domains (for simplicity onl second-level, e.g. _example.com_ which blocks _everything.example.com_).
|
Add a list of domains (for simplicity only second-level, e.g. _example.com_ which blocks _everything.example.com_).
|
||||||
|
|
||||||
#### CleanUp Database ####
|
#### CleanUp Database ####
|
||||||
Filters can be applied to data stored in database after modifying filter rules or for one-time clean-up.
|
Filters can be applied to data stored in database after modifying filter rules or for one-time clean-up.
|
||||||
|
|
||||||
#### Compatibility ####
|
#### Compatibility ####
|
||||||
This plugin requires Statify to be installed. The extension has been tested with Statify 1.4.2
|
This plugin requires Statify to be installed. The extension has been tested with Statify 1.4.3
|
||||||
The plugin is capable of handling multisite installations.
|
The plugin is capable of handling multisite installations.
|
||||||
|
|
||||||
### Credits ###
|
### Credits ###
|
||||||
@ -32,14 +32,55 @@ The plugin is capable of handling multisite installations.
|
|||||||
* Goto _Settings_ -> _Statify Blacklist_ to configure the plugin
|
* Goto _Settings_ -> _Statify Blacklist_ to configure the plugin
|
||||||
|
|
||||||
### Requirements ###
|
### Requirements ###
|
||||||
* PHP 5.2.4
|
* PHP 5.2.4 or above
|
||||||
* WordPress 3.9
|
* WordPress 3.9 or above
|
||||||
* Statify plugin installed and activated (tested up to 1.4.3)
|
* Statify plugin installed and activated (tested up to 1.4.3)
|
||||||
|
|
||||||
|
## Frequently Asked Questions ##
|
||||||
|
|
||||||
|
### What is blocked by default? ###
|
||||||
|
Nothing. By default all blacklists are empty and disabled. They can and have to be filled by the blog administrator.
|
||||||
|
|
||||||
|
A default blacklist is not provided, as the plugin itself is totally neutral. If you want to filter out referer spam,
|
||||||
|
visitors from search engines or just "false" referers from 301 redirects only depends on you.
|
||||||
|
|
||||||
|
### Does the filter effect user experience? ###
|
||||||
|
No. It only prevent's _Statify_ from tracking, nothing more or less.
|
||||||
|
|
||||||
|
### Does live filtering impact performance? ###
|
||||||
|
Yes, but probalby not noticeable. Checking a single referer string against a (usually small) list should be neglectible compared to the total loading procedure.
|
||||||
|
If this still is an issue for you, consider deactivating the filter and only run the one-time-cleanup or activate the cron job.
|
||||||
|
|
||||||
|
### Is any personal data collected? ###
|
||||||
|
No. The privacy policy of _Statify_ is untouched. Data is only processed, not stored or exposed to anyone.
|
||||||
|
|
||||||
|
### Are regular expression filters possible? ###
|
||||||
|
Yes, it it. Just select if you want to filter using regular expressions case sensitive or insensitive.
|
||||||
|
|
||||||
|
Note, that regular expression matching is significantly slower than the plain domain filter. Hence it is only recommended for asynchronous cron or manual execution and not for live filtering.
|
||||||
|
|
||||||
|
|
||||||
## Screenshots ##
|
## Screenshots ##
|
||||||
1. Statify Blacklist settings page
|
1. Statify Blacklist settings page
|
||||||
|
|
||||||
## Changelog ##
|
## Changelog ##
|
||||||
|
|
||||||
|
### 1.3.1 / 09.12.2016 ###
|
||||||
|
* Continue filtering if no filter applies (#6)
|
||||||
|
|
||||||
|
### 1.3.0 / 17.10.2016 ###
|
||||||
|
* Regular expressions filtering implemented
|
||||||
|
|
||||||
|
### 1.2.1 / 10.10.2016 ###
|
||||||
|
* Fix live filter configuration check
|
||||||
|
|
||||||
|
### 1.2.0 / 29.08.2016 ###
|
||||||
|
* Switched from `in_array()` to faster `isset()` for referer checking
|
||||||
|
* Optional cron execiton implemented
|
||||||
|
|
||||||
|
### 1.1.2 / 17.08.2016 ###
|
||||||
|
* Prepared for localization
|
||||||
|
|
||||||
### 1.1.1 / 16.08.2016 ###
|
### 1.1.1 / 16.08.2016 ###
|
||||||
* Some security fixes
|
* Some security fixes
|
||||||
|
|
||||||
|
@ -8,8 +8,7 @@ defined('ABSPATH') OR exit;
|
|||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
class StatifyBlacklist
|
class StatifyBlacklist {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Plugin options
|
* Plugin options
|
||||||
*
|
*
|
||||||
@ -31,8 +30,7 @@ class StatifyBlacklist
|
|||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
public static function instance()
|
public static function instance() {
|
||||||
{
|
|
||||||
new self();
|
new self();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,9 +38,9 @@ class StatifyBlacklist
|
|||||||
* Class constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
|
* @changed 1.2.1
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct() {
|
||||||
{
|
|
||||||
/* Skip on autosave or AJAX */
|
/* Skip on autosave or AJAX */
|
||||||
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) OR ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
|
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) OR ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
|
||||||
return;
|
return;
|
||||||
@ -54,39 +52,57 @@ class StatifyBlacklist
|
|||||||
/* Get multisite status */
|
/* Get multisite status */
|
||||||
self::$multisite = ( is_multisite() && array_key_exists( STATIFYBLACKLIST_BASE, (array) get_site_option( 'active_sitewide_plugins' ) ) );
|
self::$multisite = ( is_multisite() && array_key_exists( STATIFYBLACKLIST_BASE, (array) get_site_option( 'active_sitewide_plugins' ) ) );
|
||||||
|
|
||||||
/* Add Filter to statify hook */
|
/* Add Filter to statify hook if enabled */
|
||||||
|
if ( self::$_options['active_referer'] != 0 ) {
|
||||||
add_filter( 'statify_skip_tracking', array( 'StatifyBlacklist', 'apply_blacklist_filter' ) );
|
add_filter( 'statify_skip_tracking', array( 'StatifyBlacklist', 'apply_blacklist_filter' ) );
|
||||||
|
}
|
||||||
|
|
||||||
/* Admin only filters */
|
/* Admin only filters */
|
||||||
if ( is_admin() ) {
|
if ( is_admin() ) {
|
||||||
|
/* Load Textdomain (only needed for backend */
|
||||||
|
load_plugin_textdomain( 'statifyblacklist', false, STATIFYBLACKLIST_DIR . '/lang/' );
|
||||||
|
|
||||||
|
/* Add actions */
|
||||||
add_action( 'wpmu_new_blog', array( 'StatifyBlacklist_Install', 'init_site' ) );
|
add_action( 'wpmu_new_blog', array( 'StatifyBlacklist_Install', 'init_site' ) );
|
||||||
|
|
||||||
add_action( 'delete_blog', array( 'StatifyBlacklist_System', 'init_site' ) );
|
add_action( 'delete_blog', array( 'StatifyBlacklist_System', 'init_site' ) );
|
||||||
|
|
||||||
add_filter( 'plugin_row_meta', array( 'StatifyBlacklist_Admin', 'plugin_meta_link' ), 10, 2 );
|
add_filter( 'plugin_row_meta', array( 'StatifyBlacklist_Admin', 'plugin_meta_link' ), 10, 2 );
|
||||||
|
|
||||||
if ( is_multisite() ) {
|
if ( is_multisite() ) {
|
||||||
add_action( 'network_admin_menu', array( 'StatifyBlacklist_Admin', '_add_menu_page' ) );
|
add_action( 'network_admin_menu', array( 'StatifyBlacklist_Admin', '_add_menu_page' ) );
|
||||||
add_filter('network_admin_plugin_action_links', array('StatifyBlacklist_Admin', 'plugin_actions_links'), 10, 2);
|
add_filter( 'network_admin_plugin_action_links', array(
|
||||||
|
'StatifyBlacklist_Admin',
|
||||||
|
'plugin_actions_links'
|
||||||
|
), 10, 2 );
|
||||||
} else {
|
} else {
|
||||||
add_action( 'admin_menu', array( 'StatifyBlacklist_Admin', '_add_menu_page' ) );
|
add_action( 'admin_menu', array( 'StatifyBlacklist_Admin', '_add_menu_page' ) );
|
||||||
add_filter( 'plugin_action_links', array( 'StatifyBlacklist_Admin', 'plugin_actions_links' ), 10, 2 );
|
add_filter( 'plugin_action_links', array( 'StatifyBlacklist_Admin', 'plugin_actions_links' ), 10, 2 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* CronJob to clean up database */
|
||||||
|
if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
|
||||||
|
if ( self::$_options['cron_referer'] == 1 ) {
|
||||||
|
add_action( 'statify_cleanup', array( 'StatifyBlacklist_Admin', 'cleanup_database' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update options
|
* Update options
|
||||||
*
|
*
|
||||||
|
* @param $options array New options to save
|
||||||
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
* @changed 1.1.1
|
* @changed 1.1.1
|
||||||
*/
|
*/
|
||||||
public static function update_options() {
|
public static function update_options( $options = null ) {
|
||||||
self::$_options = wp_parse_args(
|
self::$_options = wp_parse_args(
|
||||||
get_option( 'statify-blacklist' ),
|
get_option( 'statify-blacklist' ),
|
||||||
array(
|
array(
|
||||||
'active_referer' => 0,
|
'active_referer' => 0,
|
||||||
'referer' => array()
|
'cron_referer' => 0,
|
||||||
|
'referer' => array(),
|
||||||
|
'referer_regexp' => 0
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -97,25 +113,34 @@ class StatifyBlacklist
|
|||||||
* @return TRUE if referer matches blacklist.
|
* @return TRUE if referer matches blacklist.
|
||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
|
* @changed 1.3.1
|
||||||
*/
|
*/
|
||||||
public static function apply_blacklist_filter() {
|
public static function apply_blacklist_filter() {
|
||||||
/* Skip if blacklist is inactive */
|
/* Skip if blacklist is inactive */
|
||||||
if ( self::$_options['active_referer'] != 1 ) {
|
if ( self::$_options['active_referer'] != 1 ) {
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Regular Expression filtering since 1.3.0 */
|
||||||
|
if ( isset(self::$_options['referer_regexp']) && self::$_options['referer_regexp'] > 0 ) {
|
||||||
|
/* Get full referer string */
|
||||||
|
$referer = ( isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '' );
|
||||||
|
/* Merge given regular expressions into one */
|
||||||
|
$regexp = '/' . implode( "|", array_keys( self::$_options['referer'] ) ) . '/';
|
||||||
|
if ( self::$_options['referer_regexp'] == 2 ) {
|
||||||
|
$regexp .= 'i';
|
||||||
|
}
|
||||||
|
/* Check blacklist (return NULL to continue filtering) */
|
||||||
|
return (preg_match( $regexp, $referer) === 1) ? true : NULL;
|
||||||
|
} else {
|
||||||
/* Extract relevant domain parts */
|
/* Extract relevant domain parts */
|
||||||
$referer = strtolower( ( isset( $_SERVER['HTTP_REFERER'] ) ? parse_url( $_SERVER['HTTP_REFERER'], PHP_URL_HOST ) : '' ) );
|
$referer = strtolower( ( isset( $_SERVER['HTTP_REFERER'] ) ? parse_url( $_SERVER['HTTP_REFERER'], PHP_URL_HOST ) : '' ) );
|
||||||
$referer = explode('.', $referer);
|
|
||||||
if( count($referer) >1 )
|
|
||||||
$referer = implode('.', array_slice($referer, -2));
|
|
||||||
else
|
|
||||||
$referer = implode('.', $referer);
|
|
||||||
|
|
||||||
/* Get blacklist */
|
/* Get blacklist */
|
||||||
$blacklist = self::$_options['referer'];
|
$blacklist = self::$_options['referer'];
|
||||||
|
|
||||||
/* Check blacklist */
|
/* Check blacklist (return NULL to continue filtering) */
|
||||||
return in_array($referer, $blacklist);
|
return isset($blacklist[ $referer]) ? true : NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,19 +8,23 @@ defined('ABSPATH') OR exit;
|
|||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
class StatifyBlacklist_Admin extends StatifyBlacklist
|
class StatifyBlacklist_Admin extends StatifyBlacklist {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* Update options
|
* Update options
|
||||||
*
|
*
|
||||||
|
* @param $options array New options to save
|
||||||
* @return mixed array of sanitized array on errors, FALSE if there were none
|
* @return mixed array of sanitized array on errors, FALSE if there were none
|
||||||
* @since 1.1.1
|
* @since 1.1.1
|
||||||
|
* @changed 1.3.0
|
||||||
*/
|
*/
|
||||||
public static function update_options($options) {
|
public static function update_options( $options = null ) {
|
||||||
if ( isset( $options ) && current_user_can( 'manage_options' ) ) {
|
if ( isset( $options ) && current_user_can( 'manage_options' ) ) {
|
||||||
/* Sanitize URLs and remove empty inputs */
|
/* Sanitize URLs and remove empty inputs */
|
||||||
$givenReferer = $options['referer'];
|
$givenReferer = $options['referer'];
|
||||||
|
if ($options['referer_regexp'] == 0)
|
||||||
$sanitizedReferer = self::sanitizeURLs( $givenReferer );
|
$sanitizedReferer = self::sanitizeURLs( $givenReferer );
|
||||||
|
else
|
||||||
|
$sanitizedReferer = $givenReferer;
|
||||||
|
|
||||||
/* Abort on errors */
|
/* Abort on errors */
|
||||||
if ( ! empty( array_diff( $givenReferer, $sanitizedReferer ) ) ) {
|
if ( ! empty( array_diff( $givenReferer, $sanitizedReferer ) ) ) {
|
||||||
@ -28,14 +32,15 @@ class StatifyBlacklist_Admin extends StatifyBlacklist
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Update database on success */
|
/* Update database on success */
|
||||||
if ((is_multisite() && array_key_exists(STATIFYBLACKLIST_BASE, (array)get_site_option('active_sitewide_plugins'))))
|
if ( ( is_multisite() && array_key_exists( STATIFYBLACKLIST_BASE, (array) get_site_option( 'active_sitewide_plugins' ) ) ) ) {
|
||||||
update_site_option( 'statify-blacklist', $options );
|
update_site_option( 'statify-blacklist', $options );
|
||||||
else
|
} else {
|
||||||
update_option( 'statify-blacklist', $options );
|
update_option( 'statify-blacklist', $options );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Refresh options */
|
/* Refresh options */
|
||||||
parent::update_options();
|
parent::update_options( $options );
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -47,10 +52,17 @@ class StatifyBlacklist_Admin extends StatifyBlacklist
|
|||||||
*/
|
*/
|
||||||
public function _add_menu_page() {
|
public function _add_menu_page() {
|
||||||
$title = __( 'Statify Blacklist', 'statify-blacklist' );
|
$title = __( 'Statify Blacklist', 'statify-blacklist' );
|
||||||
if (self::$multisite)
|
if ( self::$multisite ) {
|
||||||
add_submenu_page( 'settings.php', $title, $title, 'manage_network_plugins', 'statify-blacklist-settings', array('StatifyBlacklist_Admin', 'settings_page') );
|
add_submenu_page( 'settings.php', $title, $title, 'manage_network_plugins', 'statify-blacklist-settings', array(
|
||||||
else
|
'StatifyBlacklist_Admin',
|
||||||
add_submenu_page( 'options-general.php', $title, $title, 'manage_options', 'statify-blacklist', array('StatifyBlacklist_Admin', 'settings_page') );
|
'settings_page'
|
||||||
|
) );
|
||||||
|
} else {
|
||||||
|
add_submenu_page( 'options-general.php', $title, $title, 'manage_options', 'statify-blacklist', array(
|
||||||
|
'StatifyBlacklist_Admin',
|
||||||
|
'settings_page'
|
||||||
|
) );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,6 +75,7 @@ class StatifyBlacklist_Admin extends StatifyBlacklist
|
|||||||
*
|
*
|
||||||
* @param $links
|
* @param $links
|
||||||
* @param $file
|
* @param $file
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
@ -71,6 +84,7 @@ class StatifyBlacklist_Admin extends StatifyBlacklist
|
|||||||
if ( $file == STATIFYBLACKLIST_BASE ) {
|
if ( $file == STATIFYBLACKLIST_BASE ) {
|
||||||
$links[] = '<a href="https://github.com/stklcode/statify-blacklist">GitHub</a>';
|
$links[] = '<a href="https://github.com/stklcode/statify-blacklist">GitHub</a>';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $links;
|
return $links;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,6 +92,7 @@ class StatifyBlacklist_Admin extends StatifyBlacklist
|
|||||||
* Add plugin action links
|
* Add plugin action links
|
||||||
*
|
*
|
||||||
* @param array $input Registered links
|
* @param array $input Registered links
|
||||||
|
*
|
||||||
* @return array Merged links
|
* @return array Merged links
|
||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
@ -91,6 +106,7 @@ class StatifyBlacklist_Admin extends StatifyBlacklist
|
|||||||
sprintf( '<a href="%s">%s</a>', esc_attr( add_query_arg( 'page', 'statify-blacklist', $base ) ), __( 'Settings' ) )
|
sprintf( '<a href="%s">%s</a>', esc_attr( add_query_arg( 'page', 'statify-blacklist', $base ) ), __( 'Settings' ) )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $links;
|
return $links;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,46 +114,63 @@ class StatifyBlacklist_Admin extends StatifyBlacklist
|
|||||||
* Filter database for cleanup.
|
* Filter database for cleanup.
|
||||||
*
|
*
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
* @changed 1.1.1
|
* @changed 1.3.0
|
||||||
*/
|
*/
|
||||||
public static function cleanup_database() {
|
public static function cleanup_database() {
|
||||||
/* Check user permissions */
|
/* Check user permissions */
|
||||||
if (!current_user_can('manage_options'))
|
if ( ! current_user_can( 'manage_options' ) && ! ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
|
||||||
die( _e( 'Are you sure you want to do this?' ) );
|
die( _e( 'Are you sure you want to do this?' ) );
|
||||||
|
}
|
||||||
|
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
|
||||||
|
if ( isset( self::$_options['referer_regexp'] ) && self::$_options['referer_regexp'] > 0 ) {
|
||||||
|
/* Merge given regular expressions into one */
|
||||||
|
$refererRegexp = implode( "|", array_keys( self::$_options['referer'] ) );
|
||||||
|
} else {
|
||||||
/* Sanitize URLs */
|
/* Sanitize URLs */
|
||||||
$referer = self::sanitizeURLs( self::$_options['referer'] );
|
$referer = self::sanitizeURLs( self::$_options['referer'] );
|
||||||
|
|
||||||
/* Build filter regexp */
|
/* Build filter regexp */
|
||||||
$refererRegexp = str_replace('.', '\.', implode('|', $referer));
|
$refererRegexp = str_replace( '.', '\.', implode( '|', array_flip( $referer ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
if ( ! empty( $refererRegexp ) ) {
|
if ( ! empty( $refererRegexp ) ) {
|
||||||
/* Execute filter on database */
|
/* Execute filter on database */
|
||||||
$wpdb->query(
|
$wpdb->query(
|
||||||
$wpdb->prepare("DELETE FROM `$wpdb->statify` WHERE referrer REGEXP %s", $refererRegexp)
|
$wpdb->prepare( "DELETE FROM `$wpdb->statify` WHERE "
|
||||||
|
. ( ( self::$_options['referer_regexp'] == 1 ) ? " BINARY " : "" )
|
||||||
|
. "referrer REGEXP %s", $refererRegexp )
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Optimize DB */
|
/* Optimize DB */
|
||||||
$wpdb->query( "OPTIMIZE TABLE `$wpdb->statify`" );
|
$wpdb->query( "OPTIMIZE TABLE `$wpdb->statify`" );
|
||||||
|
|
||||||
|
/* Delete transient statify data */
|
||||||
|
delete_transient( 'statify_data' );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sanitize URLs and remove empty results
|
* Sanitize URLs and remove empty results
|
||||||
|
*
|
||||||
* @param $urls array given array of URLs
|
* @param $urls array given array of URLs
|
||||||
|
*
|
||||||
* @return array sanitized array
|
* @return array sanitized array
|
||||||
*
|
*
|
||||||
* @since 1.1.1
|
* @since 1.1.1
|
||||||
|
* @changed 1.2.0
|
||||||
*/
|
*/
|
||||||
private static function sanitizeURLs( $urls ) {
|
private static function sanitizeURLs( $urls ) {
|
||||||
return array_filter(
|
return array_flip(
|
||||||
|
array_filter(
|
||||||
array_map(
|
array_map(
|
||||||
function ( $r ) {
|
function ( $r ) {
|
||||||
return preg_replace( '/[^\da-z\.-]/i', '', filter_var( $r, FILTER_SANITIZE_URL ) );
|
return preg_replace( '/[^\da-z\.-]/i', '', filter_var( $r, FILTER_SANITIZE_URL ) );
|
||||||
},
|
},
|
||||||
$urls
|
array_flip( $urls )
|
||||||
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,10 @@ defined('ABSPATH') OR exit;
|
|||||||
*
|
*
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
class StatifyBlacklist_System extends StatifyBlacklist
|
class StatifyBlacklist_System extends StatifyBlacklist {
|
||||||
{
|
|
||||||
|
const VERSION_MAIN = 1.3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Plugin install handler.
|
* Plugin install handler.
|
||||||
*
|
*
|
||||||
@ -29,7 +31,10 @@ class StatifyBlacklist_System extends StatifyBlacklist
|
|||||||
switch_to_blog( $site_id );
|
switch_to_blog( $site_id );
|
||||||
add_option(
|
add_option(
|
||||||
'statify-blacklist',
|
'statify-blacklist',
|
||||||
array()
|
array(
|
||||||
|
'activate-referer' => 0,
|
||||||
|
'referer' => array()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,7 +42,10 @@ class StatifyBlacklist_System extends StatifyBlacklist
|
|||||||
} else {
|
} else {
|
||||||
add_option(
|
add_option(
|
||||||
'statify-blacklist',
|
'statify-blacklist',
|
||||||
array()
|
array(
|
||||||
|
'activate-referer' => 0,
|
||||||
|
'referer' => array()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,4 +75,40 @@ class StatifyBlacklist_System extends StatifyBlacklist
|
|||||||
|
|
||||||
delete_option( 'statify-blacklist' );
|
delete_option( 'statify-blacklist' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upgrade plugin options.
|
||||||
|
*
|
||||||
|
* @since 1.2.0
|
||||||
|
* @changed 1.3.0
|
||||||
|
*/
|
||||||
|
public static function upgrade() {
|
||||||
|
self::update_options();
|
||||||
|
/* Check if config array is not associative (pre 1.2.0) */
|
||||||
|
if ( array_keys( self::$_options['referer'] ) === range( 0, count( self::$_options['referer'] ) - 1 ) ) {
|
||||||
|
/* Flip referer array to make domains keys */
|
||||||
|
$options = self::$_options;
|
||||||
|
$options['referer'] = array_flip( self::$_options['referer'] );
|
||||||
|
if ( ( is_multisite() && array_key_exists( STATIFYBLACKLIST_BASE, (array) get_site_option( 'active_sitewide_plugins' ) ) ) ) {
|
||||||
|
update_site_option( 'statify-blacklist', $options );
|
||||||
|
} else {
|
||||||
|
update_option( 'statify-blacklist', $options );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if version is set (not before 1.3.0) */
|
||||||
|
if ( ! isset( self::$_options['version'] ) ) {
|
||||||
|
$options = self::$_options;
|
||||||
|
/* Set version */
|
||||||
|
$options['version'] = self::VERSION_MAIN;
|
||||||
|
/* Add regular expression option (as of 1.3) */
|
||||||
|
$options['referer_regexp'] = 0;
|
||||||
|
if ( ( is_multisite() && array_key_exists( STATIFYBLACKLIST_BASE, (array) get_site_option( 'active_sitewide_plugins' ) ) ) ) {
|
||||||
|
update_site_option( 'statify-blacklist', $options );
|
||||||
|
} else {
|
||||||
|
update_option( 'statify-blacklist', $options );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
52
statify-blacklist.php
Normal file
52
statify-blacklist.php
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
Plugin Name: Statify Blacklist
|
||||||
|
Description: Extension for the statify plugin to add a customizable blacklists.
|
||||||
|
Text Domain: statify-blacklist
|
||||||
|
Domain Path: /lang
|
||||||
|
Author: Stefan Kalscheuer
|
||||||
|
Author URI: https://stklcode.de
|
||||||
|
Plugin URI: https://wordpress.org/plugins/statify-blacklist
|
||||||
|
License: GPLv3 or later
|
||||||
|
Version: 1.3.1
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Quit */
|
||||||
|
defined( 'ABSPATH' ) OR exit;
|
||||||
|
|
||||||
|
/* Constants */
|
||||||
|
define( 'STATIFYBLACKLIST_FILE', __FILE__ );
|
||||||
|
define( 'STATIFYBLACKLIST_DIR', dirname( __FILE__ ) );
|
||||||
|
define( 'STATIFYBLACKLIST_BASE', plugin_basename( __FILE__ ) );
|
||||||
|
|
||||||
|
/* System Hooks */
|
||||||
|
add_action( 'plugins_loaded', array( 'StatifyBlacklist', 'instance' ) );
|
||||||
|
|
||||||
|
register_activation_hook( STATIFYBLACKLIST_FILE, array( 'StatifyBlacklist_System', 'install' ) );
|
||||||
|
|
||||||
|
register_uninstall_hook( STATIFYBLACKLIST_FILE, array( 'StatifyBlacklist_System', 'uninstall' ) );
|
||||||
|
|
||||||
|
/* Upgrade hook */
|
||||||
|
register_activation_hook( STATIFYBLACKLIST_FILE, array( 'StatifyBlacklist_System', 'upgrade' ) );
|
||||||
|
|
||||||
|
/* Autoload */
|
||||||
|
spl_autoload_register( 'statifyBlacklist_autoload' );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Autoloader for StatifyBlacklist classes.
|
||||||
|
*
|
||||||
|
* @param $class
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
function statifyBlacklist_autoload( $class ) {
|
||||||
|
$plugin_classes = array(
|
||||||
|
'StatifyBlacklist',
|
||||||
|
'StatifyBlacklist_Admin',
|
||||||
|
'StatifyBlacklist_System'
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( in_array( $class, $plugin_classes ) ) {
|
||||||
|
require_once( sprintf( '%s/inc/%s.class.php', STATIFYBLACKLIST_DIR, strtolower( $class ) ) );
|
||||||
|
}
|
||||||
|
}
|
@ -1,48 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
Plugin Name: Statify Blacklist
|
|
||||||
Description: Extension for the statify plugin to add a customizable blacklists.
|
|
||||||
Text Domain: statify-blacklist
|
|
||||||
Domain Path: /lang
|
|
||||||
Author: Stefan Kalscheuer
|
|
||||||
Author URI: https://stklcode.de
|
|
||||||
Plugin URI: https://wordpress.org/plugins/statify-blacklist
|
|
||||||
License: GPLv3 or later
|
|
||||||
Version: 1.1.1
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Quit */
|
|
||||||
defined('ABSPATH') OR exit;
|
|
||||||
|
|
||||||
/* Constants */
|
|
||||||
define('STATIFYBLACKLIST_FILE', __FILE__);
|
|
||||||
define('STATIFYBLACKLIST_DIR', dirname(__FILE__));
|
|
||||||
define('STATIFYBLACKLIST_BASE', plugin_basename(__FILE__));
|
|
||||||
|
|
||||||
/* System Hooks */
|
|
||||||
add_action('plugins_loaded', array('StatifyBlacklist', 'instance'));
|
|
||||||
|
|
||||||
register_activation_hook(STATIFYBLACKLIST_FILE, array('StatifyBlacklist_System', 'install'));
|
|
||||||
|
|
||||||
register_uninstall_hook(STATIFYBLACKLIST_FILE, array('StatifyBlacklist_System', 'uninstall'));
|
|
||||||
|
|
||||||
/* Autoload */
|
|
||||||
spl_autoload_register('statifyBlacklist_autoload');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Autoloader for StatifyBlacklist classes.
|
|
||||||
*
|
|
||||||
* @param $class
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
function statifyBlacklist_autoload($class) {
|
|
||||||
$plugin_classes = array(
|
|
||||||
'StatifyBlacklist',
|
|
||||||
'StatifyBlacklist_Admin',
|
|
||||||
'StatifyBlacklist_System'
|
|
||||||
);
|
|
||||||
|
|
||||||
if (in_array($class, $plugin_classes)) {
|
|
||||||
require_once(sprintf('%s/inc/%s.class.php', STATIFYBLACKLIST_DIR, strtolower($class)));
|
|
||||||
}
|
|
||||||
}
|
|
95
test/StatifyBlacklistTest.php
Normal file
95
test/StatifyBlacklistTest.php
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
const ABSPATH = false;
|
||||||
|
require_once( '../inc/statifyblacklist.class.php' );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class StatifyBlacklistTest
|
||||||
|
*
|
||||||
|
* PHPUnit test class for StatifyBlacklist
|
||||||
|
*/
|
||||||
|
class StatifyBlacklistTest extends PHPUnit_Framework_TestCase {
|
||||||
|
|
||||||
|
public function testFilter() {
|
||||||
|
/* Prepare Options: 2 blacklisted domains, disabled */
|
||||||
|
StatifyBlacklist::$_options = array(
|
||||||
|
'active_referer' => 0,
|
||||||
|
'cron_referer' => 0,
|
||||||
|
'referer' => array(
|
||||||
|
'example.com' => 0,
|
||||||
|
'example.net' => 1
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* No multisite */
|
||||||
|
StatifyBlacklist::$multisite = false;
|
||||||
|
|
||||||
|
/* No referer */
|
||||||
|
unset( $_SERVER['HTTP_REFERER'] );
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
/* Non-blacklisted referer */
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://example.org';
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
/* Blacklisted referer */
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://example.com';
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
/* Blacklisted referer with path */
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://example.net/foo/bar.html';
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
|
||||||
|
/* Activate filter and run tests again */
|
||||||
|
StatifyBlacklist::$_options['active_referer'] = 1;
|
||||||
|
|
||||||
|
unset( $_SERVER['HTTP_REFERER'] );
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://example.org';
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://example.com';
|
||||||
|
$this->assertTrue( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://example.net/foo/bar.html';
|
||||||
|
$this->assertTrue( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRegexFilter() {
|
||||||
|
/* Prepare Options: 2 regular expressions */
|
||||||
|
StatifyBlacklist::$_options = array(
|
||||||
|
'active_referer' => 1,
|
||||||
|
'cron_referer' => 0,
|
||||||
|
'referer' => array(
|
||||||
|
'example.[a-z]+' => 0,
|
||||||
|
'test' => 1
|
||||||
|
),
|
||||||
|
'referer_regexp' => 1
|
||||||
|
);
|
||||||
|
|
||||||
|
/* No multisite */
|
||||||
|
StatifyBlacklist::$multisite = false;
|
||||||
|
|
||||||
|
/* No referer */
|
||||||
|
unset( $_SERVER['HTTP_REFERER'] );
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
/* Non-blacklisted referer */
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://not.evil';
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
/* Blacklisted referer */
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://example.com';
|
||||||
|
$this->assertTrue( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
/* Blacklisted referer with path */
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://foobar.net/test/me';
|
||||||
|
$this->assertTrue( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
/* Matching both */
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://example.net/test/me';
|
||||||
|
$this->assertTrue( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
/* Mathinc with wrong case */
|
||||||
|
$_SERVER['HTTP_REFERER'] = 'http://eXaMpLe.NeT/tEsT/mE';
|
||||||
|
$this->assertFalse( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
|
||||||
|
/* Set RegExp filter to case insensitive */
|
||||||
|
StatifyBlacklist::$_options['referer_regexp'] = 2;
|
||||||
|
$this->assertTrue( StatifyBlacklist::apply_blacklist_filter() );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
65
views/settings_page.php
Normal file → Executable file
65
views/settings_page.php
Normal file → Executable file
@ -18,14 +18,19 @@ if ( !empty($_POST['statifyblacklist']) ) {
|
|||||||
StatifyBlacklist_Admin::cleanup_database();
|
StatifyBlacklist_Admin::cleanup_database();
|
||||||
} else {
|
} else {
|
||||||
/* Extract referer array */
|
/* Extract referer array */
|
||||||
if (empty(trim($_POST['statifyblacklist']['referer']))) $referer = array();
|
if ( empty( trim( $_POST['statifyblacklist']['referer'] ) ) ) {
|
||||||
else $referer = explode("\r\n", $_POST['statifyblacklist']['referer']);
|
$referer = array();
|
||||||
|
} else {
|
||||||
|
$referer = explode( "\r\n", $_POST['statifyblacklist']['referer'] );
|
||||||
|
}
|
||||||
|
|
||||||
/* Update options (data will be sanitized) */
|
/* Update options (data will be sanitized) */
|
||||||
$statifyBlacklistUpdateResult = StatifyBlacklist_Admin::update_options(
|
$statifyBlacklistUpdateResult = StatifyBlacklist_Admin::update_options(
|
||||||
array(
|
array(
|
||||||
'active_referer' => (int) @$_POST['statifyblacklist']['active_referer'],
|
'active_referer' => (int) @$_POST['statifyblacklist']['active_referer'],
|
||||||
'referer' => $referer
|
'cron_referer' => (int) @$_POST['statifyblacklist']['cron_referer'],
|
||||||
|
'referer' => array_flip( $referer ),
|
||||||
|
'referer_regexp' => (int) @$_POST['statifyblacklist']['referer_regexp']
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -37,7 +42,6 @@ if ( !empty($_POST['statifyblacklist']) ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
@ -63,20 +67,52 @@ if ( !empty($_POST['statifyblacklist']) ) {
|
|||||||
<ul style="list-style: none;">
|
<ul style="list-style: none;">
|
||||||
<li>
|
<li>
|
||||||
<label for="statify-blacklist_active_referer">
|
<label for="statify-blacklist_active_referer">
|
||||||
<input type="checkbox" name="statifyblacklist[active_referer]" id="statifyblacklist_active_referer" value="1" <?php checked(StatifyBlacklist::$_options['active_referer'], 1); ?> />
|
<input type="checkbox" name="statifyblacklist[active_referer]" id="statifyblacklist_active_referer"
|
||||||
|
value="1" <?php checked( StatifyBlacklist::$_options['active_referer'], 1 ); ?> />
|
||||||
<?php esc_html_e( 'Activate referer blacklist', 'statify-blacklist' ); ?>
|
<?php esc_html_e( 'Activate referer blacklist', 'statify-blacklist' ); ?>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<label for="statify-blacklist_cron_referer">
|
||||||
|
<input type="checkbox" name="statifyblacklist[cron_referer]" id="statifyblacklist_cron_referer"
|
||||||
|
value="1" <?php checked( StatifyBlacklist::$_options['cron_referer'], 1 ); ?> />
|
||||||
|
<?php esc_html_e( 'CronJob execution', 'statify-blacklist' ); ?>
|
||||||
|
<small>(<?php esc_html_e( 'Clean database periodically in background', 'statify-blacklist' ); ?>)</small>
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<label for="statify-blacklist_referer_regexp">
|
||||||
|
<?php esc_html_e( 'Use regular expressions', 'statify-blacklist' ); ?>:
|
||||||
|
<br />
|
||||||
|
<select name="statifyblacklist[referer_regexp]" id="statifyblacklist_referer_regexp">
|
||||||
|
<option value="0" <?php selected( StatifyBlacklist::$_options['referer_regexp'], 0 ); ?>>
|
||||||
|
<?php esc_html_e( 'Disabled', 'statify-blacklist' ); ?>
|
||||||
|
</option>
|
||||||
|
<option value="1" <?php selected( StatifyBlacklist::$_options['referer_regexp'], 1 ); ?>>
|
||||||
|
<?php esc_html_e( 'Case-sensitive', 'statify-blacklist' ); ?>
|
||||||
|
</option>
|
||||||
|
<option value="2" <?php selected( StatifyBlacklist::$_options['referer_regexp'], 2 ); ?>>
|
||||||
|
<?php esc_html_e( 'Case-insensitive', 'statify-blacklist' ); ?>
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
<small>(<?php esc_html_e( 'Performance slower than standard domain filter. Recommended for cron or manual execition only.', 'statify-blacklist' ); ?>)</small>
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<label for="statify-blacklist_referer">
|
<label for="statify-blacklist_referer">
|
||||||
<?php esc_html_e( 'Referer blacklist:', 'statify-blacklist' ); ?><br/>
|
<?php esc_html_e( 'Referer blacklist:', 'statify-blacklist' ); ?><br/>
|
||||||
<textarea cols="40" rows="5" name="statifyblacklist[referer]" id="statify-blacklist_referer"><?php
|
<textarea cols="40" rows="5" name="statifyblacklist[referer]" id="statify-blacklist_referer"><?php
|
||||||
if (isset($statifyBlacklistUpdateResult) &&$statifyBlacklistUpdateResult !== false)
|
if ( isset( $statifyBlacklistUpdateResult ) && $statifyBlacklistUpdateResult !== false ) {
|
||||||
print esc_html(implode("\r\n", $statifyBlacklistUpdateResult));
|
print esc_html( implode( "\r\n", array_keys( $statifyBlacklistUpdateResult ) ) );
|
||||||
else
|
} else {
|
||||||
print esc_html(implode("\r\n", StatifyBlacklist::$_options['referer']));
|
print esc_html( implode( "\r\n", array_keys( StatifyBlacklist::$_options['referer'] ) ) );
|
||||||
?></textarea><br />
|
}
|
||||||
<small>(<?php esc_html_e('Add one domain (without subdomains) each line, e.g. example.com', 'statify-blacklist'); ?>)</small>
|
?></textarea>
|
||||||
|
<br />
|
||||||
|
<small>
|
||||||
|
(<?php esc_html_e( 'Add one domain (without subdomains) each line, e.g. example.com', 'statify-blacklist' ); ?>
|
||||||
|
)
|
||||||
|
</small>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -84,10 +120,11 @@ if ( !empty($_POST['statifyblacklist']) ) {
|
|||||||
|
|
||||||
<p class="submit">
|
<p class="submit">
|
||||||
<input class="button-primary" type="submit" name="submit" value="<?php _e( 'Save Changes' ) ?>">
|
<input class="button-primary" type="submit" name="submit" value="<?php _e( 'Save Changes' ) ?>">
|
||||||
<hr>
|
<hr />
|
||||||
<input class="button-secondary" type="submit" name="cleanUp" value="<?php esc_html_e('CleanUp Database', 'statify-blacklist') ?>"
|
<input class="button-secondary" type="submit" name="cleanUp"
|
||||||
|
value="<?php esc_html_e( 'CleanUp Database', 'statify-blacklist' ) ?>"
|
||||||
onclick="return confirm('Do you really want to apply filters to database? This cannot be undone.');">
|
onclick="return confirm('Do you really want to apply filters to database? This cannot be undone.');">
|
||||||
<br>
|
<br />
|
||||||
<small><?php esc_html_e( 'Applies filter (even if disabled) to data stored in database. This cannot be undone!', 'statify-blacklist' ); ?></small>
|
<small><?php esc_html_e( 'Applies filter (even if disabled) to data stored in database. This cannot be undone!', 'statify-blacklist' ); ?></small>
|
||||||
</p>
|
</p>
|
||||||
</form>
|
</form>
|
||||||
|
Reference in New Issue
Block a user