<?php
	
/**
 * AgileBill - Open Billing Software
 *
 * This body of work is free software; you can redistribute it and/or
 * modify it under the terms of the Open AgileBill License
 * License as published at http://www.agileco.com/agilebill/license1-4.txt
 * 
 * For questions, help, comments, discussion, etc., please join the
 * Agileco community forums at http://forum.agileco.com/ 
 *
 * @link http://www.agileco.com/
 * @copyright 2004-2008 Agileco, LLC.
 * @license http://www.agileco.com/agilebill/license1-4.txt
 * @author Tony Landis <tony@agileco.com> 
 * @package AgileBill
 * @version 1.4.93
 */
	
class htaccess_dir
{

	# Open the constructor for this mod
	function htaccess_dir()
	{
		# name of this module:
		$this->module = "htaccess_dir";

		# location of the construct XML file:
		$this->xml_construct = PATH_MODULES . "" . $this->module . "/" . $this->module . "_construct.xml";

		# open the construct file for parsing	
		$C_xml = new CORE_xml;
		$construct = $C_xml->xml_to_array($this->xml_construct);

		$this->method   = $construct["construct"]["method"];
		$this->trigger  = $construct["construct"]["trigger"];
		$this->field    = $construct["construct"]["field"];
		$this->table 	= $construct["construct"]["table"];
		$this->module 	= $construct["construct"]["module"];
		$this->cache	= $construct["construct"]["cache"];
		$this->order_by = $construct["construct"]["order_by"];
		$this->limit	= $construct["construct"]["limit"];

		# add extra lines needed in the .htaccess files when added/updated:
		# Example: 
		#$this->htaccess_extra = "Options +FollowSymlinks\n"; 
		$this->htaccess_extra = '';
	}




	##############################
	##		ADD   		        ##
	##############################

	function add($VAR)
	{
		global $C_translate, $C_debug;
		$VAR['htaccess_dir_htaccess'] = '# Error!';
		$this->validated = true;

		### Change the path...
		if ( isset ( $VAR['htaccess_dir_path'] ) && $VAR['htaccess_dir_path'] != '' )
		{
			# trim whitspaces
			$VAR['htaccess_dir_path'] = trim ( $VAR['htaccess_dir_path'] );

			# replace all forward slashes with back slashes
			$VAR['htaccess_dir_path'] = ereg_replace('\\\\', '/', $VAR['htaccess_dir_path']);

			# add the final trailing slash if missing
			if ( !ereg ('[/]$', $VAR['htaccess_dir_path'] ) )
			$VAR['htaccess_dir_path'] = $VAR['htaccess_dir_path'] . '/';
		}


		if( isset ( $VAR['htaccess_dir_path'] ) && $VAR['htaccess_dir_path'] != '' )
		{
			################################################################
			### VERIFY LOCAL PATH & WRITABILITY!

			@$filename  = $VAR['htaccess_dir_path']  . '.htaccess';
			@$id        = $VAR['htaccess_dir_htaccess_id'];
			$db         = &DB();
			$sql        = 'SELECT name FROM ' . AGILE_DB_PREFIX . 'htaccess WHERE
						   site_id     = ' . $db->qstr(DEFAULT_SITE) . ' AND
						   id          = ' . $db->qstr($id);
			$result = $db->Execute($sql);
			@$name = $result->fields['name'];

			### Check path
			$path =  $VAR['htaccess_dir_path'];
			if ( is_dir ( $path ) )
			{
				### Check if is writable!
				if ( !is_writable ( $path ) )
				{
					## Path not writable!
					$this->validated = false;
					$this->val_error[] = array(
										'field' 		=> 'none',
										'field_trans' 	=> $C_translate->translate('error', 'core', ""),
										'error' 		=> $C_translate->translate('path_auth', 'htaccess_dir', ""));
				}
			}
			else
			{
				### Path broken!
				$this->validated = false;
				$this->val_error[] = array(
									'field' 		=> 'none',
									'field_trans' 	=> $C_translate->translate('error', 'core', ""),				
									'error' 		=> $C_translate->translate('path_broke', 'htaccess_dir', ""));
			}
		}



		####################################################################
		### If validation was failed, skip the db insert &
		### set the errors & origonal fields as Smarty objects,
		### and change the page to be loaded.
		####################################################################

		if(!$this->validated)
		{
			global $smarty;	

			# set the errors as a Smarty Object
			$smarty->assign('form_validation', $this->val_error);	

			# set the page to be loaded
			if(!defined("FORCE_PAGE"))
			{
				define('FORCE_PAGE', $VAR['_page_current']);
			}                				
			return;
		}


		####################################################################
		### Create the record/verify fields

		$type 	= "add";
		$this->method["$type"] = split(",", $this->method["$type"]);    		
		$db 	= new CORE_database;
		$dir_id = $db->add($VAR, $this, $type);

		####################################################################
		### Create the .htaccess file

		if( isset ( $dir_id )  &&  $dir_id > 0 )
		{
			### GENERATE THE EXCLUDE LIST
			$exclude_list = $this->exclude_list();

			### GENERATE THE .HTACCESS FILE
			$nl   = "\n";
			$data = $this->htaccess_extra . 'RewriteEngine on'                          . $nl;
			if(empty($VAR['htaccess_dir_recursive']))
			$data .= 'RewriteRule   ^(.*)/.*$      -                  [L]' . $nl;
			$data .= 'RewriteRule ' . $exclude_list . '$ htaccess_index.php?_HTACCESS_ID='.$id.'&_HTACCESS_DIR_ID='.$dir_id;

			### Update the db record
			$db   = &DB();
			$sql  = "UPDATE ".AGILE_DB_PREFIX."htaccess_dir SET
				   htaccess = " . $db->qstr( $data ) . " WHERE
				   id       = " . $db->qstr( $dir_id ) . " AND
				   site_id  = " . $db->qstr( DEFAULT_SITE );
			$result = $db->Execute($sql);

			### WRITE THE LOCAL .HTACCESS FILE
			$fp = fopen($filename, "w+");
			fwrite($fp,$data);
			fclose($fp);

			### WRITE THE htaccess_index.php FILE
			$php_filename = $VAR['htaccess_dir_path'] . 'htaccess_index.php';
			$data = $this->create_php();
			$fp = fopen($php_filename, "w+");
			fwrite($fp,$data);
			fclose($fp);
		}
	}





	##############################
	##		UPDATE		        ##
	##############################
	function update($VAR)
	{
		global $C_translate, $C_debug;
		$this->validated = true;

		### Change the path...
		if ( isset ( $VAR['htaccess_dir_path'] ) && $VAR['htaccess_dir_path'] != '' )
		{
			# trim whitspaces
			$VAR['htaccess_dir_path'] = trim ( $VAR['htaccess_dir_path'] );

			# replace all forward slashes with back slashes
			$VAR['htaccess_dir_path'] = ereg_replace('\\\\', '/', $VAR['htaccess_dir_path']);

			# add the final trailing slash if missing
			if ( !ereg ('[/]$', $VAR['htaccess_dir_path'] ) )
			$VAR['htaccess_dir_path'] = $VAR['htaccess_dir_path'] . '/';
		}

		### Change the .htaccess data
		if( isset ( $VAR['htaccess_dir_path'] ) && $VAR['htaccess_dir_path'] != '' )
		{

			################################################################
			### VERIFY LOCAL PATH & WRITABILITY!

			@$filename  	= $VAR['htaccess_dir_path'] . '.htaccess';
			@$php_filename 	= $VAR['htaccess_dir_path'] . 'htaccess_index.php';
			@$id        	= $VAR['htaccess_dir_htaccess_id'];
			$db         	= &DB();
			$sql        	= 'SELECT name FROM ' . AGILE_DB_PREFIX . 'htaccess WHERE
							site_id     = ' . $db->qstr(DEFAULT_SITE) . ' AND
							id          = ' . $db->qstr($id);
			$result = $db->Execute($sql);
			@$name = $result->fields['name'];


			### Check path
			$path =  $VAR['htaccess_dir_path'];
			if ( is_dir ( $path ) )
			{
				### Check if is writable!
				if ( is_writable ( $path ) )
				{
					### GENERATE THE EXCLUDE LIST
					$exclude_list = $this->exclude_list();
					$nl   = "\n";

					/*
					$data = $this->htaccess_extra .
							'RewriteEngine on'                          . $nl .
							'RewriteRule   ^(.*)/.*$      -                  [L]' . $nl .
							'RewriteRule '                              .
							'' . $exclude_list . '$ '           .
							'htaccess_index.php'                              .
							'?_HTACCESS_ID='.$id.'&_HTACCESS_DIR_ID='.$VAR["htaccess_dir_id"];
					*/

					$data = $this->htaccess_extra . 'RewriteEngine on'                          . $nl;
					if(empty($VAR['htaccess_dir_recursive']))
					$data .= 'RewriteRule   ^(.*)/.*$      -                  [L]' . $nl;
					$data .= 'RewriteRule ' . $exclude_list . '$ htaccess_index.php?_HTACCESS_ID='.$id.'&_HTACCESS_DIR_ID='.$VAR["htaccess_dir_id"];


					### Set the .htaccess var for the db
					$VAR['htaccess_dir_htaccess'] = $data;
				}
				else
				{
					## Path not writable!
					$this->validated = false;
					$this->val_error[] = array(
										'field' 		=> 'none',
										'field_trans' 	=> $C_translate->translate('error', 'core', ""),
										'error' 		=> $C_translate->translate('path_auth', 'htaccess_dir', ""));
				}
			}
			else
			{
				### Path broken!
				$this->validated = false;
				$this->val_error[] = array(
									'field' 		=> 'none',
									'field_trans' 	=> $C_translate->translate('error', 'core', ""),				
									'error' 		=> $C_translate->translate('path_broke', 'htaccess_dir', ""));
			}
		}

		####################################################################
		### If validation was failed, skip the db insert &
		### set the errors & origonal fields as Smarty objects,
		### and change the page to be loaded.
		####################################################################

		if(!$this->validated)
		{
			global $smarty;	

			# set the errors as a Smarty Object
			$smarty->assign('form_validation', $this->val_error);	

			# set the page to be loaded
			if(!defined("FORCE_PAGE"))
			{
				define('FORCE_PAGE', $VAR['_page']);
			}
			return;
		}

		### Update the db record
		$type = "update";
		$this->method["$type"] = split(",", $this->method["$type"]);
		$db = new CORE_database;
		$dir = $db->update($VAR, $this, $type);

		if($dir != false)
		{
			### UPDATE THE LOCAL .HTACCESS FILE
			$fp = fopen($filename, "w+");
			fwrite($fp,$data);
			fclose($fp);

			### UPDATE THE LOCAL htaccess_index.php
			$data = $this->create_php();
			$fp = fopen($php_filename, "w+");
			fwrite($fp,$data);
			fclose($fp);
		}
	}

	##############################
	##		 DELETE	            ##
	##############################
	function delete($VAR)
	{	
		### Get the array
		if(isset($VAR["delete_id"]))
		$id = split(',', $VAR["delete_id"]);
		elseif (isset($VAR["id"]))
		$id = split(',', $VAR["id"]);

		### Loop:
		for($i=0; $i<count($id); $i++)
		{
			### Delete the protection
			$this->delete_one($id[$i]);
		}
	}

	##############################
	##		 DELETE	ONE         ##
	##############################
	function delete_one($id)
	{	
		global $C_debug, $C_translate;

		if ($id == '') return false;

		### Get the details of this directory record
		$db  = &DB();
		$sql = "SELECT * FROM ".AGILE_DB_PREFIX."htaccess_dir WHERE
				site_id = ".$db->qstr(DEFAULT_SITE)." AND
				id      = ".$db->qstr($id);
		$result = $db->Execute($sql);
		$type = $result->fields['type'];
		$path = $result->fields['path'];

		if( $result != false )
		{    	
			### DELETE THE LOCAL .HTACCESS FILE
			$filename = $result->fields['path'] . '.htaccess';
			if ( @unlink ($filename) === false)
			{
				$C_translate->value['htaccess_dir']['dir'] = $result->fields['path'] . '.htaccess';
				$C_debug->alert($C_translate->translate('remove_fail','htaccess_dir',''));
			}

			### DELETE THE LOCAL HTACCESS_ATILE.PHP FILE
			$filename = $result->fields['path'] . 'htaccess_index.php';
			@unlink ($filename);
		}

		### Delete the Record:
		$db = &DB();
		$sql = "DELETE FROM ".AGILE_DB_PREFIX."htaccess_dir WHERE
				site_id = ".$db->qstr(DEFAULT_SITE)." AND
				id      = ".$db->qstr($id);
		$resulta = $db->Execute($sql);

		### Success message
		$C_translate->value['htaccess_dir']['dira'] = $path;
		$C_debug->alert($C_translate->translate('remove_success','htaccess_dir',''));               		

		return true;
	}

	##############################
	##		VIEW			    ##
	##############################
	function view($VAR)
	{	
		$type = "view";
		$this->method["$type"] = split(",", $this->method["$type"]);
		$db = new CORE_database;
		 $db->view($VAR, $this, $type);
	}		

	##############################
	##		    SEARCH		    ##
	##############################
	function search($VAR)
	{	
		$type = "search";
		$this->method["$type"] = split(",", $this->method["$type"]);
		$db = new CORE_database;
		 $db->search($VAR, $this, $type);
	}

	##############################
	##		SEARCH SHOW	        ##
	##############################

	function search_show($VAR)
	{	
		$type = "search";
		$this->method["$type"] = split(",", $this->method["$type"]);
		$db = new CORE_database;
		 $db->search_show($VAR, $this, $type);
	}	

	function exclude_list()
	{
		global $VAR;

		$list   = '';
		@$Arr    = $VAR['htaccess_dir_exclude'];
		if ( count($Arr) == 0) return '';

		$db     = &DB();
		$sql    = 'SELECT * FROM ' . AGILE_DB_PREFIX . 'htaccess_exclude WHERE
				   site_id     = ' . $db->qstr(DEFAULT_SITE);
		$result = $db->Execute($sql);
		if($result->RecordCount() == 0) return '';
		while(!$result->EOF)
		{
			$id = $result->fields['id'];
			$ext= $result->fields['extension'];

			### GENERATE THE EXCLUDE LIST
			for ($i=0; $i<count($Arr); $i++)
			{
				if ($id == $Arr[$i])
				{
					if ( $list == '')
					$list = $ext;
					else
					$list.= '|'.$ext;
				}
			}        	
			$result->MoveNext();
		}

		if ($list != '') $list = '!(\.+' . $list . ')';
		return $list;    	
	}



	function create_php()
	{
		$data = '<?php
define ( "INDEX_FILE",  "index.html" );
require_once ("' . PATH_AGILE . 'htaccess_index.php"); ?>';
		return $data;
	}                	
}
?>