@ -39,6 +39,34 @@ class OC_Mount_Config {
// whether to skip backend test (for unit tests, as this static class is not mockable)
public static $skipTest = false ;
private static $backends = array ();
/**
* @ param string $class
* @ param array $definition
* @ return bool
*/
public static function registerBackend ( $class , $definition ) {
if ( ! isset ( $definition [ 'backend' ])) {
return false ;
}
OC_Mount_Config :: $backends [ $class ] = $definition ;
return true ;
}
/**
* Setup backends
*
* @ return array of previously registered backends
*/
public static function setUp ( $backends = array ()) {
$backup = self :: $backends ;
self :: $backends = $backends ;
return $backup ;
}
/**
* Get details on each of the external storage backends , used for the mount config UI
* If a custom UI is needed , add the key 'custom' and a javascript file with that name will be loaded
@ -46,132 +74,32 @@ class OC_Mount_Config {
* If the configuration parameter is a boolean , add a '!' to the beginning of the value
* If the configuration parameter is optional , add a '&' to the beginning of the value
* If the configuration parameter is hidden , add a '#' to the beginning of the value
* @ return string
* @ return array
*/
public static function getBackends () {
// FIXME: do not rely on php key order for the options order in the UI
$backends [ '\OC\Files\Storage\Local' ] = array (
'backend' => 'Local' ,
'configuration' => array (
'datadir' => 'Location' ));
$backends [ '\OC\Files\Storage\AmazonS3' ] = array (
'backend' => 'Amazon S3 and compliant' ,
'configuration' => array (
'key' => 'Access Key' ,
'secret' => '*Secret Key' ,
'bucket' => 'Bucket' ,
'hostname' => '&Hostname (optional)' ,
'port' => '&Port (optional)' ,
'region' => '&Region (optional)' ,
'use_ssl' => '!Enable SSL' ,
'use_path_style' => '!Enable Path Style' ));
$backends [ '\OC\Files\Storage\Dropbox' ] = array (
'backend' => 'Dropbox' ,
'configuration' => array (
'configured' => '#configured' ,
'app_key' => 'App key' ,
'app_secret' => '*App secret' ,
'token' => '#token' ,
'token_secret' => '#token_secret' ),
'custom' => 'dropbox' );
if ( OC_Mount_Config :: checkphpftp ()) $backends [ '\OC\Files\Storage\FTP' ] = array (
'backend' => 'FTP' ,
'configuration' => array (
'host' => 'Hostname' ,
'user' => 'Username' ,
'password' => '*Password' ,
'root' => '&Root' ,
'secure' => '!Secure ftps://' ));
if ( OC_Mount_Config :: checkcurl ()) $backends [ '\OC\Files\Storage\Google' ] = array (
'backend' => 'Google Drive' ,
'configuration' => array (
'configured' => '#configured' ,
'client_id' => 'Client ID' ,
'client_secret' => '*Client secret' ,
'token' => '#token' ),
'custom' => 'google' );
if ( OC_Mount_Config :: checkcurl ()) {
$backends [ '\OC\Files\Storage\Swift' ] = array (
'backend' => 'OpenStack Object Storage' ,
'configuration' => array (
'user' => 'Username (required)' ,
'bucket' => 'Bucket (required)' ,
'region' => '&Region (optional for OpenStack Object Storage)' ,
'key' => '*API Key (required for Rackspace Cloud Files)' ,
'tenant' => '&Tenantname (required for OpenStack Object Storage)' ,
'password' => '*Password (required for OpenStack Object Storage)' ,
'service_name' => '&Service Name (required for OpenStack Object Storage)' ,
'url' => '&URL of identity endpoint (required for OpenStack Object Storage)' ,
'timeout' => '&Timeout of HTTP requests in seconds (optional)' ,
)
);
}
if ( ! OC_Util :: runningOnWindows ()) {
if ( OC_Mount_Config :: checksmbclient ()) {
$backends [ '\OC\Files\Storage\SMB' ] = array (
'backend' => 'SMB / CIFS' ,
'configuration' => array (
'host' => 'URL' ,
'user' => 'Username' ,
'password' => '*Password' ,
'share' => 'Share' ,
'root' => '&Root' ));
$backends [ '\OC\Files\Storage\SMB_OC' ] = array (
'backend' => 'SMB / CIFS using OC login' ,
'configuration' => array (
'host' => 'URL' ,
'username_as_share' => '!Username as share' ,
'share' => '&Share' ,
'root' => '&Root' ));
$sortFunc = function ( $a , $b ) {
return strcasecmp ( $a [ 'backend' ], $b [ 'backend' ]);
};
$backEnds = array ();
foreach ( OC_Mount_Config :: $backends as $class => $backend ) {
if ( isset ( $backend [ 'has_dependencies' ]) and $backend [ 'has_dependencies' ] === true ) {
if ( ! method_exists ( $class , 'checkDependencies' )) {
\OCP\Util :: writeLog ( 'files_external' ,
" Backend class $class has dependencies but doesn't provide method checkDependencies() " ,
\OCP\Util :: DEBUG );
continue ;
} elseif ( $class :: checkDependencies () !== true ) {
continue ;
}
}
$backEnds [ $class ] = $backend ;
}
if ( OC_Mount_Config :: checkcurl ()){
$backends [ '\OC\Files\Storage\DAV' ] = array (
'backend' => 'WebDAV' ,
'configuration' => array (
'host' => 'URL' ,
'user' => 'Username' ,
'password' => '*Password' ,
'root' => '&Root' ,
'secure' => '!Secure https://' ));
$backends [ '\OC\Files\Storage\OwnCloud' ] = array (
'backend' => 'ownCloud' ,
'configuration' => array (
'host' => 'URL' ,
'user' => 'Username' ,
'password' => '*Password' ,
'root' => '&Remote subfolder' ,
'secure' => '!Secure https://' ));
}
$backends [ '\OC\Files\Storage\SFTP' ] = array (
'backend' => 'SFTP' ,
'configuration' => array (
'host' => 'URL' ,
'user' => 'Username' ,
'password' => '*Password' ,
'root' => '&Root' ));
$backends [ '\OC\Files\Storage\iRODS' ] = array (
'backend' => 'iRODS' ,
'configuration' => array (
'host' => 'Host' ,
'port' => 'Port' ,
'use_logon_credentials' => '!Use ownCloud login' ,
'user' => 'Username' ,
'password' => '*Password' ,
'auth_mode' => 'Authentication Mode' ,
'zone' => 'Zone' ));
return ( $backends );
uasort ( $backEnds , $sortFunc );
return $backEnds ;
}
/**
@ -278,19 +206,19 @@ class OC_Mount_Config {
*/
public static function getPersonalBackends () {
$backe nds = self :: getBackends ();
$backE nds = self :: getBackends ();
// Remove local storage and other disabled storages
unset ( $backe nds [ '\OC\Files\Storage\Local' ]);
unset ( $backE nds [ '\OC\Files\Storage\Local' ]);
$allowed_backe nds = explode ( ',' , OCP\Config :: getAppValue ( 'files_external' , 'user_mounting_backends' , '' ));
foreach ( $backe nds as $backend => $null ) {
if ( ! in_array ( $backend , $allowed_backe nds )) {
unset ( $backe nds [ $backend ]);
$allowedBackE nds = explode ( ',' , OCP\Config :: getAppValue ( 'files_external' , 'user_mounting_backends' , '' ));
foreach ( $backE nds as $backend => $null ) {
if ( ! in_array ( $backend , $allowedBackE nds )) {
unset ( $backE nds [ $backend ]);
}
}
return $backe nds ;
return $backE nds ;
}
/**
@ -373,7 +301,7 @@ class OC_Mount_Config {
*/
public static function getPersonalMountPoints () {
$mountPoints = self :: readData ( true );
$backe nds = self :: getBackends ();
$backE nds = self :: getBackends ();
$uid = OCP\User :: getUser ();
$personal = array ();
if ( isset ( $mountPoints [ self :: MOUNT_TYPE_USER ][ $uid ])) {
@ -387,7 +315,7 @@ class OC_Mount_Config {
'class' => $mount [ 'class' ],
// Remove '/uid/files/' from mount point
'mountpoint' => substr ( $mountPoint , strlen ( $uid ) + 8 ),
'backend' => $backe nds [ $mount [ 'class' ]][ 'backend' ],
'backend' => $backE nds [ $mount [ 'class' ]][ 'backend' ],
'options' => $mount [ 'options' ],
'status' => self :: getBackendStatus ( $mount [ 'class' ], $mount [ 'options' ], true )
);
@ -614,54 +542,91 @@ class OC_Mount_Config {
}
/**
* check if smbclient is installed
* check dependencies
*/
public static function checksmbclient () {
if ( function_exists ( 'shell_exec' )) {
$output = shell_exec ( 'command -v smbclient 2> /dev/null' );
return ! empty ( $output );
} else {
return false ;
public static function checkDependencies () {
$dependencies = array ();
foreach ( OC_Mount_Config :: $backends as $class => $backend ) {
if ( isset ( $backend [ 'has_dependencies' ]) and $backend [ 'has_dependencies' ] === true ) {
$result = $class :: checkDependencies ();
if ( $result !== true ) {
if ( ! is_array ( $result )) {
$result = array ( $result );
}
foreach ( $result as $key => $value ) {
if ( is_numeric ( $key )) {
OC_Mount_Config :: addDependency ( $dependencies , $value , $backend [ 'backend' ]);
} else {
OC_Mount_Config :: addDependency ( $dependencies , $key , $backend [ 'backend' ], $value );
}
}
}
}
}
if ( count ( $dependencies ) > 0 ) {
return OC_Mount_Config :: generateDependencyMessage ( $dependencies );
}
return '' ;
}
/**
* check if php - ftp is installed
*/
public static function checkphpftp () {
if ( function_exists ( 'ftp_login' )) {
return true ;
} else {
return false ;
private static function addDependency ( & $dependencies , $module , $backend , $message = null ) {
if ( ! isset ( $dependencies [ $module ])) {
$dependencies [ $module ] = array ();
}
if ( $message === null ) {
$dependencies [ $module ][] = $backend ;
} else {
$dependencies [ $module ][] = array ( 'backend' => $backend , 'message' => $message );
}
}
/**
* check if curl is installed
*/
public static function checkcurl () {
return function_exists ( 'curl_init' );
private static function generateDependencyMessage ( $dependencies ) {
$l = new \OC_L10N ( 'files_external' );
$dependencyMessage = '' ;
foreach ( $dependencies as $module => $backends ) {
$dependencyGroup = array ();
foreach ( $backends as $backend ) {
if ( is_array ( $backend )) {
$dependencyMessage .= '<br />' . $l -> t ( '<b>Note:</b> ' ) . $backend [ 'message' ];
} else {
$dependencyGroup [] = $backend ;
}
}
if ( count ( $dependencyGroup ) > 0 ) {
$backends = '' ;
for ( $i = 0 ; $i < count ( $dependencyGroup ); $i ++ ) {
if ( $i > 0 && $i === count ( $dependencyGroup ) - 1 ) {
$backends .= $l -> t ( ' and ' );
} elseif ( $i > 0 ) {
$backends .= ', ' ;
}
$backends .= '<i>' . $dependencyGroup [ $i ] . '</i>' ;
}
$dependencyMessage .= '<br />' . OC_Mount_Config :: getSingleDependencyMessage ( $l , $module , $backends );
}
}
return $dependencyMessage ;
}
/**
* check dependencies
* Returns a dependency missing message
* @ param $l OC_L10N
* @ param $module string
* @ param $backend string
* @ return string
*/
public static function checkDependencies () {
$l = new OC_L10N ( 'files_external' );
$txt = '' ;
if ( ! OC_Util :: runningOnWindows ()) {
if ( ! OC_Mount_Config :: checksmbclient ()) {
$txt .= $l -> t ( '<b>Warning:</b> "smbclient" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it.' ) . '<br />' ;
}
private static function getSingleDependencyMessage ( $l , $module , $backend ) {
switch ( strtolower ( $module )) {
case 'curl' :
return $l -> t ( '<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.' , $backend );
case 'ftp' :
return $l -> t ( '<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.' , $backend );
default :
return $l -> t ( '<b>Note:</b> "%s" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it.' , array ( $module , $backend ));
}
if ( ! OC_Mount_Config :: checkphpftp ()) {
$txt .= $l -> t ( '<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it.' ) . '<br />' ;
}
if ( ! OC_Mount_Config :: checkcurl ()) {
$txt .= $l -> t ( '<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it.' ) . '<br />' ;
}
return $txt ;
}
/**