diff --git a/src/controllers/components/SocialComponent.php b/src/controllers/components/SocialComponent.php index 9f837e40e..46095ebfc 100644 --- a/src/controllers/components/SocialComponent.php +++ b/src/controllers/components/SocialComponent.php @@ -1610,7 +1610,8 @@ EOD; } break; case 'alternative_path': - if (!is_dir($head_vars[$key])) { + if (!is_dir($head_vars[$key]) && + !empty($head_vars[$key])) { $head_vars[$key] = $default; } else if (!empty($_SESSION['USER_ID']) && $_SESSION['USER_ID'] == @@ -1653,8 +1654,14 @@ EOD; $group_id, $page_info['ID'], false, false); if (isset($tmp[1])) { list($resource_path, $thumb_path) = $tmp; - file_put_contents("$resource_path/redirect.txt", - $head_vars['alternative_path']); + if (!empty($head_vars['alternative_path'])) { + file_put_contents( + "$resource_path/redirect.txt", + $head_vars['alternative_path']); + } else if (file_exists( + "$resource_path/redirect.txt") ) { + unlink("$resource_path/redirect.txt"); + } } } if (!isset($_FILES['page_resource']['name']) || diff --git a/src/models/GroupModel.php b/src/models/GroupModel.php index dcb7108d9..72ee7ef4a 100644 --- a/src/models/GroupModel.php +++ b/src/models/GroupModel.php @@ -1204,7 +1204,8 @@ class GroupModel extends Model implements MediaConstants $group_path = "$group_prefix_path/$group_page_folder"; $thumb_path = "$thumb_prefix_path/$thumb_page_folder"; if (file_exists($group_path) && file_exists($thumb_path)) { - if (file_exists($group_path . "/$redirect_filename")) { + if ($check_redirect && + file_exists($group_path . "/$redirect_filename")) { $tmp_path = file_get_contents($group_path . "/$redirect_filename"); if (is_dir($tmp_path)) { @@ -1606,7 +1607,7 @@ class GroupModel extends Model implements MediaConstants $params = [$group_id, $locale_tag]; foreach ($filter_parts as $part) { if ($part != "") { - $like .= " AND UPPER(TITLE) LIKE ? "; + $like .= " AND LOWER(TITLE) LIKE LOWER(?) "; $params[] = "%$part%"; } } @@ -1623,7 +1624,7 @@ class GroupModel extends Model implements MediaConstants $sql = "SELECT TITLE, PAGE AS DESCRIPTION FROM GROUP_PAGE WHERE GROUP_ID = ? AND LOCALE_TAG= ? AND LENGTH(PAGE) > 0 - $like ORDER BY UPPER(TITLE) ASC ". + $like ORDER BY LOWER(TITLE) ASC ". $db->limitOffset($limit, $num); $result = $db->execute($sql, $params); $i = 0; diff --git a/src/models/Model.php b/src/models/Model.php index 5ad87f949..adb530174 100755 --- a/src/models/Model.php +++ b/src/models/Model.php @@ -409,7 +409,7 @@ class Model implements CrawlConstants { $db = $this->db; $sql = "SELECT USER_ID FROM USERS WHERE - UPPER(USER_NAME) = UPPER(?) ". $db->limitOffset(1); + LOWER(USER_NAME) = LOWER(?) ". $db->limitOffset(1); $result = $db->execute($sql, [$username]); if (!$result) { return false; @@ -457,23 +457,23 @@ class Model implements CrawlConstants $where .= $where_and; switch ($comparison) { case "=": - $where .= "$field_name='". - $db->escapeString($value)."'"; + $where .= "LOWER($field_name)=LOWER('". + $db->escapeString($value)."')"; break; case "!=": - $where .= "$field_name!='". - $db->escapeString($value)."'"; + $where .= "LOWER($field_name)!=LOWER('". + $db->escapeString($value)."')"; break; case "CONTAINS": - $where .= "UPPER($field_name) LIKE UPPER('%". + $where .= "LOWER($field_name) LIKE LOWER('%". $db->escapeString($value)."%')"; break; case "BEGINS WITH": - $where .= "UPPER($field_name) LIKE UPPER('". + $where .= "LOWER($field_name) LIKE LOWER('". $db->escapeString($value)."%')"; break; case "ENDS WITH": - $where .= "UPPER($field_name) LIKE UPPER('%". + $where .= "LOWER($field_name) LIKE LOWER('%". $db->escapeString($value)."')"; break; } diff --git a/src/models/RoleModel.php b/src/models/RoleModel.php index 50c6383f6..9dd4cf1a0 100644 --- a/src/models/RoleModel.php +++ b/src/models/RoleModel.php @@ -125,7 +125,7 @@ class RoleModel extends Model $like = ""; $param_array = [$user_id]; if ($filter != "") { - $like = "AND R.NAME LIKE ?"; + $like = "AND LOWER(R.NAME) LIKE LOWER(?)"; $param_array[] = "%".$filter."%"; } $sql = "SELECT LOCALE_ID FROM LOCALE ". @@ -158,7 +158,7 @@ class RoleModel extends Model $like = ""; $param_array = [$user_id]; if ($filter != "") { - $like = "AND R.NAME LIKE ?"; + $like = "AND LOWER(R.NAME) LIKE LOWER(?)"; $param_array[] = "%".$filter."%"; } $sql = "SELECT COUNT(*) AS NUM ". @@ -238,7 +238,7 @@ class RoleModel extends Model public function getRole($rolename) { $db = $this->db; - $sql = "SELECT * FROM ROLE WHERE UPPER(NAME) = UPPER(?) " . + $sql = "SELECT * FROM ROLE WHERE LOWER(NAME) = LOWER(?) " . $db->limitOffset(1); $result = $db->execute($sql, [$rolename]); if (!$result) { diff --git a/src/models/SigninModel.php b/src/models/SigninModel.php index f61381641..3771a1066 100755 --- a/src/models/SigninModel.php +++ b/src/models/SigninModel.php @@ -56,8 +56,7 @@ class SigninModel extends Model return false; } $row = $db->fetchArray($result); - return ($username == $row['USER_NAME'] && - L\crawlCrypt($password, $row['PASSWORD']) == $row['PASSWORD']) ; + return L\crawlCrypt($password, $row['PASSWORD']) == $row['PASSWORD'] ; } /** * Get user details from database @@ -68,8 +67,8 @@ class SigninModel extends Model public function getUserDetails($username) { $db = $this->db; - $sql = "SELECT USER_NAME, PASSWORD,ZKP_PASSWORD FROM USERS ". - "WHERE USER_NAME = ? " . $db->limitOffset(1); + $sql = "SELECT USER_NAME, PASSWORD, ZKP_PASSWORD FROM USERS ". + "WHERE LOWER(USER_NAME) = LOWER(?) " . $db->limitOffset(1); $i = 0; do { if ($i > 0) { @@ -110,7 +109,7 @@ class SigninModel extends Model $v = $row['ZKP_PASSWORD']; $rp = bcmod(bcmul($x, bcmod(bcpow($v, $e), $n)), $n); $lp = bcmod(bcmul($y, $y), $n); - return ($username == $row['USER_NAME'] && bccomp($rp, $lp) == 0); + return (bccomp($rp, $lp) == 0); } /** * Checks that a username email pair is valid @@ -124,7 +123,7 @@ class SigninModel extends Model { $db = $this->db; $sql = "SELECT USER_NAME, EMAIL FROM USERS ". - "WHERE USER_NAME = ? " . $db->limitOffset(1); + "WHERE LOWER(USER_NAME) = LOWER(?) " . $db->limitOffset(1); $result = $db->execute($sql, [$username]); if (!$result) { @@ -132,7 +131,7 @@ class SigninModel extends Model } $row = $db->fetchArray($result); - return ($username == $row['USER_NAME'] && $email == $row['EMAIL']) ; + return email == $row['EMAIL']; } /** * Get the user_name associated with a given userid @@ -148,7 +147,7 @@ class SigninModel extends Model $result = $db->execute($sql, [$user_id]); $row = $db->fetchArray($result); $username = $row['USER_NAME']; - return $username; + return mb_strtolower($username); } /** * Get the email associated with a given user_id @@ -163,7 +162,7 @@ class SigninModel extends Model USER_ID = ? " . $db->limitOffset(1); $result = $db->execute($sql, [$user_id]); $row = $db->fetchArray($result); - $email = $row['EMAIL']; + $email = mb_strtolower($row['EMAIL']); return $email; } /** @@ -177,7 +176,7 @@ class SigninModel extends Model public function changeEmail($username, $email) { $sql = "UPDATE USERS SET EMAIL= ? WHERE USER_NAME = ? "; - $result = $this->db->execute($sql, [$email, $username]); + $result = $this->db->execute($sql, [mb_strtolower($email), $username]); return $result != false; } /** diff --git a/src/models/UserModel.php b/src/models/UserModel.php index d56b5967e..2e165d05b 100755 --- a/src/models/UserModel.php +++ b/src/models/UserModel.php @@ -254,7 +254,7 @@ class UserModel extends Model public function getUser($username) { $db = $this->db; - $sql = "SELECT * FROM USERS WHERE UPPER(USER_NAME) = UPPER(?) " . + $sql = "SELECT * FROM USERS WHERE LOWER(USER_NAME) = LOWER(?) " . $db->limitOffset(1); $result = $db->execute($sql, [$username]); if (!$result) { @@ -277,7 +277,7 @@ class UserModel extends Model public function getUserByEmailTime($email, $creation_time) { $db = $this->db; - $sql = "SELECT * FROM USERS WHERE UPPER(EMAIL) = UPPER(?) + $sql = "SELECT * FROM USERS WHERE LOWER(EMAIL) = LOWER(?) AND CREATION_TIME=? " . $db->limitOffset(1); $result = $db->execute($sql, [$email, $creation_time]); if (!$result) { @@ -376,6 +376,7 @@ class UserModel extends Model USER_NAME, EMAIL, PASSWORD, STATUS, HASH, CREATION_TIME, ZKP_PASSWORD) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?,?)"; + $username = mb_strtolower($username); $result = $db->execute($sql, [$firstname, $lastname, $username, $email, L\crawlCrypt($password), $status, L\crawlCrypt($username . C\AUTH_KEY . $creation_time), @@ -385,7 +386,7 @@ class UserModel extends Model * Add a user with a given username and password to the list of users * that can login to the admin panel * - * @param string $username the username of the user to be added + * @param string $user_name the username of the user to be added * @param string $password the password in plaintext * of the user to be added, and ZKP auth not being used (else * this can be the empty string) @@ -407,6 +408,7 @@ class UserModel extends Model USER_NAME, EMAIL, PASSWORD, STATUS, HASH, CREATION_TIME, ZKP_PASSWORD) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?,?)"; + $username = mb_strtolower($username); $result = $db->execute($sql, [$firstname, $lastname, $username, $email, L\crawlCrypt($password), $status, L\crawlCrypt($username . C\AUTH_KEY . $creation_time), @@ -463,9 +465,14 @@ class UserModel extends Model clearstatcache($folder."/user_icon.jpg"); } unset($user['USER_ID']); - unset($user['USER_NAME']); + unset($user['IMAGE_STRING']); unset($user['USER_ICON']); + $user['USER_NAME'] = mb_strtolower($this->getUserName( + $user_id)); + if (empty($user['USER_NAME'])) { + unset($user['USER_NAME']); + } $sql = "UPDATE USERS SET "; $comma =""; $params = []; diff --git a/src/scripts/basic.js b/src/scripts/basic.js index bc057d3db..ce286e9d5 100755 --- a/src/scripts/basic.js +++ b/src/scripts/basic.js @@ -263,11 +263,11 @@ function initializeFileHandler(drop_id, file_id, max_size, drop_kind, types, } var request = new XMLHttpRequest(); if (k > 0) { - request.upload.addEventListener("progress", uploadProgress, false); + listen(request.upload, "progress", uploadProgress, false); } - request.addEventListener("load", uploadComplete, false); - request.addEventListener("error", uploadFailed, false); - request.addEventListener("abort", uploadCanceled, false); + listen(request, "load", uploadComplete, false); + listen(request, "error", uploadFailed, false); + listen(request, "abort", uploadCanceled, false); //keep ie happy var submit_to = (parent_form.action) ? parent_form.action : document.location; diff --git a/src/scripts/slidy.js b/src/scripts/slidy.js index 23fa803d6..ecf58387a 100644 --- a/src/scripts/slidy.js +++ b/src/scripts/slidy.js @@ -60,6 +60,7 @@ var w3c_slidy = { // object elements. The work around is to save width/height attributes // and then to recompute absolute width/height dimensions on resizing objects: [], + up_link: null, // attach initialiation event handlers set_up: function () { var init = function() { @@ -72,8 +73,8 @@ var w3c_slidy = { } }, hide_slides: function () { - if (document.body && !w3c_slidy.initialized) { - document.body.style.visibility = "hidden"; + if (this.body && !w3c_slidy.initialized) { + this.body.style.visibility = "hidden"; } else { setTimeout(w3c_slidy.hide_slides, 50); } @@ -85,14 +86,19 @@ var w3c_slidy = { window.resizeBy(0, 1); }, init: function () { - document.body.style.visibility = "visible"; + // if (slide_elt = document.getElementById("slide-show")) { + // this.body = slide_elt; + //} else { + this.body = document.body; + // } + this.body.style.visibility = "visible"; this.init_localization(); this.add_toolbar(); this.wrap_implicit_slides(); this.collect_slides(); this.collect_notes(); this.collect_backgrounds(); - this.objects = document.body.getElementsByTagName("object"); + this.objects = this.body.getElementsByTagName("object"); this.patch_anchors(); this.slide_number = this.find_slide_number(location.href); window.offscreenbuffering = true; @@ -107,7 +113,7 @@ var w3c_slidy = { this.want_toolbar = 0; } // work around for opera bug - this.is_xhtml = (document.body.tagName == "BODY" ? false : true); + this.is_xhtml = (this.body.tagName == "BODY" ? false : true); if (this.slides.length > 0) { var slide = this.slides[this.slide_number]; if (this.slide_number > 0) { @@ -130,8 +136,8 @@ var w3c_slidy = { // Tap events behave too weirdly to support clicks reliably on // iPhone and iPad, so exclude these from click handler if (!this.keyboardless) { - this.add_listener(document.body, "click", this.mouse_button_click); - this.add_listener(document.body, "mousedown", + this.add_listener(this.body, "click", this.mouse_button_click); + this.add_listener(this.body, "mousedown", this.mouse_button_down); } this.add_listener(document, "keydown", this.key_down); @@ -209,7 +215,7 @@ var w3c_slidy = { } return false; }; - document.body.insertBefore(toc, document.body.firstChild); + this.body.insertBefore(toc, this.body.firstChild); return toc; }, is_shown_toc: function () { @@ -411,12 +417,12 @@ var w3c_slidy = { }, // prepare for printing ### OBSOLETE ### show_all_slides: function () { - this.remove_class(document.body, "single_slide"); + this.remove_class(this.body, "single_slide"); this.set_visibility_all_incremental("visible"); }, // restore after printing ### OBSOLETE ### single_slide_view: function () { - this.add_class(document.body, "single_slide"); + this.add_class(this.body, "single_slide"); this.set_visibility_all_incremental("visible"); this.last_shown = this.previous_incremental_item(null); }, @@ -656,7 +662,7 @@ var w3c_slidy = { "next slide, click help below for more details"; } this.add_listener(prompt, "click", function (e) { - document.body.removeChild(prompt); + this.body.removeChild(prompt); w3c_slidy.stop_propagation(e); if (e.cancel != undefined) { e.cancel = true; @@ -666,10 +672,10 @@ var w3c_slidy = { } return false; }); - document.body.appendChild(prompt); + this.body.appendChild(prompt); this.initial_prompt = prompt; setTimeout(function() { - document.body.removeChild(prompt); + w3c_slidy.body.removeChild(prompt); }, 5000); }, add_toolbar: function () { @@ -705,12 +711,18 @@ var w3c_slidy = { left.appendChild(contents); var gap2 = document.createTextNode(" "); left.appendChild(gap2); - if (typeof toolbar_links !== 'undefined') { + var links = document.getElementsByTagName("link"); + for (var i = 0; i < links.length; i++) { + if (links[i].getAttribute("rel") == "prev" ) { + w3c_slidy.up_link = links[i].getAttribute("href"); + } + } + if (w3c_slidy.up_link) { var contents = this.create_element("a"); - contents.setAttribute("href", slideshow_parent); + contents.setAttribute("href", w3c_slidy.up_link); contents.setAttribute("title", - this.localize("table of contents")); - contents.innerHTML = this.localize("contents?"); + this.localize("Pre-slideshow link")); + contents.innerHTML = this.localize("up?"); left.appendChild(contents); } var copyright = this.find_copyright(); @@ -742,7 +754,7 @@ var w3c_slidy = { }; this.slide_number_element = counter; this.set_eos_status(false); - document.body.appendChild(this.toolbar); + this.body.appendChild(this.toolbar); }, // wysiwyg editors make it hard to use div elements // e.g. amaya loses the div when you copy and paste @@ -757,13 +769,13 @@ var w3c_slidy = { } for (i = 0; i < headings.length; ++i) { heading = headings[i]; - if (heading.parentNode != document.body) { + if (heading.parentNode != this.body) { continue; } node = heading.nextSibling; div = document.createElement("div"); this.add_class(div, "slide"); - document.body.replaceChild(div, heading); + this.body.replaceChild(div, heading); div.appendChild(heading); while (node) { if (node.nodeType == 1) { // an element @@ -780,7 +792,7 @@ var w3c_slidy = { } } next = node.nextSibling; - node = document.body.removeChild(node); + node = this.body.removeChild(node); div.appendChild(node); node = next; } @@ -798,7 +810,7 @@ var w3c_slidy = { // return new array of all slides collect_slides: function () { var slides = new Array(); - var divs = document.body.getElementsByTagName("div"); + var divs = this.body.getElementsByTagName("div"); for (var i = 0; i < divs.length; ++i) { div = divs.item(i); if (this.has_class(div, "slide")) { @@ -822,7 +834,7 @@ var w3c_slidy = { // return new array of all <div class="handout"> collect_notes: function () { var notes = new Array(); - var divs = document.body.getElementsByTagName("div"); + var divs = this.body.getElementsByTagName("div"); for (var i = 0; i < divs.length; ++i) { div = divs.item(i); if (this.has_class(div, "handout")) { @@ -838,7 +850,7 @@ var w3c_slidy = { // including named backgrounds e.g. class="background titlepage" collect_backgrounds: function () { var backgrounds = new Array(); - var divs = document.body.getElementsByTagName("div"); + var divs = this.body.getElementsByTagName("div"); for (var i = 0; i < divs.length; ++i) { div = divs.item(i); if (this.has_class(div, "background")) { @@ -873,7 +885,7 @@ var w3c_slidy = { this.blur(); self.disable_slide_click = true; }; - var anchors = document.body.getElementsByTagName("a"); + var anchors = this.body.getElementsByTagName("a"); for (var i = 0; i < anchors.length; ++i) { if (window.addEventListener) { anchors[i].addEventListener("click", handler, false); @@ -1312,9 +1324,9 @@ var w3c_slidy = { // enables cross browser use of relative width/height // on object elements for use with SVG and Flash media w3c_slidy.adjust_object_dimensions(width, height); - if (document.body.style.fontSize != + if (this.body.style.fontSize != w3c_slidy.sizes[w3c_slidy.size_index]) { - document.body.style.fontSize = + this.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; } w3c_slidy.last_width = width; @@ -1399,8 +1411,8 @@ var w3c_slidy = { document.documentElement.scrollLeft) { return document.documentElement.scrollLeft; } - if (document.body) { - return document.body.scrollLeft; + if (this.body) { + return this.body.scrollLeft; } return 0; }, @@ -1412,8 +1424,8 @@ var w3c_slidy = { document.documentElement.scrollTop) { return document.documentElement.scrollTop; } - if (document.body) { - return document.body.scrollTop; + if (this.body) { + return this.body.scrollTop; } return 0; }, @@ -1446,8 +1458,8 @@ var w3c_slidy = { }, document_height: function () { var sh, oh; - sh = document.body.scrollHeight; - oh = document.body.offsetHeight; + sh = this.body.scrollHeight; + oh = this.body.offsetHeight; if (sh && oh) { return (sh > oh ? sh : oh); } @@ -1459,7 +1471,7 @@ var w3c_slidy = { --w3c_slidy.size_index; } w3c_slidy.toolbar.style.display = "none"; - document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; + this.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; var slide = w3c_slidy.slides[w3c_slidy.slide_number]; w3c_slidy.hide_slide(slide); w3c_slidy.show_slide(slide); @@ -1472,7 +1484,7 @@ var w3c_slidy = { ++w3c_slidy.size_index; } w3c_slidy.toolbar.style.display = "none"; - document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; + this.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; var slide = w3c_slidy.slides[w3c_slidy.slide_number]; w3c_slidy.hide_slide(slide); w3c_slidy.show_slide(slide); @@ -1643,6 +1655,9 @@ var w3c_slidy = { } else if (key == 72) {// H for help window.location = w3c_slidy.help_page; return w3c_slidy.cancel(event); + } else if (key == 85 && w3c_slidy.up_link) { //U for up link + window.location = w3c_slidy.up_link; + return w3c_slidy.cancel(event); } return true; }, diff --git a/src/views/elements/WikiElement.php b/src/views/elements/WikiElement.php index 4daefccba..10db07c5a 100644 --- a/src/views/elements/WikiElement.php +++ b/src/views/elements/WikiElement.php @@ -558,7 +558,8 @@ class WikiElement extends Element implements CrawlConstants $base_url .= "&settings=".$data['settings']; } $thumb_prefix = $data['RESOURCES_INFO']['thumb_prefix']; - $default_thumb = $data['RESOURCES_INFO']['default_thumb']; + $default_thumb = C\BASE_URL . + $data['RESOURCES_INFO']['default_thumb']; if (count($data['RESOURCES_INFO']['resources']) > 0) { e('<table >'); $seen_resources = [];