<?php 
/*******************************************************************************
 * Copyright (c) 2007-2013 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Denis Roy (Eclipse Foundation)- initial implementation
 *******************************************************************************/
 
 
    #*****************************************************************************
    #
    # redirector.php
    #
    # Author:       Denis Roy
    # Date:         2007-09-07
    #
    # Description:  redirector for campaign URL tracking
    #
    #
    #*****************************************************************************

	function showErrorPage() {
		require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
		require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
		$App 	= new App();	$Nav	= new Nav();	$Menu 	= new Menu();		
		
		$html = '<div id="maincontent">
				<div id="midcolumn">
					<h1>Expired Link</h1>
			<p> There was an error processing this link.  It is likely you are following an old link to an expired campaign activity.  For example,
			you may have clicked on a link to a survey that is now closed or to a special offer that is no longer applicable.  If you believe 
			this link should work, please contact the source of the link.  While you are here, please browse some of our website by 
			clicking on the appropriate tab at the top of the page.
			</p>  
			
			<hr class="clearer" />
			</div>
		</div>';
		$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
	}




	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
	require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_rw.class.php";
	$App 	= new App();
	
	  # get the incoming parameters 
	  # and Making sure the $_TAG is always uppercase
    $_TAG = strtoupper($App->getHTTPParameter("tag", "GET"));

	if(strlen($_TAG) < 1) {
    	# error
    	# header("Location: /");
    	showErrorPage();
    }
    
    
    $x = stripos($_TAG, '@'); 
    if ( $x !== FALSE) {
    	$_SUBTAG = substr($_TAG, $x + 1);
    	$_TAG = substr($_TAG, 0, $x);
    	}
     
    # echo 'SUBTAG:' . $_SUBTAG . ' TAG:' . $_TAG . '<br>';
    
    # strip potentially bad characters from file
    if ($_SUBTAG != "") $_SUBTAG = preg_replace('/["\'?%$#@!;*&]/i', '', $_SUBTAG);
	$_TAG = preg_replace('/["\'?%$#@!;*&]/i', '', $_TAG);



	

	# Connect to databases
	$dbc_RW 	= new DBConnectionRW();
	$dbh_RW		= $dbc_RW->connect();


	$SQL = "SELECT TargetUrl FROM Campaigns WHERE CampaignKey = " . $App->returnQuotedString($_TAG) . " AND DateExpires > CURDATE()";
	$rs 	= mysql_query($SQL, $dbh_RW);
	
	if($myrow = mysql_fetch_assoc($rs)) {
		# redirect the browser now
		if($_SUBTAG != "") {
			header("Location: " . $myrow['TargetUrl'] . "?" . $_SUBTAG);
		}
		else {
			header("Location: " . $myrow['TargetUrl']);
		}
		
		# track the click
		# Do a reverse lookup on the client IP
		$client_hostname = @gethostbyaddr($_SERVER['REMOTE_ADDR']) ;
		$SQL = "INSERT /* /go/redirector.php */ INTO CampaignClicks (
					ClickID,
  					CampaignKey,
  					SubKey,
  					HostName,
  					TimeClicked) VALUES (
  					NULL,
  					" . $App->returnQuotedString($_TAG) . ",
  					" . $App->returnQuotedString($_SUBTAG) . ",
  					" . $App->returnQuotedString($client_hostname) . ",
  					NOW())";
		
		mysql_query($SQL, $dbh_RW);
	}
	else {
		# error finding Campaign
		#header("Location: /");
		showErrorPage();
	}
	
	$dbc_RW->disconnect();  # disconnects all pending DB connections
	$rs 	= null;
	$dbh_RW	= null;
	$dbc_RW = null;

?>