shell bypass 403
<?php
/**
* View class.
*
* @since 2.3.0
*/
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'Strong_View' ) ) :
class Strong_View {
/**
* The view settings.
*
* @var array
*/
public $atts;
/**
* The query.
*/
public $query;
/**
* The template file.
*/
public $template_file;
/**
* The view output.
*
* @var string
*/
public $html;
/**
* The plugin version.
*
* @var string
*/
public $plugin_version;
/**
* The stylesheet handle. For adding inline style.
*
* @since 2.31.8
* @var string
*/
public $stylesheet;
/**
* Strong_View constructor.
*
* @param array $atts
*/
public function __construct( $atts = array() ) {
$this->atts = apply_filters( 'wpmtst_view_atts', $atts );
$this->plugin_version = get_option( 'wpmtst_plugin_version' );
}
/**
* Return a specific view attribute.
*
* @param $att
* @since 2.33.0
*
* @return mixed|null
*/
public function get_att( $att ) {
return isset( $this->atts[ $att ] ) ? $this->atts[ $att ] : null;
}
/**
* Return our rendered template.
*
* @return string
*/
public function output() {
return $this->html;
}
/**
* Warning message of view not found.
*
* @return string
*/
public function nothing_found() {
ob_start();
?>
<p style="color: #CD0000;">
<?php esc_html_e( 'No testimonials found. Check your view settings.', 'strong-testimonials' ); ?><br>
<span style="color: #777; font-size: 0.9em;"><?php esc_html_e( '(Only administrators see this message.)', 'strong-testimonials' ); ?></span>
</p>
<?php
return apply_filters( 'wpmtst_message_nothing_found', ob_get_clean() );
}
/**
* Process the view.
*
* Used by main class to load the scripts and styles for this View.
*/
public function process() {}
/**
* Build the view.
*/
public function build() {}
/**
* Add content filters.
*/
public function add_content_filters() {
if ( 'truncated' === $this->get_att( 'content' ) ) {
// automatic excerpt
$this->excerpt_filters();
$this->hybrid_content();
add_filter( 'wpmtst_get_the_excerpt', 'wpmtst_bypass_excerpt', 1 );
if ( $this->get_att( 'more_post_ellipsis' ) ) {
add_filter( 'wpmtst_use_ellipsis', '__return_true' );
}
} elseif ( 'excerpt' === $this->get_att( 'content' ) ) {
// manual excerpt (if no excerpt then use automatic excerpt)
$this->excerpt_filters();
$this->hybrid_content();
if ( $this->get_att( 'more_full_post' ) ) {
add_filter( 'wpmtst_get_the_excerpt', array( $this, 'manual_excerpt_more' ), 20 );
}
if ( $this->get_att( 'more_post_ellipsis' ) ) {
add_filter( 'wpmtst_use_ellipsis', array( $this, 'has_no_excerpt' ) );
} else {
add_filter( 'wpmtst_use_ellipsis', '__return_false' );
}
} else {
// full content
add_filter( 'wpmtst_get_the_content', 'wpmtst_the_content_filtered' );
}
}
/**
* Add excerpt filters.
*
* @since 2.33.0
*/
public function excerpt_filters() {
add_filter( 'wpmtst_get_the_content', 'wpmtst_the_excerpt_filtered' );
add_filter( 'wpmtst_get_the_excerpt', 'wpmtst_trim_excerpt' );
if ( ! $this->get_att( 'use_default_length' ) ) {
add_filter( 'excerpt_length', array( $this, 'excerpt_length' ), 999 );
}
if ( ! $this->get_att( 'use_default_more' ) ) {
add_filter( 'excerpt_more', array( $this, 'excerpt_more' ), 99999 );
}
}
/**
* Add hybrid content filters.
*
* @since 2.33.0
*/
public function hybrid_content() {
if ( $this->get_att( 'more_post_in_place' ) ) {
add_filter( 'wpmtst_is_hybrid_content', '__return_true' );
} else {
add_filter( 'wpmtst_read_more_post_link', 'wpmtst_prepend_ellipsis' );
}
}
/**
* Remove content filters.
*
* @since 2.33.0
*/
public function remove_content_filters() {
remove_filter( 'wpmtst_get_the_content', 'wpmtst_the_content_filtered' );
remove_filter( 'wpmtst_get_the_content', 'wpmtst_the_excerpt_filtered' );
remove_filter( 'excerpt_length', array( $this, 'excerpt_length' ) );
remove_filter( 'excerpt_more', array( $this, 'excerpt_more' ) );
remove_filter( 'wpmtst_read_more_post_link', 'wpmtst_prepend_ellipsis' );
remove_filter( 'wpmtst_get_the_excerpt', 'wpmtst_bypass_excerpt', 1 );
remove_filter( 'wpmtst_get_the_excerpt', 'wpmtst_hybrid_excerpt' );
remove_filter( 'wpmtst_get_the_excerpt', 'wpmtst_trim_excerpt' );
remove_filter( 'wpmtst_get_the_excerpt', array( $this, 'manual_excerpt_more' ), 20 );
remove_filter( 'wpmtst_is_hybrid_content', '__return_true' );
remove_filter( 'wpmtst_use_ellipsis', '__return_true' );
remove_filter( 'wpmtst_use_ellipsis', array( $this, 'has_no_excerpt' ) );
}
/**
* Return true if post has no manual excerpt.
*
* @since 2.33.0
*
* @return bool
*/
public function has_no_excerpt() {
return ! has_excerpt();
}
/**
* Set custom excerpt length.
*
* @param $words
* @since 2.33.0
*
* @return mixed|null
*/
public function excerpt_length( $words ) {
$excerpt_length = $this->get_att( 'excerpt_length' );
return $excerpt_length ? $excerpt_length : $words;
}
/**
* The read-more link, maybe prepended with an ellipsis.
*
* @param $more
* @since 2.33.0
*
* @return string
*/
public function excerpt_more( $more ) {
return wpmtst_get_excerpt_more_link();
}
/**
* Maybe add read-more to manual excerpt.
*
* @since 2.26.0
* @param $excerpt
*
* @return string
*/
public function manual_excerpt_more( $excerpt ) {
if ( has_excerpt() ) {
$excerpt .= apply_filters( 'excerpt_more', ' […]' );
}
return $excerpt;
}
/**
* Build our query based on view attributes.
*/
public function build_query() {}
/**
* Build class list based on view attributes.
*
* This must happen after the query.
*/
public function build_classes() {}
/**
* Load template's extra stylesheets.
*
* @since 2.11.12
* @since 2.16.0 In Strong_View class.
*/
public function load_extra_stylesheets() {
$styles = WPMST()->templates->get_template_config( $this->atts, 'styles', false );
if ( $styles ) {
$styles_array = explode( ',', str_replace( ' ', '', $styles ) );
foreach ( $styles_array as $handle ) {
WPMST()->render->add_style( $handle );
}
}
}
/**
* Load template's script and/or dependencies.
*
* @since 1.25.0
* @since 2.16.0 In Strong_View class.
*/
public function load_dependent_scripts() {
// Scripts that are already registered.
$deps = WPMST()->templates->get_template_config( $this->atts, 'scripts', false );
$deps_array = $deps ? explode( ',', str_replace( ' ', '', $deps ) ) : array();
// A single script included in directory.
$script = WPMST()->templates->get_template_config( $this->atts, 'script', false );
if ( $script ) {
$handle = 'testimonials-' . $this->get_att( 'template' );
wp_register_script( $handle, $script, $deps_array );
WPMST()->render->add_script( $handle );
} else {
foreach ( $deps_array as $handle ) {
WPMST()->render->add_script( $handle );
}
}
}
/**
* Find a template's associated stylesheet.
*
* @since 1.23.0
* @since 2.16.0 In Strong_View class.
*
* @param bool $enqueue True = enqueue the stylesheet, @since 2.3
*
* @return bool|string
*/
public function find_stylesheet( $enqueue = true ) {
// In case of deactivated widgets still referencing deleted Views
if ( ! $this->get_att( 'template' ) ) {
return false;
}
$stylesheet = WPMST()->templates->get_template_attr( $this->atts, 'stylesheet', false );
if ( $stylesheet ) {
$handle = 'testimonials-' . str_replace( ':', '-', $this->get_att( 'template' ) );
$this->set_stylesheet( $handle );
wp_register_style( $handle, $stylesheet, array(), $this->plugin_version );
if ( $enqueue ) {
WPMST()->render->add_style( $handle );
} else {
return $handle;
}
}
return false;
}
/**
* Assemble list of CSS classes.
*
* @since 2.11.0
* @since 2.30.0 Adding template option classes.
*
* @return array
*/
public function get_template_css_class() {
$template_name = isset( $this->atts['template'] ) ? $this->atts['template'] : '';
$template_settings = $this->get_att( 'template_settings' );
// Maintain back-compat with template format version 1.0.
$class = str_replace( ':content', '', $template_name );
$class = str_replace( ':', '-', $class );
$class = str_replace( '-form-form', '-form', $class );
$class = $class . ' wpmtst-' . $class;
$class_list = array( $class );
$template_object = WPMST()->templates->get_template_by_name( $template_name );
if ( isset( $template_object['config']['options'] ) && is_array( ( $template_object['config']['options'] ) ) ) {
foreach ( $template_object['config']['options'] as $option ) {
if ( ! isset( $option->values ) ) {
continue;
}
if ( isset( $template_settings[ $template_name ][ $option->name ] ) ) {
foreach ( $option->values as $value ) {
if ( $value->value === $template_settings[ $template_name ][ $option->name ] ) {
if ( isset( $value->class_name ) ) {
$class_list[] = $value->class_name;
}
}
}
}
}
}
return array_filter( $class_list );
}
/**
* Print our custom style.
*
* @since 2.22.0
*/
public function add_custom_style() {
$this->custom_background();
$this->custom_font_color();
/**
* Hook to add more inline style.
*
* @since 2.22.0
*/
do_action( 'wpmtst_view_custom_style', $this );
}
/**
* Is this a form view?
*
* @since 2.30.0
*
* @return bool
*/
public function is_form() {
return ( 'form' === $this->get_att( 'mode' ) );
}
/**
* Build CSS for custom font color.
*
* @since 2.30.0
*/
public function custom_font_color() {
$font_color = $this->get_att( 'font-color' );
if ( ! isset( $font_color['type'] ) || 'custom' !== $font_color['type'] ) {
return;
}
$c1 = isset( $font_color['color'] ) ? $font_color['color'] : '';
$css = '';
if ( $c1 ) {
$view_el = ".strong-view-id-{$this->get_att( 'view' )}";
$handle = $this->get_stylesheet();
if ( $this->is_form() ) {
$css .= "$view_el .strong-form-inner { color: $c1; }";
} else {
$css .= "$view_el .wpmtst-testimonial-heading," .
"$view_el .wpmtst-testimonial-content p," .
"$view_el .wpmtst-testimonial-content span," .
"$view_el .wpmtst-testimonial-content a.readmore," .
"$view_el .wpmtst-testimonial-content div.readmore-content," .
"$view_el .wpmtst-testimonial-content div.readmore-excerpt," .
"$view_el .wpmtst-testimonial-inner .wpmtst-testimonial-field," .
"$view_el .wpmtst-testimonial-inner .wpmtst-testimonial-field a," .
"$view_el .wpmtst-testimonial-client div," .
"$view_el .wpmtst-testimonial-client a { color: $c1; }";
}
if ( wp_style_is( $handle, 'done' ) ) {
echo '<style type="text/css" id="wpmtst-view-custom-style">' . $css . '</style>';
} else {
wp_add_inline_style( $handle, $css );
}
}
}
/**
* Build CSS for custom background.
*/
public function custom_background() {
$background = $this->get_att( 'background' );
if ( ! isset( $background['type'] ) ) {
return;
}
$handle = $this->get_stylesheet();
$c1 = '';
$c2 = '';
switch ( $background['type'] ) {
case 'preset':
if ( '' === $background['preset'] ) {
break;
}
$preset = wpmtst_get_background_presets( $background['preset'] );
$c1 = $preset['color'];
if ( isset( $preset['color2'] ) ) {
$c2 = $preset['color2'];
}
break;
case 'gradient':
$c1 = $background['gradient1'];
$c2 = $background['gradient2'];
break;
case 'single':
$c1 = $background['color'];
break;
default:
}
// Special handling for Divi Builder
$prefix = '';
$css = '';
if ( $this->get_att( 'divi_builder' ) && wpmtst_divi_builder_active() ) {
$prefix = '#et_builder_outer_content ';
}
$view_el = "$prefix.strong-view-id-{$this->get_att( 'view' )}";
// Includes special handling for Bold template.
if ( $c1 && $c2 ) {
$gradient = self::gradient_rules( $c1, $c2 );
if ( $this->is_form() ) {
$css = "$view_el .strong-form-inner { $gradient }";
} else {
$css = "$view_el .wpmtst-testimonial-inner { $gradient }";
if ( 'bold' === WPMST()->atts( 'template' ) ) {
$css .= "$view_el .readmore-page { background: $c2 }";
}
}
} elseif ( $c1 ) {
if ( $this->is_form() ) {
$css = "{$view_el} .strong-form-inner { background: {$c1}; }";
} else {
$css = "$view_el .wpmtst-testimonial-inner { background: $c1; }";
if ( 'bold' === WPMST()->atts( 'template' ) ) {
$css .= "$view_el .readmore-page { background: $c1 }";
}
}
}
if ( wp_style_is( $handle, 'done' ) ) {
echo '<style type="text/css" id="wpmtst-custom-style">' . $css . '</style>';
} else {
wp_add_inline_style( $handle, $css );
}
}
/**
* Print gradient rules.
*
* @param $c1
* @param $c2
*
* @return string
*/
public function gradient_rules( $c1, $c2 ) {
return "background: {$c1};
background: -moz-linear-gradient(top, {$c1} 0%, {$c2} 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, {$c1}), color-stop(100%, {$c2}));
background: -webkit-linear-gradient(top, {$c1} 0%, {$c2} 100%);
background: -o-linear-gradient(top, {$c1} 0%, {$c2} 100%);
background: -ms-linear-gradient(top, {$c1} 0%, {$c2} 100%);
background: linear-gradient(to bottom, {$c1} 0%, {$c2} 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='{$c1}', endColorstr='{$c2}', GradientType=0);";
}
/**
* Stars
*
* @since 2.16.0 In Strong_View class.
*/
public function has_stars() {
if ( $this->get_att( 'client_section' ) ) {
foreach ( $this->get_att( 'client_section' ) as $field ) {
if ( 'rating' === $field['type'] ) {
WPMST()->render->add_style( 'wpmtst-rating-display' );
break;
}
}
}
}
public function set_stylesheet( $handle = '' ) {
$this->stylesheet = $handle;
}
public function get_stylesheet() {
return $this->stylesheet;
}
}
endif;