2014-05-19 10:39:57 -04:00
< ? php
/**
2016-07-21 10:49:16 -04:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
*
2020-04-29 05:57:22 -04:00
* @ author Christoph Wurst < christoph @ winzerhof - wurst . at >
2016-05-26 13:56:05 -04:00
* @ author Lukas Reschke < lukas @ statuscode . ch >
2015-10-05 14:54:56 -04:00
* @ author Olivier Paroz < github @ oparoz . com >
2016-07-21 12:13:36 -04:00
* @ author Robin Appelman < robin @ icewind . nl >
2020-12-16 08:54:15 -05:00
* @ author Vincent Petry < vincent @ nextcloud . com >
2015-03-26 06:44:34 -04: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 ,
2019-12-03 13:57:53 -05:00
* along with this program . If not , see < http :// www . gnu . org / licenses />
2015-03-26 06:44:34 -04:00
*
2014-05-19 10:39:57 -04:00
*/
namespace OCA\Files_Sharing\External ;
2015-01-20 13:45:32 -05:00
use OC\ForbiddenException ;
use OCP\Files\NotFoundException ;
use OCP\Files\StorageInvalidException ;
use OCP\Files\StorageNotAvailableException ;
2022-06-10 04:29:23 -04:00
use OCP\Http\Client\LocalServerException ;
use Psr\Log\LoggerInterface ;
2015-01-20 13:45:32 -05:00
2014-05-19 10:39:57 -04:00
class Scanner extends \OC\Files\Cache\Scanner {
2015-03-17 05:37:09 -04:00
/** @var \OCA\Files_Sharing\External\Storage */
2014-05-19 10:39:57 -04:00
protected $storage ;
2022-06-10 04:29:23 -04:00
/** {@inheritDoc} */
public function scan ( $path , $recursive = self :: SCAN_RECURSIVE , $reuse = - 1 , $lock = true ) {
try {
if ( ! $this -> storage -> remoteIsOwnCloud ()) {
return parent :: scan ( $path , $recursive , $reuse , $lock );
}
} catch ( LocalServerException $e ) {
// Scanner doesn't have dependency injection
\OC :: $server -> get ( LoggerInterface :: class )
-> warning ( 'Trying to scan files inside invalid external storage: ' . $this -> storage -> getRemote () . ' for mountpoint ' . $this -> storage -> getMountPoint () . ' and id ' . $this -> storage -> getId ());
return ;
}
$this -> scanAll ();
}
2015-01-20 13:45:32 -05:00
/**
* Scan a single file and store it in the cache .
* If an exception happened while accessing the external storage ,
* the storage will be checked for availability and removed
* if it is not available any more .
*
* @ param string $file file to scan
* @ param int $reuseExisting
2015-03-17 05:37:09 -04:00
* @ param int $parentId
* @ param array | null $cacheData existing data in the cache for the file to be scanned
2015-07-01 10:29:11 -04:00
* @ param bool $lock set to false to disable getting an additional read lock during scanning
2021-02-15 11:52:11 -05:00
* @ return array | null an array of metadata of the scanned file
2015-01-20 13:45:32 -05:00
*/
2020-03-27 12:47:20 -04:00
public function scanFile ( $file , $reuseExisting = 0 , $parentId = - 1 , $cacheData = null , $lock = true , $data = null ) {
2015-01-20 13:45:32 -05:00
try {
return parent :: scanFile ( $file , $reuseExisting );
} catch ( ForbiddenException $e ) {
$this -> storage -> checkStorageAvailability ();
} catch ( NotFoundException $e ) {
// if the storage isn't found, the call to
// checkStorageAvailable() will verify it and remove it
// if appropriate
$this -> storage -> checkStorageAvailability ();
} catch ( StorageInvalidException $e ) {
$this -> storage -> checkStorageAvailability ();
} catch ( StorageNotAvailableException $e ) {
$this -> storage -> checkStorageAvailability ();
}
}
2022-06-10 04:29:23 -04:00
/**
* Checks the remote share for changes .
* If changes are available , scan them and update
* the cache .
* @ throws NotFoundException
* @ throws StorageInvalidException
* @ throws \Exception
*/
public function scanAll () {
try {
$data = $this -> storage -> getShareInfo ();
} catch ( \Exception $e ) {
$this -> storage -> checkStorageAvailability ();
throw new \Exception (
'Error while scanning remote share: "' .
$this -> storage -> getRemote () . '" ' .
$e -> getMessage ()
);
}
if ( $data [ 'status' ] === 'success' ) {
$this -> addResult ( $data [ 'data' ], '' );
} else {
throw new \Exception (
'Error while scanning remote share: "' .
$this -> storage -> getRemote () . '"'
);
}
}
/**
* @ param array $data
* @ param string $path
*/
private function addResult ( $data , $path ) {
$id = $this -> cache -> put ( $path , $data );
if ( isset ( $data [ 'children' ])) {
$children = [];
foreach ( $data [ 'children' ] as $child ) {
$children [ $child [ 'name' ]] = true ;
$this -> addResult ( $child , ltrim ( $path . '/' . $child [ 'name' ], '/' ));
}
$existingCache = $this -> cache -> getFolderContentsById ( $id );
foreach ( $existingCache as $existingChild ) {
// if an existing child is not in the new data, remove it
if ( ! isset ( $children [ $existingChild [ 'name' ]])) {
$this -> cache -> remove ( ltrim ( $path . '/' . $existingChild [ 'name' ], '/' ));
}
}
}
}
2014-05-19 10:39:57 -04:00
}