openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 5730f8c19d471c217846345e8d081924dae4218d
parent 36b5ae1aabd7f995011cf4892eaf512ab37d46c3
Author: dankert <devnull@localhost>
Date:   Fri, 26 Oct 2007 00:28:18 +0200

Filemanager f?r den FCK-Editor mit Zugriff auf OpenRat-Verzeichnis.

Diffstat:
actionClasses/FilemanagerAction.class.php | 318+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
actionClasses/FilemanagerAction.ini.php | 6++++++
editor/openrat-fckconfig.js | 28+++++++++++++++++++++-------
functions/common.inc.php | 5+++++
serviceClasses/Upload.class.php | 18++++++++++--------
serviceClasses/include.inc.php | 6++++++
6 files changed, 366 insertions(+), 15 deletions(-)

diff --git a/actionClasses/FilemanagerAction.class.php b/actionClasses/FilemanagerAction.class.php @@ -0,0 +1,317 @@ +<?php +// --------------------------------------------------------------------------- +// $Id$ +// --------------------------------------------------------------------------- +// OpenRat Content Management System +// Copyright (C) 2002-2004 Jan Dankert, cms@jandankert.de +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +/** + * Action-Klasse zum Bearbeiten einer Datei + * @author $Author$ + * @version $Revision$ + * @package openrat.actions + */ +class FilemanagerAction extends ObjectAction +{ + var $command; + var $resourceType; + + /** + * Ordner + * + * @var String + */ + var $currentFolder; + + /** + * Aktueller Ordner + * + * @var Object + */ + var $folder; + + /** + * Konstruktor + */ + function FilemanagerAction() + { + // PHP-Fehler ins Log schreiben, damit die Ausgabe nicht zerstört wird. + set_error_handler('filemanagerErrorHandler'); + + // Get the main request information. + $this->command = $this->getRequestVar('Command' ); + $this->resourceType = $this->getRequestVar('Type' ); + $this->currentFolder = $this->getRequestVar('CurrentFolder'); + + // Check if it is an allowed type. + if ( !in_array( $this->resourceType, array('File','Image','Flash','Media') ) ) + $this->sendError(101,'unknown resource type'); + + // Check the current folder syntax (must begin and end with a slash). + if ( ! ereg( '/$', $this->currentFolder ) ) $this->currentFolder .= '/' ; + if ( strpos( $this->currentFolder, '/' ) !== 0 ) $this->currentFolder = '/' . $this->currentFolder; + + $this->investigateCurrentFolder(); + } + + + /** + * Ermittelt das aktuelle Ordnerobjekt. + * + */ + function investigateCurrentFolder() + { + $folderid = Folder::getRootFolderId(); + $this->folder = new Folder( Folder::getRootFolderId() ); + $parts = explode('/',$this->currentFolder); + + foreach( $parts as $part ) + { + if ( empty($part) ) + continue; + + $oid = $this->folder->getObjectIdByFileName($part); + + if ( !$this->folder->available($oid) ) + $this->sendError(102,"currentFolder is invalid (no folder inside): "+$this->currentFolder); + + $this->folder = new Folder($oid); + + if ( ! $this->folder->isFolder ) + $this->sendError(102,"currentFolder is invalid (not a folder): "+$this->currentFolder); + } + } + + + + /** + * Anzeigen des Inhaltes, der Inhalt wird samt Header direkt + * auf die Standardausgabe geschrieben + */ + function show() + { + Logger::debug(getenv('REQUEST_URI')); + Logger::debug($this->command); + Logger::debug($this->resourceType); + Logger::debug($this->currentFolder); + Logger::debug($this->folder->objectid); + + // File Upload doesn't have to Return XML, so it must be intercepted before anything. + if ( $this->command == 'FileUpload' ) + { + $this->fileUpload() ; + return ; + } + Logger::debug("Start"); + + $this->setXmlHeaders(); + $this->createXmlHeader(); + + // Execute the required command. + switch ( $this->command ) + { + case 'GetFolders': + $this->getFolders() ; + break ; + + case 'GetFoldersAndFiles': + $this->getFoldersAndFiles() ; + break ; + + case 'CreateFolder': + $this->createFolder() ; + break ; + + default: + Logger::warn('Unknown Filemanager-Command: '.$this->command); + trigger_error('Unknown Command: '.$this->command); + $this->sendError( 102,"unknown command: ".$this->command ) ; + } + Logger::debug("ok"); + + $this->createXmlFooter(); + exit; + } + + + function setXmlHeaders() + { + // Prevent the browser from caching the result. + // Date in the past + header("Expires: ".gmdate("D, d M Y H:i:s")." 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') ; + + } + + + /** + * + */ + function createXmlHeader() + { + // Set the response format. + header( 'Content-Type:text/xml' ) ; + + echo '<?xml version="1.0" encoding="utf-8" ?>' ; + + // Create the main "Connector" node. + echo '<Connector command="' . $this->command . '" resourceType="' . $this->resourceType . '">' ; + + // Add the current folder node. + echo '<CurrentFolder path="' . convertToXmlAttribute($this->currentFolder).'" url="'.convertToXmlAttribute($this->currentFolder) . '" />' ; + } + + + + function createXmlFooter() + { + echo '</Connector>' ; + } + + + + /** + * Sendet eine Fehlermeldung zum Client und beendet den Request. + * + * @param Integer $number FehlerNr. + * @param String $text Fehlermeldung + */ + function sendError( $number, $text ) + { + echo '<Error number="' . $number . '" text="' . htmlspecialchars( $text ) . '" />' ; + exit ; + } + + + /** + * Ermittelt alle Unterordner. + * + */ + function getFolders() + { + echo "<Folders>" ; + + foreach( $this->folder->getSubfolderFilenames() as $id=>$name ) + echo '<Folder name="'. convertToXmlAttribute($name).'" />'; + + echo "</Folders>" ; + } + + + /** + * Ermittelt alle Unterordner und Dateien. + * + */ + function getFoldersAndFiles() + { + echo '<Folders>' ; + + foreach( $this->folder->getSubfolderFilenames() as $id=>$name ) + echo '<Folder name="'. convertToXmlAttribute($name).'" />'; + + echo '</Folders>' ; + echo '<Files>' ; + + foreach( $this->folder->getFileFilenames() as $id=>$name ) +// echo '<File name="' . convertToXmlAttribute( $name ).'" url="'.convertToXmlAttribute('do.php?action=file&subaction=show&id=').$id.'" size="' . '1' . '" />' ; + echo '<File name="' . convertToXmlAttribute( $name ).'" url="'.convertToXmlAttribute( Html::url('file','show',$id) ).'" size="' . '1' . '" />' ; + + echo '</Files>' ; + } + + + /** + * Legt einen neuen Unterordner an. + * + */ + function createFolder() + { + if ( $this->hasRequestVar('NewFolderName') ) + { + $newFolder = new Folder(); + $newFolder->parentid = $this->folder->objectid; + $newFolder->filename = $this->getRequestVar('NewFolderName'); + $newFolder->name = $this->getRequestVar('NewFolderName'); + + $newFolder->add(); + + $this->sendError(0,"OK"); + } + else + $this->sendError(102,'missing name for new folder'); + + // Create the "Error" node. + // echo '<Error number="' . $sErrorNumber . '" originalDescription="' . ConvertToXmlAttribute( $sErrorMsg ) . '" />' ; + } + + + + /** + * Datei-Upload. + * + */ + function fileUpload() + { + Logger::debug("Upload beginnt"); + $upload = new Upload('NewFile'); + + Logger::debug("Upload ok"); + + $file = new File(); + $file->parentid = $this->folder->objectid; + $file->filename = $upload->filename; +// if ( !empty($upload->extension) ) +// $file->filename .= '.'.$upload->extension; + + $file->filename = $upload->filename; + $file->value = $upload->value; + $file->add(); + Logger::debug("Upload added :)"); + + echo '<script type="text/javascript">' ; + echo 'window.parent.frames["frmUpload"].OnUploadCompleted(' .'0'.',"' . str_replace( '"', '\\"', $file->filename ) . '") ;' ; + echo '</script>' ; + + exit ; + } + +} + + +/** + * Fehler-Handler für WEBDAV.<br> + * Bei einem Laufzeitfehler ist eine Ausgabe des Fehlers auf der Standardausgabe sinnlos. + * Daher wird der Fehler nur geloggt. + */ +function filemanagerErrorHandler($errno, $errstr, $errfile, $errline) +{ + Logger::warn('FCKEDITOR FILEMANAGER ERROR: '.$errno.'/'.$errstr.'/file:'.$errfile.'/line:'.$errline); + + // Wir teilen dem Client mit, dass auf dem Server was schief gelaufen ist. + WebdavAction::httpStatus('500 Internal Server Error'); +} + +?>+ \ No newline at end of file diff --git a/actionClasses/FilemanagerAction.ini.php b/actionClasses/FilemanagerAction.ini.php @@ -0,0 +1,5 @@ + +[default] +goto=show + +[show]+ \ No newline at end of file diff --git a/editor/openrat-fckconfig.js b/editor/openrat-fckconfig.js @@ -16,9 +16,24 @@ FCKConfig.ToolbarSets["Default"] = [ ['FitWindow'] ] ; -FCKConfig.LinkBrowser = false; -FCKConfig.LinkUpload = false ; -FCKConfig.ImageBrowser = false ; -FCKConfig.ImageUpload = false ; -FCKConfig.FlashBrowser = false ; -FCKConfig.FlashUpload = false ;- \ No newline at end of file + +// --- +var _FileBrowserLanguage = 'php' ; // asp | aspx | cfm | lasso | perl | php | py +var _QuickUploadLanguage = 'php' ; // asp | aspx | cfm | lasso | php + +// Don't care about the following line. It just calculates the correct connector +// extension to use for the default File Browser (Perl uses "cgi"). +var _FileBrowserExtension = _FileBrowserLanguage == 'perl' ? 'cgi' : _FileBrowserLanguage ; + +FCKConfig.LinkBrowser = true; +FCKConfig.LinkBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Connector=../../../../../do.php?action=filemanager'; + +FCKConfig.ImageBrowser = true ; +FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=../../../../../do.php?action=filemanager'; + +FCKConfig.FlashBrowser = true ; +FCKConfig.FlashBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Flash&Connector=../../../../../do.php?action=filemanager'; + +FCKConfig.LinkUpload = true; +FCKConfig.ImageUpload = true; +FCKConfig.FlashUpload = true; diff --git a/functions/common.inc.php b/functions/common.inc.php @@ -14,5 +14,10 @@ function slashify($pfad) else return $pfad.'/'; } + +function convertToXmlAttribute( $value ) +{ + return utf8_encode( htmlspecialchars( $value ) ) ; +} ?> \ No newline at end of file diff --git a/serviceClasses/Upload.class.php b/serviceClasses/Upload.class.php @@ -20,6 +20,9 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // --------------------------------------------------------------------------- // $Log$ +// Revision 1.4 2007-10-25 22:28:18 dankert +// Filemanager f?r den FCK-Editor mit Zugriff auf OpenRat-Verzeichnis. +// // Revision 1.3 2007-10-02 21:13:44 dankert // Men?punkt "Neu" mit direktem Hinzuf?gen von Objekten. // @@ -54,22 +57,21 @@ class Upload * * @return Upload */ - function Upload() // Konstruktor - { + function Upload( $name='file' ) // Konstruktor + { global $FILES; - $this->size = filesize($FILES['file']['tmp_name']); - - if ( $this->size == 0 ) + $this->size = filesize($FILES[$name]['tmp_name']); + + if ( $this->size == 0 ) exit; - $fh = fopen( $FILES['file']['tmp_name'],'r' ); + $fh = fopen( $FILES[$name]['tmp_name'],'r' ); - $this->value = fread($fh,$this->size); fclose( $fh ); - $this->filename = $FILES['file']['name']; + $this->filename = $FILES[$name]['name']; $this->extension = ''; $p = strrpos( $this->filename,'.' ); // Letzten Punkt suchen diff --git a/serviceClasses/include.inc.php b/serviceClasses/include.inc.php @@ -46,6 +46,12 @@ if ( !empty($REQ[REQ_PARAM_ACTION]) && in_array($REQ[REQ_PARAM_ACTION],array('pa } +if ( !empty($REQ[REQ_PARAM_ACTION]) && in_array($REQ[REQ_PARAM_ACTION],array('file','folder','filemanager')) ) +{ + require_once( OR_SERVICECLASSES_DIR."Upload.class.".PHP_EXT ); +} + + if ( !empty($REQ[REQ_PARAM_ACTION]) && in_array($REQ[REQ_PARAM_ACTION],array('file','folder')) ) { require_once( OR_SERVICECLASSES_DIR."Upload.class.".PHP_EXT );