2011-05-15 14:31:30 +00:00
< ? php
/**
* ownCloud
*
* @ author Robin Appelman
2012-05-26 17:14:24 +00:00
* @ copyright 2012 Frank Karlitschek frank @ owncloud . org
2011-05-15 14:31:30 +00:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*
*/
/**
* This class provides the functionality needed to install , update and remove plugins / apps
*/
2011-07-29 19:36:03 +00:00
class OC_Installer {
2011-05-15 14:31:30 +00:00
/**
*
* This function installs an app . All information needed are passed in the
* associative array $data .
* The following keys are required :
* - source : string , can be " path " or " http "
*
* One of the following keys is required :
* - path : path to the file containing the app
* - href : link to the downloadable file containing the app
*
* The following keys are optional :
* - pretend : boolean , if set true the system won ' t do anything
* - noinstall : boolean , if true appinfo / install . php won ' t be loaded
* - inactive : boolean , if set true the appconfig / app . sample . php won ' t be
* renamed
*
* This function works as follows
* - # fetching the file
* - # unzipping it
2012-04-21 20:47:56 +00:00
* - # check the code
2011-05-28 15:33:25 +00:00
* - # installing the database at appinfo/database.xml
2011-05-15 14:31:30 +00:00
* - # including appinfo/install.php
* - # setting the installed version
*
* It is the task of oc_app_install to create the tables and do whatever is
* needed to get the app working .
2014-02-08 10:47:55 +00:00
*
2014-05-19 15:50:53 +00:00
* Installs an app
2014-02-08 10:47:55 +00:00
* @ param array $data with all information
* @ throws \Exception
* @ return integer
2011-05-15 14:31:30 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function installApp ( $data = array ()) {
2013-08-09 19:57:01 +00:00
$l = \OC_L10N :: get ( 'lib' );
2012-09-07 13:22:01 +00:00
if ( ! isset ( $data [ 'source' ])) {
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " No source specified when installing app " ));
2011-05-28 15:33:25 +00:00
}
2012-08-04 19:25:03 +00:00
2011-05-28 15:33:25 +00:00
//download the file if necesary
2012-09-07 13:22:01 +00:00
if ( $data [ 'source' ] == 'http' ) {
2012-03-28 22:07:28 +00:00
$path = OC_Helper :: tmpFile ();
2012-09-07 13:22:01 +00:00
if ( ! isset ( $data [ 'href' ])) {
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " No href specified when installing app from http " ));
2011-05-28 15:33:25 +00:00
}
2012-11-02 18:53:02 +00:00
copy ( $data [ 'href' ], $path );
2011-05-28 15:33:25 +00:00
} else {
2012-09-07 13:22:01 +00:00
if ( ! isset ( $data [ 'path' ])) {
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " No path specified when installing app from local file " ));
2011-05-28 15:33:25 +00:00
}
$path = $data [ 'path' ];
}
2012-08-04 19:25:03 +00:00
2012-03-28 22:07:28 +00:00
//detect the archive type
$mime = OC_Helper :: getMimeType ( $path );
2012-09-07 13:22:01 +00:00
if ( $mime == 'application/zip' ) {
2012-11-02 18:53:02 +00:00
rename ( $path , $path . '.zip' );
2012-03-28 22:07:28 +00:00
$path .= '.zip' ;
2012-09-07 13:22:01 +00:00
} elseif ( $mime == 'application/x-gzip' ) {
2012-11-02 18:53:02 +00:00
rename ( $path , $path . '.tgz' );
2012-03-28 22:07:28 +00:00
$path .= '.tgz' ;
} else {
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " Archives of type %s are not supported " , array ( $mime )));
2012-03-28 22:07:28 +00:00
}
2012-08-04 19:25:03 +00:00
2011-05-28 15:33:25 +00:00
//extract the archive in a temporary folder
2012-03-28 22:07:28 +00:00
$extractDir = OC_Helper :: tmpFolder ();
2012-04-21 20:47:56 +00:00
OC_Helper :: rmdirr ( $extractDir );
2011-05-28 15:33:25 +00:00
mkdir ( $extractDir );
2012-09-07 13:22:01 +00:00
if ( $archive = OC_Archive :: open ( $path )) {
2012-03-28 22:07:28 +00:00
$archive -> extract ( $extractDir );
2011-05-28 15:33:25 +00:00
} else {
2011-07-29 19:36:03 +00:00
OC_Helper :: rmdirr ( $extractDir );
2012-09-07 13:22:01 +00:00
if ( $data [ 'source' ] == 'http' ) {
2011-05-28 15:33:25 +00:00
unlink ( $path );
}
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " Failed to open archive when installing app " ));
2011-05-28 15:33:25 +00:00
}
2012-08-04 19:25:03 +00:00
2011-05-28 15:33:25 +00:00
//load the info.xml file of the app
2012-09-07 13:22:01 +00:00
if ( ! is_file ( $extractDir . '/appinfo/info.xml' )) {
2012-03-28 22:11:29 +00:00
//try to find it in a subdir
$dh = opendir ( $extractDir );
2013-09-04 11:06:04 +00:00
if ( is_resource ( $dh )) {
while (( $folder = readdir ( $dh )) !== false ) {
if ( $folder [ 0 ] != '.' and is_dir ( $extractDir . '/' . $folder )) {
if ( is_file ( $extractDir . '/' . $folder . '/appinfo/info.xml' )) {
$extractDir .= '/' . $folder ;
}
2012-03-28 22:11:29 +00:00
}
}
}
}
2012-09-07 13:22:01 +00:00
if ( ! is_file ( $extractDir . '/appinfo/info.xml' )) {
2011-07-29 19:36:03 +00:00
OC_Helper :: rmdirr ( $extractDir );
2012-09-07 13:22:01 +00:00
if ( $data [ 'source' ] == 'http' ) {
2011-05-28 15:33:25 +00:00
unlink ( $path );
}
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " App does not provide an info.xml file " ));
2011-05-28 15:33:25 +00:00
}
2012-10-23 20:53:54 +00:00
$info = OC_App :: getAppInfo ( $extractDir . '/appinfo/info.xml' , true );
2012-07-23 22:39:59 +00:00
// check the code for not allowed calls
2012-10-28 17:12:31 +00:00
if ( ! OC_Installer :: checkCode ( $info [ 'id' ], $extractDir )) {
2012-04-21 20:47:56 +00:00
OC_Helper :: rmdirr ( $extractDir );
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " App can't be installed because of not allowed code in the App " ));
2012-04-21 20:47:56 +00:00
}
2012-05-18 13:54:36 +00:00
2012-07-23 22:39:59 +00:00
// check if the app is compatible with this version of ownCloud
2014-05-27 09:54:12 +00:00
if ( ! OC_App :: isAppCompatible ( OC_Util :: getVersion (), $info )) {
2012-05-18 13:54:36 +00:00
OC_Helper :: rmdirr ( $extractDir );
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " App can't be installed because it is not compatible with this version of ownCloud " ));
2012-05-18 13:54:36 +00:00
}
2013-01-21 19:40:23 +00:00
// check if shipped tag is set which is only allowed for apps that are shipped with ownCloud
if ( isset ( $info [ 'shipped' ]) and ( $info [ 'shipped' ] == 'true' )) {
OC_Helper :: rmdirr ( $extractDir );
2013-08-18 11:49:34 +00:00
throw new \Exception ( $l -> t ( " App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps " ));
2013-01-21 19:40:23 +00:00
}
// check if the ocs version is the same as the version in info.xml/version
2013-11-18 11:16:03 +00:00
$versionFile = $extractDir . '/appinfo/version' ;
if ( is_file ( $versionFile )) {
$version = trim ( file_get_contents ( $versionFile ));
} else {
$version = trim ( $info [ 'version' ]);
}
2014-02-19 10:50:17 +00:00
2013-11-18 11:16:03 +00:00
if ( $version <> trim ( $data [ 'appdata' ][ 'version' ])) {
2013-01-21 19:40:23 +00:00
OC_Helper :: rmdirr ( $extractDir );
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " App can't be installed because the version in info.xml/version is not the same as the version reported from the app store " ));
2013-01-21 19:40:23 +00:00
}
2013-11-18 11:19:16 +00:00
2012-06-14 21:00:02 +00:00
$basedir = OC_App :: getInstallPath () . '/' . $info [ 'id' ];
2011-06-19 13:18:52 +00:00
//check if the destination directory already exists
2012-09-07 13:22:01 +00:00
if ( is_dir ( $basedir )) {
2011-07-29 19:36:03 +00:00
OC_Helper :: rmdirr ( $extractDir );
2012-09-07 13:22:01 +00:00
if ( $data [ 'source' ] == 'http' ) {
2011-06-19 20:42:33 +00:00
unlink ( $path );
}
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " App directory already exists " ));
2011-06-19 20:42:33 +00:00
}
2012-08-04 19:25:03 +00:00
2012-09-07 13:22:01 +00:00
if ( isset ( $data [ 'pretent' ]) and $data [ 'pretent' ] == true ) {
2011-06-19 13:18:52 +00:00
return false ;
2011-05-28 15:33:25 +00:00
}
2012-08-04 19:25:03 +00:00
2011-05-28 15:33:25 +00:00
//copy the app to the correct place
2012-09-07 13:22:01 +00:00
if ( @! mkdir ( $basedir )) {
2011-07-29 19:36:03 +00:00
OC_Helper :: rmdirr ( $extractDir );
2012-09-07 13:22:01 +00:00
if ( $data [ 'source' ] == 'http' ) {
2011-05-28 15:33:25 +00:00
unlink ( $path );
}
2013-08-09 19:57:01 +00:00
throw new \Exception ( $l -> t ( " Can't create app folder. Please fix permissions. %s " , array ( $basedir )));
2011-05-28 15:33:25 +00:00
}
2012-10-28 17:12:31 +00:00
OC_Helper :: copyr ( $extractDir , $basedir );
2012-08-04 19:25:03 +00:00
2011-05-28 15:33:25 +00:00
//remove temporary files
2011-07-29 19:36:03 +00:00
OC_Helper :: rmdirr ( $extractDir );
2012-08-04 19:25:03 +00:00
2011-05-28 15:33:25 +00:00
//install the database
2012-09-07 13:22:01 +00:00
if ( is_file ( $basedir . '/appinfo/database.xml' )) {
2013-10-25 13:38:08 +00:00
if ( OC_Appconfig :: getValue ( $info [ 'id' ], 'installed_version' ) === null ) {
OC_DB :: createDbFromStructure ( $basedir . '/appinfo/database.xml' );
} else {
OC_DB :: updateDbFromStructure ( $basedir . '/appinfo/database.xml' );
}
2011-05-28 15:33:25 +00:00
}
2012-08-04 19:25:03 +00:00
2011-05-28 15:33:25 +00:00
//run appinfo/install.php
2012-09-07 13:22:01 +00:00
if (( ! isset ( $data [ 'noinstall' ]) or $data [ 'noinstall' ] == false ) and file_exists ( $basedir . '/appinfo/install.php' )) {
2012-10-22 19:40:33 +00:00
include $basedir . '/appinfo/install.php' ;
2011-05-28 15:33:25 +00:00
}
2012-08-04 19:25:03 +00:00
2011-05-28 15:33:25 +00:00
//set the installed version
2012-10-28 17:12:31 +00:00
OC_Appconfig :: setValue ( $info [ 'id' ], 'installed_version' , OC_App :: getAppVersion ( $info [ 'id' ]));
OC_Appconfig :: setValue ( $info [ 'id' ], 'enabled' , 'no' );
2012-05-11 18:58:23 +00:00
//set remote/public handelers
2012-09-07 13:22:01 +00:00
foreach ( $info [ 'remote' ] as $name => $path ) {
2012-08-04 19:25:03 +00:00
OCP\CONFIG :: setAppValue ( 'core' , 'remote_' . $name , $info [ 'id' ] . '/' . $path );
2012-05-11 18:58:23 +00:00
}
2012-09-07 13:22:01 +00:00
foreach ( $info [ 'public' ] as $name => $path ) {
2012-08-04 19:25:03 +00:00
OCP\CONFIG :: setAppValue ( 'core' , 'public_' . $name , $info [ 'id' ] . '/' . $path );
2012-05-11 18:58:23 +00:00
}
2012-05-14 20:49:20 +00:00
OC_App :: setAppTypes ( $info [ 'id' ]);
2012-08-04 19:25:03 +00:00
2012-01-27 16:34:47 +00:00
return $info [ 'id' ];
2011-06-19 13:18:52 +00:00
}
/**
2014-05-19 15:50:53 +00:00
* checks whether or not an app is installed
2014-02-08 10:47:55 +00:00
* @ param string $app app
2014-05-11 20:51:30 +00:00
* @ return bool
2011-06-19 13:18:52 +00:00
*
* Checks whether or not an app is installed , i . e . registered in apps table .
*/
2012-09-07 13:22:01 +00:00
public static function isInstalled ( $app ) {
2011-06-19 13:18:52 +00:00
2012-09-07 13:22:01 +00:00
if ( null == OC_Appconfig :: getValue ( $app , " installed_version " )) {
2011-06-19 13:18:52 +00:00
return false ;
}
2011-05-15 14:31:30 +00:00
return true ;
}
/**
2014-05-19 15:50:53 +00:00
* Update an application
2014-02-19 10:50:17 +00:00
*
* This function installs an app . All information needed are passed in the
* associative array $data .
* The following keys are required :
* - source : string , can be " path " or " http "
*
* One of the following keys is required :
* - path : path to the file containing the app
* - href : link to the downloadable file containing the app
*
* The following keys are optional :
* - pretend : boolean , if set true the system won ' t do anything
* - noupgrade : boolean , if true appinfo / upgrade . php won ' t be loaded
*
* This function works as follows
* - # fetching the file
* - # removing the old files
* - # unzipping new file
* - # including appinfo/upgrade.php
* - # setting the installed version
*
* upgrade . php can determine the current installed version of the app using
* " OC_Appconfig::getValue( $appid , 'installed_version') "
2011-05-15 14:31:30 +00:00
*/
2013-01-21 19:40:23 +00:00
public static function updateApp ( $app ) {
2013-01-31 09:00:42 +00:00
$ocsid = OC_Appconfig :: getValue ( $app , 'ocsid' );
2013-01-30 11:08:14 +00:00
OC_App :: disable ( $app );
OC_App :: enable ( $ocsid );
2013-01-31 11:24:10 +00:00
return ( true );
2011-05-15 14:31:30 +00:00
}
2013-01-31 09:30:13 +00:00
/**
2014-05-19 15:50:53 +00:00
* Check if an update for the app is available
2014-02-06 15:30:58 +00:00
* @ return string | false false or the version number of the update
2013-01-31 09:30:13 +00:00
*
* The function will check if an update for a version is available
*/
public static function isUpdateAvailable ( $app ) {
2013-01-21 19:40:23 +00:00
$ocsid = OC_Appconfig :: getValue ( $app , 'ocsid' , '' );
2013-02-09 15:46:55 +00:00
if ( $ocsid <> '' ) {
2013-01-31 09:30:13 +00:00
2013-01-21 19:40:23 +00:00
$ocsdata = OC_OCSClient :: getApplication ( $ocsid );
2013-01-30 11:08:14 +00:00
$ocsversion = ( string ) $ocsdata [ 'version' ];
2013-01-21 19:40:23 +00:00
$currentversion = OC_App :: getAppVersion ( $app );
2013-02-09 15:46:55 +00:00
if ( $ocsversion <> $currentversion ) {
2013-01-30 11:08:14 +00:00
return ( $ocsversion );
2013-01-21 19:40:23 +00:00
2013-01-30 11:08:14 +00:00
} else {
2013-10-25 13:33:45 +00:00
return false ;
2013-01-30 11:08:14 +00:00
}
2013-01-21 19:40:23 +00:00
} else {
2013-10-25 13:33:45 +00:00
return false ;
2013-01-21 19:40:23 +00:00
}
2013-01-31 09:30:13 +00:00
}
2013-01-21 19:40:23 +00:00
2013-01-31 09:30:13 +00:00
/**
2014-05-19 15:50:53 +00:00
* Check if app is already downloaded
2014-02-08 10:47:55 +00:00
* @ param string $name name of the application to remove
* @ return boolean
2013-01-31 09:30:13 +00:00
*
* The function will check if the app is already downloaded in the apps repository
*/
public static function isDownloaded ( $name ) {
2013-01-21 19:40:23 +00:00
$downloaded = false ;
foreach ( OC :: $APPSROOTS as $dir ) {
2013-01-31 09:30:13 +00:00
if ( is_dir ( $dir [ 'path' ] . '/' . $name )) $downloaded = true ;
2013-01-21 19:40:23 +00:00
}
return ( $downloaded );
2013-01-31 09:30:13 +00:00
}
2013-01-21 19:40:23 +00:00
2011-05-15 14:31:30 +00:00
/**
2014-05-19 15:50:53 +00:00
* Removes an app
2014-02-06 15:30:58 +00:00
* @ param string $name name of the application to remove
2014-05-11 20:51:30 +00:00
* @ param array $options options
2014-02-19 08:31:54 +00:00
* @ return boolean | null
2011-05-15 14:31:30 +00:00
*
* This function removes an app . $options is an associative array . The
* following keys are optional : ja
* - keeppreferences : boolean , if true the user preferences won ' t be deleted
* - keepappconfig : boolean , if true the config will be kept
* - keeptables : boolean , if true the database will be kept
* - keepfiles : boolean , if true the user files will be kept
*
* This function works as follows
* - # including appinfo/remove.php
* - # removing the files
*
* The function will not delete preferences , tables and the configuration ,
* this has to be done by the function oc_app_uninstall () .
*/
2012-09-07 13:22:01 +00:00
public static function removeApp ( $name , $options = array ()) {
2013-01-21 19:40:23 +00:00
2013-02-09 15:46:55 +00:00
if ( isset ( $options [ 'keeppreferences' ]) and $options [ 'keeppreferences' ] == false ) {
2013-01-21 19:40:23 +00:00
// todo
// remove preferences
}
2013-02-09 15:46:55 +00:00
if ( isset ( $options [ 'keepappconfig' ]) and $options [ 'keepappconfig' ] == false ) {
2013-01-21 19:40:23 +00:00
// todo
// remove app config
}
2013-02-09 15:46:55 +00:00
if ( isset ( $options [ 'keeptables' ]) and $options [ 'keeptables' ] == false ) {
2013-01-21 19:40:23 +00:00
// todo
// remove app database tables
}
2013-02-09 15:46:55 +00:00
if ( isset ( $options [ 'keepfiles' ]) and $options [ 'keepfiles' ] == false ) {
2013-01-21 19:40:23 +00:00
// todo
// remove user files
}
2013-01-31 09:30:13 +00:00
if ( OC_Installer :: isDownloaded ( $name )) {
2013-01-21 19:40:23 +00:00
$appdir = OC_App :: getInstallPath () . '/' . $name ;
OC_Helper :: rmdirr ( $appdir );
} else {
OC_Log :: write ( 'core' , 'can\'t remove app ' . $name . '. It is not installed.' , OC_Log :: ERROR );
}
2011-05-15 14:31:30 +00:00
}
2011-06-21 20:16:41 +00:00
/**
2014-05-19 15:50:53 +00:00
* Installs shipped apps
2011-06-21 20:16:41 +00:00
*
2012-04-29 12:38:56 +00:00
* This function installs all apps found in the 'apps' directory that should be enabled by default ;
2011-06-21 20:16:41 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function installShippedApps () {
2012-06-04 20:37:00 +00:00
foreach ( OC :: $APPSROOTS as $app_dir ) {
2012-09-07 13:22:01 +00:00
if ( $dir = opendir ( $app_dir [ 'path' ] )) {
while ( false !== ( $filename = readdir ( $dir ))) {
if ( substr ( $filename , 0 , 1 ) != '.' and is_dir ( $app_dir [ 'path' ] . " / $filename " ) ) {
if ( file_exists ( $app_dir [ 'path' ] . " / $filename /appinfo/app.php " )) {
if ( ! OC_Installer :: isInstalled ( $filename )) {
2012-06-23 14:17:59 +00:00
$info = OC_App :: getAppInfo ( $filename );
$enabled = isset ( $info [ 'default_enable' ]);
2012-09-07 13:22:01 +00:00
if ( $enabled ) {
2012-06-23 14:17:59 +00:00
OC_Installer :: installShippedApp ( $filename );
2012-10-28 17:12:31 +00:00
OC_Appconfig :: setValue ( $filename , 'enabled' , 'yes' );
2012-06-23 14:17:59 +00:00
}
2012-06-04 20:37:00 +00:00
}
2011-06-21 20:16:41 +00:00
}
}
}
2012-06-23 14:21:47 +00:00
closedir ( $dir );
2011-06-21 20:16:41 +00:00
}
}
}
2011-08-22 12:17:38 +00:00
/**
* install an app already placed in the app folder
* @ param string $app id of the app to install
2014-02-08 10:47:55 +00:00
* @ return integer
2011-08-22 12:17:38 +00:00
*/
2012-09-07 13:22:01 +00:00
public static function installShippedApp ( $app ) {
2011-08-22 12:17:38 +00:00
//install the database
2012-09-07 13:22:01 +00:00
if ( is_file ( OC_App :: getAppPath ( $app ) . " /appinfo/database.xml " )) {
2012-06-01 22:11:03 +00:00
OC_DB :: createDbFromStructure ( OC_App :: getAppPath ( $app ) . " /appinfo/database.xml " );
2011-08-22 12:17:38 +00:00
}
//run appinfo/install.php
2012-09-07 13:22:01 +00:00
if ( is_file ( OC_App :: getAppPath ( $app ) . " /appinfo/install.php " )) {
2012-10-22 19:40:33 +00:00
include OC_App :: getAppPath ( $app ) . " /appinfo/install.php " ;
2011-08-22 12:17:38 +00:00
}
2012-03-30 11:48:44 +00:00
$info = OC_App :: getAppInfo ( $app );
2014-01-15 16:11:29 +00:00
if ( is_null ( $info )) {
return false ;
}
2012-10-28 17:12:31 +00:00
OC_Appconfig :: setValue ( $app , 'installed_version' , OC_App :: getAppVersion ( $app ));
2012-08-04 19:25:03 +00:00
2012-05-11 18:58:23 +00:00
//set remote/public handelers
2012-09-07 13:22:01 +00:00
foreach ( $info [ 'remote' ] as $name => $path ) {
2012-06-04 20:37:00 +00:00
OCP\CONFIG :: setAppValue ( 'core' , 'remote_' . $name , $app . '/' . $path );
2012-05-11 18:58:23 +00:00
}
2012-09-07 13:22:01 +00:00
foreach ( $info [ 'public' ] as $name => $path ) {
2012-06-04 20:37:00 +00:00
OCP\CONFIG :: setAppValue ( 'core' , 'public_' . $name , $app . '/' . $path );
2012-05-11 18:58:23 +00:00
}
2012-08-04 19:25:03 +00:00
2012-05-14 20:49:20 +00:00
OC_App :: setAppTypes ( $info [ 'id' ]);
2012-08-04 19:25:03 +00:00
2012-08-04 23:40:19 +00:00
return $info [ 'id' ];
2011-08-22 12:17:38 +00:00
}
2012-04-21 20:47:56 +00:00
2012-07-23 22:39:59 +00:00
/**
* check the code of an app with some static code checks
* @ param string $folder the folder of the app to check
2014-02-08 10:47:55 +00:00
* @ return boolean true for app is o . k . and false for app is not o . k .
2012-07-23 22:39:59 +00:00
*/
2012-11-02 18:53:02 +00:00
public static function checkCode ( $appname , $folder ) {
2012-04-21 20:47:56 +00:00
$blacklist = array (
2012-05-18 16:22:37 +00:00
'exec(' ,
2013-05-17 13:48:51 +00:00
'eval(' ,
2012-04-21 20:47:56 +00:00
// more evil pattern will go here later
2013-05-17 13:48:51 +00:00
// classes replaced by the public api
'OC_API::' ,
'OC_App::' ,
'OC_AppConfig::' ,
2013-08-28 14:39:00 +00:00
'OC_Avatar' ,
2013-05-17 13:48:51 +00:00
'OC_BackgroundJob::' ,
'OC_Config::' ,
'OC_DB::' ,
'OC_Files::' ,
'OC_Helper::' ,
'OC_Hook::' ,
2013-07-19 09:23:47 +00:00
'OC_Image::' ,
2013-05-17 13:48:51 +00:00
'OC_JSON::' ,
2013-07-19 09:40:11 +00:00
'OC_L10N::' ,
2013-05-17 13:48:51 +00:00
'OC_Log::' ,
'OC_Mail::' ,
'OC_Preferences::' ,
'OC_Request::' ,
'OC_Response::' ,
'OC_Template::' ,
'OC_User::' ,
'OC_Util::' ,
2012-04-21 20:47:56 +00:00
);
// is the code checker enabled?
2013-11-18 17:42:06 +00:00
if ( OC_Config :: getValue ( 'appcodechecker' , true )) {
2012-04-21 20:47:56 +00:00
// check if grep is installed
2014-02-21 12:45:57 +00:00
$grep = exec ( 'command -v grep' );
2012-04-21 20:47:56 +00:00
if ( $grep == '' ) {
2013-02-11 16:44:02 +00:00
OC_Log :: write ( 'core' ,
'grep not installed. So checking the code of the app "' . $appname . '" was not possible' ,
OC_Log :: ERROR );
2012-04-21 20:47:56 +00:00
return true ;
}
// iterate the bad patterns
foreach ( $blacklist as $bl ) {
$cmd = 'grep -ri ' . escapeshellarg ( $bl ) . ' ' . $folder . '' ;
$result = exec ( $cmd );
// bad pattern found
if ( $result <> '' ) {
2013-02-11 16:44:02 +00:00
OC_Log :: write ( 'core' ,
'App "' . $appname . '" is using a not allowed call "' . $bl . '". Installation refused.' ,
OC_Log :: ERROR );
2012-04-21 20:47:56 +00:00
return false ;
}
}
return true ;
2012-08-04 19:25:03 +00:00
2012-04-21 20:47:56 +00:00
} else {
2012-07-23 22:39:59 +00:00
return true ;
2012-04-21 20:47:56 +00:00
}
2012-07-23 22:39:59 +00:00
}
2011-05-15 14:31:30 +00:00
}