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
*
2014-05-21 10:14:10 +00:00
* @ author Georg Ehrke
* @ copytight 2014 Georg Ehrke georg @ ownCloud . com
*
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 {
2014-05-21 10:14:10 +00:00
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' );
2014-05-21 10:14:10 +00:00
list ( $extractDir , $path ) = self :: downloadApp ( $data );
$info = self :: checkAppsIntegrity ( $data , $extractDir , $path );
$basedir = OC_App :: getInstallPath () . '/' . $info [ 'id' ];
//check if the destination directory already exists
if ( is_dir ( $basedir )) {
OC_Helper :: rmdirr ( $extractDir );
if ( $data [ 'source' ] == 'http' ) {
unlink ( $path );
}
throw new \Exception ( $l -> t ( " App directory already exists " ));
}
2014-06-02 19:37:39 +00:00
if ( ! empty ( $data [ 'pretent' ])) {
2014-05-21 10:14:10 +00:00
return false ;
}
//copy the app to the correct place
if ( @! mkdir ( $basedir )) {
OC_Helper :: rmdirr ( $extractDir );
if ( $data [ 'source' ] == 'http' ) {
unlink ( $path );
}
throw new \Exception ( $l -> t ( " Can't create app folder. Please fix permissions. %s " , array ( $basedir )));
}
$extractDir .= '/' . $info [ 'id' ];
OC_Helper :: copyr ( $extractDir , $basedir );
//remove temporary files
OC_Helper :: rmdirr ( $extractDir );
//install the database
if ( is_file ( $basedir . '/appinfo/database.xml' )) {
if ( OC_Appconfig :: getValue ( $info [ 'id' ], 'installed_version' ) === null ) {
OC_DB :: createDbFromStructure ( $basedir . '/appinfo/database.xml' );
} else {
OC_DB :: updateDbFromStructure ( $basedir . '/appinfo/database.xml' );
}
}
//run appinfo/install.php
if (( ! isset ( $data [ 'noinstall' ]) or $data [ 'noinstall' ] == false ) and file_exists ( $basedir . '/appinfo/install.php' )) {
include $basedir . '/appinfo/install.php' ;
}
//set the installed version
OC_Appconfig :: setValue ( $info [ 'id' ], 'installed_version' , OC_App :: getAppVersion ( $info [ 'id' ]));
OC_Appconfig :: setValue ( $info [ 'id' ], 'enabled' , 'no' );
//set remote/public handelers
foreach ( $info [ 'remote' ] as $name => $path ) {
OCP\CONFIG :: setAppValue ( 'core' , 'remote_' . $name , $info [ 'id' ] . '/' . $path );
}
foreach ( $info [ 'public' ] as $name => $path ) {
OCP\CONFIG :: setAppValue ( 'core' , 'public_' . $name , $info [ 'id' ] . '/' . $path );
}
OC_App :: setAppTypes ( $info [ 'id' ]);
return $info [ 'id' ];
}
/**
* @ brief checks whether or not an app is installed
* @ param string $app app
* @ returns bool
*
* Checks whether or not an app is installed , i . e . registered in apps table .
*/
public static function isInstalled ( $app ) {
return ( OC_Appconfig :: getValue ( $app , " installed_version " ) !== null );
}
/**
* @ brief Update an application
2014-06-13 19:45:31 +00:00
* @ param array $info
* @ param bool $isShipped
2014-05-21 10:14:10 +00:00
*
2013-10-28 17:01:54 +00:00
* This function could work like described below , but currently it disables and then
* enables the app again . This does result in an updated app .
*
*
2014-05-21 10:14:10 +00:00
* This function installs an app . All information needed are passed in the
2013-10-28 17:01:54 +00:00
* associative array $info .
2014-05-21 10:14:10 +00:00
* 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') "
*/
2014-06-13 19:45:31 +00:00
public static function updateApp ( $info = array (), $isShipped = false ) {
2014-05-21 10:14:10 +00:00
list ( $extractDir , $path ) = self :: downloadApp ( $info );
2014-06-13 19:45:31 +00:00
$info = self :: checkAppsIntegrity ( $info , $extractDir , $path , $isShipped );
2014-05-21 10:14:10 +00:00
$currentDir = OC_App :: getAppPath ( $info [ 'id' ]);
$basedir = OC_App :: getInstallPath ();
$basedir .= '/' ;
$basedir .= $info [ 'id' ];
2014-06-06 07:41:33 +00:00
if ( $currentDir !== false && is_writable ( $currentDir )) {
2014-05-21 10:14:10 +00:00
$basedir = $currentDir ;
}
if ( is_dir ( $basedir )) {
OC_Helper :: rmdirr ( $basedir );
}
$appInExtractDir = $extractDir ;
if ( substr ( $extractDir , - 1 ) !== '/' ) {
$appInExtractDir .= '/' ;
}
$appInExtractDir .= $info [ 'id' ];
OC_Helper :: copyr ( $appInExtractDir , $basedir );
OC_Helper :: rmdirr ( $extractDir );
return OC_App :: updateApp ( $info [ 'id' ]);
}
2014-06-04 14:29:41 +00:00
/**
* update an app by it ' s id
* @ param integer $ocsid
2014-06-13 19:45:31 +00:00
* @ param bool $isShipped
2014-06-04 14:29:41 +00:00
* @ return bool
* @ throws Exception
*/
2014-06-13 19:45:31 +00:00
public static function updateAppByOCSId ( $ocsid , $isShipped = false ) {
2014-06-04 14:29:41 +00:00
$appdata = OC_OCSClient :: getApplication ( $ocsid );
$download = OC_OCSClient :: getApplicationDownload ( $ocsid , 1 );
if ( isset ( $download [ 'downloadlink' ]) && trim ( $download [ 'downloadlink' ]) !== '' ) {
$download [ 'downloadlink' ] = str_replace ( ' ' , '%20' , $download [ 'downloadlink' ]);
$info = array (
'source' => 'http' ,
'href' => $download [ 'downloadlink' ],
'appdata' => $appdata
);
} else {
throw new \Exception ( 'Could not fetch app info!' );
}
return self :: updateApp ( $info );
}
2014-05-21 10:14:10 +00:00
/**
* @ param array $data
* @ return array
* @ throws Exception
*/
public static function downloadApp ( $data = array ()) {
$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
2014-05-21 10:14:10 +00:00
return array (
$extractDir ,
$path
);
}
/**
* check an app ' s integrity
* @ param array $data
* @ param string $extractDir
2014-06-13 19:45:31 +00:00
* @ param bool $isShipped
2014-05-21 10:14:10 +00:00
* @ return array
* @ throws \Exception
*/
2014-06-13 19:45:31 +00:00
public static function checkAppsIntegrity ( $data = array (), $extractDir , $path , $isShipped = false ) {
2014-05-21 10:14:10 +00:00
$l = \OC_L10N :: get ( 'lib' );
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
2014-06-16 11:49:02 +00:00
if ( ! $isShipped && ! 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
2014-06-13 19:45:31 +00:00
if ( ! $isShipped && isset ( $info [ 'shipped' ]) && ( $info [ 'shipped' ] == 'true' )) {
2013-01-21 19:40:23 +00:00
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
2014-06-04 14:29:41 +00:00
if ( isset ( $data [ 'appdata' ][ 'version' ]) && $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
2014-05-21 10:14:10 +00:00
return $info ;
2011-05-15 14:31:30 +00:00
}
2013-01-31 09:30:13 +00:00
/**
2014-05-21 10:14:10 +00:00
* Check if an update for the app is available
* @ param string $app
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 ) {
2014-06-10 16:38:21 +00:00
static $isInstanceReadyForUpdates = null ;
if ( $isInstanceReadyForUpdates === null ) {
$installPath = OC_App :: getInstallPath ();
if ( $installPath === false || $installPath === null ) {
$isInstanceReadyForUpdates = false ;
} else {
$isInstanceReadyForUpdates = true ;
}
}
if ( $isInstanceReadyForUpdates === false ) {
return false ;
}
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
foreach ( OC :: $APPSROOTS as $dir ) {
2014-05-31 15:50:39 +00:00
$dirToTest = $dir [ 'path' ];
$dirToTest .= '/' ;
$dirToTest .= $name ;
$dirToTest .= '/' ;
if ( is_dir ( $dirToTest )) {
return true ;
}
2013-01-21 19:40:23 +00:00
}
2014-05-31 15:50:39 +00:00
return false ;
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-05-31 15:50:39 +00:00
* @ return boolean
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 );
2014-05-31 15:50:39 +00:00
return true ;
2013-01-21 19:40:23 +00:00
} else {
OC_Log :: write ( 'core' , 'can\'t remove app ' . $name . '. It is not installed.' , OC_Log :: ERROR );
2014-05-31 15:50:39 +00:00
return false ;
2013-01-21 19:40:23 +00:00
}
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 ));
2014-05-31 16:02:59 +00:00
if ( array_key_exists ( 'ocsid' , $info )) {
OC_Appconfig :: setValue ( $app , 'ocsid' , $info [ 'ocsid' ]);
}
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
}