<?php
// +----------------------------------------------------------------+
// | Log.php  														|
// +----------------------------------------------------------------+
// | Source-code (C) CalaCode.com 1998-2005 . All rights reserved	|
// | See http://calacode.com/license.ehtml for license agreement	|
// +----------------------------------------------------------------+
// | Date: Febuary 2005												|
// +----------------------------------------------------------------+

require_once('header.php');

define ('QUERY_ERROR', 'Error in SQL Query');

require_once('Config.php');

class Log
{

	var $account;
	var $errtype;
	var $msg;
	var $logtype;
	var $db;
	var $tables = array('Error', 'Login', 'RecvMail', 'SMS', 'SendMail', 'Spam', 'Virus');


	function Log($args=null)
	{
		if (is_array($args))
		{
			foreach ($args as $k => $v)
				$this->$k = $v;
		}

		global $atmail, $pref;

		// can't establish db instance
		//if (is_a($atmail->db, 'SQL'))
		//	$this->db =& $atmail->db;
		//else
		//{
			//require_once('libs/Atmail/SQL.php');
        $this->db = mysql_connect($pref['sql_host'], $pref['sql_user'], $pref['sql_pass'], $pref['sql_table']);
        mysql_select_db($pref['sql_table'], $this->db);

		//}
	}

	function write_log($type, $msg=null)
	{
		if ($this->is_log_type($type))
			$this->errtype = $type;
		else
            return -1;

		if (!empty($msg))
		{
			$this->msg = $msg;
			$msg = mysql_real_escape_string($msg);
		}

		if ($this->Account)
		{
			$account = mysql_real_escape_string($this->Account);
		}
		else
			$account = 'System';

		//$query = "INSERT INTO Log_{$this->errtype} (Account, LogMsg, LogDate) VALUES (?, ?, NOW())";
		//$data =  array($account, $this->msg);
		//$this->db->sqldo($query, $data);

		$query = sprintf("INSERT INTO Log_{$this->errtype} (Account, LogMsg, LogDate) VALUES ('%s', '%s', NOW())", $account, $msg);
        mysql_ping($this->db);
		$res = mysql_query($query, $this->db);
	}

	// Raw log into the database for the log-daemon, use mysql_ping() if insert fails
	function log_raw($type, $msg=null)
	{
	    return $this->write_log($type, $msg);

        if ($type)
			$this->errtype = $type;
		else
            return -1;

		if (!empty($msg))
		{
			$this->msg = $msg;
			$msg = mysql_real_escape_string($msg);
		}

		if ($this->Account)
		{
			$account = mysql_real_escape_string($this->Account);
		}
		else
			$account = 'System';

		//$query = "INSERT INTO Log_{$this->errtype} (Account, LogMsg, LogDate) VALUES (?, ?, NOW())";
		//$data =  array($account, $this->msg);
		//$this->db->sqldo($query, $data);

		$query = sprintf("INSERT INTO Log_{$this->errtype} (Account, LogMsg, LogDate) VALUES ('%s', '%s', NOW())", $account, $msg);
        mysql_ping($this->db);
		$res = mysql_query($query, $this->db);

	}

	function logcheck($type, $ip=null)
	{
		$time = date('Ymd');

		if (!$this->is_log_type($type))
            return -1;

		if (isset($ip))
		{
			$ip = '%' . $ip . '%';

		    //if ($ip && $this->account && !preg_match('/New Account/i', $ip) ) {

		    $query = sprintf("select count(id) from Log_$type where LogMsg like '%s' and LogDate > DATE_SUB(NOW(), INTERVAL 24 HOUR) and Account='%s'", $ip, $this->Account);
		    $res = mysql_query($query);
		    if ($res === false)
                return -1;

            return mysql_result($res, 0);
		//   } else	{
		  //      return $this->db->getvalue( "select count(id) from Log_$type where LogMsg like ? and LogDate > DATE_SUB(NOW(), INTERVAL 24 HOUR)", array($ip) );
		 //	}

		}

//			$query = "select id from Log_$type where LogMsg like '%$ip%' and LogDate like '$time?%' ";
//			return $this->db->getvalue($query);
//		}

		return -2;
	}

	function logError($message, $file, $line, $type)
	{
		global $pref;

		if (!$pref['error_log'])
			return;

		$date = date('D M d H:i:s Y');
		if ($fh = fopen($pref['error_log'], 'a'))
		{
			fwrite($fh, "[$date] $type: $message in $file on line $line\n");
			fclose($fh);
		}
	}

	function addrelay($ip)
	{
		global $pref;

		if (!preg_match('/\d+\.\d+\.\d+\.\d+/', $ip))
            return 1;

		// Delete any entries older than 1 hour from the "user" table
		$query = sprintf("delete from MailRelay where Account='User' and DateAdded < DATE_SUB(NOW(), INTERVAL %d MINUTE)", $pref['smtp_popimaprelay_timeout']);
		mysql_query($query);

		// Add the new IP into the database, only if we do not exist
		$ip = mysql_real_escape($ip);
		$query = sprintf("select IPaddress from MailRelay where IPaddress='%s'", $ip);
		$res = mysql_query($query);
		if ($res === false)
            return -1;

        if (mysql_result($res, 0)) {
            $query = sprintf("INSERT INTO MailRelay (IPaddress, Account, DateAdded) VALUES('%s', 'User', NOW() )", $ip);
            $res = mysql_query($query);
		} else {
            // Update the DateAdded to now, so user always in sync to relay
            $query = sprintf("UPDATE MailRelay set DateAdded=NOW() where IPaddress='%s' and Account='User'", $ip);
            $res2 = mysql_query($query);
		}

		return;
	}

	function updatelastlogin($user)
	{
		// Return if no user supplied or account invalid
		if (!strpos($user, '@'))
            return -1;

		$time = time();

		// Update the users last login date
		$query = sprintf("update UserSession set LastLogin='%d' where Account='%s'", $time, $user);
        mysql_query($query);
		return 1;
	}

	/**
	 * Check for valid Log table name
	 *
	 * @param string $name
	 * @return bool  True if valid, false if not
	 */
	function is_log_type($name)
	{
	    return in_array($name, $this->tables);
	}

}//end Log

?>