| 1: | <?php | 
| 2: |  | 
| 3: |  | 
| 4: |  | 
| 5: |  | 
| 6: |  | 
| 7: |  | 
| 8: |  | 
| 9: |  | 
| 10: |  | 
| 11: |  | 
| 12: |  | 
| 13: |  | 
| 14: |  | 
| 15: |  | 
| 16: |  | 
| 17: |  | 
| 18: |  | 
| 19: |  | 
| 20: |  | 
| 21: |  | 
| 22: |  | 
| 23: |  | 
| 24: | function smarty_function_fetch($params, $template) | 
| 25: | { | 
| 26: | if (empty($params[ 'file' ])) { | 
| 27: | trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE); | 
| 28: | return; | 
| 29: | } | 
| 30: |  | 
| 31: | if (stripos($params[ 'file' ], 'file://') === 0) { | 
| 32: | $params[ 'file' ] = substr($params[ 'file' ], 7); | 
| 33: | } | 
| 34: | $protocol = strpos($params[ 'file' ], '://'); | 
| 35: | if ($protocol !== false) { | 
| 36: | $protocol = strtolower(substr($params[ 'file' ], 0, $protocol)); | 
| 37: | } | 
| 38: | if (isset($template->smarty->security_policy)) { | 
| 39: | if ($protocol) { | 
| 40: |  | 
| 41: | if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) { | 
| 42: | return; | 
| 43: | } | 
| 44: | } else { | 
| 45: |  | 
| 46: | if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) { | 
| 47: | return; | 
| 48: | } | 
| 49: | } | 
| 50: | } | 
| 51: | $content = ''; | 
| 52: | if ($protocol === 'http') { | 
| 53: |  | 
| 54: | if ($uri_parts = parse_url($params[ 'file' ])) { | 
| 55: |  | 
| 56: | $host = $server_name = $uri_parts[ 'host' ]; | 
| 57: | $timeout = 30; | 
| 58: | $accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*'; | 
| 59: | $agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION; | 
| 60: | $referer = ''; | 
| 61: | $uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/'; | 
| 62: | $uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : ''; | 
| 63: | $_is_proxy = false; | 
| 64: | if (empty($uri_parts[ 'port' ])) { | 
| 65: | $port = 80; | 
| 66: | } else { | 
| 67: | $port = $uri_parts[ 'port' ]; | 
| 68: | } | 
| 69: | if (!empty($uri_parts[ 'user' ])) { | 
| 70: | $user = $uri_parts[ 'user' ]; | 
| 71: | } | 
| 72: | if (!empty($uri_parts[ 'pass' ])) { | 
| 73: | $pass = $uri_parts[ 'pass' ]; | 
| 74: | } | 
| 75: |  | 
| 76: | foreach ($params as $param_key => $param_value) { | 
| 77: | switch ($param_key) { | 
| 78: | case 'file': | 
| 79: | case 'assign': | 
| 80: | case 'assign_headers': | 
| 81: | break; | 
| 82: | case 'user': | 
| 83: | if (!empty($param_value)) { | 
| 84: | $user = $param_value; | 
| 85: | } | 
| 86: | break; | 
| 87: | case 'pass': | 
| 88: | if (!empty($param_value)) { | 
| 89: | $pass = $param_value; | 
| 90: | } | 
| 91: | break; | 
| 92: | case 'accept': | 
| 93: | if (!empty($param_value)) { | 
| 94: | $accept = $param_value; | 
| 95: | } | 
| 96: | break; | 
| 97: | case 'header': | 
| 98: | if (!empty($param_value)) { | 
| 99: | if (!preg_match('![\w\d-]+: .+!', $param_value)) { | 
| 100: | trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE); | 
| 101: | return; | 
| 102: | } else { | 
| 103: | $extra_headers[] = $param_value; | 
| 104: | } | 
| 105: | } | 
| 106: | break; | 
| 107: | case 'proxy_host': | 
| 108: | if (!empty($param_value)) { | 
| 109: | $proxy_host = $param_value; | 
| 110: | } | 
| 111: | break; | 
| 112: | case 'proxy_port': | 
| 113: | if (!preg_match('!\D!', $param_value)) { | 
| 114: | $proxy_port = (int)$param_value; | 
| 115: | } else { | 
| 116: | trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE); | 
| 117: | return; | 
| 118: | } | 
| 119: | break; | 
| 120: | case 'agent': | 
| 121: | if (!empty($param_value)) { | 
| 122: | $agent = $param_value; | 
| 123: | } | 
| 124: | break; | 
| 125: | case 'referer': | 
| 126: | if (!empty($param_value)) { | 
| 127: | $referer = $param_value; | 
| 128: | } | 
| 129: | break; | 
| 130: | case 'timeout': | 
| 131: | if (!preg_match('!\D!', $param_value)) { | 
| 132: | $timeout = (int)$param_value; | 
| 133: | } else { | 
| 134: | trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE); | 
| 135: | return; | 
| 136: | } | 
| 137: | break; | 
| 138: | default: | 
| 139: | trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE); | 
| 140: | return; | 
| 141: | } | 
| 142: | } | 
| 143: | if (!empty($proxy_host) && !empty($proxy_port)) { | 
| 144: | $_is_proxy = true; | 
| 145: | $fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout); | 
| 146: | } else { | 
| 147: | $fp = fsockopen($server_name, $port, $errno, $errstr, $timeout); | 
| 148: | } | 
| 149: | if (!$fp) { | 
| 150: | trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE); | 
| 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: | fputs($fp, "\r\n"); | 
| 179: | while (!feof($fp)) { | 
| 180: | $content .= fgets($fp, 4096); | 
| 181: | } | 
| 182: | fclose($fp); | 
| 183: | $csplit = preg_split("!\r\n\r\n!", $content, 2); | 
| 184: | $content = $csplit[ 1 ]; | 
| 185: | if (!empty($params[ 'assign_headers' ])) { | 
| 186: | $template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ])); | 
| 187: | } | 
| 188: | } | 
| 189: | } else { | 
| 190: | trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE); | 
| 191: | return; | 
| 192: | } | 
| 193: | } else { | 
| 194: | $content = @file_get_contents($params[ 'file' ]); | 
| 195: | if ($content === false) { | 
| 196: | throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'"); | 
| 197: | } | 
| 198: | } | 
| 199: | if (!empty($params[ 'assign' ])) { | 
| 200: | $template->assign($params[ 'assign' ], $content); | 
| 201: | } else { | 
| 202: | return $content; | 
| 203: | } | 
| 204: | } | 
| 205: |  |