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,167 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief URL input class for Form Builder
|
||||
* @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 11 Mar 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\Helpers\Form;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL input class for Form Builder
|
||||
*/
|
||||
class _Url extends Text
|
||||
{
|
||||
/**
|
||||
* @brief Default Options
|
||||
* @code
|
||||
$childDefaultOptions = array(
|
||||
'allowedProtocols' => array( 'http', 'https' ), // Allowed protocols. Default is http and https. Be careful changing this not to introduce security issues.
|
||||
'allowedMimes' => 'image/*', // Sets the allowed mimetype(s). Can be string or array. * is a wildcard. Default is NULL, which allows any mimetypes.
|
||||
'file' => 'Profile', // If provided, the contents of the URL will be fetched and written as a file, an \IPS\File object will then be returned rather than a string. Provide the extension name which specifies the storage location to use.
|
||||
'maxFileSize' => NULL, // If provided along with 'file', the resulting file that is written to disk cannot be greater than this size in megabytes. NULL for no limit (default is NULL).
|
||||
);
|
||||
* @endcode
|
||||
*/
|
||||
public $childDefaultOptions = array(
|
||||
'allowedProtocols' => array( 'http', 'https' ),
|
||||
'allowedMimes' => NULL,
|
||||
'file' => FALSE,
|
||||
'maxFileSize' => NULL,
|
||||
);
|
||||
|
||||
/**
|
||||
* Validate
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
* @throws \DomainException
|
||||
* @return TRUE
|
||||
*/
|
||||
public function validate()
|
||||
{
|
||||
parent::validate();
|
||||
|
||||
if ( $this->value )
|
||||
{
|
||||
$value = $this->formatValue();
|
||||
|
||||
/* Check the URL is valid */
|
||||
if ( !( $value instanceof \IPS\Http\Url ) )
|
||||
{
|
||||
throw new \InvalidArgumentException('form_url_bad');
|
||||
}
|
||||
|
||||
/* And that it's an allowed protocol */
|
||||
if ( !in_array( mb_strtolower( $value->data['scheme'] ), $this->options['allowedProtocols'] ) )
|
||||
{
|
||||
throw new \DomainException('form_url_bad_protocol');
|
||||
}
|
||||
|
||||
/* Try to fetch it, if necessary */
|
||||
if ( $this->options['file'] or $this->options['allowedMimes'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
$response = $value->request()->get();
|
||||
|
||||
/* Check MIME */
|
||||
if ( $this->options['allowedMimes'] )
|
||||
{
|
||||
$match = FALSE;
|
||||
$contentType = ( isset( $response->httpHeaders['Content-Type'] ) ) ? $response->httpHeaders['Content-Type'] : ( ( isset( $response->httpHeaders['content-type'] ) ) ? $response->httpHeaders['content-type'] : NULL );
|
||||
if( $contentType )
|
||||
{
|
||||
|
||||
foreach ( is_array( $this->options['allowedMimes'] ) ? $this->options['allowedMimes'] : array( $this->options['allowedMimes'] ) as $mime )
|
||||
{
|
||||
if ( preg_match( '/^' . str_replace( '~~', '.+', preg_quote( str_replace( '*', '~~', $mime ), '/' ) ) . '$/i', $contentType ) )
|
||||
{
|
||||
$match = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !$match )
|
||||
{
|
||||
throw new \DomainException( 'form_url_bad_mime' );
|
||||
}
|
||||
}
|
||||
|
||||
/* Write file if necessary */
|
||||
if ( $this->options['file'] )
|
||||
{
|
||||
$filename = preg_replace( "/(.+?)(\?|$)/", "$1", mb_substr( $value, mb_strrpos( $value, '/' ) + 1 ) );
|
||||
$response = (string) $response;
|
||||
|
||||
if( $this->options['maxFileSize'] !== NULL )
|
||||
{
|
||||
$maxFileSize = $this->options['maxFileSize'] * 1048576;
|
||||
|
||||
if( \strlen( $response ) > $maxFileSize )
|
||||
{
|
||||
unset( $response );
|
||||
throw new \DomainException( \IPS\Member::loggedIn()->language()->addToStack( 'upload_too_big', TRUE, array( 'sprintf' => $this->options['maxFileSize'] ) ), 2 );
|
||||
}
|
||||
}
|
||||
|
||||
$this->value = \IPS\File::create( $this->options['file'], $filename, $response );
|
||||
}
|
||||
}
|
||||
catch ( \IPS\Http\Request\Exception $e )
|
||||
{
|
||||
throw new \DomainException( 'form_url_error' );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getValue()
|
||||
{
|
||||
$val = str_replace( 'feed://', 'http://', parent::getValue() );
|
||||
if ( $val and !mb_strpos( $val, '://' ) )
|
||||
{
|
||||
$val = "http://{$val}";
|
||||
}
|
||||
|
||||
return $val;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format Value
|
||||
*
|
||||
* @return \IPS\Http\Url|string
|
||||
*/
|
||||
public function formatValue()
|
||||
{
|
||||
if ( $this->value and !( $this->value instanceof \IPS\Http\Url ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
return new \IPS\Http\Url( $this->value );
|
||||
}
|
||||
catch ( \InvalidArgumentException $e )
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user