123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: wechat.class.php 36284 2016-12-12 00:47:50Z nemohou $
- */
- if (!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class plugin_wechat {
- function plugin_wechat() {
- include_once template('wechat:module');
- }
- function common() {
- global $_G;
- if(!$_G['wechat']['setting']) {
- $_G['wechat']['setting'] = unserialize($_G['setting']['mobilewechat']);
- }
- if($_G['uid']) {
- if($_G['wechat']['setting']['wechat_qrtype']) {
- $_G['wechatuser'] = C::t('#wechat#common_member_wechatmp')->fetch($_G['uid']);
- if($_G['wechatuser'] && !$_G['wechatuser']['status']) {
- $_G['wechatuser']['isregister'] = 1;
- }
- } else {
- $_G['wechatuser'] = C::t('#wechat#common_member_wechat')->fetch($_G['uid']);
- }
- if($_G['wechatuser'] && $wechatuser['status'] == 1) {
- C::t('#wechat#common_member_wechat')->update($_G['uid'], array('status' => 0));
- require_once libfile('function/member');
- clearcookies();
- }
- }
- if(!$_G['uid'] && !defined('IN_MOBILE') && $_G['wechat']['setting']['wsq_allow']) {
- $_G['setting']['pluginhooks']['global_login_text'] .= wechat_tpl_login_bar();
- }
- $_G['Plang'] = $_G['setting']['wechatviewpluginid'] ? lang('plugin/'.$_G['setting']['wechatviewpluginid']) : array();
- if(!$_G['Plang'] || !$_G['wechatuser']) {
- unset($_G['setting']['plugins']['spacecp']['wechat:spacecp']);
- }
- }
- function deletemember($param) {
- $uids = $param['param'][0];
- $step = $param['step'];
- if ($step == 'check' && $uids && is_array($uids)) {
- foreach($uids as $uid) {
- C::t('#wechat#common_member_wechat')->delete($uid);
- }
- }
- }
- function global_login_extra() {
- global $_G;
- if(!$_G['Plang'] || $_G['inshowmessage'] || !$_G['wechat']['setting']['wsq_allow']) {
- return;
- }
- return wechat_tpl_login_extra_bar();
- }
- function global_usernav_extra1() {
- global $_G;
- if(!$_G['Plang'] || $_G['wechatuser'] || !$_G['wechat']['setting']['wsq_allow'] || !$_G['uid']) {
- return;
- }
- return wechat_tpl_user_bar();
- }
- function global_footer() {
- global $_G;
- if($_G['wechat']['setting']['wechat_float_qrcode'] && $_G['wechat']['setting']['wsq_siteid'] && $_G['wechat']['setting']['wsq_allow']) {
- $modid = $_G['basescript'].'::'.CURMODULE;
- if($modid == 'forum::forumdisplay' && !empty($_GET['fid'])) {
- $idstr = '&fid='.dintval($_GET['fid']);
- return wechat_tpl_float_qrcode($idstr);
- } elseif($modid == 'forum::viewthread' && !empty($_GET['tid'])) {
- $idstr = '&tid='.dintval($_GET['tid']).'&qrsize=2';
- return wechat_tpl_float_qrcode($idstr);
- } elseif($modid == 'forum::index') {
- return wechat_tpl_float_qrcode();
- }
- }
- }
- }
- class mobileplugin_wechat {
- function common() {
- global $_G;
- if(!$_G['wechat']['setting']) {
- $_G['wechat']['setting'] = unserialize($_G['setting']['mobilewechat']);
- }
- dsetcookie('mobile', '', -1);
- if(!isset($_GET['pluginid'])) {
- $redirect = WeChat::redirect(1);
- if($redirect) {
- dheader('location: '.$redirect);
- }
- }
- }
- }
- class plugin_wechat_member extends plugin_wechat {
- function logging_method() {
- global $_G;
- if(!$_G['Plang'] || !$_G['wechat']['setting']['wsq_allow']) {
- return;
- }
- return wechat_tpl_login_bar();
- }
- function register_top_output() {
- global $_G;
- if(strexists($_GET['referer'], 'wechat:login') && $_G['wechat']['setting']['wsq_allow']) {
- return wechat_tpl_register();
- }
- }
- function register_logging_method() {
- global $_G;
- if(!$_G['Plang'] || !$_G['wechat']['setting']['wsq_allow']) {
- return;
- }
- return wechat_tpl_login_bar();
- }
- }
- class mobileplugin_wechat_forum extends mobileplugin_wechat {
- function post_showactivity() {
- if(!showActivity::init()) {
- return false;
- }
- showActivity::post();
- }
- function viewthread_showactivity() {
- showActivity::init();
- }
- function misc_showactivity() {
- showActivity::init();
- }
- }
- class plugin_wechat_forum extends plugin_wechat {
- function viewthread_showactivity() {
- showActivity::init();
- }
- function viewthread_postheader_output() {
- if(!showActivity::init()) {
- return array();
- }
- if($GLOBALS['activity']['starttimeto']) {
- global $_G;
- $starttimeto = strtotime($GLOBALS['activity']['starttimeto']);
- if($starttimeto < TIMESTAMP && $_G['forum_thread']['displayorder'] > 0) {
- C::t('forum_thread')->update($_G['tid'], array('displayorder' => 0));
- }
- }
- return showActivity::returnvoters(1);
- }
- function viewthread_posttop_output() {
- if(!showActivity::init()) {
- return array();
- }
- return showActivity::returnvoters(2);
- }
- function misc_showactivity() {
- if(!showActivity::init()) {
- return false;
- }
- showActivity::misc();
- }
- function post_showactivity() {
- if(!showActivity::init()) {
- return false;
- }
- showActivity::post();
- }
- function viewthread_share_method_output() {
- global $_G;
- if($_G['wechat']['setting']['wsq_allow']) {
- return wechat_tpl_share(showActivity::init());
- }
- }
- function viewthread_postaction() {
- global $_G;
- if($_G['wechat']['setting']['wsq_allow'] && $_G['adminid'] == 1 && empty($_GET['viewpid'])) {
- return array(wechat_tpl_resourcepush());
- }
- }
- }
- class WeChat {
- static $QRCODE_EXPIRE = 1800;
- static public function getqrcode() {
- global $_G;
- if(!$_G['wechat']['setting']) {
- $_G['wechat']['setting'] = unserialize($_G['setting']['mobilewechat']);
- }
- require_once DISCUZ_ROOT . './source/plugin/wechat/wechat.lib.class.php';
- $wechat_client = new WeChatClient($_G['wechat']['setting']['wechat_appId'], $_G['wechat']['setting']['wechat_appsecret']);
- $ticket = '';
- if(!$_G['cookie']['wechat_ticket'] || $_G['wechat']['setting']['wechat_mtype'] == 1) {
- $code = 0;
- $i = 0;
- do {
- $code = rand(100000, 999999);
- $codeexists = C::t('#wechat#mobile_wechat_authcode')->fetch_by_code($code);
- $i++;
- } while($codeexists && $i < 10);
- if($_G['wechat']['setting']['wechat_mtype'] == 2) {
- $option = array(
- 'scene_id' => $code,
- 'expire' => self::$QRCODE_EXPIRE,
- 'ticketOnly' => '1'
- );
- $ticket = $wechat_client->getQrcodeTicket($option);
- if(!$ticket) {
- showmessage('wechat:wechat_message_codefull');
- }
- dsetcookie('wechat_ticket', authcode($ticket."\t".$code, 'ENCODE'), self::$QRCODE_EXPIRE);
- }
- } else {
- list($ticket, $code) = explode("\t", authcode($_G['cookie']['wechat_ticket'], 'DECODE'));
- }
- $isqrapi = $ticket ? $ticket : '';
- if($codeexists) {
- showmessage('wechat:wechat_message_codefull');
- }
- $qrcodeurl = !$isqrapi ? $_G['setting']['attachurl'].'common/'.$_G['wechat']['setting']['wechat_qrcode'] : $_G['siteurl'].'plugin.php?id=wechat:qrcode&rand='.random(5);
- $codeenc = urlencode(base64_encode(authcode($code, 'ENCODE', $_G['config']['security']['authkey'])));
- C::t('#wechat#mobile_wechat_authcode')->insert(array('sid' => $_G['cookie']['saltkey'], 'uid' => $_G['uid'], 'code' => $code, 'createtime' => TIMESTAMP), 0, 1);
- if(!discuz_process::islocked('clear_wechat_authcode')) {
- C::t('#wechat#mobile_wechat_authcode')->delete_history();
- discuz_process::unlock('clear_wechat_authcode');
- }
- return array($isqrapi, $qrcodeurl, $codeenc, $code);
- }
- static public function redirect($type = '') {
- global $_G;
- $hook = unserialize($_G['setting']['wechatredirect']);
- if (!$hook || !in_array($hook['plugin'], $_G['setting']['plugins']['available'])) {
- return;
- }
- if(!preg_match("/^[\w\_]+$/i", $hook['plugin']) || !preg_match('/^[\w\_\.]+\.php$/i', $hook['include'])) {
- return;
- }
- include_once DISCUZ_ROOT . 'source/plugin/' . $hook['plugin'] . '/' . $hook['include'];
- if (!class_exists($hook['class'], false)) {
- return;
- }
- $class = new $hook['class'];
- if (!method_exists($class, $hook['method'])) {
- return;
- }
- $return = call_user_func(array($class, $hook['method']), $type);
- if($return) {
- return $return;
- }
- }
- static public function register($username, $return = 0, $groupid = 0) {
- global $_G;
- if(!$username) {
- return;
- }
- if(!$_G['wechat']['setting']) {
- $_G['wechat']['setting'] = unserialize($_G['setting']['mobilewechat']);
- }
- loaducenter();
- $groupid = !$groupid ? ($_G['wechat']['setting']['wechat_newusergroupid'] ? $_G['wechat']['setting']['wechat_newusergroupid'] : $_G['setting']['newusergroupid']) : $groupid;
- $password = md5(random(10));
- $email = 'wechat_'.strtolower(random(10)).'@null.null';
- $usernamelen = dstrlen($username);
- if($usernamelen < 3) {
- $username = $username.'_'.random(5);
- }
- if($usernamelen > 15) {
- if(!$return) {
- showmessage('profile_username_toolong');
- } else {
- return;
- }
- }
- $censorexp = '/^('.str_replace(array('\\*', "\r\n", ' '), array('.*', '|', ''), preg_quote(($_G['setting']['censoruser'] = trim($_G['setting']['censoruser'])), '/')).')$/i';
- if($_G['setting']['censoruser'] && @preg_match($censorexp, $username)) {
- if(!$return) {
- showmessage('profile_username_protect');
- } else {
- return;
- }
- }
- if(!$_G['wechat']['setting']['wechat_disableregrule']) {
- loadcache('ipctrl');
- if($_G['cache']['ipctrl']['ipregctrl']) {
- foreach(explode("\n", $_G['cache']['ipctrl']['ipregctrl']) as $ctrlip) {
- if(preg_match("/^(".preg_quote(($ctrlip = trim($ctrlip)), '/').")/", $_G['clientip'])) {
- $ctrlip = $ctrlip.'%';
- $_G['setting']['regctrl'] = $_G['setting']['ipregctrltime'];
- break;
- } else {
- $ctrlip = $_G['clientip'];
- }
- }
- } else {
- $ctrlip = $_G['clientip'];
- }
- if($_G['setting']['regctrl']) {
- if(C::t('common_regip')->count_by_ip_dateline($ctrlip, $_G['timestamp']-$_G['setting']['regctrl']*3600)) {
- if(!$return) {
- showmessage('register_ctrl', NULL, array('regctrl' => $_G['setting']['regctrl']));
- } else {
- return;
- }
- }
- }
- $setregip = null;
- if($_G['setting']['regfloodctrl']) {
- $regip = C::t('common_regip')->fetch_by_ip_dateline($_G['clientip'], $_G['timestamp']-86400);
- if($regip) {
- if($regip['count'] >= $_G['setting']['regfloodctrl']) {
- if(!$return) {
- showmessage('register_flood_ctrl', NULL, array('regfloodctrl' => $_G['setting']['regfloodctrl']));
- } else {
- return;
- }
- } else {
- $setregip = 1;
- }
- } else {
- $setregip = 2;
- }
- }
- if($setregip !== null) {
- if($setregip == 1) {
- C::t('common_regip')->update_count_by_ip($_G['clientip']);
- } else {
- C::t('common_regip')->insert(array('ip' => $_G['clientip'], 'count' => 1, 'dateline' => $_G['timestamp']));
- }
- }
- }
- $uid = uc_user_register(addslashes($username), $password, $email, '', '', $_G['clientip']);
- if($uid <= 0) {
- if(!$return) {
- if($uid == -1) {
- showmessage('profile_username_illegal');
- } elseif($uid == -2) {
- showmessage('profile_username_protect');
- } elseif($uid == -3) {
- showmessage('profile_username_duplicate');
- } elseif($uid == -4) {
- showmessage('profile_email_illegal');
- } elseif($uid == -5) {
- showmessage('profile_email_domain_illegal');
- } elseif($uid == -6) {
- showmessage('profile_email_duplicate');
- } else {
- showmessage('undefined_action');
- }
- } else {
- return;
- }
- }
- $init_arr = array('credits' => explode(',', $_G['setting']['initcredits']));
- C::t('common_member')->insert($uid, $username, $password, $email, $_G['clientip'], $groupid, $init_arr);
- if($_G['setting']['regctrl'] || $_G['setting']['regfloodctrl']) {
- C::t('common_regip')->delete_by_dateline($_G['timestamp']-($_G['setting']['regctrl'] > 72 ? $_G['setting']['regctrl'] : 72)*3600);
- if($_G['setting']['regctrl']) {
- C::t('common_regip')->insert(array('ip' => $_G['clientip'], 'count' => -1, 'dateline' => $_G['timestamp']));
- }
- }
- if($_G['setting']['regverify'] == 2) {
- C::t('common_member_validate')->insert(array(
- 'uid' => $uid,
- 'submitdate' => $_G['timestamp'],
- 'moddate' => 0,
- 'admin' => '',
- 'submittimes' => 1,
- 'status' => 0,
- 'message' => '',
- 'remark' => '',
- ), false, true);
- manage_addnotify('verifyuser');
- }
- setloginstatus(array(
- 'uid' => $uid,
- 'username' => $username,
- 'password' => $password,
- 'groupid' => $groupid,
- ), 0);
- include_once libfile('function/stat');
- updatestat('register');
- return $uid;
- }
- static public function syncAvatar($uid, $avatar) {
- if(!$uid || !$avatar) {
- return false;
- }
- if(!$content = dfsockopen($avatar)) {
- return false;
- }
- $tmpFile = DISCUZ_ROOT.'./data/avatar/'.TIMESTAMP.random(6);
- file_put_contents($tmpFile, $content);
- if(!is_file($tmpFile)) {
- return false;
- }
- $result = uploadUcAvatar::upload($uid, $tmpFile);
- unlink($tmpFile);
- C::t('common_member')->update($uid, array('avatarstatus'=>'1'));
- return $result;
- }
- static public function getnewname($openid) {
- global $_G;
- if(!$_G['wechat']['setting']) {
- $_G['wechat']['setting'] = unserialize($_G['setting']['mobilewechat']);
- }
- $wechat_client = new WeChatClient($_G['wechat']['setting']['wechat_appId'], $_G['wechat']['setting']['wechat_appsecret']);
- $userinfo = $wechat_client->getUserInfoById($openid);
- if($userinfo) {
- $defaultusername = substr(WeChatEmoji::clear($userinfo['nickname']), 0, 15);
- loaducenter();
- $user = uc_get_user($defaultusername);
- if(!empty($user)) {
- $defaultusername = cutstr($defaultusername, 7, '').'_'.random(5);
- }
- } else {
- $defaultusername = 'wx_'.random(5);
- }
- return $defaultusername;
- }
- }
- class uploadUcAvatar {
- public static function upload($uid, $localFile) {
- global $_G;
- if(!$uid || !$localFile) {
- return false;
- }
- list($width, $height, $type, $attr) = getimagesize($localFile);
- if(!$width) {
- return false;
- }
- if($width < 10 || $height < 10 || $type == 4) {
- return false;
- }
- $imageType = array(1 => '.gif', 2 => '.jpg', 3 => '.png');
- $fileType = $imgType[$type];
- if(!$fileType) {
- $fileType = '.jpg';
- }
- $avatarPath = $_G['setting']['attachdir'];
- $tmpAvatar = $avatarPath.'./temp/upload'.$uid.$fileType;
- file_exists($tmpAvatar) && @unlink($tmpAvatar);
- file_put_contents($tmpAvatar, file_get_contents($localFile));
- if(!is_file($tmpAvatar)) {
- return false;
- }
- $tmpAvatarBig = './temp/upload'.$uid.'big'.$fileType;
- $tmpAvatarMiddle = './temp/upload'.$uid.'middle'.$fileType;
- $tmpAvatarSmall = './temp/upload'.$uid.'small'.$fileType;
- $image = new image;
- if($image->Thumb($tmpAvatar, $tmpAvatarBig, 200, 250, 1) <= 0) {
- return false;
- }
- if($image->Thumb($tmpAvatar, $tmpAvatarMiddle, 120, 120, 1) <= 0) {
- return false;
- }
- if($image->Thumb($tmpAvatar, $tmpAvatarSmall, 48, 48, 2) <= 0) {
- return false;
- }
- $tmpAvatarBig = $avatarPath.$tmpAvatarBig;
- $tmpAvatarMiddle = $avatarPath.$tmpAvatarMiddle;
- $tmpAvatarSmall = $avatarPath.$tmpAvatarSmall;
- $avatar1 = self::byte2hex(file_get_contents($tmpAvatarBig));
- $avatar2 = self::byte2hex(file_get_contents($tmpAvatarMiddle));
- $avatar3 = self::byte2hex(file_get_contents($tmpAvatarSmall));
- $extra = '&avatar1='.$avatar1.'&avatar2='.$avatar2.'&avatar3='.$avatar3;
- $result = self::uc_api_post_ex('user', 'rectavatar', array('uid' => $uid), $extra);
- @unlink($tmpAvatar);
- @unlink($tmpAvatarBig);
- @unlink($tmpAvatarMiddle);
- @unlink($tmpAvatarSmall);
- return true;
- }
- public static function byte2hex($string) {
- $buffer = '';
- $value = unpack('H*', $string);
- $value = str_split($value[1], 2);
- $b = '';
- foreach($value as $k => $v) {
- $b .= strtoupper($v);
- }
- return $b;
- }
- public static function uc_api_post_ex($module, $action, $arg = array(), $extra = '') {
- $s = $sep = '';
- foreach($arg as $k => $v) {
- $k = urlencode($k);
- if(is_array($v)) {
- $s2 = $sep2 = '';
- foreach($v as $k2 => $v2) {
- $k2 = urlencode($k2);
- $s2 .= "$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2));
- $sep2 = '&';
- }
- $s .= $sep.$s2;
- } else {
- $s .= "$sep$k=".urlencode(uc_stripslashes($v));
- }
- $sep = '&';
- }
- $postdata = uc_api_requestdata($module, $action, $s, $extra);
- return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20);
- }
- }
- class showActivity {
- public static $init = false;
- public static function init() {
- global $_G;
- if(!$_G['wechat']['setting']['wsq_allow'] || !in_array($_G['tid'], (array)$_G['wechat']['setting']['showactivity']['tids'])) {
- return false;
- }
- if(!self::$init) {
- $_G['setting']['allowpostcomment'] = array(0 => 1, 1 => 2);
- $_G['setting']['commentnumber'] = 10;
- $_G['setting']['commentpostself'] = 0;
- $_G['setting']['commentfirstpost'] = 0;
- $_G['setting']['fastpost'] = 0;
- $_G['setting']['showimages'] = 1;
- $_G['setting']['imagelistthumb'] = 1;
- $_G['setting']['activitypp'] = 0;
- $_G['setting']['disallowfloat'] .= '|reply';
- $_G['setting']['guesttipsinthread']['flag'] = 0;
- $_G['setting']['nofilteredpost'] = 0;
- $_G['group']['allowgetimage'] = 1;
- if($_G['basescript'].'::'.CURMODULE == 'forum::post' && $_GET['action'] == 'edit') {
- $_G['group']['allowpostactivity'] = true;
- $_G['forum']['allowpostspecial'] = 255;
- }
- $_GET['ordertype'] = empty($_GET['ordertype']) ? 1 : $_GET['ordertype'];
- self::$init = true;
- }
- return true;
- }
- function misc() {
- global $_G;
- if(!$_POST || $_GET['action'] != 'activityapplies' && $_GET['action'] != 'activityapplylist') {
- return;
- }
- if(submitcheck('activitysubmit')) {
- showmessage('wechat:show_please_reply');
- } elseif(submitcheck('activitycancel')) {
- showmessage('wechat:show_no_cancel');
- } elseif(submitcheck('applylistsubmit') && $_GET['operation'] == 'replenish') {
- showmessage('wechat:show_disabled');
- }
- }
- function post() {
- global $_G;
- if($_GET['action'] != 'reply') {
- return;
- }
- if(submitcheck('replysubmit')) {
- $activity = C::t('forum_activity')->fetch($_G['tid']);
- if($activity['starttimefrom'] > TIMESTAMP) {
- showmessage('wechat:show_no_begin', NULL, array());
- }
- if($activity['expiration'] && $activity['expiration'] < TIMESTAMP) {
- showmessage('activity_stop', NULL, array(), array('login' => 1));
- }
- if(empty($_GET['attachnew'])) {
- showmessage('wechat:show_please_upload');
- }
- $data = array('tid' => $_G['tid'], 'username' => $_G['username'], 'uid' => $_G['uid'], 'message' => '', 'verified' => 1, 'dateline' => $_G['timestamp']);
- C::t('forum_activityapply')->insert($data);
- $applynumber = C::t('forum_activityapply')->fetch_count_for_thread($_G['tid']);
- C::t('forum_activity')->update($_G['tid'], array('applynumber' => $applynumber));
- }
- }
- function returnvoters($type) {
- global $_G;
- $return = array();
- if($type == 1) {
- $posts = DB::fetch_all("SELECT * FROM %t WHERE tid=%d", array('forum_debatepost', $_G['tid']), 'pid');
- foreach($GLOBALS['postlist'] as $post) {
- $posts[$post['pid']]['voters'] = intval($posts[$post['pid']]['voters']);
- $return[] = !$post['first'] ? wechatshowactivity_tpl_voters($posts[$post['pid']]) : '';
- }
- } else {
- foreach($GLOBALS['postlist'] as $post) {
- $return[] = !$post['first'] ? wechatshowactivity_tpl_share($post) : '';
- }
- }
- return $return;
- }
- }
|