From 0671ac011c27677963b59b63f99d17c98ef8a982 Mon Sep 17 00:00:00 2001
From: lucha <lucha@paranoici.org>
Date: Sat, 26 Aug 2017 17:41:31 +0200
Subject: [PATCH] [auto] plugin: widget-logic 5.8.2

---
 wp-content/plugins/widget-logic/readme.txt    |  30 +-
 .../plugins/widget-logic/widget_logic.php     | 375 +++++++++++-------
 2 files changed, 270 insertions(+), 135 deletions(-)

diff --git a/wp-content/plugins/widget-logic/readme.txt b/wp-content/plugins/widget-logic/readme.txt
index e24b9d874..d7a2fa2d3 100644
--- a/wp-content/plugins/widget-logic/readme.txt
+++ b/wp-content/plugins/widget-logic/readme.txt
@@ -3,8 +3,8 @@ Contributors: wpchefgadget, alanft
 Donate link: http://www.justgiving.com/widgetlogic_cancerresearchuk
 Tags: widget, admin, conditional tags, filter, context
 Requires at least: 3.0
-Tested up to: 4.7.2
-Stable tag: 5.7.2
+Tested up to: 4.8
+Stable tag: 5.8.2
 License: GPLv2 or later
 
 Widget Logic lets you control on which pages widgets appear using WP's conditional tags. It also adds a 'widget_content' filter.
@@ -119,6 +119,32 @@ Tighten up your definitions with PHPs 'logical AND' &&, for example:
 
 == Changelog ==
 
+= 5.8.2 =
+The code has been adapted to work on the servers with restricted <?=
+
+Fixed support for the wp_register_sidebar_widget widgets.
+
+Some content was prepared for translation.
+
+= 5.8.1 =
+Fixed the issue of displaying errors under certain conditions.
+
+= 5.8.0 =
+Added full support for WP customizer.
+
+In case of a fatal error in logic, the widget will not be displayed.
+
+= 5.7.4 =
+Fixed the "Warning: Attempt to assign property of non-object" bug.
+https://wordpress.org/support/topic/latest-update-seems-break-my-installation/
+
+= 5.7.3 =
+Fixed the issue when in some cases the plugin displayed user logic errors in the Widgets section and this didn't allow to save the widgets.
+https://wordpress.org/support/topic/an-error-has-occurred-please-reload-the-page-and-try-again-3/
+
+Fixed ini_set() related warnings for some rare hosting configurations.
+https://wordpress.org/support/topic/ini_set-diabled-warning/
+
 = 5.7.2 =
 Removed conflicts with outdated WP versions.
 
diff --git a/wp-content/plugins/widget-logic/widget_logic.php b/wp-content/plugins/widget-logic/widget_logic.php
index ecdf181a9..36800bc0d 100644
--- a/wp-content/plugins/widget-logic/widget_logic.php
+++ b/wp-content/plugins/widget-logic/widget_logic.php
@@ -3,7 +3,7 @@
 Plugin Name:    Widget Logic
 Plugin URI:     http://wordpress.org/extend/plugins/widget-logic/
 Description:    Control widgets with WP's conditional tags is_home etc
-Version:        5.7.2
+Version:        5.8.2
 Author:         wpchefgadget, alanft
 
 Text Domain:   widget-logic
@@ -28,20 +28,16 @@ function widget_logic_activate()
 }
 
 $plugin_dir = basename(dirname(__FILE__));
-global $wl_options;
+global $wl_options, $wl_in_customizer;
+
+$wl_in_customizer = false;
 
 add_action( 'init', 'widget_logic_init' );
 function widget_logic_init()
 {
     load_plugin_textdomain( 'widget-logic', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
-
-    /*
-    	if ( ! )
-		return;
-
-	if (  )
-		return;
-    */
+	
+	/*
 	if ( is_admin() )
 	{
 		if ( get_option('widget_logic_version') != WIDGET_LOGIC_VERSION )
@@ -61,7 +57,7 @@ function widget_logic_init()
 			//enqueue admin/js/updates.js
 		}
 	}
-
+	*/
 }
 
 if((!$wl_options = get_option('widget_logic')) || !is_array($wl_options) )
@@ -69,10 +65,16 @@ if((!$wl_options = get_option('widget_logic')) || !is_array($wl_options) )
 
 if (is_admin())
 {
-	add_filter( 'widget_update_callback', 'widget_logic_ajax_update_callback', 10, 4); 				// widget changes submitted by ajax method
-	add_action( 'sidebar_admin_setup', 'widget_logic_expand_control');								// before any HTML output save widget changes and add controls to each widget on the widget admin page
-	add_action( 'sidebar_admin_page', 'widget_logic_options_control');								// add Widget Logic specific options on the widget admin page
-	add_filter( 'plugin_action_links', 'wl_charity', 10, 2);										// add my justgiving page link to the plugin admin page
+	add_filter( 'in_widget_form', 'widget_logic_in_widget_form', 10, 3 );
+	add_filter( 'widget_update_callback', 'widget_logic_update_callback', 10, 4);
+	
+	add_action( 'sidebar_admin_setup', 'widget_logic_expand_control');
+	// before any HTML output save widget changes and add controls to each widget on the widget admin page
+	add_action( 'sidebar_admin_page', 'widget_logic_options_control');
+	// add Widget Logic specific options on the widget admin page
+	add_filter( 'plugin_action_links', 'wl_charity', 10, 2);// add my justgiving page link to the plugin admin page
+	
+	add_action( 'widgets_init', 'widget_logic_add_controls', 999 );
 }
 else
 {
@@ -93,27 +95,32 @@ else
 }
 
 
-
+function widget_logic_in_customizer()
+{
+	global $wl_in_customizer;
+	$wl_in_customizer = true;
+	
+	//add_filter( 'widget_display_callback', 'widget_logic_customizer_display_callback', 10, 3 );
+	add_action( 'dynamic_sidebar', 'widget_logic_customizer_dynamic_sidebar_callback' );
+}
+add_action( 'customize_preview_init', 'widget_logic_in_customizer' );
 
 
 function widget_logic_sidebars_widgets_filter_add()
 {
-	add_filter( 'sidebars_widgets', 'widget_logic_filter_sidebars_widgets', 10);					// actually remove the widgets from the front end depending on widget logic provided
+	// actually remove the widgets from the front end depending on widget logic provided
+	add_filter( 'sidebars_widgets', 'widget_logic_filter_sidebars_widgets', 10);
 }
 // wp-admin/widgets.php explicitly checks current_user_can('edit_theme_options')
 // which is enough security, I believe. If you think otherwise please contact me
 
 
 // CALLED VIA 'widget_update_callback' FILTER (ajax update of a widget)
-function widget_logic_ajax_update_callback($instance, $new_instance, $old_instance, $this_widget)
+function widget_logic_update_callback( $instance, $new_instance, $old_instance, $this_widget )
 {
-	global $wl_options;
-	$widget_id=$this_widget->id;
-	if ( isset($_POST[$widget_id.'-widget_logic']))
-	{
-		$wl_options[$widget_id]=trim($_POST[$widget_id.'-widget_logic']);
-		update_option('widget_logic', $wl_options);
-	}
+	if ( isset( $new_instance['widget_logic'] ) )
+		$instance['widget_logic'] = $new_instance['widget_logic'];
+	
 	return $instance;
 }
 
@@ -161,36 +168,7 @@ function widget_logic_expand_control()
 		wp_redirect( admin_url('widgets.php') );
 		exit;
 	}
-
-
-	// ADD EXTRA WIDGET LOGIC FIELD TO EACH WIDGET CONTROL
-	// pop the widget id on the params array (as it's not in the main params so not provided to the callback)
-	foreach ( $wp_registered_widgets as $id => $widget )
-	{	// controll-less widgets need an empty function so the callback function is called.
-		if (!isset($wp_registered_widget_controls[$id]))
-			wp_register_widget_control($id,$widget['name'], 'widget_logic_empty_control');
-		$wp_registered_widget_controls[$id]['callback_wl_redirect']=$wp_registered_widget_controls[$id]['callback'];
-		$wp_registered_widget_controls[$id]['callback']='widget_logic_extra_control';
-		array_push($wp_registered_widget_controls[$id]['params'],$id);
-	}
-
-
-	// UPDATE WIDGET LOGIC WIDGET OPTIONS (via accessibility mode?)
-	if ( 'post' == strtolower($_SERVER['REQUEST_METHOD']) )
-	{
-		$widgt_ids = (array)@$_POST['widget-id'];
-		foreach ( $widgt_ids as $widget_number => $widget_id )
-			if (isset($_POST[$widget_id.'-widget_logic']))
-				$wl_options[$widget_id]=trim($_POST[$widget_id.'-widget_logic']);
-
-		// clean up empty options (in PHP5 use array_intersect_key)
-		$regd_plus_new=array_merge(array_keys($wp_registered_widgets),array_values($widgt_ids),
-			array('widget_logic-options-filter', 'widget_logic-options-wp_reset_query', 'widget_logic-options-load_point', 'widget_logic-options-show_errors'));
-		foreach (array_keys($wl_options) as $key)
-			if (!in_array($key, $regd_plus_new))
-				unset($wl_options[$key]);
-	}
-
+	
 	// UPDATE OTHER WIDGET LOGIC OPTIONS
 	// must update this to use http://codex.wordpress.org/Settings_API
 	if ( isset($_POST['widget_logic-options-submit']) )
@@ -280,59 +258,91 @@ function widget_logic_options_control()
 	<?php
 }
 
-// added to widget functionality in 'widget_logic_expand_control' (above)
-function widget_logic_empty_control() {}
+function widget_logic_add_controls()
+{
+	global $wp_registered_widget_controls, $wp_registered_widgets, $wp_registered_widget_updates;
+	
+	foreach ( $wp_registered_widgets as $id => $widget )
+	{
+		if ( preg_match( '/^(.+)-(\d+)$/', $id) )
+			continue;
+		
+		if ( !isset( $wp_registered_widget_controls[ $id ] ) )
+		{
+			wp_register_widget_control( $id, $id, 'widget_logic_extra_control', array(), $id, null );
+			continue;
+		}
+		
+		if ( @$wp_registered_widget_controls[ $id ]['callback'] != 'widget_logic_extra_control' )
+		{
+			$wp_registered_widget_controls[$id]['params'][] = $id;
+			$wp_registered_widget_controls[$id]['params'][] = @$wp_registered_widget_controls[$id]['callback'];
+			$wp_registered_widget_controls[$id]['callback'] = 'widget_logic_extra_control';
+			
+			$wp_registered_widget_updates[$id]['params'][] = $id;
+			$wp_registered_widget_updates[$id]['params'][] = @$wp_registered_widget_updates[$id]['callback'];
+			$wp_registered_widget_updates[$id]['callback'] = 'widget_logic_extra_control';
+		}
+	}
+}
 
+function widget_logic_in_widget_form( $widget, $return, $instance )
+{
+	$logic = isset( $instance['widget_logic'] ) ? $instance['widget_logic'] : widget_logic_by_id( $widget->id );
 
+	?>
+		<p>
+			<label for="<?php echo $widget->get_field_id('widget_logic'); ?>">
+				<?php esc_html_e('Widget logic:','widget-logic') ?>
+			</label>
+			<textarea class="widefat" name="<?php echo $widget->get_field_name('widget_logic'); ?>" id="<?php echo $widget->get_field_id('widget_logic'); ?>"><?php echo esc_textarea( $logic ) ?></textarea>
+		</p>
+	<?php
+	return;
+}
 
 // added to widget functionality in 'widget_logic_expand_control' (above)
 function widget_logic_extra_control()
-{	global $wp_registered_widget_controls, $wl_options;
-
-	$params=func_get_args();
-	$id=array_pop($params);
-
-	// go to the original control function
-	$callback=$wp_registered_widget_controls[$id]['callback_wl_redirect'];
-	if (is_callable($callback))
-		call_user_func_array($callback, $params);
-
-	$value = !empty( $wl_options[$id ] ) ? htmlspecialchars( stripslashes( $wl_options[$id ] ),ENT_QUOTES ) : '';
-
-	// dealing with multiple widgets - get the number. if -1 this is the 'template' for the admin interface
-	$id_disp=$id;
-	if (!empty($params) && isset($params[0]['number']))
-	{	$number=$params[0]['number'];
-		if ($number==-1) {$number="__i__"; $value="";}
-		$id_disp=$wp_registered_widget_controls[$id]['id_base'].'-'.$number;
-	}
-	// output our extra widget logic field
-	echo "<p><label for='".$id_disp."-widget_logic'>". __('Widget logic:','widget-logic'). " <textarea class='widefat' type='text' name='".$id_disp."-widget_logic' id='".$id_disp."-widget_logic' >".$value."</textarea></label></p>";
-	if ( !empty($wl_options['widget_logic-options-show_errors']) && trim($value) && version_compare( PHP_VERSION, '7.0', '>=' ) )
+{
+	global $wp_customize;
+	$args = func_get_args();
+	
+	$callback = array_pop( $args );
+	$widget_id = array_pop( $args );
+	
+	if ( is_callable($callback) )
+		call_user_func_array( $callback, $args );
+	
+	if ( isset( $_POST["widget-$widget_id"]['widget_logic'] ) )
 	{
-		$test = '$result = ('.trim(stripslashes($wl_options[$id ])).'); return true;';
-		try {
-			eval($test);
-		} catch ( Error $e )
-		{
-			?>
-			<div class="notice notice-error inline">
-				<p>
-					The code triggered a PHP error. It might still work on the front-end though b/c of different code environment.
-					<br><code><?php esc_html_e($e->getMessage()) ?></code>
-				</p>
-			</div>
-			<?php
-		}
+		$logic = stripslashes( $_POST["widget-$widget_id"]['widget_logic'] );
+		widget_logic_save( $widget_id, $logic );
 	}
+	else
+		$logic = widget_logic_by_id( $widget_id );
+	
+	$input_id = "widget-$widget_id-widget_logic";
+	$input_name = "widget-{$widget_id}[widget_logic]";
+	?>
+		<p>
+			<label for="<?php echo $input_id ?>">
+				<?php esc_html_e('Widget logic:','widget-logic') ?>
+			</label>
+			<?php if ( !empty($wp_customize) && $wp_customize->is_preview() ): ?>
+			<textarea class="widefat" id="<?php echo $input_id ?>" readonly><?php echo esc_textarea( $logic ) ?></textarea>
+			<p class="description"><?php printf( esc_html__('This is a "wp register sidebar widget" and is different from regular widgets. Hence it can only be edited from the %s page.', 'widget-logic'), sprintf( '<a href="%s" target="_blank">%s</a>', esc_attr(admin_url('widgets.php')), __('widgets') ) ) ?></p>
+			<?php else: ?>
+			<textarea class="widefat" name="<?php echo $input_name ?>" id="<?php echo $input_id ?>"><?php echo esc_textarea( $logic ) ?></textarea>
+			<?php endif ?>
+		</p>
+	<?php
+	return true;
 }
 
-
-
 // CALLED ON 'plugin_action_links' ACTION
 function wl_charity($links, $file)
 {	if ($file == plugin_basename(__FILE__))
-		array_push($links, '<a href="http://www.justgiving.com/widgetlogic_cancerresearchuk/">Charity Donation</a>');
+		array_push($links, '<a href="http://www.justgiving.com/widgetlogic_cancerresearchuk/">'.esc_html__('Charity Donation', 'widget-logic').'</a>');
 	return $links;
 }
 
@@ -340,12 +350,73 @@ function wl_charity($links, $file)
 
 // FRONT END FUNCTIONS...
 
+function widget_logic_by_id( $widget_id )
+{
+	global $wl_options;
+	
+	if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $m ) )
+	{
+		$widget_class = $m[1];
+		$widget_i = $m[2];
+		
+		$info = get_option( 'widget_'.$widget_class );
+		if ( empty( $info[ $widget_i ] ) )
+			return '';
+		
+		$info = $info[ $widget_i ];
+	}
+	else
+		$info = (array)get_option( 'widget_'.$widget_id, array() );
+	
+	if ( isset( $info['widget_logic'] ) )
+		$logic = $info['widget_logic'];
+	
+	elseif ( isset( $wl_options[ $widget_id ] ) )
+	{
+		$logic = stripslashes( $wl_options[ $widget_id ] );
+		widget_logic_save( $widget_id, $logic );
+		
+		unset( $wl_options[ $widget_id ] );
+		update_option( 'widget_logic', $wl_options );
+	}
+	
+	else
+		$logic = '';
+	
+	return $logic;
+}
 
+function widget_logic_save( $widget_id, $logic )
+{
+	global $wl_options;
+	
+	if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $m ) )
+	{
+		$widget_class = $m[1];
+		$widget_i = $m[2];
+		
+		$info = get_option( 'widget_'.$widget_class );
+		if ( !is_array( $info[ $widget_i ] ) )
+			$info[ $widget_i ] = array();
+		
+		$info[ $widget_i ]['widget_logic'] = $logic;
+		update_option( 'widget_'.$widget_class, $info );
+	}
+	else
+	{
+		$info = (array)get_option( 'widget_'.$widget_id, array() );
+		$info['widget_logic'] = $logic;
+		update_option( 'widget_'.$widget_id, $info );
+	}
+}
 
 // CALLED ON 'sidebars_widgets' FILTER
-function widget_logic_filter_sidebars_widgets($sidebars_widgets)
+function widget_logic_filter_sidebars_widgets( $sidebars_widgets )
 {
-	global $wp_reset_query_is_done, $wl_options;
+	global $wp_reset_query_is_done, $wl_options, $wl_in_customizer;
+	
+	if ( $wl_in_customizer )
+		return $sidebars_widgets;
 
 	// reset any database queries done now that we're about to make decisions based on the context given in the WP query for the page
 	if ( !empty( $wl_options['widget_logic-options-wp_reset_query'] ) && empty( $wp_reset_query_is_done ) )
@@ -353,54 +424,92 @@ function widget_logic_filter_sidebars_widgets($sidebars_widgets)
 		wp_reset_query();
 		$wp_reset_query_is_done=true;
 	}
-
+	
 	// loop through every widget in every sidebar (barring 'wp_inactive_widgets') checking WL for each one
 	foreach($sidebars_widgets as $widget_area => $widget_list)
-	{	if ($widget_area=='wp_inactive_widgets' || empty($widget_list)) continue;
+	{
+		if ($widget_area=='wp_inactive_widgets' || empty($widget_list))
+			continue;
 
 		foreach($widget_list as $pos => $widget_id)
-		{	if (empty($wl_options[$widget_id]))  continue;
-			$wl_value=stripslashes(trim($wl_options[$widget_id]));
-			if (empty($wl_value))  continue;
-
-			$wl_value=apply_filters( "widget_logic_eval_override", $wl_value );
-			if ($wl_value===false)
-			{	unset($sidebars_widgets[$widget_area][$pos]);
-				continue;
-			}
-			if ($wl_value===true) continue;
-
-			if (stristr($wl_value,"return")===false)
-				$wl_value="return (" . $wl_value . ");";
-
-			$save = ini_get('display_errors');
-			try {
-				if ( !empty($wl_options['widget_logic-options-show_errors']) && current_user_can('manage_options') )
-					ini_set( 'display_errors', 'On' );
-
-				if (!eval($wl_value))
-					unset($sidebars_widgets[$widget_area][$pos]);
-
-				ini_set( 'display_errors', $save );
-			}
-			catch ( Error $e ) {
-				if ( current_user_can('manage_options') && !empty($wl_options['widget_logic-options-show_errors']) )
-					trigger_error( 'Invalid Widget Logic: '.$e->getMessage(), E_USER_WARNING );
-
-				ini_set( 'display_errors', $save );
-				continue;
-			}
-
+		{
+			$logic = widget_logic_by_id( $widget_id );
+			
+			if ( !widget_logic_check_logic( $logic ) )
+				unset($sidebars_widgets[$widget_area][$pos]);
 		}
 	}
 	return $sidebars_widgets;
 }
 
 
+function widget_logic_check_logic( $logic )
+{
+	$logic = @trim( (string)$logic );
+	$logic = apply_filters( "widget_logic_eval_override", $logic );
+	
+	if ( is_bool( $logic ) )
+		return $logic;
+	
+	if ( $logic === '' )
+		return true;
 
-// If 'widget_logic-options-filter' is selected the widget_content filter is implemented...
+	if ( stristr( $logic, "return" ) === false )
+		$logic = "return ( $logic );";
+	
+	set_error_handler( 'widget_logic_error_handler' );
+	
+	try {
+		$show_widget = eval($logic);
+	}
+	catch ( Error $e ) {
+		trigger_error( $e->getMessage(), E_USER_WARNING );
+		
+		$show_widget = false;
+	}
+	
+	restore_error_handler();
+	
+	return $show_widget;
+}
 
+function widget_logic_error_handler( $errno , $errstr )
+{
+	global $wl_options;
+	$show_errors = !empty($wl_options['widget_logic-options-show_errors']) && current_user_can('manage_options');
+	
+	if ( $show_errors )
+		echo 'Invalid Widget Logic: '.$errstr;
+	
+	return true;
+}
 
+function widget_logic_customizer_dynamic_sidebar_callback( $widget )
+{
+	widget_logic_customizer_display( $widget['id'] );
+}
+
+function widget_logic_customizer_display( $widget_id )
+{
+	if ( !preg_match( '/^(.+)-(\d+)$/', $widget_id) )
+		return;
+	
+	$logic = widget_logic_by_id( $widget_id );
+
+	global $wl_options;
+	$show_errors = !empty($wl_options['widget_logic-options-show_errors']) && current_user_can('manage_options');
+	
+	ob_start();
+	$show_widget = widget_logic_check_logic( $logic );
+	$error = ob_get_clean();
+	
+	if ( $show_errors && $error ) :
+		?><script>jQuery(function($){$('#<?php echo $widget_id?>').append( $('<p class="widget-logic-error">').html(<?php echo json_encode($error)?>) );})</script><?php
+	endif;
+	if ( !$show_widget ):
+		?><script>jQuery(function($){$('#<?php echo $widget_id?>').children().not('.widget-logic-error').css('opacity', '0.2');})</script><?php
+	endif;
+}
 
 // CALLED ON 'dynamic_sidebar_params' FILTER - this is called during 'dynamic_sidebar' just before each callback is run
 // swap out the original call back and replace it with our own
-- 
GitLab