From 677e1f26fe47cc0c3e0819cb99a9024af49a619c Mon Sep 17 00:00:00 2001 From: alecpl Date: Tue, 18 May 2010 10:25:29 +0000 Subject: - Some files from /bin + spellchecking actions moved to the new 'utils' task --- program/steps/utils/html2text.inc | 28 +++++++++++ program/steps/utils/killcache.inc | 52 +++++++++++++++++++ program/steps/utils/modcss.inc | 98 ++++++++++++++++++++++++++++++++++++ program/steps/utils/spell.inc | 28 +++++++++++ program/steps/utils/spell_googie.inc | 73 +++++++++++++++++++++++++++ program/steps/utils/spell_pspell.inc | 78 ++++++++++++++++++++++++++++ 6 files changed, 357 insertions(+) create mode 100644 program/steps/utils/html2text.inc create mode 100644 program/steps/utils/killcache.inc create mode 100644 program/steps/utils/modcss.inc create mode 100644 program/steps/utils/spell.inc create mode 100644 program/steps/utils/spell_googie.inc create mode 100644 program/steps/utils/spell_pspell.inc (limited to 'program/steps/utils') diff --git a/program/steps/utils/html2text.inc b/program/steps/utils/html2text.inc new file mode 100644 index 000000000..ff2b40e6b --- /dev/null +++ b/program/steps/utils/html2text.inc @@ -0,0 +1,28 @@ + | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +$converter = new html2text($HTTP_RAW_POST_DATA); + +header('Content-Type: text/plain; charset=UTF-8'); +print trim($converter->get_text()); +exit; + +?> diff --git a/program/steps/utils/killcache.inc b/program/steps/utils/killcache.inc new file mode 100644 index 000000000..a2e7b3e25 --- /dev/null +++ b/program/steps/utils/killcache.inc @@ -0,0 +1,52 @@ + | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +// don't allow public access if not in devel_mode +if (!$RCMAIL->config->get('devel_mode')) { + header("HTTP/1.0 401 Access denied"); + die("Access denied!"); +} + +$options = array( + 'use_transactions' => false, + 'log_line_break' => "\n", + 'idxname_format' => '%s', + 'debug' => false, + 'quote_identifier' => true, + 'force_defaults' => false, + 'portability' => true +); + +// @TODO: transaction here (if supported by DB) would be a good thing +$res = $RCMAIL->db->query("DELETE FROM cache"); +if (PEAR::isError($res)) { + exit($res->getMessage()); +} + +$res = $RCMAIL->db->query("DELETE FROM messages"); +if (PEAR::isError($res)) { + exit($res->getMessage()); +} + +echo "Cache cleared\n"; +exit; + +?> diff --git a/program/steps/utils/modcss.inc b/program/steps/utils/modcss.inc new file mode 100644 index 000000000..2224901ac --- /dev/null +++ b/program/steps/utils/modcss.inc @@ -0,0 +1,98 @@ + | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +$source = ''; + +$url = preg_replace('![^a-z0-9:./\-_?$&=%]!i', '', $_GET['u']); +if ($url === null) { + header('HTTP/1.1 403 Forbidden'); + echo $error; + exit; +} + +$a_uri = parse_url($url); +$port = $a_uri['port'] ? $a_uri['port'] : 80; +$host = $a_uri['host']; +$path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : ''); + +// don't allow any other connections than http(s) +if (strtolower(substr($a_uri['scheme'], 0, 4)) != 'http') { + header('HTTP/1.1 403 Forbidden'); + echo "Invalid URL"; + exit; +} + +// try to open socket connection +if (!($fp = fsockopen($host, $port, $errno, $error, 15))) { + header('HTTP/1.1 500 Internal Server Error'); + echo $error; + exit; +} + +// set timeout for socket +stream_set_timeout($fp, 30); + +// send request +$out = "GET $path HTTP/1.0\r\n"; +$out .= "Host: $host\r\n"; +$out .= "Connection: Close\r\n\r\n"; +fwrite($fp, $out); + +// read response +$header = true; +$headers = array(); +while (!feof($fp)) { + $line = trim(fgets($fp, 4048)); + + if ($header) { + if (preg_match('/^HTTP\/1\..\s+(\d+)/', $line, $regs) + && intval($regs[1]) != 200) { + break; + } + else if (empty($line)) { + $header = false; + } + else { + list($key, $value) = explode(': ', $line); + $headers[strtolower($key)] = $value; + } + } + else { + $source .= "$line\n"; + } +} +fclose($fp); + +// check content-type header and mod styles +$mimetype = strtolower($headers['content-type']); +if (!empty($source) && in_array($mimetype, array('text/css','text/plain'))) { + header('Content-Type: text/css'); + echo rcmail_mod_css_styles($source, preg_replace('/[^a-z0-9]/i', '', $_GET['c'])); + exit; +} +else + $error = "Invalid response returned by server"; + +header('HTTP/1.0 404 Not Found'); +echo $error; +exit; + +?> diff --git a/program/steps/utils/spell.inc b/program/steps/utils/spell.inc new file mode 100644 index 000000000..dab56956b --- /dev/null +++ b/program/steps/utils/spell.inc @@ -0,0 +1,28 @@ + | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +if ($spell_engine = $RCMAIL->config->get('spellcheck_engine', 'googie')) { + include('spell_'.$spell_engine.'.inc'); +} + +header('HTTP/1.1 404 Not Found'); +exit; + +?> diff --git a/program/steps/utils/spell_googie.inc b/program/steps/utils/spell_googie.inc new file mode 100644 index 000000000..ec60f48f0 --- /dev/null +++ b/program/steps/utils/spell_googie.inc @@ -0,0 +1,73 @@ + | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +$REMOTE_REQUEST = TRUE; + +// default settings +$host = "ssl://www.google.com"; +$port = 443; +$lang = get_input_value('lang', RCUBE_INPUT_GET); +$path = "/tbproxy/spell?lang=$lang"; + +// spell check uri is configured +if (!empty($CONFIG['spellcheck_uri'])) + { + $a_uri = parse_url($CONFIG['spellcheck_uri']); + $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl'); + $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80); + $host = ($ssl ? 'ssl://' : '') . $a_uri['host']; + $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang; + } + +$data = file_get_contents('php://input'); +$store = ""; + +if ($fp = fsockopen($host, $port, $errno, $errstr, 30)) + { + $out = "POST $path HTTP/1.0\r\n"; + $out .= "Host: $host\r\n"; + $out .= "Content-Length: " . strlen($data) . "\r\n"; + $out .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $out .= "Connection: Close\r\n\r\n"; + $out .= $data; + fwrite($fp, $out); + + while (!feof($fp)) + $store .= fgets($fp, 128); + fclose($fp); + } + +// remove headers +$pos = strpos($store, ' diff --git a/program/steps/utils/spell_pspell.inc b/program/steps/utils/spell_pspell.inc new file mode 100644 index 000000000..f892f8963 --- /dev/null +++ b/program/steps/utils/spell_pspell.inc @@ -0,0 +1,78 @@ + | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +if (!extension_loaded('pspell')) { + raise_error(array( + 'code' => 500, + 'type' => 'php', + 'file' => __FILE__, 'line' => __LINE__, + 'message' => "Pspell extension not available"), true, false); + + header('HTTP/1.1 404 Not Found'); + exit; +} + +// max. number of suggestions for one word +define('MAX_SUGGESTIONS', 10); + +// read input +$data = file_get_contents('php://input'); + +// parse data (simplexml_load_string breaks CRLFs) +$left = strpos($data, ''); +$right = strrpos($data, ''); +$text = substr($data, $left+6, $right-($left+6)); +$text = html_entity_decode($text, ENT_QUOTES, RCMAIL_CHARSET); + +// tokenize +$words = preg_split('/[ !"#$%&()*+\\,\/\n:;<=>?@\[\]^_{|}-]+|\.[^\w]/', $text, NULL, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE ); + +// init spellchecker +$plink = pspell_new(get_input_value('lang', RCUBE_INPUT_GET), null, null, RCMAIL_CHARSET, PSPELL_FAST); + +// send output +$out = ''; + +$diff = 0; +foreach ($words as $w) { + $word = trim($w[0]); + $pos = $w[1] - $diff; + $len = mb_strlen($word); + if ($word && $plink && preg_match('/[^0-9\.]/', $word) + && !pspell_check($plink, $word)) { + $suggestions = pspell_suggest($plink, $word); + if (sizeof($suggestions)>10) + $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS); + + $out .= ''; + $out .= implode("\t", $suggestions); + $out .= ''; + } + $diff += (strlen($word) - $len); +} + +$out .= ''; + +header("Content-Type: text/xml; charset=".RCMAIL_CHARSET); +echo $out; +exit; + +?> -- cgit v1.2.3