Revision: 7124
Author:   alexsh
Date:     2009-08-07 07:51:37 +0000 (Fri, 07 Aug 2009)

Log Message:
-----------
login.py:
*LoginManager.logout():sometimes put edit could came back badtoken because two 
or more duplicate login session used in pybot and other browsers, this function 
could abandon server login session, and delete local cookie data.
*LoginManager.getCookie(): change API to pure query..(it will handle other 
login error codes)
*cleanup no necessary syntaxes.

Modified Paths:
--------------
    trunk/pywikipedia/login.py

Modified: trunk/pywikipedia/login.py
===================================================================
--- trunk/pywikipedia/login.py  2009-08-06 21:57:43 UTC (rev 7123)
+++ trunk/pywikipedia/login.py  2009-08-07 07:51:37 UTC (rev 7124)
@@ -50,7 +50,7 @@
 #
 __version__='$Id$'
 
-import re
+import re, os, query
 import urllib2
 import wikipedia, config
 
@@ -122,7 +122,7 @@
         if api:
             predata = {
                 'action': 'login',
-                'lgname': self.username.encode(self.site.encoding()),
+                'lgname': self.username,
                 'lgpassword': self.password,
                 'lgdomain': self.site.family.ldapDomain,
             }
@@ -163,14 +163,17 @@
             wikipedia.cj.save(wikipedia.COOKIEFILE)
             return "Ok"
         else:
-            response, data = self.site.postData(address, 
self.site.urlEncode(predata))
-            if self.verbose:
-                fakepredata = predata
-                fakepredata['wpPassword'] = fakepredata['lgpassword'] = 
u'XXXXX'
-                wikipedia.output(u"self.site.postData(%s, %s)" % (address, 
self.site.urlEncode(fakepredata)))
-                fakeresponsemsg = re.sub(r"(session|Token)=..........", 
r"session=XXXXXXXXXX", response.msg.__str__())
-                wikipedia.output(u"%s/%s\n%s" % (response.status, 
response.reason, fakeresponsemsg))
-                wikipedia.output(u"%s" % data)
+            if api:
+                response, data = query.GetData(predata, self.site, 
back_response = True)
+            else:
+                response, data = self.site.postData(address, 
self.site.urlEncode(predata))
+                if self.verbose:
+                    fakepredata = predata
+                    fakepredata['wpPassword'] = fakepredata['lgpassword'] = 
u'XXXXX'
+                    wikipedia.output(u"self.site.postData(%s, %s)" % (address, 
self.site.urlEncode(fakepredata)))
+                    fakeresponsemsg = re.sub(r"(session|Token)=..........", 
r"session=XXXXXXXXXX", response.msg.__str__())
+                    wikipedia.output(u"%s/%s\n%s" % (response.status, 
response.reason, fakeresponsemsg))
+                    wikipedia.output(u"%s" % data)
             Reat=re.compile(': (.*?);')
             L = []
     
@@ -246,11 +249,11 @@
 
         wikipedia.output(u"Logging in to %s as %s" % (self.site, 
self.username))
         try:
-            cookiedata = self.getCookie(api = api)
+            cookiedata = self.getCookie(api)
         except NotImplementedError:
             wikipedia.output('API disabled because this site does not 
support.')
-            config.use_api_login = api = False
-            cookiedata = self.getCookie(api = api)
+            api = False
+            cookiedata = self.getCookie(api)
         if cookiedata:
             self.storecookiedata(cookiedata)
             wikipedia.output(u"Should be logged in now")
@@ -262,17 +265,40 @@
             wikipedia.output(u"Login failed. Wrong password or CAPTCHA 
answer?")
             if api:
                 wikipedia.output(u"API login failed, retrying using standard 
webpage.")
-                return self.login(api = False, retry = retry)
+                return self.login(False, retry)
             
             if retry:
                 self.password = None
                 return self.login(api = api, retry = True)
             else:
                 return False
+    
+    def logout(self, api = config.use_api):
+        flushCk = False
+        if api and self.site.versionnumber() >= 12:
+            if query.GetData({'action':'logout'}, self.site) == []:
+                flushCk = True
+        else:
+            logout_address = self.site.get_address("Special:Version")
+            text = self.site.getUrl(logout_address)
+            if wikipedia.mediawiki_message('logouttext') in text: #confirm 
loggedout
+                flushCk = True
+        
+        if flushCk:
+            filename = wikipedia.config.datafilepath('login-data',
+                       '%s-%s-%s-login.data'
+                       % (self.site.family.name, self.site.lang, 
self.username))
+            try:
+                os.remove(filename)
+            except:
+                pass
+            return True
+        
+        return False
 
     def showCaptchaWindow(self, url):
         pass
-
+    
 def main():
     username = password = None
     sysop = False
@@ -304,11 +330,12 @@
             namedict = config.sysopnames
         else:
             namedict = config.usernames
+
         for familyName in namedict.iterkeys():
             for lang in namedict[familyName].iterkeys():
                 try:
-                    site = wikipedia.getSite( code=lang, fam=familyName )
-                    if not forceLogin and site.loggedInAs(sysop = sysop) is 
not None:
+                    site = wikipedia.getSite(lang, familyName)
+                    if not forceLogin and site.loggedInAs(sysop = sysop):
                         wikipedia.output(u'Already logged in on %s' % site)
                     else:
                         loginMan = LoginManager(password, sysop = sysop, site 
= site, verbose=verbose)



_______________________________________________
Pywikipedia-svn mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikipedia-svn

Reply via email to