From e372dd6925058eddf34e5b2b5ca59a5707befb37 Mon Sep 17 00:00:00 2001
From: mcramer <m.cramer@pixcept.de>
Date: Fri, 11 Oct 2013 02:58:52 -0400
Subject: [PATCH] Implemented: - javascript hooks prepared (onAfterContentLoad is first available hook) - new abstract class for GET and POST requests - new js.d directory that is included into main template
---
interface/web/index.php | 16 ++
interface/web/themes/default/templates/main.tpl.htm | 3
interface/lib/classes/functions.inc.php | 46 -------
interface/lib/classes/ispconfig_request.inc.php | 260 +++++++++++++++++++++++++++++++++++++++++++
interface/web/js/scrigo.js.php | 32 ++++-
5 files changed, 304 insertions(+), 53 deletions(-)
diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php
index 661e557..50b3e6c 100644
--- a/interface/lib/classes/functions.inc.php
+++ b/interface/lib/classes/functions.inc.php
@@ -61,52 +61,6 @@
$app->ispcmail->send($to);
$app->ispcmail->finish();
- /* left in here just for the case...
- if($filepath != '') {
- if(!file_exists($filepath)) $app->error("Mail attachement does not exist ".$filepath);
-
- $content = file_get_contents($filepath);
- $content = chunk_split(base64_encode($content));
- $uid = strtoupper(md5(uniqid(time())));
- $subject = "=?utf-8?B?".base64_encode($subject)."?=";
-
- if($filename == '') {
- $path_parts = pathinfo($filepath);
- $filename = $path_parts["basename"];
- unset($path_parts);
- }
-
- $header = "Return-Path: $from\nFrom: $from\nReply-To: $from\n";
- if($cc != '') $header .= "Cc: $cc\n";
- if($bcc != '') $header .= "Bcc: $bcc\n";
- $header .= "MIME-Version: 1.0\n";
- $header .= "Content-Type: multipart/mixed; boundary=$uid\n";
-
- $header .= "--$uid\n";
- $header .= "Content-Type: text/plain;\n\tcharset=\"UTF-8\"\n";
- $header .= "Content-Transfer-Encoding: 8bit\n\n";
- $header .= "$text\n";
-
- $header .= "--$uid\n";
- $header .= "Content-Type: $filetype; name=\"$filename\"\n";
-
- $header .= "Content-Transfer-Encoding: base64\n";
- $header .= "Content-Disposition: attachment; filename=\"$filename\"\n\n";
- $header .= "$content\n";
-
- $header .= "--$uid--";
-
- mail($to, $subject, "", $header);
- } else {
- $header = "From: $from\nReply-To: $from\n";
- if($cc != '') $header .= "Cc: $cc\n";
- if($bcc != '') $header .= "Bcc: $bcc\n";
- $header .= "Content-Type: text/plain;\n\tcharset=\"UTF-8\"\n";
- $header .= "Content-Transfer-Encoding: 8bit\n\n";
- $subject = "=?utf-8?B?".base64_encode($subject)."?=";
- mail($to, $subject, $text, $header);
- }
- */
return true;
}
diff --git a/interface/lib/classes/ispconfig_request.inc.php b/interface/lib/classes/ispconfig_request.inc.php
new file mode 100644
index 0000000..75e06ee
--- /dev/null
+++ b/interface/lib/classes/ispconfig_request.inc.php
@@ -0,0 +1,260 @@
+<?php
+
+/*
+Copyright (c) 2013, Marius Cramer, pixcept KG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+//* The purpose of this library is to provide some general functions.
+//* This class is loaded automatically by the ispconfig framework.
+
+abstract class ISPConfigRequest {
+ /**
+ * Get header data and contents from an url
+ *
+ * Calls an url and returns an array containing the http header and the page content
+ *
+ * @access public
+ * @param string $url the url to call
+ * @param string $store_in the file to store the data in instead of returning them
+ * @return array The array with header data at index 0 and page content at index 1, returns boolean false on error. If $store_in is set only the headers are returned
+ */
+ public static function get_with_headers($url, $store_in = null, $follow_redirects = false, $user_agent = false) {
+ if($follow_redirects === true) $follow_redirects = 5;
+ elseif($follow_redirects !== false) $follow_redirects--;
+
+ if(!$user_agent) $user_agent = 'pxFW GET proxy';
+
+ $url_info = parse_url($url);
+ if(isset($url_info['scheme']) && $url_info['scheme'] == 'https') {
+ $port = isset($url_info['port']) ? $url_info['port'] : 443;
+ //@$fp = stream_socket_client('ssl://' . $url_info['host'] . ':' . $port, $errno, $errstr, 10, STREAM_CLIENT_CONNECT, stream_context_create(array('ssl' => array('ciphers' => 'ALL:!AES:!3DES:!RC4:@STRENGTH'))));
+ @$fp = fsockopen('sslv3://' . $url_info['host'], $port, $errno, $errstr, 10);
+ } else {
+ $port = isset($url_info['port']) ? $url_info['port'] : 80;
+ @$fp = fsockopen($url_info['host'], $port, $errno, $errstr, 10);
+ }
+
+ if($store_in) {
+ $outfp = fopen($store_in, 'w');
+ if(!$outfp) return false;
+ }
+ if($fp) {
+ stream_set_timeout($fp, 10);
+ $head = 'GET ' . (isset($url_info['path']) ? $url_info['path'] : '/') . (isset($url_info['query']) ? '?' . $url_info['query'] : '');
+ $head .= " HTTP/1.0\r\nHost: " . (isset($url_info['host']) ? $url_info['host'] : '') . "\r\n";
+ $head .= "User-Agent: " . $user_agent . "\r\n";
+ if(isset($url_info['user'])) {
+ if(!array_key_exists('pass', $url_info)) $url_info['pass'] = '';
+ $head .= "Authorization: basic " . base64_encode($url_info['user'] . ':' . $url_info['pass']) . "\r\n";
+ }
+ $head .= "Connection: Close\r\n";
+ $head .= "Accept: */*\r\n\r\n";
+
+ $data = '';
+ $eoheader = false;
+ fputs($fp, $head);
+ while(!feof($fp)) {
+ if($header = fgets($fp, 1024)) {
+ if($eoheader == true) {
+ if($store_in) fputs($outfp, $header);
+ else $data .= $header;
+ continue;
+ }
+
+ if ($header == "\r\n") {
+ $eoheader = true;
+ continue;
+ } else {
+ $header = trim($header);
+ }
+ $sc_pos = strpos($header, ':');
+ if($sc_pos === false) {
+ $headers['status'] = $header;
+ $headers['http_code'] = intval(preg_replace('/^HTTP\/\d+\.\d+\s+(\d+)\s+.*$/', '$1', $header));
+ } else {
+ $label = substr($header, 0, $sc_pos);
+ $value = substr($header, $sc_pos + 1);
+ $headers[strtolower($label)] = trim($value);
+ }
+ }
+ }
+ fclose($fp);
+ if(isset($headers['http_code']) && isset($headers['location']) && ($headers['http_code'] == 301 || $headers['http_code'] == 302) && $follow_redirects > 0) {
+ if($store_in) fclose($outfp);
+ return $self::get_with_headers($headers['location'], $store_in, $follow_redirects);
+ }
+ if($store_in) {
+ fclose($outfp);
+
+ $code = intval(preg_replace('/^HTTP\/\d+\.\d+\s+(\d+)\s+.*$/', '$1', $headers['status']));
+ if($code != 200) {
+ return false;
+ }
+ return $headers;
+ } else {
+ return array($headers, $data);
+ }
+ } else {
+ if($store_in) {
+ fclose($outfp);
+ @unlink($store_in);
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Gets the content of an url
+ *
+ * Checks for the php function file_get_contents and uses an alternative if not found
+ *
+ * @access public
+ * @param string $url url to get
+ * @return string url data including headers
+ * @see file_get_contents
+ */
+ public static function get($url) {
+ if(function_exists('file_get_contents')) return file_get_contents($url);
+
+ $fp = fopen($url, 'r');
+ $data = '';
+ while(!feof($fp)) {
+ $data .= fgets($fp, 8192);
+ }
+ fclose($fp);
+
+ return $data;
+ }
+
+
+ /**
+ * Make a post request and get data
+ *
+ * Calls an url with a post request and returns the data - and optionally the header content
+ *
+ * @access public
+ * @param string $url the url to call
+ * @param string $data the post data to send
+ * @param bool $get_headers if true, the function will return an array like PXUrl::get_with_headers(), otherwise the content is returned as a string
+ * @return mixed Content data as string or - if get_headers is true - the array with header data at index 0 and page content at index 1
+ * @see get_url_and_headers
+ */
+ public static function post($url, $data, $get_headers = false, $user_agent = false) {
+ $url_info = parse_url($url);
+ if((isset($url_info['scheme']) && $url_info['scheme'] == 'https') || $url_info['port'] == 443) {
+ $port = (!isset($url_info['port']) || !$url_info['port'] || $url_info['port'] == 443 || $url_info['port'] == 80) ? 443 : $url_info['port'];
+ //@$fp = stream_socket_client('ssl://' . $url_info['host'] . ':' . $port, $errno, $errstr, 10, STREAM_CLIENT_CONNECT, stream_context_create(array('ssl' => array('ciphers' => 'ALL:!AES:!3DES:!RC4:@STRENGTH'))));
+ @$fp = fsockopen('sslv3://' . $url_info['host'], $port, $errno, $errstr, 10);
+ } else {
+ $port = isset($url_info['port']) ? $url_info['port'] : 80;
+ @$fp = fsockopen($url_info['host'], $port, $errno, $errstr, 10);
+ }
+
+ if(!$fp) return '';
+
+ if(!$user_agent) $user_agent = 'pxFW GET proxy';
+
+ $header = 'POST ' . (isset($url_info['path']) ? $url_info['path'] : '/') . (isset($url_info['query']) ? '?' . @$url_info['query'] : '') . " HTTP/1.1\r\n";
+ $header .= "Host: " . @$url_info['host'] . "\r\n";
+ $header .= "User-Agent: " . $user_agent . "\r\n";
+ if(isset($url_info['user'])) {
+ if(!array_key_exists('pass', $url_info)) $url_info['pass'] = '';
+ $header .= "Authorization: basic " . base64_encode($url_info['user'] . ':' . $url_info['pass']) . "\r\n";
+ }
+ $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
+ $header .= "Content-Length: " . strlen($data) . "\r\n";
+ $header .= "Connection: close\r\n\r\n";
+ $header .= $data . "\r\n\r\n";
+
+ fwrite($fp, $header);
+
+ $response = '';
+ $eoheader = false;
+ $header = '';
+ $tmpdata = '';
+ $chunked = false;
+ $chunklen = 0;
+
+ while(!feof($fp)) {
+ if($header = @fgets($fp, 1024)) {
+ if($eoheader == true) {
+ $response .= $header;
+ continue;
+ }
+
+ if ($header == "\r\n") {
+ $eoheader = true;
+ continue;
+ } else {
+ $tmpdata .= $header;
+ if(preg_match('/Transfer-Encoding:\s+chunked/i', $tmpdata)) $chunked = true;
+ }
+ }
+ }
+ //var_dump($response, $chunked, $header);
+ if($chunked == true) {
+ $lines = explode("\n", $response);
+ $response = '';
+ $chunklen = 0;
+ foreach($lines as $line) {
+ $line .= "\n";
+ if($chunklen <= 0) {
+ if(preg_match('/^([0-9a-f]+)\s*$/is', $line, $matches)) {
+ $chunklen = hexdec($matches[1]);
+ }
+ continue;
+ }
+
+ if(strlen($line) > $chunklen) {
+ //echo "Warnung: " . strlen($line) . " > " . $chunklen . "\n";
+ $line = substr($line, 0, $chunklen);
+ }
+ $response .= $line;
+ $chunklen -= strlen($line);
+ }
+
+ $start = strpos($response,'<?xml');
+ $end = strrpos($response,'>');
+ if($start !== false && $end !== false) $response = substr($response, $start, $end - $start + 1);
+ }
+
+ fclose($fp);
+
+ if($get_headers == true) {
+ $tmpheaders = explode("\n", $tmpdata);
+ $headers = array();
+ foreach($tmpheaders as $cur) {
+ if(preg_match('/^(\w+)\:\s*(.*)$/is', $cur, $matches)) {
+ $headers["$matches[1]"] = trim($matches[2]);
+ }
+ }
+ return array($headers, $response);
+ } else return $response;
+ }
+}
+
+?>
diff --git a/interface/web/index.php b/interface/web/index.php
index a7d2965..c0005bc 100644
--- a/interface/web/index.php
+++ b/interface/web/index.php
@@ -60,6 +60,22 @@
unset($_SESSION['show_error_msg']);
}
+// read js.d files
+$js_d = ISPC_WEB_PATH . '/js/js.d';
+$js_d_files = array();
+if(@is_dir($js_d)) {
+ $dir = opendir($js_d);
+ while($file = readdir($dir)) {
+ $filename = $js_d . '/' . $file;
+ if($file === '.' || $file === '..' || !is_file($filename)) continue;
+ if(substr($file, -3) !== '.js') continue;
+ $js_d_files[] = array('file' => $file);
+ }
+ closedir($dir);
+}
+
+$app->tpl->setLoop('js_d_includes', $js_d_files);
+unset($js_d_files);
$app->tpl_defaults();
$app->tpl->pparse();
diff --git a/interface/web/js/scrigo.js.php b/interface/web/js/scrigo.js.php
index 418b26b..33be65e 100644
--- a/interface/web/js/scrigo.js.php
+++ b/interface/web/js/scrigo.js.php
@@ -18,6 +18,7 @@
var indicatorPaddingH = -1;
var indicatorPaddingW = -1;
var indicatorCompleted = false;
+var registeredHooks = new Array();
redirect = '';
function reportError(request) {
@@ -26,6 +27,20 @@
ajax request worked. */
/*alert(request);*/
+}
+
+function registerHook(name, callback) {
+ if(!registeredHooks[name]) registeredHooks[name] = new Array();
+ var newindex = registeredHooks[name].length;
+ registeredHooks[name][newindex] = callback;
+}
+
+function callHook(name, params) {
+ if(!registeredHooks[name]) return;
+ for(var i = 0; i < registeredHooks[name].length; i++) {
+ var callback = registeredHooks[name][i];
+ callback(name, params);
+ }
}
function resetFormChanged() {
@@ -73,7 +88,9 @@
}
}
-function onAfterContentLoad() {
+function onAfterContentLoad(url, data) {
+ if(!data) data = '';
+ else data = '&' + data;
<?php
if($server_config_array['misc']['use_combobox'] == 'y'){
?>
@@ -81,6 +98,7 @@
<?php
}
?>
+ callHook('onAfterContentLoad', {'url': url, 'data': data });
}
function loadContentRefresh(pagename) {
@@ -96,7 +114,7 @@
success: function(data, textStatus, jqXHR) {
hideLoadIndicator();
jQuery('#pageContent').html(jqXHR.responseText);
- onAfterContentLoad();
+ onAfterContentLoad(pagename, "refresh="+document.getElementById('refreshinterval').value);
pageFormChanged = false;
},
error: function() {
@@ -175,7 +193,7 @@
document.location.href = 'index.php';
} else {
jQuery('#pageContent').html(jqXHR.responseText);
- onAfterContentLoad();
+ onAfterContentLoad('content.php', jQuery('#'+formname).serialize());
pageFormChanged = false;
}
loadMenus();
@@ -213,7 +231,7 @@
//window.setTimeout('loadContent(redirect)', 1000);
} else {
jQuery('#pageContent').html(jqXHR.responseText);
- onAfterContentLoad();
+ onAfterContentLoad(target, jQuery('#'+formname).serialize());
pageFormChanged = false;
}
hideLoadIndicator();
@@ -252,7 +270,7 @@
//window.setTimeout('loadContent(redirect)', 1000);
} else {
jQuery('#pageContent').html(jqXHR.responseText);
- onAfterContentLoad();
+ onAfterContentLoad(target, jQuery('#'+formname).serialize());
pageFormChanged = false;
}
hideLoadIndicator();
@@ -330,7 +348,7 @@
//jQuery.each(reponseScript, function(idx, val) { eval(val.text); } );
jQuery('#pageContent').html(jqXHR.responseText);
- onAfterContentLoad();
+ onAfterContentLoad(pagename, (params ? params : null));
pageFormChanged = false;
}
hideLoadIndicator();
@@ -357,7 +375,7 @@
loadContent(parts[1]);
} else {
jQuery('#pageContent').html(jqXHR.responseText);
- onAfterContentLoad();
+ onAfterContentLoad('content.php', "s_mod=login&s_pg=index");
pageFormChanged = false;
}
hideLoadIndicator();
diff --git a/interface/web/themes/default/templates/main.tpl.htm b/interface/web/themes/default/templates/main.tpl.htm
index d148a5f..c503718 100644
--- a/interface/web/themes/default/templates/main.tpl.htm
+++ b/interface/web/themes/default/templates/main.tpl.htm
@@ -18,6 +18,9 @@
<script type="text/javascript" src="js/uni-form/uni-form.jquery.js"></script>
<script type="text/javascript" src="js/jquery.ispconfigsearch.js"></script>
<script type="text/javascript" src="js/jquery.tipsy.js"></script>
+ <tmpl_loop name="js_d_includes">
+ <script type="text/javascript" src="js/js.d/<tmpl_var name='file'>"></script>
+ </tmpl_loop>
<script language="JavaScript" type="text/javascript">
jQuery(document).ready(function() {
loadInitContent();
--
Gitblit v1.9.1