diff --git a/src/Module/Media/AttachmentBrowser.php b/src/Module/Media/Attachment/Browser.php similarity index 97% rename from src/Module/Media/AttachmentBrowser.php rename to src/Module/Media/Attachment/Browser.php index c0ec1c5d9..021859c02 100644 --- a/src/Module/Media/AttachmentBrowser.php +++ b/src/Module/Media/Attachment/Browser.php @@ -19,7 +19,7 @@ * */ -namespace Friendica\Module\Media; +namespace Friendica\Module\Media\Attachment; use Friendica\App; use Friendica\BaseModule; @@ -37,7 +37,7 @@ use Psr\Log\LoggerInterface; /** * Browser for Attachments */ -class AttachmentBrowser extends BaseModule +class Browser extends BaseModule { /** @var IHandleUserSessions */ protected $session; diff --git a/src/Module/Profile/Attachment/Upload.php b/src/Module/Media/Attachment/Upload.php similarity index 80% rename from src/Module/Profile/Attachment/Upload.php rename to src/Module/Media/Attachment/Upload.php index 0624ea5a3..b11469f5a 100644 --- a/src/Module/Profile/Attachment/Upload.php +++ b/src/Module/Media/Attachment/Upload.php @@ -19,7 +19,7 @@ * */ -namespace Friendica\Module\Profile\Attachment; +namespace Friendica\Module\Media\Attachment; use Friendica\App; use Friendica\Core\Config\Capability\IManageConfigValues; @@ -73,30 +73,13 @@ class Upload extends \Friendica\BaseModule $this->response->setType(Response::TYPE_JSON, 'application/json'); } - $nick = $this->parameters['nickname']; - $owner = User::getOwnerDataByNick($nick); + $owner = User::getOwnerDataById($this->userSession->getLocalUserId()); + if (!$owner) { - $this->logger->warning('owner is not a valid record:', ['owner' => $owner, 'nick' => $nick]); + $this->logger->warning('Owner not found.', ['uid' => $this->userSession->getLocalUserId()]); return $this->return(401, $this->t('Invalid request.')); } - $can_post = false; - $contact_id = 0; - $page_owner_uid = $owner['uid']; - $community_page = $owner['page-flags'] == User::PAGE_FLAGS_COMMUNITY; - - if ($this->userSession->getLocalUserId() && $this->userSession->getLocalUserId() == $page_owner_uid) { - $can_post = true; - } elseif ($community_page && !empty($this->userSession->getRemoteContactID($page_owner_uid))) { - $contact_id = $this->userSession->getRemoteContactID($page_owner_uid); - $can_post = $this->database->exists('contact', ['blocked' => false, 'pending' => false, 'id' => $contact_id, 'uid' => $page_owner_uid]); - } - - if (!$can_post) { - $this->logger->warning('User does not have required permissions', ['contact_id' => $contact_id, 'page_owner_uid' => $page_owner_uid]); - return $this->return(403, $this->t('Permission denied.'), true); - } - if (empty($_FILES['userfile'])) { $this->logger->warning('No file uploaded (empty userfile)'); return $this->return(401, $this->t('Invalid request.'), true); @@ -126,7 +109,7 @@ class Upload extends \Friendica\BaseModule return $this->return(401, $msg); } - $newid = Attach::storeFile($tempFileName, $page_owner_uid, $fileName, '<' . $owner['id'] . '>'); + $newid = Attach::storeFile($tempFileName, $owner['uid'], $fileName, '<' . $owner['id'] . '>'); @unlink($tempFileName); diff --git a/src/Module/Media/PhotosBrowser.php b/src/Module/Media/Photo/Browser.php similarity index 97% rename from src/Module/Media/PhotosBrowser.php rename to src/Module/Media/Photo/Browser.php index 4c9803fc6..48f4b3a96 100644 --- a/src/Module/Media/PhotosBrowser.php +++ b/src/Module/Media/Photo/Browser.php @@ -19,7 +19,7 @@ * */ -namespace Friendica\Module\Media; +namespace Friendica\Module\Media\Photo; use Friendica\App; use Friendica\BaseModule; @@ -38,7 +38,7 @@ use Psr\Log\LoggerInterface; /** * Browser for Photos */ -class PhotosBrowser extends BaseModule +class Browser extends BaseModule { /** @var IHandleUserSessions */ protected $session; @@ -81,7 +81,7 @@ class PhotosBrowser extends BaseModule $tpl = Renderer::getMarkupTemplate('media/filebrowser.tpl'); $output = Renderer::replaceMacros($tpl, [ - '$type' => 'photos', + '$type' => 'photo', '$path' => $path, '$folders' => $albums, '$files' => $photosArray, diff --git a/src/Module/Profile/Photos/Upload.php b/src/Module/Media/Photo/Upload.php similarity index 78% rename from src/Module/Profile/Photos/Upload.php rename to src/Module/Media/Photo/Upload.php index e99d7e108..c07249c90 100644 --- a/src/Module/Profile/Photos/Upload.php +++ b/src/Module/Media/Photo/Upload.php @@ -19,7 +19,7 @@ * */ -namespace Friendica\Module\Profile\Photos; +namespace Friendica\Module\Media\Photo; use Friendica\App; use Friendica\Core\Config\Capability\IManageConfigValues; @@ -76,36 +76,11 @@ class Upload extends \Friendica\BaseModule $album = trim($request['album'] ?? ''); - if (empty($_FILES['media'])) { - $user = $this->database->selectFirst('owner-view', ['id', 'uid', 'nickname', 'page-flags'], ['nickname' => $this->parameters['nickname'], 'blocked' => false]); - } else { - $user = $this->database->selectFirst('owner-view', ['id', 'uid', 'nickname', 'page-flags'], ['uid' => BaseApi::getCurrentUserID() ?: null, 'blocked' => false]); - } + $owner = User::getOwnerDataById($this->userSession->getLocalUserId()); - if (!$this->database->isResult($user)) { - $this->logger->warning('User is not valid', ['nickname' => $this->parameters['nickname'], 'user' => $user]); - return $this->return(404, $this->t('User not found.')); - } - - /* - * Setup permissions structures - */ - $can_post = false; - $visitor = 0; - $contact_id = 0; - $page_owner_uid = $user['uid']; - - if ($this->userSession->getLocalUserId() && $this->userSession->getLocalUserId() == $page_owner_uid) { - $can_post = true; - } elseif ($user['page-flags'] == User::PAGE_FLAGS_COMMUNITY && !$this->userSession->getRemoteContactID($page_owner_uid)) { - $contact_id = $this->userSession->getRemoteContactID($page_owner_uid); - $can_post = $this->database->exists('contact', ['blocked' => false, 'pending' => false, 'id' => $contact_id, 'uid' => $page_owner_uid]); - $visitor = $contact_id; - } - - if (!$can_post) { - $this->logger->warning('No permission to upload files', ['contact_id' => $contact_id, 'page_owner_uid' => $page_owner_uid]); - return $this->return(403, $this->t('Permission denied.'), true); + if (!$owner) { + $this->logger->warning('Owner not found.', ['uid' => $this->userSession->getLocalUserId()]); + return $this->return(401, $this->t('Invalid request.')); } if (empty($_FILES['userfile']) && empty($_FILES['media'])) { @@ -223,9 +198,9 @@ class Upload extends \Friendica\BaseModule $album = $this->t('Wall Photos'); } - $allow_cid = '<' . $user['id'] . '>'; + $allow_cid = '<' . $owner['id'] . '>'; - $result = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 0, Photo::DEFAULT, $allow_cid); + $result = Photo::store($image, $owner['uid'], 0, $resource_id, $filename, $album, 0, Photo::DEFAULT, $allow_cid); if (!$result) { $this->logger->warning('Photo::store() failed', ['result' => $result]); return $this->return(401, $this->t('Image upload failed.')); @@ -233,7 +208,7 @@ class Upload extends \Friendica\BaseModule if ($width > 640 || $height > 640) { $image->scaleDown(640); - $result = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 1, Photo::DEFAULT, $allow_cid); + $result = Photo::store($image, $owner['uid'], 0, $resource_id, $filename, $album, 1, Photo::DEFAULT, $allow_cid); if ($result) { $smallest = 1; } @@ -241,14 +216,14 @@ class Upload extends \Friendica\BaseModule if ($width > 320 || $height > 320) { $image->scaleDown(320); - $result = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 2, Photo::DEFAULT, $allow_cid); + $result = Photo::store($image, $owner['uid'], 0, $resource_id, $filename, $album, 2, Photo::DEFAULT, $allow_cid); if ($result && ($smallest == 0)) { $smallest = 2; } } $this->logger->info('upload done'); - return $this->return(200, "\n\n" . '[url=' . $this->baseUrl . '/photos/' . $user['nickname'] . '/image/' . $resource_id . '][img]' . $this->baseUrl . "/photo/$resource_id-$smallest." . $image->getExt() . "[/img][/url]\n\n"); + return $this->return(200, "\n\n" . '[url=' . $this->baseUrl . '/photos/' . $owner['nickname'] . '/image/' . $resource_id . '][img]' . $this->baseUrl . "/photo/$resource_id-$smallest." . $image->getExt() . "[/img][/url]\n\n"); } /** diff --git a/src/Module/Profile/Photos/Index.php b/src/Module/Profile/Photos.php similarity index 98% rename from src/Module/Profile/Photos/Index.php rename to src/Module/Profile/Photos.php index 82803ac57..50af6f0e9 100644 --- a/src/Module/Profile/Photos/Index.php +++ b/src/Module/Profile/Photos.php @@ -19,7 +19,7 @@ * */ -namespace Friendica\Module\Profile\Photos; +namespace Friendica\Module\Profile; use Friendica\App; use Friendica\Content\Pager; @@ -40,7 +40,7 @@ use Friendica\Util\Images; use Friendica\Util\Profiler; use Psr\Log\LoggerInterface; -class Index extends \Friendica\Module\BaseProfile +class Photos extends \Friendica\Module\BaseProfile { /** @var IHandleUserSessions */ private $session; diff --git a/static/routes.config.php b/static/routes.config.php index 542e31679..d9e61c63f 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -31,18 +31,16 @@ use Friendica\App\Router as R; use Friendica\Module; $profileRoutes = [ - '' => [Module\Profile\Index::class, [R::GET]], - '/attachment/upload' => [Module\Profile\Attachment\Upload::class, [ R::POST]], - '/contacts/common' => [Module\Profile\Common::class, [R::GET]], - '/contacts[/{type}]' => [Module\Profile\Contacts::class, [R::GET]], - '/media' => [Module\Profile\Media::class, [R::GET]], - '/photos' => [Module\Profile\Photos\Index::class, [R::GET ]], - '/photos/upload' => [Module\Profile\Photos\Upload::class, [ R::POST]], - '/profile' => [Module\Profile\Profile::class, [R::GET]], - '/remote_follow' => [Module\Profile\RemoteFollow::class, [R::GET, R::POST]], - '/schedule' => [Module\Profile\Schedule::class, [R::GET, R::POST]], - '/status[/{category}[/{date1}[/{date2}]]]' => [Module\Profile\Status::class, [R::GET]], - '/unkmail' => [Module\Profile\UnkMail::class, [R::GET, R::POST]], + '' => [Module\Profile\Index::class, [R::GET]], + '/contacts/common' => [Module\Profile\Common::class, [R::GET]], + '/contacts[/{type}]' => [Module\Profile\Contacts::class, [R::GET]], + '/media' => [Module\Profile\Media::class, [R::GET]], + '/photos' => [Module\Profile\Photos::class, [R::GET ]], + '/profile' => [Module\Profile\Profile::class, [R::GET]], + '/remote_follow' => [Module\Profile\RemoteFollow::class, [R::GET, R::POST]], + '/schedule' => [Module\Profile\Schedule::class, [R::GET, R::POST]], + '/status[/{category}[/{date1}[/{date2}]]]' => [Module\Profile\Status::class, [R::GET]], + '/unkmail' => [Module\Profile\UnkMail::class, [R::GET, R::POST]], ]; $apiRoutes = [ @@ -471,8 +469,10 @@ return [ '/friendica.webmanifest' => [Module\Manifest::class, [R::GET]], '/media' => [ - '/attachment/browser' => [Module\Media\AttachmentBrowser::class, [R::GET]], - '/photos/browser[/{album}]' => [Module\Media\PhotosBrowser::class, [R::GET]], + '/attachment/browser' => [Module\Media\Attachment\Browser::class, [R::GET]], + '/attachment/upload' => [Module\Media\Attachment\Upload::class, [ R::POST]], + '/photo/browser[/{album}]' => [Module\Media\Photo\Browser::class, [R::GET]], + '/photo/upload' => [Module\Media\Photo\Upload::class, [ R::POST]], ], '/moderation' => [ @@ -562,7 +562,7 @@ return [ // Kept for backwards-compatibility // @TODO remove by version 2023.12 - '/photos/{nickname}' => [Module\Profile\Photos\Index::class, [R::GET]], + '/photos/{nickname}' => [Module\Profile\Photos::class, [R::GET]], '/ping' => [Module\Notifications\Ping::class, [R::GET]], diff --git a/view/global.css b/view/global.css index f09d95939..7c0798c21 100644 --- a/view/global.css +++ b/view/global.css @@ -345,9 +345,9 @@ img.acpopup-img { .fbrowser .path a:before, .fbrowser .path .btn-link:before { content: "/"; padding-right: 5px;} .fbrowser .folders ul { list-style-type: none; padding-left: 10px;} .fbrowser .list { height: auto; overflow-y: hidden; margin: 10px 0px; } -.fbrowser.photos .photo-album-image-wrapper { float: left; } -.fbrowser.photos a img, .fbrowser.photos .btn-link img { height: 48px; } -.fbrowser.photos a p, .fbrowser.photos .btn-link p { display: none;} +.fbrowser.photo .photo-album-image-wrapper { float: left; } +.fbrowser.photo a img, .fbrowser.photo .btn-link img { height: 48px; } +.fbrowser.photo a p, .fbrowser.photo .btn-link p { display: none;} .fbrowser.attachment .photo-album-image-wrapper { float:none; white-space: nowrap; } .fbrowser.attachment img { display: inline; } .fbrowser.attachment p { display: inline; white-space: nowrap; } diff --git a/view/js/main.js b/view/js/main.js index deaa45060..a1446bca5 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -166,7 +166,7 @@ $(function() { /* event from comment textarea button popups */ /* insert returned bbcode at cursor position or replace selected text */ - $('body').on('fbrowser.photos.comment', function(e, filename, bbcode, id) { + $('body').on('fbrowser.photo.comment', function(e, filename, bbcode, id) { $.colorbox.close(); var textarea = document.getElementById("comment-edit-text-" +id); var start = textarea.selectionStart; @@ -1069,7 +1069,7 @@ var Dialog = { * to the event handler */ doImageBrowser : function (name, id) { - var url = Dialog._get_url('photos', name, id); + var url = Dialog._get_url('photo', name, id); return Dialog.show(url); }, diff --git a/view/js/media/filebrowser.js b/view/js/media/filebrowser.js index 2239de4f6..5055b1d8e 100644 --- a/view/js/media/filebrowser.js +++ b/view/js/media/filebrowser.js @@ -84,7 +84,7 @@ const FileBrowser = { e.preventDefault(); let embed = ''; - if (FileBrowser.type === "photos") { + if (FileBrowser.type === "photo") { embed = '[url=' + this.dataset.link + '][img=' + this.dataset.img + ']' + this.dataset.alt + '[/img][/url]'; } if (FileBrowser.type === "attachment") { @@ -99,12 +99,11 @@ const FileBrowser = { }); - if ($('#upload-photos').length) - { + if ($('#upload-photo').length) { new window.AjaxUpload( - 'upload-photos', + 'upload-photo', { - action: 'profile/' + FileBrowser.nickname + '/photos/upload?response=json', + action: 'media/photo/upload?response=json', name: 'userfile', responseType: 'json', onSubmit: function (file, ext) { @@ -125,12 +124,11 @@ const FileBrowser = { ); } - if ($('#upload-attachment').length) - { + if ($('#upload-attachment').length) { new window.AjaxUpload( 'upload-attachment', { - action: 'profile/' + FileBrowser.nickname + '/attachment/upload?response=json', + action: 'media/attachment/upload?response=json', name: 'userfile', responseType: 'json', onSubmit: function (file, ext) { @@ -148,8 +146,8 @@ const FileBrowser = { location.reload(); } } - ); - } + ); + } }, _getUrl: function (mode, hash, folder) { diff --git a/view/templates/jot-header.tpl b/view/templates/jot-header.tpl index 2a81db6dd..808d51126 100644 --- a/view/templates/jot-header.tpl +++ b/view/templates/jot-header.tpl @@ -61,11 +61,11 @@ function enableOnUser(){ **/ /* callback */ - $('body').on('fbrowser.photos.main', function(e, filename, embedcode, id) { + $('body').on('fbrowser.photo.main', function(e, filename, embedcode, id) { $.colorbox.close(); addeditortext(embedcode); }); - $('body').on('fbrowser.photos.main', function(e, filename, embedcode, id) { + $('body').on('fbrowser.attachment.main', function(e, filename, embedcode, id) { $.colorbox.close(); addeditortext(embedcode); }); diff --git a/view/theme/frio/css/style.css b/view/theme/frio/css/style.css index 0e54d1cf9..eecb0b242 100644 --- a/view/theme/frio/css/style.css +++ b/view/theme/frio/css/style.css @@ -1563,10 +1563,10 @@ textarea.comment-edit-text:focus + .comment-edit-form .preview { max-height: calc(100vh - 220px); } } -.fbrowser.photos .photo-album-image-wrapper { +.fbrowser.photo .photo-album-image-wrapper { box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.2); } -.fbrowser.photos .photo-album-image-wrapper .caption { +.fbrowser.photo .photo-album-image-wrapper .caption { pointer-events: none; } .fbrowser .profile-rotator-wrapper { diff --git a/view/theme/frio/js/modal.js b/view/theme/frio/js/modal.js index d54a33e18..ed256450c 100644 --- a/view/theme/frio/js/modal.js +++ b/view/theme/frio/js/modal.js @@ -82,7 +82,7 @@ $(document).ready(function () { }); // Insert filebrowser images into the input field (field_fileinput.tpl). - $("body").on("fbrowser.photos.input", function (e, filename, embedcode, id, img) { + $("body").on("fbrowser.photo.input", function (e, filename, embedcode, id, img) { // Select the clicked button by it's attribute. var elm = $("[image-input='select']"); // Select the input field which belongs to this button. @@ -137,7 +137,7 @@ Dialog._get_url = function (type, name, id) { // Does load the filebrowser into the jot modal. Dialog.showJot = function () { - var type = "photos"; + var type = "photo"; var name = "main"; var url = Dialog._get_url(type, name); diff --git a/view/theme/frio/js/module/media/filebrowser.js b/view/theme/frio/js/module/media/filebrowser.js index 123861c4d..802c44098 100644 --- a/view/theme/frio/js/module/media/filebrowser.js +++ b/view/theme/frio/js/module/media/filebrowser.js @@ -109,7 +109,7 @@ var FileBrowser = { e.preventDefault(); let embed = ''; - if (FileBrowser.type === 'photos') { + if (FileBrowser.type === 'photo') { embed = '[url=' + this.dataset.link + '][img=' + this.dataset.img + ']' + this.dataset.alt + '[/img][/url]'; } if (FileBrowser.type === 'attachment') { @@ -155,12 +155,12 @@ var FileBrowser = { // Initialize the AjaxUpload for the upload buttons uploadButtons: function () { - if ($('#upload-photos').length) { + if ($('#upload-photo').length) { //AjaxUpload for photos new window.AjaxUpload( - 'upload-photos', + 'upload-photo', { - action: 'profile/' + FileBrowser.nickname + '/photos/upload?response=json&album=' + encodeURIComponent(FileBrowser.folder), + action: 'media/photo/upload?response=json&album=' + encodeURIComponent(FileBrowser.folder), name: 'userfile', responseType: 'json', onSubmit: function (file, ext) { @@ -187,7 +187,7 @@ var FileBrowser = { new window.AjaxUpload( 'upload-attachment', { - action: 'profile/' + FileBrowser.nickname + '/attachment/upload?response=json', + action: 'media/attachment/upload?response=json', name: 'userfile', responseType: 'json', onSubmit: function (file, ext) { @@ -236,7 +236,7 @@ var FileBrowser = { // Initialize justified Gallery initGallery: function () { - $('.fbrowser.photos .fbrowser-content-container').justifiedGallery({ + $('.fbrowser.photo .fbrowser-content-container').justifiedGallery({ rowHeight: 80, margins: 4, border: 0, diff --git a/view/theme/frio/templates/jot-header.tpl b/view/theme/frio/templates/jot-header.tpl index 61f92ff73..9ac56d27d 100644 --- a/view/theme/frio/templates/jot-header.tpl +++ b/view/theme/frio/templates/jot-header.tpl @@ -61,7 +61,7 @@ **/ /* callback */ - $('body').on('fbrowser.photos.main', function(e, filename, embedcode, id) { + $('body').on('fbrowser.photo.main', function(e, filename, embedcode, id) { ///@todo this part isn't ideal and need to be done in a better way jotTextOpenUI(document.getElementById("profile-jot-text")); jotActive(); diff --git a/view/theme/frio/templates/media/filebrowser.tpl b/view/theme/frio/templates/media/filebrowser.tpl index 7b24537ce..71974eeea 100644 --- a/view/theme/frio/templates/media/filebrowser.tpl +++ b/view/theme/frio/templates/media/filebrowser.tpl @@ -17,7 +17,7 @@ {{* Switch between image and file mode *}}