shell bypass 403
<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2019 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/
defined('_JEXEC') or die;
use Joomla\CMS\Language\Text;
require_once JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/field.php';
class RSFormProFieldMultiple extends RSFormProField
{
// used in preview
public $codeIcon = '';
// @desc Splits a string by newlines
protected function explode($value) {
// @new feature, array is fine as well
if (!is_array($value)) {
$value = str_replace(array("\r\n", "\r"), "\n", $value);
$value = explode("\n", $value);
return $value;
} else {
return $value;
}
}
// @desc Returns the full name of the name HTML tag (eg. form[textbox])
public function getName() {
return $this->namespace.'['.$this->name.'][]';
}
// @desc Get the items list, if it exists
// Used in select lists, checkbox groups and radio groups
public function getItems() {
// Get defined items list
$items = array();
if ($items = $this->getProperty('ITEMS'))
{
if ($this->preview)
{
if ($this->hasCode($items))
{
$items = Text::_('RSFP_PHP_CODE_PLACEHOLDER');
}
}
else
{
// Check if it's a PHP code
$items = $this->isCode($items);
}
// Split them by newline
$items = $this->explode($items);
}
return $items;
}
public function getItemValue($item) {
// Default value processing
if (empty($item)) {
return null;
}
// Value does not exist in request.
if (!isset($this->value[$this->name])) {
// Grab default [c]hecked value if no request present
if ($item->flags['checked'] && (empty($this->value) || empty($this->value['formId']))) {
return $item->value;
}
} else {
// Value exists, grab it from request.
$value = $this->value[$this->name];
// Birthday field
if (!empty($this->processing) && isset($this->value[$this->name][$this->processing])) {
$value = $this->value[$this->name][$this->processing];
}
// Found a value
if (in_array($item->value, (array) $value)) {
return $item->value;
}
}
return null;
}
public function array_chunk_index($array, $indexes) {
$i = 0; // stores the array index regarding if its an integer or a string
$k = 0; // stores the chunks indexes, so that we can group them
$chunks = array();
foreach ($array as $value) {
// create the chunk entry
if (!isset($chunks[$k])) {
$chunks[$k] = array();
}
// add the values to the current chunk
$chunks[$k][] = $value;
// if the $array index is found in the $indexes array, increment the chunk index so that the next value is set to the next chunk
if (in_array($i, $indexes)) {
$k++;
}
// increment the $array index
$i++;
}
return $chunks;
}
public function splitItems($array, $columns) {
$items = count($array);
$rest = $items % $columns;
$diff = $items - $columns;
if ($diff < 0) {
return array_chunk($array, 1);
}
if ($rest == 0) {
$split = ceil(($items / $columns));
return array_chunk($array, $split);
} else {
$step = floor(($items / $columns));
$indexes = array();
$index = 0;
// condition to determine when to split the array
while($index < ($items - 1)){
if ($index == 0) {
//set the first index where to split by the normal step + 1 item from the rest of the array
$index = $step + ($rest > 0 ? 1 : 0);
} else {
$index = $index + $step + ($rest > 0 ? 1 : 0);
}
$rest--;
$indexes[] = ($index - 1);
}
return $this->array_chunk_index($array, $indexes);
}
}
}