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