Commit c8c9f9eb authored by Arnaud Fontaine's avatar Arnaud Fontaine

py3: TODO py3-only?.

parent df64f044
import re import re
import os import os
import sys import sys
from sgmllib import SGMLParser, SGMLParseError # XXX-zope4py3: sgmllib removed from standard library in favor of
# html.parser.HTMLParser
#from sgmllib import SGMLParser, SGMLParseError
try: try:
# Need to be imported before win32api to avoid dll loading # Need to be imported before win32api to avoid dll loading
...@@ -142,95 +144,95 @@ NASTY_TAGS = { 'script' : 1 ...@@ -142,95 +144,95 @@ NASTY_TAGS = { 'script' : 1
class IllegalHTML( ValueError ): class IllegalHTML( ValueError ):
pass pass
class StrippingParser( SGMLParser ): # class StrippingParser( SGMLParser ):
""" Pass only allowed tags; raise exception for known-bad. """ # """ Pass only allowed tags; raise exception for known-bad. """
from htmlentitydefs import entitydefs # replace entitydefs from sgmllib # from html.entities import entitydefs # replace entitydefs from sgmllib
def __init__( self ): # def __init__( self ):
SGMLParser.__init__( self ) # SGMLParser.__init__( self )
self.result = "" # self.result = ""
def handle_data( self, data ): # def handle_data( self, data ):
if data: # if data:
self.result = self.result + data # self.result = self.result + data
def handle_charref( self, name ): # def handle_charref( self, name ):
self.result = "%s&#%s;" % ( self.result, name ) # self.result = "%s&#%s;" % ( self.result, name )
def handle_entityref(self, name): # def handle_entityref(self, name):
if self.entitydefs.has_key(name): # if name in self.entitydefs:
x = ';' # x = ';'
else: # else:
# this breaks unstandard entities that end with ';' # # this breaks unstandard entities that end with ';'
x = '' # x = ''
self.result = "%s&%s%s" % (self.result, name, x) # self.result = "%s&%s%s" % (self.result, name, x)
def unknown_starttag(self, tag, attrs): # def unknown_starttag(self, tag, attrs):
""" Delete all tags except for legal ones. # """ Delete all tags except for legal ones.
""" # """
if VALID_TAGS.has_key(tag): # if tag in VALID_TAGS:
self.result = self.result + '<' + tag # self.result = self.result + '<' + tag
for k, v in attrs: # for k, v in attrs:
if k.lower().startswith( 'on' ): # if k.lower().startswith( 'on' ):
raise IllegalHTML('Javascipt event "%s" not allowed.' % k) # raise IllegalHTML('Javascipt event "%s" not allowed.' % k)
if v.lower().startswith( 'javascript:' ): # if v.lower().startswith( 'javascript:' ):
raise IllegalHTML('Javascipt URI "%s" not allowed.' % v) # raise IllegalHTML('Javascipt URI "%s" not allowed.' % v)
self.result = '%s %s="%s"' % (self.result, k, v) # self.result = '%s %s="%s"' % (self.result, k, v)
endTag = '</%s>' % tag # endTag = '</%s>' % tag
if VALID_TAGS.get(tag): # if VALID_TAGS.get(tag):
self.result = self.result + '>' # self.result = self.result + '>'
else: # else:
self.result = self.result + ' />' # self.result = self.result + ' />'
elif NASTY_TAGS.get( tag ): # elif NASTY_TAGS.get( tag ):
raise IllegalHTML('Dynamic tag "%s" not allowed.' % tag) # raise IllegalHTML('Dynamic tag "%s" not allowed.' % tag)
else: # else:
pass # omit tag # pass # omit tag
def unknown_endtag(self, tag): # def unknown_endtag(self, tag):
if VALID_TAGS.get( tag ): # if VALID_TAGS.get( tag ):
self.result = "%s</%s>" % (self.result, tag) # self.result = "%s</%s>" % (self.result, tag)
remTag = '</%s>' % tag # remTag = '</%s>' % tag
def parse_declaration(self, i): # def parse_declaration(self, i):
"""Fix handling of CDATA sections. Code borrowed from BeautifulSoup. # """Fix handling of CDATA sections. Code borrowed from BeautifulSoup.
""" # """
j = None # j = None
if self.rawdata[i:i+9] == '<![CDATA[': # if self.rawdata[i:i+9] == '<![CDATA[':
k = self.rawdata.find(']]>', i) # k = self.rawdata.find(']]>', i)
if k == -1: # if k == -1:
k = len(self.rawdata) # k = len(self.rawdata)
data = self.rawdata[i+9:k] # data = self.rawdata[i+9:k]
j = k+3 # j = k+3
self.result.append("<![CDATA[%s]]>" % data) # self.result.append("<![CDATA[%s]]>" % data)
else: # else:
try: # try:
j = SGMLParser.parse_declaration(self, i) # j = SGMLParser.parse_declaration(self, i)
except SGMLParseError: # except SGMLParseError:
toHandle = self.rawdata[i:] # toHandle = self.rawdata[i:]
self.result.append(toHandle) # self.result.append(toHandle)
j = i + len(toHandle) # j = i + len(toHandle)
return j # return j
def scrubHTML( html ): # def scrubHTML( html ):
""" Strip illegal HTML tags from string text. """ # """ Strip illegal HTML tags from string text. """
parser = StrippingParser() # parser = StrippingParser()
parser.feed( html ) # parser.feed( html )
parser.close() # parser.close()
return parser.result # return parser.result
...@@ -26,49 +26,30 @@ class TimerServer(threading.Thread): ...@@ -26,49 +26,30 @@ class TimerServer(threading.Thread):
interval) interval)
def run(self): def run(self):
try: import Products.ERP5.bin.zopewsgi
zopewsgi = sys.modules['Products.ERP5.bin.zopewsgi'] while 1:
except KeyError: time.sleep(5)
# wait until the zhttp_server exist in socket_map try:
# because TimerService has to be started after the Zope HTTPServer server = Products.ERP5.bin.zopewsgi.server
from asyncore import socket_map break
ip = port = '' except AttributeError:
while 1: pass
time.sleep(5)
for k, v in socket_map.items(): ip, port = server.addr
if hasattr(v, 'addr'): start_response = lambda *_: None
# see Zope/lib/python/App/ApplicationManager.py: def getServers(self)
type = str(getattr(v, '__class__', 'unknown')) class handle(object):
if type == 'ZServer.HTTPServer.zhttp_server': def __init__(self, module_name, request, response):
ip, port = v.addr self.service = partial(Products.ERP5.bin.zopewsgi.publish_module,
break request.environ,
if port: start_response,
break _module_name=module_name,
from ZServer.PubCore import handle _request=request,
else: _response=response)
while 1: server.add_task(self)
time.sleep(5)
try: def cancel(self):
server = zopewsgi.server pass
break
except AttributeError:
pass
ip, port = server.addr
start_response = lambda *_: None
class handle(object):
def __init__(self, module_name, request, response):
self.service = partial(zopewsgi.publish_module,
request.environ,
start_response,
_module_name=module_name,
_request=request,
_response=response)
server.add_task(self)
def cancel(self):
pass
if ip == '0.0.0.0': if ip == '0.0.0.0':
ip = socket.gethostbyname(socket.gethostname()) ip = socket.gethostbyname(socket.gethostname())
......
<component>
<import package="ZServer" />
<sectiontype name="timer-server"
datatype="Products.TimerService.timerserver.TimerServerFactory"
implements="ZServer.server">
<key name="interval" datatype="float" default="600">
<description>
Interval in seconds. Supports fractions of a second.
</description>
</key>
</sectiontype>
</component>
...@@ -41,7 +41,7 @@ except ImportError: ...@@ -41,7 +41,7 @@ except ImportError:
IColumnNode = None IColumnNode = None
def verifyClass(*args, **kw): def verifyClass(*args, **kw):
pass pass
implements = verifyClass implements = verifyClass # XXX need to be reviewed as it is decorator now
@implementer(INode) @implementer(INode)
class Node(object): class Node(object):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment