Merge pull request #1532 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes
This commit is contained in:
		
						commit
						1a22541fee
					
				
					 17 changed files with 28 additions and 212 deletions
				
			
		|  | @ -6,12 +6,8 @@ | |||
| #  id                            :bigint(8)        not null, primary key | ||||
| #  username                      :string           default(""), not null | ||||
| #  domain                        :string | ||||
| #  secret                        :string           default(""), not null | ||||
| #  private_key                   :text | ||||
| #  public_key                    :text             default(""), not null | ||||
| #  remote_url                    :string           default(""), not null | ||||
| #  salmon_url                    :string           default(""), not null | ||||
| #  hub_url                       :string           default(""), not null | ||||
| #  created_at                    :datetime         not null | ||||
| #  updated_at                    :datetime         not null | ||||
| #  note                          :text             default(""), not null | ||||
|  | @ -49,12 +45,18 @@ | |||
| #  avatar_storage_schema_version :integer | ||||
| #  header_storage_schema_version :integer | ||||
| #  devices_url                   :string | ||||
| #  sensitized_at                 :datetime | ||||
| #  suspension_origin             :integer | ||||
| #  sensitized_at                 :datetime | ||||
| # | ||||
| 
 | ||||
| class Account < ApplicationRecord | ||||
|   self.ignored_columns = %w(subscription_expires_at) | ||||
|   self.ignored_columns = %w( | ||||
|     subscription_expires_at | ||||
|     secret | ||||
|     remote_url | ||||
|     salmon_url | ||||
|     hub_url | ||||
|   ) | ||||
| 
 | ||||
|   USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i | ||||
|   MENTION_RE  = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[[:word:]\.\-]+[a-z0-9]+)?)/i | ||||
|  |  | |||
|  | @ -0,0 +1,12 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class RemoveHubURLFromAccounts < ActiveRecord::Migration[5.2] | ||||
|   def change | ||||
|     safety_assured do | ||||
|       remove_column :accounts, :secret, :string, null: false, default: '' | ||||
|       remove_column :accounts, :remote_url, :string, null: false, default: '' | ||||
|       remove_column :accounts, :salmon_url, :string, null: false, default: '' | ||||
|       remove_column :accounts, :hub_url, :string, null: false, default: '' | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -10,7 +10,7 @@ | |||
| # | ||||
| # It's strongly recommended that you check this file into your version control system. | ||||
| 
 | ||||
| ActiveRecord::Schema.define(version: 2021_05_05_174616) do | ||||
| ActiveRecord::Schema.define(version: 2021_05_07_001928) do | ||||
| 
 | ||||
|   # These are extensions that must be enabled in order to support this database | ||||
|   enable_extension "plpgsql" | ||||
|  | @ -136,12 +136,8 @@ ActiveRecord::Schema.define(version: 2021_05_05_174616) do | |||
|   create_table "accounts", id: :bigint, default: -> { "timestamp_id('accounts'::text)" }, force: :cascade do |t| | ||||
|     t.string "username", default: "", null: false | ||||
|     t.string "domain" | ||||
|     t.string "secret", default: "", null: false | ||||
|     t.text "private_key" | ||||
|     t.text "public_key", default: "", null: false | ||||
|     t.string "remote_url", default: "", null: false | ||||
|     t.string "salmon_url", default: "", null: false | ||||
|     t.string "hub_url", default: "", null: false | ||||
|     t.datetime "created_at", null: false | ||||
|     t.datetime "updated_at", null: false | ||||
|     t.text "note", default: "", null: false | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
|   "name": "@tootsuite/mastodon", | ||||
|   "license": "AGPL-3.0-or-later", | ||||
|   "engines": { | ||||
|     "node": ">=10.13" | ||||
|     "node": ">=12" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "postversion": "git push --tags", | ||||
|  |  | |||
|  | @ -36,11 +36,7 @@ describe RelationshipsController do | |||
|   end | ||||
| 
 | ||||
|   describe 'PATCH #update' do | ||||
|     let(:poopfeast) { Fabricate(:account, username: 'poopfeast', domain: 'example.com', salmon_url: 'http://example.com/salmon') } | ||||
| 
 | ||||
|     before do | ||||
|       stub_request(:post, 'http://example.com/salmon').to_return(status: 200) | ||||
|     end | ||||
|     let(:poopfeast) { Fabricate(:account, username: 'poopfeast', domain: 'example.com') } | ||||
| 
 | ||||
|     shared_examples 'redirects back to followers page' do | ||||
|       it 'redirects back to followers page' do | ||||
|  |  | |||
|  | @ -22,24 +22,6 @@ RSpec.describe AuthorizeFollowService, type: :service do | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote OStatus' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } | ||||
| 
 | ||||
|     before do | ||||
|       FollowRequest.create(account: bob, target_account: sender) | ||||
|       stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) | ||||
|       subject.call(bob, sender) | ||||
|     end | ||||
| 
 | ||||
|     it 'removes follow request' do | ||||
|       expect(bob.requested?(sender)).to be false | ||||
|     end | ||||
| 
 | ||||
|     it 'creates follow relation' do | ||||
|       expect(bob.following?(sender)).to be true | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote ActivityPub' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox')).account } | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ RSpec.describe BatchedRemoveStatusService, type: :service do | |||
|   subject { BatchedRemoveStatusService.new } | ||||
| 
 | ||||
|   let!(:alice)  { Fabricate(:account) } | ||||
|   let!(:bob)    { Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://example.com/salmon') } | ||||
|   let!(:bob)    { Fabricate(:account, username: 'bob', domain: 'example.com') } | ||||
|   let!(:jeff)   { Fabricate(:user).account } | ||||
|   let!(:hank)   { Fabricate(:account, username: 'hank', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } | ||||
| 
 | ||||
|  |  | |||
|  | @ -17,19 +17,6 @@ RSpec.describe BlockService, type: :service do | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote OStatus' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } | ||||
| 
 | ||||
|     before do | ||||
|       stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) | ||||
|       subject.call(sender, bob) | ||||
|     end | ||||
| 
 | ||||
|     it 'creates a blocking relation' do | ||||
|       expect(sender.blocking?(bob)).to be true | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote ActivityPub' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,20 +18,6 @@ RSpec.describe FavouriteService, type: :service do | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote OStatus' do | ||||
|     let(:bob)    { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } | ||||
|     let(:status) { Fabricate(:status, account: bob, uri: 'tag:example.com:blahblah') } | ||||
| 
 | ||||
|     before do | ||||
|       stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) | ||||
|       subject.call(sender, status) | ||||
|     end | ||||
| 
 | ||||
|     it 'creates a favourite' do | ||||
|       expect(status.favourites.first).to_not be_nil | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote ActivityPub' do | ||||
|     let(:bob)    { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, protocol: :activitypub, username: 'bob', domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } | ||||
|     let(:status) { Fabricate(:status, account: bob) } | ||||
|  |  | |||
|  | @ -31,56 +31,4 @@ RSpec.describe FetchRemoteStatusService, type: :service do | |||
|       expect(status.text).to eq 'Lorem ipsum' | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   context 'protocol is :ostatus' do | ||||
|     subject { described_class.new } | ||||
| 
 | ||||
|     before do | ||||
|       Fabricate(:account, username: 'tracer', domain: 'real.domain', remote_url: 'https://real.domain/users/tracer') | ||||
|     end | ||||
| 
 | ||||
|     it 'does not create status with author at different domain' do | ||||
|       status_body = <<-XML.squish | ||||
|         <?xml version="1.0"?> | ||||
|         <entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0"> | ||||
|           <id>tag:real.domain,2017-04-27:objectId=4487555:objectType=Status</id> | ||||
|           <published>2017-04-27T13:49:25Z</published> | ||||
|           <updated>2017-04-27T13:49:25Z</updated> | ||||
|           <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type> | ||||
|           <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb> | ||||
|           <author> | ||||
|             <id>https://real.domain/users/tracer</id> | ||||
|             <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type> | ||||
|             <uri>https://real.domain/users/tracer</uri> | ||||
|             <name>tracer</name> | ||||
|           </author> | ||||
|           <content type="html">Overwatch rocks</content> | ||||
|         </entry> | ||||
|       XML | ||||
| 
 | ||||
|       expect(subject.call('https://fake.domain/foo', status_body)).to be_nil | ||||
|     end | ||||
| 
 | ||||
|     it 'does not create status with wrong id when id uses http format' do | ||||
|       status_body = <<-XML.squish | ||||
|         <?xml version="1.0"?> | ||||
|         <entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0"> | ||||
|           <id>https://other-real.domain/statuses/123</id> | ||||
|           <published>2017-04-27T13:49:25Z</published> | ||||
|           <updated>2017-04-27T13:49:25Z</updated> | ||||
|           <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type> | ||||
|           <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb> | ||||
|           <author> | ||||
|             <id>https://real.domain/users/tracer</id> | ||||
|             <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type> | ||||
|             <uri>https://real.domain/users/tracer</uri> | ||||
|             <name>tracer</name> | ||||
|           </author> | ||||
|           <content type="html">Overwatch rocks</content> | ||||
|         </entry> | ||||
|       XML | ||||
| 
 | ||||
|       expect(subject.call('https://real.domain/statuses/456', status_body)).to be_nil | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -7,37 +7,6 @@ RSpec.describe ProcessMentionsService, type: :service do | |||
| 
 | ||||
|   subject { ProcessMentionsService.new } | ||||
| 
 | ||||
|   context 'OStatus with public toot' do | ||||
|     let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com') } | ||||
| 
 | ||||
|     before do | ||||
|       stub_request(:post, remote_user.salmon_url) | ||||
|       subject.call(status) | ||||
|     end | ||||
| 
 | ||||
|     it 'does not create a mention' do | ||||
|       expect(remote_user.mentions.where(status: status).count).to eq 0 | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   context 'OStatus with private toot' do | ||||
|     let(:visibility)  { :private } | ||||
|     let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com') } | ||||
| 
 | ||||
|     before do | ||||
|       stub_request(:post, remote_user.salmon_url) | ||||
|       subject.call(status) | ||||
|     end | ||||
| 
 | ||||
|     it 'does not create a mention' do | ||||
|       expect(remote_user.mentions.where(status: status).count).to eq 0 | ||||
|     end | ||||
| 
 | ||||
|     it 'does not post to remote user\'s Salmon end point' do | ||||
|       expect(a_request(:post, remote_user.salmon_url)).to_not have_been_made | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   context 'ActivityPub' do | ||||
|     context do | ||||
|       let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } | ||||
|  |  | |||
|  | @ -32,22 +32,6 @@ RSpec.describe ReblogService, type: :service do | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   context 'OStatus' do | ||||
|     let(:bob)    { Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com') } | ||||
|     let(:status) { Fabricate(:status, account: bob, uri: 'tag:example.com;something:something') } | ||||
| 
 | ||||
|     subject { ReblogService.new } | ||||
| 
 | ||||
|     before do | ||||
|       stub_request(:post, 'http://salmon.example.com') | ||||
|       subject.call(alice, status) | ||||
|     end | ||||
| 
 | ||||
|     it 'creates a reblog' do | ||||
|       expect(status.reblogs.count).to eq 1 | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   context 'ActivityPub' do | ||||
|     let(:bob)    { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } | ||||
|     let(:status) { Fabricate(:status, account: bob) } | ||||
|  |  | |||
|  | @ -22,24 +22,6 @@ RSpec.describe RejectFollowService, type: :service do | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote OStatus' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } | ||||
| 
 | ||||
|     before do | ||||
|       FollowRequest.create(account: bob, target_account: sender) | ||||
|       stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) | ||||
|       subject.call(bob, sender) | ||||
|     end | ||||
| 
 | ||||
|     it 'removes follow request' do | ||||
|       expect(bob.requested?(sender)).to be false | ||||
|     end | ||||
| 
 | ||||
|     it 'does not create follow relation' do | ||||
|       expect(bob.following?(sender)).to be false | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote ActivityPub' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox')).account } | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ RSpec.describe RemoveStatusService, type: :service do | |||
|   subject { RemoveStatusService.new } | ||||
| 
 | ||||
|   let!(:alice)  { Fabricate(:account, user: Fabricate(:user)) } | ||||
|   let!(:bob)    { Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://example.com/salmon') } | ||||
|   let!(:bob)    { Fabricate(:account, username: 'bob', domain: 'example.com') } | ||||
|   let!(:jeff)   { Fabricate(:account) } | ||||
|   let!(:hank)   { Fabricate(:account, username: 'hank', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } | ||||
|   let!(:bill)   { Fabricate(:account, username: 'bill', protocol: :activitypub, domain: 'example2.com', inbox_url: 'http://example2.com/inbox') } | ||||
|  |  | |||
|  | @ -18,20 +18,6 @@ RSpec.describe UnblockService, type: :service do | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote OStatus' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } | ||||
| 
 | ||||
|     before do | ||||
|       sender.block!(bob) | ||||
|       stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) | ||||
|       subject.call(sender, bob) | ||||
|     end | ||||
| 
 | ||||
|     it 'destroys the blocking relation' do | ||||
|       expect(sender.blocking?(bob)).to be false | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote ActivityPub' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,20 +18,6 @@ RSpec.describe UnfollowService, type: :service do | |||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote OStatus' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } | ||||
| 
 | ||||
|     before do | ||||
|       sender.follow!(bob) | ||||
|       stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) | ||||
|       subject.call(sender, bob) | ||||
|     end | ||||
| 
 | ||||
|     it 'destroys the following relation' do | ||||
|       expect(sender.following?(bob)).to be false | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'remote ActivityPub' do | ||||
|     let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox')).account } | ||||
| 
 | ||||
|  |  | |||
|  | @ -5404,9 +5404,9 @@ homedir-polyfill@^1.0.1: | |||
|     parse-passwd "^1.0.0" | ||||
| 
 | ||||
| hosted-git-info@^2.1.4: | ||||
|   version "2.8.8" | ||||
|   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" | ||||
|   integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== | ||||
|   version "2.8.9" | ||||
|   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" | ||||
|   integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== | ||||
| 
 | ||||
| hpack.js@^2.1.6: | ||||
|   version "2.1.6" | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue