mirror of
				https://github.com/gtbu/Typesetter-5.3-p8.git
				synced 2025-11-04 14:58:28 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			2016 lines
		
	
	
	
		
			47 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			2016 lines
		
	
	
	
		
			47 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
defined('is_running') or die('Not an entry point...');
 | 
						|
 | 
						|
/*
 | 
						|
 | 
						|
 | 
						|
 | 
						|
bool symlink ( string $target , string $link )
 | 
						|
symlink() creates a symbolic link to the existing target with the specified name link .
 | 
						|
 | 
						|
 | 
						|
A Script Like this would most likely need to work with install.php to set up the data directories
 | 
						|
	Using the Install_DataFiles_New() function
 | 
						|
		- $_POST['username']
 | 
						|
		- $_POST['password']
 | 
						|
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
$langmessage['not root install'] = 'Notice: This is not the root installation of gpEasy.';
 | 
						|
$langmessage['site url'] = 'Site URL';
 | 
						|
$langmessage['easily add installations'] = 'This addon will allow you to easily add installations of gpEasy to your server.';
 | 
						|
$langmessage['multi_site_notes'] = ' This will not copy gpEasy code to new folders.';
 | 
						|
$langmessage['multi_site_notes'] .= ' Rather, new installations will use the code running the current gpEasy installation.';
 | 
						|
$langmessage['multi_site_notes'] .= ' This is more efficient and will enable you to update all of your gpEasy installations at once by updating the root installation.';
 | 
						|
$langmessage['new_installation'] = 'Create a New Installation';
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class SetupSite{
 | 
						|
 | 
						|
	public $siteData = array();
 | 
						|
	public $dataFile;
 | 
						|
	public $checksum;
 | 
						|
	public $site_uniq_id;
 | 
						|
 | 
						|
	public function __construct(){
 | 
						|
		global $dataDir, $page, $addonFolderName,$langmessage;
 | 
						|
 | 
						|
		if( defined('multi_site_unique') ){
 | 
						|
			msg($langmessage['not root install']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		gpPlugin::css('multi_site.scss',false);
 | 
						|
 | 
						|
		//$page->css_user[] = '/data/_addoncode/'.$addonFolderName.'/multi_site.css';
 | 
						|
		//$page->head_js[] = '/data/_addoncode/'.$addonFolderName.'/multi_site.js';
 | 
						|
		$page->head_js[] = '/include/js/admin_users.js';
 | 
						|
 | 
						|
 | 
						|
		$page->admin_links[] = array('Admin_Site_Setup','Multi-Site Home');
 | 
						|
		$page->admin_links[] = array('Admin_Site_Setup','New Installation','cmd=new');
 | 
						|
		$page->admin_links[] = array('Admin_Site_Setup','Settings','cmd=settings');
 | 
						|
		$page->admin_links[] = array('Admin_Site_Setup','About','cmd=about');
 | 
						|
 | 
						|
		$_REQUEST += array('install'=>array());
 | 
						|
 | 
						|
 | 
						|
		//ftp setup
 | 
						|
		$this->GetSiteData();
 | 
						|
 | 
						|
 | 
						|
		$hide = false;
 | 
						|
		$cmd = \gp\tool::GetCommand();
 | 
						|
		switch($cmd){
 | 
						|
 | 
						|
			case 'about':
 | 
						|
				$this->About(true);
 | 
						|
				$hide = true;
 | 
						|
			break;
 | 
						|
 | 
						|
			case 'installed':
 | 
						|
				$this->ShowSites();
 | 
						|
				$hide = true;
 | 
						|
			break;
 | 
						|
 | 
						|
			/* settings */
 | 
						|
			case 'settings':
 | 
						|
				$this->SettingsForm($this->siteData);
 | 
						|
				$hide = true;
 | 
						|
			break;
 | 
						|
			case 'Save Settings':
 | 
						|
				if( !$this->SaveSettings() ){
 | 
						|
					$this->SettingsForm($_POST);
 | 
						|
					$hide = true;
 | 
						|
				}
 | 
						|
			break;
 | 
						|
 | 
						|
 | 
						|
			case 'save_options':
 | 
						|
			case 'options':
 | 
						|
				$this->Options($cmd);
 | 
						|
				$hide = true;
 | 
						|
			break;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
			case 'uninstall':
 | 
						|
				$this->UninstallSite();
 | 
						|
			break;
 | 
						|
 | 
						|
 | 
						|
			/*
 | 
						|
			 * New Installation
 | 
						|
			 */
 | 
						|
 | 
						|
			case 'new';
 | 
						|
			case 'Install Now':
 | 
						|
			case 'new_plugins':
 | 
						|
			case 'new_install':
 | 
						|
			case 'new_destination':
 | 
						|
			case 'new_themes':
 | 
						|
			case 'Continue':
 | 
						|
				$this->InstallStatus($cmd);
 | 
						|
				$hide = true;
 | 
						|
			break;
 | 
						|
 | 
						|
 | 
						|
			case 'subfolder':
 | 
						|
				$this->SubFolder();
 | 
						|
				$this->InstallStatus($cmd);
 | 
						|
				$hide = true;
 | 
						|
			break;
 | 
						|
 | 
						|
			case 'expandfolder':
 | 
						|
				$this->ExpandFolder();
 | 
						|
				$hide = true;
 | 
						|
			return;
 | 
						|
			case 'newfolder':
 | 
						|
				$this->NewFolder();
 | 
						|
				$hide = true;
 | 
						|
			break;
 | 
						|
 | 
						|
 | 
						|
			case 'Delete Folder':
 | 
						|
				$hide = true;
 | 
						|
				$this->RemoveDir();
 | 
						|
			break;
 | 
						|
 | 
						|
			case 'rmdir':
 | 
						|
				$hide = true;
 | 
						|
				$this->RemoveDirPrompt();
 | 
						|
			break;
 | 
						|
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		if( !$hide ){
 | 
						|
			$this->FrontPage();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function Options($cmd = ''){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		$site =& $_REQUEST['site'];
 | 
						|
		if( !isset($this->siteData['sites'][$site]) ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		switch($cmd){
 | 
						|
			case 'save_options';
 | 
						|
				$this->Options_Save($site);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
 | 
						|
		$args = $_POST + $this->siteData['sites'][$site] + array('url'=>'http://');
 | 
						|
 | 
						|
		echo '<div id="install_step">';
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="post">';
 | 
						|
		echo '<table width="100%">';
 | 
						|
 | 
						|
		echo '<tr><th colspan="2">';
 | 
						|
		echo $langmessage['options'];
 | 
						|
		echo ': '.$site;
 | 
						|
		echo '</th></tr>';
 | 
						|
 | 
						|
		echo '<tr><td class="label">';
 | 
						|
		echo $langmessage['site url'];
 | 
						|
		echo '</td><td>';
 | 
						|
		echo '<input type="text" name="url" value="'.htmlspecialchars($args['url']).'" />';
 | 
						|
		echo '</td></tr>';
 | 
						|
 | 
						|
		echo '<tr><td class="label">';
 | 
						|
		echo $langmessage['hide_index'];
 | 
						|
		echo '</td><td>';
 | 
						|
 | 
						|
		if( \gp\tool\RemoteGet::Test() ){
 | 
						|
			if( isset($args['hide_index']) ){
 | 
						|
				echo '<input type="checkbox" name="hide_index" value="hide_index" checked="checked"/>';
 | 
						|
			}else{
 | 
						|
				echo '<input type="checkbox" name="hide_index" value="hide_index"/>';
 | 
						|
			}
 | 
						|
		}else{
 | 
						|
			echo 'Unavailable: Your php installation doesn\'t support the necessary functions to enable this option.';
 | 
						|
		}
 | 
						|
 | 
						|
		echo '</td>';
 | 
						|
		echo '</tr>';
 | 
						|
 | 
						|
		echo '</table>';
 | 
						|
 | 
						|
		echo '<div id="install_continue">';
 | 
						|
		echo '<input type="hidden" name="site" value="'.htmlspecialchars($site).'" />';
 | 
						|
		echo '<input type="hidden" name="cmd" value="save_options" />';
 | 
						|
		echo '<input type="submit" name="" value="'.$langmessage['save_changes'].'" class="continue"/>';
 | 
						|
		echo ' <input type="submit" name="cmd" value="Cancel" />';
 | 
						|
		echo '</div>';
 | 
						|
 | 
						|
		echo '<p>';
 | 
						|
 		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['back']);
 | 
						|
 		echo '</p>';
 | 
						|
 | 
						|
		echo '</form>';
 | 
						|
		echo '</div>';
 | 
						|
	}
 | 
						|
 | 
						|
	public function Options_Save($site){
 | 
						|
		global $langmessage;
 | 
						|
		$save = $this->Options_SiteUrl($site);
 | 
						|
		$save = $save && $this->Options_htaccess($site);
 | 
						|
 | 
						|
		if( $save ){
 | 
						|
			$this->SaveSiteData();
 | 
						|
			msg($langmessage['SAVED']);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public function Options_htaccess($site){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		if( !\gp\tool\RemoteGet::Test() ){
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$site_info = $this->siteData['sites'][$site];
 | 
						|
		$site_url = $site_info['url'];
 | 
						|
		$site_uniq = false;
 | 
						|
		if( isset($site_info['gpuniq']) ){
 | 
						|
			$site_uniq = $site_info['gpuniq'];
 | 
						|
		}
 | 
						|
		$file_path = $site.'/.htaccess';
 | 
						|
		if( file_exists($file_path) ){
 | 
						|
			$original_contents = $contents = file_get_contents($file_path);
 | 
						|
		}
 | 
						|
 | 
						|
		if( !isset($_POST['hide_index']) ){
 | 
						|
			$to_hide_index = false;
 | 
						|
			unset($this->siteData['sites'][$site]['hide_index']);
 | 
						|
			$prefix = '';
 | 
						|
 | 
						|
		}else{
 | 
						|
 | 
						|
			if( empty($site_url) ){
 | 
						|
				msg('A valid site url is required to hide index.php');
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
 | 
						|
			$array = @parse_url($site_url);
 | 
						|
			$prefix =& $array['path'];
 | 
						|
			$to_hide_index = $this->siteData['sites'][$site]['hide_index'] = true;
 | 
						|
		}
 | 
						|
 | 
						|
		//add the gpeasy rules
 | 
						|
		\gp\admin\Settings\Permalinks::StripRules($contents);
 | 
						|
		$contents .= \gp\admin\Settings\Permalinks::Rewrite_Rules($to_hide_index,$prefix);
 | 
						|
		if( !\gp\tool\Files::Save($file_path,$contents) ){
 | 
						|
			msg($langmessage['OOPS'].' (Couldn\'t save .htaccess)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		//check for valid response when hiding index.php
 | 
						|
		if( $to_hide_index ){
 | 
						|
			$check_url = $site_url.'/Special_Site_Map';
 | 
						|
			$result = \gp\tool\RemoteGet::Get_Successful($check_url);
 | 
						|
			if( !$result ){
 | 
						|
				msg('Did not recieve valid response when fetching url without index.php: '.htmlspecialchars($check_url));
 | 
						|
				\gp\tool\Files::Save($file_path,$original_contents);
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	public function Options_SiteUrl($site){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		if( empty($_POST['url']) ){
 | 
						|
			unset($this->siteData['sites'][$site]['url']);
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
		$site_url = $_POST['url'];
 | 
						|
 | 
						|
		//remove index.php
 | 
						|
		$pos = strpos($site_url,'/index.php');
 | 
						|
		if( $pos ){
 | 
						|
			$site_url = substr($site_url,0,$pos);
 | 
						|
		}
 | 
						|
 | 
						|
		if( $site_url == 'http://' ){
 | 
						|
			msg($langmessage['OOPS'].' (Invalid URL)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$array = @parse_url($site_url);
 | 
						|
		if( $array === false ){
 | 
						|
			msg($langmessage['OOPS'].' Invalid URL');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if( empty($array['scheme']) ){
 | 
						|
			$site_url = 'http://'.$site_url;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->siteData['sites'][$site]['url'] = rtrim($site_url,'/');
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	public function FrontPage(){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		$this->Heading();
 | 
						|
 | 
						|
		echo '<hr/>';
 | 
						|
		echo '<div class="lead">';
 | 
						|
		echo 'Add multiple installations of gpEasy to your server.';
 | 
						|
		echo '</div>';
 | 
						|
		echo '<hr/>';
 | 
						|
 | 
						|
		echo '<div id="ms_links">';
 | 
						|
		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['new_installation'],'cmd=new');
 | 
						|
		echo '     ';
 | 
						|
		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['Settings'],'cmd=settings');
 | 
						|
		echo '     ';
 | 
						|
		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['about'],'cmd=about');
 | 
						|
		echo '</div>';
 | 
						|
 | 
						|
		$this->ShowSimple();
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * About this plugin
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function About($full){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		$this->Heading($langmessage['about']);
 | 
						|
 | 
						|
		echo '<hr/>';
 | 
						|
		echo '<p class="lead">';
 | 
						|
		echo $langmessage['easily add installations'];
 | 
						|
		echo $langmessage['multi_site_notes'];
 | 
						|
		echo '</p>';
 | 
						|
 | 
						|
		echo '<br/>';
 | 
						|
 | 
						|
		echo '<h2>';
 | 
						|
		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['Settings'],'cmd=settings');
 | 
						|
		echo '</h3>';
 | 
						|
 | 
						|
		echo '<dl class="lead">';
 | 
						|
		echo '<dt>Service Provider ID</dt>';
 | 
						|
		echo '<dd>When your provider id is entered, <a href="http://www.gpeasy.com/Special_Services">gpEasy.com Services</a> can attribute each installation to your service.</dd>';
 | 
						|
		echo '</dl>';
 | 
						|
 | 
						|
		echo '<dl class="lead">';
 | 
						|
		echo '<dt>Service Provider Name</dt>';
 | 
						|
		echo '<dd>Displayed on the site map of your hosted installations.</dd>';
 | 
						|
		echo '</dl>';
 | 
						|
 | 
						|
		echo '<p>';
 | 
						|
 		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['back']);
 | 
						|
 		echo '</p>';
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	public function SaveSettings(){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		$UpdateIndexFiles = false;
 | 
						|
 | 
						|
		//ftp information
 | 
						|
		$ok_to_save = $this->SaveFTPInformation();
 | 
						|
 | 
						|
 | 
						|
		//provider id
 | 
						|
		if( !empty($_POST['service_provider_id']) ){
 | 
						|
			if( is_numeric($_POST['service_provider_id']) ){
 | 
						|
 | 
						|
				//update index.php files
 | 
						|
				if( !isset($this->siteData['service_provider_id']) || ($_POST['service_provider_id'] != $this->siteData['service_provider_id']) ){
 | 
						|
					$UpdateIndexFiles = true;
 | 
						|
				}
 | 
						|
 | 
						|
				$this->siteData['service_provider_id'] = $_POST['service_provider_id'];
 | 
						|
			}else{
 | 
						|
				msg('The Service Provider ID must be a number.');
 | 
						|
				$ok_to_save = false;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		//provider name
 | 
						|
		if( !empty($_POST['service_provider_name']) ){
 | 
						|
 | 
						|
			//update index.php files
 | 
						|
			if( !isset($this->siteData['service_provider_name']) || ($_POST['service_provider_name'] != $this->siteData['service_provider_name']) ){
 | 
						|
				$UpdateIndexFiles = true;
 | 
						|
			}
 | 
						|
 | 
						|
			$this->siteData['service_provider_name'] = $_POST['service_provider_name'];
 | 
						|
		}
 | 
						|
 | 
						|
		if( $UpdateIndexFiles ){
 | 
						|
			$this->UpdateProviderID();
 | 
						|
		}
 | 
						|
 | 
						|
		if( !$ok_to_save ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if( $this->SaveSiteData() ){
 | 
						|
			msg($langmessage['SAVED']);
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
		msg($langmessage['OOPS']);
 | 
						|
		return false;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	public function UpdateProviderID(){
 | 
						|
		foreach($this->siteData['sites'] as $path => $info){
 | 
						|
			if( !isset($info['unique']) ){
 | 
						|
				$info['unique'] = $this->NewId();
 | 
						|
			}
 | 
						|
			$this->CreateIndex($path,$info['unique']);
 | 
						|
		}
 | 
						|
		$this->SaveSiteData();
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function SettingsForm($values=array()){
 | 
						|
		global $langmessage,$config;
 | 
						|
 | 
						|
		$values += array('service_provider_id'=>'','service_provider_name'=>'');
 | 
						|
 | 
						|
		$ftp_vals = $_POST + $config + array('ftp_server'=>\gp\tool\FileSystemFtp::GetFTPServer(),'ftp_user'=>'');
 | 
						|
 | 
						|
		$this->Heading('Settings');
 | 
						|
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="post">';
 | 
						|
		echo '<table class="bordered" width="100%">';
 | 
						|
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<th colspan="2">Service Provider Identification</th>';
 | 
						|
		echo '</tr>';
 | 
						|
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<td colspan="2">';
 | 
						|
		echo 'When your provider id is entered, <a href="http://www.gpeasy.com/Special_Services">gpEasy.com Services</a> can attribute each installation to your service.';
 | 
						|
		echo '</td>';
 | 
						|
		echo '</tr>';
 | 
						|
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<td>';
 | 
						|
		echo 'Service Provider ID';
 | 
						|
		echo '</td>';
 | 
						|
		echo '<td>';
 | 
						|
		echo '<input type="text" name="service_provider_id" value="'.htmlspecialchars($values['service_provider_id']).'" size="30" />';
 | 
						|
		echo '</td>';
 | 
						|
		echo '</tr>';
 | 
						|
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<td>';
 | 
						|
		echo 'Service Provider Name';
 | 
						|
		echo '</td>';
 | 
						|
		echo '<td>';
 | 
						|
		echo '<input type="text" name="service_provider_name" value="'.htmlspecialchars($values['service_provider_name']).'" size="30" />';
 | 
						|
		echo '</td>';
 | 
						|
		echo '</tr>';
 | 
						|
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<td> </td>';
 | 
						|
		echo '<td> </td>';
 | 
						|
		echo '</tr>';
 | 
						|
 | 
						|
 | 
						|
		if( function_exists('ftp_connect') ){
 | 
						|
			echo '<tr><th>FTP</th>';
 | 
						|
			echo '<th> </th>';
 | 
						|
			echo '</tr>';
 | 
						|
 | 
						|
			echo '<tr><td>FTP Server</td>';
 | 
						|
			echo '<td>';
 | 
						|
			echo '<input type="text" name="ftp_server" value="'.$ftp_vals['ftp_server'].'" size="30" />';
 | 
						|
			echo '</td></tr>';
 | 
						|
 | 
						|
			echo '<tr><td>FTP Username</td>';
 | 
						|
			echo '<td>';
 | 
						|
			echo '<input type="text" name="ftp_user" value="'.$ftp_vals['ftp_user'].'" size="30" />';
 | 
						|
			echo '</td></tr>';
 | 
						|
 | 
						|
			echo '<tr><td>FTP Password</td>';
 | 
						|
			echo '<td>';
 | 
						|
			echo '<input type="password" name="ftp_pass" value="" size="30" />';
 | 
						|
			echo '</td></tr>';
 | 
						|
		}
 | 
						|
 | 
						|
		echo '</table>';
 | 
						|
 | 
						|
		echo '<div id="install_continue">';
 | 
						|
		echo '<input type="submit" name="cmd" value="Save Settings" class="continue"/>';
 | 
						|
		echo ' <input type="submit" name="" value="Cancel" />';
 | 
						|
		echo '</div>';
 | 
						|
 | 
						|
 | 
						|
		echo '</form>';
 | 
						|
	}
 | 
						|
 | 
						|
	public function ShowSimple(){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		if( !isset($this->siteData['sites']) || (count($this->siteData['sites']) == 0) ){
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="get">';
 | 
						|
		echo '<table class="bordered" style="width:100%">';
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<th>';
 | 
						|
		echo 'Recent Installations';
 | 
						|
		echo '</th>';
 | 
						|
		echo '<th>';
 | 
						|
		echo 'URL';
 | 
						|
		echo '</th>';
 | 
						|
		echo '<th>';
 | 
						|
		echo $langmessage['options'];
 | 
						|
		echo '</th>';
 | 
						|
		echo '</tr>';
 | 
						|
		$reverse = 	array_reverse($this->siteData['sites']);
 | 
						|
		$i = 0;
 | 
						|
 | 
						|
 | 
						|
		foreach($reverse as $site => $data){
 | 
						|
			$this->ShowRow($site,$data);
 | 
						|
			$i++;
 | 
						|
			if( $i == 5 ){
 | 
						|
				break;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$this->SearchRow();
 | 
						|
		echo '</table>';
 | 
						|
 | 
						|
		if( count($this->siteData['sites']) > 5 ){
 | 
						|
			echo '<p>';
 | 
						|
			echo \gp\tool::Link('Admin_Site_Setup','More Installations','cmd=installed');
 | 
						|
			echo '</p>';
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	public function ShowRow(&$site,&$data){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<td>';
 | 
						|
		if( strlen($site) > 25 ){
 | 
						|
			echo '...'.substr($site,-21);;
 | 
						|
		}else{
 | 
						|
			echo $site;
 | 
						|
		}
 | 
						|
		echo '</td>';
 | 
						|
		echo '<td>';
 | 
						|
		if( !empty($data['url']) ){
 | 
						|
			echo '<a href="'.$data['url'].'" target="_blank">';
 | 
						|
			if( strlen($data['url']) > 40 ){
 | 
						|
				echo substr($data['url'],0,35).'...';
 | 
						|
			}else{
 | 
						|
				echo $data['url'];
 | 
						|
			}
 | 
						|
			echo '</a>';
 | 
						|
		}
 | 
						|
 | 
						|
		echo '</td>';
 | 
						|
		echo '<td>';
 | 
						|
		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['options'],'cmd=options&site='.urlencode($site));
 | 
						|
		echo '   ';
 | 
						|
		//echo \gp\tool::Link('Admin_Site_Setup',$langmessage['uninstall'],'cmd=uninstall&site='.urlencode($site),' data-cmd="gpajax"');
 | 
						|
 | 
						|
		$title = sprintf($langmessage['generic_delete_confirm'],' "'.htmlspecialchars($site).'" ');
 | 
						|
		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['uninstall'],'cmd=uninstall&site='.urlencode($site),array('data-cmd'=>'postlink','class'=>'gpconfirm','title'=>$title));
 | 
						|
 | 
						|
		echo '</td>';
 | 
						|
		echo '</tr>';
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function ShowSites(){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		$limit = 20; //20
 | 
						|
		$offset = 0;
 | 
						|
		if( isset($_GET['offset']) && is_numeric($_GET['offset']) ){
 | 
						|
			$offset = $_GET['offset'];
 | 
						|
		}
 | 
						|
 | 
						|
		if( !isset($this->siteData['sites']) || (count($this->siteData['sites']) == 0) ){
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="get">';
 | 
						|
		echo '<table class="bordered">';
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<th>';
 | 
						|
		echo 'Recent Installations';
 | 
						|
		echo '</th>';
 | 
						|
		echo '<th>';
 | 
						|
		echo 'URL';
 | 
						|
		echo '</th>';
 | 
						|
		echo '<th>';
 | 
						|
		echo ' ';
 | 
						|
		echo '</th>';
 | 
						|
		echo '</tr>';
 | 
						|
 | 
						|
		$this->SearchRow();
 | 
						|
 | 
						|
		$reverse = 	array_reverse($this->siteData['sites']);
 | 
						|
		if( !empty($_GET['q']) ){
 | 
						|
			$reverse = $this->Search($reverse);
 | 
						|
			if( count($reverse) == 0 ){
 | 
						|
				echo '<tr>';
 | 
						|
				echo '<td colspan="2">';
 | 
						|
				echo 'Could not find any installations matching your search criteria.';
 | 
						|
				echo '</td>';
 | 
						|
				echo '</tr>';
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if( $offset > 0 ){
 | 
						|
			$reverse = array_splice($reverse,$offset);
 | 
						|
		}
 | 
						|
 | 
						|
		$i = 0;
 | 
						|
		foreach($reverse as $site => $data){
 | 
						|
			$this->ShowRow($site,$data);
 | 
						|
			$i++;
 | 
						|
			if( $i == $limit ){
 | 
						|
				break;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		echo '</table>';
 | 
						|
		echo '</form>';
 | 
						|
 | 
						|
		//navigation links
 | 
						|
		if( $offset > 0 ){
 | 
						|
			echo \gp\tool::Link('Admin_Site_Setup','Prev','cmd=installed&q='.urlencode($_GET['q']).'&offset='.max(0,$offset-$limit));
 | 
						|
		}else{
 | 
						|
			echo 'Prev';
 | 
						|
		}
 | 
						|
		echo '   ';
 | 
						|
		if( count($reverse) > $limit ){
 | 
						|
			echo \gp\tool::Link('Admin_Site_Setup','Next','cmd=installed&q='.urlencode($_GET['q']).'&offset='.($offset+$limit));
 | 
						|
		}else{
 | 
						|
			echo 'Next';
 | 
						|
		}
 | 
						|
 | 
						|
		echo '<p>';
 | 
						|
 		echo \gp\tool::Link('Admin_Site_Setup',$langmessage['back']);
 | 
						|
 		echo '</p>';
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	public function Search(&$array){
 | 
						|
		$result = array();
 | 
						|
		$key = $_GET['q'];
 | 
						|
		foreach($array as $path => $info){
 | 
						|
 | 
						|
			if( strpos($path,$key) !== false ){
 | 
						|
				$result[$path] = $info;
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return $result;
 | 
						|
	}
 | 
						|
 | 
						|
	public function SearchRow(){
 | 
						|
		$_GET += array('q'=>'');
 | 
						|
 | 
						|
		echo '<tr>';
 | 
						|
			echo '<td colspan="2">';
 | 
						|
			echo '<input type="text" name="q" value="'.htmlspecialchars($_GET['q']).'" />';
 | 
						|
			echo '</td>';
 | 
						|
			echo '<td>';
 | 
						|
			echo '<input type="hidden" name="cmd" value="installed" />';
 | 
						|
			echo '<input type="submit" name="" value="Search" />';
 | 
						|
			echo '</td>';
 | 
						|
			echo '</tr>';
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Remove the files and folders of an installation as determined by the post request
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function UninstallSite(){
 | 
						|
		global $langmessage, $config;
 | 
						|
 | 
						|
		$site =& $_POST['site'];
 | 
						|
		if( empty($site) ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		if( !isset($this->siteData['sites'][$site]) ){
 | 
						|
			msg($langmessage['OOPS'].' (Invalid Site)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if( !$this->RmSite($site) ){
 | 
						|
			msg($langmessage['OOPS'].'(Files not completely removed)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		msg($langmessage['SAVED']);
 | 
						|
 | 
						|
		unset($this->siteData['sites'][$site]);
 | 
						|
		$this->SaveSiteData();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Remove the files and folders of an installation
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function RmSite($site){
 | 
						|
		global $config;
 | 
						|
 | 
						|
		if( !$this->EmptyDir($site) ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->RmDir($site);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Remove a folder that was created by the multi-site manager
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function RmDir($dir){
 | 
						|
		global $config;
 | 
						|
 | 
						|
		if( @rmdir($dir) ){
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		if( empty($config['ftp_server']) ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if( !function_exists('ftp_connect') ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$conn_id = self::FTPConnect();
 | 
						|
		if( !$conn_id ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$ftp_site = \gp\tool\FileSystemFtp::GetFTPRoot($conn_id,$dir);
 | 
						|
		if( $ftp_site === false ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		return ftp_rmdir($conn_id,$ftp_site);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Remove all the contents of a directory
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function EmptyDir($dir){
 | 
						|
 | 
						|
		if( !file_exists($dir) ){
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		if( is_link($dir) ){
 | 
						|
			return unlink($dir);
 | 
						|
		}
 | 
						|
 | 
						|
		$dh = @opendir($dir);
 | 
						|
		if( !$dh ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$dh = @opendir($dir);
 | 
						|
		if( !$dh ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		$success = true;
 | 
						|
 | 
						|
		$subDirs = array();
 | 
						|
		while( ($file = readdir($dh)) !== false){
 | 
						|
			if( $file == '.' || $file == '..' ){
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
 | 
						|
			$fullPath = $dir.'/'.$file;
 | 
						|
 | 
						|
			if( is_link($fullPath) ){
 | 
						|
				if( !unlink($fullPath) ){
 | 
						|
					$success = false;
 | 
						|
				}
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
 | 
						|
 | 
						|
			if( is_dir($fullPath) ){
 | 
						|
				$subDirs[] = $fullPath;
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			if( !unlink($fullPath) ){
 | 
						|
				$success = false;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		closedir($dh);
 | 
						|
 | 
						|
		foreach($subDirs as $subDir){
 | 
						|
			if( !$this->EmptyDir($subDir) ){
 | 
						|
				$success = false;
 | 
						|
			}
 | 
						|
			if( !\gp\tool\Files::RmDir($subDir) ){
 | 
						|
				$success = false;
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		return $success;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	public function GetSiteData(){
 | 
						|
		global $addonPathData;
 | 
						|
 | 
						|
		$this->dataFile		= $addonPathData.'/data.php';
 | 
						|
		$this->siteData		= \gp\tool\Files::Get($this->dataFile,'siteData');
 | 
						|
		$this->siteData		+= array('sites'=>array());
 | 
						|
		$this->checksum		= $this->CheckSum($this->siteData);
 | 
						|
	}
 | 
						|
 | 
						|
	public function SaveSiteData(){
 | 
						|
		$check = $this->CheckSum($this->siteData);
 | 
						|
		if( $check === $this->checksum ){
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		unset($this->siteData['destination']); //no longer used
 | 
						|
 | 
						|
		return \gp\tool\Files::SaveData( $this->dataFile,'siteData',$this->siteData );
 | 
						|
	}
 | 
						|
 | 
						|
	public function CheckSum($array){
 | 
						|
		return crc32( serialize($array) );
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function CreatePlugins($destination,$args = false){
 | 
						|
		global $rootDir;
 | 
						|
 | 
						|
		if( $args === false ){
 | 
						|
			$args = $_POST;
 | 
						|
		}
 | 
						|
 | 
						|
		//may be valid even if plugins is not set
 | 
						|
		$args += array('plugins'=>array());
 | 
						|
 | 
						|
		//selection of themes
 | 
						|
		if( !\gp\tool\Files::CheckDir($destination.'/addons') ){
 | 
						|
			msg('Failed to create <em>'.$destination.'/addons'.'</em>');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		foreach($args['plugins'] as $plugin){
 | 
						|
			$target = $rootDir.'/addons/'.$plugin;
 | 
						|
			if( !file_exists($target) ){
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			$name = $destination.'/addons/'.$plugin;
 | 
						|
			$this->Create_Symlink($target,$name);
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	//Don't create symlink for /themes, users may want to add to their collection of themes
 | 
						|
	public function CopyThemes($destination,$args=false){
 | 
						|
		global $rootDir;
 | 
						|
 | 
						|
		if( $args === false ){
 | 
						|
			$args = $_POST;
 | 
						|
		}
 | 
						|
 | 
						|
		//selection of themes
 | 
						|
		if( !\gp\tool\Files::CheckDir($destination.'/themes') ){
 | 
						|
			msg('Failed to create <em>'.$destination.'/themes'.'</em>');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$count = 0;
 | 
						|
		foreach($args['themes'] as $theme){
 | 
						|
			$target = $rootDir.'/themes/'.$theme;
 | 
						|
			if( !file_exists($target) ){
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			$name = $destination.'/themes/'.$theme;
 | 
						|
			if( $this->Create_Symlink($target,$name) ){
 | 
						|
				$count++;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if( $count == 0 ){
 | 
						|
			msg('Failed to populate <em>'.$destination.'/themes'.'</em>');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	//create the index.php file
 | 
						|
	public function CreateIndex($destination,$unique){
 | 
						|
 | 
						|
		$path = $destination.'/index.php';
 | 
						|
 | 
						|
 | 
						|
		$indexA = array();
 | 
						|
		$indexA[] = '<'.'?'.'php';
 | 
						|
		if( isset($this->siteData['service_provider_id']) ){
 | 
						|
			$indexA[] = 'define(\'service_provider_id\',\''.(int)$this->siteData['service_provider_id'].'\');';
 | 
						|
		}
 | 
						|
		if( isset($this->siteData['service_provider_name']) ){
 | 
						|
			$indexA[] = 'define(\'service_provider_name\',\''.addslashes($this->siteData['service_provider_name']).'\');';
 | 
						|
		}
 | 
						|
		$indexA[] = 'define(\'multi_site_unique\',\''.$unique.'\');';
 | 
						|
		$indexA[] = 'require_once(\'include/main.php\');';
 | 
						|
		$index = implode("\n",$indexA);
 | 
						|
		if( !\gp\tool\Files::Save($path,$index) ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		@chmod($path,0644); //to prevent 500 Internal Server Errors on some servers
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	public function NewId(){
 | 
						|
 | 
						|
		do{
 | 
						|
			$unique = \gp\tool::RandomString(20);
 | 
						|
			foreach($this->siteData['sites'] as $array){
 | 
						|
				if( isset($array['unique']) && ($array['unique'] == $unique) ){
 | 
						|
					$unique = false;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}while($unique==false);
 | 
						|
 | 
						|
		return $unique;
 | 
						|
	}
 | 
						|
 | 
						|
	//create a symbolic link and test for $test_file
 | 
						|
	public function Create_Symlink($target,$path,$test_file = false ){
 | 
						|
 | 
						|
		echo '<li>Create Symlink: <em>'.$path.'</em></li>';
 | 
						|
		if( !symlink($target,$path) ){
 | 
						|
			msg('Oops, Symlink creation failed (1)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if( $test_file && !file_exists($path.'/'.$test_file) ){
 | 
						|
			msg('Oops, Symlink creation failed (2)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Save the ftp connection information if a connection can be made
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function SaveFTPInformation(){
 | 
						|
		global $config, $langmessage;
 | 
						|
 | 
						|
		$_POST += array('ftp_server'=>'','ftp_user'=>'','ftp_pass'=>'');
 | 
						|
 | 
						|
		//try to connect and login if ftp_server is not empty
 | 
						|
		if( !empty($_POST['ftp_server']) ){
 | 
						|
 | 
						|
			$conn_id = @ftp_connect($_POST['ftp_server'],21,6);
 | 
						|
			if( !$conn_id ){
 | 
						|
				msg('Oops, could not connect using ftp_connect() for server <i>'.htmlspecialchars($_POST['ftp_server']).'</i>');
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
 | 
						|
			ob_start();
 | 
						|
			$login_result = @ftp_login($conn_id,$_POST['ftp_user'],$_POST['ftp_pass'] );
 | 
						|
			if( !$login_result ){
 | 
						|
				msg('Oops, could not login using ftp_login() for server <i>'.$_POST['ftp_server'].'</i> and user <i>'.$_POST['ftp_user'].'</i>');
 | 
						|
				@ftp_close($conn_id);
 | 
						|
				ob_end_clean();
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
			@ftp_close($conn_id);
 | 
						|
			ob_end_clean();
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		$config['ftp_user']		= $_POST['ftp_user'];
 | 
						|
		$config['ftp_server']	= $_POST['ftp_server'];
 | 
						|
		$config['ftp_pass']		= $_POST['ftp_pass'];
 | 
						|
 | 
						|
		if( !admin_tools::SaveConfig() ){
 | 
						|
			msg('Oops, there was an error saving your ftp information.');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	/*
 | 
						|
	 * New Installation Functions
 | 
						|
	 *
 | 
						|
	 *
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
 | 
						|
 | 
						|
	public function InstallStatus($cmd){
 | 
						|
		global $rootDir;
 | 
						|
 | 
						|
		$default_theme = explode('/',gp_default_theme);
 | 
						|
 | 
						|
		//make sure default theme exists
 | 
						|
		$path = $rootDir.'/themes/'.$default_theme[0];
 | 
						|
		if( !file_exists($path) ){
 | 
						|
			msg('The default theme for gpEasy "'.$default_theme[0].'" does not exist. Please make sure it exists before continuing.');
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		if( empty($cmd) || $cmd == 'Continue' ){
 | 
						|
			$cmd = false;
 | 
						|
		}elseif( $cmd == 'Install Now' ){
 | 
						|
			if( $this->NewCreate() ){
 | 
						|
				return;
 | 
						|
			}else{
 | 
						|
				$cmd = false;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		$this->CheckFolder();
 | 
						|
 | 
						|
		$this->Heading('Installation');
 | 
						|
 | 
						|
		$this->InstallStatus_Steps($cmd);
 | 
						|
 | 
						|
		echo '<div id="install_step">';
 | 
						|
		switch($cmd){
 | 
						|
 | 
						|
			case 'subfolder':
 | 
						|
			case 'new':
 | 
						|
			case 'new_destination':
 | 
						|
				$this->NewDestination();
 | 
						|
			break;
 | 
						|
 | 
						|
			case 'new_themes':
 | 
						|
				$this->NewThemes($_REQUEST['install']);
 | 
						|
			break;
 | 
						|
 | 
						|
			case 'new_plugins':
 | 
						|
				$this->NewPlugins($_REQUEST['install']);
 | 
						|
			break;
 | 
						|
 | 
						|
			case 'new_install':
 | 
						|
				$this->NewInstall();
 | 
						|
			break;
 | 
						|
 | 
						|
		}
 | 
						|
		echo '</div>';
 | 
						|
	}
 | 
						|
 | 
						|
	public function InstallStatus_Steps(&$cmd){
 | 
						|
		echo '<hr/>';
 | 
						|
		echo '<div id="install_status">';
 | 
						|
 | 
						|
		echo '<ul>';
 | 
						|
		$ready = true;
 | 
						|
		$ready = $this->InstallStatus_Step($cmd,$ready,'Destination','new_destination','folder');
 | 
						|
		$ready = $this->InstallStatus_Step($cmd,$ready,'Themes','new_themes','themes');
 | 
						|
		$this->InstallStatus_Step($cmd,$ready,'Plugins','new_plugins','plugins','plugins_submitted');
 | 
						|
 | 
						|
 | 
						|
		if( $ready ){
 | 
						|
			echo '<li id="install_state" class="ready">';
 | 
						|
			$query_array = array('cmd'=>'new_install');
 | 
						|
			echo $this->InstallLink('Ready To Install',$query_array);
 | 
						|
			if( $cmd === false ){
 | 
						|
				$cmd = 'new_install';
 | 
						|
			}
 | 
						|
			echo '</li>';
 | 
						|
		}else{
 | 
						|
			echo '<li id="install_state">';
 | 
						|
			echo '<a>Not Ready to Install</a>';
 | 
						|
			echo '</li>';
 | 
						|
		}
 | 
						|
 | 
						|
		echo '</ul>';
 | 
						|
 | 
						|
		echo '</div>';
 | 
						|
		echo '<hr/>';
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Show an installation step and it's status
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function InstallStatus_Step(&$cmd,$ready,$label,$step_cmd,$step_key,$step_key2=false){
 | 
						|
 | 
						|
		$class = 'ready';
 | 
						|
 | 
						|
		if( isset($_REQUEST['install'][$step_key]) ){
 | 
						|
			$step_value = $_REQUEST['install'][$step_key];
 | 
						|
			if( is_array($step_value) ){
 | 
						|
				$link_label = implode(', ',$step_value);
 | 
						|
				if( strlen($link_label) > 40 ){
 | 
						|
					$link_label = substr($link_label,0,40).'...';
 | 
						|
				}
 | 
						|
			}else{
 | 
						|
				$link_label = $step_value;
 | 
						|
			}
 | 
						|
		}elseif( $step_key2 && isset($_REQUEST['install'][$step_key2]) ){
 | 
						|
			$link_label = 'Empty';
 | 
						|
		}else{
 | 
						|
			$ready			= false;
 | 
						|
			$query_array	= array('cmd'=>'new_destination');
 | 
						|
			$link_label		= 'Not Set';
 | 
						|
			$class			= '';
 | 
						|
 | 
						|
			if( !$cmd ){
 | 
						|
				$cmd = $step_cmd;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if( empty($link_label) ){
 | 
						|
			$link_label = 'Empty';
 | 
						|
		}
 | 
						|
		$query_array = array('cmd'=>$step_cmd);
 | 
						|
 | 
						|
		echo '<li class="'.$class.'">';
 | 
						|
		echo $this->InstallLink($label.': '.$link_label,$query_array);
 | 
						|
		echo '</li>';
 | 
						|
 | 
						|
		return $ready;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Make sure the install folder is writable before continuing with the installation process
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function CheckFolder(){
 | 
						|
		global $config;
 | 
						|
 | 
						|
		if( empty($_REQUEST['install']['folder']) ){
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$folder = $_REQUEST['install']['folder'];
 | 
						|
 | 
						|
		if( is_writable($folder) ){
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		if( !function_exists('ftp_connect') ){
 | 
						|
			$this->FolderNotWritable('FTP Extension Not Available');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if( empty($config['ftp_server']) ){
 | 
						|
			$this->FolderNotWritable('FTP connection values not set');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		$conn_id	= self::FTPConnect();
 | 
						|
		if( !$conn_id ){
 | 
						|
			$this->FolderNotWritable('FTP connection could not be made with the supplied values');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		$ftp_root	= \gp\tool\FileSystemFtp::GetFTPRoot($conn_id,$folder);
 | 
						|
		if( $ftp_root === false ){
 | 
						|
			$this->FolderNotWritable('Root folder not found by FTP');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Display message to user about not being able to write to the installation folder
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function FolderNotWritable($reason = ''){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		$message = '<p>Sorry, the selected folder could not be written to.</p> ';
 | 
						|
		$message .= '<em>'.$reason.'</em> ';
 | 
						|
		$message .= '<p>You may still be able to install in this folder by doing one of the following:</p>';
 | 
						|
		$message .= '<ul>';
 | 
						|
		$message .= '<li>Make the folder writable by changing it\'s permissions.</li>';
 | 
						|
 | 
						|
		if( function_exists('ftp_connect') ){
 | 
						|
			$message .= '<li>Supply your server\'s <a href="%s">ftp connection information</a>.</li>';
 | 
						|
		}else{
 | 
						|
			$message .= '<li>Enabling the FTP extension in php and supplying <a href="%s">ftp connection information</a>.</li>';
 | 
						|
		}
 | 
						|
		$message = sprintf($message,\gp\tool::GetUrl('Admin_Site_Setup','cmd=settings'));
 | 
						|
		$message .= '</ul>';
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		//msg($langmessage['not_created'].' (FTP Connection Failed)');
 | 
						|
		unset($_REQUEST['install']['folder']);
 | 
						|
		msg($message);
 | 
						|
	}
 | 
						|
 | 
						|
	public function NewInstall(){
 | 
						|
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="post">';
 | 
						|
		echo '<table style="width:100%">';
 | 
						|
		\gp\install\Tools::Form_UserDetails();
 | 
						|
		echo '</table>';
 | 
						|
		$this->InstallFields($_REQUEST['install'],'install');
 | 
						|
		echo '<div id="install_continue">';
 | 
						|
		echo '<input type="submit" name="cmd" value="Install Now" class="continue"/>';
 | 
						|
		echo ' <input type="submit" name="" value="Cancel" />';
 | 
						|
		echo '</div>';
 | 
						|
		echo '</form>';
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function NewDestination(){
 | 
						|
		global $rootDir,$config;
 | 
						|
 | 
						|
		if( empty($this->siteData['last_folder']) ){
 | 
						|
			$folder = $rootDir;
 | 
						|
		}else{
 | 
						|
			$folder = $this->siteData['last_folder'];
 | 
						|
		}
 | 
						|
 | 
						|
		$this->InstallFolder($folder);
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Display form for selecting which themes should be included
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function NewThemes($values=array()){
 | 
						|
		global $rootDir;
 | 
						|
 | 
						|
		if( !isset($values['themes']) ){
 | 
						|
			$values += array('all_themes'=>'all');
 | 
						|
		}
 | 
						|
		$values += array('themes'=>array());
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		$all_themes = false;
 | 
						|
		if( isset($values['all_themes']) && $values['all_themes'] == 'all' ){
 | 
						|
			$all_themes = true;
 | 
						|
		}
 | 
						|
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="post">';
 | 
						|
		echo '<table style="width:100%">';
 | 
						|
		echo '<tr>';
 | 
						|
		echo '<th>Select Themes</th>';
 | 
						|
		echo '</tr>';
 | 
						|
		echo '<tr><td class="all_checkboxes">';
 | 
						|
			echo '<div>';
 | 
						|
			echo 'Select which themes will be available to the new installation. ';
 | 
						|
			echo '</div>';
 | 
						|
			echo '<br/>';
 | 
						|
 | 
						|
			echo '<table border="0" cellpadding="7">';
 | 
						|
			echo '<tr><td>';
 | 
						|
			$checked = '';
 | 
						|
			if( $all_themes ){
 | 
						|
				$checked = ' checked="checked" ';
 | 
						|
			}
 | 
						|
			echo '<label class="select_all"><input type="checkbox" class="select_all" name="install[all_themes]" value="all" '.$checked.'/> All Themes</label> ';
 | 
						|
			echo '</td></tr>';
 | 
						|
			echo '<tr><td style="border-top:1px solid #ccc;border-bottom:1px solid #ccc;vertical-align:middle;font-weight:bold;">';
 | 
						|
			echo ' OR ';
 | 
						|
			echo '</td></tr>';
 | 
						|
 | 
						|
			echo '<tr><td>';
 | 
						|
 | 
						|
 | 
						|
			$default_theme = explode('/',gp_default_theme);
 | 
						|
 | 
						|
			//default theme
 | 
						|
			echo '<input type="hidden" name="install[themes][]" value="'.$default_theme[0].'" />';
 | 
						|
			echo '<label class="all_checkbox">';
 | 
						|
			echo '<input type="checkbox" name="install[themes][]" value="'.$default_theme[0].'" checked="checked" disabled="disabled" />';
 | 
						|
			echo '<span>'.$default_theme[0].'</span>';
 | 
						|
			echo '</label>';
 | 
						|
 | 
						|
			//all other available themes
 | 
						|
			echo ' And ... <br/>';
 | 
						|
			echo '<p>';
 | 
						|
			$dir = $rootDir.'/themes';
 | 
						|
			$layouts = \gp\tool\Files::readDir($dir,1);
 | 
						|
			asort($layouts);
 | 
						|
			$i = 1;
 | 
						|
			foreach($layouts as $name){
 | 
						|
				if( $name == $default_theme[0] ){
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
 | 
						|
				$checked = '';
 | 
						|
				if( $all_themes || (array_search($name,$values['themes']) > 0) ){
 | 
						|
					$checked = ' checked="checked" ';
 | 
						|
				}
 | 
						|
 | 
						|
				echo '<label class="all_checkbox">';
 | 
						|
				echo '<input type="checkbox" name="install[themes]['.$i++.']" value="'.htmlspecialchars($name).'" '.$checked.'/>';
 | 
						|
				echo '<span>';
 | 
						|
				echo str_replace('_',' ',$name);
 | 
						|
				echo '</span>';
 | 
						|
				echo '</label>';
 | 
						|
			}
 | 
						|
			echo '</p>';
 | 
						|
			echo '</td>';
 | 
						|
			echo '</tr>';
 | 
						|
			echo '</table>';
 | 
						|
 | 
						|
 | 
						|
			echo '</td>';
 | 
						|
			echo '</tr>';
 | 
						|
		echo '</table>';
 | 
						|
 | 
						|
		$this->InstallFields($_REQUEST['install'],'install');
 | 
						|
		echo '<div id="install_continue">';
 | 
						|
		echo '<input type="submit" name="cmd" value="Continue" class="continue"/> ';
 | 
						|
		echo ' <input type="submit" name="" value="Cancel" />';
 | 
						|
		echo '</div>';
 | 
						|
		echo '</form>';
 | 
						|
	}
 | 
						|
 | 
						|
	public function NewPlugins($values = array()){
 | 
						|
		global $rootDir;
 | 
						|
 | 
						|
		$values += array('plugins'=>array());
 | 
						|
 | 
						|
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="post">';
 | 
						|
		echo '<table style="width:100%">';
 | 
						|
		echo '<tr>';
 | 
						|
			echo '<th>Select Plugins</th>';
 | 
						|
			echo '</tr>';
 | 
						|
		echo '<tr>';
 | 
						|
			echo '<td class="all_checkboxes">';
 | 
						|
			echo '<div>';
 | 
						|
			echo 'Select which plugins will be available to the new installation. Note, selected plugins will not be installed.';
 | 
						|
			echo '</div>';
 | 
						|
			echo '<br/>';
 | 
						|
 | 
						|
			$dir = $rootDir.'/addons';
 | 
						|
			$addons = \gp\tool\Files::readDir($dir,1);
 | 
						|
			$i = 1;
 | 
						|
			foreach($addons as $addon){
 | 
						|
				$checked = '';
 | 
						|
				if( array_search($addon,$values['plugins']) > 0 ){
 | 
						|
					$checked = ' checked="checked" ';
 | 
						|
				}
 | 
						|
				echo '<label class="all_checkbox">';
 | 
						|
				echo '<input type="checkbox" name="install[plugins]['.$i++.']" value="'.htmlspecialchars($addon).'"'.$checked.'/>';
 | 
						|
				echo '<span>';
 | 
						|
				echo str_replace('_',' ',$addon);
 | 
						|
				echo '</span>';
 | 
						|
				echo '</label>';
 | 
						|
			}
 | 
						|
 | 
						|
			echo '</td>';
 | 
						|
			echo '</tr>';
 | 
						|
		echo '</table>';
 | 
						|
 | 
						|
		$this->InstallFields($_REQUEST['install'],'install');
 | 
						|
		echo '<div id="install_continue">';
 | 
						|
		echo '<input type="submit" name="cmd" value="Continue" class="continue"/>';
 | 
						|
		echo ' <input type="submit" name="" value="Cancel" />';
 | 
						|
		echo '</div>';
 | 
						|
		echo '<input type="hidden" name="install[plugins_submitted]" value="plugins_submitted" />';
 | 
						|
		echo '</form>';
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	public function InstallLink($label,$query_array=array(),$attr=''){
 | 
						|
		return '<a href="'.$this->InstallUrl($query_array).'" '.$attr.'>'.\gp\tool::Ampersands($label).'</a>';
 | 
						|
	}
 | 
						|
 | 
						|
	public function InstallUrl($query_array=array()){
 | 
						|
		$query_array += array('install'=>array());
 | 
						|
		$query_array['install'] = $query_array['install'] + $_REQUEST['install'];
 | 
						|
		$query = http_build_query($query_array);
 | 
						|
 | 
						|
		return \gp\tool::GetUrl('Admin_Site_Setup',$query);
 | 
						|
	}
 | 
						|
 | 
						|
	public function InstallFields($array,$key=null){
 | 
						|
		foreach($array as $k => $v){
 | 
						|
 | 
						|
			if( !empty($key) || ($key === 0) ){
 | 
						|
				$k = $key.'['.urlencode($k).']';
 | 
						|
			}
 | 
						|
 | 
						|
			if (is_array($v) || is_object($v)) {
 | 
						|
				$this->InstallFields($v,$k);
 | 
						|
			} else {
 | 
						|
				echo '<input type="hidden" name="'.htmlspecialchars($k).'" value="'.htmlspecialchars($v).'" />';
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Display window for selecting where to install
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function InstallFolder($destination){
 | 
						|
 | 
						|
		echo '<table>';
 | 
						|
		echo '<tr><th>';
 | 
						|
		echo 'Select Destination Folder';
 | 
						|
		echo '</th></tr></table>';
 | 
						|
 | 
						|
 | 
						|
		$previous = $destination;
 | 
						|
		$parent = $destination;
 | 
						|
		$links = array();
 | 
						|
		do{
 | 
						|
			$previous = $parent;
 | 
						|
			$query_array = array('cmd'=>'expandfolder','folder'=>$parent);
 | 
						|
			$links[] = $this->InstallLink(basename($parent).'/',$query_array,' data-cmd="gpajax" ');
 | 
						|
			$parent = dirname($parent);
 | 
						|
		}while( $previous != $parent );
 | 
						|
 | 
						|
 | 
						|
		echo '<div id="parent_folders">';
 | 
						|
		$links = array_reverse($links);
 | 
						|
		echo implode('',$links);
 | 
						|
 | 
						|
		$query_array = array('cmd'=>'expandfolder','folder'=>$destination);
 | 
						|
		echo '<form method="post" action="'.$this->InstallUrl($query_array).'">';
 | 
						|
		echo '<input type="text" name="sub_dir" value="" />';
 | 
						|
		echo '<input type="hidden" name="cmd" value="subfolder" />';
 | 
						|
		echo '</form>';
 | 
						|
		echo '</div>';
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		//show subfolders
 | 
						|
		echo '<div style="clear:both"></div>';
 | 
						|
 | 
						|
		echo '<div id="destination_select">';
 | 
						|
		$this->InstallFolders($destination);
 | 
						|
		echo '</div>';
 | 
						|
 | 
						|
		echo '<div id="install_continue">';
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="get">';
 | 
						|
		echo '<input type="submit" name="" value="Cancel" />';
 | 
						|
		echo '</form>';
 | 
						|
		echo '</div>';
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function InstallFolders($dir){
 | 
						|
 | 
						|
		if( !is_readable($dir) ){
 | 
						|
			echo '<p>';
 | 
						|
			echo 'Sorry, <i>'.$dir.'</i> is not readable.';
 | 
						|
			echo '</p>';
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$subdirs = \gp\tool\Files::readDir($dir,1);
 | 
						|
 | 
						|
		echo '<ul>';
 | 
						|
		$i = 0;
 | 
						|
		$classes = array('even','odd');
 | 
						|
		if( count($subdirs) > 0 ){
 | 
						|
			natcasesort($subdirs);
 | 
						|
			$temp = rtrim($dir,'/');
 | 
						|
			foreach($subdirs as $subdir){
 | 
						|
				echo '<li>';
 | 
						|
				$this->FolderLink($subdir,$temp.'/'.$subdir,$classes[$i%2]);
 | 
						|
				echo '</li>';
 | 
						|
				$i++;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		echo '<li>';
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="post" class="'.$classes[$i%2].'">';
 | 
						|
		echo '<input type="submit" name="" value="New Folder" class="gppost" /> ';
 | 
						|
		echo '<input type="text" name="new_folder" value="" class="text"/> ';
 | 
						|
		echo '<input type="hidden" name="folder" value="'.htmlspecialchars($dir).'" /> ';
 | 
						|
		echo '<input type="hidden" name="cmd" value="newfolder" /> ';
 | 
						|
		$this->InstallFields($_REQUEST['install'],'install');
 | 
						|
		echo '</form>';
 | 
						|
		echo '</li>';
 | 
						|
 | 
						|
		echo '</ul>';
 | 
						|
	}
 | 
						|
 | 
						|
	public function GetSubdirs($dir){
 | 
						|
		global $config;
 | 
						|
 | 
						|
		if( is_readable($dir) ){
 | 
						|
			return \gp\tool\Files::readDir($dir,1);
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	public function FolderLink($base,$full,$class){
 | 
						|
		echo '<span class="expand_child '.$class.'">';
 | 
						|
 | 
						|
		$this->InstallLinks($full);
 | 
						|
 | 
						|
 | 
						|
		$query_array = array('cmd'=>'expandfolder','folder'=>$full);
 | 
						|
		echo $this->InstallLink($base,$query_array,' data-cmd="gpajax" rel="'.htmlspecialchars($full).'" ');
 | 
						|
		echo '</span>';
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Check for /addons, /data, /include, /themes and /index.php
 | 
						|
	 */
 | 
						|
	public function InstallLinks($dir){
 | 
						|
		global $config;
 | 
						|
 | 
						|
		$check_short = array('addons','data','include','themes','index.php');
 | 
						|
		$failed = array();
 | 
						|
 | 
						|
		//readable
 | 
						|
		if( !is_readable($dir) ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		//existing contents
 | 
						|
		foreach($check_short as $short){
 | 
						|
			$check_full = rtrim($dir,'/').'/'.$short;
 | 
						|
			if( file_exists($check_full) ){
 | 
						|
				$failed[] = $check_short;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if( count($failed) > 0 ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$query_array = array('cmd'=>'Continue','install'=>array('folder'=>$dir));
 | 
						|
		echo $this->InstallLink('Install Here',$query_array,' class="select" ');
 | 
						|
 | 
						|
		$query_array = array('cmd'=>'rmdir','dir'=>$dir);
 | 
						|
		echo $this->InstallLink('Delete',$query_array,' class="rm" data-cmd="gpajax" ');
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Show the contents of folder
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function ExpandFolder(){
 | 
						|
		global $page, $langmessage,$config;
 | 
						|
 | 
						|
		$_REQUEST += array('install'=>array());
 | 
						|
		$page->ajaxReplace = array();
 | 
						|
		$page->ajaxReplace[] = 'messages';
 | 
						|
 | 
						|
		$folder =& $_REQUEST['folder'];
 | 
						|
		if( empty($folder) || !file_exists($folder) || !is_dir($folder) ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->LoadFolder($folder);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Go to a user supplied sub directory in the browser
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function SubFolder(){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		$folder =& $_REQUEST['folder'];
 | 
						|
		if( !empty($_REQUEST['sub_dir']) ){
 | 
						|
			$folder .= '/'.$_REQUEST['sub_dir'];
 | 
						|
		}
 | 
						|
		if( empty($folder) || !file_exists($folder) || !is_dir($folder) ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->LoadFolder($folder);
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function LoadFolder($folder){
 | 
						|
		global $page;
 | 
						|
 | 
						|
		ob_start();
 | 
						|
		echo $this->InstallFolder($folder);
 | 
						|
		$content = ob_get_clean();
 | 
						|
 | 
						|
		$page->ajaxReplace[] = array('inner','#install_step',$content);
 | 
						|
 | 
						|
		//save the folder location
 | 
						|
		if( !isset($this->siteData['last_folder']) || $this->siteData['last_folder'] !== $folder ){
 | 
						|
			$this->siteData['last_folder'] = $folder;
 | 
						|
			unset($this->siteData['last_folder_ftp']);
 | 
						|
			$this->SaveSiteData();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Create a new folder
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function NewFolder(){
 | 
						|
		global $page, $langmessage;
 | 
						|
 | 
						|
		$page->ajaxReplace = array();
 | 
						|
		$page->ajaxReplace[] = 'messages';
 | 
						|
 | 
						|
		$folder =& $_POST['folder'];
 | 
						|
		if( empty($folder) || !file_exists($folder) || !is_dir($folder) ){
 | 
						|
			msg($langmessage['OOPS']. ' (Parent Dir)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$new_name =& $_POST['new_folder'];
 | 
						|
		if( empty($new_name) ){
 | 
						|
			msg($langmessage['OOPS']. ' (Empty Name)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$new_name = trim($new_name,'/\\');
 | 
						|
		$folder = rtrim($folder,'/\\');
 | 
						|
 | 
						|
		$new_folder = $folder.'/'.$new_name;
 | 
						|
 | 
						|
		if( file_exists($new_folder) ){
 | 
						|
			msg($langmessage['OOPS']. ' (Already Exists)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if( !$this->MakeDir($folder,$new_name) ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->ExpandFolder();
 | 
						|
	}
 | 
						|
 | 
						|
	public function RemoveDirPrompt(){
 | 
						|
		global $page, $langmessage;
 | 
						|
 | 
						|
		$page->ajaxReplace = array();
 | 
						|
		$page->ajaxReplace[] = 'messages';
 | 
						|
 | 
						|
 | 
						|
		$dir = $_REQUEST['dir'];
 | 
						|
		if( !$this->RemoveDirCheck($dir) ){
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		ob_start();
 | 
						|
 | 
						|
		echo '<div class="inline_box">';
 | 
						|
		echo '<form action="'.\gp\tool::GetUrl('Admin_Site_Setup').'" method="post">';
 | 
						|
		echo '<input type="hidden" name="dir" value="'.htmlspecialchars($dir).'" />';
 | 
						|
		echo '<input type="hidden" name="cmd" value="new_destination" />';
 | 
						|
		$this->InstallFields($_REQUEST['install'],'install');
 | 
						|
 | 
						|
		echo sprintf($langmessage['generic_delete_confirm'],'<i>'.htmlspecialchars($dir).'</i>');
 | 
						|
 | 
						|
		echo '<p>';
 | 
						|
		echo '<input type="submit" name="cmd" value="Delete Folder" class="gppost" />';
 | 
						|
		echo ' <input type="submit" value="Cancel" class="admin_box_close" /> ';
 | 
						|
		echo '</p>';
 | 
						|
 | 
						|
		echo '</form>';
 | 
						|
		echo '</div>';
 | 
						|
 | 
						|
 | 
						|
		$content = ob_get_clean();
 | 
						|
 | 
						|
		$page->ajaxReplace[] = array('gpabox','',$content);
 | 
						|
	}
 | 
						|
 | 
						|
	public function RemoveDir(){
 | 
						|
		global $page, $langmessage;
 | 
						|
 | 
						|
		$page->ajaxReplace = array();
 | 
						|
		$page->ajaxReplace[] = 'messages';
 | 
						|
 | 
						|
		$dir = $_POST['dir'];
 | 
						|
		if( !$this->RemoveDirCheck($dir) ){
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$parent = dirname($dir);
 | 
						|
 | 
						|
		if( !$this->RmDir($dir) ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->LoadFolder($parent);
 | 
						|
	}
 | 
						|
 | 
						|
	public function RemoveDirCheck($dir){
 | 
						|
		global $langmessage;
 | 
						|
 | 
						|
		if( empty($dir) || !file_exists($dir) || !is_dir($dir) ){
 | 
						|
			msg($langmessage['OOPS'].' (Invalid)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$dh = @opendir($dir);
 | 
						|
		if( !$dh ){
 | 
						|
			msg($langmessage['OOPS'].' (Not Readable)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$count = 0;
 | 
						|
		while( ($file = readdir($dh)) !== false){
 | 
						|
			if( $file == '.' || $file == '..' ){
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			closedir($dh);
 | 
						|
			msg($langmessage['dir_not_empty']);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		closedir($dh);
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	public function MakeDir($parent,$new_name){
 | 
						|
		global $config, $langmessage;
 | 
						|
 | 
						|
 | 
						|
		$langmessage['not_created'] = 'Oops, the folder could not be created. ';
 | 
						|
		$langmessage['not_created'] .= 'You may still be able to create it by doing one of the following: ';
 | 
						|
		$langmessage['not_created'] .= '<ul>';
 | 
						|
		$langmessage['not_created'] .= '<li>Make the parent folder writable by changing it\'s permissions.</li>';
 | 
						|
		$langmessage['not_created'] .= '<li>Supply your server\'s <a href="%s">ftp information</a> to this plugin.</li>';
 | 
						|
		$langmessage['not_created'] .= '</ul>';
 | 
						|
 | 
						|
		$langmessage['not_created'] = sprintf($langmessage['not_created'],\gp\tool::GetUrl('Admin_Site_Setup','cmd=settings'));
 | 
						|
 | 
						|
 | 
						|
		$new_folder = $parent.'/'.$new_name;
 | 
						|
 | 
						|
		if( mkdir($new_folder,0755) ){
 | 
						|
			chmod($new_folder,0755); //some systems need more than just the 0755 in the mkdir() function
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		if( $this->HasFTP() ){
 | 
						|
			msg($langmessage['not_created']);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$conn_id = self::FTPConnect();
 | 
						|
		if( !$conn_id ){
 | 
						|
			msg($langmessage['not_created'].' (FTP Connection Failed)');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		$ftp_parent = \gp\tool\FileSystemFtp::GetFTPRoot($conn_id,$parent);
 | 
						|
		if( $ftp_parent === false ){
 | 
						|
			msg('Oops, could not find the ftp location of <i>'.$parent.'</i> using the current ftp login.');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$ftp_destination = $ftp_parent.'/'.$new_name;
 | 
						|
		if( !ftp_mkdir($conn_id,$ftp_destination) ){
 | 
						|
			msg('Oops, could not create the folder using the current ftp login.');
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		ftp_site($conn_id, 'CHMOD 0755 '. $ftp_destination );
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function NewCreate(){
 | 
						|
		global $rootDir,$config,$checkFileIndex;
 | 
						|
		global $dataDir; //for SaveTitle(), SaveConfig()
 | 
						|
 | 
						|
		$_POST					+= array('themes'=>array(),'plugins'=>array());
 | 
						|
		$destination			= $_REQUEST['install']['folder'];
 | 
						|
		$this->site_uniq_id 	= $this->NewId();
 | 
						|
		$checkFileIndex			= false;
 | 
						|
 | 
						|
 | 
						|
		//prevent reposting
 | 
						|
		if( isset($this->siteData['sites'][$destination]) ){
 | 
						|
			msg('Oops, there\'s already an installation in '.htmlspecialchars($destination));
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		echo '<ul>';
 | 
						|
		echo '<li>Starting Installation</li>';
 | 
						|
 | 
						|
 | 
						|
		//check user values first
 | 
						|
		if( !\gp\install\Tools::gpInstall_Check() ){
 | 
						|
			$this->Install_Aborted($destination);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		//	Create index.php file
 | 
						|
		echo '<li>Create index.php file</li>';
 | 
						|
		if( !$this->CreateIndex($destination,$this->site_uniq_id) ){
 | 
						|
			echo '<li>Failed to save the index.php file</li>';
 | 
						|
			$this->Install_Aborted($destination);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		//	Create /include symlink
 | 
						|
		$target = $rootDir.'/include';
 | 
						|
		$name = $destination.'/include';
 | 
						|
		if( !$this->Create_Symlink($target,$name,'main.php') ){
 | 
						|
			$this->Install_Aborted($destination);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		//	Create /themes folder
 | 
						|
		if( !$this->CopyThemes($destination,$_REQUEST['install']) ){
 | 
						|
			$this->Install_Aborted($destination);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		//	Create /plugins folder
 | 
						|
		if( !$this->CreatePlugins($destination,$_REQUEST['install']) ){
 | 
						|
			$this->Install_Aborted($destination);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		//	variable juggling
 | 
						|
		$oldDir = $dataDir;
 | 
						|
		$dataDir = $destination;
 | 
						|
		$old_unique = $config['gpuniq'];
 | 
						|
 | 
						|
 | 
						|
		$new_config = array();
 | 
						|
		$new_config['language'] = $config['language'];
 | 
						|
		$config['gpuniq'] = $new_config['gpuniq'] = $this->NewId();
 | 
						|
 | 
						|
		ob_start();
 | 
						|
		if( !\gp\install\Tools::Install_DataFiles_New( $destination, $new_config, false ) ){
 | 
						|
			$this->Install_Aborted($destination);
 | 
						|
			$dataDir = $oldDir;
 | 
						|
			$config['gpuniq'] = $old_unique;
 | 
						|
			ob_get_clean();
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		ob_get_clean();
 | 
						|
 | 
						|
		$dataDir = $oldDir;
 | 
						|
		$config['gpuniq'] = $old_unique;
 | 
						|
 | 
						|
 | 
						|
		$this->siteData['sites'][$destination] = array();
 | 
						|
		$this->siteData['sites'][$destination]['unique'] = $this->site_uniq_id;
 | 
						|
		$this->siteData['sites'][$destination]['gpuniq'] = $new_config['gpuniq'];
 | 
						|
 | 
						|
		$this->SaveSiteData();
 | 
						|
		$this->Install_Success();
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	public function Install_Aborted($destination){
 | 
						|
 | 
						|
		echo '<li><b>Installation Aborted</b></li>';
 | 
						|
		echo '</ul>';
 | 
						|
		if( $destination ){
 | 
						|
			$this->EmptyDir($destination);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public function Install_Success(){
 | 
						|
		echo '</ul>';
 | 
						|
		echo '<p></p>';
 | 
						|
		echo '<b>Installation was completed successfully.</b> ';
 | 
						|
 | 
						|
		//show the options
 | 
						|
		$_REQUEST['site'] = $_REQUEST['install']['folder'];
 | 
						|
		$this->Options();
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Return true if FTP can be used
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function HasFTP(){
 | 
						|
		global $config;
 | 
						|
 | 
						|
		if( empty($config['ftp_server']) || !function_exists('ftp_connect') ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Multi Site Heading
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function Heading($sub_heading=false){
 | 
						|
		echo '<h1>';
 | 
						|
		echo \gp\tool::Link('Admin_Site_Setup','Multi-Site');
 | 
						|
 | 
						|
		if( $sub_heading ){
 | 
						|
			echo ' » ';
 | 
						|
			echo $sub_heading;
 | 
						|
		}
 | 
						|
		echo '</h1>';
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * FTP Functions
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public static function FTPConnect(){
 | 
						|
		global $config;
 | 
						|
 | 
						|
		static $conn_id = false;
 | 
						|
 | 
						|
		if( $conn_id ){
 | 
						|
			return $conn_id;
 | 
						|
		}
 | 
						|
 | 
						|
		if( empty($config['ftp_server']) ){
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$conn_id = @ftp_connect($config['ftp_server'], 21, 6);
 | 
						|
		if( !$conn_id ){
 | 
						|
			//trigger_error('ftp_connect() failed for server : '.$config['ftp_server']);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$login_result = @ftp_login($conn_id, $config['ftp_user'], $config['ftp_pass']);
 | 
						|
		if( !$login_result ){
 | 
						|
			//trigger_error('ftp_login() failed for server : '.$config['ftp_server'].' and user: '.$config['ftp_user']);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		register_shutdown_function(array('SetupSite', 'ftpClose'), $conn_id);
 | 
						|
		return $conn_id;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public static function ftpClose($connection=false){
 | 
						|
		if( $connection !== false ){
 | 
						|
			@ftp_quit($connection);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 |