Completed
Pull Request — release-2.1 (#5871)
by Jeremy
05:14
created

template_logout()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 19
rs 10
1
<?php
2
/**
3
 * Simple Machines Forum (SMF)
4
 *
5
 * @package SMF
6
 * @author Simple Machines https://www.simplemachines.org
7
 * @copyright 2020 Simple Machines and individual contributors
8
 * @license https://www.simplemachines.org/about/smf/license.php BSD
9
 *
10
 * @version 2.1 RC2
11
 */
12
13
/**
14
 * This is just the basic "login" form.
15
 */
16
function template_login()
17
{
18
	global $context, $settings, $scripturl, $modSettings, $txt;
19
20
	echo '
21
		<div class="login">
22
			<div class="cat_bar">
23
				<h3 class="catbg">
24
					<img src="', $settings['images_url'], '/icons/login_hd.png" alt="" class="icon"> ', $txt['login'], '
25
				</h3>
26
			</div>
27
			<div class="roundframe">
28
				<form class="login" action="', $context['login_url'], '" name="frmLogin" id="frmLogin" method="post" accept-charset="', $context['character_set'], '">';
29
30
	// Did they make a mistake last time?
31
	if (!empty($context['login_errors']))
32
		echo '
33
					<div class="errorbox">', implode('<br>', $context['login_errors']), '</div>
34
					<br>';
35
36
	// Or perhaps there's some special description for this time?
37
	if (isset($context['description']))
38
		echo '
39
					<div class="information">', $context['description'], '</div>';
40
41
	// Now just get the basic information - username, password, etc.
42
	echo '
43
					<dl>
44
						<dt>', $txt['username'], ':</dt>
45
						<dd>
46
							<input type="text" id="', !empty($context['from_ajax']) ? 'ajax_' : '', 'loginuser" name="user" size="20" value="', $context['default_username'], '">
47
						</dd>
48
						<dt>', $txt['password'], ':</dt>
49
						<dd>
50
							<input type="password" id="', !empty($context['from_ajax']) ? 'ajax_' : '', 'loginpass" name="passwrd" value="', $context['default_password'], '" size="20">
51
						</dd>
52
					</dl>
53
					<dl>
54
						<dt>', $txt['time_logged_in'], ':</dt>
55
						<dd>
56
							<select name="cookielength" id="cookielength">';
57
58
	foreach ($context['login_cookie_times'] as $cookie_time => $cookie_txt)
59
		echo '
60
								<option value="', $cookie_time, '"', $modSettings['cookieTime'] == $cookie_time ? ' selected' : '', '>', $txt[$cookie_txt], '</option>';
61
62
	echo '
63
							</select>
64
						</dd>';
65
66
	// If they have deleted their account, give them a chance to change their mind.
67
	if (isset($context['login_show_undelete']))
68
		echo '
69
						<dt class="alert">', $txt['undelete_account'], ':</dt>
70
						<dd><input type="checkbox" name="undelete"></dd>';
71
72
	echo '
73
					</dl>
74
					<p>
75
						<input type="submit" value="', $txt['login'], '" class="button">
76
					</p>
77
					<p class="smalltext">
78
						<a href="', $scripturl, '?action=reminder">', $txt['forgot_your_password'], '</a>
79
					</p>
80
					<input type="hidden" name="hash_passwrd" value="">
81
					<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '">
82
					<input type="hidden" name="', $context['login_token_var'], '" value="', $context['login_token'], '">
83
					<script>
84
						setTimeout(function() {
85
							document.getElementById("', !empty($context['from_ajax']) ? 'ajax_' : '', isset($context['default_username']) && $context['default_username'] != '' ? 'loginpass' : 'loginuser', '").focus();
86
						}, 150);';
87
88
	if (!empty($context['from_ajax']))
89
		echo '
90
						form = $("#frmLogin");
91
						form.submit(function(e) {
92
							e.preventDefault();
93
							e.stopPropagation();
94
95
							$.ajax({
96
								url: form.prop("action"),
97
								method: "POST",
98
								data: form.serialize(),
99
								success: function(data) {
100
									if (data.indexOf("<bo" + "dy") > -1) {
101
										document.open();
102
										document.write(data);
103
										document.close();
104
									}
105
									else
106
										form.parent().html($(data).find(".roundframe").html());
107
								},
108
								error: function(xhr) {
109
									var data = xhr.responseText;
110
									if (data.indexOf("<bo" + "dy") > -1) {
111
										document.open();
112
										document.write(data);
113
										document.close();
114
									}
115
									else
116
										form.parent().html($(data).filter("#fatal_error").html());
117
								}
118
							});
119
120
							return false;
121
						});';
122
123
	echo '
124
					</script>
125
				</form>';
126
127
	// It is a long story as to why we have this when we're clearly not going to use it.
128
	if (!empty($context['from_ajax']))
129
		echo '
130
				<br>
131
				<a href="javascript:self.close();"></a>';
132
133
	echo '
134
			</div><!-- .roundframe -->
135
		</div><!-- .login -->';
136
}
137
138
/**
139
 * TFA authentication form
140
 */
141
function template_login_tfa()
142
{
143
	global $context, $scripturl, $txt;
144
145
	echo '
146
		<div class="login">
147
			<div class="cat_bar">
148
				<h3 class="catbg">
149
					', $txt['tfa_profile_label'], '
150
				</h3>
151
			</div>
152
			<div class="roundframe">';
153
154
	if (!empty($context['tfa_error']) || !empty($context['tfa_backup_error']))
155
		echo '
156
				<div class="error">
157
					', $txt['tfa_' . (!empty($context['tfa_error']) ? 'code_' : 'backup_') . 'invalid'], '
158
				</div>';
159
160
	echo '
161
				<form action="', $context['tfa_url'], '" method="post" id="frmTfa">
162
					<div id="tfaCode">
163
						<p style="margin-bottom: 0.5em">', $txt['tfa_login_desc'], '</p>
164
						<div class="centertext">
165
							<strong>', $txt['tfa_code'], ':</strong>
166
							<input type="text" name="tfa_code" value="', !empty($context['tfa_value']) ? $context['tfa_value'] : '', '">
167
							<input type="submit" class="button" name="submit" value="', $txt['login'], '">
168
						</div>
169
						<hr>
170
						<div class="centertext">
171
							<input type="button" class="button" name="backup" value="', $txt['tfa_backup'], '">
172
						</div>
173
					</div>
174
					<div id="tfaBackup" style="display: none;">
175
						<p style="margin-bottom: 0.5em">', $txt['tfa_backup_desc'], '</p>
176
						<div class="centertext">
177
							<strong>', $txt['tfa_backup_code'], ': </strong>
178
							<input type="text" name="tfa_backup" value="', !empty($context['tfa_backup']) ? $context['tfa_backup'] : '', '">
179
							<input type="submit" class="button" name="submit" value="', $txt['login'], '">
180
						</div>
181
					</div>
182
				</form>
183
				<script>
184
					form = $("#frmTfa");';
185
186
	if (!empty($context['from_ajax']))
187
		echo '
188
					form.submit(function(e) {
189
						// If we are submitting backup code, let normal workflow follow since it redirects a couple times into a different page
190
						if (form.find("input[name=tfa_backup]:first").val().length > 0)
191
							return true;
192
193
						e.preventDefault();
194
						e.stopPropagation();
195
196
						$.post(form.prop("action"), form.serialize(), function(data) {
197
							if (data.indexOf("<bo" + "dy") > -1)
198
								document.location = ', JavaScriptEscape(!empty($_SESSION['login_url']) ? $_SESSION['login_url'] : $scripturl), ';
199
							else {
200
								form.parent().html($(data).find(".roundframe").html());
201
							}
202
						});
203
204
						return false;
205
					});';
206
207
	echo '
208
					form.find("input[name=backup]").click(function(e) {
209
						$("#tfaBackup").show();
210
						$("#tfaCode").hide();
211
					});
212
				</script>
213
			</div><!-- .roundframe -->
214
		</div><!-- .login -->';
215
}
216
217
/**
218
 * Tell a guest to get lost or login!
219
 */
220
function template_kick_guest()
221
{
222
	global $context, $settings, $scripturl, $modSettings, $txt;
223
224
	// This isn't that much... just like normal login but with a message at the top.
225
	echo '
226
	<form action="', $context['login_url'], '" method="post" accept-charset="', $context['character_set'], '" name="frmLogin" id="frmLogin">
227
		<div class="login">
228
			<div class="cat_bar">
229
				<h3 class="catbg">', $txt['warning'], '</h3>
230
			</div>';
231
232
	// Show the message or default message.
233
	echo '
234
			<p class="information centertext">
235
				', empty($context['kick_message']) ? $txt['only_members_can_access'] : $context['kick_message'], '<br>';
236
237
	if ($context['can_register'])
238
		echo sprintf($txt['login_below_or_register'], $scripturl . '?action=signup', $context['forum_name_html_safe']);
239
	else
240
		echo $txt['login_below'];
241
242
	// And now the login information.
243
	echo '
244
			<div class="cat_bar">
245
				<h3 class="catbg">
246
					<img src="', $settings['images_url'], '/icons/login_hd.png" alt="" class="icon"> ', $txt['login'], '
247
				</h3>
248
			</div>
249
			<div class="roundframe">
250
				<dl>
251
					<dt>', $txt['username'], ':</dt>
252
					<dd><input type="text" name="user" size="20"></dd>
253
					<dt>', $txt['password'], ':</dt>
254
					<dd><input type="password" name="passwrd" size="20"></dd>
255
					<dt>', $txt['time_logged_in'], ':</dt>
256
					<dd>
257
							<select name="cookielength" id="cookielength">';
258
259
	foreach ($context['login_cookie_times'] as $cookie_time => $cookie_txt)
260
		echo '
261
								<option value="', $cookie_time, '"', $modSettings['cookieTime'] == $cookie_time ? ' selected' : '', '>', $txt[$cookie_txt], '</option>';
262
263
	echo '
264
							</select>
265
					</dd>
266
				</dl>
267
				<p class="centertext">
268
					<input type="submit" value="', $txt['login'], '" class="button">
269
				</p>
270
				<p class="centertext smalltext">
271
					<a href="', $scripturl, '?action=reminder">', $txt['forgot_your_password'], '</a>
272
				</p>
273
			</div>
274
			<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '">
275
			<input type="hidden" name="', $context['login_token_var'], '" value="', $context['login_token'], '">
276
			<input type="hidden" name="hash_passwrd" value="">
277
		</div><!-- .login -->
278
	</form>';
279
280
	// Do the focus thing...
281
	echo '
282
	<script>
283
		document.forms.frmLogin.user.focus();
284
	</script>';
285
}
286
287
/**
288
 * This is for maintenance mode.
289
 */
290
function template_maintenance()
291
{
292
	global $context, $settings, $txt, $modSettings;
293
294
	// Display the administrator's message at the top.
295
	echo '
296
	<form action="', $context['login_url'], '" method="post" accept-charset="', $context['character_set'], '">
297
		<div class="login" id="maintenance_mode">
298
			<div class="cat_bar">
299
				<h3 class="catbg">', $context['title'], '</h3>
300
			</div>
301
			<div class="information">
302
				<img class="floatleft" src="', $settings['images_url'], '/construction.png" width="40" height="40" alt="', $txt['in_maintain_mode'], '">
303
				', $context['description'], '<br class="clear">
304
			</div>
305
			<div class="title_bar">
306
				<h4 class="titlebg">', $txt['admin_login'], '</h4>
307
			</div>
308
			<div class="roundframe">
309
				<dl>
310
					<dt>', $txt['username'], ':</dt>
311
					<dd><input type="text" name="user" size="20"></dd>
312
					<dt>', $txt['password'], ':</dt>
313
					<dd><input type="password" name="passwrd" size="20"></dd>
314
					<dt>', $txt['time_logged_in'], ':</dt>
315
					<dd>
316
							<select name="cookielength" id="cookielength">';
317
318
	foreach ($context['login_cookie_times'] as $cookie_time => $cookie_txt)
319
		echo '
320
								<option value="', $cookie_time, '"', $modSettings['cookieTime'] == $cookie_time ? ' selected' : '', '>', $txt[$cookie_txt], '</option>';
321
322
	echo '
323
							</select>
324
					</dd>
325
				</dl>
326
				<input type="submit" value="', $txt['login'], '" class="button">
327
				<br class="clear">
328
			</div>
329
			<input type="hidden" name="hash_passwrd" value="">
330
			<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '">
331
			<input type="hidden" name="', $context['login_token_var'], '" value="', $context['login_token'], '">
332
		</div><!-- #maintenance_mode -->
333
	</form>';
334
}
335
336
/**
337
 * This is for the security stuff - makes administrators login every so often.
338
 */
339
function template_admin_login()
340
{
341
	global $context, $settings, $scripturl, $txt, $modSettings;
342
343
	// Since this should redirect to whatever they were doing, send all the get data.
344
	echo '
345
	<form action="', !empty($modSettings['force_ssl']) ? strtr($scripturl, array('http://' => 'https://')) : $scripturl, $context['get_data'], '" method="post" accept-charset="', $context['character_set'], '" name="frmLogin" id="frmLogin">
346
		<div class="login" id="admin_login">
347
			<div class="cat_bar">
348
				<h3 class="catbg">
349
					<img src="', $settings['images_url'], '/icons/login_hd.png" alt="" class="icon"> ', $txt['login'], '
350
				</h3>
351
			</div>
352
			<div class="roundframe centertext">';
353
354
	if (!empty($context['incorrect_password']))
355
		echo '
356
				<div class="error">', $txt['admin_incorrect_password'], '</div>';
357
358
	echo '
359
				<strong>', $txt['password'], ':</strong>
360
				<input type="password" name="', $context['sessionCheckType'], '_pass" size="24">
361
				<a href="', $scripturl, '?action=helpadmin;help=securityDisable_why" onclick="return reqOverlayDiv(this.href);" class="help"><span class="main_icons help" title="', $txt['help'], '"></span></a><br>
362
				<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '">
363
				<input type="hidden" name="', $context['admin-login_token_var'], '" value="', $context['admin-login_token'], '">
364
				<input type="submit" value="', $txt['login'], '" class="button">';
365
366
	// Make sure to output all the old post data.
367
	echo $context['post_data'], '
368
			</div><!-- .roundframe -->
369
		</div><!-- #admin_login -->
370
		<input type="hidden" name="', $context['sessionCheckType'], '_hash_pass" value="">
371
	</form>';
372
373
	// Focus on the password box.
374
	echo '
375
	<script>
376
		document.forms.frmLogin.', $context['sessionCheckType'], '_pass.focus();
377
	</script>';
378
}
379
380
/**
381
 * Activate your account manually?
382
 */
383
function template_retry_activate()
384
{
385
	global $context, $txt, $scripturl;
386
387
	// Just ask them for their code so they can try it again...
388
	echo '
389
		<form action="', $scripturl, '?action=activate;u=', $context['member_id'], '" method="post" accept-charset="', $context['character_set'], '">
390
			<div class="title_bar">
391
				<h3 class="titlebg">', $context['page_title'], '</h3>
392
			</div>
393
			<div class="roundframe">
394
				<dl>';
395
396
	// You didn't even have an ID?
397
	if (empty($context['member_id']))
398
		echo '
399
					<dt>', $txt['invalid_activation_username'], ':</dt>
400
					<dd><input type="text" name="user" size="30"></dd>';
401
402
	echo '
403
					<dt>', $txt['invalid_activation_retry'], ':</dt>
404
					<dd><input type="text" name="code" size="30"></dd>
405
				</dl>
406
				<p><input type="submit" value="', $txt['invalid_activation_submit'], '" class="button"></p>
407
			</div>
408
		</form>';
409
}
410
411
/**
412
 * The form for resending the activation code.
413
 */
414
function template_resend()
415
{
416
	global $context, $txt, $scripturl;
417
418
	// Just ask them for their code so they can try it again...
419
	echo '
420
		<form action="', $scripturl, '?action=activate;sa=resend" method="post" accept-charset="', $context['character_set'], '">
421
			<div class="title_bar">
422
				<h3 class="titlebg">', $context['page_title'], '</h3>
423
			</div>
424
			<div class="roundframe">
425
				<dl>
426
					<dt>', $txt['invalid_activation_username'], ':</dt>
427
					<dd><input type="text" name="user" size="40" value="', $context['default_username'], '"></dd>
428
				</dl>
429
				<p>', $txt['invalid_activation_new'], '</p>
430
				<dl>
431
					<dt>', $txt['invalid_activation_new_email'], ':</dt>
432
					<dd><input type="text" name="new_email" size="40"></dd>
433
					<dt>', $txt['invalid_activation_password'], ':</dt>
434
					<dd><input type="password" name="passwd" size="30"></dd>
435
				</dl>';
436
437
	if ($context['can_activate'])
438
		echo '
439
				<p>', $txt['invalid_activation_known'], '</p>
440
				<dl>
441
					<dt>', $txt['invalid_activation_retry'], ':</dt>
442
					<dd><input type="text" name="code" size="30"></dd>
443
				</dl>';
444
445
	echo '
446
				<p><input type="submit" value="', $txt['invalid_activation_resend'], '" class="button"></p>
447
			</div><!-- .roundframe -->
448
		</form>';
449
}
450
451
/**
452
 * Confirm a logout.
453
 */
454
function template_logout()
455
{
456
	global $context, $settings, $scripturl, $modSettings, $txt;
457
458
	// This isn't that much... just like normal login but with a message at the top.
459
	echo '
460
	<form action="', $scripturl . '?action=logout;', $context['session_var'], '=', $context['session_id'], '" method="post" accept-charset="', $context['character_set'], '" name="frmLogout" id="frmLogout">
461
		<div class="logout">
462
			<div class="cat_bar">
463
				<h3 class="catbg">', $txt['logout_confirm'], '</h3>
464
			</div>
465
			<div class="roundframe">
466
				<p class="information centertext">
467
					', $txt['logout_notice'], '
468
				</p>
469
470
				<p class="centertext">
471
					<input type="submit" value="', $txt['logout'], '" class="button">
472
					<input type="submit" name="cancel" value="', $txt['logout_return'], '" class="button">
473
				</p>
474
				</div>
475
			</p>
476
		</div><!-- .logout -->
477
	</form>';
478
}
479
480
?>