form login
authorAnrs Hu <anders.x.hu@gmail.com>
Thu, 31 May 2012 06:11:05 +0000 (14:11 +0800)
committerAnrs Hu <anders.x.hu@gmail.com>
Thu, 31 May 2012 06:11:05 +0000 (14:11 +0800)
jenkinsapi/jenkins.py
jenkinsapi/utils/urlopener.py

index 6114341867df36b6e9b2ab154b8f8da81152507b..cea96ed8334afdda6783ae7e618e25b4c66cd5f1 100644 (file)
@@ -4,11 +4,13 @@ from jenkinsapi.job import Job
 from jenkinsapi.view import View
 from jenkinsapi.node import Node
 from jenkinsapi.exceptions import UnknownJob, NotAuthorized
-from utils.urlopener import mkurlopener
+from utils.urlopener import mkurlopener, mkopener, NoAuto302Handler
 import logging
 import time
 import urllib2
 import urllib
+import urlparse
+import cookielib
 try:
     import json
 except ImportError:
@@ -20,7 +22,7 @@ class Jenkins(JenkinsBase):
     """
     Represents a jenkins environment.
     """
-    def __init__(self, baseurl, username=None, password=None, proxyhost=None, proxyport=None, proxyuser=None, proxypass=None):
+    def __init__(self, baseurl, username=None, password=None, proxyhost=None, proxyport=None, proxyuser=None, proxypass=None, formauth=False):
         """
 
         :param baseurl: baseurl for jenkins instance including port, str
@@ -38,7 +40,7 @@ class Jenkins(JenkinsBase):
         self.proxyport = proxyport
         self.proxyuser = proxyuser
         self.proxypass = proxypass
-        JenkinsBase.__init__(self, baseurl)
+        JenkinsBase.__init__(self, baseurl, poll=not formauth)
 
     def get_proxy_auth(self):
         return self.proxyhost, self.proxyport, self.proxyuser, self.proxypass
@@ -56,6 +58,37 @@ class Jenkins(JenkinsBase):
     def get_opener(self):
         return mkurlopener(*self.get_auth())
 
+    def get_login_opener(self):
+        hdrs = []
+        if getattr(self, '_cookies', False):
+            mcj = cookielib.MozillaCookieJar()
+            for c in self._cookies:
+                mcj.set_cookie(c)
+            hdrs.append(urllib2.HTTPCookieProcessor(mcj))
+        return mkopener(*hdrs)
+
+    def login(self):
+        formdata = dict(j_username=self.username, j_password=self.password,
+                        remember_me=True, form='/')
+        formdata.update(dict(json=json.dumps(formdata), Submit='log in'))
+        formdata = urllib.urlencode(formdata)
+
+        loginurl = urlparse.urljoin(self.baseurl, 'j_acegi_security_check')
+        mcj = cookielib.MozillaCookieJar()
+        cookiehandler = urllib2.HTTPCookieProcessor(mcj)
+
+        urlopen = mkopener(NoAuto302Handler, cookiehandler)
+        res = urlopen(loginurl, data=formdata)
+        self._cookies = [c for c in mcj]
+        return res.getcode() == 302
+
+    def build(self, jobname):
+        assert jobname
+        buildurl = urlparse.urljoin(self.baseurl, 'job/%s/build' % jobname)
+        urlopen = self.get_login_opener()
+        res = urlopen(buildurl)
+        return res.code == 200
+
     def validate_fingerprint(self, id):
         obj_fingerprint = Fingerprint(self.baseurl, id, jenkins_obj=self)
         obj_fingerprint.validate()
index f2ea50f01ad048dcfa47b11a7cd63eb820998020..b6e7942ecb1908a6dde94566f34f7a017a5bfe2e 100644 (file)
@@ -48,6 +48,10 @@ def mkurlopener( jenkinsuser, jenkinspass, jenkinsurl, proxyhost, proxyport, pro
     opener = urllib2.build_opener(*handlers)
     return opener.open
 
+def mkopener(*handlers):
+    opener = urllib2.build_opener(*handlers)
+    return opener.open
+
 def get_jenkins_auth_handler(jenkinsuser, jenkinspass, jenkinsurl):
     """
     Get a basic authentification handler for jenkins
@@ -92,3 +96,8 @@ def get_proxy_handler(proxyhost, proxyport, proxyuser, proxypass):
     proxy_auth_handler.add_password( None, proxyhost, proxyuser, proxypass )
     return [proxy_handler, proxy_auth_handler]
 
+
+class NoAuto302Handler(urllib2.HTTPRedirectHandler):
+    def http_error_302(self, req, fp, code, msg, hdrs):
+        return fp
+