Subversion Repositories cryptochat

Compare Revisions

Regard whitespace Rev 1 → Rev 2

/trunk/private/old_messenger/files/DirectoryHashCalculator.class.php
0,0 → 1,98
<?php
 
class DirectoryHashCalculator {
/*
 
Directory Hash V3 by Daniel Marschall
 
<directoryhash> ::= SHA1(<directorycontext>)
<directorycontext> ::= "" | <entry>
<entries> ::= <entry> ["|" <entry>]
IMPORTANT: (MD5) SORTED ASCENDING!
<entry> ::= <file_md5_hash> <filenames>
<filenames> ::= "*" <relative_directory> <filename> [<filenames>]
IMPORTANT: (RelativeDir+Filename) SORTED ASCENDING!
<file_md5_hash> ::= MD5(FILECONTENT(<relative_directory> <filename>))
<filename> ::= given.
IMPORTANT: All directories (this automatically
excludes "", "." and "..") and non-existing resp.
non-readable files are not included.
addFile() will return false.
<relative_directory> ::= given.
Note: Usually, the directory is in relative diction.
IMPORTANT: "./" is always stripped from beginning!
IMPORTANT: "\" is made to "/"!
 
Example:
"" --> Empty directory
<hash1>*<file1_with_hash1>*<file2_with_hash1>|<hash2>*<file1_with_hash2>
*/
 
private $hashes;
 
function __construct() {
$this->clear();
}
 
private static function makeFilenameConsistently(&$filename) {
// Rule 1: Cut off "./" from beginning
if (substr($filename, 0, 2) == './') {
$filename = substr($filename, 2, strlen($filename)-2);
}
// Rule 2: Use "/" instead of "\"
$filename = str_replace('\\', '/', $filename);
}
 
/*
@return
MD5-Hash of the file or FALSE is calculation/adding
was not successful.
*/
public function addFile($file) {
if (!file_exists($file)) return false;
// if (!is_readable($file)) return false;
// if (basename($file) == '') return false;
// if (basename($file) == '.') return false;
// if (basename($file) == '..') return false;
self::makeFilenameConsistently($file);
$file_md5 = md5_file($file);
if ($file_md5 === false) return false; // Error...
$this->hashes[$file_md5][] = $file;
return $file_md5;
}
 
public function clear() {
$this->hashes = array();
}
 
private function getDirectoryContext() {
if (count($this->hashes) == 0) return '';
$directory_context = '';
// Sort md5 hashes ascending (so that the result is equal at every machine)
ksort($this->hashes);
foreach ($this->hashes as $hash => $filenames) {
// Sort filenames ascending (so that the result is equal at every machine)
sort($filenames);
$directory_context .= $hash;
foreach ($filenames as $filename) {
$directory_context .= '*'.$filename;
}
$directory_context .= '|';
}
$directory_context = substr($directory_context, 0, strlen($directory_context)-1);
return $directory_context;
}
 
public function calculateDirectoryHash() {
$directory_context = $this->getDirectoryContext();
return sha1($directory_context);
}
function getVersionDescription() {
return 'Marschall V3';
}
}
 
?>
/trunk/private/old_messenger/files/index.php
0,0 → 1,134
<?php
 
require 'DirectoryHashCalculator.class.php';
 
define('VER', '09.03.2010 21:30');
 
error_reporting(E_ALL | E_NOTICE);
 
$path = dirname($_SERVER['SCRIPT_NAME']);
 
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
 
<html>
 
<head>
<title>Index f&uuml;r <?php echo $path; ?></title>
</head>
 
<body>
 
<h1>Index f&uuml;r <?php echo $path; ?></h1>
 
<hr>
 
<br><table border="1" width="100%">
<tr>
<td><b>Dateiname</b></td>
<td><b>Hochgeladen / Aktualisiert</b> (Sort)</td>
<td align="right"><b>Dateigr&ouml;&szlig;e</b></td>
<td align="right"><b>MD5-Hash</b></td>
</tr><?php
 
$outarray = array();
$sizesum = 0;
$filesum = 0;
$hash_calculator = new DirectoryHashCalculator();
dir_rekursiv('', $outarray, $sizesum, $filesum, $hash_calculator);
ksort($outarray);
 
foreach ($outarray as $value) {
echo $value;
}
 
?>
</table><br>
 
<?php
 
 
$filesum = number_format($filesum, 0, ',', '.');
$sizesum = number_format($sizesum, 0, ',', '.');
 
/*
 
Note:
In this solution, ".*" and "index.html" (this script) and
"DirectoryHashCalculator.class.php" (required by this script)
are not calculated in because dir_rekursiv() ignored them,
so the Directory-Hash-Result may differ from other applications which
implement it.
*/
 
$directory_hash = $hash_calculator->calculateDirectoryHash();
$hash_alg = $hash_calculator->getVersionDescription();
 
echo '<p><code>Berechnung abgeschlossen am '.date('Y-m-d H:i:s \G\M\TO').'<br>';
echo "$filesum Dateien mit $sizesum Byte Gr&ouml;&szlig;e.<br>";
echo "Directory-Hash ($hash_alg): $directory_hash.</code></p>";
echo '<hr>';
echo '<p><i>Directory Listing Script Version '.VER.' &copy; 2010 <a href="http://www.viathinksoft.de/">ViaThinkSoft</a>.</i></p>';
 
?>
 
</body>
 
</html><?php
 
// Ref: http://www.php.net/manual/de/function.urlencode.php#96256
function encode_full_url($url) {
$url = urlencode($url);
$url = str_replace("%2F", "/", $url);
$url = str_replace("%3A", ":", $url);
$url = str_replace("+", "%20", $url); // Neu
return $url;
}
 
function dir_rekursiv($verzeichnis, &$outarray, &$sizesum, &$filesum, $hash_calculator) {
if ($verzeichnis == '') $verzeichnis = './';
$handle = opendir($verzeichnis);
while ($datei = readdir($handle))
{
if (($datei != '.') && ($datei != '..'))
{
$file = $verzeichnis.$datei;
if (is_dir($file)) // Wenn Verzeichniseintrag ein Verzeichnis ist
{
// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
dir_rekursiv($file.'/', $outarray, $sizesum, $filesum, $hash_calculator);
} else {
// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
if (substr($file, 0, 2) == './') {
$file = substr($file, 2, strlen($file)-2); // './' entfernen
}
if (($file != 'index.php') &&
($file != 'DirectoryHashCalculator.class.php') &&
(substr($file, 0, 1) != '.')) {
$filesize = filesize($file);
$sizesum += $filesize;
$filesum++;
$sizeformat = number_format($filesize, 0, ',', '.');
$file_md5 = $hash_calculator->addFile($file);
if ($file_md5 === false) $file_md5 = '<b>ERROR!</b>';
$mtime = filemtime($file);
$date = date('Y-m-d H:i:s \G\M\TO', $mtime);
if (!isset($outarray[$mtime])) $outarray[$mtime] = '';
$outarray[$mtime] .= '<tr>
<td><a href="'.encode_full_url($file).'" target="_blank">'.str_replace('/', ' / ', $file).'</a></td>
<td>'.$date.'</td>
<td align="right">'.$sizeformat.'</td>
<td align="right"><code>'.$file_md5.'</code></td>
</tr>';
}
}
}
}
closedir($handle);
}
 
?>