1
2
3
4
5
6
7
8
9
10
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
29
30 from Products.PluggableAuthService import PluggableAuthService
31 from Products.ZenUtils.Security import _createInitialUser
32 pas = PluggableAuthService.PluggableAuthService
33 if not hasattr(pas, '_createInitialUser'):
34 pas._createInitialUser = _createInitialUser
35
36
37 from Products.PluggableAuthService.plugins import CookieAuthHelper
38 import urlparse
39 from cgi import parse_qs
40
42 """We don't want CookieAuthHelper setting the login attribute, we we'll
43 override manage_afterAdd().
44
45 For now, the only thing that manage_afterAdd does is set the login_form
46 attribute, but we will need to check this after every upgrade of the PAS.
47 """
48 pass
49
50 CookieAuthHelper.CookieAuthHelper.manage_afterAdd = manage_afterAdd
51
53 """
54 Set a cookie and redirect to the url that we tried to
55 authenticate against originally.
56
57 FIXME - I don't think we need this any more now that the EULA is gone -EAD
58 """
59 import urllib
60
61 request = self.REQUEST
62 response = request['RESPONSE']
63
64 login = request.get('__ac_name', '')
65 password = request.get('__ac_password', '')
66 submitted = request.get('submitted', '')
67
68 pas_instance = self._getPAS()
69
70 if pas_instance is not None:
71 pas_instance.updateCredentials(request, response, login, password)
72
73 came_from = request.form.get('came_from') or ''
74 if came_from:
75 parts = urlparse.urlsplit(came_from)
76 querydict = parse_qs(parts[3])
77 if querydict.has_key('terms'):
78 del querydict['terms']
79 if 'submitted' not in querydict.keys():
80 querydict['submitted'] = submitted
81 newqs = urllib.urlencode(querydict, doseq=True)
82 parts = parts[:3] + (newqs,) + parts[4:]
83 came_from = urlparse.urlunsplit(parts)
84 else:
85 submittedQs = 'submitted=%s' % submitted
86 came_from = '/zport/dmd?%s' % submittedQs
87 if not self.dmd.acceptedTerms:
88 url = "%s/zenoss_terms/?came_from=%s" % (
89 self.absolute_url(), urllib.quote(came_from))
90 else:
91 url = came_from
92
93 if self.dmd.uuid is None:
94 from uuid.uuid import uuid1
95 self.dmd.uuid = str(uuid1())
96 return response.redirect(url)
97
98 CookieAuthHelper.CookieAuthHelper.login = login
99
100
102 """ Check to see if the user has accepted the Zenoss terms.
103 """
104 request = self.REQUEST
105 response = request['RESPONSE']
106
107 acceptStatus = request.form.get('terms') or ''
108 url = request.form.get('came_from') or self.absolute_url()
109
110 if acceptStatus != 'Accept':
111 self.resetCredentials(request, response)
112 if '?' in url:
113 url += '&'
114 else:
115 url += '?'
116 url += 'terms=Decline'
117 else:
118 self.dmd.acceptedTerms = True
119 from uuid.uuid import uuid1
120 self.dmd.uuid = str(uuid1())
121 return response.redirect(url)
122
123 CookieAuthHelper.CookieAuthHelper.termsCheck = termsCheck
124