synergy/server/providers/SessionCtrl_Production.php (167 lines of code) (raw):
<?php
namespace Synergy\Providers;
use Synergy\Controller\UserCtrl;
use Synergy\DB\SessionDAO;
use Synergy\Interfaces\SessionProvider;
use Synergy\Model\Exception\UserException;
use Synergy\Model\Session;
use Synergy\App\Synergy;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of Session
*
* @author vriha
*/
class SessionCtrl_Production implements SessionProvider {
private $validationServiceUrl = 'https://netbeans.org/api/login/validate/';
private $loginServiceUrl = 'https://netbeans.org/people/login';
private $logoutServiceUrl = 'https://netbeans.org/people/logout';
public $origin;
public static $userId = -1; // TODO refactor to private
public static $userRole = "undefined";
public static $username = "";
public static $user;
private static $sso_checked = false;
public function setOrigin($origin) {
$this->origin = $origin;
}
/**
* Returns true or false if user is logged in
* @return boolean
*/
public function authenticate() {
if (isset($_COOKIE['SSO']) && !is_null($_COOKIE['SSO'])) {
$username = explode(":", $_COOKIE['SSO']); // TODO extract token and username
$ctrl = new UserCtrl();
if ($ctrl->getUserIDbyUsername($username[0]) === -1) {
throw new UserException("User not found", "User account does not exist in Synergy", "SSO");
}
if (isset($_SESSION['user']) && !is_null($_SESSION['user'])) { // skip SSO checking on nb.org
return $this->startSession($username[0]);
}
$result = $this->makeRequest($_COOKIE['SSO']);
if ($result->info['http_code'] !== 200) { // authentication failed
$this->logout();
return false;
} else {
return $this->startSession($username[0]);
}
} else {
return false;
}
}
public function startSession($username) {
session_start();
$s = SessionDAO::getUser($username);
if (is_null($s)) {
return false;
}
if (!isset($_SESSION['user'])) {
$s->token = $_COOKIE['SSO'];
$_SESSION['user'] = $s;
SessionCtrl_Production::$user = clone $s;
}
session_write_close();
return true;
}
/**
* Redirects to login page
*/
public function login() {
header("location:" . $this->loginServiceUrl . '?original_uri=' . urlencode($this->origin . "&return=1"));
}
/**
* No need for current implementation
*/
public function loginPost($username, $password) {
}
public function logout($deleteCookies = false) {
session_start();
unset($_SESSION['user']);
session_unset();
session_destroy();
session_write_close();
SessionCtrl_Production::$userId = -1;
SessionCtrl_Production::$username = "";
SessionCtrl_Production::$userRole = "undefined";
SessionCtrl_Production::$user= null;
if ($deleteCookies) {
setcookie("SSO", "", time() - 3600, '/', '.netbeans.org'); // remove cookie as well
setcookie("SSO", "", time() - 3600, '/', 'netbeans.org');
setcookie("_junction2_session", "", time() - 3600, '/', 'netbeans.org');
setcookie("_junction2_session", "", time() - 3600, '/', '.netbeans.org');
setcookie("SSO_EXPIRATION", "", time() - 3600, '/', 'netbeans.org');
setcookie("SSO_EXPIRATION", "", time() - 3600, '/', '.netbeans.org');
if (isset($_SERVER['HTTP_COOKIE'])) {
$cookies = explode(';', $_SERVER['HTTP_COOKIE']);
foreach ($cookies as $cookie) {
$parts = explode('=', $cookie);
$name = trim($parts[0]);
setcookie($name, '', time() - 3600);
setcookie($name, '', time() - 3600, '/');
}
}
}
//header("location:" . $this->logoutServiceUrl . '?original_uri=' . urlencode("http://services.netbeans.org/synergy"));
}
/**
* Validates existing token. Makes request to target authentication endpoint to get information about session
* @return AuthenticationResult
*/
private function makeRequest($token) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $this->validationServiceUrl . $token);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if (Synergy::hasProxy()) {
curl_setopt($ch, CURLOPT_PROXY, Synergy::getProxy());
}
// curl_setopt($ch, CURLOPT_PROXYPORT, 80);
$data = curl_exec($ch);
$result = new AuthenticationResult($data, curl_getinfo($ch));
curl_close($ch);
return $result;
}
public static function getUserRole() {
if (SessionCtrl_Production::$userRole === "undefined") {
if(!is_null(SessionCtrl_Production::getUser())){
SessionCtrl_Production::$userRole = SessionCtrl_Production::getUser()->role;
}
}
return SessionCtrl_Production::$userRole;
}
public static function getUser() {
if (is_null(SessionCtrl_Production::$user)) {
if (isset($_SESSION['user']) && !is_null($_SESSION['user'])) {
SessionCtrl_Production::$user = clone $_SESSION['user'];
} else {
if (!SessionCtrl_Production::$sso_checked) {
SessionCtrl_Production::$sso_checked = true;
$instance = new self;
try {
$instance->authenticate();
} catch (UserException $e) {
// ignore here
}
}
}
}
return SessionCtrl_Production::$user;
}
public static function sessionExists() {
if (!is_null(SessionCtrl_Production::getUser())) {
return true;
}
return false;
}
public static function getUsername() {
if (SessionCtrl_Production::$username === "") {
if(!is_null(SessionCtrl_Production::getUser())){
SessionCtrl_Production::$username= SessionCtrl_Production::getUser()->username;
}
}
return SessionCtrl_Production::$username;
}
public static function getUserId() {
if (SessionCtrl_Production::$userId === -1) {
if(!is_null(SessionCtrl_Production::getUser())){
SessionCtrl_Production::$userId = intval(SessionCtrl_Production::getUser()->userId);
}
}
return SessionCtrl_Production::$userId;
}
public static function startAnonymousSession() {
date_default_timezone_set('UTC');
$_SESSION['user'] = new Session(ANONYM, 'admin', date("Y-m-d H:i:s"), -1);
}
}
class AuthenticationResult {
public $text;
public $info;
function __construct($text, $headers) {
$this->text = $text;
$this->info = $headers;
}
}
?>