From ff575e7120fd1452667473600f70ec3ed3177c70 Mon Sep 17 00:00:00 2001 From: Anrs Hu Date: Thu, 31 May 2012 14:11:05 +0800 Subject: [PATCH] form login --- jenkinsapi/jenkins.py | 39 ++++++++++++++++++++++++++++++++++++--- jenkinsapi/utils/urlopener.py | 9 +++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/jenkinsapi/jenkins.py b/jenkinsapi/jenkins.py index 6114341..cea96ed 100644 --- a/jenkinsapi/jenkins.py +++ b/jenkinsapi/jenkins.py @@ -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() diff --git a/jenkinsapi/utils/urlopener.py b/jenkinsapi/utils/urlopener.py index f2ea50f..b6e7942 100644 --- a/jenkinsapi/utils/urlopener.py +++ b/jenkinsapi/utils/urlopener.py @@ -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 + -- 2.7.4