| Total Complexity | 132 |
| Total Lines | 937 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
Complex classes like RApiHalHelper often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use RApiHalHelper, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 23 | class RApiHalHelper |
||
| 24 | { |
||
| 25 | /** |
||
| 26 | * An array to hold webservices xmls |
||
| 27 | * |
||
| 28 | * @var array |
||
| 29 | * @since 1.2 |
||
| 30 | */ |
||
| 31 | public static $webservices = array(); |
||
| 32 | |||
| 33 | /** |
||
| 34 | * An array to hold installed Webservices data |
||
| 35 | * |
||
| 36 | * @var array |
||
| 37 | * @since 1.2 |
||
| 38 | */ |
||
| 39 | public static $installedWebservices = null; |
||
| 40 | |||
| 41 | /** |
||
| 42 | * Method to transform XML to array and get XML attributes |
||
| 43 | * |
||
| 44 | * @param SimpleXMLElement $xmlElement XML object to transform |
||
| 45 | * @param boolean $onlyAttributes return only attributes or all elements |
||
| 46 | * |
||
| 47 | * @return array |
||
| 48 | * |
||
| 49 | * @since 1.2 |
||
| 50 | */ |
||
| 51 | public static function getXMLElementAttributes($xmlElement, $onlyAttributes = true) |
||
| 52 | { |
||
| 53 | $transformedXML = json_decode(json_encode((array) $xmlElement), true); |
||
| 54 | |||
| 55 | return $onlyAttributes ? $transformedXML['@attributes'] : $transformedXML; |
||
| 56 | } |
||
| 57 | |||
| 58 | /** |
||
| 59 | * Get Webservices path |
||
| 60 | * |
||
| 61 | * @return string |
||
| 62 | * |
||
| 63 | * @since 1.2 |
||
| 64 | */ |
||
| 65 | public static function getWebservicesPath() |
||
| 66 | { |
||
| 67 | return JPATH_ROOT . '/' . self::getWebservicesRelativePath(); |
||
| 68 | } |
||
| 69 | |||
| 70 | /** |
||
| 71 | * Get Webservices path |
||
| 72 | * |
||
| 73 | * @return string |
||
| 74 | * |
||
| 75 | * @since 1.2 |
||
| 76 | */ |
||
| 77 | public static function getWebservicesRelativePath() |
||
| 78 | { |
||
| 79 | return 'media/redcore/webservices'; |
||
| 80 | } |
||
| 81 | |||
| 82 | /** |
||
| 83 | * Get Default scopes for all webservices |
||
| 84 | * |
||
| 85 | * @return array |
||
| 86 | * |
||
| 87 | * @since 1.2 |
||
| 88 | */ |
||
| 89 | public static function getDefaultScopes() |
||
| 90 | { |
||
| 91 | return array( |
||
| 92 | array('scope' => 'site.create', |
||
| 93 | 'scopeDisplayName' => JText::_('JSITE') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_CREATE')), |
||
| 94 | array('scope' => 'site.read', |
||
| 95 | 'scopeDisplayName' => JText::_('JSITE') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_READ')), |
||
| 96 | array('scope' => 'site.update', |
||
| 97 | 'scopeDisplayName' => JText::_('JSITE') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_UPDATE')), |
||
| 98 | array('scope' => 'site.delete', |
||
| 99 | 'scopeDisplayName' => JText::_('JSITE') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_DELETE')), |
||
| 100 | array('scope' => 'site.task', |
||
| 101 | 'scopeDisplayName' => JText::_('JSITE') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_TASKS')), |
||
| 102 | array('scope' => 'site.documentation', |
||
| 103 | 'scopeDisplayName' => JText::_('JSITE') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_DOCUMENTATION')), |
||
| 104 | array('scope' => 'administrator.create', |
||
| 105 | 'scopeDisplayName' => JText::_('JADMINISTRATOR') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_CREATE')), |
||
| 106 | array('scope' => 'administrator.read', |
||
| 107 | 'scopeDisplayName' => JText::_('JADMINISTRATOR') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_READ')), |
||
| 108 | array('scope' => 'administrator.update', |
||
| 109 | 'scopeDisplayName' => JText::_('JADMINISTRATOR') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_UPDATE')), |
||
| 110 | array('scope' => 'administrator.delete', |
||
| 111 | 'scopeDisplayName' => JText::_('JADMINISTRATOR') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_DELETE')), |
||
| 112 | array('scope' => 'administrator.task', |
||
| 113 | 'scopeDisplayName' => JText::_('JADMINISTRATOR') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_TASKS')), |
||
| 114 | array('scope' => 'administrator.documentation', |
||
| 115 | 'scopeDisplayName' => JText::_('JADMINISTRATOR') . ' - ' . JText::_('LIB_REDCORE_API_OAUTH2_CLIENTS_SCOPES_ALL_WEBSERVICES_DOCUMENTATION')), |
||
| 116 | ); |
||
| 117 | } |
||
| 118 | |||
| 119 | /** |
||
| 120 | * Method to transform XML to array and get XML attributes |
||
| 121 | * |
||
| 122 | * @param SimpleXMLElement|Array $element XML object or array |
||
| 123 | * @param string $key Key to check |
||
| 124 | * @param boolean $default Default value to return |
||
| 125 | * |
||
| 126 | * @return boolean |
||
| 127 | * |
||
| 128 | * @since 1.2 |
||
| 129 | */ |
||
| 130 | public static function isAttributeTrue($element, $key, $default = false) |
||
| 138 | } |
||
| 139 | |||
| 140 | /** |
||
| 141 | * Method to transform XML to array and get XML attributes |
||
| 142 | * |
||
| 143 | * @param SimpleXMLElement|Array $element XML object or array |
||
| 144 | * @param string $key Key to check |
||
| 145 | * @param string $default Default value to return |
||
| 146 | * |
||
| 147 | * @return boolean |
||
| 148 | * |
||
| 149 | * @since 1.2 |
||
| 150 | */ |
||
| 151 | public static function attributeToString($element, $key, $default = '') |
||
| 152 | { |
||
| 153 | if (!isset($element[$key])) |
||
| 154 | { |
||
| 155 | return $default; |
||
| 156 | } |
||
| 157 | |||
| 158 | $value = (string) $element[$key]; |
||
| 159 | |||
| 160 | return !empty($value) ? $value : $default; |
||
| 161 | } |
||
| 162 | |||
| 163 | /** |
||
| 164 | * Method to get Task from request |
||
| 165 | * |
||
| 166 | * @return string Task name |
||
| 167 | * |
||
| 168 | * @since 1.2 |
||
| 169 | */ |
||
| 170 | public static function getTask() |
||
| 171 | { |
||
| 172 | $command = JFactory::getApplication()->input->get('task', ''); |
||
| 173 | |||
| 174 | // Check for array format. |
||
| 175 | $filter = JFilterInput::getInstance(); |
||
| 176 | |||
| 177 | if (is_array($command)) |
||
| 178 | { |
||
| 179 | $command = $filter->clean(array_pop(array_keys($command)), 'cmd'); |
||
| 180 | } |
||
| 181 | else |
||
| 182 | { |
||
| 183 | $command = $filter->clean($command, 'cmd'); |
||
| 184 | } |
||
| 185 | |||
| 186 | // Check for a controller.task command. |
||
| 187 | if (strpos($command, '.') !== false) |
||
| 188 | { |
||
| 189 | // Explode the controller.task command. |
||
| 190 | list ($type, $task) = explode('.', $command); |
||
| 191 | } |
||
| 192 | else |
||
| 193 | { |
||
| 194 | $task = $command; |
||
| 195 | } |
||
| 196 | |||
| 197 | return $task; |
||
| 198 | } |
||
| 199 | |||
| 200 | /** |
||
| 201 | * Loading of webservice XML file |
||
| 202 | * |
||
| 203 | * @param string $client Client |
||
| 204 | * @param string $webserviceName Webservice name |
||
| 205 | * @param string $version Version of the webservice |
||
| 206 | * @param string $path Path to webservice files |
||
| 207 | * @param bool $showNotifications Show notifications |
||
| 208 | * |
||
| 209 | * @throws Exception |
||
| 210 | * @return array List of objects |
||
| 211 | */ |
||
| 212 | public static function getWebservices($client = '', $webserviceName = '', $version = '1.0.0', $path = '', $showNotifications = false) |
||
| 213 | { |
||
| 214 | if (empty(self::$webservices) || (!empty($webserviceName) && empty(self::$webservices[$client][$webserviceName][$version]))) |
||
| 215 | { |
||
| 216 | try |
||
| 217 | { |
||
| 218 | self::loadWebservices($client, $webserviceName, $version, $path); |
||
| 219 | } |
||
| 220 | catch (Exception $e) |
||
| 221 | { |
||
| 222 | if ($showNotifications) |
||
| 223 | { |
||
| 224 | JFactory::getApplication()->enqueueMessage($e->getMessage(), 'message'); |
||
| 225 | } |
||
| 226 | else |
||
| 227 | { |
||
| 228 | throw $e; |
||
| 229 | } |
||
| 230 | } |
||
| 231 | } |
||
| 232 | |||
| 233 | if (empty($webserviceName)) |
||
| 234 | { |
||
| 235 | return self::$webservices; |
||
| 236 | } |
||
| 237 | |||
| 238 | if (!empty(self::$webservices[$client][$webserviceName][$version])) |
||
| 239 | { |
||
| 240 | return self::$webservices[$client][$webserviceName][$version]; |
||
| 241 | } |
||
| 242 | |||
| 243 | return array(); |
||
| 244 | } |
||
| 245 | |||
| 246 | /** |
||
| 247 | * Loading of related XML files |
||
| 248 | * |
||
| 249 | * @param string $client Client |
||
| 250 | * @param string $webserviceName Webservice name |
||
| 251 | * @param string $version Version of the webservice |
||
| 252 | * @param string $path Path to webservice files |
||
| 253 | * @param bool $showNotifications Show notifications |
||
| 254 | * |
||
| 255 | * @throws Exception |
||
| 256 | * @return array List of objects |
||
| 257 | */ |
||
| 258 | public static function loadWebservices($client = '', $webserviceName = '', $version = '1.0.0', $path = '', $showNotifications = false) |
||
| 259 | { |
||
| 260 | if (empty($webserviceName)) |
||
| 261 | { |
||
| 262 | $folders = JFolder::folders(self::getWebservicesPath(), '.', true); |
||
| 263 | $webserviceXmls[' '] = JFolder::files(self::getWebservicesPath(), '.xml'); |
||
| 264 | |||
| 265 | foreach ($folders as $folder) |
||
| 266 | { |
||
| 267 | $webserviceXmls[$folder] = JFolder::files(self::getWebservicesPath() . '/' . $folder, '.xml'); |
||
| 268 | } |
||
| 269 | |||
| 270 | foreach ($webserviceXmls as $webserviceXmlPath => $webservices) |
||
| 271 | { |
||
| 272 | foreach ($webservices as $webservice) |
||
| 273 | { |
||
| 274 | try |
||
| 275 | { |
||
| 276 | // Version, Extension and Client are already part of file name |
||
| 277 | $xml = self::loadWebserviceConfiguration($webservice, $version = '', $extension = '', trim($webserviceXmlPath)); |
||
| 278 | |||
| 279 | if (!empty($xml)) |
||
| 280 | { |
||
| 281 | $client = self::getWebserviceClient($xml); |
||
| 282 | $version = !empty($xml->config->version) ? (string) $xml->config->version : $version; |
||
| 283 | $xml->webservicePath = trim($webserviceXmlPath); |
||
| 284 | self::$webservices[$client][(string) $xml->config->name][$version] = $xml; |
||
| 285 | } |
||
| 286 | } |
||
| 287 | catch (Exception $e) |
||
| 288 | { |
||
| 289 | if ($showNotifications) |
||
| 290 | { |
||
| 291 | JFactory::getApplication()->enqueueMessage($e->getMessage(), 'message'); |
||
| 292 | } |
||
| 293 | else |
||
| 294 | { |
||
| 295 | throw $e; |
||
| 296 | } |
||
| 297 | } |
||
| 298 | } |
||
| 299 | } |
||
| 300 | } |
||
| 301 | else |
||
| 302 | { |
||
| 303 | try |
||
| 304 | { |
||
| 305 | $xml = self::loadWebserviceConfiguration($webserviceName, $version, 'xml', $path, $client); |
||
| 306 | |||
| 307 | if (!empty($xml)) |
||
| 308 | { |
||
| 309 | $client = self::getWebserviceClient($xml); |
||
| 310 | $version = !empty($xml->config->version) ? (string) $xml->config->version : $version; |
||
| 311 | $xml->webservicePath = trim($path); |
||
| 312 | self::$webservices[$client][(string) $xml->config->name][$version] = $xml; |
||
| 313 | } |
||
| 314 | } |
||
| 315 | catch (Exception $e) |
||
| 316 | { |
||
| 317 | if ($showNotifications) |
||
| 318 | { |
||
| 319 | JFactory::getApplication()->enqueueMessage($e->getMessage(), 'message'); |
||
| 320 | } |
||
| 321 | else |
||
| 322 | { |
||
| 323 | throw $e; |
||
| 324 | } |
||
| 325 | } |
||
| 326 | } |
||
| 327 | } |
||
| 328 | |||
| 329 | /** |
||
| 330 | * Method to finds the full real file path, checking possible overrides |
||
| 331 | * |
||
| 332 | * @param string $client Client |
||
| 333 | * @param string $webserviceName Name of the webservice |
||
| 334 | * @param string $version Suffixes to the file name (ex. 1.0.0) |
||
| 335 | * @param string $extension Extension of the file to search |
||
| 336 | * @param string $path Path to webservice files |
||
| 337 | * |
||
| 338 | * @return string The full path to the api file |
||
| 339 | * |
||
| 340 | * @since 1.2 |
||
| 341 | */ |
||
| 342 | public static function getWebserviceFile($client, $webserviceName, $version = '', $extension = 'xml', $path = '') |
||
| 343 | { |
||
| 344 | JLoader::import('joomla.filesystem.path'); |
||
| 345 | |||
| 346 | if (!empty($webserviceName)) |
||
| 347 | { |
||
| 348 | $version = !empty($version) ? array(JPath::clean($version)) : array('1.0.0'); |
||
| 349 | $webservicePath = !empty($path) ? self::getWebservicesPath() . '/' . $path : self::getWebservicesPath(); |
||
| 350 | |||
| 351 | // Search for suffixed versions. Example: content.1.0.0.xml |
||
| 352 | if (!empty($version)) |
||
| 353 | { |
||
| 354 | foreach ($version as $suffix) |
||
| 355 | { |
||
| 356 | $rawPath = $webserviceName . '.' . $suffix; |
||
| 357 | $rawPath = !empty($extension) ? $rawPath . '.' . $extension : $rawPath; |
||
| 358 | $rawPath = !empty($client) ? $client . '.' . $rawPath : $rawPath; |
||
| 359 | |||
| 360 | if ($configurationFullPath = JPath::find($webservicePath, $rawPath)) |
||
| 361 | { |
||
| 362 | return $configurationFullPath; |
||
| 363 | } |
||
| 364 | } |
||
| 365 | } |
||
| 366 | |||
| 367 | // Standard version |
||
| 368 | $rawPath = !empty($extension) ? $webserviceName . '.' . $extension : $webserviceName; |
||
| 369 | $rawPath = !empty($client) ? $client . '.' . $rawPath : $rawPath; |
||
| 370 | |||
| 371 | return JPath::find($webservicePath, $rawPath); |
||
| 372 | } |
||
| 373 | |||
| 374 | return null; |
||
| 375 | } |
||
| 376 | |||
| 377 | /** |
||
| 378 | * Load configuration file and set all Api parameters |
||
| 379 | * |
||
| 380 | * @param array $webserviceName Name of the webservice file |
||
| 381 | * @param string $version Suffixes for loading of webservice configuration file |
||
| 382 | * @param string $extension File extension name |
||
| 383 | * @param string $path Path to webservice files |
||
| 384 | * @param string $client Client |
||
| 385 | * |
||
| 386 | * @return SimpleXMLElement Loaded configuration object |
||
| 387 | * |
||
| 388 | * @since 1.2 |
||
| 389 | * @throws Exception |
||
| 390 | */ |
||
| 391 | public static function loadWebserviceConfiguration($webserviceName, $version = '', $extension = 'xml', $path = '', $client = '') |
||
| 392 | { |
||
| 393 | // Check possible overrides, and build the full path to api file |
||
| 394 | $configurationFullPath = self::getWebserviceFile($client, strtolower($webserviceName), $version, $extension, $path); |
||
| 395 | |||
| 396 | if (!is_readable($configurationFullPath)) |
||
| 397 | { |
||
| 398 | throw new Exception(JText::_('LIB_REDCORE_API_HAL_WEBSERVICE_CONFIGURATION_FILE_UNREADABLE')); |
||
| 399 | } |
||
| 400 | |||
| 401 | $content = @file_get_contents($configurationFullPath); |
||
| 402 | |||
| 403 | if (is_string($content)) |
||
| 404 | { |
||
| 405 | return new SimpleXMLElement($content); |
||
| 406 | } |
||
| 407 | |||
| 408 | return null; |
||
| 409 | } |
||
| 410 | |||
| 411 | /** |
||
| 412 | * Upload Webservices config files to redcore media location |
||
| 413 | * |
||
| 414 | * @param array $files The array of Files (file descriptor returned by PHP) |
||
| 415 | * |
||
| 416 | * @return boolean Returns true if Upload was successful |
||
| 417 | */ |
||
| 418 | public static function uploadWebservice($files = array()) |
||
| 419 | { |
||
| 420 | $uploadOptions = array( |
||
| 421 | 'allowedFileExtensions' => 'xml', |
||
| 422 | 'allowedMIMETypes' => 'application/xml, text/xml', |
||
| 423 | 'overrideExistingFile' => true, |
||
| 424 | ); |
||
| 425 | |||
| 426 | foreach ($files as $key => &$file) |
||
| 427 | { |
||
| 428 | $objectFile = new JObject($file); |
||
| 429 | |||
| 430 | try |
||
| 431 | { |
||
| 432 | $content = file_get_contents($objectFile->tmp_name); |
||
| 433 | $fileContent = null; |
||
| 434 | |||
| 435 | if (is_string($content)) |
||
| 436 | { |
||
| 437 | $fileContent = new SimpleXMLElement($content); |
||
| 438 | } |
||
| 439 | |||
| 440 | $name = (string) $fileContent->config->name; |
||
| 441 | $version = !empty($fileContent->config->version) ? (string) $fileContent->config->version : '1.0.0'; |
||
| 442 | |||
| 443 | $client = self::getWebserviceClient($fileContent); |
||
| 444 | |||
| 445 | $file['name'] = $client . '.' . $name . '.' . $version . '.xml'; |
||
| 446 | } |
||
| 447 | catch (Exception $e) |
||
| 448 | { |
||
| 449 | unset($files[$key]); |
||
| 450 | JFactory::getApplication()->enqueueMessage(JText::_('COM_REDCORE_WEBSERVICES_WEBSERVICE_FILE_NOT_VALID'), 'message'); |
||
| 451 | } |
||
| 452 | } |
||
| 453 | |||
| 454 | return RFilesystemFile::uploadFiles($files, self::getWebservicesPath() . '/upload', $uploadOptions); |
||
| 455 | } |
||
| 456 | |||
| 457 | /** |
||
| 458 | * Method to save the OAuth2 scopes |
||
| 459 | * |
||
| 460 | * @param string $client Client |
||
| 461 | * @param string $webservice Webservice name |
||
| 462 | * @param array $scopes Scopes defined in webservice |
||
| 463 | * @param bool $showNotifications Show notification after each Action |
||
| 464 | * |
||
| 465 | * @throws Exception |
||
| 466 | * @return bool True on success, false on failure. |
||
| 467 | */ |
||
| 468 | public static function saveOAuth2Scopes($client, $webservice, $scopes = array(), $showNotifications = true) |
||
| 469 | { |
||
| 470 | $db = JFactory::getDbo(); |
||
| 471 | |||
| 472 | try |
||
| 473 | { |
||
| 474 | $db->transactionStart(); |
||
| 475 | |||
| 476 | $query = $db->getQuery(true) |
||
| 477 | ->delete('#__redcore_oauth_scopes')->where($db->qn('scope') . ' LIKE ' . $db->q($client . '.' . $webservice . '.%')); |
||
| 478 | $db->setQuery($query); |
||
| 479 | $db->execute(); |
||
| 480 | |||
| 481 | foreach ($scopes as $scope) |
||
| 482 | { |
||
| 483 | $query = $db->getQuery(true) |
||
| 484 | ->insert('#__redcore_oauth_scopes')->set($db->qn('scope') . ' = ' . $db->q($scope['scope'])); |
||
| 485 | $db->setQuery($query); |
||
| 486 | $db->execute(); |
||
| 487 | } |
||
| 488 | |||
| 489 | $db->transactionCommit(); |
||
| 490 | } |
||
| 491 | catch (Exception $e) |
||
| 492 | { |
||
| 493 | $db->transactionRollback(); |
||
| 494 | |||
| 495 | if ($showNotifications) |
||
| 496 | { |
||
| 497 | JFactory::getApplication()->enqueueMessage(JText::_('COM_REDCORE_WEBSERVICES_WEBSERVICE_SCOPE_ERROR'), 'error'); |
||
| 498 | } |
||
| 499 | } |
||
| 500 | } |
||
| 501 | |||
| 502 | /** |
||
| 503 | * Get list of all webservices from Redcore parameters |
||
| 504 | * |
||
| 505 | * @return array Array or table with columns columns |
||
| 506 | */ |
||
| 507 | public static function getInstalledWebservices() |
||
| 508 | { |
||
| 509 | if (!isset(self::$installedWebservices)) |
||
| 510 | { |
||
| 511 | self::$installedWebservices = array(); |
||
| 512 | $db = JFactory::getDbo(); |
||
| 513 | |||
| 514 | $query = $db->getQuery(true) |
||
| 515 | ->select('*') |
||
| 516 | ->from('#__redcore_webservices') |
||
| 517 | ->order('created_date ASC'); |
||
| 518 | |||
| 519 | $db->setQuery($query); |
||
| 520 | $webservices = $db->loadObjectList(); |
||
| 521 | |||
| 522 | if (!empty($webservices)) |
||
| 523 | { |
||
| 524 | foreach ($webservices as $webservice) |
||
| 525 | { |
||
| 526 | self::$installedWebservices[$webservice->client][$webservice->name][$webservice->version] = ArrayHelper::fromObject($webservice); |
||
| 527 | } |
||
| 528 | } |
||
| 529 | } |
||
| 530 | |||
| 531 | return self::$installedWebservices; |
||
| 532 | } |
||
| 533 | |||
| 534 | /** |
||
| 535 | * Get installed webservice options |
||
| 536 | * |
||
| 537 | * @param string $client Client |
||
| 538 | * @param string $webserviceName Webservice Name |
||
| 539 | * @param string $version Webservice version |
||
| 540 | * |
||
| 541 | * @return array Array of webservice options |
||
| 542 | */ |
||
| 543 | public static function getInstalledWebservice($client, $webserviceName, $version) |
||
| 544 | { |
||
| 545 | // Initialise Installed webservices |
||
| 546 | $webservices = self::getInstalledWebservices(); |
||
| 547 | |||
| 548 | if (!empty($webservices[$client][$webserviceName][$version])) |
||
| 549 | { |
||
| 550 | return $webservices[$client][$webserviceName][$version]; |
||
| 551 | } |
||
| 552 | |||
| 553 | return null; |
||
| 554 | } |
||
| 555 | |||
| 556 | /** |
||
| 557 | * Checks if specific Webservice is installed and active |
||
| 558 | * |
||
| 559 | * @param string $client Client |
||
| 560 | * @param string $webserviceName Webservice Name |
||
| 561 | * @param string $version Webservice version |
||
| 562 | * |
||
| 563 | * @return array Array or table with columns columns |
||
| 564 | */ |
||
| 565 | public static function isPublishedWebservice($client, $webserviceName, $version) |
||
| 566 | { |
||
| 567 | $installedWebservices = self::getInstalledWebservices(); |
||
| 568 | |||
| 569 | if (!empty($installedWebservices)) |
||
| 570 | { |
||
| 571 | if (empty($version)) |
||
| 572 | { |
||
| 573 | $version = self::getNewestWebserviceVersion($client, $webserviceName); |
||
| 574 | } |
||
| 575 | |||
| 576 | $webservice = $installedWebservices[$client][$webserviceName][$version]; |
||
| 577 | |||
| 578 | return !empty($webservice['state']); |
||
| 579 | } |
||
| 580 | |||
| 581 | return false; |
||
| 582 | } |
||
| 583 | |||
| 584 | /** |
||
| 585 | * Checks if specific Webservice is installed and active |
||
| 586 | * |
||
| 587 | * @param string $client Client |
||
| 588 | * @param string $webserviceName Webservice Name |
||
| 589 | * |
||
| 590 | * @return array Array or table with columns columns |
||
| 591 | */ |
||
| 592 | public static function getNewestWebserviceVersion($client, $webserviceName) |
||
| 593 | { |
||
| 594 | $installedWebservices = self::getInstalledWebservices(); |
||
| 595 | |||
| 596 | if (!empty($installedWebservices) && isset($installedWebservices[$client][$webserviceName])) |
||
| 597 | { |
||
| 598 | // First element is always newest |
||
| 599 | foreach ($installedWebservices[$client][$webserviceName] as $version => $webservice) |
||
| 600 | { |
||
| 601 | return $version; |
||
| 602 | } |
||
| 603 | } |
||
| 604 | |||
| 605 | return '1.0.0'; |
||
| 606 | } |
||
| 607 | |||
| 608 | /** |
||
| 609 | * Returns Client of the webservice |
||
| 610 | * |
||
| 611 | * @param SimpleXMLElement|array $xmlElement XML object |
||
| 612 | * |
||
| 613 | * @return string |
||
| 614 | */ |
||
| 615 | public static function getWebserviceClient($xmlElement) |
||
| 616 | { |
||
| 617 | return !empty($xmlElement['client']) && strtolower($xmlElement['client']) == 'administrator' ? 'administrator' : 'site'; |
||
| 618 | } |
||
| 619 | |||
| 620 | /** |
||
| 621 | * Returns Scopes of the webservice |
||
| 622 | * |
||
| 623 | * @param array $filterScopes Scopes that will be used as a filter |
||
| 624 | * |
||
| 625 | * @return array |
||
| 626 | */ |
||
| 627 | public static function getWebserviceScopes($filterScopes = array()) |
||
| 628 | { |
||
| 629 | $options = array(); |
||
| 630 | $installedWebservices = self::getInstalledWebservices(); |
||
| 631 | |||
| 632 | if (empty($filterScopes)) |
||
| 633 | { |
||
| 634 | // Options for all webservices |
||
| 635 | $options[JText::_('COM_REDCORE_OAUTH_CLIENTS_SCOPES_ALL_WEBSERVICES')] = self::getDefaultScopes(); |
||
| 636 | } |
||
| 637 | |||
| 638 | if (!empty($installedWebservices)) |
||
| 639 | { |
||
| 640 | foreach ($installedWebservices as $webserviceClient => $webserviceNames) |
||
| 641 | { |
||
| 642 | foreach ($webserviceNames as $webserviceName => $webserviceVersions) |
||
| 643 | { |
||
| 644 | foreach ($webserviceVersions as $version => $webservice) |
||
| 645 | { |
||
| 646 | $webserviceDisplayName = JText::_('J' . $webserviceClient) . ' ' |
||
| 647 | . (!empty($webservice['title']) ? $webservice['title'] : $webserviceName); |
||
| 648 | |||
| 649 | if (!empty($webservice['scopes'])) |
||
| 650 | { |
||
| 651 | $scopes = json_decode($webservice['scopes'], true); |
||
| 652 | |||
| 653 | foreach ($scopes as $scope) |
||
| 654 | { |
||
| 655 | $scopeParts = explode('.', $scope['scope']); |
||
| 656 | |||
| 657 | // For global check of filtered scopes using $client . '.' . $operation |
||
| 658 | $globalCheck = $scopeParts[0] . '.' . $scopeParts[2]; |
||
| 659 | |||
| 660 | if (empty($filterScopes) || in_array($scope['scope'], $filterScopes) || in_array($globalCheck, $filterScopes)) |
||
| 661 | { |
||
| 662 | $options[$webserviceDisplayName][] = $scope; |
||
| 663 | } |
||
| 664 | } |
||
| 665 | } |
||
| 666 | } |
||
| 667 | } |
||
| 668 | } |
||
| 669 | } |
||
| 670 | |||
| 671 | return $options; |
||
| 672 | } |
||
| 673 | |||
| 674 | /** |
||
| 675 | * Generate a JWT |
||
| 676 | * |
||
| 677 | * @param string $privateKey The private key to use to sign the token |
||
| 678 | * @param string $iss The issuer, usually the client_id |
||
| 679 | * @param string $sub The subject, usually a user_id |
||
| 680 | * @param string $aud The audience, usually the URI for the oauth server |
||
| 681 | * @param string $exp The expiration date. If the current time is greater than the exp, the JWT is invalid |
||
| 682 | * @param string $nbf The "not before" time. If the current time is less than the nbf, the JWT is invalid |
||
| 683 | * @param string $jti The "jwt token identifier", or nonce for this JWT |
||
| 684 | * |
||
| 685 | * @return string JWT |
||
| 686 | */ |
||
| 687 | public static function generateJWT($privateKey, $iss, $sub, $aud, $exp = null, $nbf = null, $jti = null) |
||
| 688 | { |
||
| 689 | if (!$exp) |
||
| 690 | { |
||
| 691 | $exp = time() + 1000; |
||
| 692 | } |
||
| 693 | |||
| 694 | $params = array( |
||
| 695 | 'iss' => $iss, |
||
| 696 | 'sub' => $sub, |
||
| 697 | 'aud' => $aud, |
||
| 698 | 'exp' => $exp, |
||
| 699 | 'iat' => time(), |
||
| 700 | ); |
||
| 701 | |||
| 702 | if ($nbf) |
||
| 703 | { |
||
| 704 | $params['nbf'] = $nbf; |
||
| 705 | } |
||
| 706 | |||
| 707 | if ($jti) |
||
| 708 | { |
||
| 709 | $params['jti'] = $jti; |
||
| 710 | } |
||
| 711 | |||
| 712 | $jwtUtil = new \OAuth2\Encryption\Jwt; |
||
| 713 | |||
| 714 | return $jwtUtil->encode($params, $privateKey, 'RS256'); |
||
| 715 | } |
||
| 716 | |||
| 717 | /** |
||
| 718 | * Returns list of transform elements |
||
| 719 | * |
||
| 720 | * @return array |
||
| 721 | */ |
||
| 722 | public static function getTransformElements() |
||
| 723 | { |
||
| 724 | static $transformElements = null; |
||
| 725 | |||
| 726 | if (!is_null($transformElements)) |
||
| 727 | { |
||
| 728 | return $transformElements; |
||
| 729 | } |
||
| 730 | |||
| 731 | $transformElementsFiles = JFolder::files(JPATH_LIBRARIES . '/redcore/api/hal/transform', '.php'); |
||
| 732 | $transformElements = array(); |
||
| 733 | |||
| 734 | foreach ($transformElementsFiles as $transformElement) |
||
| 735 | { |
||
| 736 | if (!in_array($transformElement, array('interface.php', 'base.php'))) |
||
| 737 | { |
||
| 738 | $name = str_replace('.php', '', $transformElement); |
||
| 739 | $transformElements[] = array( |
||
| 740 | 'value' => $name, |
||
| 741 | 'text' => $name, |
||
| 742 | ); |
||
| 743 | } |
||
| 744 | } |
||
| 745 | |||
| 746 | return $transformElements; |
||
| 747 | } |
||
| 748 | |||
| 749 | /** |
||
| 750 | * Returns transform element that is appropriate to db type |
||
| 751 | * |
||
| 752 | * @param string $type Database type |
||
| 753 | * |
||
| 754 | * @return string |
||
| 755 | */ |
||
| 756 | public static function getTransformElementByDbType($type) |
||
| 757 | { |
||
| 758 | $type = explode('(', $type); |
||
| 759 | $type = strtoupper(trim($type[0])); |
||
| 760 | |||
| 761 | // We do not test for Varchar because fallback Transform Element String |
||
| 762 | switch ($type) |
||
| 763 | { |
||
| 764 | case 'TINYINT': |
||
| 765 | case 'SMALLINT': |
||
| 766 | case 'MEDIUMINT': |
||
| 767 | case 'INT': |
||
| 768 | case 'BIGINT': |
||
| 769 | return 'int'; |
||
| 770 | case 'FLOAT': |
||
| 771 | case 'DOUBLE': |
||
| 772 | case 'DECIMAL': |
||
| 773 | return 'float'; |
||
| 774 | case 'DATE': |
||
| 775 | case 'DATETIME': |
||
| 776 | case 'TIMESTAMP': |
||
| 777 | case 'TIME': |
||
| 778 | return 'datetime'; |
||
| 779 | } |
||
| 780 | |||
| 781 | return 'string'; |
||
| 782 | } |
||
| 783 | |||
| 784 | /** |
||
| 785 | * Returns uri to the webservice |
||
| 786 | * |
||
| 787 | * @param string $client Client |
||
| 788 | * @param string $name Name |
||
| 789 | * @param string $version Version |
||
| 790 | * @param string $appendApi Append api at the end or the URI |
||
| 791 | * @param string $appendFormat Append format at the end or the URI |
||
| 792 | * |
||
| 793 | * @return string |
||
| 794 | */ |
||
| 795 | public static function buildWebserviceUri($client, $name, $version, $appendApi = '', $appendFormat = '') |
||
| 796 | { |
||
| 797 | $uri = 'webserviceClient=' . $client |
||
| 798 | . '&webserviceVersion=' . $version; |
||
| 799 | |||
| 800 | // Views are separated by dash |
||
| 801 | $view = explode('-', $name); |
||
| 802 | $name = $view[0]; |
||
| 803 | |||
| 804 | $uri .= '&option=' . $name; |
||
| 805 | |||
| 806 | if (!empty($view[1])) |
||
| 807 | { |
||
| 808 | $uri .= '&view=' . $view[1]; |
||
| 809 | } |
||
| 810 | |||
| 811 | if (!empty($appendApi)) |
||
| 812 | { |
||
| 813 | $uri .= '&api=' . $appendApi; |
||
| 814 | } |
||
| 815 | |||
| 816 | if (!empty($appendFormat)) |
||
| 817 | { |
||
| 818 | $uri .= '&format=' . $appendFormat; |
||
| 819 | } |
||
| 820 | |||
| 821 | return $uri; |
||
| 822 | } |
||
| 823 | |||
| 824 | /** |
||
| 825 | * Returns Full URL to the webservice |
||
| 826 | * |
||
| 827 | * @param string $client Client |
||
| 828 | * @param string $name Name |
||
| 829 | * @param string $version Version |
||
| 830 | * @param string $appendApi Append api at the end or the URI |
||
| 831 | * @param string $appendFormat Append format at the end or the URI |
||
| 832 | * |
||
| 833 | * @return string |
||
| 834 | */ |
||
| 835 | public static function buildWebserviceFullUrl($client, $name, $version, $appendApi = '', $appendFormat = '') |
||
| 836 | { |
||
| 837 | $uri = self::buildWebserviceUri($client, $name, $version, $appendApi, $appendFormat); |
||
| 838 | |||
| 839 | return rtrim(JUri::base(), '/') . '/index.php?' . $uri; |
||
| 840 | } |
||
| 841 | |||
| 842 | /** |
||
| 843 | * Returns user credentials from globals |
||
| 844 | * |
||
| 845 | * @return array |
||
| 846 | */ |
||
| 847 | public static function getCredentialsFromGlobals() |
||
| 861 | } |
||
| 862 | |||
| 863 | /** |
||
| 864 | * Returns an array of fields from Element Fields properties |
||
| 865 | * |
||
| 866 | * @param SimpleXMLElement $xmlElement Xml element |
||
| 867 | * @param boolean $primaryKeys Only extract primary keys |
||
| 868 | * |
||
| 869 | * @return array |
||
| 870 | */ |
||
| 871 | public static function getFieldsArray($xmlElement, $primaryKeys = false) |
||
| 872 | { |
||
| 873 | $fields = array(); |
||
| 874 | |||
| 875 | if (isset($xmlElement->fields->field)) |
||
| 876 | { |
||
| 877 | foreach ($xmlElement->fields->field as $field) |
||
| 878 | { |
||
| 879 | $fieldAttributes = self::getXMLElementAttributes($field); |
||
| 880 | |||
| 881 | if (($primaryKeys && self::isAttributeTrue($field, 'isPrimaryField')) |
||
| 882 | || !$primaryKeys) |
||
| 883 | { |
||
| 884 | $fields[$fieldAttributes['name']] = $fieldAttributes; |
||
| 885 | } |
||
| 886 | } |
||
| 887 | } |
||
| 888 | |||
| 889 | // If there are no primary keys defined we will use id field as default |
||
| 890 | if (empty($fields) && $primaryKeys) |
||
| 891 | { |
||
| 892 | $fields['id'] = array('name' => 'id', 'transform' => 'int'); |
||
| 893 | } |
||
| 894 | |||
| 895 | return $fields; |
||
| 896 | } |
||
| 897 | |||
| 898 | /** |
||
| 899 | * Gets list of filter fields from operation configuration |
||
| 900 | * |
||
| 901 | * @param SimpleXMLElement $configuration Configuration for current action |
||
| 902 | * @param boolean $excludeSearch Exclude the search element, maintaining just the xml-provided fields |
||
| 903 | * @param boolean $fullDefinition Gets the full definition of the filter, not just the name |
||
| 904 | * |
||
| 905 | * @return array |
||
| 906 | * |
||
| 907 | * @since 1.3 |
||
| 908 | */ |
||
| 909 | public static function getFilterFields($configuration, $excludeSearch = false, $fullDefinition = false) |
||
| 960 | } |
||
| 961 | } |
||
| 962 |
This function has been deprecated. The supplier of the function has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.