]> wagner.pp.ru Git - oss/stilllife.git/commitdiff
Добавил замену "." в имени пользователя на "\.", поскольку, попадая в регулярное...
authorsafir <safir>
Thu, 8 May 2008 05:11:02 +0000 (05:11 +0000)
committersafir <safir>
Thu, 8 May 2008 05:11:02 +0000 (05:11 +0000)
Вставил коментарии в код функции, поскольку с трудом разобрался в этой куче регулярных выражений.

templates/basicset/page.js

index ec6ed9c1dae65cd24ebd1d3633c5bd63e3f2ad87..ed9e6778b131f15d85ba4551a98864e5cd6439fc 100644 (file)
@@ -83,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;
 }