Layout editor list dialog error fix (#6992)
[openemr.git] / interface / login / login.php
blob5026661d401704981726d065d0fbb63fb38f01ff
1 <?php
3 /**
4 * Login screen.
6 * @package OpenEMR
7 * @link http://www.open-emr.org
8 * @author Rod Roark <rod@sunsetsystems.com>
9 * @author Brady Miller <brady.g.miller@gmail.com>
10 * @author Kevin Yeh <kevin.y@integralemr.com>
11 * @author Scott Wakefield <scott.wakefield@gmail.com>
12 * @author ViCarePlus <visolve_emr@visolve.com>
13 * @author Julia Longtin <julialongtin@diasp.org>
14 * @author cfapress
15 * @author markleeds
16 * @author Tyler Wrenn <tyler@tylerwrenn.com>
17 * @author Ken Chapple <ken@mi-squared.com>
18 * @author Daniel Pflieger <daniel@mi-squared.com> <daniel@growlingflea.com>
19 * @author Robert Down <robertdown@live.com>
20 * @copyright Copyright (c) 2019 Brady Miller <brady.g.miller@gmail.com>
21 * @copyright Copyright (c) 2020 Tyler Wrenn <tyler@tylerwrenn.com>
22 * @copyright Copyright (c) 2021 Ken Chapple <ken@mi-squared.com>
23 * @copyright Copyright (c) 2021 Daniel Pflieger <daniel@mi-squared.com> <daniel@growlingflea.com>
24 * @copyright Copyright (c) 2021-2023 Robert Down <robertdown@live.com>
25 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
28 // prevent UI redressing
29 Header("X-Frame-Options: DENY");
30 Header("Content-Security-Policy: frame-ancestors 'none'");
32 use OpenEMR\Common\Twig\TwigContainer;
33 use OpenEMR\Events\Core\TemplatePageEvent;
34 use OpenEMR\Services\FacilityService;
35 use OpenEMR\Services\LogoService;
36 use Symfony\Component\EventDispatcher\EventDispatcher;
38 $ignoreAuth = true;
39 // Set $sessionAllowWrite to true to prevent session concurrency issues during authorization related code
40 $sessionAllowWrite = true;
41 require_once("../globals.php");
43 $twig = new TwigContainer(null, $GLOBALS["kernel"]);
44 $t = $twig->getTwig();
46 $logoService = new LogoService();
47 $primaryLogo = $logoService->getLogo("core/login/primary");
48 $secondaryLogo = $logoService->getLogo("core/login/secondary");
49 $smallLogoOne = $logoService->getLogo("core/login/small_logo_1");
50 $smallLogoTwo = $logoService->getLogo("core/login/small_logo_2");
52 $layout = $GLOBALS['login_page_layout'];
54 // mdsupport - Add 'App' functionality for user interfaces without standard menu and frames
55 // If this script is called with app parameter, validate it without showing other apps.
57 // Build a list of valid entries
58 // Original merge v5.0.1
59 $emr_app = array();
60 $sql = "SELECT option_id, title,is_default FROM list_options WHERE list_id=? and activity=1 ORDER BY seq, option_id";
61 $rs = sqlStatement($sql, ['apps']);
62 if (sqlNumRows($rs)) {
63 while ($app = sqlFetchArray($rs)) {
64 $app_req = explode('?', trim($app['title']));
65 if (! file_exists('../' . $app_req[0])) {
66 continue;
69 $emr_app [trim($app ['option_id'])] = trim($app ['title']);
70 if ($app ['is_default']) {
71 $emr_app_def = $app ['option_id'];
76 $div_app = '';
77 if (count($emr_app)) {
78 // Standard app must exist
79 $std_app = 'main/main_screen.php';
80 if (!in_array($std_app, $emr_app)) {
81 $emr_app['*OpenEMR'] = $std_app;
84 if (isset($_REQUEST['app']) && $emr_app[$_REQUEST['app']]) {
85 $div_app = sprintf('<input type="hidden" name="appChoice" value="%s">', attr($_REQUEST['app']));
86 } else {
87 $opt_htm = '';
88 foreach ($emr_app as $opt_disp => $opt_value) {
89 $opt_htm .= sprintf(
90 '<option value="%s" %s>%s</option>\n',
91 attr($opt_disp),
92 ($opt_disp == ($emr_app_def ?? '') ? 'selected="selected"' : ''),
93 text(xl_list_label($opt_disp))
97 $div_app = sprintf(
99 <div id="divApp" class="form-group row">
100 <label for="appChoice" class="col-form-label col-sm-4">%s:</label>
101 <div class="col">
102 <select class="form-control" id="selApp" name="appChoice" size="1">%s</select>
103 </div>
104 </div>',
105 xlt('App'),
106 $opt_htm
112 function getDefaultLanguage(): array
114 $sql = "SELECT * FROM lang_languages where lang_description = ?";
115 $res = sqlStatement($sql, [$GLOBALS['language_default']]);
116 $langs = [];
118 while ($row = sqlFetchArray($res)) {
119 $langs[] = $row;
122 $id = 1;
123 $desc = "English";
125 if (count($langs) == 1) {
126 $id = $langs[0]["lang_id"];
127 $desc = $langs[0]["lang_description"];
130 return ["id" => $id, "language" => $desc];
133 function getLanguagesList(): array
135 $mainLangID = empty($_SESSION['language_choice']) ? '1' : $_SESSION['language_choice'];
136 $sql = "SELECT ll.lang_id, IF(LENGTH(ld.definition), ld.definition, ll.lang_description) AS trans_lang_description, ll.lang_description
137 FROM lang_languages AS ll
138 LEFT JOIN lang_constants AS lc ON lc.constant_name = ll.lang_description
139 LEFT JOIN lang_definitions AS ld ON ld.cons_id = lc.cons_id AND ld.lang_id = ?
140 ORDER BY IF(LENGTH(ld.definition),ld.definition,ll.lang_description), ll.lang_id";
141 $res = sqlStatement($sql, [$mainLangID]);
142 $langList = [];
144 while ($row = sqlFetchArray($res)) {
145 $langList[] = $row;
148 return $langList;
151 $facilities = [];
152 $facilitySelected = false;
153 if ($GLOBALS['login_into_facility']) {
154 $facilityService = new FacilityService();
155 $facilities = $facilityService->getAllFacility();
156 $facilitySelected = ($GLOBALS['set_facility_cookie'] && isset($_COOKIE['pc_facility'])) ? $_COOKIE['pc_facility'] : null;
159 $defaultLanguage = getDefaultLanguage();
160 $languageList = getLanguagesList();
161 $_SESSION['language_choice'] = $defaultLanguage['id'];
163 $relogin = (isset($_SESSION['relogin']) && ($_SESSION['relogin'] == 1)) ? true : false;
164 if ($relogin) {
165 unset($_SESSION["relogin"]);
168 $t1 = $GLOBALS['tiny_logo_1'];
169 $t2 = $GLOBALS['tiny_logo_2'];
170 $displaySmallLogo = false;
171 if ($t1 && !$t2) {
172 $displaySmallLogo = 1;
173 } if ($t2 && !$t1) {
174 $displaySmallLogo = 2;
175 } if ($t1 && $t2) {
176 $displaySmallLogo = 3;
179 $regTranslations = json_encode(array(
180 'title' => xla('OpenEMR Product Registration'),
181 'pleaseProvideValidEmail' => xla('Please provide a valid email address'),
182 'success' => xla('Success'),
183 'registeredSuccess' => xla('Your installation of OpenEMR has been registered'),
184 'submit' => xla('Submit'),
185 'noThanks' => xla('No Thanks'),
186 'registeredEmail' => xla('Registered email'),
187 'registeredId' => xla('Registered id'),
188 'genericError' => xla('Error. Try again later'),
189 'closeTooltip' => ''
192 $cookie = '';
193 if (session_name()) {
194 $sid = urlencode(session_id());
195 $sname = urlencode(session_name());
196 $scparams = session_get_cookie_params();
197 $domain = $scparams['domain'];
198 $path = $scparams['path'];
199 $oldDate = gmdate('Y', strtotime("-1 years"));
200 $expires = gmdate(DATE_RFC1123, $oldDate);
201 $sameSite = empty($scparams['samesite']) ? '' : $scparams['samesite'];
202 $cookie = "{$sname}={$sid}; path={$path}; domain={$domain}; expires={$expires}";
204 if ($sameSite) {
205 $cookie .= "; SameSite={$sameSite}";
208 $cookie = json_encode($cookie);
211 $viewArgs = [
212 'title' => $openemr_name,
213 'displayLanguage' => $GLOBALS["language_menu_login"] && (count($languageList) != 1),
214 'defaultLangID' => $defaultLanguage['id'],
215 'defaultLangName' => $defaultLanguage['language'],
216 'languageList' => $languageList,
217 'relogin' => $relogin,
218 'loginFail' => isset($_SESSION["loginfailure"]) && $_SESSION["loginfailure"] == 1,
219 'displayFacilities' => (bool)$GLOBALS["login_into_facility"],
220 'facilityList' => $facilities,
221 'facilitySelected' => $facilitySelected,
222 'displayGoogleSignin' => !empty($GLOBALS['google_signin_enabled']) && !empty($GLOBALS['google_signin_client_id']),
223 'googleSigninClientID' => $GLOBALS['google_signin_client_id'],
224 'displaySmallLogo' => $displaySmallLogo,
225 'smallLogoOne' => $smallLogoOne,
226 'smallLogoTwo' => $smallLogoTwo,
227 'showTitleOnLogin' => $GLOBALS['show_label_login'],
228 'displayTagline' => $GLOBALS['show_tagline_on_login'],
229 'tagline' => $GLOBALS['login_tagline_text'],
230 'displayAck' => $GLOBALS['display_acknowledgements_on_login'],
231 'hasSession' => (bool)session_name(),
232 'cookieText' => $cookie,
233 'regTranslations' => $regTranslations,
234 'regConstants' => json_encode(['webroot' => $GLOBALS['webroot']]),
235 'siteID' => $_SESSION['site_id'],
236 'showLabels' => $GLOBALS['show_labels_on_login_form'],
237 'displayPrimaryLogo' => $GLOBALS['show_primary_logo'],
238 'primaryLogo' => $primaryLogo,
239 'primaryLogoWidth' => $GLOBALS['primary_logo_width'],
240 'logoPosition' => $GLOBALS['logo_position'],
241 'secondaryLogoWidth' => $GLOBALS['secondary_logo_width'],
242 'displaySecondaryLogo' => $GLOBALS['extra_logo_login'],
243 'secondaryLogo' => $secondaryLogo,
244 'secondaryLogoPosition' => $GLOBALS['secondary_logo_position'],
248 * @var EventDispatcher;
250 $ed = $GLOBALS['kernel']->getEventDispatcher();
252 $templatePageEvent = new TemplatePageEvent('login/login.php', [], $layout, $viewArgs);
253 $event = $ed->dispatch($templatePageEvent, TemplatePageEvent::RENDER_EVENT);
255 echo $t->render($event->getTwigTemplate(), $event->getTwigVariables());