diff --git a/admin/members.php b/admin/members.php
index 11b7f051..5e3e1433 100644
--- a/admin/members.php
+++ b/admin/members.php
@@ -99,52 +99,23 @@
if (noSubmit('membersubmit')) {
if (!$members) {
$body = $template->process('admin_members_search.php');
- } else if ($members == "search") {
+ } elseif ($members == "search") {
$template->token = $token->create('Control Panel/Members', 'mass-edit', $vars::NONCE_FORM_EXP);
$body = $template->process('admin_members_edit_start.php');
$query = $db->query("SELECT * FROM " . $vars->tablepre . "members $where ORDER BY username");
- while($member = $db->fetch_array($query)) {
+ while ($member = $db->fetch_array($query)) {
$template->member = $member;
$template->userLink = recodeOut($member['username']);
$template->statusAttr = attrOut($member['customstatus']);
- $template->sadminselect = '';
- $template->adminselect = '';
- $template->smodselect = '';
- $template->modselect = '';
- $template->memselect = '';
- $template->banselect = '';
+ $template->userStatus = $core->userStatusControl("status{$member['uid']}", $member['status']);
$template->noban = '';
$template->u2uban = '';
$template->postban = '';
$template->bothban = '';
- switch($member['status']) {
- case 'Super Administrator':
- $template->sadminselect = $vars::selHTML;
- break;
- case 'Administrator':
- $template->adminselect = $vars::selHTML;
- break;
- case 'Super Moderator':
- $template->smodselect = $vars::selHTML;
- break;
- case 'Moderator':
- $template->modselect = $vars::selHTML;
- break;
- case 'Member':
- $template->memselect = $vars::selHTML;
- break;
- case 'Banned':
- $template->banselect = $vars::selHTML;
- break;
- default:
- $template->memselect = $vars::selHTML;
- break;
- }
-
switch($member['ban']) {
case 'u2u':
$template->u2uban = $vars::selHTML;
@@ -180,9 +151,9 @@
$template->srchstatus = $srchstatus;
$body .= $template->process('admin_members_edit_end.php');
}
-} else if (onSubmit('membersubmit')) {
+} elseif (onSubmit('membersubmit')) {
$core->request_secure('Control Panel/Members', 'mass-edit', error_header: true);
- $query = $db->query("SELECT uid, username, password, status FROM " . $vars->tablepre . "members $where");
+ $query = $db->query("SELECT uid, username, status FROM " . $vars->tablepre . "members $where");
// Guarantee this request will not remove all Super Administrators.
if (X_SADMIN && $db->num_rows($query) > 0) {
@@ -190,7 +161,7 @@
$sa_count = (int) $db->result($saquery, 0);
$db->free_result($saquery);
- while($mem = $db->fetch_array($query)) {
+ while ($mem = $db->fetch_array($query)) {
if ($mem['status'] == 'Super Administrator' && $core->postedVar('status'.$mem['uid']) != 'Super Administrator') {
$sa_count--;
}
@@ -202,7 +173,7 @@
}
// Now execute this request
- while($mem = $db->fetch_array($query)) {
+ while ($mem = $db->fetch_array($query)) {
$origstatus = $mem['status'];
$status = $core->postedVar('status'.$mem['uid']);
if ($status == '') {
@@ -234,9 +205,17 @@
$db->query("DELETE FROM " . $vars->tablepre . "u2u WHERE owner='{$mem['username']}'");
$db->query("UPDATE " . $vars->tablepre . "whosonline SET username='xguest123' WHERE username='{$mem['username']}'");
} else {
- $db->query("UPDATE " . $vars->tablepre . "members SET ban='$banstatus', status='$status', postnum='$postnum', customstatus='$cusstatus'$queryadd WHERE uid={$mem['uid']}");
- if ('' != $queryadd) {
- $session->logoutAll($mem['username']);
+ $db->query("UPDATE " . $vars->tablepre . "members SET ban='$banstatus', status='$status', postnum='$postnum', customstatus='$cusstatus' WHERE uid={$mem['uid']}");
+
+ if (getRawString('pw' . $mem['uid']) != '') {
+ $newPass = $core->assertPasswordPolicy('pw' . $mem['uid'], 'pw' . $mem['uid']);
+ $passMan = new \XMB\Password($sql);
+ $passMan->changePassword($mem['username'], $newPass);
+ unset($newPass, $passMan);
+
+ // Force logout and delete cookies.
+ $sql->deleteWhosonline($mem['username']);
+ $session->logoutAll($mem['username'], isSelf: false);
}
}
}
diff --git a/buddy.php b/buddy.php
index 674f5475..18dfeefa 100644
--- a/buddy.php
+++ b/buddy.php
@@ -34,8 +34,6 @@
$template = \XMB\Services\template();
$vars = \XMB\Services\vars();
-require XMB_ROOT . 'include/buddy.inc.php';
-
header('X-Robots-Tag: noindex');
if (X_GUEST) {
diff --git a/editprofile.php b/editprofile.php
index c7d11108..6691ed4f 100644
--- a/editprofile.php
+++ b/editprofile.php
@@ -22,6 +22,7 @@
* along with this program. If not, see
This IP is currently banned with a mask (\$ipmask).
If you click on Unban IP, you will also unban all IP addresses included in this mask.";
$lang['evalnobestmember'] = "Nobody has posted today, and as such there is no best member.";
-$lang['evaloffset'] = "Time Offset (GMT time is currently \$currdate)";
+$lang['evaloffset'] = "Time Offset (UTC is currently \$currdate)";
$lang['evalstats1'] = "On the \$bbname, there are:";
$lang['evalstats10'] = "\$forumpost posts per forum";
$lang['evalstats11'] = "\$threadreply replies per thread";
@@ -654,6 +654,8 @@
$lang['pwchange'] = "Change Password";
$lang['pwnomatch'] = "Passwords do not match";
$lang['pwnote'] = "Enter new password if changing, otherwise leave blank.";
+$lang['pwtoolong'] = "The new password was too long. Recommended password length is between 20 and 70 characters.";
+$lang['pwtooshort'] = "The new password was too short. Recommended password length is between 20 and 70 characters.";
$lang['queries'] = "Queries";
$lang['quickjump_status'] = "Quick Jump Status:
This option enables/disables the Quick Jump feature when selecting forums and categories in the header and footer.";
$lang['quickreply'] = 'Quick Reply';
@@ -1222,43 +1224,43 @@
$lang['tickercontents'] = "News In Newsticker:";
$lang['tickername'] = "News & Updates";
$lang['timemsg'] = "Processed in";
-$lang['timezone1'] = "(GMT -12:00) Kwajalein Island";
-$lang['timezone10'] = "(GMT -3:30) Newfoundland";
-$lang['timezone11'] = "(GMT -3:00) Brasilia, Buenos Aires, Rio de Janeiro, São Paulo";
-$lang['timezone12'] = "(GMT -2:00) Mid-Atlantic, Fernando de Noronha";
-$lang['timezone13'] = "(GMT -1:00) Azores, Cape Verde Islands";
-$lang['timezone14'] = "(GMT) Dublin, Edinburgh, Lisbon, London, Monrovia";
-$lang['timezone15'] = "(GMT +1:00) Amsterdam, Berlin, Brussels, Madrid, Paris, Rome";
-$lang['timezone16'] = "(GMT +2:00) Cairo, Helsinki, Kaliningrad, South Africa";
-$lang['timezone17'] = "(GMT +3:00) Baghdad, Riyadh, Moscow, Nairobi";
-$lang['timezone18'] = "(GMT +3:30) Tehran";
-$lang['timezone19'] = "(GMT +4:00) Abu Dhabi, Baku, Muscat, Tbilisi";
-$lang['timezone2'] = "(GMT -11:00) Midway Island, Samoa";
-$lang['timezone20'] = "(GMT +4:30) Kabul";
-$lang['timezone21'] = "(GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent";
-$lang['timezone22'] = "(GMT +5:30) Bombay, Calcutta, Madras, New Delhi";
-$lang['timezone23'] = "(GMT +5:45) Kathmandu";
-$lang['timezone24'] = "(GMT +6:00) Almaty, Bishkek, Dhaka, Omsk, Thimphu";
-$lang['timezone25'] = "(GMT +6:30) Rangoon";
-$lang['timezone26'] = "(GMT +7:00) Bangkok, Hanoi, Jakarta, Krasnoyarsk";
-$lang['timezone27'] = "(GMT +8:00) Beijing, Hong Kong, Perth, Singapore, Taipei";
-$lang['timezone28'] = "(GMT +9:00) Osaka, Sapporo, Seoul, Tokyo, Yakutsk";
-$lang['timezone29'] = "(GMT +9:30) Adelaide, Darwin";
-$lang['timezone3'] = "(GMT -10:00) Hawaii";
-$lang['timezone30'] = "(GMT +10:00) Canberra, Guam, Melbourne, Sydney, Vladivostok";
-$lang['timezone31'] = "(GMT +11:00) Magadan, New Caledonia, Solomon Islands";
-$lang['timezone32'] = "(GMT +12:00) Auckland, Fiji, Kamchatka Krai, Marshall Islands";
-$lang['timezone33'] = "(GMT +13:00) Kingdom of Tonga";
-$lang['timezone34'] = "(GMT +14:00) Christmas Island";
-$lang['timezone35'] = "(GMT +12:45) Chatham Islands";
-$lang['timezone36'] = "(GMT +10:30) Lord Howe Island";
-$lang['timezone37'] = "(GMT -9:30) Marquesas Islands";
-$lang['timezone4'] = "(GMT -9:00) Anchorage, Fairbanks";
-$lang['timezone5'] = "(GMT -8:00) Pacific Time (US & Canada), Tijuana";
-$lang['timezone6'] = "(GMT -7:00) Mountain Time (US & Canada), Arizona";
-$lang['timezone7'] = "(GMT -6:00) Central Time (US & Canada), Mexico City, Central America";
-$lang['timezone8'] = "(GMT -5:00) Eastern Time (US & Canada), Bogotá, Lima, Quito";
-$lang['timezone9'] = "(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz, Santiago";
+$lang['timezone1'] = "(UTC -12:00) Kwajalein Island";
+$lang['timezone10'] = "(UTC -3:30) Newfoundland";
+$lang['timezone11'] = "(UTC -3:00) Brasilia, Buenos Aires, Rio de Janeiro, São Paulo";
+$lang['timezone12'] = "(UTC -2:00) Mid-Atlantic, Fernando de Noronha";
+$lang['timezone13'] = "(UTC -1:00) Azores, Cape Verde Islands";
+$lang['timezone14'] = "(UTC) Dublin, Edinburgh, Lisbon, London, Monrovia";
+$lang['timezone15'] = "(UTC +1:00) Amsterdam, Berlin, Brussels, Madrid, Paris, Rome";
+$lang['timezone16'] = "(UTC +2:00) Cairo, Helsinki, Kaliningrad, South Africa";
+$lang['timezone17'] = "(UTC +3:00) Baghdad, Riyadh, Moscow, Nairobi";
+$lang['timezone18'] = "(UTC +3:30) Tehran";
+$lang['timezone19'] = "(UTC +4:00) Abu Dhabi, Baku, Muscat, Tbilisi";
+$lang['timezone2'] = "(UTC -11:00) Midway Island, Samoa";
+$lang['timezone20'] = "(UTC +4:30) Kabul";
+$lang['timezone21'] = "(UTC +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent";
+$lang['timezone22'] = "(UTC +5:30) Bombay, Calcutta, Madras, New Delhi";
+$lang['timezone23'] = "(UTC +5:45) Kathmandu";
+$lang['timezone24'] = "(UTC +6:00) Almaty, Bishkek, Dhaka, Omsk, Thimphu";
+$lang['timezone25'] = "(UTC +6:30) Rangoon";
+$lang['timezone26'] = "(UTC +7:00) Bangkok, Hanoi, Jakarta, Krasnoyarsk";
+$lang['timezone27'] = "(UTC +8:00) Beijing, Hong Kong, Perth, Singapore, Taipei";
+$lang['timezone28'] = "(UTC +9:00) Osaka, Sapporo, Seoul, Tokyo, Yakutsk";
+$lang['timezone29'] = "(UTC +9:30) Adelaide, Darwin";
+$lang['timezone3'] = "(UTC -10:00) Hawaii";
+$lang['timezone30'] = "(UTC +10:00) Canberra, Guam, Melbourne, Sydney, Vladivostok";
+$lang['timezone31'] = "(UTC +11:00) Magadan, New Caledonia, Solomon Islands";
+$lang['timezone32'] = "(UTC +12:00) Auckland, Fiji, Kamchatka Krai, Marshall Islands";
+$lang['timezone33'] = "(UTC +13:00) Kingdom of Tonga";
+$lang['timezone34'] = "(UTC +14:00) Christmas Island";
+$lang['timezone35'] = "(UTC +12:45) Chatham Islands";
+$lang['timezone36'] = "(UTC +10:30) Lord Howe Island";
+$lang['timezone37'] = "(UTC -9:30) Marquesas Islands";
+$lang['timezone4'] = "(UTC -9:00) Anchorage, Fairbanks";
+$lang['timezone5'] = "(UTC -8:00) Pacific Time (US & Canada), Tijuana";
+$lang['timezone6'] = "(UTC -7:00) Mountain Time (US & Canada), Arizona";
+$lang['timezone7'] = "(UTC -6:00) Central Time (US & Canada), Mexico City, Central America";
+$lang['timezone8'] = "(UTC -5:00) Eastern Time (US & Canada), Bogotá, Lima, Quito";
+$lang['timezone9'] = "(UTC -4:00) Atlantic Time (Canada), Caracas, La Paz, Santiago";
$lang['tocont'] = "to continue.";
$lang['todaydays'] = "days";
$lang['todaygo'] = "Go!";
diff --git a/lost.php b/lost.php
index 786b0770..0c6bf6ae 100644
--- a/lost.php
+++ b/lost.php
@@ -50,28 +50,27 @@
} elseif ($valid_post) {
// New password from posted form received.
$username = postedVar('username', '', true, false);
- $password1 = postedVar('password1', '', false, false);
- $password2 = postedVar('password2', '', false, false);
if ('' == $username) {
error($lang['textnousername']);
}
- if (strlen($username) < 3 || strlen($username) > 32) {
+ if (strlen($username) < $vars::USERNAME_MIN_LENGTH || strlen($username) > $vars::USERNAME_MAX_LENGTH) {
error($lang['username_length_invalid']);
}
- if ('' == $password1) {
- error($lang['textnopassword']);
- }
- if ($password1 !== $password2) {
- error($lang['pwnomatch']);
- }
+
+ $newPass = $core->assertPasswordPolicy('password1', 'password2');
// Inputs look reasonable. Check the token.
if (! \XMB\Token\consume($token2, 'Lost Password', $username)) {
error($lang['lostpw_bad_token']);
}
- $newpassword = md5($password1);
- sql()->setNewPassword($username, $newpassword);
+ $passMan = new \XMB\Password($sql);
+ $passMan->changePassword($username, $newPass);
+ unset($newPass, $passMan);
+
+ $sql->deleteWhosonline($username);
+ $session->logoutAll($username);
+
message($lang['lostpw_success']);
} else {
diff --git a/member.php b/member.php
index 271f9e15..105e08f8 100644
--- a/member.php
+++ b/member.php
@@ -221,7 +221,7 @@
$self = [];
$self['username'] = trim(postedVar('username', '', TRUE, FALSE));
- if (strlen($self['username']) < 3 || strlen($self['username']) > 32) {
+ if (strlen($self['username']) < $vars::USERNAME_MIN_LENGTH || strlen($self['username']) > $vars::USERNAME_MAX_LENGTH) {
error($lang['username_length_invalid']);
}
@@ -276,23 +276,17 @@
}
if ($SETTINGS['emailcheck'] == 'on') {
- $self['password'] = '';
+ $newPass = '';
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$get = strlen($chars) - 1;
for($i = 0; $i < 10; $i++) {
- $self['password'] .= $chars[random_int(0, $get)];
+ $newPass .= $chars[random_int(0, $get)];
}
- $password2 = $self['password'];
- } elseif (!isset($_POST['password']) || !isset($_POST['password2'])) {
- error($lang['textpw1']);
} else {
- $self['password'] = $_POST['password'];
- $password2 = $_POST['password2'];
- }
-
- if ($self['password'] !== $password2) {
- error($lang['pwnomatch']);
+ $newPass = $core->assertPasswordPolicy('password', 'password2');
}
+ $passMan = new \XMB\Password($sql);
+ $self['password2'] = $passMan->hashPassword($newPass);
$fail = false;
$efail = false;
@@ -341,51 +335,18 @@
error($lang['bademail']);
}
- if ($self['password'] == '') {
- error($lang['textpw1']);
- }
-
- $self['langfile'] = postedVar('langfilenew', '', false, false);
- $langfilenew = $db->escape($self['langfile']);
- $result = $db->query("SELECT devname FROM ".X_PREFIX."lang_base WHERE devname='$langfilenew'");
- if ($db->num_rows($result) == 0) {
- $self['langfile'] = $SETTINGS['langfile'];
- }
+ $form = new \XMB\UserEditForm([], [], $core, $theme, $tran, $vars);
+ $form->readBirthday();
+ $form->readAvatar();
+ $form->readCallables();
+ $form->readTextFields();
+ $form->readOptions();
+ $form->readNumericFields();
+ $form->readMiscFields();
$count1 = $sql->countMembers();
$self['status'] = ($count1 != 0) ? 'Member' : 'Super Administrator';
- $self['timeoffset'] = isset($_POST['timeoffset1']) && is_numeric($_POST['timeoffset1']) ? $_POST['timeoffset1'] : 0;
- $self['theme'] = formInt('thememem');
- $self['tpp'] = formInt('tpp');
- $self['ppp'] = formInt('ppp');
- $self['showemail'] = formYesNo('showemail');
- $self['newsletter'] = formYesNo('newsletter');
- $self['saveogu2u'] = formYesNo('saveogu2u');
- $self['emailonu2u'] = formYesNo('emailonu2u');
- $self['useoldu2u'] = formYesNo('useoldu2u');
- $self['u2ualert'] = formInt('u2ualert');
-
- // For year of birth, reject all integers from 100 through 1899.
- $year = formInt('year');
- $month = formInt('month');
- $day = formInt('day');
- if ($year >= 100 && $year <= 1899) $year = 0;
- $self['bday'] = iso8601_date($year, $month, $day);
-
- $self['dateformat'] = postedVar('dateformatnew', '', false, false);
- $dateformattest = attrOut($self['dateformat'], 'javascript'); // NEVER allow attribute-special data in the date format because it can be unescaped using the date() parser.
- if (strlen($self['dateformat']) == 0 || $self['dateformat'] !== $dateformattest) {
- $self['dateformat'] = $SETTINGS['dateformat'];
- }
- unset($dateformattest);
-
- $self['timeformat'] = formInt('timeformatnew');
- if ($self['timeformat'] != 12 && $self['timeformat'] != 24) {
- $self['timeformat'] = $SETTINGS['timeformat'];
- }
-
- $self['password'] = md5($self['password']);
$self['regdate'] = $vars->onlinetime;
if (strlen($onlineip) > 15 && ((int) $SETTINGS['schema_version'] < 9 || strlen($onlineip) > 39)) {
$self['regip'] = '';
@@ -393,59 +354,6 @@
$self['regip'] = $onlineip;
}
- if ('on' == $SETTINGS['regoptional']) {
- $self['location'] = postedVar('location', 'javascript', true, false, true);
- $self['site'] = postedVar('site', 'javascript', true, false, true);
- $self['bio'] = postedVar('bio', 'javascript', true, false, true);
- $self['mood'] = postedVar('mood', 'javascript', true, false, true);
- $self['sig'] = postedVar('sig', 'javascript', true, false, true);
-
- if ($SETTINGS['avastatus'] == 'on') {
- $self['avatar'] = postedVar('newavatar', 'javascript', true, false, true);
- $rawavatar = postedVar('newavatar', '', FALSE, FALSE);
-
- $newavatarcheck = postedVar('newavatarcheck');
-
- $max_size = explode('x', $SETTINGS['max_avatar_size']);
-
- if (preg_match('/^' . get_img_regexp($https_only) . '$/i', $rawavatar) == 0) {
- $self['avatar'] = '';
- } elseif (ini_get('allow_url_fopen')) {
- if ((int) $max_size[0] > 0 && (int) $max_size[1] > 0 && strlen($rawavatar) > 0) {
- $size = @getimagesize($rawavatar);
- if ($size === FALSE) {
- $self['avatar'] = '';
- } elseif ($size[0] > (int) $max_size[0] || $size[1] > (int) $max_size[1]) {
- error($lang['avatar_too_big'] . $SETTINGS['max_avatar_size'] . 'px');
- }
- }
- } elseif ($newavatarcheck == "no") {
- $self['avatar'] = '';
- }
- unset($rawavatar);
- } elseif ($SETTINGS['avastatus'] == 'list') {
- $rawavatar = postedVar('newavatar', '', FALSE, FALSE);
- $dirHandle = opendir(XMB_ROOT.'images/avatars');
- $filefound = FALSE;
- while($avFile = readdir($dirHandle)) {
- if ($rawavatar == './images/avatars/'.$avFile) {
- if (is_file(XMB_ROOT.'images/avatars/'.$avFile) && $avFile != '.' && $avFile != '..' && $avFile != 'index.html') {
- $filefound = TRUE;
- }
- }
- }
- closedir($dirHandle);
- unset($rawavatar);
- if ($filefound) {
- $self['avatar'] = $core->postedVar('newavatar', 'javascript', true, false, true);
- } else {
- $self['avatar'] = '';
- }
- } else {
- $self['avatar'] = '';
- }
- }
-
$sql->addMember($self);
$lang2 = $tran->loadPhrases([
@@ -477,14 +385,13 @@
$username = trim(postedVar('username', '', FALSE, FALSE));
$rawbbname = htmlspecialchars_decode($bbname, ENT_NOQUOTES);
$subject = "[$rawbbname] {$translate['textyourpw']}";
- $body = "{$translate['textyourpwis']} \n\n{$translate['textusername']} $username\n{$translate['textpassword']} $password2\n\n$full_url";
+ $body = "{$translate['textyourpwis']} \n\n{$translate['textusername']} $username\n{$translate['textpassword']} $newPass\n\n$full_url";
xmb_mail($rawemail, $subject, $body, $translate['charset']);
} else {
$session->newUser($self);
}
- $self['password'] = '';
- $password2 = '';
+ unset($newPass, $passMan);
break;
}
@@ -555,28 +462,21 @@
if (4 == $stepout) {
// Display new user form
- $captcharegcheck = '';
+ $form = new \XMB\UserEditForm([], [], $core, $theme, $tran, $vars);
+ $form->setOptionSelectors();
+ $form->setCallableElements();
+ $form->setAvatar();
+ $form->setBirthday();
+ $form->setNumericFields();
+ $form->setMiscFields();
+
+ $subTemplate = $form->getTemplate();
+
$token = \XMB\Token\create('Registration', (string) $stepout, $vars::NONCE_FORM_EXP, true);
$currdate = gmdate($vars->timecode, $core->standardTime($vars->onlinetime));
$textoffset = str_replace('$currdate', $currdate, $lang['evaloffset']);
- $themelist = $theme->selector(
- nameAttr: 'thememem',
- selection: null,
- );
-
- $langfileselect = $tran->createLangFileSelect($langfile);
-
- $dayselect = array();
- $dayselect[] = '';
- $dayselect = implode("\n", $dayselect);
-
if ($SETTINGS['sigbbcode'] == 'on') {
$bbcodeis = $lang['texton'];
} else {
@@ -590,41 +490,11 @@
eval('$pwtd = "'.template('member_reg_password').'";');
}
- if ('24' === $SETTINGS['timeformat']) {
- $timeFormat12Checked = '';
- $timeFormat24Checked = $cheHTML;
- } else {
- $timeFormat12Checked = $cheHTML;
- $timeFormat24Checked = '';
- }
-
- $timezones = timezone_control($SETTINGS['def_tz']);
-
- $avatd = '';
- if ($SETTINGS['avastatus'] == 'on') {
- eval('$avatd = "'.template('member_reg_avatarurl').'";');
- } else if ($SETTINGS['avastatus'] == 'list') {
- $avatars = array();
- $avatars[] = ''.$lang['textnone'].'';
- $dirHandle = opendir(XMB_ROOT.'images/avatars');
- while($avFile = readdir($dirHandle)) {
- if (is_file(XMB_ROOT.'images/avatars/'.$avFile) && $avFile != '.' && $avFile != '..' && $avFile != 'index.html') {
- $avatars[] = ''.$avFile.'';
- }
- }
- closedir($dirHandle);
- $avatars = implode("\n", str_replace('value="'.$member['avatar'].'"', 'value="'.$member['avatar'].'" selected="selected"', $avatars));
- eval('$avatd = "'.template('member_reg_avatarlist').'";');
- }
-
- $dformatorig = $SETTINGS['dateformat'];
-
$regoptional = '';
if ($SETTINGS['regoptional'] == 'on') {
eval('$regoptional = "'.template('member_reg_optional').'";');
}
- $captcharegcheck = '';
eval('$memberpage = "'.template('member_reg').'";');
}
diff --git a/memcp.php b/memcp.php
index 7260619a..a342b3c9 100644
--- a/memcp.php
+++ b/memcp.php
@@ -35,6 +35,7 @@
$sql = \XMB\Services\sql();
$template = \XMB\Services\template();
$theme = \XMB\Services\theme();
+$token = \XMB\Services\token();
$tran = \XMB\Services\translation();
$vars = \XMB\Services\vars();
$lang = &$vars->lang;
@@ -55,21 +56,36 @@
case 'profile':
$core->nav(''.$lang['textusercp'].'');
$core->nav($lang['texteditpro']);
+ if ($SETTINGS['subject_in_title'] == 'on') {
+ $template->threadSubject = $lang['texteditpro'] . ' - ';
+ }
break;
case 'subscriptions':
$core->nav(''.$lang['textusercp'].'');
$core->nav($lang['textsubscriptions']);
+ if ($SETTINGS['subject_in_title'] == 'on') {
+ $template->threadSubject = $lang['textsubscriptions'] . ' - ';
+ }
break;
case 'favorites':
$core->nav(''.$lang['textusercp'].'');
$core->nav($lang['textfavorites']);
+ if ($SETTINGS['subject_in_title'] == 'on') {
+ $template->threadSubject = $lang['textfavorites'] . ' - ';
+ }
break;
case 'devices':
$core->nav(''.$lang['textusercp'].'');
$core->nav($lang['devices']);
+ if ($SETTINGS['subject_in_title'] == 'on') {
+ $template->threadSubject = $lang['devices'] . ' - ';
+ }
break;
default:
$core->nav($lang['textusercp']);
+ if ($SETTINGS['subject_in_title'] == 'on') {
+ $template->threadSubject = $lang['textusercp'] . ' - ';
+ }
break;
}
@@ -85,196 +101,76 @@
$header .= $template->process('memcp_nav.php');
if (noSubmit('editsubmit')) {
- $member = $vars->self;
-
- $template->checked = $member['showemail'] == 'yes' ? $vars::cheHTML : '';
- $template->subschecked = $member['sub_each_post'] == 'yes' ? $vars::cheHTML : '';
- $template->newschecked = $member['newsletter'] == 'yes' ? $vars::cheHTML : '';
- $template->uou2uchecked = $member['useoldu2u'] == 'yes' ? $vars::cheHTML : '';
- $template->ogu2uchecked = $member['saveogu2u'] == 'yes' ? $vars::cheHTML : '';
- $template->eouchecked = $member['emailonu2u'] == 'yes' ? $vars::cheHTML : '';
- $template->invchecked = $member['invisible'] === '1' ? $vars::cheHTML : '';
-
- $currdate = gmdate($vars->timecode, $core->standardTime($vars->onlinetime));
- $template->textoffset = str_replace('$currdate', $currdate, $lang['evaloffset']);
-
- $template->timezones = $core->timezone_control($member['timeoffset']);
-
- $template->u2uasel0 = '';
- $template->u2uasel1 = '';
- $template->u2uasel2 = '';
- switch ($member['u2ualert']) {
- case '2':
- $template->u2uasel2 = $vars::selHTML;
- break;
- case '1':
- $template->u2uasel1 = $vars::selHTML;
- break;
- case '0':
- default:
- $template->u2uasel0 = $vars::selHTML;
- break;
- }
-
- $template->themelist = $theme->selector(
- nameAttr: 'thememem',
- selection: (int) $member['theme'],
- );
-
- $template->langfileselect = $tran->createLangFileSelect($member['langfile']);
-
- $day = intval(substr($member['bday'], 8, 2));
- $month = intval(substr($member['bday'], 5, 2));
- $template->year = substr($member['bday'], 0, 4);
-
- $sel = array_fill(start_index: 0, count: 13, value: '');
- $sel[$month] = $vars::selHTML;
- $template->sel = $sel;
-
- $template->dayselect = [
- "';
- $template->dayselect = implode("\n", $dayselect);
-
- $template->check12 = '';
- $template->check24 = '';
- if ('24' === $member['timeformat']) {
- $template->check24 = $vars::cheHTML;
- } else {
- $template->check12 = $vars::cheHTML;
- }
-
- if ($SETTINGS['sigbbcode'] == 'on') {
- $template->bbcodeis = $lang['texton'];
- } else {
- $template->bbcodeis = $lang['textoff'];
- }
-
- $template->htmlis = $lang['textoff'];
-
- null_string($member['avatar']);
- if ($SETTINGS['avastatus'] == 'on') {
- if ($https_only && strpos($member['avatar'], ':') !== false && substr($member['avatar'], 0, 6) !== 'https:') {
- $member['avatar'] = '';
- }
- $template->member = $member;
- $template->avatar = $template->process('memcp_profile_avatarurl.php');
- } elseif ($SETTINGS['avastatus'] == 'list') {
- $avatars = ''.$lang['textnone'].'';
- $dir1 = opendir(XMB_ROOT . 'images/avatars');
- while ($avFile = readdir($dir1)) {
- if (is_file(XMB_ROOT . 'images/avatars/' . $avFile) && $avFile != '.' && $avFile != '..' && $avFile != 'index.html') {
- $avatars .= '' . $avFile . '';
- }
- }
- closedir($dir1);
- $avatars = str_replace('value="'.$member['avatar'].'"', 'value="'.$member['avatar'].'" selected="selected"', $avatars);
- $template->avatarbox = '';
- $template->avatar = $template->process('memcp_profile_avatarlist.php');
- unset($avatars, $template->avatarbox);
- } else {
- $template->avatar = '';
- }
-
- $member['bio'] = $core->rawHTMLsubject($member['bio']);
- $member['location'] = $core->rawHTMLsubject($member['location']);
- $member['mood'] = $core->rawHTMLsubject($member['mood']);
- $member['sig'] = $core->rawHTMLsubject($member['sig']);
-
- $template->member = $member;
+ $form = new \XMB\UserEditForm($vars->self, $vars->self, $core, $db, $sql, $theme, $tran, $vars);
+ $form->setOptions();
+ $form->setCallables();
+ $form->setBirthday();
+ $form->setNumericFields();
+ $form->setMiscFields();
+
if ('on' == $SETTINGS['regoptional'] || 'off' == $SETTINGS['quarantine_new_users'] || ((int) $vars->self['postnum'] > 0 && 'no' == $vars->self['waiting_for_mod']) || X_STAFF) {
- $template->optional = $template->process('memcp_profile_optional.php');
+ $form->setOptionalFields();
+ $subTemplate = $form->getTemplate();
+ $subTemplate->bbcodeis = $SETTINGS['sigbbcode'] == 'on' ? $lang['texton'] : $lang['textoff'];
+ $subTemplate->htmlis = $lang['textoff'];
+ $subTemplate->optional = $subTemplate->process('memcp_profile_optional.php');
} else {
- $template->optional = '';
+ $subTemplate = $form->getTemplate();
+ $subTemplate->optional = '';
}
- $template->hUsername = $vars->self['username'];
- $template->token = $token->create('User Control Panel/Edit Profile', $vars->self['uid'], $vars::NONCE_FORM_EXP);
+ $currdate = gmdate($vars->timecode, $core->standardTime($vars->onlinetime));
+ $subTemplate->textoffset = str_replace('$currdate', $currdate, $lang['evaloffset']);
- $mempage = $template->process('memcp_profile.php');
+ $subTemplate->hUsername = $vars->self['username'];
+ $subTemplate->token = $token->create('User Control Panel/Edit Profile', $vars->self['uid'], $vars::NONCE_FORM_EXP);
+
+ $mempage = $subTemplate->process('memcp_profile.php');
}
if (onSubmit('editsubmit')) {
$core->request_secure('User Control Panel/Edit Profile', $vars->self['uid'], error_header: true);
- if (! empty($_POST['newpassword'])) {
- if (empty($_POST['oldpassword'])) {
- error($lang['textpwincorrect']);
- }
- $member = $sql->getMemberByName($vars->self['username']);
- if ($member['password'] !== md5($_POST['oldpassword'])) {
- error($lang['textpwincorrect']);
- }
- unset($member);
- if (empty($_POST['newpasswordcf'])) {
- error($lang['pwnomatch']);
+
+ if (getRawString('newpassword') != '') {
+ $storedPass = $vars->self['password'] !== '' ? $vars->self['password'] : $vars->self['password2'];
+ $passMan = new \XMB\Password($sql);
+ $oldPass = getRawString('oldpassword');
+ if ($oldPass == '') {
+ $core->error($lang['textnopassword']);
}
- if ($_POST['newpassword'] !== $_POST['newpasswordcf']) {
- error($lang['pwnomatch']);
+ if (! $passMan->checkInput($oldPass, $storedPass)) {
+ $core->auditBadLogin($vars->self);
+ $core->error($lang['textpwincorrect']);
}
-
- $newpassword = md5($_POST['newpassword']);
-
- $pwtxt = "password='$newpassword',";
+ $newPass = $core->assertPasswordPolicy('newpassword', 'newpasswordcf');
+ $passMan->changePassword($vars->self['username'], $newPass);
+ unset($newPass, $passMan, $oldPass, $storedPass);
// Force logout and delete cookies.
- $query = $db->query("DELETE FROM " . $vars->tablepre . "whosonline WHERE username='$xmbuser'");
+ $sql->deleteWhosonline($vars->self['username']);
$session->logoutAll();
- } else {
- $pwtxt = '';
}
- $langfilenew = postedVar('langfilenew');
- $result = $db->query("SELECT devname FROM " . $vars->tablepre . "lang_base WHERE devname='$langfilenew'");
- if ($db->num_rows($result) == 0) {
- $langfilenew = $SETTINGS['langfile'];
- }
-
- $timeoffset1 = isset($_POST['timeoffset1']) && is_numeric($_POST['timeoffset1']) ? $_POST['timeoffset1'] : 0;
- $thememem = formInt('thememem');
- $tppnew = isset($_POST['tppnew']) ? (int) $_POST['tppnew'] : $SETTINGS['topicperpage'];
- $pppnew = isset($_POST['pppnew']) ? (int) $_POST['pppnew'] : $SETTINGS['postperpage'];
+ $form = new \XMB\UserEditForm($vars->self, $vars->self, $core, $db, $sql, $theme, $tran, $vars);
+ $form->readBirthday();
+ $form->readCallables();
+ $form->readOptionalFields();
+ $form->readOptions();
+ $form->readNumericFields();
+ $form->readMiscFields();
- $dateformatnew = postedVar('dateformatnew', '', FALSE, TRUE);
- $dateformattest = attrOut($dateformatnew, 'javascript'); // NEVER allow attribute-special data in the date format because it can be unescaped using the date() parser.
- if (strlen($dateformatnew) == 0 || $dateformatnew !== $dateformattest) {
- $dateformatnew = $SETTINGS['dateformat'];
- }
- unset($dateformattest);
-
- $timeformatnew = formInt('timeformatnew');
- if ($timeformatnew != 12 && $timeformatnew != 24) {
- $timeformatnew = $SETTINGS['timeformat'];
- }
+ $edits = $form->getEdits();
- $newsubs = formYesNo('newsubs');
- $saveogu2u = formYesNo('saveogu2u');
- $emailonu2u = formYesNo('emailonu2u');
- $useoldu2u = formYesNo('useoldu2u');
- $invisible = formInt('newinv');
- $showemail = formYesNo('newshowemail');
- $newsletter = formYesNo('newnewsletter');
- $u2ualert = formInt('u2ualert');
- $year = formInt('year');
- $month = formInt('month');
- $day = formInt('day');
- // For year of birth, reject all integers from 100 through 1899.
- if ($year >= 100 && $year <= 1899) $year = 0;
- $bday = iso8601_date($year, $month, $day);
- $email = postedVar('newemail', 'javascript', TRUE, TRUE, TRUE);
+ $email = $core->postedVar('newemail', 'javascript', dbescape: false, quoteencode: true);
- if ($email !== $db->escape($vars->self['email'])) {
+ if ($email !== $vars->self['email']) {
if ($SETTINGS['doublee'] == 'off' && false !== strpos($email, "@")) {
- $query = $db->query("SELECT COUNT(uid) FROM " . $vars->tablepre . "members WHERE email = '$email' AND username != '$xmbuser'");
- $count1 = (int) $db->result($query,0);
+ $sqlEmail = $db->escape($email);
+ $query = $db->query("SELECT COUNT(uid) FROM " . $vars->tablepre . "members WHERE email = '$sqlEmail' AND username != '" . $vars->xmbuser . "'");
+ $count1 = (int) $db->result($query);
$db->free_result($query);
if ($count1 != 0) {
- error($lang['alreadyreg']);
+ $core->error($lang['alreadyreg']);
}
}
@@ -300,137 +196,57 @@
$db->free_result($query);
if ($efail) {
- error($lang['emailrestricted']);
+ $core->error($lang['emailrestricted']);
}
- require XMB_ROOT.'include/validate-email.inc.php';
+ require XMB_ROOT . 'include/validate-email.inc.php';
$test = new EmailAddressValidator();
- $rawemail = postedVar('newemail', '', FALSE, FALSE);
+ $rawemail = getPhpInput('newemail');
if (false === $test->check_email_address($rawemail)) {
- error($lang['bademail']);
+ $core->error($lang['bademail']);
}
}
-
- if ($SETTINGS['avastatus'] == 'on') {
- $avatar = postedVar('newavatar', 'javascript', TRUE, TRUE, TRUE);
- $rawavatar = postedVar('newavatar', '', FALSE, FALSE);
-
- $newavatarcheck = postedVar('newavatarcheck');
-
- $max_size = explode('x', $SETTINGS['max_avatar_size']);
-
- if (preg_match('/^' . get_img_regexp($https_only) . '$/i', $rawavatar) == 0) {
- $avatar = '';
- } elseif (ini_get('allow_url_fopen')) {
- if ((int) $max_size[0] > 0 && (int) $max_size[1] > 0 && strlen($rawavatar) > 0) {
- $size = @getimagesize($rawavatar);
- if ($size === FALSE) {
- $avatar = '';
- } elseif (($size[0] > (int) $max_size[0] || $size[1] > (int) $max_size[1]) && !X_SADMIN) {
- error($lang['avatar_too_big'] . $SETTINGS['max_avatar_size'] . 'px');
- }
- }
- } elseif ($newavatarcheck == "no") {
- $avatar = '';
- }
- unset($rawavatar);
- } elseif ($SETTINGS['avastatus'] == 'list') {
- $rawavatar = postedVar('newavatar', '', FALSE, FALSE);
- $dirHandle = opendir(XMB_ROOT.'images/avatars');
- $filefound = FALSE;
- while($avFile = readdir($dirHandle)) {
- if ($rawavatar == './images/avatars/'.$avFile) {
- if (is_file(XMB_ROOT.'images/avatars/'.$avFile) && $avFile != '.' && $avFile != '..' && $avFile != 'index.html') {
- $filefound = TRUE;
- }
- }
- }
- closedir($dirHandle);
- unset($rawavatar);
- if ($filefound) {
- $avatar = postedVar('newavatar', 'javascript', TRUE, TRUE, TRUE);
- } else {
- $avatar = '';
- }
- } else {
- $avatar = '';
+
+ if ($vars->self['email'] != $email) {
+ $edits['email'] = $email;
+ }
+
+ if (count($edits) > 0) {
+ $sql->updateMember($vars->self['username'], $edits);
}
- if ('on' == $SETTINGS['regoptional'] || 'off' == $SETTINGS['quarantine_new_users'] || ((int) $vars->self['postnum'] > 0 && 'no' == $vars->self['waiting_for_mod']) || X_STAFF) {
- $location = postedVar('newlocation', 'javascript', TRUE, TRUE, TRUE);
- $site = postedVar('newsite', 'javascript', TRUE, TRUE, TRUE);
- $bio = postedVar('newbio', 'javascript', TRUE, TRUE, TRUE);
- $mood = postedVar('newmood', 'javascript', TRUE, TRUE, TRUE);
- $sig = postedVar('newsig', 'javascript', TRUE, TRUE, TRUE);
-
- if ($SETTINGS['resetsigs'] == 'on') {
- if (strlen(trim($vars->self['sig'])) == 0) {
- if (strlen(trim($sig)) > 0) {
- $sql->setPostSigsByAuthor(true, $vars->self['username']);
- }
- } elseif (strlen(trim($sig)) == 0) {
- $sql->setPostSigsByAuthor(false, $vars->self['username']);
- }
- }
- } else {
- $avatar = '';
- $location = '';
- $site = '';
- $bio = '';
- $mood = '';
- $sig = '';
- }
-
- $db->query("UPDATE " . $vars->tablepre . "members SET $pwtxt email='$email', site='$site', location='$location', bio='$bio', sig='$sig', showemail='$showemail',
- timeoffset='$timeoffset1', avatar='$avatar', theme='$thememem', bday='$bday', langfile='$langfilenew', tpp='$tppnew', ppp='$pppnew',
- newsletter='$newsletter', timeformat='$timeformatnew', dateformat='$dateformatnew', mood='$mood', invisible='$invisible', saveogu2u='$saveogu2u',
- emailonu2u='$emailonu2u', useoldu2u='$useoldu2u', u2ualert=$u2ualert, sub_each_post='$newsubs' WHERE username='$xmbuser'"
- );
-
- message($lang['usercpeditpromsg'], TRUE, '', '', $vars->full_url . 'memcp.php', true, false, true);
+ $core->message($lang['usercpeditpromsg'], redirect: $vars->full_url . 'memcp.php');
}
} elseif ($action == 'favorites') {
$header = $template->process('header.php');
$header .= $template->process('memcp_nav.php');
- $favadd = getInt('favadd');
+ $favadd = onSubmit('favadd');
if (noSubmit('favsubmit') && $favadd) {
- if ($favadd == 0) {
- error($lang['generic_missing']);
- }
+ $favadd = getInt('favadd');
- $query = $db->query("SELECT fid FROM " . $vars->tablepre . "threads WHERE tid=$favadd");
- if ($db->num_rows($query) == 0) {
- error($lang['privforummsg']);
+ $row = $sql->getFIDfromTID($favadd);
+ if (count($row) == 0) {
+ $core->error($lang['privforummsg']);
}
- $row = $db->fetch_array($query);
$forum = $forums->getForum((int) $row['fid']);
- $perms = checkForumPermissions($forum);
- if (!($perms[$vars::PERMS_VIEW] && $perms[$vars::PERMS_PASSWORD])) {
- error($lang['privforummsg']);
+ $perms = $core->checkForumPermissions($forum);
+ if (! ($perms[$vars::PERMS_VIEW] && $perms[$vars::PERMS_PASSWORD])) {
+ $core->error($lang['privforummsg']);
}
if ($forum['type'] == 'sub') {
$perms = $core->checkForumPermissions($forums->getForum((int) $forum['fup']));
- if (!($perms[$vars::PERMS_VIEW] && $perms[$vars::PERMS_PASSWORD])) {
- error($lang['privforummsg']);
+ if (! ($perms[$vars::PERMS_VIEW] && $perms[$vars::PERMS_PASSWORD])) {
+ $core->error($lang['privforummsg']);
}
}
- $query = $db->query("SELECT tid FROM " . $vars->tablepre . "favorites WHERE tid=$favadd AND username='$xmbuser' AND type='favorite'");
- $favthread = $db->fetch_array($query);
- $db->free_result($query);
-
- if ($favthread) {
- error($lang['favonlistmsg']);
- }
-
- $db->query("INSERT INTO " . $vars->tablepre . "favorites (tid, username, type) VALUES ($favadd, '$xmbuser', 'favorite')");
- message($lang['favaddedmsg'], TRUE, '', '', $vars->full_url . 'memcp.php?action=favorites', true, false, true);
- }
+ $sql->addFavoriteIfMissing($favadd, $vars->self['username'], 'favorite');
- if (!$favadd && noSubmit('favsubmit')) {
+ $core->message($lang['favaddedmsg'], redirect: $vars->full_url . 'memcp.php?action=favorites');
+ } elseif (! $favadd && noSubmit('favsubmit')) {
$favnum = 0;
- $favs = '';
+ $template->favs = '';
$fids = $core->permittedFIDsForThreadView();
if (count($fids) != 0) {
$query = $sql->getFavorites($vars->self['username'], $fids, limit: null);
@@ -446,38 +262,37 @@
$lastpostname = $lang['textanonymous'];
}
- $lastreplydate = gmdate($dateformat, $core->timeKludge((int) $lastpost[0]));
- $lastreplytime = gmdate($timecode, $core->timeKludge((int) $lastpost[0]));
- $lastpost = $lang['lastreply1'].' '.$lastreplydate.' '.$lang['textat'].' '.$lastreplytime.' '.$lang['textby'].' '.$lastpostname;
- $fav['subject'] = rawHTMLsubject(stripslashes($fav['subject']));
+ $lastreplydate = gmdate($vars->dateformat, $core->timeKludge((int) $lastpost[0]));
+ $lastreplytime = gmdate($vars->timecode, $core->timeKludge((int) $lastpost[0]));
+ $template->lastpost = $lang['lastreply1'].' '.$lastreplydate.' '.$lang['textat'].' '.$lastreplytime.' '.$lang['textby'].' '.$lastpostname;
+ $fav['subject'] = $core->rawHTMLsubject(stripslashes($fav['subject']));
if ($fav['icon'] != '') {
- $fav['icon'] = '';
+ $fav['icon'] = '
';
} else {
$fav['icon'] = '';
}
+ $template->fav = $fav;
+ $template->forum = $forum;
$favnum++;
- eval('$favs .= "'.template('memcp_favs_row').'";');
+ $template->favs .= $template->process('memcp_favs_row.php');
}
unset($query);
}
- $favsbtn = '';
if ($favnum != 0) {
- eval('$favsbtn = "'.template('memcp_favs_button').'";');
+ $template->favsbtn = $template->process('memcp_favs_button.php');
+ } else {
+ $template->favsbtn = '';
+ $template->favs = $template->process('memcp_favs_none.php');
}
- if ($favnum == 0) {
- eval('$favs = "'.template('memcp_favs_none').'";');
- }
- eval('$mempage = "'.template('memcp_favs').'";');
- }
-
- if (!$favadd && onSubmit('favsubmit')) {
- $query = $db->query("SELECT tid FROM " . $vars->tablepre . "favorites WHERE username='$xmbuser' AND type='favorite'");
- $tids = array();
- while($fav = $db->fetch_array($query)) {
+ $mempage = $template->process('memcp_favs.php');
+ } elseif (! $favadd && onSubmit('favsubmit')) {
+ $query = $db->query("SELECT tid FROM " . $vars->tablepre . "favorites WHERE username = '" . $vars->xmbuser . "' AND type = 'favorite'");
+ $tids = [];
+ while ($fav = $db->fetch_array($query)) {
$delete = formInt('delete'.$fav['tid']);
if ($delete == intval($fav['tid'])) {
$tids[] = $delete;
@@ -485,13 +300,12 @@
}
$db->free_result($query);
if (count($tids) > 0) {
- $tids = implode(', ', $tids);
- $db->query("DELETE FROM " . $vars->tablepre . "favorites WHERE username='$xmbuser' AND tid IN ($tids) AND type='favorite'");
+ $sql->deleteFavorites($tids, $vars->self['username'], 'favorite');
}
- message($lang['favsdeletedmsg'], TRUE, '', '', $vars->full_url . 'memcp.php?action=favorites', true, false, true);
+ $core->message($lang['favsdeletedmsg'], redirect: $vars->full_url . 'memcp.php?action=favorites');
}
} elseif ($action == 'subscriptions') {
- $subadd = getInt('subadd');
+ $subadd = onSubmit('subadd');
if (! $subadd && noSubmit('subsubmit')) {
$fids = $core->permittedFIDsForThreadView();
$num = $sql->countSubscriptionsByUser($vars->self['username'], $fids);
@@ -530,6 +344,7 @@
$fav['icon'] = '';
}
$template->fav = $fav;
+ $template->forum = $forum;
$template->subscriptions .= $template->process('memcp_subscriptions_row.php');
}
@@ -542,29 +357,40 @@
$mempage = $template->process('memcp_subscriptions.php');
} elseif ($subadd && noSubmit('subsubmit')) {
- $query = $db->query("SELECT COUNT(tid) FROM " . $vars->tablepre . "favorites WHERE tid='$subadd' AND username='$xmbuser' AND type='subscription'");
- if ((int) $db->result($query, 0) == 1) {
- $db->free_result($query);
- error($lang['subonlistmsg'], TRUE);
- } else {
- $db->query("INSERT INTO " . $vars->tablepre . "favorites (tid, username, type) VALUES ('$subadd', '$xmbuser', 'subscription')");
- message($lang['subaddedmsg'], TRUE, '', '', $vars->full_url . 'memcp.php?action=subscriptions', true, false, true);
+ $tid = getInt('subadd');
+
+ $row = $sql->getFIDfromTID($tid);
+ if (count($row) == 0) {
+ $core->error($lang['privforummsg']);
+ }
+ $forum = $forums->getForum((int) $row['fid']);
+ $perms = $core->checkForumPermissions($forum);
+ if (! ($perms[$vars::PERMS_VIEW] && $perms[$vars::PERMS_PASSWORD])) {
+ $core->error($lang['privforummsg']);
}
+ if ($forum['type'] == 'sub') {
+ $perms = $core->checkForumPermissions($forums->getForum((int) $forum['fup']));
+ if (! ($perms[$vars::PERMS_VIEW] && $perms[$vars::PERMS_PASSWORD])) {
+ $core->error($lang['privforummsg']);
+ }
+ }
+
+ $sql->addFavoriteIfMissing($tid, $vars->self['username'], 'subscription');
+ $core->message($lang['subaddedmsg'], redirect: $vars->full_url . 'memcp.php?action=subscriptions');
} elseif (! $subadd && onSubmit('subsubmit')) {
- $query = $db->query("SELECT tid FROM " . $vars->tablepre . "favorites WHERE username='$xmbuser' AND type='subscription'");
- $tids = array();
+ $query = $db->query("SELECT tid FROM " . $vars->tablepre . "favorites WHERE username = '" . $vars->xmbuser . "' AND type = 'subscription'");
+ $tids = [];
while ($sub = $db->fetch_array($query)) {
- $delete = formInt('delete'.$sub['tid']);
+ $delete = formInt('delete' . $sub['tid']);
if ($delete == intval($sub['tid'])) {
$tids[] = $delete;
}
}
$db->free_result($query);
if (count($tids) > 0) {
- $tids = implode(', ', $tids);
- $db->query("DELETE FROM " . $vars->tablepre . "favorites WHERE username='$xmbuser' AND tid IN ($tids) AND type='subscription'");
+ $sql->deleteFavorites($tids, $vars->self['username'], 'subscription');
}
- message($lang['subsdeletedmsg'], TRUE, '', '', $vars->full_url . 'memcp.php?action=subscriptions', true, false, true);
+ $core->message($lang['subsdeletedmsg'], redirect: $vars->full_url . 'memcp.php?action=subscriptions');
}
} elseif ($action == 'devices') {
if (onSubmit('devicesubmit')) {
@@ -613,7 +439,6 @@
$mempage = $template->process('memcp_devices.php');
} else {
- require XMB_ROOT . 'include/buddy.inc.php';
$buddy = new \XMB\BuddyManager($core, $db, $sql, $template, $vars);
$header = $template->process('header.php');
diff --git a/misc.php b/misc.php
index a30df63d..0fe4e7b3 100644
--- a/misc.php
+++ b/misc.php
@@ -127,8 +127,8 @@
case 'logout':
if ('logged-out' == $session->getStatus()) {
$gone = $session->getMember();
- $query = $db->query("DELETE FROM " . $vars->tablepre . "whosonline WHERE username='{$gone['username']}'");
- $core->redirect($vars->full_url, 0);
+ $sql->deleteWhosonline($gone['username']);
+ $core->redirect($vars->full_url, timeout: 0);
} else {
$core->message($lang['notloggedin']);
}
diff --git a/templates/admin_members_edit_row.php b/templates/admin_members_edit_row.php
index 7b98759f..e4d1f1ac 100644
--- a/templates/admin_members_edit_row.php
+++ b/templates/admin_members_edit_row.php
@@ -8,19 +8,14 @@