aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorMarcello Coutinho <marcellocoutinho@gmail.com>2012-05-10 12:28:33 -0300
committerMarcello Coutinho <marcellocoutinho@gmail.com>2012-05-10 12:28:33 -0300
commit0293a8f6b843135a3b97917e09a1de5314bdd721 (patch)
tree20050f32745c91690eca4da75a9746c99f00c632 /config
parentd016784d0d0b652168500825ea1cade961c7eef6 (diff)
downloadpfsense-packages-0293a8f6b843135a3b97917e09a1de5314bdd721.tar.gz
pfsense-packages-0293a8f6b843135a3b97917e09a1de5314bdd721.tar.bz2
pfsense-packages-0293a8f6b843135a3b97917e09a1de5314bdd721.zip
imspector-dev - include report template option and fetch limit for log files
Diffstat (limited to 'config')
-rw-r--r--config/imspector-dev/imspector.inc16
-rw-r--r--config/imspector-dev/imspector.xml30
-rw-r--r--config/imspector-dev/imspector_acls.xml14
-rw-r--r--config/imspector-dev/imspector_replacements.xml8
-rw-r--r--config/imspector-dev/imspector_sync.xml2
-rw-r--r--config/imspector-dev/services_imspector_logs.php8
-rw-r--r--config/imspector-dev/services_imspector_logs2.php310
7 files changed, 372 insertions, 16 deletions
diff --git a/config/imspector-dev/imspector.inc b/config/imspector-dev/imspector.inc
index 7ac603ba..a4af7771 100644
--- a/config/imspector-dev/imspector.inc
+++ b/config/imspector-dev/imspector.inc
@@ -149,6 +149,7 @@
#bannedphraselist
if (!is_array($config['installedpackages']['imspectoracls'])){
$config['installedpackages']['imspectoracls']['config'][]=array('enable'=> 'on',
+ 'description' => 'allow access to all ids',
'action' => 'allow',
'localid' => 'all',
'remoteid' => base64_encode('all'));
@@ -250,9 +251,6 @@
if($ims_replacements['block_webcams'])
$conf['block_webcams'] = 'on';
-
- if($ims_replacements['block_unlisted'])
- $conf['block_unlisted'] = 'on';
$acls="";
$conf['acl_filename'] = IMSPECTOR_ETC . '/acls.txt';
@@ -342,7 +340,17 @@
foreach($conf as $var => $key)
$conftext .= "{$var}={$key}\n";
write_imspector_config(IMSPECTOR_CONFIG, $conftext);
-
+
+ /*Check template settings*/
+ if ($ims_config['template'] == "")
+ $template="services_imspector_logs.php";
+ else
+ $template=$ims_config['template'];
+
+ if (file_exists("/usr/local/www/{$template}"))
+ $log_file=file_get_contents("/usr/local/www/{$template}");
+ file_put_contents("/usr/local/www/imspector_logs.php",$log_file,LOCK_EX);
+
/* generate rc file start and stop */
$stop = <<<EOD
/bin/pkill -x imspector
diff --git a/config/imspector-dev/imspector.xml b/config/imspector-dev/imspector.xml
index 4d12a3d2..3bf53f04 100644
--- a/config/imspector-dev/imspector.xml
+++ b/config/imspector-dev/imspector.xml
@@ -75,7 +75,7 @@
</tab>
<tab>
<text>Log</text>
- <url>/services_imspector_logs.php</url>
+ <url>/imspector_logs.php</url>
</tab>
<tab>
<text>Sync</text>
@@ -107,6 +107,11 @@
<chmod>0755</chmod>
<item>http://www.pfsense.org/packages/config/imspector-dev/services_imspector_logs.php</item>
</additional_files_needed>
+ <additional_files_needed>
+ <prefix>/usr/local/www/</prefix>
+ <chmod>0755</chmod>
+ <item>http://www.pfsense.org/packages/config/imspector-dev/services_imspector_logs2.php</item>
+ </additional_files_needed>
<fields>
<field>
<name>General Settings</name>
@@ -180,6 +185,25 @@
<type>checkbox</type>
</field>
<field>
+ <fielddescr>Report limit</fielddescr>
+ <fieldname>limit</fieldname>
+ <description>Max entries to fetch from log dir. Default is 1000</description>
+ <type>input</type>
+ <size>10</size>
+ </field>
+ <field>
+ <fielddescr>Report template</fielddescr>
+ <fieldname>template</fieldname>
+ <description>Template to use on reports</description>
+ <type>select</type>
+ <required/>
+ <options>
+ <option><name>Default Template</name><value>services_imspector_logs.php</value></option>
+ <option><name>0guzcan Template</name><value>services_imspector_logs2.php</value></option>
+ <option><name>Mysql template (working in progress...)</name><value>services_imspector_mysql.php</value></option>
+ </options>
+ </field>
+ <field>
<fielddescr>Enable mySQL logging</fielddescr>
<fieldname>log_mysql</fieldname>
<description>Make sure to specify your MySQL credentials below.</description>
@@ -189,21 +213,25 @@
<fielddescr>mySQL server</fielddescr>
<fieldname>mysql_server</fieldname>
<type>input</type>
+ <size>35</size>
</field>
<field>
<fielddescr>mySQL database</fielddescr>
<fieldname>mysql_database</fieldname>
<type>input</type>
+ <size>35</size>
</field>
<field>
<fielddescr>mySQL username</fielddescr>
<fieldname>mysql_username</fieldname>
<type>input</type>
+ <size>35</size>
</field>
<field>
<fielddescr>mySQL password</fielddescr>
<fieldname>mysql_password</fieldname>
<type>password</type>
+ <size>35</size>
</field>
</fields>
<custom_php_validation_command>
diff --git a/config/imspector-dev/imspector_acls.xml b/config/imspector-dev/imspector_acls.xml
index 02d57052..3176c75f 100644
--- a/config/imspector-dev/imspector_acls.xml
+++ b/config/imspector-dev/imspector_acls.xml
@@ -82,7 +82,7 @@
</tab>
<tab>
<text>Log</text>
- <url>/services_imspector_logs.php</url>
+ <url>/imspector_logs.php</url>
</tab>
<tab>
<text>Sync</text>
@@ -102,6 +102,10 @@
<fielddescr>local ID</fielddescr>
<fieldname>localid</fieldname>
</columnitem>
+ <columnitem>
+ <fielddescr>Description</fielddescr>
+ <fieldname>description</fieldname>
+ </columnitem>
</adddeleteeditpagefields>
<fields>
<field>
@@ -128,6 +132,14 @@
<required/>
</field>
<field>
+ <fielddescr>Description</fielddescr>
+ <fieldname>description</fieldname>
+ <description><![CDATA[Specify a description for this rule.]]></description>
+ <type>input</type>
+ <size>50</size>
+ <required/>
+ </field>
+ <field>
<fielddescr>Local ID</fielddescr>
<fieldname>localid</fieldname>
<description><![CDATA[Specify local id for this rule<br>
diff --git a/config/imspector-dev/imspector_replacements.xml b/config/imspector-dev/imspector_replacements.xml
index e0ff4a06..7f53bbd4 100644
--- a/config/imspector-dev/imspector_replacements.xml
+++ b/config/imspector-dev/imspector_replacements.xml
@@ -74,7 +74,7 @@
</tab>
<tab>
<text>Log</text>
- <url>/services_imspector_logs.php</url>
+ <url>/imspector_logs.php</url>
</tab>
<tab>
<text>Sync</text>
@@ -156,12 +156,6 @@
<type>checkbox</type>
</field>
<field>
- <fielddescr>Block non ACL defined</fielddescr>
- <fieldname>block_unlisted</fieldname>
- <description>Overide the default of allowing user's not defined the whitelist or blacklist ACLs.</description>
- <type>checkbox</type>
- </field>
- <field>
<fielddescr>Enable bad word filtering</fielddescr>
<fieldname>filter_badwords</fieldname>
<description>Replace characters of matched bad word with *.</description>
diff --git a/config/imspector-dev/imspector_sync.xml b/config/imspector-dev/imspector_sync.xml
index 8959af02..3ff88d41 100644
--- a/config/imspector-dev/imspector_sync.xml
+++ b/config/imspector-dev/imspector_sync.xml
@@ -60,7 +60,7 @@
</tab>
<tab>
<text>Log</text>
- <url>/services_imspector_logs.php</url>
+ <url>/imspector_logs.php</url>
</tab>
<tab>
<text>Sync</text>
diff --git a/config/imspector-dev/services_imspector_logs.php b/config/imspector-dev/services_imspector_logs.php
index 09e732b8..aa6a9a9b 100644
--- a/config/imspector-dev/services_imspector_logs.php
+++ b/config/imspector-dev/services_imspector_logs.php
@@ -6,6 +6,7 @@
JavaScript Code is GPL Licensed from SmoothWall Express.
Copyright (C) 2007 Ryan Wagoner <rswagoner@gmail.com>.
+ Copyright (C) 2012 Marcello Coutinho
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -62,13 +63,16 @@ $convo_remote_bgcolor = '#eeeeee';
function convert_dir_list ($topdir) {
if (!is_dir($topdir)) return;
if ($dh = opendir($topdir)) {
- while (($file = readdir($dh)) !== false) {
+ $limit=(is_numericint($imspector_config['limit'])?$imspector_config['limit']:"1000");
+ $count=0;
+ while (($file = readdir($dh)) !== false && $count < $limit) {
if(!preg_match('/^\./', $file) == 0) continue;
if (is_dir("$topdir/$file")) {
$list .= convert_dir_list("$topdir/$file");
} else {
$list .= "$topdir/$file\n";
}
+ $count ++;
}
closedir($dh);
}
@@ -160,7 +164,7 @@ include("head.inc");
$tab_array[] = array(gettext("Settings "), false, "/pkg_edit.php?xml=imspector.xml&id=0");
$tab_array[] = array(gettext("Replacements "), false, "/pkg_edit.php?xml=imspector_replacements.xml&id=0");
$tab_array[] = array(gettext("Access Lists "), false, "/pkg.php?xml=imspector_acls.xml");
- $tab_array[] = array(gettext("Log "), true, "/services_imspector_logs.php");
+ $tab_array[] = array(gettext("Log "), true, "/imspector_logs.php");
$tab_array[] = array(gettext("Sync "), false, "/pkg_edit.php?xml=imspector_sync.xml&id=0");
display_top_tabs($tab_array);
diff --git a/config/imspector-dev/services_imspector_logs2.php b/config/imspector-dev/services_imspector_logs2.php
new file mode 100644
index 00000000..a90ae6ca
--- /dev/null
+++ b/config/imspector-dev/services_imspector_logs2.php
@@ -0,0 +1,310 @@
+<?php
+/*
+ services_imspector_logs.php
+ part of pfSense (http://www.pfsense.com/)
+
+ JavaScript Code is GPL Licensed from SmoothWall Express.
+
+ Copyright (C) 2007 Ryan Wagoner <rswagoner@gmail.com>.
+ Copyright (C) 2012 0guzcan at pfsense forum.
+ Copyright (C) 2012 Marcello Coutinho
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ THIS SOFTWARE IS PROVIDED ``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
+ AUTHOR 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.
+*/
+require("guiconfig.inc");
+
+/* variables */
+$log_dir = '/var/imspector';
+$imspector_config = $config['installedpackages']['imspector']['config'][0];
+
+$border_color = '#c0c0c0';
+$default_bgcolor = '#eeeeee';
+
+$list_protocol_color = '#000000';
+$list_local_color = '#ffffff';
+$list_remote_color = '#666666';
+$list_convo_color = '#888888';
+
+$list_protocol_bgcolor = '#cccccc';
+$list_local_bgcolor = '#850000';
+$list_remote_bgcolor = '#eeeeee';
+$list_end_bgcolor = '#bbbbbb';
+
+$convo_title_color = 'black';
+$convo_local_color = 'blue';
+$convo_remote_color = 'red';
+
+$convo_title_bgcolor = '#cccccc';
+$convo_local_bgcolor = '#dddddd';
+$convo_remote_bgcolor = '#eeeeee';
+
+
+/* functions */
+
+function convert_dir_list ($topdir) {
+ if (!is_dir($topdir)) return;
+ if ($dh = opendir($topdir)) {
+ $limit=(is_numericint($imspector_config['limit'])?$imspector_config['limit']:"1000");
+ $count=0;
+ while (($file = readdir($dh)) !== false && $count < $limit) {
+ if(!preg_match('/^\./', $file) == 0) continue;
+ if (is_dir("$topdir/$file")) {
+ $list .= convert_dir_list("$topdir/$file");
+ } else {
+ $list .= "$topdir/$file\n";
+ }
+ $count ++;
+ }
+ closedir($dh);
+ }
+ return $list;
+}
+
+/* ajax response */
+if ($_POST['mode'] == "render") {
+
+ /* user list */
+ print(str_replace(array($log_dir,'/'),array('','|'),convert_dir_list($log_dir)));
+ print("--END--\n");
+
+ /* log files */
+ if ($_POST['section'] != "none") {
+ $section = explode('|',$_POST['section']);
+ $protocol = $section[0];
+ $localuser = $section[1];
+ $remoteuser = $section[2];
+ $conversation = $section[3];
+
+ /* conversation title */
+ print(implode(', ', $section)."\n");
+ print("--END--\n");
+
+ /* conversation content */
+ $filename = $log_dir.'/'.implode('/', $section);
+ if($fd = fopen($filename, 'r')) {
+ $satir_oku = fgets($fd);
+ $ipsinibulduk = explode(':',$satir_oku);
+
+ print("<table width='100%' border='0' cellpadding='2' cellspacing='1'><tr><td style='color:#fff;' colspan='4' align='center' width='100%' bgcolor='#850000'>kullanilan [<span style='font-weight:bold;'>$localuser</span>] adresine ait local ip: [<span style='font-weight:bold;'>$ipsinibulduk[0]</span>]</td></tr>\n");
+ while (!feof($fd)) {
+ $line = fgets($fd);
+ if(feof($fd)) continue;
+ $new_format = '([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),(.*)';
+ $old_format = '([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),(.*)';
+ preg_match("/${new_format}|${old_format}/", $line, $matches);
+ $address = $matches[1];
+ $addresbul = explode(':',$address);
+ $addressnew =$addresbul[0] ;
+ $timestamp = $matches[2];
+ $direction = $matches[3];
+ $type = $matches[4];
+ $filtered = $matches[5];
+ if(count($matches) == 8) {
+ $category = $matches[6];
+ $data = $matches[7];
+ } else {
+ $category = "";
+ $data = $matches[6];
+ }
+
+ if($direction == '0') {
+ $bgcolor = $convo_remote_bgcolor;
+ $user = "<span style='color: $convo_remote_color;'>$remoteuser</span>";
+ }
+ if($direction == '1') {
+ $bgcolor = $convo_local_bgcolor;
+ $user = "<span style='color: $convo_local_color;'>$localuser</span>";
+ }
+
+ $time = strftime("%H:%M", $timestamp);
+
+
+ print("<tr bgcolor='$bgcolor'>
+ <td style='width: 5%; vertical-align: top;border-bottom:1px solid #ccc;'>[$time]</td>\n
+ <td style='border-bottom:1px solid #ccc; width: 13%; vertical-align: top;'>$user</td>\n
+ <td style='border-bottom:1px solid #ccc; width: 1%; vertical-align: top;'>$category</td>\n
+ <td style='border-bottom:1px solid #ccc; width: 82%; vertical-align: top;'>$data</td></tr>\n");
+ }
+ print("</table>\n");
+ fclose($fd);
+ }
+ }
+ exit;
+}
+/* defaults to this page but if no settings are present, redirect to setup page */
+if(!$imspector_config["enable"] || !$imspector_config["iface_array"] || !$imspector_config["proto_array"])
+ Header("Location: /pkg_edit.php?xml=imspector.xml&id=0");
+
+$pgtitle = "Services: IMSpector Log Viewer";
+include("head.inc");
+/* put your custom HTML head content here */
+/* using some of the $pfSenseHead function calls */
+//$pfSenseHead->addMeta("<meta http-equiv=\"refresh\" content=\"120;url={$_SERVER['SCRIPT_NAME']}\" />");
+//echo $pfSenseHead->getHTML();
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<div id="mainlevel">
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Settings "), false, "/pkg_edit.php?xml=imspector.xml&id=0");
+ $tab_array[] = array(gettext("Replacements "), false, "/pkg_edit.php?xml=imspector_replacements.xml&id=0");
+ $tab_array[] = array(gettext("Access Lists "), false, "/pkg.php?xml=imspector_acls.xml");
+ $tab_array[] = array(gettext("Log "), true, "/imspector_logs.php");
+ $tab_array[] = array(gettext("Sync "), false, "/pkg_edit.php?xml=imspector_sync.xml&id=0");
+ display_top_tabs($tab_array);
+?>
+</table>
+
+<?php
+$zz = <<<EOD
+<script type="text/javascript">
+var section = 'none';
+var moveit = 1;
+var the_timeout;
+
+function xmlhttpPost()
+{
+ var xmlHttpReq = false;
+ var self = this;
+
+ if (window.XMLHttpRequest)
+ self.xmlHttpReq = new XMLHttpRequest();
+ else if (window.ActiveXObject)
+ self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
+
+ self.xmlHttpReq.open('POST', 'services_imspector_logs.php', true);
+ self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+
+ self.xmlHttpReq.onreadystatechange = function() {
+ if (self.xmlHttpReq && self.xmlHttpReq.readyState == 4)
+ updatepage(self.xmlHttpReq.responseText);
+ }
+
+ document.getElementById('im_status').style.display = "inline";
+ self.xmlHttpReq.send("mode=render&section=" + section);
+}
+
+function updatepage(str)
+{
+ /* update the list of conversations ( if we need to ) */
+ var parts = str.split("--END--\\n");
+ var lines = parts[0].split("\\n");
+
+ for (var line = 0 ; line < lines.length ; line ++) {
+ var a = lines[line].split("|");
+
+ if (!a[1] || !a[2] || !a[3]) continue;
+
+ /* create titling information if needed */
+ if (!document.getElementById(a[1])) {
+ document.getElementById('im_convos').innerHTML +=
+ "<div id='" + a[1] + "_t' style='width: 100%; background-color: $list_protocol_bgcolor; color: $list_protocol_color;'>" + a[1] + "</div>" +
+ "<div id='" + a[1] + "' style='width: 100%; background-color: $list_local_bgcolor;'></div>";
+ }
+ if (!document.getElementById(a[1] + "_" + a[2])) {
+ var imageref = "";
+ if (a[0]) imageref = "<img src='" + a[0] + "' alt='" + a[1] + "'/>";
+ document.getElementById(a[1]).innerHTML +=
+ "<div id='" + a[1] + "_" + a[2] + "_t' style='width: 100%; color: $list_local_color; padding-left: 5px;'>" + imageref + a[2] + "</div>" +
+ "<div id='" + a[1] + "_" + a[2] + "' style='width: 100%; background-color: $list_remote_bgcolor; border-bottom: solid 1px $list_end_bgcolor;'></div>";
+ }
+ if (!document.getElementById(a[1] + "_" + a[2] + "_" + a[3])) {
+ document.getElementById(a[1] + "_" + a[2]).innerHTML +=
+ "<div id='" + a[1] + "_" + a[2] + "_" + a[3] + "_t' style='width: 100%; color: $list_remote_color; padding-left: 10px;'>" + a[3] + "</div>" +
+ "<div id='" + a[1] + "_" + a[2] + "_" + a[3] + "' style='width: 100%;'></div>";
+ }
+ if (!document.getElementById(a[1] + "_" + a[2] + "_" + a[3] + "_" + a[4])) {
+ document.getElementById(a[1] + "_" + a[2] + "_" + a[3]).innerHTML +=
+ "<div id='" + a[1] + "_" + a[2] + "_" + a[3] + "_" + a[4] +
+ "' style='width: 100%; color: $list_convo_color; cursor: pointer; padding-left: 15px;' onClick=" +
+ '"' + "setsection('" + a[1] + "|" + a[2] + "|" + a[3] + "|" + a[4] + "');" + '"' + "' + >&raquo;" + a[4] + "</div>";
+ }
+ }
+
+ /* determine the title of this conversation */
+ var details = parts[1].split(",");
+ var title = "<table border='1' width='100%'><tr><td style='color:#666;' align='center' bgcolor='#eee' valign='top'>"+ details[3]+ " tarihli " + "[<span style='font-weight:bold;'>" + details[1]+ "</span> ]"+ " ile " + "[ <span style='font-weight:bold;'>" + details[2] + " </span> ] " + details[0] + " görüsme kaydi</td></tr></table>";
+ if (!details[1]) title = "&nbsp;";
+ if (!parts[2]) parts[2] = "&nbsp;";
+
+ document.getElementById('im_status').style.display = "none";
+ var bottom = parseInt(document.getElementById('im_content').scrollTop);
+ var bottom2 = parseInt(document.getElementById('im_content').style.height);
+ var absheight = parseInt( bottom + bottom2 );
+ if (absheight == document.getElementById('im_content').scrollHeight) {
+ moveit = 1;
+ } else {
+ moveit = 0;
+ }
+ document.getElementById('im_content').innerHTML = parts[2];
+ if (moveit == 1) {
+ document.getElementById('im_content').scrollTop = 0;
+ document.getElementById('im_content').scrollTop = document.getElementById('im_content').scrollHeight;
+ }
+ document.getElementById('im_content_title').innerHTML = title;
+ the_timeout = setTimeout( "xmlhttpPost();", 5000 );
+}
+
+function setsection(value)
+{
+ section = value;
+ clearTimeout(the_timeout);
+ xmlhttpPost();
+ document.getElementById('im_content').scrollTop = 0;
+ document.getElementById('im_content').scrollTop = document.getElementById('im_content').scrollHeight;
+}
+</script>
+EOD;
+print($zz);
+?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="tabcont">
+ <div style='width: 100%; text-align: right;'><span id='im_status' style='display: none;'>Yenileniyor...</span>&nbsp;</div>
+ <table width="100%">
+ <tr>
+ <td width="15%" bgcolor="<?=$default_bgcolor?>" style="overflow: auto; border: solid 1px <?=$border_color?>;">
+ <div id="im_convos" style="height: 400px; overflow: auto; overflow-x: hidden;"></div>
+ </td>
+ <td width="75%" bgcolor="<?=$default_bgcolor?>" style="border: solid 1px <?=$border_color?>;">
+ <div id="im_content_title" style="height: 20px; overflow: auto; vertical-align: top;
+ color: <?=$convo_title_color?>; background-color: <?=$convo_title_bgcolor?>;"></div>
+ <div id="im_content" style="height: 380px; overflow: auto; vertical-align: bottom; overflow-x: hidden;"></div>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript">xmlhttpPost();</script>
+
+</div>
+<?php include("fend.inc"); ?>
+</body>
+</html> \ No newline at end of file