navBar = array(__CLASS__, 'Authenticator_safe');
Typecho_Plugin::factory('admin/common.php')->begin = array(__CLASS__, 'Authenticator_verification');
return _t('当前两步验证还未启用,请进行初始化设置');
}
/**
* 禁用插件方法,如果禁用失败,直接抛出异常
*
* @static
* @access public
* @return void
* @throws Typecho_Plugin_Exception
*/
public static function deactivate(){
Helper::removeRoute('GAuthenticator');
}
/**
* 获取插件配置面板
*
* @access public
* @param Typecho_Widget_Helper_Form $form 配置面板
* @return void'
*/
public static function config(Typecho_Widget_Helper_Form $form)
{
$qrurl = 'otpauth://totp/'.urlencode(Helper::options()->title.':'.Typecho_Widget::widget('Widget_User')->mail).'?secret=';
$element = new Typecho_Widget_Helper_Form_Element_Text('SecretKey', NULL, '', _t('SecretKey'), '
安装的时候自动计算密钥,手动修改无效,如需要修改请卸载重新安装或者手动修改数据库
');
$form->addInput($element);
$element = new Typecho_Widget_Helper_Form_Element_Text('SecretQRurl', NULL, '', _t('二维码的网址'), '本选项已过时,保留只是为了向下兼容。和上面图片的地址是相同的');
$form->addInput($element);
$element = new Typecho_Widget_Helper_Form_Element_Text('SecretTime', NULL, 2, _t('容差时间'), '允许的容差时间,单位为30秒的倍数,如果这里是2 那么就是 2* 30 sec 一分钟.');
$form->addInput($element);
$element = new Typecho_Widget_Helper_Form_Element_Text('SecretCode', NULL, '', _t('客户端代码'), '输入你APP或者其他什么鬼上面显示的六位数字。
用兼容的APP上面的扫描二维码或者手动输入第一行的SecretKey即可生成');
$form->addInput($element);
$element = new Typecho_Widget_Helper_Form_Element_Radio('SecretOn', array('1' => '开启','0' => '关闭'), 0, _t('插件开关'), '这里关掉了,就不需要验证即可登录。');
$form->addInput($element);
}
/**
* 手动保存配置面板
* @param $config array 插件配置
* @param $is_init bool 是否初始化
*/
public static function configHandle($config, $is_init)
{
if ($is_init) {//如果是第一次初始化插件
require_once 'GoogleAuthenticator.php';
$Authenticator = new PHPGangsta_GoogleAuthenticator();//初始化生成类
$config['SecretKey'] = $Authenticator->createSecret();//生成一个随机安全密钥
$config['SecretQRurl'] = 'http://qr.liantu.com/api.php?text='.urlencode('otpauth://totp/'.urlencode(Helper::options()->title.':'.Typecho_Widget::widget('Widget_User')->mail).'?secret='.$config['SecretKey']);//生成安全密钥的二维码网址
}else{
$config_old = Helper::options()->plugin(self::$pluginName);
if(($config['SecretCode']!='' && $config['SecretOn']==1) || $config['SecretOn']==1){//如果启用,并且验证码不为空
require_once 'GoogleAuthenticator.php';
$Authenticator = new PHPGangsta_GoogleAuthenticator();
if($Authenticator->verifyCode($config['SecretKey'], $config['SecretCode'], $config['SecretTime'])){
$config['SecretOn'] = 1;//如果匹配,则启用
}else{
throw new Typecho_Plugin_Exception('两步验证代码校验失败,请重试或选择关闭');
}
}
$config['SecretKey'] = $config_old->SecretKey;//保持初始化SecretKey不被修改
$config['SecretQRurl'] = $config_old->SecretQRurl;//保持初始化SecretQRurl不被修改 过时选项 兼容保留
}
$config['SecretCode'] = '';//每次保存不保存验证码
Helper::configPlugin(self::$pluginName, $config);//保存插件配置
}
/**
* 个人用户的配置面板
*
* @access public
* @param Typecho_Widget_Helper_Form $form
* @return void
*/
public static function personalConfig(Typecho_Widget_Helper_Form $form){}
/**
* 插件实现方法
*
* @access public
* @return void
*/
public static function Authenticator_safe()
{
$config = Helper::options()->plugin(self::$pluginName);
if($config->SecretOn==1){
echo ''.htmlspecialchars('已启用 Authenticator 验证').'';
}else{
echo ''.htmlspecialchars('未启用 Authenticator 验证').'';
}
}
public static function Authenticator_verification()
{
if(isset($Authenticator_init))return;
$Authenticator_init = true;
if (!Typecho_Widget::widget('Widget_User')->hasLogin()){
return;//如果没登录则直接返回
}else{
//已经登录就验证
$config = Helper::options()->plugin(self::$pluginName);
if (isset($_SESSION['GAuthenticator'])&&$_SESSION['GAuthenticator']) return;//如果SESSION匹配则直接返回
if (Typecho_Cookie::get('__typecho_GAuthenticator') == md5($config->SecretKey.Typecho_Cookie::getPrefix().Typecho_Widget::widget('Widget_User')->uid)) return;//如果COOKIE匹配则直接返回
if($config->SecretOn==1){
$options = Helper::options();
$request = new Typecho_Request();
require_once 'verification.php';
}else{
return;//如果未开启插件则直接返回
}
}
}
}