Skip to content

Commit

Permalink
More Python 3 fixes.
Browse files Browse the repository at this point in the history
You can now create an instance, log in and browse some of the ZMI.
Adding DTML doc / methods works. Adding Page Templates fails as
`HTTPRequest.FileUpload` is not yet ported.
  • Loading branch information
hannosch committed May 15, 2017
1 parent 97b7d9e commit 7caad99
Show file tree
Hide file tree
Showing 10 changed files with 52 additions and 29 deletions.
1 change: 1 addition & 0 deletions buildout.cfg
Expand Up @@ -20,6 +20,7 @@ parts =
requirements
sources-dir = develop
auto-checkout =
AccessControl
DocumentTemplate
Products.BTreeFolder2
Products.MailHost
Expand Down
4 changes: 2 additions & 2 deletions src/App/Undo.py
Expand Up @@ -125,12 +125,12 @@ def manage_undo_transactions(self, transaction_info=(), REQUEST=None):

def encode64(s, b2a=binascii.b2a_base64):
if len(s) < 58:
return b2a(s)
return b2a(s).decode('ascii')
r = []
a = r.append
for i in range(0, len(s), 57):
a(b2a(s[i:i + 57])[:-1])
return ''.join(r)
return (b''.join(r)).decode('ascii')


def decode64(s, a2b=binascii.a2b_base64):
Expand Down
2 changes: 1 addition & 1 deletion src/App/dtml/undo.dtml
Expand Up @@ -19,7 +19,7 @@ modified objects that were modified by a selected transaction.
</p>

<dtml-unless first_transaction>
<dtml-call "REQUEST.set('first_transaction', _.None)">
<dtml-call "REQUEST.set('first_transaction', None)">
</dtml-unless>

<table width="100%" cellspacing="0" cellpadding="2" border="0">
Expand Down
6 changes: 3 additions & 3 deletions src/OFS/DTMLDocument.py
Expand Up @@ -126,7 +126,7 @@ def __call__(self, client=None, REQUEST={}, RESPONSE=None, **kw):
InitializeClass(DTMLDocument)


default_dd_html = b"""\
default_dd_html = """\
<!DOCTYPE html>
<html>
<head>
Expand All @@ -144,11 +144,11 @@ def __call__(self, client=None, REQUEST={}, RESPONSE=None, **kw):
addForm = DTMLFile('dtml/documentAdd', globals())


def addDTMLDocument(self, id, title='', file=b'', REQUEST=None, submit=None):
def addDTMLDocument(self, id, title='', file='', REQUEST=None, submit=None):
"""Add a DTML Document object with the contents of file. If
'file' is empty, default document text is used.
"""
if not isinstance(file, binary_type):
if hasattr(file, 'read'):
file = file.read()
if not file:
file = default_dd_html
Expand Down
6 changes: 3 additions & 3 deletions src/OFS/DTMLMethod.py
Expand Up @@ -387,7 +387,7 @@ def decapitate(html, RESPONSE=None):
return html[spos + eolen:]


default_dm_html = b"""\
default_dm_html = """\
<!DOCTYPE html>
<html>
<head>
Expand All @@ -406,11 +406,11 @@ def decapitate(html, RESPONSE=None):
addForm = DTMLFile('dtml/methodAdd', globals())


def addDTMLMethod(self, id, title='', file=b'', REQUEST=None, submit=None):
def addDTMLMethod(self, id, title='', file='', REQUEST=None, submit=None):
"""Add a DTML Method object with the contents of file. If
'file' is empty, default document text is used.
"""
if not isinstance(file, binary_type):
if hasattr(file, 'read'):
file = file.read()
if not file:
file = default_dm_html
Expand Down
2 changes: 1 addition & 1 deletion src/OFS/dtml/findResult.dtml
Expand Up @@ -3,7 +3,7 @@

<dtml-in expr="('obj_ids', 'obj_metatypes', 'obj_searchterm', 'obj_expr', 'obj_mtime', 'obj_mspec', 'obj_permission', 'obj_roles', 'search_sub')">
<dtml-else expr="_.hasattr(REQUEST, _['sequence-item'])">
<dtml-call expr="REQUEST.set(_['sequence-item'], _.None)">
<dtml-call expr="REQUEST.set(_['sequence-item'], None)">
</dtml-else>
</dtml-in>

Expand Down
12 changes: 6 additions & 6 deletions src/Testing/ZopeTestCase/testFunctional.py
Expand Up @@ -27,10 +27,10 @@
from Testing.ZopeTestCase import user_name
from Testing.ZopeTestCase import user_password

SET_COOKIE_DTML = b'''\
SET_COOKIE_DTML = '''\
<dtml-call "RESPONSE.setCookie('foo', 'Bar', path='/')">'''

CHANGE_TITLE_DTML = b'''\
CHANGE_TITLE_DTML = '''\
<dtml-call "manage_changeProperties(title=REQUEST.get('title'))">'''


Expand All @@ -41,17 +41,17 @@ def afterSetUp(self):
self.basic_auth = '%s:%s' % (user_name, user_password)

# A simple document
self.folder.addDTMLDocument('index_html', file=b'index')
self.folder.addDTMLDocument('index_html', file='index')

# A document accessible only to its owner
self.folder.addDTMLDocument('secret_html', file=b'secret')
self.folder.addDTMLDocument('secret_html', file='secret')
self.folder.secret_html.manage_permission(view, ['Owner'])

# A method redirecting to the Zope root
url = self.app.absolute_url().encode('utf-8')
url = self.app.absolute_url()
self.folder.addDTMLMethod(
'redirect',
file=b'<dtml-call "RESPONSE.redirect(\'' + url + b'\')">')
file='<dtml-call "RESPONSE.redirect(\'' + url + '\')">')

# A method setting a cookie
self.folder.addDTMLMethod('set_cookie', file=SET_COOKIE_DTML)
Expand Down
4 changes: 2 additions & 2 deletions src/Testing/ZopeTestCase/zopedoctest/testFunctionalDocTest.py
Expand Up @@ -88,7 +88,7 @@ def test___str___w_headers(self):
'Content-Type: text/html')


SHOW_COOKIES_DTML = b'''\
SHOW_COOKIES_DTML = '''\
<dtml-in "REQUEST.cookies.keys()">
<dtml-var sequence-item>: <dtml-var "REQUEST.cookies[_['sequence-item']]">
</dtml-in>'''
Expand All @@ -113,7 +113,7 @@ def setUp(self):
from Testing.ZopeTestCase.testFunctional import CHANGE_TITLE_DTML
from Testing.ZopeTestCase.testFunctional import SET_COOKIE_DTML

self.folder.addDTMLDocument('index_html', file=b'index')
self.folder.addDTMLDocument('index_html', file='index')
self.folder.addDTMLMethod('change_title', file=CHANGE_TITLE_DTML)
self.folder.addDTMLMethod('set_cookie', file=SET_COOKIE_DTML)
self.folder.addDTMLMethod('show_cookies', file=SHOW_COOKIES_DTML)
Expand Down
34 changes: 26 additions & 8 deletions src/ZPublisher/HTTPRequest.py
Expand Up @@ -1415,8 +1415,8 @@ def __getattr__(self, key, default=_marker, returnTaints=0):
def set_lazy(self, key, callable):
self._lazies[key] = callable

def __contains__(self, key):
return self.has_key(key) # NOQA
def __contains__(self, key, returnTaints=0):
return self.has_key(key, returnTaints=returnTaints) # NOQA

def has_key(self, key, returnTaints=0):
try:
Expand Down Expand Up @@ -1567,21 +1567,39 @@ class WSGIRequest(HTTPRequest):
pass


class TaintRequestWrapper:
class TaintRequestWrapper(object):

def __init__(self, req):
self._req = req

def __getattr__(self, key):
if key in ('get', '__getitem__', '__getattr__', 'has_key', 'keys'):
return TaintMethodWrapper(getattr(self._req, key))
def __contains__(self, *args, **kw):
return TaintMethodWrapper(self._req.__contains__)(*args, **kw)

def __getattr__(self, key, *args, **kw):
if key not in self._req.keys():
item = getattr(self._req, key, _marker)
if item is not _marker:
return item
return self._req.__getattr__(key, returnTaints=1)
return TaintMethodWrapper(self._req.__getattr__)(key, *args, **kw)

def __getitem__(self, *args, **kw):
return TaintMethodWrapper(self._req.__getitem__)(*args, **kw)

def __len__(self):
return len(self._req)

def get(self, *args, **kw):
return TaintMethodWrapper(self._req.get)(*args, **kw)

def has_key(self, *args, **kw):
return TaintMethodWrapper(self._req.has_key)(*args, **kw)

def keys(self, *args, **kw):
return TaintMethodWrapper(self._req.keys)(*args, **kw)


class TaintMethodWrapper(object):

class TaintMethodWrapper:
def __init__(self, method):
self._method = method

Expand Down
10 changes: 7 additions & 3 deletions src/Zope2/utilities/mkwsgiinstance.py
Expand Up @@ -188,10 +188,14 @@ def get_inituser():
def write_inituser(fn, user, password):
import binascii
from hashlib import sha1 as sha
fp = open(fn, "w")
pw = binascii.b2a_base64(sha(password.encode('utf-8')).digest())[:-1]
fp.write('%s:{SHA}%s\n' % (user, pw))
fp.close()
with open(fn, "wb") as fp:
fp.write(
user.encode('utf-8') +
b':{SHA}' +
pw +
b'\n'
)
os.chmod(fn, 0o644)


Expand Down

0 comments on commit 7caad99

Please sign in to comment.