Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

functions_transfer.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 15.23 KiB


 001  <?php
 002  /**
 003  *
 004  * @package phpBB3
 005  * @version $Id$
 006  * @copyright (c) 2005 phpBB Group
 007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 008  *
 009  */
 010   
 011  /**
 012  * @ignore
 013  */
 014  if (!defined('IN_PHPBB'))
 015  {
 016      exit;
 017  }
 018   
 019  /**
 020  * Transfer class, wrapper for ftp/sftp/ssh
 021  * @package phpBB3
 022  */
 023  class transfer
 024  {
 025      var $connection;
 026      var $host;
 027      var $port;
 028      var $username;
 029      var $password;
 030      var $timeout;
 031      var $root_path;
 032      var $tmp_path;
 033      var $file_perms;
 034      var $dir_perms;
 035   
 036      /**
 037      * Constructor - init some basic values
 038      */
 039      function transfer()
 040      {
 041          global $phpbb_root_path;
 042   
 043          $this->file_perms    = 0644;
 044          $this->dir_perms    = 0777;
 045   
 046          // We use the store directory as temporary path to circumvent open basedir restrictions
 047          $this->tmp_path = $phpbb_root_path . 'store/';
 048      }
 049   
 050      /**
 051      * Write file to location
 052      */
 053      function write_file($destination_file = '', $contents = '')
 054      {
 055          global $phpbb_root_path;
 056   
 057          $destination_file = $this->root_path . str_replace($phpbb_root_path, '', $destination_file);
 058   
 059          // need to create a temp file and then move that temp file.
 060          // ftp functions can only move files around and can't create.
 061          // This means that the users will need to have access to write
 062          // temporary files or have write access on a folder within phpBB
 063          // like the cache folder. If the user can't do either, then
 064          // he/she needs to use the fsock ftp method
 065          $temp_name = tempnam($this->tmp_path, 'transfer_');
 066          @unlink($temp_name);
 067   
 068          $fp = @fopen($temp_name, 'w');
 069   
 070          if (!$fp)
 071          {
 072              trigger_error('Unable to create temporary file ' . $temp_name, E_USER_ERROR);
 073          }
 074   
 075          @fwrite($fp, $contents);
 076          @fclose($fp);
 077   
 078          $result = $this->overwrite_file($temp_name, $destination_file);
 079   
 080          // remove temporary file now
 081          @unlink($temp_name);
 082   
 083          return $result;
 084      }
 085   
 086      /**
 087      * Moving file into location. If the destination file already exists it gets overwritten
 088      */
 089      function overwrite_file($source_file, $destination_file)
 090      {
 091          /**
 092          * @todo generally think about overwriting files in another way, by creating a temporary file and then renaming it
 093          * @todo check for the destination file existance too
 094          */
 095          $this->_delete($destination_file);
 096          $result = $this->_put($source_file, $destination_file);
 097          $this->_chmod($destination_file, $this->file_perms);
 098   
 099          return $result;
 100      }
 101   
 102      /**
 103      * Create directory structure
 104      */
 105      function make_dir($dir)
 106      {
 107          global $phpbb_root_path;
 108   
 109          $dir = str_replace($phpbb_root_path, '', $dir);
 110          $dir = explode('/', $dir);
 111          $dirs = '';
 112   
 113          for ($i = 0, $total = sizeof($dir); $i < $total; $i++)
 114          {
 115              $result = true;
 116   
 117              if (strpos($dir[$i], '.') === 0)
 118              {
 119                  continue;
 120              }
 121              $cur_dir = $dir[$i] . '/';
 122   
 123              if (!file_exists($phpbb_root_path . $dirs . $cur_dir))
 124              {
 125                  // create the directory
 126                  $result = $this->_mkdir($dir[$i]);
 127                  $this->_chmod($dir[$i], $this->dir_perms);
 128              }
 129   
 130              $this->_chdir($this->root_path . $dirs . $dir[$i]);
 131              $dirs .= $cur_dir;
 132          }
 133   
 134          $this->_chdir($this->root_path);
 135   
 136          /**
 137          * @todo stack result into array to make sure every path creation has been taken care of
 138          */
 139          return $result;
 140      }
 141   
 142      /**
 143      * Copy file from source location to destination location
 144      */
 145      function copy_file($from_loc, $to_loc)
 146      {
 147          global $phpbb_root_path;
 148   
 149          $from_loc = ((strpos($from_loc, $phpbb_root_path) !== 0) ? $phpbb_root_path : '') . $from_loc;
 150          $to_loc = $this->root_path . str_replace($phpbb_root_path, '', $to_loc);
 151   
 152          if (!file_exists($from_loc))
 153          {
 154              return false;
 155          }
 156   
 157          $result = $this->overwrite_file($from_loc, $to_loc);
 158   
 159          return $result;
 160      }
 161   
 162      /**
 163      * Remove file
 164      */
 165      function delete_file($file)
 166      {
 167          global $phpbb_root_path;
 168   
 169          $file = $this->root_path . str_replace($phpbb_root_path, '', $file);
 170   
 171          return $this->_delete($file);
 172      }
 173   
 174      /**
 175      * Remove directory
 176      * @todo remove child directories?
 177      */
 178      function remove_dir($dir)
 179      {
 180          global $phpbb_root_path;
 181   
 182          $dir = $this->root_path . str_replace($phpbb_root_path, '', $dir);
 183   
 184          return $this->_rmdir($dir);
 185      }
 186   
 187      /**
 188      * Rename a file or folder
 189      */
 190      function rename($old_handle, $new_handle)
 191      {
 192          global $phpbb_root_path;
 193   
 194          $old_handle = $this->root_path . str_replace($phpbb_root_path, '', $old_handle);
 195   
 196          return $this->_rename($old_handle, $new_handle);
 197      }
 198   
 199      /**
 200      * Check if a specified file exist...
 201      */
 202      function file_exists($directory, $filename)
 203      {
 204          global $phpbb_root_path;
 205   
 206          $directory = $this->root_path . str_replace($phpbb_root_path, '', $directory);
 207   
 208          $this->_chdir($directory);
 209          $result = $this->_ls('');
 210   
 211          if ($result !== false && is_array($result))
 212          {
 213              return (in_array($filename, $result)) ? true : false;
 214          }
 215   
 216          return false;
 217      }
 218   
 219      /**
 220      * Open session
 221      */
 222      function open_session()
 223      {
 224          return $this->_init();
 225      }
 226   
 227      /**
 228      * Close current session
 229      */
 230      function close_session()
 231      {
 232          return $this->_close();
 233      }
 234   
 235      /**
 236      * Determine methods able to be used
 237      */
 238      function methods()
 239      {
 240          $methods = array();
 241          $disabled_functions = explode(',', @ini_get('disable_functions'));
 242   
 243          if (@extension_loaded('ftp'))
 244          {
 245              $methods[] = 'ftp';
 246          }
 247   
 248          if (!in_array('fsockopen', $disabled_functions))
 249          {
 250              $methods[] = 'ftp_fsock';
 251          }
 252   
 253          return $methods;
 254      }
 255  }
 256   
 257  /**
 258  * FTP transfer class
 259  * @package phpBB3
 260  */
 261  class ftp extends transfer
 262  {
 263      /**
 264      * Standard parameters for FTP session
 265      */
 266      function ftp($host, $username, $password, $root_path, $port = 21, $timeout = 10)
 267      {
 268          $this->host            = $host;
 269          $this->port            = $port;
 270          $this->username        = $username;
 271          $this->password        = $password;
 272          $this->timeout        = $timeout;
 273   
 274          // Make sure $this->root_path is layed out the same way as the $user->page['root_script_path'] value (/ at the end)
 275          $this->root_path    = str_replace('\\', '/', $this->root_path);
 276   
 277          if (!empty($root_path))
 278          {
 279              $this->root_path = (($root_path[0] != '/' ) ? '/' : '') . $root_path . ((substr($root_path, -1, 1) == '/') ? '' : '/');
 280          }
 281   
 282          // Init some needed values
 283          transfer::transfer();
 284   
 285          return;
 286      }
 287   
 288      /**
 289      * Requests data
 290      */
 291      function data()
 292      {
 293          global $user;
 294   
 295          return array(
 296              'host'        => 'localhost',
 297              'username'    => 'anonymous',
 298              'password'    => '',
 299              'root_path'    => $user->page['root_script_path'],
 300              'port'        => 21,
 301              'timeout'    => 10
 302          );
 303      }
 304   
 305      /**
 306      * Init FTP Session
 307      * @access private
 308      */
 309      function _init()
 310      {
 311          // connect to the server
 312          $this->connection = @ftp_connect($this->host, $this->port, $this->timeout);
 313   
 314          if (!$this->connection)
 315          {
 316              return 'ERR_CONNECTING_SERVER';
 317          }
 318   
 319          // attempt to turn pasv mode on
 320          @ftp_pasv($this->connection, true);
 321   
 322          // login to the server
 323          if (!@ftp_login($this->connection, $this->username, $this->password))
 324          {
 325              return 'ERR_UNABLE_TO_LOGIN';
 326          }
 327   
 328          // change to the root directory
 329          if (!$this->_chdir($this->root_path))
 330          {
 331              return 'ERR_CHANGING_DIRECTORY';
 332          }
 333   
 334          return true;
 335      }
 336   
 337      /**
 338      * Create Directory (MKDIR)
 339      * @access private
 340      */
 341      function _mkdir($dir)
 342      {
 343          return @ftp_mkdir($this->connection, $dir);
 344      }
 345   
 346      /**
 347      * Remove directory (RMDIR)
 348      * @access private
 349      */
 350      function _rmdir($dir)
 351      {
 352          return @ftp_rmdir($this->connection, $dir);
 353      }
 354   
 355      /**
 356      * Rename file
 357      * @access private
 358      */
 359      function _rename($old_handle, $new_handle)
 360      {
 361          return @ftp_rename($this->connection, $old_handle, $new_handle);
 362      }
 363   
 364      /**
 365      * Change current working directory (CHDIR)
 366      * @access private
 367      */
 368      function _chdir($dir = '')
 369      {
 370          if ($dir && $dir !== '/')
 371          {
 372              if (substr($dir, -1, 1) == '/')
 373              {
 374                  $dir = substr($dir, 0, -1);
 375              }
 376          }
 377   
 378          return @ftp_chdir($this->connection, $dir);
 379      }
 380   
 381      /**
 382      * change file permissions (CHMOD)
 383      * @access private
 384      */
 385      function _chmod($file, $perms)
 386      {
 387          if (function_exists('ftp_chmod'))
 388          {
 389              $err = @ftp_chmod($this->connection, $perms, $file);
 390          }
 391          else
 392          {
 393              // Unfortunatly CHMOD is not expecting an octal value...
 394              // We need to transform the integer (which was an octal) to an octal representation (to get the int) and then pass as is. ;)
 395              $chmod_cmd = 'CHMOD ' . base_convert($perms, 10, 8) . ' ' . $file;
 396              $err = $this->_site($chmod_cmd);
 397          }
 398   
 399          return $err;
 400      }
 401   
 402      /**
 403      * Upload file to location (PUT)
 404      * @access private
 405      */
 406      function _put($from_file, $to_file)
 407      {
 408          // get the file extension
 409          $file_extension = strtolower(substr(strrchr($to_file, '.'), 1));
 410   
 411          // We only use the BINARY file mode to cicumvent rewrite actions from ftp server (mostly linefeeds being replaced)
 412          $mode = FTP_BINARY;
 413   
 414          $to_dir = dirname($to_file);
 415          $to_file = basename($to_file);
 416          $this->_chdir($to_dir);
 417   
 418          $result = @ftp_put($this->connection, $to_file, $from_file, $mode);
 419          $this->_chdir($this->root_path);
 420   
 421          return $result;
 422      }
 423   
 424      /**
 425      * Delete file (DELETE)
 426      * @access private
 427      */
 428      function _delete($file)
 429      {
 430          return @ftp_delete($this->connection, $file);
 431      }
 432   
 433      /**
 434      * Close ftp session (CLOSE)
 435      * @access private
 436      */
 437      function _close()
 438      {
 439          if (!$this->connection)
 440          {
 441              return false;
 442          }
 443   
 444          return @ftp_quit($this->connection);
 445      }
 446   
 447      /**
 448      * Return current working directory (CWD)
 449      * At the moment not used by parent class
 450      * @access private
 451      */
 452      function _cwd()
 453      {
 454          return @ftp_pwd($this->connection);
 455      }
 456   
 457      /**
 458      * Return list of files in a given directory (LS)
 459      * @access private
 460      */
 461      function _ls($dir = './')
 462      {
 463          return @ftp_nlist($this->connection, $dir);
 464      }
 465   
 466      /**
 467      * FTP SITE command (ftp-only function)
 468      * @access private
 469      */
 470      function _site($command)
 471      {
 472          return @ftp_site($this->connection, $command);
 473      }
 474  }
 475   
 476  /**
 477  * FTP fsock transfer class
 478  *
 479  * @author wGEric
 480  * @package phpBB3
 481  */
 482  class ftp_fsock extends transfer
 483  {
 484      var $data_connection;
 485   
 486      /**
 487      * Standard parameters for FTP session
 488      */
 489      function ftp_fsock($host, $username, $password, $root_path, $port = 21, $timeout = 10)
 490      {
 491          $this->host            = $host;
 492          $this->port            = $port;
 493          $this->username        = $username;
 494          $this->password        = $password;
 495          $this->timeout        = $timeout;
 496   
 497          // Make sure $this->root_path is layed out the same way as the $user->page['root_script_path'] value (/ at the end)
 498          $this->root_path    = str_replace('\\', '/', $this->root_path);
 499   
 500          if (!empty($root_path))
 501          {
 502              $this->root_path = (($root_path[0] != '/' ) ? '/' : '') . $root_path . ((substr($root_path, -1, 1) == '/') ? '' : '/');
 503          }
 504   
 505          // Init some needed values
 506          transfer::transfer();
 507   
 508          return;
 509      }
 510   
 511      /**
 512      * Requests data
 513      */
 514      function data()
 515      {
 516          global $user;
 517   
 518          return array(
 519              'host'        => 'localhost',
 520              'username'    => 'anonymous',
 521              'password'    => '',
 522              'root_path'    => $user->page['root_script_path'],
 523              'port'        => 21,
 524              'timeout'    => 10
 525          );
 526      }
 527   
 528      /**
 529      * Init FTP Session
 530      * @access private
 531      */
 532      function _init()
 533      {
 534          $errno = 0;
 535          $errstr = '';
 536   
 537          // connect to the server
 538          $this->connection = @fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);
 539   
 540          if (!$this->connection || !$this->_check_command())
 541          {
 542              return 'ERR_CONNECTING_SERVER';
 543          }
 544   
 545          @stream_set_timeout($this->connection, $this->timeout);
 546   
 547          // login
 548          if (!$this->_send_command('USER', $this->username))
 549          {
 550              return 'ERR_UNABLE_TO_LOGIN';
 551          }
 552   
 553          if (!$this->_send_command('PASS', $this->password))
 554          {
 555              return 'ERR_UNABLE_TO_LOGIN';
 556          }
 557   
 558          // change to the root directory
 559          if (!$this->_chdir($this->root_path))
 560          {
 561              return 'ERR_CHANGING_DIRECTORY';
 562          }
 563   
 564          return true;
 565      }
 566   
 567      /**
 568      * Create Directory (MKDIR)
 569      * @access private
 570      */
 571      function _mkdir($dir)
 572      {
 573          return $this->_send_command('MKD', $dir);
 574      }
 575   
 576      /**
 577      * Remove directory (RMDIR)
 578      * @access private
 579      */
 580      function _rmdir($dir)
 581      {
 582          return $this->_send_command('RMD', $dir);
 583      }
 584   
 585      /**
 586      * Rename File
 587      * @access private
 588      */
 589      function _rename($old_handle, $new_handle)
 590      {
 591          $this->_send_command('RNFR', $old_handle);
 592          return $this->_send_command('RNTO', $new_handle);
 593      }
 594   
 595      /**
 596      * Change current working directory (CHDIR)
 597      * @access private
 598      */
 599      function _chdir($dir = '')
 600      {
 601          if ($dir && $dir !== '/')
 602          {
 603              if (substr($dir, -1, 1) == '/')
 604              {
 605                  $dir = substr($dir, 0, -1);
 606              }
 607          }
 608   
 609          return $this->_send_command('CWD', $dir);
 610      }
 611   
 612      /**
 613      * change file permissions (CHMOD)
 614      * @access private
 615      */
 616      function _chmod($file, $perms)
 617      {
 618          // Unfortunatly CHMOD is not expecting an octal value...
 619          // We need to transform the integer (which was an octal) to an octal representation (to get the int) and then pass as is. ;)
 620          return $this->_send_command('SITE CHMOD', base_convert($perms, 10, 8) . ' ' . $file);
 621      }
 622   
 623      /**
 624      * Upload file to location (PUT)
 625      * @access private
 626      */
 627      function _put($from_file, $to_file)
 628      {
 629          // We only use the BINARY file mode to cicumvent rewrite actions from ftp server (mostly linefeeds being replaced)
 630          // 'I' == BINARY
 631          // 'A' == ASCII
 632          if (!$this->_send_command('TYPE', 'I'))
 633          {
 634              return false;
 635          }
 636   
 637          // open the connection to send file over
 638          if (!$this->_open_data_connection())
 639          {
 640              return false;
 641          }
 642   
 643          $this->_send_command('STOR', $to_file, false);
 644   
 645          // send the file
 646          $fp = @fopen($from_file, 'rb');
 647          while (!@feof($fp))
 648          {
 649              @fwrite($this->data_connection, @fread($fp, 4096));
 650          }
 651          @fclose($fp);
 652   
 653          // close connection
 654          $this->_close_data_connection();
 655   
 656          return $this->_check_command();
 657      }
 658   
 659      /**
 660      * Delete file (DELETE)
 661      * @access private
 662      */
 663      function _delete($file)
 664      {
 665          return $this->_send_command('DELE', $file);
 666      }
 667   
 668      /**
 669      * Close ftp session (CLOSE)
 670      * @access private
 671      */
 672      function _close()
 673      {
 674          if (!$this->connection)
 675          {
 676              return false;
 677          }
 678   
 679          return $this->_send_command('QUIT');
 680      }
 681   
 682      /**
 683      * Return current working directory (CWD)
 684      * At the moment not used by parent class
 685      * @access private
 686      */
 687      function _cwd()
 688      {
 689          $this->_send_command('PWD', '', false);
 690          return preg_replace('#^[0-9]{3} "(.+)" .+\r\n#', '\\1', $this->_check_command(true));
 691      }
 692   
 693      /**
 694      * Return list of files in a given directory (LS)
 695      * @access private
 696      */
 697      function _ls($dir = './')
 698      {
 699          if (!$this->_open_data_connection())
 700          {
 701              return false;
 702          }
 703   
 704          $this->_send_command('NLST', $dir);
 705   
 706          $list = array();
 707          while (!@feof($this->data_connection))
 708          {
 709              $list[] = preg_replace('#[\r\n]#', '', @fgets($this->data_connection, 512));
 710          }
 711          $this->_close_data_connection();
 712   
 713          return $list;
 714      }
 715   
 716      /**
 717      * Send a command to server (FTP fsock only function)
 718      * @access private
 719      */
 720      function _send_command($command, $args = '', $check = true)
 721      {
 722          if (!empty($args))
 723          {
 724              $command = "$command $args";
 725          }
 726   
 727          fwrite($this->connection, $command . "\r\n");
 728   
 729          if ($check === true && !$this->_check_command())
 730          {
 731              return false;
 732          }
 733   
 734          return true;
 735      }
 736   
 737      /**
 738      * Opens a connection to send data (FTP fosck only function)
 739      * @access private
 740      */
 741      function _open_data_connection()
 742      {
 743          $this->_send_command('PASV', '', false);
 744   
 745          if (!$ip_port = $this->_check_command(true))
 746          {
 747              return false;
 748          }
 749   
 750          // open the connection to start sending the file
 751          if (!preg_match('#[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+#', $ip_port, $temp))
 752          {
 753              // bad ip and port
 754              return false;
 755          }
 756   
 757          $temp = explode(',', $temp[0]);
 758          $server_ip = $temp[0] . '.' . $temp[1] . '.' . $temp[2] . '.' . $temp[3];
 759          $server_port = $temp[4] * 256 + $temp[5];
 760          $errno = 0;
 761          $errstr = '';
 762   
 763          if (!$this->data_connection = @fsockopen($server_ip, $server_port, $errno, $errstr, $this->timeout))
 764          {
 765              return false;
 766          }
 767          @stream_set_timeout($this->data_connection, $this->timeout);
 768   
 769          return true;
 770      }
 771   
 772      /**
 773      * Closes a connection used to send data
 774      * @access private
 775      */
 776      function _close_data_connection()
 777      {
 778          return @fclose($this->data_connection);
 779      }
 780   
 781      /**
 782      * Check to make sure command was successful (FTP fsock only function)
 783      * @access private
 784      */
 785      function _check_command($return = false)
 786      {
 787          $response = '';
 788   
 789          do
 790          {
 791              $result = @fgets($this->connection, 512);
 792              $response .= $result;
 793          }
 794          while (substr($response, 3, 1) != ' ');
 795   
 796          if (!preg_match('#^[123]#', $response))
 797          {
 798              return false;
 799          }
 800   
 801          return ($return) ? $response : true;
 802      }
 803  }
 804   
 805  ?>