2012-04-23 13:50:30 +00:00
< ? php
/**
* ownCloud
*
* @ author Frank Karlitschek
2012-05-26 17:14:24 +00:00
* @ copyright 2012 Frank Karlitschek frank @ owncloud . org
2012-04-23 13:50:30 +00:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*
*/
/**
* Public interface of ownCloud for apps to use .
* Utility Class .
*
*/
2012-07-02 18:24:26 +00:00
// use OCP namespace for all classes that are considered public.
2012-04-23 13:50:30 +00:00
// This means that they should be used by apps instead of the internal ownCloud classes
namespace OCP ;
2012-05-19 08:36:57 +00:00
/**
* This class provides different helper functions to make the life of a developer easier
*/
2012-04-23 13:50:30 +00:00
class Util {
2012-05-01 15:38:27 +00:00
// consts for Logging
const DEBUG = 0 ;
const INFO = 1 ;
const WARN = 2 ;
const ERROR = 3 ;
const FATAL = 4 ;
2012-05-01 19:07:08 +00:00
/**
2012-05-06 20:02:16 +00:00
* @ brief get the current installed version of ownCloud
2012-05-01 19:07:08 +00:00
* @ return array
*/
2012-09-07 13:22:01 +00:00
public static function getVersion () {
2012-05-01 19:07:08 +00:00
return ( \OC_Util :: getVersion ());
}
2012-04-23 13:50:30 +00:00
/**
2012-07-02 18:24:26 +00:00
* @ brief send an email
2012-04-23 13:50:30 +00:00
* @ param string $toaddress
* @ param string $toname
* @ param string $subject
* @ param string $mailtext
* @ param string $fromaddress
* @ param string $fromname
* @ param bool $html
*/
2013-02-11 16:44:02 +00:00
public static function sendMail ( $toaddress , $toname , $subject , $mailtext , $fromaddress , $fromname ,
$html = 0 , $altbody = '' , $ccaddress = '' , $ccname = '' , $bcc = '' ) {
2012-04-23 13:50:30 +00:00
// call the internal mail class
2013-02-11 16:44:02 +00:00
\OC_MAIL :: send ( $toaddress , $toname , $subject , $mailtext , $fromaddress , $fromname ,
$html , $altbody , $ccaddress , $ccname , $bcc );
2012-04-23 13:50:30 +00:00
}
2012-09-08 14:18:47 +00:00
/**
2012-05-06 20:02:16 +00:00
* @ brief write a message in the log
2012-05-01 07:39:12 +00:00
* @ param string $app
* @ param string $message
2012-12-25 17:17:32 +00:00
* @ param int $level
2012-09-08 14:18:47 +00:00
*/
public static function writeLog ( $app , $message , $level ) {
// call the internal log class
\OC_LOG :: write ( $app , $message , $level );
}
2012-05-01 07:39:12 +00:00
2013-10-23 08:47:26 +00:00
/**
* @ brief write exception into the log . Include the stack trace
* if DEBUG mode is enabled
* @ param Exception $ex exception to log
*/
2013-10-23 11:58:42 +00:00
public static function logException ( $app , \Exception $ex ) {
2013-10-23 08:47:26 +00:00
$message = $ex -> getMessage ();
if ( $ex -> getCode ()) {
$message .= ' [' . $ex -> getCode () . ']' ;
}
2013-10-23 11:58:42 +00:00
\OCP\Util :: writeLog ( $app , 'Exception: ' . $message , \OCP\Util :: FATAL );
2013-10-23 08:47:26 +00:00
if ( defined ( 'DEBUG' ) and DEBUG ) {
// also log stack trace
$stack = explode ( '#' , $ex -> getTraceAsString ());
// first element is empty
array_shift ( $stack );
foreach ( $stack as $s ) {
2013-10-23 11:58:42 +00:00
\OCP\Util :: writeLog ( $app , 'Exception: ' . $s , \OCP\Util :: FATAL );
2013-10-23 08:47:26 +00:00
}
// include cause
$l = \OC_L10N :: get ( 'lib' );
while ( method_exists ( $ex , 'getPrevious' ) && $ex = $ex -> getPrevious ()) {
$message .= ' - ' . $l -> t ( 'Caused by:' ) . ' ' ;
$message .= $ex -> getMessage ();
if ( $ex -> getCode ()) {
$message .= '[' . $ex -> getCode () . '] ' ;
}
2013-10-23 11:58:42 +00:00
\OCP\Util :: writeLog ( $app , 'Exception: ' . $message , \OCP\Util :: FATAL );
2013-10-23 08:47:26 +00:00
}
}
}
2013-07-19 09:40:11 +00:00
/**
* @ brief get l10n object
* @ param string $app
* @ return OC_L10N
*/
public static function getL10N ( $application ) {
2013-07-22 13:52:02 +00:00
return \OC_L10N :: get ( $application );
2012-09-08 14:18:47 +00:00
}
2012-05-01 07:39:12 +00:00
/**
2012-05-06 20:02:16 +00:00
* @ brief add a css file
2012-12-25 17:17:32 +00:00
* @ param string $url
2012-05-01 07:39:12 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function addStyle ( $application , $file = null ) {
2012-05-06 20:02:16 +00:00
\OC_Util :: addStyle ( $application , $file );
2012-09-08 14:18:47 +00:00
}
2012-05-06 20:02:16 +00:00
2012-05-01 19:07:08 +00:00
/**
2012-05-06 20:02:16 +00:00
* @ brief add a javascript file
2012-12-25 17:17:32 +00:00
* @ param string $application
* @ param string $file
2012-05-01 19:07:08 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function addScript ( $application , $file = null ) {
2012-05-06 20:02:16 +00:00
\OC_Util :: addScript ( $application , $file );
2012-09-08 14:18:47 +00:00
}
2012-04-23 13:50:30 +00:00
2012-05-01 19:07:08 +00:00
/**
* @ brief Add a custom element to the header
2012-12-25 17:17:32 +00:00
* @ param string $tag tag name of the element
2012-05-01 19:07:08 +00:00
* @ param array $attributes array of attributes for the element
* @ param string $text the text content for the element
*/
2012-09-07 13:22:01 +00:00
public static function addHeader ( $tag , $attributes , $text = '' ) {
2012-05-09 13:17:40 +00:00
\OC_Util :: addHeader ( $tag , $attributes , $text );
2012-05-01 19:07:08 +00:00
}
2012-04-23 13:50:30 +00:00
2012-05-01 19:07:08 +00:00
/**
2012-05-06 20:02:16 +00:00
* @ brief formats a timestamp in the " right " way
2012-12-25 17:17:32 +00:00
* @ param int $timestamp $timestamp
* @ param bool $dateOnly option to omit time from the result
2012-05-01 19:07:08 +00:00
*/
2012-11-02 18:53:02 +00:00
public static function formatDate ( $timestamp , $dateOnly = false ) {
return ( \OC_Util :: formatDate ( $timestamp , $dateOnly ));
2012-05-01 19:07:08 +00:00
}
2012-04-23 13:50:30 +00:00
2013-08-12 15:25:27 +00:00
/**
* @ brief check if some encrypted files are stored
* @ return bool
*/
public static function encryptedFiles () {
return \OC_Util :: encryptedFiles ();
}
2012-05-01 21:19:39 +00:00
/**
* @ brief Creates an absolute url
2012-12-25 17:17:32 +00:00
* @ param string $app app
* @ param string $file file
* @ param array $args array with param => value , will be appended to the returned url
2012-09-28 20:27:52 +00:00
* The value of $args will be urlencoded
2012-12-25 17:17:32 +00:00
* @ returns string the url
2012-05-01 21:19:39 +00:00
*
* Returns a absolute url to the given app and file .
*/
2012-09-03 16:13:45 +00:00
public static function linkToAbsolute ( $app , $file , $args = array () ) {
return ( \OC_Helper :: linkToAbsolute ( $app , $file , $args ));
2012-05-01 21:19:39 +00:00
}
2012-05-01 20:59:38 +00:00
2012-05-07 18:22:55 +00:00
/**
* @ brief Creates an absolute url for remote use
2012-12-25 17:17:32 +00:00
* @ param string $service id
* @ returns string the url
2012-05-07 18:22:55 +00:00
*
* Returns a absolute url to the given app and file .
*/
public static function linkToRemote ( $service ) {
return ( \OC_Helper :: linkToRemote ( $service ));
}
2012-08-27 19:46:05 +00:00
/**
* @ brief Creates an absolute url for public use
2012-12-25 17:17:32 +00:00
* @ param string $service id
* @ returns string the url
2012-08-27 19:46:05 +00:00
*
* Returns a absolute url to the given app and file .
*/
public static function linkToPublic ( $service ) {
return \OC_Helper :: linkToPublic ( $service );
}
2012-06-14 10:57:30 +00:00
/**
2013-02-08 21:05:13 +00:00
* @ brief Creates an url using a defined route
* @ param $route
* @ param array $parameters
* @ return
* @ internal param array $args with param => value , will be appended to the returned url
* @ returns the url
*
* Returns a url to the given app and file .
*/
public static function linkToRoute ( $route , $parameters = array () ) {
return \OC_Helper :: linkToRoute ( $route , $parameters );
}
/**
2012-06-14 10:57:30 +00:00
* @ brief Creates an url
2012-12-25 17:17:32 +00:00
* @ param string $app app
* @ param string $file file
* @ param array $args array with param => value , will be appended to the returned url
2012-09-28 20:27:52 +00:00
* The value of $args will be urlencoded
2012-12-25 17:17:32 +00:00
* @ returns string the url
2012-06-14 10:57:30 +00:00
*
* Returns a url to the given app and file .
*/
2012-09-07 13:22:01 +00:00
public static function linkTo ( $app , $file , $args = array () ) {
2012-09-03 16:13:45 +00:00
return ( \OC_Helper :: linkTo ( $app , $file , $args ));
2012-05-01 21:19:39 +00:00
}
2012-05-01 20:59:38 +00:00
2012-05-01 21:19:39 +00:00
/**
* @ brief Returns the server host
2012-12-25 17:17:32 +00:00
* @ returns string the server host
2012-05-01 21:19:39 +00:00
*
* Returns the server host , even if the website uses one or more
* reverse proxies
*/
public static function getServerHost () {
2012-08-06 20:16:45 +00:00
return ( \OC_Request :: serverHost ());
2012-05-01 21:19:39 +00:00
}
2012-05-01 20:59:38 +00:00
2012-12-19 00:09:14 +00:00
/**
* @ brief returns the server hostname
2012-12-25 17:17:32 +00:00
* @ returns string the server hostname
2012-12-19 00:09:14 +00:00
*
* Returns the server host name without an eventual port number
*/
public static function getServerHostName () {
$host_name = self :: getServerHost ();
// strip away port number (if existing)
$colon_pos = strpos ( $host_name , ':' );
if ( $colon_pos != FALSE ) {
$host_name = substr ( $host_name , 0 , $colon_pos );
}
return $host_name ;
}
/**
* @ brief Returns the default email address
2012-12-25 17:17:32 +00:00
* @ param string $user_part the user part of the address
* @ returns string the default email address
2012-12-19 00:09:14 +00:00
*
* Assembles a default email address ( using the server hostname
* and the given user part , and returns it
* Example : when given lostpassword - noreply as $user_part param ,
* and is currently accessed via http ( s ) :// example . com / ,
* it would return 'lostpassword-noreply@example.com'
*/
public static function getDefaultEmailAddress ( $user_part ) {
$host_name = self :: getServerHostName ();
2013-03-22 09:07:06 +00:00
$host_name = \OC_Config :: getValue ( 'mail_domain' , $host_name );
2013-03-01 21:24:19 +00:00
$defaultEmailAddress = $user_part . '@' . $host_name ;
2013-03-04 20:10:18 +00:00
if ( \OC_Mail :: ValidateAddress ( $defaultEmailAddress )) {
2013-03-01 21:24:19 +00:00
return $defaultEmailAddress ;
2012-12-19 00:09:14 +00:00
}
2013-03-01 21:24:19 +00:00
2013-03-04 20:10:18 +00:00
// in case we cannot build a valid email address from the hostname let's fallback to 'localhost.localdomain'
2013-03-01 21:24:19 +00:00
return $user_part . '@localhost.localdomain' ;
2012-12-19 00:09:14 +00:00
}
2012-06-01 08:38:44 +00:00
/**
* @ brief Returns the server protocol
2012-12-25 17:17:32 +00:00
* @ returns string the server protocol
2012-06-01 08:38:44 +00:00
*
* Returns the server protocol . It respects reverse proxy servers and load balancers
*/
public static function getServerProtocol () {
2012-08-06 20:16:45 +00:00
return ( \OC_Request :: serverProtocol ());
2012-06-01 08:38:44 +00:00
}
2012-09-09 10:54:47 +00:00
/**
* @ brief Returns the request uri
* @ returns the request uri
*
* Returns the request uri , even if the website uses one or more
* reverse proxies
*/
public static function getRequestUri () {
return ( \OC_Request :: requestUri ());
}
/**
* @ brief Returns the script name
* @ returns the script name
*
* Returns the script name , even if the website uses one or more
* reverse proxies
*/
public static function getScriptName () {
return ( \OC_Request :: scriptName ());
}
2012-05-01 22:20:45 +00:00
/**
* @ brief Creates path to an image
2012-12-25 17:17:32 +00:00
* @ param string $app app
* @ param string $image image name
* @ returns string the url
2012-05-01 22:20:45 +00:00
*
* Returns the path to the image .
*/
2012-09-08 14:18:47 +00:00
public static function imagePath ( $app , $image ) {
2012-05-01 22:20:45 +00:00
return ( \OC_Helper :: imagePath ( $app , $image ));
}
/**
* @ brief Make a human file size
2012-12-25 17:17:32 +00:00
* @ param int $bytes file size in bytes
* @ returns string a human readable file size
2012-05-01 22:20:45 +00:00
*
* Makes 2048 to 2 kB .
*/
2012-09-07 13:22:01 +00:00
public static function humanFileSize ( $bytes ) {
2012-05-01 22:20:45 +00:00
return ( \OC_Helper :: humanFileSize ( $bytes ));
}
/**
* @ brief Make a computer file size
2012-12-25 17:17:32 +00:00
* @ param string $str file size in a fancy format
* @ returns int a file size in bytes
2012-05-01 22:20:45 +00:00
*
* Makes 2 kB to 2048.
*
* Inspired by : http :// www . php . net / manual / en / function . filesize . php #92418
*/
2012-09-07 13:22:01 +00:00
public static function computerFileSize ( $str ) {
2012-05-01 22:20:45 +00:00
return ( \OC_Helper :: computerFileSize ( $str ));
}
2012-05-05 08:18:45 +00:00
/**
* @ brief connects a function to a hook
2012-12-25 17:17:32 +00:00
* @ param string $signalclass class name of emitter
* @ param string $signalname name of signal
* @ param string $slotclass class name of slot
* @ param string $slotname name of slot
* @ returns bool
2012-05-05 08:18:45 +00:00
*
* This function makes it very easy to connect to use hooks .
*
* TODO : write example
*/
2012-09-07 13:22:01 +00:00
static public function connectHook ( $signalclass , $signalname , $slotclass , $slotname ) {
2012-05-05 08:18:45 +00:00
return ( \OC_Hook :: connect ( $signalclass , $signalname , $slotclass , $slotname ));
}
2012-05-01 22:20:45 +00:00
2012-05-05 08:18:45 +00:00
/**
* @ brief emitts a signal
2012-12-25 17:17:32 +00:00
* @ param string $signalclass class name of emitter
* @ param string $signalname name of signal
* @ param string $params defautl : array () array with additional data
* @ returns bool true if slots exists or false if not
2012-05-05 08:18:45 +00:00
*
* Emits a signal . To get data from the slot use references !
*
* TODO : write example
*/
2012-09-07 13:22:01 +00:00
static public function emitHook ( $signalclass , $signalname , $params = array ()) {
2012-05-05 08:18:45 +00:00
return ( \OC_Hook :: emit ( $signalclass , $signalname , $params ));
}
2012-05-01 20:59:38 +00:00
2012-06-09 13:05:14 +00:00
/**
2012-08-29 18:34:44 +00:00
* Register an get / post call . This is important to prevent CSRF attacks
2012-06-09 13:05:14 +00:00
* TODO : write example
*/
2012-09-07 13:22:01 +00:00
public static function callRegister () {
2012-06-09 13:05:14 +00:00
return ( \OC_Util :: callRegister ());
}
/**
* Check an ajax get / post call if the request token is valid . exit if not .
* Todo : Write howto
*/
2012-09-07 13:22:01 +00:00
public static function callCheck () {
2013-01-06 22:59:02 +00:00
\OC_Util :: callCheck ();
2012-06-09 13:05:14 +00:00
}
2012-07-02 18:24:26 +00:00
/**
* @ brief Used to sanitize HTML
*
2013-02-11 16:44:02 +00:00
* This function is used to sanitize HTML and should be applied on any
* string or array of strings before displaying it on a web page .
2012-07-02 18:24:26 +00:00
*
2012-12-25 17:17:32 +00:00
* @ param string | array of strings
2012-07-02 18:24:26 +00:00
* @ return array with sanitized strings or a single sinitized string , depends on the input parameter .
*/
2012-09-07 13:22:01 +00:00
public static function sanitizeHTML ( $value ) {
2012-07-02 18:24:26 +00:00
return ( \OC_Util :: sanitizeHTML ( $value ));
}
2013-07-04 16:21:49 +00:00
/**
* @ brief Public function to encode url parameters
*
* This function is used to encode path to file before output .
* Encoding is done according to RFC 3986 with one exception :
* Character '/' is preserved as is .
*
* @ param string $component part of URI to encode
* @ return string
*/
public static function encodePath ( $component ) {
return ( \OC_Util :: encodePath ( $component ));
}
2012-07-02 18:24:26 +00:00
/**
* @ brief Returns an array with all keys from input lowercased or uppercased . Numbered indices are left as is .
*
2012-12-25 17:17:32 +00:00
* @ param array $input The array to work on
* @ param int $case Either MB_CASE_UPPER or MB_CASE_LOWER ( default )
* @ param string $encoding The encoding parameter is the character encoding . Defaults to UTF - 8
2012-07-02 18:24:26 +00:00
* @ return array
*
*
*/
2012-09-07 13:22:01 +00:00
public static function mb_array_change_key_case ( $input , $case = MB_CASE_LOWER , $encoding = 'UTF-8' ) {
2012-07-02 18:24:26 +00:00
return ( \OC_Helper :: mb_array_change_key_case ( $input , $case , $encoding ));
}
/**
* @ brief replaces a copy of string delimited by the start and ( optionally ) length parameters with the string given in replacement .
*
2012-12-25 17:17:32 +00:00
* @ param string $input The input string . . Opposite to the PHP build - in function does not accept an array .
* @ param string $replacement The replacement string .
* @ param int $start If start is positive , the replacing will begin at the start 'th offset into string. If start is negative, the replacing will begin at the start' th character from the end of string .
* @ param int $length Length of the part to be replaced
* @ param string $encoding The encoding parameter is the character encoding . Defaults to UTF - 8
2012-07-02 18:24:26 +00:00
* @ return string
*
*/
public static function mb_substr_replace ( $string , $replacement , $start , $length = null , $encoding = 'UTF-8' ) {
return ( \OC_Helper :: mb_substr_replace ( $string , $replacement , $start , $length , $encoding ));
}
/**
* @ brief Replace all occurrences of the search string with the replacement string
*
2012-12-25 17:17:32 +00:00
* @ param string $search The value being searched for , otherwise known as the needle . String .
* @ param string $replace The replacement string .
* @ param string $subject The string or array being searched and replaced on , otherwise known as the haystack .
* @ param string $encoding The encoding parameter is the character encoding . Defaults to UTF - 8
* @ param int $count If passed , this will be set to the number of replacements performed .
2012-07-02 18:24:26 +00:00
* @ return string
*
*/
public static function mb_str_replace ( $search , $replace , $subject , $encoding = 'UTF-8' , & $count = null ) {
return ( \OC_Helper :: mb_str_replace ( $search , $replace , $subject , $encoding , $count ));
2012-06-19 15:20:19 +00:00
}
2012-07-24 08:54:56 +00:00
/**
* @ brief performs a search in a nested array
2012-12-25 17:17:32 +00:00
* @ param array $haystack the array to be searched
* @ param string $needle the search string
* @ param int $index optional , only search this key name
* @ return mixed the key of the matching field , otherwise false
2012-07-24 08:54:56 +00:00
*/
public static function recursiveArraySearch ( $haystack , $needle , $index = null ) {
return ( \OC_Helper :: recursiveArraySearch ( $haystack , $needle , $index ));
}
2012-12-20 16:16:01 +00:00
2013-01-18 19:09:03 +00:00
/**
* @ brief calculates the maximum upload size respecting system settings , free space and user quota
*
* @ param $dir the current folder where the user currently operates
* @ return number of bytes representing
*/
public static function maxUploadFilesize ( $dir ) {
return \OC_Helper :: maxUploadFilesize ( $dir );
}
2012-05-01 19:07:08 +00:00
}