app/libraries/CommonUtilities.php (354 lines of code) (raw):

<?php use Airavata\Model\Workspace\Notification; use Airavata\Model\Workspace\NotificationPriority; class CommonUtilities { /** * Print success message * @param $message */ public static function print_success_message($message) { echo '<div class="alert alert-success">' . $message . '</div>'; } /** * Print warning message * @param $message */ public static function print_warning_message($message) { echo '<div class="alert alert-warning">' . $message . '</div>'; } /** * Print error message * @param $message */ public static function print_error_message($message) { echo '<div class="alert alert-danger">' . $message . '</div>'; } /** * Print info message * @param $message */ public static function print_info_message($message) { echo '<div class="alert alert-info">' . $message . '</div>'; } /** * Redirect to the given url * @param $url */ public static function redirect($url) { echo '<meta http-equiv="Refresh" content="0; URL=' . $url . '">'; } /** * Return true if the form has been submitted * @return bool */ public static function form_submitted() { return isset($_POST['Submit']); } /** * Store username in session variables * @param $username */ public static function store_id_in_session($username) { Session::put('username', $username); Session::put('loggedin', true); } /** * Return true if the username stored in the session * @return bool */ public static function id_in_session() { if (Session::has("username") && Session::has('loggedin')) return true; else return false; } /** * Verify if the user is already logged in. If not, redirect to the home page. */ public static function verify_login() { if (CommonUtilities::id_in_session()) { return true; } else { CommonUtilities::print_error_message('User is not logged in!'); return false; } } /** * Create navigation bar * Used for all pages */ public static function create_nav_bar() { $menus = array(); if ( Session::has('loggedin') && ( Session::has('authorized-user') || Session::has('admin') || Session::has('admin-read-only')) && !Session::has("gateway-provider") ) { $menus = array ( 'Project' => array ( array('label' => 'Create', 'url' => URL::to('/') . '/project/create', "nav-active" => "project"), array('label' => 'Browse', 'url' => URL::to('/') . '/project/browse', "nav-active" => "project") ), 'Experiment' => array ( array('label' => 'Create', 'url' => URL::to('/') . '/experiment/create', "nav-active" => "experiment"), array('label' => 'Browse', 'url' => URL::to('/') . '/experiment/browse', "nav-active" => "experiment") ) ); if( isset( Config::get('pga_config.portal')['jira-help'])) { $menus['Help'] = array(); if( Config::get('pga_config.portal')['jira-help']['report-issue-script'] != '' && Config::get('pga_config.portal')['jira-help']['report-issue-collector-id'] != '') { $menus['Help'][] = array('label' => 'Report Issue', 'url' => '#', "nav-active", ""); } // array('label' => 'Forgot Password?', 'url' => URL::to('/') . '/forgot-password', "nav-active" => "") if( Config::get('pga_config.portal')['jira-help']['request-feature-script'] != '' && Config::get('pga_config.portal')['jira-help']['request-feature-collector-id'] != '') { $menus['Help'][] = array('label' => 'Request Feature', 'url' => '#', "nav-active", ""); } if( count( $menus['Help'] ) == 0 ) unset( $menus['Help']); } } $navbar = '<nav class="navbar navbar-inverse navbar-static-top" role="navigation"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-2"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <!-- <a class="navbar-brand" href="' . URL::to('home') . '" title="PHP Gateway with Airavata">PGA</a> --> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2"> <ul class="nav navbar-nav">'; $navbar .= '<li> <a href="' . URL::to("/") . '"> <span class="brand-logo"></span> </a> </li>'; foreach ($menus as $label => $options) { Session::has('loggedin') ? $disabled = '' : $disabled = ' class="disabled"'; $active = ""; if (Session::has("nav-active") && isset($options[0]['nav-active'])) { if ($options[0]['nav-active'] == Session::get("nav-active")) $active = " active "; } $navbar .= '<li class="dropdown ' . $active . '"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">' . $label . '<span class="caret"></span></a> <ul class="dropdown-menu" role="menu">'; if (Session::has('loggedin')) { foreach ($options as $option) { $id = strtolower(str_replace(' ', '-', $option['label'])); $navbar .= '<li' . $disabled . '><a href="' . $option['url'] . '" id=' . $id . '>' . $option['label'] . '</a></li>'; } } $navbar .= '</ul></li>'; } $active = ""; if(Session::has('loggedin') && (Session::has('authorized-user') || Session::has('admin') || Session::has('admin-read-only')) && !Session::has("gateway-provider") ){ if( Session::get("nav-active") == "storage") $active = "active"; $navbar .= '<li class="' . $active . '"><a href="' . URL::to("/") . '/files/browse"><span class="glyphicon glyphicon-folder-close"></span> Storage</a></li>'; } $navbar .= '</ul> <ul class="nav navbar-nav navbar-right">'; // right-aligned content if (Session::has('loggedin')) { $active = ""; if (Session::has("nav-active")) { if ("user-console" == Session::get("nav-active") || "user-dashboard" == Session::get("nav-active")) $active = " active "; } if( Session::has('authorized-user') || Session::has('admin') || Session::has('admin-read-only') || Session::has('gateway-provider')){ //notification bell $notices = array(); if (CommonUtilities::isAiravataUp()) { $notices = CommonUtilities::get_all_notices(); } $navbar .= CommonUtilities::get_notices_ui( $notices); } if ( (Session::has("admin") || Session::has("admin-read-only")) && !Session::has("gateway-provider") ) $navbar .= '<li class="' . $active . '"><a href="' . URL::to("/") . '/admin/dashboard"><span class="glyphicon glyphicon-user"></span>Admin Dashboard</a></li>'; else if ( Session::has("gateway-provider")) $navbar .= '<li class="' . $active . '"><a href="' . URL::to("/") . '/admin/dashboard"><span class="glyphicon glyphicon-user"></span>Dashboard</a></li>'; else $navbar .= '<li class="' . $active . '"><a href="' . URL::to("/") . '/account/dashboard"><span class="glyphicon glyphicon-user"></span>Dashboard</a></li>'; $navbar .= '<li class="dropdown' . (Session::get("nav-active") == 'user-menu' ? ' active' : '') . '"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">' . Session::get("username") . ' <span class="caret"></span></a>'; $navbar .= '<ul class="dropdown-menu" role="menu">'; if ( Session::has("existing-gateway-provider")) { $requestedGateways = Session::get("requestedGateways"); foreach( $requestedGateways as $gatewayId => $gateway){ if( $gateway["approvalStatus"] == "Approved"){ $navbar .= '<li><a href="' . URL::to('/') . '/admin/dashboard?gatewayId=' . $gateway["gatewayInfo"]->gatewayId . '">Manage ' . $gateway["gatewayInfo"]->gatewayName . '</a></li>'; } } } if( Session::has('authorized-user') || Session::has('admin') || Session::has('admin-read-only') || Session::has('gateway-provider') ){ $navbar .= '<li><a href="' . URL::to('/') . '/account/settings"><span class="glyphicon glyphicon-cog"></span> User settings</a></li>'; } $navbar .= '<li><a href="' . URL::to('/') . '/logout"><span class="glyphicon glyphicon-log-out"></span> Log out</a></li>'; $navbar .= '</ul></li>'; } else { if( CommonUtilities::hasAuthPasswordOption() ){ $navbar .= '<li><a href="' . URL::to('/') . '/create"><span class="glyphicon glyphicon-user"></span> Create account</a></li>'; } $navbar .= '<li><a href="' . URL::to('/') . '/login"><span class="glyphicon glyphicon-log-in"></span> Log in</a></li>'; } $navbar .= '</ul></div></div></nav>'; // Check if theme user has created links in their theme to the login and create account page. if( !Session::has('loggedin') && isset( Config::get('pga_config.portal')['theme-based-login-links-configured'])) { if( Config::get('pga_config.portal')['theme-based-login-links-configured'] ){ $navbar = ""; } } echo $navbar; } public static function get_notices_ui( $notices){ $notifVisibility = ""; $publishedNoticesCount = 0; $currentTime = floatval( time()*1000); $noticesUI = ""; foreach( $notices as $notice){ $endTime = $notice->expirationTime; if( $endTime == null) $endTime = $currentTime; if( $currentTime >= $notice->publishedTime && $currentTime <= $endTime) { $publishedNoticesCount++; $textColor = "text-info"; if( $notice->priority == NotificationPriority::LOW) $textColor = "text-primary"; elseif( $notice->priority ==NotificationPriority::NORMAL) $textColor = "text-warning"; elseif( $notice->priority == NotificationPriority::HIGH) $textColor = "text-danger"; $noticesUI .= ' <div class="notification"> <div class="notification-title ' . $textColor . '">' . $notice->title . '</div> <div class="notification-description"><strong>' . $notice->notificationMessage . '</strong></div> <div class="notification-ago time" unix-time="' . $notice->publishedTime/1000 . '">' . date("m/d/Y h:i:s A T", $notice->publishedTime/1000) . '</div> <div class="notification-icon"></div> </div> <!-- / .notification --> '; } } $countOfNotices = $publishedNoticesCount; $newNotices = 0; if( Session::has("notice-count")){ $newNotices = $countOfNotices - Session::get("notice-count"); } else $newNotices = $countOfNotices; if( $newNotices <=0) $notifVisibility = "hide"; $noticesUI = '<li clas="dropdown" style="color:#fff; relative">' . '<a href="#" class="dropdown-toggle notif-link" data-toggle="dropdown">' . '<span class="glyphicon glyphicon-bell notif-bell"></span>' . '<span class="notif-num ' . $notifVisibility . '" data-total-notices="' . $countOfNotices . '">' . $newNotices . '</span>'. '<div class="dropdown-menu widget-notifications no-padding" style="width: 300px"><div class="slimScrollDiv"><div class="notifications-list" id="main-navbar-notifications">' . $noticesUI; $noticesUI .= ' </div><div class="slimScrollBar" style=""></div> <div class="slimScrollRail" style=""></div></div> <!-- / .notifications-list -->'; // NOTE: There is a legacy issue where gateway-provider users were also // given the admin role. To allow gateway-provider users to see // notifications but not be able to manage them we have to check that // the user doesn't have the gateway-provider role. // if ( Session::has("admin") && !Session::has("gateway-provider")) if ( Session::has("admin") && !Session::has("gateway-provider")) { $noticesUI .= '<a href="' . URL::to('/') . '/admin/dashboard/notices" class="notifications-link">Manage Notifications</a>'; } else $noticesUI .= '<a href="#" class="notifications-link"></a>'; $noticesUI .= '</div>'.'</li>'; return $noticesUI; } /** * Add attributes to the HTTP header. */ public static function create_http_header() { header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); } /** * Open the XML file containing the community token * @param $tokenFilePath * @throws Exception */ public static function open_tokens_file($tokenFilePath) { if (file_exists($tokenFilePath)) { $tokenFile = simplexml_load_file($tokenFilePath); } else { throw new Exception('Error: Cannot connect to tokens database!'); } if (!$tokenFile) { throw new Exception('Error: Cannot open tokens database!'); } } /** * Get All Notifications for a gateway * @param * */ public static function get_all_notices(){ return Airavata::getAllNotifications( Session::get('authz-token'), Session::get("gateway_id")); } public static function get_notice_priorities(){ return NotificationPriority::$__names; } public static function arrSortObjsByKey($key, $order = 'DESC') { return function($a, $b) use ($key, $order) { // Swap order if necessary if ($order == 'DESC') { list($a, $b) = array($b, $a); } // Check data type if (is_numeric($a->$key)) { return $a->$key - $b->$key; // compare numeric } else { return strnatcasecmp($a->$key, $b->$key); // compare string } }; } /** * Convert from UTC time to local time. Units are seconds since Unix Epoch. */ public static function convertUTCToLocal($utcTime) { $timeDifference = Session::get("user_timezone"); $addOrSubtract = "-"; if( $timeDifference < 0) $addOrSubtract = "+"; return strtotime( $addOrSubtract . " " . abs($timeDifference) . " hours", $utcTime); } /** * Convert from local time to UTC time. Units are seconds since Unix Epoch. */ public static function convertLocalToUTC($localTime) { $timeDifference = Session::get("user_timezone"); $addOrSubtract = "-"; if( $timeDifference > 0) $addOrSubtract = "+"; return strtotime( $addOrSubtract . " " . abs($timeDifference) . " hours", $localTime); } public static function isAiravataUp() { // Cache whether Airavata is up in the REQUEST scope if (array_key_exists("isAiravataUp", $_REQUEST)) { return $_REQUEST["isAiravataUp"]; } $_REQUEST["isAiravataUp"] = CommonUtilities::checkIfAiravataIsUp(); return $_REQUEST["isAiravataUp"]; } private static function checkIfAiravataIsUp() { try { $version = Airavata::getAPIVersion(Session::get('authz-token')); return true; } catch (Exception $e) { Log::error("Airavata is down!", array("exception" => $e)); return false; } } public static function getInitialRoleName() { return Config::get('pga_config.wsis.initial-role-name', 'user-pending'); } /** * Filter given list of role names to only include Airavata roles. */ public static function filterAiravataRoles($roles) { return array_filter($roles, function($role) { return $role == Config::get('pga_config.wsis.admin-role-name') || $role == Config::get('pga_config.wsis.read-only-admin-role-name') || $role == Config::get('pga_config.wsis.user-role-name') || $role == Config::get('pga_config.wsis.initial-role-name') || $role == 'user-pending'; }); } public static function hasAuthPasswordOption() { return CommonUtilities::getAuthPasswordOption() != null; } public static function getAuthPasswordOption() { $auth_options = Config::get('pga_config.wsis')['auth-options']; $auth_password_option = null; foreach ($auth_options as $key => $auth_option) { if ($auth_option["oauth-grant-type"] == "password") { $auth_password_option = $auth_option; break; } } return $auth_password_option; } public static function getAuthCodeOptions() { $auth_options = Config::get('pga_config.wsis')['auth-options']; // Support for many external identity providers (authorization code auth flow) $auth_code_options = array(); foreach ($auth_options as $auth_option) { if ($auth_option["oauth-grant-type"] == "password") { continue; } else if ($auth_option["oauth-grant-type"] == "authorization_code") { $extra_params = isset($auth_option["oauth-authorize-url-extra-params"]) ? $auth_option["oauth-authorize-url-extra-params"] : null; $auth_url = Keycloak::getOAuthRequestCodeUrl($extra_params); $auth_option["auth_url"] = $auth_url; $auth_code_options[] = $auth_option; } else { throw new Exception("Unrecognized oauth-grant-type: " . $auth_option["oauth-grant-type"]); } } return $auth_code_options; } }