* @license GPL 2 (http://www.gnu.org/licenses/gpl.html) */ require_once DOKU_PLUGIN . 'webdav/vendor/autoload.php'; use Sabre\DAV\Locks\LockInfo; class admin_plugin_webdav extends DokuWiki_Admin_Plugin { /** @inheritDoc */ public function getMenuSort() { return 1; } /** @inheritDoc */ public function forAdminOnly() { return false; } /** @inheritDoc */ public function getMenuIcon() { return dirname(__FILE__) . '/folder-network-outline.svg'; } /** @inheritDoc */ public function getMenuText($language) { return 'WebDAV'; } /** @inheritDoc */ public function handle() { global $INPUT; if (!$_REQUEST['cmd']) { return; } if (!checkSecurityToken()) { return; } $cmd = $INPUT->extract('cmd')->str('cmd'); $dispatch = [ 'unlock' => 'unlockFile', ]; if ($cmd) { if (!isset($dispatch[$cmd])) { msg('Unknown command', -1); return; } call_user_func([$this, $dispatch[$cmd]]); } } /** * Unlock file * * @return bool */ public function unlockFile() { global $INPUT; global $conf; $lock_id = $INPUT->str('lock'); $locks_file = $conf['cachedir'] . '/webdav.lock'; $locked_file = ''; if (!$lock_id) { msg('No lock provided', -1); return; } if ($locks = $this->getLocks()) { foreach ($locks as $id => $lock) { if ($lock->token == $lock_id) { $locked_file = $lock->uri; unset($locks[$id]); } } if ($locked_file) { if (!io_saveFile($locks_file, serialize($locks))) { msg('Unlock failed', -1); return; } msg("File $locked_file successfully unlocked", 1); } } } /** @inheritDoc */ public function html() { echo '
'; echo $this->locale_xhtml('intro'); echo '
'; $this->displayLocks(); formSecurityToken(); echo ''; echo ''; echo ''; echo '
'; echo '
'; } /** * Display active locks */ private function displayLocks() { echo '

Locks

'; echo ''; echo ''; echo ''; foreach ($this->getLocks() as $lock) { $pathinfo = pathinfo($lock->uri); echo ''; echo ''; echo ""; echo ''; echo ""; echo ''; echo ""; echo ''; echo ''; } echo ''; echo '
Owner Timeout Created Type URI User Agent  
' . (($lock->owner == $lock->user) ? $lock->owner : $lock->user . ' (' . $lock->owner . ')') . '{$lock->timeout} seconds' . datetime_h($lock->created) . '
(' . dformat($lock->created) . ')
{$this->getLockType($lock->scope)}' . $lock->uri . '{$lock->ua}
'; } /** * Get active locks * * @return array */ private function getLocks() { global $conf; $locks = []; $locks_file = $conf['cachedir'] . '/webdav.lock'; if (file_exists($locks_file)) { $locks = unserialize(io_readFile($locks_file)); } return $locks; } /** * Get lock type * * @param string $scope * @return string */ private function getLockType($scope) { switch ($scope) { case LockInfo::EXCLUSIVE: return 'Exclusive'; case LockInfo::SHARED: return 'Shared'; case LockInfo::TIMEOUT_INFINITE: return 'Timeout Infinite'; default: return 'N/A'; } } }