Exemplo n.º 1
0
 /**
  * Index page
  */
 public function indexAction()
 {
     // get user info by api key
     if (null != ($apiKey = $this->getRequest()->getQuery()->api_key)) {
         if (null != ($userInfo = UserIdentityService::getUserInfo($apiKey, UserModelBase::USER_INFO_BY_API_KEY))) {
             // fill the user's info
             if ($userInfo['status'] == UserModelBase::STATUS_APPROVED) {
                 $userIdentity = [];
                 foreach ($userInfo as $fieldName => $value) {
                     $userIdentity[$fieldName] = $value;
                 }
                 // init user identity
                 UserIdentityService::setCurrentUserIdentity($userIdentity);
             }
         }
     }
     XmlRpcServerFault::attachFaultException('XmlRpc\\Exception\\XmlRpcActionDenied');
     $server = new XmlRpcServer();
     // get xmlrpc classes
     if (null != ($classes = $this->getModel()->getClasses())) {
         $server->sendArgumentsToAllMethods(false);
         foreach ($classes as $class) {
             $server->setClass($class['path'], $class['namespace'], $this->getServiceLocator());
         }
     }
     $server->handle();
     // disable layout and view script
     return $this->response;
 }
 public function indexAction()
 {
     $server = new Server();
     $serverObject = new Handler($this->getServiceLocator());
     $server->setClass($serverObject);
     echo $server->handle();
     exit;
 }
Exemplo n.º 3
0
 /**
  * Tests functionality of both get() and save()
  */
 public function testGetSave()
 {
     if (!is_writeable('./')) {
         $this->markTestIncomplete('Directory no writable');
     }
     $this->assertTrue(Server\Cache::save($this->_file, $this->_server));
     $expected = $this->_server->listMethods();
     $server = new Server();
     $this->assertTrue(Server\Cache::get($this->_file, $server));
     $actual = $server->listMethods();
     $this->assertSame($expected, $actual);
 }
Exemplo n.º 4
0
 /**
  * {@inheritdoc}
  */
 public function serve()
 {
     if (!function_exists('xmlrpc_server_create')) {
         throw new \Exception('xmlrpc extension is not installed. Please enable this extension.');
         exit;
     }
     if (!class_exists('Zend\\XmlRpc\\Server')) {
         throw new \Exception("Zend\\XmlRpc\\Server is required. " . "please install it using 'composer require zendframework/zend-xmlrpc'");
         exit;
     }
     if (isset($_GET['xmlrpc']) || isset($_GET['XMLRPC'])) {
         $server = new Server();
         $server->sendArgumentsToAllMethods(false);
         $server->setClass(get_class($this->serviceHandler), 'DBInstance', $this->authentication, $this->connectionStrings, $this->logDir);
         echo $server->handle();
     }
 }
Exemplo n.º 5
0
    /**
     * Multicall - boxcar feature of XML-RPC for calling multiple methods
     * in a single request.
     *
     * Expects a an array of structs representing method calls, each element
     * having the keys:
     * - methodName
     * - params
     *
     * Returns an array of responses, one for each method called, with the value
     * returned by the method. If an error occurs for a given method, returns a
     * struct with a fault response.
     *
     * @see http://www.xmlrpc.com/discuss/msgReader$1208
     * @param  array $methods
     * @return array
     */
    public function multicall($methods)
    {
        $responses = array();
        foreach ($methods as $method) {
            $fault = false;
            if (!is_array($method)) {
                $fault = $this->_server->fault('system.multicall expects each method to be a struct', 601);
            } elseif (!isset($method['methodName'])) {
                $fault = $this->_server->fault('Missing methodName: ' . var_export($methods, 1), 602);
            } elseif (!isset($method['params'])) {
                $fault = $this->_server->fault('Missing params', 603);
            } elseif (!is_array($method['params'])) {
                $fault = $this->_server->fault('Params must be an array', 604);
            } else {
                if ('system.multicall' == $method['methodName']) {
                    // don't allow recursive calls to multicall
                    $fault = $this->_server->fault('Recursive system.multicall forbidden', 605);
                }
            }

            if (!$fault) {
                try {
                    $request = new \Zend\XmlRpc\Request();
                    $request->setMethod($method['methodName']);
                    $request->setParams($method['params']);
                    $response = $this->_server->handle($request);
                    if ($response instanceof \Zend\XmlRpc\Fault
                        || $response->isFault()
                    ) {
                        $fault = $response;
                    } else {
                        $responses[] = $response->getReturnValue();
                    }
                } catch (\Exception $e) {
                    $fault = $this->_server->fault($e);
                }
            }

            if ($fault) {
                $responses[] = array(
                    'faultCode'   => $fault->getCode(),
                    'faultString' => $fault->getMessage()
                );
            }
        }

        return $responses;
    }
Exemplo n.º 6
0
 /**
  * @group ZF-6034
  */
 public function testPrototypeReturnValueMustReflectDocBlock()
 {
     $server = new Server();
     $server->setClass('ZendTest\\XmlRpc\\TestClass');
     $table = $server->getDispatchTable();
     $method = $table->getMethod('test1');
     foreach ($method->getPrototypes() as $prototype) {
         $this->assertNotEquals('void', $prototype->getReturnType(), var_export($prototype, 1));
     }
 }
<?php

use Zend\XmlRpc\Server;
require_once __DIR__ . '/../../vendor/autoload.php';
class Foo
{
    public function bar()
    {
        return 'bar remote!';
    }
}
$server = new Server();
$server->setClass(new Foo(), 'Foo');
$server->setReturnResponse(false);
$server->handle();
Exemplo n.º 8
0
 public function run()
 {
     /*
     $data = array(
         'project_id' => 'WRHS',
         'service' => 'cargoitem',
         'method' => 'import',
         'request' => ''
     );
     
     $logAddResult = \Model\LogXmlrpcServerModel::getInstance()->add($data);
     print_r($logAddResult->getErrors());
     die;
     */
     $logAddResult = null;
     $method = null;
     ob_start();
     $request = $this->getRequest();
     try {
         $xmlRequest = $request->getRawBody();
         if (empty($xmlRequest)) {
             $xmlRequest = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<methodCall><methodName>cargoitem.import</methodName><params><param><value><struct><member><name>item_fid</name><value><string>EBTD_P654326</string></value></member><member><name>source_id</name><value><string>EBTD</string></value></member><member><name>warehouse_code</name><value><string>usa</string></value></member><member><name>country_code</name><value><string>RU</string></value></member><member><name>delivery_type</name><value><string>SPSR</string></value></member><member><name>weight</name><value><int>11386</int></value></member><member><name>_cargo_item_declaration</name><value><array><data><value><struct><member><name>name</name><value><string>Test t-short</string></value></member><member><name>article</name><value><string>123312a</string></value></member><member><name>color</name><value><string>white</string></value></member><member><name>size</name><value><string>xxx-large</string></value></member><member><name>count</name><value><int>2</int></value></member><member><name>weight</name><value><int>11386</int></value></member><member><name>shop</name><value><string>amazon.com</string></value></member><member><name>url</name><value><string>http://amazon.com/goods/1?id2</string></value></member><member><name>price</name><value><double>123.40000000000001</double></value></member><member><name>commission</name><value><double>12.4</double></value></member><member><name>means_of_payment</name><value><string>visa*342</string></value></member><member><name>category</name><value><string>cloting</string></value></member><member><name>descr</name><value><string>Simple t-short</string></value></member></struct></value><value><struct><member><name>name</name><value><string>Test t-short 2</string></value></member><member><name>article</name><value><string>123313b</string></value></member><member><name>color</name><value><string>white</string></value></member><member><name>size</name><value><string>xxx-large</string></value></member><member><name>count</name><value><int>2</int></value></member><member><name>weight</name><value><int>11386</int></value></member><member><name>shop</name><value><string>amazon.com</string></value></member><member><name>url</name><value><string>http://amazon.com/goods/1?id2</string></value></member><member><name>price</name><value><double>123.40000000000001</double></value></member><member><name>commission</name><value><double>12.4</double></value></member><member><name>means_of_payment</name><value><string>visa*342</string></value></member><member><name>category</name><value><string>cloting</string></value></member><member><name>descr</name><value><string>Simple t-short</string></value></member></struct></value></data></array></value></member></struct></value></param></params></methodCall>';
         }
         $parts = null;
         if (preg_match("#\\<methodName\\>\\s*([a-z0-9_]+)\\.([a-z0-9_]+)\\s*\\<\\/methodName\\>#is", $xmlRequest, $parts)) {
             $method = @$parts[1] . '.' . @$parts[2];
         }
         if (strtolower($method) == 'system.fake') {
             // don't execute fake request
             throw new \Exception('Fake request');
         }
         $key = $this->getRequest()->getQuery('key');
         $project = \Model\ProjectModel::getInstance()->getByKey($key);
         if ($project->exists()) {
             BaseService::setProject($project);
         }
         $logRequest = !in_array(strtolower($method), self::$_notLoggingMethods);
         if ($logRequest && $method) {
             $data = array('project_id' => $project->getId(), 'service' => $parts[1], 'method' => $parts[2], 'request' => !in_array(strtolower($method), self::$_notLoggingRequestMethods) ? $xmlRequest : self::$_emptyXmlRequest);
             $logAddResult = \Model\LogXmlrpcServerModel::getInstance()->add($data);
             //$a = $logAddResult instanceof \Model\Result\Result;
         }
         $response = $this->server->handle();
     } catch (\Exception $ex) {
         $response = (string) $this->server->fault('Server error', 1500);
         echo "\n\nEXCEPTION: " . $ex->getMessage() . "\n";
         echo $ex->getTraceAsString() . "\n\n";
     }
     $output = ob_get_contents();
     ob_end_clean();
     ob_start();
     try {
         if ($logAddResult instanceof \Model\Result\Result && $logAddResult->getResult()) {
             $logId = $logAddResult->getResult();
             $methparts = explode('.', $method);
             $msec = round((microtime(true) - $this->getTimeStart()) * 1000);
             $updateCond = \Model\LogXmlrpcServerModel::getInstance()->getCond()->where(array('id' => $logId));
             $logXmlrpcServerArray = array('response' => $response, 'output' => $output, 'work_msec' => $msec);
             if ($msec > 1000) {
                 //\Model\LogXmlrpcServerModel::getInstance()->reconnect(); нужен реконект
             }
             $logUpdResult = \Model\LogXmlrpcServerModel::getInstance()->update($logXmlrpcServerArray, $updateCond);
             if ($logUpdResult->isError()) {
                 echo "\n\nLogXmlrpcServer update failed\n";
                 echo $logUpdResult->getErrors(true)->toString() . "\n\n";
                 echo "Output:\n" . $output;
             }
         } else {
             echo "\n\nLogXmlrpcServer add failed\n";
             print_r($logAddResult, true);
             //echo $logAddResult->getErrors(true)->toString() . "\n\n";
             echo "Output:\n" . $output;
         }
     } catch (\Exception $e) {
         echo "\n\n" . $e->getMessage() . "\n" . $e->getTraceAsString() . "\n\n";
     }
     $output2 = ob_get_contents();
     /*
             if ($output2) {
                 $file = Zend_Registry::get('dir')->tmp . '/front_services_exception.txt';
                 @file_put_contents($file, $output2);
                 @chmod($file, 0664);
                 //App_Logger_Db::log($output2, Zend_Log::ERR);
             }
     */
     ob_end_clean();
     // Пишем в логи для xml-rpc сервера
     echo $response;
 }
Exemplo n.º 9
0
 public function testCreatingFaultWithEmptyMessageResultsInUnknownError()
 {
     $fault = $this->_server->fault('', 123);
     $this->assertSame('Unknown Error', $fault->getMessage());
     $this->assertSame(123, $fault->getCode());
 }