You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
4.2 KiB

<?php
/**
* Authorization Server Member
*
* @package OpenEMR
* @link http://www.open-emr.org
* @author Jerry Padgett <sjpadgett@gmail.com>
* @copyright Copyright (c) 2020 Jerry Padgett <sjpadgett@gmail.com>
* @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
*/
// below brings in autoloader
require_once(__DIR__ . "/../_rest_config.php");
use OpenEMR\Common\Csrf\CsrfUtils;
use OpenEMR\Common\Logging\SystemLogger;
use OpenEMR\Common\Session\SessionUtil;
use OpenEMR\RestControllers\AuthorizationController;
$gbl = RestConfig::GetInstance();
if (empty($gbl::$SITE)) {
http_response_code(401);
exit;
}
// Will start the oauth OpenEMR session/cookie.
SessionUtil::oauthSessionStart($gbl::$web_root);
$_GET['site'] = $gbl::$SITE;
// No need for sessionAllowWrite since using oauth session
$ignoreAuth = true;
require_once __DIR__ . '/../interface/globals.php';
$logger = new SystemLogger();
// exit if api is not turned on
if (empty($GLOBALS['rest_api']) && empty($GLOBALS['rest_fhir_api']) && empty($GLOBALS['rest_portal_api'])) {
$logger->debug("api disabled exiting call");
SessionUtil::oauthSessionCookieDestroy();
http_response_code(404);
exit;
}
// ensure 1) sane site 2) site from gbl and globals are the same and 3) ensure the site exists on filesystem
if (empty($gbl::$SITE) || empty($_SESSION['site_id']) || preg_match('/[^A-Za-z0-9\\-.]/', $gbl::$SITE) || ($gbl::$SITE != $_SESSION['site_id']) || !file_exists($GLOBALS['OE_SITES_BASE'] . '/' . $_SESSION['site_id'])) {
// error collecting site
$logger->error("OpenEMR error - oauth2 error since unable to properly collect site, so forced exit");
SessionUtil::oauthSessionCookieDestroy();
http_response_code(400);
exit;
}
// set up csrf
// used to prevent csrf in the 2 different types of submissions by oauth2/provider/login.php
if (empty($_SESSION['csrf_private_key'])) {
CsrfUtils::setupCsrfKey();
}
$end_point = $gbl::getRequestEndPoint();
$logger->debug("oauth2 request received", ["endpoint" => $end_point]);
// let's quickly be able to enable our CORS at the PHP level.
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: origin, authorization, accept, content-type, x-requested-with");
header("Access-Control-Allow-Methods: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
header("Access-Control-Allow-Origin: *");
$authServer = new AuthorizationController();
if (false !== stripos($end_point, '/token')) {
// session is destroyed within below function
$authServer->oauthAuthorizeToken();
exit;
}
if (false !== stripos($end_point, '/openid-configuration')) {
$oauthdisc = true;
$base_url = $authServer->authBaseFullUrl;
require_once("provider/.well-known/discovery.php");
exit;
}
if (false !== stripos($end_point, '/authorize')) {
// session is destroyed (when throws exception) within below function
$authServer->oauthAuthorizationFlow();
exit;
}
if (false !== stripos($end_point, '/device/code')) {
// session is destroyed within below function
$authServer->authorizeUser();
exit;
}
if (false !== stripos($end_point, '/jwk')) {
$oauthjwk = true;
require_once(__DIR__ . "/provider/jwk.php");
exit;
}
if (false !== stripos($end_point, '/login')) {
// session is maintained
$authServer->userLogin();
exit;
}
if ($authServer->isSMARTAuthorizationEndPoint($end_point)) {
$authServer->dispatchSMARTAuthorizationEndpoint($end_point);
}
if (false !== stripos($end_point, '/scope-authorize-confirm')) {
// session is maintained
$authServer->scopeAuthorizeConfirm();
exit;
}
if (false !== stripos($end_point, '/registration')) {
// session is destroyed within below function
$authServer->clientRegistration();
exit;
}
if (false !== stripos($end_point, '/client')) {
// session is destroyed within below function
$authServer->clientRegisteredDetails();
exit;
}
if (false !== stripos($end_point, '/logout')) {
// session is destroyed within below function
$authServer->userSessionLogout();
exit;
}
if (false !== stripos($end_point, '/introspect')) {
// session is destroyed within below function
$authServer->tokenIntrospection();
exit;
}