* BackendService (directly accessable via \OC_Server) offers registerConfigHandler * SimpleSubstitutionTrait brings reusable logic for simple string replacments * internal $user replacement mechanism was migrated Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>pull/14174/head
parent
a80bae398a
commit
a26bcd8e8f
@ -0,0 +1,39 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2019 Arthur Schiwon <blizzz@arthur-schiwon.de> |
||||
* |
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* 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 |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Files_External\Config; |
||||
|
||||
/** |
||||
* Interface IConfigHandler |
||||
* |
||||
* @package OCA\Files_External\Config |
||||
* @since 16.0.0 |
||||
*/ |
||||
interface IConfigHandler { |
||||
/** |
||||
* @param mixed $optionValue |
||||
* @return mixed the same type as $optionValue |
||||
* @since 16.0.0 |
||||
*/ |
||||
public function handle($optionValue); |
||||
} |
||||
@ -0,0 +1,86 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de> |
||||
* |
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* 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 |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Files_External\Config; |
||||
|
||||
/** |
||||
* Trait SimpleSubstitutionTrait |
||||
* |
||||
* @package OCA\Files_External\Config |
||||
* @since 16.0.0 |
||||
*/ |
||||
trait SimpleSubstitutionTrait { |
||||
/** |
||||
* @var string the placeholder without @ prefix |
||||
* @since 16.0.0 |
||||
*/ |
||||
private $placeholder; |
||||
|
||||
/** @var string */ |
||||
protected $sanitizedPlaceholder; |
||||
|
||||
/** |
||||
* @param mixed $optionValue |
||||
* @param string $replacement |
||||
* @return mixed |
||||
* @since 16.0.0 |
||||
*/ |
||||
private function processInput($optionValue, string $replacement) { |
||||
$this->checkPlaceholder(); |
||||
if (is_array($optionValue)) { |
||||
foreach ($optionValue as &$value) { |
||||
$value = $this->substituteIfString($value, $replacement); |
||||
} |
||||
} else { |
||||
$optionValue = $this->substituteIfString($optionValue, $replacement); |
||||
} |
||||
return $optionValue; |
||||
} |
||||
|
||||
/** |
||||
* @throws \RuntimeException |
||||
*/ |
||||
protected function checkPlaceholder(): void { |
||||
$this->sanitizedPlaceholder = trim(strtolower($this->placeholder)); |
||||
if(!(bool)\preg_match('/^[a-z0-9]*$/', $this->sanitizedPlaceholder)) { |
||||
throw new \RuntimeException(sprintf( |
||||
'Invalid placeholder %s, only [a-z0-9] are allowed', $this->sanitizedPlaceholder |
||||
)); |
||||
} |
||||
if($this->sanitizedPlaceholder === '') { |
||||
throw new \RuntimeException('Invalid empty placeholder'); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* @param mixed $value |
||||
* @param string $replacement |
||||
* @return mixed |
||||
*/ |
||||
protected function substituteIfString($value, string $replacement) { |
||||
if(is_string($value)) { |
||||
return str_ireplace('$' . $this->sanitizedPlaceholder, $replacement, $value); |
||||
} |
||||
return $value; |
||||
} |
||||
} |
||||
@ -0,0 +1,53 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2019 Arthur Schiwon <blizzz@arthur-schiwon.de> |
||||
* |
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* 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 |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Files_External\Config; |
||||
|
||||
use OCP\IUserSession; |
||||
|
||||
class UserPlaceholderHandler implements IConfigHandler { |
||||
use SimpleSubstitutionTrait; |
||||
|
||||
/** @var IUserSession */ |
||||
private $session; |
||||
|
||||
public function __construct(IUserSession $session) { |
||||
$this->session = $session; |
||||
$this->placeholder = 'user'; |
||||
} |
||||
|
||||
/** |
||||
* @param mixed $optionValue |
||||
* @return mixed the same type as $optionValue |
||||
* @since 16.0.0 |
||||
*/ |
||||
public function handle($optionValue) { |
||||
$user = $this->session->getUser(); |
||||
if($user === null) { |
||||
return $optionValue; |
||||
} |
||||
$uid = $user->getUID(); |
||||
|
||||
return $this->processInput($optionValue, $uid); |
||||
} |
||||
} |
||||
@ -0,0 +1,81 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de> |
||||
* |
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* 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 |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\files_external\tests\Config; |
||||
|
||||
use OCA\Files_External\Config\UserPlaceholderHandler; |
||||
use OCP\IUser; |
||||
use OCP\IUserSession; |
||||
|
||||
class UserPlaceholderHandlerTest extends \Test\TestCase { |
||||
/** @var IUser|\PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $user; |
||||
|
||||
/** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */ |
||||
protected $session; |
||||
|
||||
/** @var UserPlaceholderHandler */ |
||||
protected $handler; |
||||
|
||||
public function setUp() { |
||||
parent::setUp(); |
||||
|
||||
$this->user = $this->createMock(IUser::class); |
||||
$this->user->expects($this->any()) |
||||
->method('getUid') |
||||
->willReturn('alice'); |
||||
$this->session = $this->createMock(IUserSession::class); |
||||
|
||||
$this->handler = new UserPlaceholderHandler($this->session); |
||||
} |
||||
|
||||
protected function setUser() { |
||||
$this->session->expects($this->any()) |
||||
->method('getUser') |
||||
->willReturn($this->user); |
||||
} |
||||
|
||||
public function optionProvider() { |
||||
return [ |
||||
['/foo/bar/$user/foobar', '/foo/bar/alice/foobar'], |
||||
[['/foo/bar/$user/foobar'], ['/foo/bar/alice/foobar']], |
||||
[['/FOO/BAR/$USER/FOOBAR'], ['/FOO/BAR/alice/FOOBAR']], |
||||
]; |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider optionProvider |
||||
*/ |
||||
public function testHandle($option, $expected) { |
||||
$this->setUser(); |
||||
$this->assertSame($expected, $this->handler->handle($option)); |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider optionProvider |
||||
*/ |
||||
public function testHandleNoUser($option) { |
||||
$this->assertSame($option, $this->handler->handle($option)); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue