diff --git a/app/assets/javascripts/admin/components/ip-lookup.js.es6 b/app/assets/javascripts/admin/components/ip-lookup.js.es6 index 06a8387be4b..cf9829f7e58 100644 --- a/app/assets/javascripts/admin/components/ip-lookup.js.es6 +++ b/app/assets/javascripts/admin/components/ip-lookup.js.es6 @@ -39,6 +39,22 @@ export default Ember.Component.extend({ hide: function () { this.set("show", false); + }, + + deleteAllOtherAccounts: function() { + var self = this; + this.setProperties({ other_accounts: null, otherAccountsLoading: true }); + + Discourse.ajax("/admin/users/delete-others-with-same-ip.json", { + type: "DELETE", + data: { + "ip": this.get("ip"), + "exclude": this.get("user_id"), + "order": "trust_level DESC" + } + }).then(function() { + self.send("lookup"); + }); } } }); diff --git a/app/assets/javascripts/discourse/templates/components/ip-lookup.hbs b/app/assets/javascripts/discourse/templates/components/ip-lookup.hbs index 6fd3bea83e0..ff002f5f1a0 100644 --- a/app/assets/javascripts/discourse/templates/components/ip-lookup.hbs +++ b/app/assets/javascripts/discourse/templates/components/ip-lookup.hbs @@ -1,11 +1,11 @@ {{#if ip}} {{/if}} {{#if show}}
- {{fa-icon "times"}} + {{fa-icon "times"}}

{{i18n ip_lookup.title}}

{{#if location}} @@ -37,10 +37,18 @@ {{loading-spinner size="small"}} {{/if}} -
{{i18n ip_lookup.other_accounts}} {{other_accounts.length}}
-
- {{#loading-spinner size="small" condition=otherAccountsLoading}} - {{#if other_accounts}} +
+ {{i18n ip_lookup.other_accounts}} + {{other_accounts.length}} + {{#if other_accounts.length}} + + {{/if}} +
+ {{#loading-spinner size="small" condition=otherAccountsLoading}} + {{#if other_accounts.length}} +
@@ -63,11 +71,9 @@ {{/each}}
- {{else}} - {{i18n ip_lookup.no_other_accounts}} - {{/if}} - {{/loading-spinner}} -
+
+ {{/if}} + {{/loading-spinner}}
{{/if}} diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss index fc25af6e6ae..8ccc201cce8 100644 --- a/app/assets/stylesheets/common/admin/admin_base.scss +++ b/app/assets/stylesheets/common/admin/admin_base.scss @@ -82,16 +82,15 @@ td.flaggers td { margin-top: -2px; background-color: $secondary; padding: 12px 12px 5px; - .close { - float: right; - } .other-accounts { - margin: 0; + margin: 5px 0 0; max-height: 200px; overflow: auto; + width: 455px; ul { margin: 0; } li { list-style: none; } + tr td:first-of-type { width: 130px; } } } } diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index ed69ad463fa..28f1dbe60ca 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -264,10 +264,7 @@ class Admin::UsersController < Admin::AdminController end def sync_sso - unless SiteSetting.enable_sso - render nothing: true, status: 404 - return - end + return render nothing: true, status: 404 unless SiteSetting.enable_sso sso = DiscourseSingleSignOn.parse("sso=#{params[:sso]}&sig=#{params[:sig]}") user = sso.lookup_or_create_user @@ -275,6 +272,21 @@ class Admin::UsersController < Admin::AdminController render_serialized(user, AdminDetailedUserSerializer, root: false) end + def delete_other_accounts_with_same_ip + params.require(:ip) + params.require(:exclude) + params.require(:order) + + user_destroyer = UserDestroyer.new(current_user) + options = { delete_posts: true, block_email: true, block_urls: true, block_ip: true, delete_as_spammer: true } + + AdminUserIndexQuery.new(params).find_users.each do |user| + user_destroyer.destroy(user, options) rescue nil + end + + render json: success_json + end + private def fetch_user diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 16793af595f..43363649d98 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -279,7 +279,7 @@ en: organisation: Organization phone: Phone other_accounts: "Other accounts with this IP address:" - no_other_accounts: (none) + delete_all: "Delete all" username: "username" trust_level: "TL" read_time: "read time" diff --git a/config/routes.rb b/config/routes.rb index abcb00680e8..fd8c3e357ac 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -52,6 +52,7 @@ Discourse::Application.routes.draw do collection do get "list/:query" => "users#index" get "ip-info" => "users#ip_info" + delete "delete-others-with-same-ip" => "users#delete_other_accounts_with_same_ip" put "approve-bulk" => "users#approve_bulk" delete "reject-bulk" => "users#reject_bulk" end diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb index 767dc021f12..d65359f22c0 100644 --- a/spec/controllers/admin/users_controller_spec.rb +++ b/spec/controllers/admin/users_controller_spec.rb @@ -414,6 +414,19 @@ describe Admin::UsersController do end + context "delete_other_accounts_with_same_ip" do + + it "works" do + Fabricate(:user, ip_address: "42.42.42.42") + Fabricate(:user, ip_address: "42.42.42.42") + + UserDestroyer.any_instance.expects(:destroy).twice + + xhr :delete, :delete_other_accounts_with_same_ip, ip: "42.42.42.42", exclude: -1, order: "trust_level DESC" + end + + end + end it 'can sync up sso' do