Attempt to make account usernames not case sensitive, a=chris

Chris Pollett [2016-02-06 21:Feb:th]
Attempt to make account usernames not case sensitive, a=chris
Filename
src/controllers/components/SocialComponent.php
src/models/GroupModel.php
src/models/Model.php
src/models/RoleModel.php
src/models/SigninModel.php
src/models/UserModel.php
src/scripts/basic.js
src/scripts/slidy.js
src/views/elements/WikiElement.php
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 .= "&amp;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 = [];
ViewGit