2011-03-02 21:18:22 +00:00
< ? php
/**
2011-03-13 16:25:34 +00:00
* ownCloud
*
* @ author Frank Karlitschek
* @ author Jakob Sack
2012-05-26 17:14:24 +00:00
* @ copyright 2012 Frank Karlitschek frank @ owncloud . org
2011-03-13 16:25:34 +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 />.
*
*/
2011-03-02 21:18:22 +00:00
/**
2011-03-13 16:25:34 +00:00
* Collection of useful functions
2011-03-02 21:18:22 +00:00
*/
2011-07-29 19:36:03 +00:00
class OC_Helper {
2012-02-15 20:44:58 +00:00
private static $mimetypes = array ();
2012-02-28 10:16:19 +00:00
private static $tmpFiles = array ();
2013-05-29 13:43:41 +00:00
private static $mimetypeIcons = array ();
2012-04-13 20:59:47 +00:00
2012-09-12 16:00:33 +00:00
/**
* @ brief Creates an url using a defined route
* @ param $route
2013-01-04 22:00:51 +00:00
* @ param array $parameters
* @ return
* @ internal param array $args with param => value , will be appended to the returned url
2012-09-12 16:00:33 +00:00
* @ returns the url
*
* Returns a url to the given app and file .
*/
public static function linkToRoute ( $route , $parameters = array () ) {
$urlLinkTo = OC :: getRouter () -> generate ( $route , $parameters );
return $urlLinkTo ;
}
2011-03-02 21:18:22 +00:00
/**
2011-03-13 16:25:34 +00:00
* @ brief Creates an url
2012-09-23 00:39:11 +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-09-23 00:39:11 +00:00
* @ return string the url
2011-03-02 21:18:22 +00:00
*
2011-03-13 16:25:34 +00:00
* Returns a url to the given app and file .
2011-03-02 21:18:22 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function linkTo ( $app , $file , $args = array () ) {
if ( $app != '' ) {
2012-06-28 19:26:03 +00:00
$app_path = OC_App :: getAppPath ( $app );
2011-06-02 18:21:02 +00:00
// Check if the app is in the app folder
2012-09-07 13:22:01 +00:00
if ( $app_path && file_exists ( $app_path . '/' . $file )) {
if ( substr ( $file , - 3 ) == 'php' || substr ( $file , - 3 ) == 'css' ) {
2012-08-12 14:53:00 +00:00
$urlLinkTo = OC :: $WEBROOT . '/index.php/apps/' . $app ;
$urlLinkTo .= ( $file != 'index.php' ) ? '/' . $file : '' ;
2012-05-08 15:07:20 +00:00
} else {
2012-06-30 14:53:41 +00:00
$urlLinkTo = OC_App :: getAppWebPath ( $app ) . '/' . $file ;
2012-05-08 15:07:20 +00:00
}
2011-06-02 18:21:02 +00:00
}
2011-06-20 19:01:34 +00:00
else {
2012-06-28 19:26:03 +00:00
$urlLinkTo = OC :: $WEBROOT . '/' . $app . '/' . $file ;
2011-06-20 19:01:34 +00:00
}
2011-04-16 07:46:58 +00:00
}
2011-06-20 18:29:30 +00:00
else {
2012-09-07 13:22:01 +00:00
if ( file_exists ( OC :: $SERVERROOT . '/core/' . $file )) {
2011-09-18 17:37:54 +00:00
$urlLinkTo = OC :: $WEBROOT . '/core/' . $file ;
2011-06-20 19:01:34 +00:00
}
else {
2011-09-18 17:37:54 +00:00
$urlLinkTo = OC :: $WEBROOT . '/' . $file ;
2011-06-20 19:01:34 +00:00
}
2011-06-20 18:29:30 +00:00
}
2011-06-24 19:44:28 +00:00
2013-01-25 16:02:44 +00:00
if ( $args && $query = http_build_query ( $args , '' , '&' )) {
$urlLinkTo .= '?' . $query ;
2012-09-03 16:13:45 +00:00
}
2012-02-21 19:05:02 +00:00
return $urlLinkTo ;
2011-03-02 21:18:22 +00:00
}
2012-02-16 18:45:00 +00:00
/**
* @ brief Creates an absolute url
2012-09-23 00:39:11 +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-09-23 00:39:11 +00:00
* @ return string the url
2012-02-16 18:45:00 +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 () ) {
$urlLinkTo = self :: linkTo ( $app , $file , $args );
2012-08-06 20:15:55 +00:00
return self :: makeURLAbsolute ( $urlLinkTo );
}
/**
* @ brief Makes an $url absolute
2012-09-23 00:39:11 +00:00
* @ param string $url the url
* @ return string the absolute url
2012-08-06 20:15:55 +00:00
*
* Returns a absolute url to the given app and file .
*/
public static function makeURLAbsolute ( $url )
{
2012-08-06 20:16:45 +00:00
return OC_Request :: serverProtocol () . '://' . OC_Request :: serverHost () . $url ;
2012-02-16 18:45:00 +00:00
}
2012-10-17 08:52:16 +00:00
/**
* @ brief Creates an url for remote use
* @ param string $service id
* @ return string the url
*
* Returns a url to the given service .
*/
public static function linkToRemoteBase ( $service ) {
return self :: linkTo ( '' , 'remote.php' ) . '/' . $service ;
}
2012-05-07 18:22:55 +00:00
/**
* @ brief Creates an absolute url for remote use
2012-09-23 00:39:11 +00:00
* @ param string $service id
2013-01-04 22:00:51 +00:00
* @ param bool $add_slash
2012-09-23 00:39:11 +00:00
* @ return string the url
2012-05-07 18:22:55 +00:00
*
* Returns a absolute url to the given service .
*/
2012-05-14 15:57:43 +00:00
public static function linkToRemote ( $service , $add_slash = true ) {
2013-02-11 16:44:02 +00:00
return self :: makeURLAbsolute ( self :: linkToRemoteBase ( $service ))
. (( $add_slash && $service [ strlen ( $service ) - 1 ] != '/' ) ? '/' : '' );
2012-05-07 18:22:55 +00:00
}
2012-08-27 19:46:05 +00:00
/**
* @ brief Creates an absolute url for public use
2012-09-23 00:39:11 +00:00
* @ param string $service id
2013-01-04 22:00:51 +00:00
* @ param bool $add_slash
2012-09-23 00:39:11 +00:00
* @ return string the url
2012-08-27 19:46:05 +00:00
*
* Returns a absolute url to the given service .
*/
public static function linkToPublic ( $service , $add_slash = false ) {
2013-02-11 16:44:02 +00:00
return self :: linkToAbsolute ( '' , 'public.php' ) . '?service=' . $service
. (( $add_slash && $service [ strlen ( $service ) - 1 ] != '/' ) ? '/' : '' );
2012-08-27 19:46:05 +00:00
}
2011-03-02 21:18:22 +00:00
/**
2011-03-13 16:25:34 +00:00
* @ brief Creates path to an image
2012-09-23 00:39:11 +00:00
* @ param string $app app
* @ param string $image image name
* @ return string the url
2011-03-02 21:18:22 +00:00
*
2011-03-13 16:25:34 +00:00
* Returns the path to the image .
2011-03-02 21:18:22 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function imagePath ( $app , $image ) {
2012-02-27 17:01:43 +00:00
// Read the selected theme from the config file
2013-04-24 11:45:40 +00:00
$theme = OC_Util :: getTheme ();
2012-02-14 15:32:38 +00:00
2012-02-27 17:01:43 +00:00
// Check if the app is in the app folder
2012-09-07 13:22:01 +00:00
if ( file_exists ( OC :: $SERVERROOT . " /themes/ $theme /apps/ $app /img/ $image " )) {
2012-02-27 17:01:43 +00:00
return OC :: $WEBROOT . " /themes/ $theme /apps/ $app /img/ $image " ;
2012-09-07 13:22:01 +00:00
} elseif ( file_exists ( OC_App :: getAppPath ( $app ) . " /img/ $image " )) {
2012-06-03 21:13:30 +00:00
return OC_App :: getAppWebPath ( $app ) . " /img/ $image " ;
2012-09-07 13:22:01 +00:00
} elseif ( ! empty ( $app ) and file_exists ( OC :: $SERVERROOT . " /themes/ $theme / $app /img/ $image " )) {
2012-02-27 17:01:43 +00:00
return OC :: $WEBROOT . " /themes/ $theme / $app /img/ $image " ;
2012-09-07 13:22:01 +00:00
} elseif ( ! empty ( $app ) and file_exists ( OC :: $SERVERROOT . " / $app /img/ $image " )) {
2012-02-27 17:01:43 +00:00
return OC :: $WEBROOT . " / $app /img/ $image " ;
2012-09-07 13:22:01 +00:00
} elseif ( file_exists ( OC :: $SERVERROOT . " /themes/ $theme /core/img/ $image " )) {
2012-02-27 17:01:43 +00:00
return OC :: $WEBROOT . " /themes/ $theme /core/img/ $image " ;
2012-09-07 13:22:01 +00:00
} elseif ( file_exists ( OC :: $SERVERROOT . " /core/img/ $image " )) {
2012-02-27 17:01:43 +00:00
return OC :: $WEBROOT . " /core/img/ $image " ;
2012-02-28 15:14:12 +00:00
} else {
2013-07-21 20:29:50 +00:00
throw new RuntimeException ( 'image not found: image:' . $image . ' webroot:' . OC :: $WEBROOT . ' serverroot:' . OC :: $SERVERROOT );
2012-02-27 17:01:43 +00:00
}
}
2011-03-02 21:18:22 +00:00
/**
2011-08-11 16:59:01 +00:00
* @ brief get path to icon of file type
2012-09-23 00:39:11 +00:00
* @ param string $mimetype mimetype
* @ return string the url
2011-03-02 21:18:22 +00:00
*
2011-08-11 16:59:01 +00:00
* Returns the path to the image of this file type .
2011-03-02 21:18:22 +00:00
*/
2013-05-29 14:56:28 +00:00
public static function mimetypeIcon ( $mimetype ) {
2013-08-15 11:20:31 +00:00
$alias = array (
'application/xml' => 'code/xml' ,
'application/msword' => 'x-office/document' ,
'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'x-office/document' ,
'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => 'x-office/document' ,
'application/vnd.ms-word.document.macroEnabled.12' => 'x-office/document' ,
'application/vnd.ms-word.template.macroEnabled.12' => 'x-office/document' ,
'application/vnd.oasis.opendocument.text' => 'x-office/document' ,
'application/vnd.oasis.opendocument.text-template' => 'x-office/document' ,
'application/vnd.oasis.opendocument.text-web' => 'x-office/document' ,
'application/vnd.oasis.opendocument.text-master' => 'x-office/document' ,
'application/vnd.ms-powerpoint' => 'x-office/presentation' ,
'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'x-office/presentation' ,
'application/vnd.openxmlformats-officedocument.presentationml.template' => 'x-office/presentation' ,
'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'x-office/presentation' ,
'application/vnd.ms-powerpoint.addin.macroEnabled.12' => 'x-office/presentation' ,
'application/vnd.ms-powerpoint.presentation.macroEnabled.12' => 'x-office/presentation' ,
'application/vnd.ms-powerpoint.template.macroEnabled.12' => 'x-office/presentation' ,
'application/vnd.ms-powerpoint.slideshow.macroEnabled.12' => 'x-office/presentation' ,
'application/vnd.oasis.opendocument.presentation' => 'x-office/presentation' ,
'application/vnd.oasis.opendocument.presentation-template' => 'x-office/presentation' ,
'application/vnd.ms-excel' => 'x-office/spreadsheet' ,
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'x-office/spreadsheet' ,
'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'x-office/spreadsheet' ,
'application/vnd.ms-excel.sheet.macroEnabled.12' => 'x-office/spreadsheet' ,
'application/vnd.ms-excel.template.macroEnabled.12' => 'x-office/spreadsheet' ,
'application/vnd.ms-excel.addin.macroEnabled.12' => 'x-office/spreadsheet' ,
'application/vnd.ms-excel.sheet.binary.macroEnabled.12' => 'x-office/spreadsheet' ,
'application/vnd.oasis.opendocument.spreadsheet' => 'x-office/spreadsheet' ,
'application/vnd.oasis.opendocument.spreadsheet-template' => 'x-office/spreadsheet' ,
);
2013-05-29 14:56:28 +00:00
if ( isset ( $alias [ $mimetype ])) {
$mimetype = $alias [ $mimetype ];
2011-10-08 19:18:47 +00:00
}
2013-05-29 13:43:41 +00:00
if ( isset ( self :: $mimetypeIcons [ $mimetype ])) {
return self :: $mimetypeIcons [ $mimetype ];
}
2013-01-19 18:45:28 +00:00
// Replace slash and backslash with a minus
2013-05-29 14:56:28 +00:00
$icon = str_replace ( '/' , '-' , $mimetype );
$icon = str_replace ( '\\' , '-' , $icon );
2011-03-02 21:18:22 +00:00
// Is it a dir?
2013-05-29 14:56:28 +00:00
if ( $mimetype === 'dir' ) {
self :: $mimetypeIcons [ $mimetype ] = OC :: $WEBROOT . '/core/img/filetypes/folder.png' ;
return OC :: $WEBROOT . '/core/img/filetypes/folder.png' ;
2011-03-02 21:18:22 +00:00
}
// Icon exists?
2013-05-29 14:56:28 +00:00
if ( file_exists ( OC :: $SERVERROOT . '/core/img/filetypes/' . $icon . '.png' )) {
self :: $mimetypeIcons [ $mimetype ] = OC :: $WEBROOT . '/core/img/filetypes/' . $icon . '.png' ;
return OC :: $WEBROOT . '/core/img/filetypes/' . $icon . '.png' ;
2011-07-28 23:36:31 +00:00
}
2013-05-29 14:56:28 +00:00
// Try only the first part of the filetype
$mimePart = substr ( $icon , 0 , strpos ( $icon , '-' ));
if ( file_exists ( OC :: $SERVERROOT . '/core/img/filetypes/' . $mimePart . '.png' )) {
self :: $mimetypeIcons [ $mimetype ] = OC :: $WEBROOT . '/core/img/filetypes/' . $mimePart . '.png' ;
return OC :: $WEBROOT . '/core/img/filetypes/' . $mimePart . '.png' ;
} else {
self :: $mimetypeIcons [ $mimetype ] = OC :: $WEBROOT . '/core/img/filetypes/file.png' ;
return OC :: $WEBROOT . '/core/img/filetypes/file.png' ;
2011-03-02 21:18:22 +00:00
}
}
2011-03-02 21:28:32 +00:00
2013-06-26 16:04:18 +00:00
/**
* @ brief get path to preview of file
* @ param string $path path
* @ return string the url
*
* Returns the path to the preview of the file .
*/
public static function previewIcon ( $path ) {
2013-07-29 12:40:26 +00:00
return self :: linkToRoute ( 'core_ajax_preview' , array ( 'x' => 36 , 'y' => 36 , 'file' => urlencode ( $path ) ));
2013-06-26 16:04:18 +00:00
}
2013-07-30 10:29:12 +00:00
public static function publicPreviewIcon ( $path , $token ) {
2013-07-29 12:40:26 +00:00
return self :: linkToRoute ( 'core_ajax_public_preview' , array ( 'x' => 36 , 'y' => 36 , 'file' => urlencode ( $path ), 't' => $token ));
2013-07-11 09:58:52 +00:00
}
2011-03-02 21:28:32 +00:00
/**
2011-03-13 16:25:34 +00:00
* @ brief Make a human file size
2012-09-23 00:39:11 +00:00
* @ param int $bytes file size in bytes
* @ return string a human readable file size
2011-03-02 21:28:32 +00:00
*
2011-03-13 16:25:34 +00:00
* Makes 2048 to 2 kB .
2011-03-02 21:28:32 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function humanFileSize ( $bytes ) {
2013-01-14 22:39:31 +00:00
if ( $bytes < 0 ) {
$l = OC_L10N :: get ( 'lib' );
return $l -> t ( " couldn't be determined " );
}
2012-09-07 13:22:01 +00:00
if ( $bytes < 1024 ) {
2011-03-02 21:28:32 +00:00
return " $bytes B " ;
}
$bytes = round ( $bytes / 1024 , 1 );
2012-09-07 13:22:01 +00:00
if ( $bytes < 1024 ) {
2011-03-02 21:28:32 +00:00
return " $bytes kB " ;
}
$bytes = round ( $bytes / 1024 , 1 );
2012-09-07 13:22:01 +00:00
if ( $bytes < 1024 ) {
2011-03-02 21:28:32 +00:00
return " $bytes MB " ;
}
// Wow, heavy duty for owncloud
$bytes = round ( $bytes / 1024 , 1 );
return " $bytes GB " ;
}
2012-04-13 20:59:47 +00:00
2011-04-17 10:03:23 +00:00
/**
* @ brief Make a computer file size
2012-09-23 00:39:11 +00:00
* @ param string $str file size in a fancy format
* @ return int a file size in bytes
2011-04-17 10:03:23 +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 ) {
2011-12-11 22:33:24 +00:00
$str = strtolower ( $str );
2011-04-17 10:03:23 +00:00
$bytes_array = array (
2011-12-11 22:33:24 +00:00
'b' => 1 ,
'k' => 1024 ,
'kb' => 1024 ,
'mb' => 1024 * 1024 ,
'm' => 1024 * 1024 ,
'gb' => 1024 * 1024 * 1024 ,
'g' => 1024 * 1024 * 1024 ,
'tb' => 1024 * 1024 * 1024 * 1024 ,
't' => 1024 * 1024 * 1024 * 1024 ,
'pb' => 1024 * 1024 * 1024 * 1024 * 1024 ,
'p' => 1024 * 1024 * 1024 * 1024 * 1024 ,
2011-04-17 10:03:23 +00:00
);
$bytes = floatval ( $str );
2011-12-11 22:33:24 +00:00
if ( preg_match ( '#([kmgtp]?b?)$#si' , $str , $matches ) && ! empty ( $bytes_array [ $matches [ 1 ]])) {
2011-04-17 10:03:23 +00:00
$bytes *= $bytes_array [ $matches [ 1 ]];
}
2012-02-26 02:31:04 +00:00
$bytes = round ( $bytes , 2 );
2011-04-17 10:03:23 +00:00
2012-04-13 20:59:47 +00:00
return $bytes ;
2011-04-17 10:03:23 +00:00
}
2012-04-13 20:59:47 +00:00
2011-04-16 08:23:15 +00:00
/**
2012-09-23 00:39:11 +00:00
* @ brief Recursive editing of file permissions
* @ param string $path path to file or folder
* @ param int $filemode unix style file permissions
* @ return bool
2011-04-16 08:23:15 +00:00
*/
2011-04-24 13:23:18 +00:00
static function chmodr ( $path , $filemode ) {
2011-04-16 08:23:15 +00:00
if ( ! is_dir ( $path ))
return chmod ( $path , $filemode );
$dh = opendir ( $path );
while (( $file = readdir ( $dh )) !== false ) {
if ( $file != '.' && $file != '..' ) {
$fullpath = $path . '/' . $file ;
if ( is_link ( $fullpath ))
2012-10-23 06:01:09 +00:00
return false ;
2012-03-23 15:48:16 +00:00
elseif ( ! is_dir ( $fullpath ) && !@ chmod ( $fullpath , $filemode ))
2012-10-23 06:01:09 +00:00
return false ;
2011-04-24 13:23:18 +00:00
elseif ( ! self :: chmodr ( $fullpath , $filemode ))
2012-10-23 06:01:09 +00:00
return false ;
2011-04-16 08:23:15 +00:00
}
}
closedir ( $dh );
2011-08-06 21:31:38 +00:00
if ( @ chmod ( $path , $filemode ))
2012-10-23 06:01:09 +00:00
return true ;
2011-04-16 08:23:15 +00:00
else
2012-10-23 06:01:09 +00:00
return false ;
2011-04-16 08:23:15 +00:00
}
2011-05-28 15:33:25 +00:00
/**
2012-09-23 00:39:11 +00:00
* @ brief Recursive copying of folders
2011-05-28 15:33:25 +00:00
* @ param string $src source folder
* @ param string $dest target folder
*
*/
static function copyr ( $src , $dest ) {
2012-09-07 13:22:01 +00:00
if ( is_dir ( $src )) {
if ( ! is_dir ( $dest )) {
2011-05-28 15:33:25 +00:00
mkdir ( $dest );
}
$files = scandir ( $src );
2012-09-07 13:22:01 +00:00
foreach ( $files as $file ) {
if ( $file != " . " && $file != " .. " ) {
2011-05-28 15:33:25 +00:00
self :: copyr ( " $src / $file " , " $dest / $file " );
}
}
2013-01-06 23:16:10 +00:00
} elseif ( file_exists ( $src ) && ! \OC\Files\Filesystem :: isFileBlacklisted ( $src )) {
2011-05-28 15:33:25 +00:00
copy ( $src , $dest );
}
}
2012-04-13 20:59:47 +00:00
2011-05-28 15:33:25 +00:00
/**
2012-09-23 00:39:11 +00:00
* @ brief Recursive deletion of folders
2011-05-28 15:33:25 +00:00
* @ param string $dir path to the folder
2012-09-23 00:39:11 +00:00
* @ return bool
2011-05-28 15:33:25 +00:00
*/
static function rmdirr ( $dir ) {
if ( is_dir ( $dir )) {
$files = scandir ( $dir );
2012-09-07 13:22:01 +00:00
foreach ( $files as $file ) {
if ( $file != " . " && $file != " .. " ) {
2011-05-28 15:33:25 +00:00
self :: rmdirr ( " $dir / $file " );
}
}
rmdir ( $dir );
2012-09-07 13:22:01 +00:00
} elseif ( file_exists ( $dir )) {
2011-05-28 15:33:25 +00:00
unlink ( $dir );
}
2012-04-13 20:59:47 +00:00
if ( file_exists ( $dir )) {
return false ;
2012-09-23 00:39:11 +00:00
} else {
return true ;
2012-04-13 20:59:47 +00:00
}
2011-05-28 15:33:25 +00:00
}
2012-02-15 20:44:58 +00:00
/**
2013-06-06 21:51:44 +00:00
* Try to guess the mimetype based on filename
*
2013-06-06 22:17:51 +00:00
* @ param string $path
2012-02-15 20:44:58 +00:00
* @ return string
*/
2013-06-06 22:17:51 +00:00
static public function getFileNameMimeType ( $path ){
2012-10-28 22:58:08 +00:00
if ( strpos ( $path , '.' )) {
2012-07-21 23:49:42 +00:00
//try to guess the type by the file extension
2012-10-22 19:40:33 +00:00
if ( ! self :: $mimetypes || self :: $mimetypes != include 'mimetypes.list.php' ) {
self :: $mimetypes = include 'mimetypes.list.php' ;
2012-07-21 23:49:42 +00:00
}
$extension = strtolower ( strrchr ( basename ( $path ), " . " ));
2012-10-28 22:58:08 +00:00
$extension = substr ( $extension , 1 ); //remove leading .
2013-06-06 22:22:05 +00:00
return ( isset ( self :: $mimetypes [ $extension ])) ? self :: $mimetypes [ $extension ] : 'application/octet-stream' ;
2012-07-21 23:49:42 +00:00
} else {
2013-06-06 22:22:05 +00:00
return 'application/octet-stream' ;
2012-07-21 23:49:42 +00:00
}
2013-06-06 21:51:44 +00:00
}
/**
* get the mimetype form a local file
* @ param string $path
* @ return string
* does NOT work for ownClouds filesystem , use OC_FileSystem :: getMimeType instead
*/
static function getMimeType ( $path ) {
$isWrapped = ( strpos ( $path , '://' ) !== false ) and ( substr ( $path , 0 , 7 ) == 'file://' );
if ( @ is_dir ( $path )) {
// directories are easy
return " httpd/unix-directory " ;
}
$mimeType = self :: getFileNameMimeType ( $path );
2012-07-24 08:54:56 +00:00
2013-02-11 16:44:02 +00:00
if ( $mimeType == 'application/octet-stream' and function_exists ( 'finfo_open' )
and function_exists ( 'finfo_file' ) and $finfo = finfo_open ( FILEINFO_MIME )) {
2012-10-28 22:58:08 +00:00
$info = @ strtolower ( finfo_file ( $finfo , $path ));
2012-09-07 13:22:01 +00:00
if ( $info ) {
2012-11-02 18:53:02 +00:00
$mimeType = substr ( $info , 0 , strpos ( $info , ';' ));
2012-02-15 20:44:58 +00:00
}
finfo_close ( $finfo );
}
if ( ! $isWrapped and $mimeType == 'application/octet-stream' && function_exists ( " mime_content_type " )) {
// use mime magic extension if available
$mimeType = mime_content_type ( $path );
}
if ( ! $isWrapped and $mimeType == 'application/octet-stream' && OC_Helper :: canExecute ( " file " )) {
// it looks like we have a 'file' command,
2012-10-26 18:02:04 +00:00
// lets see if it does have mime support
2012-04-25 08:33:52 +00:00
$path = escapeshellarg ( $path );
2013-02-07 16:42:03 +00:00
$fp = popen ( " file -b --mime-type $path 2>/dev/null " , " r " );
2012-02-15 20:44:58 +00:00
$reply = fgets ( $fp );
pclose ( $fp );
2013-02-07 16:42:03 +00:00
//trim the newline
$mimeType = trim ( $reply );
2012-06-18 21:33:02 +00:00
2012-02-15 20:44:58 +00:00
}
return $mimeType ;
}
2012-04-13 20:59:47 +00:00
2012-04-18 18:24:22 +00:00
/**
* get the mimetype form a data string
2012-09-23 00:39:11 +00:00
* @ param string $data
2012-04-18 18:24:22 +00:00
* @ return string
*/
2012-09-07 13:22:01 +00:00
static function getStringMimeType ( $data ) {
if ( function_exists ( 'finfo_open' ) and function_exists ( 'finfo_file' )) {
2012-04-18 18:24:22 +00:00
$finfo = finfo_open ( FILEINFO_MIME );
return finfo_buffer ( $finfo , $data );
} else {
$tmpFile = OC_Helper :: tmpFile ();
2012-10-28 22:58:08 +00:00
$fh = fopen ( $tmpFile , 'wb' );
fwrite ( $fh , $data , 8024 );
2012-04-18 18:24:22 +00:00
fclose ( $fh );
$mime = self :: getMimeType ( $tmpFile );
unset ( $tmpFile );
return $mime ;
}
}
2011-05-17 20:34:31 +00:00
/**
* @ brief Checks $_REQUEST contains a var for the $s key . If so , returns the html - escaped value of this var ; otherwise returns the default value provided by $d .
2012-09-23 00:39:11 +00:00
* @ param string $s name of the var to escape , if set .
* @ param string $d default value .
* @ return string the print - safe value .
2011-05-17 20:34:31 +00:00
*
*/
2012-04-13 20:59:47 +00:00
2011-05-17 20:34:31 +00:00
//FIXME: should also check for value validation (i.e. the email is an email).
public static function init_var ( $s , $d = " " ) {
$r = $d ;
2013-02-10 13:09:49 +00:00
if ( isset ( $_REQUEST [ $s ]) && ! empty ( $_REQUEST [ $s ])) {
2013-02-10 13:03:40 +00:00
$r = OC_Util :: sanitizeHTML ( $_REQUEST [ $s ]);
2013-02-10 13:09:49 +00:00
}
2012-04-13 20:59:47 +00:00
2011-05-17 20:34:31 +00:00
return $r ;
}
2012-04-13 20:59:47 +00:00
2011-09-30 16:22:12 +00:00
/**
2013-02-11 16:44:02 +00:00
* returns " checked " - attribute if request contains selected radio element
* OR if radio element is the default one -- maybe ?
2011-09-30 16:22:12 +00:00
* @ param string $s Name of radio - button element name
* @ param string $v Value of current radio - button element
* @ param string $d Value of default radio - button element
*/
2011-05-17 20:34:31 +00:00
public static function init_radio ( $s , $v , $d ) {
2011-09-30 16:22:12 +00:00
if (( isset ( $_REQUEST [ $s ]) && $_REQUEST [ $s ] == $v ) || ( ! isset ( $_REQUEST [ $s ]) && $v == $d ))
2011-05-17 20:34:31 +00:00
print " checked= \" checked \" " ;
}
2011-07-28 18:10:58 +00:00
/**
2013-01-04 22:00:51 +00:00
* detect if a given program is found in the search PATH
*
* @ param $name
* @ param bool $path
* @ internal param string $program name
* @ internal param string $optional search path , defaults to $PATH
* @ return bool true if executable program found in path
*/
2012-09-07 13:22:01 +00:00
public static function canExecute ( $name , $path = false ) {
2011-07-28 18:10:58 +00:00
// path defaults to PATH from environment if not set
if ( $path === false ) {
$path = getenv ( " PATH " );
}
// check method depends on operating system
if ( ! strncmp ( PHP_OS , " WIN " , 3 )) {
// on Windows an appropriate COM or EXE file needs to exist
$exts = array ( " .exe " , " .com " );
$check_fn = " file_exists " ;
} else {
// anywhere else we look for an executable file of that name
$exts = array ( " " );
$check_fn = " is_executable " ;
}
// Default check will be done with $path directories :
$dirs = explode ( PATH_SEPARATOR , $path );
// WARNING : We have to check if open_basedir is enabled :
$obd = ini_get ( 'open_basedir' );
2012-11-04 09:46:32 +00:00
if ( $obd != " none " ) {
2011-07-28 18:10:58 +00:00
$obd_values = explode ( PATH_SEPARATOR , $obd );
2012-11-04 09:46:32 +00:00
if ( count ( $obd_values ) > 0 and $obd_values [ 0 ]) {
2012-09-23 00:39:11 +00:00
// open_basedir is in effect !
// We need to check if the program is in one of these dirs :
$dirs = $obd_values ;
}
}
2012-11-04 09:46:32 +00:00
foreach ( $dirs as $dir ) {
foreach ( $exts as $ext ) {
2011-07-28 18:10:58 +00:00
if ( $check_fn ( " $dir / $name " . $ext ))
return true ;
}
}
return false ;
}
2012-04-13 20:59:47 +00:00
2012-02-27 11:04:04 +00:00
/**
* copy the contents of one stream to another
2012-09-23 00:39:11 +00:00
* @ param resource $source
* @ param resource $target
2012-02-27 11:04:04 +00:00
* @ return int the number of bytes copied
*/
2012-11-02 18:53:02 +00:00
public static function streamCopy ( $source , $target ) {
2012-09-07 13:22:01 +00:00
if ( ! $source or ! $target ) {
2012-02-27 11:04:04 +00:00
return false ;
}
2013-02-22 15:43:11 +00:00
$result = true ;
$count = 0 ;
2012-09-07 13:22:01 +00:00
while ( ! feof ( $source )) {
2013-02-22 15:45:57 +00:00
if ( ( $c = fwrite ( $target , fread ( $source , 8192 )) ) === false ) {
2013-02-22 13:56:50 +00:00
$result = false ;
2013-02-22 15:43:11 +00:00
} else {
$count += $c ;
2013-02-22 13:56:50 +00:00
}
2012-02-27 11:04:04 +00:00
}
2013-02-22 15:43:11 +00:00
return array ( $count , $result );
2012-02-27 11:04:04 +00:00
}
2012-04-13 20:59:47 +00:00
2012-02-28 10:16:19 +00:00
/**
* create a temporary file with an unique filename
2012-09-23 00:39:11 +00:00
* @ param string $postfix
2012-02-28 10:16:19 +00:00
* @ return string
*
* temporary files are automatically cleaned up after the script is finished
*/
2012-09-07 13:22:01 +00:00
public static function tmpFile ( $postfix = '' ) {
2012-02-28 10:32:45 +00:00
$file = get_temp_dir () . '/' . md5 ( time () . rand ()) . $postfix ;
2012-10-28 22:58:08 +00:00
$fh = fopen ( $file , 'w' );
2012-02-28 10:32:45 +00:00
fclose ( $fh );
2012-02-28 10:16:19 +00:00
self :: $tmpFiles [] = $file ;
return $file ;
}
2012-03-28 20:30:55 +00:00
2012-10-18 22:11:20 +00:00
/**
2013-03-20 21:37:02 +00:00
* move a file to oc - noclean temp dir
* @ param string $filename
* @ return mixed
2012-10-18 22:11:20 +00:00
*
*/
2013-03-20 21:37:02 +00:00
public static function moveToNoClean ( $filename = '' ) {
if ( $filename == '' ) {
return false ;
}
2012-10-18 22:11:20 +00:00
$tmpDirNoClean = get_temp_dir () . '/oc-noclean/' ;
if ( ! file_exists ( $tmpDirNoClean ) || ! is_dir ( $tmpDirNoClean )) {
2012-10-30 22:37:31 +00:00
if ( file_exists ( $tmpDirNoClean )) {
2012-10-18 22:11:20 +00:00
unlink ( $tmpDirNoClean );
2012-10-30 22:37:31 +00:00
}
2012-10-18 22:11:20 +00:00
mkdir ( $tmpDirNoClean );
}
2013-03-20 21:37:02 +00:00
$newname = $tmpDirNoClean . basename ( $filename );
if ( rename ( $filename , $newname )) {
return $newname ;
} else {
return false ;
}
2012-10-18 22:11:20 +00:00
}
2013-01-14 19:30:39 +00:00
2012-03-28 20:30:55 +00:00
/**
* create a temporary folder with an unique filename
* @ return string
*
* temporary files are automatically cleaned up after the script is finished
*/
2012-09-07 13:22:01 +00:00
public static function tmpFolder () {
2012-03-28 20:30:55 +00:00
$path = get_temp_dir () . '/' . md5 ( time () . rand ());
mkdir ( $path );
self :: $tmpFiles [] = $path ;
return $path . '/' ;
}
2012-04-13 20:59:47 +00:00
2012-02-28 10:16:19 +00:00
/**
* remove all files created by self :: tmpFile
*/
2012-09-07 13:22:01 +00:00
public static function cleanTmp () {
2012-05-30 12:14:32 +00:00
$leftoversFile = get_temp_dir () . '/oc-not-deleted' ;
2012-09-07 13:22:01 +00:00
if ( file_exists ( $leftoversFile )) {
2012-04-13 20:59:47 +00:00
$leftovers = file ( $leftoversFile );
foreach ( $leftovers as $file ) {
self :: rmdirr ( $file );
}
unlink ( $leftoversFile );
}
2012-09-07 13:22:01 +00:00
foreach ( self :: $tmpFiles as $file ) {
if ( file_exists ( $file )) {
2012-04-13 20:59:47 +00:00
if ( ! self :: rmdirr ( $file )) {
file_put_contents ( $leftoversFile , $file . " \n " , FILE_APPEND );
}
2012-02-28 10:16:19 +00:00
}
}
}
2012-04-15 14:59:39 +00:00
2012-10-18 22:11:20 +00:00
/**
2013-06-06 21:51:44 +00:00
* remove all files in PHP / oc - noclean temp dir
2012-10-18 22:11:20 +00:00
*/
public static function cleanTmpNoClean () {
$tmpDirNoCleanFile = get_temp_dir () . '/oc-noclean/' ;
if ( file_exists ( $tmpDirNoCleanFile )) {
self :: rmdirr ( $tmpDirNoCleanFile );
}
}
2012-06-14 10:57:30 +00:00
/**
* Adds a suffix to the name in case the file exists
*
* @ param $path
* @ param $filename
* @ return string
*/
2012-09-07 13:22:01 +00:00
public static function buildNotExistingFileName ( $path , $filename ) {
2013-03-08 13:22:04 +00:00
$view = \OC\Files\Filesystem :: getView ();
return self :: buildNotExistingFileNameForView ( $path , $filename , $view );
}
/**
* Adds a suffix to the name in case the file exists
*
* @ param $path
* @ param $filename
* @ return string
*/
public static function buildNotExistingFileNameForView ( $path , $filename , \OC\Files\View $view ) {
2012-09-07 13:22:01 +00:00
if ( $path === '/' ) {
2012-06-14 10:57:30 +00:00
$path = '' ;
}
if ( $pos = strrpos ( $filename , '.' )) {
$name = substr ( $filename , 0 , $pos );
$ext = substr ( $filename , $pos );
} else {
$name = $filename ;
2012-09-23 00:39:11 +00:00
$ext = '' ;
2012-06-14 10:57:30 +00:00
}
$newpath = $path . '/' . $filename ;
2013-07-05 13:38:09 +00:00
if ( $view -> file_exists ( $newpath )) {
if ( preg_match_all ( '/\((\d+)\)/' , $name , $matches , PREG_OFFSET_CAPTURE )) {
//Replace the last "(number)" with "(number+1)"
$last_match = count ( $matches [ 0 ]) - 1 ;
$counter = $matches [ 1 ][ $last_match ][ 0 ] + 1 ;
$offset = $matches [ 0 ][ $last_match ][ 1 ];
$match_length = strlen ( $matches [ 0 ][ $last_match ][ 0 ]);
} else {
$counter = 2 ;
$offset = false ;
}
do {
if ( $offset ) {
//Replace the last "(number)" with "(number+1)"
$newname = substr_replace ( $name , '(' . $counter . ')' , $offset , $match_length );
} else {
$newname = $name . ' (' . $counter . ')' ;
}
$newpath = $path . '/' . $newname . $ext ;
$counter ++ ;
} while ( $view -> file_exists ( $newpath ));
2012-06-14 10:57:30 +00:00
}
return $newpath ;
}
2012-07-02 18:24:26 +00:00
2013-01-13 13:54:18 +00:00
/**
2013-01-13 13:50:31 +00:00
* @ brief Checks if $sub is a subdirectory of $parent
2012-07-02 18:24:26 +00:00
*
2012-09-23 00:39:11 +00:00
* @ param string $sub
* @ param string $parent
2012-04-18 06:20:51 +00:00
* @ return bool
*/
2012-09-07 13:22:01 +00:00
public static function issubdirectory ( $sub , $parent ) {
2013-01-14 15:51:31 +00:00
if ( strpos ( realpath ( $sub ), realpath ( $parent )) === 0 ) {
2013-01-13 13:33:19 +00:00
return true ;
2012-04-26 15:55:00 +00:00
}
return false ;
2012-04-18 06:20:51 +00:00
}
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-09-23 00:39:11 +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
*
* Returns an array with all keys from input lowercased or uppercased . Numbered indices are left as is .
* based on http :// www . php . net / manual / en / function . array - change - key - case . php #107715
*
*/
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
$case = ( $case != MB_CASE_UPPER ) ? MB_CASE_LOWER : MB_CASE_UPPER ;
$ret = array ();
foreach ( $input as $k => $v ) {
$ret [ mb_convert_case ( $k , $case , $encoding )] = $v ;
}
return $ret ;
}
/**
2013-01-04 22:00:51 +00:00
* @ brief replaces a copy of string delimited by the start and ( optionally ) length parameters with the string given in replacement .
*
* @ param $string
* @ 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
* @ internal param string $input The input string . . Opposite to the PHP build - in function does not accept an array .
* @ return string
*/
2012-07-02 18:24:26 +00:00
public static function mb_substr_replace ( $string , $replacement , $start , $length = null , $encoding = 'UTF-8' ) {
$start = intval ( $start );
$length = intval ( $length );
$string = mb_substr ( $string , 0 , $start , $encoding ) .
2013-01-18 19:09:03 +00:00
$replacement .
mb_substr ( $string , $start + $length , mb_strlen ( $string , 'UTF-8' ) - $start , $encoding );
2012-07-02 18:24:26 +00:00
return $string ;
}
/**
* @ brief Replace all occurrences of the search string with the replacement string
*
2012-09-23 00:39:11 +00:00
* @ param string $search The value being searched for , otherwise known as the needle .
* @ param string $replace The replacement
* @ 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 ) {
$offset = - 1 ;
2012-07-20 15:51:50 +00:00
$length = mb_strlen ( $search , $encoding );
2012-09-18 14:14:04 +00:00
while (( $i = mb_strrpos ( $subject , $search , $offset , $encoding )) !== false ) {
2012-07-02 18:24:26 +00:00
$subject = OC_Helper :: mb_substr_replace ( $subject , $replace , $i , $length );
2012-10-11 10:42:57 +00:00
$offset = $i - mb_strlen ( $subject , $encoding );
2012-07-02 18:24:26 +00:00
$count ++ ;
}
return $subject ;
}
2012-07-24 08:54:56 +00:00
/**
* @ brief performs a search in a nested array
2012-09-23 00:39:11 +00:00
* @ param array $haystack the array to be searched
* @ param string $needle the search string
* @ param string $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
*
* performs a search in a nested array
*
* taken from http :// www . php . net / manual / en / function . array - search . php #97645
*/
public static function recursiveArraySearch ( $haystack , $needle , $index = null ) {
$aIt = new RecursiveArrayIterator ( $haystack );
$it = new RecursiveIteratorIterator ( $aIt );
while ( $it -> valid ()) {
if ((( isset ( $index ) AND ( $it -> key () == $index )) OR ( ! isset ( $index ))) AND ( $it -> current () == $needle )) {
return $aIt -> key ();
}
$it -> next ();
}
return false ;
}
2012-11-12 12:56:29 +00:00
2012-11-12 13:04:23 +00:00
/**
* Shortens str to maxlen by replacing characters in the middle with '...' , eg .
* ellipsis ( 'a very long string with lots of useless info to make a better example' , 14 ) becomes 'a very ...example'
* @ param string $str the string
* @ param string $maxlen the maximum length of the result
* @ return string with at most maxlen characters
*/
2012-11-12 12:56:29 +00:00
public static function ellipsis ( $str , $maxlen ) {
if ( strlen ( $str ) > $maxlen ) {
$characters = floor ( $maxlen / 2 );
return substr ( $str , 0 , $characters ) . '...' . substr ( $str , - 1 * $characters );
}
return $str ;
}
2013-01-04 22:00:51 +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 ) {
$upload_max_filesize = OCP\Util :: computerFileSize ( ini_get ( 'upload_max_filesize' ));
$post_max_size = OCP\Util :: computerFileSize ( ini_get ( 'post_max_size' ));
2013-03-15 15:40:36 +00:00
$freeSpace = \OC\Files\Filesystem :: free_space ( $dir );
2013-06-13 07:18:50 +00:00
if (( int ) $upload_max_filesize === 0 and ( int ) $post_max_size === 0 ) {
2013-03-15 15:31:35 +00:00
$maxUploadFilesize = \OC\Files\FREE_SPACE_UNLIMITED ;
2013-06-13 07:18:50 +00:00
} elseif (( int ) $upload_max_filesize === 0 or ( int ) $post_max_size === 0 ) {
2013-03-15 15:31:35 +00:00
$maxUploadFilesize = max ( $upload_max_filesize , $post_max_size ); //only the non 0 value counts
} else {
$maxUploadFilesize = min ( $upload_max_filesize , $post_max_size );
}
2012-12-20 16:16:01 +00:00
2013-02-16 02:27:50 +00:00
if ( $freeSpace !== \OC\Files\FREE_SPACE_UNKNOWN ){
$freeSpace = max ( $freeSpace , 0 );
2012-12-20 16:16:01 +00:00
2013-02-16 02:27:50 +00:00
return min ( $maxUploadFilesize , $freeSpace );
} else {
return $maxUploadFilesize ;
}
2013-01-18 19:09:03 +00:00
}
2013-01-06 21:40:35 +00:00
2013-01-04 22:00:51 +00:00
/**
* Checks if a function is available
* @ param string $function_name
* @ return bool
*/
public static function is_function_enabled ( $function_name ) {
if ( ! function_exists ( $function_name )) {
return false ;
}
$disabled = explode ( ', ' , ini_get ( 'disable_functions' ));
if ( in_array ( $function_name , $disabled )) {
return false ;
}
$disabled = explode ( ', ' , ini_get ( 'suhosin.executor.func.blacklist' ));
if ( in_array ( $function_name , $disabled )) {
return false ;
}
return true ;
}
2013-01-06 11:18:21 +00:00
2013-01-02 13:35:45 +00:00
/**
* Calculate the disc space
*/
public static function getStorageInfo () {
2013-01-26 20:16:53 +00:00
$rootInfo = \OC\Files\Filesystem :: getFileInfo ( '/' );
2013-01-02 13:35:45 +00:00
$used = $rootInfo [ 'size' ];
if ( $used < 0 ) {
$used = 0 ;
}
2013-01-26 20:16:53 +00:00
$free = \OC\Files\Filesystem :: free_space ();
2013-03-15 15:46:20 +00:00
if ( $free >= 0 ){
$total = $free + $used ;
} else {
$total = $free ; //either unknown or unlimited
}
2013-01-02 13:35:45 +00:00
if ( $total == 0 ) {
$total = 1 ; // prevent division by zero
}
2013-03-15 15:46:20 +00:00
if ( $total >= 0 ){
$relative = round (( $used / $total ) * 10000 ) / 100 ;
} else {
$relative = 0 ;
}
2013-01-02 13:35:45 +00:00
return array ( 'free' => $free , 'used' => $used , 'total' => $total , 'relative' => $relative );
}
2011-03-02 21:18:22 +00:00
}