home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / AIMP2 / aimp_2.61.583.exe / $TEMP / YandexPackSetup.msi / filCEAF408DE1FB29E2F6B09FFBDDCAFCB0 < prev    next >
Text File  |  2010-07-12  |  21KB  |  735 lines

  1. var gYaMFD = {
  2.   URL: {
  3.     "mfd-counter": "http://export.yandex.ru/for/{domain}/counters.xml",
  4.     "mfd-list": "http://mail.yandex.ru/for/{domain}/api/barlist",
  5.   },
  6.   
  7.   __inited: false,
  8.   
  9.   init: function() {
  10.     if (!this.__inited) {
  11.       this.__inited = true;
  12.       OBSERVER_SERVICE.addObserver(this, "cookie-changed", false);
  13.       OBSERVER_SERVICE.addObserver(this, "profile-before-change", false);
  14.     }
  15.     
  16.     this._getCookies({
  17.       path: /^\/for/
  18.     }).forEach(function(aCookieData) {
  19.       this._setDataFromCookie(aCookieData);
  20.     }, this);
  21.     
  22.     this.setUpdateTimer();
  23.   },
  24.   
  25.   destroy: function() {
  26.     if (this.__inited) {
  27.       this.__inited = false;
  28.       
  29.       OBSERVER_SERVICE.removeObserver(this, "profile-before-change", false);
  30.       OBSERVER_SERVICE.removeObserver(this, "cookie-changed", false);
  31.       
  32.       this._logoutConnections.clear();
  33.       this.Users.clear();
  34.     }
  35.   },
  36.   
  37.   appendSessionData: function(aXmlListsData) {
  38.     this.Users.appendSessionData(aXmlListsData);
  39.   },
  40.   
  41.   getSessionDataForFlush: function() {
  42.     return this.Users.getSessionDataForFlush();
  43.   },
  44.   
  45.   get isLogin() {
  46.     return !!this.Users.getAllAuthUsers().length;
  47.   },
  48.   
  49.   getAllAuthUsers: function() {
  50.     return this.Users.getAllAuthUsers();
  51.   },
  52.   
  53.   _setDataFromCookie: function(aCookieData, aValue) {
  54.     switch (aCookieData.name) {
  55.       case "yandex_login":
  56.       case "Eda_id":
  57.         break;
  58.       
  59.       default:
  60.         return;
  61.     }
  62.     
  63.     let cookieValue = arguments.length == 2 ? aValue : aCookieData.value;
  64.     
  65.     this.Users.updateUser(aCookieData.path.replace(/^\/for\//, ""),
  66.                           aCookieData.name == "yandex_login" ?
  67.                               { login: cookieValue } :
  68.                               { session: cookieValue });
  69.   },
  70.   
  71.   _getCookies: function(aCookiesProps) {
  72.     let res = [];
  73.     
  74.     let timeNow = parseInt(Date.now() / 1000, 10);
  75.     
  76.     const nsICookie = Ci.nsICookie;
  77.     let cookiesEnum = gYaSearchService.cookieManager.enumerator;
  78.     
  79.     outerloop:
  80.     
  81.     while (cookiesEnum.hasMoreElements()) {
  82.       let cookie = cookiesEnum.getNext();
  83.       
  84.       if (cookie && cookie instanceof nsICookie &&
  85.           cookie.host == ".yandex.ru" && (cookie.expires == 0 || timeNow < cookie.expires))
  86.       {
  87.         for (let [propName, propValue] in Iterator(aCookiesProps)) {
  88.           if (propValue instanceof RegExp) {
  89.             if (!propValue.test(cookie[propName]))
  90.               continue outerloop;
  91.           } else {
  92.             if (cookie[propName] != propValue)
  93.               continue outerloop;
  94.           }
  95.         }
  96.         
  97.         let host = cookie.host;
  98.         let newCookie = {};
  99.         
  100.         for each (let prop in ["name", "value", "host", "path", "expires"])
  101.           newCookie[prop] = cookie[prop];
  102.         
  103.         res.push(newCookie);
  104.       }
  105.     }
  106.     
  107.     return res;
  108.   },
  109.   
  110.   _removeCookies: function(aCookiesProps) {
  111.     const cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
  112.     
  113.     this._getCookies(aCookiesProps).forEach(function(aCookieData) {
  114.       try {
  115.         cookieManager.remove(aCookieData.host, aCookieData.name, aCookieData.path, false);
  116.       } catch (ex) {}
  117.     });
  118.   },
  119.   
  120.   observe: function(aSubject, aTopic, aData) {
  121.     switch (aTopic) {
  122.       case "cookie-changed":
  123.         try {
  124.           aSubject.QueryInterface(Ci.nsICookie);
  125.         } catch(e) {}
  126.         
  127.         if (!(aSubject && aSubject instanceof Ci.nsICookie))
  128.           return;
  129.         
  130.         if (aSubject.host == ".yandex.ru" &&
  131.             aSubject.path.indexOf("/for/") == 0)
  132.         {
  133.           let val = "";
  134.           try {
  135.             val = aSubject.value.toString();
  136.           } catch(e) {}
  137.           
  138.           if (aData == "deleted" || !val)
  139.             val = "";
  140.           
  141.           this._setDataFromCookie(aSubject, val);
  142.         }
  143.         
  144.         break;
  145.       
  146.       case "profile-before-change":
  147.         this.destroy();
  148.         break;
  149.       
  150.       default:
  151.         break;
  152.     }
  153.   },
  154.   
  155.   getSessionCookie: function(aDomain, aLogin) {
  156.     let cookiesProps = {
  157.       path: "/for/" + aDomain,
  158.       name: "Eda_id"
  159.     };
  160.     
  161.     return this._getCookies(cookiesProps)[0];
  162.   },
  163.   
  164.   getLoginCookie: function(aDomain) {
  165.     let cookiesProps = {
  166.       path: "/for/" + aDomain,
  167.       name: "yandex_login"
  168.     };
  169.     
  170.     return this._getCookies(cookiesProps)[0];
  171.   },
  172.   
  173.   getDataForAllUsers: function() {
  174.     return this.Users.getDataForAllUsers();
  175.   },
  176.   
  177.   getDataForUser: function(aLogin) {
  178.     return this.Users.getDataForUser(aLogin);
  179.   },
  180.   
  181.   getTopAuth: function() {
  182.     return this.Users.getTopAuth();
  183.   },
  184.   
  185.   isLoginHasAuth: function(aLogin) {
  186.     return this.Users.isLoginHasAuth(aLogin);
  187.   },
  188.   
  189.   softDropAuthForLogin: function(aLogin) {
  190.     if (this.Users.softDropAuthForLogin(aLogin) == true)
  191.       OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "mfd-list");
  192.   },
  193.   
  194.   _getDomain: function(aBoxname) {
  195.     return aBoxname.split("@")[1];
  196.   },
  197.   
  198.   dropAuthForDomain: function(aLogin, aCheckSwapUsersOnFinish) {
  199.     if (!aLogin)
  200.       return false;
  201.     
  202.     let loginData = this.Users.getAuthUserForDomain(this._getDomain(aLogin));
  203.     if (!loginData)
  204.       return false;
  205.     
  206.     return this.dropAuthForLogin(loginData.@boxname.toString(), false, aCheckSwapUsersOnFinish);
  207.   },
  208.   
  209.   dropAuthForLogin: function(aLogin, aForgetLogin, aCheckSwapUsersOnFinish) {
  210.     if (!aLogin)
  211.       return false;
  212.     
  213.     if (aForgetLogin)
  214.       gYaAuth.PasswordManager.removeUserData(aLogin, "mfd");
  215.     
  216.     this._logoutConnections.cancel(aLogin);
  217.     
  218.     let domain = this._getDomain(aLogin);
  219.     
  220.     let url = "https://passport.yandex.ru/for/" + domain + "/passport?mode=logout&target=bar" +
  221.               "&yu=" + encodeURIComponent(gYaSearchService.yaAuth.Cookies.getYandexCookie("yandexuid", false) || "");
  222.     
  223.     this.Users.softDropAuthForLogin(aLogin);
  224.     
  225.     this._logoutConnections.add(aLogin,
  226.         gYaSearchService.xmlHttpRequest(url, {
  227.           callbackFunc: this._dropAuthForLoginCallback.bind(this, domain, aLogin, aCheckSwapUsersOnFinish)
  228.         }));
  229.     
  230.     return true;
  231.   },
  232.   
  233.   _dropAuthForLoginCallback: function(aReq, aDomain, aLogin, aCheckSwapUsersOnFinish) {
  234.     this._logoutConnections.remove(aLogin);
  235.     
  236.     this._removeCookies({
  237.       name: "Eda_id",
  238.       path: "/for/" + aDomain
  239.     });
  240.     
  241.     this._removeCookies({
  242.       name: "yandex_login",
  243.       path: "/for/" + aDomain
  244.     });
  245.     
  246.     this._removeCookies({
  247.       name: "ed." + aDomain,
  248.       path: "/for"
  249.     });
  250.     
  251.     OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "login");
  252.     
  253.     if (aCheckSwapUsersOnFinish)
  254.       gYaAuth.checkSwapUsers();
  255.   },
  256.   
  257.   dropAuthForAllLogins: function() {
  258.     this.Users.getAllAuthUsers().forEach(function(aUserData) {
  259.       this.dropAuthForLogin(aUserData.boxname);
  260.     }, this);
  261.   },
  262.   
  263.   _logoutConnections: {
  264.     _connections: {},
  265.     
  266.     _getAliveConnection: function(aLogin) {
  267.       let connection = this._connections[aLogin];
  268.       try {
  269.         if (connection && connection.channel && connection.channel.isPending())
  270.           return connection;
  271.       } catch (ex) {}
  272.       
  273.       return null;
  274.     },
  275.     
  276.     add: function(aLogin, aRequest) {
  277.       this._connections[aLogin] = aRequest;
  278.     },
  279.     
  280.     cancel: function(aLogin) {
  281.       let connection = this._getAliveConnection(aLogin);
  282.       if (connection)
  283.         connection.channel.cancel(Cr.NS_BINDING_ABORTED);
  284.       
  285.       this.remove(aLogin);
  286.     },
  287.     
  288.     remove: function(aLogin) {
  289.       delete this._connections[aLogin];
  290.     },
  291.     
  292.     clear: function() {
  293.       this._connections = {};
  294.     }
  295.   },
  296.   
  297.   _updateTimer: null,
  298.   
  299.   setUpdateTimer: function(aTimeout) {
  300.     if (this._updateTimer)
  301.       this._updateTimer.cancel();
  302.     else
  303.       this._updateTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
  304.     
  305.     if (typeof aTimeout == "undefined")
  306.       aTimeout = gYaSearchService.checkTimeOut._MailAndFeeds || 0;
  307.     
  308.     let timeout = Math.max(0, aTimeout);
  309.     if (timeout > 0)
  310.       this._updateTimer.initWithCallback(this._updateTimerCallback, timeout, Ci.nsITimer.TYPE_ONE_SHOT);
  311.   },
  312.   
  313.   _updateTimerCallback: {
  314.     notify: function() gYaMFD.updateDataForAllAccounts()
  315.   },
  316.   
  317.   updateDataForAllAccounts: function() {
  318.     this.setUpdateTimer();
  319.     
  320.     this.Users.getAllAuthUsers().forEach(function(aUser) {
  321.       this.refreshHTTPData("mfd-counter", aUser.boxname);
  322.     }, this);
  323.   },
  324.   
  325.   checkNeedRefreshDataOnLocation: function(aURLPath, aDelay) {
  326.     let isMFDURL = /^for\//.test(aURLPath);
  327.     
  328.     if (isMFDURL && aURLPath.match(/^for\/([^\/]*)\//)) {
  329.       let domain = RegExp.$1.toLowerCase();
  330.       if (domain) {
  331.         let loginData = this.Users.getAuthUserForDomain(domain);
  332.         if (loginData && loginData.@v.toString() > "0")
  333.           this.refreshHTTPData("mfd-counter", loginData.@boxname, aDelay || 70000);
  334.       }
  335.     }
  336.     
  337.     return isMFDURL;
  338.   },
  339.   
  340.   refreshHTTPData: function(aType, aLogin, aDelay) {
  341.     new G_Timer(
  342.       function() {
  343.         gYaMFD._refreshHTTPData(aType, aLogin);
  344.       }, aDelay || 10
  345.     )
  346.   },
  347.   
  348.   _refreshHTTPData: function(aType, aLogin) {
  349.     let loginData = this.Users.getLoginData(aLogin);
  350.     if (!loginData)
  351.       return;
  352.     
  353.     if (aType == "mfd-counter") {
  354.       let timeNow = Date.now();
  355.       let lastRequestTime = parseInt(loginData.@lastRequestTime.toString(), 10);
  356.       if (Math.abs(timeNow - lastRequestTime) < 10 * 1000)
  357.         return;
  358.  
  359.       loginData.@lastRequestTime = timeNow;
  360.     }
  361.     
  362.     let url = this.URL[aType].replace(/\{domain\}/, loginData.@domain);
  363.     
  364.     gYaSearchService.refreshHTTPData(aType, {
  365.       url: url,
  366.       login: aLogin
  367.     });
  368.   },
  369.   
  370.   onResponse: function(aDataType, aResponseText, aData) {
  371.     let loginData = this.Users.getLoginData(aData.login);
  372.     if (!loginData)
  373.       return;
  374.     
  375.     let counterValue;
  376.     
  377.     switch (aDataType) {
  378.       case "mfd-counter":
  379.         let counterData = gYaSearchService.safeE4Xml(aResponseText, null, "s");
  380.         if (!counterData)
  381.           return;
  382.         
  383.         if (counterData.toXMLString() === "<s/>") {
  384.           this.softDropAuthForLogin(aData.login);
  385.           return;
  386.         }
  387.         
  388.         let errorStr = counterData.@e.toString() || "0";
  389.         
  390.         counterValue = (errorStr == "0" ? (parseInt(counterData.@v, 10) || 0) : 0);
  391.         
  392.         loginData.@v = counterValue;
  393.         loginData.@lastVisited = Date.now();
  394.         
  395.         if (counterValue > 0) {
  396.           this.refreshHTTPData("mfd-list", aData.login);
  397.         } else {
  398.           if (errorStr != "0")
  399.             loginData.list = <list/>;
  400.           
  401.           OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "mfd-list");
  402.         }
  403.         
  404.         loginData.@e = errorStr;
  405.         
  406.         break;
  407.       
  408.       case "mfd-list":
  409.         counterValue = parseInt(loginData.@v, 10) || 0;
  410.         
  411.         let permCounterValue = parseInt(loginData.@permCounter, 10) || 0;
  412.         
  413.         let msgURLPrefix = "http://mail.yandex.ru/for/" + loginData.@domain + "/message?ids=";
  414.         
  415.         let listData = gYaSearchService.parseMailListXMLString(aResponseText,
  416.                                                                loginData.@mailLastMaxId.toString(),
  417.                                                                msgURLPrefix);
  418.         if (!listData)
  419.           return;
  420.         
  421.         if (listData == "No Auth") {
  422.           this.softDropAuthForLogin(aData.login);
  423.           return;
  424.         }
  425.         
  426.         loginData.list = listData.list;
  427.         
  428.         if (listData.newLastMaxId)
  429.           loginData.@mailLastMaxId = listData.newLastMaxId;
  430.         
  431.         if (listData.newMailCounter > 0) {
  432.           if (listData.newMailCounter == gYaSearchService.maxUnreadInXML) {
  433.             let tmp = counterValue - permCounterValue;
  434.             listData.newMailCounter = tmp >= gYaSearchService.maxUnreadInXML ? tmp : 0;
  435.           }
  436.           
  437.           gYaSearchService.notifyAboutNewItems("mailList", listData.newMailCounter,
  438.                                                { from: listData.newLastItem.@from.toString(),
  439.                                                  title: listData.newLastItem.@title.toString(),
  440.                                                  mfdDomain: "/for/" + loginData.@domain.toString() });
  441.         }
  442.         
  443.         loginData.@permCounter = counterValue;
  444.         
  445.         OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "mfd-list");
  446.         
  447.         break;
  448.       
  449.       default:
  450.         return;
  451.     }
  452.   },
  453.   
  454.   decMailCounter: function(aMailId) {
  455.     this.Users.decMailCounter(aMailId);
  456.   }
  457. };
  458.  
  459. (function() {
  460.   
  461.   let UsersData = <mfd/>;
  462.   
  463.   let Users = {
  464.     _users: {},
  465.     
  466.     clear: function() {},
  467.     
  468.     appendSessionData: function(aXMLListsData) {
  469.       for each (let savedLoginData in aXMLListsData.login) {
  470.         let boxname = savedLoginData.@boxname.toString();
  471.         if (boxname && /@/.test(boxname)) {
  472.           let loginData = UsersData.login.(@boxname == boxname)[0];
  473.           if (!loginData)
  474.             loginData = this._createEmptyLoginData(boxname);
  475.           
  476.           ["permCounter", "lastVisited", "mailLastMaxId"]
  477.           .forEach(function(aPropName) {
  478.             this["@" + aPropName] = (savedLoginData["@" + aPropName] || "").toString();
  479.           }, loginData);
  480.           
  481.           loginData.@domain = boxname.split("@")[1];
  482.           
  483.           if (!loginData.parent())
  484.             UsersData.appendChild(loginData);
  485.         }
  486.       }
  487.     },
  488.     
  489.     getSessionDataForFlush: function() {
  490.       let mfdXML = <mfd/>;
  491.       
  492.       for each (let loginData in UsersData.login) {
  493.         let clonedLogin = <login boxname={loginData.@boxname.toString()}
  494.                                  permCounter={loginData.@permCounter.toString()}
  495.                                  lastVisited={loginData.@lastVisited.toString()}
  496.                                  mailLastMaxId={loginData.@mailLastMaxId.toString()}/>;
  497.         
  498.         mfdXML.appendChild(clonedLogin);
  499.       }
  500.       
  501.       return mfdXML;
  502.     },
  503.     
  504.     _createEmptyLoginData: function(aLogin) {
  505.       let nodeBefore = UsersData.login.(@boxname > aLogin)[0] || null;
  506.       let loginData = <login boxname={aLogin} domain={aLogin.split("@")[1]}
  507.                              auth="false" v="0" permCounter="0">
  508.                         <list/>
  509.                       </login>;
  510.       
  511.       UsersData.insertChildBefore(nodeBefore, loginData);
  512.       
  513.       let user = gYaAuth.Users.addUser(aLogin);
  514.       user.auth.loginState = gYaAuth.LOGIN_STATES.NO_AUTH;
  515.       
  516.       return loginData;
  517.     },
  518.     
  519.     updateUser: function(aDomain, aCookiesData) {
  520.       aDomain = aDomain.replace(/^\/for\//, "");
  521.       
  522.       let loginData,
  523.           authBefore = "false";
  524.       
  525.       if (aCookiesData.login) {
  526.         loginData = UsersData.login.(@boxname == aCookiesData.login)[0] ||
  527.                     this._createEmptyLoginData(aCookiesData.login);
  528.         
  529.         authBefore = loginData.@auth.toString();
  530.         
  531.         let sessionCookie = gYaMFD.getSessionCookie(aDomain, aCookiesData.login);
  532.         if (!sessionCookie) {
  533.           gYaMFD.softDropAuthForLogin(aCookiesData.login);
  534.         } else {
  535.           this.softDropAuthForDomain(aDomain);
  536.           loginData.@auth = true;
  537.         }
  538.       }
  539.       
  540.       if ("session" in aCookiesData) {
  541.         if (!aCookiesData.session) {
  542.           this.softDropAuthForDomain(aDomain);
  543.           
  544.         } else {
  545.           let loginCookie = gYaMFD.getLoginCookie(aDomain);
  546.           let login = loginCookie ? loginCookie.value : "";
  547.           
  548.           if (login) {
  549.             loginData = UsersData.login.(@boxname == login)[0] ||
  550.                         this._createEmptyLoginData(login);
  551.             
  552.             authBefore = loginData.@auth.toString();
  553.             
  554.             if (!aCookiesData.session) {
  555.               gYaMFD.softDropAuthForLogin(aCookiesData.login);
  556.             } else {
  557.               loginData.@auth = true;
  558.             }
  559.           }
  560.         }
  561.       }
  562.       
  563.       if (loginData) {
  564.         let user = gYaAuth.Users.addUser(loginData.@boxname.toString());
  565.         
  566.         let authAfter = loginData.@auth.toString();
  567.         
  568.         if (authAfter == "true") {
  569.           user.auth.loginState = gYaAuth.LOGIN_STATES.AUTH;
  570.         } else {
  571.           if (user.auth.loginState == gYaAuth.LOGIN_STATES.AUTH)
  572.             user.auth.loginState = gYaAuth.LOGIN_STATES.NO_AUTH;
  573.         }
  574.         
  575.         if (authAfter != authBefore)
  576.           OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "login");
  577.         
  578.         if (authAfter == "true" && authBefore == "false") {
  579.           OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "mfd-list");
  580.           gYaMFD.refreshHTTPData("mfd-counter", loginData.@boxname.toString());
  581.         }
  582.       }
  583.     },
  584.     
  585.     getLoginData: function(aLogin) {
  586.       return UsersData.login.(@boxname == aLogin)[0];
  587.     },
  588.     
  589.     getAllAuthUsers: function() {
  590.       let result = [];
  591.       
  592.       for each (let loginData in UsersData.login.(@auth == "true")) {
  593.         result.push({
  594.           domain: loginData.@domain.toString(),
  595.           boxname: loginData.@boxname.toString()
  596.         });
  597.       }
  598.       
  599.       return result;
  600.     },
  601.     
  602.     getDataForAllUsers: function() {
  603.       let counter = 0;
  604.       let listsArray = [];
  605.       
  606.       for each (let loginData in UsersData.login.(@auth == "true")) {
  607.         counter += parseInt(loginData.@v.toString(), 10);
  608.         
  609.         let list = loginData.list;
  610.         list.@boxname = loginData.@boxname.toString();
  611.         list.@domain = loginData.@domain.toString();
  612.         list.@type = "mfd";
  613.         list.@counter = loginData.@v;
  614.         
  615.         listsArray.push(list);
  616.       }
  617.       
  618.       let lists = <lists/>;
  619.       
  620.       listsArray
  621.       .sort(function(a,b) (a.@boxname > b.@boxname) ? 1 : (a.@boxname < b.@boxname) ? -1 : 0)
  622.       .forEach(function(aList) lists.appendChild(aList));
  623.       
  624.       return {
  625.         counter: counter,
  626.         lists: lists
  627.       }
  628.     },
  629.     
  630.     getDataForUser: function(aLogin) {
  631.       let loginData = UsersData.login.(@boxname == aLogin).(@auth == "true");
  632.       if (!loginData)
  633.         return null;
  634.       
  635.       let list = loginData.list;
  636.       list.@boxname = loginData.@boxname.toString();
  637.       list.@domain = loginData.@domain.toString();
  638.       list.@type = "mfd";
  639.       list.@counter = loginData.@v;
  640.       
  641.       return {
  642.         counter: parseInt(loginData.@v, 10),
  643.         list: loginData.list
  644.       }
  645.     },
  646.     
  647.     isLoginHasAuth: function(aLogin) {
  648.       return !!UsersData.login.(@auth == "true").(@boxname == aLogin.toLowerCase())[0];
  649.     },
  650.     
  651.     getTopAuth: function() {
  652.       let resultLoginData = null;
  653.       
  654.       for each (let loginData in UsersData.login.(@auth == "true")) {
  655.         if (!resultLoginData || resultLoginData.@boxname > loginData.@boxname)
  656.           resultLoginData = loginData;
  657.       }
  658.       
  659.       if (!resultLoginData)
  660.         return null;
  661.       
  662.       return {
  663.         "domain": resultLoginData.@domain.toString(),
  664.         "username": resultLoginData.@boxname.toString().split("@")[0],
  665.         "boxname": resultLoginData.@boxname.toString()
  666.       }
  667.     },
  668.     
  669.     softDropAuthForDomain: function(aDomain) {
  670.       for each (let loginData in UsersData.login.(@auth == "true")) {
  671.         if (loginData.@boxname.toString().split("@")[1] == aDomain)
  672.           gYaMFD.softDropAuthForLogin(loginData.@boxname.toString());
  673.       }
  674.     },
  675.     
  676.     softDropAuthForLogin: function(aLogin) {
  677.       let loginData = this.getLoginData(aLogin);
  678.       if (loginData && loginData.@auth.toString() == "true") {
  679.         loginData.@auth = false;
  680.         
  681.         let user = gYaAuth.Users.getUser(aLogin);
  682.         if (user)
  683.           user.auth.loginState = gYaAuth.LOGIN_STATES.NO_AUTH;
  684.         
  685.         OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "login");
  686.         
  687.         return true;
  688.       }
  689.       
  690.       return false;
  691.     },
  692.     
  693.     getAuthUserForDomain: function(aDomain) {
  694.       if (aDomain) {
  695.         for each (let loginData in UsersData.login.(@auth == "true"))
  696.           if (loginData.@boxname.toString().split("@")[1] == aDomain)
  697.             return loginData;
  698.       }
  699.       
  700.       return null;
  701.     },
  702.     
  703.     decMailCounter: function(aMailId) {
  704.       let item = UsersData.login.list.item.item.(@url == aMailId)[0];
  705.       if (!item)
  706.         return;
  707.  
  708.       let parent = item.parent();
  709.       let loginData = parent.parent().parent();
  710.       
  711.       delete parent.item[item.childIndex()];
  712.       
  713.       if (!parent.item.length())
  714.         delete parent.parent().item[parent.childIndex()];
  715.       
  716.       let counterValue = parseInt(loginData.@v, 10) || 0;
  717.       loginData.@v = Math.max(0, --counterValue);
  718.       
  719.       let permCounterValue = parseInt(loginData.@permCounter, 10) || 0;
  720.       loginData.@permCounter = Math.max(0, --permCounterValue);
  721.       
  722.       new G_Timer(function(){
  723.         OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "mfd-list");
  724.       }, 1);
  725.       
  726.       loginData.@lastRequestTime = 0;
  727.       
  728.       gYaMFD.refreshHTTPData("mfd-counter", loginData.@boxname, 10000);
  729.     }
  730.   };
  731.   
  732.   gYaMFD.Users = Users;
  733.   
  734. }());
  735.