1
|
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 = split("\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 ?>
|