From 8f0a0add1e5edca5306cb1ca22e1f582b1907ff9 Mon Sep 17 00:00:00 2001 From: Klaus Weidenbach Date: Tue, 25 Apr 2017 23:33:44 +0200 Subject: [PATCH 1/3] :white_check_mark::bulb: Add Unit Tests for AccessList class. Also some Doxygen docu for this class. --- Zotlabs/Access/AccessList.php | 128 ++++++++++--- tests/unit/Access/AccessListTest.php | 189 +++++++++++++++++++ tests/unit/Lib/PermissionDescriptionTest.php | 2 + 3 files changed, 289 insertions(+), 30 deletions(-) create mode 100644 tests/unit/Access/AccessListTest.php diff --git a/Zotlabs/Access/AccessList.php b/Zotlabs/Access/AccessList.php index b073f9d3c..6471b0b1d 100644 --- a/Zotlabs/Access/AccessList.php +++ b/Zotlabs/Access/AccessList.php @@ -2,21 +2,55 @@ namespace Zotlabs\Access; - +/** + * @brief AccessList class. + * + * A class to hold an AccessList object with allowed and denied contacts and + * groups. + */ class AccessList { - + /** + * @brief Allow contacts + * @var string + */ private $allow_cid; + /** + * @brief Allow groups + * @var string + */ private $allow_gid; + /** + * @brief Deny contacts + * @var string + */ private $deny_cid; + /** + * @brief Deny groups + * @var string + */ private $deny_gid; + /** + * @brief Indicates if we are using the default constructor values or + * values that have been set explicitly. + * @var boolean + */ + private $explicit; - /* indicates if we are using the default constructor values or values that have been set explicitly. */ - - private $explicit; + /** + * @brief Constructor for AccessList class. + * + * @note The array to pass to the constructor is different from the array + * that you provide to the set() or set_from_array() functions. + * + * @param array $channel A channel array, where these entries are evaluated: + * * \e string \b channel_allow_cid => string of allowed cids + * * \e string \b channel_allow_gid => string of allowed gids + * * \e string \b channel_deny_cid => string of denied cids + * * \e string \b channel_deny_gid => string of denied gids + */ function __construct($channel) { - - if($channel) { + if($channel) { $this->allow_cid = $channel['channel_allow_cid']; $this->allow_gid = $channel['channel_allow_gid']; $this->deny_cid = $channel['channel_deny_cid']; @@ -32,61 +66,95 @@ class AccessList { $this->explicit = false; } + /** + * @brief Get if we are using the default constructor values + * or values that have been set explicitly. + * + * @return boolean + */ function get_explicit() { return $this->explicit; } /** - * Set AccessList from strings such as those in already - * existing stored data items + * @brief Set access list from strings such as those in already + * existing stored data items. + * + * @note The array to pass to this set function is different from the array + * that you provide to the constructor or set_from_array(). + * + * @param array $arr + * * \e string \b allow_cid => string of allowed cids + * * \e string \b allow_gid => string of allowed gids + * * \e string \b deny_cid => string of denied cids + * * \e string \b deny_gid => string of denied gids + * @param boolean $explicit (optional) default true */ - - function set($arr,$explicit = true) { + function set($arr, $explicit = true) { $this->allow_cid = $arr['allow_cid']; $this->allow_gid = $arr['allow_gid']; $this->deny_cid = $arr['deny_cid']; $this->deny_gid = $arr['deny_gid']; - $this->explicit = $explicit; + $this->explicit = $explicit; } /** - * return an array consisting of the current - * access list components where the elements - * are directly storable. + * @brief Return an array consisting of the current access list components + * where the elements are directly storable. + * + * @return Associative array with: + * * \e string \b allow_cid => string of allowed cids + * * \e string \b allow_gid => string of allowed gids + * * \e string \b deny_cid => string of denied cids + * * \e string \b deny_gid => string of denied gids */ - function get() { - return array( + return [ 'allow_cid' => $this->allow_cid, 'allow_gid' => $this->allow_gid, 'deny_cid' => $this->deny_cid, 'deny_gid' => $this->deny_gid, - ); + ]; } /** - * Set AccessList from arrays, such as those provided by - * acl_selector(). For convenience, a string (or non-array) input is - * assumed to be a comma-separated list and auto-converted into an array. - */ - - function set_from_array($arr,$explicit = true) { - $this->allow_cid = perms2str((is_array($arr['contact_allow'])) - ? $arr['contact_allow'] : explode(',',$arr['contact_allow'])); + * @brief Set access list components from arrays, such as those provided by + * acl_selector(). + * + * For convenience, a string (or non-array) input is assumed to be a + * comma-separated list and auto-converted into an array. + * + * @note The array to pass to this set function is different from the array + * that you provide to the constructor or set(). + * + * @param array $arr An associative array with: + * * \e array|string \b contact_allow => array with cids or comma-seperated string + * * \e array|string \b group_allow => array with gids or comma-seperated string + * * \e array|string \b contact_deny => array with cids or comma-seperated string + * * \e array|string \b group_deny => array with gids or comma-seperated string + * @param boolean $explicit (optional) default true + */ + function set_from_array($arr, $explicit = true) { + $this->allow_cid = perms2str((is_array($arr['contact_allow'])) + ? $arr['contact_allow'] : explode(',', $arr['contact_allow'])); $this->allow_gid = perms2str((is_array($arr['group_allow'])) - ? $arr['group_allow'] : explode(',',$arr['group_allow'])); + ? $arr['group_allow'] : explode(',', $arr['group_allow'])); $this->deny_cid = perms2str((is_array($arr['contact_deny'])) - ? $arr['contact_deny'] : explode(',',$arr['contact_deny'])); + ? $arr['contact_deny'] : explode(',', $arr['contact_deny'])); $this->deny_gid = perms2str((is_array($arr['group_deny'])) - ? $arr['group_deny'] : explode(',',$arr['group_deny'])); + ? $arr['group_deny'] : explode(',', $arr['group_deny'])); $this->explicit = $explicit; } + /** + * @brief Returns true if any access lists component is set. + * + * @return boolean Return true if any of allow_* deny_* values is set. + */ function is_private() { return (($this->allow_cid || $this->allow_gid || $this->deny_cid || $this->deny_gid) ? true : false); } } - diff --git a/tests/unit/Access/AccessListTest.php b/tests/unit/Access/AccessListTest.php new file mode 100644 index 000000000..3dbe5cd65 --- /dev/null +++ b/tests/unit/Access/AccessListTest.php @@ -0,0 +1,189 @@ + '', + 'allow_gid' => '', + 'deny_cid' => '', + 'deny_gid' => '' + ]; + + + + public function testConstructor() { + $channel = [ + 'channel_allow_cid' => '', + 'channel_allow_gid' => '', + 'channel_deny_cid' => '', + 'channel_deny_gid' => '' + ]; + + $accessList = new AccessList($channel); + + $this->assertEquals($this->expectedResult, $accessList->get()); + $this->assertFalse($accessList->get_explicit()); + } + + /** + * @expectedException PHPUnit\Framework\Error\Error + */ + public function testPHPErrorOnInvalidConstructor() { + $accessList = new AccessList('invalid'); + // Causes: "Illegal string offset 'channel_allow_cid'" + } + + public function testDefaultGetExplicit() { + $accessList = new AccessList([]); + + $this->assertFalse($accessList->get_explicit()); + } + + public function testDefaultGet() { + $arr = [ + 'allow_cid' => '', + 'allow_gid' => '', + 'deny_cid' => '', + 'deny_gid' => '' + ]; + + $accessList = new AccessList([]); + + $this->assertEquals($arr, $accessList->get()); + } + + public function testSet() { + $arr = [ + 'allow_cid' => '', + 'allow_gid' => '', + 'deny_cid' => '', + 'deny_gid' => '' + ]; + $accessList = new AccessList([]); + + // default explicit true + $accessList->set($arr); + + $this->assertEquals($this->expectedResult, $accessList->get()); + $this->assertTrue($accessList->get_explicit()); + + // set explicit false + $accessList->set($arr, false); + + $this->assertEquals($this->expectedResult, $accessList->get()); + $this->assertFalse($accessList->get_explicit()); + } + + /** + * @expectedException PHPUnit\Framework\Error\Error + */ + public function testPHPErrorOnInvalidSet() { + $accessList = new AccessList([]); + + $accessList->set('invalid'); + // Causes: "Illegal string offset 'allow_cid'" + } + + /** + * set_from_array() calls some other functions, too which are not yet unit tested. + * @uses ::perms2str() + */ + public function testSetFromArray() { + // array + $arraySetFromArray = [ + 'contact_allow' => ['acid', 'acid2'], + 'group_allow' => ['agid'], + 'contact_deny' => [], + 'group_deny' => ['dgid', 'dgid2'] + ]; + $accessList = new AccessList([]); + $accessList->set_from_array($arraySetFromArray); + + $this->assertEquals($this->expectedResult, $accessList->get()); + $this->assertTrue($accessList->get_explicit()); + + + // string + $stringSetFromArray = [ + 'contact_allow' => 'acid,acid2', + 'group_allow' => 'agid', + 'contact_deny' => '', + 'group_deny' => 'dgid, dgid2' + ]; + $accessList2 = new AccessList([]); + $accessList2->set_from_array($stringSetFromArray, false); + + $this->assertEquals($this->expectedResult, $accessList2->get()); + $this->assertFalse($accessList2->get_explicit()); + } + + /** + * @dataProvider isprivateProvider + */ + public function testIsPrivate($channel) { + $accessListPublic = new AccessList([]); + $this->assertFalse($accessListPublic->is_private()); + + $accessListPrivate = new AccessList($channel); + $this->assertTrue($accessListPrivate->is_private()); + } + + public function isprivateProvider() { + return [ + 'all set' => [[ + 'channel_allow_cid' => '', + 'channel_allow_gid' => '', + 'channel_deny_cid' => '', + 'channel_deny_gid' => '' + ]], + 'only one set' => [[ + 'channel_allow_cid' => '', + 'channel_allow_gid' => '', + 'channel_deny_cid' => '', + 'channel_deny_gid' => '' + ]], + 'acid+null' => [[ + 'channel_allow_cid' => '', + 'channel_allow_gid' => null, + 'channel_deny_cid' => '', + 'channel_deny_gid' => '' + ]] + ]; + } + +} \ No newline at end of file diff --git a/tests/unit/Lib/PermissionDescriptionTest.php b/tests/unit/Lib/PermissionDescriptionTest.php index 97a39a2c8..96c381d0c 100644 --- a/tests/unit/Lib/PermissionDescriptionTest.php +++ b/tests/unit/Lib/PermissionDescriptionTest.php @@ -29,6 +29,8 @@ use Zotlabs\Lib\PermissionDescription; /** * @brief Unit Test case for PermissionDescription class. + * + * @covers Zotlabs\Lib\PermissionDescription */ class PermissionDescriptionTest extends UnitTestCase { From f9d40adb188ef09cb2d76d1bcab9d50391334b7a Mon Sep 17 00:00:00 2001 From: Andrew Manning Date: Sun, 30 Apr 2017 13:49:53 -0400 Subject: [PATCH 2/3] Update INSTALL.txt The webpage element portation tools need the zip extension, such as the `php7.0-zip` package on Debian. --- install/INSTALL.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/INSTALL.txt b/install/INSTALL.txt index 7d4ed9534..c059fadf1 100644 --- a/install/INSTALL.txt +++ b/install/INSTALL.txt @@ -110,7 +110,7 @@ technical abilities. php.ini file - and with no hosting provider restrictions on the use of exec() and proc_open(). - - curl, gd (with at least jpeg and png support), mysqli, mbstring, xml, + - curl, gd (with at least jpeg and png support), mysqli, mbstring, xml, zip and openssl extensions. The imagick extension MAY be used instead of gd, but is not required and MAY also be disabled via configuration option. From d6a3f7765adbbf5f58c08964932d25d3c0364439 Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Wed, 3 May 2017 12:29:26 +0200 Subject: [PATCH 3/3] add check for php zip extension --- Zotlabs/Module/Setup.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Zotlabs/Module/Setup.php b/Zotlabs/Module/Setup.php index 593ba643f..d4c31fd4e 100644 --- a/Zotlabs/Module/Setup.php +++ b/Zotlabs/Module/Setup.php @@ -508,6 +508,7 @@ class Setup extends \Zotlabs\Web\Controller { $this->check_add($ck_funcs, t('PDO database PHP module'), true, true); $this->check_add($ck_funcs, t('mb_string PHP module'), true, true); $this->check_add($ck_funcs, t('xml PHP module'), true, true); + $this->check_add($ck_funcs, t('zip PHP module'), true, true); if(function_exists('apache_get_modules')){ if (! in_array('mod_rewrite', apache_get_modules())) { @@ -550,8 +551,12 @@ class Setup extends \Zotlabs\Web\Controller { $ck_funcs[4]['help'] = t('Error: mb_string PHP module required but not installed.'); } if(! extension_loaded('xml')) { + $ck_funcs[5]['status'] = false; + $ck_funcs[5]['help'] = t('Error: xml PHP module required for DAV but not installed.'); + } + if(! extension_loaded('zip')) { $ck_funcs[6]['status'] = false; - $ck_funcs[6]['help'] = t('Error: xml PHP module required for DAV but not installed.'); + $ck_funcs[6]['help'] = t('Error: zip PHP module required but not installed.'); } $checks = array_merge($checks, $ck_funcs);