]> www.wagner.pp.ru Git - oss/stilllife.git/blobdiff - templates/basicset/page.js
DEbugged getUserRights
[oss/stilllife.git] / templates / basicset / page.js
index 9dc4c99cb65f85eae12400d4fb5232f57f769952..9eca966bb8ceaa642ba95ef0d49abc71d644312e 100644 (file)
@@ -3,6 +3,7 @@
 // Извлекает из кук имя текущего пользователя и возвращает его, а также
 // сохраняет в глобальной переменной forumUser;
 var forumUser;
+var userStatus;
 function getUserName() {
        var cookietext =document.cookie;
        var pos = cookietext.indexOf("sluser=");
@@ -14,7 +15,7 @@ function getUserName() {
        if (end == -1) end=cookietext.length;
        var value= cookietext.substring(start,end);
        forumUser = value;
-       return unescape(value);
+       return decodeURIComponent(value);
 }
 //
 // Шаблон страницы содержит два специальных тэга link с rel=forum-script
@@ -37,7 +38,8 @@ function showUser(username) {
        getBaseURLs();
        if (!username) {
                return ;
-       }       
+       }
+       userStatus = getUserRights(username);
        var links=document.getElementsByTagName("a");
        for (i=0;i<links.length;i++) {
                if (links[i].className == "userurl") {
@@ -51,6 +53,7 @@ function showUser(username) {
                                links[i].href=userListUrl+"/" + username;
                        }       
                        links[i].appendChild(document.createTextNode(username));
+                       links[i].className = userStatus;
                } else if (links[i].href.substring(0,forumScriptUrl.length)==
                        forumScriptUrl && links[i].href.indexOf("login=")!=-1) {
                        while (links[i].childNodes.length>0) {
@@ -61,14 +64,44 @@ function showUser(username) {
                }               
        }       
 }
+
 //
 // Добывает с сервера информацию о модераторах данного форума и
 // возвращает user, moderator или admin в зависисмости от статуса
 // указанного пользователя.  
 //
 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);
+       } 
+    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");
+    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";
+       }
+       
+       xhr.open("GET", path+".forum",false);
+       xhr.send("");
+       if(xhr.status==403 || xhr.status==200) break;
+    }
+    
+    return status;
 }
+
 // Обработчик body onLoad
 //  Пробегается по странице и прячет все элементы
 // управления, которые не разрешены данному пользователю
@@ -117,3 +150,24 @@ function showForm(link, formName) {
    // позиционируем форму под текущей ссылкой.
    return false;       
 }
+
+/**
+* Создаёт объект XMLHttpRequest, предварительно уничтожая существующий,
+* если такой существует.
+*/
+function getXMLHttpRequest()
+{
+    try {
+        return xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+    } catch (e) {
+        try {
+            return new ActiveXObject("Microsoft.XMLHTTP");
+        } catch (E) {
+           if (typeof XMLHttpRequest!='undefined')
+               return new XMLHttpRequest();
+        }
+    }
+
+    return false;
+}
+