]> www.wagner.pp.ru Git - oss/stilllife.git/blobdiff - templates/basicset/page.js
Добавил замену "." в имени пользователя на "\.", поскольку, попадая в регулярное...
[oss/stilllife.git] / templates / basicset / page.js
index 89fc24345733ddc2d4d15e71f137646ce6ecc61e..ed9e6778b131f15d85ba4551a98864e5cd6439fc 100644 (file)
@@ -14,8 +14,8 @@ function getUserName() {
        var end = cookietext.indexOf(";",start);
        if (end == -1) end=cookietext.length;
        var value= cookietext.substring(start,end);
-       forumUser = value;
-       return decodeURIComponent(value);
+       forumUser = decodeURIComponent(value);
+       return forumUser;
 }
 //
 // Шаблон страницы содержит два специальных тэга link с rel=forum-script
@@ -29,14 +29,23 @@ function getBaseURLs() {
        for (i=0;i<links.length;i++) {
                if (links[i].rel == "forum-script") {
                        forumScriptUrl = links[i].href;
-               } else if (links[i].rel = "forum-user-list") {
+               } else if (links[i].rel == "forum-user-list") {
                        userListUrl = links[i].href;
                }
        }       
 }
 function showUser(username) {
-       getBaseURLs();
        if (!username) {
+               // Прячем ссылку на профиль 
+               var links=document.getElementsByTagName("a");
+               for (i=0;i<links.length;i++) {
+                       if (links[i].href.substring(0,forumScriptUrl.length)==
+                       forumScriptUrl && links[i].href.indexOf("profile=")!=-1) {
+                               while (links[i].childNodes.length>0) {
+                                       links[i].removeChild(links[i].childNodes[0]);
+                               }       
+                       }       
+               }
                return ;
        }
        userStatus = getUserRights(username);
@@ -61,7 +70,7 @@ function showUser(username) {
                        }       
                        links[i].appendChild(document.createTextNode("Выйти"));
                        links[i].href=forumScriptUrl+"?logout=1";
-               }               
+               }               
        }       
 }
 
@@ -74,31 +83,72 @@ function getUserRights(user) {
     var status="user";
     var xhr=getXMLHttpRequest();
     if(!xhr) return status;
-       // Strip http:// prefix from OpenID url
-       if (user.substring(0,7) == "http://") {
-               user=user.substring(7,user.length);
-       } 
+    
+    // Strip http:// prefix from OpenID url
+    if (user.substring(0,7) == "http://")
+       user=user.substring(7,user.length);
+    
+    /*
+    * Определяем, на какую глубину относительно корня сайта "закопана" ткущая
+    * страница. Нужно для рекусивного опроса структуры форума на предмет прав
+    * пользователя.
+    */
     var hr=location.href.match(/^\w+:\/\/[^/]*\/([^?#]+)/);
     if(hr==null) return status;
     var depth=hr[1].split(/\//).length;
-    var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+user+"\n","m");
+    
+    /* 
+    * Заменяем в имени (OpenID) пользователя "." на "\.", поскольку строка
+    * попадает в RegExp и наличие "." приведёт к тому, что функция не сможет
+    * различить "ab.cd", "ab-cd" и "abecd".
+    */
+    var normalizedUser=user.replace(/\./,"\\.");
+    
+    /*
+    * С помощью регулярного выражения ищем имя мользователя и предшествующий ему
+    * заголовок раздела, определяющий уровень прав.
+    */
+    var re=new RegExp("\n\\\[\s*(admins|moderators|banned)\s*\\\]\s*[^[]*\n"+normalizedUser+"\n","m");
     for(var path="",i=0;i<depth;path+="../",i++) {
+       /*
+       * Поднимаясь по дереву каталогов ищем на каждом уровне файл с правами
+       */
        xhr.open("GET", path+"perms.txt",false);
        xhr.send("");
        if(xhr.status!=200) continue;
        
+       // Применяем регулярное выражение к тексту файла.
        var perms=("\n"+xhr.responseText+"\n").match(re);
+       /*
+       * Определяем уровень прав для текущего подфорума. Если имя пользователя
+       * упоминается в файле, значит его права отличаются от простого
+       * пользователя.
+       */
        if(perms!=null) {
+           // Если пользователь забанен на этом уровне, прекращаем поиск
            if(perms[1]=="banned") return "banned";
+           // Если пользователь на данном уровне - админ, прекращаем поиск -
+           // дальше искать нечего
            if(perms[1]=="admins") return "admin";
+           /*
+           * В противном случае остаётся третий вариант - модератор.
+           * Простые пользователи в файлах прав не отмечаются.
+           * Поиск продолжаем, поскольку модератор может так же быть и
+           * администратором
+           */
            status="moderator";
-
        }
        
+       /*
+       * Проверяем, не достигли ли мы корня форума. Это определяется наличием
+       * файла ".forum" на текущем уровне
+       */
        xhr.open("GET", path+".forum",false);
        xhr.send("");
+       // Файл либо доступен (200), либо не доступен, но существует (403)
        if(xhr.status==403 || xhr.status==200) break;
     }
+    
     return status;
 }
 
@@ -107,29 +157,99 @@ function getUserRights(user) {
 // управления, которые не разрешены данному пользователю
 //
 function customizePage() {
+       getBaseURLs();
        showUser(getUserName());
+       hideDeniedOperations();
 }
 // Заготовка на будущее
 function hideDeniedOperations() {
 
-    var user =getUserName();
-       var rights;
-       if (user) {     
-               rights = getUserRights;
+    var user = forumUser;
+       var rights = userStatus;
+       if (user && user.indexOf("http://")==0) {
+               user=user.substring(7,user.length);
        }
        if (rights == "admin") {
                // Админу можно все
                return;
-       } else if (rights == "moderator") {
-               // Убираем только администраторскую функцию setrights
-       } else if (user) {
-           // Убираем модераторские функции move и newforum
+       } 
+       var links=document.getElementsByTagName("a");
+       var forms=document.getElementsByTagName("form");
+       // Убираем только администраторскую функцию setrights
+       for (i=0;i<links.length;i++) {
+               if (links[i].href.indexOf("setrights=") != -1) {
+                       links[i].style.visibility="hidden";
+               }       
+       }
+       for (i=0;i<forms.length;i++) {
+               if (forms[i].className == "foruminfo") {
+                       var inputs = forms[i].getElementsByTagName("input");
+                       for (j=0;j<inputs.length;j++) {
+                               if (inputs[j].name == "setrights") {
+                                       inputs[j].style.visibility="hidden";
+                               }
+                       }       
+               }
+       }       
+       if (rights == "moderator") {
+               return;
+       }
+       for (i=0;i<forms.length;i++) {
+               if (forms[i].className == "foruminfo") {
+                       forms[i].style.display="none";
+               } else if (forms[i].className == "msginfo"||
+                       forms[i].className=="topicinfo") {
+                       if (rights=="banned") {
+                               forms[i].style.display="none";
+                       } else {
+                               var inputs = forms[i].getElementsByTagName("input"); 
+                               var my_item = false;
+                               for (j=0;j<inputs.length;j++) {
+                                       if (inputs[j].name == "move") {
+                                               inputs[j].style.visibility="hidden";
+                                       }
+                               }       
+                               if (user) {
+                                       for (j=0;j<inputs.length;j++) {
+                                               if (inputs[j].name == "author") {
+                                                       my_item = inputs[j].value == user;
+                                                       break;
+                                               }       
+                                       }
+                               }
+                               if (!my_item) {
+                                       for (j=0;j<inputs.length;j++) {
+                                               if (inputs[j].name == "edit" ||
+                                                       inputs[j].name == "delete") {
+                                                       inputs[j].style.visibility="hidden";
+                                               }
+                                       }
+                               }       
+                       } 
+               }          
+       }       
+       // Убираем все модераторские операции из ссылок
+       for (i=0;i<links.length;i++) {
+               if (links[i].href.indexOf("newforum=")!=-1 ||
+                               links[i].href.indexOf("move=")!=-1) {
+                       links[i].style.visibility="hidden";
+               }       
                
-               // Пробегаемся по всем репликам и там, где автор != user
-               // убираем edit и delete
-    } else {
-           // Убираем вообще все, включая reply
-       }        
+       }       
+       if (!forumUser || rights == "banned") {
+       for (i=0;i<links.length;i++) {
+               if (links[i].href.indexOf("newtopic=")!=-1 ||
+                       links[i].href.indexOf("edit=")!=-1 ||
+                       links[i].href.indexOf("delete=")!=-1||
+                       (rights == "banned" && links[i].href.indexOf("reply=")!=-1)) {
+                               links[i].style.visibility="hidden";
+               }               
+       }       
+       return; 
+       }
+       // Убираем операции edit и delete для тех объектов, где юзер не
+       // автор
+
        
 }
 
@@ -137,25 +257,42 @@ function hideDeniedOperations() {
 //  Показывает встроенную в страницу форму под текущей ссылкой
 //  Использование  <a href="forum?operation=1&id=id" //  onClick="showform(this,operation)">
 function showForm(link, formName) {
-   var linktext=link.href;
-   // Разобрать параметры, получить значение id
-   var start =linktext.indexOf("id=");
-   var id;
-   if (start!=-1) {
-               start+=3;
-               var end = linktext.indexOf("&",start);
-               if (end==-1) end=linktext.length;
-               id = linktext.substring(start,end);
-   }   
-   var f=document.forms[formName];
+       var id;
+       var action;
+   if (link.form) {
+       link = link.form;
+       id = link.elements["id"].value;
+       action = link.action;
+   } else {    
+       var linktext=link.href;
+       // Разобрать параметры, получить значение id
+       var start =linktext.indexOf("id=");
+       if (start!=-1) {
+                       start+=3;
+                       var end = linktext.indexOf("&",start);
+                       if (end==-1) end=linktext.length;
+                       id = linktext.substring(start,end);
+       }       
+       start=linktext.indexOf("?");
+       action=linktext.substring(0,start);
+   }
+   var block = document.getElementById(formName);
+   var         f       = block.getElementsByTagName("form")[0];
+       f.action=action;
    if (id) {
       f.elements["id"].value=id;
    }
-   f.style.display="block";
    // позиционируем форму под текущей ссылкой.
-   return false;       
+   block.style.display="block";
+   link.parentNode.insertBefore(block,link.nextSibling);
+       window.setTimeout(function() {f.elements["text"].focus();},250);                
+   window
+   return false;
+}
+function hideForm(formId) {
+       var block = document.getElementById(formId);
+       block.style.display = "none";
 }
-
 /**
 * Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
 * если такой существует.