X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FObject%2FContact.php;h=f72ec025a4dbda0bcbba72a56acb8068ccb6569c;hb=d4ca30a6dba186a297a0c4a7e79f3d2ec72c0522;hp=d7e78536218052af874c01bdeac99e4b5b7bea46;hpb=5778747ad058731a64521592e24f1cba3b0291e8;p=friendica.git diff --git a/src/Object/Contact.php b/src/Object/Contact.php index d7e7853621..f72ec025a4 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -13,9 +13,11 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Network\Probe; +use Friendica\Object\Photo; use Friendica\Protocol\Diaspora; use Friendica\Protocol\DFRN; use Friendica\Protocol\OStatus; +use Friendica\Protocol\Salmon; use dba; require_once 'boot.php'; @@ -26,6 +28,52 @@ require_once 'include/text.php'; */ class Contact extends BaseObject { + /** + * Creates the self-contact for the provided user id + * + * @param int $uid + * @return bool Operation success + */ + public static function createSelfFromUserId($uid) + { + // Only create the entry if it doesn't exist yet + if (dba::exists('contact', ['uid' => intval($uid), 'self'])) { + return true; + } + + $user = dba::select('user', ['uid', 'username', 'nickname'], ['uid' => intval($uid)], ['limit' => 1]); + if (!DBM::is_result($user)) { + return false; + } + + $return = dba::insert('contact', [ + 'uid' => $user['uid'], + 'created' => datetime_convert(), + 'self' => 1, + 'name' => $user['username'], + 'nick' => $user['nickname'], + 'photo' => System::baseUrl() . '/photo/profile/' . $user['uid'] . '.jpg', + 'thumb' => System::baseUrl() . '/photo/avatar/' . $user['uid'] . '.jpg', + 'micro' => System::baseUrl() . '/photo/micro/' . $user['uid'] . '.jpg', + 'blocked' => 0, + 'pending' => 0, + 'url' => System::baseUrl() . '/profile/' . $user['nickname'], + 'nurl' => normalise_link(System::baseUrl() . '/profile/' . $user['nickname']), + 'addr' => $user['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3), + 'request' => System::baseUrl() . '/dfrn_request/' . $user['nickname'], + 'notify' => System::baseUrl() . '/dfrn_notify/' . $user['nickname'], + 'poll' => System::baseUrl() . '/dfrn_poll/' . $user['nickname'], + 'confirm' => System::baseUrl() . '/dfrn_confirm/' . $user['nickname'], + 'poco' => System::baseUrl() . '/poco/' . $user['nickname'], + 'name-date' => datetime_convert(), + 'uri-date' => datetime_convert(), + 'avatar-date' => datetime_convert(), + 'closeness' => 0 + ]); + + return $return; + } + /** * @brief Marks a contact for removal * @@ -70,8 +118,7 @@ class Contact extends BaseObject $slap = OStatus::salmon($item, $user); if ((x($contact, 'notify')) && (strlen($contact['notify']))) { - require_once 'include/salmon.php'; - slapper($user, $contact['notify'], $slap); + Salmon::slapper($user, $contact['notify'], $slap); } } elseif ($contact['network'] === NETWORK_DIASPORA) { Diaspora::sendUnshare($user, $contact); @@ -94,8 +141,8 @@ class Contact extends BaseObject */ public static function markForArchival(array $contact) { - // Contact already archived, nothing to do - if ($contact['archive']) { + // Contact already archived or "self" contact? => nothing to do + if ($contact['archive'] || $contact['self']) { return; } @@ -103,7 +150,7 @@ class Contact extends BaseObject dba::update('contact', array('term-date' => datetime_convert()), array('id' => $contact['id'])); if ($contact['url'] != '') { - dba::update('contact', array('term-date' => datetime_convert()), array('`nurl` = ? AND `term-date` <= ?', normalise_link($contact['url']), NULL_DATE)); + dba::update('contact', array('term-date' => datetime_convert()), array('`nurl` = ? AND `term-date` <= ? AND NOT `self`', normalise_link($contact['url']), NULL_DATE)); } } else { /* @todo @@ -122,7 +169,7 @@ class Contact extends BaseObject dba::update('contact', array('archive' => 1), array('id' => $contact['id'])); if ($contact['url'] != '') { - dba::update('contact', array('archive' => 1), array('nurl' => normalise_link($contact['url']))); + dba::update('contact', array('archive' => 1), array('nurl' => normalise_link($contact['url']), 'self' => false)); } } } @@ -138,7 +185,7 @@ class Contact extends BaseObject */ public static function unmarkForArchival(array $contact) { - $condition = array('`id` = ? AND (`term-date` > ? OR `archive`)', $contact[`id`], NULL_DATE); + $condition = array('`id` = ? AND (`term-date` > ? OR `archive`)', $contact['id'], NULL_DATE); $exists = dba::exists('contact', $condition); // We don't need to update, we never marked this contact for archival @@ -477,12 +524,14 @@ class Contact extends BaseObject "SELECT COUNT(*) AS `total` FROM `contact` WHERE `uid` = %d - AND `self` = 0 + AND NOT `self` + AND NOT `blocked` + AND NOT `pending` AND `id` NOT IN ( SELECT DISTINCT(`contact-id`) FROM `group_member` WHERE `uid` = %d - ) ", intval($uid), intval($uid) + )", intval($uid), intval($uid) ); return $r; @@ -492,13 +541,13 @@ class Contact extends BaseObject "SELECT * FROM `contact` WHERE `uid` = %d - AND `self` = 0 + AND NOT `self` + AND NOT `blocked` + AND NOT `pending` AND `id` NOT IN ( SELECT DISTINCT(`contact-id`) FROM `group_member` WHERE `uid` = %d ) - AND `blocked` = 0 - AND `pending` = 0 LIMIT %d, %d", intval($uid), intval($uid), intval($start), intval($count) ); return $r; @@ -643,11 +692,10 @@ class Contact extends BaseObject } } - require_once 'include/Photo.php'; - - update_contact_avatar($data["photo"], $uid, $contact_id); + self::updateAvatar($data["photo"], $uid, $contact_id); - $contact = dba::select('contact', array('url', 'nurl', 'addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date'), array('id' => $contact_id), array('limit' => 1)); + $fields = array('url', 'nurl', 'addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date', 'pubkey'); + $contact = dba::select('contact', $fields, array('id' => $contact_id), array('limit' => 1)); // This condition should always be true if (!DBM::is_result($contact)) { @@ -661,6 +709,13 @@ class Contact extends BaseObject 'name' => $data['name'], 'nick' => $data['nick']); + // Only fill the pubkey if it was empty before. We have to prevent identity theft. + if (!empty($contact['pubkey'])) { + unset($contact['pubkey']); + } else { + $updated['pubkey'] = $data['pubkey']; + } + if ($data['keywords'] != '') { $updated['keywords'] = $data['keywords']; } @@ -819,4 +874,75 @@ class Contact extends BaseObject return $account_type; } + + /** + * @brief Blocks a contact + * + * @param int $uid + * @return bool + */ + public static function block($uid) + { + $return = dba::update('contact', ['blocked' => true], ['id' => $uid]); + + return $return; + } + + /** + * @brief Unblocks a contact + * + * @param int $uid + * @return bool + */ + public static function unblock($uid) + { + $return = dba::update('contact', ['blocked' => false], ['id' => $uid]); + + return $return; + } + + /** + * @brief Updates the avatar links in a contact only if needed + * + * @param string $avatar Link to avatar picture + * @param int $uid User id of contact owner + * @param int $cid Contact id + * @param bool $force force picture update + * + * @return array Returns array of the different avatar sizes + */ + public static function updateAvatar($avatar, $uid, $cid, $force = false) + { + // Limit = 1 returns the row so no need for dba:inArray() + $r = dba::select('contact', array('avatar', 'photo', 'thumb', 'micro', 'nurl'), array('id' => $cid), array('limit' => 1)); + if (!DBM::is_result($r)) { + return false; + } else { + $data = array($r["photo"], $r["thumb"], $r["micro"]); + } + + if (($r["avatar"] != $avatar) || $force) { + $photos = Photo::importProfilePhoto($avatar, $uid, $cid, true); + + if ($photos) { + dba::update( + 'contact', + array('avatar' => $avatar, 'photo' => $photos[0], 'thumb' => $photos[1], 'micro' => $photos[2], 'avatar-date' => datetime_convert()), + array('id' => $cid) + ); + + // Update the public contact (contact id = 0) + if ($uid != 0) { + $pcontact = dba::select('contact', array('id'), array('nurl' => $r[0]['nurl']), array('limit' => 1)); + if (DBM::is_result($pcontact)) { + self::updateAvatar($avatar, 0, $pcontact['id'], $force); + } + } + + return $photos; + } + } + + return $data; + } }