diff --git a/mod/cal.php b/mod/cal.php index ebf78e77f6..070cadf3d5 100644 --- a/mod/cal.php +++ b/mod/cal.php @@ -28,6 +28,7 @@ use Friendica\Content\Nav; use Friendica\Content\Widget; use Friendica\Core\Renderer; use Friendica\Core\Session; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Event; @@ -216,8 +217,7 @@ function cal_content(App $a) $events = Event::prepareListForTemplate($r); if (!empty(DI::args()->getArgv()[2]) && (DI::args()->getArgv()[2] === 'json')) { - echo json_encode($events); - exit(); + System::jsonExit($events); } // links: array('href', 'text', 'extra css classes', 'title') diff --git a/mod/msearch.php b/mod/msearch.php index d29a2fc647..00a72ea9f7 100644 --- a/mod/msearch.php +++ b/mod/msearch.php @@ -20,6 +20,7 @@ */ use Friendica\App; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\User; @@ -37,8 +38,7 @@ function msearch_post(App $a) if (!strlen($search)) { $output = ['total' => 0, 'items_page' => $perpage, 'page' => $page, 'results' => $results]; - echo json_encode($output); - exit(); + System::jsonExit($output); } $total = 0; @@ -60,7 +60,5 @@ function msearch_post(App $a) $output = ['total' => $total, 'items_page' => $perpage, 'page' => $page, 'results' => $results]; - echo json_encode($output); - - exit(); + System::jsonExit($output); } diff --git a/mod/poco.php b/mod/poco.php index 1ccd74b7f1..09ee25a1ff 100644 --- a/mod/poco.php +++ b/mod/poco.php @@ -25,10 +25,10 @@ use Friendica\Content\Text\BBCode; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Core\Renderer; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Util\DateTimeFormat; -use Friendica\Util\Strings; use Friendica\Util\XML; function poco_init(App $a) { @@ -234,9 +234,7 @@ function poco_init(App $a) { exit(); } if ($format === 'json') { - header('Content-type: application/json'); - echo json_encode($ret); - exit(); + System::jsonExit($ret); } else { throw new \Friendica\Network\HTTPException\InternalServerErrorException(); } diff --git a/mod/wall_attach.php b/mod/wall_attach.php index 98dc3e1cba..607d0fe7a3 100644 --- a/mod/wall_attach.php +++ b/mod/wall_attach.php @@ -21,6 +21,7 @@ use Friendica\App; use Friendica\Core\Session; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Attach; @@ -36,15 +37,13 @@ function wall_attach_post(App $a) { $owner = User::getOwnerDataByNick($nick); if (!DBA::isResult($owner)) { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); - exit(); + System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]); } return; } } else { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); - exit(); + System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]); } return; @@ -65,8 +64,7 @@ function wall_attach_post(App $a) { if (!$can_post) { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Permission denied.')]); - exit(); + System::jsonExit(['error' => DI::l10n()->t('Permission denied.')]); } notice(DI::l10n()->t('Permission denied.') . EOL ); exit(); @@ -74,7 +72,7 @@ function wall_attach_post(App $a) { if (empty($_FILES['userfile'])) { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); + System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]); } exit(); } @@ -93,23 +91,23 @@ function wall_attach_post(App $a) { if ($filesize <= 0) { $msg = DI::l10n()->t('Sorry, maybe your upload is bigger than the PHP configuration allows') . EOL .(DI::l10n()->t('Or - did you try to upload an empty file?')); + @unlink($src); if ($r_json) { - echo json_encode(['error' => $msg]); + System::jsonExit(['error' => $msg]); } else { notice($msg); } - @unlink($src); exit(); } if ($maxfilesize && $filesize > $maxfilesize) { $msg = DI::l10n()->t('File exceeds size limit of %s', Strings::formatBytes($maxfilesize)); + @unlink($src); if ($r_json) { - echo json_encode(['error' => $msg]); + System::jsonExit(['error' => $msg]); } else { echo $msg . EOL; } - @unlink($src); exit(); } @@ -120,7 +118,7 @@ function wall_attach_post(App $a) { if ($newid === false) { $msg = DI::l10n()->t('File upload failed.'); if ($r_json) { - echo json_encode(['error' => $msg]); + System::jsonExit(['error' => $msg]); } else { echo $msg . EOL; } @@ -128,8 +126,7 @@ function wall_attach_post(App $a) { } if ($r_json) { - echo json_encode(['ok' => true, 'id' => $newid]); - exit(); + System::jsonExit(['ok' => true, 'id' => $newid]); } $lf = "\n"; diff --git a/mod/wall_upload.php b/mod/wall_upload.php index a9828e61f9..79f1dcc41f 100644 --- a/mod/wall_upload.php +++ b/mod/wall_upload.php @@ -28,6 +28,7 @@ use Friendica\App; use Friendica\Core\Logger; use Friendica\Core\Session; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Photo; @@ -50,8 +51,7 @@ function wall_upload_post(App $a, $desktopmode = true) $user = DBA::selectFirst('owner-view', ['id', 'uid', 'nickname', 'page-flags'], ['nickname' => $nick, 'blocked' => false]); if (!DBA::isResult($user)) { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); - exit(); + System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]); } return; } @@ -60,8 +60,7 @@ function wall_upload_post(App $a, $desktopmode = true) } } else { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); - exit(); + System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]); } return; } @@ -87,8 +86,7 @@ function wall_upload_post(App $a, $desktopmode = true) if (!$can_post) { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Permission denied.')]); - exit(); + System::jsonExit(['error' => DI::l10n()->t('Permission denied.')]); } notice(DI::l10n()->t('Permission denied.')); exit(); @@ -96,7 +94,7 @@ function wall_upload_post(App $a, $desktopmode = true) if (empty($_FILES['userfile']) && empty($_FILES['media'])) { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); + System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]); } exit(); } @@ -147,8 +145,7 @@ function wall_upload_post(App $a, $desktopmode = true) if ($src == "") { if ($r_json) { - echo json_encode(['error' => DI::l10n()->t('Invalid request.')]); - exit(); + System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]); } notice(DI::l10n()->t('Invalid request.')); exit(); @@ -164,12 +161,12 @@ function wall_upload_post(App $a, $desktopmode = true) if (!$Image->isValid()) { $msg = DI::l10n()->t('Unable to process image.'); + @unlink($src); if ($r_json) { - echo json_encode(['error' => $msg]); + System::jsonExit(['error' => $msg]); } else { echo $msg. EOL; } - @unlink($src); exit(); } @@ -202,12 +199,12 @@ function wall_upload_post(App $a, $desktopmode = true) 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)); + @unlink($src); if ($r_json) { - echo json_encode(['error' => $msg]); + System::jsonExit(['error' => $msg]); } else { echo $msg. EOL; } - @unlink($src); exit(); } } @@ -228,7 +225,7 @@ function wall_upload_post(App $a, $desktopmode = true) if (!$r) { $msg = DI::l10n()->t('Image upload failed.'); if ($r_json) { - echo json_encode(['error' => $msg]); + System::jsonExit(['error' => $msg]); } else { echo $msg. EOL; } @@ -255,8 +252,7 @@ function wall_upload_post(App $a, $desktopmode = true) $photo = Photo::selectFirst(['id', 'datasize', 'width', 'height', 'type'], ['resource-id' => $resource_id], ['order' => ['width']]); if (!$photo) { if ($r_json) { - echo json_encode(['error' => '']); - exit(); + System::jsonExit(['error' => '']); } return false; } @@ -272,8 +268,7 @@ function wall_upload_post(App $a, $desktopmode = true) $picture["preview"] = DI::baseUrl() . "/photo/{$resource_id}-{$smallest}." . $Image->getExt(); if ($r_json) { - echo json_encode(['picture' => $picture]); - exit(); + System::jsonExit(['picture' => $picture]); } Logger::info("upload done"); return $picture; @@ -282,8 +277,7 @@ function wall_upload_post(App $a, $desktopmode = true) Logger::info("upload done"); if ($r_json) { - echo json_encode(['ok' => true]); - exit(); + System::jsonExit(['ok' => true]); } 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"; diff --git a/src/Core/System.php b/src/Core/System.php index 16bc2360ef..3ef94a74c5 100644 --- a/src/Core/System.php +++ b/src/Core/System.php @@ -339,7 +339,7 @@ class System * @param integer $options JSON options * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function jsonExit($x, $content_type = 'application/json', int $options = 0) { + public static function jsonExit($x, $content_type = 'application/json', int $options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) { DI::apiResponse()->setType(Response::TYPE_JSON, $content_type); DI::apiResponse()->addContent(json_encode($x, $options)); DI::page()->exit(DI::apiResponse()->generate()); diff --git a/src/Module/AccountManagementControlDocument.php b/src/Module/AccountManagementControlDocument.php index cd17f758b4..82997161d1 100644 --- a/src/Module/AccountManagementControlDocument.php +++ b/src/Module/AccountManagementControlDocument.php @@ -22,6 +22,7 @@ namespace Friendica\Module; use Friendica\BaseModule; +use Friendica\Core\System; /** * Static definition for the Firefox Account Manager @@ -78,7 +79,6 @@ class AccountManagementControlDocument extends BaseModule ], ]; - echo json_encode($output); - exit(); + System::jsonExit($output); } } diff --git a/src/Module/ActivityPub/Featured.php b/src/Module/ActivityPub/Featured.php index 2279ec1793..a4b8c3fef1 100644 --- a/src/Module/ActivityPub/Featured.php +++ b/src/Module/ActivityPub/Featured.php @@ -44,7 +44,8 @@ class Featured extends BaseModule $page = $request['page'] ?? null; - $outbox = ActivityPub\Transmitter::getFeatured($owner, $page); - System::jsonExit($outbox, 'application/activity+json'); + $featured = ActivityPub\Transmitter::getFeatured($owner, $page); + + System::jsonExit($featured, 'application/activity+json'); } } diff --git a/src/Module/ActivityPub/Followers.php b/src/Module/ActivityPub/Followers.php index 54584de182..b04d1976e0 100644 --- a/src/Module/ActivityPub/Followers.php +++ b/src/Module/ActivityPub/Followers.php @@ -22,6 +22,7 @@ namespace Friendica\Module\ActivityPub; use Friendica\BaseModule; +use Friendica\Core\System; use Friendica\Model\Contact; use Friendica\Model\User; use Friendica\Protocol\ActivityPub; @@ -48,8 +49,6 @@ class Followers extends BaseModule $followers = ActivityPub\Transmitter::getContacts($owner, [Contact::FOLLOWER, Contact::FRIEND], 'followers', $page, (string)HTTPSignature::getSigner('', $_SERVER)); - header('Content-Type: application/activity+json'); - echo json_encode($followers); - exit(); + System::jsonExit($followers, 'application/activity+json'); } } diff --git a/src/Module/ActivityPub/Following.php b/src/Module/ActivityPub/Following.php index 67d3010a3a..e3ae10e87e 100644 --- a/src/Module/ActivityPub/Following.php +++ b/src/Module/ActivityPub/Following.php @@ -22,6 +22,7 @@ namespace Friendica\Module\ActivityPub; use Friendica\BaseModule; +use Friendica\Core\System; use Friendica\Model\Contact; use Friendica\Model\User; use Friendica\Protocol\ActivityPub; @@ -46,8 +47,6 @@ class Following extends BaseModule $following = ActivityPub\Transmitter::getContacts($owner, [Contact::SHARING, Contact::FRIEND], 'following', $page); - header('Content-Type: application/activity+json'); - echo json_encode($following); - exit(); + System::jsonExit($following, 'application/activity+json'); } } diff --git a/src/Module/ActivityPub/Inbox.php b/src/Module/ActivityPub/Inbox.php index b16eb9fd40..a9858d94c8 100644 --- a/src/Module/ActivityPub/Inbox.php +++ b/src/Module/ActivityPub/Inbox.php @@ -50,7 +50,7 @@ class Inbox extends BaseModule $filename = 'failed-activitypub'; } $tempfile = tempnam(System::getTempPath(), $filename); - file_put_contents($tempfile, json_encode(['parameters' => $this->parameters, 'header' => $_SERVER, 'body' => $postdata], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); + file_put_contents($tempfile, json_encode(['parameters' => $this->parameters, 'header' => $_SERVER, 'body' => $postdata], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); Logger::notice('Incoming message stored', ['file' => $tempfile]); } diff --git a/src/Module/ActivityPub/Objects.php b/src/Module/ActivityPub/Objects.php index f3a37b7dad..d52c02bef2 100644 --- a/src/Module/ActivityPub/Objects.php +++ b/src/Module/ActivityPub/Objects.php @@ -31,7 +31,6 @@ use Friendica\Model\Item; use Friendica\Model\Post; use Friendica\Network\HTTPException; use Friendica\Protocol\ActivityPub; -use Friendica\Security\PermissionSet\Repository\PermissionSet; use Friendica\Util\HTTPSignature; use Friendica\Util\Network; use Friendica\Util\Strings; @@ -130,6 +129,7 @@ class Objects extends BaseModule // Relaxed CORS header for public items header('Access-Control-Allow-Origin: *'); + System::jsonExit($data, 'application/activity+json'); } } diff --git a/src/Module/ActivityPub/Outbox.php b/src/Module/ActivityPub/Outbox.php index 3fa143cfbd..4bc1ca6930 100644 --- a/src/Module/ActivityPub/Outbox.php +++ b/src/Module/ActivityPub/Outbox.php @@ -22,6 +22,7 @@ namespace Friendica\Module\ActivityPub; use Friendica\BaseModule; +use Friendica\Core\System; use Friendica\Model\User; use Friendica\Protocol\ActivityPub; use Friendica\Util\HTTPSignature; @@ -46,8 +47,7 @@ class Outbox extends BaseModule $requester = HTTPSignature::getSigner('', $_SERVER); $outbox = ActivityPub\Transmitter::getOutbox($owner, $page, $requester); - header('Content-Type: application/activity+json'); - echo json_encode($outbox); - exit(); + + System::jsonExit($outbox, 'application/activity+json'); } } diff --git a/src/Module/Events/Json.php b/src/Module/Events/Json.php index 8c6192e0a8..dac6e5c1b3 100644 --- a/src/Module/Events/Json.php +++ b/src/Module/Events/Json.php @@ -21,6 +21,7 @@ namespace Friendica\Module\Events; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Event; @@ -94,9 +95,7 @@ class Json extends \Friendica\BaseModule $events = self::map($events); } - header('Content-Type: application/json'); - echo json_encode($events); - exit(); + System::jsonExit($events); } private static function map(array $events): array diff --git a/src/Module/Friendica.php b/src/Module/Friendica.php index 3fccda5f85..c5a66fa3d5 100644 --- a/src/Module/Friendica.php +++ b/src/Module/Friendica.php @@ -182,8 +182,6 @@ class Friendica extends BaseModule 'no_scrape_url' => DI::baseUrl()->get() . '/noscrape', ]; - header('Content-type: application/json; charset=utf-8'); - echo json_encode($data); - exit(); + System::jsonExit($data); } } diff --git a/src/Module/Search/Acl.php b/src/Module/Search/Acl.php index f00c9f9ecb..88b1788dea 100644 --- a/src/Module/Search/Acl.php +++ b/src/Module/Search/Acl.php @@ -27,6 +27,7 @@ use Friendica\Core\Hook; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Core\Search; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; @@ -61,8 +62,7 @@ class Acl extends BaseModule $o = self::regularContactSearch($type); } - echo json_encode($o); - exit; + System::jsonExit($o); } private static function globalContactSearch() diff --git a/src/Module/Statistics.php b/src/Module/Statistics.php index 88b01e255e..db145bd430 100644 --- a/src/Module/Statistics.php +++ b/src/Module/Statistics.php @@ -26,6 +26,7 @@ use Friendica\BaseModule; use Friendica\Core\Addon; use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\L10n; +use Friendica\Core\System; use Friendica\Network\HTTPException\NotFoundException; use Friendica\Util\Profiler; use Psr\Log\LoggerInterface; @@ -78,9 +79,7 @@ class Statistics extends BaseModule 'services' => $services, ], $services); - header("Content-Type: application/json"); - echo json_encode($statistics, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); $this->logger->debug("statistics.", ['statistics' => $statistics]); - exit(); + System::jsonExit($statistics); } } diff --git a/src/Module/ThemeDetails.php b/src/Module/ThemeDetails.php index cc5b751546..6398a00c99 100644 --- a/src/Module/ThemeDetails.php +++ b/src/Module/ThemeDetails.php @@ -22,6 +22,7 @@ namespace Friendica\Module; use Friendica\BaseModule; +use Friendica\Core\System; use Friendica\Core\Theme; /** @@ -40,7 +41,7 @@ class ThemeDetails extends BaseModule $version = $info['version'] ?? ''; $credits = $info['credits'] ?? ''; - echo json_encode([ + System::jsonExit([ 'img' => Theme::getScreenshot($theme), 'desc' => $description, 'version' => $version, diff --git a/src/Module/WellKnown/NodeInfo.php b/src/Module/WellKnown/NodeInfo.php index d34823bb43..0feb5e3792 100644 --- a/src/Module/WellKnown/NodeInfo.php +++ b/src/Module/WellKnown/NodeInfo.php @@ -22,6 +22,7 @@ namespace Friendica\Module\WellKnown; use Friendica\BaseModule; +use Friendica\Core\System; use Friendica\DI; /** @@ -51,8 +52,6 @@ class NodeInfo extends BaseModule ] ]; - header('Content-type: application/json; charset=utf-8'); - echo json_encode($nodeinfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - exit; + System::jsonExit($nodeinfo); } } diff --git a/src/Module/WellKnown/XSocialRelay.php b/src/Module/WellKnown/XSocialRelay.php index bf767a3e7b..d89d08e083 100644 --- a/src/Module/WellKnown/XSocialRelay.php +++ b/src/Module/WellKnown/XSocialRelay.php @@ -22,6 +22,7 @@ namespace Friendica\Module\WellKnown; use Friendica\BaseModule; +use Friendica\Core\System; use Friendica\DI; use Friendica\Model\Search; use Friendica\Protocol\Relay; @@ -76,8 +77,6 @@ class XSocialRelay extends BaseModule $relay['protocols']['diaspora'] = ['receive' => DI::baseUrl()->get() . '/receive/public']; } - header('Content-type: application/json; charset=utf-8'); - echo json_encode($relay, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - exit; + System::jsonExit($relay); } } diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index caf97231fe..6797330442 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -802,7 +802,7 @@ class Receiver } $tempfile = tempnam(System::getTempPath(), $file); - file_put_contents($tempfile, json_encode(['activity' => $activity, 'body' => $body, 'uid' => $uid, 'trust_source' => $trust_source, 'push' => $push, 'signer' => $signer, 'object_data' => $object_data], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); + file_put_contents($tempfile, json_encode(['activity' => $activity, 'body' => $body, 'uid' => $uid, 'trust_source' => $trust_source, 'push' => $push, 'signer' => $signer, 'object_data' => $object_data], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); Logger::notice('Unknown activity stored', ['type' => $type, 'object_type' => $object_data['object_type'], $object_data['object_object_type'] ?? '', 'file' => $tempfile]); }