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