commit
3a11453dd1
@ -0,0 +1,10 @@ |
||||
# Remote access |
||||
Require ip 68.147.189.97 |
||||
Require ip 96.53.11.174 |
||||
Require ip 127.0.0.1 |
||||
Require ip 137.184.238.236 |
||||
|
||||
#Require all granted |
||||
|
||||
|
||||
|
||||
@ -0,0 +1,17 @@ |
||||
{ |
||||
"printWidth": 100, |
||||
"proseWrap": "always", |
||||
"semi": false, |
||||
"singleQuote": true, |
||||
"braceStyle": "1tbs", |
||||
"tabWidth": 3, |
||||
"plugins": [ |
||||
"@prettier/plugin-php" |
||||
], |
||||
"overrides": [ |
||||
{ |
||||
"files": "*.php", |
||||
"options": { "parser": "html" } |
||||
} |
||||
] |
||||
} |
||||
@ -0,0 +1,5 @@ |
||||
<footer> |
||||
<p>Copy © 2025</p> |
||||
</footer> |
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.min.js" integrity="sha512-ykZ1QQr0Jy/4ZkvKuqWn4iF3lqPZyij9iRv6sGqLRdTPkY69YX6+7wvVGmsdBbiIfN/8OdsI7HABjvEok6ZopQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
||||
@ -0,0 +1,15 @@ |
||||
<nav class="navbar navbar-dark navbar-expand"> |
||||
<div class="container"> |
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#main-nav" aria-controls="main-nav" aria-expanded="false" aria-label="Toggle navigation"> |
||||
<span class="navbar-toggler-icon"></span> |
||||
</button> |
||||
<a class="navbar-brand">{project}</a> |
||||
<div id="main-nav" class="collapse navbar-collapse flex-grow-0"> |
||||
<ul class="navbar-nav me-auto"> |
||||
<li class="nav-item"><a class="nav-link active">Services</a></li> |
||||
<li class="nav-item"><a class="nav-link">News</a></li> |
||||
<li class="nav-item"><a class="nav-link">Documentation</a></li> |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
</nav> |
||||
@ -0,0 +1,7 @@ |
||||
<title>{title}</title> |
||||
<meta charset="utf-8"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" integrity="sha512-jnSuA4Ss2PkkikSOLtYs8BlYIeeIK1h99ty4YfvRPAlzr377vr3CXDb7sb7eEEBYjDtcYj+AjBH3FLv5uSJuXg==" crossorigin="anonymous" referrerpolicy="no-referrer" /> |
||||
|
||||
<link rel="icon" type="image/x-icon" href="/meta/favicon.ico"> |
||||
@ -0,0 +1,59 @@ |
||||
<form method="post"> |
||||
<div class="row gx-3"> |
||||
<div class="col-4"> |
||||
<div class="p-3 border rounded-3 h-100"> |
||||
<label class="form-label"><span class="form-text">Src </span> <input class="form-control" name="src" placeholder="example" required><em>example</em>.tr.jit-tr.com</label> |
||||
<label class="form-label"><span class="form-text">Site </span><input class="form-control" name="site" placeholder="example.com" required></label> |
||||
</div> |
||||
</div> |
||||
<div class="col-8"> |
||||
<div class="p-3 border rounded-3 h-100"> |
||||
<div class="form-text">Append</div> |
||||
<textarea class="form-control" name="append"><script src="https://dev.api.jit-tr.com"></script></textarea> |
||||
</div> |
||||
</div> |
||||
<div class="col-12 mt-3"> |
||||
<button class="btn btn-primary" type="submit">Add new site</button> |
||||
</div> |
||||
</div> |
||||
</form> |
||||
<?php |
||||
if (count($_POST)!==0) { |
||||
require('config.php'); |
||||
error_log(json_encode($_POST)); |
||||
|
||||
$payload= (object)[]; |
||||
$payload->src = $_POST['src'] . '.tr.jit-tr.com'; |
||||
$payload->site = 'https://' . $_POST['site']; |
||||
$payload->append = $_POST['append']; |
||||
|
||||
error_log(json_encode($payload)); |
||||
|
||||
$ch = curl_init($cfg['API_ENDPOINT_REDIRECTS']); |
||||
|
||||
curl_setopt_array($ch, [ |
||||
CURLOPT_RETURNTRANSFER => true, |
||||
CURLOPT_POST => true, |
||||
CURLOPT_HTTPHEADER => [ |
||||
'Accept: application/json', |
||||
'Content-Type: application/json', |
||||
"X-API-Key: $cfg[API_KEY]" |
||||
], |
||||
CURLOPT_POSTFIELDS => json_encode($payload), |
||||
]); |
||||
|
||||
$response = curl_exec($ch); |
||||
|
||||
if (curl_errno($ch)) { |
||||
echo 'Curl error: ' . curl_error($ch); |
||||
curl_close($ch); |
||||
exit; |
||||
} else { |
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); |
||||
header('Location: list-site.php'); |
||||
echo "HTTP Status Code: $httpCode\n"; |
||||
echo "Response:\n$response"; |
||||
curl_close($ch); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,18 @@ |
||||
/* Add site scipts */ |
||||
((func) => { |
||||
if (document.readyState === "loading") { |
||||
document.addEventListener("DOMContentLoaded", func); |
||||
} else { |
||||
func(); |
||||
} |
||||
})( |
||||
()=>{ |
||||
const input_src = document.querySelector('input[name=src]') |
||||
const em = document.querySelector('input[name=src] ~ em') |
||||
em.innerText = input_src.value |
||||
|
||||
input_src.onkeyup=(e)=>{ |
||||
em.innerText = e.target.value |
||||
} |
||||
} |
||||
) |
||||
@ -0,0 +1,3 @@ |
||||
API_KEY='24cb8ac71d5c6ee99f3da398e1234ae3dbf1cfaa86750711d9b63032caeaa164' |
||||
API_ENDPOINT_REDIRECTS="https://pr.sr.jit-tr.com/pr-admin/api/redirects" |
||||
|
||||
@ -0,0 +1,3 @@ |
||||
<?php |
||||
|
||||
$cfg = parse_ini_file('config.ini'); |
||||
@ -0,0 +1,53 @@ |
||||
<?php |
||||
require_once 'config.php'; |
||||
require_once 'lib/template.php'; |
||||
|
||||
# Necessary since I'm not using RewriteRule |
||||
$basehref = dirname($_SERVER['SCRIPT_NAME']); |
||||
|
||||
if (isset($_SERVER['PATH_INFO'])) { |
||||
if ($_SERVER['PATH_INFO'] === '/' ) { |
||||
$contents = include_path('/list-site.php'); |
||||
} else { |
||||
$contents = include_path($_SERVER['PATH_INFO']); |
||||
} |
||||
} else { |
||||
header("Location: {$_SERVER['SCRIPT_NAME']}/"); |
||||
exit; |
||||
} |
||||
|
||||
?> |
||||
<!doctype html> |
||||
<html> |
||||
<head lang="en"> |
||||
<?= snippet_include('_meta.html', ['title'=>'Hello World' ]) ?> |
||||
|
||||
<!-- cache breaking --> |
||||
<link rel="stylesheet" href="<?= $basehref ?>/main.css?<?= time() ?>">
|
||||
<style> |
||||
/* |
||||
main,footer,.container,.row { border: 1px dashed #ffab27; } |
||||
*/ |
||||
</style> |
||||
</head> |
||||
<body> |
||||
<header class="mb-5"> |
||||
<?= snippet_include('_header.html') ?> |
||||
</header> |
||||
|
||||
<main class="bg-body-tertiary flex-grow-1"> |
||||
<div class="container"> |
||||
<?= $contents ?> |
||||
</div> |
||||
</main> |
||||
|
||||
<footer> |
||||
<div class="container"> |
||||
<?= snippet_include('_footer.html') ?> |
||||
</div> |
||||
</footer> |
||||
|
||||
<!-- cache breaking --> |
||||
<script src="<?= $basehref ?>/app.js?<?= time() ?>"></script>
|
||||
</body> |
||||
</html> |
||||
@ -0,0 +1,61 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* include_path |
||||
* |
||||
* uses a partial url, eg '/foo' to locate a corresponding |
||||
* php file, eg 'foo.php', and execute it. |
||||
* |
||||
* url_fragment - a key to locating php files, no extetension |
||||
letters and hyphens are ok |
||||
*/ |
||||
function include_path($url_fragment) { |
||||
if (preg_match('#^/([a-z-]+.php)$#', $url_fragment, $matches)) { |
||||
$path = __DIR__ . '/../' . $matches[1]; |
||||
} else { |
||||
$path = null; |
||||
} |
||||
|
||||
if (file_exists($path)) { |
||||
ob_start(); |
||||
include $path; |
||||
$result = ob_get_clean(); |
||||
|
||||
return $result; |
||||
} else { |
||||
# Hard bail |
||||
http_response_code(404); |
||||
echo "404: $path not found\n"; |
||||
exit; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* snippet_include |
||||
* |
||||
* loads non_php file for parsing. |
||||
* Uses {varname} to replace strings |
||||
* |
||||
* filename |
||||
* context - a keyed array for matching |
||||
* eg [ 'title'=>'Home Page', ... ] |
||||
*/ |
||||
function snippet_include($filename, $context=[]) { |
||||
$snippet = file_get_contents($filename); |
||||
|
||||
// Handle comments {* ... *} |
||||
$snippet = preg_replace('/ *{\*(.*?)\*}\n*/s','',$snippet); |
||||
|
||||
// Use regex to find {placeholders} in the template |
||||
// Note this uses a callback function to do the matches |
||||
$snippet = preg_replace_callback('/\{\s*(\w+)\s*\}/', function($matches) use ($context) { |
||||
$key = $matches[1]; |
||||
|
||||
$value = isset($context[$key]) ? $context[$key] : $key; |
||||
|
||||
return $value; |
||||
}, $snippet); |
||||
|
||||
return $snippet; |
||||
} |
||||
|
||||
@ -0,0 +1,48 @@ |
||||
<pre><?php |
||||
require('config.php'); |
||||
|
||||
$rows = []; |
||||
$ch = curl_init($cfg['API_ENDPOINT_REDIRECTS']); |
||||
|
||||
// Set curl options |
||||
curl_setopt_array($ch, [ |
||||
CURLOPT_FAILONERROR => true, |
||||
CURLOPT_FOLLOWLOCATION => false, |
||||
CURLOPT_RETURNTRANSFER => true, |
||||
CURLOPT_HTTPHEADER => [ |
||||
'X-API-Key: ' . $cfg['API_KEY'], |
||||
'accept: application/json', |
||||
], |
||||
]); |
||||
|
||||
$response = curl_exec($ch); |
||||
|
||||
if (!curl_errno($ch) && curl_getinfo($ch)['http_code'] === 200) { |
||||
$rows = json_decode($response); |
||||
} else { |
||||
var_dump(curl_getinfo($ch)['http_code']); |
||||
var_dump(curl_error($ch)); |
||||
} |
||||
curl_close($ch); |
||||
?> |
||||
<table class="table table-striped table-hover"> |
||||
<thead> |
||||
<tr> |
||||
<th>Entry Source</th><th>Redirect to</th><th>Append</th><th>Actions</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
<?php |
||||
foreach ($rows as $row) { |
||||
$row->safe_append = htmlentities($row->append); |
||||
echo "<tr>\n"; |
||||
echo "<td><a target=\"_blank\" href=\"https://{$row->src}\">{$row->src}</a></td>"; |
||||
echo "<td>{$row->site}</td>"; |
||||
echo "<td>{$row->safe_append}</td>"; |
||||
echo "<td><button name=\"delete\" data-id=\"{$row->_id}\">🚮</button><button name=\"edit\" data-id=\"{$row->_id}\">✎</button></td>"; |
||||
echo "</tr>\n"; |
||||
} |
||||
?> |
||||
</tbody> |
||||
</table> |
||||
<a class="btn btn-primary" href="add-site.php">Add another one</a> |
||||
@ -0,0 +1,19 @@ |
||||
:root { |
||||
--theme-primary: #7952B3; |
||||
} |
||||
|
||||
nav.navbar-dark { |
||||
background-color: var(--theme-primary); |
||||
} |
||||
|
||||
body { |
||||
min-height: 100vh; |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
textarea[name='append'] { |
||||
background-color: #3b2c1d; |
||||
color: #ccc; |
||||
height: 130px; |
||||
} |
||||
@ -0,0 +1,55 @@ |
||||
/* https://www.joshwcomeau.com/css/custom-css-reset/ */ |
||||
/* 1. Use a more-intuitive box-sizing model */ |
||||
*, *::before, *::after { |
||||
box-sizing: border-box; |
||||
} |
||||
|
||||
/* 2. Remove default margin */ |
||||
* { |
||||
margin: 0; |
||||
} |
||||
|
||||
/* 3. Enable keyword animations */ |
||||
@media (prefers-reduced-motion: no-preference) { |
||||
html { |
||||
interpolate-size: allow-keywords; |
||||
} |
||||
} |
||||
|
||||
body { |
||||
/* 4. Add accessible line-height */ |
||||
line-height: 1.5; |
||||
/* 5. Improve text rendering */ |
||||
-webkit-font-smoothing: antialiased; |
||||
} |
||||
|
||||
/* 6. Improve media defaults */ |
||||
img, picture, video, canvas, svg { |
||||
display: block; |
||||
max-width: 100%; |
||||
} |
||||
|
||||
/* 7. Inherit fonts for form controls */ |
||||
input, button, textarea, select { |
||||
font: inherit; |
||||
} |
||||
|
||||
/* 8. Avoid text overflows */ |
||||
p, h1, h2, h3, h4, h5, h6 { |
||||
overflow-wrap: break-word; |
||||
} |
||||
|
||||
/* 9. Improve line wrapping */ |
||||
p { |
||||
text-wrap: pretty; |
||||
} |
||||
h1, h2, h3, h4, h5, h6 { |
||||
text-wrap: balance; |
||||
} |
||||
|
||||
/* |
||||
10. Create a root stacking context |
||||
*/ |
||||
#root, #__next { |
||||
isolation: isolate; |
||||
} |
||||
@ -0,0 +1,29 @@ |
||||
#!/bin/bash |
||||
if [[ -z $2 ]] |
||||
then |
||||
echo "USAGE: $0 example.com example.tr.jit-tr.com" |
||||
echo "" |
||||
exit |
||||
fi |
||||
|
||||
src=$2 |
||||
site=https://$1 |
||||
|
||||
. config.ini |
||||
|
||||
PAYLOAD=$(cat <<EOF |
||||
{ |
||||
"src": "$src", |
||||
"site": "$site", |
||||
"append": "<script src=\"https://api.jit-tr.com/\"></script>" |
||||
} |
||||
EOF |
||||
) |
||||
|
||||
curl -s -X 'POST' \ |
||||
"$API_ENDPOINT_REDIRECTS" \ |
||||
-H 'accept: application/json' \ |
||||
-H "x-api-key: $API_KEY" \ |
||||
-H 'Content-Type: application/json' \ |
||||
-d "$PAYLOAD" |
||||
|
||||
@ -0,0 +1,16 @@ |
||||
#!/bin/bash |
||||
if [[ -z $1 ]] |
||||
then |
||||
echo "USAGE: $0 {uniqueid}" |
||||
echo "" |
||||
exit |
||||
fi |
||||
|
||||
id=$1 |
||||
|
||||
. config.ini |
||||
|
||||
curl -s -X 'DEL' \ |
||||
"$API_ENDPOINT_REDIRECTS/$id" \ |
||||
-H 'accept: application/json' \ |
||||
-H "x-api-key: $API_KEY" |
||||
@ -0,0 +1,10 @@ |
||||
#!/bin/bash |
||||
|
||||
. config.ini |
||||
|
||||
curl -s -X 'GET' \ |
||||
"$API_ENDPOINT_REDIRECTS" \ |
||||
"https://$DOMAIN/admin/api/redirects" \ |
||||
-H 'accept: application/json' \ |
||||
-H "x-api-key: $API_KEY" | jq . |
||||
|
||||
Loading…
Reference in new issue