X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=mod%2Fwall_upload.php;h=ea06b1d1c1a2deefb5e3c48f1c3777e9cb54a19c;hb=ebdfe388def6f508775a3d60efab56dcf4adc30d;hp=a35e86a5297a098d75aa9d2a89e861e4bcc9470c;hpb=fd5d058156185c6c02c1285a794139d07f4d13ce;p=friendica.git diff --git a/mod/wall_upload.php b/mod/wall_upload.php index a35e86a529..5a23664ed8 100644 --- a/mod/wall_upload.php +++ b/mod/wall_upload.php @@ -1,56 +1,67 @@ . + * + * Module for uploading a picture to the profile wall * * By default the picture will be stored in the photo album with the name Wall Photos. * You can specify a different album by adding an optional query string "album=" * to the url + * */ use Friendica\App; -use Friendica\Core\Config; - -require_once 'include/Photo.php'; - -function wall_upload_post(App $a, $desktopmode = true) { - - logger("wall upload: starting new upload", LOGGER_DEBUG); - - $r_json = (x($_GET, 'response') && $_GET['response'] == 'json'); - $album = (x($_GET, 'album') ? notags(trim($_GET['album'])) : ''); - - if ($a->argc > 1) { - if (! x($_FILES, 'media')) { - $nick = $a->argv[1]; - $r = q("SELECT `user`.*, `contact`.`id` FROM `user` - INNER JOIN `contact` on `user`.`uid` = `contact`.`uid` - WHERE `user`.`nickname` = '%s' AND `user`.`blocked` = 0 - AND `contact`.`self` = 1 LIMIT 1", - dbesc($nick) - ); - - if (! dbm::is_result($r)) { +use Friendica\Core\Logger; +use Friendica\Core\Session; +use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Model\Photo; +use Friendica\Model\User; +use Friendica\Module\BaseApi; +use Friendica\Object\Image; +use Friendica\Util\Images; +use Friendica\Util\Strings; + +function wall_upload_post(App $a, $desktopmode = true) +{ + Logger::info("wall upload: starting new upload"); + + $r_json = (!empty($_GET['response']) && $_GET['response'] == 'json'); + $album = trim($_GET['album'] ?? ''); + + if (DI::args()->getArgc() > 1) { + if (empty($_FILES['media'])) { + $nick = DI::args()->getArgv()[1]; + $user = DBA::selectFirst('owner-view', ['id', 'uid', 'nickname', 'page-flags'], ['nickname' => $nick, 'blocked' => false]); + if (!DBA::isResult($user)) { if ($r_json) { - echo json_encode(array('error'=>t('Invalid request.'))); - killme(); + echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); + exit(); } return; } } else { - $user_info = api_get_user($a); - $r = q("SELECT `user`.*, `contact`.`id` FROM `user` - INNER JOIN `contact` on `user`.`uid` = `contact`.`uid` - WHERE `user`.`nickname` = '%s' AND `user`.`blocked` = 0 - AND `contact`.`self` = 1 LIMIT 1", - dbesc($user_info['screen_name']) - ); + $user = DBA::selectFirst('owner-view', ['id', 'uid', 'nickname', 'page-flags'], ['uid' => BaseApi::getCurrentUserID(), 'blocked' => false]); } } else { if ($r_json) { - echo json_encode(array('error'=>t('Invalid request.'))); - killme(); + echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); + exit(); } return; } @@ -61,273 +72,221 @@ function wall_upload_post(App $a, $desktopmode = true) { $can_post = false; $visitor = 0; - $page_owner_uid = $r[0]['uid']; - $default_cid = $r[0]['id']; - $page_owner_nick = $r[0]['nickname']; - $community_page = (($r[0]['page-flags'] == PAGE_COMMUNITY) ? true : false); + $page_owner_uid = $user['uid']; + $default_cid = $user['id']; + $page_owner_nick = $user['nickname']; + $community_page = (($user['page-flags'] == User::PAGE_FLAGS_COMMUNITY) ? true : false); if ((local_user()) && (local_user() == $page_owner_uid)) { $can_post = true; - } else { - if ($community_page && remote_user()) { - $contact_id = 0; - if (is_array($_SESSION['remote'])) { - foreach ($_SESSION['remote'] as $v) { - if ($v['uid'] == $page_owner_uid) { - $contact_id = $v['cid']; - break; - } - } - } - - if ($contact_id) { - $r = q("SELECT `uid` FROM `contact` - WHERE `blocked` = 0 AND `pending` = 0 - AND `id` = %d AND `uid` = %d LIMIT 1", - intval($contact_id), - intval($page_owner_uid) - ); - if (dbm::is_result($r)) { - $can_post = true; - $visitor = $contact_id; - } - } - } + } elseif ($community_page && !empty(Session::getRemoteContactID($page_owner_uid))) { + $contact_id = Session::getRemoteContactID($page_owner_uid); + $can_post = DBA::exists('contact', ['blocked' => false, 'pending' => false, 'id' => $contact_id, 'uid' => $page_owner_uid]); + $visitor = $contact_id; } - - if (! $can_post) { + if (!$can_post) { if ($r_json) { - echo json_encode(array('error'=>t('Permission denied.'))); - killme(); + echo json_encode(['error' => DI::l10n()->t('Permission denied.')]); + exit(); } - notice(t('Permission denied.') . EOL); - killme(); + notice(DI::l10n()->t('Permission denied.')); + exit(); } - if (! x($_FILES, 'userfile') && ! x($_FILES, 'media')) { + if (empty($_FILES['userfile']) && empty($_FILES['media'])) { if ($r_json) { - echo json_encode(array('error'=>t('Invalid request.'))); + echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); } - killme(); + exit(); } - $src = ""; - if (x($_FILES, 'userfile')) { + $src = ''; + $filename = ''; + $filesize = 0; + $filetype = ''; + if (!empty($_FILES['userfile'])) { $src = $_FILES['userfile']['tmp_name']; $filename = basename($_FILES['userfile']['name']); $filesize = intval($_FILES['userfile']['size']); $filetype = $_FILES['userfile']['type']; - } elseif (x($_FILES, 'media')) { - if (is_array($_FILES['media']['tmp_name'])) { - $src = $_FILES['media']['tmp_name'][0]; - } else { - $src = $_FILES['media']['tmp_name']; + } elseif (!empty($_FILES['media'])) { + if (!empty($_FILES['media']['tmp_name'])) { + if (is_array($_FILES['media']['tmp_name'])) { + $src = $_FILES['media']['tmp_name'][0]; + } else { + $src = $_FILES['media']['tmp_name']; + } } - if (is_array($_FILES['media']['name'])) { - $filename = basename($_FILES['media']['name'][0]); - } else { - $filename = basename($_FILES['media']['name']); + if (!empty($_FILES['media']['name'])) { + if (is_array($_FILES['media']['name'])) { + $filename = basename($_FILES['media']['name'][0]); + } else { + $filename = basename($_FILES['media']['name']); + } } - if (is_array($_FILES['media']['size'])) { - $filesize = intval($_FILES['media']['size'][0]); - } else { - $filesize = intval($_FILES['media']['size']); + if (!empty($_FILES['media']['size'])) { + if (is_array($_FILES['media']['size'])) { + $filesize = intval($_FILES['media']['size'][0]); + } else { + $filesize = intval($_FILES['media']['size']); + } } - if (is_array($_FILES['media']['type'])) { - $filetype = $_FILES['media']['type'][0]; - } else { - $filetype = $_FILES['media']['type']; + if (!empty($_FILES['media']['type'])) { + if (is_array($_FILES['media']['type'])) { + $filetype = $_FILES['media']['type'][0]; + } else { + $filetype = $_FILES['media']['type']; + } } } - if ($src=="") { + if ($src == "") { if ($r_json) { - echo json_encode(array('error'=>t('Invalid request.'))); - killme(); + echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); + exit(); } - notice(t('Invalid request.').EOL); - killme(); + notice(DI::l10n()->t('Invalid request.')); + exit(); } - // This is a special treatment for picture upload from Twidere - if (($filename == "octet-stream") && ($filetype != "")) { - $filename = $filetype; - $filetype = ""; - } - - if ($filetype=="") { - $filetype=guess_image_type($filename); - } + $filetype = Images::getMimeTypeBySource($src, $filename, $filetype); - // If there is a temp name, then do a manual check - // This is more reliable than the provided value - - $imagedata = getimagesize($src); - if ($imagedata) { - $filetype = $imagedata['mime']; - } + Logger::info("File upload src: " . $src . " - filename: " . $filename . + " - size: " . $filesize . " - type: " . $filetype); - logger("File upload src: " . $src . " - filename: " . $filename . - " - size: " . $filesize . " - type: " . $filetype, LOGGER_DEBUG); - - $maximagesize = Config::get('system', 'maximagesize'); + $imagedata = @file_get_contents($src); + $Image = new Image($imagedata, $filetype); - if (($maximagesize) && ($filesize > $maximagesize)) { - $msg = sprintf(t('Image exceeds size limit of %s'), formatBytes($maximagesize)); + if (!$Image->isValid()) { + $msg = DI::l10n()->t('Unable to process image.'); if ($r_json) { - echo json_encode(array('error'=>$msg)); + echo json_encode(['error' => $msg]); } else { echo $msg. EOL; } @unlink($src); - killme(); + exit(); } + $Image->orient($src); + @unlink($src); - $limit = service_class_fetch($page_owner_uid, 'photo_upload_limit'); + $max_length = DI::config()->get('system', 'max_image_length'); + if ($max_length > 0) { + $Image->scaleDown($max_length); + $filesize = strlen($Image->asString()); + Logger::info("File upload: Scaling picture to new size " . $max_length); + } + + $width = $Image->getWidth(); + $height = $Image->getHeight(); - if ($limit) { - $r = q("SELECT SUM(OCTET_LENGTH(`data`)) AS `total` FROM `photo` - WHERE `uid` = %d AND `scale` = 0 - AND `album` != 'Contact Photos' ", - intval($page_owner_uid) - ); - $size = $r[0]['total']; + $maximagesize = DI::config()->get('system', 'maximagesize'); - if (($size + strlen($imagedata)) > $limit) { - $msg = upgrade_message(true); + if (!empty($maximagesize) && ($filesize > $maximagesize)) { + // Scale down to multiples of 640 until the maximum size isn't exceeded anymore + foreach ([5120, 2560, 1280, 640] as $pixels) { + if (($filesize > $maximagesize) && (max($width, $height) > $pixels)) { + Logger::info('Resize', ['size' => $filesize, 'width' => $width, 'height' => $height, 'max' => $maximagesize, 'pixels' => $pixels]); + $Image->scaleDown($pixels); + $filesize = strlen($Image->asString()); + $width = $Image->getWidth(); + $height = $Image->getHeight(); + } + } + if ($filesize > $maximagesize) { + Logger::notice('Image size is too big', ['size' => $filesize, 'max' => $maximagesize]); + $msg = DI::l10n()->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize)); if ($r_json) { - echo json_encode(array('error'=>$msg)); + echo json_encode(['error' => $msg]); } else { echo $msg. EOL; } @unlink($src); - killme(); + exit(); } } - $imagedata = @file_get_contents($src); - $ph = new Photo($imagedata, $filetype); - - if (! $ph->is_valid()) { - $msg = t('Unable to process image.'); - if ($r_json) { - echo json_encode(array('error'=>$msg)); - } else { - echo $msg. EOL; - } - @unlink($src); - killme(); - } - - $ph->orient($src); - @unlink($src); - - $max_length = Config::get('system', 'max_image_length'); - if (! $max_length) { - $max_length = MAX_IMAGE_LENGTH; - } - if ($max_length > 0) { - $ph->scaleImage($max_length); - logger("File upload: Scaling picture to new size " . $max_length, LOGGER_DEBUG); - } - - $width = $ph->getWidth(); - $height = $ph->getHeight(); - - $hash = photo_new_resource(); + $resource_id = Photo::newResource(); $smallest = 0; // If we don't have an album name use the Wall Photos album - if (! strlen($album)) { - $album = t('Wall Photos'); + if (!strlen($album)) { + $album = DI::l10n()->t('Wall Photos'); } $defperm = '<' . $default_cid . '>'; - $r = $ph->store($page_owner_uid, $visitor, $hash, $filename, $album, 0, 0, $defperm); + $r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 0, Photo::DEFAULT, $defperm); - if (! $r) { - $msg = t('Image upload failed.'); + if (!$r) { + $msg = DI::l10n()->t('Image upload failed.'); if ($r_json) { - echo json_encode(array('error'=>$msg)); + echo json_encode(['error' => $msg]); } else { echo $msg. EOL; } - killme(); + exit(); } if ($width > 640 || $height > 640) { - $ph->scaleImage(640); - $r = $ph->store($page_owner_uid, $visitor, $hash, $filename, $album, 1, 0, $defperm); + $Image->scaleDown(640); + $r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 1, Photo::DEFAULT, $defperm); if ($r) { $smallest = 1; } } if ($width > 320 || $height > 320) { - $ph->scaleImage(320); - $r = $ph->store($page_owner_uid, $visitor, $hash, $filename, $album, 2, 0, $defperm); + $Image->scaleDown(320); + $r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 2, Photo::DEFAULT, $defperm); if ($r && ($smallest == 0)) { $smallest = 2; } } - $basename = basename($filename); - if (!$desktopmode) { - $r = q("SELECT `id`, `datasize`, `width`, `height`, `type` FROM `photo` - WHERE `resource-id` = '%s' - ORDER BY `width` DESC LIMIT 1", - $hash - ); - if (!$r) { + $photo = Photo::selectFirst(['id', 'datasize', 'width', 'height', 'type'], ['resource-id' => $resource_id], ['order' => ['width']]); + if (!$photo) { if ($r_json) { - echo json_encode(array('error'=>'')); - killme(); + echo json_encode(['error' => '']); + exit(); } return false; } - $picture = array(); + $picture = []; - $picture["id"] = $r[0]["id"]; - $picture["size"] = $r[0]["datasize"]; - $picture["width"] = $r[0]["width"]; - $picture["height"] = $r[0]["height"]; - $picture["type"] = $r[0]["type"]; - $picture["albumpage"] = App::get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash; - $picture["picture"] = App::get_baseurl() . "/photo/{$hash}-0." . $ph->getExt(); - $picture["preview"] = App::get_baseurl() . "/photo/{$hash}-{$smallest}." . $ph->getExt(); + $picture["id"] = $photo["id"]; + $picture["size"] = $photo["datasize"]; + $picture["width"] = $photo["width"]; + $picture["height"] = $photo["height"]; + $picture["type"] = $photo["type"]; + $picture["albumpage"] = DI::baseUrl() . '/photos/' . $page_owner_nick . '/image/' . $resource_id; + $picture["picture"] = DI::baseUrl() . "/photo/{$resource_id}-0." . $Image->getExt(); + $picture["preview"] = DI::baseUrl() . "/photo/{$resource_id}-{$smallest}." . $Image->getExt(); if ($r_json) { - echo json_encode(array('picture'=>$picture)); - killme(); + echo json_encode(['picture' => $picture]); + exit(); } + Logger::info("upload done"); return $picture; } + Logger::info("upload done"); if ($r_json) { - echo json_encode(array('ok'=>true)); - killme(); - } - -/* mod Waitman Gobble NO WARRANTY */ - // if we get the signal then return the image url info in BBCODE - if ($_REQUEST['hush']!='yeah') { - echo "\n\n" . '[url=' . App::get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . App::get_baseurl() . "/photo/{$hash}-{$smallest}.".$ph->getExt()."[/img][/url]\n\n"; - } else { - $m = '[url='.App::get_baseurl().'/photos/'.$page_owner_nick.'/image/'.$hash.'][img]'.App::get_baseurl()."/photo/{$hash}-{$smallest}.".$ph->getExt()."[/img][/url]"; - return($m); + echo json_encode(['ok' => true]); + exit(); } -/* mod Waitman Gobble NO WARRANTY */ - killme(); + echo "\n\n" . '[url=' . DI::baseUrl() . '/photos/' . $page_owner_nick . '/image/' . $resource_id . '][img]' . DI::baseUrl() . "/photo/{$resource_id}-{$smallest}.".$Image->getExt()."[/img][/url]\n\n"; + exit(); // NOTREACHED }