| 
<?
/**
 * Encryption class
 *
 * @package Encryption
 * @author Ewg
 * @category Security
 * @todo Multi file
 */
 class Encryption
 {
 /**
 * File content
 * @var String
 */
 public $content;
 
 /**
 * File content not changed
 * @var String
 */
 public $content_source;
 
 /**
 * All varibles
 * @var Array|String
 */
 public $vars = array ();
 
 /**
 * Chains of varibles
 * @example "class name" <=> "352=>array (370, 307)"
 * @var Array
 */
 private $chains = array (
 352=>array (370, 307), // class
 347=> array (370, 309), // var
 341=>array (370, 309), // public
 343=>array (370, 309), // private
 342=>array (370, 309), // protected
 299=>array (370, 307) // new
 );
 
 /**
 * Forbidden for replace strings
 * @var Array
 */
 private $forbidden = array ('Exception', '$this');
 
 /**
 * a..z
 * @var Array
 */
 public $abc = array ();
 
 /**
 * Address of source file
 * @var String
 */
 public $file_source;
 
 /**
 * Class activation
 */
 public function __construct ()
 {
 if (empty ($this->abc))
 {
 $this->abc = range (a, z);
 }
 }
 
 /**
 * Parse activation
 * @param String $file_source
 * @return Object $this
 */
 public function parse ($file_source)
 {
 $this->content_source = file_get_contents($this->file_source = $file_source);
 $this->content = token_get_all ($this->content_source);
 foreach ($this->content as $key=>$value)
 {
 if(is_array ($value))
 {
 $this->content[$key]['2'] = token_name($value['0']);
 if (isset ($chain))
 {
 if (is_array ($chain))
 {
 if ($this->chains[$chainid][$i]===$chain['0'])
 {
 $i++;
 $chain = array ($this->chains[$chainid][$i]);
 }
 else
 {
 unset ($chain);
 }
 }
 else
 {
 $chainid = $chain;
 $i = 0;
 $end = end ($this->chains[$chainid]);
 $chain = array (reset ($this->chains[$chain]));
 }
 
 if ($end===$chain['0'])
 {
 if ($value['0']===$chain['0'])
 {
 $this->add ($value['1'], $value['0']);
 }
 unset ($chain);
 }
 }
 else
 {
 if (array_key_exists ($value['0'], $this->chains))
 {
 $chain = $value['0'];
 }
 else
 {
 if ($value['0']===309)
 {
 $this->add ($value['1'], 309);
 }
 }
 }
 }
 }
 return $this;
 }
 
 /**
 * Add varible to action
 * @param String $id
 * @param Int $type
 */
 public function add ($id, $type = false)
 {
 if (!in_array ($id, $this->vars) and !(in_array ($id, $this->forbidden)))
 {
 if ($type===307)
 {
 $type = false;
 }
 $this->vars[] = array ($id, $type);
 }
 }
 
 /**
 * Main action - code
 * @param String $file
 * @return Json vars
 */
 public function codeit ($file)
 {
 foreach ($this->vars as $key=>$value)
 {
 $temp[$value['0']] = ($value['1']? '$': '').$this->gen_name ();
 }
 $this->content_source = strtr ($this->content_source, $temp);
 file_put_contents($file, $this->content_source);
 return $this->vars = json_encode(array ($this->file_source=>$temp));
 }
 
 /**
 * Generate unique name
 * @return String
 */
 private function gen_name ()
 {
 return $this->abc[rand (0, 25)].$this->abc[rand (0, 25)].str_repeat('_', rand (2, 15)).$this->abc[rand (0, 25)];
 }
 }
 |