Version 4.0.13.1
This commit is contained in:
1 parent
f9e857d255
commit
c6a86f0d9b
7517 files changed
+597400
-668041
No files matched your search
@@ -0,0 +1,222 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief File Handler: Database
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @since 06 May 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\File;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* File Handler: Database
|
||||
*/
|
||||
class _Database extends \IPS\File
|
||||
{
|
||||
/* !ACP Configuration */
|
||||
|
||||
/**
|
||||
* Settings
|
||||
*
|
||||
* @param array $configuration Configuration if editing a setting, or array() if creating a setting.
|
||||
* @return array
|
||||
*/
|
||||
public static function settings( $configuration=array() )
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Display name
|
||||
*
|
||||
* @param array $settings Configuration settings
|
||||
* @return string
|
||||
*/
|
||||
public static function displayName( $settings )
|
||||
{
|
||||
return \IPS\Member::loggedIn()->language()->addToStack('filehandler__Database');
|
||||
}
|
||||
|
||||
/* !File Handling */
|
||||
|
||||
/**
|
||||
* Is this URL valid for this engine?
|
||||
*
|
||||
* @param \IPS\Http\Url $url URL
|
||||
* @param array $configuration Specific configuration for this method
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidUrl( $url, $configuration )
|
||||
{
|
||||
$check = \IPS\Http\Url::internal( "applications/core/interface/file/index.php", 'none', NULL, array(), \IPS\Http\Url::PROTOCOL_RELATIVE );
|
||||
if ( mb_substr( $url, 0, mb_strlen( $check ) ) === $check )
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array $configuration Storage configuration
|
||||
* @return void
|
||||
*/
|
||||
public function __construct( $configuration )
|
||||
{
|
||||
$this->container = 'monthly_' . date( 'Y' ) . '_' . date( 'm' );
|
||||
parent::__construct( $configuration );
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the base URL
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function baseUrl()
|
||||
{
|
||||
return (string) \IPS\Http\Url::internal( "applications/core/interface/file/index.php?file=", 'none', NULL, array(), \IPS\Http\Url::PROTOCOL_RELATIVE );
|
||||
}
|
||||
|
||||
/**
|
||||
* Load File Data
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function load()
|
||||
{
|
||||
parent::load();
|
||||
|
||||
$this->filename = urldecode( $this->filename );
|
||||
$this->container = urldecode( $this->container );
|
||||
$this->originalFilename = urldecode( $this->originalFilename );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Contents
|
||||
*
|
||||
* @param bool $refresh If TRUE, will fetch again
|
||||
* @return string
|
||||
*/
|
||||
public function contents( $refresh=FALSE )
|
||||
{
|
||||
if ( $this->contents === NULL or $refresh === TRUE )
|
||||
{
|
||||
try
|
||||
{
|
||||
$record = \IPS\Db::i()->select( '*', 'core_files', array( 'filename=? AND container=?', $this->filename, $this->container ) )->first();
|
||||
$this->contents = $record['contents'];
|
||||
}
|
||||
catch( \UnderflowException $ex )
|
||||
{
|
||||
throw new \RuntimeException( 'FILE_DOES_NOT_EXIST' );
|
||||
}
|
||||
}
|
||||
return $this->contents;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save File
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
$salt = md5( uniqid() );
|
||||
|
||||
/* Make sure name doesn't have anything that may break URLs */
|
||||
if ( preg_match( '#[^a-zA-Z0-9!\-_\.\*\(\)]#', $this->filename ) )
|
||||
{
|
||||
$this->filename = uniqid() . '_' . preg_replace( '#[^a-zA-Z0-9!\-_\.\*\(\)]#', '', $this->filename );
|
||||
}
|
||||
|
||||
$id = \IPS\Db::i()->insert( 'core_files', array(
|
||||
'filename' => $this->filename,
|
||||
'salt' => $salt,
|
||||
'contents' => $this->contents(),
|
||||
'container' => $this->container
|
||||
) );
|
||||
|
||||
$this->url = new \IPS\Http\Url( $this->fullyQualifiedUrl( "{$this->container}/{$this->filename}" ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function delete()
|
||||
{
|
||||
\IPS\Db::i()->delete( 'core_files', array( 'filename=? AND container=?', $this->filename, $this->container ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete Container
|
||||
*
|
||||
* @param string $container Key
|
||||
* @return void
|
||||
*/
|
||||
public function deleteContainer( $container )
|
||||
{
|
||||
\IPS\Db::i()->delete( 'core_files', array( 'container=?', $container ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove orphaned files
|
||||
*
|
||||
* @param int $fileIndex The file offset to start at in a listing
|
||||
* @param array $engines All file storage engine extension objects
|
||||
* @return array
|
||||
*/
|
||||
public function removeOrphanedFiles( $fileIndex, $engines )
|
||||
{
|
||||
/* Start off our results array */
|
||||
$results = array(
|
||||
'_done' => FALSE,
|
||||
'fileIndex' => $fileIndex,
|
||||
);
|
||||
|
||||
/* Init */
|
||||
$checked = 0;
|
||||
|
||||
/* Loop over files */
|
||||
foreach( \IPS\DB::i()->select( '*', 'core_files', array(), 'id ASC', array( $fileIndex, 100 ) ) as $file )
|
||||
{
|
||||
$checked++;
|
||||
|
||||
/* Next we will have to loop through each storage engine type and call it to see if the file is valid */
|
||||
foreach( $engines as $engine )
|
||||
{
|
||||
/* If this file is valid for the engine, skip to the next file */
|
||||
if( $engine->isValidFile( $file['container'] . '/' . $file['filename'] ) )
|
||||
{
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we are still here, the file was not valid. Delete and increment count. */
|
||||
$this->logOrphanedFile( $file['container'] . '/' . $file['filename'] );
|
||||
}
|
||||
|
||||
$results['fileIndex'] += $checked;
|
||||
|
||||
/* Are we done? */
|
||||
if( !$checked OR $checked < 100 )
|
||||
{
|
||||
$results['_done'] = TRUE;
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user