dolibarr 24.0.0-beta
security2.lib.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2008-2011 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2008-2017 Regis Houssin <regis.houssin@inodbox.com>
4 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
5 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 * or see https://www.gnu.org/
20 */
21
37function dol_getwebuser($mode)
38{
39 $t = '?';
40 if ($mode == 'user') {
41 $t = getenv('APACHE_RUN_USER'); // $_ENV['APACHE_RUN_USER'] is empty
42 }
43 if ($mode == 'group') {
44 $t = getenv('APACHE_RUN_GROUP');
45 }
46 return $t;
47}
48
59function checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context = '')
60{
61 global $conf, $langs;
62
63 // Check parameters
64 if ($entitytotest == '') {
65 $entitytotest = 1;
66 }
67
68 dol_syslog("checkLoginPassEntity usertotest=".$usertotest." entitytotest=".$entitytotest." authmode=".implode(',', $authmode));
69 $login = '';
70
71 // Validation of login/pass/entity with standard modules
72 if (empty($login)) {
73 $test = true;
74 foreach ($authmode as $mode) {
75 if ($test && $mode && !$login) {
76 // Validation of login/pass/entity for mode $mode
77 $mode = trim($mode);
78 $authfile = 'functions_'.$mode.'.php';
79 $fullauthfile = '';
80
81 $dirlogin = array_merge(array("/core/login"), (array) $conf->modules_parts['login']);
82 foreach ($dirlogin as $reldir) {
83 $dir = dol_buildpath($reldir, 0);
84 $newdir = dol_osencode($dir);
85
86 // Check if file found (do not use dol_is_file to avoid loading files.lib.php)
87 $tmpnewauthfile = $newdir.(preg_match('/\/$/', $newdir) ? '' : '/').$authfile;
88 if (is_file($tmpnewauthfile)) {
89 $fullauthfile = $tmpnewauthfile;
90 }
91 }
92
93 $result = false;
94 if ($fullauthfile) {
95 $result = include_once $fullauthfile;
96 }
97 if ($fullauthfile && $result) {
98 // Call function to check user/password
99 $function = 'check_user_password_'.$mode;
100 $login = call_user_func($function, $usertotest, $passwordtotest, $entitytotest, $context);
101 if ($login && $login != '--bad-login-validity--') {
102 // Login is successful with this method
103 $test = false; // To stop once at first login success
104 $conf->authmode = $mode; // This properties is defined only when logged to say what mode was successfully used
105 /*$dol_tz = GETPOST('tz');
106 $dol_dst = GETPOST('dst');
107 $dol_screenwidth = GETPOST('screenwidth');
108 $dol_screenheight = GETPOST('screenheight');*/
109 }
110 } else {
111 dol_syslog("Authentication KO - failed to load file '".$authfile."'", LOG_ERR);
112 sleep(1);
113 // Load translation files required by the page
114 $langs->loadLangs(array('other', 'main', 'errors'));
115
116 $_SESSION["dol_loginmesg"] = (empty($_SESSION["dol_loginmesg"]) ? '' : $_SESSION["dol_loginmesg"].', ').$langs->transnoentitiesnoconv("ErrorFailedToLoadLoginFileForMode", $mode);
117 }
118 }
119 }
120 }
121
122 return $login;
123}
124
125
126if (!function_exists('dol_loginfunction')) {
136 function dol_loginfunction($langs, $conf, $mysoc)
137 {
138 global $dolibarr_main_demo, $dolibarr_main_force_https;
139 global $db, $hookmanager;
140
141 $langs->loadLangs(array("main", "other", "help", "admin"));
142
143 // Instantiate hooks of thirdparty module only if not already define
144 $hookmanager->initHooks(array('mainloginpage'));
145
146 $main_authentication = $conf->file->main_authentication;
147
148 $session_name = session_name(); // Get current session name
149
150 $dol_url_root = DOL_URL_ROOT;
151
152 // Title
153 $appli = constant('DOL_APPLICATION_TITLE');
154 $title = $appli.(getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER') ? '' : ' '.constant('DOL_VERSION'));
155
156 $customapplication = getDolGlobalString('MAIN_APPLICATION_TITLE');
157 if ($customapplication) {
158 if (preg_match('/^\+/', $customapplication)) {
159 $title .= $customapplication;
160 } else {
161 $title = $customapplication;
162 }
163 }
164 $titletruedolibarrversion = constant('DOL_VERSION'); // $title used by login template after the @ to inform of true Dolibarr version
165
166 // Note: $conf->css looks like '/theme/eldy/style.css.php'
167 /*
168 $conf->css = "/theme/".(GETPOST('theme','aZ09')?GETPOST('theme','aZ09'):$conf->theme)."/style.css.php";
169 $themepath=dol_buildpath($conf->css,1);
170 if (!empty($conf->modules_parts['theme'])) // Using this feature slow down application
171 {
172 foreach($conf->modules_parts['theme'] as $reldir)
173 {
174 if (file_exists(dol_buildpath($reldir.$conf->css, 0)))
175 {
176 $themepath=dol_buildpath($reldir.$conf->css, 1);
177 break;
178 }
179 }
180 }
181 $conf_css = $themepath."?lang=".$langs->defaultlang;
182 */
183
184 // Select templates dir
185 $template_dir = '';
186 if (!empty($conf->modules_parts['tpl'])) { // Using this feature slow down application
187 $dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl/'));
188 foreach ($dirtpls as $reldir) {
189 $tmp = dol_buildpath($reldir.'login.tpl.php');
190 if (file_exists($tmp)) {
191 $template_dir = preg_replace('/login\.tpl\.php$/', '', $tmp);
192 break;
193 }
194 }
195 } else {
196 $template_dir = DOL_DOCUMENT_ROOT."/core/tpl/";
197 }
198
199 // Set cookie for timeout management. We set it as a cookie so we will be able to use it to set timeout on next page before the session start
200 // and the conf file is loaded.
201 $prefix = dol_getprefix('');
202 $sessiontimeout = 'DOLSESSTIMEOUT_'.$prefix;
203
204 if (getDolGlobalString('MAIN_SESSION_TIMEOUT')) {
205 dolSetCookie($sessiontimeout, getDolGlobalString('MAIN_SESSION_TIMEOUT'), 0);
206 }
207
208 if (GETPOST('urlfrom', 'alpha')) {
209 $_SESSION["urlfrom"] = GETPOST('urlfrom', 'alpha');
210 } else {
211 unset($_SESSION["urlfrom"]);
212 }
213
214 if (!GETPOST("username", 'alpha')) {
215 $focus_element = 'username';
216 } else {
217 $focus_element = 'password';
218 }
219
220 $demologin = '';
221 $demopassword = '';
222 if (!empty($dolibarr_main_demo)) {
223 $tab = explode(',', $dolibarr_main_demo);
224 $demologin = $tab[0];
225 $demopassword = $tab[1];
226 }
227
228 // Execute hook getLoginPageOptions (for table)
229 $parameters = array('entity' => GETPOSTINT('entity'), 'switchentity' => GETPOSTINT('switchentity'));
230 $reshook = $hookmanager->executeHooks('getLoginPageOptions', $parameters); // Note that $action and $object may have been modified by some hooks.
231 $morelogincontent = $hookmanager->resPrint;
232
233 // Execute hook getLoginPageExtraOptions (eg for js)
234 $parameters = array('entity' => GETPOSTINT('entity'), 'switchentity' => GETPOSTINT('switchentity'));
235 $reshook = $hookmanager->executeHooks('getLoginPageExtraOptions', $parameters); // Note that $action and $object may have been modified by some hooks.
236 $moreloginextracontent = $hookmanager->resPrint;
237
238 //Redirect after connection
239 $parameters = array('entity' => GETPOSTINT('entity'), 'switchentity' => GETPOSTINT('switchentity'));
240 $reshook = $hookmanager->executeHooks('redirectAfterConnection', $parameters); // Note that $action and $object may have been modified by some hooks.
241 $php_self = $hookmanager->resPrint;
242
243 // Login
244 $login = (!empty($hookmanager->resArray['username']) ? $hookmanager->resArray['username'] : (GETPOST("username", "alpha") ? GETPOST("username", "alpha") : $demologin));
245 $password = $demopassword;
246
247 // Show logo (search in order: small company logo, large company logo, theme logo, common logo)
248 $width = 0;
249 $urllogo = DOL_URL_ROOT.'/theme/common/login_logo.png';
250
251 if (!empty($mysoc->logo_small) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$mysoc->logo_small)) {
252 $urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file='.urlencode('logos/thumbs/'.$mysoc->logo_small);
253 } elseif (!empty($mysoc->logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$mysoc->logo)) {
254 $urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file='.urlencode('logos/'.$mysoc->logo);
255 $width = 128;
256 } elseif (!empty($mysoc->logo_squarred_small) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$mysoc->logo_squarred_small)) {
257 $urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file='.urlencode('logos/thumbs/'.$mysoc->logo_squarred_small);
258 } elseif (is_readable(DOL_DOCUMENT_ROOT.'/theme/dolibarr_logo.svg')) {
259 $urllogo = DOL_URL_ROOT.'/theme/dolibarr_logo.svg';
260 }
261
262 // Security graphical code
263 $captcha = '';
264 if (getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA')) {
265 $captcha = getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA_HANDLER', 'standard');
266 }
267
268 // Extra link
269 $forgetpasslink = 0;
270 $helpcenterlink = 0;
271 if (!getDolGlobalString('MAIN_SECURITY_DISABLEFORGETPASSLINK') || getDolGlobalString('MAIN_HELPCENTER_LINKTOUSE')) {
272 if (!getDolGlobalString('MAIN_SECURITY_DISABLEFORGETPASSLINK')) {
273 $forgetpasslink = 1;
274 }
275
276 if (getDolGlobalString('MAIN_HELPCENTER_LINKTOUSE')) {
277 $helpcenterlink = 1;
278 }
279 }
280
281 // Home message
282 $main_home = '';
283 if (getDolGlobalString('MAIN_HOME')) {
284 $substitutionarray = getCommonSubstitutionArray($langs);
285 complete_substitutions_array($substitutionarray, $langs);
286 $texttoshow = make_substitutions(getDolGlobalString('MAIN_HOME'), $substitutionarray, $langs);
287
288 $main_home = dol_htmlcleanlastbr($texttoshow);
289 }
290
291 // Google AD
292 $main_google_ad_client = ((getDolGlobalString('MAIN_GOOGLE_AD_CLIENT') && getDolGlobalString('MAIN_GOOGLE_AD_SLOT')) ? 1 : 0);
293
294 // Set jquery theme
295 $dol_loginmesg = (!empty($_SESSION["dol_loginmesg"]) ? $_SESSION["dol_loginmesg"] : '');
296
297 $favicon = DOL_URL_ROOT.'/theme/dolibarr_256x256_color.png';
298 if (!empty($mysoc->logo_squarred_mini)) {
299 $favicon = DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode('logos/thumbs/'.$mysoc->logo_squarred_mini);
300 }
301 if (getDolGlobalString('MAIN_FAVICON_URL')) {
302 $favicon = getDolGlobalString('MAIN_FAVICON_URL');
303 }
304
305 $jquerytheme = 'base';
306 if (getDolGlobalString('MAIN_USE_JQUERY_THEME')) {
307 $jquerytheme = getDolGlobalString('MAIN_USE_JQUERY_THEME');
308 }
309
310 // Set dol_hide_topmenu, dol_hide_leftmenu, dol_optimize_smallscreen, dol_no_mouse_hover
311 $dol_hide_topmenu = GETPOSTINT('dol_hide_topmenu');
312 $dol_hide_leftmenu = GETPOSTINT('dol_hide_leftmenu');
313 $dol_optimize_smallscreen = GETPOSTINT('dol_optimize_smallscreen');
314 $dol_no_mouse_hover = GETPOSTINT('dol_no_mouse_hover');
315 $dol_use_jmobile = GETPOSTINT('dol_use_jmobile');
316
317 // Include login page template
318 include $template_dir.'login.tpl.php';
319
320 // Global html output events ($mesgs, $errors, $warnings)
322
323 $_SESSION["dol_loginmesg"] = '';
324 }
325}
326
335function makesalt($type = CRYPT_SALT_LENGTH)
336{
337 dol_syslog("makesalt type=".$type);
338 switch ($type) {
339 case 12: // 8 + 4
340 $saltlen = 8;
341 $saltprefix = '$1$';
342 $saltsuffix = '$';
343 break;
344 case 8: // 8 (For compatibility, do not use this)
345 $saltlen = 8;
346 $saltprefix = '$1$';
347 $saltsuffix = '$';
348 break;
349 case 2: // 2
350 default: // by default, fall back on Standard DES (should work everywhere)
351 $saltlen = 2;
352 $saltprefix = '';
353 $saltsuffix = '';
354 break;
355 }
356 $salt = '';
357 while (dol_strlen($salt) < $saltlen) {
358 $salt .= chr(mt_rand(64, 126));
359 }
360
361 $result = $saltprefix.$salt.$saltsuffix;
362 dol_syslog("makesalt return=".$result);
363 return $result;
364}
365
372function encodedecode_dbpassconf($level = 0)
373{
374 dol_syslog("encodedecode_dbpassconf level=".$level, LOG_DEBUG);
375 $config = '';
376 $passwd = '';
377 $passwd_crypted = '';
378
379 if ($fp = fopen(DOL_DOCUMENT_ROOT.'/conf/conf.php', 'r')) {
380 while (!feof($fp)) {
381 $buffer = fgets($fp, 4096);
382
383 $lineofpass = 0;
384
385 $reg = array();
386 $mode = '';
387 if (preg_match('/^[^#]*dolibarr_main_db_encrypted_pass[\s]*=[\s]*(.*)/i', $buffer, $reg)) { // Old way to save encrypted value
388 $val = trim($reg[1]); // This also remove CR/LF
389 $val = preg_replace('/^["\']/', '', $val);
390 $val = preg_replace('/["\'][\s;]*$/', '', $val);
391 if (!empty($val)) {
392 $passwd_crypted = $val;
393 // method dol_encode/dol_decode
394 $val = dol_decode($val);
395 //$val = dolEncrypt($val);
396 $passwd = $val;
397 $lineofpass = 1;
398 }
399 } elseif (preg_match('/^[^#]*dolibarr_main_db_pass[\s]*=[\s]*(.*)/i', $buffer, $reg)) {
400 $val = trim($reg[1]); // This also remove CR/LF
401 $val = preg_replace('/^["\']/', '', $val);
402 $val = preg_replace('/["\'][\s;]*$/', '', $val);
403 if (preg_match('/crypted:/i', $buffer)) {
404 // method dol_encode/dol_decode
405 $mode = 'crypted:';
406 $val = preg_replace('/crypted:/i', '', $val);
407 $passwd_crypted = $val;
408 $val = dol_decode($val);
409 $passwd = $val;
410 } elseif (preg_match('/^dolcrypt:([^:]+):(.*)$/i', $val, $reg)) {
411 // method dolEncrypt/dolDecrypt
412 $mode = 'dolcrypt:';
413 //$val = preg_replace('/dolcrypt:/i', '', $val);
414 $passwd_crypted = $reg[1].':'.$reg[2];
415 $val = dolDecrypt($val);
416 $passwd = $val;
417 } else {
418 $passwd = $val;
419 /* old method
420 $mode = 'crypted:';
421 $val = dol_encode($val);
422 */
423 $mode = 'dolcrypt:';
424 $passwd_crypted = preg_replace('/^dolcrypt:/', '', dolEncrypt($val));
425 }
426 $lineofpass = 1;
427 }
428
429 // Output line
430 if ($lineofpass) {
431 // Add value at end of file
432 if ($level == 0) {
433 $config .= '$dolibarr_main_db_pass=\''.$passwd.'\';'."\n";
434 }
435 if ($level == 1) {
436 $config .= '$dolibarr_main_db_pass=\''.$mode.$passwd_crypted.'\';'."\n";
437 }
438
439 //print 'passwd = '.$passwd.' - passwd_crypted = '.$passwd_crypted;
440 //exit;
441 } else {
442 $config .= $buffer;
443 }
444 }
445 fclose($fp);
446
447 // Write new conf file
448 $file = DOL_DOCUMENT_ROOT.'/conf/conf.php';
449 if ($fp = @fopen($file, 'w')) {
450 fwrite($fp, $config);
451 fflush($fp);
452 fclose($fp);
453 clearstatcache();
454
455 // It's config file, so we set read permission for creator only.
456 // Should set permission to web user and groups for users used by batch
457 //dolChmod($file, '0600');
458
459 return 1;
460 } else {
461 dol_syslog("encodedecode_dbpassconf Failed to open conf.php file for writing", LOG_WARNING);
462 return -1;
463 }
464 } else {
465 dol_syslog("encodedecode_dbpassconf Failed to read conf.php", LOG_ERR);
466 return -2;
467 }
468}
469
479function getRandomPassword($generic = false, $replaceambiguouschars = null, $length = 32)
480{
481 global $db, $conf, $langs, $user;
482
483 $generated_password = '';
484
485 if ($generic) {
486 $lowercase = "qwertyuiopasdfghjklzxcvbnm";
487 $uppercase = "ASDFGHJKLZXCVBNMQWERTYUIOP";
488 $numbers = "1234567890";
489 $randomCode = "";
490 $nbofchar = round($length / 3);
491 $nbofcharlast = ($length - 2 * $nbofchar);
492 //var_dump($nbofchar.'-'.$nbofcharlast);
493 if (function_exists('random_int')) { // Cryptographic random
494 $max = strlen($lowercase) - 1;
495 for ($x = 0; $x < $nbofchar; $x++) {
496 $tmp = random_int(0, $max);
497 $randomCode .= $lowercase[$tmp];
498 }
499 $max = strlen($uppercase) - 1;
500 for ($x = 0; $x < $nbofchar; $x++) {
501 $tmp = random_int(0, $max);
502 $randomCode .= $uppercase[$tmp];
503 }
504 $max = strlen($numbers) - 1;
505 for ($x = 0; $x < $nbofcharlast; $x++) {
506 $tmp = random_int(0, $max);
507 $randomCode .= $numbers[$tmp];
508 }
509 } else {
510 // Old platform, non cryptographic random
511 $max = strlen($lowercase) - 1;
512 for ($x = 0; $x < $nbofchar; $x++) {
513 $tmp = mt_rand(0, $max);
514 $randomCode .= $lowercase[$tmp];
515 }
516 $max = strlen($uppercase) - 1;
517 for ($x = 0; $x < $nbofchar; $x++) {
518 $tmp = mt_rand(0, $max);
519 $randomCode .= $uppercase[$tmp];
520 }
521 $max = strlen($numbers) - 1;
522 for ($x = 0; $x < $nbofcharlast; $x++) {
523 $tmp = mt_rand(0, $max);
524 $randomCode .= $numbers[$tmp];
525 }
526 }
527
528 // Use the Fisher-Yate to shake (this replace str_shuffle)
529 $passwordArray = str_split($randomCode);
530 for ($i = count($passwordArray) - 1; $i > 0; $i--) {
531 $j = random_int(0, $i);
532 $tmp = $passwordArray[$i];
533 $passwordArray[$i] = $passwordArray[$j];
534 $passwordArray[$j] = $tmp;
535 }
536 $generated_password = implode('', $passwordArray);
537 } elseif (getDolGlobalString('USER_PASSWORD_GENERATED')) {
538 $nomclass = "modGeneratePass".ucfirst(getDolGlobalString('USER_PASSWORD_GENERATED'));
539 $nomfichier = $nomclass.".class.php";
540 //print DOL_DOCUMENT_ROOT."/core/modules/security/generate/".$nomclass;
541 require_once DOL_DOCUMENT_ROOT."/core/modules/security/generate/".$nomfichier;
542 $genhandler = new $nomclass($db, $conf, $langs, $user);
543 '@phan-var-force ModeleGenPassword $genhandler';
544 $generated_password = $genhandler->getNewGeneratedPassword();
545 unset($genhandler);
546 }
547
548 // Do we have to discard some alphabetic characters ? (usually $replaceambiguouschars is empty)
549 if (is_array($replaceambiguouschars) && count($replaceambiguouschars) > 0) {
550 $numbers = "ABCDEF";
551 $max = strlen($numbers) - 1;
552 if (function_exists('random_int')) { // Cryptographic random
553 $tmp = random_int(0, $max);
554 $generated_password = str_replace($replaceambiguouschars, $numbers[$tmp], $generated_password);
555 } else {
556 $tmp = mt_rand(0, $max);
557 $generated_password = str_replace($replaceambiguouschars, $numbers[$tmp], $generated_password);
558 }
559 }
560
561 return $generated_password;
562}
563
573function dolJSToSetRandomPassword($htmlname, $htmlnameofbutton = 'generate_token', $generic = 1)
574{
575 global $conf;
576
577 $out = '';
578
579 if (!empty($conf->use_javascript_ajax)) {
580 $out .= "\n".'<!-- Js code to suggest a security key -->';
581 $out .= '<script nonce="'.getNonce().'" type="text/javascript">';
582 $out .= 'jQuery(document).ready(function () {
583 jQuery("#'.dol_escape_js($htmlnameofbutton).'").click(function() {
584 var currenttoken = jQuery("meta[name=anti-csrf-currenttoken]").attr("content");
585 console.log("dolJSToSetRandomPassword: We click on the button '.dol_escape_js($htmlnameofbutton).' to suggest a key. anti-csrf-currenttoken is "+currenttoken+". We will fill '.dol_escape_js($htmlname).'");
586 jQuery.get( "'.DOL_URL_ROOT.'/core/ajax/security.php", {
587 action: \'getrandompassword\',
588 generic: '.($generic ? '1' : '0').',
589 token: currenttoken
590 },
591 function(result) {
592 if (jQuery("input#'.dol_escape_js($htmlname).'").attr("type") == "password") {
593 jQuery("input#'.dol_escape_js($htmlname).'").attr("type", "text");
594 }
595 jQuery("#'.dol_escape_js($htmlname).'").val(result);
596 });
597 });
598 });'."\n";
599 $out .= '</script>';
600 }
601
602 return $out;
603}
604
612function showEyeForField($htmlname, $htmlnameofinput)
613{
614 return '<!-- code to manage the eye hide/show -->
615<span id="'.$htmlname.'" tabindex="-1"><span class="fa fa-eye"></span></span>
616<script nonce="'.getNonce().'">
617 $(document).ready(function () {
618 $(\'#'.$htmlname.'\').on(\'click\', function (e) {
619 e.preventDefault();
620 if (event.detail === 0) return false; // Ignore keyboard "clicks"
621 console.log("We click on '.$htmlname.'");
622 const $passwordInput = $(\'#'.$htmlnameofinput.'\');
623
624 if ($passwordInput.is(\'[type=password]\')) {
625 $passwordInput.attr(\'type\', \'text\');
626 jQuery(\'#'.$htmlname.' .fa-eye\').attr(\'class\', \'fa fa-eye-slash\');
627 } else {
628 $passwordInput.attr(\'type\', \'password\');
629 jQuery(\'#'.$htmlname.' .fa-eye-slash\').attr(\'class\', \'fa fa-eye\');
630 }
631
632 return false; // This prevents the click from reloading the page
633 });
634 });
635</script>';
636}
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dolSetCookie(string $cookiename, string $cookievalue, int $expire=-1)
Set a cookie.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
conf($dolibarr_main_document_root)
Load conf file (file must exists)
Definition inc.php:426
$context
@method int call_trigger(string $triggerName, ?User $user)
Definition logout.php:42
showEyeForField($htmlname, $htmlnameofinput)
Output the eye picto to show/hide a password HTML field.
dolJSToSetRandomPassword($htmlname, $htmlnameofbutton='generate_token', $generic=1)
Output javascript to autoset a generated password using default module into a HTML element.
dol_getwebuser($mode)
Return user/group account of web server.
encodedecode_dbpassconf($level=0)
Encode or decode database password in config file.
checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context='')
Return a login if login/pass was successful.
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
if(!function_exists( 'dol_loginfunction')) makesalt($type=CRYPT_SALT_LENGTH)
Initialise the salt for the crypt function.
dol_decode($chain, $key='1')
Decode a base 64 encoded + specific delta change.
dolDecrypt($chain, $key='', $patterntotest='')
Decode a string with a symmetric encryption.
dolEncrypt($chain, $key='', $ciphering='', $forceseed='', $obfuscationmode='dolcrypt')
Encode a string with a symmetric encryption.