From 3781b3427254f246ac42751b395e8041b0c7838a Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Tue, 19 Oct 2021 19:15:28 +0000
Subject: [PATCH] PROFILE_PHOTOS is mostly removed and replaced

---
 database.sql                                |  2 +-
 mod/photos.php                              | 63 ++++++++-------------
 mod/ping.php                                |  4 +-
 src/Model/Photo.php                         | 16 +++---
 src/Module/Settings/Profile/Photo/Crop.php  |  8 ++-
 src/Module/Settings/Profile/Photo/Index.php |  4 +-
 static/dbstructure.config.php               |  2 +-
 update.php                                  | 15 +++++
 8 files changed, 61 insertions(+), 53 deletions(-)

diff --git a/database.sql b/database.sql
index a28094eff9..466a8d9b77 100644
--- a/database.sql
+++ b/database.sql
@@ -1,6 +1,6 @@
 -- ------------------------------------------
 -- Friendica 2021.12-dev (Siberian Iris)
--- DB_UPDATE_VERSION 1440
+-- DB_UPDATE_VERSION 1441
 -- ------------------------------------------
 
 
diff --git a/mod/photos.php b/mod/photos.php
index ba964ce5fa..2efd3a5a7a 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -85,9 +85,6 @@ function photos_init(App $a) {
 
 			$ret['albums'] = [];
 			foreach ($albums as $k => $album) {
-				//hide profile photos to others
-				if (!$is_owner && !Session::getRemoteContactID($owner['uid']) && ($album['album'] == DI::l10n()->t(Photo::PROFILE_PHOTOS)))
-					continue;
 				$entry = [
 					'text'      => $album['album'],
 					'total'     => $album['total'],
@@ -195,12 +192,7 @@ function photos_post(App $a)
 		}
 		$album = hex2bin(DI::args()->getArgv()[3]);
 
-		if ($album === DI::l10n()->t(Photo::PROFILE_PHOTOS) || $album === Photo::CONTACT_PHOTOS || $album === DI::l10n()->t(Photo::CONTACT_PHOTOS)) {
-			DI::baseUrl()->redirect($_SESSION['photo_return']);
-			return; // NOTREACHED
-		}
-
-		if (!DBA::exists('photo', ['album' => $album, 'uid' => $page_owner_uid])) {
+		if (!DBA::exists('photo', ['album' => $album, 'uid' => $page_owner_uid, 'photo-type' => Photo::DEFAULT])) {
 			notice(DI::l10n()->t('Album not found.'));
 			DI::baseUrl()->redirect('photos/' . $user['nickname'] . '/album');
 			return; // NOTREACHED
@@ -917,7 +909,7 @@ function photos_content(App $a)
 		$albums = Photo::getAlbums($owner_uid);
 		if (!empty($albums)) {
 			foreach ($albums as $album) {
-				if (($album['album'] === '') || ($album['album'] === Photo::CONTACT_PHOTOS) || ($album['album'] === DI::l10n()->t(Photo::CONTACT_PHOTOS))) {
+				if ($album['album'] === '') {
 					continue;
 				}
 				$selected = (($selname === $album['album']) ? ' selected="selected" ' : '');
@@ -976,6 +968,10 @@ function photos_content(App $a)
 		}
 		$album = hex2bin($datum);
 
+		if ($can_post && !Photo::exists(['uid' => $owner_uid, 'album' => $album, 'photo-type' => Photo::DEFAULT])) {
+			$can_post = false;
+		}
+
 		$total = 0;
 		$r = DBA::toArray(DBA::p("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = ? AND `album` = ?
 			AND `scale` <= 4 $sql_extra GROUP BY `resource-id`",
@@ -1025,27 +1021,23 @@ function photos_content(App $a)
 
 		// edit album name
 		if ($cmd === 'edit') {
-			if (($album !== DI::l10n()->t(Photo::PROFILE_PHOTOS)) && ($album !== Photo::CONTACT_PHOTOS) && ($album !== DI::l10n()->t(Photo::CONTACT_PHOTOS))) {
-				if ($can_post) {
-					$edit_tpl = Renderer::getMarkupTemplate('album_edit.tpl');
+			if ($can_post) {
+				$edit_tpl = Renderer::getMarkupTemplate('album_edit.tpl');
 
-					$album_e = $album;
+				$album_e = $album;
 
-					$o .= Renderer::replaceMacros($edit_tpl,[
-						'$nametext' => DI::l10n()->t('New album name: '),
-						'$nickname' => $user['nickname'],
-						'$album' => $album_e,
-						'$hexalbum' => bin2hex($album),
-						'$submit' => DI::l10n()->t('Submit'),
-						'$dropsubmit' => DI::l10n()->t('Delete Album')
-					]);
-				}
-			}
-		} else {
-			if (($album !== DI::l10n()->t(Photo::PROFILE_PHOTOS)) && ($album !== Photo::CONTACT_PHOTOS) && ($album !== DI::l10n()->t(Photo::CONTACT_PHOTOS)) && $can_post) {
-				$edit = [DI::l10n()->t('Edit Album'), 'photos/' . $user['nickname'] . '/album/' . bin2hex($album) . '/edit'];
-				$drop = [DI::l10n()->t('Drop Album'), 'photos/' . $user['nickname'] . '/album/' . bin2hex($album) . '/drop'];
+				$o .= Renderer::replaceMacros($edit_tpl,[
+					'$nametext' => DI::l10n()->t('New album name: '),
+					'$nickname' => $user['nickname'],
+					'$album' => $album_e,
+					'$hexalbum' => bin2hex($album),
+					'$submit' => DI::l10n()->t('Submit'),
+					'$dropsubmit' => DI::l10n()->t('Delete Album')
+				]);
 			}
+		} elseif ($can_post) {
+			$edit = [DI::l10n()->t('Edit Album'), 'photos/' . $user['nickname'] . '/album/' . bin2hex($album) . '/edit'];
+			$drop = [DI::l10n()->t('Drop Album'), 'photos/' . $user['nickname'] . '/album/' . bin2hex($album) . '/drop'];
 		}
 
 		if ($order_field === 'posted') {
@@ -1546,11 +1538,10 @@ function photos_content(App $a)
 	// Default - show recent photos with upload link (if applicable)
 	//$o = '';
 	$total = 0;
-	$r = DBA::toArray(DBA::p("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = ? AND NOT `photo-type` IN (?, ?)
+	$r = DBA::toArray(DBA::p("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = ? AND `photo-type` = ?
 		$sql_extra GROUP BY `resource-id`",
 		$user['uid'],
-		Photo::CONTACT_AVATAR,
-		Photo::CONTACT_BANNER
+		Photo::DEFAULT,
 	));
 	if (DBA::isResult($r)) {
 		$total = count($r);
@@ -1561,11 +1552,10 @@ function photos_content(App $a)
 	$r = DBA::toArray(DBA::p("SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`,
 		ANY_VALUE(`type`) AS `type`, ANY_VALUE(`album`) AS `album`, max(`scale`) AS `scale`,
 		ANY_VALUE(`created`) AS `created` FROM `photo`
-		WHERE `uid` = ? AND NOT `photo-type` IN (?, ?)
+		WHERE `uid` = ? AND `photo-type` = ?
 		$sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT ? , ?",
 		$user['uid'],
-		Photo::CONTACT_AVATAR,
-		Photo::CONTACT_BANNER,
+		Photo::DEFAULT,
 		$pager->getStart(),
 		$pager->getItemsPerPage()
 	));
@@ -1575,11 +1565,6 @@ function photos_content(App $a)
 		// "Twist" is only used for the duepunto theme with style "slackr"
 		$twist = false;
 		foreach ($r as $rr) {
-			//hide profile photos to others
-			if (!$is_owner && !Session::getRemoteContactID($owner_uid) && ($rr['album'] == DI::l10n()->t(Photo::PROFILE_PHOTOS))) {
-				continue;
-			}
-
 			$twist = !$twist;
 			$ext = $phototypes[$rr['type']];
 
diff --git a/mod/ping.php b/mod/ping.php
index 3abb2f37a3..2143f73af2 100644
--- a/mod/ping.php
+++ b/mod/ping.php
@@ -179,14 +179,14 @@ function ping_init(App $a)
 			"SELECT  `intro`.`id`, `intro`.`datetime`,
 			`contact`.`name`, `contact`.`url`, `contact`.`photo`
 			FROM `intro` INNER JOIN `contact` ON `intro`.`suggest-cid` = `contact`.`id`
-			WHERE `intro`.`uid` = ? AND NOT `intro`.`blocked` AND NOT `intro`.`ignore` AND `intro`.`fid` != 0",
+			WHERE `intro`.`uid` = ? AND NOT `intro`.`blocked` AND NOT `intro`.`ignore` AND `intro`.`suggest-cid` != 0",
 			local_user()
 		));
 		$intros2 = DBA::toArray(DBA::p(
 			"SELECT `intro`.`id`, `intro`.`datetime`,
 			`contact`.`name`, `contact`.`url`, `contact`.`photo`
 			FROM `intro` INNER JOIN `contact` ON `intro`.`contact-id` = `contact`.`id`
-			WHERE `intro`.`uid` = ? AND NOT `intro`.`blocked` AND NOT `intro`.`ignore` AND `intro`.`contact-id` != 0 AND (`intro`.`fid` = 0 OR `intro`.`fid` IS NULL)",
+			WHERE `intro`.`uid` = ? AND NOT `intro`.`blocked` AND NOT `intro`.`ignore` AND `intro`.`contact-id` != 0 AND (`intro`.`suggest-cid` = 0 OR `intro`.`suggest-cid` IS NULL)",
 			local_user()
 		));
 
diff --git a/src/Model/Photo.php b/src/Model/Photo.php
index d4d397b16d..e72004029f 100644
--- a/src/Model/Photo.php
+++ b/src/Model/Photo.php
@@ -380,7 +380,7 @@ class Photo
 			"data" => $data,
 			"scale" => $scale,
 			"photo-type" => $type,
-			"profile" => $type == self::USER_AVATAR,
+			"profile" => false,
 			"allow_cid" => $allow_cid,
 			"allow_gid" => $allow_gid,
 			"deny_cid" => $deny_cid,
@@ -632,6 +632,8 @@ class Photo
 	{
 		$sql_extra = Security::getPermissionsSQLByUserId($uid);
 
+		$avatar_type = (local_user() && (local_user() == $uid)) ? Photo::USER_AVATAR : Photo::DEFAULT;
+
 		$key = "photo_albums:".$uid.":".local_user().":".remote_user();
 		$albums = DI::cache()->get($key);
 		if (is_null($albums) || $update) {
@@ -640,20 +642,20 @@ class Photo
 				// At this time we just store the data in the cache
 				$albums = DBA::toArray(DBA::p("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created`
 					FROM `photo`
-					WHERE `uid` = ? AND NOT `photo-type` IN (?, ?) $sql_extra
+					WHERE `uid` = ? AND `photo-type` IN (?, ?) $sql_extra
 					GROUP BY `album` ORDER BY `created` DESC",
 					$uid,
-					self::CONTACT_AVATAR,
-					self::CONTACT_BANNER
+					self::DEFAULT,
+					$avatar_type
 				));
 			} else {
 				// This query doesn't do the count and is much faster
 				$albums = DBA::toArray(DBA::p("SELECT DISTINCT(`album`), '' AS `total`
 					FROM `photo` USE INDEX (`uid_album_scale_created`)
-					WHERE `uid` = ? AND NOT `photo-type` IN (?, ?) $sql_extra",
+					WHERE `uid` = ? AND `photo-type` IN (?, ?) $sql_extra",
 					$uid,
-					self::CONTACT_AVATAR,
-					self::CONTACT_BANNER
+					self::DEFAULT,
+					$avatar_type
 				));
 			}
 			DI::cache()->set($key, $albums, Duration::DAY);
diff --git a/src/Module/Settings/Profile/Photo/Crop.php b/src/Module/Settings/Profile/Photo/Crop.php
index 890d397554..745fb0685f 100644
--- a/src/Module/Settings/Profile/Photo/Crop.php
+++ b/src/Module/Settings/Profile/Photo/Crop.php
@@ -104,6 +104,8 @@ class Crop extends BaseSettings
 				);
 				if ($r === false) {
 					notice(DI::l10n()->t('Image size reduction [%s] failed.', '300'));
+				} else {
+					Photo::update(['profile' => true], ['id' => $r['id']]);
 				}
 
 				$Image->scaleDown(80);
@@ -120,6 +122,8 @@ class Crop extends BaseSettings
 				);
 				if ($r === false) {
 					notice(DI::l10n()->t('Image size reduction [%s] failed.', '80'));
+				} else {
+					Photo::update(['profile' => true], ['id' => $r['id']]);
 				}
 
 				$Image->scaleDown(48);
@@ -136,6 +140,8 @@ class Crop extends BaseSettings
 				);
 				if ($r === false) {
 					notice(DI::l10n()->t('Image size reduction [%s] failed.', '48'));
+				} else {
+					Photo::update(['profile' => true], ['id' => $r['id']]);
 				}
 
 				Contact::updateSelfFromUserID(local_user(), true);
@@ -176,7 +182,7 @@ class Crop extends BaseSettings
 
 		// set an already uloaded photo as profile photo
 		// if photo is in 'Profile Photos', change it in db
-		if ($photos[0]['album'] == DI::l10n()->t(Photo::PROFILE_PHOTOS) && $havescale) {
+		if ($photos[0]['photo-type'] == Photo::USER_AVATAR && $havescale) {
 			Photo::update(['profile' => false], ['uid' => local_user()]);
 
 			Photo::update(['profile' => true], ['resource-id' => $resource_id, 'uid' => local_user()]);
diff --git a/src/Module/Settings/Profile/Photo/Index.php b/src/Module/Settings/Profile/Photo/Index.php
index 967c76e46c..cda71a7c69 100644
--- a/src/Module/Settings/Profile/Photo/Index.php
+++ b/src/Module/Settings/Profile/Photo/Index.php
@@ -92,13 +92,13 @@ class Index extends BaseSettings
 
 		$filename = '';
 
-		if (!Photo::store($Image, local_user(), 0, $resource_id, $filename, DI::l10n()->t(Photo::PROFILE_PHOTOS), 0)) {
+		if (!Photo::store($Image, local_user(), 0, $resource_id, $filename, DI::l10n()->t(Photo::PROFILE_PHOTOS), 0, Photo::USER_AVATAR)) {
 			notice(DI::l10n()->t('Image upload failed.'));
 		}
 
 		if ($width > 640 || $height > 640) {
 			$Image->scaleDown(640);
-			if (!Photo::store($Image, local_user(), 0, $resource_id, $filename, DI::l10n()->t(Photo::PROFILE_PHOTOS), 1)) {
+			if (!Photo::store($Image, local_user(), 0, $resource_id, $filename, DI::l10n()->t(Photo::PROFILE_PHOTOS), 1, Photo::USER_AVATAR)) {
 				notice(DI::l10n()->t('Image size reduction [%s] failed.', '640'));
 			}
 		}
diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php
index b16140a15b..4ed1e04a9b 100644
--- a/static/dbstructure.config.php
+++ b/static/dbstructure.config.php
@@ -55,7 +55,7 @@
 use Friendica\Database\DBA;
 
 if (!defined('DB_UPDATE_VERSION')) {
-	define('DB_UPDATE_VERSION', 1440);
+	define('DB_UPDATE_VERSION', 1441);
 }
 
 return [
diff --git a/update.php b/update.php
index 64bd7a9c33..25e64d659a 100644
--- a/update.php
+++ b/update.php
@@ -1038,3 +1038,18 @@ function update_1440()
 
 	return Update::SUCCESS;
 }
+
+function update__1441()
+{
+	$languages = DI::l10n()->getAvailableLanguages();
+
+	$albums = [Photo::PROFILE_PHOTOS];
+	foreach ($languages as $language) {
+		$albums[] = DI::l10n()->withLang($language)->t(Photo::PROFILE_PHOTOS);
+	}
+	$albums = array_unique($albums);
+
+	Photo::update(['photo-type' => Photo::USER_AVATAR], ['album' => $albums]);
+
+	return Update::SUCCESS;
+}