sozialhelden/omniauth-osm

View on GitHub
lib/omniauth/strategies/osm.rb

Summary

Maintainability
A
35 mins
Test Coverage
require 'omniauth-oauth'
require 'rexml/document'

module OmniAuth
  module Strategies
    class Osm < OmniAuth::Strategies::OAuth
      option :name, "osm"

      def self.site
        if ENV['OSM_AUTH_SITE']
          ENV['OSM_AUTH_SITE']
        else
          "http://www.openstreetmap.org"
        end
      end

      option :client_options, :site => site
      option :fetch_permissions, false

      uid { raw_info['id'] }

      info do
        raw_info
      end

      def raw_info
        @raw_info ||= parse_info(access_token.get('/api/0.6/user/details').body)
        @raw_info['permissions'] ||= parse_permissions(access_token.get('/api/0.6/permissions').body) if options[:fetch_permissions]
        @raw_info
        rescue ::Errno::ETIMEDOUT
        raise ::Timeout::Error
      end

      # EXAMPLE XML
      #
      # <?xml version="1.0" encoding="UTF-8"?>
      # <osm generator="OpenStreetMap server" version="0.6">
      #   <user display_name="freundchen" account_created="2011-01-07T14:35:24Z" id="392638">
      #     <img href='http://foo.bar.net/logo.gif' />
      #     <description>Test description</description>
      #     <contributor-terms pd="false" agreed="true"/>
      #     <home lon="13.411681556178" zoom="3" lat="52.524360979625"/>
      #     <languages>
      #       <lang>de-DE</lang>
      #       <lang>de</lang>
      #     </languages>
      #   </user>
      # </osm>

      private
      def parse_info(xml_data)
        # extract event information
        doc = REXML::Document.new(xml_data)
        user = doc.elements['//user']
        home = doc.elements['//home']
        languages = doc.get_elements('//lang')
        image = doc.elements['//img']
        description = doc.elements['//description']
        basic_attributes = { }
        basic_attributes['id']           = user.attribute('id').value if user
        basic_attributes['display_name'] = user.attribute('display_name').value if user
        basic_attributes['languages']    = languages.map(&:text) if languages
        basic_attributes['image_url']    = image.attribute('href').value if image
        basic_attributes['lat']          = home.attribute('lat').value.to_f if home
        basic_attributes['lon']          = home.attribute('lon').value.to_f if home
        basic_attributes['description']  = description.text if description
        basic_attributes
      end

      def parse_permissions(xml_data)
        # extract event information
        doc = REXML::Document.new(xml_data)
        doc.get_elements('//permission').map { |p| p.attribute('name').value }
      end
    end
  end
end