WIKINDX PHP Cross Reference Collaborative Wikis

Source: /core/display/Smarty/libs/plugins/function.fetch.php - 221 lines - 8745 bytes - Summary - Text - Print

Description: Smarty plugin

   1  <?php
   2  /**
   3   * Smarty plugin
   4   * @package Smarty
   5   * @subpackage plugins
   6   */
   7  
   8  
   9  /**
  10   * Smarty {fetch} plugin
  11   *
  12   * Type:     function<br>
  13   * Name:     fetch<br>
  14   * Purpose:  fetch file, web or ftp data and display results
  15   * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch}
  16   *       (Smarty online manual)
  17   * @author Monte Ohrt <monte at ohrt dot com>
  18   * @param array
  19   * @param Smarty
  20   * @return string|null if the assign parameter is passed, Smarty assigns the
  21   *                     result to a template variable
  22   */
  23  function smarty_function_fetch($params, &$smarty)
  24  {
  25      if (empty($params['file'])) {
  26          $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty");
  27          return;
  28      }
  29  
  30      $content = '';
  31      if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) {
  32          $_params = array('resource_type' => 'file', 'resource_name' => $params['file']);
  33          require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
  34          if(!smarty_core_is_secure($_params, $smarty)) {
  35              $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed');
  36              return;
  37          }
  38          
  39          // fetch the file
  40          if($fp = @fopen($params['file'],'r')) {
  41              while(!feof($fp)) {
  42                  $content .= fgets ($fp,4096);
  43              }
  44              fclose($fp);
  45          } else {
  46              $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'');
  47              return;
  48          }
  49      } else {
  50          // not a local file
  51          if(preg_match('!^http://!i',$params['file'])) {
  52              // http fetch
  53              if($uri_parts = parse_url($params['file'])) {
  54                  // set defaults
  55                  $host = $server_name = $uri_parts['host'];
  56                  $timeout = 30;
  57                  $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
  58                  $agent = "Smarty Template Engine ".$smarty->_version;
  59                  $referer = "";
  60                  $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/';
  61                  $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : '';
  62                  $_is_proxy = false;
  63                  if(empty($uri_parts['port'])) {
  64                      $port = 80;
  65                  } else {
  66                      $port = $uri_parts['port'];
  67                  }
  68                  if(!empty($uri_parts['user'])) {
  69                      $user = $uri_parts['user'];
  70                  }
  71                  if(!empty($uri_parts['pass'])) {
  72                      $pass = $uri_parts['pass'];
  73                  }
  74                  // loop through parameters, setup headers
  75                  foreach($params as $param_key => $param_value) {
  76                      switch($param_key) {
  77                          case "file":
  78                          case "assign":
  79                          case "assign_headers":
  80                              break;
  81                          case "user":
  82                              if(!empty($param_value)) {
  83                                  $user = $param_value;
  84                              }
  85                              break;
  86                          case "pass":
  87                              if(!empty($param_value)) {
  88                                  $pass = $param_value;
  89                              }
  90                              break;
  91                          case "accept":
  92                              if(!empty($param_value)) {
  93                                  $accept = $param_value;
  94                              }
  95                              break;
  96                          case "header":
  97                              if(!empty($param_value)) {
  98                                  if(!preg_match('![\w\d-]+: .+!',$param_value)) {
  99                                      $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'");
 100                                      return;
 101                                  } else {
 102                                      $extra_headers[] = $param_value;
 103                                  }
 104                              }
 105                              break;
 106                          case "proxy_host":
 107                              if(!empty($param_value)) {
 108                                  $proxy_host = $param_value;
 109                              }
 110                              break;
 111                          case "proxy_port":
 112                              if(!preg_match('!\D!', $param_value)) {
 113                                  $proxy_port = (int) $param_value;
 114                              } else {
 115                                  $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
 116                                  return;
 117                              }
 118                              break;
 119                          case "agent":
 120                              if(!empty($param_value)) {
 121                                  $agent = $param_value;
 122                              }
 123                              break;
 124                          case "referer":
 125                              if(!empty($param_value)) {
 126                                  $referer = $param_value;
 127                              }
 128                              break;
 129                          case "timeout":
 130                              if(!preg_match('!\D!', $param_value)) {
 131                                  $timeout = (int) $param_value;
 132                              } else {
 133                                  $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
 134                                  return;
 135                              }
 136                              break;
 137                          default:
 138                              $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'");
 139                              return;
 140                      }
 141                  }
 142                  if(!empty($proxy_host) && !empty($proxy_port)) {
 143                      $_is_proxy = true;
 144                      $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout);
 145                  } else {
 146                      $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout);
 147                  }
 148  
 149                  if(!$fp) {
 150                      $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)");
 151                      return;
 152                  } else {
 153                      if($_is_proxy) {
 154                          fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n");
 155                      } else {
 156                          fputs($fp, "GET $uri HTTP/1.0\r\n");
 157                      }
 158                      if(!empty($host)) {
 159                          fputs($fp, "Host: $host\r\n");
 160                      }
 161                      if(!empty($accept)) {
 162                          fputs($fp, "Accept: $accept\r\n");
 163                      }
 164                      if(!empty($agent)) {
 165                          fputs($fp, "User-Agent: $agent\r\n");
 166                      }
 167                      if(!empty($referer)) {
 168                          fputs($fp, "Referer: $referer\r\n");
 169                      }
 170                      if(isset($extra_headers) && is_array($extra_headers)) {
 171                          foreach($extra_headers as $curr_header) {
 172                              fputs($fp, $curr_header."\r\n");
 173                          }
 174                      }
 175                      if(!empty($user) && !empty($pass)) {
 176                          fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n");
 177                      }
 178  
 179                      fputs($fp, "\r\n");
 180                      while(!feof($fp)) {
 181                          $content .= fgets($fp,4096);
 182                      }
 183                      fclose($fp);
 184                      $csplit = explode("\r\n\r\n",$content,2);
 185  
 186                      $content = $csplit[1];
 187  
 188                      if(!empty($params['assign_headers'])) {
 189                          $smarty->assign($params['assign_headers'],split("\r\n",$csplit[0]));
 190                      }
 191                  }
 192              } else {
 193                  $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax");
 194                  return;
 195              }
 196          } else {
 197              // ftp fetch
 198              if($fp = @fopen($params['file'],'r')) {
 199                  while(!feof($fp)) {
 200                      $content .= fgets ($fp,4096);
 201                  }
 202                  fclose($fp);
 203              } else {
 204                  $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'');
 205                  return;
 206              }
 207          }
 208  
 209      }
 210  
 211  
 212      if (!empty($params['assign'])) {
 213          $smarty->assign($params['assign'],$content);
 214      } else {
 215          return $content;
 216      }
 217  }
 218  
 219  /* vim: set expandtab: */
 220  
 221  ?>

title

Description

title

Description

title

Description

title

title

Body