Changeset 1989


Ignore:
Timestamp:
09/12/07 11:27:50 (12 years ago)
Author:
jukka
Message:

Added attribute whitelist.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/ConfigurationMethods.py

    r1979 r1989  
    448448                }, # list attributes you don't want in HTML code 
    449449                {'tags':'', 
    450                  'attributes':'dir,lang,valign,halign,border,frame,rules,cellspacing,cellpadding,bgcolor,width', 
     450                 'attributes':'', 
    451451                 'keep':1, 
    452452                }, 
  • trunk/LeMillTool.py

    r1986 r1989  
    8181    |td 
    8282    |sub 
    83     |sup) 
     83    |sup 
     84    |dt 
     85    |dd) 
    8486    """, re.IGNORECASE | re.VERBOSE) 
    8587 
    86 restricted=re.compile(r""" 
    87     (?P<img>img) 
    88     |(?P<embed>embed) 
    89     |(?P<object>object) 
    90     |(?P<iframe>iframe) 
    91     |(?P<script>script) 
     88attribute_whitelist=re.compile(r""" 
     89    (href 
     90    |name 
     91    |colspan 
     92    |rowspan 
     93    |align 
     94    |valign 
     95    |alt 
     96    |width 
     97    |height 
     98    |border) 
    9299    """, re.IGNORECASE | re.VERBOSE) 
    93  
     100     
     101attribute_finder=re.compile(r""" 
     102    \b(?P<attribute>(?P<attrib_name>\w*?) # detect attribute name: [space]attrib_name[word_end] 
     103    \s*?=\s*?['"]?                        # [spaces?]=[spaces?][stringquotes?] 
     104    (?P<attrib_value>[^\s'">]*?)[\s'">]    # match until stringquotes, space or '>'. Bad thing is that '>' gets eaten. 
     105    )""", re.IGNORECASE | re.VERBOSE | re.MULTILINE | re.DOTALL) 
     106 
     107attribute_javascript=re.compile(r"script:", re.IGNORECASE | re.MULTILINE) 
    94108 
    95109 
     
    115129        # These are the methods to replace matched cases of certain type 
    116130     
     131 
     132        def replace_attributes(match): 
     133            attrib_name=match.group('attrib_name') 
     134            attrib_value=match.group('attrib_value') 
     135            print attrib_name 
     136            print attrib_value 
     137 
     138            if attrib_name and attrib_value: 
     139                if attribute_whitelist.match(attrib_name) and not attribute_javascript.match(attrib_value): 
     140                    print 'good attr' 
     141                    return match.group('attribute')             
     142            print 'bad attr' 
     143            return '' 
     144 
    117145        def html_open(match): 
    118146            full_tag=match.group('html_open') 
     
    121149            if tag_match: 
    122150                tag=tag_match.group() 
     151                if len(tag)+5 < len(full_tag): # if tag is very short it can't have attributes so don't bother searching 
     152                    print full_tag 
     153                    full_tag=attribute_finder.sub(replace_attributes, full_tag) 
     154                    if not full_tag.endswith('>'): 
     155                        full_tag='%s>' % full_tag 
     156                    print attribute_finder.sub(replace_attributes, full_tag) 
     157                    print full_tag 
    123158                if not full_tag.endswith('/>'): # also deals with self-closing tags like <br/> 
    124                     open_tags.append(tag) 
    125                 print 'kept open tag %s' % full_tag 
     159                    open_tags.append(tag.lower()) 
    126160                return full_tag 
    127161            tag_match=re.match(restricted, tag)             
     
    129163                if self.isGoodEmbed(full_tag): 
    130164                    if not full_tag.endswith('/>'): # also deals with self-closing tags like <br/> 
    131                        open_tags.append(tag_match.group())                     
    132                     print 'kept open embed %s' % full_tag 
     165                       open_tags.append(tag_match.group().lower())                     
    133166                    return full_tag 
    134                 print 'BAD embed: %s' % full_tag 
    135167                return '' 
    136             print 'BAD tag: %s' % full_tag 
    137168            return '' 
    138169     
     
    142173            if tag in open_tags: 
    143174                open_tags.remove(tag) 
    144                 print 'closed tag %s' % full_tag  
    145175                return full_tag 
    146176            else: 
    147                 print 'ignored closing tag %s' % full_tag 
    148177                return '' 
    149178     
     
    195224 
    196225        def tex_equation(match): 
    197             print 'match for TEX EQUATION' 
    198226            full_tag=match.group('tex_equation') 
    199227            tex_tag=match.group('tex_tag') 
     
    215243        def paragraph(match): 
    216244            full_tag=match.group('paragraph') 
    217             print 'paragraph!' 
    218245            taggy='' 
    219246            if open_tags and open_tags[-1]=='p': 
    220                 print 'close previous p' 
    221247                open_tags.remove('p') 
    222248                taggy='</p>\n' 
    223249            if not open_tags: 
    224                 print 'empty open_tags, starting new p' 
    225250                open_tags.append('p') 
    226251                taggy='%s<p>' % taggy 
     
    230255        def linebreak(match): 
    231256            full_tag=match.group('linebreak') 
    232             print 'linebreak!' 
    233257            if (open_tags and not 'p' in open_tags) or match.group('tex') or match.group('tex_equation'): 
    234                 print 'lb escaped because inside open tags.' 
    235258                return full_tag 
    236259            else: 
     
    290313                 
    291314        for match in founds: 
    292             print match 
    293315            permitted=False 
    294316            for nice_site in good_sites: 
  • trunk/skins/lemill/member_view.pt

    r1988 r1989  
    135135                    <span tal:condition="biography" tal:omit-tag=""> 
    136136                        <h1 i18n:domain="plone" i18n:translate="label_biography">Biography</h1> 
    137                         <span tal:define="cooked python:here.lemill_tool.parse_text(biography)" tal:replace="structure cooked"></span>  
     137                        <span tal:replace="structure python:context.lemill_tool.parse_text(biography)"></span>  
    138138                    </span>  
    139139 
Note: See TracChangeset for help on using the changeset viewer.