X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FUser.php;h=736612b0d158eb45e35059d5574ea372587c839b;hb=2e05dac7dae0a3d028b442a2d5afbd4176a32e99;hp=641148f74292f50e66e7dd7583c85ea56cdb17fc;hpb=e994d02791b8879ab5d338650f199759d3012074;p=friendica.git diff --git a/src/Model/User.php b/src/Model/User.php index 641148f742..736612b0d1 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -146,10 +146,27 @@ class User $system['sprvkey'] = $system['uprvkey'] = $system['prvkey']; $system['spubkey'] = $system['upubkey'] = $system['pubkey']; $system['nickname'] = $system['nick']; + $system['page-flags'] = User::PAGE_FLAGS_SOAPBOX; + $system['account-type'] = $system['contact-type']; + $system['guid'] = ''; + $system['picdate'] = ''; + $system['theme'] = ''; + $system['publish'] = false; + $system['net-publish'] = false; + $system['hide-friends'] = true; + $system['prv_keywords'] = ''; + $system['pub_keywords'] = ''; + $system['address'] = ''; + $system['locality'] = ''; + $system['region'] = ''; + $system['postal-code'] = ''; + $system['country-name'] = ''; + $system['homepage'] = DI::baseUrl()->get(); + $system['dob'] = '0000-00-00'; // Ensure that the user contains data - $user = DBA::selectFirst('user', ['prvkey'], ['uid' => 0]); - if (empty($user['prvkey'])) { + $user = DBA::selectFirst('user', ['prvkey', 'guid'], ['uid' => 0]); + if (empty($user['prvkey']) || empty($user['guid'])) { $fields = [ 'username' => $system['name'], 'nickname' => $system['nick'], @@ -158,12 +175,17 @@ class User 'prvkey' => $system['prvkey'], 'spubkey' => $system['spubkey'], 'sprvkey' => $system['sprvkey'], + 'guid' => System::createUUID(), 'verified' => true, 'page-flags' => User::PAGE_FLAGS_SOAPBOX, 'account-type' => User::ACCOUNT_TYPE_RELAY, ]; DBA::update('user', $fields, ['uid' => 0]); + + $system['guid'] = $fields['guid']; + } else { + $system['guid'] = $user['guid']; } return $system; @@ -212,7 +234,7 @@ class User $system['closeness'] = 0; $system['baseurl'] = DI::baseUrl(); $system['gsid'] = GServer::getID($system['baseurl']); - DBA::insert('contact', $system); + Contact::insert($system); } /** @@ -391,12 +413,12 @@ class User if (!DBA::exists('user', ['uid' => $uid]) || !$repairMissing) { return false; } - if (!DBA::exists('contact', ['uid' => $uid, 'self' => true])) { - Contact::createSelfFromUserId($uid); - } if (!DBA::exists('profile', ['uid' => $uid])) { DBA::insert('profile', ['uid' => $uid]); } + if (!DBA::exists('contact', ['uid' => $uid, 'self' => true])) { + Contact::createSelfFromUserId($uid); + } $owner = self::getOwnerDataById($uid, false); } @@ -412,7 +434,7 @@ class User // Check for correct url and normalised nurl $url = DI::baseUrl() . '/profile/' . $owner['nickname']; - $repair = ($owner['url'] != $url) || ($owner['nurl'] != Strings::normaliseLink($owner['url'])); + $repair = empty($owner['network']) || ($owner['url'] != $url) || ($owner['nurl'] != Strings::normaliseLink($owner['url'])); if (!$repair) { // Check if "addr" is present and correct @@ -459,53 +481,23 @@ class User /** * Returns the default group for a given user and network * - * @param int $uid User id - * @param string $network network name + * @param int $uid User id * * @return int group id * @throws Exception */ - public static function getDefaultGroup($uid, $network = '') + public static function getDefaultGroup($uid) { - $default_group = 0; - - if ($network == Protocol::OSTATUS) { - $default_group = DI::pConfig()->get($uid, "ostatus", "default_group"); - } - - if ($default_group != 0) { - return $default_group; - } - $user = DBA::selectFirst('user', ['def_gid'], ['uid' => $uid]); - if (DBA::isResult($user)) { $default_group = $user["def_gid"]; + } else { + $default_group = 0; } return $default_group; } - - /** - * Authenticate a user with a clear text password - * - * @param mixed $user_info - * @param string $password - * @param bool $third_party - * @return int|boolean - * @deprecated since version 3.6 - * @see User::getIdFromPasswordAuthentication() - */ - public static function authenticate($user_info, $password, $third_party = false) - { - try { - return self::getIdFromPasswordAuthentication($user_info, $password, $third_party); - } catch (Exception $ex) { - return false; - } - } - /** * Authenticate a user with a clear text password * @@ -693,7 +685,7 @@ class User { $cache = new CacheItemPool(); $cache->changeConfig([ - 'cacheDirectory' => get_temppath() . '/password-exposed-cache/', + 'cacheDirectory' => System::getTempPath() . '/password-exposed-cache/', ]); try { @@ -827,6 +819,52 @@ class User return false; } + /** + * Get avatar link for given user + * + * @param array $user + * @param string $size One of the Proxy::SIZE_* constants + * @return string avatar link + * @throws Exception + */ + public static function getAvatarUrl(array $user, string $size = ''):string + { + if (empty($user['nickname'])) { + DI::logger()->warning('Missing user nickname key', ['trace' => System::callstack(20)]); + } + + $url = DI::baseUrl() . '/photo/'; + + switch ($size) { + case Proxy::SIZE_MICRO: + $url .= 'micro/'; + $scale = 6; + break; + case Proxy::SIZE_THUMB: + $url .= 'avatar/'; + $scale = 5; + break; + default: + $url .= 'profile/'; + $scale = 4; + break; + } + + $updated = ''; + $imagetype = IMAGETYPE_JPEG; + + $photo = Photo::selectFirst(['type', 'created', 'edited', 'updated'], ["scale" => $scale, 'uid' => $user['uid'], 'profile' => true]); + if (!empty($photo)) { + $updated = max($photo['created'], $photo['edited'], $photo['updated']); + + if (in_array($photo['type'], ['image/png', 'image/gif'])) { + $imagetype = IMAGETYPE_PNG; + } + } + + return $url . $user['nickname'] . image_type_to_extension($imagetype) . ($updated ? '?ts=' . strtotime($updated) : ''); + } + /** * Catch-all user creation function * @@ -852,18 +890,18 @@ class User $using_invites = DI::config()->get('system', 'invitation_only'); - $invite_id = !empty($data['invite_id']) ? Strings::escapeTags(trim($data['invite_id'])) : ''; - $username = !empty($data['username']) ? Strings::escapeTags(trim($data['username'])) : ''; - $nickname = !empty($data['nickname']) ? Strings::escapeTags(trim($data['nickname'])) : ''; - $email = !empty($data['email']) ? Strings::escapeTags(trim($data['email'])) : ''; - $openid_url = !empty($data['openid_url']) ? Strings::escapeTags(trim($data['openid_url'])) : ''; - $photo = !empty($data['photo']) ? Strings::escapeTags(trim($data['photo'])) : ''; - $password = !empty($data['password']) ? trim($data['password']) : ''; - $password1 = !empty($data['password1']) ? trim($data['password1']) : ''; - $confirm = !empty($data['confirm']) ? trim($data['confirm']) : ''; + $invite_id = !empty($data['invite_id']) ? trim($data['invite_id']) : ''; + $username = !empty($data['username']) ? trim($data['username']) : ''; + $nickname = !empty($data['nickname']) ? trim($data['nickname']) : ''; + $email = !empty($data['email']) ? trim($data['email']) : ''; + $openid_url = !empty($data['openid_url']) ? trim($data['openid_url']) : ''; + $photo = !empty($data['photo']) ? trim($data['photo']) : ''; + $password = !empty($data['password']) ? trim($data['password']) : ''; + $password1 = !empty($data['password1']) ? trim($data['password1']) : ''; + $confirm = !empty($data['confirm']) ? trim($data['confirm']) : ''; $blocked = !empty($data['blocked']); $verified = !empty($data['verified']); - $language = !empty($data['language']) ? Strings::escapeTags(trim($data['language'])) : 'en'; + $language = !empty($data['language']) ? trim($data['language']) : 'en'; $netpublish = $publish = !empty($data['profile_publish_reg']); @@ -920,7 +958,7 @@ class User $username_max_length = max(1, min(64, intval(DI::config()->get('system', 'username_max_length', 48)))); if ($username_min_length > $username_max_length) { - Logger::log(DI::l10n()->t('system.username_min_length (%s) and system.username_max_length (%s) are excluding each other, swapping values.', $username_min_length, $username_max_length), Logger::WARNING); + Logger::error(DI::l10n()->t('system.username_min_length (%s) and system.username_max_length (%s) are excluding each other, swapping values.', $username_min_length, $username_max_length)); $tmp = $username_min_length; $username_min_length = $username_max_length; $username_max_length = $tmp; @@ -1041,8 +1079,8 @@ class User $insert_result = DBA::insert('profile', [ 'uid' => $uid, 'name' => $username, - 'photo' => DI::baseUrl() . "/photo/profile/{$uid}.jpg", - 'thumb' => DI::baseUrl() . "/photo/avatar/{$uid}.jpg", + 'photo' => self::getAvatarUrl($user), + 'thumb' => self::getAvatarUrl($user, Proxy::SIZE_THUMB), 'publish' => $publish, 'net-publish' => $netpublish, ]); @@ -1085,7 +1123,7 @@ class User $photo_failure = false; $filename = basename($photo); - $curlResult = DI::httpRequest()->get($photo); + $curlResult = DI::httpClient()->get($photo); if ($curlResult->isSuccess()) { $img_str = $curlResult->getBody(); $type = $curlResult->getContentType(); @@ -1102,7 +1140,10 @@ class User $resource_id = Photo::newResource(); - $r = Photo::store($Image, $uid, 0, $resource_id, $filename, DI::l10n()->t('Profile Photos'), 4); + // Not using Photo::PROFILE_PHOTOS here, so that it is discovered as translateble string + $profile_album = DI::l10n()->t('Profile Photos'); + + $r = Photo::store($Image, $uid, 0, $resource_id, $filename, $profile_album, 4); if ($r === false) { $photo_failure = true; @@ -1110,7 +1151,7 @@ class User $Image->scaleDown(80); - $r = Photo::store($Image, $uid, 0, $resource_id, $filename, DI::l10n()->t('Profile Photos'), 5); + $r = Photo::store($Image, $uid, 0, $resource_id, $filename, $profile_album, 5); if ($r === false) { $photo_failure = true; @@ -1118,14 +1159,14 @@ class User $Image->scaleDown(48); - $r = Photo::store($Image, $uid, 0, $resource_id, $filename, DI::l10n()->t('Profile Photos'), 6); + $r = Photo::store($Image, $uid, 0, $resource_id, $filename, $profile_album, 6); if ($r === false) { $photo_failure = true; } if (!$photo_failure) { - Photo::update(['profile' => 1], ['resource-id' => $resource_id]); + Photo::update(['profile' => true, 'photo-type' => Photo::USER_AVATAR], ['resource-id' => $resource_id]); } } @@ -1138,6 +1179,42 @@ class User return $return; } + /** + * Update a user entry and distribute the changes if needed + * + * @param array $fields + * @param integer $uid + * @return boolean + */ + public static function update(array $fields, int $uid): bool + { + $old_owner = self::getOwnerDataById($uid); + if (empty($old_owner)) { + return false; + } + + if (!DBA::update('user', $fields, ['uid' => $uid])) { + return false; + } + + $update = Contact::updateSelfFromUserID($uid); + + $owner = self::getOwnerDataById($uid); + if (empty($owner)) { + return false; + } + + if ($old_owner['name'] != $owner['name']) { + Profile::update(['name' => $owner['name']], $uid); + } + + if ($update) { + Profile::publishUpdate($uid); + } + + return true; + } + /** * Sets block state for a given user * @@ -1419,7 +1496,7 @@ class User return false; } - Logger::log('Removing user: ' . $uid); + Logger::notice('Removing user', ['user' => $uid]); $user = DBA::selectFirst('user', [], ['uid' => $uid]); @@ -1469,6 +1546,10 @@ class User */ public static function identities($uid) { + if (empty($uid)) { + return []; + } + $identities = []; $user = DBA::selectFirst('user', ['uid', 'nickname', 'username', 'parent-uid'], ['uid' => $uid]); @@ -1529,6 +1610,38 @@ class User return $identities; } + /** + * Check if the given user id has delegations or is delegated + * + * @param int $uid + * @return bool + */ + public static function hasIdentities(int $uid):bool + { + if (empty($uid)) { + return false; + } + + $user = DBA::selectFirst('user', ['parent-uid'], ['uid' => $uid, 'account_removed' => false]); + if (!DBA::isResult($user)) { + return false; + } + + if ($user['parent-uid'] != 0) { + return true; + } + + if (DBA::exists('user', ['parent-uid' => $uid, 'account_removed' => false])) { + return true; + } + + if (DBA::exists('manage', ['uid' => $uid])) { + return true; + } + + return false; + } + /** * Returns statistical information about the current users of this node *