openrat-cms

# OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs

FileAction.class.php (16344B)


      1 <?php
      2 
      3 namespace cms\action;
      4 
      5 use cms\model\Folder;
      6 use cms\model\BaseObject;
      7 use cms\model\File;
      8 
      9 use cms\publish\PublishPreview;
     10 use cms\publish\PublishPublic;
     11 use Http;
     12 use \Html;
     13 use Upload;
     14 use ValidationException;
     15 
     16 // OpenRat Content Management System
     17 // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de
     18 //
     19 // This program is free software; you can redistribute it and/or
     20 // modify it under the terms of the GNU General Public License
     21 // as published by the Free Software Foundation; either version 2
     22 // of the License, or (at your option) any later version.
     23 //
     24 // This program is distributed in the hope that it will be useful,
     25 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     26 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     27 // GNU General Public License for more details.
     28 //
     29 // You should have received a copy of the GNU General Public License
     30 // along with this program; if not, write to the Free Software
     31 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     32 
     33 
     34 /**
     35  * Action-Klasse zum Bearbeiten einer Datei
     36  *
     37  * @author Jan Dankert
     38  */
     39 class FileAction extends ObjectAction
     40 {
     41 	public $security = Action::SECURITY_USER;
     42 
     43     /**
     44      * @var File
     45      */
     46 	private $file;
     47 
     48 	/**
     49 	 * Konstruktor
     50 	 */
     51 	function __construct()
     52     {
     53         parent::__construct();
     54     }
     55 
     56 
     57     public function init()
     58     {
     59 		$file = new File( $this->getRequestId() );
     60 		$file->languageid = $this->getRequestVar(REQ_PARAM_LANGUAGE_ID);
     61 		$file->load();
     62 
     63         $this->setBaseObject( $file );
     64 	}
     65 
     66 
     67 	protected function setBaseObject( $file ) {
     68 		$this->file = $file;
     69 
     70 		parent::setBaseObject( $file );
     71 	}
     72 
     73 
     74 	/**
     75 	 * Ersetzt den Inhalt der Datei.
     76 	 */
     77 	public function editPost()
     78 	{
     79 		$upload = new Upload();
     80 
     81 		if   ( $upload->isAvailable() )
     82         {
     83             // File received as attachement.
     84             try
     85             {
     86                 $upload->processUpload();
     87             }
     88             catch( \Exception $e )
     89             {
     90                 throw $e;
     91             }
     92 
     93             $this->file->filename  = $upload->filename;
     94             $this->file->extension = $upload->extension;
     95             $this->file->size      = $upload->size;
     96             $this->file->save();
     97 
     98             $this->file->value = $upload->value;
     99             $this->file->saveValue();
    100         }
    101 		elseif( $this->hasRequestVar('value') )
    102         {
    103             // File value received
    104             $this->file->value = $this->getRequestVar('value');
    105 
    106             if   ( strtolower($this->getRequestVar('encoding')) == 'base64')
    107                 // file value is base64-encoded
    108                 $this->file->value = base64_decode($this->file->value);
    109 
    110             $this->file->saveValue();
    111         }
    112         else
    113         {
    114             // No file received.
    115             throw new ValidationException('value');
    116         }
    117 
    118         $this->file->setTimestamp();
    119 
    120 		$this->addNotice($this->file->getType(),$this->file->filename,'VALUE_SAVED','ok');
    121 	}
    122 
    123 
    124     /**
    125      * Abspeichern der Eigenschaften zu dieser Datei.
    126      *
    127      */
    128     function advancedPost()
    129     {
    130         $this->file->extension = $this->getRequestVar('extension'  ,OR_FILTER_FILENAME);
    131 
    132 		$typeid = $this->getRequestVar('type',OR_FILTER_NUMBER  );
    133 
    134 		if   ( ! in_array($typeid,[BaseObject::TYPEID_FILE,BaseObject::TYPEID_IMAGE,BaseObject::TYPEID_TEXT]))
    135 			throw new ValidationException('type');
    136 
    137         $this->file->typeid = $typeid;
    138         $this->file->updateType();
    139         $this->file->save();
    140 
    141         $this->addNotice($this->file->getType(),$this->file->filename,'PROP_SAVED','ok');
    142     }
    143 
    144 
    145 
    146     /**
    147 	 * Anzeigen des Inhaltes, der Inhalt wird samt Header direkt
    148 	 * auf die Standardausgabe geschrieben
    149 	 */
    150 	function previewView()
    151 	{
    152 	    $this->file->publisher = new PublishPreview();
    153 		$url = Html::url($this->file->getType(),'show',$this->file->objectid,array('target'=>'none') );
    154 		$this->setTemplateVar('preview_url',$url );
    155 	}
    156 
    157 
    158 	/**
    159 	 * Anzeigen des Inhaltes, der Inhalt wird samt Header direkt
    160 	 * auf die Standardausgabe geschrieben
    161 	 */
    162 	function showView()
    163 	{
    164 	    $this->file->publisher = new PublishPreview();
    165 		$this->lastModified( $this->file->lastchangeDate );
    166 
    167 		if	( $this->file->extension == 'gz' )
    168 		{
    169 			global $conf;
    170 			$mime_types = $conf['mime-types'];
    171 
    172 			$pos = strrpos($this->file->filename,'.');
    173 			if	( $pos === false )
    174 				$ext = '';
    175 			else
    176 				$ext = substr($this->file->filename,$pos+1);
    177 
    178 			$ext = strtolower($ext);
    179 
    180 			if	( !empty($mime_types[$ext]) )
    181 				$mime_type = $mime_types[$ext];
    182 			else
    183 				// Wenn kein Mime-Type gefunden, dann Standardwert setzen
    184 				$mime_type = OR_FILE_DEFAULT_MIMETYPE;
    185 
    186 			header('Content-Type: '.$mime_type );
    187 			header('Content-Encoding: gzip' );
    188 		}
    189 		else
    190 		{
    191 			// Angabe Content-Type
    192 			header('Content-Type: '.$this->file->mimeType() );
    193 		}
    194 
    195 		header('X-File-Id: '   .$this->file->fileid     );
    196 		header('X-Id: '        .$this->file->id         );
    197 
    198 		// Angabe Content-Disposition
    199 		// - Bild soll "inline" gezeigt werden
    200 		// - Dateiname wird benutzt, wenn der Browser das Bild speichern moechte
    201 		header('Content-Disposition: inline; filename='.$this->file->filename() );
    202 		header('Content-Transfer-Encoding: binary' );
    203 		header('Content-Description: '.$this->file->filename() );
    204 
    205 		$this->file->write(); // Bild aus Datenbank laden
    206 
    207 		// Groesse des Bildes in Bytes
    208 		// Der Browser hat so die Moeglichkeit, einen Fortschrittsbalken zu zeigen
    209 		header('Content-Length: '.filesize($this->file->getCache()->getFilename()) );
    210 
    211 
    212 		if	( $this->request->getRequestVar('encoding') == 'base64')
    213 		{
    214 		    $encodingFunction = function($value) {
    215 		        return base64_encode($value);
    216             };
    217 			$this->setTemplateVar('encoding', 'base64');
    218 		}
    219 		else {
    220             $encodingFunction = function($value) {
    221                 return $value;
    222             };
    223             $this->setTemplateVar('encoding', 'none');
    224         }
    225 
    226 
    227 		// Unterscheidung, ob PHP-Code in der Datei ausgefuehrt werden soll.
    228         $phpActive = ( config('publish','enable_php_in_file_content')=='auto' && $this->file->getRealExtension()=='php') ||
    229             config('publish','enable_php_in_file_content')===true;
    230 
    231         if	(  $phpActive ) {
    232 
    233             // PHP-Code ausfuehren
    234             ob_start();
    235             require( $this->file->getCache()->getFilename() );
    236             $this->setTemplateVar('value',$encodingFunction(ob_get_contents()) );
    237             ob_end_clean();
    238         }
    239         else
    240             $this->setTemplateVar('value',$encodingFunction(file_get_contents( $this->file->getCache()->getFilename()) ) );
    241         // Maybe we want some gzip-encoding?
    242 	}
    243 
    244 
    245 
    246 
    247 	public function advancedView()
    248 	{
    249 		// Eigenschaften der Datei uebertragen
    250 		$this->setTemplateVar( 'extension',$this->file->extension );
    251 		$this->setTemplateVar( 'type'     ,$this->file->type      );
    252 		$this->setTemplateVar( 'types'    ,[
    253 			BaseObject::TYPEID_FILE  => lang('file' ),
    254 			BaseObject::TYPEID_IMAGE => lang('image'),
    255 			BaseObject::TYPEID_TEXT  => lang('text' )
    256 		] );
    257 	}
    258 
    259 
    260 
    261 
    262 	/**
    263 	 * Anzeigen des Inhaltes
    264 	 */
    265 	function editView()
    266 	{
    267 		global $conf;
    268 		// MIME-Types aus Datei lesen
    269 		$this->setTemplateVars( $this->file->getProperties() );
    270 	}
    271 
    272 
    273 	/**
    274 	 * Anzeigen des Inhaltes
    275 	 */
    276 	function upload()
    277 	{
    278 	}
    279 
    280 
    281 	/**
    282 	 * Anzeigen des Inhaltes
    283 	 */
    284 	function valueView()
    285 	{
    286 		global $conf;
    287 		// MIME-Types aus Datei lesen
    288 		$this->setTemplateVars( $this->file->getProperties() );
    289 		$this->setTemplateVar('value',$this->file->loadValue());
    290 	}
    291 
    292 
    293 	/**
    294 	 * Anzeigen des Inhaltes
    295 	 */
    296 	function extractView()
    297 	{
    298 		$this->setTemplateVars( $this->file->getProperties() );
    299 	}
    300 
    301 
    302 	/**
    303 	 * Anzeigen des Inhaltes
    304 	 */
    305 	function uncompressView()
    306 	{
    307 	}
    308 
    309 
    310 	/**
    311 	 * Anzeigen des Inhaltes
    312 	 */
    313 	function uncompressPost()
    314 	{
    315 		switch( $this->file->extension )
    316 		{
    317 			case 'gz':
    318 				if	( $this->getRequestVar('replace') )
    319 				{
    320 					if	( strcmp(substr($this->file->loadValue(),0,2),"\x1f\x8b"))
    321 					{
    322 						throw new \LogicException("Not GZIP format (See RFC 1952)");
    323 					}
    324 					$method = ord(substr($this->file->loadValue(),2,1));
    325 					if	( $method != 8 )
    326 					{
    327 						throw new \LogicException("Unknown GZIP method: $method");
    328 					}
    329 					$this->file->value = gzinflate( substr($this->file->loadValue(),10));
    330 					$this->file->parse_filename( $this->file->filename );
    331 					$this->file->save();
    332 					$this->file->saveValue();
    333 				}
    334 				else
    335 				{
    336 					$newFile = new File();
    337 					$newFile->name     = $this->file->name;
    338 					$newFile->parentid = $this->file->parentid;
    339 					$newFile->value    = gzinflate( substr($this->file->loadValue(),10));
    340 					$newFile->parse_filename( $this->file->filename );
    341 					$newFile->add();
    342 				}
    343 				
    344 				break;
    345 
    346 			case 'bz2':
    347 				if	( $this->getRequestVar('replace') )
    348 				{
    349 					$this->file->value = bzdecompress($this->file->loadValue());
    350 					$this->file->parse_filename( $this->file->filename );
    351 					$this->file->save();
    352 					$this->file->saveValue();
    353 				}
    354 				else
    355 				{
    356 					$newFile = new File();
    357 					$newFile->name     = $this->file->name;
    358 					$newFile->parentid = $this->file->parentid;
    359 					$newFile->value    = bzdecompress( $this->file->loadValue() );
    360 					$newFile->parse_filename( $this->file->filename );
    361 					$newFile->add();
    362 				}
    363 				
    364 				break;
    365 
    366 			default:
    367 				throw new \OpenRatException( 'cannot uncompress file with extension: '.$this->file->extension );
    368 		}
    369 
    370 		$this->addNotice('file',$this->file->name,'DONE',OR_NOTICE_OK);
    371 		$this->callSubAction('edit');
    372 	}
    373 
    374 
    375 
    376 	/**
    377 	 * Anzeigen des Inhaltes
    378 	 */
    379 	function extractPost()
    380 	{
    381 		switch( $this->file->extension )
    382 		{
    383 			case 'tar':
    384 				$folder = new Folder();
    385 				$folder->parentid = $this->file->parentid;
    386 				$folder->name     = $this->file->name;
    387 				$folder->filename = $this->file->filename;
    388 				$folder->add();
    389 				
    390 				$tar = new ArchiveTar();
    391 				$tar->openTAR( $this->file->loadValue() );
    392 				
    393 				foreach( $tar->files as $file )
    394 				{
    395 					$newFile = new File();
    396 					$newFile->name     = $file['name'];
    397 					$newFile->parentid = $folder->objectid;
    398 					$newFile->value    = $file['file'];
    399 					$newFile->parse_filename( $file['name'] );
    400 					$newFile->lastchangeDate = $file['time'];
    401 					$newFile->add();
    402 					
    403 					$this->addNotice('file',$newFile->name,'ADDED');
    404 				}
    405 				
    406 				unset($tar);
    407 				
    408 				break;
    409 
    410 			case 'zip':
    411 			
    412 				$folder = new Folder();
    413 				$folder->parentid    = $this->file->parentid;
    414 				$folder->name        = $this->file->name;
    415 				$folder->filename    = $this->file->filename;
    416 				$folder->description = $this->file->fullFilename;
    417 				$folder->add();
    418 				
    419 				$zip = new ArchiveUnzip();
    420 				$zip->open( $this->file->loadValue() );
    421 
    422 				$lista = $zip->getList();
    423 
    424 				if(sizeof($lista)) foreach($lista as $fileName=>$trash){
    425 					
    426 
    427 					$newFile = new File();
    428 					$newFile->name        = basename($fileName);
    429 					$newFile->description = 'Extracted: '.$this->file->fullFilename.' -> '.$fileName;
    430 					$newFile->parentid    = $folder->objectid;
    431 					$newFile->parse_filename( basename($fileName) );
    432 
    433 					$newFile->value       = $zip->unzip($fileName);
    434 					$newFile->add();
    435 					
    436 					$this->addNotice('file',$newFile->name,'ADDED');
    437 					unset($newFile);
    438 				}
    439 
    440 				$zip->close();
    441 				unset($zip);
    442 				
    443 				break;
    444 
    445 			default:
    446 				throw new \OpenRatException( 'cannot extract file with extension: '.$this->file->extension );
    447 		}
    448 		$this->callSubAction('edit');
    449 	}
    450 
    451 
    452 
    453 	/**
    454 	 * Anzeigen des Inhaltes
    455 	 */
    456 	function compressView()
    457 	{
    458 		$formats = array();
    459 		foreach( $this->getCompressionTypes() as $t )
    460 			$formats[$t] = lang('compression_'.$t);
    461 
    462 		$this->setTemplateVar('formats'       ,$formats    );
    463 	}
    464 
    465 	
    466 
    467 	/**
    468 	 * Anzeigen des Inhaltes
    469 	 */
    470 	function compressPost()
    471 	{
    472 		$format = $this->getRequestVar('format',OR_FILTER_ALPHANUM);
    473 		
    474 		switch( $format )
    475 		{
    476 			case 'gz':
    477 				if	( $this->getRequestVar('replace',OR_FILTER_NUMBER)=='1' )
    478 				{
    479 					$this->file->value = gzencode( $this->file->loadValue(),1 );
    480 					$this->file->parse_filename( $this->file->filename.'.'.$this->file->extension.'.gz',FORCE_GZIP );
    481 					$this->file->save();
    482 					$this->file->saveValue();
    483 					
    484 				}
    485 				else
    486 				{
    487 					$newFile = new File();
    488 					$newFile->name     = $this->file->name;
    489 					$newFile->parentid = $this->file->parentid;
    490 					$newFile->value    = gzencode( $this->file->loadValue(),1 );
    491 					$newFile->parse_filename( $this->file->filename.'.'.$this->file->extension.'.gz',FORCE_GZIP );
    492 					$newFile->add();
    493 				}
    494 				
    495 				break;
    496 
    497 			case 'bzip2':
    498 				if	( $this->getRequestVar('replace')=='1' )
    499 				{
    500 					$this->file->value = bzcompress( $this->file->loadValue() );
    501 					$this->file->parse_filename( $this->file->filename.'.'.$this->file->extension.'.bz2' );
    502 					$this->file->save();
    503 					$this->file->saveValue();
    504 					
    505 				}
    506 				else
    507 				{
    508 					$newFile = new File();
    509 					$newFile->name     = $this->file->name;
    510 					$newFile->parentid = $this->file->parentid;
    511 					$newFile->value    = bzcompress( $this->file->loadValue() );
    512 					$newFile->parse_filename( $this->file->filename.'.'.$this->file->extension.'.bz2' );
    513 					$newFile->add();
    514 				}
    515 				
    516 				break;
    517 			default:
    518 				throw new \OpenRatException( 'unknown compress type: '.$format );
    519 		}
    520 
    521 		$this->addNotice('file',$this->file->name,'DONE',OR_NOTICE_OK);
    522 		$this->callSubAction('edit');
    523 	}
    524 
    525 
    526 	/**
    527 	 * Datei veroeffentlichen
    528 	 */
    529 	function pubView()
    530 	{
    531 	}
    532 
    533 
    534 	/**
    535 	 * Datei veroeffentlichen
    536 	 */
    537 	function pubPost()
    538 	{
    539 	    $this->file->publisher = new PublishPublic( $this->file->projectid );
    540 		$this->file->publish();
    541 		$this->file->publisher->close();
    542 		
    543 		$this->addNotice('file',$this->file->fullFilename,'PUBLISHED',OR_NOTICE_OK,array(),$this->file->publisher->log);
    544 	}
    545 
    546 
    547 
    548 	function getCompressionTypes()
    549 	{
    550 		$compressionTypes = array();
    551 		if	( function_exists('gzencode'    ) ) $compressionTypes[] = 'gz';
    552 		//if	( function_exists('gzencode'    ) ) $compressionTypes[] = 'zip';
    553 		if	( function_exists('bzipcompress') ) $compressionTypes[] = 'bz2';
    554 		return $compressionTypes;
    555 	}
    556 
    557 	function getArchiveTypes()
    558 	{
    559 		$archiveTypes = array();
    560 		$archiveTypes[] = 'tar';
    561 		$archiveTypes[] = 'zip';
    562 		return $archiveTypes;
    563 	}
    564 
    565 
    566 
    567 	function checkMenu( $name )
    568 	{
    569 		$archiveTypes     = $this->getArchiveTypes();
    570 		$compressionTypes = $this->getCompressionTypes();
    571 		
    572 		switch( $name )
    573 		{
    574 			case 'uncompress':
    575 				return !readonly() && in_array($this->file->extension,$compressionTypes);
    576 
    577 			case 'compress':
    578 				return !readonly() && !in_array($this->file->extension,$compressionTypes);
    579 
    580 			case 'extract':
    581 				return !readonly() && in_array($this->file->extension,$archiveTypes);
    582 
    583 			case 'size':
    584 				return !readonly() && $this->file->isImage();
    585 
    586 			case 'editvalue':
    587 				return !readonly() && substr($this->file->mimeType(),0,5)=='text/';
    588 
    589 			case 'aclform':
    590 				return !readonly();
    591 				
    592 			default:
    593 				return true;
    594 		}
    595 	}
    596 	
    597 	
    598 	
    599 	/**
    600 	 * Liefert die Struktur zu diesem Ordner:
    601 	 * - Mit den übergeordneten Ordnern und
    602 	 * - den in diesem Ordner enthaltenen Objekten
    603 	 * 
    604 	 * Beispiel:
    605 	 * <pre>
    606 	 * - A
    607 	 *   - B
    608 	 *     - C (dieser Ordner)
    609 	 *       - Unterordner
    610 	 *       - Seite
    611 	 *       - Seite
    612 	 *       - Datei
    613 	 * </pre> 
    614 	 */
    615 	public function structureView()
    616 	{
    617 
    618 		$structure = array();
    619 		$tmp = &$structure;
    620 		$nr  = 0;
    621 		
    622 		$folder = new Folder( $this->file->parentid );
    623 		$parents = $folder->parentObjectNames(false,true);
    624 		
    625 		foreach( $parents as $id=>$name)
    626 		{
    627 			unset($children);
    628 			unset($o);
    629 			$children = array();
    630 			$o = array('id'=>$id,'name'=>$name,'type'=>'folder','level'=>++$nr,'children'=>&$children);
    631 			
    632 			$tmp[$id] = &$o;;
    633 			
    634 			unset($tmp);
    635 			
    636 			$tmp = &$children; 
    637 		}
    638 		
    639 		
    640 		
    641 		unset($children);
    642 		unset($id);
    643 		unset($name);
    644 		
    645 		$elementChildren = array();
    646 		
    647 		$tmp[ $this->file->objectid ] = array('id'=>$this->file->objectid,'name'=>$this->file->name,'type'=>'file','self'=>true,'children'=>&$elementChildren);
    648 		
    649 		
    650 		//Html::debug($structure);
    651 		
    652 		$this->setTemplateVar('outline',$structure);
    653 	}
    654 
    655 
    656 	public function removeView()
    657     {
    658         $this->setTemplateVar( 'name',$this->file->filename );
    659     }
    660 
    661 
    662     public function removePost()
    663     {
    664         if   ( $this->getRequestVar('delete') != '' )
    665         {
    666             $this->file->delete();
    667             $this->addNotice('template',$this->file->filename,'DELETED',OR_NOTICE_OK);
    668         }
    669         else
    670         {
    671             $this->addNotice('template',$this->file->filename,'CANCELED',OR_NOTICE_WARN);
    672         }
    673     }
    674 }
    675 
    676 ?>