X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FContact.php;h=6eb46d9d5ac4c1e05414329e06be1d1bf28cf977;hb=6bef9fb230da7841ebc03ba5f5831eb5e12984a0;hp=66e8c97fdf94e89f19259eb5a201cfd9943bebc5;hpb=4f9f86e310a433d56622527be002ba2a474c5240;p=friendica.git diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 66e8c97fdf..84420afaad 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -1,4 +1,23 @@ . + * + */ namespace Friendica\Module; @@ -10,128 +29,26 @@ use Friendica\Content\Pager; use Friendica\Content\Text\BBCode; use Friendica\Content\Widget; use Friendica\Core\ACL; -use Friendica\Core\Addon; -use Friendica\Core\L10n; +use Friendica\Core\Hook; use Friendica\Core\Protocol; use Friendica\Core\Renderer; -use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; +use Friendica\DI; use Friendica\Model; -use Friendica\Module\Login; -use Friendica\Network\Probe; +use Friendica\Module\Security\Login; +use Friendica\Network\HTTPException\BadRequestException; +use Friendica\Network\HTTPException\NotFoundException; use Friendica\Util\DateTimeFormat; use Friendica\Util\Proxy as ProxyUtils; use Friendica\Util\Strings; /** * Manages and show Contacts and their content - * - * @brief manages contacts */ class Contact extends BaseModule { - public static function init() - { - $a = self::getApp(); - - if (!local_user()) { - return; - } - - $nets = defaults($_GET, 'nets', ''); - if ($nets == 'all') { - $nets = ''; - } - - if (!x($a->page, 'aside')) { - $a->page['aside'] = ''; - } - - $contact_id = null; - $contact = null; - if ($a->argc == 2 && intval($a->argv[1]) - || $a->argc == 3 && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']) - ) { - $contact_id = intval($a->argv[1]); - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); - - if (!DBA::isResult($contact)) { - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0]); - } - - // Don't display contacts that are about to be deleted - if ($contact['network'] == Protocol::PHANTOM) { - $contact = false; - } - } - - if (DBA::isResult($contact)) { - if ($contact['self']) { - if (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])) { - $a->internalRedirect('profile/' . $contact['nick']); - } else { - $a->internalRedirect('profile/' . $contact['nick'] . '?tab=profile'); - } - } - - $a->data['contact'] = $contact; - - if (($contact['network'] != '') && ($contact['network'] != Protocol::DFRN)) { - $networkname = Strings::formatNetworkName($contact['network'], $contact['url']); - } else { - $networkname = ''; - } - - /// @TODO Add nice spaces - $vcard_widget = Renderer::replaceMacros(Renderer::getMarkupTemplate('vcard-widget.tpl'), [ - '$name' => $contact['name'], - '$photo' => $contact['photo'], - '$url' => Model\Contact::MagicLink($contact['url']), - '$addr' => defaults($contact, 'addr', ''), - '$network_name' => $networkname, - '$network' => L10n::t('Network:'), - '$account_type' => Model\Contact::getAccountType($contact) - ]); - - $findpeople_widget = ''; - $follow_widget = ''; - $networks_widget = ''; - } else { - $vcard_widget = ''; - $networks_widget = Widget::networks('contact', $nets); - if (isset($_GET['add'])) { - $follow_widget = Widget::follow($_GET['add']); - } else { - $follow_widget = Widget::follow(); - } - - $findpeople_widget = Widget::findPeople(); - } - - if ($contact['uid'] != 0) { - $groups_widget = Model\Group::sidebarWidget('contact', 'group', 'full', 'everyone', $contact_id); - } else { - $groups_widget = null; - } - - $a->page['aside'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('contacts-widget-sidebar.tpl'), [ - '$vcard_widget' => $vcard_widget, - '$findpeople_widget' => $findpeople_widget, - '$follow_widget' => $follow_widget, - '$groups_widget' => $groups_widget, - '$networks_widget' => $networks_widget - ]); - - $base = $a->getBaseURL(); - $tpl = Renderer::getMarkupTemplate('contacts-head.tpl'); - $a->page['htmlhead'] .= Renderer::replaceMacros($tpl, [ - '$baseurl' => System::baseUrl(true), - '$base' => $base - ]); - } - - private static function batchActions(App $a) + private static function batchActions() { if (empty($_POST['contact_batch']) || !is_array($_POST['contact_batch'])) { return; @@ -139,7 +56,7 @@ class Contact extends BaseModule $contacts_id = $_POST['contact_batch']; - $stmt = DBA::select('contact', ['id', 'archive'], ['id' => $contacts_id, 'uid' => local_user(), 'self' => false]); + $stmt = DBA::select('contact', ['id', 'archive'], ['id' => $contacts_id, 'uid' => local_user(), 'self' => false, 'deleted' => false]); $orig_records = DBA::toArray($stmt); $count_actions = 0; @@ -168,63 +85,56 @@ class Contact extends BaseModule } } if ($count_actions > 0) { - info(L10n::tt('%d contact edited.', '%d contacts edited.', $count_actions)); + info(DI::l10n()->tt('%d contact edited.', '%d contacts edited.', $count_actions)); } - $a->internalRedirect('contact'); + DI::baseUrl()->redirect('contact'); } - public static function post() + public static function post(array $parameters = []) { - $a = self::getApp(); + $a = DI::app(); if (!local_user()) { return; } + // @TODO: Replace with parameter from router if ($a->argv[1] === 'batch') { - self::batchActions($a); + self::batchActions(); return; } + // @TODO: Replace with parameter from router $contact_id = intval($a->argv[1]); if (!$contact_id) { return; } - if (!DBA::exists('contact', ['id' => $contact_id, 'uid' => local_user()])) { - notice(L10n::t('Could not access contact record.') . EOL); - $a->internalRedirect('contact'); + if (!DBA::exists('contact', ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false])) { + notice(DI::l10n()->t('Could not access contact record.') . EOL); + DI::baseUrl()->redirect('contact'); return; // NOTREACHED } - Addon::callHooks('contact_edit_post', $_POST); - - $profile_id = intval(defaults($_POST, 'profile-assign', 0)); - if ($profile_id) { - if (!DBA::exists('profile', ['id' => $profile_id, 'uid' => local_user()])) { - notice(L10n::t('Could not locate selected profile.') . EOL); - return; - } - } + Hook::callAll('contact_edit_post', $_POST); $hidden = !empty($_POST['hidden']); $notify = !empty($_POST['notify']); - $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0)); + $fetch_further_information = intval($_POST['fetch_further_information'] ?? 0); - $ffi_keyword_blacklist = Strings::escapeHtml(trim(defaults($_POST, 'ffi_keyword_blacklist', ''))); + $ffi_keyword_blacklist = Strings::escapeHtml(trim($_POST['ffi_keyword_blacklist'] ?? '')); - $priority = intval(defaults($_POST, 'poll', 0)); + $priority = intval($_POST['poll'] ?? 0); if ($priority > 5 || $priority < 0) { $priority = 0; } - $info = Strings::escapeHtml(trim(defaults($_POST, 'info', ''))); + $info = Strings::escapeHtml(trim($_POST['info'] ?? '')); $r = DBA::update('contact', [ - 'profile-id' => $profile_id, 'priority' => $priority, 'info' => $info, 'hidden' => $hidden, @@ -235,12 +145,12 @@ class Contact extends BaseModule ); if (DBA::isResult($r)) { - info(L10n::t('Contact updated.') . EOL); + info(DI::l10n()->t('Contact updated.') . EOL); } else { - notice(L10n::t('Failed to update contact record.') . EOL); + notice(DI::l10n()->t('Failed to update contact record.') . EOL); } - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]); if (DBA::isResult($contact)) { $a->data['contact'] = $contact; } @@ -252,7 +162,7 @@ class Contact extends BaseModule private static function updateContactFromPoll($contact_id) { - $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); + $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]); if (!DBA::isResult($contact)) { return; } @@ -273,71 +183,54 @@ class Contact extends BaseModule private static function updateContactFromProbe($contact_id) { - $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); + $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]); if (!DBA::isResult($contact)) { return; } - $uid = $contact['uid']; - - $data = Probe::uri($contact['url'], '', 0, false); - - // 'Feed' or 'Unknown' is mostly a sign of communication problems - if ((in_array($data['network'], [Protocol::FEED, Protocol::PHANTOM])) && ($data['network'] != $contact['network'])) { - return; - } - - $updatefields = ['name', 'nick', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco', 'network', 'alias']; - $fields = []; - - if ($data['network'] == Protocol::OSTATUS) { - $result = Model\Contact::createFromProbe($uid, $data['url'], false); - - if ($result['success']) { - $fields['subhub'] = true; - } - } - - foreach ($updatefields AS $field) { - if (!empty($data[$field])) { - $fields[$field] = $data[$field]; - } - } - - $fields['nurl'] = Strings::normaliseLink($data['url']); - - if (!empty($data['priority'])) { - $fields['priority'] = intval($data['priority']); - } - - if (empty($fields)) { - return; - } - - $r = DBA::update('contact', $fields, ['id' => $contact_id, 'uid' => local_user()]); - // Update the entry in the contact table - Model\Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); + Model\Contact::updateFromProbe($contact_id, '', true); // Update the entry in the gcontact table - Model\GContact::updateFromProbe($data['url']); + Model\GContact::updateFromProbe($contact['url']); } + /** + * Toggles the blocked status of a contact identified by id. + * + * @param $contact_id + * @throws \Exception + */ private static function blockContact($contact_id) { $blocked = !Model\Contact::isBlockedByUser($contact_id, local_user()); Model\Contact::setBlockedForUser($contact_id, local_user(), $blocked); } + /** + * Toggles the ignored status of a contact identified by id. + * + * @param $contact_id + * @throws \Exception + */ private static function ignoreContact($contact_id) { $ignored = !Model\Contact::isIgnoredByUser($contact_id, local_user()); Model\Contact::setIgnoredForUser($contact_id, local_user(), $ignored); } + /** + * Toggles the archived status of a contact identified by id. + * If the current status isn't provided, this will always archive the contact. + * + * @param $contact_id + * @param $orig_record + * @return bool + * @throws \Exception + */ private static function archiveContact($contact_id, $orig_record) { - $archived = (defaults($orig_record, 'archive', '') ? 0 : 1); + $archived = empty($orig_record['archive']); $r = DBA::update('contact', ['archive' => $archived], ['id' => $contact_id, 'uid' => local_user()]); return DBA::isResult($r); @@ -354,42 +247,153 @@ class Contact extends BaseModule Model\Contact::remove($orig_record['id']); } - public static function content($update = 0) + public static function content(array $parameters = [], $update = 0) { - $a = self::getApp(); - $sort_type = 0; + if (!local_user()) { + return Login::form($_SERVER['REQUEST_URI']); + } + + $a = DI::app(); + + $search = Strings::escapeTags(trim($_GET['search'] ?? '')); + $nets = Strings::escapeTags(trim($_GET['nets'] ?? '')); + $rel = Strings::escapeTags(trim($_GET['rel'] ?? '')); + $group = Strings::escapeTags(trim($_GET['group'] ?? '')); + + if (empty(DI::page()['aside'])) { + DI::page()['aside'] = ''; + } + + $contact_id = null; + $contact = null; + // @TODO: Replace with parameter from router + if ($a->argc == 2 && intval($a->argv[1]) + || $a->argc == 3 && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']) + ) { + $contact_id = intval($a->argv[1]); + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]); + + if (!DBA::isResult($contact)) { + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0, 'deleted' => false]); + } + + // Don't display contacts that are about to be deleted + if ($contact['network'] == Protocol::PHANTOM) { + $contact = false; + } + } + + if (DBA::isResult($contact)) { + if ($contact['self']) { + // @TODO: Replace with parameter from router + if (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])) { + DI::baseUrl()->redirect('profile/' . $contact['nick']); + } else { + DI::baseUrl()->redirect('profile/' . $contact['nick'] . '/profile'); + } + } + + $a->data['contact'] = $contact; + + if (($contact['network'] != '') && ($contact['network'] != Protocol::DFRN)) { + $network_link = Strings::formatNetworkName($contact['network'], $contact['url']); + } else { + $network_link = ''; + } + + $follow_link = ''; + $unfollow_link = ''; + if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { + if ($contact['uid'] && in_array($contact['rel'], [Model\Contact::SHARING, Model\Contact::FRIEND])) { + $unfollow_link = 'unfollow?url=' . urlencode($contact['url']); + } elseif(!$contact['pending']) { + $follow_link = 'follow?url=' . urlencode($contact['url']); + } + } + + $wallmessage_link = ''; + if ($contact['uid'] && Model\Contact::canReceivePrivateMessages($contact)) { + $wallmessage_link = 'message/new/' . $contact['id']; + } + + $vcard_widget = Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/vcard.tpl'), [ + '$name' => $contact['name'], + '$photo' => $contact['photo'], + '$url' => Model\Contact::magicLinkByContact($contact, $contact['url']), + '$addr' => $contact['addr'] ?? '', + '$network_link' => $network_link, + '$network' => DI::l10n()->t('Network:'), + '$account_type' => Model\Contact::getAccountType($contact), + '$follow' => DI::l10n()->t('Follow'), + '$follow_link' => $follow_link, + '$unfollow' => DI::l10n()->t('Unfollow'), + '$unfollow_link' => $unfollow_link, + '$wallmessage' => DI::l10n()->t('Message'), + '$wallmessage_link' => $wallmessage_link, + ]); + + $findpeople_widget = ''; + $follow_widget = ''; + $networks_widget = ''; + $rel_widget = ''; + + if ($contact['uid'] != 0) { + $groups_widget = Model\Group::sidebarWidget('contact', 'group', 'full', 'everyone', $contact_id); + } else { + $groups_widget = ''; + } + } else { + $vcard_widget = ''; + $findpeople_widget = Widget::findPeople(); + if (isset($_GET['add'])) { + $follow_widget = Widget::follow($_GET['add']); + } else { + $follow_widget = Widget::follow(); + } + + $networks_widget = Widget::networks($_SERVER['REQUEST_URI'], $nets); + $rel_widget = Widget::contactRels($_SERVER['REQUEST_URI'], $rel); + $groups_widget = Widget::groups($_SERVER['REQUEST_URI'], $group); + } + + DI::page()['aside'] .= $vcard_widget . $findpeople_widget . $follow_widget . $groups_widget . $networks_widget . $rel_widget; + + $tpl = Renderer::getMarkupTemplate('contacts-head.tpl'); + DI::page()['htmlhead'] .= Renderer::replaceMacros($tpl, [ + '$baseurl' => DI::baseUrl()->get(true), + ]); + $o = ''; Nav::setSelected('contact'); if (!local_user()) { - notice(L10n::t('Permission denied.') . EOL); + notice(DI::l10n()->t('Permission denied.') . EOL); return Login::form(); } if ($a->argc == 3) { $contact_id = intval($a->argv[1]); if (!$contact_id) { - return; + throw new BadRequestException(); } + // @TODO: Replace with parameter from router $cmd = $a->argv[2]; - $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false]); + $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false, 'deleted' => false]); if (!DBA::isResult($orig_record)) { - notice(L10n::t('Could not access contact record.') . EOL); - $a->internalRedirect('contact'); - return; // NOTREACHED + throw new NotFoundException(DI::l10n()->t('Contact not found')); } if ($cmd === 'update' && ($orig_record['uid'] != 0)) { self::updateContactFromPoll($contact_id); - $a->internalRedirect('contact/' . $contact_id); + DI::baseUrl()->redirect('contact/' . $contact_id); // NOTREACHED } if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { self::updateContactFromProbe($contact_id); - $a->internalRedirect('crepair/' . $contact_id); + DI::baseUrl()->redirect('contact/' . $contact_id . '/advanced/'); // NOTREACHED } @@ -397,31 +401,31 @@ class Contact extends BaseModule self::blockContact($contact_id); $blocked = Model\Contact::isBlockedByUser($contact_id, local_user()); - info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); + info(($blocked ? DI::l10n()->t('Contact has been blocked') : DI::l10n()->t('Contact has been unblocked')) . EOL); - $a->internalRedirect('contact/' . $contact_id); - return; // NOTREACHED + DI::baseUrl()->redirect('contact/' . $contact_id); + // NOTREACHED } if ($cmd === 'ignore') { self::ignoreContact($contact_id); $ignored = Model\Contact::isIgnoredByUser($contact_id, local_user()); - info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); + info(($ignored ? DI::l10n()->t('Contact has been ignored') : DI::l10n()->t('Contact has been unignored')) . EOL); - $a->internalRedirect('contact/' . $contact_id); - return; // NOTREACHED + DI::baseUrl()->redirect('contact/' . $contact_id); + // NOTREACHED } if ($cmd === 'archive' && ($orig_record['uid'] != 0)) { $r = self::archiveContact($contact_id, $orig_record); if ($r) { $archived = (($orig_record['archive']) ? 0 : 1); - info((($archived) ? L10n::t('Contact has been archived') : L10n::t('Contact has been unarchived')) . EOL); + info((($archived) ? DI::l10n()->t('Contact has been archived') : DI::l10n()->t('Contact has been unarchived')) . EOL); } - $a->internalRedirect('contact/' . $contact_id); - return; // NOTREACHED + DI::baseUrl()->redirect('contact/' . $contact_id); + // NOTREACHED } if ($cmd === 'drop' && ($orig_record['uid'] != 0)) { @@ -429,7 +433,7 @@ class Contact extends BaseModule if (!empty($_REQUEST['confirm'])) { //