]> cat aescling's git repositories - mastodon.git/commitdiff
Fix #2, add rake task for PuSH-unsubscribing from remote users who have no
authorEugen Rochko <eugen@zeonfederated.com>
Thu, 17 Mar 2016 10:59:18 +0000 (11:59 +0100)
committerEugen Rochko <eugen@zeonfederated.com>
Thu, 17 Mar 2016 11:02:45 +0000 (12:02 +0100)
local followers. Remote users' usernames SHOULD be case-sensitive

app/controllers/api/accounts_controller.rb
app/models/account.rb
lib/tasks/subscriptions.rake [new file with mode: 0644]

index 13c2b3d8ab23ed2813d1460cc1f5322d8aaf20f6..782cc8102d9e84c7983e8d951caf56f921f481ba 100644 (file)
@@ -19,12 +19,17 @@ class Api::AccountsController < ApiController
   end
 
   def follow
-    @follow = current_user.account.follow!(@account)
+    if @account.local?
+      @follow = current_user.account.follow!(@account)
+    else
+      @follow = FollowService.new.(current_user.account, @account.acct)
+    end
+
     render action: :show
   end
 
   def unfollow
-    @unfollow = current_user.account.unfollow!(@account)
+    @unfollow = UnfollowService.new.(current_user.account, @account)
     render action: :show
   end
 
index 524d05f867a00adad74e4857468d1192f9b7dd5c..e4295d735cff4bb2c8fde9f475ab4d2637fb1a5f 100644 (file)
@@ -1,7 +1,8 @@
 class Account < ActiveRecord::Base
   # Local users
   has_one :user, inverse_of: :account
-  validates :username, uniqueness: { scope: :domain, case_sensitive: false }
+  validates :username, uniqueness: { scope: :domain, case_sensitive: false }, if:     'local?'
+  validates :username, uniqueness: { scope: :domain, case_sensitive: true },  unless: 'local?'
 
   # Avatar upload
   attr_reader :avatar_remote_url
diff --git a/lib/tasks/subscriptions.rake b/lib/tasks/subscriptions.rake
new file mode 100644 (file)
index 0000000..875bd8a
--- /dev/null
@@ -0,0 +1,13 @@
+namespace :subscriptions do
+
+  desc "For all remote accounts that have no local followers, unsubscribe from PuSH"
+  task clear: :environment do
+    accounts = Account.where('(select count(f.id) from follows as f where f.target_account_id = accounts.id) = 0').where.not(domain: nil)
+
+    accounts.each do |a|
+      a.subscription(api_subscription_url(a.id)).unsubscribe
+      a.update!(verify_token: '', secret: '')
+    end
+  end
+
+end