in pp3/module/Application/src/Application/Controller/LoginController.php [106:225]
public function callbackAction() {
$response = $this->getResponse();
$response->getHeaders()->addHeaderLine('Content-Type', 'application/json');
$parameters = $this->params()->fromQuery();
$state = $this->params()->fromQuery('state');
$code = $this->params()->fromQuery('code');
if((!array_key_exists('oauthState', $_SESSION)) || $_SESSION['oauthState'] != $state) {
error_log('Invalid / no state was transfered - received: ' . json_encode($parameters));
$response->setStatusCode(400);
$response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_STATE')));
return $response;
}
$loginConfig = $this->findLoginConfig($_SESSION['oauthConfig']);
if (!$loginConfig) {
error_log("Login Config was not found for: " . $_SESSION['oauthConfig'] . " received: " . json_encode($parameters));
$response->setStatusCode(400);
$response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_LOGIN_CONFIG')));
return $response;
}
if($loginConfig['type'] == 'apache') {
$queryProfileResult = file_get_contents("https://oauth.apache.org/token?code=" . $_GET['code'], false, stream_context_create([
'http' => [
'header' => ['Accept: application/json', 'User-Agent: Netbeans Plugin Portal'],
"ignore_errors" => true,
]
]));
} else {
$tokenRequest = self::tokenRequest($code, $loginConfig);
$queryTokenResult = file_get_contents(self::tokenUrlFromType($loginConfig['type']), false, stream_context_create([
'http' => [
'method' => 'POST',
'header' => ["Content-type: application/json", "Accept: application/json"],
'content' => json_encode($tokenRequest)
]
]));
if(!$queryTokenResult) {
error_log("Empty response");
$response->setStatusCode(500);
$response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_TOKEN')));
return $response;
}
$tokenData = json_decode($queryTokenResult, true);
if((! $tokenData) || (! $tokenData['access_token']) || (strtolower($tokenData['token_type']) != 'bearer')) {
error_log("Failed to decode token data: " . $queryTokenResult);
$response->setStatusCode(500);
$response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_TOKEN')));
return $response;
}
$queryProfileResult = file_get_contents(self::profileUrlFromType($loginConfig['type']), false, stream_context_create([
'http' => [
'header' => ['Accept: application/json', 'Authorization: Bearer ' . $tokenData['access_token'], 'User-Agent: Netbeans Plugin Portal'],
"ignore_errors" => true,
]
]));
}
$userinfo = $this->extractUserInfo($loginConfig['type'], $loginConfig['id'], $queryProfileResult, $_SESSION['oauthState']);
if($userinfo == null) {
error_log("Failed to parse: " . $queryProfileResult);
$response->setStatusCode(500);
$response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_USERINFO')));
return $response;
}
if(!$userinfo['email']) {
$emailQueryUrl = self::emailQueryUrl($loginConfig['type']);
if ($emailQueryUrl) {
$queryEmailResult = file_get_contents($emailQueryUrl, false, stream_context_create([
'http' => [
'header' => ['Accept: application/json', 'Authorization: Bearer ' . $tokenData['access_token'], 'User-Agent: Netbeans Plugin Portal'],
"ignore_errors" => true,
]
]));
$queryEmail = json_decode($queryEmailResult, true);
foreach($queryEmail as $emailInfo) {
if(array_key_exists('email', $emailInfo) && $emailInfo['email']) {
$userinfo['email'] = $emailInfo['email'];
break;
}
}
}
if (!$userinfo['email']) {
error_log("Userinfo did not contain email");
$response->setStatusCode(500);
$response->setContent(json_encode(array('success' => false, 'reason' => 'NO_EMAIL')));
return $response;
}
}
$user = $this->_userRepository->findByIdpData($userinfo['providerId'], $userinfo['id']);
if($user == null) {
$user = new User();
}
$user->setEmail($userinfo['email']);
$user->setIdpProviderId($userinfo['providerId']);
$user->setIdpUserId($userinfo['id']);
$user->setName($userinfo['name']);
$this->_userRepository->persist($user);
$_SESSION['sessionUserId'] = $user->getId();
$_SESSION['sessionUserEmail'] = $user->getEmail();
$_SESSION['sessionIdpProviderId'] = $user->getIdpProviderId();
$_SESSION['sessionUserName'] = $user->getName();
$_SESSION['isVerifier'] = $user->isVerifier() || $userinfo['committer'];
$_SESSION['isAdmin'] = $user->isAdmin() || $userinfo['pmc'];
return $this->redirect()->toRoute("home");
}