Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Tiedostolistaaja/ alkeellinen admin-työkalu

verge [12.11.2005 20:39:43]

#

Tiedostolistaaja, jossa on pieniä lisäominaisuuksia: tiedostojen ja hakemistojen poistaminen, piilottaminen (myös RexExpeillä) ja lukemisen esto. Lisäksi puukuvain-toiminto, joka näyttää kerralla myös kaikki alihakemistot tiedostoineen.

Tämä versio tarvitsee JavaScript-tuen esteettisistä syistä, mutta kaikki oikeastaan toimii ilmankin. Puukuvain ei toimi ilman JavaScriptia.

Koodi on PHP:tä, XHTML:ää ja CSS:ää sekä JavaScriptiä ja toimii myös Internet Explorer 6:lla.

CSS ja funktiot erillisissä tiedostoissa lukemisen helpottamiseksi.

Näytettävä hakemisto annetaan otsikkorivillä pistämällä osoitteen perään ?dir=POLKU. browser.php:n alusta voi muuttaa muutamia asetuksia. Listaaja pitää pistää sivutilan juureen. Admin-tilassa näytetään myös piilotetut tiedostot ja kaikkiin hakemistoihin pääsee.

Screenshotteja ja tarvittavat filut:

http://sj87.hopto.org/browser

browser.php (päätiedosto)

<?php
/* Asetukset */
$admin_password = "passu tähän"; // Admin-salasana
$iconset = "content/iconset"; // Kuvakesetin polku
$kuvaus = 1; // Luetaanko määrätyistä tiedostoista Kuvaus-kenttään viimeinen rivi (1 = päällä, 0 = pois päältä)
$loginTime = 120; // Kuinka kauan admin-keksi on voimassa sekunteina

// Määritteet, joiden mukaan hakemistoja tai tiedostoja piilotetaan (REGEXP)
$hide = array (
	".prv$", //.prv-päätteiset
	"^_", // Merkillä _ alkavat
	"~$", // Aaltoviivaan loppuvat
	);

// Määritteet, joiden mukaan tiedostoista luetaan viimeinen rivi Kuvaus-kenttään (pelkkä ARRAY)
// Suoritetaan vain, jos $kuvaus:n arvo on 1
$info = array (
	".php", // .php-loppuiset
	".txt",
	".html",
	);

// Hakemistot, joihin pääsy evätään, ilman alun ja lopun kenoviivaa
$f_dirs = array (
	"salasanat",
	"salaista",
	);

// Virheilmoitukset
$errors = array (
	1 => "Polkua ei annettu", // Jos $_GET['p']:llä ei ole arvoa
	2 => "Ei oikeuksia hakemistoon", // Jos käyttäjä yrittää päästä kiellettyyn hakemiston
	);

// Tiedostojen prosessointiin tarvittavat funktiot

include ("del-files.func");
include ("trimFileSize.f");
include ("getProperties.f");

if (!empty ($_POST['action'])) {
	if ($_POST['action'] == "login" && $_POST['password'] == $admin_password)
		setcookie ("browserAdmin", time(), time () + $loginTime);
	elseif ($_POST['action'] == "remove-files" && isset ($_COOKIE['browserAdmin'])) {
		foreach ($_POST['f'] as $x) {
			if (!file_exists ($x)) exit ("Tiedostoa/ hakemistoa $x ei ole olemassa!");
			elseif (is_dir ($x)) {
				delFiles ($x);
				rmdir ($x);
			} else unlink ($x);
		}
	}
	@exit (header ("Location: /" . rtrim ($_POST['dir'], "/") . "/"));
} elseif (isset ($_GET['treeview'])) exit (include ("dirtree.php"));

function microtime_float () {
   list ($usec, $sec) = explode (" ", microtime ());
   return ((float)$usec + (float)$sec);
}

$time_start = microtime_float ();

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
	<title>Polku: /<?php echo @rtrim ($_GET['dir'], "/"); ?>/</title>
	<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
	<link href="/browser.css" type="text/css" rel="stylesheet" />

	<script type="text/javascript">
	time = <?php echo ((@$cookie = $_COOKIE['browserAdmin']) ? $cookie - time() + $loginTime : 0); ?>;
	login = 0;
	function countDown() {
		if (time > 0) {
			if (!login) {
				document.getElementById('login-button').style.display = "none";
				document.getElementById('del-wrap').style.display = "block";
				login = 1;
			}
			document.getElementById('timer').value = time--;
			setTimeout ("countDown()", 1000);
		} else {
			document.getElementById('login-button').style.display = "block";
			document.getElementById('del-wrap').style.display = "none";
			login = 0;
		}
	}
	</script>
</head>

<body onload="countDown()">

<div id="sidebar">
	<input id="login-button" type="button" value="Login" onclick="document.getElementById('login').style.display='block'" />

	<div id="del-wrap">
		<input type="button" value="Poista" onclick="document.getElementById('remove').submit()" />
		<label>Logout:</label>
		<input type="text" id="timer" />
	</div>
	<a href="<?php echo "{$_SERVER['PHP_SELF']}?dir=" . rtrim ($_GET['dir'], "/"); ?>&treeview">Treeview</a>
</div>

<form id="login" action="/<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<div>
<input type="hidden" name="action" value="login" />
<input type="hidden" name="dir" value="<?php echo rtrim ($_GET['dir'], "/") . "/"; ?>" />
<input type="password" name="password" />
<input type="submit" value="Login" />
<input type="button" value="Peruuta" onclick="document.getElementById('login').style.display='none'" />
</div>
</form>

<form id="remove" action="/browser.php" method="post">
<table id="body">

<tr class="hilit">
<td class="icon"><input type="hidden" name="action" value="remove-files" /> <input type="hidden" name="dir" value="<?php echo rtrim ($_GET['dir'], "/") . "/"; ?>" /></td>
<td class="nimi">Nimi</td>
<td class="koko">Koko</td>
<td class="kuvaus">Kuvaus</td>
<?php

if (isset ($_COOKIE['dirlistAdmin'])) {
	echo "<td class=\"admin\"></td>";
	$admin = 1;
} else $admin = 0;

?>
</tr>

<?php

/* --------------------------------------------------- */
/* Varsinainen koodi alkaa */
/* --------------------------------------------------- */

@$dir = rtrim ($_GET['dir'], "/");

if (@empty ($_GET['dir'])) $error = 1;
elseif (empty ($_COOKIE['browserAdmin']) && in_array ($dir, $f_dirs)) $error = 2;
else $error = 0;

if ($error != 0) echo "<tr><td id=\"notice\" colspan=\"5\">$errors[$error]</td></tr>\n";
else {
	if (strpos ($dir, "/")) echo "<tr><td></td><td class=\"nimi\"><a href=\"/" . substr ($dir, 0, strrpos ($dir, "/")) . "\">(Ylempi taso)</a></td><td></td><td></td><td></td></tr>\n";

	$kohteet = glob ("$dir/*");
	$files = $dirs = $total_size = 0;

	// Suolletaan hakemistot

	foreach ($kohteet as $i => $kohde) {
		if (is_dir ($kohde)) {
			$nimi = substr (strrchr ($kohde, "/"), 1);
			$tiedot = getProperties ($kohde, $hide, 0,0,0);

			if ($tiedot['show']) {
				echo "<tr><td><img src=\"/$iconset/dir.gif\" alt=\"DIR\" /></td><td class=\"nimi\"><a href=\"?dir=$kohde\">$nimi</a></td><td></td><td></td><td>"
				. (isset ($_COOKIE['browserAdmin']) ? "<input type=\"checkbox\" name=\"f[$i]\" value=\"$kohde\" />" : "") .
				"</td></tr>\n";

				$dirs++;
			}
			unset ($kohteet[$i]);
		}
	}
	reset ($kohteet);

	// Käsitellään tiedostot

	$tyypit = file ("$iconset/doctypes.f");
	$f = array ("<!--", "-->");

	foreach ($kohteet as $i => $kohde) {
		$nimi = substr (strrchr ($kohde, "/"), 1);
		$tiedot = getProperties ($kohde, $hide, $info, $tyypit, $kuvaus);

		if ($tiedot['show']) {
			echo "<tr><td><img src=\"/$iconset/{$tiedot['icon']}\" alt=\"{$tiedot['laji']}\" /></td><td class=\"nimi\"><a href=\"/$kohde\">$nimi</a></td><td class=\"koko\">{$tiedot['koko']}</td><td>"
			. (($tiedot['kuvaus']) ? htmlentities (str_replace ($f, "", trim (end (file ($kohde)))), ENT_QUOTES, "UTF-8") : "") .
			"</td><td>"
			. ((isset ($_COOKIE['browserAdmin'])) ? "<input type=\"checkbox\" name=\"f[$i]\" value=\"$kohde\" />" : "") .
			"</td></tr>\n";

			$files++;
			$total_size += $tiedot['bytes'];
		}

	}

	$time_end = microtime_float ();
	$time = round ($time_end - $time_start, 3);
	$total_size = trimFileSize ($total_size);

	if (!$files && !$dirs) echo "<tr><td id=\"notice\" colspan=\"5\">Ei tiedostoja</td></tr>\n";
	echo "<tr id=\"bottom-bar\"><td colspan=\"5\">Polku: <span>/{$dir}/</span> Hakemistoja: <span>$dirs</span> Tiedostoja: <span>$files</span> Yhteiskoko: <span>$total_size</span> Aikaa meni: <span>$time s</span></td></tr>\n";
}
?>

</table>
</form>

</body>
</html>

doctypes.f

ESIMERKKI:

pic_name: filetype1, filetype2,

Voit lisätä omia tiedostotyyppejä ja -päätteitä listan loppuun:

zip: rar, zip, jar,
php: html, htm, php,
image: png, gif, jpeg, bmp, jpg, svg,
sound:  wav, wma, ogg, mp3, midi,
video: avi, mpg, mpeg, wmv,
text: txt, f, css,
exec: exe, com, bat,

dirtree.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
	<title>Treeview | <?php echo $_GET['dir']; ?></title>
	<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
	<style type="text/css">
	body {
	background: white;
	color: black;
	font: 12px tahoma, serif;
	}
	a {
	color: blue;
	text-decoration: none;
	}
	a:hover {
	color: red;
	}
	#root {
	margin-left: 30px;
	}
	ul {
	list-style-position: inside;
	padding: 0px;
	margin-left: 10px;
	}
	li {
	list-style: none;
	padding-top: 0px;
	padding-bottom: 4px;
	padding-left: 10px;
	float: left;
	clear: both;
	}
	ul > li {
	list-style: none;
	padding-left: 20px;
	}
	.directory {
	background: url(<?php echo "$iconset"; ?>/m_dir.gif) top left no-repeat;
	}
	.unknown {
	background: url(<?php echo "$iconset"; ?>/m_unknown.gif) top left no-repeat;
	}
<?php
$i = 5;
$doctypes = file ("$iconset/doctypes.f");
while ($i < count ($doctypes)) {
	$type = strtolower (substr ($doctypes[$i], 0, strpos ($doctypes[$i], ":")));
	echo "\t.$type {\n\tbackground: url({$iconset}/m_{$type}.gif) top left no-repeat;\n\t}\n";
	$i++;
}
?>
	.empty {
	color: #bbb;
	margin-left: 15px;
	padding-left: 0px;
	font-style: italic;
	list-style-type: disc;
	}
	#root li ul {
	display: none;
	}
	</style>

	<script src="dirtree.js" type="text/javascript"></script>
</head>

<body onload="opened = new Array();" onclick="listHover(event);">

<p><input type="text" id="infobar" style="width: 100%" value="Klikkaa kansioiden kuvakkeita avataksesi hakemiston" /></p>
<p><a href="<?php echo $_GET['dir']; ?>">Kansionäkymä</a></p>

<ul id="root">

<?php
function scanDir ($directory, $id) {
	$inside = glob ("$directory/*");
	$contents = array ();

	foreach ($inside as $key => $selection) {
		if (is_file ($selection)) {
			$contents[count ($contents)] = $selection;
			unset ($inside[$key]);
		}
	}

	foreach ($inside as $selection)
		$contents [count ($contents)] = $selection;

	unset ($inside);

	if (strpos ($_GET['dir'], "/")) {
		$upperdir = substr ($_GET['dir'], 0, strrpos ($_GET['dir'], "/"));
		echo "<li><a href=\"?dir=$upperdir&treeview\">..</a></li>\n";
	}

	$file_check = false;
	if (count ($contents) !== 0) {

		$x = 0;
		$file_check = false;
		while ($x < count ($contents)) {

			$single = substr (strrchr ($contents[$x], "/"), 1);
			$end = substr (strrchr ($single, "."), 1);

			if ($single{0} != "_" && $end != "prv") {
				$file_check = true;
				if (is_file ($contents[$x])) {
					$s = 5;
					$file_found = false;
					$iconset = "content/iconset";
					$file_types = file ("$iconset/doctypes.f");

					while ($s < count ($file_types)) {
					$list = explode (":", $file_types[$s]);

						if (strpos ($list[1], " " . $end . ",") !== false) {
							$class = $list[0];
							$file_found = true;
							break;
						}
						$s++;
					}
					if (!$file_found)
						$class = "unknown";

					echo "<li id=\"i_$single\" class=\"$class\"><a href=\"$contents[$x]\">$single</a>";

				} else {
					echo "<li id=\"i_$single\" class=\"directory\"><a href=\"?dir=$contents[$x]\">$single</a><ul>";
					$id = scanDir ($contents[$x], $id + 1);

					echo "</ul>";
				}
				$id++;
				echo "</li>\n";
			}
			$x++;
		}
	} else
		$id++;

	if (!$file_check)
		echo "<li class=\"empty\">Empty</li>\n";
	return $id;
}

if (isset ($_GET['dir']) && file_exists ($_GET['dir']) && is_dir ($_GET['dir']))
	scanDir ($_GET['dir'], 1);
else
	exit ("Directory doesn't exist!");
?>

<!-- #ROOT LOPPUU -->
</ul>

</body>
</html>

phadej [20.11.2005 21:05:05]

#

Jos salasana on kiinteänä itse skriptassa, ei sitä tarvi cryptata. Ja kaksikertoinen cryptaaminen vaan nostaa collisioneiden mahdollisuuden.

Edit: Äh, ymmärsin väärin. Sinne alkuun kirjotetaan hashi, juu juu, mutta silti tuplahashaaminen on turhaa.

verge [26.02.2006 12:19:31]

#

Juu no se md5() nyt vaan oli unohtunu sinne, kun alunperinkin lisäsin sinne, että jos jaan koodia jonneki muualle, niin en vahingossa jaa salasanaani mukana, kun aina joskus pääsee unohtumaan.

Päivitin samalla tuon koodin, ja nyt listaaja osaa järjestellä tiedostot (ei hakemistoja) nimen, koon ja tyypin perusteella, ja pikkusen muokkasin vähän nopeemmaks.

kaviaari [11.03.2006 17:17:41]

#

Eppapöhö :( miks kopioit mun nikin

verge [17.09.2006 16:29:51]

#

Päivitin tätä

Olli [21.01.2007 08:49:06]

#

Hieno ainakin screenshotien perusteella!
**tap tap**

OILgame [26.04.2008 19:33:41]

#

Logatessa sisään tämä ohjaa "http://browser.php/" -osoitteeseen, eli unohtaa domainin :(

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta