initial commit uwu
This commit is contained in:
commit
490f9cb3d3
4 changed files with 328 additions and 0 deletions
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/vim
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=vim
|
||||||
|
|
||||||
|
### Vim ###
|
||||||
|
# Swap
|
||||||
|
[._]*.s[a-v][a-z]
|
||||||
|
!*.svg # comment out if you don't need vector files
|
||||||
|
[._]*.sw[a-p]
|
||||||
|
[._]s[a-rt-v][a-z]
|
||||||
|
[._]ss[a-gi-z]
|
||||||
|
[._]sw[a-p]
|
||||||
|
|
||||||
|
# Session
|
||||||
|
Session.vim
|
||||||
|
Sessionx.vim
|
||||||
|
|
||||||
|
# Temporary
|
||||||
|
.netrwhist
|
||||||
|
*~
|
||||||
|
# Auto-generated tag files
|
||||||
|
tags
|
||||||
|
# Persistent undo
|
||||||
|
[._]*.un~
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/vim
|
22
README.md
Normal file
22
README.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# Yet Another IP Tool
|
||||||
|
|
||||||
|
This is a pretty simple utility for displaying your IP address, HTTP User Agent,
|
||||||
|
and HTTP Request Headers using `curl(1)` or your browser.
|
||||||
|
It is written in PHP (sorry).
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
The whole thing is kept rather simple: just drop the `index.php` in your webroot,
|
||||||
|
adjust the `nginx.conf` sample file according to your situation, and you're good to go.
|
||||||
|
I tested it with PHP 7.4 and it appears to be working. I have no idea how that
|
||||||
|
translates to other PHP versions, but i assume anything from 7.3 will work just fine.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright © 2022 anna <owo@fef.moe>
|
||||||
|
|
||||||
|
Any person obtaining a copy of this software and associated documentation
|
||||||
|
files (the “Software”) is prohibited from using the Software under any
|
||||||
|
circumstances. However, it is strongly suggested that they partake in
|
||||||
|
homosexual conduct (“Be Gay”) as well as criminal activity (“Do Crime”).
|
||||||
|
|
246
index.php
Normal file
246
index.php
Normal file
|
@ -0,0 +1,246 @@
|
||||||
|
<?php
|
||||||
|
//
|
||||||
|
// fef's IP tool
|
||||||
|
// Copyright (c) 2022 anna <owo@fef.moe>
|
||||||
|
//
|
||||||
|
// Any person obtaining a copy of this software and associated documentation
|
||||||
|
// files (the ``Software'') is prohibited from using the Software under any
|
||||||
|
// circumstances. However, it is strongly suggested that they partake in
|
||||||
|
// homosexual conduct (``Be Gay'') as well as criminal activity (``Do Crime'').
|
||||||
|
//
|
||||||
|
// Ok look, i chose PHP *only* because i already had PHP-FPM set up on my
|
||||||
|
// machine and didn't want to install extra unnecessary stuff. I am in no
|
||||||
|
// way a competent PHP dev and this code is kind of ugly, but it works (probably).
|
||||||
|
// Also, just in case this isn't obvious, please stop writing PHP code.
|
||||||
|
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
|
||||||
|
http_response_code(204);
|
||||||
|
header('Allow: OPTIONS, GET');
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
|
||||||
|
$COMMANDS = ['headers', 'help', 'ip', 'ua'];
|
||||||
|
$SADDR = trim($_SERVER['REMOTE_ADDR']);
|
||||||
|
$CMD = substr(urldecode($_SERVER['REQUEST_URI']), 1);
|
||||||
|
if ($CMD == '') {
|
||||||
|
$CMD = 'ip';
|
||||||
|
}
|
||||||
|
$UA = trim($_SERVER['HTTP_USER_AGENT']??'');
|
||||||
|
$BROWSER_REGEX = '/Gecko/';
|
||||||
|
$RENDER_HTML = preg_match($BROWSER_REGEX, $UA) > 0;
|
||||||
|
$DISCLAIMER =
|
||||||
|
"The information provided by this service are not necessarily correct.\n".
|
||||||
|
"Do not use in production code.\n".
|
||||||
|
"Do not rely on availability.";
|
||||||
|
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] != 'GET') {
|
||||||
|
http_response_code(405);
|
||||||
|
header('Allow: OPTIONS, GET');
|
||||||
|
} else if (!in_array($CMD, $COMMANDS)) {
|
||||||
|
http_response_code(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($RENDER_HTML) {
|
||||||
|
header('Content-Type: text/html; charset=UTF-8');
|
||||||
|
} else {
|
||||||
|
header('Content-Type: text/plain; charset=UTF-8');
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTML escape a string if we are rendering to HTML
|
||||||
|
function esc($str) {
|
||||||
|
global $RENDER_HTML;
|
||||||
|
if ($RENDER_HTML) {
|
||||||
|
return htmlspecialchars($str, ENT_QUOTES, "UTF-8");
|
||||||
|
} else {
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make a string appear italic (or underline if rendering ANSI)
|
||||||
|
function underline($str) {
|
||||||
|
global $RENDER_HTML;
|
||||||
|
if ($RENDER_HTML) {
|
||||||
|
return "<span class=\"underline\">{$str}</span>";
|
||||||
|
} else {
|
||||||
|
return "\x1b[4m{$str}\x1b[0m";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make a string appear bold
|
||||||
|
function strong($str) {
|
||||||
|
global $RENDER_HTML;
|
||||||
|
if ($RENDER_HTML) {
|
||||||
|
return "<strong>{$str}</strong>";
|
||||||
|
} else {
|
||||||
|
return "\x1b[1m{$str}\x1b[0m";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute the "headers" command
|
||||||
|
function do_headers() {
|
||||||
|
$is_first = true;
|
||||||
|
|
||||||
|
foreach ($_SERVER as $key => $val) {
|
||||||
|
if (substr($key, 0, 5) == 'HTTP_') {
|
||||||
|
if ($is_first) {
|
||||||
|
$is_first = false;
|
||||||
|
} else {
|
||||||
|
echo "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$header_parts = explode('_', substr($key, 5));
|
||||||
|
$header = strtolower(implode('-', $header_parts));
|
||||||
|
echo esc($header).": ".esc($val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute the "ip" command
|
||||||
|
function do_ip() {
|
||||||
|
global $SADDR;
|
||||||
|
echo esc($SADDR);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute the "ua" command
|
||||||
|
function do_ua() {
|
||||||
|
global $UA;
|
||||||
|
echo esc($UA);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute the "help" command
|
||||||
|
function do_help() {
|
||||||
|
echo "Usage: curl ip.fef.moe[/".underline('command')."]\n";
|
||||||
|
echo "\n";
|
||||||
|
echo "Available ".underline('command')."s:\n";
|
||||||
|
echo " ".strong('headers')." print all HTTP request headers (in lowercase)\n";
|
||||||
|
echo " ".strong('help')." print this help text\n";
|
||||||
|
echo " ".strong('ip')." print your public facing IP address\n";
|
||||||
|
echo " ". " ". " (default behavior if ".underline('command')." is omitted)\n";
|
||||||
|
echo " ".strong('ua')." print your user agent\n";
|
||||||
|
echo "\n";
|
||||||
|
echo "HTTP response status codes:\n";
|
||||||
|
echo " ".strong('200')." ".underline('command')." ran successfully\n";
|
||||||
|
echo " ".strong('204')." request method was ".strong('OPTIONS')."\n";
|
||||||
|
echo " ".strong('404')." unknown ".underline('command')." issued\n";
|
||||||
|
echo " ".strong('405')." request method was not ".strong('GET')." or ".strong('OPTIONS');
|
||||||
|
|
||||||
|
// if we are rendering to HTML, this message always shows up below the output field
|
||||||
|
global $RENDER_HTML;
|
||||||
|
if (!$RENDER_HTML) {
|
||||||
|
global $DISCLAIMER;
|
||||||
|
echo "\n\n";
|
||||||
|
echo $DISCLAIMER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function if_cmd_is($test, $output) {
|
||||||
|
global $CMD;
|
||||||
|
if ($CMD == $test) {
|
||||||
|
return $output;
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the specified command
|
||||||
|
function run($cmd) {
|
||||||
|
$method = $_SERVER['REQUEST_METHOD'];
|
||||||
|
if ($method != 'GET') {
|
||||||
|
echo "Illegal HTTP request method: ".esc($method)."\n";
|
||||||
|
do_help();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($cmd) {
|
||||||
|
case 'ip':
|
||||||
|
do_ip();
|
||||||
|
break;
|
||||||
|
case 'ua':
|
||||||
|
do_ua();
|
||||||
|
break;
|
||||||
|
case 'headers':
|
||||||
|
do_headers();
|
||||||
|
break;
|
||||||
|
case 'help':
|
||||||
|
do_help();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
echo "Unknown command: ".esc($cmd)."\n";
|
||||||
|
do_help();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($RENDER_HTML) {
|
||||||
|
?><!doctype html>
|
||||||
|
<!--
|
||||||
|
Want to get rid of the HTML?
|
||||||
|
This tool tests your user agent against the regex <?= $BROWSER_REGEX ?>
|
||||||
|
to determine whether it is rendering to a graphical browser.
|
||||||
|
You can simply spoof your user agent or use curl to make it print
|
||||||
|
plain text (and ANSI escape sequences for the help command).
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
|
<title>fef's IP tool</title>
|
||||||
|
<!-- see https://git.bsd.gay/fef/blog for the CSS sources -->
|
||||||
|
<link rel="stylesheet" href="https://fef.moe/assets/css/main.css">
|
||||||
|
<style>
|
||||||
|
header ul, main, footer .container { max-width: 1200px; }
|
||||||
|
.underline { text-decoration: underline; }
|
||||||
|
.red { font-weight: 700; color: #ff5555; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li<?= if_cmd_is('ip', ' aria-current="page"') ?>><a href="/ip">IP Address</a></li>
|
||||||
|
<li<?= if_cmd_is('ua', ' aria-current="page"') ?>><a href="/ua">User Agent</a></li>
|
||||||
|
<li<?= if_cmd_is('headers', ' aria-current="page"') ?>><a href="/headers">Headers</a></li>
|
||||||
|
<li<?= if_cmd_is('help', ' aria-current="page"') ?>><a href="/help">Help</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<pre><code><?php
|
||||||
|
}
|
||||||
|
|
||||||
|
run($CMD);
|
||||||
|
|
||||||
|
if ($RENDER_HTML) { ?>
|
||||||
|
</code></pre>
|
||||||
|
<p><?= $DISCLAIMER ?></p>
|
||||||
|
</main>
|
||||||
|
<footer>
|
||||||
|
<div class="container">
|
||||||
|
<div>
|
||||||
|
<p>
|
||||||
|
fef's IP utility
|
||||||
|
© 2022 anna <owo -at- fef.moe>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
You are seeing this fancy-pants HTML version because
|
||||||
|
your user agent matches the regex <code><?= $BROWSER_REGEX ?></code>.
|
||||||
|
If you want plaintext only, use a CLI tool like curl
|
||||||
|
or spoof your user agent.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<ul>
|
||||||
|
<li>Source Code: <a href="https://git.bsd.gay/fef/iptool">Gitea</a></li>
|
||||||
|
<li>Main Website: <a href="https://fef.moe/">fef.moe</a></li>
|
||||||
|
<li>Twitter: <a href="https://twitter.com/libfef">@libfef</a></li>
|
||||||
|
<li>Fediverse: <a href="https://catcatnya.com/@fef">@fef@catcatnya.com</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php
|
||||||
|
} else {
|
||||||
|
echo "\n";
|
||||||
|
}
|
35
nginx.conf
Normal file
35
nginx.conf
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# Example nginx virtual host configuration file for a Debian server running PHP 7.4 FPM.
|
||||||
|
# SSL is optional (curl doesn't use it if you just toss a domain without protocol at it
|
||||||
|
# anyway) but best practice i guess. Just make sure you're not *forcefully* redirecting
|
||||||
|
# HTTP to HTTPS, because curl also doesn't follow redirects by default.
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen 443 ssl http2;
|
||||||
|
|
||||||
|
# IPv6 is important!
|
||||||
|
listen [::]:80;
|
||||||
|
listen [::]:443 ssl http2;
|
||||||
|
|
||||||
|
server_name example.com;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
|
||||||
|
|
||||||
|
root /var/www;
|
||||||
|
index index.php;
|
||||||
|
access_log off;
|
||||||
|
error_log off;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
# i have no idea what like half of these options do lmao
|
||||||
|
include fastcgi_params;
|
||||||
|
try_files $fastcgi_script_name =404;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue