Index: branches/5.2.x/core/units/helpers/fck_helper.php =================================================================== --- branches/5.2.x/core/units/helpers/fck_helper.php (revision 16474) +++ branches/5.2.x/core/units/helpers/fck_helper.php (revision 16475) @@ -1,635 +1,641 @@ folder = $this->Application->GetVar('folder'); $this->sortField = $this->Application->GetVar('sort_by'); $this->sortDirection = $this->Application->GetVar('order_by'); $this->Config['AllowedExtensions']['Files'] = Array('gif','jpeg','png','swf','fla','jpg','gif','jpeg','png','avi','mpg','mpeg','zip','rar','arj','gz','tar','doc','pdf','ppt','rdp','swf','swt','txt','vsd','xls','csv','odt'); $this->Config['DeniedExtensions']['Files'] = Array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg'); $this->Config['AllowedExtensions']['Images'] = Array('jpg','gif','jpeg','png', 'bmp'); $this->Config['DeniedExtensions']['Images'] = Array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg'); $this->Config['AllowedExtensions']['Flash'] = Array('swf','fla'); $this->Config['DeniedExtensions']['Flash'] = Array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg'); $this->Config['AllowedExtensions']['Media'] = Array('asf','asx','avi','wav','wax','wma','wm','wmv','m3u','mp2v','mpg','mpeg','m1v','mp2','mp3','mpa','mpe','mpv2','mp4','mid','midi','rmi','qt','aif','aifc','aiff','mov','flv','rm','svcd','swf','vcd'); $this->Config['DeniedExtensions']['Media'] = Array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg'); $this->Config['AllowedExtensions']['Documents'] = Array('doc','pdf','ppt','rdp','swf','swt','txt','vsd','xls','csv','zip','odt'); $this->Config['DeniedExtensions']['Documents'] = Array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg'); $this->Config['ExtensionIcons'] = Array('ai','avi','bmp','cs','dll','doc','exe','fla','gif','htm','html','jpg','js','mdb','mp3','pdf','png','ppt','rdp','swf','swt','txt','vsd','xls','xml','zip'); } function CreateFolder($folder = '') { if ( !$folder ) { return false; } $folderPath = WRITEABLE . '/user_files/' . $folder; if ( file_exists($folderPath) && is_dir($folderPath) ) { return true; } /*$permissions = defined('FCK_FOLDERS_PERMISSIONS') ? FCK_FOLDERS_PERMISSIONS : '0777'; return mkdir($folderPath, $permissions);*/ return mkdir($folderPath); } function IsAllowedExtension($folder, $file_name) { $ext = strtolower( pathinfo($file_name, PATHINFO_EXTENSION) ); if ( isset($this->Config['DeniedExtensions'][$folder]) ) { if ( in_array($ext, $this->Config['DeniedExtensions'][$folder]) ) { return false; } } if ( isset($this->Config['AllowedExtensions'][$folder]) ) { if ( !in_array($ext, $this->Config['AllowedExtensions'][$folder]) ) { return false; } } return true; } /** * Returns list of sub-folders from given folder (automatically excludes system folders) * * @param string $files_dir * @return Array * @access public */ public function ReadFolders($files_dir) { $ret = Array (); $system_folders = defined('KERNEL_SYSTEM_FOLDERS') ? KERNEL_SYSTEM_FOLDERS : Array ('icons', 'CVS', '.svn'); try { $iterator = new DirectoryIterator($files_dir); /* @var $file_info DirectoryIterator */ } catch (UnexpectedValueException $e) { return $ret; } foreach ($iterator as $file_info) { $filename = $file_info->getFilename(); if ( $file_info->isDir() && !$file_info->isDot() ) { $ret[] = $filename; } } return array_diff($ret, $system_folders); } /** * Returns list of files in given folder * * @param string $files_dir * @return Array * @access public */ public function ReadFiles($files_dir) { $ret = Array (); try { $iterator = new DirectoryIterator($files_dir); /* @var $file_info DirectoryIterator */ } catch (UnexpectedValueException $e) { return $ret; } foreach ($iterator as $file_info) { if ( !$file_info->isDir() ) { $ret[] = $file_info->getFilename(); } } return $ret; } /** * Returns xml containing list of folders in current folder * * @return string * @access public */ public function PrintFolders() { $files_dir = WRITEABLE . '/user_files/' . $this->folder . '/'; $sub_folders = $this->ReadFolders($files_dir); natcasesort($sub_folders); $ret = $this->_buildFoldersXML($sub_folders, 'folder2'); if ( $this->sortField == 'name' && $this->sortDirection == '_desc' ) { $sub_folders = array_reverse($sub_folders); } $ret .= $this->_buildFoldersXML($sub_folders, 'folder'); return $ret; } /** * Build XML, that will output folders for FCKEditor * * @param Array $sub_folders * @param string $xml_node * @return string */ protected function _buildFoldersXML($sub_folders, $xml_node) { $ret = ''; foreach ($sub_folders as $sub_folder) { $ret .= '<' . $xml_node . ' path="' . $this->folder . "/" . $sub_folder . '">' . $sub_folder . '' . "\n"; } return $ret; } /** * Transforms filesize in bytes into kilobytes * * @param int $size * @return int * @access protected */ protected function CalculateFileSize($size) { if ( $size > 0 ) { $size = round($size / 1024); $size = ($size < 1) ? 1 : $size; } return $size; } /** * Detects icon for given file extension * * @param string $file * @return string * @access protected */ protected function CheckIconType($file) { $ext = strtolower( pathinfo($file, PATHINFO_EXTENSION) ); return $ext && in_array($ext, $this->Config['ExtensionIcons']) ? $ext : 'default.icon'; } /** * Build one file xml node * * @param int $size * @param string $url * @param string $icon * @param string $date * @param string $file_name * @return string */ protected function _buildFileXml($size,$url,$icon,$date,$file_name) { return '' . $file_name . '' . "\n"; } /** * Returns xml containing list of files in current folder * * @return string * @access public */ public function PrintFiles() { $files_dir = WRITEABLE . '/user_files/' . $this->folder . '/'; $files_url = BASE_PATH . str_replace(DIRECTORY_SEPARATOR, '/', WRITEBALE_BASE) . '/user_files/' . $this->folder . '/'; $aFiles = $this->ReadFiles($files_dir); $ret = ''; $date_format = "m/d/Y h:i A"; natcasesort($aFiles); if ( $this->sortField == 'name' && $this->sortDirection == '_desc' ) { $aFiles = array_reverse($aFiles, TRUE); } $aFilesSize = $aFilesDate = Array (); foreach ($aFiles as $k => $v) { $aFilesSize[$k] = filesize($files_dir . $v); $aFilesDate[$k] = filectime($files_dir . $v); } if ( $this->sortField == 'name' ) { foreach ($aFiles as $k => $file) { $size = $this->CalculateFileSize($aFilesSize[$k]); $date = date($date_format, $aFilesDate[$k]); $icon = $this->CheckIconType($file); $ret .= $this->_buildFileXml($size, $files_url . $file, $icon, $date, $file); } } if ( $this->sortField == 'date' ) { asort($aFilesDate); if ( $this->sortDirection == '_desc' ) { $aFilesDate = array_reverse($aFilesDate, TRUE); } foreach ($aFilesDate as $k => $date) { $size = $this->CalculateFileSize($aFilesSize[$k]); $file = $aFiles[$k]; $date = date($date_format, $date); $icon = $this->CheckIconType($file); $ret .= $this->_buildFileXml($size, $files_url . $file, $icon, $date, $file); } } if ( $this->sortField == 'size' ) { asort($aFilesSize); if ( $this->sortDirection == '_desc' ) { $aFilesSize = array_reverse($aFilesSize, TRUE); } foreach ($aFilesSize as $k => $size) { $size = $this->CalculateFileSize($size); $file = $aFiles[$k]; $date = date($date_format, $aFilesDate[$k]); $icon = $this->CheckIconType($file); $ret .= $this->_buildFileXml($size, $files_url . $file, $icon, $date, $file); } } return $ret; } function UploadFile() { $upload_dir = $this->Application->GetVar('upload_dir'); $type = explode('/', $upload_dir); $type = $type[0]; $sServerDir = WRITEABLE . '/user_files/' . $upload_dir . '/'; $aUpFile = $_FILES['NewFile']; $sFileName = $aUpFile['name']; $sOriginalFileName = $aUpFile['name']; $sExtension = strtolower(substr( $sFileName, ( strrpos($sFileName, '.') + 1 ) ) ); $sErrorNumber = 0; if ( isset( $_FILES['NewFile'] ) && !is_null( $_FILES['NewFile']['tmp_name'] ) ) { if (in_array($sExtension, $this->Config['AllowedExtensions'][$type])) { if (!$aUpFile['error']) { $iCounter = 0 ; while ( true ) { $sFilePath = $sServerDir . $sFileName; if ( is_file( $sFilePath ) ) { $iCounter++ ; $sFileName = $this->RemoveExtension( $sOriginalFileName ) . '(' . $iCounter . ').' . $sExtension; $sErrorNumber = '201'; } else { // Turn off all error reporting. error_reporting( 0 ) ; // Enable error tracking to catch the error. ini_set( 'track_errors', '1' ); move_uploaded_file( $aUpFile['tmp_name'], $sFilePath ); $sErrorMsg = $php_errormsg; // Restore the configurations. ini_restore( 'track_errors' ); ini_restore( 'error_reporting' ); if ( is_file( $sFilePath ) ) { $oldumask = umask(0); chmod( $sFilePath, 0666 ); umask( $oldumask ); } break ; } } } } else { $sErrorNumber = '203'; } } else { $sErrorNumber = '202' ; } echo '' ; } function RemoveExtension( $fileName ) { return substr( $fileName, 0, strrpos( $fileName, '.' ) ) ; } public function CKEditorTag($editor_name, $editor_value, $params) { $editor = $this->prepareConfig($this->getEditor(), $params); $width = $this->normalizeDimension($params['width']); $height = $this->normalizeDimension($params['height']); $editor->textareaAttributes = Array ( 'style' => 'width: ' . $width . '; height: ' . $height . ';' ); $editor->config['height'] = $height; // editor area height $events = Array ( 'configLoaded' => 'function(ev) { CKEDITOR.addCss(ev.editor.config.extraCss); }', ); return $editor->editor($editor_name, $editor_value, Array (), $events); } public function CKEditorInlineTag($editor_name, $params) { $editor = $this->prepareConfig($this->getEditor(), $params); $events = Array ( 'configLoaded' => 'function(ev) { CKEDITOR.addCss(ev.editor.config.extraCss); }', 'focus' => 'function(ev) { $("body").trigger("InlineEditor.Focus", [ev]); }', 'blur' => 'function(ev) { $("body").trigger("InlineEditor.Blur", [ev]); }', ); return $editor->inline($editor_name, array('removePlugins' => 'codemirror'), $events); } /** * Adds measurement units to editor dimensions. * * @param string $dimension Dimension. * * @return string */ protected function normalizeDimension($dimension) { if ( preg_match('/^[\d]+$/', $dimension) ) { $dimension .= 'px'; } return $dimension; } /** * Returns editor instance. * * @return CKEditor */ protected function getEditor() { include_once(FULL_PATH . EDITOR_PATH . 'ckeditor.php'); $editor = new CKeditor(BASE_PATH . EDITOR_PATH); $editor->returnOutput = true; return $editor; } /** * Prepares editor config. * * @param CKEditor $editor Editor. * @param array $tag_params Tag params. * * @return CKEditor */ protected function prepareConfig(CKEditor $editor, array $tag_params) { $editor->lateLoad = array_key_exists('late_load', $tag_params) && $tag_params['late_load']; list($styles_css, $styles_js) = $this->getStyles(); if ( isset($tag_params['toolbar']) ) { $toolbar = $tag_params['toolbar']; } elseif ( isset($tag_params['mode']) && $tag_params['mode'] == 'inline' ) { $toolbar = 'Inline'; } else { $toolbar = $this->Application->isDebugMode() ? 'DebugMode' : 'Default'; } $editor->config = Array ( 'toolbar' => $toolbar, 'baseHref' => $this->Application->BaseURL( rtrim(EDITOR_PATH, '/') ), 'customConfig' => $this->getJavaScriptConfig(), 'stylesSet' => 'portal:' . $styles_js, 'contentsCss' => $styles_css, 'Admin' => 1, // for custom file browser to work 'K4' => 1, // for custom file browser to work 'language' => $this->getLanguage(), ); $this->injectTransitParams($editor, $this->getTransitParams($tag_params)); return $editor; } /** * Transforms transit params into editor config. * * @param CKEditor $editor Editor. * @param array $transit_params Transit params. * * @return void */ protected function injectTransitParams(CKEditor $editor, array $transit_params) { if ( isset($transit_params['bgcolor']) && $transit_params['bgcolor'] ) { $editor->config['extraCss'] = 'body { background-color: ' . $transit_params['bgcolor'] . '; }'; } foreach ($transit_params as $param_name => $param_value) { if ( !$param_value ) { continue; } $param_key = str_replace(' ', '', ucwords(str_replace('_', ' ', $param_name))); $param_key[0] = strtolower($param_key[0]); $editor->config[$param_key] = $param_value; } if ( isset($editor->config['styleSetName']) ) { $style_set_parts = explode(':', $editor->config['stylesSet']); $style_set_parts[0] = $editor->config['styleSetName']; $editor->config['stylesSet'] = implode(':', $style_set_parts); unset($editor->config['styleSetName']); } } /** * Returns url to CSS and JS style configuration. * * @return array */ protected function getStyles() { /** @var ThemeItem $theme */ $theme = $this->Application->recallObject('theme.current'); $stylesheet_file = $theme->getStylesheetFile(true); if ( $stylesheet_file ) { $stylesheet_folder_url = dirname($stylesheet_file) . '/'; $url_params = Array ('events[fck]' => 'OnGetsEditorStyles', 'no_pass_through' => 1, 'pass' => 'm'); $prefix = $this->Application->isAdmin ? '_FRONT_END_' : ''; $styles_css = $this->Application->HREF('index', $prefix, $url_params, 'index.php'); + + /** @var kCurlHelper $curl_helper */ + $curl_helper = $this->Application->recallObject('CurlHelper'); + $curl_helper->Send($styles_css, false); + $styles_css = $curl_helper->getInfo(CURLINFO_REDIRECT_URL); + $curl_helper->CloseConnection(); } else { $stylesheet_folder_url = $this->Application->BaseURL(rtrim(EDITOR_PATH, '/')); $styles_css = $stylesheet_folder_url . 'style.css'; } $styles_js = $stylesheet_folder_url . 'styles.js'; return array($styles_css, $styles_js); } /** * Returns url to JavaScript configuration file. * * @return string */ protected function getJavaScriptConfig() { if ( file_exists(SYSTEM_PRESET_PATH . DIRECTORY_SEPARATOR . 'inp_ckconfig.js') ) { $file_helper = $this->Application->recallObject('FileHelper'); /* @var $file_helper FileHelper */ return $file_helper->pathToUrl(SYSTEM_PRESET_PATH . DIRECTORY_SEPARATOR . 'inp_ckconfig.js'); } return $this->Application->BaseURL() . 'core/admin_templates/js/inp_ckconfig.js'; } /** * Returns CKEditor locale, that matches default site language. * * @return string */ protected function getLanguage() { static $language_code = null; if ( !isset($language_code) ) { $language_code = 'en'; // default value if ( $this->Application->isAdmin ) { $language_id = $this->Application->Phrases->LanguageId; } else { $language_id = $this->Application->GetDefaultLanguageId(); // $this->Application->GetVar('m_lang'); } $sql = 'SELECT Locale FROM ' . $this->Application->getUnitOption('lang', 'TableName') . ' WHERE LanguageId = ' . $language_id; $locale = strtolower($this->Conn->GetOne($sql)); if ( file_exists(FULL_PATH . EDITOR_PATH . 'editor/lang/' . $locale . '.js') ) { // found language file, that exactly matches locale name (e.g. "en") $language_code = $locale; } else { $locale = explode('-', $locale); if ( file_exists(FULL_PATH . EDITOR_PATH . 'editor/lang/' . $locale[0] . '.js') ) { // language file matches first part of locale (e.g. "ru-RU") $language_code = $locale[0]; } } } return $language_code; } /** * Returns transit parameters, that should be passed to every used CKEditor instance. * * @param array $tag_params Tag params. * * @return array */ public function getTransitParams(array $tag_params = array()) { $ret = array(); $transit_params = array('bgcolor' => '', 'body_class' => '', 'body_id' => '', 'style_set_name' => 'portal'); foreach ( $transit_params as $param_name => $default_value ) { $param_value = isset($tag_params[$param_name]) ? $tag_params[$param_name] : $this->Application->GetVar($param_name); if ( $param_value || $default_value ) { $ret[$param_name] = $param_value ? $param_value : $default_value; } } return $ret; } } Index: branches/5.2.x/core/units/fck/fck_eh.php =================================================================== --- branches/5.2.x/core/units/fck/fck_eh.php (revision 16474) +++ branches/5.2.x/core/units/fck/fck_eh.php (revision 16475) @@ -1,257 +1,259 @@ Array ('self' => true), ); $this->permMapping = array_merge($this->permMapping, $permissions); } /** * Checks user permission to execute given $event * * @param kEvent $event * @return bool * @access public */ public function CheckPermission(kEvent $event) { if ( $this->Application->isAdminUser || $event->Name == 'OnGetsEditorStyles' ) { // this limits all event execution only to logged-in users in admin return true; } return parent::CheckPermission($event); } function CreateXmlHeader() { ob_end_clean() ; // Prevent the browser from caching the result. // Date in the past header('Expires: Mon, 26 Jul 1997 05:00:00 GMT') ; // always modified header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT') ; // HTTP/1.1 header('Cache-Control: no-store, no-cache, must-revalidate') ; header('Cache-Control: post-check=0, pre-check=0', false) ; // HTTP/1.0 header('Pragma: no-cache') ; // Set the response format. $this->Application->setContentType('text/xml'); // Create the XML document header. } function OnLoadCmsTree($event) { $event->status = kEvent::erSTOP; $category_helper = $this->Application->recallObject('CategoryHelper'); /* @var $category_helper CategoryHelper */ $pages = $category_helper->getStructureTreeAsOptions(); $sql = 'SELECT NamedParentPath, CategoryId FROM ' . TABLE_PREFIX . 'Categories WHERE CategoryId IN (' . implode(',', array_keys($pages)) . ')'; $templates = $this->Conn->GetCol($sql, 'CategoryId'); $templates[$this->Application->getBaseCategory()] .= '/Index'; // "Content" category will act as "Home Page" $res = '' . "\n"; $res .= '' . "\n"; foreach ($pages as $id => $title) { $template = $templates[$id]; $page_path = preg_replace('/^Content\//i', '', strtolower($template).'.html'); $title = $title . ' (' . $page_path . ')'; $real_url = $this->Application->HREF($template, '_FRONT_END_', array('pass' => 'm'), 'index.php'); $res .= '' . "\n"; } $res.= ""; $this->CreateXmlHeader(); echo $res; } function OnRenameFile($event) { $event->status = kEvent::erSTOP; if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { return; } $old_name = $this->Application->GetVar('old_name'); $new_name = $this->Application->GetVar('new_name'); $folder = $this->Application->GetVar('folder'); $sServerDir = WRITEABLE . '/user_files/' . $folder . '/'; if (!file_exists($sServerDir.$old_name) || !is_file($sServerDir.$old_name)) { echo 204; return; } $fck_helper = $this->Application->recallObject('FCKHelper'); /* @var $fck_helper fckFCKHelper*/ if ( !$fck_helper->IsAllowedExtension($folder, $new_name) ) { echo 203; return; } if ( !rename($sServerDir . $old_name, $sServerDir . $new_name) ) { // echo $sServerDir.$old_name.' -> '.$sServerDir.$new_name; echo 205; return; } echo '0'; } function OnDeleteFiles($event) { $event->status = kEvent::erSTOP; if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { return; } $files = trim($this->Application->GetVar('files'),'|'); // echo $files; $a_files = explode('|', $files); $folder = $this->Application->GetVar('folder'); $sServerDir = WRITEABLE . '/user_files/' . $folder . '/'; foreach ($a_files AS $file) { @unlink($sServerDir.$file); } // print_r($a_files); } function OnGetFoldersFilesList($event) { $this->CreateXmlHeader(); $fck_helper = $this->Application->recallObject('FCKHelper'); /* @var $fck_helper fckFCKHelper */ $ret = ''."\n" ; $ret .= ""."\n"; $ret .= $fck_helper->PrintFolders(); $ret .= $fck_helper->PrintFiles(); $ret .= ""."\n"; echo $ret; exit; } function OnCreateFolder($event) { $event->status = kEvent::erSTOP; if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { return; } $new_folder = $this->Application->GetVar('new_folder'); $current_folder = $this->Application->GetVar('current_folder'); $folderPath = WRITEABLE . '/user_files' . '/' . $current_folder . "/" . $new_folder; if ( file_exists( $folderPath ) && is_dir($folderPath)) { echo "101"; } if ( !file_exists( $folderPath ) ) { // Turn off all error reporting. error_reporting( 0 ) ; // Enable error tracking to catch the error. ini_set( 'track_errors', '1' ) ; // To create the folder with 0777 permissions, we need to set umask to zero. $oldumask = umask(0) ; mkdir( $folderPath, 0777 ) ; umask( $oldumask ) ; $sErrorMsg = $php_errormsg ; // Restore the configurations. ini_restore( 'track_errors' ) ; ini_restore( 'error_reporting' ) ; if ($sErrorMsg) echo $sErrorMsg ; else echo '0'; } } /** * Uploads a file from FCK file browser * * @param kEvent $event * @return void * @access protected */ protected function OnUploadFile(kEvent $event) { $event->status = kEvent::erSTOP; if ( $this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1) ) { return; } $fck_helper = $this->Application->recallObject('FCKHelper'); /* @var $fck_helper fckFCKHelper*/ $fck_helper->UploadFile(); } /** * Returns compressed CSS file * * @param kEvent $event */ function OnGetsEditorStyles($event) { + kUtil::safeDefine('DBG_SKIP_REPORTING', 1); + /** @var ThemeItem $theme */ $theme = $this->Application->recallObject('theme.current'); /** @var MinifyHelper $minify_helper */ $minify_helper = $this->Application->recallObject('MinifyHelper'); $this->Application->InitParser(); $styles_css = $minify_helper->CompressScriptTag(array('files' => $theme->getStylesheetFile(true))); $event->redirect = 'external:' . $styles_css; } }