123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: Connect.php 36278 2016-12-09 07:52:35Z nemohou $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class Cloud_Service_Connect {
- const SPECIAL_GID = 7;
- protected static $_instance;
- public $state = '';
- public static function getInstance() {
- if (!(self::$_instance instanceof self)) {
- self::$_instance = new self();
- }
- return self::$_instance;
- }
- public function __construct($siteId = '', $siteKey = '') {
- }
- public function connectMergeMember() {
- global $_G;
- static $merged;
- if($merged) {
- return;
- }
- $connect_member = C::t('#qqconnect#common_member_connect')->fetch($_G['uid']);
- if ($connect_member) {
- $_G['member'] = array_merge($_G['member'], $connect_member);
- $user_auth_fields = $connect_member['conisfeed'];
- if ($user_auth_fields == 0) {
- $_G['member']['is_user_info'] = 0;
- $_G['member']['is_feed'] = 0;
- } elseif ($user_auth_fields == 1) {
- $_G['member']['is_user_info'] = 1;
- $_G['member']['is_feed'] = 1;
- } elseif ($user_auth_fields == 2) {
- $_G['member']['is_user_info'] = 1;
- $_G['member']['is_feed'] = 0;
- } elseif ($user_auth_fields == 3) {
- $_G['member']['is_user_info'] = 0;
- $_G['member']['is_feed'] = 1;
- }
- unset($connect_member, $_G['member']['conisfeed']);
- }
- $merged = true;
- }
- public function connectUserBindParams() {
- global $_G;
- $this->connectMergeMember();
- getuserprofile('birthyear');
- getuserprofile('birthmonth');
- getuserprofile('birthday');
- switch ($_G['member']['gender']) {
- case 1 :
- $sex = 'male';
- break;
- case 2 :
- $sex = 'female';
- break;
- default :
- $sex = 'unknown';
- }
- $is_public_email = 2;
- $is_use_qq_avatar = $_G['member']['conisqzoneavatar'] == 1 ? 1 : 2;
- $birthday = sprintf('%04d', $_G['member']['birthyear']).'-'.sprintf('%02d', $_G['member']['birthmonth']).'-'.sprintf('%02d', $_G['member']['birthday']);
- $agent = md5(time().rand().uniqid());
- $inputArray = array (
- 'uid' => $_G['uid'],
- 'agent' => $agent,
- 'time' => TIMESTAMP
- );
- require_once DISCUZ_ROOT.'./config/config_ucenter.php';
- $input = 'uid='.$_G['uid'].'&agent='.$agent.'&time='.TIMESTAMP;
- $avatar_input = authcode($input, 'ENCODE', UC_KEY);
- $params = array (
- 'oauth_consumer_key' => $_G['setting']['connectappid'],
- 'u_id' => $_G['uid'],
- 'username' => $_G['member']['username'],
- 'email' => $_G['member']['email'],
- 'birthday' => $birthday,
- 'sex' => $sex,
- 'is_public_email' => $is_public_email,
- 'is_use_qq_avatar' => $is_use_qq_avatar,
- 's_id' => null,
- 'avatar_input' => $avatar_input,
- 'avatar_agent' => $agent,
- 'site_ucenter_id' => UC_APPID,
- 'source' => 'qzone',
- );
- return $params;
- }
- public function connectFeedResendJs() {
- global $_G;
- $jsname = $_G['cookie']['connect_js_name'];
- if($jsname != 'feed_resend') {
- return false;
- }
- $params = dunserialize(base64_decode($_G['cookie']['connect_js_params']));
- $params['sig'] = $this->connectGetSig($params, $this->connectGetSigKey());
- $jsurl = $_G['connect']['discuz_new_feed_url'];
- $utilService = Cloud::loadClass('Service_Util');
- $jsurl .= '?' . $utilService->httpBuildQuery($params, '', '&');
- return $jsurl;
- }
- public function connectCookieLoginJs() {
- global $_G;
- return $ajaxUrl = 'connect.php?mod=check&op=cookie';
- }
- public function connectGetSigKey() {
- global $_G;
- return $_G['setting']['connectappid'] . '|' . $_G['setting']['connectappkey'];
- }
- public function connectGetSig($params, $app_key) {
- ksort($params);
- $base_string = '';
- foreach($params as $key => $value) {
- $base_string .= $key.'='.$value;
- }
- $base_string .= $app_key;
- return md5($base_string);
- }
- public function connectParseBbcode($bbcode, $fId, $pId, $isHtml, &$attachImages) {
- include_once libfile('function/discuzcode');
- $result = preg_replace('/\[hide(=\d+)?\].+?\[\/hide\](\r\n|\s)/i', '', $bbcode);
- $result = preg_replace('/\[payto(=\d+)?\].+?\[\/payto\](\r\n|\s)/i', '', $result);
- $result = preg_replace('/\[quote\].*\[\/quote\](\r\n|\n|\r){0,}/is', '', $result);
- $result = discuzcode($result, 0, 0, $isHtml, 1, 2, 1, 0, 0, 0, 0, 1, 0);
- $result = strip_tags($result, '<img><a>');
- $result = preg_replace('/<img src="images\//i', "<img src=\"".$_G['siteurl']."images/", $result);
- $result = $this->connectParseAttach($result, $fId, $pId, $attachImages, $attachImageThumb);
- return $result;
- }
- public function connectParseAttach($content, $fId, $pId, &$attachImages) {
- global $_G;
- $permissions = $this->connectGetUserGroupPermissions(self::SPECIAL_GID, $fId);
- $visitorPermission = $permissions[self::SPECIAL_GID];
- $attachIds = array();
- $attachImages = array ();
- $attachments = C::t('forum_attachment')->fetch_all_by_id('pid', $pId);
- $attachments = C::t('forum_attachment_n')->fetch_all("pid:$pId", array_keys($attachments));
- foreach ($attachments as $k => $attach) {
- $aid = $attach['aid'];
- if($attach['isimage'] == 0 || $attach['price'] > 0 || $attach['readperm'] > $visitorPermission['readPermission'] || in_array($fId, $visitorPermission['forbidViewAttachForumIds']) || in_array($attach['aid'], $attachIds)) {
- continue;
- }
- $imageItem = array ();
- $thumbWidth = '100';
- $thumbHeight = '100';
- $bigWidth = '400';
- $bigHeight = '400';
- $thumbImageURL = $_G['siteurl'] . getforumimg($aid, 1, $thumbWidth, $thumbHeight, 'fixwr');
- $bigImageURL = $_G['siteurl'] . getforumimg($aid, 1, $bigWidth, $bigHeight, 'fixnone');
- $imageItem['aid'] = $aid;
- $imageItem['thumb'] = $thumbImageURL;
- $imageItem['big'] = $bigImageURL;
- if($attach['remote']) {
- $imageItem['path'] = $_G['setting']['ftp']['attachurl'].'forum/'.$attach['attachment'];
- $imageItem['remote'] = true;
- } else {
- $imageItem['path'] = $_G['setting']['attachdir'].'forum/'.$attach['attachment'];
- }
- $attachIds[] = $aid;
- $attachImages[] = $imageItem;
- }
- $this->connectParseAttach_callback_connectParseAttachTag_1($attachNames, 1);
- $content = preg_replace_callback('/\[attach\](\d+)\[\/attach\]/i', array($this, 'connectParseAttach_callback_connectParseAttachTag_1'), $content);
- return $content;
- }
- public function connectParseAttach_callback_connectParseAttachTag_1($matches, $action = 0) {
- static $attachNames = '';
- if($action == 1) {
- $attachNames = $matches;
- } else {
- return $this->connectParseAttachTag($matches[1], $attachNames);
- }
- }
- public function connectParseAttachTag($attachId, $attachNames) {
- include_once libfile('function/discuzcode');
- if(array_key_exists($attachId, $attachNames)) {
- return '<span class="attach"><a href="'.$_G['siteurl'].'/attachment.php?aid='.aidencode($attachId).'">'.$attachNames[$attachId].'</a></span>';
- }
- return '';
- }
- function connectGetUserGroupPermissions($gid, $fid) {
- global $_G;
- loadcache('usergroups');
- $fields = array (
- 'groupid' => 'userGroupId',
- 'grouptitle' => 'userGroupName',
- 'readaccess' => 'readPermission',
- 'allowvisit' => 'allowVisit'
- );
- $userGroup = C::t('common_usergroup')->fetch_all($gid);
- $userGroupInfo = array();
- foreach ($userGroup as $id => $value) {
- $userGroupInfo[$id] = array_merge($value, $_G['cache']['usergroups'][$id]);
- $userGroupInfo[$id]['forbidForumIds'] = array ();
- $userGroupInfo[$id]['allowForumIds'] = array ();
- $userGroupInfo[$id]['specifyAllowForumIds'] = array ();
- $userGroupInfo[$id]['allowViewAttachForumIds'] = array ();
- $userGroupInfo[$id]['forbidViewAttachForumIds'] = array ();
- foreach ($fields as $k => $v) {
- $userGroupInfo[$id][$v] = $userGroupInfo[$id][$k];
- }
- }
- $forumField = C::t('forum_forumfield')->fetch($fid);
- $allowViewGroupIds = array ();
- if($forumField['viewperm']) {
- $allowViewGroupIds = explode("\t", $forumField['viewperm']);
- }
- $allowViewAttachGroupIds = array ();
- if($forumField['getattachperm']) {
- $allowViewAttachGroupIds = explode("\t", $forumField['getattachperm']);
- }
- foreach ($userGroupInfo as $groupId => $value) {
- if($forumField['password']) {
- $userGroupInfo[$groupId]['forbidForumIds'][] = $fid;
- continue;
- }
- $perm = unserialize($forumField['formulaperm']);
- if(is_array($perm)) {
- if($perm[0] || $perm[1] || $perm['users']) {
- $userGroupInfo[$groupId]['forbidForumIds'][] = $fid;
- continue;
- }
- }
- if(!$allowViewGroupIds) {
- $userGroupInfo[$groupId]['allowForumIds'][] = $fid;
- } elseif (!in_array($groupId, $allowViewGroupIds)) {
- $userGroupInfo[$groupId]['forbidForumIds'][] = $fid;
- } elseif (in_array($groupId, $allowViewGroupIds)) {
- $userGroupInfo[$groupId]['allowForumIds'][] = $fid;
- $userGroupInfo[$groupId]['specifyAllowForumIds'][] = $fid;
- }
- if(!$allowViewAttachGroupIds) {
- $userGroupInfo[$groupId]['allowViewAttachForumIds'][] = $fid;
- } elseif (!in_array($groupId, $allowViewAttachGroupIds)) {
- $userGroupInfo[$groupId]['forbidViewAttachForumIds'][] = $fid;
- } elseif (in_array($groupId, $allowViewGroupIds)) {
- $userGroupInfo[$groupId]['allowViewAttachForumIds'][] = $fid;
- }
- }
- return $userGroupInfo;
- }
- public function connectOutputPhp($url, $postData = '') {
- global $_G;
- $response = dfsockopen($url, 0, $postData, '', false, $_G['setting']['cloud_api_ip']);
- $result = (array) dunserialize($response);
- return $result;
- }
- public function connectJsOutputMessage($msg = '', $errMsg = '', $errCode = '') {
- $result = array (
- 'result' => $msg,
- 'errMessage' => $errMsg,
- 'errCode' => $errCode
- );
- echo sprintf('con_handle_response(%s);', json_encode($this->_connectUrlencode($result)));
- exit;
- }
- protected function _connectUrlencode($value) {
- if (is_array($value)) {
- foreach ($value as $k => $v) {
- $value[$k] = $this->_connectUrlencode($v);
- }
- } else if (is_string($value)) {
- $value = urlencode(str_replace(array("\r\n", "\r", "\n", "\"", "\/", "\t"), array('\\n', '\\n', '\\n', '\\"', '\\/', '\\t'), $value));
- }
- return $value;
- }
- public function connectCookieLoginParams() {
- global $_G;
- $this->connectMergeMember();
- $oauthToken = $_G['member']['conuin'];
- $api_url = $_G['connect']['api_url'].'/connect/discuz/cookieReport';
- if($oauthToken) {
- $extra = array (
- 'oauth_token' => $oauthToken
- );
- $sig_params = $this->connectGetOauthSignatureParams($extra);
- $oauth_token_secret = $_G['member']['conuinsecret'];
- $sig_params['oauth_signature'] = $this->connectGetOauthSignature($api_url, $sig_params, 'POST', $oauth_token_secret);
- $params = array (
- 'client_ip' => $_G['clientip'],
- 'u_id' => $_G['uid'],
- 'version' => 'qzone1.0',
- );
- $params = array_merge($sig_params, $params);
- $params['response_type'] = 'php';
- return $params;
- } else {
- return false;
- }
- }
- function connectAddCookieLogins() {
- global $_G;
- loadcache('connect_has_setting_count');
- if (!$_G['cache']['connect_has_setting_count']) {
- $times = C::t('common_setting')->fetch('connect_login_times');
- C::t('common_setting')->update('connect_login_times', $times + 1);
- savecache('connect_has_setting_count', '1');
- } else {
- C::t('common_setting')->update_count('connect_login_times', 1);
- }
- $life = 86400;
- $current_date = date('Y-m-d');
- dsetcookie('connect_last_report_time', $current_date, $life);
- return true;
- }
- public function connectAjaxOuputMessage($msg = '', $errCode = '') {
- @header("Content-type: text/html; charset=".CHARSET);
- echo "errCode=$errCode&result=$msg";
- exit;
- }
- public function connectGetOauthSignature($url, $params, $method = 'POST', $oauth_token_secret = '') {
- global $_G;
- $method = strtoupper($method);
- if(!in_array($method, array ('GET', 'POST'))) {
- return FALSE;
- }
- $url = urlencode($url);
- $utilService = Cloud::loadClass('Service_Util');
- $param_str = urlencode($utilService->httpBuildQuery($params, '', '&'));
- $base_string = $method.'&'.$url.'&'.$param_str;
- $key = $_G['setting']['connectappkey'].'&'.$oauth_token_secret;
- $signature = $utilService->hashHmac('sha1', $base_string, $key);
- return $signature;
- }
- public function connectGetOauthSignatureParams($extra = array ()) {
- global $_G;
- $params = array (
- 'oauth_consumer_key' => $_G['setting']['connectappid'],
- 'oauth_nonce' => $this->_connectGetNonce(),
- 'oauth_signature_method' => 'HMAC_SHA1',
- 'oauth_timestamp' => TIMESTAMP
- );
- if($extra) {
- $params = array_merge($params, $extra);
- }
- ksort($params);
- return $params;
- }
- protected function _connectGetNonce() {
- $mt = microtime();
- $rand = mt_rand();
- return md5($mt.$rand);
- }
- public function connectParseXml($contents, $getAttributes = true, $priority = 'tag') {
- if (!$contents) {
- return array();
- }
- if (!function_exists('xml_parser_create')) {
- return array();
- }
- $parser = xml_parser_create('');
- xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
- xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
- xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
- xml_parse_into_struct($parser, trim($contents), $xmlValues);
- xml_parser_free($parser);
- if (!$xmlValues) {
- return;
- }
- $xmlArray = $parent = array();
- $current = &$xmlArray;
- $repeatedTagIndex = array();
- foreach($xmlValues as $data) {
- unset($attributes, $value);
- extract($data);
- $result = $attributesData = array();
- if (isset($value)) {
- if ($priority == 'tag') {
- $result = $value;
- } else {
- $result['value'] = $value;
- }
- }
- if (isset($attributes) && $getAttributes) {
- foreach ($attributes as $attr => $val) {
- if ($priority == 'tag') {
- $attributesData[$attr] = $val;
- } else {
- $result['attr'][$attr] = $val;
- }
- }
- }
- if ($type == 'open') {
- $parent[$level - 1] = &$current;
- if (!is_array($current) || (!in_array($tag, array_keys($current)))) {
- $current[$tag] = $result;
- if ($attributesData) {
- $current[$tag . '_attr'] = $attributesData;
- }
- $repeatedTagIndex[$tag . '_' . $level] = 1;
- $current = &$current[$tag];
- } else {
- if (isset($current[$tag][0])) {
- $current[$tag][$repeatedTagIndex[$tag . '_' . $level]] = $result;
- $repeatedTagIndex[$tag . '_' . $level] ++;
- } else {
- $current[$tag] = array($current[$tag], $result);
- $repeatedTagIndex[$tag . '_' . $level] = 2;
- if (isset($current[$tag . '_attr'])) {
- $current[$tag]['0_attr'] = $current[$tag . '_attr'];
- unset($current[$tag . '_attr']);
- }
- }
- $lastItemIndex = $repeatedTagIndex[$tag . '_' . $level] - 1;
- $current = &$current[$tag][$lastItemIndex];
- }
- } elseif($type == 'complete') {
- if (!isset($current[$tag])) {
- $current[$tag] = $result;
- $repeatedTagIndex[$tag . '_' . $level] = 1;
- if ($priority == 'tag' && $attributesData) {
- $current[$tag . '_attr'] = $attributesData;
- }
- } else {
- if (isset($current[$tag][0]) && is_array($current[$tag])) {
- $current[$tag][$repeatedTagIndex[$tag . '_' . $level]] = $result;
- if ($priority == 'tag' && $getAttributes && $attributesData) {
- $current[$tag][$repeatedTagIndex[$tag . '_' . $level] . '_attr'] = $attributesData;
- }
- $repeatedTagIndex[$tag . '_' . $level] ++;
- } else {
- $current[$tag] = array($current[$tag], $result);
- $repeatedTagIndex[$tag . '_' . $level] = 1;
- if ($priority == 'tag' && $getAttributes) {
- if (isset($current[$tag . '_attr'])) {
- $current[$tag]['0_attr'] = $current[$tag . '_attr'];
- unset($current[$tag . '_attr']);
- }
- if ($attributesData) {
- $current[$tag][$repeatedTagIndex[$tag . '_' . $level] . '_attr'] = $attributesData;
- }
- }
- $repeatedTagIndex[$tag . '_' . $level] ++;
- }
- }
- } elseif($type == 'close') {
- $current = &$parent[$level - 1];
- }
- }
- return $xmlArray[key($parent[0])] ? $xmlArray[key($parent[0])] : $xmlArray;
- }
- public function connectFilterUsername($username) {
- $username = str_replace(' ', '_', trim($username));
- return cutstr($username, 15, '');
- }
- public function connectErrlog($errno, $error) {
- return true;
- }
- function connectCookieLoginReport($loginTimes) {
- global $_G;
- $utilService = Cloud::loadClass('Service_Util');
- $response = '';
- if ($loginTimes) {
- $api_url = $_G['connect']['api_url'].'/connect/discuz/batchCookieReport';
- $params = array (
- 'oauth_consumer_key' => $_G['setting']['connectappid'],
- 'login_times' => $loginTimes,
- 'date' => dgmdate(TIMESTAMP - 86400, 'Y-m-d'),
- 'ts' => TIMESTAMP,
- );
- $params['sig'] = $this->connectGetSig($params, $this->connectGetSigKey());
- $response = $this->connectOutputPhp($api_url.'?', $utilService->httpBuildQuery($params, '', '&'));
- } else {
- $response = array('status' => 0);
- }
- return $response;
- }
- }
|