Skip to content
Snippets Groups Projects
pastebin.php 7.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    /**
     * Notes :
     *	% Need to either a) install Text_Highlighter as a PEAR module properly or b) alter it so
     *	  that it can be included properly without having a Text/ directory at the same level
     *        as the index file.
     *      % Needs some form of cron job or similar to remove old entries
     *		* This would seem preferable to running a delete query every page view
     *		* The retain_until field is there and set by the script so 
     *		  the framework is there for removal.
     *		* Rather than using a cron job this could be done using a simple timestamp stored in a php
     *		  file which could be included (ie $timestamp = X, then include that and 
     *		  if($timestamp >= now()) { delete query }
     *	% Preventing XSS in User input needed
     *		* Should be handled by any User Auth
     *	% Needs Checking for Aeternus-Brand Stupidity
     * Fixed :
     *	% Problem with strtotime() not parsing PostGres timestamps
     		* set field type to timestamp(0) to remove fractional seconds
     *	% Added User Authentication using pwauth
     *		* Could still do with session handling
     *	% Frosty mentioned it wasn't using a monospace font
     *		* Simply made all text within the .hl-main block use the 
     * 		  Courier New Monospace font
     *		* Could possibly offer the user more customisation in terms of 
     * 		  how they want things displayed (necessary??)
     */
    
    
    // Debugging
    error_reporting(E_ALL);
    
    // Config
    define('_LIST_LIMIT', 15);
    // Defined so we can customise them to whatever we like
    define('_BASE_PATH', 'https://'.$_SERVER['SERVER_NAME'].'/');
    define('_SCRIPT_NAME', 'PasteBin/');
    define('_TABLE_NAME', 'pastebin');
    
    $smarty->assign('urifragment', '/Tools/PasteBin/');
    $smarty->assign('uri', 'http://'.$_SERVER['SERVER_NAME'].'/pb/');
    
    // Init
    $id = '';
    if (is_numeric($pathlist[count($pathlist) - 1])) {
    	//$id = substr($_SERVER['PATH_INFO'],1);
    	//$id = preg_match('/[0-9]+/', $id)?$id:'';
    	$i = count($pathlist)-1;
    	$id = $pathlist[$i];
    	$id = preg_match('/[0-9]+/', $id)?$id:'';
    } else if (is_numeric($pathlist[count($pathlist) - 2]) && (strtolower($pathlist[count($pathlist) - 1]) == 'plain') ) {
    	// Plain text
    	$no_template = true;
    	$id = $pathlist[count($pathlist) - 2];
    	$id = preg_match('/[0-9]+/', $id)?$id:'';
    	$code = $DB->GetOne('SELECT code FROM ' . _TABLE_NAME . ' WHERE  id = ?', array($id));
    	header('Content-Type: text/plain');
    	print html_entity_decode($code, ENT_QUOTES,'UTF-8');
    	return; // Finish processing in this file
    }
    $code = '';
    $pblang = '';
    
    // Includes
    require_once 'PEAR.php';
    require_once 'Text/Highlighter.php';
    require_once 'Text/Highlighter/Renderer.php';
    require_once 'Text/Highlighter/Renderer/Html.php';
    require_once '../lib/ArrayRenderer.php';
    
    PEAR::setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING);
    
    // Grabbed from blog.lib.php
    // Returns a textual diff between two time stamps
    function timeDiff($first, $second=0)
    {
    	if($second == 0) {
    		$second = time();
    	}
    
    	$diff = max($first, $second) - min($first, $second);
    
    	if($diff>604800) {
    		$ret = round($diff/604800);
    		return $ret.(($ret>1)? _(" weeks") : _(" week"));
    	}
    	elseif($diff>86400) {
    		$ret = round($diff/86400);
    		return $ret.(($ret>1)? _(" days") : _(" day"));
    	}
    	elseif($diff>3600) {
    		$ret = round($diff/3600);
    		return $ret.(($ret>1)? _(" hours") : _(" hour"));
    	}
    	elseif($diff>60) {
    		$ret = round($diff/60);
    		return $ret.(($ret>1)? _(" minutes") : _(" minute"));
    	}
    	elseif($diff>0) {
    		return $diff.(($diff>1)? _(" seconds") : _(" second"));
    	}
    	else {
    		return "no time";
    	}
    }
    
    // Languages
    $LANGUAGES = array (
    	'PHP' => 'PHP',
    	'CPP' => 'C/C++',
    	'DIFF' => 'Diff',
    	'DTD' => 'DTD',
    	'HTML' => 'HTML',
    	'JAVA' => 'Java',
    	'JAVASCRIPT' => 'Javascript',
    	'MYSQL' => 'MySQL',
    	'PERL' => 'Perl',
    	'PHP' => 'PHP',
    	'PYTHON' => 'Python',
    	'RUBY' => 'Ruby',
    	'SQL' => 'SQL',
    	'XML' => 'XML'
    );
    
    // Remove Old Pastebin Entries
    // possibly some error handling needed?
    $DB->Execute('DELETE FROM ' . _TABLE_NAME . ' WHERE retain_til < now()');
    
    // Needed here?
    //removeMagicQuotes($_POST);
    
    if (isset($_POST['code'])) {
    	$code = htmlentities($_POST['code'], ENT_QUOTES,'UTF-8');
    	if ( isset($_POST['language']) && isset($_POST['retain'])) {
    		// Add
    		$pblang = strtoupper($_POST['language']);
    		if (!isset($LANGUAGES[ $pblang ])) {
     			$pblang = 'NONE';
     		}
            
    	
    		switch($_POST['retain'][0]) {
    			case 'month' :
    				$retain = 2592000;
    				$retainTil = date('Y/m/d H:i:s', time() + $retain);break;
    			case 'week' :
    				$retain = 604800; 
    				$retainTil = date('Y/m/d H:i:s', time() + $retain);break;
    			case 'forever' :
    				$retain = null;
    				$retainTil = null;break;
    			case 'day' :
    			default :
    				$retain = 86400;
    				$retainTil = date('Y/m/d H:i:s', time() + $retain);
    		}
    		
    		if (trim($code) == '') {
    			trigger_error('No Code Given', E_USER_NOTICE);
    		} else if (!$session->loggedin) {
    			trigger_error('You must be logged in to use this service.', E_USER_NOTICE);
    		} else {
    			// Additional user validation needed here
    			//$retainTil = date('Y/m/d H:i:s', time() + $retain);
    			$DB->Execute(
    				'INSERT INTO ' . _TABLE_NAME . ' ( code, username, retain_til, language) ' .
    				'VALUES (?, ?, ?, ?)', 
    				array( $code, $session->username, $retainTil, $pblang));
    			//$id = $DB->Insert_ID();
    			$id = $DB->GetOne('SELECT id FROM ' . _TABLE_NAME . ' WHERE code = ? AND username = ? AND retain_til = ?', array($code,$session->username,$retainTil));
    			$userInfo = 'Created By ' . $session->username . ' at ' . date('Y/m/d H:i');
    			$smarty->assign('id', $id);
    			$smarty->assign('userInfo', $userInfo);
    			$smarty->assign('code', $code);
    			
    		}
    	}
    }
    
    // List All Entries in order.
    $pasteList = $DB->GetAll( 
    	'SELECT id, username AS name, created AS time_diff FROM ' . _TABLE_NAME . ' ORDER BY created DESC LIMIT ' . _LIST_LIMIT );
    for($i=0;$i< count($pasteList);$i++) {
    	$pasteList[$i]['time_diff'] = timeDiff(strtotime($pasteList[$i]['time_diff']));
    }
    $smarty->assign('pasteList', $pasteList);
    
    // Check for either display or form input
    if (!empty($id) || !empty($code)) {
    	// Form	
    	if (empty($code)) {
    		$result = $DB->GetRow('SELECT * FROM ' . _TABLE_NAME . ' WHERE  id = ?', array($id));
    		//$query = db_query('SELECT * FROM ' . _TABLE_NAME . ' WHERE id = \'' . $id . '\'');
    		if (!empty($result) ) {
    			//$result = db_getrow($query);
    			$code = $result['code'];
    			$userInfo = 'Created By ' . $result['username'] . ' at ' . date('Y/m/d H:i', strtotime($result['created']));
    			$pblang = $result['language'];
    			// Smarty
    			$smarty->assign('id', $id);
    			$smarty->assign('code', $code);
    			$smarty->assign('userInfo', $userInfo);
    			
    		} else {
    			// Error
    			trigger_error('Error - Code Piece not found for id - ' . $id,  E_USER_WARNING);
    		}
    	}
    	// Check there hasn't been an error
    	// Code should have been set in the if statement above, this can not become
    	// an else
    	if (!empty($code)) {
    		// Highlight the code
    		$renderer = new Text_Highlighter_Renderer_Array();
    		$hl = &Text_Highlighter::factory($pblang);
    		$hl->setRenderer($renderer);
    		// Have to decode again here for the highlighting
    		// It might be a little better if we kept the unencoded version from above
    		$highlightedCode = $hl->highlight(html_entity_decode($code, ENT_QUOTES,'UTF-8'));
    		$smarty->assign('highlightedCode', $highlightedCode);
    		
    	}
    }
    // Sort Out Languages
    if(!empty($pblang) && $pblang != 'NONE') {
    	$smarty->assign('selectedLanguage', array('key' => $pblang, 'lang' => $LANGUAGES[$pblang]));
    	unset($LANGUAGES[$pblang]);
    }
    $smarty->assign('pasteLanguages', $LANGUAGES);
    
    // Load templates etc
    $smarty->assign("extra_styles", array("$baseurl/css/pastebin.css"));
    $result = $smarty->fetch('pastebin.tpl');
    $sidebar = $smarty->fetch('pastebin-sidebar.tpl');
    $smarty->assign('title', 'PasteBin');
    $smarty->assign('body', $result);
    $smarty->assign('secondary',$sidebar);
    ?>