<?php

include( "dnsfuncs.php" );

function db_connect()
{
	$conn = pg_pconnect( "host=127.0.0.1 dbname=dns user=dns password=dns" );
	if( !$conn )
	{
		echo "<html>\n<body>\n";
		echo "<b>unable to connect to database !!!</b>\n";
		echo "</body>\n</html>\n";
	}
	return $conn;
}

function db_begin_work( $conn )
{
	if( pg_exec( $conn, "begin work" ) )
	{
		showVar( "begin", "done" );
		return true;
	}
	else
	{
		echo "<b>SQL: begin work failed</b><br />\n";
		return false;
	}
}

function db_commit_work( $conn )
{
	if( pg_exec( $conn, "commit work" ) )
	{
		showVar( "commit", "done" );
		return true;
	}
	else
	{
		echo "<b>SQL: commit work failed</b><br />\n";
		pg_exec( $conn, "rollback" );
		return false;
	}
}

function db_rollback_work( $conn )
{
	if( pg_exec( $conn, "rollback work" ) )
	{
		showVar( "rollback", "done" );
		return true;
	}
	else
	{
		echo "<b>SQL: rollback work failed</b><br />\n";
		return false;
	}
}

function db_check_login( $conn, $user, $pass )
{
	if( !ereg( "^[a-zA-Z0-9]*$", $user ) )
	{
		echo "illegal username<br />\n";
		return false;
	}
	if( !ereg( "^[a-zA-Z0-9]*$", $pass ) )
	{
		echo "illegal password<br />\n";
		return false;
	}
	// add md5 hashes for password ++++++
	$sql = "select du_id, du_admin from dnsuser where " .
		"du_name = '$user' and du_pass = '$pass' and " .
		"du_enabled = true and du_id_del is null";
	showVar( "sql", $sql );
	$rs = pg_exec( $conn, $sql );
	if( $arr = pg_fetch_array( $rs ) )
	{
		$_SESSION["dnsuser"] = $user;
		$_SESSION["dnsuid"] = $arr[0];
		if( $arr[1] == "t" )
		{
			$_SESSION["dnsadmin"] = true;
		}
		else
		{
			$_SESSION["dnsadmin"] = false;
		}
		$dnsuser = $user;
		$dnsuid = $arr[0];
		$dnsadmin = $_SESSION["dnsadmin"];
		$from = $_SERVER["REMOTE_ADDR"];
		// ipdate entries where no logout happened
		$sql =	"update dnsuserlog set dul_logout = CURRENT_TIMESTAMP where " .
				"dul_logout is null and du_id = $dnsuid";
		pg_exec( $conn, $sql );
		// log the login
		$sql =	"insert into dnsuserlog ( " .
					"du_id, dul_login, dul_logout, dul_from " .
				") values ( " .
					"$dnsuid, CURRENT_TIMESTAMP, null, '$from' " .
				")";
		pg_exec( $conn, $sql );
		return true;
	}
	else
	{
		echo "not found on db<br />\n";
		return false;
	}
}

function db_logout( $conn )
{
	$dnsuid = $_SESSION["dnsuid"];
	$dnsuser = $_SESSION["dnsuser"];

	$sql =	"update dnsuserlog set dul_logout = CURRENT_TIMESTAMP where " .
			"dul_logout is null and du_id = $dnsuid";
	pg_exec( $conn, $sql );
	session_unregister( "dnsuser" );
	session_unregister( "dnsuid" );
	session_destroy();
	$dnsuser = "";
	$dnsuid = "";
}

function db_domain_list( $conn, $id, $withnull, $uid, $var )
{
	if( $uid == 0 )
	{
		$sql = "select dom_id, dom_name from domain order by dom_name";
	}
	else
	{
		$sql =	"select d.dom_id, dom_name from domain d, domainpriv p where " .
				"d.dom_id = p.dom_id and p.du_id = $uid order by dom_name";
	}
	showVar( "sql", $sql );
	//showVar( "id", $id );
	$rs = pg_exec( $conn, $sql );
	if( !$rs )
	{
		return;
	}
	echo "<select name=\"$var\">\n";
	if( $withnull )
	{
		echo "<option value=\"\">all domains\n";
	}
	while( $row = pg_fetch_array($rs) )
	{
		if( $row["dom_id"] == $id )
		{
			$checked = " selected";
		}
		else
		{
			$checked = "";
		}
		echo "<option value=\"" . $row["dom_id"] . "\"$checked>" .
			$row["dom_name"] . "\n";
	}
	echo "</select>\n";
}

function makeIpBase( $minip, $maxip )
{
	$minip = (int)$minip;
	$maxip = (int)$maxip;
	$ip1n = ($minip >> 24) & 255;
	$ip1x = ($maxip >> 24) & 255;
	$ip2n = ($minip >> 16) & 255;
	$ip2x = ($maxip >> 16) & 255;
	$ip3n = ($minip >> 8) & 255;
	$ip3x = ($maxip >> 8) & 255;
	$ip4n = $minip & 255;
	$ip4x = $maxip & 255;
	if( $ip1n != $ip1x )
	{
		return "";
	}
	if( $ip2n != $ip2x )
	{
		return $ip1n . ".";
	}
	if( $ip3n != $ip3x )
	{
		return $ip1n . "." . $ip2n . ".";
	}
	if( $ip4n != $ip4x )
	{
		return $ip1n . "." . $ip2n . "." . $ip3n . ".";
	}
	return $ip1n . "." . $ip2n . "." . $ip3n . "." . $ip4n;
}

function db_iprange_list( $conn, $id, $withnull, $uid, $var, $form, $txtfield )
{
	if( $uid == 0 )
	{
		$sql =	"select ipr_id, ipr_min_addr, ipr_max_addr, ipr_descr " .
				"from iprange " .
				"where du_id_del is null and ipr_dhcp = false " .
				"order by ipr_min_addr";
	}
	else
	{
		$sql =	"select r.ipr_id, ipr_min_addr, ipr_max_addr, ipr_descr " .
				"from iprange r, iprangepriv p where " .
				"r.ipr_id = p.ipr_id and p.du_id = $uid  and " .
				"r.du_id_del is null and r.ipr_dhcp = false " .
				"order by ipr_min_addr";
	}
	$rs = pg_exec( $conn, $sql );
	if( !$rs )
	{
		return;
	}
	if( $form != "" && $txtfield != "" )
	{
		$script = true;
		echo "<select name=\"$var\" onChange=\"" . $form . "_" . $var .
			"_chg()\">\n";
	}
	else
	{
		$script = false;
		echo "<select name=\"$var\">\n";
	}
	if( $withnull )
	{
		echo "<option value=\"\">all ip ranges\n";
	}
	while( $row = pg_fetch_array($rs) )
	{
		if( $script )
		{
			$minips[$row["ipr_id"]] = $row["ipr_min_addr"];
			$maxips[$row["ipr_id"]] = $row["ipr_max_addr"];
		}
		if( $row["ipr_id"] == $id )
		{
			$checked = " selected";
		}
		else
		{
			$checked = "";
		}
		echo "<option value=\"" . $row["ipr_id"] . "\"$checked>" .
			intToIP($row["ipr_min_addr"]) . "-" .
			intToIP($row["ipr_max_addr"]) . " (" .
			$row["ipr_descr"] . ")\n";
	}
	echo "</select>\n";
	if( $script )
	{
		echo "<script language=\"JavaScript\">\n";
		echo "<!--\n";
		echo "function " . $form . "_" . $var .  "_chg()\n";
		echo "{\n";
		echo " val = '';\n";
		echo " for(i=0;i<document." . $form . "." . $var . ".length;++i)\n";
		echo "  if(document." . $form . "." . $var . ".options[i].selected)\n";
		echo "   val = document." . $form . "." . $var . ".options[i].value;\n";
		echo " switch(val)\n";
		/*
		echo " switch(document." . $form . "." . $var . ".value )\n";
		*/
		echo " {\n";
		reset( $minips );
		while( list($k,$v) = each($minips) )
		{
			echo "  case \"$k\":\n";
			echo "   document." . $form . "." . $txtfield . ".value = '" .
					makeIpBase( $v, $maxips[$k] ) . "';\n";
			echo "   break;\n";
		}
		echo "  default:\n";
		echo "   document." . $form . "." . $txtfield . ".value = '';\n";
		echo "   break;\n";
		echo " }\n";
		echo "}\n";
		echo "//-->\n";
		echo "</script>\n";
	}
}

function db_check_iprange( $conn, $ipmin, $ipmax, $id )
{
	$sql = 	"select ipr_id, ipr_min_addr, ipr_max_addr, dom_id from iprange " .
			"where ipr_min_addr <= $ipmax and ipr_max_addr >= $ipmin " .
			"and ipr_id != $id";
	showVar( "sql", $sql );
	$rs = pg_exec( $conn, $sql );
	if( !$rs )
	{
		return false;
	}
	$row = pg_fetch_array( $rs );
	if( !$row )
	{
		return true;
	}
	echo "<b>" . intToIP($ipmin) . "-" . intToIP($ipmax) .
		" overlaps with iprange " . intToIP($row["ipr_min_addr"]) .  "-" .
		intToIP($row["ipr_max_addr"]) . " ID " . $row["ipr_id"] .
		"</b><br />\n";
	return false;
}

function db_check_iprange_ip( $conn, $range, $ip, $uid )
{
	if( $uid > 0 )
	{
		$sql =	"select count(*) as cnt, min(dom_id) as dom " .
				"from iprange r, iprangepriv p where " .
				"r.ipr_id = p.ipr_id and p.du_id = $uid and " .
				"r.ipr_id = $range and r.ipr_min_addr <= $ip and " .
				"r.ipr_max_addr >= $ip";
	}
	else
	{
		$sql =	"select count(*) as cnt, min(dom_id) as dom " .
				"from iprange where " .
				"ipr_id = $range and ipr_min_addr <= $ip and " .
				"ipr_max_addr >= $ip";
	}
	showVar( "sql", $sql );
	$rs = pg_exec( $conn, $sql );
	if( !$rs )
	{
		echo "<b>SQL Error in exec</b><br />\n";
		return 0;
	}
	$row = pg_fetch_array( $rs );
	if( !$row )
	{
		echo "<b>SQL Error in fetch</b><br />\n";
		return 0;
	}
	if( $row["cnt"] == 0 )
	{
		echo "<b>illegal ip address for selected range</b><br />\n";
		return 0;
	}
	return $row["dom"];
}

function db_get_next_id( $conn, $table, $column )
{
	$sql =	"select count(*) as cnt, max($column) as mx from $table";
	$rs = pg_exec( $conn, $sql );
	$id = 0;
	if( $rs )
	{
		$row = pg_fetch_array( $rs );
		if( $row )
		{
			if( $row["cnt"] == 0 )
			{
				$id = 1;
			}
			else
			{
				$id = $row["mx"] + 1;
			}
		}
	}
	if( $id == 0 )
	{
		echo "<b>unable to get next ID from table $table</b><br />\n";
	}
	return $id;
}

function db_check_description( $descr, $maxlen )
{
	$descr = stripslashes( $descr );
	if( strlen( $descr ) > $maxlen )
	{
		echo "<b>description too long !!!</b><br />\n";
		return "";
	}
	if( $descr != "" )
	{
		return "'" . addslashes( $descr ) . "'";
	}
	else
	{
		return "null";
	}
}

function db_check_hwaddr( $conn, $hwaddr, $ipaddr )
{
	if( $hwaddr == "" )
	{
		return "null";
	}
	if( $hwaddr == "dynamic" )
	{
		return "'dynamic'";
	}
	$hwaddr = strtoupper( $hwaddr );
	if( !ereg( "^[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]$", $hwaddr ) )
	{
		echo "<b>illegal hardware address '$hwaddr'</b><br />\n";
		return "";
	}
	$hwaddr = "'$hwaddr'";
	$sql =	"select count(*) as cnt from ipaddr where " .
		"ip_hw_addr = $hwaddr and ip_addr != $ipaddr and " .
		"du_id_del is null";
	$rs = pg_exec( $conn, $sql );
	if( !$rs )
	{
		echo "<b>DB ERROR: searching hardware address</b>\n";
		return "";
	}
	$row = pg_fetch_array( $rs );
	if( !$row )
	{
		echo "<b>DB ERROR: fetching hardware address</b>\n";
		return "";
	}
	if( $row["cnt"] > 0 )
	{
		echo "<b>hardware address $hwaddr already exists</b><br />\n";
		return "";
	}
	return $hwaddr;
}

?>