Merge pull request #2446 from ligthyear/admin-ip-locator
Admin User-IP locator
This commit is contained in:
commit
82ff283375
|
@ -0,0 +1,54 @@
|
||||||
|
{{#if view.ip}}
|
||||||
|
<button class='btn' {{action lookup target="view"}}>
|
||||||
|
<span class="fa fa-globe"></span> {{i18n admin.user.ip_lookup}}
|
||||||
|
</button>
|
||||||
|
{{/if}}
|
||||||
|
{{#if view.showBox }}
|
||||||
|
<div class="location-box">
|
||||||
|
<h4>{{i18n ip_info.title}}</h4>
|
||||||
|
<dl>
|
||||||
|
{{#if view.location}}
|
||||||
|
{{#if view.location.hostname}}
|
||||||
|
<dt>{{i18n ip_info.hostname}}</dt>
|
||||||
|
<dd>{{view.location.hostname}}</dd>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<dt>{{i18n ip_info.location}}</dt>
|
||||||
|
<dd>
|
||||||
|
{{#if view.location.loc}}
|
||||||
|
<a href="https://maps.google.com/maps?q={{unbound view.location.loc}}" target="_blank">{{view.location.loc}}</a><br>
|
||||||
|
{{view.location.city}}, {{view.location.region}}, {{view.location.country}}
|
||||||
|
{{else}}
|
||||||
|
{{i18n ip_info.location_not_found}}
|
||||||
|
{{/if}}
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
{{#if view.location.org}}
|
||||||
|
<dt>{{i18n ip_info.organisation}}</dt>
|
||||||
|
<dd>{{view.location.org}}</dd>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if view.location.phone}}
|
||||||
|
<dt>{{i18n ip_info.phone}}</dt>
|
||||||
|
<dd>{{view.location.phone}}</dd>
|
||||||
|
{{/if}}
|
||||||
|
{{else}}
|
||||||
|
<div class='spinner'>{{i18n loading}}</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<dt>{{i18n ip_info.other_accounts}}</dt>
|
||||||
|
<dd>
|
||||||
|
{{#if view.other_accounts_loading}}
|
||||||
|
{{i18n loading}}
|
||||||
|
{{else}}
|
||||||
|
{{#each view.other_accounts}}
|
||||||
|
{{#link-to 'adminUser' this}}{{avatar this usernamePath="user.username" imageSize="small"}}{{/link-to}}
|
||||||
|
{{else}}
|
||||||
|
{{i18n ip_info.no_other_accounts}}
|
||||||
|
{{/each}}
|
||||||
|
{{/if}}
|
||||||
|
<dd>
|
||||||
|
</dl>
|
||||||
|
<button class='btn close' {{action hideBox target="view" }}>{{i18n close}}</button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
|
@ -79,6 +79,7 @@
|
||||||
<button class='btn' {{action refreshBrowsers target="content"}}>
|
<button class='btn' {{action refreshBrowsers target="content"}}>
|
||||||
{{i18n admin.user.refresh_browsers}}
|
{{i18n admin.user.refresh_browsers}}
|
||||||
</button>
|
</button>
|
||||||
|
{{view Discourse.AdminIpLocatorView ipBinding="ip_address"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -86,7 +87,11 @@
|
||||||
<div class='display-row'>
|
<div class='display-row'>
|
||||||
<div class='field'>{{i18n user.registration_ip_address.title}}</div>
|
<div class='field'>{{i18n user.registration_ip_address.title}}</div>
|
||||||
<div class='value'>{{registration_ip_address}}</div>
|
<div class='value'>{{registration_ip_address}}</div>
|
||||||
<div class='controls'></div>
|
<div class='controls'>
|
||||||
|
{{#if currentUser.admin}}
|
||||||
|
{{view Discourse.AdminIpLocatorView ipBinding="registration_ip_address"}}
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{#if showBadges}}
|
{{#if showBadges}}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
Discourse.AdminIpLocatorView = Discourse.View.extend({
|
||||||
|
templateName: 'admin/templates/ip_locator',
|
||||||
|
classNames: ["iplocator"],
|
||||||
|
actions: {
|
||||||
|
hideBox: function(){
|
||||||
|
this.set("showBox", false);
|
||||||
|
},
|
||||||
|
lookup: function(){
|
||||||
|
if (!this.get("location")){
|
||||||
|
$.get("http://ipinfo.io/" + this.get("ip"), function(response) {
|
||||||
|
this.set("location", response);
|
||||||
|
}.bind(this), "jsonp");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.get("other_accounts")){
|
||||||
|
this.set("other_accounts_loading", true);
|
||||||
|
Discourse.ajax("/admin/users/list/active.json", {
|
||||||
|
data: {"ip": this.get("ip"),
|
||||||
|
"exclude": this.get("controller.id")
|
||||||
|
}
|
||||||
|
}).then(function (users) {
|
||||||
|
this.set("other_accounts", users.map(function(u) { return Discourse.AdminUser.create(u);}));
|
||||||
|
this.set("other_accounts_loading", false);
|
||||||
|
}.bind(this));
|
||||||
|
}
|
||||||
|
this.set("showBox", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
|
@ -81,6 +81,25 @@
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.iplocator {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
.location-box {
|
||||||
|
position: absolute;
|
||||||
|
width: 460px;
|
||||||
|
right: 0px;
|
||||||
|
z-index: 990;
|
||||||
|
box-shadow: 0 2px 6px scale-color-diff();
|
||||||
|
margin-top: -2px;
|
||||||
|
background-color: $secondary;
|
||||||
|
padding: 12px 12px 5px;
|
||||||
|
.close {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.admin-container {
|
.admin-container {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,6 +238,16 @@ en:
|
||||||
one: "%{count} new post in the past %{unit}."
|
one: "%{count} new post in the past %{unit}."
|
||||||
other: "%{count} new posts in the past %{unit}."
|
other: "%{count} new posts in the past %{unit}."
|
||||||
|
|
||||||
|
ip_info:
|
||||||
|
title: ip_info_title
|
||||||
|
hostname: ip_info_hostname
|
||||||
|
location: ip_info_location
|
||||||
|
location_not_found: ip_info_location_not_found
|
||||||
|
organisation: ip_info_organisation
|
||||||
|
phone: ip_info_phone
|
||||||
|
other_accounts: ip_info_other_accounts
|
||||||
|
no_other_accounts: ip_info_no_other_accounts
|
||||||
|
|
||||||
user:
|
user:
|
||||||
said: "{{username}} said:"
|
said: "{{username}} said:"
|
||||||
profile: "Profile"
|
profile: "Profile"
|
||||||
|
@ -1713,6 +1723,7 @@ en:
|
||||||
refresh_browsers: "Force browser refresh"
|
refresh_browsers: "Force browser refresh"
|
||||||
show_public_profile: "Show Public Profile"
|
show_public_profile: "Show Public Profile"
|
||||||
impersonate: 'Impersonate'
|
impersonate: 'Impersonate'
|
||||||
|
ip_lookup: "ip_lookup"
|
||||||
log_out: "Sign Out"
|
log_out: "Sign Out"
|
||||||
logged_out: "User was logged out on all devices"
|
logged_out: "User was logged out on all devices"
|
||||||
revoke_admin: 'Revoke Admin'
|
revoke_admin: 'Revoke Admin'
|
||||||
|
|
|
@ -40,6 +40,19 @@ class AdminUserIndexQuery
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def filter_by_ip
|
||||||
|
if params[:ip].present?
|
||||||
|
@query.where('ip_address = :ip or registration_ip_address = :ip', ip: params[:ip])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def filter_exclude
|
||||||
|
if params[:exclude].present?
|
||||||
|
@query.where('id != ?', params[:exclude])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# this might not be needed in rails 4 ?
|
# this might not be needed in rails 4 ?
|
||||||
def append(active_relation)
|
def append(active_relation)
|
||||||
@query = active_relation if active_relation
|
@query = active_relation if active_relation
|
||||||
|
@ -48,6 +61,8 @@ class AdminUserIndexQuery
|
||||||
def find_users_query
|
def find_users_query
|
||||||
append filter_by_trust
|
append filter_by_trust
|
||||||
append filter_by_query_classification
|
append filter_by_query_classification
|
||||||
|
append filter_by_ip
|
||||||
|
append filter_exclude
|
||||||
append filter_by_search
|
append filter_by_search
|
||||||
@query
|
@query
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue