Skip to content
Snippets Groups Projects
Verified Commit 538901b4 authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Sanitize retrieval of XML singleton text nodes.

parent 8ed787e8
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,7 @@ import zipfile ...@@ -4,6 +4,7 @@ import zipfile
import dateutil.parser import dateutil.parser
from ..util import xml_get_text
from ..model import Geocache, Geocacher, GeocacherAccount, Listing, Log, Waypoint from ..model import Geocache, Geocacher, GeocacherAccount, Listing, Log, Waypoint
logger = logging.getLogger('librestash') logger = logging.getLogger('librestash')
...@@ -25,7 +26,7 @@ class GpxImporter(object): ...@@ -25,7 +26,7 @@ class GpxImporter(object):
for gpx_waypoint in gpx_waypoints: for gpx_waypoint in gpx_waypoints:
# Find or create waypoint object # Find or create waypoint object
code = gpx_waypoint.getElementsByTagName('name')[0].firstChild.data code = xml_get_text(gpx_waypoint, 'name')
waypoint = session.query(Waypoint).filter_by(code=code).scalar() waypoint = session.query(Waypoint).filter_by(code=code).scalar()
if not waypoint: if not waypoint:
logger.info('Creating new waypoint %s' % code) logger.info('Creating new waypoint %s' % code)
...@@ -35,9 +36,9 @@ class GpxImporter(object): ...@@ -35,9 +36,9 @@ class GpxImporter(object):
logger.info('Updating waypoint %s' % code) logger.info('Updating waypoint %s' % code)
waypoint.latitude = float(gpx_waypoint.getAttribute('lat')) waypoint.latitude = float(gpx_waypoint.getAttribute('lat'))
waypoint.longitude = float(gpx_waypoint.getAttribute('lon')) waypoint.longitude = float(gpx_waypoint.getAttribute('lon'))
waypoint.description = gpx_waypoint.getElementsByTagName('desc')[0].firstChild.data waypoint.description = xml_get_text(gpx_waypoint, 'desc')
waypoint.type = gpx_waypoint.getElementsByTagName('type')[0].firstChild.data waypoint.type = xml_get_text(gpx_waypoint, 'type')
waypoint.date = dateutil.parser.parse(gpx_waypoint.getElementsByTagName('time')[0].firstChild.data) waypoint.date = dateutil.parser.parse(xml_get_text(gpx_waypoint, 'time'))
# Save waypoint # Save waypoint
session.add(waypoint) session.add(waypoint)
...@@ -55,17 +56,17 @@ class GpxImporter(object): ...@@ -55,17 +56,17 @@ class GpxImporter(object):
# Update listing data # Update listing data
logger.info('Updating listing for %s' % code) logger.info('Updating listing for %s' % code)
listing.name = cache_node.getElementsByTagName('groundspeak:name')[0].firstChild.data listing.name = xml_get_text(cache_node, 'groundspeak:name')
listing.type = cache_node.getElementsByTagName('groundspeak:type')[0].firstChild.data listing.type = xml_get_text(cache_node, 'groundspeak:type')
listing.size = cache_node.getElementsByTagName('groundspeak:container')[0].firstChild.data listing.size = xml_get_text(cache_node, 'groundspeak:container')
listing.difficulty = float(cache_node.getElementsByTagName('groundspeak:difficulty')[0].firstChild.data) listing.difficulty = float(xml_get_text(cache_node, 'groundspeak:difficulty'))
listing.terrain = float(cache_node.getElementsByTagName('groundspeak:terrain')[0].firstChild.data) listing.terrain = float(xml_get_text(cache_node, 'groundspeak:terrain'))
listing.summary = cache_node.getElementsByTagName('groundspeak:short_description')[0].firstChild.data listing.summary = xml_get_text(cache_node, 'groundspeak:short_descrpition')
listing.description = cache_node.getElementsByTagName('groundspeak:long_description')[0].firstChild.data listing.description = xml_get_text(cache_node, 'groundspeak:long_descrpition')
listing.hints = cache_node.getElementsByTagName('groundspeak:encoded_hints')[0].firstChild.data listing.hints = xml_get_text(cache_node, 'groundspeak:encoded_hints')
# Find or create owner # Find or create owner
owner_name = cache_node.getElementsByTagName('groundspeak:owner')[0].firstChild.data owner_name = xml_get_text(cache_node, 'groundspeak:owner')
owner = session.query(GeocacherAccount).filter_by(name=owner_name, platform_prefix=listing.platform_prefix).scalar() owner = session.query(GeocacherAccount).filter_by(name=owner_name, platform_prefix=listing.platform_prefix).scalar()
if not owner: if not owner:
logger.info('Creating owner %s' % owner_name) logger.info('Creating owner %s' % owner_name)
...@@ -87,7 +88,7 @@ class GpxImporter(object): ...@@ -87,7 +88,7 @@ class GpxImporter(object):
logger.info('Importing logs for %s' % code) logger.info('Importing logs for %s' % code)
for log_node in cache_node.getElementsByTagName('groundspeak:logs'): for log_node in cache_node.getElementsByTagName('groundspeak:logs'):
# Find or create geocacher account # Find or create geocacher account
finder_name = log_node.getElementsByTagName('groundspeak:finder')[0].firstChild.data finder_name = xml_get_text(log_node, 'groundspeak:finder')
finder_account = session.query(GeocacherAccount).filter_by(name=finder_name, platform_prefix=listing.platform_prefix).scalar() finder_account = session.query(GeocacherAccount).filter_by(name=finder_name, platform_prefix=listing.platform_prefix).scalar()
if not finder_account: if not finder_account:
logger.info('Creating finder %s' % finder_name) logger.info('Creating finder %s' % finder_name)
...@@ -95,9 +96,9 @@ class GpxImporter(object): ...@@ -95,9 +96,9 @@ class GpxImporter(object):
finder = Geocacher(accounts=[finder_account]) finder = Geocacher(accounts=[finder_account])
# Get log data # Get log data
date = dateutil.parser.parse(log_node.getElementsByTagName('groundspeak:date')[0].firstChild.data) date = dateutil.parser.parse(xml_get_text(log_node, 'groundspeak:date')
type = log_node.getElementsByTagName('groundspeak:type')[0].firstChild.data type = xml_get_text(log_node, 'groundspeak:type')
text = log_node.getElementsByTagName('groundspeak:text')[0].firstChild.data text = xml_get_text(log_node, 'groundspeak:text')
# Find or create log # Find or create log
log = session.query(Log).filter_by(date=date, type=type, geocacher_account=finder_account, listing=listing).scalar() log = session.query(Log).filter_by(date=date, type=type, geocacher_account=finder_account, listing=listing).scalar()
...@@ -110,10 +111,10 @@ class GpxImporter(object): ...@@ -110,10 +111,10 @@ class GpxImporter(object):
elif waypoint.type.startswith('Waypoint|'): elif waypoint.type.startswith('Waypoint|'):
# This is a sub-waypoint # This is a sub-waypoint
# Guess platform prefix # Guess platform prefix
if gpx_waypoint.getElementsByTagName('url')[0].firstChild.data.startswith('http://www.geocaching.com'): if xml_get_text(gpx_waypoint, 'url').startswith('http://www.geocaching.com'):
platform_prefix = 'GC' platform_prefix = 'GC'
parent_code = platform_prefix + waypoint.code[2:] parent_code = platform_prefix + waypoint.code[2:]
elif gpx_waypoint.getElementsByTagName('url')[0].firstChild.data.startswith('https://www.opencaching.de'): elif xml_get_text(gpx_waypoint, 'url').startswith('https://www.opencaching.de'):
platform_prefix = 'OC' platform_prefix = 'OC'
parent_code = platform_prefix + waypoint.code[2:] parent_code = platform_prefix + waypoint.code[2:]
......
def xml_get_text(node, tag):
if not node.getElementsByTagName(tag):
return None
if not node.getElementsByTagName(tag)[0].firstChild:
return None
return node.getElementsByTagName(tag)[0].firstChild.data
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment