2011-05-15 18:31:30 +04:00
< ? php
/**
2015-03-26 13:44:34 +03:00
* @ author Arthur Schiwon < blizzz @ owncloud . com >
* @ author Bart Visscher < bartv @ thisnet . nl >
* @ author Brice Maron < brice @ bmaron . net >
* @ author Christopher Schäpers < kondou @ ts . unde . re >
* @ author Felix Moeller < mail @ felixmoeller . de >
* @ author Frank Karlitschek < frank @ owncloud . org >
* @ author Georg Ehrke < georg @ owncloud . com >
* @ author Jakob Sack < mail @ jakobsack . de >
* @ author Joas Schilling < nickvergessen @ owncloud . com >
* @ author Jörn Friedrich Dreyer < jfd @ butonic . de >
* @ author Kamil Domanski < kdomanski @ kdemail . net >
* @ author Lukas Reschke < lukas @ owncloud . com >
2015-10-05 21:54:56 +03:00
* @ author michag86 < micha_g @ arcor . de >
2015-03-26 13:44:34 +03:00
* @ author Morris Jobke < hey @ morrisjobke . de >
* @ author Robin Appelman < icewind @ owncloud . com >
* @ author Robin McCorkell < rmccorkell @ karoshi . org . uk >
* @ author root < root @ oc . ( none ) >
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
* @ author Thomas Tanghus < thomas @ tanghus . net >
* @ author Vincent Petry < pvince81 @ owncloud . com >
2011-05-15 18:31:30 +04:00
*
2015-03-26 13:44:34 +03:00
* @ copyright Copyright ( c ) 2015 , ownCloud , Inc .
* @ license AGPL - 3.0
2011-05-15 18:31:30 +04:00
*
2015-03-26 13:44:34 +03:00
* 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 .
2014-05-21 14:14:10 +04:00
*
2015-03-26 13:44:34 +03:00
* This program is distributed in the hope that it will be useful ,
2011-05-15 18:31:30 +04:00
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
2015-03-26 13:44:34 +03:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
2011-05-15 18:31:30 +04:00
*
2015-03-26 13:44:34 +03:00
* 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-05-15 18:31:30 +04:00
*
*/
2015-02-26 13:37:37 +03:00
2015-02-10 00:48:27 +03:00
use OC\OCSClient ;
/**
* This class provides the functionality needed to install , update and remove plugins / apps
*/
2011-07-29 23:36:03 +04:00
class OC_Installer {
2014-05-21 14:14:10 +04:00
2011-05-15 18:31:30 +04: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-22 00:47:56 +04:00
* - # check the code
2011-05-28 19:33:25 +04:00
* - # installing the database at appinfo/database.xml
2011-05-15 18:31:30 +04: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 14:47:55 +04:00
*
2014-05-19 19:50:53 +04:00
* Installs an app
2014-02-08 14:47:55 +04:00
* @ param array $data with all information
* @ throws \Exception
* @ return integer
2011-05-15 18:31:30 +04:00
*/
2012-09-07 17:22:01 +04:00
public static function installApp ( $data = array ()) {
2014-08-31 12:05:59 +04:00
$l = \OC :: $server -> getL10N ( 'lib' );
2013-08-09 23:57:01 +04:00
2014-05-21 14:14:10 +04: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 23:37:39 +04:00
if ( ! empty ( $data [ 'pretent' ])) {
2014-05-21 14:14:10 +04: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' ];
2015-08-10 10:36:16 +03:00
if ( ! file_exists ( $extractDir )) {
2015-08-10 11:34:44 +03:00
OC_Helper :: rmdirr ( $basedir );
2015-08-10 10:36:16 +03:00
throw new \Exception ( $l -> t ( " Archive does not contain a directory named %s " , $info [ 'id' ]));
}
2014-05-21 14:14:10 +04:00
OC_Helper :: copyr ( $extractDir , $basedir );
//remove temporary files
OC_Helper :: rmdirr ( $extractDir );
//install the database
if ( is_file ( $basedir . '/appinfo/database.xml' )) {
2015-07-03 15:16:29 +03:00
if ( \OC :: $server -> getAppConfig () -> getValue ( $info [ 'id' ], 'installed_version' ) === null ) {
2014-05-21 14:14:10 +04:00
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
2015-07-03 15:16:29 +03:00
\OC :: $server -> getAppConfig () -> setValue ( $info [ 'id' ], 'installed_version' , OC_App :: getAppVersion ( $info [ 'id' ]));
\OC :: $server -> getAppConfig () -> setValue ( $info [ 'id' ], 'enabled' , 'no' );
2014-05-21 14:14:10 +04:00
//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 ) {
2015-07-03 15:16:29 +03:00
return ( \OC :: $server -> getAppConfig () -> getValue ( $app , " installed_version " ) !== null );
2014-05-21 14:14:10 +04:00
}
/**
* @ brief Update an application
2014-06-13 23:45:31 +04:00
* @ param array $info
* @ param bool $isShipped
2014-05-21 14:14:10 +04:00
*
2013-10-28 21:01:54 +04: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 14:14:10 +04:00
* This function installs an app . All information needed are passed in the
2013-10-28 21:01:54 +04:00
* associative array $info .
2014-05-21 14:14:10 +04: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
2015-07-03 15:16:29 +03:00
* " \ OC:: $server->getAppConfig ()->getValue( $appid , 'installed_version') "
2014-05-21 14:14:10 +04:00
*/
2014-06-13 23:45:31 +04:00
public static function updateApp ( $info = array (), $isShipped = false ) {
2014-05-21 14:14:10 +04:00
list ( $extractDir , $path ) = self :: downloadApp ( $info );
2014-06-13 23:45:31 +04:00
$info = self :: checkAppsIntegrity ( $info , $extractDir , $path , $isShipped );
2014-05-21 14:14:10 +04:00
$currentDir = OC_App :: getAppPath ( $info [ 'id' ]);
$basedir = OC_App :: getInstallPath ();
$basedir .= '/' ;
$basedir .= $info [ 'id' ];
2014-06-06 11:41:33 +04:00
if ( $currentDir !== false && is_writable ( $currentDir )) {
2014-05-21 14:14:10 +04: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 18:29:41 +04:00
/**
* update an app by it ' s id
2015-03-11 11:59:56 +03:00
*
* @ param integer $ocsId
2014-06-04 18:29:41 +04:00
* @ return bool
* @ throws Exception
*/
2015-03-11 11:59:56 +03:00
public static function updateAppByOCSId ( $ocsId ) {
2015-03-30 16:58:20 +03:00
$ocsClient = new OCSClient (
\OC :: $server -> getHTTPClientService (),
\OC :: $server -> getConfig (),
\OC :: $server -> getLogger ()
);
2015-06-29 12:15:56 +03:00
$appData = $ocsClient -> getApplication ( $ocsId , \OC_Util :: getVersion ());
$download = $ocsClient -> getApplicationDownload ( $ocsId , \OC_Util :: getVersion ());
2014-06-04 18:29:41 +04:00
if ( isset ( $download [ 'downloadlink' ]) && trim ( $download [ 'downloadlink' ]) !== '' ) {
$download [ 'downloadlink' ] = str_replace ( ' ' , '%20' , $download [ 'downloadlink' ]);
$info = array (
'source' => 'http' ,
'href' => $download [ 'downloadlink' ],
2015-03-11 11:59:56 +03:00
'appdata' => $appData
2014-06-04 18:29:41 +04:00
);
} else {
throw new \Exception ( 'Could not fetch app info!' );
}
return self :: updateApp ( $info );
}
2014-05-21 14:14:10 +04:00
/**
* @ param array $data
* @ return array
* @ throws Exception
*/
public static function downloadApp ( $data = array ()) {
2014-08-31 12:05:59 +04:00
$l = \OC :: $server -> getL10N ( 'lib' );
2014-05-21 14:14:10 +04:00
2012-09-07 17:22:01 +04:00
if ( ! isset ( $data [ 'source' ])) {
2013-08-09 23:57:01 +04:00
throw new \Exception ( $l -> t ( " No source specified when installing app " ));
2011-05-28 19:33:25 +04:00
}
2012-08-04 23:25:03 +04:00
2014-07-11 18:51:59 +04:00
//download the file if necessary
2012-09-07 17:22:01 +04:00
if ( $data [ 'source' ] == 'http' ) {
2014-07-11 18:51:59 +04:00
$pathInfo = pathinfo ( $data [ 'href' ]);
$path = OC_Helper :: tmpFile ( '.' . $pathInfo [ 'extension' ]);
2012-09-07 17:22:01 +04:00
if ( ! isset ( $data [ 'href' ])) {
2013-08-09 23:57:01 +04:00
throw new \Exception ( $l -> t ( " No href specified when installing app from http " ));
2011-05-28 19:33:25 +04:00
}
2015-03-16 13:28:23 +03:00
$client = \OC :: $server -> getHTTPClientService () -> newClient ();
$client -> get ( $data [ 'href' ], [ 'save_to' => $path ]);
} else {
2012-09-07 17:22:01 +04:00
if ( ! isset ( $data [ 'path' ])) {
2013-08-09 23:57:01 +04:00
throw new \Exception ( $l -> t ( " No path specified when installing app from local file " ));
2011-05-28 19:33:25 +04:00
}
$path = $data [ 'path' ];
}
2012-08-04 23:25:03 +04:00
2012-03-29 02:07:28 +04:00
//detect the archive type
$mime = OC_Helper :: getMimeType ( $path );
2015-09-18 23:54:19 +03:00
if ( $mime !== 'application/zip' && $mime !== 'application/x-gzip' && $mime !== 'application/x-bzip2' ) {
2013-08-09 23:57:01 +04:00
throw new \Exception ( $l -> t ( " Archives of type %s are not supported " , array ( $mime )));
2012-03-29 02:07:28 +04:00
}
2012-08-04 23:25:03 +04:00
2011-05-28 19:33:25 +04:00
//extract the archive in a temporary folder
2012-03-29 02:07:28 +04:00
$extractDir = OC_Helper :: tmpFolder ();
2012-04-22 00:47:56 +04:00
OC_Helper :: rmdirr ( $extractDir );
2011-05-28 19:33:25 +04:00
mkdir ( $extractDir );
2012-09-07 17:22:01 +04:00
if ( $archive = OC_Archive :: open ( $path )) {
2012-03-29 02:07:28 +04:00
$archive -> extract ( $extractDir );
2011-05-28 19:33:25 +04:00
} else {
2011-07-29 23:36:03 +04:00
OC_Helper :: rmdirr ( $extractDir );
2012-09-07 17:22:01 +04:00
if ( $data [ 'source' ] == 'http' ) {
2011-05-28 19:33:25 +04:00
unlink ( $path );
}
2013-08-09 23:57:01 +04:00
throw new \Exception ( $l -> t ( " Failed to open archive when installing app " ));
2011-05-28 19:33:25 +04:00
}
2012-08-04 23:25:03 +04:00
2014-05-21 14:14:10 +04:00
return array (
$extractDir ,
$path
);
}
/**
* check an app ' s integrity
* @ param array $data
* @ param string $extractDir
2014-06-13 23:45:31 +04:00
* @ param bool $isShipped
2014-05-21 14:14:10 +04:00
* @ return array
* @ throws \Exception
*/
2015-03-11 11:59:56 +03:00
public static function checkAppsIntegrity ( $data , $extractDir , $path , $isShipped = false ) {
2014-08-31 12:05:59 +04:00
$l = \OC :: $server -> getL10N ( 'lib' );
2011-05-28 19:33:25 +04:00
//load the info.xml file of the app
2012-09-07 17:22:01 +04:00
if ( ! is_file ( $extractDir . '/appinfo/info.xml' )) {
2012-03-29 02:11:29 +04:00
//try to find it in a subdir
$dh = opendir ( $extractDir );
2013-09-04 15:06:04 +04: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-29 02:11:29 +04:00
}
}
}
}
2012-09-07 17:22:01 +04:00
if ( ! is_file ( $extractDir . '/appinfo/info.xml' )) {
2011-07-29 23:36:03 +04:00
OC_Helper :: rmdirr ( $extractDir );
2012-09-07 17:22:01 +04:00
if ( $data [ 'source' ] == 'http' ) {
2011-05-28 19:33:25 +04:00
unlink ( $path );
}
2013-08-09 23:57:01 +04:00
throw new \Exception ( $l -> t ( " App does not provide an info.xml file " ));
2011-05-28 19:33:25 +04:00
}
2012-10-24 00:53:54 +04:00
$info = OC_App :: getAppInfo ( $extractDir . '/appinfo/info.xml' , true );
2012-07-24 02:39:59 +04:00
// check the code for not allowed calls
2015-01-30 19:31:51 +03:00
if ( ! $isShipped && ! OC_Installer :: checkCode ( $extractDir )) {
2012-04-22 00:47:56 +04:00
OC_Helper :: rmdirr ( $extractDir );
2013-08-09 23:57:01 +04:00
throw new \Exception ( $l -> t ( " App can't be installed because of not allowed code in the App " ));
2012-04-22 00:47:56 +04:00
}
2012-05-18 17:54:36 +04:00
2012-07-24 02:39:59 +04:00
// check if the app is compatible with this version of ownCloud
2014-05-27 13:54:12 +04:00
if ( ! OC_App :: isAppCompatible ( OC_Util :: getVersion (), $info )) {
2012-05-18 17:54:36 +04:00
OC_Helper :: rmdirr ( $extractDir );
2013-08-09 23:57:01 +04:00
throw new \Exception ( $l -> t ( " App can't be installed because it is not compatible with this version of ownCloud " ));
2012-05-18 17:54:36 +04:00
}
2013-01-21 23:40:23 +04:00
// check if shipped tag is set which is only allowed for apps that are shipped with ownCloud
2014-06-13 23:45:31 +04:00
if ( ! $isShipped && isset ( $info [ 'shipped' ]) && ( $info [ 'shipped' ] == 'true' )) {
2013-01-21 23:40:23 +04:00
OC_Helper :: rmdirr ( $extractDir );
2013-08-18 15:49:34 +04: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 23:40:23 +04:00
}
// check if the ocs version is the same as the version in info.xml/version
2013-11-18 15:16:03 +04:00
$versionFile = $extractDir . '/appinfo/version' ;
if ( is_file ( $versionFile )) {
$version = trim ( file_get_contents ( $versionFile ));
} else {
$version = trim ( $info [ 'version' ]);
}
2014-02-19 14:50:17 +04:00
2014-06-04 18:29:41 +04:00
if ( isset ( $data [ 'appdata' ][ 'version' ]) && $version <> trim ( $data [ 'appdata' ][ 'version' ])) {
2013-01-21 23:40:23 +04:00
OC_Helper :: rmdirr ( $extractDir );
2013-08-09 23:57:01 +04: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 23:40:23 +04:00
}
2013-11-18 15:19:16 +04:00
2014-05-21 14:14:10 +04:00
return $info ;
2011-05-15 18:31:30 +04:00
}
2013-01-31 13:30:13 +04:00
/**
2014-05-21 14:14:10 +04:00
* Check if an update for the app is available
* @ param string $app
2014-02-06 19:30:58 +04:00
* @ return string | false false or the version number of the update
2013-01-31 13:30:13 +04:00
*
* The function will check if an update for a version is available
*/
public static function isUpdateAvailable ( $app ) {
2014-06-10 20:38:21 +04: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 ;
}
2015-07-03 15:16:29 +03:00
$ocsid = \OC :: $server -> getAppConfig () -> getValue ( $app , 'ocsid' , '' );
2013-01-21 23:40:23 +04:00
2013-02-09 19:46:55 +04:00
if ( $ocsid <> '' ) {
2015-03-30 16:58:20 +03:00
$ocsClient = new OCSClient (
\OC :: $server -> getHTTPClientService (),
\OC :: $server -> getConfig (),
\OC :: $server -> getLogger ()
);
2015-06-29 12:15:56 +03:00
$ocsdata = $ocsClient -> getApplication ( $ocsid , \OC_Util :: getVersion ());
2013-01-30 15:08:14 +04:00
$ocsversion = ( string ) $ocsdata [ 'version' ];
2013-01-21 23:40:23 +04:00
$currentversion = OC_App :: getAppVersion ( $app );
2014-07-10 19:17:55 +04:00
if ( version_compare ( $ocsversion , $currentversion , '>' )) {
2013-01-30 15:08:14 +04:00
return ( $ocsversion );
} else {
2013-10-25 17:33:45 +04:00
return false ;
2013-01-30 15:08:14 +04:00
}
2013-01-21 23:40:23 +04:00
} else {
2013-10-25 17:33:45 +04:00
return false ;
2013-01-21 23:40:23 +04:00
}
2013-01-31 13:30:13 +04:00
}
2013-01-21 23:40:23 +04:00
2013-01-31 13:30:13 +04:00
/**
2014-05-19 19:50:53 +04:00
* Check if app is already downloaded
2014-02-08 14:47:55 +04:00
* @ param string $name name of the application to remove
* @ return boolean
2013-01-31 13:30:13 +04:00
*
* The function will check if the app is already downloaded in the apps repository
*/
public static function isDownloaded ( $name ) {
2013-01-21 23:40:23 +04:00
foreach ( OC :: $APPSROOTS as $dir ) {
2014-05-31 19:50:39 +04:00
$dirToTest = $dir [ 'path' ];
$dirToTest .= '/' ;
$dirToTest .= $name ;
$dirToTest .= '/' ;
if ( is_dir ( $dirToTest )) {
return true ;
}
2013-01-21 23:40:23 +04:00
}
2014-05-31 19:50:39 +04:00
return false ;
2013-01-31 13:30:13 +04:00
}
2013-01-21 23:40:23 +04:00
2011-05-15 18:31:30 +04:00
/**
2014-05-19 19:50:53 +04:00
* Removes an app
2014-02-06 19:30:58 +04:00
* @ param string $name name of the application to remove
2014-05-12 00:51:30 +04:00
* @ param array $options options
2014-05-31 19:50:39 +04:00
* @ return boolean
2011-05-15 18:31:30 +04: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 17:22:01 +04:00
public static function removeApp ( $name , $options = array ()) {
2013-01-21 23:40:23 +04:00
2013-02-09 19:46:55 +04:00
if ( isset ( $options [ 'keeppreferences' ]) and $options [ 'keeppreferences' ] == false ) {
2013-01-21 23:40:23 +04:00
// todo
// remove preferences
}
2013-02-09 19:46:55 +04:00
if ( isset ( $options [ 'keepappconfig' ]) and $options [ 'keepappconfig' ] == false ) {
2013-01-21 23:40:23 +04:00
// todo
// remove app config
}
2013-02-09 19:46:55 +04:00
if ( isset ( $options [ 'keeptables' ]) and $options [ 'keeptables' ] == false ) {
2013-01-21 23:40:23 +04:00
// todo
// remove app database tables
}
2013-02-09 19:46:55 +04:00
if ( isset ( $options [ 'keepfiles' ]) and $options [ 'keepfiles' ] == false ) {
2013-01-21 23:40:23 +04:00
// todo
// remove user files
}
2013-01-31 13:30:13 +04:00
if ( OC_Installer :: isDownloaded ( $name )) {
2013-01-21 23:40:23 +04:00
$appdir = OC_App :: getInstallPath () . '/' . $name ;
OC_Helper :: rmdirr ( $appdir );
2014-05-31 19:50:39 +04:00
return true ;
2013-01-21 23:40:23 +04:00
} else {
2015-07-03 15:06:40 +03:00
\OCP\Util :: writeLog ( 'core' , 'can\'t remove app ' . $name . '. It is not installed.' , \OCP\Util :: ERROR );
2013-01-21 23:40:23 +04:00
2014-05-31 19:50:39 +04:00
return false ;
2013-01-21 23:40:23 +04:00
}
2011-05-15 18:31:30 +04:00
}
2011-06-22 00:16:41 +04:00
/**
2014-05-19 19:50:53 +04:00
* Installs shipped apps
2011-06-22 00:16:41 +04:00
*
2012-04-29 16:38:56 +04:00
* This function installs all apps found in the 'apps' directory that should be enabled by default ;
2011-06-22 00:16:41 +04:00
*/
2012-09-07 17:22:01 +04:00
public static function installShippedApps () {
2012-06-05 00:37:00 +04:00
foreach ( OC :: $APPSROOTS as $app_dir ) {
2012-09-07 17:22:01 +04:00
if ( $dir = opendir ( $app_dir [ 'path' ] )) {
while ( false !== ( $filename = readdir ( $dir ))) {
if ( substr ( $filename , 0 , 1 ) != '.' and is_dir ( $app_dir [ 'path' ] . " / $filename " ) ) {
2015-10-16 18:25:22 +03:00
if ( file_exists ( $app_dir [ 'path' ] . " / $filename /appinfo/info.xml " )) {
2012-09-07 17:22:01 +04:00
if ( ! OC_Installer :: isInstalled ( $filename )) {
2012-06-23 18:17:59 +04:00
$info = OC_App :: getAppInfo ( $filename );
$enabled = isset ( $info [ 'default_enable' ]);
2012-09-07 17:22:01 +04:00
if ( $enabled ) {
2012-06-23 18:17:59 +04:00
OC_Installer :: installShippedApp ( $filename );
2015-07-03 15:16:29 +03:00
\OC :: $server -> getAppConfig () -> setValue ( $filename , 'enabled' , 'yes' );
2012-06-23 18:17:59 +04:00
}
2012-06-05 00:37:00 +04:00
}
2011-06-22 00:16:41 +04:00
}
}
}
2012-06-23 18:21:47 +04:00
closedir ( $dir );
2011-06-22 00:16:41 +04:00
}
}
}
2011-08-22 16:17:38 +04:00
/**
* install an app already placed in the app folder
* @ param string $app id of the app to install
2014-02-08 14:47:55 +04:00
* @ return integer
2011-08-22 16:17:38 +04:00
*/
2012-09-07 17:22:01 +04:00
public static function installShippedApp ( $app ) {
2011-08-22 16:17:38 +04:00
//install the database
2012-09-07 17:22:01 +04:00
if ( is_file ( OC_App :: getAppPath ( $app ) . " /appinfo/database.xml " )) {
2012-06-02 02:11:03 +04:00
OC_DB :: createDbFromStructure ( OC_App :: getAppPath ( $app ) . " /appinfo/database.xml " );
2011-08-22 16:17:38 +04:00
}
//run appinfo/install.php
2012-09-07 17:22:01 +04:00
if ( is_file ( OC_App :: getAppPath ( $app ) . " /appinfo/install.php " )) {
2012-10-22 23:40:33 +04:00
include OC_App :: getAppPath ( $app ) . " /appinfo/install.php " ;
2011-08-22 16:17:38 +04:00
}
2012-03-30 15:48:44 +04:00
$info = OC_App :: getAppInfo ( $app );
2014-01-15 20:11:29 +04:00
if ( is_null ( $info )) {
return false ;
}
2015-07-03 15:16:29 +03:00
\OC :: $server -> getAppConfig () -> setValue ( $app , 'installed_version' , OC_App :: getAppVersion ( $app ));
2014-05-31 20:02:59 +04:00
if ( array_key_exists ( 'ocsid' , $info )) {
2015-07-03 15:16:29 +03:00
\OC :: $server -> getAppConfig () -> setValue ( $app , 'ocsid' , $info [ 'ocsid' ]);
2014-05-31 20:02:59 +04:00
}
2012-08-04 23:25:03 +04:00
2015-01-29 00:08:50 +03:00
//set remote/public handlers
2012-09-07 17:22:01 +04:00
foreach ( $info [ 'remote' ] as $name => $path ) {
2012-06-05 00:37:00 +04:00
OCP\CONFIG :: setAppValue ( 'core' , 'remote_' . $name , $app . '/' . $path );
2012-05-11 22:58:23 +04:00
}
2012-09-07 17:22:01 +04:00
foreach ( $info [ 'public' ] as $name => $path ) {
2012-06-05 00:37:00 +04:00
OCP\CONFIG :: setAppValue ( 'core' , 'public_' . $name , $app . '/' . $path );
2012-05-11 22:58:23 +04:00
}
2012-08-04 23:25:03 +04:00
2012-05-15 00:49:20 +04:00
OC_App :: setAppTypes ( $info [ 'id' ]);
2012-08-04 23:25:03 +04:00
2012-08-05 03:40:19 +04:00
return $info [ 'id' ];
2011-08-22 16:17:38 +04:00
}
2012-04-22 00:47:56 +04:00
2012-07-24 02:39:59 +04: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 14:47:55 +04:00
* @ return boolean true for app is o . k . and false for app is not o . k .
2012-07-24 02:39:59 +04:00
*/
2015-01-30 19:31:51 +03:00
public static function checkCode ( $folder ) {
2012-04-22 00:47:56 +04:00
// is the code checker enabled?
2015-01-30 19:31:51 +03:00
if ( ! OC_Config :: getValue ( 'appcodechecker' , false )) {
2012-07-24 02:39:59 +04:00
return true ;
2012-04-22 00:47:56 +04:00
}
2015-01-30 19:31:51 +03:00
$codeChecker = new \OC\App\CodeChecker ();
$errors = $codeChecker -> analyseFolder ( $folder );
return empty ( $errors );
2012-07-24 02:39:59 +04:00
}
2011-05-15 18:31:30 +04:00
}