Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
LOGGER.debug('Writing response.')
if hasattr(self, 'soap') and self.soap:
self._gen_soap_wrapper()
if (isinstance(self.kvp, dict) and 'outputformat' in self.kvp and
self.kvp['outputformat'] == 'application/json'):
self.contenttype = self.kvp['outputformat']
from pycsw.core.formats import fmt_json
response = fmt_json.exml2json(self.response,
self.context.namespaces, self.pretty_print)
else: # it's XML
self.contenttype = self.mimetype
etree.cleanup_namespaces(self.response)
response = etree.tostring(self.response,
pretty_print=self.pretty_print, encoding='unicode')
xmldecl = '\n' \
% self.encoding
appinfo = '\n' % self.context.version
s = (u'%s%s%s' % (xmldecl, appinfo, response)).encode(self.encoding)
LOGGER.debug('Response:\n%s', s)
return s
def caps2iso(record, caps, context):
"""Creates ISO metadata from Capabilities XML"""
from pycsw.plugins.profiles.apiso.apiso import APISO
apiso_obj = APISO(context.model, context.namespaces, context)
apiso_obj.ogc_schemas_base = 'http://schemas.opengis.net'
apiso_obj.url = context.url
queryables = dict(apiso_obj.repository['queryables']['SupportedISOQueryables'].items())
iso_xml = apiso_obj.write_record(record, 'full', 'http://www.isotc211.org/2005/gmd', queryables, caps)
return etree.tostring(iso_xml)
def _parse_constraint(self, element):
''' Parse csw:Constraint '''
query = {}
tmp = element.find(util.nspath_eval('fes20:Filter', self.parent.context.namespaces))
if tmp is not None:
LOGGER.debug('Filter constraint specified')
try:
query['type'] = 'filter'
query['where'], query['values'] = fes2.parse(tmp,
self.parent.repository.queryables['_all'], self.parent.repository.dbtype,
self.parent.context.namespaces, self.parent.orm, self.parent.language['text'], self.parent.repository.fts)
query['_dict'] = xml2dict(etree.tostring(tmp), self.parent.context.namespaces)
except Exception as err:
return 'Invalid Filter request: %s' % err
tmp = element.find(util.nspath_eval('csw30:CqlText', self.parent.context.namespaces))
if tmp is not None:
LOGGER.debug('CQL specified: %s.', tmp.text)
try:
LOGGER.info('Transforming CQL into OGC Filter')
query['type'] = 'filter'
cql = cql2fes1(tmp.text, self.parent.context.namespaces)
query['where'], query['values'] = fes1.parse(cql,
self.parent.repository.queryables['_all'], self.parent.repository.dbtype,
self.parent.context.namespaces, self.parent.orm, self.parent.language['text'], self.parent.repository.fts)
query['_dict'] = xml2dict(etree.tostring(cql), self.parent.context.namespaces)
except Exception as err:
LOGGER.exception('Invalid CQL request: %s', tmp.text)
def caps2iso(record, caps, context):
"""Creates ISO metadata from Capabilities XML"""
from pycsw.plugins.profiles.apiso.apiso import APISO
apiso_obj = APISO(context.model, context.namespaces, context)
apiso_obj.ogc_schemas_base = 'http://schemas.opengis.net'
apiso_obj.url = context.url
queryables = dict(apiso_obj.repository['queryables']['SupportedISOQueryables'].items())
iso_xml = apiso_obj.write_record(record, 'full', 'http://www.isotc211.org/2005/gmd', queryables, caps)
return etree.tostring(iso_xml)
try:
schema = os.path.join(self.parent.config.get('server', 'home'),
'core', 'schemas', 'ogc', 'filter', '1.1.0', 'filter.xsd')
LOGGER.info('Validating Filter %s.', self.parent.kvp['constraint'])
schema = etree.XMLSchema(file=schema)
parser = etree.XMLParser(schema=schema, resolve_entities=False)
doc = etree.fromstring(self.parent.kvp['constraint'], parser)
LOGGER.debug('Filter is valid XML.')
self.parent.kvp['constraint'] = {}
self.parent.kvp['constraint']['type'] = 'filter'
self.parent.kvp['constraint']['where'], self.parent.kvp['constraint']['values'] = \
fes2.parse(doc,
self.parent.repository.queryables['_all'],
self.parent.repository.dbtype,
self.parent.context.namespaces, self.parent.orm, self.parent.language['text'], self.parent.repository.fts)
self.parent.kvp['constraint']['_dict'] = xml2dict(etree.tostring(doc), self.parent.context.namespaces)
except Exception as err:
errortext = \
'Exception: document not valid.\nError: %s' % str(err)
LOGGER.exception(errortext)
return self.exceptionreport('InvalidParameterValue',
'bbox', 'Invalid Filter query: %s' % errortext)
else:
self.parent.kvp['constraint'] = {}
if 'sortby' not in self.parent.kvp:
self.parent.kvp['sortby'] = None
elif 'sortby' in self.parent.kvp and self.parent.requesttype == 'GET':
LOGGER.debug('Sorted query specified')
tmp = self.parent.kvp['sortby']
self.parent.kvp['sortby'] = {}
# serialize to lxml
xml = etree.fromstring(xml, PARSER)
recprop = eval(recprop)
nsmap = eval(nsmap)
try:
nodes = xml.xpath(recprop['rp']['xpath'], namespaces=nsmap)
if len(nodes) > 0: # matches
for node1 in nodes:
if node1.text != recprop['value']: # values differ, update
node1.text = recprop['value']
except Exception as err:
print(err)
raise RuntimeError('ERROR: %s' % str(err))
return etree.tostring(xml)
etree.SubElement(
condition,
util.nspath_eval('ogc:PropertyName', namespaces)).text = flt[1]
etree.SubElement(
condition,
util.nspath_eval('ogc:Literal', namespaces)).text = flt[2]
if logical_op is not None:
logical_op.append(condition)
else:
root.append(condition)
LOGGER.debug('Resulting OGC Filter: %s',
etree.tostring(root, pretty_print=1))
return root
try:
# it is virtually impossible to validate a csw:Transaction
# csw:Insert|csw:Update (with single child) XML document.
# Only validate non csw:Transaction XML
if doc.find('.//%s' % util.nspath_eval('csw30:Insert',
self.parent.context.namespaces)) is None and \
len(doc.xpath('//csw30:Update/child::*',
namespaces=self.parent.context.namespaces)) == 0:
LOGGER.info('Validating %s', postdata)
schema = etree.XMLSchema(file=schema)
parser = etree.XMLParser(schema=schema, resolve_entities=False)
if hasattr(self.parent, 'soap') and self.parent.soap:
# validate the body of the SOAP request
doc = etree.fromstring(etree.tostring(doc), parser)
else: # validate the request normally
doc = etree.fromstring(postdata, parser)
LOGGER.debug('Request is valid XML')
else: # parse Transaction without validation
doc = etree.fromstring(postdata, self.parent.context.parser)
except Exception as err:
errortext = \
'Exception: the document is not valid.\nError: %s' % str(err)
LOGGER.exception(errortext)
return errortext
request['request'] = etree.QName(doc).localname
LOGGER.debug('Request operation %s specified.', request['request'])
tmp = doc.find('.').attrib.get('service')
if tmp is not None:
request['service'] = tmp