function main_showmethods($eventData) { global $wuiMainFrame, $innomaticLocale, $wuiMainStatus, $wuiTitleBar; $accQuery = \Innomatic\Core\InnomaticContainer::instance('\\Innomatic\\Core\\InnomaticContainer')->getDataAccess()->execute('SELECT name FROM webservices_accounts WHERE id=' . $eventData['accountid']); $accData = $accQuery->getFields(); $wuiVGroup = new WuiVertgroup('vgroup'); $xmlrpcAccount = new \Innomatic\Webservices\WebServicesAccount($eventData['accountid']); $xmlrpcClient = new \Innomatic\Webservices\Xmlrpc\XmlRpcClient($xmlrpcAccount->mPath, $xmlrpcAccount->mHost, $xmlrpcAccount->mPort); $xmlrpcClient->setProxy($xmlrpcAccount->mProxy, $xmlrpcAccount->mProxyPort); $xmlrpcClient->setCredentials($xmlrpcAccount->mUsername, $xmlrpcAccount->mPassword); $xmlrpcMessage = new \Innomatic\Webservices\Xmlrpc\XmlRpcMsg('system.listMethods'); $xmlrpcResp = $xmlrpcClient->Send($xmlrpcMessage); if ($xmlrpcResp) { if (!$xmlrpcResp->FaultCode()) { $xv = $xmlrpcResp->Value(); if (is_object($xv)) { $methods = \Innomatic\Webservices\Xmlrpc\php_xmlrpc_decode($xv); //$methods_val = $xv->scalarVal(); if (is_array($methods)) { $headers[0]['label'] = $innomaticLocale->getStr('method.header'); $methodsTable = new WuiTable('methods', array('elements' => [], 'headers' => $headers, 'rowsperpage' => '20', 'pagesactionfunction' => 'methods_list_action_builder', 'pagenumber' => isset($eventData['methodspage']) ? $eventData['methodspage'] : 1)); $row = 0; while (list($key, $val) = each($methods)) { $methodsTable->addChild(new WuiLabel('method', array('label' => $val)), $row, 0); $row++; } $wuiVGroup->addChild($methodsTable); } } } else { $wuiMainStatus->mArgs['status'] = $innomaticLocale->getStr('server_response_error'); } } else { $wuiMainStatus->mArgs['status'] = $innomaticLocale->getStr('invalid_server_response'); } //$wuiVGroup $wuiMainFrame->addChild($wuiVGroup); $wuiTitleBar->mArgs['title'] .= ' - ' . $accData['name'] . ' - ' . $innomaticLocale->getStr('showmethods_title'); }
/** * Executes a remote call to the Module server. * * @param string $method Remote Module method name to call. * @param array $args Optional arguments. * @return mixed Remote object result value. * @since 5.1 */ protected function moduleXmlRpcCall($method, $args = null) { $method = strtolower($method); $request_body = xmlrpc_encode_request($method, $args); $content_len = strlen($request_body); $fd = @fsockopen($this->locator->getHost(), $this->locator->getPort(), $errno, $errstr, 10); if (!$fd) { throw new ModuleException('Could not open socket for remote Module [host=' . $this->locator->getHost() . ', port=' . $this->locator->getPort() . ']'); } $http_request = 'INVOKE ' . $this->locator->getLocation() . " Module/1.0\r\n"; $http_request .= 'User-Agent: Innomatic Module server 5.1' . "\r\n"; // !!! check host and port $http_request .= 'Host: ' . $this->locator->getHost() . ':' . $this->locator->getPort() . "\r\n"; if ($this->sessionId) { $http_request .= 'Session: ' . $this->sessionId . "\r\n"; } if ($this->locator->getUsername() != '' and $this->locator->getPassword() != '') { $http_request .= 'User: '******'Password: '******'Authorization: Basic '.base64_encode($this->locator->getUsername().':'.$this->locator->getPassword())."\r\n"; } $http_request .= "Content-Type: text/xml\r\n"; $http_request .= "Content-Length: {$content_len}\r\n"; $http_request .= "\r\n"; $http_request .= $request_body; if (fputs($fd, $http_request, strlen($http_request)) != strlen($http_request)) { throw new ModuleException('Module server connection closed too early'); } $response_status = 0; $headers_parsed = false; $response_body = ''; $response_headers = array(); while (!feof($fd)) { $line = fgets($fd, 4096); if ($headers_parsed == false) { if ($line === "\r\n" || $line === "\n") { $headers_parsed = true; } else { if (ereg('^([.Module/0-9]+) ([0-9]+)', $line, $regs)) { $response_status = $regs[2]; } else { $response_headers[substr($line, 0, strpos($line, ':'))] = trim(substr($line, strpos($line, ':') + 1)); } } } else { $response_body .= $line; } } fclose($fd); if ($headers_parsed == false || $response_status == 0) { throw new ModuleException('Invalid response from Module server'); } switch ($response_status) { case 200: break; case 401: throw new ModuleException('Not authorized'); break; case 403: throw new ModuleException('Forbidden'); break; case 500: throw new ModuleException('Internal server error'); break; default: throw new ModuleException('Invalid return status ' . $response_status . ' from Module server'); } if (isset($response_headers['Session'])) { $this->sessionId = $response_headers['Session']; } $return_value = \Innomatic\Webservices\Xmlrpc\php_xmlrpc_decode($response_body); if ($return_value == null) { throw new ModuleException('XML-RPC decode failed, invalid XML-RPC response from Module server'); } // Todo: process XML-RPC errors here return $return_value; }
/** * Lists the available application versions. * * @param integer $repId Repository id. * @param integer $applicationId Application id. * @param bool $refresh Set to true if a cache refresh is requested. * @access public * @return array */ public function listAvailableApplicationVersions($repId, $applicationId, $refresh = false) { $result = false; $cachedItem = new \Innomatic\Datatransfer\Cache\CachedItem($this->dataAccess, 'appcentral-client', 'repository_application_versions-' . $this->id . '-' . $repId . '-' . $applicationId); $goon = true; if (!$refresh) { $cacheContent = $cachedItem->retrieve(); if ($cacheContent != false) { $goon = false; $result = unserialize($cacheContent); } } if ($goon) { $xmlrpcMessage = new \Innomatic\Webservices\Xmlrpc\XmlRpcMsg('appcentral-server.list_available_application_versions', array(new \Innomatic\Webservices\Xmlrpc\XmlRpcVal($repId, 'int'), new \Innomatic\Webservices\Xmlrpc\XmlRpcVal($applicationId, 'int'))); $xmlrpcResp = $this->client->send($xmlrpcMessage); if ($xmlrpcResp) { if (!$xmlrpcResp->faultCode()) { $xv = \Innomatic\Webservices\Xmlrpc\php_xmlrpc_decode($xmlrpcResp->value()); if (is_array($xv)) { $cachedItem->store(serialize($xv)); $result = $xv; } else { $this->log->logEvent(['root' => ''], 'innomatic.appcentralremoteserver.listavailableapplications', 'Not an array from server', \Innomatic\Logging\Logger::ERROR); } } else { $this->log->logEvent(['root' => ''], 'innomatic.appcentralremoteserver.listavailableapplications', 'Error in response from server: ' . $xmlrpcResp->faultString(), \Innomatic\Logging\Logger::ERROR); } } else { $this->log->logEvent(['root' => ''], 'innomatic.appcentralremoteserver.listavailableapplications', 'Invalid response from server', \Innomatic\Logging\Logger::ERROR); } } return $result; }