123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: function_seccode.php 33661 2013-07-29 08:18:34Z nemohou $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class helper_seccheck {
- private function _check($type) {
- global $_G;
- if(!isset($_G['cookie']['sec'.$type])) {
- return false;
- }
- list($ssid, $sign) = explode('.', $_G['cookie']['sec'.$type]);
- if($sign != substr(md5($ssid.$_G['uid'].$_G['authkey']), 8, 18)) {
- return false;
- }
- $seccheck = C::t('common_seccheck')->fetch($ssid);
- if(!$seccheck) {
- return false;
- }
- if(TIMESTAMP - $seccheck['dateline'] > 600 || $seccheck['verified'] > 4) {
- C::t('common_seccheck')->delete_expiration($ssid);
- return false;
- }
- return $seccheck;
- }
- function _create($type, $code = '') {
- global $_G;
- $ssid = C::t('common_seccheck')->insert(array(
- 'dateline' => TIMESTAMP,
- 'code' => $code,
- 'succeed' => 0,
- 'verified' => 0,
- ), true);
- dsetcookie('sec'.$type, $ssid.'.'.substr(md5($ssid.$_G['uid'].$_G['authkey']), 8, 18));
- }
- public static function make_seccode($seccode = ''){
- global $_G;
- if(!$seccode) {
- $seccode = random(6, 1);
- $seccodeunits = '';
- if($_G['setting']['seccodedata']['type'] == 1) {
- $lang = lang('seccode');
- $len = strtoupper(CHARSET) == 'GBK' ? 2 : 3;
- $code = array(substr($seccode, 0, 3), substr($seccode, 3, 3));
- $seccode = '';
- for($i = 0; $i < 2; $i++) {
- $seccode .= substr($lang['chn'], $code[$i] * $len, $len);
- }
- } elseif($_G['setting']['seccodedata']['type'] == 3) {
- $s = sprintf('%04s', base_convert($seccode, 10, 20));
- $seccodeunits = 'CEFHKLMNOPQRSTUVWXYZ';
- } else {
- $s = sprintf('%04s', base_convert($seccode, 10, 24));
- $seccodeunits = 'BCEFGHJKMPQRTVWXY2346789';
- }
- if($seccodeunits) {
- $seccode = '';
- for($i = 0; $i < 4; $i++) {
- $unit = ord($s{$i});
- $seccode .= ($unit >= 0x30 && $unit <= 0x39) ? $seccodeunits[$unit - 0x30] : $seccodeunits[$unit - 0x57];
- }
- }
- }
- self::_create('code', $seccode);
- return $seccode;
- }
- public static function make_secqaa() {
- global $_G;
- loadcache('secqaa');
- $secqaakey = max(1, random(1, 1));
- if($_G['cache']['secqaa'][$secqaakey]['type']) {
- $etype = explode(':', $_G['cache']['secqaa'][$secqaakey]['question']);
- if(count($etype) > 1) {
- if(!preg_match('/^\w+$/', $etype[0]) || !preg_match('/^\w+$/', $etype[1])) {
- return;
- }
- $qaafile = DISCUZ_ROOT.'./source/plugin/'.$etype[0].'/secqaa/secqaa_'.$etype[1].'.php';
- $class = $etype[1];
- } else {
- if(!preg_match('/^\w+$/', $_G['cache']['secqaa'][$secqaakey]['question'])) {
- return;
- }
- $qaafile = libfile('secqaa/'.$_G['cache']['secqaa'][$secqaakey]['question'], 'class');
- $class = $_G['cache']['secqaa'][$secqaakey]['question'];
- }
- if(file_exists($qaafile)) {
- @include_once $qaafile;
- $class = 'secqaa_'.$class;
- if(class_exists($class)) {
- $qaa = new $class();
- if(method_exists($qaa, 'make')) {
- $_G['cache']['secqaa'][$secqaakey]['answer'] = md5($qaa->make($_G['cache']['secqaa'][$secqaakey]['question']));
- }
- }
- }
- }
- self::_create('qaa', substr($_G['cache']['secqaa'][$secqaakey]['answer'], 0, 6));
- return $_G['cache']['secqaa'][$secqaakey]['question'];
- }
- public static function check_seccode($value, $idhash, $fromjs = 0, $modid = '') {
- global $_G;
- if(!$_G['setting']['seccodestatus']) {
- return true;
- }
- $seccheck = self::_check('code');
- if(!$seccheck) {
- return false;
- }
- $ssid = $seccheck['ssid'];
- if(!is_numeric($_G['setting']['seccodedata']['type'])) {
- $etype = explode(':', $_G['setting']['seccodedata']['type']);
- if(count($etype) > 1) {
- if(!preg_match('/^\w+$/', $etype[0]) || !preg_match('/^\w+$/', $etype[1])) {
- return false;
- }
- $codefile = DISCUZ_ROOT.'./source/plugin/'.$etype[0].'/seccode/seccode_'.$etype[1].'.php';
- $class = $etype[1];
- } else {
- if(!preg_match('/^\w+$/', $_G['setting']['seccodedata']['type'])) {
- return false;
- }
- $codefile = libfile('seccode/'.$_G['setting']['seccodedata']['type'], 'class');
- $class = $_G['setting']['seccodedata']['type'];
- }
- if(file_exists($codefile)) {
- @include_once $codefile;
- $class = 'seccode_'.$class;
- if(class_exists($class)) {
- $code = new $class();
- if(method_exists($code, 'check')) {
- $return = $code->check($value, $idhash, $seccheck, $fromjs, $modid);
- }
- }
- } else {
- $return = false;
- }
- } else {
- $return = $seccheck['code'] == strtoupper($value);
- }
- if($return) {
- C::t('common_seccheck')->update_succeed($ssid);
- } else {
- C::t('common_seccheck')->update_verified($ssid);
- }
- return $return;
- }
- public static function check_secqaa($value, $idhash) {
- global $_G;
- if(!$_G['setting']['secqaa']) {
- return true;
- }
- $seccheck = self::_check('qaa');
- if(!$seccheck) {
- return false;
- }
- $ssid = $seccheck['ssid'];
- $return = $seccheck['code'] == substr(md5($value), 0, 6);
- if($return) {
- C::t('common_seccheck')->update_succeed($ssid);
- } else {
- C::t('common_seccheck')->update_verified($ssid);
- }
- return $return;
- }
- public static function rule_register() {
- global $_G;
- $seccheckrule = & $_G['setting']['seccodedata']['rule']['register'];
- if($seccheckrule['allow'] == 1) {
- $seccode = true;
- } elseif($seccheckrule['allow'] == 2) {
- if($seccheckrule['numlimit'] > 0) {
- loadcache('seccodedata', true);
- if($_G['cache']['seccodedata']['register']['show']) {
- $seccode = true;
- } else {
- $regnumber = C::t('common_member')->count_by_regdate(TIMESTAMP - $seccheckrule['timelimit']);
- if($regnumber >= $seccheckrule['numlimit']) {
- $seccode = true;
- $_G['cache']['seccodedata']['register']['show'] = 1;
- savecache('seccodedata', $_G['cache']['seccodedata']);
- }
- }
- }
- } else {
- $seccode = false;
- }
- return array(
- $seccode,
- $_G['setting']['secqaa']['status'] & 1
- );
- }
- public static function rule_login() {
- global $_G;
- $seccheckrule = & $_G['setting']['seccodedata']['rule']['login'];
- if($seccheckrule['allow'] == 1) {
- $seccode = true;
- } elseif($seccheckrule['allow'] == 2) {
- $seccode = false;
- } else {
- $seccode = false;
- }
- return array($seccode);
- }
- public static function rule_post($action) {
- global $_G;
- $seccheckrule = & $_G['setting']['seccodedata']['rule']['post'];
- if($seccheckrule['allow'] == 1) {
- $seccode = !$_G['setting']['seccodedata']['minposts'] || getuserprofile('posts') < $_G['setting']['seccodedata']['minposts'];
- } elseif($seccheckrule['allow'] == 2) {
- if(C::t('common_member_secwhite')->check($_G['uid'])) {
- $seccode = false;
- } else {
- $seccode = getuserprofile('posts') < $_G['setting']['seccodedata']['minposts'];
- if(!$seccode && $seccheckrule['numlimit']) {
- $count = C::t('forum_post')->count_by_search('pid:0', null, null, null, null, $_G['uid'], null, TIMESTAMP - $seccheckrule['timelimit']);
- $seccode = $seccheckrule['numlimit'] <= $count;
- }
- if($action == 'newthread' && !$seccode && !empty($_POST) && $seccheckrule['nplimit']) {
- if(!$_G['cookie']['st_t']) {
- $seccode = true;
- } else {
- list($uid, $t, $hash) = explode('|', $_G['cookie']['st_t']);
- list($t, $m) = explode(',', $t);
- if(md5($uid.'|'.$t.$_G['config']['security']['authkey']) == $hash && !$m) {
- if(TIMESTAMP - $t <= $seccheckrule['nplimit']) {
- $seccode = true;
- } else {
- $seccode = false;
- }
- } else {
- $seccode = true;
- }
- }
- }
- if($action == 'reply' && !$seccode && !empty($_POST) && $seccheckrule['vplimit']) {
- if(!$_G['cookie']['st_p']) {
- $seccode = true;
- } else {
- list($uid, $t, $hash) = explode('|', $_G['cookie']['st_p']);
- list($t, $m) = explode(',', $t);
- if(md5($uid.'|'.$t.$_G['config']['security']['authkey']) == $hash && !$m) {
- if(TIMESTAMP - $t <= $seccheckrule['vplimit']) {
- $seccode = true;
- } else {
- $seccode = false;
- }
- } else {
- $seccode = true;
- }
- }
- }
- }
- } else {
- $seccode = false;
- }
- return array(
- $seccode,
- $_G['setting']['secqaa']['status'] & 2 && (!$_G['setting']['secqaa']['minposts'] || getuserprofile('posts') < $_G['setting']['secqaa']['minposts'])
- );
- }
- public static function rule_publish($rule) {
- global $_G;
- $seccheckrule = & $_G['setting']['seccodedata']['rule']['post'];
- return array(
- $seccheckrule['allow'] && (!$_G['setting']['seccodedata']['minposts'] || getuserprofile('posts') < $_G['setting']['seccodedata']['minposts']),
- $_G['setting']['secqaa']['status'] & 2 && (!$_G['setting']['secqaa']['minposts'] || getuserprofile('posts') < $_G['setting']['secqaa']['minposts'])
- );
- }
- public static function rule_password($rule) {
- global $_G;
- $seccheckrule = & $_G['setting']['seccodedata']['rule']['password'];
- return array(
- $seccheckrule['allow'] && (!$_G['setting']['seccodedata']['minposts'] || getuserprofile('posts') < $_G['setting']['seccodedata']['minposts']),
- $_G['setting']['secqaa']['status'] & 4 && (!$_G['setting']['seccodedata']['minposts'] || getuserprofile('posts') < $_G['setting']['seccodedata']['minposts'])
- );
- }
- public static function rule_card() {
- global $_G;
- $seccheckrule = & $_G['setting']['seccodedata']['rule']['card'];
- return array($seccheckrule['allow']);
- }
- public static function seccheck($rule, $param = array()) {
- global $_G;
- if($_G['uid'] && !checkperm('seccode')) {
- return array();
- }
- if(method_exists('helper_seccheck', 'rule_'.$rule)) {
- $return = call_user_func(array('helper_seccheck', 'rule_'.$rule), $param);
- if(!isset($_G['cookie']['seccloud'])) {
- if($_G['setting']['seccodedata']['cloudip'] && !$return[0]) {
- $return[0] = captcha::isneed();
- if($return[0]) {
- dsetcookie('seccloud', 1);
- }
- }
- } else {
- $return[0] = true;
- }
- return $return;
- } else {
- return array();
- }
- }
- }
- ?>
|