DiscuzX/upload/source/plugin/manyou/Service/Server/My.php

186 lines
5.5 KiB
PHP

<?php
/**
* [Discuz!] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id: My.php 34000 2013-09-17 08:52:48Z nemohou $
*/
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
Cloud::loadFile('Service_Server_Restful');
class Cloud_Service_Server_My extends Cloud_Service_Server_Restful {
public $siteId;
public $siteKey;
public $timezone;
public $version;
public $charset;
public $language;
public $myAppStatus;
public $mySearchStatus;
protected static $_instance;
public static function getInstance($siteId, $siteKey, $timezone, $version, $charset, $language, $myAppStatus, $mySearchStatus) {
if (!(self::$_instance instanceof self)) {
self::$_instance = new self($siteId, $siteKey, $timezone, $version, $charset, $language, $myAppStatus, $mySearchStatus);
}
return self::$_instance;
}
public function __construct($siteId, $siteKey, $timezone, $version, $charset, $language, $myAppStatus, $mySearchStatus) {
global $_G;
$this->siteId = $siteId;
$this->siteKey = $siteKey ? $siteKey : $_G['setting']['siteuniqueid'];
$this->timezone = $timezone;
$this->version = $version;
$this->charset = $charset;
$this->language = $language;
$this->myAppStatus = $myAppStatus;
$this->mySearchStatus = $mySearchStatus;
}
public function run() {
try {
$this->_checkRequest();
$response = $this->_processServerRequest();
} catch (Exception $e) {
$response = new Cloud_Service_Server_ErrorResponse($e->getCode(), $e->getMessage());
}
@ob_end_clean();
if(function_exists('ob_gzhandler')) {
@ob_start('ob_gzhandler');
} else {
@ob_start();
}
echo serialize($this->_formatLocalResponse($response));
exit;
}
protected function _checkRequest() {
global $_G;
if (empty($_G['setting']['siteuniqueid'])) {
throw new Cloud_Service_Server_RestfulException('Client SiteKey NOT Exists', 11);
} elseif (empty($this->siteKey)) {
throw new Cloud_Service_Server_RestfulException('My SiteKey NOT Exists', 12);
}
}
protected function _processServerRequest() {
$request = $_POST;
$module = $request['module'];
$method = $request['method'];
$params = $request['params'];
if (!$module || !$method) {
throw new Cloud_Service_Server_RestfulException('Invalid Method: ' . $method, 1);
}
$siteKey = $this->siteKey;
if ($request['ptnId']) {
$siteKey = md5($this->siteId . $this->siteKey . $request['ptnId'] . $request['ptnMethods']);
}
$sign = $this->_generateSign($module, $method, $params, $siteKey);
if ($sign != $request['sign']) {
throw new Cloud_Service_Server_RestfulException('Error Sign', 10);
}
if ($request['ptnId']) {
if ($allowMethods = explode(',', $request['ptnMethods'])) {
$manyouHelper = Cloud::loadClass('Service_ManyouHelper');
if (!in_array($manyouHelper->getMethodCode($module, $method), $allowMethods)) {
throw new Cloud_Service_Server_RestfulException('Method Not Allowed', 13);
}
}
}
$params = dunserialize($params);
return $this->_callLocalMethod($module, $method, $params);
}
protected function _generateSign($module, $method, $params, $siteKey) {
return md5($module . '|' . $method . '|' . $params . '|' . $siteKey);
}
protected function _callLocalMethod($module, $method, $params) {
if ($module == 'Batch' && $method == 'run') {
$response = array();
foreach($params as $param) {
try {
$response[] = $this->_callLocalMethod($param['module'], $param['method'], $param['params']);
} catch (Exception $e) {
$response[] = new Cloud_Service_Server_ErrorResponse($e->getCode, $e->getMessage());
}
}
return new Cloud_Service_Server_Response($response, 'Batch');
} else {
$methodName = $this->_getMethodName($module, $method);
$className = sprintf('Cloud_Service_Server_%s', ucfirst($module));
try {
$class = Cloud::loadClass($className);
} catch (Exception $e) {
throw new Cloud_Service_Server_RestfulException('Class not implemented: ' . $className, 2);
}
if (method_exists($class, $methodName)) {
$result = call_user_func_array(array(&$class, $methodName), (array)$params);
if ($result instanceof Cloud_Service_Server_ErrorResponse) {
return $result;
}
return new Cloud_Service_Server_Response($result);
} else {
throw new Cloud_Service_Server_RestfulException('Method not implemented: ' . $methodName, 2);
}
}
}
protected function _getMethodName($module, $method) {
return 'on' . ucfirst($module) . ucfirst($method);
}
protected function _formatLocalResponse($data) {
$utilService = Cloud::loadClass('Service_Util');
$res = array(
'my_version' => $utilService->getApiVersion(),
'timezone' => $this->timezone,
'version' => $this->version,
'charset' => $this->charset,
'language' => $this->language
);
if ($data instanceof Cloud_Service_Server_Response) {
if (is_array($data->result) && $data->getMode() == 'Batch') {
foreach($data->result as $result) {
if ($result instanceof Cloud_Service_Server_Response) {
$res['result'][] = $result->getResult();
} else {
$res['result'][] = array(
'errno' => $result->getCode(),
'errmsg' => $result->getMessage()
);
}
}
} else {
$res['result'] = $data->getResult();
}
} else {
$res['errCode'] = $data->getCode();
$res['errMessage'] = $data->getMessage();
}
return $res;
}
}