Файловый менеджер - Редактировать - /home/wuectly/www/03cbe/profile.php.tar
Назад
home/wuectly/www/plugins/user/profile/profile.php 0000604 00000032073 15245611150 0016265 0 ustar 00 <?php /** * @package Joomla.Plugin * @subpackage User.profile * * @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\CMS\Date\Date; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Form\FormHelper; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\String\PunycodeHelper; use Joomla\Utilities\ArrayHelper; /** * An example custom profile plugin. * * @since 1.6 */ class PlgUserProfile extends JPlugin { /** * Date of birth. * * @var string * @since 3.1 */ private $date = ''; /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * Constructor * * @param object &$subject The object to observe * @param array $config An array that holds the plugin configuration * * @since 1.5 */ public function __construct(& $subject, $config) { parent::__construct($subject, $config); FormHelper::addFieldPath(__DIR__ . '/field'); } /** * Runs on content preparation * * @param string $context The context for the data * @param object $data An object containing the data for the form. * * @return boolean * * @since 1.6 */ public function onContentPrepareData($context, $data) { // Check we are manipulating a valid form. if (!in_array($context, array('com_users.profile', 'com_users.user', 'com_users.registration', 'com_admin.profile'))) { return true; } if (is_object($data)) { $userId = isset($data->id) ? $data->id : 0; if (!isset($data->profile) && $userId > 0) { // Load the profile data from the database. $db = Factory::getDbo(); $db->setQuery( 'SELECT profile_key, profile_value FROM #__user_profiles' . ' WHERE user_id = ' . (int) $userId . " AND profile_key LIKE 'profile.%'" . ' ORDER BY ordering' ); try { $results = $db->loadRowList(); } catch (RuntimeException $e) { $this->_subject->setError($e->getMessage()); return false; } // Merge the profile data. $data->profile = array(); foreach ($results as $v) { $k = str_replace('profile.', '', $v[0]); $data->profile[$k] = json_decode($v[1], true); if ($data->profile[$k] === null) { $data->profile[$k] = $v[1]; } } } if (!HTMLHelper::isRegistered('users.url')) { HTMLHelper::register('users.url', array(__CLASS__, 'url')); } if (!HTMLHelper::isRegistered('users.calendar')) { HTMLHelper::register('users.calendar', array(__CLASS__, 'calendar')); } if (!HTMLHelper::isRegistered('users.tos')) { HTMLHelper::register('users.tos', array(__CLASS__, 'tos')); } if (!HTMLHelper::isRegistered('users.dob')) { HTMLHelper::register('users.dob', array(__CLASS__, 'dob')); } } return true; } /** * Returns an anchor tag generated from a given value * * @param string $value URL to use * * @return mixed|string */ public static function url($value) { if (empty($value)) { return HTMLHelper::_('users.value', $value); } else { // Convert website URL to utf8 for display $value = PunycodeHelper::urlToUTF8(htmlspecialchars($value)); if (strpos($value, 'http') === 0) { return '<a href="' . $value . '">' . $value . '</a>'; } else { return '<a href="http://' . $value . '">' . $value . '</a>'; } } } /** * Returns html markup showing a date picker * * @param string $value valid date string * * @return mixed */ public static function calendar($value) { if (empty($value)) { return HTMLHelper::_('users.value', $value); } else { return HTMLHelper::_('date', $value, null, null); } } /** * Returns the date of birth formatted and calculated using server timezone. * * @param string $value valid date string * * @return mixed */ public static function dob($value) { if (!$value) { return ''; } return HTMLHelper::_('date', $value, Text::_('DATE_FORMAT_LC1'), false); } /** * Return the translated strings yes or no depending on the value * * @param boolean $value input value * * @return string */ public static function tos($value) { if ($value) { return Text::_('JYES'); } else { return Text::_('JNO'); } } /** * Adds additional fields to the user editing form * * @param Form $form The form to be altered. * @param mixed $data The associated data for the form. * * @return boolean * * @since 1.6 */ public function onContentPrepareForm(Form $form, $data) { // Check we are manipulating a valid form. $name = $form->getName(); if (!in_array($name, array('com_admin.profile', 'com_users.user', 'com_users.profile', 'com_users.registration'))) { return true; } // Add the registration fields to the form. Form::addFormPath(__DIR__ . '/profiles'); $form->loadFile('profile'); $fields = array( 'address1', 'address2', 'city', 'region', 'country', 'postal_code', 'phone', 'website', 'favoritebook', 'aboutme', 'dob', 'tos', ); // Change fields description when displayed in frontend or backend profile editing $app = Factory::getApplication(); if ($app->isClient('site') || $name === 'com_users.user' || $name === 'com_admin.profile') { $form->setFieldAttribute('address1', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('address2', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('city', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('region', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('country', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('postal_code', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('phone', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('website', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('favoritebook', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('aboutme', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('dob', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile'); $form->setFieldAttribute('tos', 'description', 'PLG_USER_PROFILE_FIELD_TOS_DESC_SITE', 'profile'); } $tosArticle = $this->params->get('register_tos_article'); $tosEnabled = $this->params->get('register-require_tos', 0); // We need to be in the registration form and field needs to be enabled if ($name !== 'com_users.registration' || !$tosEnabled) { // We only want the TOS in the registration form $form->removeField('tos', 'profile'); } else { // Push the TOS article ID into the TOS field. $form->setFieldAttribute('tos', 'article', $tosArticle, 'profile'); } foreach ($fields as $field) { // Case using the users manager in admin if ($name === 'com_users.user') { // Toggle whether the field is required. if ($this->params->get('profile-require_' . $field, 1) > 0) { $form->setFieldAttribute($field, 'required', ($this->params->get('profile-require_' . $field) == 2) ? 'required' : '', 'profile'); } // Remove the field if it is disabled in registration and profile elseif ($this->params->get('register-require_' . $field, 1) == 0 && $this->params->get('profile-require_' . $field, 1) == 0) { $form->removeField($field, 'profile'); } } // Case registration elseif ($name === 'com_users.registration') { // Toggle whether the field is required. if ($this->params->get('register-require_' . $field, 1) > 0) { $form->setFieldAttribute($field, 'required', ($this->params->get('register-require_' . $field) == 2) ? 'required' : '', 'profile'); } else { $form->removeField($field, 'profile'); } } // Case profile in site or admin elseif ($name === 'com_users.profile' || $name === 'com_admin.profile') { // Toggle whether the field is required. if ($this->params->get('profile-require_' . $field, 1) > 0) { $form->setFieldAttribute($field, 'required', ($this->params->get('profile-require_' . $field) == 2) ? 'required' : '', 'profile'); } else { $form->removeField($field, 'profile'); } } } // Drop the profile form entirely if there aren't any fields to display. $remainingfields = $form->getGroup('profile'); if (!count($remainingfields)) { $form->removeGroup('profile'); } return true; } /** * Method is called before user data is stored in the database * * @param array $user Holds the old user data. * @param boolean $isnew True if a new user is stored. * @param array $data Holds the new user data. * * @return boolean * * @since 3.1 * @throws InvalidArgumentException on invalid date. */ public function onUserBeforeSave($user, $isnew, $data) { // Check that the date is valid. if (!empty($data['profile']['dob'])) { try { $date = new Date($data['profile']['dob']); $this->date = $date->format('Y-m-d H:i:s'); } catch (Exception $e) { // Throw an exception if date is not valid. throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_ERROR_INVALID_DOB')); } if (Date::getInstance('now') < $date) { // Throw an exception if dob is greater than now. throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_ERROR_INVALID_DOB_FUTURE_DATE')); } } // Check that the tos is checked if required ie only in registration from frontend. $task = Factory::getApplication()->input->getCmd('task'); $option = Factory::getApplication()->input->getCmd('option'); $tosArticle = $this->params->get('register_tos_article'); $tosEnabled = ($this->params->get('register-require_tos', 0) == 2); // Check that the tos is checked. if ($task === 'register' && $tosEnabled && $tosArticle && $option === 'com_users' && !$data['profile']['tos']) { throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_FIELD_TOS_DESC_SITE')); } return true; } /** * Saves user profile data * * @param array $data entered user data * @param boolean $isNew true if this is a new user * @param boolean $result true if saving the user worked * @param string $error error message * * @return boolean */ public function onUserAfterSave($data, $isNew, $result, $error) { $userId = ArrayHelper::getValue($data, 'id', 0, 'int'); if ($userId && $result && isset($data['profile']) && count($data['profile'])) { try { $db = Factory::getDbo(); // Sanitize the date if (!empty($data['profile']['dob'])) { $data['profile']['dob'] = $this->date; } $keys = array_keys($data['profile']); foreach ($keys as &$key) { $key = 'profile.' . $key; $key = $db->quote($key); } $query = $db->getQuery(true) ->delete($db->quoteName('#__user_profiles')) ->where($db->quoteName('user_id') . ' = ' . (int) $userId) ->where($db->quoteName('profile_key') . ' IN (' . implode(',', $keys) . ')'); $db->setQuery($query); $db->execute(); $query = $db->getQuery(true) ->select($db->quoteName('ordering')) ->from($db->quoteName('#__user_profiles')) ->where($db->quoteName('user_id') . ' = ' . (int) $userId); $db->setQuery($query); $usedOrdering = $db->loadColumn(); $tuples = array(); $order = 1; foreach ($data['profile'] as $k => $v) { while (in_array($order, $usedOrdering)) { $order++; } $tuples[] = '(' . $userId . ', ' . $db->quote('profile.' . $k) . ', ' . $db->quote(json_encode($v)) . ', ' . ($order++) . ')'; } $db->setQuery('INSERT INTO #__user_profiles VALUES ' . implode(', ', $tuples)); $db->execute(); } catch (RuntimeException $e) { $this->_subject->setError($e->getMessage()); return false; } } return true; } /** * Remove all user profile information for the given user ID * * Method is called after user data is deleted from the database * * @param array $user Holds the user data * @param boolean $success True if user was successfully stored in the database * @param string $msg Message * * @return boolean */ public function onUserAfterDelete($user, $success, $msg) { if (!$success) { return false; } $userId = ArrayHelper::getValue($user, 'id', 0, 'int'); if ($userId) { try { $db = Factory::getDbo(); $db->setQuery( 'DELETE FROM #__user_profiles WHERE user_id = ' . $userId . " AND profile_key LIKE 'profile.%'" ); $db->execute(); } catch (Exception $e) { $this->_subject->setError($e->getMessage()); return false; } } return true; } } home/wuectly/www/administrator/components/com_admin/models/profile.php 0000604 00000016576 15245657657 0022504 0 ustar 00 <?php /** * @package Joomla.Administrator * @subpackage com_admin * * @copyright (C) 2010 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; // Load the helper and model used for two factor authentication JLoader::register('UsersModelUser', JPATH_ADMINISTRATOR . '/components/com_users/models/user.php'); JLoader::register('UsersHelper', JPATH_ADMINISTRATOR . '/components/com_users/helpers/users.php'); /** * User model. * * @since 1.6 */ class AdminModelProfile extends UsersModelUser { /** * Method to get the record form. * * @param array $data An optional array of data for the form to interrogate. * @param boolean $loadData True if the form is to load its own data (default case), false if not. * * @return JForm A JForm object on success, false on failure * * @since 1.6 */ public function getForm($data = array(), $loadData = true) { // Get the form. $form = $this->loadForm('com_admin.profile', 'profile', array('control' => 'jform', 'load_data' => $loadData)); if (empty($form)) { return false; } // Check for username compliance and parameter set $isUsernameCompliant = true; if ($this->loadFormData()->username) { $username = $this->loadFormData()->username; $isUsernameCompliant = !(preg_match('#[<>"\'%;()&\\\\]|\\.\\./#', $username) || strlen(utf8_decode($username)) < 2 || trim($username) != $username); } $this->setState('user.username.compliant', $isUsernameCompliant); if (!JComponentHelper::getParams('com_users')->get('change_login_name') && $isUsernameCompliant) { $form->setFieldAttribute('username', 'required', 'false'); $form->setFieldAttribute('username', 'readonly', 'true'); $form->setFieldAttribute('username', 'description', 'COM_ADMIN_USER_FIELD_NOCHANGE_USERNAME_DESC'); } // When multilanguage is set, a user's default site language should also be a Content Language if (JLanguageMultilang::isEnabled()) { $form->setFieldAttribute('language', 'type', 'frontend_language', 'params'); } // If the user needs to change their password, mark the password fields as required if (JFactory::getUser()->requireReset) { $form->setFieldAttribute('password', 'required', 'true'); $form->setFieldAttribute('password2', 'required', 'true'); } return $form; } /** * Method to get the data that should be injected in the form. * * @return mixed The data for the form. * * @since 1.6 */ protected function loadFormData() { // Check the session for previously entered form data. $data = JFactory::getApplication()->getUserState('com_users.edit.user.data', array()); if (empty($data)) { $data = $this->getItem(); } // Load the users plugins. JPluginHelper::importPlugin('user'); $this->preprocessData('com_admin.profile', $data); return $data; } /** * Method to get a single record. * * @param integer $pk The id of the primary key. * * @return mixed Object on success, false on failure. * * @since 1.6 */ public function getItem($pk = null) { return parent::getItem(JFactory::getUser()->id); } /** * Method to save the form data. * * @param array $data The form data. * * @return boolean True on success. * * @since 1.6 */ public function save($data) { $user = JFactory::getUser(); unset($data['id']); unset($data['groups']); unset($data['sendEmail']); unset($data['block']); $isUsernameCompliant = $this->getState('user.username.compliant'); if (!JComponentHelper::getParams('com_users')->get('change_login_name') && $isUsernameCompliant) { unset($data['username']); } // Handle the two factor authentication setup if (isset($data['twofactor']['method'])) { $twoFactorMethod = $data['twofactor']['method']; // Get the current One Time Password (two factor auth) configuration $otpConfig = $this->getOtpConfig($user->id); if ($twoFactorMethod !== 'none') { // Run the plugins FOFPlatform::getInstance()->importPlugin('twofactorauth'); $otpConfigReplies = FOFPlatform::getInstance()->runPlugins('onUserTwofactorApplyConfiguration', array($twoFactorMethod)); // Look for a valid reply foreach ($otpConfigReplies as $reply) { if (!is_object($reply) || empty($reply->method) || ($reply->method != $twoFactorMethod)) { continue; } $otpConfig->method = $reply->method; $otpConfig->config = $reply->config; break; } // Save OTP configuration. $this->setOtpConfig($user->id, $otpConfig); // Generate one time emergency passwords if required (depleted or not set) if (empty($otpConfig->otep)) { $this->generateOteps($user->id); } } else { $otpConfig->method = 'none'; $otpConfig->config = array(); $this->setOtpConfig($user->id, $otpConfig); } // Unset the raw data unset($data['twofactor']); // Reload the user record with the updated OTP configuration $user->load($user->id); } // Bind the data. if (!$user->bind($data)) { $this->setError($user->getError()); return false; } $user->groups = null; // Store the data. if (!$user->save()) { $this->setError($user->getError()); return false; } $this->setState('user.id', $user->id); return true; } /** * Gets the configuration forms for all two-factor authentication methods * in an array. * * @param integer $userId The user ID to load the forms for (optional) * * @return array * * @since __DEPOLOY_VERSION__ */ public function getTwofactorform($userId = null) { $userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id; $model = new UsersModelUser; return $model->getTwofactorform($userId); } /** * Returns the one time password (OTP) – a.k.a. two factor authentication – * configuration for a particular user. * * @param integer $userId The numeric ID of the user * * @return stdClass An object holding the OTP configuration for this user * * @since __DEPOLOY_VERSION__ */ public function getOtpConfig($userId = null) { $userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id; $model = new UsersModelUser; return $model->getOtpConfig($userId); } /** * Sets the one time password (OTP) – a.k.a. two factor authentication – * configuration for a particular user. The $otpConfig object is the same as * the one returned by the getOtpConfig method. * * @param integer $userId The numeric ID of the user * @param stdClass $otpConfig The OTP configuration object * * @return boolean True on success * * @since __DEPOLOY_VERSION__ */ public function setOtpConfig($userId, $otpConfig) { $userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id; $model = new UsersModelUser; return $model->setOtpConfig($userId, $otpConfig); } /** * Generates a new set of One Time Emergency Passwords (OTEPs) for a given user. * * @param integer $userId The user ID * @param integer $count How many OTEPs to generate? Default: 10 * * @return array The generated OTEPs * * @since __DEPOLOY_VERSION__ */ public function generateOteps($userId, $count = 10) { $userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id; $model = new UsersModelUser; return $model->generateOteps($userId, $count); } } home/wuectly/www/administrator/components/com_jce/models/profile.php 0000604 00000073651 15245703255 0022134 0 ustar 00 <?php /** * @package JCE * @subpackage Admin * * @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved. * @copyright Copyright (c) 2009-2024 Ryan Demmer. All rights reserved * @license GNU General Public License version 2 or later; see LICENSE.txt */ \defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\Filesystem\File; use Joomla\CMS\Filter\InputFilter; use Joomla\CMS\Form\Form; use Joomla\CMS\Form\FormHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\MVC\Model\AdminModel; use Joomla\CMS\Session\Session; use Joomla\CMS\Table\Table; use Joomla\Registry\Registry; use Joomla\String\StringHelper; use Joomla\Event\DispatcherAwareInterface; require JPATH_SITE . '/components/com_jce/editor/libraries/classes/editor.php'; require JPATH_ADMINISTRATOR . '/components/com_jce/helpers/plugins.php'; require JPATH_ADMINISTRATOR . '/components/com_jce/helpers/profiles.php'; /** * Item Model for a Profile. * * @since 1.6 */ class JceModelProfile extends AdminModel { /** * The type alias for this content type. * * @var string * * @since 3.2 */ public $typeAlias = 'com_jce.profile'; /** * The prefix to use with controller messages. * * @var string * * @since 1.6 */ protected $text_prefix = 'COM_JCE'; public function __construct($config = array()) { if ($this instanceof DispatcherAwareInterface) { $this->setDispatcher(Factory::getApplication()->getDispatcher()); } parent::__construct($config); } /** * Returns a Table object, always creating it. * * @param type $type The table type to instantiate * @param string $prefix A prefix for the table class name. Optional * @param array $config Configuration array for model. Optional * * @return JTable A database object * * @since 1.6 */ public function getTable($type = 'Profiles', $prefix = 'JceTable', $config = array()) { return Table::getInstance($type, $prefix, $config); } /* Override to prevent plugins from processing form data */ protected function preprocessData($context, &$data, $group = 'system') { if (!isset($data->config)) { return; } $config = $data->config; if (is_string($config)) { $config = json_decode($config, true); } if (empty($config)) { return; } // editor parameters if (isset($config['editor'])) { if (!empty($config['editor']['toolbar_theme']) && $config['editor']['toolbar_theme'] === 'mobile') { $config['editor']['toolbar_theme'] = 'default.touch'; } if (isset($config['editor']['relative_urls']) && !isset($config['editor']['convert_urls'])) { $config['editor']['convert_urls'] = $config['editor']['relative_urls'] == 0 ? 'absolute' : 'relative'; } } // decode config values for display array_walk_recursive($config, function (&$value) { $value = htmlspecialchars_decode($value); }); $data->config = $config; } /** * Method to allow derived classes to preprocess the form. * * @param JForm $form A JForm object * @param mixed $data The data expected for the form * @param string $group The name of the plugin group to import (defaults to "content") * * @see JFormField * @since 1.6 * * @throws Exception if there is an error in the form event */ protected function preprocessForm(Form $form, $data, $group = 'content') { if (!empty($data)) { $registry = new Registry($data->config); // process individual fields to remove default value if required $fields = $form->getFieldset(); foreach ($fields as $field) { $name = $field->getAttribute('name'); // get the field group and add the field name $group = (string) $field->group; // must be a grouped parameter, eg: editor, imgmanager etc. if (!$group) { continue; } // create key from group and name $group = $group . '.' . $name; // explode group to array $parts = explode('.', $group); // remove "config" from group name so it matches params data object if ($parts[0] === "config") { array_shift($parts); $group = implode('.', $parts); } // reset the "default" attribute value if a value is set if ($registry->exists($group)) { $form->setFieldAttribute($name, 'default', '', (string) $field->group); } } } if ($form->getName() == 'com_jce.profile') { // editor manifest $manifest = __DIR__ . '/forms/editor.xml'; // load editor manifest if (is_file($manifest)) { if ($editor_xml = simplexml_load_file($manifest)) { $form->setField($editor_xml, 'config'); } } } // Allow for additional modification of the form, and events to be triggered. // We pass the data because plugins may require it. parent::preprocessForm($form, $data); // Load the data into the form after the plugins have operated. $form->bind($data); } public function getForm($data = array(), $loadData = true) { if ($this instanceof DispatcherAwareInterface) { $this->setDispatcher(Factory::getApplication()->getDispatcher()); } FormHelper::addFieldPath('JPATH_ADMINISTRATOR/components/com_jce/models/fields'); // Get the setup form. return $this->loadForm('com_jce.profile', 'profile', array('control' => 'jform', 'load_data' => true)); } /** * Method to get the data that should be injected in the form. * * @return mixed The data for the form * * @since 1.6 */ protected function loadFormData() { $data = $this->getItem(); // convert 0 value to null to force defaults if (empty($data->area)) { $data->area = null; } // convert to array if set if (!empty($data->device)) { $data->device = explode(',', $data->device); } if (!empty($data->components)) { $data->components = explode(',', $data->components); $data->components_select = 1; } if (!empty($data->types)) { $data->types = explode(',', $data->types); } $data->config = $data->params; $this->preprocessData('com_jce.profiles', $data); return $data; } public function getRows() { $data = $this->getItem(); $array = array(); $rows = empty($data->rows) ? array() : explode(';', $data->rows); $plugins = $this->getButtons(); $i = 1; foreach ($rows as $row) { $groups = array(); // remove spacers $row = str_replace(array('|', 'spacer'), '', $row); foreach (explode('spacer', $row) as $group) { // get items in group $items = explode(',', $group); $buttons = array(); // remove duplicates $items = array_unique($items); foreach ($items as $x => $item) { if ($item === 'spacer') { unset($items[$x]); continue; } // not in the list... if (empty($item) || array_key_exists($item, $plugins) === false) { continue; } // must be assigned... if (!$plugins[$item]->active) { continue; } // assign icon $buttons[] = $plugins[$item]; } $groups[] = $buttons; } $array[$i] = $groups; ++$i; } // allow for empty toolbar row when creating a new profile if (empty($array)) { $array[$i] = array(); } return $array; } /** * An array of buttons not in the current editor layout. * * @return array */ public function getAvailableButtons() { $plugins = $this->getButtons(); $available = array_filter($plugins, function ($plugin) { return !$plugin->active; }); return $available; } public function getAdditionalPlugins() { $plugins = $this->getButtons(); $additional = array_filter($plugins, function ($plugin) { return $plugin->editable && !$plugin->row; }); return $additional; } public function getButtons() { $commands = $this->getCommands(); $plugins = $this->getPlugins(); return array_merge($commands, $plugins); } public function getCommands() { static $commands; if (empty($commands)) { $data = $this->getItem(); $rows = empty($data->rows) ? array() : preg_split('#[;,]#', $data->rows); $commands = array(); foreach (JcePluginsHelper::getCommands() as $name => $command) { // set as active $command->active = in_array($name, $rows); $command->icon = explode(',', $command->icon); // set default empty value $command->image = ''; // ui class, default is blank if (empty($command->class)) { $command->class = ''; } // cast row to integer $command->row = (int) $command->row; // cast editable to integer $command->editable = (int) $command->editable; // translate title $command->title = Text::_($command->title); // translate description $command->description = Text::_($command->description); $command->name = $name; $commands[$name] = $command; } } // merge plugins and commands return $commands; } public function getPlugins() { static $plugins; if (empty($plugins)) { $plugins = array(); $data = $this->loadFormData(); // array or profile plugin items $rows = empty($data->plugins) ? array() : explode(',', $data->plugins); // remove duplicates $rows = array_unique($rows); $extensions = JcePluginsHelper::getExtensions(); // only need plugins with xml files foreach (JcePluginsHelper::getPlugins() as $name => $plugin) { $plugin->icon = empty($plugin->icon) ? array() : explode(',', $plugin->icon); // set as active if it is in the profile $plugin->active = in_array($plugin->name, $rows); // ui class, default is blank if (empty($plugin->class)) { $plugin->class = ''; } $plugin->class = preg_replace_callback('#\b([a-z0-9]+)-([a-z0-9]+)\b#', function ($matches) { return 'mce' . ucfirst($matches[1]) . ucfirst($matches[2]); }, $plugin->class); // translate title $plugin->title = Text::_($plugin->title); // translate description $plugin->description = Text::_($plugin->description); // cast row to integer $plugin->row = (int) $plugin->row; // cast editable to integer $plugin->editable = (int) $plugin->editable; // plugin extensions $plugin->extensions = array(); if (is_file($plugin->manifest)) { $plugin->form = $this->loadForm('com_jce.profile.' . $plugin->name, $plugin->manifest, array('control' => 'jform[config]', 'load_data' => true), true, '//extension'); $plugin->formclass = 'options-grid-form options-grid-form-full'; $fieldsets = $plugin->form->getFieldsets(); // no parameter fields if (empty($fieldsets)) { $plugin->form = false; $plugins[$name] = $plugin; continue; } // bind data to the form $plugin->form->bind($data->params); foreach ($extensions as $type => $items) { $item = new StdClass; $item->name = ''; $item->title = ''; $item->manifest = WF_EDITOR_LIBRARIES . '/xml/config/' . $type . '.xml'; $item->context = ''; array_unshift($items, $item); foreach ($items as $p) { // check for plugin fieldset using xpath, as fieldset can be empty $fieldset = $plugin->form->getXml()->xpath('(//fieldset[@name="plugin.' . $type . '"])'); // not supported, move along... if (empty($fieldset)) { continue; } $context = (string) $fieldset[0]->attributes()->context; // check for a context, eg: images, web, video if ($context && !in_array($p->context, explode(',', $context))) { continue; } if (is_file($p->manifest)) { $path = array($plugin->name, $type, $p->name); // create new extension object $extension = new StdClass; // set extension name as the plugin name $extension->name = $p->name; // set extension title $extension->title = $p->title; // load form $extension->form = $this->loadForm('com_jce.profile.' . implode('.', $path), $p->manifest, array('control' => 'jform[config][' . $plugin->name . '][' . $type . ']', 'load_data' => true), true, '//extension'); $extension->formclass = 'options-grid-form options-grid-form-full'; // get fieldsets if any $fieldsets = $extension->form->getFieldsets(); foreach ($fieldsets as $fieldset) { // load form $plugin->extensions[$type][$p->name] = $extension; if (!isset($data->params[$plugin->name])) { continue; } if (!isset($data->params[$plugin->name][$type])) { continue; } // bind data to the form $extension->form->bind($data->params[$plugin->name][$type]); } } } } } // add to array $plugins[$name] = $plugin; } } return $plugins; } /** * Prepare and sanitise the table data prior to saving. * * @param JTable $table A reference to a JTable object * * @since 1.6 */ protected function prepareTable($table) { $filter = InputFilter::getInstance(); foreach ($table->getProperties() as $key => $value) { switch ($key) { case 'name': case 'description': $value = $filter->clean($value, 'STRING'); break; case 'device': $value = $filter->clean($value, 'STRING'); if (is_array($value)) { $value = implode(',', $value); } break; case 'area': if (is_array($value)) { // remove empty value $value = array_filter($value, 'strlen'); // for simplicity, set multiple area selections as "0" if (count($value) > 1) { $value = 0; } else { $value = $value[0]; } } $value = $value; break; case 'components': $value = $filter->clean($value, 'STRING'); if (is_array($value)) { $value = implode(',', $value); } break; case 'params': break; case 'types': case 'users': $value = $filter->clean($value, 'INT'); if (is_array($value)) { $value = implode(',', $value); } break; case 'plugins': $value = preg_replace('#[^\w_,]+#', '', $value); break; case 'rows': $value = preg_replace('#[^\w,;]+#', '', $value); break; case 'params': break; } $table->$key = $value; } if (empty($table->id)) { // Set ordering to the last item if not set if (empty($table->ordering)) { $db = $this->getDbo(); $query = $db->getQuery(true) ->select('MAX(ordering)') ->from($db->quoteName('#__wf_profiles')); $db->setQuery($query); $max = $db->loadResult(); $table->ordering = $max + 1; } } } public function validate($form, $data, $group = null) { $filter = InputFilter::getInstance(); // get unfiltered config data $config = isset($data['config']) ? $data['config'] : array(); // get layout rows and plugins data $rows = isset($data['rows']) ? $data['rows'] : ''; $plugins = isset($data['plugins']) ? $data['plugins'] : ''; // clean layout rows and plugins data $data['rows'] = $filter->clean($rows, 'STRING'); $data['plugins'] = $filter->clean($plugins, 'STRING'); // add back config data $data['params'] = json_encode($filter->clean($config, 'ARRAY')); if (empty($data['components']) || empty($data['components_select'])) { $data['components'] = ''; } if (empty($data['users'])) { $data['users'] = ''; } if (empty($data['types'])) { $data['types'] = ''; } return $data; } private static function cleanParamData($data) { // clean up link plugin parameters array_walk($data, function (&$params, $plugin) { if ($plugin === "link") { if (isset($params['dir'])) { if (!empty($params['dir']) && empty($params['direction'])) { $params['direction'] = $params['dir']; } unset($params['dir']); } } if (is_array($params) && WFUtility::is_associative_array($params)) { array_walk($params, function (&$value, $key) { if (is_string($value) && WFUtility::isJson($value)) { $value = json_decode($value, true); } }); } }); return $data; } /** * Recursively normalizes parameter structures: * - If a string looks like JSON ({...} or [...]) and decodes cleanly, decode it. * - If an array entry is a key/value pair and both are empty, drop it. * - Recurse into arrays and keep original scalar types. */ private static function normalizeParams($node) { // 1) Strings: decode JSON-in-strings when safe if (is_string($node)) { $trim = ltrim($node); if ($trim !== '' && ($trim[0] === '{' || $trim[0] === '[')) { $decoded = json_decode($node, true); if (json_last_error() === JSON_ERROR_NONE) { return self::normalizeParams($decoded); } } return $node; } // 2) Arrays: handle key/value pairs & recurse if (is_array($node)) { // Drop empty key/value pair objects if (array_key_exists('name', $node) && array_key_exists('value', $node)) { $name = trim((string) ($node['name'] ?? '')); $value = $node['value'] ?? ''; $valueIsEmpty = (is_string($value) && trim($value) === '') || $value === null || (is_array($value) && $value === []); if ($name === '' && $valueIsEmpty) { return null; // signal to remove } } $result = []; // Preserve numeric indexes for lists; associative for objects foreach ($node as $k => $v) { $normalized = self::normalizeParams($v); // Skip nulls returned from empty key/value pairs if ($normalized === null) { continue; } $result[$k] = $normalized; } return $result; } // 3) Other scalars / objects: return as-is return $node; } /** * Method to save the form data. * * @param array The form data * * @return bool True on success * * @since 2.7 */ public function save($data) { $app = Factory::getApplication(); // get profile table $table = $this->getTable(); // Alter the title for save as copy if ($app->input->get('task') == 'save2copy') { // Alter the title $name = $data['name']; while ($table->load(array('name' => $name))) { if ($name == $table->name) { $name = StringHelper::increment($name); } } $data['name'] = $name; $data['published'] = 0; } $key = $table->getKeyName(); $pk = (!empty($data[$key])) ? $data[$key] : (int) $this->getState($this->getName() . '.id'); if ($pk && $table->load($pk)) { if (empty($data['rows'])) { $data['rows'] = $table->rows; } if (empty($data['plugins'])) { $data['plugins'] = $table->plugins; } $json = array(); $params = empty($table->params) ? '' : $table->params; // convert params to json data array $params = (array) json_decode($params, true); $plugins = isset($data['plugins']) ? $data['plugins'] : $table->plugins; // get plugins $items = explode(',', $plugins); // add "editor" for editor parameters $items[] = 'editor'; // add "setup" for setup parameters (via plugins, eg: jcepro) $items[] = 'setup'; if (is_string($data['params'])) { $data['params'] = json_decode($data['params'], true); } // make sure we have a value if (empty($data['params'])) { $data['params'] = array(); } $data['params'] = self::cleanParamData($data['params']); // data for editor and plugins foreach ($items as $item) { // add config data if (array_key_exists($item, $data['params'])) { $value = $data['params'][$item]; // normalize the value $value = self::normalizeParams($value); // Add to json array for merging $json[$item] = $value; } } // merge and encode as json string $data['params'] = json_encode(WFUtility::array_merge_recursive_distinct($params, $json)); } // set a default value for validation if (empty($data['params'])) { $data['params'] = '{}'; } if (parent::save($data)) { return true; } return false; } public function copy($ids) { // Check for request forgeries Session::checkToken() or jexit(Text::_('JINVALID_TOKEN')); $table = $this->getTable(); foreach ($ids as $id) { if (!$table->load($id)) { $this->setError($table->getError()); } else { $name = Text::sprintf('WF_PROFILES_COPY_OF', $table->name); $table->name = $name; $table->id = 0; $table->published = 0; } // Check the row. if (!$table->check()) { $this->setError($table->getError()); return false; } // Store the row. if (!$table->store()) { $this->setError($table->getError()); return false; } } return true; } public function export($ids) { $db = Factory::getDBO(); $buffer = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>'; $buffer .= "\n" . '<export type="profiles">'; $buffer .= "\n\t" . '<profiles>'; $validFields = array('name', 'description', 'users', 'types', 'components', 'area', 'device', 'rows', 'plugins', 'published', 'ordering', 'params'); foreach ($ids as $id) { $table = $this->getTable(); if (!$table->load($id)) { continue; } $buffer .= "\n\t\t"; $buffer .= '<profile>'; $fields = $table->getProperties(); foreach ($fields as $key => $value) { // only allow a subset of fields if (false == in_array($key, $validFields)) { continue; } // set published to 0 if ($key === "published") { $value = 0; } if ($key == 'params') { $buffer .= "\n\t\t\t" . '<' . $key . '><![CDATA[' . trim($value) . ']]></' . $key . '>'; } else { $buffer .= "\n\t\t\t" . '<' . $key . '>' . JceProfilesHelper::encodeData($value) . '</' . $key . '>'; } } $buffer .= "\n\t\t</profile>"; } $buffer .= "\n\t</profiles>"; $buffer .= "\n</export>"; // set_time_limit doesn't work in safe mode if (!ini_get('safe_mode')) { @set_time_limit(0); } $name = 'jce_editor_profile_' . date('Y_m_d') . '.xml'; $app = Factory::getApplication(); $app->allowCache(false); $app->setHeader('Content-Transfer-Encoding', 'binary'); $app->setHeader('Content-Type', 'text/xml'); $app->setHeader('Content-Disposition', 'attachment;filename="' . $name . '";'); // set output content $app->setBody($buffer); // stream to client echo $app->toString(); jexit(); } /** * Process XML restore file. * * @param object $xml * * @return bool */ public function import() { // Check for request forgeries Session::checkToken() or jexit(Text::_('JINVALID_TOKEN')); jimport('joomla.filesystem.file'); $app = Factory::getApplication(); $tmp = $app->getCfg('tmp_path'); jimport('joomla.filesystem.file'); $file = $app->input->files->get('profile_file', null, 'raw'); // check for valid uploaded file if (empty($file) || !is_uploaded_file($file['tmp_name'])) { $app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_NOFILE'), 'error'); return false; } if ($file['error'] || $file['size'] < 1) { $app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_NOFILE'), 'error'); return false; } // sanitize the file name $name = File::makeSafe($file['name']); if (empty($name)) { $app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_ERROR'), 'error'); return false; } // Build the appropriate paths. $config = Factory::getConfig(); $destination = $config->get('tmp_path') . '/' . $name; $source = $file['tmp_name']; // Move uploaded file. File::upload($source, $destination, false, true); if (!is_file($destination)) { $app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_FAILED'), 'error'); return false; } $result = JceProfilesHelper::processImport($destination); if ($result === false) { $app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_ERROR'), 'error'); return false; } $app->enqueueMessage(Text::sprintf('WF_PROFILES_IMPORT_SUCCESS', $result)); return true; } } home/wuectly/www/plugins/system/t3/includes/depend/tpls/profile.php 0000604 00000010713 15245703275 0021557 0 ustar 00 <?php /** *------------------------------------------------------------------------------ * @package T3 Framework for Joomla! *------------------------------------------------------------------------------ * @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @authors JoomlArt, JoomlaBamboo, (contribute to this project at github * & Google group to become co-author) * @Google group: https://groups.google.com/forum/#!forum/t3fw * @Link: http://t3-framework.org *------------------------------------------------------------------------------ */ // no direct access defined ( '_JEXEC' ) or die ( 'Restricted access' ); $javersion = new JVersion; ?> <script type="text/javascript"> !function($){ var JAFileConfig = window.JAFileConfig || {}; JAFileConfig.profiles = <?php echo json_encode($jsonData)?>; JAFileConfig.mod_url = '<?php echo JURI::base(true) ?>/modules/<?php echo $module; ?>/helper.php'; JAFileConfig.template = '<?php echo $template ?>'; JAFileConfig.langs = <?php json_encode(array( 'confirmCancel' => JText::_('ARE_YOUR_SURE_TO_CANCEL'), 'enterName' => JText::_('ENTER_PROFILE_NAME'), 'correctName' => JText::_('PROFILE_NAME_NOT_EMPTY'), 'confirmDelete' => JText::_('CONFIRM_DELETE_PROFILE') )); ?>; $(window).on('load', function(){ JAFileConfig.initialize('jformparams<?php echo str_replace('holder', '', $this->fieldname);?>'); JAFileConfig.changeProfile($('jformparams<?php echo str_replace('holder', '', $this->fieldname);?>').val()); }); }(jQuery); </script> <div class="t3-profile"> <label class="hasTip" for="jform_params_<?php echo $this->field_name?>" id="jform_params_<?php echo $this->field_name?>-lbl" title="<?php echo JText::_($this->element['description'])?>"><?php echo JText::_($this->element["label"])?></label> <?php echo $profileHTML; ?> <div class="profile_action"> <span class="clone"> <a href="javascript:void(0)" onclick="JAFileConfig.cloneProfile()" title="<?php echo JText::_('CLONE_DESC')?>"><?php echo JText::_('Clone')?></a> </span> | <span class="delete"> <a href="javascript:void(0)" onclick="JAFileConfig.deleteProfile()" title="<?php echo JText::_('DELETE_DESC')?>"><?php echo JText::_('Delete')?></a> </span> </div> </div> <?php if($javersion->isCompatible('3.0')) : ?> </div> </div> <?php else : ?> </li> <?php endif; ?> <?php $fieldSets = $t3form->getFieldsets('params'); foreach ($fieldSets as $name => $fieldSet) : if (isset($fieldSet->description) && trim($fieldSet->description)){ echo '<p class="tip">'.JText::_($fieldSet->description).'</p>'; } $hidden_fields = ''; foreach ($t3form->getFieldset($name) as $field) : if (!$field->hidden) : if($javersion->isCompatible('3.0')) : ?> <div class="control-group t3-control-group"> <div class="control-label t3-control-label"> <?php else: ?> <li> <?php endif; echo $t3form->getLabel($field->fieldname,$field->group); if($javersion->isCompatible('3.0')) : ?> </div> <div class="controls t3-controls"> <?php endif; echo $t3form->getInput($field->fieldname,$field->group); if($javersion->isCompatible('3.0')) : ?> </div> </div> <?php else: ?> </li> <?php endif; else : $hidden_fields .= $t3form->getInput($field->fieldname,$field->group); endif; endforeach; echo $hidden_fields; endforeach; ?> <?php if($javersion->isCompatible('3.0')) : ?> <div class="control-group t3-control-group hide"> <div class="control-label t3-control-label"></div> <div class="controls t3-controls"> <?php else: ?> <li> <?php endif; ?> <script type="text/javascript"> // <![CDATA[ window.addEvent('load', function(){ Joomla.submitbutton = function(task){ if (task == 'module.cancel' || document.formvalidator.isValid(document.getElementById('module-form'))) { if(task != 'module.cancel' && document.formvalidator.isValid(document.getElementById('module-form'))){ JAFileConfig.saveProfile(task); }else if(task == 'module.cancel' || document.formvalidator.isValid(document.getElementById('module-form'))){ Joomla.submitform(task, document.getElementById('module-form')); } if (self != top) { window.top.setTimeout('window.parent.SqueezeBox.close()', 1000); } } else { alert('Invalid form'); } } }); // ]]> </script>
| ver. 1.4 |
Github
|
.
| PHP 8.1.34 | Генерация страницы: 0 |
proxy
|
phpinfo
|
Настройка