Fix to support use of the Social Screening Tool encounter form in the patient portal
[openemr.git] / interface / login / login.php
blobd05323c1a4189e935843059c485c4da72291c3ee
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-2022 Robert Down <robertdown@live.com>
25 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
28 use OpenEMR\Common\Twig\TwigContainer;
29 use OpenEMR\Services\FacilityService;
31 $ignoreAuth = true;
32 // Set $sessionAllowWrite to true to prevent session concurrency issues during authorization related code
33 $sessionAllowWrite = true;
34 require_once("../globals.php");
36 $twig = new TwigContainer(null, $GLOBALS["kernel"]);
37 $t = $twig->getTwig();
39 // mdsupport - Add 'App' functionality for user interfaces without standard menu and frames
40 // If this script is called with app parameter, validate it without showing other apps.
42 // Build a list of valid entries
43 $emr_app = array();
44 $sql = "SELECT option_id, title,is_default FROM list_options WHERE list_id=? and activity=1 ORDER BY seq, option_id";
45 $rs = sqlStatement($sql, ['apps']);
46 if (sqlNumRows($rs)) {
47 while ($app = sqlFetchArray($rs)) {
48 $app_req = explode('?', trim($app['title']));
49 if (! file_exists('../' . $app_req[0])) {
50 continue;
53 $emr_app [trim($app ['option_id'])] = trim($app ['title']);
54 if ($app ['is_default']) {
55 $emr_app_def = $app ['option_id'];
60 $div_app = '';
61 if (count($emr_app)) {
62 // Standard app must exist
63 $std_app = 'main/main_screen.php';
64 if (!in_array($std_app, $emr_app)) {
65 $emr_app['*OpenEMR'] = $std_app;
68 if (isset($_REQUEST['app']) && $emr_app[$_REQUEST['app']]) {
69 $div_app = sprintf('<input type="hidden" name="appChoice" value="%s">', attr($_REQUEST['app']));
70 } else {
71 foreach ($emr_app as $opt_disp => $opt_value) {
72 $opt_htm .= sprintf(
73 '<option value="%s" %s>%s</option>\n',
74 attr($opt_disp),
75 ($opt_disp == $opt_default ? 'selected="selected"' : ''),
76 text(xl_list_label($opt_disp))
80 $div_app = sprintf(
82 <div id="divApp" class="form-group">
83 <label for="appChoice" class="text-right">%s:</label>
84 <div>
85 <select class="form-control" id="selApp" name="appChoice" size="1">%s</select>
86 </div>
87 </div>',
88 xlt('App'),
89 $opt_htm
94 // This code allows configurable positioning in the login page
95 $logoarea = "py-2 px-2 py-md-3 px-md-5 order-1 bg-primary";
96 $formarea = "py-3 px-2 p-sm-5 bg-white order-2";
97 $loginrow = "row login-row bg-white shadow-lg align-items-center my-sm-5";
99 // Apply these classes to the logo area if the login page is left or right
100 $lrArr = ['left', 'right'];
101 $logoarea .= (in_array($GLOBALS['login_page_layout'], $lrArr)) ? " col-md-6" : " col-md-12";
102 $formarea .= (in_array($GLOBALS['login_page_layout'], $lrArr)) ? " col-md-6" : " col-md-12";
104 // More finite control on a per-setting basis
105 switch ($GLOBALS['login_page_layout']) {
106 case 'left':
107 $logoarea .= " order-md-2";
108 $formarea .= " order-md-1";
109 break;
111 case 'right':
112 $logoarea .= " order-md-1";
113 $formarea .= " order-md-2";
114 break;
116 default:
117 $logoarea .= " order-1";
118 $formarea .= " col-12";
119 $loginrow .= " login-row-center";
120 break;
123 function getDefaultLanguage(): array
125 $sql = "SELECT * FROM lang_languages where lang_description = ?";
126 $res = sqlStatement($sql, [$GLOBALS['language_default']]);
127 $langs = [];
129 while ($row = sqlFetchArray($res)) {
130 $langs[] = $row;
133 $id = 1;
134 $desc = "English";
136 if (count($langs) == 1) {
137 $id = $langs[0]["lang_id"];
138 $desc = $langs[0]["lang_description"];
141 return ["id" => $id, "language" => $desc];
144 function getLanguagesList(): array
146 $mainLangID = empty($_SESSION['language_choice']) ? '1' : $_SESSION['language_choice'];
147 $sql = "SELECT ll.lang_id, IF(LENGTH(ld.definition), ld.definition, ll.lang_description) AS trans_lang_description, ll.lang_description
148 FROM lang_languages AS ll
149 LEFT JOIN lang_constants AS lc ON lc.constant_name = ll.lang_description
150 LEFT JOIN lang_definitions AS ld ON ld.cons_id = lc.cons_id AND ld.lang_id = ?
151 ORDER BY IF(LENGTH(ld.definition),ld.definition,ll.lang_description), ll.lang_id";
152 $res = sqlStatement($sql, [$mainLangID]);
153 $langList = [];
155 while ($row = sqlFetchArray($res)) {
156 $langList[] = $row;
159 return $langList;
162 $facilities = [];
163 $facilitySelected = false;
164 if ($GLOBALS['login_into_facility']) {
165 $facilityService = new FacilityService();
166 $facilities = $facilityService->getAllFacility();
167 $facilitySelected = ($GLOBALS['set_facility_cookie'] && isset($_COOKIE['pc_facility'])) ? $_COOKIE['pc_facility'] : null;
170 $defaultLanguage = getDefaultLanguage();
171 $languageList = getLanguagesList();
172 $_SESSION['language_choice'] = $defaultLanguage['id'];
174 $relogin = (isset($_SESSION['relogin']) && ($_SESSION['relogin'] == 1)) ? true : false;
175 if ($relogin) {
176 unset($_SESSION["relogin"]);
179 $t1 = $GLOBALS['tiny_logo_1'];
180 $t2 = $GLOBALS['tiny_logo_2'];
181 $displayTinyLogo = false;
182 if ($t1 && !$t2) {
183 $displayTinyLogo = 1;
184 } if ($t2 && !$t1) {
185 $displayTinyLogo = 2;
186 } if ($t1 && $t2) {
187 $displayTinyLogo = 3;
190 $regTranslations = json_encode(array(
191 'title' => xla('OpenEMR Product Registration'),
192 'pleaseProvideValidEmail' => xla('Please provide a valid email address'),
193 'success' => xla('Success'),
194 'registeredSuccess' => xla('Your installation of OpenEMR has been registered'),
195 'submit' => xla('Submit'),
196 'noThanks' => xla('No Thanks'),
197 'registeredEmail' => xla('Registered email'),
198 'registeredId' => xla('Registered id'),
199 'genericError' => xla('Error. Try again later'),
200 'closeTooltip' => ''
203 $cookie = '';
204 if (session_name()) {
205 $sid = urlencode(session_id());
206 $sname = urlencode(session_name());
207 $scparams = session_get_cookie_params();
208 $domain = $scparams['domain'];
209 $path = $scparams['path'];
210 $oldDate = gmdate('Y', strtotime("-1 years"));
211 $expires = gmdate(DATE_RFC1123, $oldDate);
212 $sameSite = empty($scparams['samesite']) ? '' : $scparams['samesite'];
213 $cookie = "{$sname}={$sid}; path={$path}; domain={$domain}; expires={$expires}";
215 if ($sameSite) {
216 $cookie .= "; SameSite={$sameSite}";
219 $cookie = json_encode($cookie);
222 $viewArgs = [
223 'title' => $openemr_name,
224 'displayLanguage' => ($GLOBALS["language_menu_login"] && (count($languageList) != 1)) ? true : false,
225 'defaultLangID' => $defaultLanguage['id'],
226 'defaultLangName' => $defaultLanguage['language'],
227 'languageList' => $languageList,
228 'relogin' => $relogin,
229 'loginFail' => (isset($_SESSION["loginfailure"]) && $_SESSION["loginfailure"] == 1) ? true : false,
230 'displayFacilities' => ($GLOBALS["login_into_facility"]) ? true : false,
231 'facilityList' => $facilities,
232 'facilitySelected' => $facilitySelected,
233 'displayGoogleSignin' => (!empty($GLOBALS['google_signin_enabled']) && !empty($GLOBALS['google_signin_client_id'])) ? true : false,
234 'googleSigninClientID' => $GLOBALS['google_signin_client_id'],
235 'logoArea' => $logoarea,
236 'displayExtraLogo' => $GLOBALS['extra_logo_login'],
237 'primaryLogoSrc' => file_get_contents($GLOBALS["images_static_absolute"] . "/login-logo.svg"),
238 'logocode' => $logocode,
239 'displayLoginLabel' => ($GLOBALS["show_label_login"]) ? true : false,
240 'displayTinyLogo' => $displayTinyLogo,
241 'tinyLogo1' => $tinylogocode1,
242 'tinyLogo2' => $tinylogocode2,
243 'displayTagline' => $GLOBALS['show_tagline_on_login'],
244 'tagline' => $GLOBALS['login_tagline_text'],
245 'displayAck' => $GLOBALS['display_acknowledgements'],
246 'hasSession' => (session_name()) ? true : false,
247 'cookieText' => $cookie,
248 'regTranslations' => $regTranslations,
249 'regConstants' => json_encode(['webroot' => $GLOBALS['webroot']]),
250 'siteID' => $_SESSION['site_id'],
251 'loginRow' => $loginrow,
252 'formArea' => $formarea,
253 'showLabels' => $GLOBALS['show_labels_on_login_form'],
255 echo $t->render("login/login_core.html.twig", $viewArgs);