]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #6726 from MrPetovan/task/6676-fix-implicit-mentions
authorMichael Vogel <icarus@dabo.de>
Sun, 24 Feb 2019 14:40:11 +0000 (15:40 +0100)
committerGitHub <noreply@github.com>
Sun, 24 Feb 2019 14:40:11 +0000 (15:40 +0100)
Fix last batch of implicit mentions issues

34 files changed:
mod/contactgroup.php [deleted file]
mod/group.php [deleted file]
mod/profiles.php
src/Content/ContactSelector.php
src/Core/Console/DatabaseStructure.php
src/Core/Console/PostUpdate.php
src/Core/Lock.php
src/Core/Lock/CacheLockDriver.php
src/Core/Lock/DatabaseLockDriver.php
src/Core/Lock/ILockDriver.php
src/Core/Lock/SemaphoreLockDriver.php
src/Core/System.php
src/Core/Update.php
src/Factory/LoggerFactory.php
src/Factory/ProfilerFactory.php
src/Model/Contact.php
src/Model/Group.php
src/Model/Profile.php
src/Module/Group.php [new file with mode: 0644]
src/Module/Install.php
tests/Util/DBAMockTrait.php
tests/Util/DBStructureMockTrait.php
tests/Util/DateTimeFormatMockTrait.php
tests/Util/L10nMockTrait.php
tests/Util/RendererMockTrait.php
tests/src/Core/Console/ConfigConsoleTest.php
tests/src/Core/InstallerTest.php
tests/src/Util/Logger/WorkerLoggerTest.php
tests/src/Util/ProfilerTest.php
view/js/main.js
view/lang/C/messages.po
view/templates/group_side.tpl
view/theme/frio/templates/group_side.tpl
view/theme/quattro/templates/group_side.tpl

diff --git a/mod/contactgroup.php b/mod/contactgroup.php
deleted file mode 100644 (file)
index 07997cd..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-use Friendica\App;
-use Friendica\Database\DBA;
-use Friendica\Model\Contact;
-use Friendica\Model\Group;
-
-function contactgroup_content(App $a)
-{
-       if (!local_user()) {
-               exit();
-       }
-
-       $change = null;
-       if (($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
-               $r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1",
-                       intval($a->argv[2]),
-                       intval(local_user())
-               );
-               if (DBA::isResult($r)) {
-                       $change = intval($a->argv[2]);
-               }
-       }
-
-       if (($a->argc > 1) && (intval($a->argv[1]))) {
-               $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
-                       intval($a->argv[1]),
-                       intval(local_user())
-               );
-               if (!DBA::isResult($r)) {
-                       exit();
-               }
-
-               $group = $r[0];
-               $members = Contact::getByGroupId($group['id']);
-               $preselected = [];
-               if (count($members)) {
-                       foreach ($members as $member) {
-                               $preselected[] = $member['id'];
-                       }
-               }
-
-               if (!empty($change)) {
-                       if (in_array($change, $preselected)) {
-                               Group::removeMember($group['id'], $change);
-                       } else {
-                               Group::addMember($group['id'], $change);
-                       }
-               }
-       }
-
-       exit();
-}
diff --git a/mod/group.php b/mod/group.php
deleted file mode 100644 (file)
index a6f649b..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-<?php
-/**
- * @file mod/group.php
- * @brief The group module (create and rename contact groups, add and
- *     remove contacts to the contact groups
- */
-
-use Friendica\App;
-use Friendica\BaseModule;
-use Friendica\Core\Config;
-use Friendica\Core\L10n;
-use Friendica\Core\PConfig;
-use Friendica\Core\Renderer;
-use Friendica\Database\DBA;
-use Friendica\Model;
-use Friendica\Module;
-use Friendica\Util\Strings;
-
-function group_init(App $a) {
-       if (local_user()) {
-               $a->page['aside'] = Model\Group::sidebarWidget('contact', 'group', 'extended', (($a->argc > 1) ? $a->argv[1] : 'everyone'));
-       }
-}
-
-function group_post(App $a) {
-
-       if (!local_user()) {
-               notice(L10n::t('Permission denied.') . EOL);
-               return;
-       }
-
-       if (($a->argc == 2) && ($a->argv[1] === 'new')) {
-               BaseModule::checkFormSecurityTokenRedirectOnError('/group/new', 'group_edit');
-
-               $name = Strings::escapeTags(trim($_POST['groupname']));
-               $r = Model\Group::create(local_user(), $name);
-               if ($r) {
-                       info(L10n::t('Group created.') . EOL);
-                       $r = Model\Group::getIdByName(local_user(), $name);
-                       if ($r) {
-                               $a->internalRedirect('group/' . $r);
-                       }
-               } else {
-                       notice(L10n::t('Could not create group.') . EOL);
-               }
-               $a->internalRedirect('group');
-               return; // NOTREACHED
-       }
-
-       if (($a->argc == 2) && intval($a->argv[1])) {
-               BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_edit');
-
-               $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                       intval($a->argv[1]),
-                       intval(local_user())
-               );
-               if (!DBA::isResult($r)) {
-                       notice(L10n::t('Group not found.') . EOL);
-                       $a->internalRedirect('contact');
-                       return; // NOTREACHED
-               }
-               $group = $r[0];
-               $groupname = Strings::escapeTags(trim($_POST['groupname']));
-               if (strlen($groupname) && ($groupname != $group['name'])) {
-                       $r = q("UPDATE `group` SET `name` = '%s' WHERE `uid` = %d AND `id` = %d",
-                               DBA::escape($groupname),
-                               intval(local_user()),
-                               intval($group['id'])
-                       );
-
-                       if ($r) {
-                               info(L10n::t('Group name changed.') . EOL);
-                       }
-               }
-
-               $a->page['aside'] = Model\Group::sidebarWidget();
-       }
-       return;
-}
-
-function group_content(App $a) {
-       $change = false;
-
-       if (!local_user()) {
-               notice(L10n::t('Permission denied') . EOL);
-               return;
-       }
-
-       // With no group number provided we jump to the unassigned contacts as a starting point
-       if ($a->argc == 1) {
-               $a->internalRedirect('group/none');
-       }
-
-       // Switch to text mode interface if we have more than 'n' contacts or group members
-       $switchtotext = PConfig::get(local_user(), 'system', 'groupedit_image_limit');
-       if (is_null($switchtotext)) {
-               $switchtotext = Config::get('system', 'groupedit_image_limit', 400);
-       }
-
-       $tpl = Renderer::getMarkupTemplate('group_edit.tpl');
-
-       $context = [
-               '$submit' => L10n::t('Save Group'),
-               '$submit_filter' => L10n::t('Filter'),
-       ];
-
-       if (($a->argc == 2) && ($a->argv[1] === 'new')) {
-               return Renderer::replaceMacros($tpl, $context + [
-                       '$title' => L10n::t('Create a group of contacts/friends.'),
-                       '$gname' => ['groupname', L10n::t('Group Name: '), '', ''],
-                       '$gid' => 'new',
-                       '$form_security_token' => BaseModule::getFormSecurityToken("group_edit"),
-               ]);
-
-
-       }
-
-       $nogroup = false;
-
-       if (($a->argc == 2) && ($a->argv[1] === 'none')) {
-               $id = -1;
-               $nogroup = true;
-               $group = [
-                       'id' => $id,
-                       'name' => L10n::t('Contacts not in any group'),
-               ];
-
-               $members = [];
-               $preselected = [];
-
-               $context = $context + [
-                       '$title' => $group['name'],
-                       '$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],
-                       '$gid' => $id,
-                       '$editable' => 0,
-               ];
-       }
-
-
-       if (($a->argc == 3) && ($a->argv[1] === 'drop')) {
-               BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_drop', 't');
-
-               if (intval($a->argv[2])) {
-                       $r = q("SELECT `name` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                               intval($a->argv[2]),
-                               intval(local_user())
-                       );
-
-                       $result = null;
-
-                       if (DBA::isResult($r)) {
-                               $result = Model\Group::removeByName(local_user(), $r[0]['name']);
-                       }
-
-                       if ($result) {
-                               info(L10n::t('Group removed.') . EOL);
-                       } else {
-                               notice(L10n::t('Unable to remove group.') . EOL);
-                       }
-               }
-               $a->internalRedirect('group');
-               // NOTREACHED
-       }
-
-       if (($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
-               BaseModule::checkFormSecurityTokenForbiddenOnError('group_member_change', 't');
-
-               $r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1",
-                       intval($a->argv[2]),
-                       intval(local_user())
-               );
-               if (DBA::isResult($r)) {
-                       $change = intval($a->argv[2]);
-               }
-       }
-
-       if (($a->argc > 1) && intval($a->argv[1])) {
-               $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
-                       intval($a->argv[1]),
-                       intval(local_user())
-               );
-
-               if (!DBA::isResult($r)) {
-                       notice(L10n::t('Group not found.') . EOL);
-                       $a->internalRedirect('contact');
-               }
-
-               $group = $r[0];
-               $members = Model\Contact::getByGroupId($group['id']);
-               $preselected = [];
-
-               if (count($members)) {
-                       foreach ($members as $member) {
-                               $preselected[] = $member['id'];
-                       }
-               }
-
-               if ($change) {
-                       if (in_array($change, $preselected)) {
-                               Model\Group::removeMember($group['id'], $change);
-                       } else {
-                               Model\Group::addMember($group['id'], $change);
-                       }
-
-                       $members = Model\Contact::getByGroupId($group['id']);
-                       $preselected = [];
-                       if (count($members)) {
-                               foreach ($members as $member) {
-                                       $preselected[] = $member['id'];
-                               }
-                       }
-               }
-
-               $drop_tpl = Renderer::getMarkupTemplate('group_drop.tpl');
-               $drop_txt = Renderer::replaceMacros($drop_tpl, [
-                       '$id' => $group['id'],
-                       '$delete' => L10n::t('Delete Group'),
-                       '$form_security_token' => BaseModule::getFormSecurityToken("group_drop"),
-               ]);
-
-
-               $context = $context + [
-                       '$title' => $group['name'],
-                       '$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],
-                       '$gid' => $group['id'],
-                       '$drop' => $drop_txt,
-                       '$form_security_token' => BaseModule::getFormSecurityToken('group_edit'),
-                       '$edit_name' => L10n::t('Edit Group Name'),
-                       '$editable' => 1,
-               ];
-
-       }
-
-       if (!isset($group)) {
-               return;
-       }
-
-       $groupeditor = [
-               'label_members' => L10n::t('Members'),
-               'members' => [],
-               'label_contacts' => L10n::t('All Contacts'),
-               'group_is_empty' => L10n::t('Group is empty'),
-               'contacts' => [],
-       ];
-
-       $sec_token = addslashes(BaseModule::getFormSecurityToken('group_member_change'));
-
-       // Format the data of the group members
-       foreach ($members as $member) {
-               if ($member['url']) {
-                       $entry = Module\Contact::getContactTemplateVars($member);
-                       $entry['label'] = 'members';
-                       $entry['photo_menu'] = '';
-                       $entry['change_member'] = [
-                               'title'     => L10n::t("Remove contact from group"),
-                               'gid'       => $group['id'],
-                               'cid'       => $member['id'],
-                               'sec_token' => $sec_token
-                       ];
-
-                       $groupeditor['members'][] = $entry;
-               } else {
-                       Model\Group::removeMember($group['id'], $member['id']);
-               }
-       }
-
-       if ($nogroup) {
-               $r = Model\Contact::getUngroupedList(local_user());
-       } else {
-               $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `blocked` AND NOT `pending` AND NOT `self` ORDER BY `name` ASC",
-                       intval(local_user())
-               );
-               $context['$desc'] = L10n::t('Click on a contact to add or remove.');
-       }
-
-       if (DBA::isResult($r)) {
-               // Format the data of the contacts who aren't in the contact group
-               foreach ($r as $member) {
-                       if (!in_array($member['id'], $preselected)) {
-                               $entry = Module\Contact::getContactTemplateVars($member);
-                               $entry['label'] = 'contacts';
-                               if (!$nogroup)
-                                       $entry['photo_menu'] = [];
-
-                               if (!$nogroup) {
-                                       $entry['change_member'] = [
-                                               'title'     => L10n::t("Add contact to group"),
-                                               'gid'       => $group['id'],
-                                               'cid'       => $member['id'],
-                                               'sec_token' => $sec_token
-                                       ];
-                               }
-
-                               $groupeditor['contacts'][] = $entry;
-                       }
-               }
-       }
-
-       $context['$groupeditor'] = $groupeditor;
-
-       // If there are to many contacts we could provide an alternative view mode
-       $total = count($groupeditor['members']) + count($groupeditor['contacts']);
-       $context['$shortmode'] = (($switchtotext && ($total > $switchtotext)) ? true : false);
-
-       if ($change) {
-               $tpl = Renderer::getMarkupTemplate('groupeditor.tpl');
-               echo Renderer::replaceMacros($tpl, $context);
-               exit();
-       }
-
-       return Renderer::replaceMacros($tpl, $context);
-
-}
index bc41718c544f9ce9b9600b9c12b3663b03fab7f1..58f23e4634afff5d1a87a5af876a0cd5ccb98040 100644 (file)
@@ -338,7 +338,7 @@ function profiles_post(App $a) {
 
                $hide_friends = (($_POST['hide-friends'] == 1) ? 1: 0);
 
-               PConfig::set(local_user(), 'system', 'detailled_profile', (($_POST['detailled_profile'] == 1) ? 1: 0));
+               PConfig::set(local_user(), 'system', 'detailled_profile', (($_POST['detailed_profile'] == 1) ? 1: 0));
 
                $changes = [];
                if ($is_default) {
@@ -535,18 +535,18 @@ function profiles_content(App $a) {
                $personal_account = !(in_array($a->user["page-flags"],
                                        [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP]));
 
-               $detailled_profile = (PConfig::get(local_user(), 'system', 'detailled_profile') AND $personal_account);
+               $detailed_profile = (PConfig::get(local_user(), 'system', 'detailled_profile') AND $personal_account);
 
                $is_default = (($r[0]['is-default']) ? 1 : 0);
                $tpl = Renderer::getMarkupTemplate("profile_edit.tpl");
                $o .= Renderer::replaceMacros($tpl, [
                        '$personal_account' => $personal_account,
-                       '$detailled_profile' => $detailled_profile,
+                       '$detailled_profile' => $detailed_profile,
 
                        '$details' => [
-                               'detailled_profile', //Name
+                               'detailed_profile', //Name
                                L10n::t('Show more profile fields:'), //Label
-                               $detailled_profile, //Value
+                               $detailed_profile, //Value
                                '', //Help string
                                [L10n::t('No'), L10n::t('Yes')] //Off - On strings
                        ],
index 470590388447bf3634a37ab76dad849da0761059..e327069b33fd86653bad93e0b9a661c1c3a1bcc3 100644 (file)
@@ -150,7 +150,7 @@ class ContactSelector
        {
                $o = '';
                $select = [
-                       'EMPTY'            => '',
+                       ''                 => L10n::t('No answer'),
                        'Male'             => L10n::t('Male'),
                        'Female'           => L10n::t('Female'),
                        'Currently Male'   => L10n::t('Currently Male'),
@@ -190,7 +190,7 @@ class ContactSelector
        {
                $o = '';
                $select = [
-                       'EMPTY'         => '',
+                       ''              => L10n::t('No answer'),
                        'Males'         => L10n::t('Males'),
                        'Females'       => L10n::t('Females'),
                        'Gay'           => L10n::t('Gay'),
@@ -228,7 +228,7 @@ class ContactSelector
        {
                $o = '';
                $select = [
-                       'EMPTY'                => '',
+                       ''                     => L10n::t('No answer'),
                        'Single'               => L10n::t('Single'),
                        'Lonely'               => L10n::t('Lonely'),
                        'Available'            => L10n::t('Available'),
index 1ec108d2e61cfd2f0d5d2fc07502b733ba3843b3..dededa9b3a4321e09fcd3ea31ea6d07c6f026b07 100644 (file)
@@ -31,9 +31,10 @@ Commands
        toinnodb Convert all tables from MyISAM to InnoDB
 
 Options
-    -h|--help|-? Show help information
-    -v           Show more debug information.
-    -f|--force   Force the command in case of "update" (Ignore failed updates/running updates)
+    -h|--help|-?       Show help information
+    -v                 Show more debug information.
+    -f|--force         Force the update command (Even if the database structure matches)
+    -o|--override      Override running or stalling updates
 HELP;
                return $help;
        }
@@ -68,8 +69,9 @@ HELP;
                                $output = DBStructure::update($a->getBasePath(), true, false);
                                break;
                        case "update":
-                               $force = $this->getOption(['f', 'force'], false);
-                               $output = Update::run($a->getBasePath(), $force, true, false);
+                               $force    = $this->getOption(['f', 'force'], false);
+                               $override = $this->getOption(['o', 'override'], false);
+                               $output = Update::run($a->getBasePath(), $force, $override,true, false);
                                break;
                        case "dumpsql":
                                ob_start();
@@ -89,5 +91,4 @@ HELP;
 
                return 0;
        }
-
 }
index 103d0fef7e68062928cdfd79100234a8dfd0187d..a903cd7dd49ccefe137aaf9b1efd4ffcd90d6627 100644 (file)
@@ -56,7 +56,7 @@ HELP;
                }
 
                echo L10n::t('Check for pending update actions.') . "\n";
-               Update::run($a->getBasePath(), true, true, false);
+               Update::run($a->getBasePath(), true, false, true, false);
                echo L10n::t('Done.') . "\n";
 
                echo L10n::t('Execute pending post updates.') . "\n";
index e8c8a7041605b0826be5912722f7e9b75629de5d..8bc2c242d18a588d984bb10be0c8daebd4e8e69e 100644 (file)
@@ -122,12 +122,13 @@ class Lock
        /**
         * @brief Releases a lock if it was set by us
         *
-        * @param string $key Name of the lock
+        * @param string $key      Name of the lock
+        * @param bool   $override Overrides the lock to get releases
         * @return void
         */
-       public static function release($key)
+       public static function release($key, $override = false)
        {
-               self::getDriver()->releaseLock($key);
+               self::getDriver()->releaseLock($key, $override);
        }
 
        /**
index 18d441ffea09d5a0910ec6ac3ada461db885ab7c..c1cd8ffb43a3ab407324c757e2cbd0190737ed75 100644 (file)
@@ -61,11 +61,15 @@ class CacheLockDriver extends AbstractLockDriver
        /**
         * (@inheritdoc)
         */
-       public function releaseLock($key)
+       public function releaseLock($key, $override = false)
        {
                $cachekey = self::getLockKey($key);
 
-               $this->cache->compareDelete($cachekey, getmypid());
+               if ($override) {
+                       $this->cache->delete($cachekey);
+               } else {
+                       $this->cache->compareDelete($cachekey, getmypid());
+               }
                $this->markRelease($key);
        }
 
index 6f18fb5bec7dcf63416c4112cec7c2bf307b89f1..a137ef12edcac6e6766af4f704128e3ce97085d3 100644 (file)
@@ -68,9 +68,15 @@ class DatabaseLockDriver extends AbstractLockDriver
        /**
         * (@inheritdoc)
         */
-       public function releaseLock($key)
+       public function releaseLock($key, $override = false)
        {
-               DBA::delete('locks', ['name' => $key, 'pid' => $this->pid]);
+               if ($override) {
+                       $where = ['name' => $key];
+               } else {
+                       $where = ['name' => $key, 'pid' => $this->pid];
+               }
+
+               DBA::delete('locks', $where);
 
                $this->markRelease($key);
 
index a255f683454753e414e2c20677f106661dccf486..7cbaa4fc6908a701721c1886705a3a85c2ff3fae 100644 (file)
@@ -33,11 +33,12 @@ interface ILockDriver
        /**
         * Releases a lock if it was set by us
         *
-        * @param string $key The Name of the lock
+        * @param string $key      The Name of the lock
+        * @param bool   $override Overrides the lock to get released
         *
         * @return void
         */
-       public function releaseLock($key);
+       public function releaseLock($key, $override = false);
 
        /**
         * Releases all lock that were set by us
index cf1ce5a8d8bc770cdc06120868f351e4aef65402..781e110b1708a83633d1497296448ba639632595 100644 (file)
@@ -50,7 +50,7 @@ class SemaphoreLockDriver extends AbstractLockDriver
        /**
         * (@inheritdoc)
         */
-       public function releaseLock($key)
+       public function releaseLock($key, $override = false)
        {
                if (empty(self::$semaphore[$key])) {
                        return false;
index 69d15a176465636549913a0816f81815f5eeb985..45a88fe0937b6d92c349d527c8985eab28e04c05 100644 (file)
@@ -176,6 +176,12 @@ class System extends BaseObject
                exit();
        }
 
+       public static function jsonError($httpCode, $data, $content_type = 'application/json')
+       {
+               header($_SERVER["SERVER_PROTOCOL"] . ' ' . $httpCode);
+               self::jsonExit($data, $content_type);
+       }
+
        /**
         * @brief Encodes content to json.
         *
index ed6c058726431e2383cb27a9203674bcad309dc8..0a0f365d1e0203ed177862a5d32720677866e3da 100644 (file)
@@ -37,9 +37,13 @@ class Update
                }
 
                if ($build < DB_UPDATE_VERSION) {
-                       // When we cannot execute the database update via the worker, we will do it directly
-                       if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) {
+                       if ($via_worker) {
+                               // Calling the database update directly via the worker enables us to perform database changes to the workerqueue table itself.
+                               // This is a fallback, since normally the database update will be performed by a worker job.
+                               // This worker job doesn't work for changes to the "workerqueue" table itself.
                                self::run($basePath);
+                       } else {
+                               Worker::add(PRIORITY_CRITICAL, 'DBUpdate');
                        }
                }
        }
@@ -48,19 +52,20 @@ class Update
         * Automatic database updates
         *
         * @param string $basePath The base path of this application
-        * @param bool $force      Force the Update-Check even if the lock is set
+        * @param bool $force      Force the Update-Check even if the database version doesn't match
+        * @param bool $override   Overrides any running/stuck updates
         * @param bool $verbose    Run the Update-Check verbose
         * @param bool $sendMail   Sends a Mail to the administrator in case of success/failure
         *
         * @return string Empty string if the update is successful, error messages otherwise
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function run($basePath, $force = false, $verbose = false, $sendMail = true)
+       public static function run($basePath, $force = false, $override = false, $verbose = false, $sendMail = true)
        {
                // In force mode, we release the dbupdate lock first
                // Necessary in case of an stuck update
-               if ($force) {
-                       Lock::release('dbupdate');
+               if ($override) {
+                       Lock::release('dbupdate', true);
                }
 
                $build = Config::get('system', 'build');
@@ -70,12 +75,12 @@ class Update
                        Config::set('system', 'build', $build);
                }
 
-               if ($build != DB_UPDATE_VERSION) {
+               if ($build != DB_UPDATE_VERSION || $force) {
                        require_once 'update.php';
 
                        $stored = intval($build);
                        $current = intval(DB_UPDATE_VERSION);
-                       if ($stored < $current) {
+                       if ($stored < $current || $force) {
                                Config::load('database');
 
                                Logger::log('Update from \'' . $stored . '\'  to \'' . $current . '\' - starting', Logger::DEBUG);
@@ -126,8 +131,6 @@ class Update
                                        Lock::release('dbupdate');
                                }
                        }
-               } elseif ($force) {
-                       DBStructure::update($basePath, $verbose, true);
                }
 
                return '';
index 97b513bd34289d133062c74bbc984bb0f906a0ab..681dc8a6c6bc5ce7fe3af5e00828f9feb8a92634 100644 (file)
@@ -20,6 +20,16 @@ use Psr\Log\LogLevel;
  */
 class LoggerFactory
 {
+       /**
+        * A list of classes, which shouldn't get logged
+        * @var array
+        */
+       private static $ignoreClassList = [
+               Logger::class,
+               Profiler::class,
+               WorkerLogger::class
+       ];
+
        /**
         * Creates a new PSR-3 compliant logger instances
         *
@@ -34,7 +44,7 @@ class LoggerFactory
                $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
                $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
                $logger->pushProcessor(new Monolog\Processor\UidProcessor());
-               $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, [Logger::class, Profiler::class, WorkerLogger::class]));
+               $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, self::$ignoreClassList));
 
                $debugging = $config->get('system', 'debugging');
                $stream    = $config->get('system', 'logfile');
@@ -79,7 +89,7 @@ class LoggerFactory
                $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
                $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
                $logger->pushProcessor(new Monolog\Processor\UidProcessor());
-               $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, ['Friendica\\Core\\Logger']));
+               $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, self::$ignoreClassList));
 
                $logger->pushHandler(new FriendicaDevelopHandler($developerIp));
 
@@ -146,6 +156,7 @@ class LoggerFactory
                        if (!is_int($loglevel)) {
                                $loglevel = LogLevel::NOTICE;
                        }
+
                        $fileHandler = new Monolog\Handler\StreamHandler($stream, $loglevel);
 
                        $formatter = new Monolog\Formatter\LineFormatter("%datetime% %channel% [%level_name%]: %message% %context% %extra%\n");
index 26a156639e6bb05d79d8976f0862418cef2183be..19c96e8ca216eab37c4b30f567e56c46705fc370 100644 (file)
@@ -17,9 +17,9 @@ class ProfilerFactory
        public static function create(IConfigCache $configCache)
        {
                $enabled = $configCache->get('system', 'profiler');
-               $enabled = isset($enabled) && $enabled !== '!<unset>!';
+               $enabled = isset($enabled) && $enabled !== '0';
                $renderTime = $configCache->get('rendertime', 'callstack');
-               $renderTime = isset($renderTime) && $renderTime !== '!<unset>!';
+               $renderTime = isset($renderTime) && $renderTime !== '0';
 
                return new Profiler($enabled, $renderTime);
        }
index 5f63d89d0f974243d6f2ea7de78212c8ce14e54e..6e83b76e6fe3024cb139fa7ccb9c6d4123a9f62b 100644 (file)
@@ -232,6 +232,11 @@ class Contact extends BaseObject
                }
 
                DBA::update('user-contact', ['blocked' => $blocked], ['cid' => $cdata['public'], 'uid' => $uid], true);
+
+               if ($blocked) {
+                       // Blocked contact can't be in any group
+                       self::removeFromGroups($cid);
+               }
        }
 
        /**
@@ -2220,4 +2225,9 @@ class Contact extends BaseObject
 
                return $redirect;
        }
+
+       public static function removeFromGroups($contact_id)
+       {
+               return DBA::delete('group_member', ['contact-id' => $contact_id]);
+       }
 }
index 0af10995b4a70e698105993a58ad8b9678930834..feff4661ab6f8856fb916d7b12ffe0eacd7a2099 100644 (file)
@@ -16,6 +16,26 @@ use Friendica\Database\DBA;
  */
 class Group extends BaseObject
 {
+       /**
+        *
+        *
+        * @param int $group_id
+        * @return bool
+        * @throws \Exception
+        */
+       public static function exists($group_id, $uid = null)
+       {
+               $condition = ['id' => $group_id, 'deleted' => false];
+
+               if (isset($uid)) {
+                       $condition = [
+                               'uid' => $uid
+                       ];
+               }
+
+               return DBA::exists('group', $condition);
+       }
+
        /**
         * @brief Create a new contact group
         *
index aacceedb3a9f8876e85850c11f510b4d315f1b68..b10e9848f5893d269fe79dcb1214ceb8beff159b 100644 (file)
@@ -787,7 +787,7 @@ class Profile
                                $profile['marital']['with'] = $a->profile['with'];
                        }
 
-                       if (strlen($a->profile['howlong']) && $a->profile['howlong'] >= DBA::NULL_DATETIME) {
+                       if (strlen($a->profile['howlong']) && $a->profile['howlong'] > DBA::NULL_DATETIME) {
                                $profile['howlong'] = Temporal::getRelativeDate($a->profile['howlong'], L10n::t('for %1$d %2$s'));
                        }
 
diff --git a/src/Module/Group.php b/src/Module/Group.php
new file mode 100644 (file)
index 0000000..747ec1e
--- /dev/null
@@ -0,0 +1,350 @@
+<?php\r
+/**\r
+ * @file src/Module/Group.php\r
+ */\r
+\r
+namespace Friendica\Module;\r
+\r
+use Friendica\BaseModule;\r
+use Friendica\Core\Config;\r
+use Friendica\Core\L10n;\r
+use Friendica\Core\PConfig;\r
+use Friendica\Core\Renderer;\r
+use Friendica\Core\System;\r
+use Friendica\Database\DBA;\r
+use Friendica\Model;\r
+use Friendica\Util\Strings;\r
+\r
+require_once 'boot.php';\r
+\r
+class Group extends BaseModule\r
+{\r
+       public static function post()\r
+       {\r
+               $a = self::getApp();\r
+\r
+               if ($a->isAjax()) {\r
+                       self::ajaxPost();\r
+               }\r
+\r
+               if (!local_user()) {\r
+                       notice(L10n::t('Permission denied.'));\r
+                       $a->internalRedirect();\r
+               }\r
+\r
+               if (($a->argc == 2) && ($a->argv[1] === 'new')) {\r
+                       BaseModule::checkFormSecurityTokenRedirectOnError('/group/new', 'group_edit');\r
+\r
+                       $name = Strings::escapeTags(trim($_POST['groupname']));\r
+                       $r = Model\Group::create(local_user(), $name);\r
+                       if ($r) {\r
+                               info(L10n::t('Group created.'));\r
+                               $r = Model\Group::getIdByName(local_user(), $name);\r
+                               if ($r) {\r
+                                       $a->internalRedirect('group/' . $r);\r
+                               }\r
+                       } else {\r
+                               notice(L10n::t('Could not create group.'));\r
+                       }\r
+                       $a->internalRedirect('group');\r
+               }\r
+\r
+               if (($a->argc == 2) && intval($a->argv[1])) {\r
+                       BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_edit');\r
+\r
+                       $group = DBA::selectFirst('group', ['id', 'name'], ['id' => $a->argv[1], 'uid' => local_user()]);\r
+                       if (!DBA::isResult($group)) {\r
+                               notice(L10n::t('Group not found.'));\r
+                               $a->internalRedirect('contact');\r
+                       }\r
+                       $groupname = Strings::escapeTags(trim($_POST['groupname']));\r
+                       if (strlen($groupname) && ($groupname != $group['name'])) {\r
+                               if (Model\Group::update($group['id'], $groupname)) {\r
+                                       info(L10n::t('Group name changed.'));\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static function ajaxPost()\r
+       {\r
+               try {\r
+                       $a = self::getApp();\r
+\r
+                       if (!local_user()) {\r
+                               throw new \Exception(L10n::t('Permission denied.'), 403);\r
+                       }\r
+\r
+                       // POST /group/123/add/123\r
+                       // POST /group/123/remove/123\r
+                       if ($a->argc == 4) {\r
+                               list($group_id, $command, $contact_id) = array_slice($a->argv, 1);\r
+\r
+                               if (!Model\Group::exists($group_id, local_user())) {\r
+                                       throw new \Exception(L10n::t('Unknown group.'), 404);\r
+                               }\r
+\r
+                               $contact = DBA::selectFirst('contact', ['pending', 'blocked', 'deleted'], ['id' => $contact_id, 'uid' => local_user()]);\r
+                               if (!DBA::isResult($contact)) {\r
+                                       throw new \Exception(L10n::t('Contact not found.'), 404);\r
+                               }\r
+\r
+                               if ($contact['pending']) {\r
+                                       throw new \Exception(L10n::t('Contact is unavailable.'), 400);\r
+                               }\r
+\r
+                               if ($contact['deleted']) {\r
+                                       throw new \Exception(L10n::t('Contact is deleted.'), 410);\r
+                               }\r
+\r
+                               switch($command) {\r
+                                       case 'add':\r
+                                               if ($contact['blocked']) {\r
+                                                       throw new \Exception(L10n::t('Contact is blocked, unable to add it to a group.'), 400);\r
+                                               }\r
+\r
+                                               if (!Model\Group::addMember($group_id, $contact_id)) {\r
+                                                       throw new \Exception(L10n::t('Unable to add the contact to the group.'), 500);\r
+                                               }\r
+                                               $message = L10n::t('Contact successfully added to group.');\r
+                                               break;\r
+                                       case 'remove':\r
+                                               if (!Model\Group::removeMember($group_id, $contact_id)) {\r
+                                                       throw new \Exception(L10n::t('Unable to remove the contact from the group.'), 500);\r
+                                               }\r
+                                               $message = L10n::t('Contact successfully removed from group.');\r
+                                               break;\r
+                                       default:\r
+                                               throw new \Exception(L10n::t('Unknown group command.'), 400);\r
+                               }\r
+                       } else {\r
+                               throw new \Exception(L10n::t('Bad request.'), 400);\r
+                       }\r
+\r
+                       notice($message);\r
+                       System::jsonExit(['status' => 'OK', 'message' => $message]);\r
+               } catch (\Exception $e) {\r
+                       notice($e->getMessage());\r
+                       System::jsonError($e->getCode(), ['status' => 'error', 'message' => $e->getMessage()]);\r
+               }\r
+       }\r
+\r
+       public static function content()\r
+       {\r
+               $change = false;\r
+\r
+               if (!local_user()) {\r
+                       System::httpExit(403);\r
+               }\r
+\r
+               $a = self::getApp();\r
+\r
+               $a->page['aside'] = Model\Group::sidebarWidget('contact', 'group', 'extended', (($a->argc > 1) ? $a->argv[1] : 'everyone'));\r
+\r
+               // With no group number provided we jump to the unassigned contacts as a starting point\r
+               if ($a->argc == 1) {\r
+                       $a->internalRedirect('group/none');\r
+               }\r
+\r
+               // Switch to text mode interface if we have more than 'n' contacts or group members\r
+               $switchtotext = PConfig::get(local_user(), 'system', 'groupedit_image_limit');\r
+               if (is_null($switchtotext)) {\r
+                       $switchtotext = Config::get('system', 'groupedit_image_limit', 200);\r
+               }\r
+\r
+               $tpl = Renderer::getMarkupTemplate('group_edit.tpl');\r
+\r
+\r
+               $context = [\r
+                       '$submit' => L10n::t('Save Group'),\r
+                       '$submit_filter' => L10n::t('Filter'),\r
+               ];\r
+\r
+               if (($a->argc == 2) && ($a->argv[1] === 'new')) {\r
+                       return Renderer::replaceMacros($tpl, $context + [\r
+                               '$title' => L10n::t('Create a group of contacts/friends.'),\r
+                               '$gname' => ['groupname', L10n::t('Group Name: '), '', ''],\r
+                               '$gid' => 'new',\r
+                               '$form_security_token' => BaseModule::getFormSecurityToken("group_edit"),\r
+                       ]);\r
+               }\r
+\r
+               $nogroup = false;\r
+\r
+               if (($a->argc == 2) && ($a->argv[1] === 'none')) {\r
+                       $id = -1;\r
+                       $nogroup = true;\r
+                       $group = [\r
+                               'id' => $id,\r
+                               'name' => L10n::t('Contacts not in any group'),\r
+                       ];\r
+\r
+                       $members = [];\r
+                       $preselected = [];\r
+\r
+                       $context = $context + [\r
+                               '$title' => $group['name'],\r
+                               '$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],\r
+                               '$gid' => $id,\r
+                               '$editable' => 0,\r
+                       ];\r
+               }\r
+\r
+               if (($a->argc == 3) && ($a->argv[1] === 'drop')) {\r
+                       BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_drop', 't');\r
+\r
+                       if (intval($a->argv[2])) {\r
+                               if (!Model\Group::exists($a->argv[2], local_user())) {\r
+                                       notice(L10n::t('Group not found.'));\r
+                                       $a->internalRedirect('contact');\r
+                               }\r
+\r
+                               if (Model\Group::remove($a->argv[2])) {\r
+                                       info(L10n::t('Group removed.'));\r
+                               } else {\r
+                                       notice(L10n::t('Unable to remove group.'));\r
+                               }\r
+                       }\r
+                       $a->internalRedirect('group');\r
+               }\r
+\r
+               if (($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {\r
+                       BaseModule::checkFormSecurityTokenForbiddenOnError('group_member_change', 't');\r
+\r
+                       if (DBA::exists('contact', ['id' => $a->argv[2], 'uid' => local_user(), 'self' => false, 'pending' => false, 'blocked' => false])) {\r
+                               $change = intval($a->argv[2]);\r
+                       }\r
+               }\r
+\r
+               if (($a->argc > 1) && intval($a->argv[1])) {\r
+                       $group = DBA::selectFirst('group', ['id', 'name'], ['id' => $a->argv[1], 'uid' => local_user(), 'deleted' => false]);\r
+                       if (!DBA::isResult($group)) {\r
+                               notice(L10n::t('Group not found.'));\r
+                               $a->internalRedirect('contact');\r
+                       }\r
+\r
+                       $members = Model\Contact::getByGroupId($group['id']);\r
+                       $preselected = [];\r
+\r
+                       if (count($members)) {\r
+                               foreach ($members as $member) {\r
+                                       $preselected[] = $member['id'];\r
+                               }\r
+                       }\r
+\r
+                       if ($change) {\r
+                               if (in_array($change, $preselected)) {\r
+                                       Model\Group::removeMember($group['id'], $change);\r
+                               } else {\r
+                                       Model\Group::addMember($group['id'], $change);\r
+                               }\r
+\r
+                               $members = Model\Contact::getByGroupId($group['id']);\r
+                               $preselected = [];\r
+                               if (count($members)) {\r
+                                       foreach ($members as $member) {\r
+                                               $preselected[] = $member['id'];\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       $drop_tpl = Renderer::getMarkupTemplate('group_drop.tpl');\r
+                       $drop_txt = Renderer::replaceMacros($drop_tpl, [\r
+                               '$id' => $group['id'],\r
+                               '$delete' => L10n::t('Delete Group'),\r
+                               '$form_security_token' => BaseModule::getFormSecurityToken("group_drop"),\r
+                       ]);\r
+\r
+                       $context = $context + [\r
+                               '$title' => $group['name'],\r
+                               '$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],\r
+                               '$gid' => $group['id'],\r
+                               '$drop' => $drop_txt,\r
+                               '$form_security_token' => BaseModule::getFormSecurityToken('group_edit'),\r
+                               '$edit_name' => L10n::t('Edit Group Name'),\r
+                               '$editable' => 1,\r
+                       ];\r
+               }\r
+\r
+               if (!isset($group)) {\r
+                       System::httpExit(400);\r
+               }\r
+\r
+               $groupeditor = [\r
+                       'label_members' => L10n::t('Members'),\r
+                       'members' => [],\r
+                       'label_contacts' => L10n::t('All Contacts'),\r
+                       'group_is_empty' => L10n::t('Group is empty'),\r
+                       'contacts' => [],\r
+               ];\r
+\r
+               $sec_token = addslashes(BaseModule::getFormSecurityToken('group_member_change'));\r
+\r
+               // Format the data of the group members\r
+               foreach ($members as $member) {\r
+                       if ($member['url']) {\r
+                               $entry = Contact::getContactTemplateVars($member);\r
+                               $entry['label'] = 'members';\r
+                               $entry['photo_menu'] = '';\r
+                               $entry['change_member'] = [\r
+                                       'title'     => L10n::t("Remove contact from group"),\r
+                                       'gid'       => $group['id'],\r
+                                       'cid'       => $member['id'],\r
+                                       'sec_token' => $sec_token\r
+                               ];\r
+\r
+                               $groupeditor['members'][] = $entry;\r
+                       } else {\r
+                               Model\Group::removeMember($group['id'], $member['id']);\r
+                       }\r
+               }\r
+\r
+               if ($nogroup) {\r
+                       $contacts = Model\Contact::getUngroupedList(local_user());\r
+               } else {\r
+                       $contacts_stmt = DBA::select('contact', [],\r
+                               ['uid' => local_user(), 'pending' => false, 'blocked' => false, 'self' => false],\r
+                               ['order' => ['name']]\r
+                       );\r
+                       $contacts = DBA::toArray($contacts_stmt);\r
+                       $context['$desc'] = L10n::t('Click on a contact to add or remove.');\r
+               }\r
+\r
+               if (DBA::isResult($contacts)) {\r
+                       // Format the data of the contacts who aren't in the contact group\r
+                       foreach ($contacts as $member) {\r
+                               if (!in_array($member['id'], $preselected)) {\r
+                                       $entry = Contact::getContactTemplateVars($member);\r
+                                       $entry['label'] = 'contacts';\r
+                                       if (!$nogroup)\r
+                                               $entry['photo_menu'] = [];\r
+\r
+                                       if (!$nogroup) {\r
+                                               $entry['change_member'] = [\r
+                                                       'title'     => L10n::t("Add contact to group"),\r
+                                                       'gid'       => $group['id'],\r
+                                                       'cid'       => $member['id'],\r
+                                                       'sec_token' => $sec_token\r
+                                               ];\r
+                                       }\r
+\r
+                                       $groupeditor['contacts'][] = $entry;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               $context['$groupeditor'] = $groupeditor;\r
+\r
+               // If there are to many contacts we could provide an alternative view mode\r
+               $total = count($groupeditor['members']) + count($groupeditor['contacts']);\r
+               $context['$shortmode'] = (($switchtotext && ($total > $switchtotext)) ? true : false);\r
+\r
+               if ($change) {\r
+                       $tpl = Renderer::getMarkupTemplate('groupeditor.tpl');\r
+                       echo Renderer::replaceMacros($tpl, $context);\r
+                       exit();\r
+               }\r
+\r
+               return Renderer::replaceMacros($tpl, $context);\r
+       }\r
+}
\ No newline at end of file
index d1e2677585ce64efdfb4cdde7be9c729b15cb2d1..de19bc86ab81da9e1248cb21f0b292dcdcf7e878 100644 (file)
@@ -43,6 +43,10 @@ class Install extends BaseModule
        {
                $a = self::getApp();
 
+               if (!$a->getMode()->isInstall()) {
+                       Core\System::httpExit(403);
+               }
+
                // route: install/testrwrite
                // $baseurl/install/testrwrite to test if rewrite in .htaccess is working
                if ($a->getArgumentValue(1, '') == 'testrewrite') {
index 296e3539496f225f1397686ed91212ced47ec449..ab5bc6059edec3765c9fa132610ec7f692f6c0fc 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Friendica\Database\DBA;
 use Mockery\MockInterface;
 
 class DBAStub
@@ -22,7 +23,7 @@ trait DBAMockTrait
        private function checkMock()
        {
                if (!isset($this->dbaMock)) {
-                       $this->dbaMock = \Mockery::namedMock('Friendica\Database\DBA', 'Friendica\Test\Util\DBAStub');
+                       $this->dbaMock = \Mockery::namedMock(DBA::class, DBAStub::class);
                }
        }
 
index 92ec412cb7ed4bec698c49c768248b2efe9d67a1..224e5d07af27482eedb0915c891dfbb72cfababc 100644 (file)
@@ -26,7 +26,7 @@ trait DBStructureMockTrait
        public function mockUpdate($args = [], $return = true, $times = null)
        {
                if (!isset($this->dbStructure)) {
-                       $this->dbStructure = \Mockery::mock('alias:Friendica\Database\DBStructure');
+                       $this->dbStructure = \Mockery::mock('alias:' . DBStructure::class);
                }
 
                $this->dbStructure
@@ -46,7 +46,7 @@ trait DBStructureMockTrait
        public function mockExistsTable($tableName, $return = true, $times = null)
        {
                if (!isset($this->dbStructure)) {
-                       $this->dbStructure = \Mockery::mock('alias:Friendica\Database\DBStructure');
+                       $this->dbStructure = \Mockery::mock('alias:' . DBStructure::class);
                }
 
                $this->dbStructure
index 1f1ad0199a52caf6b2271133448644697f6dc37c..0230e16a432019613996eb4962083bc3e5d0f12a 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Friendica\Util\DateTimeFormat;
 use Mockery\MockInterface;
 
 trait DateTimeFormatMockTrait
@@ -14,7 +15,7 @@ trait DateTimeFormatMockTrait
        public function mockUtcNow($time, $times = null)
        {
                if (!isset($this->dtfMock)) {
-                       $this->dtfMock = \Mockery::mock('alias:Friendica\Util\DateTimeFormat');
+                       $this->dtfMock = \Mockery::mock('alias:'. DateTimeFormat::class);
                }
 
                $this->dtfMock
@@ -26,7 +27,7 @@ trait DateTimeFormatMockTrait
        public function mockUtc($input, $time, $times = null)
        {
                if (!isset($this->dtfMock)) {
-                       $this->dtfMock = \Mockery::mock('alias:Friendica\Util\DateTimeFormat');
+                       $this->dtfMock = \Mockery::mock('alias:' . DateTimeFormat::class);
                }
 
                $this->dtfMock
index f1c771c6b3f6d36b8256a32f0009a8998bcde10c..e47a35edccd62ea89286384128373c59832bccae 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Friendica\Core\L10n;
 use Mockery\MockInterface;
 
 trait L10nMockTrait
@@ -21,7 +22,7 @@ trait L10nMockTrait
        public function mockL10nT($input = null, $times = null, $return = null)
        {
                if (!isset($this->l10nMock)) {
-                       $this->l10nMock = \Mockery::mock('alias:Friendica\Core\L10n');
+                       $this->l10nMock = \Mockery::mock('alias:' . L10n::class);
                }
 
                $with = isset($input) ? $input : \Mockery::any();
index bea0fe16fc24db01e00e969b2455982fe3b03003..f4e05f39b8a1e7597f510aad06fbaf57cd0745a3 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Friendica\Core\Renderer;
 use Mockery\MockInterface;
 
 trait RendererMockTrait
@@ -21,7 +22,7 @@ trait RendererMockTrait
        public function mockGetMarkupTemplate($templateName, $return = '', $times = null)
        {
                if (!isset($this->rendererMock)) {
-                       $this->rendererMock = \Mockery::mock('alias:Friendica\Core\Renderer');
+                       $this->rendererMock = \Mockery::mock('alias:' . Renderer::class);
                }
 
                $this->rendererMock
@@ -42,7 +43,7 @@ trait RendererMockTrait
        public function mockReplaceMacros($template, $args = [], $return = '', $times = null)
        {
                if (!isset($this->rendererMock)) {
-                       $this->rendererMock = \Mockery::mock('alias:Friendica\Core\Renderer');
+                       $this->rendererMock = \Mockery::mock('alias:' . Renderer::class);
                }
 
                $this->rendererMock
index 579b28e026b4a94ff1623c5e4710a65472d27c00..ef50c19b7271a895acf592486522fb990810facf 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\src\Core\Console;
 
+use Friendica\App\Mode;
 use Friendica\Core\Console\Config;
 
 /**
@@ -16,12 +17,12 @@ class ConfigConsoleTest extends ConsoleTest
                parent::setUp();
 
                \Mockery::getConfiguration()->setConstantsMap([
-                       'Friendica\App\Mode' => [
+                       Mode::class => [
                                'DBCONFIGAVAILABLE' => 0
                        ]
                ]);
 
-               $mode = \Mockery::mock('Friendica\App\Mode');
+               $mode = \Mockery::mock(Mode::class);
                $mode
                        ->shouldReceive('has')
                        ->andReturn(true);
index c1a003bade6d0ba374ca5b61056112afbf404b3e..e56596c6c090b67fc0574d9c0041d74723173da9 100644 (file)
@@ -3,9 +3,12 @@
 // this is in the same namespace as Install for mocking 'function_exists'
 namespace Friendica\Core;
 
+use Friendica\Network\CurlResult;
+use Friendica\Object\Image;
 use Friendica\Test\MockedTest;
 use Friendica\Test\Util\L10nMockTrait;
 use Friendica\Test\Util\VFSTrait;
+use Friendica\Util\Network;
 
 /**
  * @runTestsInSeparateProcesses
@@ -248,7 +251,7 @@ class InstallerTest extends MockedTest
                $this->mockL10nT();
 
                // Mocking the CURL Response
-               $curlResult = \Mockery::mock('Friendica\Network\CurlResult');
+               $curlResult = \Mockery::mock(CurlResult::class);
                $curlResult
                        ->shouldReceive('getReturnCode')
                        ->andReturn('404');
@@ -260,7 +263,7 @@ class InstallerTest extends MockedTest
                        ->andReturn('test Error');
 
                // Mocking the CURL Request
-               $networkMock = \Mockery::mock('alias:Friendica\Util\Network');
+               $networkMock = \Mockery::mock('alias:' . Network::class);
                $networkMock
                        ->shouldReceive('fetchUrlFull')
                        ->with('https://test/install/testrewrite')
@@ -287,19 +290,19 @@ class InstallerTest extends MockedTest
                $this->mockL10nT();
 
                // Mocking the failed CURL Response
-               $curlResultF = \Mockery::mock('Friendica\Network\CurlResult');
+               $curlResultF = \Mockery::mock(CurlResult::class);
                $curlResultF
                        ->shouldReceive('getReturnCode')
                        ->andReturn('404');
 
                // Mocking the working CURL Response
-               $curlResultW = \Mockery::mock('Friendica\Network\CurlResult');
+               $curlResultW = \Mockery::mock(CurlResult::class);
                $curlResultW
                        ->shouldReceive('getReturnCode')
                        ->andReturn('204');
 
                // Mocking the CURL Request
-               $networkMock = \Mockery::mock('alias:Friendica\Util\Network');
+               $networkMock = \Mockery::mock('alias:' . Network::class);
                $networkMock
                        ->shouldReceive('fetchUrlFull')
                        ->with('https://test/install/testrewrite')
@@ -327,7 +330,7 @@ class InstallerTest extends MockedTest
        {
                $this->mockL10nT();
 
-               $imageMock = \Mockery::mock('alias:Friendica\Object\Image');
+               $imageMock = \Mockery::mock('alias:'. Image::class);
                $imageMock
                        ->shouldReceive('supportedTypes')
                        ->andReturn(['image/gif' => 'gif']);
@@ -354,7 +357,7 @@ class InstallerTest extends MockedTest
        {
                $this->mockL10nT();
 
-               $imageMock = \Mockery::mock('alias:Friendica\Object\Image');
+               $imageMock = \Mockery::mock('alias:' . Image::class);
                $imageMock
                        ->shouldReceive('supportedTypes')
                        ->andReturn([]);
index 4a84c40bb5a9bfb36103d402197417fd7b4a6b4d..8ee3c82d8efe3fd5ebabcbdca3e3439af190e5a8 100644 (file)
@@ -4,6 +4,7 @@ namespace src\Util\Logger;
 
 use Friendica\Test\MockedTest;
 use Friendica\Util\Logger\WorkerLogger;
+use Psr\Log\LoggerInterface;
 
 class WorkerLoggerTest extends MockedTest
 {
@@ -18,7 +19,7 @@ class WorkerLoggerTest extends MockedTest
         */
        public function testGetWorkerIdZero()
        {
-               $logger = \Mockery::mock('Psr\Log\LoggerInterface');
+               $logger = \Mockery::mock(LoggerInterface::class);
                $logger
                        ->shouldReceive('alert')
                        ->with('id length must be greater than 0.')
@@ -31,7 +32,7 @@ class WorkerLoggerTest extends MockedTest
         */
        public function testGetWorkerId()
        {
-               $logger = \Mockery::mock('Psr\Log\LoggerInterface');
+               $logger = \Mockery::mock(LoggerInterface::class);
                for ($i = 1; $i < 14; $i++) {
                        $workLogger = new WorkerLogger($logger, 'test', $i);
                        $uid = $workLogger->getWorkerId();
@@ -86,7 +87,7 @@ class WorkerLoggerTest extends MockedTest
         */
        public function testEmergency($func, $msg, $context = [])
        {
-               $logger = \Mockery::mock('Psr\Log\LoggerInterface');
+               $logger = \Mockery::mock(LoggerInterface::class);
                $workLogger = new WorkerLogger($logger, 'test');
                $testContext = $context;
                $testContext['worker_id'] = $workLogger->getWorkerId();
@@ -104,7 +105,7 @@ class WorkerLoggerTest extends MockedTest
         */
        public function testLog()
        {
-               $logger = \Mockery::mock('Psr\Log\LoggerInterface');
+               $logger = \Mockery::mock(LoggerInterface::class);
                $workLogger = new WorkerLogger($logger, 'test');
                $context = $testContext = ['test' => 'it'];
                $testContext['worker_id'] = $workLogger->getWorkerId();
index 449ec5e5ff1a18d75508ee508dd23f6c2fc8d0b4..af2e985092be462358e443a3947942f4c48db388 100644 (file)
@@ -18,7 +18,7 @@ class ProfilerTest extends MockedTest
        {
                parent::setUp();
 
-               $this->logger = \Mockery::mock('Psr\Log\LoggerInterface');
+               $this->logger = \Mockery::mock(LoggerInterface::class);
        }
 
        /**
index 3370d7ccd3a20515e2b1dbed10459756b4fcb103..cd09de014376e36a946c1c790ad867abcab50082 100644 (file)
@@ -793,11 +793,25 @@ function profChangeMember(gid,cid) {
        });
 }
 
-function contactgroupChangeMember(gid,cid) {
+function contactgroupChangeMember(checkbox, gid, cid) {
+       let url;
+       // checkbox.checked is the checkbox state after the click
+       if (checkbox.checked) {
+               url = 'group/' + gid + '/add/' + cid;
+       } else {
+               url = 'group/' + gid + '/remove/' + cid;
+       }
        $('body').css('cursor', 'wait');
-       $.get('contactgroup/' + gid + '/' + cid, function(data) {
-                       $('body').css('cursor', 'auto');
+       $.post(url)
+       .error(function () {
+               // Restores previous state in case of error
+               checkbox.checked = !checkbox.checked;
+       })
+       .always(function() {
+               $('body').css('cursor', 'auto');
        });
+
+       return true;
 }
 
 function checkboxhighlight(box) {
index b0a1cf3f0a26b27b0c25f1507c75372d37eb3156..7ef1cfad042661577cb93a2c83b467e8ad0e5be3 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-02-15 09:33-0500\n"
+"POT-Creation-Date: 2019-02-23 18:53-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,26 +18,26 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 
-#: include/api.php:1179
+#: include/api.php:1117
 #, php-format
 msgid "Daily posting limit of %d post reached. The post was rejected."
 msgid_plural "Daily posting limit of %d posts reached. The post was rejected."
 msgstr[0] ""
 msgstr[1] ""
 
-#: include/api.php:1193
+#: include/api.php:1131
 #, php-format
 msgid "Weekly posting limit of %d post reached. The post was rejected."
 msgid_plural "Weekly posting limit of %d posts reached. The post was rejected."
 msgstr[0] ""
 msgstr[1] ""
 
-#: include/api.php:1207
+#: include/api.php:1145
 #, php-format
 msgid "Monthly posting limit of %d post reached. The post was rejected."
 msgstr ""
 
-#: include/api.php:4578 mod/photos.php:93 mod/photos.php:201 mod/photos.php:695
+#: include/api.php:4520 mod/photos.php:93 mod/photos.php:201 mod/photos.php:695
 #: mod/photos.php:1126 mod/photos.php:1143 mod/photos.php:1636
 #: mod/profile_photo.php:85 mod/profile_photo.php:94 mod/profile_photo.php:103
 #: mod/profile_photo.php:217 mod/profile_photo.php:305
@@ -134,7 +134,7 @@ msgstr ""
 msgid "Might attend"
 msgstr ""
 
-#: include/conversation.php:649 mod/photos.php:1524 src/Object/Post.php:207
+#: include/conversation.php:649 mod/photos.php:1524 src/Object/Post.php:208
 msgid "Select"
 msgstr ""
 
@@ -143,20 +143,20 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: include/conversation.php:684 src/Object/Post.php:380 src/Object/Post.php:381
+#: include/conversation.php:684 src/Object/Post.php:381 src/Object/Post.php:382
 #, php-format
 msgid "View %s's profile @ %s"
 msgstr ""
 
-#: include/conversation.php:696 src/Object/Post.php:368
+#: include/conversation.php:696 src/Object/Post.php:369
 msgid "Categories:"
 msgstr ""
 
-#: include/conversation.php:697 src/Object/Post.php:369
+#: include/conversation.php:697 src/Object/Post.php:370
 msgid "Filed under:"
 msgstr ""
 
-#: include/conversation.php:704 src/Object/Post.php:394
+#: include/conversation.php:704 src/Object/Post.php:395
 #, php-format
 msgid "%s from %s"
 msgstr ""
@@ -167,7 +167,7 @@ msgstr ""
 
 #: include/conversation.php:721 include/conversation.php:1171
 #: mod/editpost.php:88 mod/message.php:260 mod/message.php:442
-#: mod/photos.php:1440 mod/wallmessage.php:141 src/Object/Post.php:421
+#: mod/photos.php:1440 mod/wallmessage.php:141 src/Object/Post.php:422
 msgid "Please wait"
 msgstr ""
 
@@ -188,7 +188,7 @@ msgid "View Status"
 msgstr ""
 
 #: include/conversation.php:895 include/conversation.php:911
-#: mod/allfriends.php:72 mod/directory.php:167 mod/dirfind.php:226
+#: mod/allfriends.php:72 mod/directory.php:198 mod/dirfind.php:226
 #: mod/match.php:87 mod/suggest.php:87 src/Model/Contact.php:989
 #: src/Model/Contact.php:1042 src/Model/Contact.php:1050
 msgid "View Profile"
@@ -311,7 +311,7 @@ msgstr ""
 msgid "Visible to <strong>everybody</strong>"
 msgstr ""
 
-#: include/conversation.php:1111 src/Object/Post.php:883
+#: include/conversation.php:1111 src/Object/Post.php:886
 msgid "Please enter a image/video/audio/webpage URL:"
 msgstr ""
 
@@ -356,35 +356,35 @@ msgstr ""
 msgid "attach file"
 msgstr ""
 
-#: include/conversation.php:1155 src/Object/Post.php:875
+#: include/conversation.php:1155 src/Object/Post.php:878
 msgid "Bold"
 msgstr ""
 
-#: include/conversation.php:1156 src/Object/Post.php:876
+#: include/conversation.php:1156 src/Object/Post.php:879
 msgid "Italic"
 msgstr ""
 
-#: include/conversation.php:1157 src/Object/Post.php:877
+#: include/conversation.php:1157 src/Object/Post.php:880
 msgid "Underline"
 msgstr ""
 
-#: include/conversation.php:1158 src/Object/Post.php:878
+#: include/conversation.php:1158 src/Object/Post.php:881
 msgid "Quote"
 msgstr ""
 
-#: include/conversation.php:1159 src/Object/Post.php:879
+#: include/conversation.php:1159 src/Object/Post.php:882
 msgid "Code"
 msgstr ""
 
-#: include/conversation.php:1160 src/Object/Post.php:880
+#: include/conversation.php:1160 src/Object/Post.php:883
 msgid "Image"
 msgstr ""
 
-#: include/conversation.php:1161 src/Object/Post.php:881
+#: include/conversation.php:1161 src/Object/Post.php:884
 msgid "Link"
 msgstr ""
 
-#: include/conversation.php:1162 src/Object/Post.php:882
+#: include/conversation.php:1162 src/Object/Post.php:885
 msgid "Link or Media"
 msgstr ""
 
@@ -426,7 +426,7 @@ msgstr ""
 
 #: include/conversation.php:1186 mod/editpost.php:110 mod/events.php:551
 #: mod/photos.php:1458 mod/photos.php:1497 mod/photos.php:1557
-#: src/Object/Post.php:884
+#: src/Object/Post.php:887
 msgid "Preview"
 msgstr ""
 
@@ -837,7 +837,7 @@ msgstr ""
 #: mod/unfollow.php:77 mod/unfollow.php:109 mod/viewcontacts.php:56
 #: mod/wallmessage.php:19 mod/wallmessage.php:43 mod/wallmessage.php:82
 #: mod/wallmessage.php:106 mod/wall_attach.php:76 mod/wall_attach.php:79
-#: mod/wall_upload.php:107 mod/wall_upload.php:110 src/App.php:1480
+#: mod/wall_upload.php:107 mod/wall_upload.php:110 src/App.php:1390
 #: src/Module/Attach.php:42 src/Module/Contact.php:360
 #: src/Module/Register.php:193
 msgid "Permission denied."
@@ -2875,7 +2875,7 @@ msgstr ""
 msgid "No"
 msgstr ""
 
-#: mod/apps.php:15 src/App.php:1349
+#: mod/apps.php:15 src/App.php:1259
 msgid "You must be logged in to use addons. "
 msgstr ""
 
@@ -3009,7 +3009,7 @@ msgid "Access denied."
 msgstr ""
 
 #: mod/cal.php:46 mod/dfrn_poll.php:486 mod/help.php:68 mod/viewcontacts.php:34
-#: src/App.php:1400
+#: src/App.php:1310
 msgid "Page not found."
 msgstr ""
 
@@ -3185,7 +3185,7 @@ msgstr ""
 #: mod/photos.php:1137 mod/photos.php:1412 mod/photos.php:1457
 #: mod/photos.php:1496 mod/photos.php:1556 mod/poke.php:188
 #: mod/profiles.php:562 src/Module/Contact.php:594 src/Module/Install.php:187
-#: src/Module/Install.php:222 src/Object/Post.php:874
+#: src/Module/Install.php:222 src/Object/Post.php:877
 #: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:119
 #: view/theme/quattro/config.php:74 view/theme/vier/config.php:120
 msgid "Submit"
@@ -3561,54 +3561,54 @@ msgstr ""
 msgid "Submit Request"
 msgstr ""
 
-#: mod/directory.php:154 mod/events.php:541 mod/notifications.php:253
-#: src/Model/Event.php:68 src/Model/Event.php:95 src/Model/Event.php:437
-#: src/Model/Event.php:933 src/Model/Profile.php:443 src/Module/Contact.php:643
-msgid "Location:"
+#: mod/directory.php:121
+msgid "No entries (some entries may be hidden)."
 msgstr ""
 
-#: mod/directory.php:159 mod/notifications.php:259 src/Model/Profile.php:446
-#: src/Model/Profile.php:758
-msgid "Gender:"
+#: mod/directory.php:128 src/Content/Widget.php:70
+#: view/theme/vier/theme.php:208
+msgid "Global Directory"
 msgstr ""
 
-#: mod/directory.php:160 src/Model/Profile.php:447 src/Model/Profile.php:782
-msgid "Status:"
+#: mod/directory.php:130
+msgid "Find on this site"
 msgstr ""
 
-#: mod/directory.php:161 src/Model/Profile.php:448 src/Model/Profile.php:799
-msgid "Homepage:"
+#: mod/directory.php:132
+msgid "Results for:"
 msgstr ""
 
-#: mod/directory.php:162 mod/notifications.php:255 src/Model/Profile.php:449
-#: src/Model/Profile.php:819 src/Module/Contact.php:647
-msgid "About:"
+#: mod/directory.php:134
+msgid "Site Directory"
 msgstr ""
 
-#: mod/directory.php:210 src/Content/Widget.php:70
-#: view/theme/vier/theme.php:208
-msgid "Global Directory"
+#: mod/directory.php:136 src/Content/Widget.php:65 src/Module/Contact.php:817
+#: view/theme/vier/theme.php:203
+msgid "Find"
 msgstr ""
 
-#: mod/directory.php:212
-msgid "Find on this site"
+#: mod/directory.php:185 mod/events.php:541 mod/notifications.php:253
+#: src/Model/Event.php:68 src/Model/Event.php:95 src/Model/Event.php:437
+#: src/Model/Event.php:933 src/Model/Profile.php:443 src/Module/Contact.php:643
+msgid "Location:"
 msgstr ""
 
-#: mod/directory.php:214
-msgid "Results for:"
+#: mod/directory.php:190 mod/notifications.php:259 src/Model/Profile.php:446
+#: src/Model/Profile.php:758
+msgid "Gender:"
 msgstr ""
 
-#: mod/directory.php:216
-msgid "Site Directory"
+#: mod/directory.php:191 src/Model/Profile.php:447 src/Model/Profile.php:782
+msgid "Status:"
 msgstr ""
 
-#: mod/directory.php:217 src/Content/Widget.php:65 src/Module/Contact.php:817
-#: view/theme/vier/theme.php:203
-msgid "Find"
+#: mod/directory.php:192 src/Model/Profile.php:448 src/Model/Profile.php:799
+msgid "Homepage:"
 msgstr ""
 
-#: mod/directory.php:221
-msgid "No entries (some entries may be hidden)."
+#: mod/directory.php:193 mod/notifications.php:255 src/Model/Profile.php:449
+#: src/Model/Profile.php:819 src/Module/Contact.php:647
+msgid "About:"
 msgstr ""
 
 #: mod/dirfind.php:55
@@ -3747,8 +3747,8 @@ msgstr ""
 
 #: mod/fbrowser.php:45 mod/fbrowser.php:69 mod/photos.php:201
 #: mod/photos.php:1031 mod/photos.php:1126 mod/photos.php:1143
-#: mod/photos.php:1610 mod/photos.php:1625 src/Model/Photo.php:547
-#: src/Model/Photo.php:556
+#: mod/photos.php:1610 mod/photos.php:1625 src/Model/Photo.php:552
+#: src/Model/Photo.php:561
 msgid "Contact Photos"
 msgstr ""
 
@@ -3874,7 +3874,7 @@ msgstr ""
 msgid "Group name changed."
 msgstr ""
 
-#: mod/group.php:85 mod/profperm.php:30 src/App.php:1479
+#: mod/group.php:85 mod/profperm.php:30 src/App.php:1389
 msgid "Permission denied"
 msgstr ""
 
@@ -3951,7 +3951,7 @@ msgstr ""
 msgid "Help"
 msgstr ""
 
-#: mod/help.php:65 src/App.php:1397
+#: mod/help.php:65 src/App.php:1307
 msgid "Not Found"
 msgstr ""
 
@@ -4873,7 +4873,7 @@ msgstr ""
 msgid "failed"
 msgstr ""
 
-#: mod/ostatus_subscribe.php:89 src/Object/Post.php:283
+#: mod/ostatus_subscribe.php:89 src/Object/Post.php:284
 msgid "ignored"
 msgstr ""
 
@@ -5030,7 +5030,7 @@ msgstr ""
 msgid "Use as profile photo"
 msgstr ""
 
-#: mod/photos.php:1297 src/Object/Post.php:156
+#: mod/photos.php:1297 src/Object/Post.php:157
 msgid "Private Message"
 msgstr ""
 
@@ -5074,21 +5074,21 @@ msgstr ""
 msgid "Rotate CCW (left)"
 msgstr ""
 
-#: mod/photos.php:1438 src/Object/Post.php:311
+#: mod/photos.php:1438 src/Object/Post.php:312
 msgid "I like this (toggle)"
 msgstr ""
 
-#: mod/photos.php:1439 src/Object/Post.php:312
+#: mod/photos.php:1439 src/Object/Post.php:313
 msgid "I don't like this (toggle)"
 msgstr ""
 
 #: mod/photos.php:1454 mod/photos.php:1493 mod/photos.php:1553
-#: src/Module/Contact.php:1018 src/Object/Post.php:871
+#: src/Module/Contact.php:1018 src/Object/Post.php:874
 msgid "This is you"
 msgstr ""
 
 #: mod/photos.php:1456 mod/photos.php:1495 mod/photos.php:1555
-#: src/Object/Post.php:417 src/Object/Post.php:873
+#: src/Object/Post.php:418 src/Object/Post.php:876
 msgid "Comment"
 msgstr ""
 
@@ -5736,7 +5736,7 @@ msgstr ""
 msgid "Connected Apps"
 msgstr ""
 
-#: mod/settings.php:725 src/Object/Post.php:166 src/Object/Post.php:168
+#: mod/settings.php:725 src/Object/Post.php:167 src/Object/Post.php:169
 msgid "Edit"
 msgstr ""
 
@@ -6644,15 +6644,15 @@ msgstr ""
 msgid "Wall Photos"
 msgstr ""
 
-#: src/App.php:665
+#: src/App.php:610
 msgid "Delete this item?"
 msgstr ""
 
-#: src/App.php:707
+#: src/App.php:652
 msgid "toggle mobile"
 msgstr ""
 
-#: src/App.php:1075
+#: src/App.php:985
 msgid "No system theme config value set."
 msgstr ""
 
@@ -6742,6 +6742,11 @@ msgstr ""
 msgid "pnut"
 msgstr ""
 
+#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
+#: src/Content/ContactSelector.php:231
+msgid "No answer"
+msgstr ""
+
 #: src/Content/ContactSelector.php:154
 msgid "Male"
 msgstr ""
@@ -7562,29 +7567,29 @@ msgstr ""
 msgid "All pending post updates are done."
 msgstr ""
 
-#: src/Core/Installer.php:163
+#: src/Core/Installer.php:164
 msgid ""
 "The database configuration file \"config/local.config.php\" could not be "
 "written. Please use the enclosed text to create a configuration file in your "
 "web server root."
 msgstr ""
 
-#: src/Core/Installer.php:182
+#: src/Core/Installer.php:183
 msgid ""
 "You may need to import the file \"database.sql\" manually using phpmyadmin "
 "or mysql."
 msgstr ""
 
-#: src/Core/Installer.php:183 src/Module/Install.php:132
+#: src/Core/Installer.php:184 src/Module/Install.php:132
 #: src/Module/Install.php:263
 msgid "Please see the file \"INSTALL.txt\"."
 msgstr ""
 
-#: src/Core/Installer.php:244
+#: src/Core/Installer.php:245
 msgid "Could not find a command line version of PHP in the web server PATH."
 msgstr ""
 
-#: src/Core/Installer.php:245
+#: src/Core/Installer.php:246
 msgid ""
 "If you don't have a command line version of PHP installed on your server, "
 "you will not be able to run the background processing. See <a href='https://"
@@ -7592,237 +7597,245 @@ msgid ""
 "worker'>'Setup the worker'</a>"
 msgstr ""
 
-#: src/Core/Installer.php:249
+#: src/Core/Installer.php:250
 msgid "PHP executable path"
 msgstr ""
 
-#: src/Core/Installer.php:249
+#: src/Core/Installer.php:250
 msgid ""
 "Enter full path to php executable. You can leave this blank to continue the "
 "installation."
 msgstr ""
 
-#: src/Core/Installer.php:254
+#: src/Core/Installer.php:255
 msgid "Command line PHP"
 msgstr ""
 
-#: src/Core/Installer.php:263
+#: src/Core/Installer.php:264
 msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
 msgstr ""
 
-#: src/Core/Installer.php:264
+#: src/Core/Installer.php:265
 msgid "Found PHP version: "
 msgstr ""
 
-#: src/Core/Installer.php:266
+#: src/Core/Installer.php:267
 msgid "PHP cli binary"
 msgstr ""
 
-#: src/Core/Installer.php:279
+#: src/Core/Installer.php:280
 msgid ""
 "The command line version of PHP on your system does not have "
 "\"register_argc_argv\" enabled."
 msgstr ""
 
-#: src/Core/Installer.php:280
+#: src/Core/Installer.php:281
 msgid "This is required for message delivery to work."
 msgstr ""
 
-#: src/Core/Installer.php:285
+#: src/Core/Installer.php:286
 msgid "PHP register_argc_argv"
 msgstr ""
 
-#: src/Core/Installer.php:317
+#: src/Core/Installer.php:318
 msgid ""
 "Error: the \"openssl_pkey_new\" function on this system is not able to "
 "generate encryption keys"
 msgstr ""
 
-#: src/Core/Installer.php:318
+#: src/Core/Installer.php:319
 msgid ""
 "If running under Windows, please see \"http://www.php.net/manual/en/openssl."
 "installation.php\"."
 msgstr ""
 
-#: src/Core/Installer.php:321
+#: src/Core/Installer.php:322
 msgid "Generate encryption keys"
 msgstr ""
 
-#: src/Core/Installer.php:372
+#: src/Core/Installer.php:374
 msgid ""
 "Error: Apache webserver mod-rewrite module is required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:377
+#: src/Core/Installer.php:379
 msgid "Apache mod_rewrite module"
 msgstr ""
 
-#: src/Core/Installer.php:383
+#: src/Core/Installer.php:385
 msgid "Error: PDO or MySQLi PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:388
+#: src/Core/Installer.php:390
 msgid "Error: The MySQL driver for PDO is not installed."
 msgstr ""
 
-#: src/Core/Installer.php:392
+#: src/Core/Installer.php:394
 msgid "PDO or MySQLi PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:400
+#: src/Core/Installer.php:402
 msgid "Error, XML PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:404
+#: src/Core/Installer.php:406
 msgid "XML PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:407
+#: src/Core/Installer.php:409
 msgid "libCurl PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:408
+#: src/Core/Installer.php:410
 msgid "Error: libCURL PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:414
+#: src/Core/Installer.php:416
 msgid "GD graphics PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:415
+#: src/Core/Installer.php:417
 msgid ""
 "Error: GD graphics PHP module with JPEG support required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:421
+#: src/Core/Installer.php:423
 msgid "OpenSSL PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:422
+#: src/Core/Installer.php:424
 msgid "Error: openssl PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:428
+#: src/Core/Installer.php:430
 msgid "mb_string PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:429
+#: src/Core/Installer.php:431
 msgid "Error: mb_string PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:435
+#: src/Core/Installer.php:437
 msgid "iconv PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:436
+#: src/Core/Installer.php:438
 msgid "Error: iconv PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:442
+#: src/Core/Installer.php:444
 msgid "POSIX PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:443
+#: src/Core/Installer.php:445
 msgid "Error: POSIX PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:449
+#: src/Core/Installer.php:451
 msgid "JSON PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:450
+#: src/Core/Installer.php:452
 msgid "Error: JSON PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:473
+#: src/Core/Installer.php:458
+msgid "File Information PHP module"
+msgstr ""
+
+#: src/Core/Installer.php:459
+msgid "Error: File Information PHP module required but not installed."
+msgstr ""
+
+#: src/Core/Installer.php:482
 msgid ""
 "The web installer needs to be able to create a file called \"local.config.php"
 "\" in the \"config\" folder of your web server and it is unable to do so."
 msgstr ""
 
-#: src/Core/Installer.php:474
+#: src/Core/Installer.php:483
 msgid ""
 "This is most often a permission setting, as the web server may not be able "
 "to write files in your folder - even if you can."
 msgstr ""
 
-#: src/Core/Installer.php:475
+#: src/Core/Installer.php:484
 msgid ""
 "At the end of this procedure, we will give you a text to save in a file "
 "named local.config.php in your Friendica \"config\" folder."
 msgstr ""
 
-#: src/Core/Installer.php:476
+#: src/Core/Installer.php:485
 msgid ""
 "You can alternatively skip this procedure and perform a manual installation. "
 "Please see the file \"INSTALL.txt\" for instructions."
 msgstr ""
 
-#: src/Core/Installer.php:479
+#: src/Core/Installer.php:488
 msgid "config/local.config.php is writable"
 msgstr ""
 
-#: src/Core/Installer.php:499
+#: src/Core/Installer.php:508
 msgid ""
 "Friendica uses the Smarty3 template engine to render its web views. Smarty3 "
 "compiles templates to PHP to speed up rendering."
 msgstr ""
 
-#: src/Core/Installer.php:500
+#: src/Core/Installer.php:509
 msgid ""
 "In order to store these compiled templates, the web server needs to have "
 "write access to the directory view/smarty3/ under the Friendica top level "
 "folder."
 msgstr ""
 
-#: src/Core/Installer.php:501
+#: src/Core/Installer.php:510
 msgid ""
 "Please ensure that the user that your web server runs as (e.g. www-data) has "
 "write access to this folder."
 msgstr ""
 
-#: src/Core/Installer.php:502
+#: src/Core/Installer.php:511
 msgid ""
 "Note: as a security measure, you should give the web server write access to "
 "view/smarty3/ only--not the template files (.tpl) that it contains."
 msgstr ""
 
-#: src/Core/Installer.php:505
+#: src/Core/Installer.php:514
 msgid "view/smarty3 is writable"
 msgstr ""
 
-#: src/Core/Installer.php:534
+#: src/Core/Installer.php:543
 msgid ""
 "Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist "
 "to .htaccess."
 msgstr ""
 
-#: src/Core/Installer.php:536
+#: src/Core/Installer.php:545
 msgid "Error message from Curl when fetching"
 msgstr ""
 
-#: src/Core/Installer.php:541
+#: src/Core/Installer.php:550
 msgid "Url rewrite is working"
 msgstr ""
 
-#: src/Core/Installer.php:570
+#: src/Core/Installer.php:579
 msgid "ImageMagick PHP extension is not installed"
 msgstr ""
 
-#: src/Core/Installer.php:572
+#: src/Core/Installer.php:581
 msgid "ImageMagick PHP extension is installed"
 msgstr ""
 
-#: src/Core/Installer.php:574 tests/src/Core/InstallerTest.php:329
-#: tests/src/Core/InstallerTest.php:355
+#: src/Core/Installer.php:583 tests/src/Core/InstallerTest.php:343
+#: tests/src/Core/InstallerTest.php:369
 msgid "ImageMagick supports GIF"
 msgstr ""
 
-#: src/Core/Installer.php:597
+#: src/Core/Installer.php:608
 msgid "Could not connect to database."
 msgstr ""
 
-#: src/Core/Installer.php:604
+#: src/Core/Installer.php:615
 msgid "Database already in use."
 msgstr ""
 
@@ -8401,7 +8414,7 @@ msgstr ""
 msgid "activity"
 msgstr ""
 
-#: src/Model/Item.php:3289 src/Object/Post.php:470
+#: src/Model/Item.php:3289 src/Object/Post.php:471
 msgid "comment"
 msgid_plural "comments"
 msgstr[0] ""
@@ -9466,139 +9479,139 @@ msgstr ""
 msgid "Privacy Statement"
 msgstr ""
 
-#: src/Object/Post.php:136
+#: src/Object/Post.php:137
 msgid "This entry was edited"
 msgstr ""
 
-#: src/Object/Post.php:198
+#: src/Object/Post.php:199
 msgid "Delete locally"
 msgstr ""
 
-#: src/Object/Post.php:201
+#: src/Object/Post.php:202
 msgid "Delete globally"
 msgstr ""
 
-#: src/Object/Post.php:201
+#: src/Object/Post.php:202
 msgid "Remove locally"
 msgstr ""
 
-#: src/Object/Post.php:215
+#: src/Object/Post.php:216
 msgid "save to folder"
 msgstr ""
 
-#: src/Object/Post.php:250
+#: src/Object/Post.php:251
 msgid "I will attend"
 msgstr ""
 
-#: src/Object/Post.php:250
+#: src/Object/Post.php:251
 msgid "I will not attend"
 msgstr ""
 
-#: src/Object/Post.php:250
+#: src/Object/Post.php:251
 msgid "I might attend"
 msgstr ""
 
-#: src/Object/Post.php:278
+#: src/Object/Post.php:279
 msgid "ignore thread"
 msgstr ""
 
-#: src/Object/Post.php:279
+#: src/Object/Post.php:280
 msgid "unignore thread"
 msgstr ""
 
-#: src/Object/Post.php:280
+#: src/Object/Post.php:281
 msgid "toggle ignore status"
 msgstr ""
 
-#: src/Object/Post.php:291
+#: src/Object/Post.php:292
 msgid "add star"
 msgstr ""
 
-#: src/Object/Post.php:292
+#: src/Object/Post.php:293
 msgid "remove star"
 msgstr ""
 
-#: src/Object/Post.php:293
+#: src/Object/Post.php:294
 msgid "toggle star status"
 msgstr ""
 
-#: src/Object/Post.php:296
+#: src/Object/Post.php:297
 msgid "starred"
 msgstr ""
 
-#: src/Object/Post.php:300
+#: src/Object/Post.php:301
 msgid "add tag"
 msgstr ""
 
-#: src/Object/Post.php:311
+#: src/Object/Post.php:312
 msgid "like"
 msgstr ""
 
-#: src/Object/Post.php:312
+#: src/Object/Post.php:313
 msgid "dislike"
 msgstr ""
 
-#: src/Object/Post.php:315
+#: src/Object/Post.php:316
 msgid "Share this"
 msgstr ""
 
-#: src/Object/Post.php:315
+#: src/Object/Post.php:316
 msgid "share"
 msgstr ""
 
-#: src/Object/Post.php:382
+#: src/Object/Post.php:383
 msgid "to"
 msgstr ""
 
-#: src/Object/Post.php:383
+#: src/Object/Post.php:384
 msgid "via"
 msgstr ""
 
-#: src/Object/Post.php:384
+#: src/Object/Post.php:385
 msgid "Wall-to-Wall"
 msgstr ""
 
-#: src/Object/Post.php:385
+#: src/Object/Post.php:386
 msgid "via Wall-To-Wall:"
 msgstr ""
 
-#: src/Object/Post.php:418
+#: src/Object/Post.php:419
 #, php-format
 msgid "Reply to %s"
 msgstr ""
 
-#: src/Object/Post.php:433
+#: src/Object/Post.php:434
 msgid "Notifier task is pending"
 msgstr ""
 
-#: src/Object/Post.php:434
+#: src/Object/Post.php:435
 msgid "Delivery to remote servers is pending"
 msgstr ""
 
-#: src/Object/Post.php:435
+#: src/Object/Post.php:436
 msgid "Delivery to remote servers is underway"
 msgstr ""
 
-#: src/Object/Post.php:436
+#: src/Object/Post.php:437
 msgid "Delivery to remote servers is mostly done"
 msgstr ""
 
-#: src/Object/Post.php:437
+#: src/Object/Post.php:438
 msgid "Delivery to remote servers is done"
 msgstr ""
 
-#: src/Object/Post.php:457
+#: src/Object/Post.php:458
 #, php-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Object/Post.php:458
+#: src/Object/Post.php:459
 msgid "Show more"
 msgstr ""
 
-#: src/Object/Post.php:459
+#: src/Object/Post.php:460
 msgid "Show fewer"
 msgstr ""
 
index 5796bb735cdfbba5349e18c1199bcee87a2a4d84..31b9287ba826d2ff2c93bdcf93571e3e08c677ba 100644 (file)
@@ -9,7 +9,7 @@
                                        {{if $group.cid}}
                                                <input type="checkbox"
                                                        class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
-                                                       onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
+                                                       onclick="return contactgroupChangeMember(this, '{{$group.id}}','{{$group.cid}}');"
                                                        {{if $group.ismember}}checked="checked"{{/if}}
                                                />
                                        {{/if}}
index 947ae974e8aec1b4d1eb442d60bd2a746a346ed7..75983b36eea365b6e269a587b44c14047574c6eb 100644 (file)
@@ -28,7 +28,7 @@
                                                        <input type="checkbox"
                                                                id="sidebar-group-checkbox-{{$group.id}}"
                                                                class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
-                                                               onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
+                                                               onclick="return contactgroupChangeMember(this, '{{$group.id}}','{{$group.cid}}');"
                                                                {{if $group.ismember}}checked="checked"{{/if}}
                                                                aria-checked="{{if $group.ismember}}true{{else}}false{{/if}}"
                                                        />
index 620d2de75aae7db2f29982176b8dc7088ce57e50..18a6105a6e17af76c34b4964ec13a3edeeaffd46 100644 (file)
@@ -17,7 +17,7 @@
                                {{if $group.cid}}
                                        <input type="checkbox"
                                                class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
-                                               onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
+                                               onclick="return contactgroupChangeMember(this, '{{$group.id}}','{{$group.cid}}');"
                                                {{if $group.ismember}}checked="checked"{{/if}}
                                        />
                                {{/if}}