diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index e96ef4a1cc91e2136f7cc5a45219ff8a95b77b9e..2848ea62e183e09a9f9260f136b36a1a1e621afb 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -1,5 +1,6 @@ class AccountsController < ApplicationController before_action :set_account + before_action :set_webfinger_header def show respond_to do |format| @@ -13,4 +14,12 @@ class AccountsController < ApplicationController def set_account @account = Account.find_by!(username: params[:username], domain: nil) end + + def set_webfinger_header + response.headers['Link'] = "<#{webfinger_account_url}>; rel=\"lrdd\"; type=\"application/xrd+xml\"" + end + + def webfinger_account_url + webfinger_url(resource: "acct:#{@account.acct}@#{Rails.configuration.x.local_domain}") + end end diff --git a/app/controllers/api/salmon_controller.rb b/app/controllers/api/salmon_controller.rb index 99ec15bff2e46d9af328c3ac1745b0e74f316dac..1df98970059a5e0c3628c233342fdafd8f90e374 100644 --- a/app/controllers/api/salmon_controller.rb +++ b/app/controllers/api/salmon_controller.rb @@ -1,4 +1,4 @@ -class Api::SalmonController < ApplicationController +class Api::SalmonController < ApiController before_action :set_account def update diff --git a/app/controllers/api/subscriptions_controller.rb b/app/controllers/api/subscriptions_controller.rb index 56deae10c4a21441fe18e09d5085197b5883afdd..038d6c87761348619d30fd14bff6fff78fc6bd31 100644 --- a/app/controllers/api/subscriptions_controller.rb +++ b/app/controllers/api/subscriptions_controller.rb @@ -1,4 +1,4 @@ -class Api::SubscriptionsController < ApplicationController +class Api::SubscriptionsController < ApiController before_action :set_account def show diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..eb2e464ebdcdb5eb5f4ffca67a3e590ba2e57c83 --- /dev/null +++ b/app/controllers/api_controller.rb @@ -0,0 +1,3 @@ +class ApiController < ApplicationController + protect_from_forgery with: :null_session +end diff --git a/app/views/accounts/show.atom.ruby b/app/views/accounts/show.atom.ruby index 54f1185e4fd07e05c1e4efdf054397480d3e906d..eaa4c63b135e2dd48749bd1fe4f9d916f7f2ee9a 100644 --- a/app/views/accounts/show.atom.ruby +++ b/app/views/accounts/show.atom.ruby @@ -4,7 +4,7 @@ Nokogiri::XML::Builder.new do |xml| title xml, @account.display_name subtitle xml, @account.note updated_at xml, stream_updated_at - logo xml, asset_url(@account.avatar.url(:medium)) + logo xml, asset_url(@account.avatar.url(:medium, false)) author(xml) do include_author xml, @account diff --git a/app/views/xrd/webfinger.xml.ruby b/app/views/xrd/webfinger.xml.ruby index ac0fd3d0ed34a9161bc83b8bbdf2619cc135a2bf..7c920b678dce08380439430c198b56a39dee27fa 100644 --- a/app/views/xrd/webfinger.xml.ruby +++ b/app/views/xrd/webfinger.xml.ruby @@ -3,7 +3,7 @@ Nokogiri::XML::Builder.new do |xml| xml.Subject @canonical_account_uri xml.Alias url_for_target(@account) xml.Link(rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: url_for_target(@account)) - xml.Link(rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: atom_user_stream_url(id: @account.id)) + xml.Link(rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom')) xml.Link(rel: 'salmon', href: api_salmon_url(@account.id)) xml.Link(rel: 'magic-public-key', href: @magic_key) end diff --git a/spec/services/fetch_feed_service_spec.rb b/spec/services/fetch_feed_service_spec.rb index c6a3d389bfc13e5e6ea8e2c4d497cd6efe2892b2..a28333fe3794a129bc89ee917e6db50a6eff79f9 100644 --- a/spec/services/fetch_feed_service_spec.rb +++ b/spec/services/fetch_feed_service_spec.rb @@ -1,5 +1,8 @@ require 'rails_helper' RSpec.describe FetchFeedService do - pending + subject { FetchFeedService.new } + + it 'fetches remote user\'s feed' + it 'processes the feed' end diff --git a/spec/services/follow_remote_account_service_spec.rb b/spec/services/follow_remote_account_service_spec.rb index fbe7e767a4686f58b7fa43a3dd5b1c35ed4c0e8f..27df76457e8582d926d53dd4df733ebb03e576f9 100644 --- a/spec/services/follow_remote_account_service_spec.rb +++ b/spec/services/follow_remote_account_service_spec.rb @@ -1,5 +1,12 @@ require 'rails_helper' RSpec.describe FollowRemoteAccountService do - pending + subject { FollowRemoteAccountService.new } + + it 'returns nil if no such user can be resolved via webfinger' + it 'returns nil if the domain does not have webfinger' + it 'returns nil if remote user does not offer a hub URL' + it 'returns an already existing remote account' + it 'returns a new remote account' + it 'fills the remote account with profile information' end diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb index ba393f5ab75938b0596c5cd3a3ab88672a0fa539..304e0cf71a2ff0c164675bebd050d588bcf7c9b2 100644 --- a/spec/services/follow_service_spec.rb +++ b/spec/services/follow_service_spec.rb @@ -1,5 +1,9 @@ require 'rails_helper' RSpec.describe FollowService do - pending + subject { FollowService.new } + + it 'creates a following relation' + it 'creates local account for remote user' + it 'sends follow to the remote user' end diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 43d58719d623af15970ca3f6bd8a9b3ca63791ec..9ee4daf6f5f2e2fde4e60ef5b9cf79550b8ccfca 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -1,5 +1,10 @@ require 'rails_helper' RSpec.describe PostStatusService do - pending + subject { PostStatusService.new } + + it 'creates a new status' + it 'creates a new response status' + it 'processes mentions' + it 'pings PuSH hubs' end diff --git a/spec/services/process_feed_service_spec.rb b/spec/services/process_feed_service_spec.rb index 087979ded119fe70c653234a852e0b010fc1bfaa..85805382381bd3e7ce3e5b3014ac0206ee575f6d 100644 --- a/spec/services/process_feed_service_spec.rb +++ b/spec/services/process_feed_service_spec.rb @@ -1,5 +1,8 @@ require 'rails_helper' RSpec.describe ProcessFeedService do - pending + subject { ProcessFeedService.new } + + it 'updates remote user\'s account information' + it 'creates local copies of all notes and comments' end diff --git a/spec/services/process_interaction_service_spec.rb b/spec/services/process_interaction_service_spec.rb index 8624d0b0cd39d843b7b3228ea85cea8ff0b1f5f7..931815dc2cf52f8a912047eccf9cab2d8db550d3 100644 --- a/spec/services/process_interaction_service_spec.rb +++ b/spec/services/process_interaction_service_spec.rb @@ -1,5 +1,15 @@ require 'rails_helper' RSpec.describe ProcessInteractionService do - pending + subject { ProcessInteractionService.new } + + it 'creates account for new remote user' + it 'updates account for existing remote user' + it 'ignores envelopes that do not address the local user' + it 'accepts a status that mentions the local user' + it 'accepts a status that is a reply to the local user\'s' + it 'accepts a favourite to a status by the local user' + it 'accepts a reblog of a status of the local user' + it 'accepts a follow of the local user' + it 'accepts an unfollow of the local user' end diff --git a/spec/services/process_mentions_service_spec.rb b/spec/services/process_mentions_service_spec.rb index ae86d17dc9980b07dfc798818ef2feab74d97247..984d1374651b0c01c09f56debc48b6370fa3bae6 100644 --- a/spec/services/process_mentions_service_spec.rb +++ b/spec/services/process_mentions_service_spec.rb @@ -1,5 +1,22 @@ require 'rails_helper' RSpec.describe ProcessMentionsService do - pending + let(:account) { Fabricate(:account, username: 'alice') } + let(:remote_user) { Fabricate(:account, username: 'remote_user', domain: 'example.com', salmon_url: 'http://salmon.example.com') } + let(:status) { Fabricate(:status, account: account, text: "Hello @#{remote_user.acct}") } + + subject { ProcessMentionsService.new } + + before do + stub_request(:post, remote_user.salmon_url) + subject.(status) + end + + it 'creates a mention' do + expect(remote_user.mentions.where(status: status).count).to eq 1 + end + + it 'posts to remote user\'s Salmon end point' do + expect(a_request(:post, remote_user.salmon_url)).to have_been_made + end end diff --git a/spec/services/send_interaction_service_spec.rb b/spec/services/send_interaction_service_spec.rb index ae4ab01c54aab74bd960c1222ec2933a17aa3f73..ff08394b0f6329d1a3d6552299ee23d56e349322 100644 --- a/spec/services/send_interaction_service_spec.rb +++ b/spec/services/send_interaction_service_spec.rb @@ -1,5 +1,7 @@ require 'rails_helper' RSpec.describe SendInteractionService do - pending + subject { SendInteractionService.new } + + it 'sends an XML envelope to the Salmon end point of remote user' end diff --git a/spec/services/setup_local_account_service_spec.rb b/spec/services/setup_local_account_service_spec.rb index 709f170b689b01c02ebc475635956ece8978099b..2e85fc4f5c2f69252c6db5e544ada63464054869 100644 --- a/spec/services/setup_local_account_service_spec.rb +++ b/spec/services/setup_local_account_service_spec.rb @@ -1,5 +1,8 @@ require 'rails_helper' RSpec.describe SetupLocalAccountService do - pending + subject { SetupLocalAccountService.new } + + it 'creates a user' + it 'creates an account for the user' end diff --git a/spec/services/unfollow_service_spec.rb b/spec/services/unfollow_service_spec.rb index 60121b675fbd74bed3aff513b3d1428cf7aee05a..58467ff007389d67fa71c053dd3eff90c1e1bdcd 100644 --- a/spec/services/unfollow_service_spec.rb +++ b/spec/services/unfollow_service_spec.rb @@ -1,5 +1,8 @@ require 'rails_helper' RSpec.describe UnfollowService do - pending + subject { UnfollowService.new } + + it 'destroys the following relation' + it 'sends remote interactionf or remote user' end