Zum Inhalt springen

.t3x entpacken

Erstellt am 25. April 2007 · 28 Antworten · letzte Antwort am 21. Januar 2015 · Seite 1 von 2

Tags: PHP, Frage

droptix ·

Ich müsste manchmal schnell eine .t3x Datei lokal entpacken, um die PHP-Dateien einzusehen und Feedback zu geben.

Daher suche ich nach einem Entpacker, am sinnvollsten wohl als PHP-Skript. Oder nach Infos zum Schreiben eines solchen Entpackers.

woida ·

Die dafür zuständige Methode "decodeExchangeData" findest du in der typo3/mod/tools/em/class.em_terconnection.php

droptix ·

Habe Probleme damit. Ich lese die .t3x Datei ein:

function read_t3x() {
	// read file
	$handle = fopen($this->t3xFile, "r");
	$string = "";
	while (!feof($handle)) {
		$string .= fgets($handle, $this->buffer); 
	}
	fclose($handle);
	return $string;
}

Anschließend jage ich sie durch die Originalfunktion:

require("class.em_terconnection.php");
$tmp = SC_mod_tools_em_terconnection::decodeServerData($this->t3xString);
print_r($tmp);

Liefert:

Error: MD5 hashes in T3X data did not match!

Habe auch schon versucht, die .t3x binär einzulesen, aber das brachte dasselbe Ergebnis.

Die .t3x Datei besteht aus "zusammengeklebten" Teilen, die durch Doppelpunkte getrennt werden. Die Funktion `decodeServerData()` zerhackt den Inhalt. So sieht eine .t3x Datei aus:

8a584ad8b44bfa81c9d1c73469229c1d:gzcompress:Base64-codierte Infos:Daten

Als Array könnte man das so abbilden:

$array = (
	"MD5-Hash",
	"Kompressionsmethode",
	"Base64-codierte Infos",
	"Daten"
)

Die Funktion `decodeServerData()` macht folgendes:

  • 1) dekodiere Base64-Infos aus $array[2]
    2) bilde MD5-Hash über dekodierte Base64-Infos
    3) Verlgeiche MD5-Hash in $array[0] mit dem gerade gebildeten MD5-Hash
    4) Stimmen sie nicht überein, meckere, ansonsten weiter
    5) Ist die Kompressionsmethode "gzcompress", so dekomprimiere die dekodierten Base64-Infos. Meckere bei einem Fehler, ansonsten weiter.
    6) Zerpflücke das Ergebnis mit `unserialize`, dabei sollte ein Array rauskommen

Der Fehler tritt bei jeder .t3x Datei auf. Jede davon lässt sich aber in TYPO3 importieren und installieren. Es muss daran liegen, wie die Datei eingelesen wird. Hat jemand dazu einen Tipp?

luwo ·

Hallo droptix,

probiers doch mal so:

require("class.em_terconnection.php");

$file=file_get_contents('dateiname.t3x');
$tmp = SC_mod_tools_em_terconnection::decodeExchangeData($file);
print_r($tmp);

Grüße Luwo

droptix ·

Vielen vielen Dank!!! Hätte nicht gedacht, dass ich das Thema nochmal aufrolle, aber dank dir kommt hier gleich eine Komplettlösung für alle, die das auch brauchen:

<?php
header("Content-type: text/plain");
require("class.em_terconnection.php");

// Settings.
$extFile = "file.t3x";
$unpackDir = "extension";

// Start unpacking.
$fileContent = file_get_contents($extFile);
$ext = SC_mod_tools_em_terconnection::decodeExchangeData($fileContent);

function autocreate_subdirs($dir) {
	$path = array();
	$subdirs = explode("/", $dir);
	foreach ($subdirs as $subdir) {
		$path[] = $subdir;
		$fullPath = implode("/", $path);
		if (!file_exists($fullPath)) {
			if (mkdir($fullPath)) {
				echo sprintf("OK: created directory '%s'\n", $fullPath);
			} else {
				echo sprintf("ERROR: directory '%s' not created\n", $fullPath);
			}
		}
	}
}

// Unpack extension(s).
foreach ($ext as $e) {
	if ($e["EM_CONF"]) {
		// Create unpack directory.
		if (!file_exists($unpackDir)) {
			mkdir($unpackDir);
		}
		// Create directories.
		$dirs = explode(",", $e["EM_CONF"]["createDirs"]);
		foreach ($dirs as $dir) {
			// Start in unpack directory if any.
			if ($unpackDir) {
				$dir = $unpackDir."/".$dir;
			}
			autocreate_subdirs($dir);
		}
		// Write files.
		foreach ($e["FILES"] as $file) {
			// Start in unpack directory.
			if (empty($unpackDir)) {
				$path = array();
			} else {
				$path = array($unpackDir);
			}
			$tmp = explode("/", $file["name"]);
			// Separate file name and rest path.
			$fileName = array_pop($tmp);
			$path = array_merge($path, $tmp);
			unset($tmp);
			// Create subdirs if neccessary.
			$dirPath = implode("/", $path);
			autocreate_subdirs($dirPath);
			// Write file.
			$path[] = $fileName;
			$fullPath = implode("/", $path);
			$handle = fopen($fullPath, "wb");
			if ($handle && fwrite($handle, $file["content"])) {
				fclose($handle);
				echo sprintf("OK: wrote file '%s'\n", $fullPath);
			} else {
				echo sprintf("ERROR: file '%s' not written\n", $fullPath);
			}
		}
	}
}
?>
luwo ·

Hallo Droptix,

Ehrlich, ein richtig cooles Script!!! 😃
Genau soetwas brauche ich nämlich gerade 😃

Habe es noch etwas erweitert, damit es direkt von der Kommandozeile aus mit entsprechenden Parametern aufgerufen werden kann.
Sollte so unter Windows und Linux laufen, vielleicht können ja mal ein paar Leute testen und Ihre Ergebnisse posten...

<?php
require("class.em_terconnection.php");

// default-Settings.
$unpackDir = "extension";


// Usage ausgeben
function printUsageAndDie(){
global $argv;
print <<<EOM
------------------------------------------------------------------------------
  _____                            _   _   _____
 | ____|_  ___ __   __ _ _ __   __| | | |_|___ /_  __
 |  _| \ \/ / '_ \ / _` | '_ \ / _` | | __| |_ \ \/ /
 | |___ >  <| |_) | (_| | | | | (_| | | |_ ___) >  <
 |_____/_/\_\ .__/ \__,_|_| |_|\__,_|  \__|____/_/\_\  Version 0.1, 04.06.2007
           |_|

 ...written by droptix and luwo. (look at http://www.typo3.net/forum)

 Usage: expand_t3x.php [filename.t3x]  <directory> 

 * filename.t3x = Name of your t3x-file
 * directory    = optional directory of extraction (default="extension")   

------------------------------------------------------------------------------
 
EOM;
die();
}


// Wurde eine Datei angegeben?
if (count($argv) <=1) { printUsageAndDie(); }

// Wurde ein Auspackverzeichnis angegeben?
if ($argv[2] != '') $unpackDir=$argv[2];

// Datei aus Kommandozeile holen...
$extFile=$argv[1];
if (file_exists($extFile)) { print "\n Entpacke Datei: '$extFile'...\n\n";}
                       else{ print "\n Datei: '$extFile' wurde leider nicht gefunden \n"; printUsageAndDie();}



// Start unpacking.
$fileContent = file_get_contents($extFile);
$ext = SC_mod_tools_em_terconnection::decodeExchangeData($fileContent);


function autocreate_subdirs($dir) {
        $path = array();
        $subdirs = explode("/", $dir);
        foreach ($subdirs as $subdir) {
                $path[] = $subdir;
                $fullPath = implode("/", $path);
                if (!file_exists($fullPath)) {
                        if (mkdir($fullPath)) {
                                echo sprintf("OK: created directory '%s'\n", $fullPath);
                        } else {
                                echo sprintf("ERROR: directory '%s' not created\n", $fullPath);
                        }
                }
        }
}

// Unpack extension(s).
foreach ($ext as $e) {
        if ($e["EM_CONF"]) {
                // Create unpack directory.
                if (!file_exists($unpackDir)) {
                        mkdir($unpackDir);
                }
                // Create directories.
                $dirs = explode(",", $e["EM_CONF"]["createDirs"]);
                foreach ($dirs as $dir) {
                        // Start in unpack directory if any.
                        if ($unpackDir) {
                                $dir = $unpackDir."/".$dir;
                        }
                        autocreate_subdirs($dir);
                }
                // Write files.
                foreach ($e["FILES"] as $file) {
                        // Start in unpack directory.
                        if (empty($unpackDir)) {
                                $path = array();
                        } else {
                                $path = array($unpackDir);
                        }
                        $tmp = explode("/", $file["name"]);
                        // Separate file name and rest path.
                        $fileName = array_pop($tmp);
                        $path = array_merge($path, $tmp);
                        unset($tmp);
                        // Create subdirs if neccessary.
                        $dirPath = implode("/", $path);
                        autocreate_subdirs($dirPath);
                        // Write file.
                        $path[] = $fileName;
                        $fullPath = implode("/", $path);
                        $handle = fopen($fullPath, "wb");
                        if ($handle && fwrite($handle, $file["content"])) {
                                fclose($handle);
                                echo sprintf("OK: wrote file '%s'\n", $fullPath);
                        } else {
                                echo sprintf("ERROR: file '%s' not written\n", $fullPath);
                        }
                }
        }
}
?>

Viele Grüße Luwo

droptix ·

So, hier nun eine .exe Datei zum Auspacken einer .t3x Datei (Code leicht verbessert für meinen Geschmack):

expandt3x.exe (~ 1,33 MB)
expandt3x.exe gezippt (~ 598 KB)

  • • entweder auf der Konsole starten und die Anleitung lesen
    • oder: expandt3x.exe file.t3x [outputdir]
    • oder deine .t3x Datei auf expandt3x.exe ziehen, allerdings landet das entpackte Verzeichnis in C:\Dokumente und Einstellungen\Benutzername, weil Windows das mit dem current working directory verkackt...

Viel Spaß damit und Danke an alle, die mitgeholfen haben!

P.S. Erstellt mit dem Bambalam PHP EXE Compiler/Embedder

karlchen ·

Genial, kann ich da nur sagen 🙂

Habe sowas auch schon mal vor einer Weile gesucht doch nichts gefunden.

Vielen dank, für dieses schöne Werk, läuft bei mir eins A.

Karlchen

droptix ·

Tja, so bin ich eben 8-) … und nicht zu vergessen auch luwo.

Denkt an mich, wenn ich mal ein Problem habe.

P.S. Wenn jemand Lust und Zeit hat ein PHP-Script für den umgekehrten Weg zu machen, wäre das sehr cool 😃 Das wär noch was, was ich mit meinem Extension-Halbwissen nicht zusammen kriege, mir aber sehr wünschen würde.

steffenk ·

Hi Andreas, willkommen im Forum 🙂

dort hast Du einen Packer, aber keinen Entpacker, oder seh ich das falsch ?

dyne ·

Ich hole mal das Thema wieder hoch, da ich auf der Suche nach einem t3x-Packer bin. Ich habe so eine Art kleinen Ext-Kickstarter für meine Zwecke geschrieben, aber ich kann leider keine t3x erstellen. Gibt es kein PHP-Code-Snippet dafür? Typo3 kann das doch auch.
Irgendwie komm ich mit dem SourceForge-Link nicht klar. Egal welche File ich öffne, ich komme immer auf die gleiche Seite mit einem mir unverständlichen Formular.

just2b ·
dyne schrieb

Gibt es kein PHP-Code-Snippet dafür? Typo3 kann das doch auch.

steht doch auf der ersten Seite...

dyne ·

Steh ich grade auf der Leitung?

droptix schrieb

[...]
P.S. Wenn jemand Lust und Zeit hat ein PHP-Script für den umgekehrten Weg zu machen, wäre das sehr cool 😃 Das wär noch was, was ich mit meinem Extension-Halbwissen nicht zusammen kriege, mir aber sehr wünschen würde.

a.otto schrieb

Schau mal im SVN Repository von TYPO3xdev [1] nach.

[1]http://typo3xdev.svn.sourceforge.net/viewvc/typo3xdev/tools_t3x/trunk/

Mehr finde ich nicht über einen Packer und wie gesagt habe ich ein Problem mit dem Link.

InforMedic ·

Geiles und geniales Toolchen =)

Vor allem wenn mal wieder "File was to large for upload" bla oder so ähnlich kommt :p

-Z- ·

Ich hole mal das Thema wieder hoch, da ich auf der Suche nach einem t3x-Packer bin. Ich habe so eine Art kleinen Ext-Kickstarter für meine Zwecke geschrieben, aber ich kann leider keine t3x erstellen.

Man kann im Ext Manager jede Ext als .t3x exportieren.

BTW gibt es eine Möglichkeit mit dem Entpacker an die Inhalte der "ext_emconf.php" heranzukommen?

PeterAllfonds ·

Ich bekomme nur die folgende Meldung

Expand file: 'T3D__07-04-11-30-58-z.t3d'...

Warning: Invalid argument supplied for foreach() in expandt3x.php on line 65

und es wird nichts extrahiert. Es handelt sich um einen einfachen export einer TYPO3 Site, den ich fehlerfrei importieren kann.

Oder soll das Tool nur für Extensions funktionieren?

saschae ·
PeterAllfonds schrieb

Ich bekomme nur die folgende Meldung

Expand file: 'T3D__07-04-11-30-58-z.t3d'...

Warning: Invalid argument supplied for foreach() in expandt3x.php on line 65

und es wird nichts extrahiert. Es handelt sich um einen einfachen export einer TYPO3 Site, den ich fehlerfrei importieren kann.

Oder soll das Tool nur für Extensions funktionieren?

es ist ein *.t3x entpacker und kein *.t3d entpacker ;-)
also nur für extensions.
Eine t3d müsste ja größtenteils aus datenbankdumps bestehen