/** * Relog the user if rememberme is checked and not logged in * @param bool $try * @throws Exception * @return boolean */ public static function relog($try = false) { $out = array('session_lifetime' => intval(eZINI::instance('merck.ini')->variable('WSMobile', 'SessionLifetime'))); $backendUrl = eZINI::instance('merck.ini')->variable('WSMobile', 'BackEndUrl'); $c = curl_init(); curl_setopt($c, CURLOPT_URL, $backendUrl.'/mobile.php'); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_NOBODY, true); curl_setopt($c, CURLOPT_HEADER, true); if ( eZINI::instance('merck.ini')->hasVariable('WSMobile', 'BackEndHeader') ) { /* @type $headers array */ $headersList = array(); $headers = eZINI::instance('merck.ini')->variable('WSMobile', 'BackEndHeader'); foreach ( $headers as $header => $value ) { $headersList[] = sprintf('%s: %s', $header, $value); } curl_setopt($c, CURLOPT_HTTPHEADER, $headersList); } $headers = getallheaders(); if( isset($headers['Cookie']) ) curl_setopt($c, CURLOPT_COOKIE, $headers['Cookie']); $result = curl_exec($c); $errno = curl_errno($c); $error = curl_error($c); curl_close($c); $loggedOnBackend = true; if( preg_match( '#^HTTP/1.1 302 Found#', $result ) || ( preg_match( '#Set-Cookie: .*BSESSIONID=(?P<baksess>.*?);#m', $result, $m ) && isset( $_COOKIE['BESSIONID'] ) && $_COOKIE['BESSIONID'] != $m['baksess'] ) ){ $loggedOnBackend = false; } if ( self::isLogged() && $loggedOnBackend ) { return $out; } if ( isset($_COOKIE['remember_me']) ) { $db = MMDB::instance(); $corQuery = "SELECT r.code FROM bo_reference r JOIN bo_cluster_has_reference chr ON chr.cluster_identifier = '%s' WHERE r.type = 'country' AND r.id = chr.reference_id"; $cor = $db->arrayQuery( sprintf( $corQuery, ClusterTool::clusterIdentifier() ) ); if( count( $cor ) > 0 ) $countryOfRegistration = $cor[0]['code']; else $countryOfRegistration = eZINI::instance('site.ini')->variable('RegionalSettings', 'CountryOfRegistration'); $uuid = MMUserLogin::uncryptTicket($_COOKIE['remember_me']); $context = isset( $_REQUEST['context'] ) ? $_REQUEST['context'] : ContextTool::instance()->domain() . '/'; $readService = ESBFactory::getUserService(); $parameters = $readService->getFormParameters($uuid); $datas = $readService->read( $parameters, $uuid ); $esbResult = new ESBResult(); $isPopulated = ServiceLoginUUMP::populateESBResult( $esbResult, $datas ); if ( !$isPopulated ) { // error log caught on WS stack return null; } $loginResult = MMUserLogin::esbLogin( $uuid, $esbResult, true, $context ); if( is_null( $loginResult )) { $out['status'] = 'failed'; $out['errorCode'] = 9; $out['msg'] = 'User not found.'; return $out; } $user = MMUsers::fetchByIdAndCountry($loginResult['params']['Username'], $countryOfRegistration); $loginResult['params']['mmSettings'] = $user->getMMSettings(); $loginResult['params']['unorderedAppList'] = $user->getApplicationList(); $loginResult['params']['alterboxMsgReset'] = $user->hasPreference('alterboxMsgReset') ? $user->getPreferences('alterboxMsgReset') : true; $logged = self::backendLog($loginResult['params']); if ( $logged ) { return $out; } } if ( $try !== true ) { throw new Exception('Missing "remember_me" cookie', 30); } return false; }
/** * @param string $token * @return array */ protected static function decryptToken($token) { $token = str_replace(array('|', '_'), array('+', '/'), $token); return MMUserLogin::uncryptTicket($token); }