private function upgrade_1_3() { $types = $this->listTypes(); $formatters = $this->listAll(); $aboutDriver = ExtensionManager::about('templatedtextformatters'); foreach (array_keys($types) as $type) { $types[$type]['code'] = file_get_contents($types[$type]['path'] . '/formatter.' . $type . '.tpl'); if (preg_match('/public\\s*function\\s*ttf_tokens\\s*\\([^\\)]*\\)\\s*(\\{(?:[^\\{\\}]+|(?1))*\\})/', $types[$type]['code'], $m)) { $types[$type]['ttf_tokens_code'] = $m[0]; } } foreach ($formatters as $id => $dummy) { $file = TEXTFORMATTERS . "/formatter.{$id}.php"; $data = file_get_contents($file); if (!preg_match('/public\\s*function\\s*ttf_tokens\\s*\\([^\\)]*\\)\\s*(\\{(?:[^\\{\\}]+|(?1))*\\})/', $data, $m)) { continue; } $code = $m[0]; if (!preg_match('/\'templatedtextformatters-type\'\\s*=>\\s*\'([^\']+)\'/', $data, $m)) { continue; } $type = $m[1]; if (!$types[$type] || !$types[$type]['ttf_tokens_code']) { continue; } $data = str_replace($code, $types[$type]['ttf_tokens_code'], $data); if (!General::writeFile($file, $data, Symphony::Configuration()->get('write_mode', 'file'))) { continue; } include_once $file; $classname = "formatter{$id}"; $old = new $classname(); $about = $old->about(); $tokens = array('___' . $type . '/* CLASS NAME */' => $id, '/* NAME */' => preg_replace('/[^\\w\\s\\.-_\\&\\;]/i', '', trim($about['name'])), '/* AUTHOR NAME */' => $about['author']['name'], '/* AUTHOR WEBSITE */' => $about['author']['website'], '/* AUTHOR EMAIL */' => $about['author']['email'], '/* RELEASE DATE */' => DateTimeObj::getGMT('c'), '/* TEMPLATEDTEXTFORMATTERS VERSION */' => $aboutDriver['version'], '/* TEMPLATEDTEXTFORMATTERS TYPE */' => $type); if (method_exists($old, 'ttf_tokens')) { $tokens = array_merge($tokens, $old->ttf_tokens(false)); } $code = str_replace(array_keys($tokens), $tokens, $types[$type]['code']); $code = str_replace('/* CLASS NAME */', $classname, $code); General::writeFile($file, $code, Symphony::Configuration()->get('write_mode', 'file')); } }
public function formatElementItem($activity, $fallback = FALSE) { switch ($activity['item_type']) { // Pages and Page Templates case 'pages': // Is is a Page Template? $is_template = !is_numeric($activity['item_id']); // Fetch the page from the DB $page = Symphony::Database()->fetch(' SELECT `title` FROM `tbl_pages` WHERE `' . ($is_template ? 'handle' : 'id') . '` = "' . $activity['item_id'] . '"'); // If the page no longer exists, use the fallback description if (empty($page)) { $item = $activity['fallback_description']; } elseif ($is_template) { $item = __(' the %1s page %2s', array($page[0]['title'], $fallback ? __('template') : Widget::Anchor(__('template'), URL . '/symphony/blueprints/pages/template/' . $activity['item_id'])->generate())); // Or if it was the page config, build that description } else { $item = __(' the %1s page', array($fallback ? $page[0]['title'] : Widget::Anchor($page[0]['title'], URL . '/symphony/blueprints/pages/edit/' . $activity['item_id'])->generate())); } break; case "events": // Grab the event info $handle = EventManager::__getHandleFromFilename($activity['item_id']); $about = EventManager::about($handle); // If the event no longer exists, use the fallback description if (empty($about)) { $item = $activity['fallback_description']; } else { $item = __(' the %1s event', array($fallback ? $about['name'] : Widget::Anchor($about['name'], URL . '/symphony/blueprints/events/edit/' . $handle)->generate())); } break; case "datasources": // Grab the DS info $handle = DatasourceManager::__getHandleFromFilename($activity['item_id']); $about = DatasourceManager::about($handle); // If the DS no longer exists, use the fallback description if (empty($about)) { $item = $activity['fallback_description']; } else { $item = __(' the %1s data source', array($fallback ? $about['name'] : Widget::Anchor($about['name'], URL . '/symphony/blueprints/datasources/edit/' . $handle)->generate())); } break; case "utilities": // If the utility no longer exists, use the fallback description if (!file_exists(UTILITIES . '/' . $activity['item_id'])) { $item = $activity['fallback_description']; } else { $item = __(' the %1s utility', array($fallback ? $activity['item_id'] : Widget::Anchor($activity['item_id'], URL . '/symphony/blueprints/utilities/edit/' . str_replace('.xsl', '', $activity['item_id']))->generate())); } break; case "sections": // Grab the section info $section = SectionManager::fetch($activity['item_id']); // If the section no longer exists, use the fallback description if (!$section instanceof Section) { $item = $activity['fallback_description']; } else { $item = __(' the %1s section', array($fallback ? $section->get('name') : Widget::Anchor($section->get('name'), URL . '/symphony/blueprints/sections/edit/' . $activity['item_id'])->generate())); } break; case "authors": // Grab the author info $author = AuthorManager::fetchByID($activity['item_id']); // If the author no longer exists, use the fallback description if (!$author instanceof Author) { $item = $activity['fallback_description']; } else { // If the author edited their own record if ($activity['user_id'] == $activity['item_id']) { $item = __(' his/her %1s', array($fallback ? __('author record') : Widget::Anchor(__('author record'), URL . '/symphony/system/authors/edit/' . $activity['item_id'])->generate())); } else { $item = __(' the author record for %1s', array($fallback ? $author->getFullName() : Widget::Anchor($author->getFullName(), URL . '/symphony/system/authors/edit/' . $activity['item_id'])->generate())); } } break; case "preferences": $item = __(' the %s', array(Widget::Anchor(__('system preferences'), URL . '/symphony/system/preferences')->generate())); break; case "maintenance-mode": $item = __(' maintenance mode'); break; case "extensions": try { $about = ExtensionManager::about($activity['item_id']); } catch (Exception $e) { $about = NULL; } if (empty($about)) { $item = $activity['fallback_description']; } else { $item = __('the %1s extension', array($about['name'])); } break; case "login": $item = __(' to the back end'); break; case "password-reset": $item = __(' his/her password'); break; default: $item = NULL; break; } return $item; }
/** * * Delegate fired when the extension is updated (when version changes) * @param string $previousVersion */ public function update($previousVersion = false) { $about = ExtensionManager::about('anti_brute_force'); return ABF::instance()->update($previousVersion, $about['version']); }
private function __construct() { $s = Symphony::Configuration()->get(); $this->_settings = $s[ABF::SETTING_GROUP]; unset($s); // now an array $validStatuses = EXTENSION_ENABLED; $about = ExtensionManager::about('anti_brute_force'); $status = ExtensionManager::fetchStatus($about); $this->_isInstalled = in_array($validStatuses, $status); // only if already installed if ($this->_isInstalled) { // assure access to settings // fail is not settings, since this is a security software if (count($this->_settings) < 1) { throw new Exception('Can not load settings. Can not continue.'); } } }
public function save() { $about = array(); if ($this->_context[0] && !is_object($this->formatter)) { $this->formatter = TextformatterManager::create($this->_context[0]); } if (is_object($this->formatter)) { $about = TextformatterManager::about($this->_context[0]); } $fields = $_POST['fields']; $driverAbout = ExtensionManager::about('templatedtextformatters'); $types = $this->_driver->listTypes(); if (strlen(trim($fields['name'])) < 1) { $this->_errors['name'] = __('You have to specify name for text formatter'); return; } if ($about['templatedtextformatters-type'] && $about['templatedtextformatters-type'] != $fields['type']) { $this->_errors['type'] = __('Changing type of already existing formatter is not allowed'); return; } if (!$fields['type'] || !is_array($types[$fields['type']]) || !isset($types[$fields['type']]['path'])) { $this->_errors['type'] = __('There is no <code>%s</code> type available', array($fields['type'])); return; } $tplfile = $types[$fields['type']]['path'] . '/formatter.' . $fields['type'] . '.tpl'; if (!@is_file($tplfile)) { $this->_errors['type'] = __('Wrong type of text formatter'); return; } $classname = 'ttf_' . Lang::createHandle(trim($fields['name']), NULL, '_', false, true, array('@^[^a-z]+@i' => '', '/[^\\w-\\.]/i' => '')); $file = TEXTFORMATTERS . '/formatter.' . $classname . '.php'; $isDuplicate = false; $queueForDeletion = NULL; if (!$about['handle'] && @is_file($file)) { $isDuplicate = true; } else { if ($about['handle']) { if ($classname != $about['handle'] && @is_file($file)) { $isDuplicate = true; } elseif ($classname != $about['handle']) { $queueForDeletion = TEXTFORMATTERS . '/formatter.' . $about['handle'] . '.php'; } } } // Duplicate if ($isDuplicate) { $this->_errors['name'] = __('Text formatter with the name <code>%s</code> already exists', array($classname)); } if (!empty($this->_errors)) { return; } $description = trim($fields['description']); if (empty($description)) { $description = __('N/A'); } // https://github.com/symphonycms/symphony-2/wiki/Migration-Guide-to-2.5-for-Developers#properties if (is_callable(array('Symphony', 'Author'))) { $author = Symphony::Author(); } else { $author = Administration::instance()->Author; } $tokens = array('___' . $fields['type'] . '/* CLASS NAME */' => $classname, '/* NAME */' => preg_replace('/[^\\w\\s\\.-_\\&\\;]/i', '', trim($fields['name'])), '/* AUTHOR NAME */' => self::cleanupString($author->getFullName()), '/* AUTHOR WEBSITE */' => self::cleanupString(URL), '/* AUTHOR EMAIL */' => self::cleanupString($author->get('email')), '/* RELEASE DATE */' => DateTimeObj::getGMT('c'), '/* DESCRIPTION */' => self::cleanupString($description), '/* TEMPLATEDTEXTFORMATTERS VERSION */' => $driverAbout['version'], '/* TEMPLATEDTEXTFORMATTERS TYPE */' => $fields['type']); if (!is_object($this->formatter)) { include_once $tplfile; $temp = 'formatter___' . $fields['type']; $temp = new $temp(); if (method_exists($temp, 'ttf_tokens')) { $tokens = array_merge($tokens, $temp->ttf_tokens()); } } else { if (method_exists($this->formatter, 'ttf_tokens')) { $tokens = array_merge($tokens, $this->formatter->ttf_tokens()); } } $ttfShell = file_get_contents($tplfile); $ttfShell = str_replace(array_keys($tokens), $tokens, $ttfShell); $ttfShell = str_replace('/* CLASS NAME */', $classname, $ttfShell); // Write the file if (!is_writable(dirname($file)) || !($write = General::writeFile($file, $ttfShell, Symphony::Configuration()->get('write_mode', 'file')))) { $this->pageAlert(__('Failed to write Text Formatter source to <code>%s</code>. Please check permissions.', array($file)), Alert::ERROR); } else { if ($queueForDeletion || !$about['name']) { if ($queueForDeletion) { General::deleteFile($queueForDeletion); } // TODO: Find a way to make formatted fields update their content $_SESSION['templatedtextformatters-alert'] = 'created'; redirect(URL . '/symphony/extension/templatedtextformatters/edit/' . $classname); } else { // Update current data $_SESSION['templatedtextformatters-alert'] = 'saved'; $_POST['fields']['name'] = $tokens['/* NAME */']; $_POST['fields']['description'] = $tokens['/* DESCRIPTION */']; } } }