Changeset 2641 for TI05-delivery


Ignore:
Timestamp:
23/06/07 19:33:10 (12 years ago)
Author:
lawrence
Message:

Fixed major bug in xmlHandler2, and retrieve now
respects CSML security. CSML documents are large
so need to put caching in place.

Location:
TI05-delivery/ows_framework/trunk/ows_server/ows_server/models
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ndgRetrieve.py

    r2640 r2641  
    22import cgi,time 
    33from Utilities import myConfig 
     4from ndgSecurity import HandleSecurity 
     5 
    46debug=1 
    5 def ndgRetrieve(uri,config,logger=0,requestor='test',format=''): 
     7def ndgRetrieve(uri,config,logger=0,requestor='test',format='',securityTokens=None): 
    68     
    79    ''' Given an ndgObject, uri, retrieve it, with security in place ''' 
    810     
    911     
    10     def getws(config,uri): 
     12    def getws(config,uri,): 
    1113        ''' Get a ws connection to the local exist database ''' 
    1214        # The logic here is that 
     
    7173        pass 
    7274    elif uri.schema =='NDG-A0': 
    73         pass         
    74              
    75      
     75         
     76        s=x.tree.find('{http://ndg.nerc.ac.uk/csml}AccessControlPolicy/{http://ndg.nerc.ac.uk/csml}dgSecurityCondition') 
     77        if s is not None: 
     78            status,message=HandleSecurity(s,securityTokens) 
     79            if not status: return 0,'<p> Access Denied </p><p>%s</p>'%message 
    7680    return 1,x 
    7781     
     
    139143        status,xml=ndgRetrieve(uri,self.c) 
    140144        if status: s=str(xml) 
    141         print s 
     145         
     146     
     147    def testSecurityCSML(self): 
     148        ''' Make sure that CSML security is respected ''' 
     149        securityTokens=None 
     150        self.setup() 
     151        doc='badc.nerc.ac.uk__NDG-A0__AfEj15o6' 
     152        uri=ndgObject.ndgObject(doc) 
     153        status,xml=ndgRetrieve(uri,self.c) 
     154        self.assertEqual(status,0) 
     155         
    142156         
    143157         
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/xmlHandler2.py

    r2640 r2641  
    4141            self.tree=ET.parse(xmlf).getroot() 
    4242        except SyntaxError: 
    43             self.__fixXML() 
     43            self.xmls=self.__fixXML(self.xmls) 
    4444            xmlf=StringIO.StringIO(self.xmls.encode('utf-8')) 
    4545            self.tree=ET.parse(xmlf).getroot() 
     
    5353        # or bettter yet, use iterparse in the first place, but that seemed slow. 
    5454         
    55         print self.xmls[0:19] 
     55 
    5656        if self.xmls[0:19]=='<?xml version="1.0"': 
    5757            self.root=1 
     
    8585        def span(x,c): return '<span class="%s">%s</span>'%(c,x) 
    8686        def div(x,c): return '<div class="%s">%s</div>'%(c,x) 
     87        def fix(x):  
     88            if x is None: return '' 
     89            return x 
    8790        def et2html(elem):     
    8891            strAttrib='' 
    8992            for att in elem.attrib: 
    9093                strAttrib+=' %s="%s"'%(span(att,'xmlAttrTyp'),span(elem.attrib[att],'xmlAttrVal')) 
    91             result='%s%s%s%s%s'%(lt,span(elem.tag,"xmlElemTag"),strAttrib,gt,elem.tail) 
     94            result='%s%s%s%s%s'%(lt,span(elem.tag,"xmlElemTag"),strAttrib,gt,fix(elem.text)) 
    9295            children=len(elem) 
    9396            if children: 
    9497                for item in elem: 
    9598                    result+=et2html(item) 
    96                 result+='%s%s/%s%s'%(lt,span(elem.tag,'xmlElemTag'),gt,elem.tail) 
     99                result+='%s%s/%s%s'%(fix(elem.tail),lt,span(elem.tag,'xmlElemTag'),gt) 
    97100            else: 
    98101                result+='%s/%s%s'%(lt,span(elem.tag,'xmlElemTag'),gt) 
     
    103106        if self.root:h='%s%s %s="%s" %s="%s"%s'%( 
    104107            lt,'?xml',span('version','xmlAttrTyp'),'1.0',span('encoding','xmlAttrTyp'),'utf-8',gt) 
     108        ss=self.__fixXML(ss) 
    105109        if self.realns=={}: return h+ss 
    106         return self.__fixns(h,ss) 
    107            
     110        return h+self.__nsfixpretty(ss,span) 
     111           
     112    def __nsfixpretty(self,s,span): 
     113        ''' Yet another careful fix ''' 
     114        for ns in self.realns: 
     115            r='{%s}'%ns 
     116            if self.realns[ns]=='default': 
     117                s=s.replace(r,'') 
     118            else: 
     119                s=s.replace(r,'%s:'%self.realns[ns]) 
     120        if self.realns=={}: return s 
     121        # at this point we have no namespace list at the top 
     122        rightArrow=s.find('</span>') # this is just after the tag, where we do want the namespace list 
     123        nslist={}  
     124        for ns in self.realns: nslist[self.realns[ns]]=ns 
     125        r=' %s="%s"'%(span('xmlns','xmlAttrTyp'),span(nslist['default'],'xmlAttrVal')) 
     126        for ns in nslist: 
     127            if ns<>'default': r+=' %s="%s"'%(span('xmlns:%s'%ns,'xmlAttrTyp'),span(nslist[ns],'xmlAttrVal')) 
     128        return s[:rightArrow]+r+s[rightArrow:] 
     129         
    108130    def __updatens(self): 
    109131        ''' Update the element tree namespace map with our own map ''' 
    110         # *c*ElementTree doesn't have this update method (or at  
    111         # least I can't find it), so you have to import ElementTree and call it on  
    112         # that, then it all mysteriously works in cElementTree...  
    113          
     132        # *c*ElementTree doesn't have this update method (or at 
     133        # least I can't find it), so you have to import ElementTree and call it on 
     134        # that, then it all mysteriously works in cElementTree... 
     135 
    114136        pET._namespace_map.update(self.realns) 
    115137 
     
    126148         
    127149    def __fixns(self,h,ss): 
    128         ''' Fix the namespaces ''' 
     150        ''' Fix the namespaces after ET has produced a string ''' 
    129151        ss=ss.replace('default:','') 
    130152        for ns in self.realns: 
     
    137159        nslist={} 
    138160        for ns in self.realns: nslist[self.realns[ns]]=ns 
    139         r='xmlns:"%s"'%nslist['default'] 
     161        r='xmlns="%s"'%nslist['default'] 
    140162        for ns in nslist: 
    141163            if ns<>'default': r+=' xmlns:%s="%s"'%(ns,nslist[ns]) 
    142164        h+=ss[:rightArrow]+r+ss[rightArrow:] 
    143165        return h 
    144          
    145166      
    146     def __fixXML(self): 
     167    def __fixXML(self,s): 
    147168        #first those nasty ampersands 
    148         self.xmls=re.sub(r'&(?!\w+;)', '&amp;', self.xmls) 
     169        s=re.sub(r'&(?!\w+;)', '&amp;', s) 
    149170        #and now orphan > < signs 
    150171        if self.r1 is None: 
    151172            self.r1=re.compile('<([^>]*(<|$))') 
    152173            self.r2=re.compile('((^|>)[^<]*)>') 
    153         s=self.xmls 
    154174        old='' 
    155175        while s != old: 
     
    157177            s=self.r1.sub(r'&lt;\1',s) 
    158178            s=self.r2.sub(r'\1&gt;',s) 
    159         self.xmls=s  
     179        return s 
    160180       
    161181           
     
    171191                <Dataset xmlns:swe="http://www.opengis.net/swe" xmlns:gml="http://www.opengis.net/gml" 
    172192                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:moles="http://ndg.nerc.ac.uk/moles" 
    173                  xmlns:om="http://www.opengis.net/om" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://ndg.nerc.ac.uk/csml" 
     193                 xmlns:om="http://www.opengis.net/om" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://ndg.nerc.ac.uk/csml"  
    174194                 id="FGPfF9i0"><CSMLFeatureCollection gml:id="AfEj15o6"/><om:blah>blahvalue</om:blah><foo>foovalue</foo></Dataset>''' 
    175195                  
     
    187207            self.setup() 
    188208            x=xmlHandler(self.ss,string=1) 
    189             self.assertEqual('<?xml version="1.0" encoding="utf-8"><Dataset id="FGPfF9i0" xmlns:"http://ndg.nerc.ac.uk/csml" xmlns:om="http://www.opengis.net/om" xmlns:gml="http://www.opengis.net/gml" xmlns:swe="http://www.opengis.net/swe" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:moles="http://ndg.nerc.ac.uk/moles"><CSMLFeatureCollection gml:id="AfEj15o6"  /><om:blah >blahvalue</om:blah><foo>foovalue</foo></Dataset>',str(x)) 
     209            self.assertEqual('<?xml version="1.0" encoding="utf-8"><Dataset id="FGPfF9i0" xmlns="http://ndg.nerc.ac.uk/csml" xmlns:om="http://www.opengis.net/om" xmlns:gml="http://www.opengis.net/gml" xmlns:swe="http://www.opengis.net/swe" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:moles="http://ndg.nerc.ac.uk/moles"><CSMLFeatureCollection gml:id="AfEj15o6"  /><om:blah >blahvalue</om:blah><foo>foovalue</foo></Dataset>',str(x)) 
    190210             
    191211        def testorphans(self): 
     
    211231            s='<?xml version="1.0" encoding="utf-8"?><data><element>stuff</element></data>' 
    212232            x=xmlHandler(s,string=1) 
    213             h=x.tohtml() 
    214             print h 
     233            h=x.tohtml() # only testing the mechanics, not the result 
     234             
    215235             
    216236        #turn off the test 
     
    222242             
    223243             
     244        def testDIF(self): 
     245            s='''<DIF xmlns="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Entry_ID>badc.nerc.ac.uk__DIF__dataent_11738019833217179</Entry_ID></DIF>''' 
     246            x=xmlHandler(s,string=1) 
     247            print x.realns 
     248            print str(x) 
     249            h=x.tohtml() 
     250            print h 
     251             
    224252    unittest.main() 
    225253             
Note: See TracChangeset for help on using the changeset viewer.