diff --git a/Changelog.md b/Changelog.md index 247c7353513e422c93a5bd7cd3e54e060bbe5134..9608a68b62c4c418508dd4865822c7ebf2df1358 100644 --- a/Changelog.md +++ b/Changelog.md @@ -8,6 +8,7 @@ * Extract StatusMessageService from StatusMessagesController [#6280](https://github.com/diaspora/diaspora/pull/6280) * Refactor HomeController#toggle\_mobile [#6260](https://github.com/diaspora/diaspora/pull/6260) * Extract CommentService from CommentsController [#6307](https://github.com/diaspora/diaspora/pull/6307) +* Extract user/profile discovery into the diaspora\_federation-rails gem [#6310](https://github.com/diaspora/diaspora/pull/6310) ## Bug fixes * Fix indentation and a link title on the default home page [#6212](https://github.com/diaspora/diaspora/pull/6212) diff --git a/app/models/person.rb b/app/models/person.rb index e24b4af2157850266d7d14eaf5c7699636cdb7b6..a242af670e3b49941a897cc51792f449ff44b5fe 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -265,32 +265,6 @@ class Person < ActiveRecord::Base where(guid: guid, closed_account: false).where.not(owner: nil).take end - def self.create_from_webfinger(profile, hcard) - return nil if profile.nil? || !profile.valid_diaspora_profile? - new_person = Person.new - new_person.serialized_public_key = profile.public_key - new_person.guid = profile.guid - new_person.diaspora_handle = profile.account - new_person.url = profile.seed_location - - #hcard_profile = HCard.find profile.hcard.first[:href] - ::Logging::Logger[self].info "event=webfinger_marshal valid=#{new_person.valid?} " \ - "target=#{new_person.diaspora_handle}" - new_person.assign_new_profile_from_hcard(hcard) - new_person.save! - new_person.profile.save! - new_person - end - - def assign_new_profile_from_hcard(hcard) - self.profile = Profile.new(:first_name => hcard[:given_name], - :last_name => hcard[:family_name], - :image_url => hcard[:photo], - :image_url_medium => hcard[:photo_medium], - :image_url_small => hcard[:photo_small], - :searchable => hcard[:searchable]) - end - def remote? owner_id.nil? end diff --git a/config/initializers/load_libraries.rb b/config/initializers/load_libraries.rb index f0dfd8c0c8b54cf0c5d65cf996f1e7898cd3c8cd..86d701d33d8827b6be113648b6469a92548e0113 100644 --- a/config/initializers/load_libraries.rb +++ b/config/initializers/load_libraries.rb @@ -14,13 +14,10 @@ require 'diaspora' require 'direction_detector' require 'email_inviter' require 'evil_query' -require 'h_card' require 'hydra_wrapper' require 'postzord' require 'publisher' require 'pubsubhubbub' require 'salmon' require 'stream' -require 'webfinger' -require 'webfinger_profile' require 'account_deleter' diff --git a/lib/h_card.rb b/lib/h_card.rb deleted file mode 100644 index 2fda6aa2ed60da8ca4408dee0896abb1809bf0e6..0000000000000000000000000000000000000000 --- a/lib/h_card.rb +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2010-2011, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. - -module HCard - def self.parse(doc) - { - given_name: doc.css(".given_name").text, - family_name: doc.css(".family_name").text, - url: doc.css("#pod_location").text, - photo: doc.css(".entity_photo .photo[src]").attribute("src").text, - photo_small: doc.css(".entity_photo_small .photo[src]").attribute("src").text, - photo_medium: doc.css(".entity_photo_medium .photo[src]").attribute("src").text, - searchable: doc.css(".searchable").text == "true" - } - end - - def self.build(raw_hcard) - parse Nokogiri::HTML(raw_hcard) - end -end diff --git a/lib/webfinger.rb b/lib/webfinger.rb deleted file mode 100644 index 5c28a4e90d19ab0f248d094bfdd2426e6ae6d360..0000000000000000000000000000000000000000 --- a/lib/webfinger.rb +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (c) 2010-2012, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. - -class Webfinger - include Diaspora::Logging - - attr_accessor :host_meta_xrd, :webfinger_profile_xrd, - :webfinger_profile, :hcard, :hcard_xrd, :person, - :account, :ssl - - def initialize(account) - self.account = account - self.ssl = true - end - - - def fetch - return person if existing_person_with_profile? - create_or_update_person_from_webfinger_profile! - end - - def self.in_background(account, opts={}) - Workers::FetchWebfinger.perform_async(account) - end - - #everything below should be private I guess - def account=(str) - @account = str.strip.gsub('acct:','').to_s.downcase - end - - def get(url) - logger.info "Getting: #{url} for #{account}" - begin - res = Faraday.get(url) - unless res.success? - raise "Failed to fetch #{url}: #{res.status}" - end - res.body - rescue OpenSSL::SSL::SSLError => e - logger.error "Failed to fetch #{url}: SSL setup invalid" - raise e - rescue => e - logger.error "Failed to fetch: #{url} for #{account}; #{e.message}" - raise e - end - end - - def existing_person_with_profile? - cached_person.present? && cached_person.profile.present? - end - - def cached_person - self.person ||= Person.by_account_identifier(account) - end - - def create_or_update_person_from_webfinger_profile! - logger.info "webfingering #{account}, it is not known or needs updating" - if person #update my profile please - person.assign_new_profile_from_hcard(self.hcard) - else - person = make_person_from_webfinger - end - logger.info "successfully webfingered #{@account}" if person - person - end - - #this tries the xrl url with https first, then falls back to http - def host_meta_xrd - begin - get(host_meta_url) - rescue => e - if self.ssl - self.ssl = false - retry - else - raise "there was an error getting the xrd from account #{@account}: #{e.message}" - end - end - end - - - def hcard - @hcard ||= HCard.build(hcard_xrd) - end - - def webfinger_profile - @webfinger_profile ||= WebfingerProfile.new(account, webfinger_profile_xrd) - end - - def hcard_url - self.webfinger_profile.hcard - end - - def webfinger_profile_url - doc = Nokogiri::XML(self.host_meta_xrd) - return nil if doc.namespaces["xmlns"] != "http://docs.oasis-open.org/ns/xri/xrd-1.0" - swizzle doc.search('Link').find{|x| x['rel']=='lrdd'}['template'] - end - - def webfinger_profile_xrd - @webfinger_profile_xrd ||= get(webfinger_profile_url) - logger.warn "#{@account} doesn't exists anymore" if @webfinger_profile_xrd == false - @webfinger_profile_xrd - end - - def hcard_xrd - @hcard_xrd ||= get(hcard_url) - end - - def make_person_from_webfinger - Person.create_from_webfinger(webfinger_profile, hcard) unless webfinger_profile_xrd == false - end - - def host_meta_url - domain = account.split('@')[1] - "http#{'s' if self.ssl}://#{domain}/.well-known/host-meta" - end - - def swizzle(template) - template.gsub('{uri}', account) - end -end diff --git a/lib/webfinger_profile.rb b/lib/webfinger_profile.rb deleted file mode 100644 index 44259e200196c3b3a72f24aac8817ecc2d4ceb97..0000000000000000000000000000000000000000 --- a/lib/webfinger_profile.rb +++ /dev/null @@ -1,53 +0,0 @@ -class WebfingerProfile - include Diaspora::Logging - - attr_accessor :webfinger_profile, :account, :links, :hcard, :guid, :public_key, :seed_location - - def initialize(account, webfinger_profile) - @account = account - @webfinger_profile = webfinger_profile - @links = {} - set_fields - end - - def valid_diaspora_profile? - !(@webfinger_profile.nil? || @account.nil? || @links.nil? || @hcard.nil? || - @guid.nil? || @public_key.nil? || @seed_location.nil? ) - end - - private - - def set_fields - doc = Nokogiri::XML.parse(webfinger_profile) - doc.remove_namespaces! - - account_string = doc.css('Subject').text.gsub('acct:', '').strip - - raise "account in profile(#{account_string}) and account requested (#{@account}) do not match" if account_string != @account - - doc.css('Link').each do |l| - rel = text_of_attribute(l, 'rel') - href = text_of_attribute(l, 'href') - @links[rel] = href - case rel - when "http://microformats.org/profile/hcard" - @hcard = href - when "http://joindiaspora.com/guid" - @guid = href - when "http://joindiaspora.com/seed_location" - @seed_location = href - end - end - - begin - pubkey = text_of_attribute( doc.at('Link[rel=diaspora-public-key]'), 'href') - @public_key = Base64.decode64 pubkey - rescue => e - logger.warn "event=invalid_profile identifier=#{@account}" - end - end - - def text_of_attribute(doc, attr) - doc.attribute(attr) ? doc.attribute(attr).text : nil - end -end diff --git a/spec/controllers/diaspora_federation_controller_spec.rb b/spec/controllers/diaspora_federation_controller_spec.rb deleted file mode 100644 index 8799220ee88660fe188f0c03bbe956382d3ea815..0000000000000000000000000000000000000000 --- a/spec/controllers/diaspora_federation_controller_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 2010-2011, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. - -require "spec_helper" - -# this is temporarily needed for fixture generation -# TODO: remove this after the parsing is also in the diaspora_federation gem -describe DiasporaFederation do - routes { DiasporaFederation::Engine.routes } - - let(:fixture_path) { Rails.root.join("spec", "fixtures") } - - describe DiasporaFederation::WebfingerController, type: :controller do - it "generates the host_meta fixture", fixture: true do - get :host_meta - expect(response).to be_success - expect(response.body).to match(/webfinger/) - save_fixture(response.body, "host-meta", fixture_path) - end - - it "generates the webfinger fixture", fixture: true do - post :legacy_webfinger, "q" => alice.person.diaspora_handle - expect(response).to be_success - save_fixture(response.body, "webfinger", fixture_path) - end - end - - describe DiasporaFederation::HCardController, type: :controller do - it "generates the hCard fixture", fixture: true do - post :hcard, "guid" => alice.person.guid.to_s - expect(response).to be_success - save_fixture(response.body, "hcard", fixture_path) - end - end -end diff --git a/spec/fixtures/evan_hcard b/spec/fixtures/evan_hcard deleted file mode 100644 index 8944ef1e3d114158d2a0bd319a11bda22672837b..0000000000000000000000000000000000000000 --- a/spec/fixtures/evan_hcard +++ /dev/null @@ -1,72 +0,0 @@ - <body id="hcard"> - - <div id="wrap"> - <div id="core"> - <dl id="site_nav_local_views"> - <dt>Local views</dt> - <dd></dd> -</dl> - <div id="content"> - <h1>Evan Prodromou</h1> - - <div id="content_inner"> - <div id="i" class="entity_profile vcard author"> - <h2>User profile</h2> - <dl class="entity_depiction"> - <dt>Photo</dt> - <dd> - <img src="http://avatar.status.net/evan/1-96-20100726204409.jpeg" class="photo avatar" width="96" height="96" alt="evan"/> -</dd> - -</dl> - <dl class="entity_nickname"> - <dt>Nickname</dt> - <dd> - <a href="http://evan.status.net/" rel="me" class="nickname url uid">evan</a> -</dd> -</dl> - <dl class="entity_fn"> - <dt>Full name</dt> - - <dd> - <span class="fn">Evan Prodromou</span> -</dd> -</dl> - <dl class="entity_location"> - <dt>Location</dt> - <dd class="label">Montreal, QC, Canada</dd> -</dl> - <dl class="entity_url"> - - <dt>URL</dt> - <dd> - <a href="http://evan.prodromou.name/" rel="me" class="url">http://evan.prodromou.name/</a> -</dd> -</dl> - <dl class="entity_note"> - <dt>Note</dt> - <dd class="note">Montreal hacker and entrepreneur. Founder of identi.ca, lead developer of StatusNet, CEO of StatusNet Inc.</dd> - -</dl> -</div> -</div> -</div> -</div> - <div id="footer"> - <dl id="licenses"> - <dt id="site_statusnet_license">StatusNet software license</dt> - <dd><p><strong>Evan Prodromou</strong> is a microblogging service brought to you by <a href="http://status.net/">Status.net</a>. It runs the <a href="http://status.net/">StatusNet</a> microblogging software, version 0.9.5, available under the <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">GNU Affero General Public License</a>.</p> - -</dd> - <dt id="site_content_license">Site content license</dt> - <dd id="site_content_license_cc"> - <p> - <img id="license_cc" src="http://i.creativecommons.org/l/by/3.0/80x15.png" alt="Creative Commons Attribution 3.0" width="80" height="15"/>:w - - All Evan Prodromou content and data are available under the <a class="license" rel="external license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.</p> -</dd> - -</dl> -</div> -</div> -</body> diff --git a/spec/fixtures/finger_xrd b/spec/fixtures/finger_xrd deleted file mode 100644 index 5ede32d744fdeceaa2e56468534e3c37710547f0..0000000000000000000000000000000000000000 --- a/spec/fixtures/finger_xrd +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"> - <Subject>acct:tom@tom.joindiaspora.com</Subject> - <Alias>"http://tom.joindiaspora.com/"</Alias> - <Link rel="http://microformats.org/profile/hcard" type="text/html" href="http://tom.joindiaspora.com/hcard/users/4c8eccce34b7da59ff000002"/> - <Link rel="http://joindiaspora.com/seed_location" type="text/html" href="http://tom.joindiaspora.com/"/> - <Link rel="http://joindiaspora.com/guid" type="text/html" href="4c8eccce34b7da59ff000002"/> - <Link rel='http://webfinger.net/rel/profile-page' type='text/html' href="http://tom.joindiaspora.com/u/tom"/> - <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="http://tom.joindiaspora.com/u/tom.atom"/> - <Link rel="diaspora-public-key" type="RSA" href="LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUNDZ0tDQWdFQXlt dHpUdWQ3SytXQklPVVYwMmxZN2Z1NjdnNWQrbTBra1ZIQlgzTk1uYXB5bnZL a0VSemoKbkxma2JrTVpEVGdPNG1UaThmWFI3Q1ZSK3Q1SFN4b2Vub0JWazVX eUFabkEzWmpTRjBPcC9RakhlYzhvK0dVSApDOFluNFJ5N01hQ0R1cUNpNnJv c2RlbUlLTm1Fa2dsVVY1VzZ4WFd4Vmtrb21oL2VCQ2FmaVdMTXFRMG82NGox Ckw3aXNjQjVOM3ZkbnBrUmU3SkFxLzNDUTI3dWhDS0ZIWG1JYm1iVmhJQTNC R0J6YStPV3NjK1Z5cjV0Mm1wSlIKU1RXMk9UL20rS0NPK21kdnpmenQ0TzEr UHc1M1pJMjRpMlc2cW1XdThFZ1Z6QVcyMStuRGJManZiNHpzVHlrNQppN1JM cG8rUFl2VUJlLy8wM1lkQUJoRlJhVXpTL0RtcWRubEVvb0VvK0VmYzRkQ1NF bWVkMUgrek01c2xqQm1rCks5amsvOHNQZDB0SVZmMWZXdW9BcWZTSmErSXdr OHNybkdZbEVlaFV1dVhIY0x2b2JlUXJKYWdiRGc1Qll5TnIKeTAzcHpKTHlS ZU9UcC9RK1p0TXpMOFJMZWJsUzlWYXdNQzNDVzc5K0RGditTWGZ0eTl3NC8w d2NpUHpKejg2bgp2VzJ5K3crTThOWG52enBWNU81dGI4azZxZ2N0WjBmRzFu eXQ0RklsSHNVaUVoNnZLZmNLSmFPeWFRSGNGcWVxCjkwUkpoMm9TMDJBdFJx TFRSWDJJQjFnYXZnWEFXN1NYanJNbUNlVzlCdVBKYU5nZkp3WFFaelVoa0tC V1k0VnMKZTRFVWRob3R5RWkvUmE0RXVZU01ZcnZEeUFRUHJsY0wveDliaU1p bHVPcU9OMEpJZ1VodEZQRUNBd0VBQVE9PQotLS0tLUVORCBSU0EgUFVCTElD IEtFWS0tLS0tCg== "/> -</XRD> diff --git a/spec/fixtures/hcard_response b/spec/fixtures/hcard_response deleted file mode 100644 index 302c02430441d47e07fae1f8e1d373003c98bec2..0000000000000000000000000000000000000000 --- a/spec/fixtures/hcard_response +++ /dev/null @@ -1,64 +0,0 @@ - -<div id='content'> - <h1>Alexander Hamiltom</h1> - <div id='content_inner'> - <div class='entity_profile vcard author' id='i'> - <h2>User profile</h2> - <dl class='entity_nickname'> - <dt>Nickname</dt> - <dd> - <a class='nickname url uid' href='http://localhost:3000/' rel='me'>Alexander Hamiltom</a> - </dd> - </dl> - <dl class='entity_given_name'> - <dt>First name</dt> - <dd> - <span class='given_name'>Alexander</span> - </dd> - </dl> - <dl class='entity_family_name'> - <dt>Family name</dt> - <dd> - <span class='family_name'>Hamiltom</span> - </dd> - </dl> - <dl class='entity_fn'> - <dt>Full name</dt> - <dd> - <span class='fn'>Alexander Hamiltom</span> - </dd> - </dl> - <dl class='entity_url'> - <dt>URL</dt> - <dd> - <a class='url' href='http://localhost:3000/' id='pod_location' rel='me'>http://localhost:3000/</a> - </dd> - </dl> - <dl class='entity_photo'> - <dt>Photo</dt> - <dd> - <img class='photo avatar' height='300px' src='http://localhost:3000/uploads/images/thumb_large_8rxQAwC4Vx4cf5667d37db5b0fef000003.jpg' width='300px'> - </dd> - </dl> - <dl class='entity_photo_medium'> - <dt>Photo</dt> - <dd> - <img class='photo avatar' height='100px' src='http://localhost:3000/uploads/images/thumb_medium_8rxQAwC4Vx4cf5667d37db5b0fef000003.jpg' width='100px'> - </dd> - </dl> - <dl class='entity_photo_small'> - <dt>Photo</dt> - <dd> - <img class='photo avatar' height='50px' src='http://localhost:3000/uploads/images/thumb_small_8rxQAwC4Vx4cf5667d37db5b0fef000003.jpg' width='50px'> - </dd> - </dl> - <dl class='entity_searchable'> - <dt>Searchable</dt> - <dd> - <span class='searchable'>false</span> - </dd> - </dl> - </div> - </div> -</div> - diff --git a/spec/fixtures/host_xrd b/spec/fixtures/host_xrd deleted file mode 100644 index ca2d3b5fcbe9c16a047255138fd7473d5465697e..0000000000000000000000000000000000000000 --- a/spec/fixtures/host_xrd +++ /dev/null @@ -1,7 +0,0 @@ - <?xml version='1.0' encoding='UTF-8'?> - <XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'> - <Link rel='lrdd' - template='http://tom.joindiaspora.com/webfinger/?q={uri}'> - <Title>Resource Descriptor</Title> - </Link> - </XRD> diff --git a/spec/fixtures/nonseed_finger_xrd b/spec/fixtures/nonseed_finger_xrd deleted file mode 100644 index b26e7d15d6449c3fa4e123ec82d7eca2921925de..0000000000000000000000000000000000000000 --- a/spec/fixtures/nonseed_finger_xrd +++ /dev/null @@ -1,15 +0,0 @@ - <XRD> - <Subject>acct:evan@status.net</Subject> - <Alias>acct:evan@evan.status.net</Alias> - <Alias>http://evan.status.net/user/1</Alias> - <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="http://evan.status.net/user/1"/> - <Link rel="http://schemas.google.com/g/2010#updates-from" href="http://evan.status.net/api/statuses/user_timeline/1.atom" type="application/atom+xml"/> - <Link rel="http://microformats.org/profile/hcard" type="text/html" href="http://evan.status.net/hcard"/> - <Link rel="http://gmpg.org/xfn/11" type="text/html" href="http://evan.status.net/user/1"/> - <Link rel="describedby" type="application/rdf+xml" href="http://evan.status.net/foaf"/> - <Link rel="salmon" href="http://evan.status.net/main/salmon/user/1"/> - <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="http://evan.status.net/main/salmon/user/1"/> - <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="http://evan.status.net/main/salmon/user/1"/> - <Link rel="magic-public-key" href="data:application/magic-public-key,RSA.vyohOlwX03oJUg6R8BQP4V-6QQUfPg9gzOwk3ENQjqeGorHN8RNI4rhCQp7tACe9DEdEKtzZHbSvQC2zRICQ9JG_SIcpiU9jcT2imN5cPLZZQuPFZWwG4xPu_8LKRHuXeLGkzQMjvg6jFBl7qdo_iPnlbtIBb-mEuAnfRMcdUPE=.AQAB"/> - <Link rel="http://ostatus.org/schema/1.0/subscribe" template="http://evan.status.net/main/ostatussub?profile={uri}"/> - </XRD> diff --git a/spec/helper_methods.rb b/spec/helper_methods.rb index e0df90faa383ff051a1e4ce1faa35c3a6ac14c04..ad4371a347a1de12a7211364d0807c8f05a7a30b 100644 --- a/spec/helper_methods.rb +++ b/spec/helper_methods.rb @@ -19,46 +19,6 @@ module HelperMethods :receiving => true) end - def stub_success(address = 'abc@example.com', opts = {}) - host = address.split('@')[1] - stub_request(:get, "https://#{host}/.well-known/host-meta").to_return(:status => 200, :body => host_xrd) - stub_request(:get, "http://#{host}/.well-known/host-meta").to_return(:status => 200, :body => host_xrd) - if opts[:diaspora] || host.include?("diaspora") - stub_request(:get, /webfinger\/\?q=#{address}/).to_return(:status => 200, :body => finger_xrd) - stub_request(:get, "http://#{host}/hcard/users/4c8eccce34b7da59ff000002").to_return(:status => 200, :body => hcard_response) - else - stub_request(:get, /webfinger\/\?q=#{address}/).to_return(:status => 200, :body => nonseed_finger_xrd) - stub_request(:get, 'http://evan.status.net/hcard').to_return(:status => 200, :body => evan_hcard) - end - end - - def stub_failure(address = 'abc@example.com') - host = address.split('@')[1] - stub_request(:get, "https://#{host}/.well-known/host-meta").to_return(:status => 200, :body => host_xrd) - stub_request(:get, "http://#{host}/.well-known/host-meta").to_return(:status => 200, :body => host_xrd) - stub_request(:get, /webfinger\/\?q=#{address}/).to_return(:status => 500) - end - - def host_xrd - File.open(File.dirname(__FILE__) + '/fixtures/host_xrd').read - end - - def finger_xrd - File.open(File.dirname(__FILE__) + '/fixtures/finger_xrd').read - end - - def hcard_response - File.open(File.dirname(__FILE__) + '/fixtures/hcard_response').read - end - - def nonseed_finger_xrd - File.open(File.dirname(__FILE__) + '/fixtures/nonseed_finger_xrd').read - end - - def evan_hcard - File.open(File.dirname(__FILE__) + '/fixtures/evan_hcard').read - end - def uploaded_photo fixture_filename = 'button.png' fixture_name = File.join(File.dirname(__FILE__), 'fixtures', fixture_filename) diff --git a/spec/lib/h_card_spec.rb b/spec/lib/h_card_spec.rb deleted file mode 100644 index d4197c0b44699a1b81c3b8641a95765d1e3c6814..0000000000000000000000000000000000000000 --- a/spec/lib/h_card_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) 2010-2011, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. - -require "spec_helper" - -describe HCard do - it "should parse an hcard" do - raw_hcard = hcard_response - hcard = HCard.build raw_hcard - expect(hcard[:family_name].include?("Hamiltom")).to be true - expect(hcard[:given_name].include?("Alex")).to be true - expect(hcard[:photo].include?("thumb_large")).to be true - expect(hcard[:photo_medium].include?("thumb_medium")).to be true - expect(hcard[:photo_small].include?("thumb_small")).to be true - expect(hcard[:url]).to eq("http://localhost:3000/") - expect(hcard[:searchable]).to eq(false) - end - - it "should parse an hcard with searchable true" do - raw_hcard = hcard_response.sub("<span class='searchable'>false</span>", "<span class='searchable'>true</span>") - hcard = HCard.build raw_hcard - expect(hcard[:family_name].include?("Hamiltom")).to be true - expect(hcard[:given_name].include?("Alex")).to be true - expect(hcard[:photo].include?("thumb_large")).to be true - expect(hcard[:photo_medium].include?("thumb_medium")).to be true - expect(hcard[:photo_small].include?("thumb_small")).to be true - expect(hcard[:url]).to eq("http://localhost:3000/") - expect(hcard[:searchable]).to eq(true) - end - - it "should parse an hcard with empty searchable" do - raw_hcard = hcard_response.sub("<span class='searchable'>false</span>", "<span class='searchable'></span>") - hcard = HCard.build raw_hcard - expect(hcard[:family_name].include?("Hamiltom")).to be true - expect(hcard[:given_name].include?("Alex")).to be true - expect(hcard[:photo].include?("thumb_large")).to be true - expect(hcard[:photo_medium].include?("thumb_medium")).to be true - expect(hcard[:photo_small].include?("thumb_small")).to be true - expect(hcard[:url]).to eq("http://localhost:3000/") - expect(hcard[:searchable]).to eq(false) - end -end diff --git a/spec/lib/webfinger_profile_spec.rb b/spec/lib/webfinger_profile_spec.rb deleted file mode 100644 index 51991f084589802449ab3b17961a67455bba33fb..0000000000000000000000000000000000000000 --- a/spec/lib/webfinger_profile_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'spec_helper' - -describe WebfingerProfile do - let(:webfinger_profile){File.open(Rails.root.join("spec", "fixtures", "finger_xrd")).read.strip} - let(:not_diaspora_webfinger){File.open(Rails.root.join("spec", "fixtures", "nonseed_finger_xrd")).read.strip} - - let(:account){"tom@tom.joindiaspora.com"} - let(:profile){ WebfingerProfile.new(account, webfinger_profile) } - - context "parsing a diaspora profile" do - - describe '#valid_diaspora_profile?' do - it 'should check all of the required fields' do - expect(manual_nil_check(profile)).to eq(profile.valid_diaspora_profile?) - end - end - - describe '#set_fields' do - it 'should check to make sure it has a the right webfinger profile' do - expect{ WebfingerProfile.new("nottom@tom.joindiaspora.com", webfinger_profile)}.to raise_error - end - - it 'should handle a non-diaspora profile without blowing up' do - expect{ WebfingerProfile.new("evan@status.net", not_diaspora_webfinger)}.not_to raise_error - end - - [:links, :hcard, :guid, :seed_location, :public_key].each do |field| - it 'should sets the #{field} field' do - expect(profile.send(field)).to be_present - end - end - end - end - - def manual_nil_check(profile) - profile.instance_variables.each do |var| - var = var.to_s.gsub('@', '') - return false if profile.send(var).nil? == true - end - true - end -end diff --git a/spec/lib/webfinger_spec.rb b/spec/lib/webfinger_spec.rb deleted file mode 100644 index c3515bebe26ee3c294f0e8c3ad9cab3e3d8e6b93..0000000000000000000000000000000000000000 --- a/spec/lib/webfinger_spec.rb +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright (c) 2010-2011, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. - -require 'spec_helper' - -describe Webfinger do - let(:host_meta_xrd) { File.open(Rails.root.join('spec', 'fixtures', 'host-meta.fixture.html')).read } - let(:webfinger_xrd) { File.open(Rails.root.join('spec', 'fixtures', 'webfinger.fixture.html')).read } - let(:hcard_xml) { File.open(Rails.root.join('spec', 'fixtures', 'hcard.fixture.html')).read } - let(:account){'foo@bar.com'} - let(:account_in_fixtures){"alice@localhost:9887"} - let(:finger){Webfinger.new(account)} - let(:host_meta_url){"http://#{AppConfig.pod_uri.authority}/webfinger?q="} - - describe '#intialize' do - it 'sets account ' do - n = Webfinger.new("mbs348@gmail.com") - expect(n.account).not_to be nil - end - - it "downcases account and strips whitespace, and gsub 'acct:'" do - n = Webfinger.new("acct:BIGBOY@Example.Org ") - expect(n.account).to eq('bigboy@example.org') - end - - it 'should set ssl as the default' do - foo = Webfinger.new(account) - expect(foo.ssl).to be true - end - end - - describe '.in_background' do - it 'enqueues a Workers::FetchWebfinger job' do - expect(Workers::FetchWebfinger).to receive(:perform_async).with(account) - Webfinger.in_background(account) - end - end - - describe '#fetch' do - it 'works' do - finger = Webfinger.new(account_in_fixtures) - allow(finger).to receive(:host_meta_xrd).and_return(host_meta_xrd) - allow(finger).to receive(:hcard_xrd).and_return(hcard_xml) - allow(finger).to receive(:webfinger_profile_xrd).and_return(webfinger_xrd) - person = finger.fetch - expect(person).to be_valid - expect(person).to be_a Person - end - - end - - describe '#get' do - it 'makes a request and grabs the body' do - url ="https://bar.com/.well-known/host-meta" - stub_request(:get, url). - to_return(:status => 200, :body => host_meta_xrd) - - expect(finger.get(url)).to eq(host_meta_xrd) - end - - it 'follows redirects' do - redirect_url = "http://whereami.whatisthis/host-meta" - - stub_request(:get, "https://bar.com/.well-known/host-meta"). - to_return(:status => 302, :headers => { 'Location' => redirect_url }) - - stub_request(:get, redirect_url). - to_return(:status => 200, :body => host_meta_xrd) - - finger.host_meta_xrd - - expect(a_request(:get, redirect_url)).to have_been_made - end - - it 'raises on 404' do - url ="https://bar.com/.well-known/host-meta" - stub_request(:get, url). - to_return(:status => 404, :body => nil) - - expect { - expect(finger.get(url)).to eq(false) - }.to raise_error - end - end - - describe 'existing_person_with_profile?' do - it 'returns true if cached_person is present and has a profile' do - expect(finger).to receive(:cached_person).twice.and_return(FactoryGirl.create(:person)) - expect(finger.existing_person_with_profile?).to be true - end - - it 'returns false if it has no person' do - allow(finger).to receive(:cached_person).and_return false - expect(finger.existing_person_with_profile?).to be false - end - - it 'returns false if the person has no profile' do - p = FactoryGirl.create(:person) - p.profile = nil - allow(finger).to receive(:cached_person).and_return(p) - expect(finger.existing_person_with_profile?).to be false - end - end - - describe 'cached_person' do - it 'sets the person by looking up the account from Person.by_account_identifier' do - person = double - expect(Person).to receive(:by_account_identifier).with(account).and_return(person) - expect(finger.cached_person).to eq(person) - expect(finger.person).to eq(person) - end - end - - - describe 'create_or_update_person_from_webfinger_profile!' do - context 'with a cached_person' do - it 'calls Person#assign_new_profile_from_hcard with the fetched hcard' do - finger.hcard_xrd = hcard_xml - allow(finger).to receive(:person).and_return(bob.person) - expect(bob.person).to receive(:assign_new_profile_from_hcard).with(finger.hcard) - finger.create_or_update_person_from_webfinger_profile! - end - end - - context 'with no cached person' do - it 'sets person based on make_person_from_webfinger' do - allow(finger).to receive(:person).and_return(nil) - expect(finger).to receive(:make_person_from_webfinger) - finger.create_or_update_person_from_webfinger_profile! - end - end - end - - describe '#host_meta_xrd' do - it 'calls #get with host_meta_url' do - allow(finger).to receive(:host_meta_url).and_return('meta') - expect(finger).to receive(:get).with('meta') - finger.host_meta_xrd - end - - it 'should retry with ssl off a second time' do - expect(finger).to receive(:get).and_raise(StandardError) - expect(finger).to receive(:get) - finger.host_meta_xrd - expect(finger.ssl).to be false - end - end - - describe '#hcard' do - it 'calls HCard.build' do - allow(finger).to receive(:hcard_xrd).and_return(hcard_xml) - expect(HCard).to receive(:build).with(hcard_xml).and_return true - expect(finger.hcard).not_to be_nil - end - end - - describe '#webfinger_profile' do - it 'constructs a new WebfingerProfile object' do - allow(finger).to receive(:webfinger_profile_xrd).and_return(webfinger_xrd) - expect(WebfingerProfile).to receive(:new).with(account, webfinger_xrd) - finger.webfinger_profile - end - end - - describe '#webfinger_profile_url' do - it 'returns the llrd link for a valid host meta' do - allow(finger).to receive(:host_meta_xrd).and_return(host_meta_xrd) - expect(finger.webfinger_profile_url).not_to be_nil - end - - it 'returns nil if no link is found' do - allow(finger).to receive(:host_meta_xrd).and_return(nil) - expect(finger.webfinger_profile_url).to be_nil - end - end - - describe '#webfinger_profile_xrd' do - it 'calls #get with the hcard_url' do - allow(finger).to receive(:hcard_url).and_return("url") - expect(finger).to receive(:get).with("url") - finger.hcard_xrd - end - end - - describe '#make_person_from_webfinger' do - it 'with an hcard and a webfinger_profile, it calls Person.create_from_webfinger' do - allow(finger).to receive(:hcard).and_return("hcard") - allow(finger).to receive(:webfinger_profile_xrd).and_return("webfinger_profile_xrd") - allow(finger).to receive(:webfinger_profile).and_return("webfinger_profile") - expect(Person).to receive(:create_from_webfinger).with("webfinger_profile", "hcard") - finger.make_person_from_webfinger - end - - it 'with an false xrd it does not call Person.create_from_webfinger' do - allow(finger).to receive(:webfinger_profile_xrd).and_return(false) - expect(Person).not_to receive(:create_from_webfinger) - finger.make_person_from_webfinger - end - end - - - - describe '#host_meta_url' do - it 'should return canonical host-meta url for http' do - finger.ssl = false - expect(finger.host_meta_url).to eq("http://bar.com/.well-known/host-meta") - end - - it 'can return the https version' do - expect(finger.host_meta_url).to eq("https://bar.com/.well-known/host-meta") - end - end - - describe 'swizzle' do - it 'gsubs out {uri} for the account' do - string = "{uri} is the coolest" - expect(finger.swizzle(string)).to eq("#{finger.account} is the coolest") - end - end -end