From 83f14ca0e9f9910a730074e38d48f6ee673b4f03 Mon Sep 17 00:00:00 2001 From: gtbu <manbu@mail.de> Date: Fri, 21 Mar 2025 19:25:10 +0100 Subject: [PATCH] removed-multisite-addon removed-multisite-addon (replaced with zip) --- addons/--removed-Multi Site.zip | Bin 0 -> 13143 bytes addons/Multi Site/Addon.ini | 20 - addons/Multi Site/Install_Check.php | 33 - addons/Multi Site/SetupSite.php | 2016 --------------------------- addons/Multi Site/multi_site.scss | 221 --- 5 files changed, 2290 deletions(-) create mode 100644 addons/--removed-Multi Site.zip delete mode 100644 addons/Multi Site/Addon.ini delete mode 100644 addons/Multi Site/Install_Check.php delete mode 100644 addons/Multi Site/SetupSite.php delete mode 100644 addons/Multi Site/multi_site.scss diff --git a/addons/--removed-Multi Site.zip b/addons/--removed-Multi Site.zip new file mode 100644 index 0000000000000000000000000000000000000000..4d30c8bb9ed091cd742f7dd8b84e7f6b22d6f869 GIT binary patch literal 13143 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 C(zh@G literal 0 HcmV?d00001 diff --git a/addons/Multi Site/Addon.ini b/addons/Multi Site/Addon.ini deleted file mode 100644 index ea3825e..0000000 --- a/addons/Multi Site/Addon.ini +++ /dev/null @@ -1,20 +0,0 @@ - -Addon_Name = 'Multiple Site' -Addon_Unique_ID = 16 -Addon_Version = 1.2.3 - -min_gpeasy_version = 2.1.1 - -About = 'Helps you manage multiple installations of gpEasy. The Multiple Sites plugin is prepackaged with gpEasy.'; - - -;Admin_links (Optional) -;Define scripts that are only accessible to administrators with appropriate permissions -[Admin_Link:Site_Setup] -label = 'Setup Site' -script = 'SetupSite.php' -class = 'SetupSite' - - - - diff --git a/addons/Multi Site/Install_Check.php b/addons/Multi Site/Install_Check.php deleted file mode 100644 index 8d29441..0000000 --- a/addons/Multi Site/Install_Check.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -defined('is_running') or die('Not an entry point...'); - - -/* - * Install_Check() can be used to check the destination server for required features - * This can be helpful for addons that require PEAR support or extra PHP Extensions - * Install_Check() is called from step1 of the install/upgrade process - */ -function Install_Check(){ - global $config; - - - $passed = true; - if( defined('multi_site_unique') ){ - echo '<p style="color:red">Cannot install this addon. This is not the root installation of gpEasy.</p>'; - $passed = false; - } - - - if( !function_exists('symlink') ){ - echo '<p style="color:red">Cannot install this addon. Your installation of PHP has the symlink() function disabled.</p>'; - $passed = false; - } - - - if( !isset($_SERVER['SCRIPT_FILENAME']) && (GETENV('SCRIPT_FILENAME') === FALSE) ){ - echo '<p style="color:red">Cannot install this addon. $_SERVER[\'SCRIPT_FILENAME\'] and GETENV(\'SCRIPT_FILENAME\') are unavailable.</p>'; - $passed = false; - } - - return $passed; -} diff --git a/addons/Multi Site/SetupSite.php b/addons/Multi Site/SetupSite.php deleted file mode 100644 index 215ad3f..0000000 --- a/addons/Multi Site/SetupSite.php +++ /dev/null @@ -1,2016 +0,0 @@ -<?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); - } - } - -} diff --git a/addons/Multi Site/multi_site.scss b/addons/Multi Site/multi_site.scss deleted file mode 100644 index 91a5136..0000000 --- a/addons/Multi Site/multi_site.scss +++ /dev/null @@ -1,221 +0,0 @@ - -@import 'include/thirdparty/Bootstrap3/scss/bootstrap/_variables.scss'; -@import 'include/css/variables.scss'; - - -//@import 'include/thirdparty/Bootstrap3/less/variables.less'; -//@import 'include/css/variables.less'; - - - -#install_step{ - margin-top:30px; - } - -#install_step th{ - font-size:20px !important; - font-weight:normal; - border:none; - background:#fff; - padding:0 0 10px; - text-align:left; - } - -#install_step .label{ - white-space:nowrap; - padding-right:20px; - } - -#parent_folders{ - margin-bottom:10px; - background: #eee; - border-radius:3px; - } - -#parent_folders a{ - display:inline-block; - padding:0; - margin:0; - padding: 5px 10px; - color:#333 !important; - line-height:18px; - } -#parent_folders a:hover{ - background:#f5f5f5; - } - -#parent_folders form, -#parent_folders input{ - display:inline; - } - -#parent_folders input{ - display:inline-block; - background: #fff; - border: 1px solid #efefef; - border-radius: 5px; - padding:0; - margin:1px; - height:24px; - width:200px; - } - -#destination_select ul{ - list-style:none; - margin:1px 0; - padding:0; - } -#destination_select ul li{ - overflow:hidden; - padding: 0 0 0 20px; - padding: 0; - } -#destination_select li span{ - display:block; - white-space:nowrap; - padding:0; - - background: #e9e9e9 url('../../../include/imgs/folder.png') 4px 50% no-repeat; - } -#destination_select li span.odd{ - background-color:#f7f7f7; - } - -#destination_select span:hover{ - background-color: #ccc !important; - } - -#destination_select li a{ - display:block; - padding: 5px 10px 5px 24px; - color:#333 !important; - margin-right:100px; - } - -#destination_select a.select, -#destination_select input.gppost{ - float:right; - padding:2px 5px; - margin:3px; - border:0; - border-radius:3px; - font-size:13px; - - color:#fff !important; - background-color:#6aa84f; - } - -#destination_select a.rm{ - float:right; - padding:2px 5px; - margin:3px; - display:none; - } -#destination_select span.expand a.rm{ - display:block; - } - -/* -#destination_select a.not_installable{ - color:#990000 !important; - background:none; - } -*/ - -#destination_select form{ - display:block; - background: #e9e9e9; - border:2px solid #e9e9e9; - border-width:2px 0 2px 2px; - } -#destination_select form.odd{ - background-color:#f7f7f7; - border-color:#f7f7f7; - } -#destination_select input.text{ - border:1px solid #ccc; - padding: 4px; - display: block; - } - - - -#install_status{ - width:100%; - border-radius:5px; - padding:0; - color:#555; - box-sizing:border-box; - margin-top:20px; - } - -#install_status ul{ - list-style:none; - margin:0; - padding:0; - } - -#install_status li{ - display:inline-block; - } - -#install_status li a{ - color: #333; - padding: 7px 10px; - margin-right: 10px; - display: inline-block; - max-width: 200px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - - color: $btn-warning-color !important; - background-color: $btn-warning-bg; - border: 1px solid $btn-warning-border; - border-radius:3px; - } - -#install_status li.ready a{ - color: $btn-success-color !important; - background-color: $btn-success-bg; - border: 1px solid $btn-success-border; -} - -#install_state{ - float:right; - } -#install_state.ready a{ - font-weight:bold; - } - -#install_continue{ - text-align:right; - margin-top:10px; - } - -#install_continue input{ - border:1px solid #ccc; - border-radius:5px; - padding:1px 5px; - margin:5px; - cursor:pointer; - } - -#install_continue .continue{ - padding:4px 26px; - font-size:15px; - - color: $btn-success-color; - background-color: $btn-success-bg; - border: 1px solid $btn-success-border; - border-radius:5px; - } - -#ms_links{ - padding:25px 0; - } - -#ms_links a{ - font-size:17px; - margin:3px 7px 3px 0; - }