Source Code
The entire project, readable in your browser. No hidden JavaScript, no sneaky beacons. If we claimed we don't track you, this is where you check.
|
Pages/
Feeds/
Backend/
Includes/
Stylesheet/
JavaScript/
data/counter.txt and data/guestbook.txt hold visitor-supplied content
(a number and signed messages), so they are not shown here.
|
1 <?php 2 /** 3 * footer.php 4 * ----------------------------------------------------------------------------- 5 * Shared bottom-of-page markup. Closes the .content / .wrap containers opened 6 * in header.php and closes the document. 7 * 8 * Contains: 9 * - the "this site stores absolutely nothing" promise 10 * - links to RSS / Sitemap / robots.txt / Guestbook 11 * - the classic row of 88x31 buttons (rendered as pure-CSS boxes) 12 * - an "Under Construction" easter egg (hidden; revealed via the #dig anchor 13 * or the Konami code) 14 * - a small GLOBAL inline script that every page needs: 15 * * live-ticking server + UTC clocks 16 * * CRT scanline toggle (persisted in localStorage) 17 * * Konami-code easter egg 18 * 19 * Page-specific behaviour (detection, fingerprinting, the scan animation, the 20 * terminal, exports) is loaded by the individual pages that need it. 21 * ----------------------------------------------------------------------------- 22 */ 23 24 require_once __DIR__ . '/config.php'; 25 require_once __DIR__ . '/functions.php'; 26 27 $__buttons = isset($GLOBALS['BUTTONS_88x31']) ? $GLOBALS['BUTTONS_88x31'] : array(); 28 29 // Server epoch handed to JS so the live clock stays anchored to server time 30 // (and computes the offset from the browser clock once, on load). 31 $__server_epoch = time(); 32 ?> 33 </div><!-- /.content --> 34 35 <!-- ============================ EASTER EGG ========================= --> 36 <div id="dig" class="under-construction" style="display:none"> 37 <div class="digger">///// U N D E R C O N S T R U C T I O N /////</div> 38 <div><?php echo section_icon('warning', '#FFFF00', 16); ?> 39 Pardon our dust. A little man with a shovel is working here. 40 <?php echo section_icon('warning', '#FFFF00', 16); ?></div> 41 <div class="dim">(You found the hidden page. There is nothing else here. Go outside.)</div> 42 <div><a href="#top" onclick="document.getElementById('dig').style.display='none';return false;">[ close ]</a></div> 43 </div> 44 45 <!-- ============================ FOOTER ============================= --> 46 <div class="footer"> 47 <hr class="double"> 48 49 <p class="promise"> 50 This website stores <b>absolutely nothing</b>. 51 </p> 52 <p> 53 Everything shown is calculated locally in your browser, or derived from 54 information your browser <b>automatically sent</b> when it asked for this page. 55 </p> 56 <p class="dim"> 57 No tracking. No analytics. No cookies. No database. 58 Made with PHP. Open Source. 59 </p> 60 <p>Last Updated: <b><?php echo e(LAST_UPDATED); ?></b></p> 61 62 <hr> 63 64 <!-- Utility links, web-1.0 style --> 65 <p> 66 <a href="<?php echo eattr(url('index.php')); ?>">Home</a> · 67 <a href="<?php echo eattr(url('about.php')); ?>">About</a> · 68 <a href="<?php echo eattr(url('privacy.php')); ?>">Privacy</a> · 69 <a href="<?php echo eattr(url('source.php')); ?>">Source</a> · 70 <a href="<?php echo eattr(url('guestbook.php')); ?>">Guestbook</a> · 71 <a href="<?php echo eattr(url('rss.php')); ?>">RSS</a> · 72 <a href="<?php echo eattr(url('sitemap.php')); ?>">Sitemap</a> · 73 <a href="<?php echo eattr(url('robots.txt')); ?>">robots.txt</a> 74 </p> 75 76 <!-- Author links + donation --> 77 <div class="author-links"> 78 <div class="al-links"> 79 <a href="<?php echo eattr(WEBSITE_URL); ?>" target="_blank" rel="noopener noreferrer">[ My Website — h4x0r.icu ]</a> 80 · 81 <a href="<?php echo eattr(BLOG_URL); ?>" target="_blank" rel="noopener noreferrer">[ My Blog ]</a> 82 </div> 83 <div class="al-donate"> 84 <a href="<?php echo eattr(DONATE_URL); ?>" target="_blank" rel="noopener noreferrer" title="Support this project"> 85 <img class="coindrop" src="https://coindrop.to/embed-button.png" alt="Coindrop.to me"> 86 </a> 87 </div> 88 <div class="dim" style="font-size:14px">Like this? Buy me a coffee. No pressure, no tracking.</div> 89 </div> 90 91 <!-- The obligatory row of 88x31 buttons --> 92 <div class="buttons88"> 93 <?php foreach ($__buttons as $__b): ?> 94 <?php echo button_88x31($__b); ?> 95 <?php endforeach; ?> 96 </div> 97 98 <p class="dim"> 99 <?php echo e(SITE_NAME); ?> v<?php echo e(SITE_VERSION); ?> — 100 (c) <?php echo e(SITE_YEAR); ?> <?php echo e(SITE_AUTHOR); ?>. Released to the public domain. 101 <br> 102 Handcrafted in a text editor. Tested in Netscape. <a href="#dig" id="digLink" title="?">.</a> 103 </p> 104 </div><!-- /.footer --> 105 106 </div><!-- /.wrap --> 107 108 <!-- ============================ GLOBAL SCRIPT ======================== --> 109 <script> 110 (function () { 111 "use strict"; 112 113 /* ---- Live clocks ------------------------------------------------------- 114 Anchor to the server epoch delivered by PHP, then advance locally so both 115 the server-time and UTC displays tick once per second without any polling. */ 116 var SERVER_EPOCH_MS = <?php echo json_encode($__server_epoch * 1000); ?>; 117 var loadedAt = Date.now(); 118 119 function pad(n) { return (n < 10 ? '0' : '') + n; } 120 121 function fmt(d) { 122 return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) 123 + ' ' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()); 124 } 125 126 var elServer = document.getElementById('clkServer'); 127 var elUtc = document.getElementById('clkUtc'); 128 129 function tick() { 130 var nowServerMs = SERVER_EPOCH_MS + (Date.now() - loadedAt); 131 var utc = new Date(nowServerMs); 132 if (elUtc) { elUtc.textContent = fmt(utc) + ' UTC'; } 133 if (elServer) { 134 // Server local time: show the visitor's own local time as a stand-in for 135 // "current time", clearly labelled, plus keep the server-rendered TZ text. 136 var local = new Date(nowServerMs); 137 elServer.textContent = 138 local.getFullYear() + '-' + pad(local.getMonth() + 1) + '-' + pad(local.getDate()) 139 + ' ' + pad(local.getHours()) + ':' + pad(local.getMinutes()) + ':' + pad(local.getSeconds()); 140 } 141 } 142 tick(); 143 setInterval(tick, 1000); 144 145 /* ---- CRT scanline toggle (persisted) ----------------------------------- */ 146 var htmlEl = document.documentElement; 147 var bodyEl = document.body; 148 var stateEl = document.getElementById('crtState'); 149 var toggleEl = document.getElementById('crtToggle'); 150 151 function applyCrt(on) { 152 if (on) { 153 bodyEl.classList.add('crt-on'); 154 if (stateEl) { stateEl.textContent = 'on'; } 155 } else { 156 bodyEl.classList.remove('crt-on'); 157 if (stateEl) { stateEl.textContent = 'off'; } 158 } 159 htmlEl.classList.remove('crt-pending'); 160 } 161 162 var crtOn = false; 163 try { crtOn = (localStorage.getItem('crt') === 'on'); } catch (e) {} 164 applyCrt(crtOn); 165 166 if (toggleEl) { 167 toggleEl.addEventListener('click', function () { 168 crtOn = !crtOn; 169 try { localStorage.setItem('crt', crtOn ? 'on' : 'off'); } catch (e) {} 170 applyCrt(crtOn); 171 }); 172 } 173 174 /* ---- Under-construction easter egg ------------------------------------- 175 Revealed by the #dig anchor link in the footer, OR by the Konami code. */ 176 var digLink = document.getElementById('digLink'); 177 var digBox = document.getElementById('dig'); 178 function reveal() { 179 if (digBox) { 180 digBox.style.display = 'block'; 181 digBox.scrollIntoView({ behavior: 'smooth', block: 'center' }); 182 } 183 } 184 if (digLink) { 185 digLink.addEventListener('click', function (ev) { ev.preventDefault(); reveal(); }); 186 } 187 188 var konami = [38,38,40,40,37,39,37,39,66,65]; 189 var kpos = 0; 190 document.addEventListener('keydown', function (ev) { 191 var k = ev.keyCode || ev.which; 192 if (k === konami[kpos]) { 193 kpos++; 194 if (kpos === konami.length) { 195 kpos = 0; 196 reveal(); 197 } 198 } else { 199 kpos = (k === konami[0]) ? 1 : 0; 200 } 201 }); 202 })(); 203 </script> 204 205 </body> 206 </html> 207 You are reading the real file being executed on the server. What you see is what runs. |