Your IP : 216.73.216.68


Current Path : /home/sunflowe/www2/j15/administrator/components/com_akeeba/akeeba/utils/
Upload File :
Current File : /home/sunflowe/www2/j15/administrator/components/com_akeeba/akeeba/utils/securesettings.php

<?php
/**
 * @package AkeebaBackup
 * @copyright Copyright (c)2009-2012 Nicholas K. Dionysopoulos
 * @license GNU General Public License version 3, or later
 * @version $Id$
 * @since 3.2
 */

// Protection against direct access
defined('AKEEBAENGINE') or die('Restricted access');

/**
 * Implements encrypted settings handling features
 * @author nicholas
 */
class AEUtilSecuresettings
{
	/**
	 * Gets the configured server key, automatically loading the server key storage file
	 * if required.
	 * @return string
	 */
	public static function getKey()
	{
		if(defined('AKEEBA_SERVERKEY')) return base64_decode(AKEEBA_SERVERKEY);
		
		$filename = dirname(__FILE__).'/../serverkey.php';
		if(file_exists($filename)) {
			include_once $filename;
		}

		if(!defined('AKEEBA_SERVERKEY')) {
			define('AKEEBA_SERVERKEY', base64_encode(''));	
		}
		
		return base64_decode(AKEEBA_SERVERKEY);
	}
	
	/**
	 * Do the server options allow us to use settings encryption?
	 * @return bool
	 */
	public static function supportsEncryption()
	{
		// Do we have the encypt.php plugin?
		$filename = dirname(__FILE__).'/../utils/encrypt.php';
		if(!file_exists($filename)) return false;
		
		// Did the user intentionally disable settings encryption?
		$useEncryption = AEPlatform::getInstance()->get_platform_configuration_option('useencryption', -1);
		if($useEncryption == 0) return false;
		
		// Do we have base64_encode/_decode required for encryption?
		if(!function_exists('base64_encode') || !function_exists('base64_decode')) return false;
		
		// Pre-requisites met. We can encrypt and decrypt!
		return true;
	}
	
	/**
	 * Gets the preferred encryption mode. Currently, if mcrypt is installed and activated we will
	 * use AES128.
	 * @return string
	 */
	public static function preferredEncryption()
	{
		if(function_exists('mcrypt_module_open')) {
			return 'AES128';
		} else {
			return 'CTR128';
		}
	}
	
	/**
	 * Encrypts the settings using the automatically detected preferred algorithm
	 * @param $settingsINI string The raw settings INI string
	 * @return string The encrypted data to store in the database
	 */
	public static function encryptSettings($settingsINI, $key = null)
	{
		// Do we really support encryption?
		if(!self::supportsEncryption()) return $settingsINI;
		// Does any of the preferred encryption engines exist?
		$encryption = self::preferredEncryption();
		if(empty($encryption)) return $settingsINI;
		// Do we have a non-empty key to begin with?
		if(empty($key))	$key = self::getKey();
		if(empty($key)) return $settingsINI;
		
		if($encryption == 'AES128') {
			$encrypted = AEUtilEncrypt::AESEncryptCBC($settingsINI, $key, 128);
			if(empty($encrypted)) {
				$encryption = 'CTR128';
			} else {
				// Note: CBC returns the encrypted data as a binary string and requires Base 64 encoding
				$settingsINI = '###AES128###'.base64_encode($encrypted);
			}
		}
		
		if($encryption == 'CTR128') {
			$encrypted = AEUtilEncrypt::AESEncryptCtr($settingsINI, $key, 128);
			if(empty($encrypted)) {
				$encryption = '';
			} else {
				// Note: CTR returns the encrypted data readily encoded in Base 64 
				$settingsINI = '###CTR128###'.$encrypted;
			}
		}
		
		return $settingsINI;
	}
	
	/**
	 * Decrypts the encrypted settings and returns the plaintext INI string
	 * @param $encrypted string The encrypted data
	 * @return string The decrypted data
	 */
	public static function decryptSettings($encrypted, $key = null)
	{
		if(substr($encrypted, 0, 12) == '###AES128###') {
			$mode = 'AES128';
		} elseif(substr($encrypted, 0, 12) == '###CTR128###') {
			$mode = 'CTR128';
		} else {
			return $encrypted;
		}
		
		if(empty($key))	$key = self::getKey();
		
		$encrypted = substr($encrypted, 12);
		switch($mode) {
			case 'AES128':
				$encrypted = base64_decode($encrypted);
				$decrypted = AEUtilEncrypt::AESDecryptCBC($encrypted, $key, 128);
				break;
				
			case 'CTR128':
				$decrypted = AEUtilEncrypt::AESDecryptCtr($encrypted, $key, 128);
				break;
		}
		
		return $decrypted;
	}
	
}