46 $_SESSION[
"dol_loginmesg"] =
"OpenID Connect is disabled";
47 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect Module disabled");
52 $entity = $entitytotest;
57 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect usertotest=".$usertotest.
" passwordtotest=".preg_replace(
'/./',
'*', $passwordtotest).
" entitytotest=".$entitytotest);
61 if (GETPOSTISSET(
'username')) {
63 $_SESSION[
"dol_loginmesg"] =
"Not an OpenID Connect flow";
64 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::not an OIDC flow");
66 } elseif (empty($_SESSION[
'oidc_state'])) {
68 $_SESSION[
"dol_loginmesg"] =
"Error in OAuth 2.0 flow (no state received)";
69 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::no state received", LOG_ERR);
71 } elseif (empty($_SESSION[
'oidc_code'])) {
73 $_SESSION[
"dol_loginmesg"] =
"Error in OAuth 2.0 flow (no code received)";
74 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::no code received", LOG_ERR);
79 $auth_code = $_SESSION[
'oidc_code'];
80 $state = $_SESSION[
'oidc_state'];
81 unset($_SESSION[
'oidc_code'], $_SESSION[
'oidc_state']);
82 dol_syslog(
'functions_openid_connect::check_user_password_openid_connect state='.$state);
86 $_SESSION[
"dol_loginmesg"] =
"Error in OAuth 2.0 flow (state does not match)";
87 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::state does not match", LOG_ERR);
93 'grant_type' =>
'authorization_code',
100 $token_response =
getURLContent(
getDolGlobalString(
'MAIN_AUTHENTICATION_OIDC_TOKEN_URL'),
'POST', http_build_query($auth_param), 1, array(), array(
'https'), 2);
101 $token_content = json_decode($token_response[
'content']);
102 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect /token=".print_r($token_response,
true), LOG_DEBUG);
104 if ($token_response[
'curl_error_no']) {
106 $_SESSION[
"dol_loginmesg"] =
"Network error: ".$token_response[
'curl_error_msg'].
" (".$token_response[
'curl_error_no'].
")";
107 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::".$_SESSION[
"dol_loginmesg"], LOG_ERR);
109 } elseif ($token_response[
'http_code'] >= 400 && $token_response[
'http_code'] < 500) {
111 $_SESSION[
"dol_loginmesg"] =
"Error in OAuth 2.0 flow (".$token_response[
'content'].
")";
112 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::".$token_response[
'content'], LOG_ERR);
114 } elseif (property_exists($token_content,
'error') && $token_content->error) {
116 $_SESSION[
"dol_loginmesg"] =
"Error in OAuth 2.0 flow (".$token_content->error_description.
")";
117 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::".$token_content->error_description, LOG_ERR);
119 } elseif (!property_exists($token_content,
'access_token')) {
121 $_SESSION[
"dol_loginmesg"] =
"Token request error (".$token_response[
'http_code'].
")";
122 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::".$_SESSION[
"dol_loginmesg"], LOG_ERR);
127 $userinfo_headers = array(
'Authorization: Bearer '.$token_content->access_token);
129 $userinfo_content = json_decode($userinfo_response[
'content']);
131 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect /userinfo=".print_r($userinfo_response,
true), LOG_DEBUG);
134 $login_claim =
'email';
139 if ($userinfo_response[
'curl_error_no']) {
141 $_SESSION[
"dol_loginmesg"] =
"Network error: ".$userinfo_response[
'curl_error_msg'].
" (".$userinfo_response[
'curl_error_no'].
")";
142 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::".$_SESSION[
"dol_loginmesg"], LOG_ERR);
144 } elseif ($userinfo_response[
'http_code'] >= 400 && $userinfo_response[
'http_code'] < 500) {
146 $_SESSION[
"dol_loginmesg"] =
"OpenID Connect user info error: " . $userinfo_response[
'content'];
147 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::".$userinfo_response[
'content'], LOG_ERR);
149 } elseif (property_exists($userinfo_content,
'error') && $userinfo_content->error) {
151 $_SESSION[
"dol_loginmesg"] =
"Error in OAuth 2.0 flow (".$userinfo_content->error_description.
")";
152 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::".$userinfo_content->error_description, LOG_ERR);
154 } elseif (!property_exists($userinfo_content, $login_claim)) {
156 $_SESSION[
"dol_loginmesg"] =
"Userinfo request error (".$userinfo_response[
'http_code'].
")";
157 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::".$_SESSION[
"dol_loginmesg"], LOG_ERR);
162 $sql =
'SELECT login, entity, datestartvalidity, dateendvalidity';
163 $sql .=
' FROM '.MAIN_DB_PREFIX.
'user';
164 if ($login_claim ===
'email') {
166 $sql .=
" WHERE (login = '".$db->escape((
string) $userinfo_content->$login_claim).
"' OR email = '".
$db->escape((
string) $userinfo_content->$login_claim).
"')";
168 $sql .=
" WHERE login = '".$db->escape((
string) $userinfo_content->$login_claim).
"'";
170 $sql .=
' AND entity IN (0,'.(array_key_exists(
'dol_entity', $_SESSION) ? ((int) $_SESSION[
"dol_entity"]) : 1).
')';
172 dol_syslog(
"functions_openid::check_user_password_openid", LOG_DEBUG);
174 $resql =
$db->query($sql);
176 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::Error with sql query (".
$db->error().
")");
179 $numres =
$db->num_rows($resql);
181 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::Error more than 1 result from the query");
184 $obj =
$db->fetch_object($resql);
187 global $dolibarr_main_authentication_autocreateuser;
188 if (empty($dolibarr_main_authentication_autocreateuser)) {
189 $_SESSION[
"dol_loginmesg"] =
"User not found in Dolibarr and auto-creation is disabled";
190 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::User not found, auto-creation disabled");
194 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::User not found, auto-creating from OIDC claims");
196 $claim_value = (
string) $userinfo_content->$login_claim;
198 if (is_numeric($result_create) && $result_create < 0) {
199 $_SESSION[
"dol_loginmesg"] =
"Error creating user from OIDC";
200 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::Error creating user, result=".$result_create, LOG_ERR);
205 $newlogin = $result_create;
206 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect::User auto-created login=".$newlogin);
208 $_SESSION[
'OPENID_CONNECT'] =
true;
212 $_SESSION[
'OPENID_CONNECT'] =
true;
215 dol_syslog(
"functions_openid_connect::check_user_password_openid_connect END");
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getURLContent($url, $postorget='GET', $param='', $followlocation=1, $addheaders=array(), $allowedschemes=array('http', 'https'), $localurl=0, $ssl_verifypeer=-1, $timeoutconnect=0, $timeoutresponse=0, $otherCurlOptions=array(), $morelogsuffix='')
Function to get a content from an URL (use proxy if proxy defined).