45if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO'])) {
46 list($usec, $sec) = explode(
" ", microtime());
47 $micro_start_time = ((float) $usec + (
float) $sec);
50 if (defined(
'XDEBUGCOVERAGE')) {
51 xdebug_start_code_coverage();
65 $newstringnumentity = preg_replace(
'/;$/',
'', $matches[1]);
68 if (preg_match(
'/^x/i', $newstringnumentity)) {
69 $newstringnumentity = hexdec(preg_replace(
'/^x/i',
'', $newstringnumentity));
73 if (($newstringnumentity >= 65 && $newstringnumentity <= 90) || ($newstringnumentity >= 97 && $newstringnumentity <= 122)) {
74 return chr((
int) $newstringnumentity);
77 return '&#'.$matches[1];
101 $val = html_entity_decode($val, ENT_QUOTES | ENT_HTML5);
103 $val = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
108 $val = preg_replace(
'/<!--[^>]*-->/',
'', $val);
109 $val = preg_replace(
'/[\r\n\t]/',
'', $val);
110 }
while ($oldval != $val);
121 $newval = preg_replace(
'/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/u',
'', $val);
124 if ($newval != $val) {
131 if ($type == 1 || $type == 3) {
133 $inj += preg_match(
'/delete\s*from/i', $val);
134 $inj += preg_match(
'/create\s*table/i', $val);
135 $inj += preg_match(
'/insert\s*into/i', $val);
136 $inj += preg_match(
'/select\s*from/i', $val);
137 $inj += preg_match(
'/into\s*(outfile|dumpfile)/i', $val);
138 $inj += preg_match(
'/user\s*\(/i', $val);
139 $inj += preg_match(
'/information_schema/i', $val);
140 $inj += preg_match(
'/<svg/i', $val);
141 $inj += preg_match(
'/update[^&=\w].*set.+=/i', $val);
142 $inj += preg_match(
'/union.+select/i', $val);
146 $inj += preg_match(
'/select|update|delete|truncate|replace|group\s*by|concat|count|from|union/i', $val);
149 $inj += preg_match(
'/updatexml\(/i', $val);
150 $inj += preg_match(
'/(\.\.%2f)+/i', $val);
151 $inj += preg_match(
'/\s@@/', $val);
154 $inj += preg_match(
'/<\/textarea/i', $val);
160 $inj += preg_match(
'/<audio/i', $val);
161 $inj += preg_match(
'/<embed/i', $val);
162 $inj += preg_match(
'/<iframe/i', $val);
163 $inj += preg_match(
'/<object/i', $val);
164 $inj += preg_match(
'/<script/i', $val);
165 $inj += preg_match(
'/Set\.constructor/i', $val);
166 if (!defined(
'NOSTYLECHECK')) {
167 $inj += preg_match(
'/<style/i', $val);
169 $inj += preg_match(
'/base\s+href/si', $val);
170 $inj += preg_match(
'/=data:/si', $val);
172 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i', $val);
173 $inj += preg_match(
'/on(abort|after|animation|auxclick|before|blur|bounce|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $val);
174 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $val);
175 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i', $val);
176 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i', $val);
177 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $val);
179 $inj += preg_match(
'/on(repeat|begin|finish)[a-z]*\s*=/i', $val);
182 $tmpval = preg_replace(
'/<[^<]+>/',
'', $val);
184 $inj += preg_match(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i', $tmpval);
185 $inj += preg_match(
'/on(abort|after|animation|auxclick|before|blur|bounce|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i', $tmpval);
186 $inj += preg_match(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i', $tmpval);
187 $inj += preg_match(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i', $tmpval);
188 $inj += preg_match(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i', $tmpval);
189 $inj += preg_match(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i', $tmpval);
191 $inj += preg_match(
'/on(repeat|begin|finish)[a-z]*\s*=/i', $tmpval);
194 $inj += preg_match(
'/:|:|:/i', $val);
195 $inj += preg_match(
'/j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i', $val);
196 $inj += preg_match(
'/vbscript\s*:/i', $val);
198 if ($type == 1 || $type == 3) {
199 $val = str_replace(
'enclosure="',
'enclosure=X', $val);
200 $inj += preg_match(
'/"/i', $val);
203 $inj += preg_match(
'/[:;"\'<>\?\(\){}\$%]/', $val);
218 if (is_array($var)) {
219 foreach ($var as $key => $value) {
223 http_response_code(403);
226 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'unknown' : $_SERVER[
'REMOTE_ADDR']);
228 $errormessage =
'Access refused to '.htmlentities($ip, ENT_COMPAT,
'UTF-8').
' by SQL or Script injection protection in main.inc.php:analyseVarsForSqlAndScriptsInjection type='.htmlentities($type, ENT_COMPAT,
'UTF-8');
230 $errormessage2 =
'paramkey='.htmlentities($key, ENT_COMPAT,
'UTF-8');
231 $errormessage2 .=
' paramvalue='.htmlentities($value, ENT_COMPAT,
'UTF-8');
232 $errormessage2 .=
' page='.htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT,
'UTF-8');
236 print
'Try to go back, fix data of your form and resubmit it. You can contact also your technical support.';
239 print $errormessage2;
243 if (function_exists(
'error_log')) {
244 error_log($errormessage.
' '.$errormessage2);
265if ((defined(
'NOREQUIREDB') || defined(
'NOREQUIRETRAN')) && !defined(
'NOREQUIREMENU')) {
266 print
'If define NOREQUIREDB or NOREQUIRETRAN are set, you must also set NOREQUIREMENU or not set them.';
269if (defined(
'NOREQUIREUSER') && !defined(
'NOREQUIREMENU')) {
270 print
'If define NOREQUIREUSER is set, you must also set NOREQUIREMENU or not set it.';
275if (!defined(
'NOSCANPHPSELFFORINJECTION') && !empty($_SERVER[
"PHP_SELF"])) {
276 $morevaltochecklikepost = array($_SERVER[
"PHP_SELF"]);
280if (!defined(
'NOSCANGETFORINJECTION') && !empty($_SERVER[
"QUERY_STRING"])) {
284 $morevaltochecklikeget = array(urldecode($_SERVER[
"QUERY_STRING"]));
288if (!defined(
'NOSCANPOSTFORINJECTION')) {
293if (!empty($_SERVER[
'DOCUMENT_ROOT']) && substr($_SERVER[
'DOCUMENT_ROOT'], -6) !==
'htdocs') {
294 set_include_path($_SERVER[
'DOCUMENT_ROOT'].
'/htdocs');
298require_once
'filefunc.inc.php';
310if (!empty($_POST[
"DOL_AUTOSET_COOKIE"])) {
311 $tmpautoset = explode(
':', $_POST[
"DOL_AUTOSET_COOKIE"], 2);
312 $tmplist = explode(
',', $tmpautoset[1]);
313 $cookiearrayvalue = array();
314 foreach ($tmplist as $tmpkey) {
315 $postkey = $tmpautoset[0].
'_'.$tmpkey;
317 if (!empty($_POST[$postkey])) {
318 $cookiearrayvalue[$tmpkey] = $_POST[$postkey];
321 $cookiename = $tmpautoset[0];
322 $cookievalue = json_encode($cookiearrayvalue);
324 if (PHP_VERSION_ID < 70300) {
325 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)),
'/', null, ((empty($dolibarr_main_force_https) &&
isHTTPS() === false) ? false : true), true);
328 $cookieparams = array(
329 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)),
332 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() === false) ? false : true),
336 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
338 if (empty($cookievalue)) {
339 unset($_COOKIE[$cookiename]);
345if (!empty($php_session_save_handler) && $php_session_save_handler ==
'db') {
346 require_once
'core/lib/phpsessionin'.$php_session_save_handler.
'.lib.php';
352 $prefix = dol_getprefix(
'');
353 $sessionname =
'DOLSESSID_'.$prefix;
354 $sessiontimeout =
'DOLSESSTIMEOUT_'.$prefix;
355if (!empty($_COOKIE[$sessiontimeout])) {
356 ini_set(
'session.gc_maxlifetime', $_COOKIE[$sessiontimeout]);
361if (!defined(
'NOSESSION')) {
362 if (PHP_VERSION_ID < 70300) {
363 session_set_cookie_params(0,
'/',
null, ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false : true), true);
366 $sessioncookieparams = array(
370 'secure' => ((empty($dolibarr_main_force_https) &&
isHTTPS() ===
false) ?
false : true),
374 session_set_cookie_params($sessioncookieparams);
376 session_name($sessionname);
383 require_once
'master.inc.php';
391 if ((!session_id() || !isset($_SESSION[
"dol_login"])) && !isset($_POST[
"username"]) && !empty($_SERVER[
"GATEWAY_INTERFACE"])) {
393 } elseif (isset($_POST[
"username"]) && $_POST[
"username"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
395 } elseif (defined(
'NOREQUIREDB')) {
397 } elseif (defined(
'EVEN_IF_ONLY_LOGIN_ALLOWED')) {
399 } elseif (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] == $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
403 if (session_id() && isset($_SESSION[
"dol_login"]) && $_SESSION[
"dol_login"] != $conf->global->MAIN_ONLY_LOGIN_ALLOWED) {
404 print
'Sorry, your application is offline.'.
"\n";
405 print
'You are logged with user "'.$_SESSION[
"dol_login"].
'" and only administrator user "' .
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED').
'" is allowed to connect for the moment.'.
"\n";
406 $nexturl = DOL_URL_ROOT.
'/user/logout.php?token='.newToken();
407 print
'Please try later or <a href="'.$nexturl.
'">click here to disconnect and change login user</a>...'.
"\n";
409 print
'Sorry, your application is offline. Only administrator user "' .
getDolGlobalString(
'MAIN_ONLY_LOGIN_ALLOWED').
'" is allowed to connect for the moment.'.
"\n";
410 $nexturl = DOL_URL_ROOT.
'/';
411 print
'Please try later or <a href="'.$nexturl.
'">click here to change login user</a>...'.
"\n";
419 register_shutdown_function(
'dol_shutdown');
422if (isModEnabled(
'debugbar') && !
GETPOST(
'dol_use_jmobile') && empty($_SESSION[
'dol_use_jmobile'])) {
424 include_once DOL_DOCUMENT_ROOT.
'/debugbar/class/DebugBar.php';
426 $renderer = $debugbar->getRenderer();
428 $conf->global->MAIN_HTML_HEADER =
'';
430 $conf->global->MAIN_HTML_HEADER .= $renderer->renderHead();
432 $debugbar[
'time']->startMeasure(
'pageaftermaster',
'Page generation (after environment init)');
436if (isset($_SERVER[
"HTTP_USER_AGENT"])) {
438 $conf->browser->name = $tmp[
'browsername'];
439 $conf->browser->os = $tmp[
'browseros'];
440 $conf->browser->version = $tmp[
'browserversion'];
441 $conf->browser->ua = $tmp[
'browserua'];
442 $conf->browser->layout = $tmp[
'layout'];
445 if ($conf->browser->layout ==
'phone') {
446 $conf->dol_no_mouse_hover = 1;
452 $conf->theme =
GETPOST(
'theme',
'aZ09');
453 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
457if (
GETPOST(
'textbrowser',
'int') || (!empty($conf->browser->name) && $conf->browser->name ==
'lynxlinks')) {
458 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = 1;
463if (!empty($conf->file->main_force_https) && (empty($_SERVER[
"HTTPS"]) || $_SERVER[
"HTTPS"] !=
'on') && !defined(
'NOHTTPSREDIRECT')) {
465 if (is_numeric($conf->file->main_force_https)) {
466 if ($conf->file->main_force_https ==
'1' && !empty($_SERVER[
"SCRIPT_URI"])) {
467 if (preg_match(
'/^http:/i', $_SERVER[
"SCRIPT_URI"]) && !preg_match(
'/^https:/i', $_SERVER[
"SCRIPT_URI"])) {
468 $newurl = preg_replace(
'/^http:/i',
'https:', $_SERVER[
"SCRIPT_URI"]);
472 $newurl = preg_replace(
'/^http:/i',
'https:', DOL_MAIN_URL_ROOT).$_SERVER[
"REQUEST_URI"];
476 $newurl = $conf->file->main_force_https.$_SERVER[
"REQUEST_URI"];
481 dol_syslog(
"main.inc: dolibarr_main_force_https is on, we make a redirect to ".$newurl);
482 header(
"Location: ".$newurl);
485 dol_syslog(
"main.inc: dolibarr_main_force_https is on but we failed to forge new https url so no redirect is done", LOG_WARNING);
489if (!defined(
'NOLOGIN') && !defined(
'NOIPCHECK') && !empty($dolibarr_main_restrict_ip)) {
490 $listofip = explode(
',', $dolibarr_main_restrict_ip);
492 foreach ($listofip as $ip) {
494 if ($ip == $_SERVER[
'REMOTE_ADDR']) {
500 print
'Access refused by IP protection. Your detected IP is '.$_SERVER[
'REMOTE_ADDR'];
506if (!defined(
'NOREQUIREHTML')) {
507 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
509if (!defined(
'NOREQUIREAJAX')) {
510 require_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
515 dol_syslog(
"main.inc: A previous install or upgrade was not complete. Redirect to install page.", LOG_WARNING);
516 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
520if ((
getDolGlobalString(
'MAIN_VERSION_LAST_UPGRADE') && ($conf->global->MAIN_VERSION_LAST_UPGRADE != DOL_VERSION))
522 $versiontocompare = !
getDolGlobalString(
'MAIN_VERSION_LAST_UPGRADE') ? $conf->global->MAIN_VERSION_LAST_INSTALL : $conf->global->MAIN_VERSION_LAST_UPGRADE;
523 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
524 $dolibarrversionlastupgrade = preg_split(
'/[.-]/', $versiontocompare);
525 $dolibarrversionprogram = preg_split(
'/[.-]/', DOL_VERSION);
526 $rescomp =
versioncompare($dolibarrversionprogram, $dolibarrversionlastupgrade);
528 if (!
getDolGlobalString(
'MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE') || $rescomp < 3) {
530 dol_syslog(
"main.inc: database version ".$versiontocompare.
" is lower than programs version ".DOL_VERSION.
". Redirect to install/upgrade page.", LOG_WARNING);
531 header(
"Location: ".DOL_URL_ROOT.
"/install/index.php");
538if (!defined(
'NOTOKENRENEWAL') && !defined(
'NOSESSION')) {
540 if (!preg_match(
'/\.(css|js|json)\.php$/', $_SERVER[
"PHP_SELF"])) {
542 if (isset($_SESSION[
'newtoken'])) {
543 $_SESSION[
'token'] = $_SESSION[
'newtoken'];
546 if (!isset($_SESSION[
'newtoken']) ||
getDolGlobalInt(
'MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL')) {
550 $token =
dol_hash(uniqid(mt_rand(),
false),
'md5');
551 $_SESSION[
'newtoken'] = $token;
552 dol_syslog(
"NEW TOKEN generated by : ".$_SERVER[
'PHP_SELF'], LOG_DEBUG);
560if ((!defined(
'NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined(
'CSRFCHECK_WITH_TOKEN')) {
562 $sensitiveget =
false;
563 if ((GETPOSTISSET(
'massaction') ||
GETPOST(
'action',
'aZ09')) &&
getDolGlobalInt(
'MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
565 if (GETPOSTISSET(
'massaction') || !in_array(
GETPOST(
'action',
'aZ09'), array(
'create',
'createsite',
'createcard',
'edit',
'editvalidator',
'file_manager',
'presend',
'presend_addmessage',
'preview',
'specimen'))) {
566 $sensitiveget =
true;
570 $arrayofactiontoforcetokencheck = array(
572 'doprev',
'donext',
'dvprev',
'dvnext',
573 'freezone',
'install',
576 if (in_array(
GETPOST(
'action',
'aZ09'), $arrayofactiontoforcetokencheck)) {
577 $sensitiveget =
true;
580 if (preg_match(
'/^(confirm_)?(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/',
GETPOST(
'action',
'aZ09'))) {
581 $sensitiveget =
true;
588 (!empty($_SERVER[
'REQUEST_METHOD']) && $_SERVER[
'REQUEST_METHOD'] ==
'POST') ||
590 GETPOSTISSET(
'massaction') ||
591 ((GETPOSTISSET(
'actionlogin') || GETPOSTISSET(
'action')) && defined(
'CSRFCHECK_WITH_TOKEN'))
594 if (!
GETPOST(
'token',
'alpha') ||
GETPOST(
'token',
'alpha') ==
'notrequired') {
596 if (
GETPOST(
'uploadform',
'int')) {
597 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused. File size too large or not provided.");
598 $langs->loadLangs(array(
"errors",
"install"));
599 print $langs->trans(
"ErrorFileSizeTooLarge").
' ';
600 print $langs->trans(
"ErrorGoBackAndCorrectParameters");
602 http_response_code(403);
603 if (defined(
'CSRFCHECK_WITH_TOKEN')) {
604 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (CSRFCHECK_WITH_TOKEN protection) in main.inc.php. Token not provided.", LOG_WARNING);
605 print
"Access to a page that needs a token (constant CSRFCHECK_WITH_TOKEN is defined) is refused by CSRF protection in main.inc.php. Token not provided.\n";
607 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (POST method or GET with a sensible value for 'action' parameter) in main.inc.php. Token not provided.", LOG_WARNING);
608 print
"Access to this page this way (POST method or GET with a sensible value for 'action' parameter) is refused by CSRF protection in main.inc.php. Token not provided.\n";
609 print
"If you access your server behind a proxy using url rewriting and the parameter is provided by caller, you might check that all HTTP header are propagated (or add the line \$dolibarr_nocsrfcheck=1 into your conf.php file or MAIN_SECURITY_CSRF_WITH_TOKEN to 0";
613 print
" into setup).\n";
620 $sessiontokenforthisurl = (empty($_SESSION[
'token']) ?
'' : $_SESSION[
'token']);
622 if (GETPOSTISSET(
'token') &&
GETPOST(
'token') !=
'notrequired' &&
GETPOST(
'token',
'alpha') != $sessiontokenforthisurl) {
623 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" refused by CSRF protection (invalid token), so we disable POST and some GET parameters - referer=".(empty($_SERVER[
'HTTP_REFERER'])?
'':$_SERVER[
'HTTP_REFERER']).
", action=".
GETPOST(
'action',
'aZ09').
", _GET|POST['token']=".
GETPOST(
'token',
'alpha'), LOG_WARNING);
626 if (!defined(
'NOTOKENRENEWAL')) {
628 setEventMessages(
'SecurityTokenHasExpiredSoActionHasBeenCanceledPleaseRetry',
null,
'warnings',
'', 1);
631 if (isset($_POST[
'id'])) {
632 $savid = ((int) $_POST[
'id']);
635 unset($_GET[
'confirm']);
636 unset($_GET[
'action']);
637 unset($_GET[
'confirmmassaction']);
638 unset($_GET[
'massaction']);
639 unset($_GET[
'token']);
641 $_POST[
'id'] = ((int) $savid);
644 $_GET[
'errorcode'] =
'InvalidToken';
653 if (GETPOSTISSET(
'disablemodules')) {
654 $_SESSION[
"disablemodules"] =
GETPOST(
'disablemodules',
'alpha');
656 if (!empty($_SESSION[
"disablemodules"])) {
657 $modulepartkeys = array(
'css',
'js',
'tabs',
'triggers',
'login',
'substitutions',
'menus',
'theme',
'sms',
'tpl',
'barcode',
'models',
'societe',
'hooks',
'dir',
'syslog',
'tpllinkable',
'contactelement',
'moduleforexternal');
659 $disabled_modules = explode(
',', $_SESSION[
"disablemodules"]);
660 foreach ($disabled_modules as $module) {
662 if (empty($conf->$module)) {
666 $conf->$module->enabled =
false;
668 foreach ($modulepartkeys as $modulepartkey) {
669 unset($conf->modules_parts[$modulepartkey][$module]);
671 if ($module ==
'fournisseur') {
672 $conf->supplier_order->enabled = 0;
673 $conf->supplier_invoice->enabled = 0;
681$modulepart = explode(
"/", $_SERVER[
"PHP_SELF"]);
682if (is_array($modulepart) && count($modulepart) > 0) {
683 foreach ($conf->modules as $module) {
684 if (in_array($module, $modulepart)) {
685 $modulepart = $module;
690if (is_array($modulepart)) {
700if (!defined(
'NOLOGIN')) {
704 if (defined(
'MAIN_AUTHENTICATION_MODE')) {
705 $dolibarr_main_authentication = constant(
'MAIN_AUTHENTICATION_MODE');
708 if (empty($dolibarr_main_authentication)) {
709 $dolibarr_main_authentication =
'dolibarr';
712 if ($dolibarr_main_authentication ==
'forceuser' && empty($dolibarr_auto_user)) {
713 $dolibarr_auto_user =
'auto';
717 $authmode = explode(
',', $dolibarr_main_authentication);
720 if (!count($authmode)) {
721 $langs->load(
'main');
722 dol_print_error(
'', $langs->trans(
"ErrorConfigParameterNotDefined",
'dolibarr_main_authentication'));
729 $resultFetchUser =
'';
731 if (!isset($_SESSION[
"dol_login"])) {
733 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
735 $dol_dst_observed =
GETPOST(
"dst_observed",
'int', 3);
736 $dol_dst_first =
GETPOST(
"dst_first",
'int', 3);
737 $dol_dst_second =
GETPOST(
"dst_second",
'int', 3);
738 $dol_screenwidth =
GETPOST(
"screenwidth",
'int', 3);
739 $dol_screenheight =
GETPOST(
"screenheight",
'int', 3);
740 $dol_hide_topmenu =
GETPOST(
'dol_hide_topmenu',
'int', 3);
741 $dol_hide_leftmenu =
GETPOST(
'dol_hide_leftmenu',
'int', 3);
742 $dol_optimize_smallscreen =
GETPOST(
'dol_optimize_smallscreen',
'int', 3);
743 $dol_no_mouse_hover =
GETPOST(
'dol_no_mouse_hover',
'int', 3);
744 $dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int', 3);
749 if (empty($_SERVER[
'HTTP_REFERER']) || !preg_match(
'/public/', $_SERVER[
'HTTP_REFERER'])) {
750 dol_syslog(
"Call index page from another url than demo page (call is done from page ".(empty($_SERVER[
'HTTP_REFERER']) ?
'' : $_SERVER[
'HTTP_REFER']).
")");
752 $url .= ($url ?
'&' :
'').($dol_hide_topmenu ?
'dol_hide_topmenu='.$dol_hide_topmenu :
'');
753 $url .= ($url ?
'&' :
'').($dol_hide_leftmenu ?
'dol_hide_leftmenu='.$dol_hide_leftmenu :
'');
754 $url .= ($url ?
'&' :
'').($dol_optimize_smallscreen ?
'dol_optimize_smallscreen='.$dol_optimize_smallscreen :
'');
755 $url .= ($url ?
'&' :
'').($dol_no_mouse_hover ?
'dol_no_mouse_hover='.$dol_no_mouse_hover :
'');
756 $url .= ($url ?
'&' :
'').($dol_use_jmobile ?
'dol_use_jmobile='.$dol_use_jmobile :
'');
757 $url = DOL_URL_ROOT.
'/public/demo/index.php'.($url ?
'?'.$url :
'');
758 header(
"Location: ".$url);
765 $hookmanager->initHooks(array(
'login'));
766 $parameters = array();
767 $reshook = $hookmanager->executeHooks(
'beforeLoginAuthentication', $parameters, $user, $action);
774 if ($test &&
GETPOST(
"username",
"alpha", 2) &&
getDolGlobalString(
'MAIN_SECURITY_ENABLECAPTCHA') && !isset($_SESSION[
'dol_bypass_antispam'])) {
775 $sessionkey =
'dol_antispam_value';
776 $ok = (array_key_exists($sessionkey, $_SESSION) ===
true && (strtolower($_SESSION[$sessionkey]) === strtolower(
GETPOST(
'code',
'restricthtml'))));
780 dol_syslog(
'Bad value for code, connexion refused', LOG_NOTICE);
782 $langs->loadLangs(array(
'main',
'errors'));
784 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadValueForCode");
788 $user->context[
'audit'] =
'ErrorBadValueForCode - login='.GETPOST(
"username",
"alpha", 2);
791 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
799 $hookmanager->initHooks(array(
'login'));
800 $parameters = array(
'dol_authmode'=>$authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
801 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
810 $allowedmethodtopostusername = 3;
811 if (defined(
'MAIN_AUTHENTICATION_POST_METHOD')) {
812 $allowedmethodtopostusername = constant(
'MAIN_AUTHENTICATION_POST_METHOD');
815 $usertotest = (!empty($_COOKIE[
'login_dolibarr']) ? preg_replace(
'/[^a-zA-Z0-9_@\-\.]/',
'', $_COOKIE[
'login_dolibarr']) :
GETPOST(
"username",
"alpha", $allowedmethodtopostusername));
816 $passwordtotest =
GETPOST(
'password',
'none', $allowedmethodtopostusername);
817 $entitytotest = (
GETPOST(
'entity',
'int') ?
GETPOST(
'entity',
'int') : (!empty($conf->entity) ? $conf->entity : 1));
820 $goontestloop =
false;
821 if (isset($_SERVER[
"REMOTE_USER"]) && in_array(
'http', $authmode)) {
822 $goontestloop =
true;
824 if ($dolibarr_main_authentication ==
'forceuser' && !empty($dolibarr_auto_user)) {
825 $goontestloop =
true;
827 if (
GETPOST(
"username",
"alpha", $allowedmethodtopostusername)) {
828 $goontestloop =
true;
830 if (
GETPOST(
'openid_mode',
'alpha', 1)) {
831 $goontestloop =
true;
833 if (
GETPOST(
'beforeoauthloginredirect') ||
GETPOST(
'afteroauthloginreturn')) {
834 $goontestloop =
true;
836 if (!empty($_COOKIE[
'login_dolibarr'])) {
837 $goontestloop =
true;
840 if (!is_object($langs)) {
841 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
844 if (defined(
'MAIN_LANG_DEFAULT')) {
845 $langcode = constant(
'MAIN_LANG_DEFAULT');
847 $langs->setDefaultLang($langcode);
853 if ($test && $goontestloop && (
GETPOST(
'actionlogin',
'aZ09') ==
'login' || $dolibarr_main_authentication !=
'dolibarr')) {
856 $oauthmodetotestarray = array(
'google');
857 foreach ($oauthmodetotestarray as $oauthmodetotest) {
858 if (in_array($oauthmodetotest.
'oauth', $authmode)) {
860 if (
GETPOST(
'beforeoauthloginredirect') == $oauthmodetotest ||
GETPOST(
'afteroauthloginreturn')) {
864 dol_syslog(
"User did not click on link for OAuth or is not on the OAuth return, so we disable check using ".$oauthmodetotest);
865 foreach ($authmode as $tmpkey => $tmpval) {
866 if ($tmpval == $oauthmodetotest.
'oauth') {
867 unset($authmode[$tmpkey]);
876 if ($login ===
'--bad-login-validity--') {
883 $dol_authmode = $conf->authmode;
884 $dol_tz = empty($_POST[
"tz"]) ? (empty($_SESSION[
"tz"]) ?
'' : $_SESSION[
"tz"]) : $_POST[
"tz"];
885 $dol_tz_string = empty($_POST[
"tz_string"]) ? (empty($_SESSION[
"tz_string"]) ?
'' : $_SESSION[
"tz_string"]) : $_POST[
"tz_string"];
886 $dol_tz_string = preg_replace(
'/\s*\(.+\)$/',
'', $dol_tz_string);
887 $dol_tz_string = preg_replace(
'/,/',
'/', $dol_tz_string);
888 $dol_tz_string = preg_replace(
'/\s/',
'_', $dol_tz_string);
891 $dol_dst_first = empty($_POST[
"dst_first"]) ? (empty($_SESSION[
"dst_first"]) ?
'' : $_SESSION[
"dst_first"]) : $_POST[
"dst_first"];
892 $dol_dst_second = empty($_POST[
"dst_second"]) ? (empty($_SESSION[
"dst_second"]) ?
'' : $_SESSION[
"dst_second"]) : $_POST[
"dst_second"];
893 if ($dol_dst_first && $dol_dst_second) {
894 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
898 if ($datenow >= $datefirst && $datenow < $datesecond) {
902 $dol_screenheight = empty($_POST[
"screenheight"]) ? (empty($_SESSION[
"dol_screenheight"]) ?
'' : $_SESSION[
"dol_screenheight"]) : $_POST[
"screenheight"];
903 $dol_screenwidth = empty($_POST[
"screenwidth"]) ? (empty($_SESSION[
"dol_screenwidth"]) ?
'' : $_SESSION[
"dol_screenwidth"]) : $_POST[
"screenwidth"];
908 dol_syslog(
'Bad password, connexion refused (see a previous notice message for more info)', LOG_NOTICE);
910 $langs->loadLangs(array(
'main',
'errors'));
914 if (empty($_SESSION[
"dol_loginmesg"])) {
915 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorBadLoginPassword");
919 $user->context[
'audit'] = $langs->trans(
"ErrorBadLoginPassword").
' - login='.
GETPOST(
"username",
"alpha", 2);
922 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
930 $hookmanager->initHooks(array(
'login'));
931 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
932 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
942 if (!$login || (in_array(
'ldap', $authmode) && empty($passwordtotest))) {
944 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
" - action=".
GETPOST(
'action',
'aZ09').
" - actionlogin=".
GETPOST(
'actionlogin',
'aZ09').
" - showing the login form and exit", LOG_NOTICE);
945 if (defined(
'NOREDIRECTBYMAINTOLOGIN')) {
950 return 'ERROR_NOT_LOGGED';
952 if (!empty($_SERVER[
"HTTP_USER_AGENT"]) && $_SERVER[
"HTTP_USER_AGENT"] ==
'securitytest') {
953 http_response_code(401);
955 dol_loginfunction($langs, $conf, (!empty($mysoc) ? $mysoc :
''));
960 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entitytotest > 0 ? $entitytotest : -1));
961 if ($resultFetchUser <= 0 || $user->isNotIntoValidityDateRange()) {
962 dol_syslog(
'User not found or not valid, connexion refused');
964 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false : true), true);
965 session_name($sessionname);
968 if ($resultFetchUser == 0) {
970 $langs->loadLangs(array(
'main',
'errors'));
972 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
974 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
975 } elseif ($resultFetchUser < 0) {
976 $_SESSION[
"dol_loginmesg"] = $user->error;
978 $user->context[
'audit'] = $user->error;
981 $langs->loadLangs(array(
'main',
'errors'));
983 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorLoginDateValidity");
985 $user->context[
'audit'] = $langs->trans(
"ErrorLoginDateValidity").
' - login='.$login;
989 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
998 $hookmanager->initHooks(array(
'login'));
999 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginmesg'=>$_SESSION[
"dol_loginmesg"]);
1000 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1005 $paramsurl = array();
1006 if (
GETPOST(
'textbrowser',
'int')) {
1007 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
1010 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
1012 if (
GETPOST(
'lang',
'aZ09')) {
1013 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1015 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1019 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1020 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1025 $login = $_SESSION[
"dol_login"];
1026 $entity = isset($_SESSION[
"dol_entity"]) ? $_SESSION[
"dol_entity"] : 0;
1027 dol_syslog(
"- This is an already logged session. _SESSION['dol_login']=".$login.
" _SESSION['dol_entity']=".$entity, LOG_DEBUG);
1029 $resultFetchUser = $user->fetch(
'', $login,
'', 1, ($entity > 0 ? $entity : -1));
1033 if ($resultFetchUser <= 0
1034 || ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"])
1035 || ($user->status != $user::STATUS_ENABLED)
1036 || ($user->isNotIntoValidityDateRange())) {
1037 if ($resultFetchUser <= 0) {
1039 dol_syslog(
"Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING);
1040 } elseif ($user->flagdelsessionsbefore && !empty($_SESSION[
"dol_logindate"]) && $user->flagdelsessionsbefore > $_SESSION[
"dol_logindate"]) {
1042 dol_syslog(
"The user has a date for session invalidation = ".$user->flagdelsessionsbefore.
" and a session date = ".$_SESSION[
"dol_logindate"].
". We must invalidate its sessions.");
1043 } elseif ($user->status != $user::STATUS_ENABLED) {
1048 dol_syslog(
"The user login has a validity between [".$user->datestartvalidity.
" and ".$user->dateendvalidity.
"], curren date is ".
dol_now());
1051 session_set_cookie_params(0,
'/',
null, (empty($dolibarr_main_force_https) ?
false : true), true);
1052 session_name($sessionname);
1055 if ($resultFetchUser == 0) {
1056 $langs->loadLangs(array(
'main',
'errors'));
1058 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorCantLoadUserFromDolibarrDatabase", $login);
1060 $user->context[
'audit'] =
'ErrorCantLoadUserFromDolibarrDatabase - login='.$login;
1061 } elseif ($resultFetchUser < 0) {
1062 $_SESSION[
"dol_loginmesg"] = $user->error;
1064 $user->context[
'audit'] = $user->error;
1066 $langs->loadLangs(array(
'main',
'errors'));
1068 $_SESSION[
"dol_loginmesg"] = $langs->transnoentitiesnoconv(
"ErrorSessionInvalidatedAfterPasswordChange");
1070 $user->context[
'audit'] =
'ErrorUserSessionWasInvalidated - login='.$login;
1074 $result = $user->call_trigger(
'USER_LOGIN_FAILED', $user);
1082 $hookmanager->initHooks(array(
'login'));
1083 $parameters = array(
'dol_authmode' => (isset($dol_authmode) ? $dol_authmode :
''),
'dol_loginmesg' => $_SESSION[
"dol_loginmesg"]);
1084 $reshook = $hookmanager->executeHooks(
'afterLoginFailed', $parameters, $user, $action);
1089 $paramsurl = array();
1090 if (
GETPOST(
'textbrowser',
'int')) {
1091 $paramsurl[] =
'textbrowser='.GETPOST(
'textbrowser',
'int');
1094 $paramsurl[] =
'nojs='.GETPOST(
'nojs',
'int');
1096 if (
GETPOST(
'lang',
'aZ09')) {
1097 $paramsurl[] =
'lang='.GETPOST(
'lang',
'aZ09');
1100 header(
'Location: '.DOL_URL_ROOT.
'/index.php'.(count($paramsurl) ?
'?'.implode(
'&', $paramsurl) :
''));
1104 $hookmanager->initHooks(array(
'main'));
1107 if (!empty($_GET[
'save_lastsearch_values']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1108 $relativepathstring = preg_replace(
'/\?.*$/',
'', $_SERVER[
"HTTP_REFERER"]);
1109 $relativepathstring = preg_replace(
'/^https?:\/\/[^\/]*/',
'', $relativepathstring);
1111 if (constant(
'DOL_URL_ROOT')) {
1112 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
1114 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
1115 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1119 if (!empty($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring])) {
1120 $_SESSION[
'lastsearch_values_'.$relativepathstring] = $_SESSION[
'lastsearch_values_tmp_'.$relativepathstring];
1121 unset($_SESSION[
'lastsearch_values_tmp_'.$relativepathstring]);
1123 if (!empty($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring])) {
1124 $_SESSION[
'lastsearch_contextpage_'.$relativepathstring] = $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring];
1125 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
1127 if (!empty($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] != $conf->liste_limit) {
1128 $_SESSION[
'lastsearch_limit_'.$relativepathstring] = $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring];
1129 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
1131 if (!empty($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]) && $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] > 0) {
1132 $_SESSION[
'lastsearch_page_'.$relativepathstring] = $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring];
1133 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
1135 if (!empty($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring])) {
1136 $_SESSION[
'lastsearch_mode_'.$relativepathstring] = $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring];
1137 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
1140 if (!empty($_GET[
'save_pageforbacktolist']) && !empty($_SERVER[
"HTTP_REFERER"])) {
1141 if (empty($_SESSION[
'pageforbacktolist'])) {
1142 $pageforbacktolistarray = array();
1144 $pageforbacktolistarray = $_SESSION[
'pageforbacktolist'];
1146 $tmparray = explode(
':', $_GET[
'save_pageforbacktolist'], 2);
1147 if (!empty($tmparray[0]) && !empty($tmparray[1])) {
1148 $pageforbacktolistarray[$tmparray[0]] = $tmparray[1];
1149 $_SESSION[
'pageforbacktolist'] = $pageforbacktolistarray;
1154 $parameters = array();
1155 $reshook = $hookmanager->executeHooks(
'updateSession', $parameters, $user, $action);
1164 if (!isset($_SESSION[
"dol_login"])) {
1169 $_SESSION[
"dol_login"] = $user->login;
1170 $_SESSION[
"dol_logindate"] =
dol_now(
'gmt');
1171 $_SESSION[
"dol_authmode"] = isset($dol_authmode) ? $dol_authmode :
'';
1172 $_SESSION[
"dol_tz"] = isset($dol_tz) ? $dol_tz :
'';
1173 $_SESSION[
"dol_tz_string"] = isset($dol_tz_string) ? $dol_tz_string :
'';
1174 $_SESSION[
"dol_dst"] = isset($dol_dst) ? $dol_dst :
'';
1175 $_SESSION[
"dol_dst_observed"] = isset($dol_dst_observed) ? $dol_dst_observed :
'';
1176 $_SESSION[
"dol_dst_first"] = isset($dol_dst_first) ? $dol_dst_first :
'';
1177 $_SESSION[
"dol_dst_second"] = isset($dol_dst_second) ? $dol_dst_second :
'';
1178 $_SESSION[
"dol_screenwidth"] = isset($dol_screenwidth) ? $dol_screenwidth :
'';
1179 $_SESSION[
"dol_screenheight"] = isset($dol_screenheight) ? $dol_screenheight :
'';
1181 $_SESSION[
"dol_entity"] = $conf->entity;
1183 if (!empty($dol_hide_topmenu)) {
1184 $_SESSION[
'dol_hide_topmenu'] = $dol_hide_topmenu;
1186 if (!empty($dol_hide_leftmenu)) {
1187 $_SESSION[
'dol_hide_leftmenu'] = $dol_hide_leftmenu;
1189 if (!empty($dol_optimize_smallscreen)) {
1190 $_SESSION[
'dol_optimize_smallscreen'] = $dol_optimize_smallscreen;
1192 if (!empty($dol_no_mouse_hover)) {
1193 $_SESSION[
'dol_no_mouse_hover'] = $dol_no_mouse_hover;
1195 if (!empty($dol_use_jmobile)) {
1196 $_SESSION[
'dol_use_jmobile'] = $dol_use_jmobile;
1199 dol_syslog(
"This is a new started user session. _SESSION['dol_login']=".$_SESSION[
"dol_login"].
" Session id=".session_id());
1203 $user->update_last_login_date();
1205 $loginfo =
'TZ='.$_SESSION[
"dol_tz"].
';TZString='.$_SESSION[
"dol_tz_string"].
';Screen='.$_SESSION[
"dol_screenwidth"].
'x'.$_SESSION[
"dol_screenheight"];
1206 $loginfo .=
' - authmode='.$dol_authmode.
' - entity='.$conf->entity;
1209 $user->context[
'audit'] = $loginfo;
1210 $user->context[
'authentication_method'] = $dol_authmode;
1213 $result = $user->call_trigger(
'USER_LOGIN', $user);
1221 $hookmanager->initHooks(array(
'login'));
1222 $parameters = array(
'dol_authmode'=>$dol_authmode,
'dol_loginfo'=>$loginfo);
1223 $reshook = $hookmanager->executeHooks(
'afterLogin', $parameters, $user, $action);
1231 dol_print_error($db,
'Error in some triggers USER_LOGIN or in some hooks afterLogin');
1238 $landingpage = (empty($user->conf->MAIN_LANDING_PAGE) ? (!
getDolGlobalString(
'MAIN_LANDING_PAGE') ?
'' : $conf->global->MAIN_LANDING_PAGE) : $user->
conf->MAIN_LANDING_PAGE);
1239 if (!empty($landingpage)) {
1241 if ($_SERVER[
"PHP_SELF"] != $newpath) {
1242 header(
'Location: '.$newpath);
1251 $user->rights->user->user->lire = 1;
1252 $user->rights->user->user->creer = 1;
1253 $user->rights->user->user->password = 1;
1254 $user->rights->user->user->supprimer = 1;
1255 $user->rights->user->self->creer = 1;
1256 $user->rights->user->self->password = 1;
1260 if (!$user->hasRight(
'user',
'user_advance')) {
1261 $user->rights->user->user_advance =
new stdClass();
1263 if (!$user->hasRight(
'user',
'self_advance')) {
1264 $user->rights->user->self_advance =
new stdClass();
1266 if (!$user->hasRight(
'user',
'group_advance')) {
1267 $user->rights->user->group_advance =
new stdClass();
1270 $user->rights->user->user_advance->readperms = 1;
1271 $user->rights->user->user_advance->write = 1;
1272 $user->rights->user->self_advance->readperms = 1;
1273 $user->rights->user->self_advance->writeperms = 1;
1274 $user->rights->user->group_advance->read = 1;
1275 $user->rights->user->group_advance->readperms = 1;
1276 $user->rights->user->group_advance->write = 1;
1277 $user->rights->user->group_advance->delete = 1;
1286 if (isset($user->conf->MAIN_SIZE_LISTE_LIMIT)) {
1287 $conf->liste_limit = $user->conf->MAIN_SIZE_LISTE_LIMIT;
1289 if (isset($user->conf->PRODUIT_LIMIT_SIZE)) {
1290 $conf->product->limit_size = $user->conf->PRODUIT_LIMIT_SIZE;
1295 $conf->theme = $user->conf->MAIN_THEME;
1296 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1300 if (!empty($user) && method_exists($user,
'loadDefaultValues') && !defined(
'NODEFAULTVALUES')) {
1301 $user->loadDefaultValues();
1307if (
GETPOST(
'theme',
'aZ09')) {
1308 $conf->theme =
GETPOST(
'theme',
'aZ09', 1);
1309 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1314 $conf->use_javascript_ajax = 0;
1316 if (!empty($user->conf->MAIN_DISABLE_JAVASCRIPT)) {
1317 $conf->use_javascript_ajax = !$user->conf->MAIN_DISABLE_JAVASCRIPT;
1322if (!
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') && !empty($user->conf->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1323 $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER = $user->conf->MAIN_OPTIMIZEFORTEXTBROWSER;
1327 $conf->global->MAIN_OPTIMIZEFORCOLORBLIND = empty($user->conf->MAIN_OPTIMIZEFORCOLORBLIND) ?
'' : $user->conf->MAIN_OPTIMIZEFORCOLORBLIND;
1330if (
GETPOST(
'dol_hide_leftmenu',
'int') || !empty($_SESSION[
'dol_hide_leftmenu'])) {
1331 $conf->dol_hide_leftmenu = 1;
1333if (
GETPOST(
'dol_hide_topmenu',
'int') || !empty($_SESSION[
'dol_hide_topmenu'])) {
1334 $conf->dol_hide_topmenu = 1;
1336if (
GETPOST(
'dol_optimize_smallscreen',
'int') || !empty($_SESSION[
'dol_optimize_smallscreen'])) {
1337 $conf->dol_optimize_smallscreen = 1;
1339if (
GETPOST(
'dol_no_mouse_hover',
'int') || !empty($_SESSION[
'dol_no_mouse_hover'])) {
1340 $conf->dol_no_mouse_hover = 1;
1342if (
GETPOST(
'dol_use_jmobile',
'int') || !empty($_SESSION[
'dol_use_jmobile'])) {
1343 $conf->dol_use_jmobile = 1;
1346if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
1347 $conf->dol_no_mouse_hover = 1;
1351if ((!empty($conf->browser->layout) && $conf->browser->layout ==
'phone')
1352 || (!empty($_SESSION[
'dol_screenwidth']) && $_SESSION[
'dol_screenwidth'] < 400)
1353 || (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 400
1356 $conf->dol_optimize_smallscreen = 1;
1359 $conf->global->PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE = 0;
1363if (!empty($conf->dol_use_jmobile) && in_array($conf->theme, array(
'bureau2crea',
'cameleo',
'amarok'))) {
1364 $conf->theme =
'eldy';
1365 $conf->css =
"/theme/".$conf->theme.
"/style.css.php";
1368if (!defined(
'NOREQUIRETRAN')) {
1369 if (!
GETPOST(
'lang',
'aZ09')) {
1371 if (!empty($user->conf->MAIN_LANG_DEFAULT)) {
1374 if ($langs->getDefaultLang() != $user->conf->MAIN_LANG_DEFAULT) {
1375 $langs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT);
1381if (!defined(
'NOLOGIN')) {
1384 if (!$user->login) {
1389 if ($user->statut < 1) {
1391 $langs->loadLangs(array(
"errors",
"other"));
1392 dol_syslog(
"Authentication KO as login is disabled", LOG_NOTICE);
1400 dol_syslog(
"--- Access to ".(empty($_SERVER[
"REQUEST_METHOD"]) ?
'' : $_SERVER[
"REQUEST_METHOD"].
' ').$_SERVER[
"PHP_SELF"].
' - action='.
GETPOST(
'action',
'aZ09').
', massaction='.
GETPOST(
'massaction',
'aZ09').(defined(
'NOTOKENRENEWAL') ?
' NOTOKENRENEWAL='.constant(
'NOTOKENRENEWAL') :
''), LOG_NOTICE);
1405if (!defined(
'NOREQUIRETRAN')) {
1407 $langs->loadLangs(array(
'main',
'dict'));
1411 $bc = array(0=>
'class="impair"', 1=>
'class="pair"');
1412 $bcdd = array(0=>
'class="drag drop oddeven"', 1=>
'class="drag drop oddeven"');
1413 $bcnd = array(0=>
'class="nodrag nodrop nohover"', 1=>
'class="nodrag nodrop nohoverpair"');
1414 $bctag = array(0=>
'class="impair tagtr"', 1=>
'class="pair tagtr"');
1417 $mesg =
''; $warning =
''; $error = 0;
1419 $mesgs = array(); $warnings = array(); $errors = array();
1422if (empty($conf->browser->firefox)) {
1423 define(
'ROWS_1', 1);
1424 define(
'ROWS_2', 2);
1425 define(
'ROWS_3', 3);
1426 define(
'ROWS_4', 4);
1427 define(
'ROWS_5', 5);
1428 define(
'ROWS_6', 6);
1429 define(
'ROWS_7', 7);
1430 define(
'ROWS_8', 8);
1431 define(
'ROWS_9', 9);
1433 define(
'ROWS_1', 0);
1434 define(
'ROWS_2', 1);
1435 define(
'ROWS_3', 2);
1436 define(
'ROWS_4', 3);
1437 define(
'ROWS_5', 4);
1438 define(
'ROWS_6', 5);
1439 define(
'ROWS_7', 6);
1440 define(
'ROWS_8', 7);
1441 define(
'ROWS_9', 8);
1444 $heightforframes = 50;
1447if (!defined(
'NOREQUIREMENU')) {
1448 if (empty($user->socid)) {
1449 $conf->standard_menu = (!
getDolGlobalString(
'MAIN_MENU_STANDARD_FORCED') ? (!
getDolGlobalString(
'MAIN_MENU_STANDARD') ?
'eldy_menu.php' : $conf->global->MAIN_MENU_STANDARD) : $conf->global->MAIN_MENU_STANDARD_FORCED);
1452 $conf->standard_menu = (!
getDolGlobalString(
'MAIN_MENUFRONT_STANDARD_FORCED') ? (!
getDolGlobalString(
'MAIN_MENUFRONT_STANDARD') ?
'eldy_menu.php' : $conf->global->MAIN_MENUFRONT_STANDARD) : $conf->global->MAIN_MENUFRONT_STANDARD_FORCED);
1456 $file_menu = $conf->standard_menu;
1457 if (
GETPOST(
'menu',
'alpha')) {
1458 $file_menu =
GETPOST(
'menu',
'alpha');
1460 if (!class_exists(
'MenuManager')) {
1462 $dirmenus = array_merge(array(
"/core/menus/"), (array) $conf->modules_parts[
'menus']);
1463 foreach ($dirmenus as $dirmenu) {
1465 if (class_exists(
'MenuManager')) {
1469 if (!class_exists(
'MenuManager')) {
1470 dol_syslog(
"You define a menu manager '".$file_menu.
"' that can not be loaded.", LOG_WARNING);
1471 $file_menu =
'eldy_menu.php';
1472 include_once DOL_DOCUMENT_ROOT.
"/core/menus/standard/".$file_menu;
1475 $menumanager =
new MenuManager($db, empty($user->socid) ? 0 : 1);
1479if (!empty(
GETPOST(
'seteventmessages',
'alpha'))) {
1480 $message =
GETPOST(
'seteventmessages',
'alpha');
1481 $messages = explode(
',', $message);
1482 foreach ($messages as $key => $msg) {
1483 $tmp = explode(
':', $msg);
1490if (!function_exists(
"llxHeader")) {
1511 function llxHeader($head =
'', $title =
'', $help_url =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs =
'', $arrayofcss =
'', $morequerystring =
'', $morecssonbody =
'', $replacemainareaby =
'', $disablenofollow = 0, $disablenoindex = 0)
1513 global $conf, $hookmanager;
1515 $parameters = array(
1518 'help_url' =>& $help_url,
1519 'target' =>& $target,
1520 'disablejs' =>& $disablejs,
1521 'disablehead' =>& $disablehead,
1522 'arrayofjs' =>& $arrayofjs,
1523 'arrayofcss' =>& $arrayofcss,
1524 'morequerystring' =>& $morequerystring,
1525 'morecssonbody' =>& $morecssonbody,
1526 'replacemainareaby' =>& $replacemainareaby,
1527 'disablenofollow' =>& $disablenofollow,
1528 'disablenoindex' =>& $disablenoindex
1531 $reshook = $hookmanager->executeHooks(
'llxHeader', $parameters);
1533 print $hookmanager->resPrint;
1538 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow, $disablenoindex);
1540 $tmpcsstouse =
'sidebar-collapse'.($morecssonbody ?
' '.$morecssonbody :
'');
1542 if ($conf->theme ==
'md' && !in_array($conf->browser->layout, array(
'phone',
'tablet')) && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
1544 if ($mainmenu !=
'website') {
1545 $tmpcsstouse = $morecssonbody;
1550 $tmpcsstouse .=
' colorblind-'.strip_tags($conf->global->MAIN_OPTIMIZEFORCOLORBLIND);
1553 print
'<body id="mainbody" class="'.$tmpcsstouse.
'">'.
"\n";
1556 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1557 top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
1560 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup',
'aZ09')) {
1561 left_menu(array(), $help_url,
'',
'', 1, $title, 1);
1565 if ($replacemainareaby) {
1566 print $replacemainareaby;
1583 global $db, $conf, $hookmanager;
1585 if ($contenttype ==
'text/html') {
1586 header(
"Content-Type: text/html; charset=".$conf->file->character_set_client);
1588 header(
"Content-Type: ".$contenttype);
1594 header(
"X-Content-Type-Options: nosniff");
1597 if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
1598 header(
"X-Frame-Options: SAMEORIGIN");
1600 header(
"X-Frame-Options: ALLOWALL");
1604 $tmpurl = constant(
'DOL_MAIN_URL_ROOT');
1605 $tmpurl = preg_replace(
'/^(https?:\/\/[^\/]+)\/.*$/',
'\1', $tmpurl);
1606 header(
'Access-Control-Allow-Origin: '.$tmpurl);
1607 header(
'Vary: Origin');
1614 if (!defined(
'MAIN_SECURITY_FORCECSPRO')) {
1629 if (!is_object($hookmanager)) {
1630 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1633 $hookmanager->initHooks(array(
"main"));
1635 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'reportonly');
1636 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1638 $contentsecuritypolicy = $hookmanager->resPrint;
1640 $contentsecuritypolicy .= $hookmanager->resPrint;
1643 if (!empty($contentsecuritypolicy)) {
1644 header(
"Content-Security-Policy-Report-Only: ".$contentsecuritypolicy);
1647 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSPRO'));
1651 if (!defined(
'MAIN_SECURITY_FORCECSP')) {
1666 if (!is_object($hookmanager)) {
1667 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1670 $hookmanager->initHooks(array(
"main"));
1672 $parameters = array(
'contentsecuritypolicy'=>$contentsecuritypolicy,
'mode'=>
'active');
1673 $result = $hookmanager->executeHooks(
'setContentSecurityPolicy', $parameters);
1675 $contentsecuritypolicy = $hookmanager->resPrint;
1677 $contentsecuritypolicy .= $hookmanager->resPrint;
1680 if (!empty($contentsecuritypolicy)) {
1681 header(
"Content-Security-Policy: ".$contentsecuritypolicy);
1684 header(
"Content-Security-Policy: ".constant(
'MAIN_SECURITY_FORCECSP'));
1691 if (!defined(
'MAIN_SECURITY_FORCERP')) {
1694 header(
"Referrer-Policy: ".$referrerpolicy);
1697 if ($forcenocache) {
1698 header(
"Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
1720function top_htmlhead($head, $title =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $disableforlogin = 0, $disablenofollow = 0, $disablenoindex = 0)
1722 global $db, $conf, $langs, $user, $mysoc, $hookmanager;
1726 if (empty($conf->css)) {
1727 $conf->css =
'/theme/eldy/style.css.php';
1730 print
'<!doctype html>'.
"\n";
1732 print
'<html lang="'.substr($langs->defaultlang, 0, 2).
'">'.
"\n";
1735 if (empty($disablehead)) {
1736 if (!is_object($hookmanager)) {
1737 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
1740 $hookmanager->initHooks(array(
"main"));
1742 $ext =
'layout='.(empty($conf->browser->layout) ?
'' : $conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
1746 if (
GETPOST(
'dol_basehref',
'alpha')) {
1747 print
'<base href="'.dol_escape_htmltag(
GETPOST(
'dol_basehref',
'alpha')).
'">'.
"\n";
1751 print
'<meta charset="utf-8">'.
"\n";
1752 print
'<meta name="robots" content="'.($disablenoindex ?
'index' :
'noindex').($disablenofollow ?
',follow' :
',nofollow').
'">'.
"\n";
1753 print
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'.
"\n";
1754 print
'<meta name="author" content="Dolibarr Development Team">'.
"\n";
1755 print
'<meta name="anti-csrf-newtoken" content="'.newToken().
'">'.
"\n";
1756 print
'<meta name="anti-csrf-currenttoken" content="'.currentToken().
'">'.
"\n";
1758 print
'<meta name="MAIN_FEATURES_LEVEL" content="'.getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
'">'.
"\n";
1761 $favicon = DOL_URL_ROOT.
'/theme/dolibarr_256x256_color.png';
1762 if (!empty($mysoc->logo_squarred_mini)) {
1763 $favicon = DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/thumbs/'.$mysoc->logo_squarred_mini);
1768 if (empty($conf->dol_use_jmobile)) {
1769 print
'<link rel="shortcut icon" type="image/x-icon" href="'.$favicon.
'"/>'.
"\n";
1777 $manifest = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/manifest.json.php';
1778 if (!empty($manifest)) {
1779 print
'<link rel="manifest" href="'.$manifest.
'" />'.
"\n";
1784 print
'<meta name="theme-color" content="rgb(' .
getDolGlobalString(
'THEME_ELDY_TOPMENU_BACK1').
')">'.
"\n";
1788 if (
GETPOST(
'autorefresh',
'int') > 0) {
1789 print
'<meta http-equiv="refresh" content="'.GETPOST(
'autorefresh',
'int').
'">';
1793 $appli = constant(
'DOL_APPLICATION_TITLE');
1795 $appli = $conf->global->MAIN_APPLICATION_TITLE;
1800 if ($title &&
getDolGlobalString(
'MAIN_HTML_TITLE') && preg_match(
'/noapp/', $conf->global->MAIN_HTML_TITLE)) {
1808 $parameters = array(
'title'=>$titletoshow);
1809 $result = $hookmanager->executeHooks(
'setHtmlTitle', $parameters);
1811 $titletoshow = $hookmanager->resPrint;
1813 $titletoshow .= $hookmanager->resPrint;
1821 if (
GETPOST(
'version',
'int')) {
1822 $ext =
'version='.GETPOST(
'version',
'int');
1825 if (
GETPOST(
'dol_resetcache')) {
1826 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
1830 $themeparam =
'?lang='.$langs->defaultlang.
'&theme='.$conf->theme.(GETPOST(
'optioncss',
'aZ09') ?
'&optioncss='.GETPOST(
'optioncss',
'aZ09', 1) :
'').(empty($user->id) ?
'' : (
'&userid='.$user->id)).
'&entity='.$conf->entity;
1832 $themeparam .= ($ext ?
'&'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV");
1833 if (GETPOSTISSET(
'dol_hide_topmenu')) {
1834 $themeparam .=
'&dol_hide_topmenu='.GETPOST(
'dol_hide_topmenu',
'int');
1836 if (GETPOSTISSET(
'dol_hide_leftmenu')) {
1837 $themeparam .=
'&dol_hide_leftmenu='.GETPOST(
'dol_hide_leftmenu',
'int');
1839 if (GETPOSTISSET(
'dol_optimize_smallscreen')) {
1840 $themeparam .=
'&dol_optimize_smallscreen='.GETPOST(
'dol_optimize_smallscreen',
'int');
1842 if (GETPOSTISSET(
'dol_no_mouse_hover')) {
1843 $themeparam .=
'&dol_no_mouse_hover='.GETPOST(
'dol_no_mouse_hover',
'int');
1845 if (GETPOSTISSET(
'dol_use_jmobile')) {
1846 $themeparam .=
'&dol_use_jmobile='.GETPOST(
'dol_use_jmobile',
'int'); $conf->dol_use_jmobile =
GETPOST(
'dol_use_jmobile',
'int');
1848 if (GETPOSTISSET(
'THEME_DARKMODEENABLED')) {
1849 $themeparam .=
'&THEME_DARKMODEENABLED='.GETPOST(
'THEME_DARKMODEENABLED',
'int');
1851 if (GETPOSTISSET(
'THEME_SATURATE_RATIO')) {
1852 $themeparam .=
'&THEME_SATURATE_RATIO='.GETPOST(
'THEME_SATURATE_RATIO',
'int');
1856 print
'<link rel="preconnect" href="https://fonts.gstatic.com">'.
"\n";
1857 print
'<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@200;300;400;500;600&display=swap" rel="stylesheet">'.
"\n";
1860 if (!defined(
'DISABLE_JQUERY') && !$disablejs && $conf->use_javascript_ajax) {
1861 print
'<!-- Includes CSS for JQuery (Ajax library) -->'.
"\n";
1862 $jquerytheme =
'base';
1864 $jquerytheme = $conf->global->MAIN_USE_JQUERY_THEME;
1866 if (constant(
'JS_JQUERY_UI')) {
1867 print
'<link rel="stylesheet" type="text/css" href="'.JS_JQUERY_UI.
'css/'.$jquerytheme.
'/jquery-ui.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1869 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/css/'.$jquerytheme.
'/jquery-ui.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1871 if (!defined(
'DISABLE_JQUERY_JNOTIFY')) {
1872 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify-alt.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1874 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
1875 $tmpplugin = !
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
1876 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/css/'.$tmpplugin.
'.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1880 if (!defined(
'DISABLE_FONT_AWSOME')) {
1881 print
'<!-- Includes CSS for font awesome -->'.
"\n";
1882 $fontawesome_directory =
getDolGlobalString(
'MAIN_FONTAWESOME_DIRECTORY',
'/theme/common/fontawesome-5');
1883 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.$fontawesome_directory.
'/css/all.min.css'.($ext ?
'?'.$ext :
'').
'">'.
"\n";
1886 print
'<!-- Includes CSS for Dolibarr theme -->'.
"\n";
1890 if (!empty($conf->modules_parts[
'theme'])) {
1891 foreach ($conf->modules_parts[
'theme'] as $reldir) {
1894 $themesubdir = $reldir;
1901 print
'<link rel="stylesheet" type="text/css" href="'.$themepath.$themeparam.
'">'.
"\n";
1903 print
'<!-- Includes CSS that does not exists as a workaround of flash bug of chrome -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="filethatdoesnotexiststosolvechromeflashbug">'.
"\n";
1907 if (!empty($conf->modules_parts[
'css'])) {
1908 $arraycss = (array) $conf->modules_parts[
'css'];
1909 foreach ($arraycss as $modcss => $filescss) {
1910 $filescss = (array) $filescss;
1911 foreach ($filescss as $cssfile) {
1912 if (empty($cssfile)) {
1913 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file into its descriptor that is empty.", LOG_WARNING);
1917 if ($urlforcss && $urlforcss !=
'/') {
1918 print
'<!-- Includes CSS added by module '.$modcss.
' -->'.
"\n".
'<link rel="stylesheet" type="text/css" href="'.$urlforcss;
1920 if (!preg_match(
'/\.css$/i', $cssfile)) {
1925 dol_syslog(
"Warning: module ".$modcss.
" declared a css path file for a file we can't find.", LOG_WARNING);
1931 if (is_array($arrayofcss)) {
1932 foreach ($arrayofcss as $cssfile) {
1933 if (preg_match(
'/^(http|\/\/)/i', $cssfile)) {
1934 $urltofile = $cssfile;
1938 print
'<!-- Includes CSS added by page -->'.
"\n".
'<link rel="stylesheet" type="text/css" title="default" href="'.$urltofile;
1940 if (!preg_match(
'/\.css$/i', $cssfile)) {
1950 print
'<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.
'/theme/custom.css.php'.($ext ?
'?'.$ext :
'').
'&revision='.
getDolGlobalInt(
"MAIN_IHM_PARAMS_REV").
'">'.
"\n";
1954 if (!defined(
'DISABLE_JQUERY') && !$disablejs && !empty($conf->use_javascript_ajax)) {
1956 print
'<!-- Includes JS for JQuery -->'.
"\n";
1957 if (defined(
'JS_JQUERY') && constant(
'JS_JQUERY')) {
1958 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY.
'jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1960 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1962 if (defined(
'JS_JQUERY_UI') && constant(
'JS_JQUERY_UI')) {
1963 print
'<script nonce="'.getNonce().
'" src="'.JS_JQUERY_UI.
'jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1965 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/js/jquery-ui.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1968 if (!
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY')) {
1969 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jnotify/jquery.jnotify.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1972 if (empty($disableforlogin) && !defined(
'DISABLE_JQUERY_TABLEDND')) {
1973 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/tablednd/jquery.tablednd.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1977 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/nnnick/chartjs/dist/chart.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1981 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !defined(
'DISABLE_JQUERY_JEDITABLE')) {
1982 print
'<!-- JS to manage editInPlace feature -->'.
"\n";
1983 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1984 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-datepicker.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1985 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ui-autocomplete.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1986 print
'<script>'.
"\n";
1987 print
'var urlSaveInPlace = \''.DOL_URL_ROOT.
'/core/ajax/saveinplace.php\';'.
"\n";
1988 print
'var urlLoadInPlace = \''.DOL_URL_ROOT.
'/core/ajax/loadinplace.php\';'.
"\n";
1989 print
'var tooltipInPlace = \''.$langs->transnoentities(
'ClickToEdit').
'\';
'."\n"; // Added in title attribute of span
1990 print 'var placeholderInPlace = \
' \';'.
"\n";
1991 print
'var cancelInPlace = \''.$langs->trans(
"Cancel").
'\';
'."\n";
1992 print 'var submitInPlace = \
''.$langs->trans(
'Ok').
'\';
'."\n";
1993 print 'var indicatorInPlace = \
'<img src="'.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'">\';'.
"\n";
1994 print
'var withInPlace = 300;';
1995 print
'</script>'.
"\n";
1996 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/editinplace.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
1997 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/jeditable/jquery.jeditable.ckeditor.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2000 if (
getDolGlobalString(
'MAIN_USE_JQUERY_TIMEPICKER') || defined(
'REQUIRE_JQUERY_TIMEPICKER')) {
2001 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2002 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2004 if (!defined(
'DISABLE_SELECT2') && (
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') || defined(
'REQUIRE_JQUERY_MULTISELECT'))) {
2006 $tmpplugin = !
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') ?constant(
'REQUIRE_JQUERY_MULTISELECT') : $conf->global->MAIN_USE_JQUERY_MULTISELECT;
2007 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/'.$tmpplugin.
'/dist/js/'.$tmpplugin.
'.full.min.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2009 if (!defined(
'DISABLE_MULTISELECT')) {
2010 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/includes/jquery/plugins/multiselect/jquery.multi-select.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2014 if (!$disablejs && !empty($conf->use_javascript_ajax)) {
2016 if (empty($disableforlogin) && (isModEnabled(
'fckeditor') && (!
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ||
getDolGlobalString(
'FCKEDITOR_EDITORNAME') ==
'ckeditor') && !defined(
'DISABLE_CKEDITOR')) || defined(
'FORCE_CKEDITOR')) {
2017 print
'<!-- Includes JS for CKEditor -->'.
"\n";
2018 $pathckeditor = DOL_URL_ROOT.
'/includes/ckeditor/ckeditor/';
2019 $jsckeditor =
'ckeditor.js';
2020 if (constant(
'JS_CKEDITOR')) {
2022 $pathckeditor = constant(
'JS_CKEDITOR');
2024 print
'<script nonce="'.getNonce().
'">';
2025 print
'/* enable ckeditor by main.inc.php */';
2026 print
'var CKEDITOR_BASEPATH = \''.dol_escape_js($pathckeditor).
'\';
'."\n";
2027 print 'var ckeditorConfig = \
''.dol_escape_js(
dol_buildpath($themesubdir.
'/theme/'.$conf->theme.
'/ckeditor/config.js'.($ext ?
'?'.$ext :
''), 1)).
'\';
'."\n"; // $themesubdir='' in standard usage
2028 print 'var ckeditorFilebrowserBrowseUrl = \
''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2029 print
'var ckeditorFilebrowserImageBrowseUrl = \''.DOL_URL_ROOT.
'/core/filemanagerdol/browser/default/browser.php?Type=Image&Connector='.DOL_URL_ROOT.
'/core/filemanagerdol/connectors/php/connector.php\';'.
"\n";
2030 print
'</script>'.
"\n";
2031 print
'<script src="'.$pathckeditor.$jsckeditor.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2033 if (
GETPOST(
'mode',
'aZ09') ==
'Full_inline') {
2034 print
'CKEDITOR.disableAutoInline = false;'.
"\n";
2036 print
'CKEDITOR.disableAutoInline = true;'.
"\n";
2038 print
'</script>'.
"\n";
2042 if (!defined(
'NOBROWSERNOTIF') && !defined(
'NOREQUIREMENU') && !defined(
'NOLOGIN')) {
2043 $enablebrowsernotif =
false;
2045 $enablebrowsernotif =
true;
2047 if ($conf->browser->layout ==
'phone') {
2048 $enablebrowsernotif =
false;
2050 if ($enablebrowsernotif) {
2051 print
'<!-- Includes JS of Dolibarr (browser layout = '.$conf->browser->layout.
')-->'.
"\n";
2052 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_notification.js.php'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2057 print
'<!-- Includes JS of Dolibarr -->'.
"\n";
2058 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/core/js/lib_head.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
2061 if (!empty($conf->modules_parts[
'js'])) {
2062 $arrayjs = (array) $conf->modules_parts[
'js'];
2063 foreach ($arrayjs as $modjs => $filesjs) {
2064 $filesjs = (array) $filesjs;
2065 foreach ($filesjs as $jsfile) {
2068 if ($urlforjs && $urlforjs !=
'/') {
2069 print
'<!-- Include JS added by module '.$modjs.
'-->'.
"\n";
2070 print
'<script nonce="'.getNonce().
'" src="'.$urlforjs.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2072 dol_syslog(
"Warning: module ".$modjs.
" declared a js path file for a file we can't find.", LOG_WARNING);
2078 if (is_array($arrayofjs)) {
2079 print
'<!-- Includes JS added by page -->'.
"\n";
2080 foreach ($arrayofjs as $jsfile) {
2081 if (preg_match(
'/^(http|\/\/)/i', $jsfile)) {
2082 print
'<script nonce="'.getNonce().
'" src="'.$jsfile.((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2084 print
'<script nonce="'.getNonce().
'" src="'.
dol_buildpath($jsfile, 1).((strpos($jsfile,
'?') ===
false) ?
'?' :
'&').
'lang='.$langs->defaultlang.
'"></script>'.
"\n";
2092 $theme_js =
dol_buildpath(
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js', 0);
2093 if (file_exists($theme_js)) {
2094 print
'<script nonce="'.getNonce().
'" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/'.$conf->theme.
'.js'.($ext ?
'?'.$ext :
'').
'"></script>'.
"\n";
2098 if (!empty($head)) {
2105 $parameters = array();
2106 $result = $hookmanager->executeHooks(
'addHtmlHeader', $parameters);
2107 print $hookmanager->resPrint;
2109 print
"</head>\n\n";
2112 $conf->headerdone = 1;
2132function top_menu($head, $title =
'', $target =
'', $disablejs = 0, $disablehead = 0, $arrayofjs = array(), $arrayofcss = array(), $morequerystring =
'', $helppagename =
'')
2134 global $user, $conf, $langs, $db, $form;
2136 global $hookmanager, $menumanager;
2141 $hookmanager->initHooks(array(
'toprightmenu'));
2146 if (empty($conf->headerdone)) {
2147 $disablenofollow = 0;
2148 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss, 0, $disablenofollow);
2149 print
'<body id="mainbody">';
2155 if ((empty($conf->dol_hide_topmenu) ||
GETPOST(
'dol_invisible_topmenu',
'int')) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
2156 if (!isset($form) || !is_object($form)) {
2157 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
2158 $form =
new Form($db);
2161 print
"\n".
'<!-- Start top horizontal -->'.
"\n";
2163 print
'<header id="id-top" class="side-nav-vert'.(GETPOST(
'dol_invisible_topmenu',
'int') ?
' hidden' :
'').
'">';
2166 print
'<div id="tmenu_tooltip'.(!
getDolGlobalString(
'MAIN_MENU_INVERT') ?
'' :
'invert').
'" class="tmenu">'.
"\n";
2167 $menumanager->atarget = $target;
2168 $menumanager->showmenu(
'top', array(
'searchform'=>$searchform));
2172 $appli = constant(
'DOL_APPLICATION_TITLE');
2174 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2175 if (preg_match(
'/\d\.\d/', $appli)) {
2176 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2177 $appli .=
" (".DOL_VERSION.
")";
2180 $appli .=
" ".DOL_VERSION;
2183 $appli .=
" ".DOL_VERSION;
2187 $appli .=
"<br>".$langs->trans(
"LevelOfFeature").
': '.
getDolGlobalInt(
'MAIN_FEATURES_LEVEL');
2191 $logouthtmltext =
'';
2194 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2195 if ($conf->browser->name ==
'chrome') {
2196 $stringforfirstkey .=
' ALT +';
2197 } elseif ($conf->browser->name ==
'firefox') {
2198 $stringforfirstkey .=
' ALT + SHIFT +';
2200 $stringforfirstkey .=
' CTL +';
2202 if ($_SESSION[
"dol_authmode"] !=
'forceuser' && $_SESSION[
"dol_authmode"] !=
'http') {
2203 $logouthtmltext .= $langs->trans(
"Logout").
'<br>';
2204 $logouttext .=
'<a accesskey="l" href="'.DOL_URL_ROOT.
'/user/logout.php?token='.newToken().
'">';
2205 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle');
2206 $logouttext .=
'</a>';
2208 $logouthtmltext .= $langs->trans(
"NoLogoutProcessWithAuthMode", $_SESSION[
"dol_authmode"]);
2209 $logouttext .=
img_picto($langs->trans(
'Logout').
' ('.$stringforfirstkey.
' l)',
'sign-out',
'',
false, 0, 0,
'',
'atoplogin valignmiddle opacitymedium');
2213 print
'<div class="login_block usedropdown">'.
"\n";
2215 $toprightmenu .=
'<div class="login_block_other">';
2218 $parameters = array();
2219 $result = $hookmanager->executeHooks(
'printTopRightMenu', $parameters);
2220 if (is_numeric($result)) {
2222 $toprightmenu .= $hookmanager->resPrint;
2224 $toprightmenu = $hookmanager->resPrint;
2227 $toprightmenu .= $result;
2231 if (isModEnabled(
'modulebuilder')) {
2232 $text =
'<a href="'.DOL_URL_ROOT.
'/modulebuilder/index.php?mainmenu=home&leftmenu=admintools" target="modulebuilder">';
2234 $text .=
'<span class="fa fa-bug atoplogin valignmiddle"></span>';
2236 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"ModuleBuilder"), 2, 1, $text,
'login_block_elem', 2);
2243 if (isset($_POST) && is_array($_POST)) {
2244 foreach ($_POST as $key => $value) {
2245 $key = preg_replace(
'/[^a-z0-9_\.\-\[\]]/i',
'', $key);
2246 if (in_array($key, array(
'action',
'massaction',
'password'))) {
2249 if (!is_array($value)) {
2250 if ($value !==
'') {
2251 $qs .=
'&'.urlencode($key).
'='.urlencode($value);
2254 foreach ($value as $value2) {
2255 if (($value2 !==
'') && (!is_array($value2))) {
2256 $qs .=
'&'.urlencode($key).
'[]='.urlencode($value2);
2262 $qs .= (($qs && $morequerystring) ?
'&' :
'').$morequerystring;
2263 $text =
'<a href="'.dol_escape_htmltag($_SERVER[
"PHP_SELF"]).
'?'.$qs.($qs ?
'&' :
'').
'optioncss=print" target="_blank" rel="noopener noreferrer">';
2265 $text .=
'<span class="fa fa-print atoplogin valignmiddle"></span>';
2267 $toprightmenu .= $form->textwithtooltip(
'', $langs->trans(
"PrintContentArea"), 2, 1, $text,
'login_block_elem', 2);
2272 $langs->load(
"help");
2279 if (empty($helppagename)) {
2280 $helppagename =
'EN:User_documentation|FR:Documentation_utilisateur|ES:Documentación_usuarios|DE:Benutzerdokumentation';
2282 $helppresent =
'helppresent';
2287 $helpbaseurl = $arrayres[
'helpbaseurl'];
2288 $helppage = $arrayres[
'helppage'];
2289 $mode = $arrayres[
'mode'];
2292 if ($helpbaseurl && $helppage) {
2294 $title = $langs->trans($mode ==
'wiki' ?
'GoToWikiHelpPage' :
'GoToHelpPage').
', ';
2295 if ($mode ==
'wiki') {
2296 $title .=
'<br>'.img_picto(
'',
'globe',
'class="pictofixedwidth"').$langs->trans(
"PageWiki").
' '.
dol_escape_htmltag(
'"'.strtr($helppage,
'_',
' ').
'"');
2298 $title .=
' <span class="opacitymedium">('.$langs->trans(
"DedicatedPageAvailable").
')</span>';
2300 $title .=
' <span class="opacitymedium">('.$langs->trans(
"HomePage").
')</span>';
2303 $text .=
'<a class="help" target="_blank" rel="noopener noreferrer" href="';
2304 if ($mode ==
'wiki') {
2305 $text .= sprintf($helpbaseurl, urlencode(html_entity_decode($helppage)));
2307 $text .= sprintf($helpbaseurl, $helppage);
2310 $text .=
'<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ?
' '.$helppresent :
'').
'"></span>';
2311 $text .=
'<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ?
'' :
' unvisible').
'"></span>';
2313 $toprightmenu .= $form->textwithtooltip(
'', $title, 2, 1, $text,
'login_block_elem', 2);
2318 $langs->load(
'admin');
2319 $appli .=
'<br>'.$langs->trans(
"Database").
': '.$db->database_name;
2324 $text =
'<span class="aversion"><span class="hideonsmartphone small">'.DOL_VERSION.
'</span></span>';
2325 $toprightmenu .= $form->textwithtooltip(
'', $appli, 2, 1, $text,
'login_block_elem', 2);
2329 $toprightmenu .= $form->textwithtooltip(
'', $logouthtmltext, 2, 1, $logouttext,
'login_block_elem logout-btn', 2);
2331 $toprightmenu .=
'</div>';
2335 $toprightmenu .=
'<div class="login_block_user">';
2339 $toprightmenu .=
'<div class="inline-block login_block_elem login_block_elem_name nowrap centpercent" style="padding: 0px;">';
2357 $toprightmenu .=
'</div>';
2359 $toprightmenu .=
'</div>'.
"\n";
2362 print $toprightmenu;
2369 print
'<div style="clear: both;"></div>';
2370 print
"<!-- End top horizontal menu -->\n\n";
2373 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
2374 print
'<!-- Begin div id-container --><div id="id-container" class="id-container">';
2388 global $langs, $conf, $db, $hookmanager, $user, $mysoc;
2390 global $menumanager;
2392 $langs->load(
'companies');
2394 $userImage = $userDropDownImage =
'';
2395 if (!empty($user->photo)) {
2396 $userImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'photouserphoto userphoto',
'small', 0, 1);
2397 $userDropDownImage =
Form::showphoto(
'userphoto', $user, 0, 0, 0,
'dropdown-user-image',
'small', 0, 1);
2399 $nophoto =
'/public/theme/common/user_anonymous.png';
2400 if ($user->gender ==
'man') {
2401 $nophoto =
'/public/theme/common/user_man.png';
2403 if ($user->gender ==
'woman') {
2404 $nophoto =
'/public/theme/common/user_woman.png';
2407 $userImage =
'<img class="photo photouserphoto userphoto" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2408 $userDropDownImage =
'<img class="photo dropdown-user-image" alt="No photo" src="'.DOL_URL_ROOT.$nophoto.
'">';
2412 $dropdownBody .=
'<span id="topmenulogincompanyinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowCompanyInfos").
'</span>';
2413 $dropdownBody .=
'<div id="topmenulogincompanyinfo" >';
2415 $dropdownBody .=
'<br><b>'.$langs->trans(
"Company").
'</b>: <span>'.
dol_escape_htmltag($mysoc->name).
'</span>';
2416 if ($langs->transcountry(
"ProfId1", $mysoc->country_code) !=
'-') {
2419 if ($langs->transcountry(
"ProfId2", $mysoc->country_code) !=
'-') {
2422 if ($langs->transcountry(
"ProfId3", $mysoc->country_code) !=
'-') {
2425 if ($langs->transcountry(
"ProfId4", $mysoc->country_code) !=
'-') {
2428 if ($langs->transcountry(
"ProfId5", $mysoc->country_code) !=
'-') {
2431 if ($langs->transcountry(
"ProfId6", $mysoc->country_code) !=
'-') {
2435 $dropdownBody .=
'<br><b>'.$langs->trans(
"Country").
'</b>: <span>'.($mysoc->country_code ? $langs->trans(
"Country".$mysoc->country_code) :
'').
'</span>';
2436 if (isModEnabled(
'multicurrency')) {
2437 $dropdownBody .=
'<br><b>'.$langs->trans(
"Currency").
'</b>: <span>'.$conf->currency.
'</span>';
2439 $dropdownBody .=
'</div>';
2441 $dropdownBody .=
'<br>';
2442 $dropdownBody .=
'<span id="topmenuloginmoreinfo-btn"><i class="fa fa-caret-right"></i> '.$langs->trans(
"ShowMoreInfos").
'</span>';
2443 $dropdownBody .=
'<div id="topmenuloginmoreinfo" >';
2446 if (!empty($user->admin)) {
2447 $dropdownBody .=
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($user->admin);
2449 if (!empty($user->socid)) {
2450 $thirdpartystatic =
new Societe($db);
2451 $thirdpartystatic->fetch($user->socid);
2452 $companylink =
' '.$thirdpartystatic->getNomUrl(2);
2453 $company =
' ('.$langs->trans(
"Company").
': '.$thirdpartystatic->name.
')';
2455 $type = ($user->socid ? $langs->trans(
"External").$company : $langs->trans(
"Internal"));
2456 $dropdownBody .=
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2457 $dropdownBody .=
'<br><b>'.$langs->trans(
"Status").
'</b>: '.$user->getLibStatut(0);
2458 $dropdownBody .=
'<br>';
2460 $dropdownBody .=
'<br><u>'.$langs->trans(
"Session").
'</u>';
2461 $dropdownBody .=
'<br><b>'.$langs->trans(
"IPAddress").
'</b>: '.
dol_escape_htmltag($_SERVER[
"REMOTE_ADDR"]);
2463 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (user entity '.$user->entity.
')';
2465 $dropdownBody .=
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.$_SESSION[
"dol_authmode"].(empty(
$dolibarr_main_demo) ?
'' :
' (demo)');
2466 $dropdownBody .=
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2467 $dropdownBody .=
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2468 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.$conf->theme;
2469 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.(isset($menumanager) ? $menumanager->name :
'unknown');
2471 $dropdownBody .=
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.($langFlag ? $langFlag.
' ' :
'').$langs->getDefaultLang();
2473 $tz = (int) $_SESSION[
'dol_tz'] + (
int) $_SESSION[
'dol_dst'];
2474 $dropdownBody .=
'<br><b>'.$langs->trans(
"ClientTZ").
':</b> '.($tz ? ($tz >= 0 ?
'+' :
'').$tz :
'');
2475 $dropdownBody .=
' ('.$_SESSION[
'dol_tz_string'].
')';
2480 $dropdownBody .=
'<br><b>'.$langs->trans(
"Browser").
':</b> '.$conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' <small class="opacitymedium">('.
dol_escape_htmltag($_SERVER[
'HTTP_USER_AGENT']).
')</small>';
2481 $dropdownBody .=
'<br><b>'.$langs->trans(
"Layout").
':</b> '.$conf->browser->layout;
2482 $dropdownBody .=
'<br><b>'.$langs->trans(
"Screen").
':</b> '.$_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight'];
2483 if ($conf->browser->layout ==
'phone') {
2484 $dropdownBody .=
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2486 if (!empty($_SESSION[
"disablemodules"])) {
2487 $dropdownBody .=
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.join(
', ', explode(
',', $_SESSION[
"disablemodules"]));
2489 $dropdownBody .=
'</div>';
2492 $parameters = array(
'user'=>$user,
'langs' => $langs);
2493 $result = $hookmanager->executeHooks(
'printTopRightMenuLoginDropdownBody', $parameters);
2494 if (is_numeric($result)) {
2496 $dropdownBody .= $hookmanager->resPrint;
2498 $dropdownBody = $hookmanager->resPrint;
2502 if (empty($urllogout)) {
2503 $urllogout = DOL_URL_ROOT.
'/user/logout.php?token='.newToken();
2508 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2509 if ($conf->browser->name ==
'chrome') {
2510 $stringforfirstkey .=
' ALT +';
2511 } elseif ($conf->browser->name ==
'firefox') {
2512 $stringforfirstkey .=
' ALT + SHIFT +';
2514 $stringforfirstkey .=
' CTL +';
2518 $profilLink =
'<a accesskey="u" href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"YourUserFile").
' ('.$stringforfirstkey.
' u)').
'"><i class="fa fa-user"></i> '.$langs->trans(
"Card").
'</a>';
2519 $urltovirtualcard =
'/user/virtualcard.php?id='.((int) $user->id);
2520 $virtuelcardLink =
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcardmenu', $langs->transnoentitiesnoconv(
"PublicVirtualCardUrl").(is_object($user) ?
' - '.$user->getFullName($langs) :
'').
' ('.$stringforfirstkey.
' v)',
img_picto($langs->trans(
"PublicVirtualCardUrl").
' ('.$stringforfirstkey.
' v)',
'card',
''), $urltovirtualcard,
'',
'button-top-menu-dropdown marginleftonly nohover',
"closeTopMenuLoginDropdown()",
'',
'v');
2521 $logoutLink =
'<a accesskey="l" href="'.$urllogout.
'" class="button-top-menu-dropdown" title="'.
dol_escape_htmltag($langs->trans(
"Logout").
' ('.$stringforfirstkey.
' l)').
'"><i class="fa fa-sign-out-alt padingright"></i><span class="hideonsmartphone">'.$langs->trans(
"Logout").
'</span></a>';
2523 $profilName = $user->getFullName($langs).
' ('.$user->login.
')';
2524 if (!empty($user->admin)) {
2525 $profilName =
'<i class="far fa-star classfortooltip" title="'.$langs->trans(
"Administrator").
'" ></i> '.$profilName;
2529 $appli = constant(
'DOL_APPLICATION_TITLE');
2531 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2532 if (preg_match(
'/\d\.\d/', $appli)) {
2533 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
2534 $appli .=
" (".DOL_VERSION.
")";
2537 $appli .=
" ".DOL_VERSION;
2540 $appli .=
" ".DOL_VERSION;
2544 $btnUser =
'<!-- div for user link -->
2545 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2546 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="dropdown-toggle login-dropdown-a valignmiddle" data-toggle="dropdown">
2547 '.$userImage.(empty($user->photo) ?
'<!-- no photo so show also the login --><span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft valignmiddle small">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2549 <div class="dropdown-menu">
2551 <div class="user-header">
2552 '.$userDropDownImage.
'
2554 '.$profilName.
'<br>';
2555 if ($user->datelastlogin) {
2556 $title = $langs->trans(
"ConnectedSince").
' : '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser');
2557 if ($user->datepreviouslogin) {
2558 $title .=
'<br>'.$langs->trans(
"PreviousConnexion").
' : '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser');
2561 $btnUser .=
'<small class="classfortooltip" title="'.dol_escape_htmltag($title).
'" ><i class="fa fa-user-clock"></i> '.
dol_print_date($user->datelastlogin,
"dayhour",
'tzuser').
'</small><br>';
2562 if ($user->datepreviouslogin) {
2563 $btnUser .=
'<small class="classfortooltip" title="'.dol_escape_htmltag($title).
'" ><i class="fa fa-user-clock opacitymedium"></i> '.
dol_print_date($user->datepreviouslogin,
"dayhour",
'tzuser').
'</small><br>';
2571 <!-- Menu Body user-->
2572 <div class="user-body">'.$dropdownBody.
'</div>
2575 <div class="user-footer">
2576 <div class="pull-left">
2579 <div class="pull-left">
2580 '.$virtuelcardLink.
'
2582 <div class="pull-right">
2585 <div class="clearboth"></div>
2591 $btnUser =
'<!-- div for user link text browser -->
2592 <div id="topmenu-login-dropdown" class="userimg atoplogin dropdown user user-menu inline-block">
2593 <a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$user->id.
'" class="valignmiddle">
2594 '.$userImage.(empty($user->photo) ?
'<span class="hidden-xs maxwidth200 atoploginusername hideonsmartphone paddingleft small">'.dol_trunc($user->firstname ? $user->firstname : $user->login, 10).
'</span>' :
'').
'
2599 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2601 <!-- Code to show/hide the user drop-down -->
2603 function closeTopMenuLoginDropdown() {
2604 //console.log("close login dropdown"); // This is call at each click on page, so we disable the log
2606 jQuery("#topmenu-login-dropdown").removeClass("open");
2608 jQuery(document).ready(function() {
2609 jQuery(document).on("click", function(event) {
2610 // console.log("Click somewhere on screen");
2611 if (!$(event.target).closest("#topmenu-login-dropdown").length) {
2612 closeTopMenuLoginDropdown();
2620 jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) {
2621 console.log("Click on #topmenu-login-dropdown .dropdown-toggle");
2622 event.preventDefault();
2623 jQuery("#topmenu-login-dropdown").toggleClass("open");
2626 jQuery("#topmenulogincompanyinfo-btn").on("click", function() {
2627 console.log("Clik on #topmenulogincompanyinfo-btn");
2628 jQuery("#topmenulogincompanyinfo").slideToggle();
2631 jQuery("#topmenuloginmoreinfo-btn").on("click", function() {
2632 console.log("Clik on #topmenuloginmoreinfo-btn");
2633 jQuery("#topmenuloginmoreinfo").slideToggle();
2653 global $conf, $langs;
2659 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2660 if ($conf->browser->os ===
'macintosh') {
2661 $stringforfirstkey .=
' CTL +';
2663 if ($conf->browser->name ==
'chrome') {
2664 $stringforfirstkey .=
' ALT +';
2665 } elseif ($conf->browser->name ==
'firefox') {
2666 $stringforfirstkey .=
' ALT + SHIFT +';
2668 $stringforfirstkey .=
' CTL +';
2672 $html .=
'<!-- div for quick add link -->
2673 <div id="topmenu-quickadd-dropdown" class="atoplogin dropdown inline-block">
2674 <a accesskey="a" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'QuickAdd').
' ('.$stringforfirstkey.
' a)"><i class="fa fa-plus-circle"></i></a>
2677 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2679 <!-- Code to show/hide the user drop-down for the quick add -->
2681 jQuery(document).ready(function() {
2682 jQuery(document).on("click", function(event) {
2683 if (!$(event.target).closest("#topmenu-quickadd-dropdown").length) {
2685 $("#topmenu-quickadd-dropdown").removeClass("open");
2688 $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) {
2689 console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle");
2690 openQuickAddDropDown(event);
2694 $(document).keydown(function(event){
2695 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2696 if (ostype ===
"macintosh") {
2697 if ( event.which === 65 && event.ctrlKey ) {
2698 console.log(\
'control + a : trigger open quick add dropdown\');
2699 openQuickAddDropDown(event);
2702 if ( event.which === 65 && event.ctrlKey && event.shiftKey ) {
2703 console.log(\'control + shift + a : trigger open quick add dropdown\');
2704 openQuickAddDropDown(event);
2709 var openQuickAddDropDown = function(event) {
2710 event.preventDefault();
2711 $("#topmenu-quickadd-dropdown").toggleClass("open");
2712 //$("#top-quickadd-search-input").focus();
2728 global $conf, $user, $langs, $hookmanager;
2733 "url" =>
"/adherents/card.php?action=create&mainmenu=members",
2734 "title" =>
"MenuNewMember@members",
2735 "name" =>
"Adherent@members",
2736 "picto" =>
"object_member",
2737 "activation" => isModEnabled(
'adherent') && $user->hasRight(
"adherent",
"write"),
2741 "url" =>
"/societe/card.php?action=create&mainmenu=companies",
2742 "title" =>
"MenuNewThirdParty@companies",
2743 "name" =>
"ThirdParty@companies",
2744 "picto" =>
"object_company",
2745 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"write"),
2749 "url" =>
"/contact/card.php?action=create&mainmenu=companies",
2750 "title" =>
"NewContactAddress@companies",
2751 "name" =>
"Contact@companies",
2752 "picto" =>
"object_contact",
2753 "activation" => isModEnabled(
"societe") && $user->hasRight(
"societe",
"contact",
"write"),
2757 "url" =>
"/comm/propal/card.php?action=create&mainmenu=commercial",
2758 "title" =>
"NewPropal@propal",
2759 "name" =>
"Proposal@propal",
2760 "picto" =>
"object_propal",
2761 "activation" => isModEnabled(
"propal") && $user->hasRight(
"propal",
"write"),
2766 "url" =>
"/commande/card.php?action=create&mainmenu=commercial",
2767 "title" =>
"NewOrder@orders",
2768 "name" =>
"Order@orders",
2769 "picto" =>
"object_order",
2770 "activation" => isModEnabled(
'commande') && $user->hasRight(
"commande",
"write"),
2774 "url" =>
"/compta/facture/card.php?action=create&mainmenu=billing",
2775 "title" =>
"NewBill@bills",
2776 "name" =>
"Bill@bills",
2777 "picto" =>
"object_bill",
2778 "activation" => isModEnabled(
'facture') && $user->hasRight(
"facture",
"write"),
2782 "url" =>
"/contrat/card.php?action=create&mainmenu=commercial",
2783 "title" =>
"NewContractSubscription@contracts",
2784 "name" =>
"Contract@contracts",
2785 "picto" =>
"object_contract",
2786 "activation" => isModEnabled(
'contrat') && $user->hasRight(
"contrat",
"write"),
2790 "url" =>
"/supplier_proposal/card.php?action=create&mainmenu=commercial",
2791 "title" =>
"SupplierProposalNew@supplier_proposal",
2792 "name" =>
"SupplierProposal@supplier_proposal",
2793 "picto" =>
"supplier_proposal",
2794 "activation" => isModEnabled(
'supplier_proposal') && $user->hasRight(
"supplier_invoice",
"write"),
2798 "url" =>
"/fourn/commande/card.php?action=create&mainmenu=commercial",
2799 "title" =>
"NewSupplierOrderShort@orders",
2800 "name" =>
"SupplierOrder@orders",
2801 "picto" =>
"supplier_order",
2802 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"commande",
"write")) || (isModEnabled(
"supplier_order") && $user->hasRight(
"supplier_invoice",
"write")),
2806 "url" =>
"/fourn/facture/card.php?action=create&mainmenu=billing",
2807 "title" =>
"NewBill@bills",
2808 "name" =>
"SupplierBill@bills",
2809 "picto" =>
"supplier_invoice",
2810 "activation" => (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight(
"fournisseur",
"facture",
"write")) || (isModEnabled(
"supplier_invoice") && $user->hasRight(
"supplier_invoice",
"write")),
2814 "url" =>
"/ticket/card.php?action=create&mainmenu=ticket",
2815 "title" =>
"NewTicket@ticket",
2816 "name" =>
"Ticket@ticket",
2817 "picto" =>
"ticket",
2818 "activation" => isModEnabled(
'ticket') && $user->hasRight(
"ticket",
"write"),
2822 "url" =>
"/fichinter/card.php?action=create&mainmenu=commercial",
2823 "title" =>
"NewIntervention@interventions",
2824 "name" =>
"Intervention@interventions",
2825 "picto" =>
"intervention",
2826 "activation" => isModEnabled(
'ficheinter') && $user->hasRight(
"ficheinter",
"creer"),
2830 "url" =>
"/product/card.php?action=create&type=0&mainmenu=products",
2831 "title" =>
"NewProduct@products",
2832 "name" =>
"Product@products",
2833 "picto" =>
"object_product",
2834 "activation" => isModEnabled(
"product") && $user->hasRight(
"produit",
"write"),
2838 "url" =>
"/product/card.php?action=create&type=1&mainmenu=products",
2839 "title" =>
"NewService@products",
2840 "name" =>
"Service@products",
2841 "picto" =>
"object_service",
2842 "activation" => isModEnabled(
"service") && $user->hasRight(
"service",
"write"),
2846 "url" =>
"/user/card.php?action=create&type=1&mainmenu=home",
2847 "title" =>
"AddUser@users",
2848 "name" =>
"User@users",
2850 "activation" => $user->hasRight(
"user",
"user",
"write"),
2856 $dropDownQuickAddHtml =
'';
2859 $dropDownQuickAddHtml .=
'<div class="quickadd-body dropdown-body">';
2860 $dropDownQuickAddHtml .=
'<div class="dropdown-quickadd-list">';
2863 $parameters = array();
2864 $hook_items = $items;
2865 $reshook = $hookmanager->executeHooks(
'menuDropdownQuickaddItems', $parameters, $hook_items);
2866 if (is_numeric($reshook) && !empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
2867 if ($reshook == 0) {
2868 $items[
'items'] = array_merge($items[
'items'], $hookmanager->resArray);
2870 $items = $hookmanager->resArray;
2874 $position = array();
2875 foreach ($items[
'items'] as $key => $row) {
2876 $position[$key] = $row[
'position'];
2878 $array1_sort_order = SORT_ASC;
2879 array_multisort($position, $array1_sort_order, $items[
'items']);
2882 foreach ($items[
'items'] as $item) {
2883 if (!$item[
'activation']) {
2886 $langs->load(explode(
'@', $item[
'title'])[1]);
2887 $langs->load(explode(
'@', $item[
'name'])[1]);
2888 $dropDownQuickAddHtml .=
'
2889 <a class="dropdown-item quickadd-item" href="'.DOL_URL_ROOT.$item[
'url'].
'" title="'.$langs->trans(explode(
'@', $item[
'title'])[0]).
'">
2890 '.
img_picto(
'', $item[
'picto'],
'style="width:18px;"') .
' ' . $langs->trans(explode(
'@', $item[
'name'])[0]) .
'</a>
2894 $dropDownQuickAddHtml .=
'</div>';
2895 $dropDownQuickAddHtml .=
'</div>';
2897 return $dropDownQuickAddHtml;
2907 global $langs, $conf, $db, $user;
2912 if (!isModEnabled(
'bookmark') || !$user->hasRight(
'bookmark',
'lire')) {
2918 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
2919 if ($conf->browser->os ===
'macintosh') {
2920 $stringforfirstkey .=
' CTL +';
2922 if ($conf->browser->name ==
'chrome') {
2923 $stringforfirstkey .=
' ALT +';
2924 } elseif ($conf->browser->name ==
'firefox') {
2925 $stringforfirstkey .=
' ALT + SHIFT +';
2927 $stringforfirstkey .=
' CTL +';
2931 if (!defined(
'JS_JQUERY_DISABLE_DROPDOWN') && !empty($conf->use_javascript_ajax)) {
2932 include_once DOL_DOCUMENT_ROOT.
'/bookmarks/bookmarks.lib.php';
2933 $langs->load(
"bookmarks");
2936 $html .=
'<div id="topmenu-bookmark-dropdown" class="dropdown inline-block">';
2940 $html .=
'<!-- div for bookmark link -->
2941 <div id="topmenu-bookmark-dropdown" class="dropdown inline-block">
2942 <a accesskey="b" class="dropdown-toggle login-dropdown-a nofocusvisible" data-toggle="dropdown" href="#" title="'.$langs->trans(
'Bookmarks').
' ('.$stringforfirstkey.
' b)"><i class="fa fa-star"></i></a>
2943 <div class="dropdown-menu">
2949 <!-- Code to show/hide the bookmark drop-down -->
2951 jQuery(document).ready(function() {
2952 jQuery(document).on("click", function(event) {
2953 if (!$(event.target).closest("#topmenu-bookmark-dropdown").length) {
2954 //console.log("close bookmark dropdown - we click outside");
2956 $("#topmenu-bookmark-dropdown").removeClass("open");
2960 jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) {
2961 console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle");
2962 openBookMarkDropDown(event);
2966 jQuery(document).keydown(function(event) {
2967 var ostype = \''.dol_escape_js($conf->browser->os).
'\';
2968 if (ostype ===
"macintosh") {
2969 if ( event.which === 66 && event.ctrlKey ) {
2970 console.log(
"Click on control + b : trigger open bookmark dropdown");
2971 openBookMarkDropDown(event);
2974 if ( event.which === 66 && event.ctrlKey && event.shiftKey ) {
2975 console.log(
"Click on control + shift + b : trigger open bookmark dropdown");
2976 openBookMarkDropDown(event);
2981 var openBookMarkDropDown =
function(event) {
2982 event.preventDefault();
2983 jQuery(
"#topmenu-bookmark-dropdown").toggleClass(
"open");
2984 jQuery(
"#top-bookmark-search-input").focus();
3000function top_menu_search()
3002 global $langs, $conf, $db, $user, $hookmanager;
3007 $arrayresult = array();
3008 include DOL_DOCUMENT_ROOT.'/core/ajax/selectsearchbox.php
'; // This sets $arrayresult
3010 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3011 // accesskey is for Mac: CTRL + key for all browsers
3012 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3013 if ($conf->browser->name == 'chrome
') {
3014 $stringforfirstkey .= ' ALT +
';
3015 } elseif ($conf->browser->name == 'firefox
') {
3016 $stringforfirstkey .= ' ALT + SHIFT +
';
3018 $stringforfirstkey .= ' CTL +
';
3021 $searchInput = '<input
type=
"search" name=
"search_all"'.($stringforfirstkey ? ' title=
"'.dol_escape_htmltag($stringforfirstkey.' s').'"' : '').' id=
"top-global-search-input" class=
"dropdown-search-input search_component_input" placeholder=
"'.$langs->trans('Search').'" autocomplete=
"off">
';
3023 $defaultAction = '';
3024 $buttonList = '<div
class=
"dropdown-global-search-button-list" >
';
3025 // Menu with all searchable items
3026 foreach ($arrayresult as $keyItem => $item) {
3027 if (empty($defaultAction)) {
3028 $defaultAction = $item['url
'];
3030 $buttonList .= '<
button class=
"dropdown-item global-search-item tdoverflowmax300" data-target=
"'.dol_escape_htmltag($item['url']).'" >
';
3031 $buttonList .= $item['text
'];
3032 $buttonList .= '</
button>
';
3034 $buttonList .= '</div>
';
3036 $dropDownHtml = '<form role=
"search" id=
"top-menu-action-search" name=
"actionsearch" method=
"GET" action=
"'.$defaultAction.'">
';
3039 <!-- search input -->
3040 <div
class=
"dropdown-header search-dropdown-header">
3046 <!--
Menu Body search -->
3047 <div
class=
"dropdown-body search-dropdown-body">
3052 $dropDownHtml .= '</form>
';
3054 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3055 // accesskey is for Mac: CTRL + key for all browsers
3056 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3057 if ($conf->browser->name == 'chrome
') {
3058 $stringforfirstkey .= ' ALT +
';
3059 } elseif ($conf->browser->name == 'firefox
') {
3060 $stringforfirstkey .= ' ALT + SHIFT +
';
3062 $stringforfirstkey .= ' CTL +
';
3065 $html .= '<!-- div
for Global Search -->
3066 <div
id=
"topmenu-global-search-dropdown" class=
"atoplogin dropdown inline-block">
3067 <a accesskey=
"s" class=
"dropdown-toggle login-dropdown-a nofocusvisible" data-toggle=
"dropdown" href=
"#" title=
"'.$langs->trans('Search').' ('.$stringforfirstkey.' s)">
3068 <i
class=
"fa fa-search" aria-hidden=
"true" ></i>
3070 <div
class=
"dropdown-menu dropdown-search">
3076 <!-- Code to show/hide the
user drop-down -->
3078 jQuery(document).ready(
function() {
3081 jQuery(
"#top-global-search-input").keydown(
function (e) {
3082 if (e.keyCode == 13 || e.keyCode == 40) {
3083 var inputs = $(this).parents(
"form").eq(0).find(
":button");
3084 if (inputs[inputs.index(this) + 1] != null) {
3085 inputs[inputs.index(this) + 1].focus();
3086 if (e.keyCode == 13){
3087 inputs[inputs.index(this) + 1].trigger(
"click");
3097 jQuery(document).keydown(
function(e) {
3099 var $focused = $(
":focus");
3100 if($focused.length && $focused.hasClass(
"global-search-item")){
3103 if (e.keyCode == 38) {
3105 $focused.prev().focus();
3109 if (e.keyCode == 40) {
3111 $focused.next().focus();
3118 jQuery(
".dropdown-global-search-button-list .global-search-item").on(
"click",
function(event) {
3119 jQuery(
"#top-menu-action-search").attr(
"action", $(
this).data(
"target"));
3120 jQuery(
"#top-menu-action-search").submit();
3124 jQuery(document).on(
"click",
function(event) {
3125 if (!$(event.target).closest(
"#topmenu-global-search-dropdown").length) {
3126 console.log(
"click close search - we click outside");
3128 jQuery(
"#topmenu-global-search-dropdown").removeClass(
"open");
3133 jQuery(
"#topmenu-global-search-dropdown .dropdown-toggle").on(
"click",
function(event) {
3134 console.log(
"click on toggle #topmenu-global-search-dropdown .dropdown-toggle");
3135 openGlobalSearchDropDown();
3139 jQuery(document).keydown(
function(e){
3140 if ( e.which === 70 && e.ctrlKey && e.shiftKey ) {
3141 console.log(\
'control + shift + f : trigger open global-search dropdown\');
3142 openGlobalSearchDropDown();
3144 if ( e.which === 70 && e.alKey ) {
3145 console.log(\'alt + f : trigger open global-search dropdown\');
3146 openGlobalSearchDropDown();
3150 var openGlobalSearchDropDown = function() {
3151 jQuery("#topmenu-global-search-dropdown").toggleClass("open");
3152 jQuery("#top-global-search-input").focus();
3176function left_menu($menu_array_before, $helppagename =
'', $notused =
'', $menu_array_after = array(), $leftmenuwithoutmainarea = 0, $title =
'', $acceptdelayedhtml = 0)
3178 global $user, $conf, $langs, $db, $form;
3179 global $hookmanager, $menumanager;
3183 if (!empty($menu_array_before)) {
3184 dol_syslog(
"Deprecated parameter menu_array_before was used when calling main::left_menu function. Menu entries of module should now be defined into module descriptor and not provided when calling left_menu.", LOG_WARNING);
3187 if (empty($conf->dol_hide_leftmenu) && (!defined(
'NOREQUIREMENU') || !constant(
'NOREQUIREMENU'))) {
3189 $hookmanager->initHooks(array(
'leftblock'));
3191 print
"\n".
'<!-- Begin side-nav id-left -->'.
"\n".
'<div class="side-nav"><div id="id-left">'.
"\n";
3194 if (!is_object($form)) {
3195 $form =
new Form($db);
3200 if ($conf->browser->layout ==
'phone') {
3201 $conf->global->MAIN_USE_OLD_SEARCH_FORM = 1;
3205 $arrayresult = array();
3206 include DOL_DOCUMENT_ROOT.
'/core/ajax/selectsearchbox.php';
3211 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
3212 if ($conf->browser->name ==
'chrome') {
3213 $stringforfirstkey .=
' ALT +';
3214 } elseif ($conf->browser->name ==
'firefox') {
3215 $stringforfirstkey .=
' ALT + SHIFT +';
3217 $stringforfirstkey .=
' CTL +';
3220 $searchform .= $form->selectArrayFilter(
'searchselectcombo', $arrayresult, $selected,
'accesskey="s"', 1, 0, (!
getDolGlobalString(
'MAIN_SEARCHBOX_CONTENT_LOADED_BEFORE_KEY') ? 1 : 0),
'vmenusearchselectcombo', 1, $langs->trans(
"Search"), 1, $stringforfirstkey.
' s');
3222 if (is_array($arrayresult)) {
3223 foreach ($arrayresult as $key => $val) {
3224 $searchform .=
printSearchForm($val[
'url'], $val[
'url'], $val[
'label'],
'maxwidth125',
'search_all', (empty($val[
'shortcut']) ?
'' : $val[
'shortcut']),
'searchleft'.$key, $val[
'img']);
3230 $parameters = array(
'searchform' => $searchform);
3231 $reshook = $hookmanager->executeHooks(
'printSearchForm', $parameters);
3232 if (empty($reshook)) {
3233 $searchform .= $hookmanager->resPrint;
3235 $searchform = $hookmanager->resPrint;
3239 if (
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') || empty($conf->use_javascript_ajax)) {
3240 $urltosearch = DOL_URL_ROOT.
'/core/search_page.php?showtitlebefore=1';
3241 $searchform =
'<div class="blockvmenuimpair blockvmenusearchphone"><div id="divsearchforms1"><a href="'.$urltosearch.
'" accesskey="s" alt="'.
dol_escape_htmltag($langs->trans(
"ShowSearchFields")).
'">'.$langs->trans(
"Search").
'...</a></div></div>';
3242 } elseif ($conf->use_javascript_ajax &&
getDolGlobalString(
'MAIN_USE_OLD_SEARCH_FORM')) {
3243 $searchform =
'<div class="blockvmenuimpair blockvmenusearchphone"><div id="divsearchforms1"><a href="#" alt="'.dol_escape_htmltag($langs->trans(
"ShowSearchFields")).
'">'.$langs->trans(
"Search").
'...</a></div><div id="divsearchforms2" style="display: none">'.$searchform.
'</div>';
3244 $searchform .=
'<script>
3245 jQuery(document).ready(function () {
3246 jQuery("#divsearchforms1").click(function(){
3247 jQuery("#divsearchforms2").toggle();
3251 $searchform .=
'</div>';
3255 $searchform .=
'<script>
3256 jQuery(document).keydown(function(e){
3257 if( e.which === 70 && e.ctrlKey && e.shiftKey ){
3258 console.log(\'control + shift + f : trigger open global-search dropdown\');
3259 openGlobalSearchDropDown();
3261 if( (e.which === 83 || e.which === 115) && e.altKey ){
3262 console.log(\'alt + s : trigger open global-search dropdown\');
3263 openGlobalSearchDropDown();
3267 var openGlobalSearchDropDown = function() {
3268 jQuery("#searchselectcombo").select2(\'open\');
3274 print
'<!-- Begin left menu -->'.
"\n";
3276 print
'<div class="vmenu"'.(!
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER') ?
'' :
' title="Left menu"').
'>'.
"\n\n";
3279 $menumanager->menu_array = $menu_array_before;
3280 $menumanager->menu_array_after = $menu_array_after;
3281 $menumanager->showmenu(
'left', array(
'searchform'=>$searchform));
3285 print
"<!-- Begin Help Block-->\n";
3286 print
'<div id="blockvmenuhelp" class="blockvmenuhelp">'.
"\n";
3290 $doliurl =
'https://www.dolibarr.org';
3292 if (preg_match(
'/fr/i', $langs->defaultlang)) {
3293 $doliurl =
'https://www.dolibarr.fr';
3295 if (preg_match(
'/es/i', $langs->defaultlang)) {
3296 $doliurl =
'https://www.dolibarr.es';
3298 if (preg_match(
'/de/i', $langs->defaultlang)) {
3299 $doliurl =
'https://www.dolibarr.de';
3301 if (preg_match(
'/it/i', $langs->defaultlang)) {
3302 $doliurl =
'https://www.dolibarr.it';
3304 if (preg_match(
'/gr/i', $langs->defaultlang)) {
3305 $doliurl =
'https://www.dolibarr.gr';
3308 $appli = constant(
'DOL_APPLICATION_TITLE');
3310 $appli = $conf->global->MAIN_APPLICATION_TITLE; $doliurl =
'';
3311 if (preg_match(
'/\d\.\d/', $appli)) {
3312 if (!preg_match(
'/'.preg_quote(DOL_VERSION).
'/', $appli)) {
3313 $appli .=
" (".DOL_VERSION.
")";
3316 $appli .=
" ".DOL_VERSION;
3319 $appli .=
" ".DOL_VERSION;
3321 print
'<div id="blockvmenuhelpapp" class="blockvmenuhelp">';
3323 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$doliurl.
'">';
3325 print
'<span class="help">';
3333 print
'</div>'.
"\n";
3338 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3341 $bugbaseurl =
'https://github.com/Dolibarr/dolibarr/issues/new?labels=Bug';
3342 $bugbaseurl .=
'&title=';
3343 $bugbaseurl .= urlencode(
"Bug: ");
3344 $bugbaseurl .=
'&body=';
3345 $bugbaseurl .= urlencode(
"# Instructions\n");
3346 $bugbaseurl .= urlencode(
"*This is a template to help you report good issues. You may use [Github Markdown](https://help.github.com/articles/getting-started-with-writing-and-formatting-on-github/) syntax to format your issue report.*\n");
3347 $bugbaseurl .= urlencode(
"*Please:*\n");
3348 $bugbaseurl .= urlencode(
"- *replace the bracket enclosed texts with meaningful information*\n");
3349 $bugbaseurl .= urlencode(
"- *remove any unused sub-section*\n");
3350 $bugbaseurl .= urlencode(
"\n");
3351 $bugbaseurl .= urlencode(
"\n");
3352 $bugbaseurl .= urlencode(
"# Bug\n");
3353 $bugbaseurl .= urlencode(
"[*Short description*]\n");
3354 $bugbaseurl .= urlencode(
"\n");
3355 $bugbaseurl .= urlencode(
"## Environment\n");
3356 $bugbaseurl .= urlencode(
"- **Version**: ".DOL_VERSION.
"\n");
3357 $bugbaseurl .= urlencode(
"- **OS**: ".php_uname(
's').
"\n");
3358 $bugbaseurl .= urlencode(
"- **Web server**: ".$_SERVER[
"SERVER_SOFTWARE"].
"\n");
3359 $bugbaseurl .= urlencode(
"- **PHP**: ".php_sapi_name().
' '.phpversion().
"\n");
3360 $bugbaseurl .= urlencode(
"- **Database**: ".$db::LABEL.
' '.$db->getVersion().
"\n");
3361 $bugbaseurl .= urlencode(
"- **URL(s)**: ".$_SERVER[
"REQUEST_URI"].
"\n");
3362 $bugbaseurl .= urlencode(
"\n");
3363 $bugbaseurl .= urlencode(
"## Expected and actual behavior\n");
3364 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3365 $bugbaseurl .= urlencode(
"\n");
3366 $bugbaseurl .= urlencode(
"## Steps to reproduce the behavior\n");
3367 $bugbaseurl .= urlencode(
"[*Verbose description*]\n");
3368 $bugbaseurl .= urlencode(
"\n");
3369 $bugbaseurl .= urlencode(
"## [Attached files](https://help.github.com/articles/issue-attachments) (Screenshots, screencasts, dolibarr.log, debugging informations…)\n");
3370 $bugbaseurl .= urlencode(
"[*Files*]\n");
3371 $bugbaseurl .= urlencode(
"\n");
3373 $bugbaseurl .= urlencode(
"\n");
3374 $bugbaseurl .= urlencode(
"## Report\n");
3376 $bugbaseurl = $conf->global->MAIN_BUGTRACK_ENABLELINK;
3382 $parameters = array(
'bugbaseurl' => $bugbaseurl);
3383 $reshook = $hookmanager->executeHooks(
'printBugtrackInfo', $parameters);
3384 if (empty($reshook)) {
3385 $bugbaseurl .= $hookmanager->resPrint;
3387 $bugbaseurl = $hookmanager->resPrint;
3390 print
'<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
3391 print
'<a class="help" target="_blank" rel="noopener noreferrer" href="'.$bugbaseurl.
'"><i class="fas fa-bug"></i> '.$langs->trans(
"FindBug").
'</a>';
3396 print
"<!-- End Help Block-->\n";
3400 print
"<!-- End left menu -->\n";
3404 $parameters = array();
3405 $reshook = $hookmanager->executeHooks(
'printLeftBlock', $parameters);
3406 print $hookmanager->resPrint;
3408 print
'</div></div> <!-- End side-nav id-left -->';
3412 print
'<!-- Begin right area -->'.
"\n";
3414 if (empty($leftmenuwithoutmainarea)) {
3428 global $conf, $langs, $hookmanager;
3430 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3431 print
'<div id="id-right">';
3436 print
'<!-- Begin div class="fiche" -->'.
"\n".
'<div class="fiche">'.
"\n";
3438 $hookmanager->initHooks(array(
'main'));
3439 $parameters = array();
3440 $reshook = $hookmanager->executeHooks(
'printMainArea', $parameters);
3441 print $hookmanager->resPrint;
3444 print
info_admin($langs->trans(
"WarningYouAreInMaintenanceMode", $conf->global->MAIN_ONLY_LOGIN_ALLOWED), 0, 0, 1,
'warning maintenancemode');
3449 $parameters = array();
3450 $reshook = $hookmanager->executeHooks(
'showSocinfoOnPrint', $parameters);
3451 if (empty($reshook)) {
3452 print
'<!-- Begin show mysoc info header -->'.
"\n";
3453 print
'<div id="mysoc-info-header">'.
"\n";
3454 print
'<table class="centpercent div-table-responsive">'.
"\n";
3456 print
'<tr><td rowspan="0" class="width20p">';
3458 print
'<img id="mysoc-info-header-logo" style="max-width:100%" alt="" src="'.DOL_URL_ROOT.
'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode(
'logos/'.
dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_LOGO'))).
'">';
3460 print
'</td><td rowspan="0" class="width50p"></td></tr>'.
"\n";
3461 print
'<tr><td class="titre bold">'.dol_escape_htmltag(
getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM')).
'</td></tr>'.
"\n";
3473 print
'</table>'.
"\n";
3474 print
'</div>'.
"\n";
3475 print
'<!-- End show mysoc info header -->'.
"\n";
3494 if (preg_match(
'/^http/i', $helppagename)) {
3496 $helpbaseurl =
'%s';
3497 $helppage = $helppagename;
3502 if (preg_match(
'/^es/i', $langs->defaultlang)) {
3503 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3504 if (preg_match(
'/ES:([^|]+)/i', $helppagename, $reg)) {
3505 $helppage = $reg[1];
3508 if (preg_match(
'/^fr/i', $langs->defaultlang)) {
3509 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3510 if (preg_match(
'/FR:([^|]+)/i', $helppagename, $reg)) {
3511 $helppage = $reg[1];
3514 if (preg_match(
'/^de/i', $langs->defaultlang)) {
3515 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3516 if (preg_match(
'/DE:([^|]+)/i', $helppagename, $reg)) {
3517 $helppage = $reg[1];
3520 if (empty($helppage)) {
3521 $helpbaseurl =
'http://wiki.dolibarr.org/index.php/%s';
3522 if (preg_match(
'/EN:([^|]+)/i', $helppagename, $reg)) {
3523 $helppage = $reg[1];
3528 return array(
'helpbaseurl'=>$helpbaseurl,
'helppage'=>$helppage,
'mode'=>$mode);
3548function printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey =
'', $prefhtmlinputname =
'', $img =
'', $showtitlebefore = 0, $autofocus = 0)
3550 global $langs, $user;
3553 $ret .=
'<form action="'.$urlaction.
'" method="post" class="searchform nowraponall tagtr">';
3554 $ret .=
'<input type="hidden" name="token" value="'.newToken().
'">';
3555 $ret .=
'<input type="hidden" name="savelogin" value="'.dol_escape_htmltag($user->login).
'">';
3556 if ($showtitlebefore) {
3557 $ret .=
'<div class="tagtd left">'.$title.
'</div> ';
3559 $ret .=
'<div class="tagtd">';
3560 $ret .=
img_picto(
'', $img,
'',
false, 0, 0,
'',
'paddingright width20');
3561 $ret .=
'<input type="text" class="flat '.$htmlmorecss.
'"';
3562 $ret .=
' style="background-repeat: no-repeat; background-position: 3px;"';
3563 $ret .= ($accesskey ?
' accesskey="'.$accesskey.
'"' :
'');
3564 $ret .=
' placeholder="'.strip_tags($title).
'"';
3565 $ret .= ($autofocus ?
' autofocus' :
'');
3566 $ret .=
' name="'.$htmlinputname.
'" id="'.$prefhtmlinputname.$htmlinputname.
'" />';
3567 $ret .=
'<button type="submit" class="button bordertransp" style="padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px">';
3568 $ret .=
'<span class="fa fa-search"></span>';
3569 $ret .=
'</button>';
3571 $ret .=
"</form>\n";
3576if (!function_exists(
"llxFooter")) {
3587 function llxFooter($comment =
'', $zone =
'private', $disabledoutputofmessages = 0)
3589 global $conf, $db, $langs, $user, $mysoc, $object, $hookmanager, $action;
3590 global $delayedhtmlcontent;
3591 global $contextpage, $page, $limit, $mode;
3592 global $dolibarr_distrib;
3594 $ext =
'layout='.urlencode($conf->browser->layout).
'&version='.urlencode(DOL_VERSION);
3598 $parameters = array();
3599 $reshook = $hookmanager->executeHooks(
'llxFooter', $parameters, $object, $action);
3600 if (empty($reshook)) {
3601 $llxfooter .= $hookmanager->resPrint;
3602 } elseif ($reshook > 0) {
3603 $llxfooter = $hookmanager->resPrint;
3614 if (is_object($user) && !empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) {
3616 foreach ($user->lastsearch_values_tmp as $key => $val) {
3617 unset($_SESSION[
'lastsearch_values_tmp_'.$key]);
3618 if (count($val) && empty($_POST[
'button_removefilter']) && empty($_POST[
'button_removefilter_x'])) {
3619 if (empty($val[
'sortfield'])) {
3620 unset($val[
'sortfield']);
3622 if (empty($val[
'sortorder'])) {
3623 unset($val[
'sortorder']);
3625 dol_syslog(
'Save lastsearch_values_tmp_'.$key.
'='.json_encode($val, 0).
" (systematic recording of last search criterias)");
3626 $_SESSION[
'lastsearch_values_tmp_'.$key] = json_encode($val);
3627 unset($_SESSION[
'lastsearch_values_'.$key]);
3633 $relativepathstring = $_SERVER[
"PHP_SELF"];
3635 if (constant(
'DOL_URL_ROOT')) {
3636 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
3638 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
3639 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
3640 if (preg_match(
'/list\.php$/', $relativepathstring)) {
3641 unset($_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring]);
3642 unset($_SESSION[
'lastsearch_page_tmp_'.$relativepathstring]);
3643 unset($_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring]);
3644 unset($_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring]);
3646 if (!empty($contextpage)) {
3647 $_SESSION[
'lastsearch_contextpage_tmp_'.$relativepathstring] = $contextpage;
3649 if (!empty($page) && $page > 0) {
3650 $_SESSION[
'lastsearch_page_tmp_'.$relativepathstring] = $page;
3652 if (!empty($limit) && $limit != $conf->liste_limit) {
3653 $_SESSION[
'lastsearch_limit_tmp_'.$relativepathstring] = $limit;
3655 if (!empty($mode)) {
3656 $_SESSION[
'lastsearch_mode_tmp_'.$relativepathstring] = $mode;
3659 unset($_SESSION[
'lastsearch_contextpage_'.$relativepathstring]);
3660 unset($_SESSION[
'lastsearch_page_'.$relativepathstring]);
3661 unset($_SESSION[
'lastsearch_limit_'.$relativepathstring]);
3662 unset($_SESSION[
'lastsearch_mode_'.$relativepathstring]);
3668 if ($conf->use_javascript_ajax) {
3669 $title =
img_warning().
' '.$langs->trans(
'CoreErrorTitle');
3670 print
ajax_dialog($title, $langs->trans(
'CoreErrorMessage'));
3673 $msg =
img_warning().
' '.$langs->trans(
'CoreErrorMessage');
3674 print
'<div class="error">'.$msg.
'</div>';
3682 print
'</div> <!-- End div class="fiche" -->'.
"\n";
3684 if (empty($conf->dol_hide_leftmenu) && !
GETPOST(
'dol_openinpopup')) {
3685 print
'</div> <!-- End div id-right -->'.
"\n";
3688 if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) {
3689 print
'</div> <!-- End div id-container -->'.
"\n";
3694 print
'<!-- '.$comment.
' -->'.
"\n";
3699 if (!empty($delayedhtmlcontent)) {
3700 print $delayedhtmlcontent;
3703 if (!empty($conf->use_javascript_ajax)) {
3704 print
"\n".
'<!-- Includes JS Footer of Dolibarr -->'.
"\n";
3705 print
'<script src="'.DOL_URL_ROOT.
'/core/js/lib_foot.js.php?lang='.$langs->defaultlang.($ext ?
'&'.$ext :
'').
'"></script>'.
"\n";
3709 if (isModEnabled(
'blockedlog') && is_object($object) && !empty($object->id) && $object->id > 0) {
3710 if (in_array($object->element, array(
'facture')) && $object->statut > 0) {
3711 print
"\n<!-- JS CODE TO ENABLE log when making a download or a preview of a document -->\n";
3714 jQuery(document).ready(
function () {
3715 $(
'a.documentpreview').click(
function() {
3716 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3718 id:<?php echo $object->id; ?>
3719 , element:
'<?php echo $object->element ?>'
3720 , action:
'DOC_PREVIEW'
3721 , token:
'<?php echo currentToken(); ?>'
3725 $(
'a.documentdownload').click(
function() {
3726 $.post(
'<?php echo DOL_URL_ROOT."/blockedlog/ajax/block-add.php" ?>'
3728 id:<?php echo $object->id; ?>
3729 , element:
'<?php echo $object->element ?>'
3730 , action:
'DOC_DOWNLOAD'
3731 , token:
'<?php echo currentToken(); ?>'
3742 print
"\n<!-- A div to allow dialog popup by jQuery('#dialogforpopup').dialog() -->\n";
3743 print
'<div id="dialogforpopup" style="display: none;"></div>'.
"\n";
3747 $forceping =
GETPOST(
'forceping',
'alpha');
3748 if (($_SERVER[
"PHP_SELF"] == DOL_URL_ROOT.
'/index.php') || $forceping) {
3750 $hash_unique_id =
dol_hash(
'dolibarr'.$conf->file->instance_unique_id,
'sha256');
3753 || (!empty($conf->file->instance_unique_id) && ($hash_unique_id != $conf->global->MAIN_FIRST_PING_OK_ID) && (
getDolGlobalString(
'MAIN_FIRST_PING_OK_ID') !=
'disabled'))
3756 if (strpos(
'alpha', DOL_VERSION) > 0 && !$forceping) {
3757 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It is an alpha version -->\n";
3758 } elseif (empty($_COOKIE[
'DOLINSTALLNOPING_'.$hash_unique_id]) || $forceping) {
3762 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. An error already occured this month, we will try later. -->\n";
3764 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
3766 print
"\n".
'<!-- Includes JS for Ping of Dolibarr forceping='.$forceping.
' MAIN_FIRST_PING_OK_DATE='.
getDolGlobalString(
"MAIN_FIRST_PING_OK_DATE").
' MAIN_FIRST_PING_OK_ID='.
getDolGlobalString(
"MAIN_FIRST_PING_OK_ID").
' MAIN_LAST_PING_KO_DATE='.
getDolGlobalString(
"MAIN_LAST_PING_KO_DATE").
' -->'.
"\n";
3767 print
"\n<!-- JS CODE TO ENABLE the anonymous Ping -->\n";
3768 $url_for_ping = (!
getDolGlobalString(
'MAIN_URL_FOR_PING') ?
"https://ping.dolibarr.org/" : $conf->global->MAIN_URL_FOR_PING);
3770 $distrib =
'standard';
3771 if ($_SERVER[
"SERVER_ADMIN"] ==
'doliwamp@localhost') {
3772 $distrib =
'doliwamp';
3774 if (!empty($dolibarr_distrib)) {
3775 $distrib = $dolibarr_distrib;
3779 jQuery(document).ready(
function (tmp) {
3780 console.log(
"Try Ping with hash_unique_id is dol_hash('dolibarr'+instance_unique_id, 'sha256')");
3783 url:
"<?php echo $url_for_ping ?>",
3787 hash_algo:
'dol_hash-sha256',
3788 hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>',
3789 action:
'dolibarrping',
3790 version:
'<?php echo (float) DOL_VERSION; ?>',
3791 entity:
'<?php echo (int) $conf->entity; ?>',
3792 dbtype:
'<?php echo dol_escape_js($db->type); ?>',
3793 country_code:
'<?php echo $mysoc->country_code ? dol_escape_js($mysoc->country_code) : 'unknown
'; ?>',
3794 php_version:
'<?php echo dol_escape_js(phpversion()); ?>',
3795 os_version:
'<?php echo dol_escape_js(version_os('smr
')); ?>',
3796 db_version:
'<?php echo dol_escape_js(version_db()); ?>',
3797 distrib:
'<?php echo $distrib ? dol_escape_js($distrib) : 'unknown
'; ?>',
3798 token:
'notrequired'
3800 success:
function (data,
status, xhr) {
3801 console.log(
"Ping ok");
3804 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3807 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingok', token:
'<?php echo currentToken(); ?>' },
3810 error:
function (data,
status,xhr) {
3811 console.log(
"Ping ko: " + data);
3814 url:
'<?php echo DOL_URL_ROOT.'/core/ajax/pingresult.php
'; ?>',
3817 data: { hash_algo:
'dol_hash-sha256', hash_unique_id:
'<?php echo dol_escape_js($hash_unique_id); ?>', action:
'firstpingko', token:
'<?php echo currentToken(); ?>' },
3827 print
"\n<!-- NO JS CODE TO ENABLE the anonymous Ping. It was disabled -->\n";
3828 include_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
3830 dolibarr_set_const($db,
'MAIN_FIRST_PING_OK_ID',
'disabled',
'chaine', 0,
'', $conf->entity);
3835 $parameters = array();
3836 $reshook = $hookmanager->executeHooks(
'beforeBodyClose', $parameters);
3838 print $hookmanager->resPrint;
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
versioncompare($versionarray1, $versionarray2)
Compare 2 versions (stored into 2 arrays).
ajax_dialog($title, $message, $w=350, $h=150)
Show an ajax dialog.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
printDropdownBookmarksList()
Add area with bookmarks in top menu.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
isHTTPS()
Return if we are using a HTTPS connexion Check HTTPS (no way to be modified by user but may be empty ...
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
getBrowserInfo($user_agent)
Return information about user browser.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formated messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
conf($dolibarr_main_document_root)
Load conf file (file must exists)
top_menu_quickadd()
Build the tooltip on top menu quick add.
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Ouput html header of a page.
analyseVarsForSqlAndScriptsInjection(&$var, $type)
Return true if security check on parameters are OK, false otherwise.
top_menu_user($hideloginname=0, $urllogout='')
Build the tooltip on user login.
testSqlAndScriptInject($val, $type)
Security: WAF layer for SQL Injection and XSS Injection (scripts) protection (Filters on GET,...
left_menu($menu_array_before, $helppagename='', $notused='', $menu_array_after=array(), $leftmenuwithoutmainarea=0, $title='', $acceptdelayedhtml=0)
Show left menu bar.
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
main_area($title='')
Begin main area.
getHelpParamFor($helppagename, $langs)
Return helpbaseurl, helppage and mode.
if(!empty( $_SERVER[ 'MAIN_SHOW_TUNING_INFO'])) realCharForNumericEntities($matches)
Return the real char for a numeric entities.
printSearchForm($urlaction, $urlobject, $title, $htmlmorecss, $htmlinputname, $accesskey='', $prefhtmlinputname='', $img='', $showtitlebefore=0, $autofocus=0)
Show a search area.
top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $morequerystring='', $helppagename='')
Show an HTML header + a BODY + The top menu bar.
top_menu_search()
Build the tooltip on top menu tsearch.
printDropdownQuickadd()
Generate list of quickadd items.
top_menu_bookmark()
Build the tooltip on top menu bookmark.
ui dialog ui datepicker calendar ui widget content ui state ui datepicker calendar ui widget header ui state ui datepicker calendar ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
global $dolibarr_main_demo
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.
checkLoginPassEntity($usertotest, $passwordtotest, $entitytotest, $authmode, $context='')
Return a login if login/pass was successfull.
dol_hash($chain, $type='0', $nosalt=0)
Returns a hash (non reversible encryption) of a string.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.