123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: Storage.php 29263 2012-03-31 05:45:08Z yexinhao $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class Cloud_Service_Storage {
- protected static $debug = 0;
- protected static $_appStatus;
- protected static $_siteId;
- protected static $_encKey;
- protected static $_util;
- protected static $_instance;
- public static function getInstance() {
- global $_G;
- if (!(self::$_instance instanceof self)) {
- self::$_instance = new self();
- $cloudAppService = Cloud::loadClass('Service_App');
- self::$_appStatus = $cloudAppService->getCloudAppStatus('storage');
- self::$_siteId = $_G['setting']['my_siteid'];
- self::$_encKey = $_G['setting']['xf_storage_enc_key'];
- self::$_util = Cloud::loadClass('Service_Util');
- }
- return self::$_instance;
- }
- public function ftnFormhash($specialadd = '') {
- global $_G;
- return substr(md5(substr($_G['timestamp'], 0, -4) . $_G['username'] . $_G['uid'] . $_G['authkey'] . self::$_encKey . $specialadd), 8, 8);
- }
- public function makeFtnSig($formhash) {
- global $_G;
- $openId = $this->getOpenId($_G['uid']);
- $signGetx = array(
- 's_id' => self::$_siteId,
- 's_site_uid' => $_G['uid'],
- 'ts' => $_G['timestamp'],
- 'discuz_form_hash' => $formhash,
- 'site_url' => $_G['siteurl'],
- 'discuz_openid' => $openId,
- );
- ksort($signGetx);
- return self::$_util->hashHmac('sha1', self::$_util->httpBuildQuery($signGetx, '', '&'), self::$_encKey);
- }
- public function makeIframeUrl($formhash) {
- global $_G;
- $openId = $this->getOpenId($_G['uid']);
- $ftnGetx = array(
- 's_id' => self::$_siteId,
- 's_site_uid' => $_G['uid'],
- 'ts' => $_G['timestamp'],
- 'discuz_form_hash' => $formhash,
- 'site_url' => $_G['siteurl'],
- 'discuz_openid' => $openId,
- );
- $url = "http://cp.discuz.qq.com/storage/FTN?" . self::$_util->httpBuildQuery($ftnGetx, '', '&');
- $url = $url.'&sign=' . $this->makeFtnSig($formhash);
- return $url;
- }
- public function makeQQdlUrl($sha, $filename) {
- global $_G;
- $filename = trim($filename);
- $filename = urlencode(diconv($filename,CHARSET,'UTF-8'));
- $url = $_G['siteurl'] . $filename . '?&&txf_fid=' . $sha . '&siteid=' . self::$_siteId;
- return 'qqdl://'.base64_encode($url);
- }
- public function makeDownloadurl($sha1, $filesize, $filename) {
- global $_G;
- $filename = trim($filename,' "'); // Discuz! 默认的filename两侧会加上 双引号
- $filename = diconv($filename,CHARSET,'UTF-8');
- $filename = $this->str2hex($filename);
- $filename = strtolower($filename[1]);
- $post = 'http://dz.xf.qq.com/ftn.php?v=1&&';
- $k = self::$_util->hashHmac('sha1', sprintf('%s|%s|%s', $sha1, $_G['timestamp'], self::$_siteId), self::$_encKey);
- $parm = array(
- 'site_id' => self::$_siteId,
- 't' => $_G['timestamp'],
- 'sha1' => $sha1,
- 'filesize' => $filesize,
- 'filename' => $filename,
- 'k' => $k,
- 'ip' => $_G['clientip']
- );
- return $post . self::$_util->httpBuildQuery($parm, '', '&&');
- }
- private function _joinParm($parm = array(),$joiner = '&'){
- $andflag = '';
- $return = '';
- foreach($parm as $key => $value){
- $value = urlencode($value);
- $return .= $andflag.$key.'='.$value;
- $andflag = $joiner;
- }
- return $return;
- }
- public function str2hex($str){
- $length = strlen($str)*2;
- return unpack('H' . $length, $str);
- }
- public function getOpenId($uid) {
- $member = C::t('common_member')->fetch($uid);
- if ($member['conisbind']) {
- $connectInfo = C::t('#qqconnect#common_member_connect')->fetch($uid);
- $openId = $connectInfo['conopenid'];
- } else {
- $openId = '';
- }
- return $openId;
- }
- public function checkAttachment($attach, $redirect = true) {
- if (strpos($attach['attachment'], 'storage:') !== false) {
- C::t('forum_attachment')->update_download($attach['aid']);
- $sha1 = substr($attach['attachment'], -40);
- $downloadUrl = $this->makeDownloadurl($sha1, $attach['filesize'], $attach['filename']);
- if ($redirect) {
- dheader('location:' . $downloadUrl);
- exit;
- } else {
- return $downloadUrl;
- }
- }
- }
- public function getAttachmentByPids($pids) {
- global $_G;
- if (!is_array($pids)) {
- $pids = explode(',', $pids);
- }
- include_once libfile('function/post');
- $attachment = array();
- foreach ($pids as $pid) {
- $data = getattach($pid);
- $attachment[] = $data['used'];
- }
- return $attachment;
- }
- }
|