Package Products :: Package ZenUtils :: Package patches :: Module pasmonkey |
[hide private]
[frames] | no frames]

# Source Code for Module Products.ZenUtils.patches.pasmonkey

      1  ###########################################################################
      2  #
      3  # This program is part of Zenoss Core, an open source monitoring platform.
      4  # Copyright (C) 2007, Zenoss Inc.
      5  #
      6  # This program is free software; you can redistribute it and/or modify it
      7  # under the terms of the GNU General Public License version 2 or (at your
      8  # option) any later version as published by the Free Software Foundation.
      9  #
     10  # For complete information please visit: http://www.zenoss.com/oss/
     11  #
     12  ###########################################################################
     13
     14  '''
     15  This module contains monkey patches we needed to make to PAS when we switched
     16  from native ZODB-managed authentication to pluggable authentication.
     17
     18  This module needs to be imported by ZenUtils/__init__.py.
     19
     20  Related tickets:
     21    http://dev.zenoss.org/trac/ticket/379
     22    http://dev.zenoss.org/trac/ticket/402
     23    http://dev.zenoss.org/trac/ticket/443
     24    http://dev.zenoss.org/trac/ticket/1042
     25    http://dev.zenoss.org/trac/ticket/4225
     26  '''
     27
     28  from AccessControl import getSecurityManager
     29  from Products.ZenMessaging import actions
     30  from Products.ZenMessaging.actions.constants import ActionTargetType
     31
     32  # monkey patch PAS to allow inituser files, but check to see if we need to
     33  # actually apply the patch, first -- support may have been added at some point
     34  from Products.PluggableAuthService import PluggableAuthService
     35  from Products.ZenUtils.Security import _createInitialUser
     36  pas = PluggableAuthService.PluggableAuthService
     37  if not hasattr(pas, '_createInitialUser'):
     38      pas._createInitialUser =  _createInitialUser
     39
     40  # monkey patches for the PAS login form
     41  from Products.PluggableAuthService.plugins import CookieAuthHelper
     42  import urlparse
     43  from cgi import parse_qs
     44
     45 -def manage_afterAdd(self, item, container):
     46      """We don't want CookieAuthHelper setting the login attribute, we we'll
     47      override manage_afterAdd().
     48
     49      For now, the only thing that manage_afterAdd does is set the login_form
     50      attribute, but we will need to check this after every upgrade of the PAS.
     51      """
     52      pass
     53
     54  CookieAuthHelper.CookieAuthHelper.manage_afterAdd = manage_afterAdd
     55
     56 -def login(self):
     57      """
     58      Set a cookie and redirect to the url that we tried to
     59      authenticate against originally.
     60
     61      FIXME - I don't think we need this any more now that the EULA is gone -EAD
     62      """
     63      import urllib
     64
     65      request = self.REQUEST
     66      response = request['RESPONSE']
     67
     68      login = request.get('__ac_name', '')
     69      password = request.get('__ac_password', '')
     70      submitted = request.get('submitted', '')
     71
     72      pas_instance = self._getPAS()
     73
     74      if pas_instance is not None:
     75          pas_instance.updateCredentials(request, response, login, password)
     76
     77          # Track the user logging in, or the login failure.
     78          if actions.sendUserAction:
     79              # NOTE: updateCredentials did enough work to allow the
     80              # following line to work.
     81              username = getSecurityManager().getUser().getUserName()
     82              actions.sendUserAction(
     83                  ActionTargetType.Login,
     84                  'Succeed' if username == login else 'Fail',
     85                  username=login)
     86
     87      came_from = request.form.get('came_from') or ''
     88      if came_from:
     89          parts = urlparse.urlsplit(came_from)
     90          querydict = parse_qs(parts[3])
     91          querydict.pop('terms', None)
     92          if 'submitted' not in querydict.keys():
     93              querydict['submitted'] = submitted
     94          newqs = urllib.urlencode(querydict, doseq=True)
     95          parts = parts[:3] + (newqs,) + parts[4:]
     96          came_from = urlparse.urlunsplit(parts)
     97      else:
     98          submittedQs = 'submitted=%s' % submitted
     99          came_from = '/zport/dmd?%s' % submittedQs
    100      if not self.dmd.acceptedTerms:
    101          url = "%s/zenoss_terms/?came_from=%s" % (
    102                      self.absolute_url(), urllib.quote(came_from))
    103      else:
    104          url = came_from
    105
    106      if self.dmd.uuid is None:
    107          from uuid import uuid1
    108          self.dmd.uuid = str(uuid1())
    109      return response.redirect(url)
    110
    111  CookieAuthHelper.CookieAuthHelper.login = login
    112
    113
    114 -def termsCheck(self):
    115      """ Check to see if the user has accepted the Zenoss terms.
    116      """
    117      request = self.REQUEST
    118      response = request['RESPONSE']
    119
    120      acceptStatus = request.form.get('terms') or ''
    121      url = request.form.get('came_from') or self.absolute_url()
    122
    123      if acceptStatus != 'Accept':
    124          self.resetCredentials(request, response)
    125          if '?' in url:
    126              url += '&'
    127          else:
    128              url += '?'
    129          url += 'terms=Decline'
    130      else:
    131          self.dmd.acceptedTerms = True
    132          from uuid import uuid1
    133          self.dmd.uuid = str(uuid1())
    134      return response.redirect(url)
    135
    136  CookieAuthHelper.CookieAuthHelper.termsCheck = termsCheck
    137