123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <?php
- /**
- * GiiModule class file.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @link http://www.yiiframework.com/
- * @copyright 2008-2013 Yii Software LLC
- * @license http://www.yiiframework.com/license/
- */
- Yii::import('system.gii.CCodeGenerator');
- Yii::import('system.gii.CCodeModel');
- Yii::import('system.gii.CCodeFile');
- Yii::import('system.gii.CCodeForm');
- /**
- * GiiModule is a module that provides Web-based code generation capabilities.
- *
- * To use GiiModule, you must include it as a module in the application configuration like the following:
- * <pre>
- * return array(
- * ......
- * 'modules'=>array(
- * 'gii'=>array(
- * 'class'=>'system.gii.GiiModule',
- * 'password'=>***choose a password***
- * ),
- * ),
- * )
- * </pre>
- *
- * Because GiiModule generates new code files on the server, you should only use it on your own
- * development machine. To prevent other people from using this module, it is required that
- * you specify a secret password in the configuration. Later when you access
- * the module via browser, you will be prompted to enter the correct password.
- *
- * By default, GiiModule can only be accessed by localhost. You may configure its {@link ipFilters}
- * property if you want to make it accessible on other machines.
- *
- * With the above configuration, you will be able to access GiiModule in your browser using
- * the following URL:
- *
- * http://localhost/path/to/index.php?r=gii
- *
- * If your application is using path-format URLs with some customized URL rules, you may need to add
- * the following URLs in your application configuration in order to access GiiModule:
- * <pre>
- * 'components'=>array(
- * 'urlManager'=>array(
- * 'urlFormat'=>'path',
- * 'rules'=>array(
- * 'gii'=>'gii',
- * 'gii/<controller:\w+>'=>'gii/<controller>',
- * 'gii/<controller:\w+>/<action:\w+>'=>'gii/<controller>/<action>',
- * ...other rules...
- * ),
- * )
- * )
- * </pre>
- *
- * You can then access GiiModule via:
- *
- * http://localhost/path/to/index.php/gii
- *
- * @property string $assetsUrl The base URL that contains all published asset files of gii.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package system.gii
- * @since 1.1.2
- */
- class GiiModule extends CWebModule
- {
- /**
- * @var string the password that can be used to access GiiModule.
- * If this property is set false, then GiiModule can be accessed without password
- * (DO NOT DO THIS UNLESS YOU KNOW THE CONSEQUENCE!!!)
- */
- public $password;
- /**
- * @var array the IP filters that specify which IP addresses are allowed to access GiiModule.
- * Each array element represents a single filter. A filter can be either an IP address
- * or an address with wildcard (e.g. 192.168.0.*) to represent a network segment.
- * If you want to allow all IPs to access gii, you may set this property to be false
- * (DO NOT DO THIS UNLESS YOU KNOW THE CONSEQUENCE!!!)
- * The default value is array('127.0.0.1', '::1'), which means GiiModule can only be accessed
- * on the localhost.
- */
- public $ipFilters=array('127.0.0.1','::1');
- /**
- * @var array a list of path aliases that refer to the directories containing code generators.
- * The directory referred by a single path alias may contain multiple code generators, each stored
- * under a sub-directory whose name is the generator name.
- * Defaults to array('application.gii').
- */
- public $generatorPaths=array('application.gii');
- /**
- * @var integer the permission to be set for newly generated code files.
- * This value will be used by PHP chmod function.
- * Defaults to 0666, meaning the file is read-writable by all users.
- */
- public $newFileMode=0666;
- /**
- * @var integer the permission to be set for newly generated directories.
- * This value will be used by PHP chmod function.
- * Defaults to 0777, meaning the directory can be read, written and executed by all users.
- */
- public $newDirMode=0777;
- private $_assetsUrl;
- /**
- * Initializes the gii module.
- */
- public function init()
- {
- parent::init();
- Yii::setPathOfAlias('gii',dirname(__FILE__));
- Yii::app()->setComponents(array(
- 'errorHandler'=>array(
- 'class'=>'CErrorHandler',
- 'errorAction'=>$this->getId().'/default/error',
- ),
- 'user'=>array(
- 'class'=>'CWebUser',
- 'stateKeyPrefix'=>'gii',
- 'loginUrl'=>Yii::app()->createUrl($this->getId().'/default/login'),
- ),
- 'widgetFactory' => array(
- 'class'=>'CWidgetFactory',
- 'widgets' => array()
- )
- ), false);
- $this->generatorPaths[]='gii.generators';
- $this->controllerMap=$this->findGenerators();
- }
- /**
- * @return string the base URL that contains all published asset files of gii.
- */
- public function getAssetsUrl()
- {
- if($this->_assetsUrl===null)
- $this->_assetsUrl=Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('gii.assets'));
- return $this->_assetsUrl;
- }
- /**
- * @param string $value the base URL that contains all published asset files of gii.
- */
- public function setAssetsUrl($value)
- {
- $this->_assetsUrl=$value;
- }
- /**
- * Performs access check to gii.
- * This method will check to see if user IP and password are correct if they attempt
- * to access actions other than "default/login" and "default/error".
- * @param CController $controller the controller to be accessed.
- * @param CAction $action the action to be accessed.
- * @throws CHttpException if access denied
- * @return boolean whether the action should be executed.
- */
- public function beforeControllerAction($controller, $action)
- {
- if(parent::beforeControllerAction($controller, $action))
- {
- $route=$controller->id.'/'.$action->id;
- if(!$this->allowIp(Yii::app()->request->userHostAddress) && $route!=='default/error')
- throw new CHttpException(403,"You are not allowed to access this page.");
- $publicPages=array(
- 'default/login',
- 'default/error',
- );
- if($this->password!==false && Yii::app()->user->isGuest && !in_array($route,$publicPages))
- Yii::app()->user->loginRequired();
- else
- return true;
- }
- return false;
- }
- /**
- * Checks to see if the user IP is allowed by {@link ipFilters}.
- * @param string $ip the user IP
- * @return boolean whether the user IP is allowed by {@link ipFilters}.
- */
- protected function allowIp($ip)
- {
- if(empty($this->ipFilters))
- return true;
- foreach($this->ipFilters as $filter)
- {
- if($filter==='*' || $filter===$ip || (($pos=strpos($filter,'*'))!==false && !strncmp($ip,$filter,$pos)))
- return true;
- }
- return false;
- }
- /**
- * Finds all available code generators and their code templates.
- * @return array
- */
- protected function findGenerators()
- {
- $generators=array();
- $n=count($this->generatorPaths);
- for($i=$n-1;$i>=0;--$i)
- {
- $alias=$this->generatorPaths[$i];
- $path=Yii::getPathOfAlias($alias);
- if($path===false || !is_dir($path))
- continue;
- $names=scandir($path);
- foreach($names as $name)
- {
- if($name[0]!=='.' && is_dir($path.'/'.$name))
- {
- $className=ucfirst($name).'Generator';
- if(is_file("$path/$name/$className.php"))
- {
- $generators[$name]=array(
- 'class'=>"$alias.$name.$className",
- );
- }
- if(isset($generators[$name]) && is_dir("$path/$name/templates"))
- {
- $templatePath="$path/$name/templates";
- $dirs=scandir($templatePath);
- foreach($dirs as $dir)
- {
- if($dir[0]!=='.' && is_dir($templatePath.'/'.$dir))
- $generators[$name]['templates'][$dir]=strtr($templatePath.'/'.$dir,array('/'=>DIRECTORY_SEPARATOR,'\\'=>DIRECTORY_SEPARATOR));
- }
- }
- }
- }
- }
- return $generators;
- }
- }
|