1<?php
2/**
3 * @package tikiwiki
4 */
5// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
6//
7// All Rights Reserved. See copyright.txt for details and a complete list of authors.
8// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
9// $Id$
10
11$section = 'mytiki';
12require_once('tiki-setup.php');
13$modlib = TikiLib::lib('mod');
14$userprefslib = TikiLib::lib('userprefs');
15$perspectivelib = TikiLib::lib('perspective');
16
17use BaconQrCode\Renderer\Image\SvgImageBackEnd;
18use PragmaRX\Google2FA\Google2FA;
19use BaconQrCode\Renderer\ImageRenderer;
20use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
21use BaconQrCode\Renderer\RendererStyle\RendererStyle;
22use BaconQrCode\Writer;
23
24// User preferences screen
25if ($prefs['feature_userPreferences'] != 'y' && $prefs['change_password'] != 'y' && $tiki_p_admin_users != 'y') {
26	$smarty->assign('msg', tra("This feature is disabled") . ": feature_userPreferences");
27	$smarty->display("error.tpl");
28	die;
29}
30$access->check_user($user);
31
32$auto_query_args = ['userId', 'view_user'];
33
34$headerlib->add_map();
35
36// Make sure user preferences uses https if set
37if (! $https_mode && isset($https_login) && $https_login == 'required') {
38	header('Location: ' . $base_url_https . 'tiki-user_preferences.php');
39	die;
40}
41if (! empty($_REQUEST['userId'])) {
42	$userwatch = $tikilib->get_user_login($_REQUEST['userId']);
43} elseif (! empty($_REQUEST["view_user"])) {
44	$userwatch = $_REQUEST["view_user"];
45} else {
46	$userwatch = $user;
47}
48
49if ($userwatch != $user) {
50	$access->check_permission('tiki_p_admin_users');
51	if (empty($userwatch) || empty($userlib->user_exists($userwatch))) {
52		$smarty->assign('msg', tra("Unknown user"));
53		$smarty->display("error.tpl");
54		die;
55	}
56}
57
58// Custom fields
59$registrationlib = TikiLib::lib('registration');
60$customfields = $registrationlib->get_customfields();
61foreach ($customfields as $i => $c) {
62	$customfields[$i]['value'] = $tikilib->get_user_preference($userwatch, $c['prefName']);
63}
64$smarty->assign_by_ref('customfields', $customfields);
65$smarty->assign('userwatch', $userwatch);
66$foo = parse_url($_SERVER["REQUEST_URI"]);
67$foo1 = str_replace("tiki-user_preferences", "tiki-editpage", $foo["path"]);
68$foo2 = str_replace("tiki-user_preferences", "tiki-index", $foo["path"]);
69$smarty->assign('url_edit', $tikilib->httpPrefix() . $foo1);
70$smarty->assign('url_visit', $tikilib->httpPrefix() . $foo2);
71$smarty->assign('show_mouseover_user_info', isset($prefs['show_mouseover_user_info']) ? $prefs['show_mouseover_user_info'] : $prefs['feature_community_mouseover']);
72
73if ($prefs['feature_perspective'] === 'y') {
74	$smarty->assign('perspectives', $perspectivelib->list_perspectives());
75}
76
77// form in first tab "Personal Information"
78if ($prefs['feature_userPreferences'] == 'y' && isset($_POST["new_info"]) && $access->checkOrigin()) {
79	if (isset($_POST["realName"]) && ($prefs['auth_ldap_nameattr'] == '' || $prefs['auth_method'] != 'ldap')) {
80		$tikilib->set_user_preference($userwatch, 'realName', $_POST["realName"]);
81		if ($prefs['user_show_realnames'] == 'y') {
82			$cachelib = TikiLib::lib('cache');
83			$cachelib->invalidate('userlink.' . $user . '0');
84		}
85	}
86
87	if ($prefs['feature_community_gender'] == 'y') {
88		if (isset($_POST["gender"])) {
89			$tikilib->set_user_preference($userwatch, 'gender', $_POST["gender"]);
90		}
91	}
92
93	$tikilib->set_user_preference($userwatch, 'country', $_POST["country"]);
94
95	if (isset($_POST['location'])) {
96		if ($coords = TikiLib::lib('geo')->parse_coordinates($_POST['location'])) {
97			$tikilib->set_user_preference($userwatch, 'lat', $coords['lat']);
98			$tikilib->set_user_preference($userwatch, 'lon', $coords['lon']);
99			if (isset($coords['zoom'])) {
100				$tikilib->set_user_preference($userwatch, 'zoom', $coords['zoom']);
101			}
102		}
103	}
104
105	if (isset($_POST["homePage"])) {
106		$tikilib->set_user_preference($userwatch, 'homePage', $_POST["homePage"]);
107	}
108
109	$tikilib->set_user_preference($userwatch, 'user_information', $_POST['user_information']);
110
111}
112
113if ($prefs['feature_userPreferences'] == 'y' && isset($_REQUEST["new_prefs"]) && $access->checkOrigin()) {
114	check_ticket('user-prefs');
115	// setting preferences
116	if ($prefs['change_theme'] == 'y' && empty($group_theme)) {
117		if (isset($_REQUEST['mytheme'])) {
118			$themeandoption = $themelib->extract_theme_and_option($_REQUEST['mytheme']);
119			$theme = $themeandoption[0];
120			$themeOption = $themeandoption[1];
121			$tikilib->set_user_preference($userwatch, 'theme', $theme);
122			if (isset($themeOption)) {
123				$tikilib->set_user_preference($userwatch, 'theme_option', empty($themeOption) ? '' : $themeOption);
124			}
125			//Something is needed for the theme change to be displayed without additional manual page refresh. Problem: when modifying another user's settings (not my user's) using any of the below ways the refreshed screen will show my user's preference screen instead of staying on the edited user's preference screen
126			//header("location: tiki-user_preferences.php?view_user=$userwatch");
127			//$access->redirect($_SERVER['REQUEST_URI'], '', 200);
128		}
129	}
130	if (isset($_REQUEST["userbreadCrumb"])) {
131		$tikilib->set_user_preference($userwatch, 'userbreadCrumb', $_REQUEST["userbreadCrumb"]);
132	}
133	$langLib = TikiLib::lib('language');
134	if (isset($_REQUEST["language"]) && $langLib->is_valid_language($_REQUEST['language'])) {
135		if ($tiki_p_admin || $prefs['change_language'] == 'y') {
136			$tikilib->set_user_preference($userwatch, 'language', $_REQUEST["language"]);
137		}
138		if ($userwatch == $user) {
139			include('lang/' . $_REQUEST["language"] . '/language.php');
140		}
141	} else {
142		$tikilib->set_user_preference($userwatch, 'language', '');
143	}
144	$smarty->assign('tiki_p_admin', $tiki_p_admin);
145	if ($tiki_p_admin && isset($_REQUEST['languageAdmin']) && $langLib->is_valid_language($_REQUEST['languageAdmin'])) {
146		$tikilib->set_user_preference($userwatch, 'language_admin', $_REQUEST['languageAdmin']);
147	} else {
148		$tikilib->set_user_preference($userwatch, 'language_admin', '');
149	}
150	if (isset($_REQUEST['read_language'])) {
151		$list = [];
152		$tok = strtok($_REQUEST['read_language'], ' ');
153		while (false !== $tok) {
154			$list[] = $tok;
155			$tok = strtok(' ');
156		}
157		$list = array_unique($list);
158		$langLib = TikiLib::lib('language');
159		$list = array_filter($list, [$langLib, 'is_valid_language']);
160		$list = implode(' ', $list);
161		$tikilib->set_user_preference($userwatch, 'read_language', $list);
162	}
163	if (isset($_REQUEST['display_timezone'])) {
164		$tikilib->set_user_preference($userwatch, 'display_timezone', $_REQUEST['display_timezone']);
165	}
166
167	if (isset($_REQUEST['display_12hr_clock']) && $_REQUEST['display_12hr_clock'] == 'on') {
168		$tikilib->set_user_preference($userwatch, 'display_12hr_clock', 'y');
169		$smarty->assign('display_12hr_clock', 'y');
170	} else {
171		$tikilib->set_user_preference($userwatch, 'display_12hr_clock', 'n');
172		$smarty->assign('display_12hr_clock', 'n');
173	}
174	if (isset($_REQUEST['diff_versions']) && $_REQUEST['diff_versions'] == 'on') {
175		$tikilib->set_user_preference($userwatch, 'diff_versions', 'y');
176		$smarty->assign('diff_versions', 'y');
177	} else {
178		$tikilib->set_user_preference($userwatch, 'diff_versions', 'n');
179		$smarty->assign('diff_versions', 'n');
180	}
181	if ($prefs['feature_community_mouseover'] == 'y') {
182		if (isset($_REQUEST['show_mouseover_user_info']) && $_REQUEST['show_mouseover_user_info'] == 'on') {
183			$tikilib->set_user_preference($userwatch, 'show_mouseover_user_info', 'y');
184			$smarty->assign('show_mouseover_user_info', 'y');
185		} else {
186			$tikilib->set_user_preference($userwatch, 'show_mouseover_user_info', 'n');
187			$smarty->assign('show_mouseover_user_info', 'n');
188		}
189	}
190
191	$tikilib->set_user_preference($userwatch, 'remember_closed_rboxes', empty($_REQUEST['remember_closed_rboxes']) ? 'n' : 'y');
192
193	$email_isPublic = isset($_REQUEST['email_isPublic']) ? $_REQUEST['email_isPublic'] : 'n';
194	$tikilib->set_user_preference($userwatch, 'email is public', $email_isPublic);
195	$tikilib->set_user_preference($userwatch, 'mailCharset', $_REQUEST['mailCharset']);
196	// Custom fields
197	foreach ($customfields as $custpref => $prefvalue) {
198		if (isset($_REQUEST[$customfields[$custpref]['prefName']])) {
199			$tikilib->set_user_preference($userwatch, $customfields[$custpref]['prefName'], $_REQUEST[$customfields[$custpref]['prefName']]);
200		}
201	}
202	// Custom fields
203	foreach ($customfields as $custpref => $prefvalue) {
204		// print $customfields[$custpref]['prefName'];
205		// print $_REQUEST[$customfields[$custpref]['prefName']];
206		$tikilib->set_user_preference($userwatch, $customfields[$custpref]['prefName'], $_REQUEST[$customfields[$custpref]['prefName']]);
207	}
208
209	if (isset($_REQUEST['mess_maxRecords'])) {
210		$tikilib->set_user_preference($userwatch, 'mess_maxRecords', $_REQUEST['mess_maxRecords']);
211	}
212	if (isset($_REQUEST['mess_archiveAfter'])) {
213		$tikilib->set_user_preference($userwatch, 'mess_archiveAfter', $_REQUEST['mess_archiveAfter']);
214	}
215	if (isset($_REQUEST['mess_sendReadStatus']) && $_REQUEST['mess_sendReadStatus'] == 'on') {
216		$tikilib->set_user_preference($userwatch, 'mess_sendReadStatus', 'y');
217	} else {
218		$tikilib->set_user_preference($userwatch, 'mess_sendReadStatus', 'n');
219	}
220	if (isset($_REQUEST['minPrio'])) {
221		$tikilib->set_user_preference($userwatch, 'minPrio', $_REQUEST['minPrio']);
222	}
223	if ($prefs['allowmsg_is_optional'] == 'y') {
224		if (isset($_REQUEST['allowMsgs']) && $_REQUEST['allowMsgs'] == 'on') {
225			$tikilib->set_user_preference($userwatch, 'allowMsgs', 'y');
226		} else {
227			$tikilib->set_user_preference($userwatch, 'allowMsgs', 'n');
228		}
229	}
230	if (isset($_REQUEST['mytiki_pages']) && $_REQUEST['mytiki_pages'] == 'on') {
231		$tikilib->set_user_preference($userwatch, 'mytiki_pages', 'y');
232	} else {
233		$tikilib->set_user_preference($userwatch, 'mytiki_pages', 'n');
234	}
235	if (isset($_REQUEST['mytiki_blogs']) && $_REQUEST['mytiki_blogs'] == 'on') {
236		$tikilib->set_user_preference($userwatch, 'mytiki_blogs', 'y');
237	} else {
238		$tikilib->set_user_preference($userwatch, 'mytiki_blogs', 'n');
239	}
240	if (isset($_REQUEST['mytiki_gals']) && $_REQUEST['mytiki_gals'] == 'on') {
241		$tikilib->set_user_preference($userwatch, 'mytiki_gals', 'y');
242	} else {
243		$tikilib->set_user_preference($userwatch, 'mytiki_gals', 'n');
244	}
245	if (isset($_REQUEST['mytiki_msgs']) && $_REQUEST['mytiki_msgs'] == 'on') {
246		$tikilib->set_user_preference($userwatch, 'mytiki_msgs', 'y');
247	} else {
248		$tikilib->set_user_preference($userwatch, 'mytiki_msgs', 'n');
249	}
250	if (isset($_REQUEST['mytiki_tasks']) && $_REQUEST['mytiki_tasks'] == 'on') {
251		$tikilib->set_user_preference($userwatch, 'mytiki_tasks', 'y');
252	} else {
253		$tikilib->set_user_preference($userwatch, 'mytiki_tasks', 'n');
254	}
255	if (isset($_REQUEST['mytiki_forum_topics']) && $_REQUEST['mytiki_forum_topics'] == 'on') {
256		$tikilib->set_user_preference($userwatch, 'mytiki_forum_topics', 'y');
257	} else {
258		$tikilib->set_user_preference($userwatch, 'mytiki_forum_topics', 'n');
259	}
260	if (isset($_REQUEST['mytiki_forum_replies']) && $_REQUEST['mytiki_forum_replies'] == 'on') {
261		$tikilib->set_user_preference($userwatch, 'mytiki_forum_replies', 'y');
262	} else {
263		$tikilib->set_user_preference($userwatch, 'mytiki_forum_replies', 'n');
264	}
265	if (isset($_REQUEST['mytiki_items']) && $_REQUEST['mytiki_items'] == 'on') {
266		$tikilib->set_user_preference($userwatch, 'mytiki_items', 'y');
267	} else {
268		$tikilib->set_user_preference($userwatch, 'mytiki_items', 'n');
269	}
270	if (isset($_REQUEST['mytiki_articles']) && $_REQUEST['mytiki_articles'] == 'on') {
271		$tikilib->set_user_preference($userwatch, 'mytiki_articles', 'y');
272	} else {
273		$tikilib->set_user_preference($userwatch, 'mytiki_articles', 'n');
274	}
275	if (isset($_REQUEST['tasks_maxRecords'])) {
276		$tikilib->set_user_preference($userwatch, 'tasks_maxRecords', $_REQUEST['tasks_maxRecords']);
277	}
278	if ($prefs['feature_intertiki'] == 'y' && ! empty($prefs['feature_intertiki_mymaster']) && $prefs['feature_intertiki_import_preferences'] == 'y') { //send to the master
279		$userlib->interSendUserInfo($prefs['interlist'][$prefs['feature_intertiki_mymaster']], $userwatch);
280	}
281
282	if (isset($_REQUEST['xmpp_jid'])) {
283		$tikilib->set_user_preference($userwatch, 'xmpp_jid', $_REQUEST['xmpp_jid']);
284	}
285	if (isset($_REQUEST['xmpp_password'])) {
286		$tikilib->set_user_preference($userwatch, 'xmpp_password', $_REQUEST['xmpp_password']);
287	}
288	if (isset($_REQUEST['xmpp_custom_server_http_bind'])) {
289		$tikilib->set_user_preference($userwatch, 'xmpp_custom_server_http_bind', $_REQUEST['xmpp_custom_server_http_bind']);
290	}
291
292	if (isset($_REQUEST['perspective_preferred']) &&  $perspectivelib->perspective_exists($_REQUEST['perspective_preferred'])) {
293		$tikilib->set_user_preference($userwatch, 'perspective_preferred', $_REQUEST['perspective_preferred']);
294	} else {
295		$tikilib->set_user_preference($userwatch, 'perspective_preferred', null);
296	}
297
298	TikiLib::events()->trigger(
299		'tiki.user.update',
300		[
301			'type' => 'user',
302			'object' => $userwatch,
303			'user' => $GLOBALS['user'],
304		]
305	);
306}
307if ($prefs['auth_method'] == 'ldap' && $user == 'admin' && $prefs['ldap_skip_admin'] == 'y') {
308	$change_password = 'y';
309	$smarty->assign('change_password', $change_password);
310}
311
312
313$tfaSecret = $userlib->get_2_factor_secret($userwatch);
314if (isset($_REQUEST['chgadmin']) && $access->checkOrigin()) {
315	check_ticket('user-prefs');
316	if (isset($_REQUEST['pass'])) {
317		$pass = $_REQUEST['pass'];
318	} else {
319		$pass = '';
320	}
321	// check user's password, admin doesn't need it to change other user's info
322	if ($tiki_p_admin != 'y' || $user == $userwatch) {
323		if ($prefs['feature_intertiki'] == 'y' && ! empty($prefs['feature_intertiki_mymaster'])) {
324			if ($ok = $userlib->intervalidate($prefs['interlist'][$prefs['feature_intertiki_mymaster']], $userwatch, $pass)) {
325				if ($ok->faultCode()) {
326					$ok = false;
327				}
328			}
329		} else {
330			list($ok, $userwatch, $error) = $userlib->validate_user($userwatch, $pass);
331		}
332		if (! $ok) {
333			$smarty->assign('msg', tra("Invalid password. Your current password is required to change administrative information"));
334			$smarty->display("error.tpl");
335			die;
336		}
337	}
338	if (! empty($_REQUEST['email']) && ($prefs['login_is_email'] != 'y' || $user == 'admin') && $_REQUEST['email'] != $userlib->get_user_email($userwatch)) {
339		if (validate_email($_REQUEST['email'])) {
340			$userlib->change_user_email($userwatch, $_REQUEST['email'], $pass);
341			Feedback::success(sprintf(tra('Email is set to %s'), $_REQUEST['email']));
342			if ($prefs['feature_intertiki'] == 'y' && ! empty($prefs['feature_intertiki_mymaster']) && $prefs['feature_intertiki_import_preferences'] == 'y') { //send to the master
343				$userlib->interSendUserInfo($prefs['interlist'][$prefs['feature_intertiki_mymaster']], $userwatch);
344			}
345		} else {
346			Feedback::error(tr('Invalid email address "%0"', $_REQUEST['email']));
347		}
348	}
349	// If user has provided new password, let's try to change
350	if (! empty($_REQUEST["pass1"])) {
351		if ($_REQUEST["pass1"] != $_REQUEST["pass2"]) {
352			$smarty->assign('msg', tra("The passwords did not match"));
353			$smarty->display("error.tpl");
354			die;
355		}
356		$polerr = $userlib->check_password_policy($_REQUEST["pass1"]);
357		if (strlen($polerr) > 0) {
358			$smarty->assign('msg', $polerr);
359			$smarty->display("error.tpl");
360			die;
361		}
362		$userlib->change_user_password($userwatch, $_REQUEST["pass1"]);
363		if ($prefs['feature_user_encryption'] === 'y') {
364			// Notify CryptLib about the login
365			$cryptlib = TikiLib::lib('crypt');
366			$cryptlib->onChangeUserPassword($_REQUEST["pass"], $_REQUEST["pass1"]);
367		}
368		Feedback::success(sprintf(tra('Password has been changed')));
369	}
370
371	if (! empty($_REQUEST["tfaEnable"]) && empty($tfaSecret)) {
372		$tfaSecret = $userlib->generate_2_factor_secret($userwatch);
373	} elseif (empty($_REQUEST["tfaEnable"])) {
374		$tfaSecret = $userlib->remove_2_factor_secret($userwatch);
375	}
376}
377
378$userinfo = $userlib->get_user_info($userwatch);
379
380if ($prefs['twoFactorAuth'] == 'y' && ! empty($tfaSecret)) {
381	$google2fa = new Google2FA();
382	$smarty->assign('tfaSecretQR', $tfaSecret);
383	$g2faUrl = $google2fa->getQRCodeUrl(
384		$tikilib->get_preference('browsertitle', "Tiki Wiki"),
385		$userinfo['email'],
386		$tfaSecret
387	);
388
389	if (extension_loaded('imagick')) {
390		$imageBackEnd = new ImagickImageBackEnd();
391		$imageType = 'png';
392	} else {
393		$imageBackEnd = new SvgImageBackEnd();
394		$imageType = 'svg+xml';
395	}
396
397	$writer = new Writer(
398		new ImageRenderer(
399			new RendererStyle(350),
400			$imageBackEnd
401		)
402	);
403	$tfaSecretQR = base64_encode($writer->writeString($g2faUrl));
404	$tfaSecretQR = '<img src="data:image/' . $imageType . ';base64,' . $tfaSecretQR . '"/>';
405	$smarty->assign('tfaSecretQR', $tfaSecretQR);
406}
407
408if (isset($_REQUEST['deleteaccount']) && $tiki_p_delete_account == 'y' && $access->checkOrigin()) {
409	check_ticket('user-prefs');
410	if (! isset($_REQUEST['deleteaccountconfirm']) || $_REQUEST['deleteaccountconfirm'] != '1') {
411		$smarty->assign('msg', tra("If you really want to delete your account, you must check the checkbox"));
412		$smarty->display("error.tpl");
413		die;
414	}
415	$userlib->remove_user($userwatch);
416	if ($user == $userwatch) {
417		header('Location: tiki-logout.php');
418	} elseif ($tiki_p_admin_users == 'y') {
419		header('Location: tiki-adminusers.php');
420	} else {
421		header("Location: $base_url");
422	}
423	die();
424}
425
426if (! empty($_POST)) {
427	// This avoids accident form ressubmission
428	header('Location:' . basename(__FILE__));
429	return;
430}
431
432
433/**
434 * Don't do any write operation from here
435 */
436
437
438$location = [
439	'lat' => (float) $tikilib->get_user_preference($userwatch, 'lat', ''),
440	'lon' => (float) $tikilib->get_user_preference($userwatch, 'lon', ''),
441	'zoom' => (int) $tikilib->get_user_preference($userwatch, 'zoom', ''),
442];
443
444$location = TikiLib::lib('geo')->build_location_string($location);
445
446$smarty->assign('location', $location);
447
448$tikilib->get_user_preference($userwatch, 'mytiki_pages', 'y');
449$tikilib->get_user_preference($userwatch, 'mytiki_blogs', 'y');
450$tikilib->get_user_preference($userwatch, 'mytiki_gals', 'y');
451$tikilib->get_user_preference($userwatch, 'mytiki_items', 'y');
452$tikilib->get_user_preference($userwatch, 'mytiki_msgs', 'y');
453$tikilib->get_user_preference($userwatch, 'mytiki_tasks', 'y');
454$tikilib->get_user_preference($userwatch, 'mylevel', '1');
455$tikilib->get_user_preference($userwatch, 'tasks_maxRecords');
456$tikilib->get_user_preference($userwatch, 'mess_maxRecords', 20);
457$tikilib->get_user_preference($userwatch, 'mess_archiveAfter', 0);
458$tikilib->get_user_preference($userwatch, 'mess_sendReadStatus', 0);
459$tikilib->get_user_preference($userwatch, 'allowMsgs', 'y');
460$tikilib->get_user_preference($userwatch, 'minPrio', 3);
461$tikilib->get_user_preference($userwatch, 'theme', '');
462$tikilib->get_user_preference($userwatch, 'language', $prefs['language']);
463$tikilib->get_user_preference($userwatch, 'realName', '');
464if ($prefs['feature_community_gender'] == 'y') {
465	$tikilib->get_user_preference($userwatch, 'gender', 'Hidden');
466}
467$tikilib->get_user_preference($userwatch, 'country', 'Other');
468$tikilib->get_user_preference($userwatch, 'userbreadCrumb', $prefs['site_userbreadCrumb']);
469$tikilib->get_user_preference($userwatch, 'homePage', '');
470$tikilib->get_user_preference($userwatch, 'email is public', 'n');
471if (isset($user_preferences[$userwatch]['email is public'])) {
472	$user_preferences[$userwatch]['email_isPublic'] = $user_preferences[$userwatch]['email is public'];
473}
474$tikilib->get_user_preference($userwatch, 'mailCharset', $prefs['default_mail_charset']);
475$tikilib->get_user_preference($userwatch, 'display_12hr_clock', 'n');
476$smarty->assign_by_ref('userinfo', $userinfo);
477//user theme
478$themelib = TikiLib::lib('theme');
479$available_themesandoptions = $themelib->get_available_themesandoptions();
480$smarty->assign_by_ref('available_themesandoptions', $available_themesandoptions);
481$userwatch_theme = $tikilib->get_user_preference($userwatch, 'theme', null);
482$userwatch_themeOption = $tikilib->get_user_preference($userwatch, 'theme_option', null);
483$smarty->assign_by_ref('userwatch_theme', $userwatch_theme);
484$smarty->assign_by_ref('userwatch_themeOption', $userwatch_themeOption);
485//user language
486$languages = [];
487$langLib = TikiLib::lib('language');
488$languages = $langLib->list_languages();
489$smarty->assign_by_ref('languages', $languages);
490
491$user_pages = $tikilib->get_user_pages($userwatch, -1);
492$smarty->assign_by_ref('user_pages', $user_pages);
493$bloglib = TikiLib::lib('blog');
494$user_blogs = $bloglib->list_user_blogs($userwatch, false);
495$smarty->assign_by_ref('user_blogs', $user_blogs);
496$user_galleries = $tikilib->get_user_galleries($userwatch, -1);
497$smarty->assign_by_ref('user_galleries', $user_galleries);
498$user_items = TikiLib::lib('trk')->get_user_items($userwatch);
499$smarty->assign_by_ref('user_items', $user_items);
500$flags = $tikilib->get_flags('', '', '', true);
501$smarty->assign_by_ref('flags', $flags);
502$scramblingMethods = ["n", "strtr", "unicode", "x", 'y']; // email_isPublic utilizes 'n'
503$smarty->assign_by_ref('scramblingMethods', $scramblingMethods);
504$scramblingEmails = [
505		tra("no"),
506		TikiMail::scrambleEmail($userinfo['email'], 'strtr'),
507		TikiMail::scrambleEmail($userinfo['email'], 'unicode') . "-" . tra("unicode"),
508		TikiMail::scrambleEmail($userinfo['email'], 'x'), $userinfo['email'],
509	];
510$smarty->assign_by_ref('scramblingEmails', $scramblingEmails);
511$avatar = $tikilib->get_user_avatar($userwatch);
512$smarty->assign_by_ref('avatar', $avatar);
513$mailCharsets = ['utf-8', 'iso-8859-1'];
514$smarty->assign_by_ref('mailCharsets', $mailCharsets);
515$smarty->assign_by_ref('user_prefs', $user_preferences[$userwatch]);
516$tikilib->get_user_preference($userwatch, 'user_information', 'public');
517$tikilib->get_user_preference($userwatch, 'diff_versions', 'n');
518$usertrackerId = false;
519$useritemId = false;
520if ($prefs['userTracker'] == 'y') {
521	$re = $userlib->get_usertracker($userinfo["userId"]);
522	if (isset($re['usersTrackerId']) && $re['usersTrackerId'] && Tracker_Definition::get($re['usersTrackerId'])) {
523		$trklib = TikiLib::lib('trk');
524		$info = $trklib->get_item_id($re['usersTrackerId'], $re['usersFieldId'], $userwatch);
525		$usertrackerId = $re['usersTrackerId'];
526		$useritemId = $info;
527	}
528}
529$smarty->assign('usertrackerId', $usertrackerId);
530$smarty->assign('useritemId', $useritemId);
531// Custom fields
532foreach ($customfields as $custpref => $prefvalue) {
533	$customfields[$custpref]['value'] = $tikilib->get_user_preference($userwatch, $customfields[$custpref]['prefName'], $customfields[$custpref]['value']);
534	$smarty->assign($customfields[$custpref]['prefName'], $customfields[$custpref]['value']);
535}
536if ($prefs['feature_messages'] == 'y' && $tiki_p_messages == 'y') {
537	$unread = $tikilib->user_unread_messages($userwatch);
538	$smarty->assign('unread', $unread);
539}
540$smarty->assign('timezones', TikiDate::getTimeZoneList());
541
542$tikilib->set_display_timezone($user);
543
544if (isset($prefs['display_timezone'])) {
545	$smarty->assign('display_timezone', $prefs['display_timezone']);
546}
547
548if ($prefs['users_prefs_display_timezone'] == 'Site') {
549	$smarty->assign('warning_site_timezone_set', 'y');
550} else {
551	$smarty->assign('warning_site_timezone_set', 'n');
552}
553
554$smarty->assign('userPageExists', 'n');
555if ($prefs['feature_wiki'] == 'y' and $prefs['feature_wiki_userpage'] == 'y') {
556	if ($tikilib->page_exists($prefs['feature_wiki_userpage_prefix'] . $user)) {
557		$smarty->assign('userPageExists', 'y');
558	}
559}
560include_once('tiki-section_options.php');
561ask_ticket('user-prefs');
562$smarty->assign('mid', 'tiki-user_preferences.tpl');
563$smarty->display("tiki.tpl");
564