+++ /dev/null
-<?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();
-}
+++ /dev/null
-<?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);
-
-}
$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) {
$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
],
{
$o = '';
$select = [
- 'EMPTY' => '',
+ '' => L10n::t('No answer'),
'Male' => L10n::t('Male'),
'Female' => L10n::t('Female'),
'Currently Male' => L10n::t('Currently Male'),
{
$o = '';
$select = [
- 'EMPTY' => '',
+ '' => L10n::t('No answer'),
'Males' => L10n::t('Males'),
'Females' => L10n::t('Females'),
'Gay' => L10n::t('Gay'),
{
$o = '';
$select = [
- 'EMPTY' => '',
+ '' => L10n::t('No answer'),
'Single' => L10n::t('Single'),
'Lonely' => L10n::t('Lonely'),
'Available' => L10n::t('Available'),
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;
}
$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();
return 0;
}
-
}
}
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";
/**
* @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);
}
/**
/**
* (@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);
}
/**
* (@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);
/**
* 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
/**
* (@inheritdoc)
*/
- public function releaseLock($key)
+ public function releaseLock($key, $override = false)
{
if (empty(self::$semaphore[$key])) {
return false;
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.
*
}
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');
}
}
}
* 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');
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);
Lock::release('dbupdate');
}
}
- } elseif ($force) {
- DBStructure::update($basePath, $verbose, true);
}
return '';
*/
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
*
$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');
$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));
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");
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);
}
}
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);
+ }
}
/**
return $redirect;
}
+
+ public static function removeFromGroups($contact_id)
+ {
+ return DBA::delete('group_member', ['contact-id' => $contact_id]);
+ }
}
*/
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
*
$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'));
}
--- /dev/null
+<?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
{
$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') {
namespace Friendica\Test\Util;
+use Friendica\Database\DBA;
use Mockery\MockInterface;
class DBAStub
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);
}
}
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
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
namespace Friendica\Test\Util;
+use Friendica\Util\DateTimeFormat;
use Mockery\MockInterface;
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
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
namespace Friendica\Test\Util;
+use Friendica\Core\L10n;
use Mockery\MockInterface;
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();
namespace Friendica\Test\Util;
+use Friendica\Core\Renderer;
use Mockery\MockInterface;
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
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
namespace Friendica\Test\src\Core\Console;
+use Friendica\App\Mode;
use Friendica\Core\Console\Config;
/**
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);
// 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
$this->mockL10nT();
// Mocking the CURL Response
- $curlResult = \Mockery::mock('Friendica\Network\CurlResult');
+ $curlResult = \Mockery::mock(CurlResult::class);
$curlResult
->shouldReceive('getReturnCode')
->andReturn('404');
->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')
$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')
{
$this->mockL10nT();
- $imageMock = \Mockery::mock('alias:Friendica\Object\Image');
+ $imageMock = \Mockery::mock('alias:'. Image::class);
$imageMock
->shouldReceive('supportedTypes')
->andReturn(['image/gif' => 'gif']);
{
$this->mockL10nT();
- $imageMock = \Mockery::mock('alias:Friendica\Object\Image');
+ $imageMock = \Mockery::mock('alias:' . Image::class);
$imageMock
->shouldReceive('supportedTypes')
->andReturn([]);
use Friendica\Test\MockedTest;
use Friendica\Util\Logger\WorkerLogger;
+use Psr\Log\LoggerInterface;
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.')
*/
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();
*/
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();
*/
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();
{
parent::setUp();
- $this->logger = \Mockery::mock('Psr\Log\LoggerInterface');
+ $this->logger = \Mockery::mock(LoggerInterface::class);
}
/**
});
}
-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) {
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"
"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
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 ""
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 ""
#: 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 ""
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"
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 ""
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 ""
#: 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 ""
#: 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."
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 ""
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 ""
#: 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"
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
#: 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 ""
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 ""
msgid "Help"
msgstr ""
-#: mod/help.php:65 src/App.php:1397
+#: mod/help.php:65 src/App.php:1307
msgid "Not Found"
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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://"
"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 ""
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] ""
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 ""
{{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}}
<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}}"
/>
{{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}}