aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Zotlabs/Access/AccessList.php128
-rw-r--r--Zotlabs/Module/Setup.php7
-rw-r--r--install/INSTALL.txt2
-rw-r--r--tests/unit/Access/AccessListTest.php189
-rw-r--r--tests/unit/Lib/PermissionDescriptionTest.php2
5 files changed, 296 insertions, 32 deletions
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/Zotlabs/Module/Setup.php b/Zotlabs/Module/Setup.php
index d6d7eeb05..aa28204d3 100644
--- a/Zotlabs/Module/Setup.php
+++ b/Zotlabs/Module/Setup.php
@@ -501,6 +501,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())) {
@@ -543,8 +544,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);
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.
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 @@
+<?php
+/*
+ * Copyright (c) 2017 Hubzilla
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+namespace Zotlabs\Tests\Unit\Access;
+
+use Zotlabs\Tests\Unit\UnitTestCase;
+use Zotlabs\Access\AccessList;
+
+/**
+ * @brief Unit Test case for AccessList class.
+ *
+ * @covers Zotlabs\Access\AccessList
+ */
+class AccessListTest extends UnitTestCase {
+
+ /**
+ * @brief Expected result for most tests.
+ * @var array
+ */
+ protected $expectedResult = [
+ 'allow_cid' => '<acid><acid2>',
+ 'allow_gid' => '<agid>',
+ 'deny_cid' => '',
+ 'deny_gid' => '<dgid><dgid2>'
+ ];
+
+
+
+ public function testConstructor() {
+ $channel = [
+ 'channel_allow_cid' => '<acid><acid2>',
+ 'channel_allow_gid' => '<agid>',
+ 'channel_deny_cid' => '',
+ 'channel_deny_gid' => '<dgid><dgid2>'
+ ];
+
+ $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' => '<acid><acid2>',
+ 'allow_gid' => '<agid>',
+ 'deny_cid' => '',
+ 'deny_gid' => '<dgid><dgid2>'
+ ];
+ $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' => '<acid>',
+ 'channel_allow_gid' => '<agid>',
+ 'channel_deny_cid' => '<dcid>',
+ 'channel_deny_gid' => '<dgid>'
+ ]],
+ 'only one set' => [[
+ 'channel_allow_cid' => '<acid>',
+ 'channel_allow_gid' => '',
+ 'channel_deny_cid' => '',
+ 'channel_deny_gid' => ''
+ ]],
+ 'acid+null' => [[
+ 'channel_allow_cid' => '<acid>',
+ '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 {