Init import

main
Rick Kuzik 9 months ago
commit 3a11453dd1
  1. 10
      .htaccess
  2. 17
      .prettierrc
  3. 5
      _footer.html
  4. 15
      _header.html
  5. 7
      _meta.html
  6. 59
      add-site.php
  7. 18
      app.js
  8. 3
      config.ini
  9. 3
      config.php
  10. 53
      index.php
  11. 61
      lib/template.php
  12. 48
      list-site.php
  13. 19
      main.css
  14. 55
      reset.css
  15. 29
      site-add.sh
  16. 16
      site-del.sh
  17. 10
      site-list.sh

@ -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 &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…
Cancel
Save