.t3x entpacken [Gelöst]

  • droptix droptix
    Jedi-Meister
    0 x
    275 Beiträge
    0 Hilfreiche Beiträge
    25. 04. 2007, 10:00

    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.

  • Hilfreichster Beitrag


  • 1 x
    11. 04. 2011, 17:47 - Hilfreichster Beitrag

    Funktioniert jetzt mit Typo3 4.5
    neu: extension als standard-ordnername

    1. <?php
    2. require('/path/to/typo3/sysext/em/classes/connection/class.tx_em_connection_ter.php');
    3.  
    4.  
    5. // Usage ausgeben
    6. function printUsageAndDie(){
    7. global $argv;
    8. print <<<EOM
    9. ------------------------------------------------------------------------------
    10.   _____ _ _ _____
    11.  | ____|_ ___ __ __ _ _ __ __| | | |_|___ /_ __
    12.  | _| \ \/ / '_ \ / _` | '_ \ / _` | | __| |_ \ \/ /
    13.  | |___ > <| |_) | (_| | | | | (_| | | |_ ___) > <
    14.  |_____/_/\_\ .__/ \__,_|_| |_|\__,_| \__|____/_/\_\ Version 0.2, 11.04.2011
    15.   |_|
    16.  
    17.  ...written by droptix and luwo. (look at http://www.typo3.net/forum)
    18.  ...and Jonny007-MKD
    19.  
    20.  Usage: expand_t3x.php [filename.t3x] <directory>
    21.  
    22.  * filename.t3x = Name of your t3x-file
    23.  * directory = optional directory of extraction (default=name of extension)
    24.  
    25. ------------------------------------------------------------------------------
    26.  
    27. EOM;
    28. die();
    29. }
    30.  
    31.  
    32. // Wurde eine Datei angegeben?
    33. if (count($argv) <=1) { printUsageAndDie(); }
    34.  
    35. // Wurde ein Auspackverzeichnis angegeben?
    36. if ($argv[2] != '') $unpackDir=$argv[2];
    37. else $unpackDir=substr($argv[1], 0, -4);
    38.  
    39. // Datei aus Kommandozeile holen...
    40. $extFile=$argv[1];
    41. if (file_exists($extFile)) { print "\n Entpacke Datei: '$extFile'...\n\n";}
    42. else{ print "\n Datei: '$extFile' wurde leider nicht gefunden \n"; printUsageAndDie();}
    43.  
    44.  
    45.  
    46. // Start unpacking.
    47. $fileContent = file_get_contents($extFile);
    48. $ext = tx_em_Connection_Ter::decodeExchangeData($fileContent);
    49.  
    50.  
    51. function autocreate_subdirs($dir) {
    52. $path = array();
    53. $subdirs = explode("/", $dir);
    54. foreach ($subdirs as $subdir) {
    55. $path[] = $subdir;
    56. $fullPath = implode("/", $path);
    57. if (!file_exists($fullPath)) {
    58. if (mkdir($fullPath)) {
    59. echo sprintf("OK: created directory '%s'\n", $fullPath);
    60. } else {
    61. echo sprintf("ERROR: directory '%s' not created\n", $fullPath);
    62. }
    63. }
    64. }
    65. }
    66.  
    67. // Unpack extension(s).
    68. foreach ($ext as $e) {
    69. if ($e["EM_CONF"]) {
    70. // Create unpack directory.
    71. if (!file_exists($unpackDir)) {
    72. mkdir($unpackDir);
    73. }
    74. // Create directories.
    75. $dirs = explode(",", $e["EM_CONF"]["createDirs"]);
    76. foreach ($dirs as $dir) {
    77. // Start in unpack directory if any.
    78. if ($unpackDir) {
    79. $dir = $unpackDir."/".$dir;
    80. }
    81. autocreate_subdirs($dir);
    82. }
    83. // Write files.
    84. foreach ($e["FILES"] as $file) {
    85. // Start in unpack directory.
    86. if (empty($unpackDir)) {
    87. $path = array();
    88. } else {
    89. $path = array($unpackDir);
    90. }
    91. $tmp = explode("/", $file["name"]);
    92. // Separate file name and rest path.
    93. $fileName = array_pop($tmp);
    94. $path = array_merge($path, $tmp);
    95. unset($tmp);
    96. // Create subdirs if neccessary.
    97. $dirPath = implode("/", $path);
    98. autocreate_subdirs($dirPath);
    99. // Write file.
    100. $path[] = $fileName;
    101. $fullPath = implode("/", $path);
    102. $handle = fopen($fullPath, "wb");
    103. if ($handle && fwrite($handle, $file["content"])) {
    104. fclose($handle);
    105. echo sprintf("OK: wrote file '%s'\n", $fullPath);
    106. } else {
    107. echo sprintf("ERROR: file '%s' not written\n", $fullPath);
    108. }
    109. }
    110. }
    111. }
    112. ?>


  • woida woida
    Flash Gordon
    0 x
    2356 Beiträge
    1 Hilfreiche Beiträge
    25. 04. 2007, 11:25

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

  • droptix droptix
    Jedi-Meister
    0 x
    275 Beiträge
    0 Hilfreiche Beiträge
    25. 04. 2007, 12:19

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

    1. function read_t3x() {
    2. // read file
    3. $handle = fopen($this->t3xFile, "r");
    4. $string = "";
    5. while (!feof($handle)) {
    6. $string .= fgets($handle, $this->buffer);
    7. }
    8. fclose($handle);
    9. return $string;
    10. }

    Anschließend jage ich sie durch die Originalfunktion:

    1. require("class.em_terconnection.php");
    2. $tmp = SC_mod_tools_em_terconnection::decodeServerData($this->t3xString);
    3. 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:

    [HTML]8a584ad8b44bfa81c9d1c73469229c1d:gzcompress:Base64-codierte Infos:Daten[/HTML]

    Als Array könnte man das so abbilden:

    1. $array = (
    2. "MD5-Hash",
    3. "Kompressionsmethode",
    4. "Base64-codierte Infos",
    5. "Daten"
    6. )

    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. [b]Hat jemand dazu einen Tipp?[/b]

  • luwo luwo
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    03. 06. 2007, 23:18

    Hallo droptix,

    probiers doch mal so:

    1. require("class.em_terconnection.php");
    2.  
    3. $file=file_get_contents('dateiname.t3x');
    4. $tmp = SC_mod_tools_em_terconnection::decodeExchangeData($file);
    5. print_r($tmp);

    Grüße Luwo

  • droptix droptix
    Jedi-Meister
    0 x
    275 Beiträge
    0 Hilfreiche Beiträge
    04. 06. 2007, 09:31

    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:

    1. <?php
    2. header("Content-type: text/plain");
    3. require("class.em_terconnection.php");
    4.  
    5. // Settings.
    6. $extFile = "file.t3x";
    7. $unpackDir = "extension";
    8.  
    9. // Start unpacking.
    10. $fileContent = file_get_contents($extFile);
    11. $ext = SC_mod_tools_em_terconnection::decodeExchangeData($fileContent);
    12.  
    13. function autocreate_subdirs($dir) {
    14. $path = array();
    15. $subdirs = explode("/", $dir);
    16. foreach ($subdirs as $subdir) {
    17. $path[] = $subdir;
    18. $fullPath = implode("/", $path);
    19. if (!file_exists($fullPath)) {
    20. if (mkdir($fullPath)) {
    21. echo sprintf("OK: created directory '%s'\n", $fullPath);
    22. } else {
    23. echo sprintf("ERROR: directory '%s' not created\n", $fullPath);
    24. }
    25. }
    26. }
    27. }
    28.  
    29. // Unpack extension(s).
    30. foreach ($ext as $e) {
    31. if ($e["EM_CONF"]) {
    32. // Create unpack directory.
    33. if (!file_exists($unpackDir)) {
    34. mkdir($unpackDir);
    35. }
    36. // Create directories.
    37. $dirs = explode(",", $e["EM_CONF"]["createDirs"]);
    38. foreach ($dirs as $dir) {
    39. // Start in unpack directory if any.
    40. if ($unpackDir) {
    41. $dir = $unpackDir."/".$dir;
    42. }
    43. autocreate_subdirs($dir);
    44. }
    45. // Write files.
    46. foreach ($e["FILES"] as $file) {
    47. // Start in unpack directory.
    48. if (empty($unpackDir)) {
    49. $path = array();
    50. } else {
    51. $path = array($unpackDir);
    52. }
    53. $tmp = explode("/", $file["name"]);
    54. // Separate file name and rest path.
    55. $fileName = array_pop($tmp);
    56. $path = array_merge($path, $tmp);
    57. unset($tmp);
    58. // Create subdirs if neccessary.
    59. $dirPath = implode("/", $path);
    60. autocreate_subdirs($dirPath);
    61. // Write file.
    62. $path[] = $fileName;
    63. $fullPath = implode("/", $path);
    64. $handle = fopen($fullPath, "wb");
    65. if ($handle && fwrite($handle, $file["content"])) {
    66. fclose($handle);
    67. echo sprintf("OK: wrote file '%s'\n", $fullPath);
    68. } else {
    69. echo sprintf("ERROR: file '%s' not written\n", $fullPath);
    70. }
    71. }
    72. }
    73. }
    74. ?>

  • luwo luwo
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    04. 06. 2007, 18:01

    Hallo Droptix,

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

    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...

    1. <?php
    2. require("class.em_terconnection.php");
    3.  
    4. // default-Settings.
    5. $unpackDir = "extension";
    6.  
    7.  
    8. // Usage ausgeben
    9. function printUsageAndDie(){
    10. global $argv;
    11. print <<<EOM
    12. ------------------------------------------------------------------------------
    13.   _____ _ _ _____
    14.  | ____|_ ___ __ __ _ _ __ __| | | |_|___ /_ __
    15.  | _| \ \/ / '_ \ / _` | '_ \ / _` | | __| |_ \ \/ /
    16.  | |___ > <| |_) | (_| | | | | (_| | | |_ ___) > <
    17.  |_____/_/\_\ .__/ \__,_|_| |_|\__,_| \__|____/_/\_\ Version 0.1, 04.06.2007
    18.   |_|
    19.  
    20.  ...written by droptix and luwo. (look at http://www.typo3.net/forum)
    21.  
    22.  Usage: expand_t3x.php [filename.t3x] <directory>
    23.  
    24.  * filename.t3x = Name of your t3x-file
    25.  * directory = optional directory of extraction (default="extension")
    26.  
    27. ------------------------------------------------------------------------------
    28.  
    29. EOM;
    30. die();
    31. }
    32.  
    33.  
    34. // Wurde eine Datei angegeben?
    35. if (count($argv) <=1) { printUsageAndDie(); }
    36.  
    37. // Wurde ein Auspackverzeichnis angegeben?
    38. if ($argv[2] != '') $unpackDir=$argv[2];
    39.  
    40. // Datei aus Kommandozeile holen...
    41. $extFile=$argv[1];
    42. if (file_exists($extFile)) { print "\n Entpacke Datei: '$extFile'...\n\n";}
    43. else{ print "\n Datei: '$extFile' wurde leider nicht gefunden \n"; printUsageAndDie();}
    44.  
    45.  
    46.  
    47. // Start unpacking.
    48. $fileContent = file_get_contents($extFile);
    49. $ext = SC_mod_tools_em_terconnection::decodeExchangeData($fileContent);
    50.  
    51.  
    52. function autocreate_subdirs($dir) {
    53. $path = array();
    54. $subdirs = explode("/", $dir);
    55. foreach ($subdirs as $subdir) {
    56. $path[] = $subdir;
    57. $fullPath = implode("/", $path);
    58. if (!file_exists($fullPath)) {
    59. if (mkdir($fullPath)) {
    60. echo sprintf("OK: created directory '%s'\n", $fullPath);
    61. } else {
    62. echo sprintf("ERROR: directory '%s' not created\n", $fullPath);
    63. }
    64. }
    65. }
    66. }
    67.  
    68. // Unpack extension(s).
    69. foreach ($ext as $e) {
    70. if ($e["EM_CONF"]) {
    71. // Create unpack directory.
    72. if (!file_exists($unpackDir)) {
    73. mkdir($unpackDir);
    74. }
    75. // Create directories.
    76. $dirs = explode(",", $e["EM_CONF"]["createDirs"]);
    77. foreach ($dirs as $dir) {
    78. // Start in unpack directory if any.
    79. if ($unpackDir) {
    80. $dir = $unpackDir."/".$dir;
    81. }
    82. autocreate_subdirs($dir);
    83. }
    84. // Write files.
    85. foreach ($e["FILES"] as $file) {
    86. // Start in unpack directory.
    87. if (empty($unpackDir)) {
    88. $path = array();
    89. } else {
    90. $path = array($unpackDir);
    91. }
    92. $tmp = explode("/", $file["name"]);
    93. // Separate file name and rest path.
    94. $fileName = array_pop($tmp);
    95. $path = array_merge($path, $tmp);
    96. unset($tmp);
    97. // Create subdirs if neccessary.
    98. $dirPath = implode("/", $path);
    99. autocreate_subdirs($dirPath);
    100. // Write file.
    101. $path[] = $fileName;
    102. $fullPath = implode("/", $path);
    103. $handle = fopen($fullPath, "wb");
    104. if ($handle && fwrite($handle, $file["content"])) {
    105. fclose($handle);
    106. echo sprintf("OK: wrote file '%s'\n", $fullPath);
    107. } else {
    108. echo sprintf("ERROR: file '%s' not written\n", $fullPath);
    109. }
    110. }
    111. }
    112. }
    113. ?>

    Viele Grüße Luwo

  • droptix droptix
    Jedi-Meister
    0 x
    275 Beiträge
    0 Hilfreiche Beiträge
    05. 06. 2007, 12:37

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

    [url=http://droptix.ohost.de/boards/typo3-expandt3x/expandt3x.exe]expandt3x.exe (~ 1,33 MB)[/url]
    [url=http://droptix.ohost.de/boards/typo3-expandt3x/expandt3x.exe.zip]expandt3x.exe gezippt (~ 598 KB)[/url]

    • • 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 [i]current working directory[/i] verkackt...

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

    P.S. Erstellt mit dem [url=http://www.bambalam.se/bamcompile/]Bambalam PHP EXE Compiler/Embedder[/url]

  • karlchen karlchen
    Jedi-General
    0 x
    1433 Beiträge
    30 Hilfreiche Beiträge
    07. 06. 2007, 00:06

    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 droptix
    Jedi-Meister
    0 x
    275 Beiträge
    0 Hilfreiche Beiträge
    07. 06. 2007, 23:37

    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 :D Das wär noch was, was ich mit meinem Extension-Halbwissen nicht zusammen kriege, mir aber sehr wünschen würde.

  • a.otto a.otto
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    11. 06. 2007, 17:19

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

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