Explorar o código

#31 - Changing permissions via FTP automatically.

AntonLV %!s(int64=13) %!d(string=hai) anos
pai
achega
0b4c61f1cb

+ 26 - 0
inc/classes/BxDolFile.php

@@ -47,6 +47,16 @@ class BxDolFile extends BxDol implements iBxDolSingleton {
         return $this->_deleteDirectory($sPath);
     }
 
+	function getPermissions($sPath) {
+    	$sPath = $this->_sPathTo . $sPath;
+    	return $this->_getPermissions($sPath);
+    }
+
+	function setPermissions($sPath, $sMode) {
+    	$sPath = $this->_sPathTo . $sPath;
+    	return $this->_setPermissions($sPath, $sMode);
+    }
+
     protected function _copyFile($sFilePathFrom, $sFilePathTo) {
         if(file_exists($sFilePathTo))
             return true;
@@ -141,6 +151,22 @@ class BxDolFile extends BxDol implements iBxDolSingleton {
     protected function _isDirectory($sFilePath) {
         return preg_match("/^([a-zA-Z0-9@~_\.\\\\\/:-]+)[\\\\\/]([a-zA-Z0-9~_-]+)[\\\\\/]?$/", $sFilePath) ? true : false;
     }
+
+	protected function _getPermissions($sPath) {
+        clearstatcache();
+
+        $hPerms = @fileperms($sPath);
+        if($hPerms == false)
+            return false;
+
+        return substr(decoct($hPerms), -3);
+    }
+
+	protected function _setPermissions($sPath, $sMode) {
+		$aConvert = array('writable' => 0666, 'executable' => 0777);
+
+		return chmod($sPath, $aConvert[$sMode]);
+    }
 }
 
 /** @} */

+ 8 - 1
inc/classes/BxDolFtp.php

@@ -24,7 +24,7 @@ class BxDolFtp extends BxDolFile {
     }
     function connect() {
         $this->_rStream = ftp_connect($this->_sHost);
-        return ftp_login($this->_rStream, $this->_sLogin, $this->_sPassword);
+        return @ftp_login($this->_rStream, $this->_sLogin, $this->_sPassword);
     }
     function isDolphin() {
         return @ftp_size($this->_rStream, $this->_sPathTo . 'inc/header.inc.php') > 0;
@@ -146,5 +146,12 @@ class BxDolFtp extends BxDolFile {
         ftp_chdir($this->_rStream, $sPwd);
         return true;
     }
+	protected function _setPermissions($sPath, $sMode) {
+		$aConvert = array('writable' => 0666, 'executable' => 0777);
 
+    	if(@ftp_chmod($this->_rStream, $aConvert[$sMode], $sPath) === false)
+    		return false;
+
+		return true;
+    }
 }

+ 1 - 0
install/index.php

@@ -98,6 +98,7 @@ define('BX_DIRECTORY_PATH_CACHE_PUBLIC', BX_DIRECTORY_PATH_ROOT . 'cache_public/
 define('BX_DIRECTORY_PATH_CLASSES', BX_DIRECTORY_PATH_ROOT . 'inc/classes/');
 define('BX_DIRECTORY_PATH_PLUGINS', BX_DIRECTORY_PATH_ROOT . 'plugins/');
 define('BX_DIRECTORY_PATH_MODULES', BX_DIRECTORY_PATH_ROOT . 'modules/');
+define('BX_DIRECTORY_PATH_TMP', BX_DIRECTORY_PATH_ROOT . 'tmp/');
 define('BX_DIRECTORY_STORAGE', BX_DIRECTORY_PATH_ROOT . 'storage/');
 
 //--- DB Connection ---//

+ 6 - 4
modules/boonex/english/data/langs/system.xml

@@ -1687,7 +1687,7 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_adm_str_err_zip_not_available"><![CDATA[ZIP library is not available.]]></string>
 	<string name="_adm_str_err_cannot_unzip_package"><![CDATA[Cannot unarchive ZIP package.]]></string>
 	<string name="_adm_str_err_no_ftp_info"><![CDATA[FTP access info was not specified. You may enter it via Settings -> Other.]]></string>
-	<string name="_adm_str_err_cannot_connect_to_ftp"><![CDATA[Cannot connect to FTP server.]]></string>
+	<string name="_adm_str_err_cannot_connect_to_ftp"><![CDATA[Cannot connect to FTP server. Please check FTP access details in Settings -> Other.]]></string>
 	<string name="_adm_str_err_destination_not_valid"><![CDATA[Destination FTP folder doesn't look like a valid Dolphin root folder.]]></string>
 	<string name="_adm_str_err_wrong_package_format"><![CDATA[Wrong package format.]]></string>
 	<string name="_adm_str_err_ftp_copy_failed"><![CDATA[FTP transfer failed, please check write permission for this FTP user.]]></string>
@@ -2498,7 +2498,7 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_adm_err_modules_cannot_connect_to_ftp"><![CDATA[Cannot connect to FTP server]]></string>
 	<string name="_adm_err_modules_cannot_upload_package"><![CDATA[Cannot upload the package]]></string>
 	<string name="_adm_err_modules_cannot_remove_package"><![CDATA[Cannot remove package.]]></string>
-	<string name="_adm_err_modules_process_action_failed"><![CDATA[An error occured. Contact with module\'s vendor]]></string>
+	<string name="_adm_err_modules_process_action_failed"><![CDATA[An error occured. Contact with module's vendor]]></string>
 	<string name="_adm_err_modules_already_uninstalled"><![CDATA[The module was already uninstalled.]]></string>
 	<string name="_adm_err_modules_already_enabled"><![CDATA[The module is already enabled.]]></string>
 	<string name="_adm_err_modules_already_disabled"><![CDATA[The module is already disabled.]]></string>
@@ -2511,7 +2511,8 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_adm_err_modules_wrong_dependency_install"><![CDATA[The following modules should be installed first:]]></string>
 	<string name="_adm_err_modules_wrong_dependency_uninstall"><![CDATA[Failed to uninstall. The module has the following dependent modules. You need to uninstall them first.]]></string>
 	<string name="_adm_err_modules_wrong_dependency_disable"><![CDATA[Failed to disable. The module has the following dependent modules. You need to disable them first.]]></string>
-	<string name="_adm_err_modules_wrong_permissions"><![CDATA[You need to change permissions for the following files and folders:]]></string>
+	<string name="_adm_err_modules_wrong_permissions_check"><![CDATA[You need to change permissions for the following files and folders:]]></string>
+	<string name="_adm_err_modules_wrong_permissions_change"><![CDATA[Unable to change permissions automatically. You need to manually change them for the following files and folders and try again:]]></string>
 	<string name="_adm_err_modules_wrong_permissions_msg"><![CDATA[{0} - {1}]]></string>
 	<string name="_adm_err_modules_wrong_mysql_query"><![CDATA[There are errors in the following MySQL queries:]]></string>
 	<string name="_adm_err_modules_wrong_mysql_query_msg"><![CDATA[Error: {0}]]></string>
@@ -2525,7 +2526,8 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_adm_txt_modules_check_script_version"><![CDATA[Check the Dolphin version for compatibility:]]></string>
 	<string name="_adm_txt_modules_check_dependencies"><![CDATA[Check module dependencies:]]></string>
 	<string name="_adm_txt_modules_show_introduction"><![CDATA[Introduction from vendor:]]></string>
-	<string name="_adm_txt_modules_change_permissions"><![CDATA[Checking permissions:]]></string>
+	<string name="_adm_txt_modules_check_permissions"><![CDATA[Checking permissions:]]></string>
+	<string name="_adm_txt_modules_change_permissions"><![CDATA[Changing permissions:]]></string>
 	<string name="_adm_txt_modules_move_sources"><![CDATA[Move source files:]]></string>
 	<string name="_adm_txt_modules_execute_sql"><![CDATA[Changing database:]]></string>
 	<string name="_adm_txt_modules_install_language"><![CDATA[Install language:]]></string>

+ 60 - 24
studio/classes/BxDolStudioInstaller.php

@@ -87,6 +87,9 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
             'show_introduction' => array(
                 'title' => _t('_adm_txt_modules_show_introduction'),
             ),
+            'check_permissions' => array(
+                'title' => _t('_adm_txt_modules_check_permissions'),
+            ),
             'change_permissions' => array(
                 'title' => _t('_adm_txt_modules_change_permissions'),
             ),
@@ -264,9 +267,9 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
         if(is_array($aDependents) && !empty($aDependents)) {
             $bDependent = true;
 
-            $sMessage = '<br />-- -- ' . _t('_adm_err_modules_wrong_dependency_uninstall') . '<br />';
+            $sMessage = '<br />' . _t('_adm_err_modules_wrong_dependency_uninstall') . '<br />';
             foreach($aDependents as $aDependent)
-                $sMessage .= '-- -- ' . $aDependent['title'] . '<br />';
+                $sMessage .= $aDependent['title'] . '<br />';
         }
 
         if($bDependent)
@@ -397,9 +400,9 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
         if(is_array($aDependents) && !empty($aDependents)) {
             $bDependent = true;
 
-            $sMessage = '<br />-- -- ' . _t('_adm_err_modules_wrong_dependency_disable') . '<br />';
+            $sMessage = '<br />' . _t('_adm_err_modules_wrong_dependency_disable') . '<br />';
             foreach($aDependents as $aDependent)
-                $sMessage .= '-- -- ' . $aDependent['title'] . '<br />';
+                $sMessage .= $aDependent['title'] . '<br />';
         }
 
         if($bDependent)
@@ -472,17 +475,17 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
     }
 
     function _displayResult($sAction, $bResult, $sResult = '') {
-        $sMessage = '-- ' . $this->_aActions[$sAction]['title'] . ' ';
+        $sMessage = $this->_aActions[$sAction]['title'] . ' ';
         if(!empty($sResult) && substr($sResult, 0, 1) == '_')
             $sResult = _t($sResult) . '<br />';
 
         if(!$bResult)
-            return $sMessage . '<span style="color:red; font-weight:bold;">' . $sResult . '</span>';
+            return $sMessage . '<span style="color:red;">' . $sResult . '</span>';
 
         if($bResult && !in_array($sAction, array('show_introduction', 'show_conclusion')) && !$this->_bShowOnSuccess)
             return;
 
-        return $sMessage . '<span style="color:green; font-weight:bold;">' . (!empty($sResult) ? $sResult : _t('_adm_txt_modules_process_action_success') . '<br />') . '</span>';
+        return $sMessage . '<span style="color:green;">' . (!empty($sResult) ? $sResult : _t('_adm_txt_modules_process_action_success') . '<br />') . '</span>';
     }
 
     //--- Action Methods ---//
@@ -498,10 +501,10 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
 
             foreach($this->_aConfig['dependencies'] as $sModuleUri => $sModuleTitle)
                 if(!$this->oDb->isModule($sModuleUri))
-                    $sContent .= '-- -- ' . $sModuleTitle . '<br />';
+                    $sContent .= $sModuleTitle . '<br />';
 
             if(!empty($sContent))
-                $sContent = '<br />-- -- ' . _t('_adm_err_modules_wrong_dependency_install') . '<br />' . $sContent;
+                $sContent = '<br />' . _t('_adm_err_modules_wrong_dependency_install') . '<br />' . $sContent;
         }
 
         return empty($sContent) ? BX_DOL_STUDIO_INSTALLER_SUCCESS : array('code' => BX_DOL_STUDIO_INSTALLER_FAILED, 'content' => $sContent);
@@ -523,7 +526,7 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
         $sPath = $this->_sHomePath . 'install/info/' . $this->_aConfig[$sOperation . '_info']['conclusion'];
         return file_exists($sPath) ? array("code" => BX_DOL_STUDIO_INSTALLER_SUCCESS, "content" => "<pre>" . file_get_contents($sPath) . "</pre>") : BX_DOL_STUDIO_INSTALLER_FAILED;
     }
-    function actionChangePermissions($sOperation) {
+    function actionCheckPermissions($sOperation) {
         if(!isset($this->_aConfig[$sOperation . '_permissions']) || !is_array($this->_aConfig[$sOperation . '_permissions']))
             return BX_DOL_STUDIO_INSTALLER_FAILED;
 
@@ -538,10 +541,44 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
         }
         return empty($aResult) ? BX_DOL_STUDIO_INSTALLER_SUCCESS : array('code' => BX_DOL_STUDIO_INSTALLER_FAILED, 'content' => $aResult);
     }
+    function actionCheckPermissionsFailed($mixedResult) {
+        $sResult = '<br />' . _t('_adm_err_modules_wrong_permissions_check') . '<br />';
+        foreach($mixedResult['content'] as $aFile)
+            $sResult .= _t('_adm_err_modules_wrong_permissions_msg', $aFile['path'], $aFile['permissions']) . '<br />';
+        return $sResult;
+    }
+    function actionChangePermissions($sOperation) {
+        if(!isset($this->_aConfig[$sOperation . '_permissions']) || !is_array($this->_aConfig[$sOperation . '_permissions']))
+            return BX_DOL_STUDIO_INSTALLER_FAILED;
+
+        $oFile = $this->_getFileManager();
+        if(empty($oFile))
+        	return array('code' => BX_DOL_STUDIO_INSTALLER_FAILED);
+
+        $aResult = array();
+        $aPermissions = $this->_aConfig[$sOperation . '_permissions'];
+        foreach($aPermissions as $sPermissions => $aFiles) {
+        	$sCheckFunction = 'is' . ucfirst($sPermissions);
+            foreach($aFiles as $sFile) {
+            	$sPath = str_replace(BX_DIRECTORY_PATH_ROOT, '', $this->_sModulePath . $sFile);
+            	if(BxDolInstallerUtils::$sCheckFunction($sPath))
+            		continue;
+
+            	if(!$oFile->setPermissions($sPath, $sPermissions))
+                    $aResult[] = array('path' => $this->_sModulePath . $sFile, 'permissions' => $sPermissions);
+            }
+        }
+
+        return empty($aResult) ? BX_DOL_STUDIO_INSTALLER_SUCCESS : array('code' => BX_DOL_STUDIO_INSTALLER_FAILED, 'content' => $aResult);
+    }
     function actionChangePermissionsFailed($mixedResult) {
-        $sResult = '<br />-- -- ' . _t('_adm_err_modules_wrong_permissions') . '<br />';
+		if(empty($mixedResult['content']))
+			return $this->actionOperationFailed($mixedResult);
+
+        $sResult = '<br />' . _t('_adm_err_modules_wrong_permissions_change') . '<br />';
         foreach($mixedResult['content'] as $aFile)
-            $sResult .= '-- -- ' . _t('_adm_err_modules_wrong_permissions_msg', $aFile['path'], $aFile['permissions']) . '<br />';
+            $sResult .= _t('_adm_err_modules_wrong_permissions_msg', $aFile['path'], $aFile['permissions']) . '<br />';
+
         return $sResult;
     }
     function actionMoveSources($sOperation) {
@@ -614,9 +651,9 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
         return empty($aResult) ? BX_DOL_STUDIO_INSTALLER_SUCCESS : array('code' => BX_DOL_STUDIO_INSTALLER_FAILED, 'content' => $aResult);
     }
     function actionExecuteSqlFailed($mixedResult) {
-        $sResult = '<br />-- -- ' . _t('_adm_err_modules_wrong_mysql_query') . '<br />';
+        $sResult = '<br />' . _t('_adm_err_modules_wrong_mysql_query') . '<br />';
         foreach($mixedResult['content'] as $aQuery) {
-            $sResult .= '-- -- ' . _t('_adm_err_modules_wrong_mysql_query_msg', $aQuery['error']) . '<br />';
+            $sResult .= _t('_adm_err_modules_wrong_mysql_query_msg', $aQuery['error']) . '<br />';
             $sResult .= '<pre>' . $aQuery['query'] . '</pre>';
         }
         return $sResult;
@@ -792,19 +829,18 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
     }
 
     //--- Protected methods ---//
-    protected function _getPermissions($sFilePath) {
-        clearstatcache();
-        $hPerms = @fileperms($sFilePath);
-        if($hPerms == false)
-            return false;
-        return substr( decoct( $hPerms ), -3 );
-    }
-    protected function _getFileManager($bUseFtp = false) {
+    protected function _getFileManager($bUseFtp = true) {
         $oFile = null;
 
         if($bUseFtp) {
-            bx_import('BxDolFtp');
-            $oFile = new BxDolFtp(BX_DOL_URL_ROOT, $this->oDb->getParam('sys_ftp_login'), $this->oDb->getParam('sys_ftp_password'), $this->oDb->getParam('sys_ftp_dir'));
+        	bx_import('BxDolFtp');
+			$oFile = new BxDolFtp($_SERVER['HTTP_HOST'], $this->oDb->getParam('sys_ftp_login'), $this->oDb->getParam('sys_ftp_password'), $this->oDb->getParam('sys_ftp_dir'));
+
+			if(!$oFile->connect())
+				return null;
+
+			if(!$oFile->isDolphin())
+				return null;
         }
         else {
             bx_import('BxDolFile');