2011-07-27 17:07:28 +00:00
< ? php
/**
2015-03-26 10:44:34 +00:00
* @ author Adam Williamson < awilliam @ redhat . com >
2016-01-12 14:02:16 +00:00
* @ author Andreas Böhler < dev @ aboehler . at >
2015-03-26 10:44:34 +00:00
* @ author Andreas Fischer < bantu @ owncloud . com >
* @ author Arthur Schiwon < blizzz @ owncloud . com >
* @ author Bart Visscher < bartv @ thisnet . nl >
* @ author Bernhard Posselt < dev @ bernhard - posselt . com >
* @ author Birk Borkason < daniel . niccoli @ gmail . com >
* @ author Björn Schießle < schiessle @ owncloud . com >
* @ author Brice Maron < brice @ bmaron . net >
* @ author Christopher Schäpers < kondou @ ts . unde . re >
* @ author Clark Tomlinson < fallen013 @ gmail . com >
2015-06-25 09:43:55 +00:00
* @ author cmeh < cmeh @ users . noreply . github . com >
2015-03-26 10:44:34 +00:00
* @ author Florin Peter < github @ florin - peter . de >
* @ author Frank Karlitschek < frank @ owncloud . org >
* @ author Georg Ehrke < georg @ owncloud . com >
* @ author helix84 < helix84 @ centrum . sk >
2015-10-05 18:54:56 +00:00
* @ author Individual IT Services < info @ individual - it . net >
2015-03-26 10:44:34 +00:00
* @ author Jakob Sack < mail @ jakobsack . de >
* @ author Joas Schilling < nickvergessen @ owncloud . com >
* @ author Jörn Friedrich Dreyer < jfd @ butonic . de >
* @ author Lukas Reschke < lukas @ owncloud . com >
* @ author Markus Goetz < markus @ woboq . com >
2015-10-05 18:54:56 +00:00
* @ author Martin Mattel < martin . mattel @ diemattels . at >
2015-03-26 10:44:34 +00:00
* @ author Marvin Thomas Rabe < mrabe @ marvinrabe . de >
* @ author Michael Gapczynski < GapczynskiM @ gmail . com >
* @ author Michael Göhler < somebody . here @ gmx . de >
* @ author Morris Jobke < hey @ morrisjobke . de >
* @ author Robin Appelman < icewind @ owncloud . com >
2016-01-12 14:02:16 +00:00
* @ author Robin McCorkell < robin @ mccorkell . me . uk >
* @ author Roeland Jago Douma < rullzer @ owncloud . com >
2015-03-26 10:44:34 +00:00
* @ author Stefan Rado < owncloud @ sradonia . net >
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
* @ author Thomas Schmidt < tschmidt @ suse . de >
* @ author Thomas Tanghus < thomas @ tanghus . net >
* @ author Victor Dubiniuk < dubiniuk @ owncloud . com >
2016-03-01 16:25:15 +00:00
* @ author Vincent Chan < plus . vincchan @ gmail . com >
2015-03-26 10:44:34 +00:00
* @ author Vincent Petry < pvince81 @ owncloud . com >
* @ author Volkan Gezer < volkangezer @ gmail . com >
*
2016-01-12 14:02:16 +00:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
2015-03-26 10:44:34 +00:00
* @ license AGPL - 3.0
*
* This code is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License , version 3 ,
* as published by the Free Software Foundation .
*
* This program 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 , version 3 ,
* along with this program . If not , see < http :// www . gnu . org / licenses />
2011-07-27 17:07:28 +00:00
*
*/
2015-11-19 14:35:58 +00:00
use OCP\IConfig ;
use OCP\IGroupManager ;
use OCP\IUser ;
2011-07-29 19:36:03 +00:00
class OC_Util {
2014-08-19 16:01:26 +00:00
public static $scripts = array ();
public static $styles = array ();
public static $headers = array ();
private static $rootMounted = false ;
private static $fsSetup = false ;
2011-07-27 17:07:28 +00:00
2015-02-18 13:24:50 +00:00
protected static function getAppManager () {
return \OC :: $server -> getAppManager ();
}
2014-04-25 12:34:47 +00:00
private static function initLocalStorageRootFS () {
// mount local file backend as root
2015-12-18 10:42:09 +00:00
$configDataDirectory = \OC :: $server -> getSystemConfig () -> getValue ( " datadirectory " , OC :: $SERVERROOT . " /data " );
2014-04-25 12:34:47 +00:00
//first set up the local "root" storage
2015-04-02 11:28:36 +00:00
\OC\Files\Filesystem :: initMountManager ();
2014-08-19 16:01:26 +00:00
if ( ! self :: $rootMounted ) {
\OC\Files\Filesystem :: mount ( '\OC\Files\Storage\Local' , array ( 'datadir' => $configDataDirectory ), '/' );
2014-04-25 12:34:47 +00:00
self :: $rootMounted = true ;
}
}
2014-07-23 14:42:33 +00:00
2014-04-25 12:34:47 +00:00
/**
* mounting an object storage as the root fs will in essence remove the
* necessity of a data folder being present .
* TODO make home storage aware of this and use the object storage instead of local disk access
2014-08-19 16:01:26 +00:00
*
2014-04-25 12:34:47 +00:00
* @ param array $config containing 'class' and optional 'arguments'
*/
2014-06-11 11:55:11 +00:00
private static function initObjectStoreRootFS ( $config ) {
2014-04-25 12:34:47 +00:00
// check misconfiguration
if ( empty ( $config [ 'class' ])) {
2014-06-17 20:06:56 +00:00
\OCP\Util :: writeLog ( 'files' , 'No class given for objectstore' , \OCP\Util :: ERROR );
2014-04-25 12:34:47 +00:00
}
if ( ! isset ( $config [ 'arguments' ])) {
$config [ 'arguments' ] = array ();
}
2014-06-17 20:06:56 +00:00
// instantiate object store implementation
$config [ 'arguments' ][ 'objectstore' ] = new $config [ 'class' ]( $config [ 'arguments' ]);
// mount with plain / root object store implementation
$config [ 'class' ] = '\OC\Files\ObjectStore\ObjectStoreStorage' ;
2014-04-25 12:34:47 +00:00
// mount object storage as root
2015-04-02 11:28:36 +00:00
\OC\Files\Filesystem :: initMountManager ();
2014-08-19 16:01:26 +00:00
if ( ! self :: $rootMounted ) {
2014-04-25 12:34:47 +00:00
\OC\Files\Filesystem :: mount ( $config [ 'class' ], $config [ 'arguments' ], '/' );
self :: $rootMounted = true ;
}
}
2014-07-23 14:42:33 +00:00
2013-08-15 06:49:19 +00:00
/**
2014-05-19 15:50:53 +00:00
* Can be set up
2014-08-19 16:01:26 +00:00
*
2013-08-23 05:30:42 +00:00
* @ param string $user
2013-08-15 06:49:19 +00:00
* @ return boolean
2013-08-18 08:33:09 +00:00
* @ description configure the initial filesystem based on the configuration
2013-08-15 06:49:19 +00:00
*/
2014-08-19 16:01:26 +00:00
public static function setupFS ( $user = '' ) {
2013-08-18 08:33:09 +00:00
//setting up the filesystem twice can only lead to trouble
2014-08-19 16:01:26 +00:00
if ( self :: $fsSetup ) {
2011-07-27 17:07:28 +00:00
return false ;
}
2014-10-03 20:13:55 +00:00
\OC :: $server -> getEventLogger () -> start ( 'setup_fs' , 'Setup filesystem' );
2012-08-29 19:35:55 +00:00
// If we are not forced to load a specific user we load the one that is logged in
2016-02-18 08:21:32 +00:00
if ( $user === null ) {
$user = '' ;
} else if ( $user == " " && OC_User :: isLoggedIn ()) {
2012-08-29 19:35:55 +00:00
$user = OC_User :: getUser ();
}
2012-10-28 12:47:53 +00:00
// load all filesystem apps before, so no setup-hook gets lost
2014-02-06 09:04:18 +00:00
OC_App :: loadApps ( array ( 'filesystem' ));
2012-10-28 12:47:53 +00:00
2012-08-29 19:35:55 +00:00
// the filesystem will finish when $user is not empty,
// mark fs setup here to avoid doing the setup from loading
// OC_Filesystem
if ( $user != '' ) {
2014-08-19 16:01:26 +00:00
self :: $fsSetup = true ;
2012-08-29 19:35:55 +00:00
}
2015-04-02 11:28:36 +00:00
\OC\Files\Filesystem :: initMountManager ();
2015-04-01 15:12:06 +00:00
\OC\Files\Filesystem :: addStorageWrapper ( 'mount_options' , function ( $mountPoint , \OCP\Files\Storage $storage , \OCP\Files\Mount\IMountPoint $mount ) {
if ( $storage -> instanceOfStorage ( '\OC\Files\Storage\Common' )) {
/** @var \OC\Files\Storage\Common $storage */
$storage -> setMountOptions ( $mount -> getOptions ());
}
return $storage ;
});
2015-12-02 15:23:50 +00:00
\OC\Files\Filesystem :: addStorageWrapper ( 'enable_sharing' , function ( $mountPoint , \OCP\Files\Storage $storage , \OCP\Files\Mount\IMountPoint $mount ) {
if ( ! $mount -> getOption ( 'enable_sharing' , true )) {
return new \OC\Files\Storage\Wrapper\PermissionsMask ([
'storage' => $storage ,
'mask' => \OCP\Constants :: PERMISSION_ALL - \OCP\Constants :: PERMISSION_SHARE
]);
}
return $storage ;
});
2015-01-23 21:53:21 +00:00
// install storage availability wrapper, before most other wrappers
\OC\Files\Filesystem :: addStorageWrapper ( 'oc_availability' , function ( $mountPoint , $storage ) {
2016-03-08 10:23:20 +00:00
if ( ! $storage -> instanceOfStorage ( '\OC\Files\Storage\Shared' ) && ! $storage -> isLocal ()) {
2015-01-23 21:53:21 +00:00
return new \OC\Files\Storage\Wrapper\Availability ([ 'storage' => $storage ]);
}
return $storage ;
});
2015-04-01 15:12:06 +00:00
\OC\Files\Filesystem :: addStorageWrapper ( 'oc_quota' , function ( $mountPoint , $storage ) {
// set up quota for home storages, even for other users
// which can happen when using sharing
/**
* @ var \OC\Files\Storage\Storage $storage
*/
if ( $storage -> instanceOfStorage ( '\OC\Files\Storage\Home' )
|| $storage -> instanceOfStorage ( '\OC\Files\ObjectStore\HomeObjectStoreStorage' )
) {
/** @var \OC\Files\Storage\Home $storage */
if ( is_object ( $storage -> getUser ())) {
$user = $storage -> getUser () -> getUID ();
$quota = OC_Util :: getUserQuota ( $user );
if ( $quota !== \OCP\Files\FileInfo :: SPACE_UNLIMITED ) {
return new \OC\Files\Storage\Wrapper\Quota ( array ( 'storage' => $storage , 'quota' => $quota , 'root' => 'files' ));
}
}
}
return $storage ;
});
OC_Hook :: emit ( 'OC_Filesystem' , 'preSetup' , array ( 'user' => $user ));
2014-04-25 12:34:47 +00:00
//check if we are using an object storage
2015-12-18 10:42:09 +00:00
$objectStore = \OC :: $server -> getSystemConfig () -> getValue ( 'objectstore' , null );
2014-08-19 16:01:26 +00:00
if ( isset ( $objectStore )) {
2014-06-13 13:49:40 +00:00
self :: initObjectStoreRootFS ( $objectStore );
2014-04-25 12:34:47 +00:00
} else {
self :: initLocalStorageRootFS ();
2012-02-05 22:49:22 +00:00
}
2012-06-20 06:57:21 +00:00
2014-01-21 10:32:30 +00:00
if ( $user != '' && ! OCP\User :: userExists ( $user )) {
2014-10-03 20:13:55 +00:00
\OC :: $server -> getEventLogger () -> end ( 'setup_fs' );
2014-01-21 10:32:30 +00:00
return false ;
}
2013-08-23 05:30:42 +00:00
//if we aren't logged in, there is no use to set up the filesystem
2014-08-19 16:01:26 +00:00
if ( $user != " " ) {
2013-11-06 10:57:04 +00:00
2014-08-19 16:01:26 +00:00
$userDir = '/' . $user . '/files' ;
2014-06-13 13:49:40 +00:00
2012-08-27 13:55:22 +00:00
//jail the user into his "home" directory
2013-08-15 06:49:19 +00:00
\OC\Files\Filesystem :: init ( $user , $userDir );
2012-10-23 14:16:46 +00:00
2013-08-15 06:49:19 +00:00
OC_Hook :: emit ( 'OC_Filesystem' , 'setup' , array ( 'user' => $user , 'user_dir' => $userDir ));
2011-07-27 17:07:28 +00:00
}
2014-10-03 20:13:55 +00:00
\OC :: $server -> getEventLogger () -> end ( 'setup_fs' );
2012-10-26 16:29:24 +00:00
return true ;
2011-07-27 17:07:28 +00:00
}
2014-05-12 10:19:07 +00:00
/**
2014-05-19 15:50:53 +00:00
* check if a password is required for each public link
2014-08-19 16:01:26 +00:00
*
2014-05-12 10:19:07 +00:00
* @ return boolean
*/
public static function isPublicLinkPasswordRequired () {
$appConfig = \OC :: $server -> getAppConfig ();
$enforcePassword = $appConfig -> getValue ( 'core' , 'shareapi_enforce_links_password' , 'no' );
return ( $enforcePassword === 'yes' ) ? true : false ;
}
2014-05-13 13:22:18 +00:00
/**
* check if sharing is disabled for the current user
2015-11-19 14:35:58 +00:00
* @ param IConfig $config
* @ param IGroupManager $groupManager
* @ param IUser | null $user
* @ return bool
2014-05-13 13:22:18 +00:00
*/
2015-11-19 14:35:58 +00:00
public static function isSharingDisabledForUser ( IConfig $config , IGroupManager $groupManager , $user ) {
if ( $config -> getAppValue ( 'core' , 'shareapi_exclude_groups' , 'no' ) === 'yes' ) {
$groupsList = $config -> getAppValue ( 'core' , 'shareapi_exclude_groups_list' , '' );
2015-10-01 13:37:55 +00:00
$excludedGroups = json_decode ( $groupsList );
if ( is_null ( $excludedGroups )) {
$excludedGroups = explode ( ',' , $groupsList );
$newValue = json_encode ( $excludedGroups );
2015-11-19 14:35:58 +00:00
$config -> setAppValue ( 'core' , 'shareapi_exclude_groups_list' , $newValue );
2015-10-01 13:37:55 +00:00
}
2015-11-19 15:20:27 +00:00
$usersGroups = $groupManager -> getUserGroupIds ( $user );
2014-05-13 13:22:18 +00:00
if ( ! empty ( $usersGroups )) {
$remainingGroups = array_diff ( $usersGroups , $excludedGroups );
// if the user is only in groups which are disabled for sharing then
// sharing is also disabled for the user
if ( empty ( $remainingGroups )) {
return true ;
}
}
}
return false ;
}
2014-07-23 14:42:33 +00:00
/**
* check if share API enforces a default expire date
2014-08-19 16:01:26 +00:00
*
2014-07-23 14:42:33 +00:00
* @ return boolean
*/
public static function isDefaultExpireDateEnforced () {
$isDefaultExpireDateEnabled = \OCP\Config :: getAppValue ( 'core' , 'shareapi_default_expire_date' , 'no' );
$enforceDefaultExpireDate = false ;
if ( $isDefaultExpireDateEnabled === 'yes' ) {
$value = \OCP\Config :: getAppValue ( 'core' , 'shareapi_enforce_expire_date' , 'no' );
$enforceDefaultExpireDate = ( $value === 'yes' ) ? true : false ;
}
return $enforceDefaultExpireDate ;
}
2014-02-06 15:30:58 +00:00
/**
2014-04-21 13:44:54 +00:00
* Get the quota of a user
2014-08-19 16:01:26 +00:00
*
2014-02-06 15:30:58 +00:00
* @ param string $user
2014-04-21 13:44:54 +00:00
* @ return int Quota bytes
2014-02-06 15:30:58 +00:00
*/
2014-08-19 16:01:26 +00:00
public static function getUserQuota ( $user ) {
2016-02-09 16:16:43 +00:00
$userQuota = \OC :: $server -> getUserManager () -> get ( $user ) -> getQuota ();
2013-07-25 14:01:37 +00:00
if ( $userQuota === 'none' ) {
2014-08-19 14:45:22 +00:00
return \OCP\Files\FileInfo :: SPACE_UNLIMITED ;
2013-07-25 14:01:37 +00:00
} else {
return OC_Helper :: computerFileSize ( $userQuota );
}
}
2013-10-03 21:22:11 +00:00
/**
2014-08-29 12:36:00 +00:00
* copies the skeleton to the users / files
2014-08-19 16:01:26 +00:00
*
2015-06-16 14:02:30 +00:00
* @ param String $userId
2014-08-29 12:36:00 +00:00
* @ param \OCP\Files\Folder $userDirectory
2013-10-03 21:22:11 +00:00
*/
2015-06-16 14:02:30 +00:00
public static function copySkeleton ( $userId , \OCP\Files\Folder $userDirectory ) {
2014-08-29 12:36:00 +00:00
$skeletonDirectory = \OCP\Config :: getSystemValue ( 'skeletondirectory' , \OC :: $SERVERROOT . '/core/skeleton' );
2014-08-15 23:07:42 +00:00
if ( ! empty ( $skeletonDirectory )) {
2014-08-29 12:36:00 +00:00
\OCP\Util :: writeLog (
'files_skeleton' ,
2015-06-16 14:02:30 +00:00
'copying skeleton for ' . $userId . ' from ' . $skeletonDirectory . ' to ' . $userDirectory -> getFullPath ( '/' ),
2014-08-29 12:36:00 +00:00
\OCP\Util :: DEBUG
);
self :: copyr ( $skeletonDirectory , $userDirectory );
// update the file cache
$userDirectory -> getStorage () -> getScanner () -> scan ( '' , \OC\Files\Cache\Scanner :: SCAN_RECURSIVE );
2014-08-15 23:07:42 +00:00
}
2013-10-03 21:22:11 +00:00
}
/**
2014-08-29 12:36:00 +00:00
* copies a directory recursively by using streams
2014-08-19 16:01:26 +00:00
*
2013-10-03 21:22:11 +00:00
* @ param string $source
2014-08-29 12:36:00 +00:00
* @ param \OCP\Files\Folder $target
2013-10-03 21:22:11 +00:00
* @ return void
*/
2014-08-29 12:36:00 +00:00
public static function copyr ( $source , \OCP\Files\Folder $target ) {
2013-10-03 21:22:11 +00:00
$dir = opendir ( $source );
2014-08-19 16:01:26 +00:00
while ( false !== ( $file = readdir ( $dir ))) {
if ( ! \OC\Files\Filesystem :: isIgnoredDir ( $file )) {
if ( is_dir ( $source . '/' . $file )) {
2014-08-29 12:36:00 +00:00
$child = $target -> newFolder ( $file );
self :: copyr ( $source . '/' . $file , $child );
2013-10-03 21:22:11 +00:00
} else {
2014-08-29 12:36:00 +00:00
$child = $target -> newFile ( $file );
stream_copy_to_stream ( fopen ( $source . '/' . $file , 'r' ), $child -> fopen ( 'w' ));
2013-10-03 21:22:11 +00:00
}
}
}
closedir ( $dir );
}
2013-08-15 06:49:19 +00:00
/**
* @ return void
2013-08-18 08:33:09 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function tearDownFS () {
2012-10-10 11:18:36 +00:00
\OC\Files\Filesystem :: tearDown ();
2014-08-19 16:01:26 +00:00
self :: $fsSetup = false ;
self :: $rootMounted = false ;
2011-07-27 17:07:28 +00:00
}
2012-10-28 12:45:37 +00:00
2011-07-27 17:07:28 +00:00
/**
2014-05-19 15:50:53 +00:00
* get the current installed version of ownCloud
2014-08-19 16:01:26 +00:00
*
2011-07-27 17:07:28 +00:00
* @ return array
*/
2012-09-07 13:22:01 +00:00
public static function getVersion () {
2013-09-27 21:41:24 +00:00
OC_Util :: loadVersion ();
2013-09-30 18:28:00 +00:00
return \OC :: $server -> getSession () -> get ( 'OC_Version' );
2011-09-28 11:52:26 +00:00
}
/**
2014-05-19 15:50:53 +00:00
* get the current installed version string of ownCloud
2014-08-19 16:01:26 +00:00
*
2011-09-28 11:52:26 +00:00
* @ return string
*/
2012-09-07 13:22:01 +00:00
public static function getVersionString () {
2013-09-27 21:41:24 +00:00
OC_Util :: loadVersion ();
2013-09-30 18:28:00 +00:00
return \OC :: $server -> getSession () -> get ( 'OC_VersionString' );
2011-07-27 17:07:28 +00:00
}
2012-07-23 22:39:59 +00:00
/**
2013-08-15 06:49:19 +00:00
* @ description get the current installed edition of ownCloud . There is the community
2013-02-11 16:44:02 +00:00
* edition that just returns an empty string and the enterprise edition
* that returns " Enterprise " .
2012-07-23 22:39:59 +00:00
* @ return string
*/
2012-09-07 13:22:01 +00:00
public static function getEditionString () {
2014-12-25 08:48:15 +00:00
if ( OC_App :: isEnabled ( 'enterprise_key' )) {
return " Enterprise " ;
} else {
return " " ;
}
2013-09-27 21:41:24 +00:00
}
/**
* @ description get the update channel of the current installed of ownCloud .
* @ return string
*/
public static function getChannel () {
OC_Util :: loadVersion ();
2013-09-30 18:28:00 +00:00
return \OC :: $server -> getSession () -> get ( 'OC_Channel' );
2013-09-27 21:41:24 +00:00
}
2013-10-02 08:11:18 +00:00
2013-09-27 21:41:24 +00:00
/**
* @ description get the build number of the current installed of ownCloud .
* @ return string
*/
public static function getBuild () {
OC_Util :: loadVersion ();
2013-09-30 18:28:00 +00:00
return \OC :: $server -> getSession () -> get ( 'OC_Build' );
2013-09-27 21:41:24 +00:00
}
/**
* @ description load the version . php into the session as cache
*/
private static function loadVersion () {
2014-08-19 16:01:26 +00:00
$timestamp = filemtime ( OC :: $SERVERROOT . '/version.php' );
if ( ! \OC :: $server -> getSession () -> exists ( 'OC_Version' ) or OC :: $server -> getSession () -> get ( 'OC_Version_Timestamp' ) != $timestamp ) {
2015-03-09 07:02:09 +00:00
require OC :: $SERVERROOT . '/version.php' ;
2013-09-30 18:28:00 +00:00
$session = \OC :: $server -> getSession ();
2013-10-05 10:50:36 +00:00
/** @var $timestamp int */
$session -> set ( 'OC_Version_Timestamp' , $timestamp );
2013-09-30 18:28:00 +00:00
/** @var $OC_Version string */
$session -> set ( 'OC_Version' , $OC_Version );
/** @var $OC_VersionString string */
$session -> set ( 'OC_VersionString' , $OC_VersionString );
/** @var $OC_Build string */
$session -> set ( 'OC_Build' , $OC_Build );
2015-05-13 17:00:46 +00:00
// Allow overriding update channel
if ( \OC :: $server -> getSystemConfig () -> getValue ( 'installed' , false )) {
$channel = \OC :: $server -> getAppConfig () -> getValue ( 'core' , 'OC_Channel' );
} else {
2015-05-27 14:42:24 +00:00
/** @var $OC_Channel string */
2015-05-13 17:00:46 +00:00
$channel = $OC_Channel ;
}
if ( ! is_null ( $channel )) {
$session -> set ( 'OC_Channel' , $channel );
} else {
/** @var $OC_Channel string */
$session -> set ( 'OC_Channel' , $OC_Channel );
}
2013-09-27 21:41:24 +00:00
}
2012-07-23 22:39:59 +00:00
}
2012-04-01 09:20:12 +00:00
2011-07-27 17:07:28 +00:00
/**
2014-11-03 10:18:17 +00:00
* generates a path for JS / CSS files . If no application is provided it will create the path for core .
2011-07-27 17:07:28 +00:00
*
2014-12-10 14:41:38 +00:00
* @ param string $application application to get the files from
2016-04-07 17:51:27 +00:00
* @ param string $directory directory within this application ( css , js , vendor , etc )
2014-12-10 14:41:38 +00:00
* @ param string $file the file inside of the above folder
2014-11-03 10:18:17 +00:00
* @ return string the path
2011-07-27 17:07:28 +00:00
*/
2014-11-03 10:18:17 +00:00
private static function generatePath ( $application , $directory , $file ) {
2014-08-19 16:01:26 +00:00
if ( is_null ( $file )) {
2011-07-27 17:07:28 +00:00
$file = $application ;
$application = " " ;
}
2014-08-19 16:01:26 +00:00
if ( ! empty ( $application )) {
2014-11-03 10:18:17 +00:00
return " $application / $directory / $file " ;
2013-08-15 06:49:19 +00:00
} else {
2014-11-03 10:18:17 +00:00
return " $directory / $file " ;
2011-07-27 17:07:28 +00:00
}
}
2014-11-03 10:18:17 +00:00
/**
* add a javascript file
*
* @ param string $application application id
* @ param string | null $file filename
2015-09-17 07:14:04 +00:00
* @ param bool $prepend prepend the Script to the beginning of the list
2014-11-03 10:18:17 +00:00
* @ return void
*/
2015-09-17 07:14:04 +00:00
public static function addScript ( $application , $file = null , $prepend = false ) {
2014-12-10 14:41:38 +00:00
$path = OC_Util :: generatePath ( $application , 'js' , $file );
2015-09-30 04:09:29 +00:00
// core js files need separate handling
if ( $application !== 'core' && $file !== null ) {
self :: addTranslations ( $application );
2014-12-10 14:41:38 +00:00
}
2015-09-30 04:09:29 +00:00
self :: addExternalResource ( $application , $prepend , $path , " script " );
2014-11-03 10:18:17 +00:00
}
/**
* add a javascript file from the vendor sub folder
*
* @ param string $application application id
* @ param string | null $file filename
2015-09-17 07:14:04 +00:00
* @ param bool $prepend prepend the Script to the beginning of the list
2014-11-03 10:18:17 +00:00
* @ return void
*/
2015-09-17 07:14:04 +00:00
public static function addVendorScript ( $application , $file = null , $prepend = false ) {
2014-12-10 14:41:38 +00:00
$path = OC_Util :: generatePath ( $application , 'vendor' , $file );
2015-09-30 04:09:29 +00:00
self :: addExternalResource ( $application , $prepend , $path , " script " );
2014-11-03 10:18:17 +00:00
}
2014-10-17 17:47:37 +00:00
/**
* add a translation JS file
*
* @ param string $application application id
* @ param string $languageCode language code , defaults to the current language
2015-09-17 07:14:04 +00:00
* @ param bool $prepend prepend the Script to the beginning of the list
2014-10-17 17:47:37 +00:00
*/
2015-09-17 07:14:04 +00:00
public static function addTranslations ( $application , $languageCode = null , $prepend = false ) {
2014-10-17 17:47:37 +00:00
if ( is_null ( $languageCode )) {
2015-03-02 17:01:51 +00:00
$languageCode = \OC_L10N :: findLanguage ( $application );
2014-10-17 17:47:37 +00:00
}
if ( ! empty ( $application )) {
2014-12-10 14:41:38 +00:00
$path = " $application /l10n/ $languageCode " ;
2014-10-17 17:47:37 +00:00
} else {
2014-12-10 14:41:38 +00:00
$path = " l10n/ $languageCode " ;
}
2015-09-30 04:09:29 +00:00
self :: addExternalResource ( $application , $prepend , $path , " script " );
2014-10-17 17:47:37 +00:00
}
2011-07-27 17:07:28 +00:00
/**
2014-05-19 15:50:53 +00:00
* add a css file
2011-07-27 17:07:28 +00:00
*
2014-10-17 17:47:37 +00:00
* @ param string $application application id
2014-02-19 08:31:54 +00:00
* @ param string | null $file filename
2015-09-25 09:56:55 +00:00
* @ param bool $prepend prepend the Style to the beginning of the list
2013-08-15 06:49:19 +00:00
* @ return void
2011-07-27 17:07:28 +00:00
*/
2015-09-25 09:56:55 +00:00
public static function addStyle ( $application , $file = null , $prepend = false ) {
2014-12-10 14:41:38 +00:00
$path = OC_Util :: generatePath ( $application , 'css' , $file );
2015-09-30 04:09:29 +00:00
self :: addExternalResource ( $application , $prepend , $path , " style " );
2014-11-03 10:18:17 +00:00
}
/**
* add a css file from the vendor sub folder
*
* @ param string $application application id
* @ param string | null $file filename
2015-09-25 09:56:55 +00:00
* @ param bool $prepend prepend the Style to the beginning of the list
2014-11-03 10:18:17 +00:00
* @ return void
*/
2015-09-25 09:56:55 +00:00
public static function addVendorStyle ( $application , $file = null , $prepend = false ) {
2014-12-10 14:41:38 +00:00
$path = OC_Util :: generatePath ( $application , 'vendor' , $file );
2015-09-30 04:09:29 +00:00
self :: addExternalResource ( $application , $prepend , $path , " style " );
}
/**
* add an external resource css / js file
*
* @ param string $application application id
* @ param bool $prepend prepend the file to the beginning of the list
* @ param string $path
* @ param string $type ( script or style )
* @ return void
*/
private static function addExternalResource ( $application , $prepend , $path , $type = " script " ) {
if ( $type === " style " ) {
if ( ! in_array ( $path , self :: $styles )) {
if ( $prepend === true ) {
array_unshift ( self :: $styles , $path );
} else {
self :: $styles [] = $path ;
}
}
} elseif ( $type === " script " ) {
if ( ! in_array ( $path , self :: $scripts )) {
if ( $prepend === true ) {
array_unshift ( self :: $scripts , $path );
} else {
self :: $scripts [] = $path ;
}
}
2014-12-10 14:41:38 +00:00
}
2011-07-27 17:07:28 +00:00
}
/**
2014-05-19 15:50:53 +00:00
* Add a custom element to the header
2014-10-28 10:15:58 +00:00
* If $text is null then the element will be written as empty element .
* So use " " to get a closing tag .
2013-08-23 05:30:42 +00:00
* @ param string $tag tag name of the element
2012-02-07 21:33:01 +00:00
* @ param array $attributes array of attributes for the element
2011-07-27 17:07:28 +00:00
* @ param string $text the text content for the element
*/
2014-10-28 10:15:58 +00:00
public static function addHeader ( $tag , $attributes , $text = null ) {
2013-08-15 06:49:19 +00:00
self :: $headers [] = array (
2014-08-19 16:01:26 +00:00
'tag' => $tag ,
'attributes' => $attributes ,
'text' => $text
2013-08-15 06:49:19 +00:00
);
2011-07-27 17:07:28 +00:00
}
2012-07-23 22:39:59 +00:00
/**
2014-05-19 15:50:53 +00:00
* formats a timestamp in the " right " way
2012-07-23 22:39:59 +00:00
*
2013-08-23 05:30:42 +00:00
* @ param int $timestamp
* @ param bool $dateOnly option to omit time from the result
2014-09-22 13:03:28 +00:00
* @ param DateTimeZone | string $timeZone where the given timestamp shall be converted to
2013-08-15 06:49:19 +00:00
* @ return string timestamp
2014-11-24 15:37:04 +00:00
*
* @ deprecated Use \OC :: $server -> query ( 'DateTimeFormatter' ) instead
2012-07-23 22:39:59 +00:00
*/
2014-09-22 13:03:28 +00:00
public static function formatDate ( $timestamp , $dateOnly = false , $timeZone = null ) {
2014-11-24 15:37:04 +00:00
if ( $timeZone !== null && ! $timeZone instanceof \DateTimeZone ) {
$timeZone = new \DateTimeZone ( $timeZone );
2012-04-16 10:21:12 +00:00
}
2014-11-24 15:37:04 +00:00
/** @var \OC\DateTimeFormatter $formatter */
$formatter = \OC :: $server -> query ( 'DateTimeFormatter' );
if ( $dateOnly ) {
return $formatter -> formatDate ( $timestamp , 'long' , $timeZone );
}
return $formatter -> formatDateTime ( $timestamp , 'long' , 'long' , $timeZone );
2011-07-27 17:07:28 +00:00
}
/**
2014-05-19 15:50:53 +00:00
* check if the current server configuration is suitable for ownCloud
2014-08-19 16:01:26 +00:00
*
2014-09-08 12:56:11 +00:00
* @ param \OCP\IConfig $config
2011-07-27 17:07:28 +00:00
* @ return array arrays with error messages and hints
*/
2014-10-24 12:13:40 +00:00
public static function checkServer ( \OCP\IConfig $config ) {
2014-08-31 08:05:59 +00:00
$l = \OC :: $server -> getL10N ( 'lib' );
2014-03-14 12:03:18 +00:00
$errors = array ();
2014-09-08 12:56:11 +00:00
$CONFIG_DATADIRECTORY = $config -> getSystemValue ( 'datadirectory' , OC :: $SERVERROOT . '/data' );
2014-03-14 12:03:18 +00:00
2014-09-08 12:56:11 +00:00
if ( ! self :: needUpgrade ( $config ) && $config -> getSystemValue ( 'installed' , false )) {
2014-03-14 12:03:18 +00:00
// this check needs to be done every time
$errors = self :: checkDataDirectoryValidity ( $CONFIG_DATADIRECTORY );
}
2013-08-15 09:58:09 +00:00
// Assume that if checkServer() succeeded before in this session, then all is fine.
2014-07-16 17:40:22 +00:00
if ( \OC :: $server -> getSession () -> exists ( 'checkServer_succeeded' ) && \OC :: $server -> getSession () -> get ( 'checkServer_succeeded' )) {
2014-03-14 12:03:18 +00:00
return $errors ;
2013-08-15 06:49:19 +00:00
}
2013-08-15 09:58:09 +00:00
2013-08-15 06:49:19 +00:00
$webServerRestart = false ;
2015-07-29 22:04:30 +00:00
$setup = new \OC\Setup ( $config , \OC :: $server -> getIniWrapper (), \OC :: $server -> getL10N ( 'lib' ),
new \OC_Defaults (), \OC :: $server -> getLogger (), \OC :: $server -> getSecureRandom ());
2015-11-26 09:48:08 +00:00
$urlGenerator = \OC :: $server -> getURLGenerator ();
2014-10-27 11:51:26 +00:00
$availableDatabases = $setup -> getSupportedDatabases ();
if ( empty ( $availableDatabases )) {
2013-08-15 06:49:19 +00:00
$errors [] = array (
2014-08-19 16:01:26 +00:00
'error' => $l -> t ( 'No database drivers (sqlite, mysql, or postgresql) installed.' ),
'hint' => '' //TODO: sane hint
2013-08-15 06:49:19 +00:00
);
$webServerRestart = true ;
2011-07-27 17:07:28 +00:00
}
2015-02-26 13:24:40 +00:00
// Check if server running on Windows platform
if ( OC_Util :: runningOnWindows ()) {
$errors [] = [
'error' => $l -> t ( 'Microsoft Windows Platform is not supported' ),
'hint' => $l -> t ( 'Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you ' .
'use a Linux server in a virtual machine if you have no option for migrating the server itself. ' .
'Find Linux packages as well as easy to deploy virtual machine images on <a href="%s">%s</a>. ' .
'For migrating existing installations to Linux you can find some tips and a migration script ' .
'in <a href="%s">our documentation</a>.' ,
[ 'https://owncloud.org/install/' , 'owncloud.org/install/' , 'https://owncloud.org/?p=8045' ])
];
}
2012-06-19 20:12:05 +00:00
// Check if config folder is writable.
2015-12-09 07:54:11 +00:00
if ( ! OC_Helper :: isReadOnlyConfigEnabled ()) {
if ( ! is_writable ( OC :: $configDir ) or ! is_readable ( OC :: $configDir )) {
$errors [] = array (
'error' => $l -> t ( 'Cannot write into "config" directory' ),
'hint' => $l -> t ( 'This can usually be fixed by '
. '%sgiving the webserver write access to the config directory%s.' ,
2016-03-20 10:38:14 +00:00
array ( '<a href="' . $urlGenerator -> linkToDocs ( 'admin-dir_permissions' ) . '" target="_blank" rel="noreferrer">' , '</a>' ))
2015-12-09 07:54:11 +00:00
);
}
2012-06-19 20:12:05 +00:00
}
2012-06-21 19:35:34 +00:00
// Check if there is a writable install folder.
2014-09-08 12:56:11 +00:00
if ( $config -> getSystemValue ( 'appstoreenabled' , true )) {
2014-08-19 16:01:26 +00:00
if ( OC_App :: getInstallPath () === null
2013-02-11 16:44:02 +00:00
|| ! is_writable ( OC_App :: getInstallPath ())
2014-08-19 16:01:26 +00:00
|| ! is_readable ( OC_App :: getInstallPath ())
) {
2013-07-08 08:07:57 +00:00
$errors [] = array (
2014-05-28 23:21:54 +00:00
'error' => $l -> t ( 'Cannot write into "apps" directory' ),
'hint' => $l -> t ( 'This can usually be fixed by '
2014-08-19 16:01:26 +00:00
. '%sgiving the webserver write access to the apps directory%s'
. ' or disabling the appstore in the config file.' ,
2016-03-20 10:38:14 +00:00
array ( '<a href="' . $urlGenerator -> linkToDocs ( 'admin-dir_permissions' ) . '" target="_blank" rel="noreferrer">' , '</a>' ))
2014-08-19 16:01:26 +00:00
);
2012-06-21 19:35:34 +00:00
}
2012-06-19 20:12:05 +00:00
}
// Create root dir.
2014-09-08 13:05:57 +00:00
if ( $config -> getSystemValue ( 'installed' , false )) {
if ( ! is_dir ( $CONFIG_DATADIRECTORY )) {
$success = @ mkdir ( $CONFIG_DATADIRECTORY );
if ( $success ) {
$errors = array_merge ( $errors , self :: checkDataDirectoryPermissions ( $CONFIG_DATADIRECTORY ));
} else {
$errors [] = array (
'error' => $l -> t ( 'Cannot create "data" directory (%s)' , array ( $CONFIG_DATADIRECTORY )),
'hint' => $l -> t ( 'This can usually be fixed by '
2016-03-20 10:38:14 +00:00
. '<a href="%s" target="_blank" rel="noreferrer">giving the webserver write access to the root directory</a>.' ,
2015-11-26 09:48:08 +00:00
array ( $urlGenerator -> linkToDocs ( 'admin-dir_permissions' )))
2014-09-08 13:05:57 +00:00
);
}
} else if ( ! is_writable ( $CONFIG_DATADIRECTORY ) or ! is_readable ( $CONFIG_DATADIRECTORY )) {
2015-02-12 10:20:38 +00:00
//common hint for all file permissions error messages
$permissionsHint = $l -> t ( 'Permissions can usually be fixed by '
. '%sgiving the webserver write access to the root directory%s.' ,
2016-03-20 10:38:14 +00:00
array ( '<a href="' . $urlGenerator -> linkToDocs ( 'admin-dir_permissions' ) . '" target="_blank" rel="noreferrer">' , '</a>' ));
2013-07-08 08:07:57 +00:00
$errors [] = array (
2014-09-08 13:05:57 +00:00
'error' => 'Data directory (' . $CONFIG_DATADIRECTORY . ') not writable by ownCloud' ,
'hint' => $permissionsHint
2014-08-19 16:01:26 +00:00
);
2014-09-08 13:05:57 +00:00
} else {
$errors = array_merge ( $errors , self :: checkDataDirectoryPermissions ( $CONFIG_DATADIRECTORY ));
2012-06-19 20:12:05 +00:00
}
2011-07-27 17:07:28 +00:00
}
2013-08-15 06:49:19 +00:00
2014-08-19 16:01:26 +00:00
if ( ! OC_Util :: isSetLocaleWorking ()) {
2013-11-08 13:30:08 +00:00
$errors [] = array (
2014-05-28 23:21:54 +00:00
'error' => $l -> t ( 'Setting locale to %s failed' ,
2014-08-19 16:01:26 +00:00
array ( 'en_US.UTF-8/fr_FR.UTF-8/es_ES.UTF-8/de_DE.UTF-8/ru_RU.UTF-8/'
. 'pt_BR.UTF-8/it_IT.UTF-8/ja_JP.UTF-8/zh_CN.UTF-8' )),
2014-08-18 13:59:36 +00:00
'hint' => $l -> t ( 'Please install one of these locales on your system and restart your webserver.' )
2013-11-08 13:30:08 +00:00
);
}
2014-09-15 11:46:43 +00:00
// Contains the dependencies that should be checked against
// classes = class_exists
// functions = function_exists
// defined = defined
2015-02-21 11:12:34 +00:00
// ini = ini_get
2014-09-15 11:46:43 +00:00
// If the dependency is not found the missing module name is shown to the EndUser
2015-02-27 09:23:20 +00:00
// When adding new checks always verify that they pass on Travis as well
// for ini settings, see https://github.com/owncloud/administration/blob/master/travis-ci/custom.ini
2014-09-15 11:46:43 +00:00
$dependencies = array (
'classes' => array (
'ZipArchive' => 'zip' ,
'DOMDocument' => 'dom' ,
2016-03-09 10:11:00 +00:00
'XMLWriter' => 'XMLWriter' ,
'XMLReader' => 'XMLReader' ,
2014-09-15 11:46:43 +00:00
),
2015-03-12 17:39:54 +00:00
'functions' => [
2014-09-15 11:46:43 +00:00
'xml_parser_create' => 'libxml' ,
'mb_detect_encoding' => 'mb multibyte' ,
'ctype_digit' => 'ctype' ,
'json_encode' => 'JSON' ,
'gd_info' => 'GD' ,
'gzencode' => 'zlib' ,
'iconv' => 'iconv' ,
2014-12-28 12:23:34 +00:00
'simplexml_load_string' => 'SimpleXML' ,
2015-03-12 17:39:54 +00:00
'hash' => 'HASH Message Digest Framework' ,
'curl_init' => 'cURL' ,
],
2014-09-15 11:46:43 +00:00
'defined' => array (
'PDO::ATTR_DRIVER_NAME' => 'PDO'
2015-02-21 11:12:34 +00:00
),
'ini' => [
2015-02-24 22:34:38 +00:00
'default_charset' => 'UTF-8' ,
2015-02-21 11:12:34 +00:00
],
2014-09-15 11:46:43 +00:00
);
$missingDependencies = array ();
2015-02-21 11:12:34 +00:00
$invalidIniSettings = [];
2014-05-28 23:21:54 +00:00
$moduleHint = $l -> t ( 'Please ask your server administrator to install the module.' );
2014-09-15 11:46:43 +00:00
2015-02-28 09:08:41 +00:00
/**
* FIXME : The dependency check does not work properly on HHVM on the moment
* and prevents installation . Once HHVM is more compatible with our
* approach to check for these values we should re - enable those
* checks .
*/
2015-05-04 14:14:12 +00:00
$iniWrapper = \OC :: $server -> getIniWrapper ();
2015-02-28 09:08:41 +00:00
if ( ! self :: runningOnHhvm ()) {
foreach ( $dependencies [ 'classes' ] as $class => $module ) {
if ( ! class_exists ( $class )) {
$missingDependencies [] = $module ;
}
2014-09-15 11:46:43 +00:00
}
2015-02-28 09:08:41 +00:00
foreach ( $dependencies [ 'functions' ] as $function => $module ) {
if ( ! function_exists ( $function )) {
$missingDependencies [] = $module ;
2015-02-21 11:12:34 +00:00
}
}
2015-02-28 09:08:41 +00:00
foreach ( $dependencies [ 'defined' ] as $defined => $module ) {
if ( ! defined ( $defined )) {
$missingDependencies [] = $module ;
2015-02-21 11:12:34 +00:00
}
}
2015-02-28 09:08:41 +00:00
foreach ( $dependencies [ 'ini' ] as $setting => $expected ) {
if ( is_bool ( $expected )) {
if ( $iniWrapper -> getBool ( $setting ) !== $expected ) {
$invalidIniSettings [] = [ $setting , $expected ];
}
}
if ( is_int ( $expected )) {
if ( $iniWrapper -> getNumeric ( $setting ) !== $expected ) {
$invalidIniSettings [] = [ $setting , $expected ];
}
}
if ( is_string ( $expected )) {
if ( strtolower ( $iniWrapper -> getString ( $setting )) !== strtolower ( $expected )) {
$invalidIniSettings [] = [ $setting , $expected ];
}
2015-02-24 22:34:38 +00:00
}
}
2015-02-21 11:12:34 +00:00
}
2014-09-15 11:46:43 +00:00
foreach ( $missingDependencies as $missingDependency ) {
2013-08-15 06:49:19 +00:00
$errors [] = array (
2014-09-15 11:46:43 +00:00
'error' => $l -> t ( 'PHP module %s not installed.' , array ( $missingDependency )),
2014-08-19 16:01:26 +00:00
'hint' => $moduleHint
2013-08-15 06:49:19 +00:00
);
$webServerRestart = true ;
2012-10-06 15:37:38 +00:00
}
2015-02-21 11:12:34 +00:00
foreach ( $invalidIniSettings as $setting ) {
2015-02-23 08:40:15 +00:00
if ( is_bool ( $setting [ 1 ])) {
$setting [ 1 ] = ( $setting [ 1 ]) ? 'on' : 'off' ;
}
2015-02-21 11:12:34 +00:00
$errors [] = [
2015-02-23 08:40:15 +00:00
'error' => $l -> t ( 'PHP setting "%s" is not set to "%s".' , [ $setting [ 0 ], var_export ( $setting [ 1 ], true )]),
2015-02-21 11:12:34 +00:00
'hint' => $l -> t ( 'Adjusting this setting in php.ini will make ownCloud run again' )
];
$webServerRestart = true ;
}
2014-09-15 11:46:43 +00:00
2015-05-04 14:14:12 +00:00
/**
* The mbstring . func_overload check can only be performed if the mbstring
* module is installed as it will return null if the checking setting is
* not available and thus a check on the boolean value fails .
*
* TODO : Should probably be implemented in the above generic dependency
* check somehow in the long - term .
*/
if ( $iniWrapper -> getBool ( 'mbstring.func_overload' ) !== null &&
$iniWrapper -> getBool ( 'mbstring.func_overload' ) === true ) {
$errors [] = array (
2015-05-19 19:15:22 +00:00
'error' => $l -> t ( 'mbstring.func_overload is set to "%s" instead of the expected value "0"' , [ $iniWrapper -> getString ( 'mbstring.func_overload' )]),
2015-05-04 14:14:12 +00:00
'hint' => $l -> t ( 'To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini' )
);
}
2016-03-12 21:13:05 +00:00
if ( function_exists ( 'xml_parser_create' ) &&
version_compare ( '2.7.0' , LIBXML_DOTTED_VERSION ) === 1 ) {
$errors [] = array (
'error' => $l -> t ( 'libxml2 2.7.0 is at least required. Currently %s is installed.' , [ LIBXML_DOTTED_VERSION ]),
'hint' => $l -> t ( 'To fix this issue update your libxml2 version and restart your web server.' )
);
}
2014-05-19 19:51:35 +00:00
if ( ! self :: isAnnotationsWorking ()) {
$errors [] = array (
2015-05-19 19:15:22 +00:00
'error' => $l -> t ( 'PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible.' ),
2015-01-22 13:52:47 +00:00
'hint' => $l -> t ( 'This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator.' )
2014-05-19 19:51:35 +00:00
);
}
2012-09-11 21:51:12 +00:00
2015-03-10 21:59:23 +00:00
if ( ! \OC :: $CLI && $webServerRestart ) {
2013-08-15 06:49:19 +00:00
$errors [] = array (
2014-08-19 16:01:26 +00:00
'error' => $l -> t ( 'PHP modules have been installed, but they are still listed as missing?' ),
'hint' => $l -> t ( 'Please ask your server administrator to restart the web server.' )
2013-08-15 06:49:19 +00:00
);
2012-06-01 18:00:33 +00:00
}
2011-07-27 17:07:28 +00:00
2014-03-15 12:28:20 +00:00
$errors = array_merge ( $errors , self :: checkDatabaseVersion ());
2013-08-15 09:58:09 +00:00
// Cache the result of this function
2014-07-16 17:40:22 +00:00
\OC :: $server -> getSession () -> set ( 'checkServer_succeeded' , count ( $errors ) == 0 );
2013-08-15 09:58:09 +00:00
2011-07-27 17:07:28 +00:00
return $errors ;
}
2011-09-18 19:31:56 +00:00
2014-03-15 12:28:20 +00:00
/**
* Check the database version
2014-08-19 16:01:26 +00:00
*
2014-03-15 12:28:20 +00:00
* @ return array errors array
*/
public static function checkDatabaseVersion () {
2014-08-31 08:05:59 +00:00
$l = \OC :: $server -> getL10N ( 'lib' );
2014-03-15 12:28:20 +00:00
$errors = array ();
2015-12-18 10:42:09 +00:00
$dbType = \OC :: $server -> getSystemConfig () -> getValue ( 'dbtype' , 'sqlite' );
2014-03-15 12:28:20 +00:00
if ( $dbType === 'pgsql' ) {
// check PostgreSQL version
try {
$result = \OC_DB :: executeAudited ( 'SHOW SERVER_VERSION' );
$data = $result -> fetchRow ();
if ( isset ( $data [ 'server_version' ])) {
$version = $data [ 'server_version' ];
if ( version_compare ( $version , '9.0.0' , '<' )) {
$errors [] = array (
2014-05-28 23:21:54 +00:00
'error' => $l -> t ( 'PostgreSQL >= 9 required' ),
'hint' => $l -> t ( 'Please upgrade your database version' )
2014-03-15 12:28:20 +00:00
);
}
}
2014-03-25 22:17:00 +00:00
} catch ( \Doctrine\DBAL\DBALException $e ) {
2015-11-16 12:11:32 +00:00
$logger = \OC :: $server -> getLogger ();
$logger -> warning ( 'Error occurred while checking PostgreSQL version, assuming >= 9' );
$logger -> logException ( $e );
2014-03-15 12:28:20 +00:00
}
}
return $errors ;
}
2013-01-19 04:30:56 +00:00
/**
2014-05-19 15:50:53 +00:00
* Check for correct file permissions of data directory
2014-08-19 16:01:26 +00:00
*
2014-02-06 15:30:58 +00:00
* @ param string $dataDirectory
2013-08-23 05:30:42 +00:00
* @ return array arrays with error messages and hints
*/
2013-01-19 04:30:56 +00:00
public static function checkDataDirectoryPermissions ( $dataDirectory ) {
2014-08-31 08:05:59 +00:00
$l = \OC :: $server -> getL10N ( 'lib' );
2013-01-19 04:30:56 +00:00
$errors = array ();
2013-08-23 05:30:42 +00:00
if ( self :: runningOnWindows ()) {
2013-01-19 04:30:56 +00:00
//TODO: permissions checks for windows hosts
} else {
2014-05-28 23:21:54 +00:00
$permissionsModHint = $l -> t ( 'Please change the permissions to 0770 so that the directory'
2014-08-19 16:01:26 +00:00
. ' cannot be listed by other users.' );
2013-08-15 06:49:19 +00:00
$perms = substr ( decoct ( @ fileperms ( $dataDirectory )), - 3 );
if ( substr ( $perms , - 1 ) != '0' ) {
2014-03-17 11:53:26 +00:00
chmod ( $dataDirectory , 0770 );
2013-01-19 04:30:56 +00:00
clearstatcache ();
2013-08-15 06:49:19 +00:00
$perms = substr ( decoct ( @ fileperms ( $dataDirectory )), - 3 );
if ( substr ( $perms , 2 , 1 ) != '0' ) {
$errors [] = array (
2014-05-28 23:21:54 +00:00
'error' => $l -> t ( 'Data directory (%s) is readable by other users' , array ( $dataDirectory )),
2013-08-15 06:49:19 +00:00
'hint' => $permissionsModHint
);
2013-01-19 04:30:56 +00:00
}
}
}
return $errors ;
}
2014-03-14 12:03:18 +00:00
/**
* Check that the data directory exists and is valid by
* checking the existence of the " .ocdata " file .
*
* @ param string $dataDirectory data directory path
2015-03-27 23:27:21 +00:00
* @ return array errors found
2014-03-14 12:03:18 +00:00
*/
public static function checkDataDirectoryValidity ( $dataDirectory ) {
2014-08-31 08:05:59 +00:00
$l = \OC :: $server -> getL10N ( 'lib' );
2015-03-27 23:27:21 +00:00
$errors = [];
if ( ! self :: runningOnWindows () && $dataDirectory [ 0 ] !== '/' ) {
$errors [] = [
'error' => $l -> t ( 'Data directory (%s) must be an absolute path' , [ $dataDirectory ]),
'hint' => $l -> t ( 'Check the value of "datadirectory" in your configuration' )
];
}
2014-08-19 16:01:26 +00:00
if ( ! file_exists ( $dataDirectory . '/.ocdata' )) {
2015-03-27 23:27:21 +00:00
$errors [] = [
'error' => $l -> t ( 'Data directory (%s) is invalid' , [ $dataDirectory ]),
2014-05-28 23:21:54 +00:00
'hint' => $l -> t ( 'Please check that the data directory contains a file' .
' ".ocdata" in its root.' )
2015-03-27 23:27:21 +00:00
];
2014-03-14 12:03:18 +00:00
}
return $errors ;
}
2011-09-18 19:31:56 +00:00
/**
2013-01-02 22:02:38 +00:00
* Check if the user is logged in , redirects to home if not . With
* redirect URL parameter to the request URI .
2014-08-19 16:01:26 +00:00
*
2013-08-15 06:49:19 +00:00
* @ return void
2013-01-02 22:02:38 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function checkLoggedIn () {
2011-09-18 19:31:56 +00:00
// Check if we are a user
2014-08-19 16:01:26 +00:00
if ( ! OC_User :: isLoggedIn ()) {
2016-04-11 10:08:00 +00:00
header ( 'Location: ' . \OC :: $server -> getURLGenerator () -> linkToRoute (
'core.login.showLoginForm' ,
2015-02-10 12:02:48 +00:00
[
'redirect_url' => \OC :: $server -> getRequest () -> getRequestUri ()
]
)
);
2011-09-18 19:31:56 +00:00
exit ();
}
}
/**
2014-05-19 15:50:53 +00:00
* Check if the user is a admin , redirects to home if not
2014-08-19 16:01:26 +00:00
*
2013-08-15 06:49:19 +00:00
* @ return void
2013-01-02 22:02:38 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function checkAdminUser () {
2013-10-30 21:59:31 +00:00
OC_Util :: checkLoggedIn ();
2014-08-19 16:01:26 +00:00
if ( ! OC_User :: isAdminUser ( OC_User :: getUser ())) {
2015-12-18 10:46:21 +00:00
header ( 'Location: ' . \OCP\Util :: linkToAbsolute ( '' , 'index.php' ));
2011-09-18 19:31:56 +00:00
exit ();
}
}
2012-07-09 19:51:19 +00:00
/**
2013-09-24 16:01:34 +00:00
* Check if it is allowed to remember login .
2013-09-26 17:34:28 +00:00
*
* @ note Every app can set 'rememberlogin' to 'false' to disable the remember login feature
2013-09-24 16:01:34 +00:00
*
* @ return bool
*/
public static function rememberLoginAllowed () {
2013-09-26 17:34:28 +00:00
$apps = OC_App :: getEnabledApps ();
foreach ( $apps as $app ) {
$appInfo = OC_App :: getAppInfo ( $app );
if ( isset ( $appInfo [ 'rememberlogin' ]) && $appInfo [ 'rememberlogin' ] === 'false' ) {
return false ;
}
}
return true ;
2013-09-24 16:01:34 +00:00
}
2012-07-09 19:51:19 +00:00
/**
2014-05-19 15:50:53 +00:00
* Check if the user is a subadmin , redirects to home if not
2014-08-19 16:01:26 +00:00
*
2014-02-06 15:30:58 +00:00
* @ return null | boolean $groups where the current user is subadmin
2013-01-02 22:02:38 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function checkSubAdminUser () {
2013-10-30 21:59:31 +00:00
OC_Util :: checkLoggedIn ();
2015-10-27 13:09:45 +00:00
$userObject = \OC :: $server -> getUserSession () -> getUser ();
$isSubAdmin = false ;
if ( $userObject !== null ) {
$isSubAdmin = \OC :: $server -> getGroupManager () -> getSubAdmin () -> isSubAdmin ( $userObject );
}
if ( ! $isSubAdmin ) {
2015-12-18 10:46:21 +00:00
header ( 'Location: ' . \OCP\Util :: linkToAbsolute ( '' , 'index.php' ));
2012-07-09 19:51:19 +00:00
exit ();
}
2012-07-15 14:31:28 +00:00
return true ;
2012-07-09 19:51:19 +00:00
}
2011-09-18 19:31:56 +00:00
/**
2014-07-01 14:02:38 +00:00
* Returns the URL of the default page
* based on the system configuration and
* the apps visible for the current user
*
* @ return string URL
2013-01-02 22:02:38 +00:00
*/
2014-07-01 14:02:38 +00:00
public static function getDefaultPageUrl () {
2014-03-28 17:05:48 +00:00
$urlGenerator = \OC :: $server -> getURLGenerator ();
2014-09-29 15:07:43 +00:00
// Deny the redirect if the URL contains a @
// This prevents unvalidated redirects like ?redirect_url=:user@domain.com
if ( isset ( $_REQUEST [ 'redirect_url' ]) && strpos ( $_REQUEST [ 'redirect_url' ], '@' ) === false ) {
$location = $urlGenerator -> getAbsoluteURL ( urldecode ( $_REQUEST [ 'redirect_url' ]));
2013-08-15 06:49:19 +00:00
} else {
2015-07-03 12:16:29 +00:00
$defaultPage = \OC :: $server -> getAppConfig () -> getValue ( 'core' , 'defaultpage' );
2013-08-15 06:49:19 +00:00
if ( $defaultPage ) {
2014-03-28 17:05:48 +00:00
$location = $urlGenerator -> getAbsoluteURL ( $defaultPage );
2013-08-15 06:49:19 +00:00
} else {
2014-07-01 13:42:26 +00:00
$appId = 'files' ;
$defaultApps = explode ( ',' , \OCP\Config :: getSystemValue ( 'defaultapp' , 'files' ));
// find the first app that is enabled for the current user
foreach ( $defaultApps as $defaultApp ) {
$defaultApp = OC_App :: cleanAppId ( strip_tags ( $defaultApp ));
2015-02-18 13:24:50 +00:00
if ( static :: getAppManager () -> isEnabledForUser ( $defaultApp )) {
2014-07-01 13:42:26 +00:00
$appId = $defaultApp ;
break ;
}
}
2015-02-11 00:10:03 +00:00
if ( getenv ( 'front_controller_active' ) === 'true' ) {
$location = $urlGenerator -> getAbsoluteURL ( '/apps/' . $appId . '/' );
} else {
$location = $urlGenerator -> getAbsoluteURL ( '/index.php/apps/' . $appId . '/' );
}
2012-08-06 16:49:06 +00:00
}
2011-10-04 17:27:57 +00:00
}
2014-07-01 14:02:38 +00:00
return $location ;
}
/**
* Redirect to the user default page
2014-08-19 16:01:26 +00:00
*
2014-07-01 14:02:38 +00:00
* @ return void
*/
public static function redirectToDefaultPage () {
$location = self :: getDefaultPageUrl ();
2014-08-19 16:01:26 +00:00
header ( 'Location: ' . $location );
2011-09-18 19:31:56 +00:00
exit ();
}
2012-06-05 17:32:48 +00:00
2013-08-15 06:49:19 +00:00
/**
2014-05-19 15:50:53 +00:00
* get an id unique for this instance
2014-08-19 16:01:26 +00:00
*
2013-08-15 06:49:19 +00:00
* @ return string
*/
public static function getInstanceId () {
2015-12-18 10:42:09 +00:00
$id = \OC :: $server -> getSystemConfig () -> getValue ( 'instanceid' , null );
2014-08-19 16:01:26 +00:00
if ( is_null ( $id )) {
2013-08-15 06:49:19 +00:00
// We need to guarantee at least one letter in instanceid so it can be used as the session_name
2016-01-11 18:59:15 +00:00
$id = 'oc' . \OC :: $server -> getSecureRandom () -> generate ( 10 , \OCP\Security\ISecureRandom :: CHAR_LOWER . \OCP\Security\ISecureRandom :: CHAR_DIGITS );
2015-12-18 10:42:09 +00:00
\OC :: $server -> getSystemConfig () -> setValue ( 'instanceid' , $id );
2013-08-15 06:49:19 +00:00
}
return $id ;
}
2012-06-09 13:05:14 +00:00
2012-06-21 12:07:04 +00:00
/**
2014-05-19 15:50:53 +00:00
* Public function to sanitize HTML
2012-06-21 12:07:04 +00:00
*
2012-06-22 06:17:35 +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-08-29 06:38:33 +00:00
*
2015-12-08 07:27:52 +00:00
* @ param string | array $value
2014-05-11 20:51:30 +00:00
* @ return string | array an array of sanitized strings or a single sanitized string , depends on the input parameter .
2012-06-19 15:20:19 +00:00
*/
2015-12-08 07:27:52 +00:00
public static function sanitizeHTML ( $value ) {
2013-02-21 23:51:54 +00:00
if ( is_array ( $value )) {
2015-12-08 07:27:52 +00:00
$value = array_map ( function ( $value ) {
return self :: sanitizeHTML ( $value );
}, $value );
2013-01-14 21:01:52 +00:00
} else {
2015-12-08 07:27:52 +00:00
// Specify encoding for PHP<5.4
2014-04-11 17:42:15 +00:00
$value = htmlspecialchars (( string ) $value , ENT_QUOTES , 'UTF-8' );
2013-01-14 21:01:52 +00:00
}
2012-06-19 15:20:19 +00:00
return $value ;
}
2013-09-27 11:34:48 +00:00
2013-07-04 16:21:49 +00:00
/**
2014-05-19 15:50:53 +00:00
* Public function to encode url parameters
2013-07-04 16:21:49 +00:00
*
* This function is used to encode path to file before output .
* Encoding is done according to RFC 3986 with one exception :
2013-09-27 11:34:48 +00:00
* Character '/' is preserved as is .
2013-07-04 16:21:49 +00:00
*
* @ param string $component part of URI to encode
2013-09-27 11:34:48 +00:00
* @ return string
2013-07-04 16:21:49 +00:00
*/
public static function encodePath ( $component ) {
$encoded = rawurlencode ( $component );
$encoded = str_replace ( '%2F' , '/' , $encoded );
return $encoded ;
}
2012-06-21 12:07:04 +00:00
2012-07-23 22:39:59 +00:00
/**
2014-05-19 15:50:53 +00:00
* Check if the . htaccess file is working
2015-03-26 13:51:33 +00:00
* @ param \OCP\IConfig $config
2013-08-15 06:49:19 +00:00
* @ return bool
2015-03-26 13:51:33 +00:00
* @ throws Exception
* @ throws \OC\HintException If the test file can ' t get written .
2012-07-23 22:39:59 +00:00
*/
2015-03-26 13:51:33 +00:00
public function isHtaccessWorking ( \OCP\IConfig $config ) {
2015-08-06 14:51:31 +00:00
2015-03-26 13:51:33 +00:00
if ( \OC :: $CLI || ! $config -> getSystemValue ( 'check_for_working_htaccess' , true )) {
2013-10-17 14:27:43 +00:00
return true ;
}
2014-04-29 13:00:57 +00:00
2015-01-08 08:13:18 +00:00
// php dev server does not support htaccess
if ( php_sapi_name () === 'cli-server' ) {
return false ;
}
2012-06-21 12:07:04 +00:00
// testdata
2013-08-18 08:33:09 +00:00
$fileName = '/htaccesstest.txt' ;
$testContent = 'testcontent' ;
2012-06-21 12:07:04 +00:00
// creating a test file
2015-03-26 13:51:33 +00:00
$testFile = $config -> getSystemValue ( 'datadirectory' , OC :: $SERVERROOT . '/data' ) . '/' . $fileName ;
2012-10-26 16:17:43 +00:00
2016-01-11 14:37:08 +00:00
if ( file_exists ( $testFile )) { // already running this test, possible recursive call
return false ;
}
2013-09-10 20:05:20 +00:00
$fp = @ fopen ( $testFile , 'w' );
if ( ! $fp ) {
throw new OC\HintException ( 'Can\'t create test file to check for working .htaccess file.' ,
2014-08-19 16:01:26 +00:00
'Make sure it is possible for the webserver to write to ' . $testFile );
2013-09-10 20:05:20 +00:00
}
fwrite ( $fp , $testContent );
fclose ( $fp );
2012-06-21 12:07:04 +00:00
// accessing the file via http
2015-12-17 12:03:37 +00:00
$url = \OC :: $server -> getURLGenerator () -> getAbsoluteURL ( OC :: $WEBROOT . '/data' . $fileName );
2015-12-04 17:02:47 +00:00
try {
$content = \OC :: $server -> getHTTPClientService () -> newClient () -> get ( $url ) -> getBody ();
} catch ( \Exception $e ) {
$content = false ;
}
2012-06-21 12:07:04 +00:00
// cleanup
2013-09-10 20:05:20 +00:00
@ unlink ( $testFile );
2012-06-21 12:07:04 +00:00
2014-08-19 16:01:26 +00:00
/*
* If the content is not equal to test content our . htaccess
* is working as required
*/
return $content !== $testContent ;
2012-07-23 22:39:59 +00:00
}
2012-06-21 12:07:04 +00:00
2013-01-02 22:02:38 +00:00
/**
2013-08-21 23:20:28 +00:00
* Check if the setlocal call does not work . This can happen if the right
2013-02-11 16:44:02 +00:00
* local packages are not available on the server .
2014-08-19 16:01:26 +00:00
*
2013-08-15 06:49:19 +00:00
* @ return bool
2013-01-02 22:02:38 +00:00
*/
2013-08-18 08:33:09 +00:00
public static function isSetLocaleWorking () {
2013-02-05 14:46:55 +00:00
// setlocale test is pointless on Windows
2014-08-19 16:01:26 +00:00
if ( OC_Util :: runningOnWindows ()) {
2013-02-05 14:46:55 +00:00
return true ;
}
2013-11-15 12:06:35 +00:00
\Patchwork\Utf8\Bootup :: initLocale ();
if ( '' === basename ( '§' )) {
2013-02-08 16:49:54 +00:00
return false ;
2013-04-05 18:49:57 +00:00
}
return true ;
2012-12-19 14:10:33 +00:00
}
2014-03-07 01:53:33 +00:00
/**
* Check if it ' s possible to get the inline annotations
*
* @ return bool
*/
public static function isAnnotationsWorking () {
$reflection = new \ReflectionMethod ( __METHOD__ );
$docs = $reflection -> getDocComment ();
return ( is_string ( $docs ) && strlen ( $docs ) > 50 );
}
2013-02-04 14:04:26 +00:00
/**
2014-05-19 15:50:53 +00:00
* Check if the PHP module fileinfo is loaded .
2014-08-19 16:01:26 +00:00
*
2013-02-04 14:04:26 +00:00
* @ return bool
*/
public static function fileInfoLoaded () {
return function_exists ( 'finfo_open' );
}
2012-11-29 16:58:24 +00:00
/**
2014-05-19 15:50:53 +00:00
* clear all levels of output buffering
2014-08-19 16:01:26 +00:00
*
2013-08-15 06:49:19 +00:00
* @ return void
2012-11-29 16:58:24 +00:00
*/
2014-08-19 16:01:26 +00:00
public static function obEnd () {
2012-11-29 16:58:24 +00:00
while ( ob_get_level ()) {
ob_end_clean ();
}
}
2013-02-05 14:43:12 +00:00
/**
2014-03-20 11:31:36 +00:00
* Checks whether the server is running on Windows
2014-08-19 16:01:26 +00:00
*
2014-03-20 11:31:36 +00:00
* @ return bool true if running on Windows , false otherwise
2013-02-05 14:43:12 +00:00
*/
public static function runningOnWindows () {
return ( substr ( PHP_OS , 0 , 3 ) === " WIN " );
}
2014-03-20 11:31:36 +00:00
/**
* Checks whether the server is running on Mac OS X
2014-08-19 16:01:26 +00:00
*
2014-03-20 11:31:36 +00:00
* @ return bool true if running on Mac OS X , false otherwise
*/
public static function runningOnMac () {
return ( strtoupper ( substr ( PHP_OS , 0 , 6 )) === 'DARWIN' );
}
2015-01-23 12:52:42 +00:00
/**
* Checks whether server is running on HHVM
*
* @ return bool True if running on HHVM , false otherwise
*/
public static function runningOnHhvm () {
return defined ( 'HHVM_VERSION' );
}
2013-04-24 11:45:40 +00:00
/**
* Handles the case that there may not be a theme , then check if a " default "
* theme exists and take that one
2014-08-19 16:01:26 +00:00
*
2013-04-24 11:45:40 +00:00
* @ return string the theme
*/
public static function getTheme () {
2015-12-18 10:42:09 +00:00
$theme = \OC :: $server -> getSystemConfig () -> getValue ( " theme " , '' );
2013-04-24 11:45:40 +00:00
2014-08-19 16:01:26 +00:00
if ( $theme === '' ) {
if ( is_dir ( OC :: $SERVERROOT . '/themes/default' )) {
2013-04-24 11:45:40 +00:00
$theme = 'default' ;
}
}
return $theme ;
}
2014-09-13 06:33:18 +00:00
/**
* Clear a single file from the opcode cache
* This is useful for writing to the config file
* in case the opcode cache does not re - validate files
* Returns true if successful , false if unsuccessful :
* caller should fall back on clearing the entire cache
* with clearOpcodeCache () if unsuccessful
*
2014-11-07 02:05:20 +00:00
* @ param string $path the path of the file to clear from the cache
2014-09-13 06:33:18 +00:00
* @ return bool true if underlying function returns true , otherwise false
*/
2014-11-07 02:05:20 +00:00
public static function deleteFromOpcodeCache ( $path ) {
2014-09-13 06:33:18 +00:00
$ret = false ;
if ( $path ) {
// APC >= 3.1.1
if ( function_exists ( 'apc_delete_file' )) {
$ret = @ apc_delete_file ( $path );
}
// Zend OpCache >= 7.0.0, PHP >= 5.5.0
if ( function_exists ( 'opcache_invalidate' )) {
$ret = opcache_invalidate ( $path );
}
}
return $ret ;
}
2013-05-25 15:25:43 +00:00
/**
2014-05-19 15:50:53 +00:00
* Clear the opcode cache if one exists
2013-05-25 15:25:43 +00:00
* This is necessary for writing to the config file
2013-08-21 23:20:28 +00:00
* in case the opcode cache does not re - validate files
2014-08-19 16:01:26 +00:00
*
2013-08-15 06:49:19 +00:00
* @ return void
2013-05-25 15:25:43 +00:00
*/
public static function clearOpcodeCache () {
// APC
if ( function_exists ( 'apc_clear_cache' )) {
apc_clear_cache ();
}
// Zend Opcache
if ( function_exists ( 'accelerator_reset' )) {
accelerator_reset ();
}
// XCache
if ( function_exists ( 'xcache_clear_cache' )) {
2015-10-29 08:52:13 +00:00
if ( \OC :: $server -> getIniWrapper () -> getBool ( 'xcache.admin.enable_auth' )) {
2015-07-03 12:06:40 +00:00
\OCP\Util :: writeLog ( 'core' , 'XCache opcode cache will not be cleared because "xcache.admin.enable_auth" is enabled.' , \OCP\Util :: WARN );
2013-12-14 17:32:48 +00:00
} else {
2015-05-12 17:22:39 +00:00
@ xcache_clear_cache ( XC_TYPE_PHP , 0 );
2013-12-14 17:32:48 +00:00
}
2013-05-25 15:25:43 +00:00
}
2013-07-28 14:33:03 +00:00
// Opcache (PHP >= 5.5)
if ( function_exists ( 'opcache_reset' )) {
opcache_reset ();
}
2013-05-25 15:25:43 +00:00
}
2013-04-24 11:45:40 +00:00
2013-05-24 18:35:01 +00:00
/**
* Normalize a unicode string
2014-08-19 16:01:26 +00:00
*
2013-05-24 18:35:01 +00:00
* @ param string $value a not normalized string
* @ return bool | string
*/
public static function normalizeUnicode ( $value ) {
2015-01-09 22:34:26 +00:00
if ( Normalizer :: isNormalized ( $value )) {
return $value ;
}
$normalizedValue = Normalizer :: normalize ( $value );
2014-09-09 12:41:45 +00:00
if ( $normalizedValue === null || $normalizedValue === false ) {
2015-01-09 22:34:26 +00:00
\OC :: $server -> getLogger () -> warning ( 'normalizing failed for "' . $value . '"' , [ 'app' => 'core' ]);
return $value ;
2013-05-24 18:35:01 +00:00
}
2013-04-24 11:45:40 +00:00
2015-01-09 22:34:26 +00:00
return $normalizedValue ;
2013-05-24 18:35:01 +00:00
}
2013-07-29 16:24:05 +00:00
2013-08-15 06:49:19 +00:00
/**
2014-02-06 15:30:58 +00:00
* @ param boolean | string $file
2013-08-15 06:49:19 +00:00
* @ return string
*/
public static function basename ( $file ) {
2013-07-29 21:32:03 +00:00
$file = rtrim ( $file , '/' );
2013-07-29 16:24:05 +00:00
$t = explode ( '/' , $file );
return array_pop ( $t );
}
2013-11-24 20:26:34 +00:00
/**
* A human readable string is generated based on version , channel and build number
2014-08-19 16:01:26 +00:00
*
2013-11-24 20:26:34 +00:00
* @ return string
*/
public static function getHumanVersion () {
2014-08-19 16:01:26 +00:00
$version = OC_Util :: getVersionString () . ' (' . OC_Util :: getChannel () . ')' ;
2013-11-24 20:26:34 +00:00
$build = OC_Util :: getBuild ();
2014-08-19 16:01:26 +00:00
if ( ! empty ( $build ) and OC_Util :: getChannel () === 'daily' ) {
2013-11-24 20:26:34 +00:00
$version .= ' Build:' . $build ;
}
return $version ;
}
2014-01-10 15:14:37 +00:00
/**
* Returns whether the given file name is valid
2014-08-19 16:01:26 +00:00
*
2014-05-11 20:51:30 +00:00
* @ param string $file file name to check
2014-01-10 15:14:37 +00:00
* @ return bool true if the file name is valid , false otherwise
2015-02-18 17:35:27 +00:00
* @ deprecated use \OC\Files\View :: verifyPath ()
2014-01-10 15:14:37 +00:00
*/
public static function isValidFileName ( $file ) {
$trimmed = trim ( $file );
if ( $trimmed === '' ) {
return false ;
}
2015-09-21 12:09:28 +00:00
if ( \OC\Files\Filesystem :: isIgnoredDir ( $trimmed )) {
2014-01-10 15:14:37 +00:00
return false ;
}
foreach ( str_split ( $trimmed ) as $char ) {
2014-11-25 15:28:41 +00:00
if ( strpos ( \OCP\Constants :: FILENAME_INVALID_CHARS , $char ) !== false ) {
2014-01-10 15:14:37 +00:00
return false ;
}
}
return true ;
}
2014-06-10 16:01:07 +00:00
/**
2014-09-02 12:30:46 +00:00
* Check whether the instance needs to perform an upgrade ,
* either when the core version is higher or any app requires
* an upgrade .
2014-06-10 16:01:07 +00:00
*
2014-09-08 12:56:11 +00:00
* @ param \OCP\IConfig $config
2014-09-02 12:30:46 +00:00
* @ return bool whether the core or any app needs an upgrade
2016-01-07 13:13:46 +00:00
* @ throws \OC\HintException When the upgrade from the given version is not allowed
2014-06-10 16:01:07 +00:00
*/
2014-10-24 12:13:40 +00:00
public static function needUpgrade ( \OCP\IConfig $config ) {
2014-09-08 12:56:11 +00:00
if ( $config -> getSystemValue ( 'installed' , false )) {
$installedVersion = $config -> getSystemValue ( 'version' , '0.0.0' );
2015-12-18 14:26:54 +00:00
$currentVersion = implode ( '.' , \OCP\Util :: getVersion ());
2015-08-30 16:03:33 +00:00
$versionDiff = version_compare ( $currentVersion , $installedVersion );
if ( $versionDiff > 0 ) {
2014-07-24 15:15:38 +00:00
return true ;
2016-01-07 13:13:46 +00:00
} else if ( $config -> getSystemValue ( 'debug' , false ) && $versionDiff < 0 ) {
// downgrade with debug
$installedMajor = explode ( '.' , $installedVersion );
$installedMajor = $installedMajor [ 0 ] . '.' . $installedMajor [ 1 ];
$currentMajor = explode ( '.' , $currentVersion );
$currentMajor = $currentMajor [ 0 ] . '.' . $currentMajor [ 1 ];
if ( $installedMajor === $currentMajor ) {
// Same major, allow downgrade for developers
return true ;
} else {
// downgrade attempt, throw exception
throw new \OC\HintException ( 'Downgrading is not supported and is likely to cause unpredictable issues (from ' . $installedVersion . ' to ' . $currentVersion . ')' );
}
2015-08-30 16:03:33 +00:00
} else if ( $versionDiff < 0 ) {
// downgrade attempt, throw exception
throw new \OC\HintException ( 'Downgrading is not supported and is likely to cause unpredictable issues (from ' . $installedVersion . ' to ' . $currentVersion . ')' );
2014-07-24 15:15:38 +00:00
}
2014-09-02 12:30:46 +00:00
// also check for upgrades for apps (independently from the user)
$apps = \OC_App :: getEnabledApps ( false , true );
$shouldUpgrade = false ;
2014-07-24 15:15:38 +00:00
foreach ( $apps as $app ) {
if ( \OC_App :: shouldUpgrade ( $app )) {
2014-09-02 12:30:46 +00:00
$shouldUpgrade = true ;
break ;
2014-07-24 15:15:38 +00:00
}
}
2014-09-02 12:30:46 +00:00
return $shouldUpgrade ;
2014-06-10 16:01:07 +00:00
} else {
return false ;
}
}
2014-07-25 07:53:25 +00:00
2011-07-27 17:07:28 +00:00
}