y'know I probably should have uploaded this to gh sooner

This commit is contained in:
Logan Joy-Koer
2026-06-22 23:53:22 -07:00
commit b55d3306c4
62 changed files with 1002233 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<title>Bad Request</title>
<style>
body {
background-image: url("/Images/DingusGrass.jpg");
background-color: #0f8340;
background-position: center;
background-size: cover;
background-repeat: no-repeat;
min-height: 100vh;
min-height: 100svh
}
.center {
background-color: white;
width: fit-content;
padding: 5mm;
margin: auto;
}
.dense {
margin: 1mm;
}
</style>
</head>
<body>
<div class="center">
<h1 style="color: #a00;" class="dense">Error 400: Bad Request.</h1>
<p class="dense">
There is an issue with your web request.<br>If possible, please verify all required name/value pairs are present in the query string of the URL.
</p>
</div>
</body>
</html>
+34
View File
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<title>Page Not Found!</title>
<style>
body {
background-image: url("/Images/DingusGrass.jpg");
background-color: #0f8340;
background-position: center;
background-size: cover;
background-repeat: no-repeat;
min-height: 100vh;
min-height: 100svh
}
.center {
background-color: white;
width: fit-content;
padding: 5mm;
margin: auto;
}
.dense {
margin: 1mm;
}
</style>
</head>
<body>
<div class="center">
<h1 style="color: #a00;" class="dense">Error 404: Page not found.</h1>
<p class="dense">
The page you have requested does not exist.<br>Please verify you typed the URL correctly and try again.
</p>
</div>
</body>
</html>
+32
View File
@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>
<head>
<title>Too Many Requests</title>
<style>
body {
background-color: #0f8340;
background-position: center;
background-size: cover;
min-height: 100vh;
min-height: 100svh
}
.center {
background-color: white;
width: fit-content;
padding: 5mm;
margin: auto;
}
.dense {
margin: 1mm;
}
</style>
</head>
<body>
<div class="center">
<h1 style="color: #a00;" class="dense">Error 429: Too many Requests</h1>
<p class="dense">
You are sending too many requests. If this is caused by an error in a page, please contact the site admin.
</p>
</div>
</body>
</html>
+34
View File
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<title>Internal Server Error.</title>
<style>
body {
background-image: url("/Images/DingusGrass.jpg");
background-color: #0f8340;
background-position: center;
background-size: cover;
background-repeat: no-repeat;
min-height: 100vh;
min-height: 100svh
}
.center {
background-color: white;
width: fit-content;
padding: 5mm;
margin: auto;
}
.dense {
margin: 1mm;
}
</style>
</head>
<body>
<div class="center">
<h1 style="color: #a00;" class="dense">Error 500: Internal Server Error.</h1>
<p class="dense">
An error has occured on the server.<br>Please try again later. If this continues to occur, please contact the server administrator.
</p>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+30
View File
@@ -0,0 +1,30 @@
webroot_real = os.path.realpath(script_directory + "/webroot")
folderPath = os.path.realpath(script_directory + "/webroot" + requestPath)
if not folderPath.startswith(webroot_real + os.sep) and folderPath != webroot_real:
responseType = "403 Forbidden"
contentType = "text/html"
responsecontent = b"<h1>403 Forbidden</h1>"
else:
filesList = list(os.scandir(folderPath))
responseType = "200 OK"
contentType = "text/html"
template = open(script_directory + "/webroot/Templates/fileList.html").read()
template = template.replace("<!--dir-->", html.escape(requestPath))
listText = "<li>Folder: <a href=\"..\">..</a></li>"
for i in filesList:
temp = "File: "
funnynameorsomethingidk = i.name
if os.path.isdir(folderPath + "/" + funnynameorsomethingidk):
temp = "Folder: "
funnynameorsomethingidk += "/"
link = requestPath + "/" + funnynameorsomethingidk
link = link.replace("//", "/")
if link.endswith(".py"):
link = "/raw/?p=" + html.escape(link)
else:
link = html.escape(link)
listText += ("<li>" + temp + "<a href='" + link + "'>" + html.escape(i.name) + "</a></li>")
template = template.replace("<!--fileList-->", listText)
responsecontent = template.encode()
+11
View File
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Directory Listing of <!--dir--></h1>
<ul>
<!--fileList-->
</ul>
</body>
</html>
+64
View File
@@ -0,0 +1,64 @@
<div class="navbar no-print">
<span class="nav-button">
<a href="/?<!--args-->p=/">
<div class="nav-content">
<img src="/Images/mudkip.png" alt="Page Icon" style="height:100%; margin: 0px;">
</div>
</a>
</span>
<span class="nav-button">
<a href="/?<!--args-->p=/Projects">
<div class="nav-content">
Projects
</div>
</a>
<div class="dropdown-content">
<a href="/?<!--args-->p=/Projects/wiitop/" class="nav-button">
<div class="nav-content">
Wiitop
</div>
</a>
</div>
</span>
<span class="nav-button">
<a href="/?<!--args-->p=/Contact" >
<div class="nav-content">
Contact
</div>
</a>
</span>
<span class="nav-button">
<a href="/?<!--args-->p=/webring" >
<div class="nav-content">
Webring?
</div>
</a>
</span>
<span class="nav-button" style="float: right; margin-right:0;">
<div class="nav-content">
<label for="theme">Theme: </label>
<select name="theme" id="theme" onchange="changeTheme(this.value)">
<option value="default">Page Default</option>
<option value="Light"<!--themeLight-->>Light</option>
<option value="Dark"<!--themeDark-->>Dark</option>
</select>
</div>
</span>
<!--userbar-->
</div>
<script>
function replaceUrlParam(url, paramName, paramValue) {
if (paramValue == null) {
paramValue = '';
}
var pattern = new RegExp('\\b('+paramName+'=).*?(&|#|$)');
if (url.search(pattern)>=0) {
return url.replace(pattern,'$1' + paramValue + '$2');
}
url = url.replace(/[?#]$/,'');
return url + (url.indexOf('?')>0 ? '&' : '?') + paramName + '=' + paramValue;
}
function changeTheme(theme) {
window.location.href = replaceUrlParam('/?<!--args-->p=<!--path-->', "theme", theme)
}
</script>
+27
View File
@@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<!--head-->
</head>
<body>
<div class="bgimage"></div>
<div id="grid-container">
<header>
<!--header-->
</header>
<article>
<a id="oldmodelink" style="color: rgba(127,0,255,0);" href="/?v=old&p=<!--path-->">View in Compatibility Mode</a>
<br>
<!--content-->
<br>
</article>
<footer class="gray">
<p style="margin: 0px; display:flex; align-items: center; justify-content: space-between;">
<span style="display: flex; align-items: center; margin-right:10px;">(c) 2026 Logan Joy-Koer (SuperbeeLavaman)
<a style="margin-left: 10px" href="http://wii-linux.org/"><img style="display: block;" src="Images/wl88x31.gif" alt="Wii-Linux NOW!" class=no-print></a></span>
<span style="float: left;">This page last updated: <!--updateddate--></span>
</p>
</footer>
</div>
</body>
</html>
+28
View File
@@ -0,0 +1,28 @@
Navigation<br>
<div>
<a href="/?<!--args-->&p=/">
Home Page
</a>
<br>
<a href="/?<!--args-->&p=/Projects">
Projects
</a>
<br>
<div>
<a href="/?<!--args-->&p=/Projects/wiitop/">
Wiitop
</a>
<br>
</div>
<a href="/?<!--args-->&p=/Contact" >
Contact Page
</a>
<br>
<a href="/?<!--args-->&p=/webring" >
Webring?
</a>
<br>
<a href="/?<!--args-->returnto=<!--path-->&p=/login" >
Login
</a>
</div>
+22
View File
@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<!--head-->
</head>
<body>
Using Compatibility Mode.<br>Click <a href="/?v=new&p=<!--path-->">here</a> for modern browsers.
<div id="grid-container">
<header>
<!--header-->
</header>
<article>
<br>
<!--content-->
<br>
</article>
<footer>
<p style="margin: 0px; display:flex; align-items:center;"><span style="margin-right: 10px;">(c) 2026 Logan Joy-Koer (SuperbeeLavaman)</span><a style="display: inline-block;" href="http://wii-linux.org/"><img style="margin: 0px; display: block;" src="Images/wl88x31.gif" alt="Wii-Linux NOW!"></a></p>
</footer>
</div>
</body>
</html>
+3
View File
@@ -0,0 +1,3 @@
responseType = "200 OK"
contentType = "text/plain"
responsecontent = datetime.datetime.now().strftime("%I:%M:%S%p on %B %d, %Y").encode()
+19
View File
@@ -0,0 +1,19 @@
Title: Contact Me<br>
Icon: /favicon.ico<br>
Style: /styles/newLight.css<br>
Description: Contact Info<br>
Author: SuperbeeLavaman<br>
Content:
<div class="article-content-block">
<h1>Contact Page</h1>
<p>
This page contains contact information, for if you want to tell me anything or ask me a question.
</p>
<p>
<strong>Phone:</strong> <a href="tel:9714442780">(971) 444-2780</a><br>
<strong>Email:</strong> <a href="mailto:loganlee.jk@outlook.com">loganlee.jk@outlook.com</a><!--, <a href="mailto:superbee@superbeelavaman.onthewifi.com">superbee@superbeelavaman.onthewifi.com</a>--><br>
<strong>Discord:</strong> <a href="https://discordapp.com/users/763802866921242646">superbee_hashtag_3637</a><br>
<strong>Matrix:</strong> <a href="https://matrix.to/#/%40superbeelavaman%3Asuperbeelavaman.duckdns.org">@superbeelavaman:superbeelavaman.duckdns.org</a><br>
<strong>Nintendo Switch friend code:</strong> SW-7690-5791-7118<br>
</p>
</div>
+19
View File
@@ -0,0 +1,19 @@
Title: Projects<br>
Icon: /favicon.ico<br>
Style: /styles/newLight.css<br>
Description: My recent projects.
Author: SuperbeeLavaman<br>
Content:
<div class="article-content-block">
<h1>Projects</h1>
<p>This page will list recent projects and projects I'm currently working on, if I think to write about them. It will probably not have a lot of information on it.</p>
<ul>
<li>
<a href="/?<!--args-->p=/Projects/wiitop/"><b>Preparation for making the Wiitop</b></a>
<br>As you may have noticed, I have an 88x31 button leading to Wii-Linux.org. One of the projects they have is a laptop that uses a Nintendo Wii
as the main computer portion of the laptop. As you would expect, several modifications are expected to be performed to the Wii that is being
used in the Wiitop.
<br><a href="/?<!--args-->p=/Projects/wiitop/"><b>[Read More]</b></a>
</li>
</ul>
</div>
@@ -0,0 +1,36 @@
Title: The Wiitop<br>
Icon: /favicon.ico<br>
Style: /styles/newLight.css<br>
Description: I'm working on making the first prototype Wiitop*<br>
Author: SuperbeeLavaman<br>
Content:
<div class="article-content-block">
<h1>Preparation for making the Wiitop</h1>
<p> As you may have noticed, I have an 88x31 button leading to Wii-Linux.org. One of the projects they have is a laptop that uses a Nintendo Wii
as the main computer portion of the laptop. As you would expect, several modifications are expected to be performed to the Wii that is being
used in the Wiitop.
<br>
<br>The Wiitop is specified to be a 14" laptop, with a trimmed Wii inside. The publically available spec is quite out of date from what has been
talked about in the Wii-Linux server, and unfortunately while it specifies an 854x480 screen, those are effectively impossible to get. As
<i>Lily&nbsp;lily&nbsp;lily&nbsp;lily</i> recommended, 720x576@50 letterboxes cleanly into 800x600, which is a slightly more common LCD resolution.
<br>Since I'm likely to be the first person to actually construct a Wiitop, my decisions will likely have a strong effect on how the design is
finalized. A 4:3 aspect ratio makes sense for a device that often displays 4:3 content, and a 4:3 laptop makes certain components easier to
arrange. Since I've never done a Wii trim before, I'll be using the <a href="https://bitbuilt.net/forums/threads/the-definitive-wii-trimming-guide.198/">OMGWTF</a>
trim. For the power supply, I will be designing a custom board that includes an STM32-based CrOS_EC, a BQ25703A charge controller, and various
regulators, which will be controllable from Linux.
<br>The following is written during or after the actions listed above.
<br>
<h2>The Wii to use</h2>
I have an RVL-CPU-40 wii that has gone through a lot.
<br>At one point, it was running with no shell and no heatsink, in a freezer. During that time, it was nicknamed <i>Friizer</i>, and continues to
retain that name.
<br><abbr title="Friizer in the freezer."><a href="/Images/projects/wiitop/friizerfreezer.jpg"><img src="/Images/projects/wiitop/friizerfreezer.jpg" alt="Friizer in the freezer" class="fitinpageplease"></a></abbr>
<br>
<br>Recently, I delidded the CPU and SoC of Friizer. I then decided to prepare for trimming and do research for what I would need to do to make the Wiitop.
<br><abbr title="Friizer has been delidded."><a href="/Images/projects/wiitop/friizerdelid.jpg"><img src="/Images/projects/wiitop/friizerdelid.jpg" alt="Friizer has been delidded." class="fitinpageplease""></a></abbr>
<br><abbr title="Marked for the OMGWTF trim"><a href="/Images/projects/wiitop/friizermarked.jpg"><img src="/Images/projects/wiitop/friizermarked.jpg" alt="Marked for the OMGWTF trim" class="fitinpageplease"></a></abbr>
<br>
<br>[THIS PAGE IS UNDER CONSTRUCTION]
<br><abbr title="construction."><img src=/Images/underconstruction.gif alt="construction." class="fitinpageplease"></abbr>
</p>
</div>
+16
View File
@@ -0,0 +1,16 @@
Title: My Website<br>
Icon: /favicon.ico<br>
Style: /styles/newLight.css<br>
Description: I've made a website. There's not much content yet.<br>
Author: SuperbeeLavaman<br>
Content:
<div class="article-content-block">
<h1>SuperbeeLavaman's Website</h1>
<p>
Idk what to put on my website but it exists.
<br>
🫜
<br><br>
<p style="font-family: comicsansms;">Comic Sans MS</p>
</p>
</div>
+29
View File
@@ -0,0 +1,29 @@
Title: Login<br>
Icon: /favicon.ico<br>
Style: /styles/newLight.css<br>
Description: Login.<br>
Author: SuperbeeLavaman<br>
Content:
<div class="article-content-block">
<h1>Login</h1>
<p><!--errortext--></p>
<p>
<form action="/login/">
<table>
<tr>
<td><label for="username">Username: </label></td>
<td><input type="text" name="username" id="username"></td>
</tr>
<tr>
<td><label for="password">Password: </label></td>
<td><input type="password" name="password" id="password"></td>
</tr>
<tr>
<td><!--formargs--></td>
<td><input type="submit" name="submit" id="submit" value="Submit"></td>
</tr>
</table>
</form>
<p>No Account? <a href="/?<!--args-->p=/signup/">Sign Up.</a></p>
</p>
</div>
+75
View File
@@ -0,0 +1,75 @@
Title: Resume<br>
Icon: /favicon.ico<br>
Style: /styles/newDark.css<br>
Description: Logan's Resume<br>
Author: Logan Joy-Koer (SuperbeeLavaman)<br>
Content:
<div class="article-content-block">
<section class="container">
<h1>Logan Joy-Koer</h1>
<h6 style="margin-top: 0px" class="subtitle">
Gervais, OR |
<a href="mailto:loganlee.jk@outlook.com">loganlee.jk@outlook.com</a> |
<a href="tel:9714442780">(971) 444-2780</a> |<br>
<a href="https://www.github.com/superbeelavaman">github.com/superbeelavaman</a> |
<a href="https://superbeelavaman.duckdns.org/?p=/">https://superbeelavaman.duckdns.org</a> |<br>
<a href="https://matrix.to/#/%40superbeelavaman%3Asuperbeelavaman.duckdns.org">@superbeelavaman:superbeelavaman.duckdns.org</a> |
CompTIA Tech+ Certified |
</h6>
</section>
<section class="container">
<h2>Summary</h2>
<p style="margin-top: 0px">Linux enthusiast with hands-on experience in embedded hardware, low-level software, and systems programming. Comfortable across x86, PowerPC/POWER ISA, eZ80, and ARM CPU architectures. Passionate about unusual and older hardware and making things work in environments they weren't intended to.</p>
</section>
<section class="container">
<h2>Projects & Hands-On Experience</h2>
<h3>Xbox 360 PBX Server <span class="subtitle">Personal Lab</span></h3>
<p style="margin-top: 0px"><ul>
<li>Runs Arch Linux (ArchPOWER) on Xbox 360 hardware</li>
<li>Compiled and configured Asterisk 23.2.2 from source for a full home PBX system</li>
<li>Integrated a Cisco VG224 as a SIP/FXS gateway; successfully registered all 24 extensions via chan_pjsip</li>
<li>Set up dnsmasq for PTR resolution and managed routing across two subnets</li>
</ul></p>
<h3>Multiple Workstations <span class="subtitle">Personal Lab</span></h3>
<p style="margin-top: 0px"><ul>
<li>Deployed and Configured several workstations to conveniently perform tasks from several locations</li>
<li>Custom-compiled Linux Kernel builds for nonstandard hardware</li>
<li>Became familiar with several Linux distros including but not limited to Ubuntu, Arch, Adélie, Void, and more</li>
</ul></p>
</section>
<section class="container">
<h2>Prior Work Experience</h2>
<h3>Crew Member/Cook - Domino's Pizza <span class="subtitle">Woodburn, OR | July 2024 - August 2025</span></h3>
<ul style="margin-top: 0px;">
<li>Prepared orders accurately with time pressure during high volume hours</li>
<li>Handled customer service tasks including taking orders and resolving complaints both in person and over the phone</li>
<li>Maintained food safety and cleanliness standards consistently across shifts</li>
</ul>
</section>
<section class="container">
<h2>Skills</h2>
<p style="margin-top: 0px; margin-bottom: 0px;">Operating Systems:</p>
<ul style="margin-top: 0px;">
<li>Arch Linux</li>
<li>Linux Mint</li>
<li>Debian</li>
<li>Ubuntu</li>
<li>Adélie</li>
<li>Void</li>
<li>PostMarketOS</li>
<li>Windows 98/ME</li>
<li>Windows XP</li>
<li>Windows Vista/7</li>
<li>Windows 10</li>
</ul>
<p>Familiar CPU Architectures: x86/AMD64, PowerPC/POWER ISA, ARM, eZ80</p>
<p>Networking: VoIP/SIP (Asterisk, PJSIP), Cisco IOS, VLANs, NAT, dnsmasq, DNS</p>
<p>Hardware: Embedded systems, PCB design (KiCad), Soldering</p>
<p>Tools: Git, Vim, SSH, Nginx, Sledgehammer</p>
<p>Languages: C, Python, Shell scripting [Bash], JavaScript, HTML, CSS</p>
</section>
<section class="container">
<h2>Certifications</h2>
<p style="margin-top: 0px;">CompTIA Tech+ (FC0-U71) - Issued May 22, 2025</p>
</section>
</div>
+33
View File
@@ -0,0 +1,33 @@
Title: Sign Up<br>
Icon: /favicon.ico<br>
Style: /styles/newLight.css<br>
Description: Sign up.<br>
Author: SuperbeeLavaman<br>
Content:
<div class="article-content-block">
<h1>Sign Up</h1>
<p><!--errortext--></p>
<p>
<form action="/signup/">
<table>
<tr>
<td><label for="username">Username: </label></td>
<td><input type="text" name="username" id="username"></td>
</tr>
<tr>
<td><label for="password">Password: </label></td>
<td><input type="password" name="password" id="password"></td>
</tr>
<tr>
<td><label for="password"> Repeat Password: </label></td>
<td><input type="password" name="password2" id="password2"></td>
</tr>
<tr>
<td><!--formargs--></td>
<td><input type="submit" name="submit" id="submit" value="Submit"></td>
</tr>
</table>
</form>
<p>Already have an account? <a href="/?<!--args-->p=/login/">Sign In.</a></p>
</p>
</div>
+25
View File
@@ -0,0 +1,25 @@
Title: Webring<br>
Icon: /favicon.ico<br>
Style: /styles/newLight.css<br>
Description: This site is part of a Webring. Read more here.<br>
Author: SuperbeeLavaman, PiplupRox Productions<br>
Content:
<div class="article-content-block">
<h1>This site is part of a <a href="https://en.wikipedia.org/wiki/Webring">Webring</a></h1>
<p>
This webring includes the Porypedia Wiki, PiplupRox Productions, and more! Using the top bar here, you can navigate to other pages on this site, and from here you can navigate to other pages in the webring.
<br><br>
I am part of this webring as a result of being one of 3 active community members in the Porygondoliers community, and PiplupRox was adamant about creating a webring
<br>
Blame him if you think this is weird.
<br><br>
<div style="width: min-content;">
<a href="https://pipluprox-productions.neocities.org/webring"><img class="center" src="/Images/webring/porygondolier_community_webring.gif"></a>
<div style="display: flex; justify-content: center;">
<a href="https://pipluprox-productions.neocities.org/webring?action=previous"><img src="/Images/webring/porygondolier_webring_prev.gif"></a>
<a href="https://pipluprox-productions.neocities.org/webring?action=random"><img src="/Images/webring/porygondolier_webring_rand.gif"></a>
<a href="https://pipluprox-productions.neocities.org/webring?action=next"><img src="/Images/webring/porygondolier_webring_next.gif"></a>
</div>
</div>
</p>
</div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.
+143
View File
@@ -0,0 +1,143 @@
page = ""
args = ""
responseType = "200 OK"
contentType = "text/html"
for i in argumentsDict:
argumentsDict[i] = urllib.parse.unquote(argumentsDict[i])
if "p" in argumentsDict:
path = argumentsDict["p"]
content_real = os.path.realpath(script_directory + "/webroot/content")
filePath = os.path.realpath(script_directory + "/webroot/content/" + path)
if not filePath.startswith(content_real + os.sep) and filePath != content_real:
responseType = "403 Forbidden"
responsecontent = b"<h1>403 Forbidden</h1>"
contentType = "text/html"
else:
if "v" in argumentsDict and argumentsDict["v"] in ("new", "old"):
version = argumentsDict["v"]
else:
version = "new"
if os.path.exists(filePath):
if os.path.isdir(filePath):
if os.path.exists(filePath + "/" + version + "index.html"):
filePath += ("/" + version + "index.html")
else:
filePath += "/index.html"
if version == "new":
page = open(script_directory + "/webroot/Templates/index.html").read()
header = open(script_directory + "/webroot/Templates/header.html").read()
elif version == "old":
page = open(script_directory + "/webroot/Templates/oldindex.html").read()
header = open(script_directory + "/webroot/Templates/oldheader.html").read()
page = page.replace("<!--header-->", header)
# Resolve session cookie and build userbar before other replacements,
# as the logged-out userbar contains <!--args--> and <!--path--> itself
session_token = Cookies.get("session", "")
if session_token:
session_status, session_user = userManagement.validate_session(session_token)
else:
session_status = "fail"
session_user = ""
if session_status == "success":
pfp_base = os.path.realpath(script_directory + "/webroot/Images/profileimages")
pfp_real_gif = os.path.realpath(script_directory + "/webroot/Images/profileimages/" + session_user + ".gif")
pfp_real_jpg = os.path.realpath(script_directory + "/webroot/Images/profileimages/" + session_user + ".jpg")
if pfp_real_gif.startswith(pfp_base + os.sep) and os.path.exists(pfp_real_gif):
pfp_src = "/Images/profileimages/" + html.escape(session_user) + ".gif"
elif pfp_real_jpg.startswith(pfp_base + os.sep) and os.path.exists(pfp_real_jpg):
pfp_src = "/Images/profileimages/" + html.escape(session_user) + ".jpg"
else:
pfp_src = "/Images/default_pfp.gif"
userbar = (
'<span class="nav-button" style="float:right; margin-right:0;">'
'<a href="/logout/">'
'<div class="nav-content">Logout</div>'
'</a></span>'
'<span class="nav-button" style="float:right; margin-right:0;">'
'<div class="nav-content">'
'<img src="' + pfp_src + '" alt="Profile Picture" style="height:100%; vertical-align:middle;">'
' Logged in as ' + html.escape(session_user) +
'</div></span>'
)
else:
userbar = (
'<span class="nav-button" style="float:right; margin-right:0;">'
'<a href="/?<!--args-->returnto=<!--path-->&p=/login/">'
'<div class="nav-content">Login</div>'
'</a></span>'
)
page = page.replace("<!--userbar-->", userbar)
content = open(filePath).read()
title = content.split("Title: ")[1].split("<br>\n")[0]
icon = content.split("Icon: ")[1].split("<br>\n")[0]
style = content.split("Style: ")[1].split("<br>\n")[0]
description = content.split("Description: ")[1].split("<br>\n")[0]
author = content.split("Author: ")[1].split("<br>\n")[0]
content = content.split("Content: \n")[1]
updateddate = get_last_modified(filePath)
if version == "old":
style = "/styles/oldmain.css"
if "theme" in argumentsDict:
theme = argumentsDict["theme"]
if os.path.exists(script_directory + "/webroot/styles/" + version + theme + ".css"):
style = "/styles/" + version + theme + ".css"
args += "theme=" + theme + "&"
page = page.replace("<!--theme" + theme + "-->", " selected")
page = re.sub('<!--theme.*?-->', '', page, flags=re.DOTALL)
head = "<title>" + title + """</title>
<link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"""" + icon + """\">
<link rel=\"icon\" type=\"image/x-icon\" href=\"""" + icon + """\">
<link rel=\"stylesheet\" type=\"text/css\" href=\"/styles/newCommon.css\">
<link rel=\"stylesheet\" type=\"text/css\" href=\"""" + html.escape(style) + """\">
<meta charset=\"UTF-8\">
<meta name=\"description\" content=\"""" + description + """\">
<meta name=\"author\" content=\"""" + author + """\">
<meta property=\"og:title\" content=\"""" + title + """\">
<meta property=\"og:description\" content=\"""" + description + """\">
<meta property=\"og:type\" content=\"website\">
<meta property=\"twitter:title\" content=\"""" + title + """\">
<meta property=\"twitter:description\" content=\"""" + description + """\">
"""
args += "v=" + version + "&"
formargs = ""
for i in argumentsDict:
formargs += "<input type=\"hidden\" name=\"" + html.escape(i) + "\" value=\"" + html.escape(argumentsDict[i]) + "\">"
errortext = ""
if "errortext" in argumentsDict:
errortext = "<p class=\"error\">" + html.escape(argumentsDict["errortext"]) + "</p>"
page = page.replace("<!--content-->", content)
page = page.replace("<!--head-->", head)
page = page.replace("<!--path-->", urllib.parse.quote(path, safe=''))
page = page.replace("<!--args-->", args)
page = page.replace("<!--formargs-->", formargs)
page = page.replace("<!--errortext-->", errortext)
page = page.replace("<!--updateddate-->", updateddate)
page = page.replace("\n", "")
page = page.replace(" ", "")
else:
responseType = "404 Not Found"
fullRequestPath = script_directory + "/webroot/404.html"
page = open(fullRequestPath).read()
responsecontent = page.encode()
else:
responseType = "301 Moved Permanently"
responseHeaders += "Location: /?p=/\n".encode()
page = "<html><head><title>Redirecting...</title><meta http-equiv=\"refresh\" content=\"0; url='/?p=/'\" /></head><body><p><a href=\"/?p=/\">Redirect</a></p></body></html>"
responsecontent = page.encode()
+42
View File
@@ -0,0 +1,42 @@
page = ""
args = ""
responseType = "200 OK"
contentType = "text/html"
if "username" in argumentsDict and "password" in argumentsDict:
username = urllib.parse.unquote(argumentsDict["username"])
password = urllib.parse.unquote(argumentsDict["password"])
# Validate and sanitize returnpath
returnpath = "/"
returnto = ""
if "returnto" in argumentsDict:
candidate = urllib.parse.unquote(argumentsDict["returnto"])
resolved = os.path.realpath(script_directory + "/webroot" + candidate)
webroot_real = os.path.realpath(script_directory + "/webroot")
if resolved.startswith(webroot_real + os.sep) or resolved == webroot_real:
returnpath = candidate
returnto = "&returnto=" + urllib.parse.quote(returnpath)
status, result = userManagement.login(username, password)
if status == "success":
token = result
responseHeaders += ("Set-Cookie: session=" + token + "; Path=/; HttpOnly; SameSite=Strict\n").encode()
url = "/?p=" + urllib.parse.quote(returnpath)
else:
url = "/?p=/login/" + returnto + "&errortext=" + urllib.parse.quote("Invalid username or password.")
page = ("<html><head><title>Redirecting...</title>"
"<meta http-equiv=\"refresh\" content=\"0; url='" + html.escape(url) + "'\" />"
"</head><body><p><a href=\"" + html.escape(url) + "\">Redirect</a></p></body></html>")
else:
responseType = "400 Bad Request"
fullRequestPath = script_directory + "/webroot/400.html"
page = open(fullRequestPath).read()
# Clear sensitive locals
username = ""
password = ""
responsecontent = page.encode()
+25
View File
@@ -0,0 +1,25 @@
responseType = "200 OK"
contentType = "text/html"
session_token = Cookies.get("session", "")
if session_token:
userManagement.logout(session_token)
responseHeaders += b"Set-Cookie: session=; Path=/; Max-Age=0; HttpOnly; SameSite=Strict\n"
returnpath = "/"
if "returnto" in argumentsDict:
candidate = urllib.parse.unquote(argumentsDict["returnto"])
resolved = os.path.realpath(script_directory + "/webroot" + candidate)
webroot_real = os.path.realpath(script_directory + "/webroot")
if resolved.startswith(webroot_real + os.sep) or resolved == webroot_real:
returnpath = candidate
url = "/?p=" + urllib.parse.quote(returnpath)
responseType = "302 Found"
responseHeaders += ("Location: " + url + "\n").encode()
responsecontent = (
"<html><head><title>Redirecting...</title>"
"<meta http-equiv=\"refresh\" content=\"0; url='" + html.escape(url) + "'\" />"
"</head><body><p><a href=\"" + html.escape(url) + "\">Redirect</a></p></body></html>"
).encode()
+45
View File
@@ -0,0 +1,45 @@
page = ""
responseType = "200 OK"
contentType = "text/html"
if "p" in argumentsDict:
path = urllib.parse.unquote(argumentsDict["p"])
webroot_real = os.path.realpath(script_directory + "/webroot")
filePath = os.path.realpath(script_directory + "/webroot/" + path)
if not filePath.startswith(webroot_real + os.sep) and filePath != webroot_real:
responseType = "403 Forbidden"
contentType = "text/html"
responsecontent = b"<h1>403 Forbidden</h1>"
elif os.path.exists(filePath):
if os.path.isdir(filePath):
filesList = list(os.scandir(filePath))
page = open(script_directory + "/webroot/Templates/fileList.html").read()
page = page.replace("<!--dir-->", html.escape(path))
listText = "<li>Folder: <a href=\"/raw/?p=" + html.escape(os.path.dirname(path)) + "\">..</a></li>"
for i in filesList:
temp = "File: "
if os.path.isdir(filePath + i.name):
temp = "Folder: "
link = path.rstrip("/") + "/" + i.name
listText += ("<li>" + temp + "<a href=\"/raw/?p=" + html.escape(link) + "\">" + html.escape(i.name) + "</a></li>")
page = page.replace("<!--fileList-->", listText)
responsecontent = page.encode()
else:
contentType = magic.Magic(mime=True).from_file(filePath)
if contentType in (contentTypes + ["application/x-python-code", "text/x-python"]):
if contentType.startswith("text"):
contentType = "text/plain"
responsecontent = open(filePath, "rb").read()
else:
responseType = "415 Unsupported Media Type"
contentType = ""
responsecontent = b""
else:
responseType = "404 Not Found"
fullRequestPath = script_directory + "/webroot/404.html"
responsecontent = open(fullRequestPath, "rb").read()
else:
responseType = "400 Bad Request"
fullRequestPath = script_directory + "/webroot/400.html"
responsecontent = open(fullRequestPath, "rb").read()
+4
View File
@@ -0,0 +1,4 @@
<html>
<head></head>
<body style='background-image: url("/Images/test.png")'></body>
</html>
+66
View File
@@ -0,0 +1,66 @@
User-agent: *
Disallow: /
User-agent: Googlebot
Disallow: /
User-agent: Bingbot
Disallow: /
User-agent: GPTBot
Disallow: /
User-agent: Claude-Web
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: FacebookBot
Disallow: /
User-agent: Applebot-Extended
Disallow: /
User-agent: Applebot
Disallow: /
User-agent: Diffbot
Disallow: /
User-agent: Googlebot-Image
Disallow: /
User-agent: Googlebot-Video
Disallow: /
User-agent: Slurp
Disallow: /
User-agent: DuckDuckBot
Disallow: /
User-agent: Baiduspider
Disallow: /
User-agent: YandexBot
Disallow: /
User-agent: HTTrack
Disallow: /
User-agent: Jon Arbuckle
Disallow: /robots.txt
# trollage
User-agent: Garfield
Disallow: /Lasagne/
User-agent: archive.org_bot
Disallow:
User-agent: Engineer TF2
Disallow: /teleporting/bread
+55
View File
@@ -0,0 +1,55 @@
page = ""
args = ""
responseType = "200 OK"
contentType = "text/html"
if "username" in argumentsDict and "password" in argumentsDict and "password2" in argumentsDict:
username = urllib.parse.unquote(argumentsDict["username"])
password = urllib.parse.unquote(argumentsDict["password"])
password2 = urllib.parse.unquote(argumentsDict["password2"])
# Validate and sanitize returnpath
returnpath = "/"
returnto = ""
if "returnto" in argumentsDict:
candidate = urllib.parse.unquote(argumentsDict["returnto"])
resolved = os.path.realpath(script_directory + "/webroot" + candidate)
webroot_real = os.path.realpath(script_directory + "/webroot")
if resolved.startswith(webroot_real + os.sep) or resolved == webroot_real:
returnpath = candidate
returnto = "&returnto=" + urllib.parse.quote(returnpath)
error = ""
if password != password2:
error = "Passwords do not match."
elif username == password:
error = "Username cannot match password."
if error == "":
status, reason = userManagement.register(username, password)
if status == "fail":
error = reason
if error == "":
# Auto-login after successful registration
status, token = userManagement.login(username, password)
if status == "success":
responseHeaders += ("Set-Cookie: session=" + token + "; Path=/; HttpOnly; SameSite=Strict\n").encode()
url = "/?p=" + urllib.parse.quote(returnpath)
else:
url = "/?p=/signup/" + returnto + "&errortext=" + urllib.parse.quote(error)
page = ("<html><head><title>Redirecting...</title>"
"<meta http-equiv=\"refresh\" content=\"0; url='" + html.escape(url) + "'\" />"
"</head><body><p><a href=\"" + html.escape(url) + "\">Redirect</a></p></body></html>")
else:
responseType = "400 Bad Request"
fullRequestPath = script_directory + "/webroot/400.html"
page = open(fullRequestPath).read()
# Clear sensitive locals
username = ""
password = ""
password2 = ""
responsecontent = page.encode()
+189
View File
@@ -0,0 +1,189 @@
@font-face {
font-family: comicsansms;
src: url(/fonts/comic.ttf);
}
@supports (display: grid) {
#oldmodelink {
display: none;
}
}
.fitinpageplease {
max-width: 100%;
height: auto;
display: block;
}
body {
color: #f5b;
}
.bgimage {
background-color: #88a;
background-image: url("/Images/DingusSun.jpg");
background-position: center;
background-size: cover;
background-repeat: no-repeat;
position: fixed;
top:-10%;
left:-10%;
filter: blur(8px);
-webkit-filter: blur(8px);
width: 120%;
height: 130vh;
height: 130svh;
margin: none;
}
.gray {
background-color: #333;
color: #ccc;
}
footer {
padding: 1%;
margin: none;
}
header {
position: sticky;
top:0;
}
.bottomright {
position:fixed;
right:20;
bottom:20;
}
#grid-container {
position: absolute;
top: 0;
left: 0;
width: 100%;
display:grid;
grid-template-rows: auto 1fr auto;
grid-template-columns: 100%;
min-height: 100vh;
min-height: 100svh;
}
article {
width: 65%;
margin: auto;
margin-top: 0;
}
.article-content-block {
background-color: #222;
padding: 3%;
}
.navbar {
background-color: #333;
color: #fff;
height: 48px;
padding:none;
}
.nav-button {
position:relative;
display: inline-block;
vertical-align: top;
border: 2px solid #000;
padding: 6px;
background-color: #333;
height: 32px;
color: #fff;
}
.nav-content {
height: 32px;
color: #fff;
display: flex;
align-items: center;
}
.nav-content img {
height: 32px;
width: 32px;
object-fit: cover;
margin-right: 6px;
}
.definition {
cursor: help;
text-decoration: underline;
text-decoration-style: dotted;
}
.dropdown-content {
display: none;
position: absolute;
margin-left: -8px;
margin-top: 8px;
width: max-content;
background-color: #444;
z-index: 1;
border: 2px solid #000;
}
.nav-button a {
text-decoration: none;
}
.nav-button:hover {
background-color: #444;
}
h1, h2, h3, h4, h5, h6 {
color: #b5f;
margin-bottom: 0px;
}
a {
color: #88f;
}
li a {
color: #f5b;
}
h6 a {
color: #b5f;
}
.subtitle, .subtitle * {
font-size: 10pt;
color: #888;
}
.nav-button:hover .dropdown-content {
display: block;
}
.dropdown-content .nav-button {
width: calc(100% - 16px);
}
.error {
background-color: #f44;
color: #000;
width: fit-content;
padding: 0.3%
}
.container {
display: block;
}
@media print {
.no-print, .no-print * {
display: none !important;
}
article {
width: 100%;
margin: auto;
margin-top: 0;
}
.article-content-block {
break-inside: auto;
}
h2, h3 {
break-after: avoid;
}
p, ul, li {
break-inside: avoid;
}
#grid-container {
display: block;
position: static;
min-height: unset;
}
.bgimage {
display: none;
}
.container {
break-inside: avoid;
}
footer {
position: fixed;
bottom: 0;
}
}
+186
View File
@@ -0,0 +1,186 @@
@font-face {
font-family: comicsansms;
src: url(/fonts/comic.ttf);
}
@supports (display: grid) {
#oldmodelink {
display: none;
}
}
.fitinpageplease {
max-width: 100%;
height: auto;
display: block;
}
body {
color: #503;
}
.bgimage {
background-color: #0f8340;
background-image: url("/Images/DingusGrass.jpg");
background-position: center;
background-size: cover;
background-repeat: no-repeat;
position: fixed;
top:-10%;
left:-10%;
filter: blur(8px);
-webkit-filter: blur(8px);
width: 120%;
height: 130vh;
height: 130svh;
margin: none;
}
.gray {
background-color: #333;
color: #ccc;
}
footer {
padding: 1%;
margin: none;
}
header {
position: sticky;
top:0;
}
.bottomright {
position:fixed;
right:20;
bottom:20;
}
#grid-container {
position: absolute;
top: 0;
left: 0;
width: 100%;
display:grid;
grid-template-rows: auto 1fr auto;
grid-template-columns: 100%;
min-height: 100vh;
min-height: 100svh;
}
article {
width: 65%;
margin: auto;
margin-top: 0;
}
.article-content-block {
background-color: #ddd;
padding: 3%;
}
.navbar {
background-color: #333;
color: #fff;
height: 48px;
padding:none;
}
.nav-button {
position:relative;
display: inline-block;
vertical-align: top;
border: 2px solid #000;
padding: 6px;
background-color: #333;
height: 32px;
color: #fff;
}
.nav-content {
height: 32px;
color: #fff;
display: flex;
align-items: center;
}
.nav-content img {
height: 32px;
width: 32px;
object-fit: cover;
margin-right: 6px;
}
.definition {
cursor: help;
text-decoration: underline;
text-decoration-style: dotted;
}
.dropdown-content {
display: none;
position: absolute;
margin-left: -8px;
margin-top: 8px;
width: max-content;
background-color: #444;
z-index: 1;
border: 2px solid #000;
}
.nav-button a {
text-decoration: none;
}
.nav-button:hover {
background-color: #444;
}
h1, h2, h3, h4, h5, h6 {
color: #305;
margin-bottom: 0px;
}
h6 a {
color: #305;
}
.subtitle, .subtitle * {
font-size: 10pt;
color: #888;
}
li a {
color: #503;
}
.nav-button:hover .dropdown-content {
display: block;
}
.dropdown-content .nav-button {
width: calc(100% - 16px);
}
.error {
background-color: #f44;
color: #000;
width: fit-content;
padding: 0.3%
}
.container {
display: block;
}
@media print {
.no-print, .no-print * {
display: none !important;
}
article {
width: 100%;
margin: auto;
margin-top: 0;
}
.article-content-block {
break-inside: auto;
}
h2, h3 {
break-after: avoid;
}
p, ul, li {
break-inside: avoid;
}
#grid-container {
display: block;
position: static;
min-height: unset;
}
.bgimage {
display: none;
}
.container {
break-inside: avoid;
}
footer {
position: fixed;
bottom: 0;
}
}
+179
View File
@@ -0,0 +1,179 @@
@font-face {
font-family: comicsansms;
src: url(/fonts/comic.ttf);
}
@supports (display: grid) {
#oldmodelink {
display: none;
}
}
.fitinpageplease {
max-width: 100%;
height: auto;
display: block;
}
.bgimage {
background-position: center;
background-size: cover;
background-repeat: no-repeat;
position: fixed;
top:-10%;
left:-10%;
filter: blur(8px);
-webkit-filter: blur(8px);
width: 120%;
height: 130vh;
height: 130svh;
margin: none;
}
.gray {
background-color: #333;
color: #ccc;
}
footer {
padding: 1%;
margin: none;
}
header {
position: sticky;
top:0;
}
.bottomright {
position:fixed;
right:20;
bottom:20;
}
#grid-container {
position: absolute;
top: 0;
left: 0;
width: 100%;
display:grid;
grid-template-rows: auto 1fr auto;
grid-template-columns: 100%;
min-height: 100vh;
min-height: 100svh;
}
article {
width: 65%;
margin: auto;
margin-top: 0;
min-width: 600px;
}
.article-content-block {
padding: 3%;
}
.navbar {
background-color: #333;
color: #fff;
height: 48px;
padding:none;
}
.nav-button {
position:relative;
display: inline-block;
vertical-align: top;
border: 2px solid #000;
padding: 6px;
background-color: #333;
height: 32px;
color: #fff;
}
.nav-content {
height: 32px;
color: #fff;
display: flex;
align-items: center;
}
.nav-content img {
height: 32px;
width: 32px;
object-fit: cover;
margin-right: 6px;
}
.definition {
cursor: help;
text-decoration: underline;
text-decoration-style: dotted;
}
.dropdown-content {
display: none;
position: absolute;
margin-left: -8px;
margin-top: 8px;
width: max-content;
background-color: #444;
z-index: 1;
border: 2px solid #000;
}
.nav-button a {
text-decoration: none;
}
.nav-button:hover {
background-color: #444;
}
h1, h2, h3, h4, h5, h6 {
margin-bottom: 0px;
}
.subtitle, .subtitle * {
font-size: 10pt;
color: #888;
}
.nav-button:hover .dropdown-content {
display: block;
}
.dropdown-content .nav-button {
width: calc(100% - 16px);
}
.error {
background-color: #f44;
color: #000;
width: fit-content;
padding: 0.3%;
}
.container {
display: block;
}
@media print {
* * {
color: #000
}
.no-print, .no-print * {
display: none !important;
}
article {
width: 100%;
margin: auto;
margin-top: 0;
}
.article-content-block {
break-inside: auto;
}
h2, h3 {
break-after: avoid;
}
p, ul, li {
break-inside: avoid;
}
#grid-container {
display: block;
position: static;
min-height: unset;
}
.bgimage {
display: none;
}
.container {
break-inside: avoid;
}
footer {
position: fixed;
bottom: 0;
}
.fitinpageplease {
max-width: 50%;
}
}
+22
View File
@@ -0,0 +1,22 @@
body {
color: #f5b;
}
.bgimage {
background-color: #88a;
background-image: url("/Images/DingusSun.jpg");
}
.article-content-block {
background-color: #222;
}
h1, h2, h3, h4, h5, h6 {
color: #b5f;
}
a {
color: #88f;
}
li a {
color: #f5b;
}
h6 a {
color: #b5f;
}
+19
View File
@@ -0,0 +1,19 @@
body {
color: #503;
}
.bgimage {
background-color: #0f8340;
background-image: url("/Images/DingusGrass.jpg");
}
.article-content-block {
background-color: #ddd;
}
h1, h2, h3, h4, h5, h6 {
color: #305;
}
h6 a {
color: #305;
}
li a {
color: #503;
}
+30
View File
@@ -0,0 +1,30 @@
@font-face {
font-family: comicsansms;
src: url(/fonts/comic.ttf);
}
div {
margin-left: 32px;
}
body {
color: #503;
}
p {
width: 80%;
}
.definition {
cursor: help;
text-decoration: underline;
text-decoration-style: dotted;
}
h1, h2, h3, h4, h5, h6 {
color: #305;
}
a {
color: #503;
}
.error {
background-color: #f44;
color: #000;
width: fit-content;
padding: 0.3%
}