mirror of
https://code.castopod.org/adaures/castopod
synced 2025-04-23 01:01:20 +00:00

- add "ActivityPub" library to handle server to server federation and basic client to server protocols using activitypub: - add webfinger endpoint to look for actor - add actor definition with inbox / outbox / followers - remote follow an actor - create notes with possible preview cards - interract with favourites, reblogs and replies - block incoming actors and/or domains - broadcast/schedule activities to fediverse followers using a cron task - For castopod, the podcast is the actor: - overwrite the activitypub library for castopod's specific needs - perform basic interactions administrating a podcast to interact with fediverse users: - create notes with episode attachment - favourite and share a note + reply - add specific castopod_namespaces for podcasts and episodes definitions - overwrite CodeIgniter's Route service to include alternate-content option for activitystream requests - update episode publication logic: - remove publication inputs in create / edit episode form - publish / schedule or unpublish an episode after creation - the podcaster publishes a note when publishing an episode - Javascript / Typescript modules: - fix Dropdown.ts to keep dropdown menu in foreground - add Modal.ts for funding links modal - add Toggler.ts to toggle various css states in ui - User Interface: - update tailwindcss to v2 - use castopod's pine and rose colors - update public layout to a 3 column layout - add pages in public for podcast activity, episode list and notes - update episode page to include linked notes - remove previous and next episodes from episode pages - show different public views depending on whether user is authenticated or not - use Kumbh Sans and Montserrat fonts - update CodeIgniter's config files - with CodeIgniter's new requirements, update docker environments are now based on php v7.3 image - move Image entity to Libraries - update composer and npm packages to latest versions closes #69 #65 #85, fixes #51 #91 #92 #88
423 lines
10 KiB
PHP
423 lines
10 KiB
PHP
<?php $error_id = uniqid('error', true); ?>
|
|
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="robots" content="noindex">
|
|
|
|
<title><?= esc($title) ?></title>
|
|
<style type="text/css">
|
|
<?= preg_replace(
|
|
'#[\r\n\t ]+#',
|
|
' ',
|
|
file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')
|
|
) ?>
|
|
</style>
|
|
|
|
<script type="text/javascript">
|
|
<?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?>
|
|
</script>
|
|
</head>
|
|
<body onload="init()">
|
|
|
|
<!-- Header -->
|
|
<div class="header">
|
|
<div class="container">
|
|
<h1><?= esc($title),
|
|
esc($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>
|
|
<p>
|
|
<?= esc($exception->getMessage()) ?>
|
|
<a href="https://www.google.com/search?q=<?= urlencode(
|
|
$title .
|
|
' ' .
|
|
preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage())
|
|
) ?>"
|
|
rel="noreferrer" target="_blank">search →</a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Source -->
|
|
<div class="container">
|
|
<p><b><?= esc(static::cleanPath($file, $line)) ?></b> at line <b><?= esc(
|
|
$line
|
|
) ?></b></p>
|
|
|
|
<?php if (is_file($file)): ?>
|
|
<div class="source">
|
|
<?= static::highlightFile($file, $line, 15) ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<div class="container">
|
|
|
|
<ul class="tabs" id="tabs">
|
|
<li><a href="#backtrace">Backtrace</a></li>
|
|
<li><a href="#server">Server</a></li>
|
|
<li><a href="#request">Request</a></li>
|
|
<li><a href="#response">Response</a></li>
|
|
<li><a href="#files">Files</a></li>
|
|
<li><a href="#memory">Memory</a></li>
|
|
</li>
|
|
</ul>
|
|
|
|
<div class="tab-content">
|
|
|
|
<!-- Backtrace -->
|
|
<div class="content" id="backtrace">
|
|
|
|
<ol class="trace">
|
|
<?php foreach ($trace as $index => $row): ?>
|
|
|
|
<li>
|
|
<p>
|
|
<!-- Trace info -->
|
|
<?php if (isset($row['file']) && is_file($row['file'])): ?>
|
|
<?php if (
|
|
isset($row['function']) &&
|
|
in_array(
|
|
$row['function'],
|
|
['include', 'include_once', 'require', 'require_once'],
|
|
true
|
|
)
|
|
) {
|
|
echo esc($row['function'] . ' ' . static::cleanPath($row['file']));
|
|
} else {
|
|
echo esc(static::cleanPath($row['file']) . ' : ' . $row['line']);
|
|
} ?>
|
|
<?php else: ?>
|
|
{PHP internal code}
|
|
<?php endif; ?>
|
|
|
|
<!-- Class/Method -->
|
|
<?php if (isset($row['class'])): ?>
|
|
— <?= esc(
|
|
$row['class'] . $row['type'] . $row['function']
|
|
) ?>
|
|
<?php if (!empty($row['args'])): ?>
|
|
<?php $args_id = $error_id . 'args' . $index; ?>
|
|
( <a href="#" onclick="return toggle('<?= esc(
|
|
$args_id,
|
|
'attr'
|
|
) ?>');">arguments</a> )
|
|
<div class="args" id="<?= esc($args_id, 'attr') ?>">
|
|
<table cellspacing="0">
|
|
|
|
<?php
|
|
$params = null;
|
|
// Reflection by name is not available for closure function
|
|
if (substr($row['function'], -1) !== '}') {
|
|
$mirror = isset($row['class'])
|
|
? new \ReflectionMethod($row['class'], $row['function'])
|
|
: new \ReflectionFunction($row['function']);
|
|
$params = $mirror->getParameters();
|
|
}
|
|
foreach ($row['args'] as $key => $value): ?>
|
|
<tr>
|
|
<td><code><?= esc(
|
|
isset($params[$key]) ? '$' . $params[$key]->name : "#$key"
|
|
) ?></code></td>
|
|
<td><pre><?= esc(print_r($value, true)) ?></pre></td>
|
|
</tr>
|
|
<?php endforeach;
|
|
?>
|
|
|
|
</table>
|
|
</div>
|
|
<?php else: ?>
|
|
()
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
|
|
<?php if (!isset($row['class']) && isset($row['function'])): ?>
|
|
— <?= esc($row['function']) ?>()
|
|
<?php endif; ?>
|
|
</p>
|
|
|
|
<!-- Source? -->
|
|
<?php if (
|
|
isset($row['file']) &&
|
|
is_file($row['file']) &&
|
|
isset($row['class'])
|
|
): ?>
|
|
<div class="source">
|
|
<?= static::highlightFile($row['file'], $row['line']) ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</li>
|
|
|
|
<?php endforeach; ?>
|
|
</ol>
|
|
|
|
</div>
|
|
|
|
<!-- Server -->
|
|
<div class="content" id="server">
|
|
<?php foreach (['_SERVER', '_SESSION'] as $var): ?>
|
|
<?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) {
|
|
continue;
|
|
} ?>
|
|
|
|
<h3>$<?= esc($var) ?></h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Key</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($GLOBALS[$var] as $key => $value): ?>
|
|
<tr>
|
|
<td><?= esc($key) ?></td>
|
|
<td>
|
|
<?php if (is_string($value)): ?>
|
|
<?= esc($value) ?>
|
|
<?php else: ?>
|
|
<pre><?= esc(print_r($value, true)) ?></pre>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<?php endforeach; ?>
|
|
|
|
<!-- Constants -->
|
|
<?php $constants = get_defined_constants(true); ?>
|
|
<?php if (!empty($constants['user'])): ?>
|
|
<h3>Constants</h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Key</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($constants['user'] as $key => $value): ?>
|
|
<tr>
|
|
<td><?= esc($key) ?></td>
|
|
<td>
|
|
<?php if (is_string($value)): ?>
|
|
<?= esc($value) ?>
|
|
<?php else: ?>
|
|
<pre><?= esc(print_r($value, true)) ?></pre>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<!-- Request -->
|
|
<div class="content" id="request">
|
|
<?php $request = \Config\Services::request(); ?>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td style="width: 10em">Path</td>
|
|
<td><?= esc($request->uri) ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>HTTP Method</td>
|
|
<td><?= esc($request->getMethod(true)) ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>IP Address</td>
|
|
<td><?= esc($request->getIPAddress()) ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td style="width: 10em">Is AJAX Request?</td>
|
|
<td><?= $request->isAJAX() ? 'yes' : 'no' ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Is CLI Request?</td>
|
|
<td><?= $request->isCLI() ? 'yes' : 'no' ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Is Secure Request?</td>
|
|
<td><?= $request->isSecure() ? 'yes' : 'no' ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>User Agent</td>
|
|
<td><?= esc($request->getUserAgent()->getAgentString()) ?></td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<?php $empty = true; ?>
|
|
<?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?>
|
|
<?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) {
|
|
continue;
|
|
} ?>
|
|
|
|
<?php $empty = false; ?>
|
|
|
|
<h3>$<?= esc($var) ?></h3>
|
|
|
|
<table style="width: 100%">
|
|
<thead>
|
|
<tr>
|
|
<th>Key</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($GLOBALS[$var] as $key => $value): ?>
|
|
<tr>
|
|
<td><?= esc($key) ?></td>
|
|
<td>
|
|
<?php if (is_string($value)): ?>
|
|
<?= esc($value) ?>
|
|
<?php else: ?>
|
|
<pre><?= esc(print_r($value, true)) ?></pre>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<?php endforeach; ?>
|
|
|
|
<?php if ($empty): ?>
|
|
|
|
<div class="alert">
|
|
No $_GET, $_POST, or $_COOKIE Information to show.
|
|
</div>
|
|
|
|
<?php endif; ?>
|
|
|
|
<?php $headers = $request->getHeaders(); ?>
|
|
<?php if (!empty($headers)): ?>
|
|
|
|
<h3>Headers</h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Header</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($headers as $value): ?>
|
|
<?php if (empty($value)) {
|
|
continue;
|
|
} ?>
|
|
<?php if (!is_array($value)) {
|
|
$value = [$value];
|
|
} ?>
|
|
<?php foreach ($value as $h): ?>
|
|
<tr>
|
|
<td><?= esc($h->getName(), 'html') ?></td>
|
|
<td><?= esc($h->getValueLine(), 'html') ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<!-- Response -->
|
|
<?php
|
|
$response = \Config\Services::response();
|
|
$response->setStatusCode(http_response_code());
|
|
?>
|
|
<div class="content" id="response">
|
|
<table>
|
|
<tr>
|
|
<td style="width: 15em">Response Status</td>
|
|
<td><?= esc($response->getStatusCode() . ' - ' . $response->getReason()) ?></td>
|
|
</tr>
|
|
</table>
|
|
|
|
<?php $headers = $response->getHeaders(); ?>
|
|
<?php if (!empty($headers)): ?>
|
|
<?php natsort($headers); ?>
|
|
|
|
<h3>Headers</h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Header</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($headers as $name => $value): ?>
|
|
<tr>
|
|
<td><?= esc($name, 'html') ?></td>
|
|
<td><?= esc($response->getHeaderLine($name), 'html') ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<!-- Files -->
|
|
<div class="content" id="files">
|
|
<?php $files = get_included_files(); ?>
|
|
|
|
<ol>
|
|
<?php foreach ($files as $file): ?>
|
|
<li><?= esc(static::cleanPath($file)) ?></li>
|
|
<?php endforeach; ?>
|
|
</ol>
|
|
</div>
|
|
|
|
<!-- Memory -->
|
|
<div class="content" id="memory">
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td>Memory Usage</td>
|
|
<td><?= esc(static::describeMemory(memory_get_usage(true))) ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td style="width: 12em">Peak Memory Usage:</td>
|
|
<td><?= esc(static::describeMemory(memory_get_peak_usage(true))) ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Memory Limit:</td>
|
|
<td><?= esc(ini_get('memory_limit')) ?></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
</div>
|
|
|
|
</div> <!-- /tab-content -->
|
|
|
|
</div> <!-- /container -->
|
|
|
|
<div class="footer">
|
|
<div class="container">
|
|
|
|
<p>
|
|
Displayed at <?= esc(date('H:i:sa')) ?> —
|
|
PHP: <?= esc(phpversion()) ?> —
|
|
CodeIgniter: <?= esc(\CodeIgniter\CodeIgniter::CI_VERSION) ?>
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|